2013-08-12 40 views
8

Có cách nào để tạo tệp trong Linux liên kết đến một iNode cụ thể không? Thực hiện kịch bản này: Có tệp trong quá trình viết (nhật ký có thể) và tệp cụ thể bị xóa nhưng liên kết trong thư mục/proc vẫn trỏ vào đó. Trong trường hợp này chúng ta cần không phải là một bản sao trắng của nó mà là một liên kết cứng với nó để chúng ta có thể sửa đổi trong tương lai và sửa đổi cuối cùng trước khi quá trình đóng và hệ thống xóa nó.Khôi phục tập tin Linux bị xóa

Nếu chúng tôi có số iNode có cách nào để đạt được mục tiêu này không?

Trả lời

4

Bạn có thể sử dụng lsof để khôi phục lại file bị xóa (đôi khi) ...

> lsof | grep testing.txt 
less 4607 juliet 4r REG 254,4 21 
     8880214 /home/juliet/testing.txt (deleted) 

Hãy chắc chắn để đọc bài viết gốc để biết chi tiết đầy đủ trước khi cố gắng này, trừ khi bạn là một Maveric như tôi.

> ls -l /proc/4607/fd/4 
lr-x------ 1 juliet juliet 64 Apr 7 03:19 
     /proc/4607/fd/4 -> /home/juliet/testing.txt (deleted) 
> cp /proc/4607/fd/4 testing.txt.bk 

http://www.linuxplanet.com/linuxplanet/tips/6767/1

Thưởng thức

+1

Gasp. Bạn đúng. Tôi nghĩ tôi đã thử nghiệm điều đó, và nó không hoạt động. NTL: OP yêu cầu một liên kết cứng, đặc biệt không phải là một bản sao. –

3

Đó là luôn luôn khó để trả lời một câu hỏi như "Tôi có thể làm" tự tin trong các tiêu cực. Nhưng theo như tôi thấy, không/sys/cũng không/proc cung cấp một ánh xạ các mô tả các tệp mở không phải là các liên kết tượng trưng. Tôi giả sử bởi "NHƯNG một liên kết trong dir/proc vẫn trỏ vào nó" bạn có nghĩa là/proc// fd/mục trông giống như symlinks? Tôi gần như chắc chắn bạn không thể khôi phục tập tin gốc.

Tôi lấy lại điều đó: Khi người dùng user2676075 chỉ ra, việc sao chép không hoạt động. Chỉ cần liên kết cứng không ...

CẬP NHẬT: Nếu bạn nghĩ về điều đó, nó khá hợp lý.

  • /proc và/sys là các hệ thống tệp khác với đĩa cứng của bạn. Vì vậy, họ không thể cung cấp tập tin như mục thư mục mà người ta có thể hardlink đến một điểm đến trên đĩa cứng.
  • Các/proc/*/fd/mục giả vờ là liên kết tượng trưng, ​​nhưng thực ra chúng khác nhau, nếu không quá trình sao chép sẽ không hoạt động. Tôi nghĩ rằng họ giả vờ là symlink để cung cấp thông tin có ý nghĩa với 'ln -l'.

  • Về (thiếu) khả năng hardlink với một số inode (giả sử với một số cuộc gọi hệ thống): Đây không thể là một phần của hạt nhân hoặc VFS-Interface, vì những lý do sau đây:

    • Nó sẽ vi phạm tính toàn vẹn của hệ thống tập tin. Hệ thống tập tin không phải là để giữ các khối đĩa của các tập tin được xóa hoàn toàn theo cách tương tự như các tập tin tồn tại.

    • Các inode có thể là một khái niệm hoàn toàn ảo để xác định một "nơi lưu trữ một luồng dữ liệu. Tôi giả định có thể có sự cố sẽ có vấn đề khi chuyển đổi một vị trí không có tham chiếu trở lại một vị trí được tham chiếu theo tên trong hệ thống tệp.

    Tôi thừa nhận trường hợp chống lại khả năng cuộc gọi hệ thống như vậy không chặt chẽ, nhưng cho trạng thái hiện tại của giao diện VFS. một cuộc gọi như vậy), nó sẽ là một gánh nặng cho việc thực hiện bất kỳ hệ thống tệp nào (bao gồm ví dụhệ thống tệp được phân phối) để cung cấp cuộc gọi liên kết tệp vào thư mục bằng inode.

ATM Tôi tự hỏi nếu gọi fstat trước và sau khi xóa các tài liệu tham khảo cuối cùng là thực sự đòi hỏi phải trả lại thông tin inode cùng ... t

+0

Lý do hardlink-to-inode không tồn tại là nó sẽ cho phép mọi người truy cập các tệp mà họ không nên. Một thư mục 700 làm cho tất cả mọi thứ dưới nó riêng, trừ khi bạn có thể bỏ qua nó với một số inode như một đối số để liên kết (2). Điều gì sẽ là tốt đẹp cho tình huống này là liên kết (2) lấy một mô tả tập tin mở. Mặc dù ngay cả điều đó cũng sẽ mở ra những quy trình mới có thể làm, nếu bắt đầu với một fd mở trên một tập tin không thể truy cập được nữa, hoặc một cái bạn không thể tự mở. Ngoài ra, ngữ nghĩa xóa là: không gian đĩa sống cho đến khi liên kết cuối cùng VÀ fd mở cuối cùng và mmap cuối cùng biến mất. –

14

Vì không có syscall có liên quan đến inode, vì là một khái niệm về extX fs và không phải là một thực hành tốt làm cho ống bếp nhưng nó là tạo ra một chuỗi đáp ứng (như MEL gợi ý), chỉ có SỐ câu trả lời cho câu hỏi này vì ở cấp VFS chúng ta xử lý đường dẫn và tên tệp và không phải là các đại diện nội bộ khác.

NHƯNG để đạt được các mục tiêu để theo dõi sự biến đổi cuối cùng nhất mà chúng ta có thể sử dụng một giám sát liên tục và trùng lặp với đuôi:

tail -c+1 -f --pid=PID /proc/PID/fd/FD > /path/to/the/copy 

nơi PID là pid của quá trình đó có các tập tin bị xóa vẫn mở và FD là số mô tả tập tin của nó. Với -f đuôi mở và giữ tệp để hiển thị sửa đổi thêm, với -c + 1 bắt đầu "đuôi" từ byte đầu tiên và với đuôi --pid = PID được thông báo để thoát khi thoát pid .

+0

inodes không dành riêng cho ext2/3/4. Chúng là một phần của thông số POSIX về cách các cuộc gọi hệ thống như công việc stat (2) và cách bạn tìm thấy các liên kết cứng. Nhưng tiếc là bạn đã đúng rằng dường như không có cách nào để tạo liên kết từ/proc/PID/fd/FD đến một tệp thực, chỉ cần mở nó để đọc/ghi. Nếu chỉ có một cuộc gọi hệ thống như liên kết (2) đã lấy một mô tả tập tin mở như là nguồn, chứ không phải là một đường dẫn. –

Các vấn đề liên quan