Apakah tautan keras dihitung sebagai file normal?

21

Saya bertanya-tanya apakah ada cara untuk mendaftarkan ini, tetapi karena sebagian besar mesin pencari modern tidak bekerja dengan baik dengan frasa lebih dari 5 kata panjangnya, saya butuh bantuan yang satu ini.

Saya ingin tahu ini karena saya membuat skrip bash yang harus mendaftarkan file sebagai tipe tertentu dan membuat keputusan yang sesuai. Secara teknis ini tidak penting untuk proyek saya, tetapi saya ingin tahu.

Juga, jika mereka dianggap sebagai file biasa, lalu apakah ada cara untuk memeriksa apakah file-file ini sulit ditautkan tanpa harus menguraikan ls -i? Dan adakah cara untuk memeriksa apakah beberapa file arbitrer, X, sulit ditautkan ke beberapa file arbitrer lainnya, Y, tanpa menggunakan find -iperintah?

Tn. Minty Fresh
sumber
5
Dengan tautan keras "X" tidak benar-benar tertaut ke "Y". "X" dan "Y" adalah file yang sama .
jordanm
6
Semua "file biasa" dalam direktori adalah tautan keras. Beberapa file seperti itu memiliki lebih dari satu.
Andrew Henle
@AndrewHenle Wow, poin bagus. Persis seperti itulah yang saya cari, jadi terima kasih.
Tn. Minty Fresh
2
@ Mr.MintyFresh Secara khusus, tidak ada perbedaan antara "asli" dan "tautan" karena ada untuk tautan simbolis.
Random832

Jawaban:

38

Dalam sistem Unix-style, struktur data yang mewakili objek sistem file (dengan kata lain, data tentang file), disimpan dalam apa yang disebut "inode".

Nama file hanyalah tautan ke inode ini, dan disebut sebagai "tautan keras". Tidak ada perbedaan antara nama depan file diberikan dan tautan selanjutnya. Jadi jawabannya adalah, "ya": tautan keras adalah file biasa dan, memang, file biasa adalah tautan keras.

The lsperintah akan menunjukkan berapa banyak hard link yang ada untuk file.

Sebagai contoh:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Di sini kami telah membuat file bernama /tmp/hello.txt. Di 1dalam output dari ls -lmenunjukkan bahwa ada 1 tautan keras ke file ini. Tautan keras ini adalah nama file itu sendiri /tmp/hello.txt.

Jika sekarang kita membuat tautan keras lain ke file ini:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Anda sekarang dapat melihat bahwa kedua nama file menunjukkan ada 2 tautan keras ke file tersebut. Tak satu pun dari ini adalah nama file yang "tepat", keduanya sama-sama valid. Kita dapat melihat bahwa keduanya menunjuk ke inode yang sama (dalam kasus ini, 5374043):

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

Ada kesalahpahaman umum bahwa ini berbeda untuk direktori. Saya pernah mendengar orang mengatakan bahwa jumlah tautan yang dikembalikan oleh lssuatu direktori adalah jumlah subdirektori, termasuk .dan ..yang tidak benar . Atau, setidaknya, meskipun akan memberi Anda nomor yang benar, itu tepat untuk alasan yang salah!

Jika kita membuat direktori dan melakukan yang ls -ldkita dapatkan:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

Ini menunjukkan ada 2 tautan keras ke direktori ini. Ini adalah:

/tmp/testdir
/tmp/testdir/.

Perhatikan bahwa /tmp/testdir/..ini bukan tautan ke direktori ini, ini tautan ke /tmp. Dan ini memberi tahu Anda mengapa "jumlah subdirektori" berfungsi. Ketika kami membuat subdirektori baru:

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir

Anda sekarang dapat melihat ada 3 tautan keras ke /tmp/testdirdirektori. Ini adalah:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

Jadi setiap sub-direktori baru akan menambah jumlah tautan satu per satu, karena ..entri yang dikandungnya.

