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

利用 /proc 恢復被誤刪但仍被進程佔用的文件:lsof 定位 fd 並拷貝還原

編輯:Linux 教學

適用場景

  • 檔案被 rm 刪除
  • 但仍有進程打開該檔案 (檔案描述符未釋放)
  • 系統未重啟、進程未結束

核心原理

Linux 透過 /proc/PID/fd/FD 保留對已刪除檔案的引用。inode 連結數雖歸零,但資料區塊未被覆寫,可透過此路徑讀取內容。

實戰恢復步驟

1. 模擬場景

# 用戶 A 正在查看
tail -f strace.log

# 用戶 B 誤刪
rm strace.log

# 用戶 C 發現不見
ls strace.log
# ls: cannot access strace.log: No such file or directory

2. 定位進程與檔案描述符

lsof | grep strace.log
# 輸出:
# tail    1234  userA  4r   REG  253,0  10240  12  /var/log/strace.log (deleted)

# 關鍵資訊:
# PID = 1234
# FD  = 4

3. 檢視 /proc 路徑

ls -l /proc/1234/fd/
# 輸出:
# lr-x------ 1 userA userA 64 Jan 15 10:30 4 -> /var/log/strace.log (deleted)

4. 拷貝恢復

cp /proc/1234/fd/4 /tmp/strace.log.recovered
# 或
cat /proc/1234/fd/4 > /tmp/strace.log.recovered

# 驗證
diff /tmp/strace.log.recovered <(tail -f 之前的輸出)  # 內容一致

注意事項

  • 唯讀恢復:無法寫回原路徑,只能另存新檔
  • 時效性:進程結束或系統重啟後 /proc 項目消失,資料永久遺失
  • 權限:需具備讀取該進程 /proc 目錄權限 (通常需 root 或同用戶)
  • 大檔案:若檔案極大,確保目標分區有足夠空間

進階:批次恢復腳本

#!/bin/bash
# recover_deleted.sh 
pattern=$1
lsof | grep "$pattern" | grep deleted | while read line; do
  pid=$(echo $line | awk '{print $2}')
  fd=$(echo $line | awk '{print $4}' | sed 's/[^0-9]//g')
  fname=$(echo $line | awk '{print $9}' | sed 's/ (deleted)//')
  cp /proc/$pid/fd/$fd /tmp/recovered_$(basename $fname)_$pid
  echo "Recovered $fname from PID $pid FD $fd"
done

補救方案 (已重啟/進程結束)

  • 進入救援模式,掛載分區唯讀
  • 使用 extundelete、testdisk、photorec 掃描磁碟恢復
  • 關鍵:立即停止寫入該分區,避免資料被覆寫
Copyright © Windows教程網 All Rights Reserved