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

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

2つの質問に対する回答に基づいてより早い 質問、それ〜らしいRHEL/CentOS 7ではmv同じファイルシステムでcpあってもrm

以前のバージョンのCentOS / RHELでは、mv大容量ファイル(インストールメディアや大容量ビデオコレクションなど)で作業している場合でも、同じファイルシステム(ディープディレクトリから新しいディープディレクトリに移動しても)は非常に高速でした。

しかし、私の個人的なCentOSサーバーでは、mv大容量ファイルを移動するときに実際に何が起こるのかを見てcpくださいrm

これはなぜこの動作がラッパーからrename()(によると)に変更されたのか疑問に思います。POSIX基準)。

そうですか?それでは、mvこのユーティリティがCentOS 7の動作を変更するのはなぜですか?

ベストアンサー1

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

たとえば、これを行うと、strace mv X Y出力に次のように表示されます。

rename("X", "Y")                        = 0

mvこれにより、名前変更呼び出しが成功したことを確認できます。

このディレクトリの名前を別のディスクに変更しようとすると、次のようになります。

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

mv呼び出しを使用しようとしましたがrename()失敗したことがわかります。この時点で再帰操作が開始されます。

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()失敗した場合にのみ遅いバージョンに戻ると結論付けることができます。

おすすめ記事