rm -rf 一聲令下,文件消失得無影無蹤。但 Linux 文件系統的特性給了我們「後悔藥」的機會——只要磁碟區塊未被覆寫,數據就有機會找回。本文實戰演示兩大核心恢復路徑:進程持有開啟文件時的 /proc 恢復、文件已關閉但區塊未覆寫的 extundelete 恢復。
Linux VFS 層邏輯:文件連結計數 (link count) 歸零 ≠ 空間立即釋放。只要仍有進程持有文件描述符 (fd),inode 與數據區塊就不會被標記為可用。/proc/PID/fd/ 目錄映射了進程所有打開的文件描述符,本質是指向 inode 的符號連結。
# 1. 發現誤刪,立即停止該分區寫入操作!
# 2. 定位持有文件的進程
lsof | grep -i delete
# 輸出範例:
# cat 11791 root 1w REG 253,0 94 1048589 /home/woqu/echo_red.sh (deleted)
# 欄位:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# 3. 確認關鍵資訊
# PID = 11791,FD = 1 (1w 中的數字部分)
# 4. 從 /proc 直接複製恢復
cp /proc/11791/fd/1 /root/echo_red.sh.recovered
# 5. 驗證內容
cat /root/echo_red.sh.recovered
extundelete 專為 ext3/ext4 設計,利用日誌 (journal) 與 inode 表掃描已刪除 inode,支援單文件、目錄、整分區恢復。核心前提:誤刪後立即停止寫入,防止 inode/區塊被覆寫。
# CentOS/RHEL
yum -y install e2fsprogs-devel
wget https://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
tar xjf extundelete-0.2.4.tar.bz2
cd extundelete-0.2.4
./configure && make && make install
# Debian/Ubuntu
apt-get install extundelete
# 或同樣原始碼編譯
# 1. 立即卸載分區(唯讀掛載亦可,但卸載最安全)
umount /home
# 2. 建議:dd 全盤鏡像備份(萬一恢復失敗,專業數據恢復公司仍可接手)
dd if=/dev/VolGroup/home of=/backup/home_$(date +%F).img bs=4M status=progress
# 3. 掃描根目錄 inode (2) 定位 mysql 目錄 inode
extundelete --inode 2 /dev/VolGroup/home
# 找到 mysql inode = 262145
# 4. 掃描 mysql 目錄 inode 確認 script 狀態
extundelete --inode 262145 /dev/VolGroup/home
# 發現 script inode = 404044,狀態 Deleted
# 5. 恢復單一 inode(適合單文件)
extundelete --restore-inode 404044 /dev/VolGroup/home
# 恢復檔案輸出至 ./RECOVERED_FILES/file.404044
# 6. 或恢復所有已刪除項目(適合整目錄)
extundelete --restore-all /dev/VolGroup/home
# 輸出至 ./RECOVERED_FILES/mysql/script/ 完整目錄結構
# 7. 將恢復內容複製回原位
cp -a RECOVERED_FILES/mysql/script /home/mysql/
| 參數 | 用途 |
|---|---|
--restore-file 'path' | 按相對路徑恢復單文件 |
--restore-directory 'path' | 按相對路徑恢復單目錄 |
--after 'timestamp' | 僅恢復指定時間後刪除的文件 |
--before 'timestamp' | 僅恢復指定時間前刪除的文件 |
alias rm='rm -i' 寫入 ~/.bashrc,每次刪除需確認mysqldump、xtrabackup、pg_dump、wal-g,絕不依賴文件級備份auditd 記錄關鍵命令,history 設大尺寸並同步到中央日誌誤刪發生
│
├─ 進程還在運行且持有文件? → YES → /proc/PID/fd/ 直接 cp → 完成
│
└─ NO → 立即 umount / dd 備份 → extundelete 掃描恢復
│
├─ 關鍵業務、數據價值高 → 專業數據恢復公司(不再自行操作)
│
└─ 一般數據 → extundelete --restore-all → 驗證 → 上線
鐵律:誤刪發現瞬間,停止寫入是唯一核心動作。任何後續操作(包括安裝工具、掃描)都有覆寫風險。先
umount,再決策。