seumasmac
sumber
Saya mengerti bagaimana metadata, inode, dan tautan keras berfungsi. Saya hanya perlu mengklarifikasi jika file yang ditautkan dihitung sebagai file biasa. Ini hanya menunjukkan kepada saya bahwa jawabannya adalah 'ya' karena kolom yang didedikasikan untuk ini, yang secara tersirat menunjukkan bahwa ini asli untuk semua file. Maaf, tapi saya harus membatalkan ini :(
Mr. Minty Fresh
Tidak apa-apa, saya yakin ini akan menjadi info yang berguna untuk orang lain.
seumasmac
Sunting menarik dengan sistem hardlink dotglob, saya tidak pernah tahu bahwa ia melakukan ini.
Tn. Minty Fresh
Saya mengklarifikasi tautan keras == file paragraf biasa.
seumasmac
1
Terutama seperti kalimat: "Tak satu pun dari ini adalah nama file yang 'tepat', keduanya sama-sama valid." Itu adalah unsur penting untuk memahami tautan keras. Ditulis dengan sangat baik.
Wildcard
4

Apakah tautan keras dihitung sebagai file normal?

Hard link dihitung sebagai apa pun yang ditautkan. Anda dapat menautkan ke apa saja di sistem file yang sama.

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

Setiap hardlink dengan apa pun adalah setara, objek yang mendasarinya tetap ada selama ada tautan (sunting: non-simbolik) sama sekali (bahkan deskriptor file terbuka, yang saya punya alasan memalukan untuk sangat berterima kasih).

Sistem akan memberlakukan aturan pada tautan direktori, Anda mendapatkan satu tautan bernama ke direktori dan sistem secara otomatis menambahkan .tautan yang disematkan dan tautan subdirektori apa pun ..(perhatikan bahwa .di ls di atas memiliki dua tautan) tetapi itu adalah pemeriksaan eksplisit, pada beberapa modded sistem pengguna istimewa yang berjanji berjanji tidak akan mengulang dapat menambahkan sendiri tautan baru. Filesystem tidak peduli, itu bisa mewakili grafik direktori sewenang-wenang, tetapi tidak ada yang mau berurusan dengan mereka.

Ada (banyak sistem file non-unix) yang tidak berfungsi seperti ini, termasuk beberapa yang menyebut apa yang mereka tawarkan sebagai pengganti "tautan keras". OS X telah mengumpulkan setara pada HFS + (yang tidak memilikinya secara asli) jika saya ingat dengan benar, saya tidak tahu seberapa setia itu mempertahankan semantik di sini.

jthill
sumber
apa yang ./tsocksebenarnya dilakukan?
mikeserv
@mikeserv Ini adalah program make-a-socket di atas, ia hanya menjatuhkan tautan soket yang bernama "socket" di direktori saat ini.
jthill
ok, tapi mungkin saya harus membuatnya lebih jelas tentang betapa sedikit yang saya ketahui tentang soket. saya pikir saya mengerti tautan dengan cukup baik dan itu hanya memberi soket yang sama nama baru, kan? yang tidak memiliki arti khusus untuk soket atau apa pun, ya? maaf tentang ketidaktahuan saya.
mikeserv
1
@ mikeserv Soket adalah entitas runtime murni. socket()membuat soket aktual, bind()memberikannya nama tertentu, connect()menghubungkan soket yang Anda buat ke beberapa soket bernama. Berbagai jenis soket menggunakan berbagai jenis nama, misalnya soket Internet menggunakan alamat Internet, tetapi semuanya berbagi API yang sama (termasuk read()dan write(), itu membuat saya sedih bahwa Anda tidak dapat open()menggunakan soket sistem file dan memiliki OS atau libc lakukan socket()dan connect()untuk Anda) . man 7 socketmemiliki lebih banyak, semua protokol jaringan membuat untuk halaman manual gelisah.
jthill
1
@ mikeserv Lihat, saya bisa mengeja pty dan pts, dan mungkin bahkan ptmx di hari yang baik, tapi hanya itu. :-) setidaknya 5,0 node bekerja di mana saja saya dapat menemukan, itu adalah tipe perangkat pengontrol-tty. Aku mendapatkannya hanya dengan ls-l / dev / tty, kurasa aku beruntung di sana.
jthill