Gunakan kasing untuk hardlink? [Tutup]

40

Dalam situasi apa seseorang ingin menggunakan hard-link daripada soft-link? Saya pribadi tidak pernah mengalami situasi di mana saya ingin menggunakan hard-link di atas soft-link, dan satu-satunya use case yang saya temui ketika mencari di web adalah deduplicating file yang identik .

Matthew Cline
sumber
4
Ada jawaban yang baik di bawah ini, tetapi pertimbangkan konteks sejarah (diperdebatkan). Ketika Unix masih baru, disk drive lambat dan memiliki kapasitas dan buffering terbatas. Tautan keras hanyalah entri langsung lain dalam sistem file ke file yang sama. Apakah Anda mengakses ls , atau seperti yang Anda suka menyebutnya, daftar , tidak relevan. Jika Anda telah membuat daftar tautan lunak, penggunaannya akan melibatkan menemukannya di direktori, membaca file khusus yang disebut daftar , melihat bahwa Anda menginginkan file ls , menemukan ls di direktori, dan membaca file ls sebenarnya dari disk. Sebuah besar perbedaan kinerja!
RichF
16
Yah hardlink pertama ke sebuah file sangat berguna.
Stop Harming Monica
@OrangeDog: Ya, tetapi Anda hanya perlu bidang jumlah tautan dalam inode jika Anda ingin mendukung banyak tautan. (Anda mungkin memerlukan flag untuk inode dalam memori untuk menangani case yang tidak terhubung tapi masih terbuka. Fsck setelah crash tanpa penjurnalan masih harus mencari inode tanpa ada tautan.)
Peter Cordes
1
Semantik direktori POSIX harus dirancang secara berbeda: ..selalu inode yang sama seperti .di direktori induk. Hal-hal seperti finddapat memeriksa penghitungan tautan = 2 untuk mendeteksi direktori daun, dan menghindari statentri dari readdir untuk mencari subdirektori. Tapi itu hanya fitur kecil yang diaktifkan oleh dukungan untuk hardlink file non-direktori (reguler, symlink, perangkat, soket, dan pipa bernama). (Ya, symlink memiliki inode sendiri, dan dapat di-hardlink.)
Peter Cordes
1
Salah satu alasan untuk menggunakan hardlink yang belum saya lihat dalam ulasan saya tentang SO, bersifat "global". Bayangkan sebuah sistem file di mana file-file umumnya kecil (kebanyakan memo pendek, katakanlah), tetapi untuk menjaga semuanya tetap teratur, Anda mungkin perlu pointer ke file yang sama di tempat yang berbeda. Dengan symlink, setiap pointer menggunakan inode. Sistem file seperti itu mungkin sudah memiliki masalah dengan kehabisan inode. Menggunakan hardlink sebagai petunjuk membantu dengan masalah ini. jumlah inode terbatas; nama untuk mereka tidak (setidaknya, tidak dengan cara yang sama).
mathguy

Jawaban:

27

Selain dari penggunaan cadangan yang disebutkan dalam komentar lain, yang saya percaya juga termasuk snapshot pada volume BTRFS, kasus penggunaan untuk tautan keras melalui tautan lunak adalah kumpulan file yang diurutkan tag. (Belum tentu metode terbaik untuk membuat koleksi, metode berbasis database berpotensi lebih baik, tetapi untuk koleksi sederhana yang cukup stabil, itu tidak terlalu buruk.)

Koleksi media di mana semua file disimpan dalam satu, flat, direktori dan diurutkan ke direktori lain berdasarkan berbagai kriteria, yaitu: tahun, subjek, artis, genre, dll. Ini bisa berupa koleksi film pribadi, atau kolektif studio komersial bekerja. Pada dasarnya selesai, file disimpan, tidak mungkin dimodifikasi, dan disortir, mungkin ke beberapa lokasi melalui tautan.

Ingatlah bahwa konsep "asli" dan "salin" tidak berlaku untuk tautan keras: setiap tautan ke file adalah asli, tidak ada "salin" dalam arti normal. Namun, untuk deskripsi use-case, istilah-istilah tersebut meniru logika perilaku.

