Apakah ada kerugian untuk menghapus semua tautan simbolis yang rusak dalam suatu sistem?

46

Saya sedang menjalankan skrip yang mengulangi semua file di sistem Linux saya dan membuat beberapa metadata tentang mereka, dan itu melemparkan kesalahan ketika mengenai tautan simbolis yang rusak.

Saya baru mengenal * nix, tetapi saya mendapatkan ide utama di balik menautkan file dan bagaimana tautan rusak muncul. Sejauh yang saya tahu, mereka seperti sampah di jalanan. Hal-hal yang saya hapus dari sebuah program tidak cukup pintar untuk mengatakan bahwa manajer paket itu ada, dan miliknya, atau sesuatu yang tertinggal dalam peningkatan. Pada awalnya, saya mulai mengubah skrip yang saya jalankan untuk melewati mereka, kemudian saya berpikir, 'well, kita selalu bisa menghapusnya saat kita di sini ...'

Saya menjalankan Ubuntu 14.04 (Trusty Tahr). Saya tidak dapat melihat alasan untuk tidak melakukannya, tetapi sebelum saya melanjutkan dan menjalankan ini di sistem pengembangan saya, adakah alasan ini sebenarnya merupakan ide yang mengerikan? Apakah symlink yang rusak memiliki tujuan yang tidak saya sadari?

blanket_cat
sumber
7
Ya: lihat jawaban yang tertera di bawah. Tetapi yang lebih penting, ini bukan solusi untuk masalah Anda: skrip harus bekerja dengan baik, bukan hanya sistem yang disanitasi. Sebuah sistem dapat menjadi bersih setelah setengah detik antara disanitasi dan paruh kedua skrip berjalan. Ini juga melanggar prinsip tanggung jawab tunggal dan filosofi Unix: "lakukan satu hal dengan baik".
ctrl-alt-delor

Jawaban:

68

Ada banyak alasan untuk tautan simbolik yang terputus:

  • Tautan dibuat ke target yang tidak ada lagi.
    Resolusi: hapus symlink yang rusak.
  • Tautan dibuat untuk target yang telah dipindahkan. Atau itu adalah tautan relatif yang telah dipindahkan relatif ke targetnya. (Tidak menyiratkan bahwa symlink relatif adalah ide yang buruk - justru sebaliknya: symlink absolut lebih cenderung menjadi basi karena target mereka bergerak.)
    Resolusi: temukan target yang dituju dan perbaiki tautan tersebut.
  • Ada kesalahan saat membuat tautan.
    Resolusi: temukan target yang dimaksud dan perbaiki tautannya.
  • Tautan ini ke file yang ada di disk yang dapat dilepas, sistem file jaringan atau area penyimpanan lain yang saat ini tidak dipasang. Penyelesaian: tidak ada, tautan tidak selalu rusak. Tautan akan berfungsi saat area penyimpanan dipasang.
  • Tautan ini ke file yang hanya ada sebagian waktu, berdasarkan desain. Sebagai contoh, file adalah output cache dari suatu proses, yang dihapus ketika informasi menjadi basi tetapi hanya dibuat ulang atas permintaan eksplisit. Atau tautannya ke kotak masuk yang dihapus saat kosong. Atau tautannya ke file perangkat yang hanya ada saat perangkat yang sesuai dilampirkan. Penyelesaian: tidak ada, tautan tidak selalu rusak.
  • Tautan hanya valid dalam hierarki penyimpanan yang berbeda. Sebagai contoh, ini hanya valid di chroot jail, atau diekspor oleh server NFS dan hanya valid di server atau di beberapa kliennya.
    Penyelesaian: tidak ada, tautan tidak rusak di mana-mana.
  • Tautan ini rusak untuk Anda, karena Anda tidak memiliki izin untuk melintasi direktori untuk mencapai target, tetapi tidak rusak untuk pengguna dengan hak istimewa yang sesuai.
    Penyelesaian: tidak ada, tautan tidak rusak untuk semua orang.
  • Tautan ini digunakan untuk menyimpan informasi, seperti dalam contoh kunci Firefox yang dikutip oleh vinc17 . Salah satu alasan untuk melakukannya dengan cara ini adalah karena lebih mudah untuk mengisi symlink secara atom - tidak ada cara lain, sedangkan mengisi file secara atom lebih kompleks: Anda perlu membuat konten file dengan nama sementara, kemudian memindahkannya ke tempat, dan menangani file sementara basi yang ditinggalkan karena macet. Alasan lain adalah bahwa symlink biasanya disimpan langsung di dalam inode mereka pada beberapa sistem file, yang membuatnya membaca lebih cepat daripada membaca konten file.
    Resolusi: tidak ada. Dalam hal ini, menghapus tautan akan merugikan.

