Dereferencing tautan keras

22

Di halaman manual tarperintah, opsi untuk mengikuti tautan keras terdaftar.

-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

Bagaimana tarmengetahui bahwa suatu file adalah tautan keras? Bagaimana cara mengikutinya ?

Bagaimana jika saya tidak memilih opsi ini? Bagaimana itu tidak sulit?

musa
sumber

Jawaban:

24

Secara default, jika Anda meminta taruntuk mengarsipkan file dengan tautan keras, dan lebih dari satu tautan tersebut termasuk di antara file yang akan diarsipkan, arsip hanya diarsipkan sekali, dan mencatat yang kedua (dan nama tambahan apa pun) sebagai tautan keras. Ini berarti bahwa ketika Anda mengekstrak arsip itu, tautan keras akan dipulihkan.

Jika Anda menggunakan --hard-dereferencepilihan, maka tartidak tidak melestarikan hard link. Sebaliknya, itu memperlakukan mereka sebagai file independen yang kebetulan memiliki konten dan metadata yang sama. Saat Anda mengekstrak arsip, file-file tersebut akan independen.

Catatan: Mengenali tautan keras dengan terlebih dahulu memeriksa jumlah tautan file. Ini mencatat nomor perangkat dan inode setiap file dengan lebih dari satu tautan, dan menggunakannya untuk mendeteksi kapan file yang sama sedang diarsipkan lagi. (Ketika Anda menggunakan --hard-dereference, itu tidak melakukan ini.)

cjm
sumber
7

Anda dapat membedakan file dengan tautan keras dari file yang tidak terkait dengan "jumlah tautan". Saya melihat dua cara untuk mendapatkan ini dari baris perintah:

% 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: -

Atau

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

'2' kesepian sebelum "bediger" adalah jumlah tautan. Perhatikan bahwa kedua nama file memiliki nomor inode yang sama, 932815.

Saya yakin bahwa kedua perintah ini mendapatkan jumlah tautan dari bidang st_nlink stat struct, yang akan diisi oleh stat()panggilan sistem.

Sejauh yang saya tahu, menjalankan tardengan --hard-dereferenceberarti bahwa alih-alih mendapatkan satu file dengan dua nama file yang berbeda (seperti dalam contoh di atas), Anda mendapatkan dua file, masing-masing dengan nama file tunggal. tarmungkin memeriksa jumlah tautan pada setiap file, dan secara default saat mengekstraksi, itu menciptakan tautan keras pada nama file kedua yang dimilikinya untuk data file yang ditautkan dengan keras. Ketika dipanggil dengan --hard-dereferencepada pembuatan arsip, tampaknya membuat file yang sama sekali baru untuk nama file kedua ketika permintaan ekstraksi tarberjalan.

Bruce Ediger
sumber
Sekarang saya mengerti bahwa 'follow hard link' adalah kata-kata yang salah. Terima kasih. Tetapi bagaimana jika salah satu dari dua file yang identik tidak diarsipkan? Hitungan tautan menyesatkan dalam kasus seperti itu.
musa
2
Ini bukan "dua file yang identik", ini satu file dengan dua nama. Tidak masalah tar file mana yang tidak diarsipkan, karena mereka identik. Secara default, tar mungkin hanya menyimpan semacam "pointer" dari nama file 2 kembali ke yang pertama, seperti halnya filesystem.
Bruce Ediger