web-dev-qa-db-ja.com

RHEL / CentOS 7では、mvは実際に同じファイルシステムでcpとrmを実行しますか?

2つの答えに照らして 質問 、それはRHEL/CentOS 7の下でのようです同じファイルシステム上でもmvは実際にはcpを実行してからrmを実行します。

CentOS/RHELの以前のエディションでは、同じファイルシステム上のmv(ディープディレクトリから新しいディープディレクトリまで)は、大きなファイル(インストールメディアや大きなビデオのコレクションなど)でも非常に高速でした。

しかし、私の個人的なCentOSサーバーでは、大きなファイルを移動するときにmvが実際に何をしているのかを見ると、cpの後にrmが続くのと同じくらい時間がかかります。

これは、なぜ動作が単なるラッパーからrename()に変わったのか不思議に思います( [〜#〜] posix [〜#〜] 標準による)。

これは正しいです?もしそうなら、なぜmvユーティリティがCentOS7の動作を変更したのですか?

6
warren

CentOS 7.2 mvコマンドは、rename(3)呼び出しを使用しようとします。

たとえば、_strace mv X Y_を実行すると、出力に表示されます

_rename("X", "Y")                        = 0
_

したがって、mvが正常にrenameと呼ばれていることがわかります。

代わりに、このディレクトリの名前を別のディスクに変更しようとした場合:

_rename("X", "/home/sweh/X")             = -1 EXDEV (Invalid cross-device link)
_

mvrename()呼び出しを使用しようとしましたが、失敗したことがわかります。この時点で、再帰的な作業を開始します

_rmdir("/home/sweh/X")                   = -1 ENOENT (No such file or directory)
mkdir("/home/sweh/X", 0700)             = 0
lstat("/home/sweh/X", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
openat(AT_FDCWD, "X", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 2 entries */, 32768)     = 48
_

ここでは、ターゲットディレクトリが作成され、現在のディレクトリの読み取りを開始して、低速のコピー/削除を実行していることがわかります。

したがって、mvは高速のrename()呼び出しを使用しようとし、これが失敗した場合にのみ低速バージョンにフォールバックすると結論付けることができます。

10
Stephen Harris