Dereferences liên kết cứng


22

Trong trang hướng dẫn sử dụng tarlệnh, một tùy chọn để theo các liên kết cứng được liệt kê.

-h, --dereference
      follow symlinks; archive and dump the files they point to

--hard-dereference
      follow hard links; archive and dump the files they refer to

Làm thế nào để tarbiết rằng một tập tin là một liên kết cứng? Làm thế nào để nó theo nó?

Nếu tôi không chọn tùy chọn này thì sao? Làm thế nào để nó không khó khăn?

Câu trả lời:


24

Theo mặc định, nếu bạn yêu tarcầu lưu trữ một tệp có liên kết cứng và nhiều hơn một liên kết như vậy được bao gồm trong số các tệp sẽ được lưu trữ, thì nó chỉ lưu trữ tệp một lần và ghi lại thứ hai (và bất kỳ tên bổ sung nào) dưới dạng liên kết cứng. Điều này có nghĩa là khi bạn trích xuất kho lưu trữ đó, các liên kết cứng sẽ được khôi phục.

Nếu bạn sử dụng --hard-dereferencetùy chọn, sau đó tarkhông không duy trì liên kết cứng. Thay vào đó, nó coi chúng là các tệp độc lập tình cờ có cùng nội dung và siêu dữ liệu. Khi bạn trích xuất kho lưu trữ, các tệp sẽ độc lập.

Lưu ý: Nó nhận ra các liên kết cứng bằng cách trước tiên kiểm tra số lượng liên kết của tệp. Nó ghi lại số thiết bị và inode của mỗi tệp có nhiều hơn một liên kết và sử dụng liên kết đó để phát hiện khi cùng một tệp được lưu trữ lại. (Khi bạn sử dụng --hard-dereference, nó không làm điều này.)


7

Bạn có thể phân biệt một tệp có (các) liên kết cứng với tệp không liên kết cứng với "số liên kết". Tôi thấy hai cách để có được điều này từ dòng lệnh:

% stat original
  File: ‘original’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 804h/2052d      Inode: 932815      Links: 2
Access: (0644/-rw-r--r--)  Uid: (  500/ bediger)   Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
 Birth: -

Hoặc là

1010 % ls -li 
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary

Sự cô đơn '2' trước "bediger" là số lượng liên kết. Lưu ý rằng cả hai tên tệp có cùng số inode, 932815.

Tôi chắc chắn rằng cả hai lệnh này đều có số lượng liên kết từ trường st_nlink của struct stat, được điền bởi một stat()lệnh gọi hệ thống.

Gần như tôi có thể nói, chạy tarvới --hard-dereferencenghĩa là thay vì lấy một tệp có hai tên tệp riêng biệt (như trong ví dụ ở trên), bạn nhận được hai tệp, mỗi tệp có một tên tệp. tarcó thể kiểm tra số lượng liên kết trên mỗi tệp và theo mặc định khi giải nén, nó tạo ra một liên kết cứng trên tên tệp thứ hai mà nó có cho dữ liệu tệp được liên kết cứng. Khi được gọi với --hard-dereferencetạo lưu trữ, nó xuất hiện để tạo một tệp hoàn toàn mới cho tên tệp thứ hai khi trích xuất lệnh tarchạy.


Bây giờ tôi hiểu rằng 'theo liên kết cứng' là từ ngữ sai. Cảm ơn bạn. Nhưng nếu một trong hai tệp giống nhau không được lưu trữ thì sao? Số lượng liên kết là sai lệch trong các trường hợp như vậy.
musa

2
Đó không phải là "hai tệp giống nhau", đó là một tệp có hai tên. Không quan trọng tệp tar nào không lưu trữ, vì chúng giống hệt nhau. Theo mặc định, tar có thể chỉ giữ một số loại "con trỏ" từ tên tệp thứ 2 trở lại tên đầu tiên, giống như hệ thống tập tin.
Bruce Ediger
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.