Liên kết đến một nút cụ thể


14

Tôi có một tập tin đã bị xóa, nhưng vẫn được mở bởi một chương trình. Tôi tìm thấy số inode bằng lsof. Làm thế nào tôi có thể tạo một liên kết cứng trở lại inode đó?

Câu trả lời:


31

Bạn không thể tạo một liên kết đến nó, nhưng bạn có thể lấy lại nó. Hãy làm một thí nghiệm:

$ echo blurfl >myfile.txt
$ tail -f myfile.txt &
$ rm myfile.txt

myfile.txt hiện đã biến mất, nhưng inode được giữ nguyên bởi lệnh tail. Để lấy lại tệp của bạn, trước tiên hãy tìm PID của quá trình giữ nút inode:

$ ps auxw | grep tail
sunny      409  0.0  0.0   8532   824 pts/5    S    18:07   0:00 tail -f myfile.txt

PID là 409. chdir đến / Proc / 409 / fd / và liệt kê nội dung:

dr-x------ 2 sunny sunny  0 2009-07-24 18:07:18 .
dr-xr-xr-x 7 sunny sunny  0 2009-07-24 18:07:17 ..
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 0 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:33 1 -> /dev/pts/5
lrwx------ 1 sunny sunny 64 2009-07-24 18:07:18 2 -> /dev/pts/5
lr-x------ 1 sunny sunny 64 2009-07-24 18:07:33 3 -> /home/sunny/tmp/myfile.txt (deleted)

Các thư mục / Proc / [PID] / fd / chứa các liên kết tượng trưng đến các mô tả tệp của tất cả các tệp mà quá trình sử dụng. Trong trường hợp này, symlink "3" trỏ đến tệp đã xóa. Vì vậy, để khôi phục tệp, sao chép nội dung sang tệp mới:

$ cat 3 >/home/mydir/saved_file.txt

Tôi đã thực hiện điều này với trình gỡ lỗi hệ thống tập tin trong quá khứ xa xôi (ví dụ: "debugfs dump"), nhưng khái niệm này là như nhau.
Gerald Combs

1
câu trả lời hay, +1
asdmin

Điều này không làm việc cho tôi. Cho rằng '3' là một liên kết tượng trưng lơ lửng, không phải là mô tả tệp "thực", nó luôn tạo ra một tệp trống.
Rob Chanter

4
@Rob: Không, không. Nếu bộ mô tả tệp đang được sử dụng, symlink sẽ trỏ đến dữ liệu hợp lệ, nếu không thì symlink sẽ không tồn tại ở vị trí đầu tiên. Khi tập tin được đóng lại, symlink sẽ biến mất. Bạn đã có một khoảng trắng sau "3", phải không? Nếu không, bạn sẽ xuất nội dung của bộ mô tả tệp 3 trong trình bao hiện tại và điều đó có thể trống.
nắng256

1
Vấn đề duy nhất với điều này là nếu tệp vẫn đang được ghi vào thì bản sao bạn tạo sẽ bị cắt ngắn. Có lẽ không có thời gian giữa khi dừng ghi và tệp được đóng để làm điều này để bạn có được một tệp hoàn chỉnh.
KayEss


-8

Không có cách di động để làm điều này trong Linux. Cách tốt nhất có lẽ là khiến tất cả hoạt động trên hệ thống tệp ngừng hoạt động, giết chương trình giữ tệp mở, ngắt kết nối hệ thống tệp và sử dụng trình gỡ lỗi hệ thống tệp để đính kèm lại vào thư mục. Nếu bạn có hệ thống tệp được xuất qua NFS, ít nhất một số phiên bản của NFS có thể cho phép bạn đọc dữ liệu tệp trên NFS.


2
bạn có thể mất tập tin khi bạn giết chương trình
DukeLion
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.