私は現在BTRFSユーザーであり、CoWを利用してファイルが同じbtrfsファイルシステムにコピーされたときに既存の範囲を再利用して自動的に重複排除するようにしたいと思います。これを行う2つの方法を考えることができます。
ソリューション1(ローカル)
.bashrcにエイリアスを設定すると、呼び出すcp
たびにフラグが自動的に追加されます--reflink=auto
。
alias cp='cp --reflink=auto'
ソリューション2(グローバル)
私が考えることができるもう1つの解決策は、/usr/local/bin/cp
PATH変数でより高い優先順位を持つソリューションを作成することです。スクリプトは次のとおりです。
#!/bin/sh
CP=/bin/cp
exec $CP --reflink=auto $*
/bin/cp
coreutilsのアップデートは最終的に私の変更を上書きするので、交換は良い考えではないと思います。しかし、これは望ましく、PATHで(直接ではなく)cpを呼び出す/bin/cp
アプリケーションが常に自動的に参照リンクを使用することを意味します。
質問
これに反対する主張はありますか?それともそれを課すことが問題を引き起こす可能性がある状況はありますか?これを設定すると、auto
デフォルトのファイルシステムが参照リンクをサポートしているか、同じデバイス上にある場合に参照リンクを使用すると、外部ext4ファイルシステムを接続するかbtrfsファイルシステム間でコピーするときに問題がないかが自動的に決定されます。
私が読んでcp --reflink=autoがデフォルトの動作ではないのはなぜですか?主な主張は、cpを使用してファイルバックアップを作成できるようですが、私の考えでは、ローカルでより少ないスペースを消費し、データをバックアップすることが目標である他のシステムにデータを完全にコピーできる方が良いと思います。 。この場合、ソリューション2を実装しても安全ですか?
ローカルディスクスペースの使用量を最小限に抑えるための設定の推奨事項を見たので、--sparse=always
ここでも同様の質問が当てはまると思いました。
ベストアンサー1
コードに問題があることに注意してください。$*
引用なしいいえ言葉になりますね。$*
位置パラメータと最初の文字を連結したものです$IFS
。これにより、IFSが空の場合、動作にわずかな変化がありますが、これはトークン化とファイル名の生成の影響を受けます。希望する場所は次のとおりです。
#!/bin/sh -
exec /bin/cp --reflink=auto "$@"
"$@"
すべての位置引数を別々の引数に拡張します。
更新時に変更を更新して維持したい場合、/bin/cp
ほとんどのシステムにはこれを行う正規の方法があります。 Debianとその派生製品では、次のことができます。
$ sudo dpkg-divert --local --rename /bin/cp
Adding 'local diversion of /bin/cp to /bin/cp.distrib'
次に、次のように書きます/bin/cp
。
#! /bin/sh -
exec "$0.distrib" --reflink=auto "$@"
cp.distrib
代わりにcoreutilsのすべてのアップデートが更新されますcp
。
sh
実行する前にロードして実行する必要があるため、パフォーマンスに影響を与えますcp
。/bin/sh
.NETベースのDebianではそれほど悪くありませんdash
。
cp.distrib
これはまた、次の代わりにエラーとヘルプメッセージが言及されることを意味しますcp
。
$ cp
/bin/cp.distrib: missing file operand
Try '/bin/cp.distrib --help' for more information.
最後の部分は、次のようにスクリプトを書くことで解決できます。
#! /bin/bash -
exec -a "$0" "$0.distrib" --reflink=auto "$@"
(膨らんだ殻と同じかksh93
比較されますzsh
)。bash
dash
もともと受け取ったパスの$0
代わりにスクリプトパスが含まれているので、厳密に同じではありませんが、少なくとも。argv[0]
cp
/bin/cp
/bin/cp.distrib