? ? ? ? 最近在mv文件的時候,操作失誤將生產服務器一個1TB的文件夾mv到了/opt/test目錄,因為最后/opt/目錄被沾滿所以1TB的文件夾沒有遷移過來,寫入了30GB數據到了/opt/test目錄,因為系統分區被沾滿,所以把test目錄給刪除了。
? ? ? ? 那么問題就來了,1TB的源目錄哪些文件被mv到了/opt/test目錄中,因為/opt/test/目錄被刪除無法進行判斷,查看生產系統都正常沒有發現數據丟失。
? ? ? ? 在測試服務器上進行實驗,測試將大量數據mv到小于該數據容量硬盤會發生什么現象。新建一個5GB的硬盤,將root目錄中的數據(遠大于5GB)mv到這個5GB硬盤中.
? ? ? ? 執行 mv /root /mnt,在mv的過程中,發現源盤的容量沒有減少,但是目標盤的數據量不斷在增加,指導目標目錄空間被沾滿,源盤的數據都沒有減少。
? ? ? ?所以鑒于上面的實驗可以得知,在mv數據的時候,mv指令因為目標目錄被沾滿而未完成mv操作,不會對源目錄的數據進行刪除操作,只是將源目錄中的數據寫入到目標目錄中。
? ? ? ?下面通過strace跟蹤mv執行過程。
情況A,mv單個文件,在根目錄創建文件“1”,寫入數據“111111111111111”,然后mv“1”文件到/mnt目錄。通過下面可以知道在數據寫入完成后,然后unlink掉源文件“1”
情況B,如果mv整個目錄,目錄中包含多個文件,那么是mv完成單個文件后就刪除對應的源文件,還是mv完成整個目錄后,再刪除源文件及目錄?
創建文件夾mvdata3,寫入6個測試文件
執行mv /root/mvdata3 /mnt。
通過上面截圖可知,首先判斷目標目錄/mnt中有沒有mvdata3目錄及對應所需mv的文件;第二步打開源文件并將數據寫入到目標文件。可以看到在文件“1”完成寫入后,沒有對文件“1”進行unlink操作,而是繼續mv文件“2”,依次類推,知道文件“6”。
在文件“1”到文件“6”全部寫入完成后,通過strace看到最后刪除文件及目錄
所以通過上面strace跟蹤mv執行可以得出結論,mv操作是在完成所有數據寫入后,再執行的刪除源文件動作。