Bagaimana cara mengetahui file mana yang asli jika tautan keras dibuat

34

Sebagai contoh, saya punya file myold_file. Lalu saya gunakan lnuntuk membuat tautan keras sebagai mylink:

ln myold_file mylink

Kemudian, bahkan dengan menggunakan ls -a, saya tidak tahu mana yang lama.

Apakah ada yang bisa diceritakan?

BufBills
sumber
2
Counterquestion: Jika Anda melakukannya ls > a; ln a b; rm a; ln b c, mana yang "lebih asli" dari yang lain? ahilang, Anda pergi dengan bdan c...
glglgl
2
Apa yang ingin Anda capai? Apa yang ingin Anda capai? Tidak ada "asli" seperti itu. File adalah inode yang berisi data meta dan kumpulan blok yang berisi data. Direktori dapat berisi tautan ke file, dan tautan ini adalah nama file dan nomor inode. Anda dapat membuat sejumlah tautan ke file. File mungkin tidak pernah memiliki kurang dari satu tautan.
Johan
Untuk penjelasan terperinci tentang jawaban yang diterima dari pertanyaan ini: Lihat jawaban yang diterima dari pertanyaan itu .
Utku

Jawaban:

93

Anda tidak bisa, karena mereka secara harfiah file yang sama, hanya dijangkau oleh jalur yang berbeda. Yang pertama tidak memiliki status khusus.

Jenny D
sumber
4
Ini jelas jawaban yang tepat: pertanyaan OP didasarkan pada kesalahpahaman.
Daniel Earwicker
8
@ Adnan Sebenarnya, tidak: kedua tautan keras adalah file yang sama. Mereka entri direktori yang berbeda. Terminologi Jenny D benar.
Gilles 'SANGAT berhenti menjadi jahat'
1
@Gilles Saya tidak mengerti bagaimana itu bisa benar. Dua tautan keras bukan dua file ; tautan keras bukan file. Mereka mengarahkan , karenanya menautkan , ke file yang sama (yang merupakan lokasi fisik pada disk). Mengatakan bahwa "dua tautan keras secara harfiah merupakan file yang sama" salah.
Adi
1
@ JennyD Dan itu satu-satunya cara saya mendengar "tautan keras" sedang digunakan; pointer filesystem ke inode. Yah, kurasa kita semua salah dan benar. Saya akan berhenti berdebat karena ini tidak ada gunanya. Jawaban Anda tampaknya benar bagi saya, Anda memiliki +1 dari saya, dan saya akan membiarkannya begitu.
Adi
5
Mengatakan bahwa tautan keras "adalah" file membandingkan hal-hal dari kategori yang berbeda, yang secara teknis salah. Tetapi mengingat bahwa kita umumnya mengatakan, " .bashrcadalah file yang mengandung ..." ketika kita maksudkan, "path relatif .bashrcmengacu pada file yang mengandung ...", ini adalah penggabungan umum dari kategori dan kita harus memahami bahwa setiap kali seseorang merujuk ke jalur atau entri direktori "menjadi" file, maksud kami file yang dirujuk. Dengan pemahaman itu, dua tautan keras dapat "menjadi" file yang sama. Menolak konvensi yang mendukung bahasa formal, mereka tidak bisa. Kedua kuda-kuda berdiri di tempatnya :-)
Steve Jessop
16

Tidak ada cara langsung, bersih (dapat diandalkan) untuk melakukan itu. Tetapi dalam keadaan yang tepat ini dapat dimungkinkan (atau setidaknya mungkin). Masalahnya adalah bahwa ada dua tautan keras tetapi hanya satu file. Ubah, modifikasi, dan (mungkin) waktu pembuatan disimpan untuk file (inode) saja tetapi tidak untuk entri direktori (tautan keras). Dengan demikian informasi yang Anda inginkan dapat diambil dari efek sekunder saja yang dapat dengan mudah dihancurkan oleh operasi yang tidak terkait dengan file. Dan Anda bahkan tidak bisa melihat apakah sudah dihancurkan. Anda hanya bisa tahu itu dari keadaan operasional jika Anda benar-benar menyadarinya.

Pembuatan tautan keras adalah operasi tulis ke direktori yang berisi tautan tersebut. Dengan demikian memperbarui direktori mtime. Jadi jika

  1. tautannya ada di direktori yang berbeda

  2. dan Anda tahu bahwa tidak satu pun dari direktori ini telah diubah (file ditambahkan, dihapus, diganti nama atau perubahan metadata file) setelah hard link kedua dibuat maka Anda dapat membandingkan mtimes dari direktori.

