刪除數據的兩種情況
您需要清楚地了解數據刪除通常有兩種情況。1是指當rm -rf刪除壹個文件時,該文件正在被壹個進程使用。第二個原因是該文件未被其他進程使用,並且被錯誤地刪除了。在這堂課上,我將解釋和演示這兩種情況。
為什麽數據可以恢復?
由於我執行了rm -rf命令,所以我只是刪除了該文件。為什麽我可以恢復數據?首先,讓我告訴妳為什麽。對於1進程正在使用文件的場景,數據可以恢復,因為在Linux中,每個文件都有兩個鏈接計數器:i_count和i_nlink。
i_count的作用是當壹個文件被進程引用時,它的值將增加1,這意味著它記錄了該文件被進程引用的次數。i_nlink的功能是記錄文件生成的硬鏈接數量。只有在Linux系統中這兩個值都被清除時,文件才會被系統視為已刪除。如果我們執行rm -rf,但i_count沒有被刪除,假設此時有壹個正在使用的進程正在刪除該文件,那麽它的(i_count)值不為0。此時,該文件似乎已被刪除,但仍可以在操作系統中輕松恢復。
這就是1場景的刪除數據可以被檢索到的原因(因為i_count不是0)。
第二種情況是錯誤地刪除進程不使用的文件。此時,i_count和i_nlink都為0。此時文件的inode連接信息已經被刪除,所以我們需要通過存儲文件的block單元來檢索數據塊的數據。我們在系統上可以看到的文件內容包括:文件名、文件大小和內容,但實際上,它的存儲取決於兩個非常重要的單元。壹個是inode,用於存儲文件的相關元數據,其元數據將具有類似於索引的值,該值可以索引到存儲數據的塊單元。塊是數據塊,用於實際存儲數據。當我們刪除文件時,我們實際上刪除了inode的鏈接,但沒有刪除block數據塊。
所以在這個時候,我們仍然可以通過分析後端塊來恢復文件。由於塊中保存的是真實數據,因此理論上可以完整地檢索數據,但存在風險:如果某個進程不斷向磁盤寫入數據,則需要申請新的塊,如果操作系統分配了已刪除文件的塊,則新寫入的數據將覆蓋該塊的原始數據,這將導致真實數據丟失的風險。
因此,如果這種情況導致數據被錯誤刪除,您需要在第壹時間使用umount目錄所在的磁盤設備。如果沒有其他進程不斷地將數據寫入同壹個磁盤塊,那麽理論上您的數據仍然在該塊中,並且您仍然可以通過相關性分析檢索它。
這就是為什麽我們可以在這兩種情況下恢復數據,所以接下來我將解釋如何恢復數據。我將通過兩個案例來演示。
案例演示
讓我們首先演示1的場景。1場景是文件在被進程使用的過程中被刪除。在這種情況下如何恢復文件?
首先,我在測試環境中登錄到機器上,這裏打開了兩個窗口。在1窗口中,我登錄到此服務器,在cd /test目錄中,echo有壹個測試文件(我將其命名為DeleteFile),然後我將此內容(“Delete file”)重定向到本地deletefile.txt此時,我的測試文件已經生成。我接下來要做的是啟動壹個進程,並讓它實時使用該文件。
在這裏,我使用tail命令持續查看並保持監聽和使用該文件。
接下來,在另壹個窗口中,我也將轉到/test目錄,此時我將執行rm -rf。/deletefile.txt,從而“完全”刪除該文件。接下來,通過ls,我們可以看到這個文件在本地不再存在。
現在我們已經模擬了文件在此過程中被刪除的場景,下面我們來演示文件的恢復。
首先,我們需要找出哪個進程正在使用這個文件。我們可以使用lsof命令,grep剛剛刪除的文件的名稱(deltefile.txt)將列出當前使用該文件的進程。我們將看到tail命令正在使用中,其pid為4701。
接下來,我們需要根據這個線索恢復數據。我們知道進程會有壹個文件句柄,所以我們會查找進程的文件句柄目錄,cd到/proc/{pid}/fd目錄(這裏的pid是4701),我們會在這個目錄中輸入ls -l命令,此時我們會看到使用了這個文件(/test/deletefile.txt),它的文件句柄是3。
接下來,我們需要想辦法恢復這個文件並輸入CP 3/opt/recover test/delete file . txt _ bak。此時,我復制了這三個文件以將數據恢復到/opt/recover test/delete file . txt _ bak文件。
此時,如果查看CD/opt/recover test/cat delete file . txt _ bak的內容,可以發現該文件的內容與剛剛生成的測試文件的內容壹致,因此剛剛刪除的文件已經恢復。
接下來,我將演示誤刪除數據的場景2(當沒有進程使用該文件時,如何恢復誤刪除的文件)。為了演示這個場景,為了安全起見,我在本地安裝了壹個額外的SDB獨立硬盤設備。
這種情況下如何恢復數據?我們需要安裝工具extundelete。登錄我的測試機器,在這個演示場景中,掛載壹個獨立的硬盤設備/dev/sdb並格式化數據。格式化完成後。將單個sdb設備掛載到測試目錄(mount /dev/sdb /test),然後生成壹個測試文件File(echo‘delete test‘》:File),此時,本地目錄會生成壹個測試文件file: file,然後創建壹個名為testdir(mkdir/test/testdir)的新目錄,這時本地區域中既有文件又有目錄,也就是我接下來要演示的刪除這些文件的過程。
我們可以通過rm -rf直接刪除當前目錄下的文件。/*.然後我需要恢復這個文件。原理是通過分析其塊來恢復inode鏈接。要分析和恢復刪除的文件鏈接,我們需要使用壹些工具。在這裏,我推薦您使用壹個名為extundelete的命令,這是壹個基於Linux下ext3\ext4的文件分析工具,可以分析文件系統中被刪除的文件並恢復數據。
在執行命令extundelete之前,首先需要做的是umount,並卸載我們剛剛誤刪除的目錄(umount?/test -l),避免了新的進程將數據寫入磁盤塊,同時也方便了工具的執行以進行下壹步分析。
附件:extundelete命令安裝方法:
yum -y安裝bzip2 e 2 fsprogs e 2 fsprogs-devel gcc-c++
wget/project/extend delete/extend delete/0 . 2 . 4/extend delete-0 . 2 . 4 . tar . bz2
tar jxvf extendelete-0 . 2 . 4 . tar . bz2?
cd刪除-0.2.4
。/配置?
制作與制作。& amp進行安裝
安裝此工具(extundelete)後,執行:ext undelete/dev/sdb-inode2。
我們可以在命令後添加設備名稱,然後添加上面的inode進行分析。完成後,我們將看到剛剛刪除的文件、名稱和目錄已出現在顯示屏上,我們還將看到inode編號和當前狀態。
我們也可以選擇恢復單個文件類型的文件並執行:ext undelete/dev/SD B- restore-file文件。
添加的選項是- restore-file,後跟您要還原的文件的名稱。
在執行上述恢復操作之前,我必須首先確保數據恢復目錄/opt/recovertest,cd?/opt/recoverest目錄中,執行要恢復的文件extend delete/dev/SD B- restore-file。
執行命令後,會出現成功提示。此時,在當前目錄的RECOVERED_FILES目錄中,有對應的恢復文件,壹個是file,另壹個是file.v1(這是新恢復的文件)。為什麽是file.v1?因為我做了兩次操作,它恢復了兩個文件。1文件是我之前寫的,第二個文件是因為我執行了第二次恢復。雖然恢復的文件也是壹個文件,但它將自動命名為壹個新版本,稱為file.v1(該文件是我們要恢復的文件的名稱)。
剛才提到的選項是恢復單個文件。如果我們想要恢復所有文件,我們將把選項更改為-restore-all,從而恢復已分析的已刪除文件。如果您只想恢復某個目錄,您可以將“全部”更改為目錄,然後通過restore-directory恢復單個已刪除的文件目錄。
以上是通過extundelete進行的場景2恢復演示。
在正常工作中,您仍然需要小心操作系統指令,以避免文件系統的意外刪除。畢竟,恢復會對我們的業務產生影響,數據風險也存在。