Bagaimana cara kerja linux dengan tautan simbolik?

11

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/1dan /mnt/2. /mnt/1tersedia melalui symlink /home/user/file. Beberapa program Amulai membaca /home/user/file. Dan setelah beberapa saat sesuatu mengubah tautan dari /mnt/1menjadi /mnt/2, tetapi Amasih 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/filedikaitkan dengan perangkat blok (misalnya 2 disk ISC direplikasi)?

buru-buru
sumber

Jawaban:

9

Symlink menunjuk ke nama file asli ( inode ) dalam sistem file. Ketika sistem menyelesaikan symlink untuk menemukan file aktual dan membukanya, ia menemukan dan menggunakan inode file. Pada titik itu, jalur yang Anda gunakan untuk sampai ke file tidak masalah. Apa OS tidak cache, itu membaca dari file dengan inode-nya. Anda dapat, seperti yang saya mengerti, mulai membaca file melalui tautan keras dan menghapus tautan keras itu (selama file tersebut masih ditautkan dari tempat lain) , dan itu tidak akan menyebabkan masalah selama file tersebut telah diselesaikan ( name string-> inode).

Kevin
sumber
4
Anda dapat menghapus SEMUA tautan ke file dan tetap membacanya begitu Anda membukanya. Inilah sebabnya mengapa Anda dapat memutakhirkan paket tanpa me-reboot seperti yang Anda lakukan di windows; karena Anda dapat rm file program yang dapat dieksekusi meskipun sedang berjalan.
psusi
1
@psusi Saya tahu data dan inode masih ada dan tidak menunjuk lagi, tetapi begitu file telah dihapus, sistem bebas untuk menimpa tempat itu pada disk, kan? Jadi, jika file tersebut terlalu besar untuk ditampung dalam cache file, seperti file 100GB yang dimaksud, apa yang terjadi jika sebagian dari file tersebut ditimpa sebelum Anda selesai? Ini bukan masalah untuk file sistem kritis karena mereka dimuat ke dalam cache dan disimpan di sana, tetapi 100GB cukup besar sehingga saya pikir ini bisa menjadi masalah.
Kevin
2
Kevin, file tidak menghapus dari disk sampai proses terakhir yang menggunakan file mati. Anda selalu dapat menemukan semua file yang sedang digunakan saat ini di proc. Tetapi jawaban Anda tampaknya menjelaskan pertanyaan saya. Terima kasih.
buru
2
Jawaban ini melewatkan titik kritis, bahwa symlink berisi nama file target.
Keith Thompson
6

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 seperti stat(), 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) rmPerintah atau unlink()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.

Keith Thompson
sumber
1

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:

echo 'data' >file.txt

Ini akan membuat file tautan keras.txt mengarah ke sektor 10 hingga 20 * (* angka hanya untuk menjelaskan).

Tes 2:

Sekarang bagaimana jika?

ln file.txt file_2.txt

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:

ln -s file.txt file_sym.txt 

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.

Luciano Andress Martini
sumber