Bagaimana cara menghapus tautan (menghapus) hardlink khusus “.” Yang dibuat untuk folder?

29

Di Linux, ketika Anda membuat folder, secara otomatis membuat dua tautan keras ke inode yang sesuai. Satu yang merupakan folder yang Anda minta untuk dibuat, yang lain menjadi .folder khusus folder ini.

Contoh:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

Seperti yang Anda lihat, keduanya di dalam folderdan .di dalamnya foldermemiliki nomor inode yang sama (ditunjukkan dengan -iopsi).

Apakah ada cara untuk menghapus .hardlink khusus ini ?

Ini hanya untuk eksperimen dan rasa ingin tahu. Saya kira jawabannya juga berlaku untuk ..file khusus.

Saya mencoba untuk melihat rmmanusia tetapi tidak menemukan cara untuk melakukannya. Ketika saya mencoba untuk menghapus .semua yang saya dapatkan adalah:

rm: "." dan ".." tidak dapat dihapus

Saya benar-benar ingin tahu tentang cara kerja hal-hal ini jadi jangan menahan diri untuk tidak terlalu bertele-tele pada subjek.

EDIT: Mungkin saya tidak jelas dengan posting saya, tetapi saya ingin memahami mekanisme yang mendasari yang bertanggung jawab untuk .file dan alasan mengapa mereka tidak dapat dihapus.

Saya tahu standar POSIX melarang folder dengan kurang dari 2 hardlink, tetapi tidak benar-benar mengerti mengapa. Saya ingin tahu apakah itu bisa dilakukan.

Fantattitude
sumber
11
Kemungkinan rangkap dari Mengapa saya tidak bisa menghapus '.' direktori?
Stephen Kitt
@StephenKitt Silakan lihat edit saya.
Fantattitude
1
Saya telah menarik kembali suara saya, mari kita lihat bagaimana pemungutan suara berlangsung ...
Stephen Kitt
2
Keduanya dibutuhkan untuk jalur relatif. mengapa Anda ingin menghapus ini (selain rasa ingin tahu biasa)?
HalosGhost
@HalosGhost Saya hanya ingin tahu haha, menjelajahi keterbatasan sistem dan bagaimana dan mengapa ia dirancang dengan cara ini.
Fantattitude

Jawaban:

46

Secara teknis dimungkinkan untuk menghapus ., setidaknya pada sistem file EXT4. Jika Anda membuat gambar sistem file test.img, pasang dan buat testfolder, kemudian lepaskan kembali, Anda dapat mengeditnya menggunakan debugfs:

debugfs -w test.img
cd test
unlink .

debugfstidak mengeluh dan dengan patuh menghapus .entri direktori di sistem file. The testdirektori masih dapat digunakan, dengan satu kejutan:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

hanya menunjukkan

..

jadi .benar-benar hilang. Namun cd ., ls ., pwdmasih berperilaku seperti biasa!

Saya sebelumnya telah melakukan tes ini menggunakan rmdir ., tetapi itu menghapus inode direktori ( terima kasih banyak kepada BowlOfRed untuk menunjukkan ini ), yang meninggalkan testentri direktori yang menggantung dan merupakan alasan sebenarnya untuk masalah yang dihadapi. Dalam skenario ini, testfolder kemudian menjadi tidak dapat digunakan; setelah memasang gambar, menjalankan lsmenghasilkan

ls: cannot access '/mnt/test': Structure needs cleaning

dan log kernel menunjukkan

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

Menjalankan e2fsckdalam situasi ini pada gambar menghapus testdirektori sepenuhnya (inode direktori hilang sehingga tidak ada yang mengembalikan).

Semua ini menunjukkan bahwa .ada sebagai entitas spesifik dalam sistem file EXT4. Saya mendapat kesan dari kode sistem file di kernel yang diharapkan .dan ..ada, dan memperingatkan jika mereka tidak (lihat namei.c), tetapi dengan unlink .tes berbasis-saya tidak melihat peringatan itu. e2fscktidak suka .entri direktori yang hilang , dan menawarkan untuk memperbaikinya:

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

Ini menciptakan kembali .entri direktori.

