ソリューション1(ローカル)

ソリューション1(ローカル)

私は現在BTRFSユーザーであり、CoWを利用してファイルが同じbtrfsファイルシステムにコピーされたときに既存の範囲を再利用して自動的に重複排除するようにしたいと思います。これを行う2つの方法を考えることができます。

ソリューション1(ローカル)

.bashrcにエイリアスを設定すると、呼び出すcpたびにフラグが自動的に追加されます--reflink=auto

alias cp='cp --reflink=auto'

ソリューション2(グローバル)

私が考えることができるもう1つの解決策は、/usr/local/bin/cpPATH変数でより高い優先順位を持つソリューションを作成することです。スクリプトは次のとおりです。

#!/bin/sh

CP=/bin/cp

exec $CP --reflink=auto $*

/bin/cpcoreutilsのアップデートは最終的に私の変更を上書きするので、交換は良い考えではないと思います。しかし、これは望ましく、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)。bashdash

もともと受け取ったパスの$0代わりにスクリプトパスが含まれているので、厳密に同じではありませんが、少なくとも。argv[0] cp/bin/cp/bin/cp.distrib

答え2

私の解決策(Gentooを実行しているので本当に便利)は、パッケージマネージャにパッチを要求することでした。パッチはデフォルトで--reflink = autoを調整しcpinstall使用し、ラッパーを使用してクラッキングするよりも効率的で汎用性があります。

∞ cat /etc/portage/patches/sys-apps/coreutils/coreutils-reflink-auto.patch 
--- a/src/install.c.orig    2021-04-10 15:13:14.698039128 +0300
+++ a/src/install.c 2021-04-10 15:13:24.114292838 +0300
@@ -264,7 +264,7 @@
 {
   cp_options_default (x);
   x->copy_as_regular = true;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;
   x->dereference = DEREF_ALWAYS;
   x->unlink_dest_before_opening = true;
   x->unlink_dest_after_failed_open = false;
--- a/src/cp.c.orig 2021-04-10 15:12:03.591111323 +0300
+++ a/src/cp.c  2021-04-10 15:12:40.576190820 +0300
@@ -793,7 +793,7 @@
   x->move_mode = false;
   x->install_mode = false;
   x->one_file_system = false;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;
 
   x->preserve_ownership = false;
   x->preserve_links = false;

関連情報