実行中に+ をcp
入力してコピーコマンドを終了すると、ext4ファイルシステムにどのような影響がありますか?CtrlC
ファイルシステムは破損しますか?不完全なコピーされたファイルが占有しているパーティションのスペースは、削除後も使用可能ですか?
そして、最も重要なことは、cp
プロセスを終了することは安全なことですか?
実行中に+ をcp
入力してコピーコマンドを終了すると、ext4ファイルシステムにどのような影響がありますか?CtrlC
ファイルシステムは破損しますか?不完全なコピーされたファイルが占有しているパーティションのスペースは、削除後も使用可能ですか?
そして、最も重要なことは、cp
プロセスを終了することは安全なことですか?
回答:
これは安全ですが、当然のことながらコピーを終了していない可能性があります。
ときにcp
コマンドが実行され、それはファイルのコピーを作成するために、カーネルに指示するシステムコールを行います。syscallは、アプリケーションが呼び出すことができる関数であり、ディスクへのデータの読み取りや書き込みなど、カーネルにサービスを要求します。ユーザー空間プロセスは、syscallが終了するのを単に待ちます。呼び出しをトレースすると、次のようになります。
open("/home/user/hello.txt", O_RDONLY) = 3
open("/mnt/hello.txt", O_CREAT|O_WRONLY, 0644) = 4
read(3, "Hello, world!\n", 131072) = 14
write(4, "Hello, world!\n", 14) = 14
close(3) = 0
close(4) = 0
これは、コピーされるファイルごとに繰り返されます。これらのシステムコールが機能するため、破損は発生しません。このようなシステムコールが入力されると、致命的なシグナルは、システムコールの実行中ではなく、システムコールが終了した後にのみ有効になります。このため、プロセスを強制終了すると、現在実行中のsyscallが終了した後にのみプロセスが終了します。つまり、ファイルシステムドライバーが存在するカーネルは、ファイルシステムを正常な状態にするために完了する必要がある操作を自由に完了できます。この種のI / Oは、操作の途中で終了することはなく、アトミック操作になります。
興味深いことに、このようなコマンドは、cp
強制終了してもすぐに終了しない場合があります。非常に大きなファイルをコピーして、SIGKILLを使用して強制終了する場合、現在のsyscallが終了するまでプロセスは引き続き実行されます。大きなファイルでは、プロセスが中断できない状態になるため、これには時間がかかる場合があります。
cp
それ自体ではありません。内部的に値として使用するさまざまなファイルアクセス関数があります。
cp
大きなファイルを処理しているときでも、SIGKILL後の終了に遅延があることに気づきませんでした...プロセスのそれらの割り込み不可能なアトミック操作の期間が短すぎるかもしれません。殺害dd
や他のディスク読み取り/書き込みプロセスでも同じ説明が機能しますか?
dd
、bs
設定した内容によって異なります。512(デフォルト)のみの場合、すぐに終了します。大きい場合は、少し時間がかかる場合があります。
以来cp
ユーザ空間のコマンドがあり、これはファイルシステムの整合性には影響を与えません。
もちろん、実行中のcp
プログラムを強制終了した場合、少なくとも1つのファイルが完全にコピーされないように準備する必要があります。
CAP_SYS_RAWIO
ファイルシステムの基盤となるデバイス(例sudo dd if=/dev/urandom of=/dev/sda1
:)に直接アクセスできる昇格された特権(例:Linuxまたは他のOSで同等)で実行されるユーザー空間プログラムは、あらゆる種類の破壊をもたらす可能性があります。
cp
おそらく終了からcp
も破損するでしょう