Stephen Kitt
sumber
Sangat menarik! Terima kasih! Jadi .folder tersebut benar-benar ada di dalam FS dan alat berharap untuk berfungsi dengan baik.
Fantattitude
Benar-benar baik dari Anda, saya tidak tahu Linux dan FS-nya cukup untuk menemukan info semacam ini sendiri jadi saya sangat berterima kasih Anda meluangkan waktu untuk menjawab saya :)
Fantattitude
3
Bisakah Anda mencoba mengubah "rmdir" (yang sebenarnya menghapus inode) menjadi "unlink" (yang hanya menghapus entri direktori). Tampaknya meninggalkan direktori yang sebagian besar berfungsi (tidak ada kesalahan pada mountatau ls). Saya belum melihat jika masalah lain muncul.
BowlOfRed
@BowlOfRed terima kasih banyak, itu adalah poin yang sangat bagus - jadi saya rmdir .benar-benar menghancurkan testdan meninggalkannya sebagai entri direktori yang menggantung, yang Anda harapkan dapat menyebabkan masalah. Saya akan memeriksa unlinkdan memperbarui jawaban saya!
Stephen Kitt
1
@GiacomoCatenazzi tidak secara langsung, izin dan kepemilikan disimpan dalam inode, bukan entri direktori.
Stephen Kitt
5

Tidak ada cara untuk menghapus entri direktori ini. The .entri berarti "direktori ini", yang ..berarti masuk "direktori induk ini direktori". Itu sebenarnya bukan tautan keras, itu hanya bagaimana struktur direktori dibuat / diwakili.

John
sumber
Saya tahu tentang itu, saya hanya ingin tahu apakah itu mungkin karena mereka tampaknya merupakan hardlink. Jika tidak, mengapa mereka menambahkan hingga jumlah tautan keras inode?
Fantattitude
3
> Mereka sebenarnya bukan tautan keras, itu hanya bagaimana struktur direktori dibuat / diwakili. Juga, duplikat. unix.stackexchange.com/questions/289385/…
Xalorous
@ Xalorous Jadi apa sebenarnya yang mewakili file-file khusus ini, jika bukan hardlink, apakah itu? Mereka ada sehingga mereka pasti ada di suatu tempat, kecuali jika mereka hanya diperlihatkan oleh lsatau alat lain secara otomatis yang tampaknya tidak realistis bagi saya.
Fantattitude
@ Fantattitude mereka adalah bagaimana folder merepresentasikan dirinya untuk mengimplementasikan persyaratan POSIX yang rmdir tidak dapat menghapus PWD.
Xalorous
1
Dalam sistem file Unix tradisional, itu adalah hard link nyata. Mereka disintesis dengan cepat oleh driver untuk sistem file lain.
Barmar
2

Seperti yang dijelaskan dalam Catatan Lion pada Kode Sumber Unix 6Unix awal memiliki file disk di mana file dan direktori diwakili pada disk oleh struktur inode. Ada bit khusus yang menunjukkan bahwa isi file adalah direktori. Setiap inode memiliki tautan ke inode miliknya yang memungkinkan file untuk mengetahui direktori apa itu. Pengecualiannya adalah direktori '/' yang memiliki dirinya sendiri. Ada juga tautan ke konten. Jika sebuah inode tidak memiliki konten, maka ia dapat dikembalikan ke daftar gratis. Karena direktori hanyalah file yang diberkati, bahkan direktori yang kosong harus memiliki konten agar tidak dikumpulkan menjadi sampah. Jadi .. adalah tautan inode ke inode induk dan. ada di sana untuk menunjukkan direktori masih dapat digunakan. rmdir (dengan memanggil pembatalan tautan) dapat menghapus.

verisimilidude
sumber
0

Seperti 'kemungkinan duplikat ' dari jawaban postingan mengatakan, standar POSIX menentukan bahwa jika rmdir mencoba untuk menghapus direktori saat ini, itu akan gagal.

Dengan apa pun yang Anda bangun, Anda harus memiliki fondasi. Sulit untuk menentukan jalur relatif tanpa cara untuk mengatakan 'di sini'. Sehingga '.' didefinisikan sebagai 'di sini'.

Anda juga dapat menghapus 'titik' dan 'titik dot'. Tulis OS Anda sendiri yang tidak mendefinisikannya. Meskipun Unix (dan dengan ekstensi Mac OSX), Linux, dan bahkan MS DOS dan Windows semua menggunakan dot dan dotdot.

TL; DR - 'dot' ada dalam definisi OS.

Xalorous
sumber
Jawaban ini baik untuk TL; DR.
Joshua