"Asli" disimpan dalam direktori "katalog", dan "salinan" yang diurutkan sulit dihubungkan ke file-file itu. Atribut file pada direktori sortir dapat diatur ke r / o, mencegah perubahan yang tidak disengaja pada nama file dan struktur yang diurutkan, sedangkan atribut pada direktori katalog dapat r / w yang memungkinkannya untuk dimodifikasi sesuai kebutuhan. (Kasus untuk itu adalah file musik di mana beberapa pemain berusaha untuk mengubah nama dan mengatur ulang file berdasarkan tag yang tertanam dalam file media, dari input pengguna, atau pencarian internet.) Selain itu, karena atribut direktori "copy" dapat berbeda dari direktori "asli", struktur yang diurutkan dapat dibuat tersedia untuk grup, atau dunia, dengan akses terbatas sementara "katalog" utama hanya dapat diakses oleh pengguna utama, dengan akses penuh. Namun file itu sendiri akan selalu memiliki atribut yang sama pada semua tautan ke inode itu. (ACL dapat dieksplorasi untuk meningkatkan itu, tetapi bukan bidang pengetahuan saya.)

Jika dokumen asli diganti namanya, atau dipindahkan (direktori "katalog" tunggal menjadi terlalu besar untuk dikelola, misalnya) tautan keras tetap valid, tautan lunak rusak. Jika "salinan" dipindahkan dan tautan lunaknya relatif, maka tautan lunak itu akan, lagi-lagi, diputus, dan tautan keras itu tidak akan.

Catatan: sepertinya ada ketidakkonsistenan tentang bagaimana berbagai alat melaporkan penggunaan disk ketika soft-link terlibat. Namun, dengan tautan keras, tampaknya konsisten. Jadi dengan 100 file dalam katalog yang diurutkan ke dalam koleksi "tag", mungkin dengan mudah ada 500 "salinan" yang ditautkan. (Untuk koleksi foto, katakan tanggal, fotografer, dan rata-rata 3 tag "subjek".) Dolphin, misalnya, akan melaporkan bahwa 100 file untuk hard-link, dan 600 file jika soft-link digunakan. Menariknya, ia melaporkan penggunaan ruang disk yang sama, sehingga terlihat seperti kumpulan besar file kecil untuk tautan-lunak, dan kumpulan kecil file besar untuk tautan-keras.

Peringatan untuk jenis penggunaan-kasus adalah bahwa dalam sistem file yang menggunakan COW, memodifikasi "asli" dapat mematahkan tautan keras, tetapi tidak merusak tautan lunak. Tetapi, jika tujuannya adalah untuk memiliki salinan master, setelah mengedit, menyimpan, dan diurutkan, SAP tidak memasuki skenario.

Spellweaver Gypsy
sumber
3
FYI: snapshot btrf bukan hardlink. Mereka memiliki perilaku yang berbeda (misalnya, memodifikasi satu salinan tidak mengubah yang lain). Dan stathanya akan menampilkan satu tautan.
derobert
@derobert Tidak yakin cara kerja snapshot, sedikit investigasi menunjukkan hal-hal menarik. Untuk file / direktori tidak berubah statmenunjukkan nomor inode yang sama, tetapi ID perangkat berbeda. Harus ada hubungannya dengan cara subvolume yang di-overlay pada volume utama, yang jarang dipasang. Saya menduga bahwa jika volume utama dipasang statakan menunjukkan jumlah tautan yang sama dengan jumlah foto yang menahan versi file tersebut. SAP mungkin mengurus modifikasi yang tidak memengaruhi yang lain. Hanya spekulasi berdasarkan rasa ingin tahu yang ringan, tetapi tidak cukup penasaran untuk menggali lebih dalam.
Gypsy Spellweaver
Setiap symlink memiliki inode sendiri, sehingga ia menggunakan entri inode di sistem file. Sistem file Unix tradisional mengharuskan Anda untuk memilih berapa banyak ruang yang disediakan untuk inode pada waktu pembuatan FS, alih-alih mengalokasikannya sesuai kebutuhan seperti yang dilakukan XFS. Jadi sebenarnya penting bahwa versi symlink akan menggunakan lebih banyak inode (bahkan selain implikasi jejak cache VFS).
Peter Cordes
23

Tautan keras berguna untuk kasus di mana Anda tidak ingin mengikat keberadaan kedua file. Pertimbangkan ini:

touch a
ln -s a b
rm a

Sekarang btidak berguna. (Dan langkah-langkah ini mungkin terjadi berjauhan, dilakukan oleh orang yang berbeda, dll.)

Sedangkan dengan tautan keras,

touch a
ln a b
rm a

b masih ada dan benar.