Jika Anda dapat menentukan bahwa symlink masuk ke dalam kategori pertama, maka pastikan, lanjutkan dan hapus. Kalau tidak, abstain.

Program yang melintasi direktori secara rekursif dan peduli dengan konten file biasanya harus mengabaikan tautan simbolis yang rusak.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
symlinks (biasanya) tidak terkandung dalam direktori induknya. Namun pada beberapa sistem file, target tautan disimpan dalam inode.
James Youngman
Daftar yang sangat bagus Saya memiliki banyak tautan yang termasuk dalam tipe 4 dan 6. Mereka menunjuk ke sistem file yang saya mount dengan SSHFS. Ketika filesystem tidak di-mount, mereka adalah tipe 4; ketika filesystem di-mount, hanya saya yang bisa mengaksesnya, jadi mereka mengetik 6 untuk semua orang (bahkan root).
Barmar
Satu lagi alasan yang mungkin untuk symlink yang rusak: symlink ke file aktual yang hanya ada beberapa waktu. Misalnya dalam alur kerja dengan jalur yang dalam, Anda mungkin memiliki symlink ke file kerja (untuk kenyamanan) yang dihapus ketika alur kerja selesai, tetapi akan dibuat kembali selama penggunaan berikutnya dari alur kerja itu. / dev / modem agak seperti itu karena file perangkat yang sebenarnya itu menunjuk hanya ada ketika perangkat fisik terhubung.
Joe
jawaban yang cukup komprehensif!
njzk2
1
@MichaelDurrant Uh? Intinya adalah bahwa downside (atau ketiadaan) tergantung pada bagaimana symlink yang rusak muncul.
Gilles 'SANGAT berhenti menjadi jahat'
19

Jangan membabi buta menghapus semua tautan simbolik yang menjuntai. Mereka mungkin ada hanya untuk membawa beberapa informasi, dan mungkin lebih aman daripada file normal karena pembuatan symlink adalah atom.

Sebagai contoh, Firefox membuat "lock" file kunci yang merupakan symlink yang nilainya memiliki bentuk seperti "IP_address: + PID".

vinc17
sumber
1
Jadi seperti, sebuah program dapat mengisi file kosong secara dinamis bahwa salah satu dari symlink ini adalah tautan yang terputus, sementara program tidak berjalan ? Atau mungkin hanya sepotong informasi?
blanket_cat
1
@knotech Tujuan dari beberapa symlink (tidak harus dikaitkan dengan program yang sedang berjalan) mungkin hanya ada. Nilai mereka tidak ada artinya atau menyampaikan beberapa informasi tertentu; dalam kedua kasus, secara umum, mereka tidak menunjukkan apa-apa. Tidak ada file kosong, hanya sebuah symlink. Perhatikan juga, sebagai contoh, kasus build gcc, yang membuat symlink "cap-bit" yang menunjuk ke diri mereka sendiri: gcc.gnu.org/ml/libstdc++/2011-02/msg00014.html
vinc17
6

Baik server web fnord maupun Gatling menggunakan sistem file Unix sebagai basis data konfigurasi mereka (berbeda dengan, katakanlah, Microsoft IIS, yang menggunakan registri Windows, atau Apache, yang menggunakan file konfigurasi kompleks-untuk-parse).

Sebagai contoh, virtual host hanyalah direktori, dan membuat virtual host baru semudah itu

mkdir www.example.com:80

Mengkonfigurasi file mana yang akan ditayangkan?

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

