Maksud saya apa yang terjadi ketika beberapa proses ingin membaca symlink? Apa yang terjadi ketika sesuatu mengubah symlink selama proses membaca atau bahkan menulis?
Sebagai contoh: Saya memiliki 2 besar, file yang sama 100G /mnt/1
dan /mnt/2
. /mnt/1
tersedia melalui symlink /home/user/file
. Beberapa program A
mulai membaca /home/user/file
. Dan setelah beberapa saat sesuatu mengubah tautan dari /mnt/1
menjadi /mnt/2
, tetapi A
masih membaca file.
Apakah program cache jalur absolut?
Akankah itu gagal dan salah, karena symlink diubah atau akan berfungsi dengan baik, seperti tidak ada yang terjadi?
Apakah akan berbeda jika /home/user/file
dikaitkan dengan perangkat blok (misalnya 2 disk ISC direplikasi)?
sumber
Sebuah simbolik link adalah file kecil yang berisi lokasi (yaitu jalan dan nama file) dari file target, dengan bendera dalam entri direktori menunjukkan bahwa itu symlink.
Ketika Anda membuka symlink, OS akan mengikuti lokasi untuk menemukan file target. Jika target itu sendiri adalah symlink, ia juga mengikuti lokasinya (1) (2) sampai lokasi menunjuk ke file yang bukan symlink (sebut saja FinalFile ). Kemudian OS mendapatkan inode dari FinalFile (inode berisi metadata seperti modifikasi-waktu dan juga memiliki pointer ke data file). Akhirnya inode dari FinalFile dibuka. Mulai sekarang proses menggunakan inode itu untuk membaca / menulis ke file. Akibatnya mengubah nama atau jalur symlink, menghapus symlink, mengubah path atau nama FinalFile atau bahkan menghapus FinalFile(3) tidak berpengaruh pada proses; masih membaca dari inode yang sama.
Dalam kebanyakan kasus, operasi file-data pada symlink akan mempengaruhi FinalFile (mis. Membaca dan menulis ke symlink akan membaca dari / menulis ke FinalFile ) tetapi ada pengecualian:
readlink()
system call membaca isi dari symlink itu sendiri.Operasi file-metadata (seperti mengubah nama atau menghapus) di sisi lain biasanya akan memengaruhi symlink. Tetapi ada pengecualian di sini juga:
lstat()
panggilan sistem sepertistat()
, kecuali bahwa ia mengembalikan informasi pada symlink itu sendiri daripada pada FinalFile (2).(1) Ada batasan jumlah level dan segalanya menjadi sedikit lebih rumit jika lokasi di symlink adalah jalur relatif.
(2) Baca symlink (7): penanganan tautan simbolik untuk lebih jelasnya.
man 7 symlink
(3)
rm
Perintah atauunlink()
panggilan sistem tidak secara fisik menghapus file. Ini menghapus entri direktori yang menunjuk ke inode file. File itu sendiri dihapus hanya jika keduanya a) tidak ada lagi entri direktori (tautan keras) yang merujuk pada inode dan b) tidak ada proses membuka file.sumber
Itu hampir transparan untuk Linux, dan itu jauh lebih terkait dengan sistem file yang Anda gunakan daripada sistem operasional.
Ini bukan file biasa, atau file yang sangat kecil karena Anda tidak dapat membuat tautan simbolis yang berfungsi di partisi VFAT misalnya dengan hanya menyalin tautan simbolis itu sendiri ke sana, karena direkam langsung oleh sistem file.
Perbedaan dalam tautan simbolis ke tautan keras adalah bahwa janji temu adalah tautan keras alih-alih ke sektor data seperti halnya tautan keras.
Contoh:
Tes 1:
Ini akan membuat file tautan keras.txt mengarah ke sektor 10 hingga 20 * (* angka hanya untuk menjelaskan).
Tes 2:
Sekarang bagaimana jika?
Ini menciptakan file_2.txt hardlink yang menunjuk ke sektor 10 hingga 20 (sama dengan file.txt), jadi jika Anda menghapus file.txt, sektor 10 hingga 20 masih dicadangkan, dan Anda dapat melihat data di dalam file_2.txt ... . (file.txt dan file_2.txt sama seperti aslinya)
Tes 3:
Menunjuk tautan simbolik file_sym.txt ke hard link file.txt, jadi ketika Anda mencoba mengakses file_sym.txt Anda akan melihat file.txt, tetapi jika Anda menghapus file.txt file_sym tidak akan menemukan target lagi.
Itu dikelola oleh sistem file, misalnya oleh modul ext4 untuk linux (atau jika dikompilasi pada kernel), tidak masalah jika Anda menggunakan Linux atau Unix lainnya.
sumber