Stephen Kitt
sumber
8
@ MatthewCline Anda ingin perilaku ini saat mengelola cadangan tambahan yang efisien. Terutama ketika cadangan lama dihapus, dalam sistem cadangan berbasis soft-link Anda harus memeriksa dan menghubungkan kembali semua file cadangan baru / tautan ke basis yang valid lagi, sedangkan hardlink melakukan pekerjaan itu "gratis" pada tingkat inode. timeshift / backintime misalnya menggunakan hardlink secara luas.
orzechow
3
@orzechow Saya rasa Anda tidak ingin perilaku tautan keras di dekat sistem cadangan Anda. github.com/bit-team/backintime/wiki/... backintime dengan bodoh mengasumsikan bahwa semua perubahan pada file akan dilakukan dengan siklus hapus-buat alih-alih memperbarui di tempat.
DepressedDaniel
10
@DepressedDaniel tautan keras baik-baik saja di dalam sistem cadangan, Anda hanya tidak ingin cadangan tersebut ditautkan dengan keras ke file langsung. Tetapi bagaimanapun juga, cadangan tidak boleh dapat dijangkau langsung dari sistem live ...
Stephen Kitt
1
Ini bukan jawaban - secara khusus, ini bukan kasus penggunaan. Itu hanya demonstrasi perilaku tautan keras.
user394
1
@ ThomasPadron-McCarthy itu kesalahpahaman. BiT hanya menggunakan tautan keras untuk menautkan file identik di dalam berbagai snapshot. Mereka TIDAK tertaut ke file asli! (I'm the BiT Dev)
Germar
11

Suatu program tunggal dapat mengubah perilakunya tergantung pada nama apa itu diluncurkan sebagai:

$ ls -li `which pgrep` `which pkill`
208330 -r-xr-xr-x  2 root  bin  19144 Jul 26  2016 /usr/bin/pgrep
208330 -r-xr-xr-x  2 root  bin  19144 Jul 26  2016 /usr/bin/pkill

Yang mana di sumber diputuskan melalui sesuatu seperti

if (strcmp(__progname, "pgrep") == 0) {
    action = grepact;
    pgrep = 1;
} else {
    action = killact;

meskipun detail persisnya akan bervariasi tergantung pada OS dan bahasa yang terlibat.

Ini memungkinkan (kebanyakan) kode identik untuk tidak harus dikompilasi ke dua (kebanyakan) biner identik. Ingat tanggal unix untuk hari-hari ketika ruang disk sangat mahal, meskipun menurut Stevens dalam APUE bab 4 symlink diterapkan di BSD4.2 (1983) untuk menggantikan berbagai keterbatasan hardlink. Program uji untuk memeriksa apakah nama symlink digunakan karena nama program mungkin terlihat seperti:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    printf("called as '%s'\n", *argv);
    exit(0);
}

Dan diuji melalui:

$ cc -o myname myname.c 
$ ln -s myname alias
$ ./myname
called as './myname'
$ ./alias
called as './alias'
$ 
thrig
sumber
4
Tapi bukankah itu biasanya ditangani dengan softlink?
Matthew Cline
1
@MatthewCline bisa jadi hari ini, tetapi symlink tidak ada sebelum 4.2BSD (1983) menurut Stevens di APUE.
thrig
4
@ thrig, pertanyaan yang secara spesifik menanyakan kasus penggunaan yang tidak dapat diselesaikan dengan symlinks atau, setidaknya, lebih disukai daripada menggunakan symlinks. Jawaban Anda berlaku untuk HL dan SL.
Marcelo
3
BusyBox mengambil ini secara maksimal.
Max Ried
8

Ketika perangkat lunak P2P saya selesai mengunduh file tertentu, file tersebut ditempatkan di direktori tertentu. File yang diunduh hampir tidak pernah perlu diedit. Kasus yang umum adalah saya membuat hardlink di direktori yang berbeda di mana saya memerlukan file.

Keuntungan:

  • Saya masih membagikan file di jaringan P2P seperti yang seharusnya saya lakukan walaupun saya rmatau mv"copy".
  • File ini juga berada di jalur tempat saya membutuhkannya; sebagian besar lokasi tersebut tidak dibagikan.
  • Saya dapat rm"asli" untuk berhenti berbagi file; operasi ini tidak mempengaruhi "copy" di tempat yang diinginkan.
  • Ruang disk saya hanya digunakan sekali.

Poin utama: jika saya tahu terlebih dahulu file mana yang akan saya buat rm, saya mungkin menggunakan symlink. Tapi saya tidak pernah tahu.

Kamil Maciorowski
sumber
6

Filesystem adalah cara yang sederhana namun efisien untuk mengatur dan mengklasifikasikan file (ini adalah alasan utama keberadaannya). Hardlink memungkinkan tingkat fleksibilitas yang lebih tinggi dalam hal ini.

Seperti disebutkan, tidak ada konsep asli dan salinan ketika berhadapan dengan hardlink, semua entri direktori (hardlink) hanya referensi ke keberadaan file (arahkan ke inode) tanpa prioritas, maka tidak ada juga hardlink yang rusak .. .

Jadi di sini ada beberapa kasus penggunaan yang dihadiri hardlink tetapi softlink tidak :

  1. Bayangkan Anda memiliki koleksi film atau musik atau media lain dan ingin menerapkan kriteria klasifikasi yang berbeda, seperti lagu yang diklasifikasikan oleh artis di cabang (masing-masing artis memiliki sub-direktori sendiri); berdasarkan genre di cabang lain (masing-masing dalam sub-direktori yang berbeda), dll. Tetap Anda tidak ingin menduplikasi file atau memutuskan di mana harus meletakkan "asli" sehingga Anda memiliki kebebasan untuk mengklasifikasi ulang tanpa harus " kelola "dan tautkan kembali file saat bergerak untuk menghindari tautan yang rusak.

  2. Alasan lain adalah untuk menghindari pemborosan ruang penyimpanan yang akan diperlukan untuk memiliki banyak salinan dari file yang sama dan belum memungkinkan chrootsyscall untuk mendapatkan keuntungan dari subset file di root sistem file "master" (tautan simbolik tidak akan pernah dapat mereferensikan file dari luar yang chrootsandbox, bahkan jika mereka memiliki path relatif).

  3. Alasan lain yang sangat penting tetapi jarang disebutkan untuk ada tautan adalah ..subdirektori. The ..direktori sebenarnya (di sebagian unix fs implementasi) hardlinks ke direktori induk, tanpa hardlinks ini harus dilaksanakan dengan cara yang sama sekali berbeda, sementara keberadaan hardlinks membuat ini sangat mudah untuk dilaksanakan.

Marcelo
sumber
1
Untuk poin 1, menggunakan uuids sebagai nama 'kanonik' untuk file, dan membuat semua tautan simbol nama-nama yang dapat dibaca manusia ke uuids, adalah solusi alternatif.
R ..
Meskipun saran uuids terdengar benar secara akademis, menggunakan uuids untuk nama file tidak terdengar sangat praktis, dan sekali lagi, tujuannya adalah untuk menyederhanakan hal-hal, tidak membuat mereka lebih sulit atau "kurang dapat dipahami manusia". Selain itu, memiliki uudis untuk referensi file "kanonik" hanya akan menjadi tipuan tambahan untuk inode file yang sebenarnya, jadi, tidak ada gunanya dicapai dalam pendekatan ini karena tidak menawarkan keuntungan, hanya kerugian seperti: dampak pada kinerja, tambahan ruang disk untuk menyimpan lebih banyak entri direktori, memiliki banyak file dengan nama "aneh" di sekitar ...
Marcelo
5

Sangat umum, contoh dunia nyata yang membutuhkan hardlink:

git clone --reference <repository>

Ini klon dari repo Git lokal dengan menyalin hampir nol. Alih-alih menyalin file objek (file yang tidak dapat diubah digunakan oleh Git untuk "database" -nya), itu hanya hardlink mereka.

Repo apa pun dapat menghapus objek, tetapi inode tetap valid untuk sisa repo. Dan jika suatu objek dihapus dari semua repo, itu dihapus dari disk. Hard link menghasilkan solusi yang sangat kuat dan cepat. Sangat umum di server CI.


Ada versi non-hard-link: git clone --shared <repository>. Ini, bagaimanapun, adalah berubah-ubah dan memiliki lebih banyak peringatan karena semua orang bekerja pada direktori yang sama.

Paul Draper
sumber
4

Saya baru-baru ini menggunakan use case untuk prosedur pembaruan yang agak aman untuk sistem berbasis U-Boot di mana uImagesoft-link menunjuk ke gambar untuk boot, idenya adalah bahwa pemadaman listrik seharusnya tidak menimbulkan masalah, tidak peduli pada titik mana dalam proses itu terjadi (dengan asumsi sistem file bermain bersama):

ln image.bin backup_image.bin
ln -sf backup_image.bin uImage

// replace image.bin

ln -sf image.bin uImage
rm backup_image.bin

Tanpa hardlink tidak akan sesederhana itu.

/ edit:

Berkat komentar saya sekarang tahu bahwa itu akan lebih baik untuk dilakukan:

ln image.bin backup_image.bin
ln -sf backup_image.bin uImageNew
mv uImageNew uImage || rm -rf uImage && mv uImageNew uImage

// replace image.bin

ln -sf image.bin uImageNew
mv uImageNew uImage || rm -rf uImage && mv uImageNew uImage
rm backup_image.bin

(Yang rmada di sini agar dapat lebih baik melarikan diri dari keadaan aneh, misalnya jika uImageadalah sesuatu yang tidak terduga yang akan membuat mvgagal [tetapi belum tentu ln -sfsolusi sebelumnya ].)

phk
sumber
2
1 karena ini secara konseptual merupakan alasan yang sangat bagus, tetapi sayangnya ln -sfbukan atom. Ini menghapus symlink lama dan membuat yang baru. Untuk memperbaikinya, Anda perlu membuat symlink baru dengan nama sementara dan rename(2)( mv) untuk nama yang ingin Anda ganti.
R ..
@R .. Kamu benar! 😲 stat("uImage", {st_mode=S_IFREG|0777, st_size=0, ...}) unlink("uImage"),symlink("backup_image.bin", "uImage")
phk
1
BTW, lihat di sini untuk versi saya install.shyang memecahkan masalah: git.musl-libc.org/cgit/musl/tree/tools/install.sh
R ..
@ R .. Perhatikan bahwa mvbahkan dengan -fmungkin gagal jika tujuan sudah ada sebagai mis. Symlink yang merupakan bagian dari loop symlink. Demo:ln -sf foo bar; ln -sf bar foo; echo "Before:"; ls -l foo bar; >testfile; mv testfile foo || { echo "Using mv -f"; mv -f testfile foo; }; echo "After:"; ls -l foo bar
phk
3

Salah satu penggunaan yang saya miliki untuk tautan keras adalah ketika mengunduh atau mengompres file yang rusak. Program yang melakukan pengunduhan atau pengompresan (seperti unzip atau unrar) akan sering secara otomatis menghapus file yang tidak lengkap ketika menemui kesalahan, dan biasanya tidak ada pilihan untuk menyimpannya. Jika saya ingin menyimpan file, saya dapat membuat tautan keras ke sana.

Thomas Padron-McCarthy
sumber
3

BackupPC adalah sistem cadangan yang menggunakan tautan keras di server untuk menyediakan deduplikasi tingkat file.

File pertama kali disimpan dalam pohon direktori "pool" berdasarkan hash md5 mereka. Setiap cadangan yang menggunakan file itu membuat tautan keras ke file kumpulan. Saat cadangan kedaluwarsa / dihapus, tautan kerasnya dihapus dari sistem file.

Tautan keras lebih baik daripada tautan lunak di sini karena mereka memberikan penghitungan referensi otomatis. Pekerjaan cron secara berkala menghapus file apa pun di direktori kumpulan yang tidak memiliki lebih dari satu tautan.

Metode ini memiliki beberapa kelemahan (terutama, bahwa sulit untuk menggunakan alat berbasis sistem file untuk mereplikasi cadangan toko), tetapi terbukti cukup kuat dalam praktiknya.


Kasus penggunaan lain: server aplikasi web tomcat java memperlakukan nama file sebagai metadata. File java "war" harus dinamai berdasarkan path-nya di server web.

mis: foo.war adalah kode java yang melayani url/foo

Sayangnya, ia menyelesaikan symlink sebelum membuat keputusan ini.

Jadi, katakan Anda ingin menggunakan aplikasi build, dan berikan nama file deskriptif (misalnya, dengan nomor rilis atau tanggal). Anda tidak dapat membuat symlink ke file dengan nama "asli" - Anda harus membuat hardlink.

foo.warsymlinked to foo-20170129.wartidak berfungsi

foo.warhardlink untuk foo-20170129.warbekerja.

saya tidak suka perilaku kucing jantan ini, tetapi hardlink memberi saya jalan keluar.

Dan Pritts
sumber