Kasus khusus: Jika salah satu direktori memiliki mtimesebelum file (inode's) mtimedan Anda dapat yakin bahwa file tersebut belum ditulis lebih dari beberapa saat setelah pembuatannya maka tautan direktori ini adalah yang lebih lama.

Jika tautan berada di direktori yang sama (yang tampaknya menjadi pertanyaan Anda) maka akan semakin buruk. Maka Anda bisa menggunakannya

ls -lU

untuk mendapatkan kesan urutan entri telah dibuat. Itu tidak perlu urutan yang benar karena entri dapat dihapus sehingga entri baru dibuat di tengah daftar direktori. Dan seperti yang ditunjukkan Gilles itu tidak bekerja sama sekali dengan sistem file yang lebih baru.

Hauke ​​Laging
sumber
2
Tidak menyebutkan selinux, jejak audit, atau memata-matai jurnal filesystem ??? Menyeringai Tanpa jejak audit, tidak ada cara untuk mengetahui - hal lain adalah perkiraan yang
Ricky Beam
1
@ mikeserv Jika Anda ingin mengajar orang lain dengan cara ini maka Anda setidaknya harus belajar untuk mengutip dengan benar. Itu tidak mengatakan "file mana" dalam pertanyaan. Dan bahkan jika itu terjadi maka ini akan menjadi masalah kata-kata dan melemparkan beberapa otak untuk memahami pertanyaan itu akan dengan mudah mengungkapkan apa itu sebenarnya.
Hauke ​​Laging
4
Trik mtime direktori akan berfungsi jika situasinya benar (yang jarang terjadi). Namun, cara Anda menyajikannya, Anda kadang-kadang akan sampai pada kesimpulan yang berlawanan. Direktori mtime hanya indikasi yang bermanfaat jika sama dengan waktu file. Tetapi ls -lUtriknya tidak akan bekerja pada sistem file modern (ext4, btrfs, zfs), di sana entri tidak muncul dalam urutan pembuatan sama sekali.
Gilles 'SANGAT berhenti menjadi jahat'
2
@ mikeserv - pertanyaan OP didasarkan pada kesalahpahaman. Jika mereka melakukannya rm myold_filemaka mylinkakan tetap ada dan bekerja dengan sempurna, karena itu adalah entri yang sama baiknya mengacu pada inode yang mendasari yang sama. Hanya ketika keduanya telah dihapus sistem dapat membuang inode. Setelah tautan keras telah digunakan untuk membuat dua entri sistem file yang merujuk ke file yang sama, mereka setara. (Perhatikan bahwa "file" di sini berarti "sebuah inode yang menyimpan data untuk file, sebagai lawan dari direktori). Lihat: en.wikipedia.org/wiki/Inode
Daniel Earwicker
1
-1 karena, walaupun info tentang bagaimana direktori berubah di beberapa sistem file ketika memperbarui tabel, jawaban ini gagal untuk menghapus hadir kesalahan pemahaman dalam pertanyaan bahwa "file asli" bukan properti dalam kasus beberapa hardlink ke satu inode. Dalam hal ini sementara secara anekdot menarik, bukan apa yang harus dipelajari oleh kebanyakan orang tentang pertanyaan ini tentang konsep dasar hardlink. Masalah ini bukanlah kurangnya "cara bersih langsung untuk melakukannya", masalahnya adalah bahwa tidak ada "itu" di tempat pertama.
Caleb
10

Jika Anda mengandalkan waktu modifikasi terakhir dari direktori dan Anda tidak memiliki pengetahuan tentang bagaimana dan kapan direktori-direktori itu diubah, mengandalkan mtime akan membuat Anda salah dalam persentase waktu tertentu. Masalahnya di sini adalah bahwa file diwakili dalam sistem file oleh inode, bukan oleh entri direktori. Entri direktori (nama file) menunjuk ke inode, bukan file.

Saya pikir saya akan melakukan beberapa pusar memandangi mengapa saya perlu tahu entri direktori mana yang lebih tua dan bagaimana cara menghindari perlu tahu itu.

Melinda
sumber
8

Saya pikir pertanyaan ini (cukup masuk akal) salah tentang apa sebenarnya tautan keras itu. Namun saya pikir jawaban langsung yang paling tepat adalah 'Keduanya' .

Sistem file Unix biasanya menyimpan isi file aktual dan data dalam node-i, ini tidak memiliki jalur apa pun, jalur kemudian memiliki banyak hubungan ke simpul-i ini. Ambil analogi seseorang yang menggunakan dua nama, Bob dan Joe. Orang tidak dapat mengatakan bahwa Bob lebih tua dari Joe atau sebaliknya, mereka hanya nama untuk orang yang sama.

Jika Anda ingin mempertahankan konsep file 'asli' dan yang baru Anda cenderung mencari tautan simbolis, ini lebih merupakan alias, hanya instruksi ke OS yang seharusnya beroperasi ke satu jalur seolah-olah mereka ke yang lain tanpa mengubah struktur file di bawahnya. (Anda dapat membuatnya dengan "ln -s file link".

Vality
sumber
Anda tahu, Bob / Joe dapat menjadi sangat sensitif tentang usianya ... Perbandingan tautan keras / lunak adalah yang bagus - terutama ketika Anda menganggap bahwa tautan keras hanya akan mendapatkan entri yang ditambahkan ke file direktori - yang sudah ada inode - tetapi soft-link adalah file dengan caranya sendiri, dan karenanya diberi inode sendiri. Namun, dalam kedua kasus tersebut, waktu modifikasi hanya relevan untuk file yang ditautkan, karena satu-satunya modifikasi yang dapat dilakukan pada tautan yang memiliki arti penting hanyalah pembuatan / penghapusan.
mikeserv
2

Inti dari jawaban yang diberikan oleh beberapa orang lain di atas adalah bahwa setiap nama file adalah tautan keras ke sebuah file. Tidak ada yang asli asli, hanya mungkin yang pertama.

Pikirkan direktori sebagai tabel yang mencantumkan nama file dan nomor inode.

Setiap tautan keras, termasuk yang pertama, adalah entri dalam direktori yang memberikan "nama file" ke nomor inode, sehingga Anda dapat mengakses file dengan nama itu.

File adalah kumpulan blok pada disk, dikelola dan dilacak oleh meta data yang disimpan dalam inode. File memiliki satu nomor inode.

Mengakses data file melalui nama file adalah proses tiga langkah: Nama file dicari dalam direktori untuk mendapatkan nomor inode. Inode ini kemudian dirujuk untuk menemukan blok disk yang relevan (atau blok) yang berisi data. Kemudian akhirnya blok-blok itu dibaca / ditulis.

Jadi yang dapat dibawa pulang dari semua yang pada dasarnya adalah ini: Sama sekali tidak ada perbedaan antara mengakses konten file menggunakan yang pertama ("asli") atau tautan keras yang selanjutnya dibuat.

Johan
sumber