Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux EXT 文件系統誤刪文件恢復實戰:從 /proc 到 extundelete 全流程

編輯:Linux 教學

前言:Linux 沒有「回收站」,但數據未必真的沒了

rm -rf 一聲令下,文件消失得無影無蹤。但 Linux 文件系統的特性給了我們「後悔藥」的機會——只要磁碟區塊未被覆寫,數據就有機會找回。本文實戰演示兩大核心恢復路徑:進程持有開啟文件時的 /proc 恢復、文件已關閉但區塊未覆寫的 extundelete 恢復。

場景一:進程仍持有文件句柄 —— /proc 瞬時恢復

原理

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

適用條件與限制

  • ✅ 文件被刪除後,相關進程未退出、未關閉文件
  • ✅ 適用於日誌文件、資料庫文件、長時間運行服務的臨時文件
  • ❌ 進程已重啟、文件已關閉 → 此法失效
  • ❌ 系統重啟 → /proc 重建,徹底失效

場景二:文件已關閉、無進程持有 —— extundelete 深度掃描

工具介紹

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
# 或同樣原始碼編譯

實戰流程:恢復誤刪的 /home/mysql/script 目錄

# 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'僅恢復指定時間前刪除的文件

終極預防:比恢復更重要的事

  1. 別名保護:alias rm='rm -i' 寫入 ~/.bashrc,每次刪除需確認
  2. 定時快照備份:LVM 快照、ZFS snapshot、Btrfs 快照、rsync 增量、雲廠商磁碟快照
  3. 資料庫專用備份:mysqldump、xtrabackup、pg_dump、wal-g,絕不依賴文件級備份
  4. 權限最小化:生產庫賬號僅擁有 DML 權限,DDL/DCL 走變更流程
  5. 操作審計:auditd 記錄關鍵命令,history 設大尺寸並同步到中央日誌

總結決策樹

誤刪發生
   │
   ├─ 進程還在運行且持有文件? → YES → /proc/PID/fd/ 直接 cp → 完成
   │
   └─ NO → 立即 umount / dd 備份 → extundelete 掃描恢復
             │
             ├─ 關鍵業務、數據價值高 → 專業數據恢復公司(不再自行操作)
             │
             └─ 一般數據 → extundelete --restore-all → 驗證 → 上線

鐵律:誤刪發現瞬間,停止寫入是唯一核心動作。任何後續操作(包括安裝工具、掃描)都有覆寫風險。先 umount,再決策。

Copyright © Windows教程網 All Rights Reserved