在工作中,我們知道一些操作命令危險性很高,如: rm -rf,它會造成數(shù)據(jù)的誤刪除。如果萬一出現(xiàn)這樣情況導(dǎo)致數(shù)據(jù)誤刪除時,我們應(yīng)該如何對數(shù)據(jù)進(jìn)行恢復(fù)呢?
刪除數(shù)據(jù)的兩種場景
通常有兩種數(shù)據(jù)刪除的場景是你需要清晰了解的。頭 1 個是在執(zhí)行 rm -rf 刪除文件時,該文件正在被進(jìn)程使用。第 2 個是這個文件并沒有被其他進(jìn)程所使用,而被誤刪除。本文小機(jī)服務(wù)器存儲維保將圍繞這兩種場景進(jìn)行講解并演示。
為什么數(shù)據(jù)可以恢復(fù)
既然我執(zhí)行了 rm -rf 命令,不就是刪除文件了嗎,為什么又可以恢復(fù)數(shù)據(jù)呢?首先我來為你介紹一下其原由,對于頭 1 種進(jìn)程正在使用文件的場景,數(shù)據(jù)可以恢復(fù)是由因為 Linux 里,每個文件都有 2 個 link 計數(shù)器:i_count 和 i_nlink。
i_count 的作用是當(dāng)一個文件被一個進(jìn)程引用時,它的數(shù)值會加 1,也就是說它記錄的是文件被進(jìn)程引用的次數(shù)。i_nlink 的作用則是記錄文件產(chǎn)生硬鏈接的個數(shù)。Linux 系統(tǒng)只有在兩個數(shù)值都清零的時候,文件才被系統(tǒng)認(rèn)為是刪除的。如果我們執(zhí)行了 rm -rf,卻并沒有把 i_count 刪除,假設(shè)此時刪除文件有進(jìn)程在使用,那么它(i_count)數(shù)值不為 0。這個時候就是文件看似被刪除,但在操作系統(tǒng)還是能便捷的恢復(fù)回來。
這就是頭 1 種場景刪除數(shù)據(jù)能夠被找回的原因(由于 i_count 不為 0)。
第 2 種場景是將沒有被進(jìn)程使用的文件誤刪除,此時 i_count 和 i_nlink 都為 0。這個時候文件的 inode 連接信息已經(jīng)被刪除了,我們就需要通存放文件的 block 單元,做數(shù)據(jù)塊的數(shù)據(jù)找回。在系統(tǒng)上我們能看到的文件內(nèi)容包括:文件名、文件大小、內(nèi)容,但實際上它的存儲依賴兩個非常重要的單元,一個是 inode,它用于存放文件的相關(guān)元數(shù)據(jù),它的元數(shù)據(jù)里會有一個類似于索引的值,能夠索引到后面具體存放數(shù)據(jù)的 block 單元, block 是一個數(shù)據(jù)塊,用來實際存放數(shù)據(jù)。我們在刪除文件時,其實是把 inode 的鏈接刪除了,但是 block 數(shù)據(jù)塊,并沒有刪除。
所以這個時候我們依然可以通過分析后端的 block 塊,對文件進(jìn)行恢復(fù)。因為 block 塊保存著真實的數(shù)據(jù),理論上可以作完整的找回數(shù)據(jù),不過有一個風(fēng)險:如果有進(jìn)程在不斷往磁盤寫數(shù)據(jù)時,需要申請新的 block 塊,如果操作系統(tǒng)分配已刪除文件的 block 塊時,那么新的寫入數(shù)據(jù)就會覆蓋 block 原來的數(shù)據(jù),這時就會造成數(shù)據(jù)真正丟失的風(fēng)險。
所以,如果出現(xiàn)這樣場景造成數(shù)據(jù)誤刪除,需要 umount 目錄所在的磁盤設(shè)備。如果沒有其他進(jìn)程在不斷地往同一個磁盤塊(block)里寫數(shù)據(jù),那么你的數(shù)據(jù)理論上還是在 block 塊里面,依然可以通過相關(guān)分析把數(shù)據(jù)找回。這就是我們?yōu)槭裁纯梢栽谶@兩個場景中把數(shù)據(jù)找回的原因。
13870951502
聯(lián)系人:李經(jīng)理
郵 箱:mulj@it-ybw.com
網(wǎng) 址:cnmsl.cn
地 址:北京市海淀區(qū)永豐產(chǎn)業(yè)園永捷北路9號聯(lián)強(qiáng)國際5F