Mengkonfigurasi file mana yang akan dieksekusi sebagai CGI dan yang akan ditayangkan?

chmod a-x plain_file.html
chmod a+x cgi_script.html

Dan terakhir (dan relevan dengan pertanyaan ini): mengkonfigurasi pengalihan?

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

Anda sekarang akan memiliki symlink yang disebut search.htmltitik mana, tetapi sangat penting untuk kerja situs Anda.

Jörg W Mittag
sumber
0

Sebuah symlink mungkin menunjuk ke lokasi yang masih kosong hanya untuk memaksa pembuatan di lokasi atau nama sistem file tertentu.

Jadi tidak - jangan membabi buta menghapusnya.

Nils
sumber
0

Kelemahan yang signifikan untuk menghapus tautan simbolis basi adalah bahwa Anda kehilangan referensi ke tempat mereka tunjuk yang bisa sangat berharga!

Katakanlah saya memiliki tautan simbolis untuk file bernama " send_to" yang menunjuk ke /Users/myname/tmpdan mengira itu /Users/myname/tmptidak ada.

Dengan tautan simbolis saya tahu di mana file itu dimaksudkan . Sebagai contoh, dalam hal ini saya dapat melihat bahwa ini adalah direktori sementara dan jika saya perlu "memperbaikinya", saya harus mempertimbangkan direktori sementara sebagai tujuan.

Demikian pula tautan " my_config" yang mengarah ke /etc/conf_file'buruk' karena conf_filetelah diubah namanya menjadi confirm_file masih merupakan informasi yang berguna. Jika Anda pergi ke /etcdirektori dan melakukan lsdan melihat file yang dipanggil conf_filehilang tetapi confirmation_fileada di sana Anda mungkin memiliki info yang cukup untuk sekarang memperbaiki tautan.

Michael Durrant
sumber
-2

Mengutip dari The Linux Command Line (buku terbaik untuk pemula Linux, dan Anda dapat mengunduhnya secara gratis di sini ):

Bayangkan skenario ini: Suatu program membutuhkan penggunaan sumber daya bersama dari beberapa jenis yang terkandung dalam file bernama "foo," tetapi "foo" sering mengalami perubahan versi. Akan lebih baik untuk memasukkan nomor versi dalam nama file sehingga administrator atau pihak lain yang tertarik dapat melihat versi "foo" apa yang diinstal. Ini menimbulkan masalah. Jika kami mengubah nama sumber daya bersama, kami harus melacak setiap program yang mungkin menggunakannya dan mengubahnya untuk mencari nama sumber daya baru setiap kali versi baru dari sumber daya diinstal. Itu sama sekali tidak terdengar menyenangkan.

Di sinilah tautan simbolis menyelamatkan hari. Katakanlah kita menginstal versi 2.6 dari "foo," yang memiliki nama file "foo-2.6" dan kemudian membuat tautan simbolis hanya disebut "foo" yang menunjuk ke "foo-2.6." Ini berarti bahwa ketika sebuah program membuka file " foo ", sebenarnya membuka file" foo-2.6 ". Sekarang semua orang bahagia. Program-program yang bergantung pada "foo" dapat menemukannya dan kita masih dapat melihat versi aktual yang diinstal. Ketika tiba saatnya untuk meningkatkan ke "foo-2.7," kami hanya menambahkan file ke sistem kami, hapus tautan simbolis "foo" dan buat yang baru yang menunjuk ke versi yang baru. Ini tidak hanya memecahkan masalah pemutakhiran versi, tetapi juga memungkinkan kami untuk menyimpan kedua versi di mesin kami. Bayangkan bahwa "foo-2.7" memiliki bug (sialan para pengembang!) Dan kita harus kembali ke versi lama. Lagi,

Jadi tidak, saya tidak akan menghapus tautan simbolis karena itu akan membuat Anda pusing, dan Anda berisiko mengacaukan sistem Anda.

gacanepa
sumber
6
OP tidak menganjurkan menghapus symlinks tout court - hanya symlink yang rusak , yaitu symlink yang tidak menunjuk ke file yang ada saat ini.
LSerni