Secara teknis dimungkinkan untuk menghapus .
, setidaknya pada sistem file EXT4. Jika Anda membuat image sistem file di test.img
, pasang dan buat test
folder, lalu unmount lagi, Anda dapat mengeditnya menggunakan debugfs
:
debugfs -w test.img
cd test
unlink .
debugfs
tidak mengeluh dan dengan patuh menghapus .
entri direktori dalam sistem file. test
direktori masih dapat digunakan, dengan satu kejutan:
sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls
hanya menunjukkan
..
jadi .
benar-benar telah pergi. Namun cd .
, ls .
, pwd
tetap bersikap seperti biasa!
Saya sebelumnya telah melakukan tes ini menggunakan rmdir .
, tetapi itu menghapus inode direktori (besar terima kasih kepada BowlOfRed karena menunjukkan hal ini), yang menyisakan test
entri direktori yang menggantung dan merupakan alasan sebenarnya untuk masalah yang dihadapi. Dalam skenario ini, test
folder kemudian menjadi tidak dapat digunakan; setelah memasang gambar, jalankan ls
menghasilkan
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 e2fsck
dalam situasi ini pada gambar menghapus test
direktori seluruhnya (inode direktori hilang sehingga tidak ada yang dapat dipulihkan).
Semua ini menunjukkan bahwa .
ada sebagai entitas tertentu dalam sistem file EXT4. Saya mendapat kesan dari kode sistem file di kernel yang diharapkan .
dan ..
ada, dan memperingatkan jika tidak ada (lihat namei.c
), tetapi dengan unlink .
tes berbasis saya tidak melihat peringatan itu. e2fsck
tidak menyukai .
yang hilang entri direktori, 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 membuat ulang .
entri direktori.
Tidak ada cara untuk menghapus entri direktori ini. .
entri berarti "direktori ini", ..
entri berarti "direktori induk direktori ini". Itu sebenarnya bukan tautan keras, begitulah cara struktur direktori dibuat / diwakili.
Seperti yang dijelaskan dalam Catatan Lion tentang Kode Sumber Unix 6 awal Unix memiliki file disk di mana file dan direktori diwakili pada disk oleh struktur inode. Ada bagian khusus yang menunjukkan bahwa isi file adalah direktori. Setiap inode memiliki tautan ke inode miliknya yang memungkinkan file untuk mengetahui di direktori mana file itu berada. Pengecualiannya adalah direktori '/' yang dimiliki sendiri. Ada juga tautan ke konten. Jika inode tidak memiliki konten, inode dapat dikembalikan ke daftar gratis. Karena direktori hanyalah file yang diberkati, bahkan direktori kosong harus memiliki konten agar tidak dikumpulkan sampah. Jadi .. adalah tautan inode ke inode induk dan . ada di sana untuk menunjukkan direktori masih dapat digunakan. rmdir (dengan memanggil unlink) dapat menghapus file . direktori jika tidak ada konten lain dan inode kemudian akan pindah ke daftar gratis ketika tidak ada lagi referensi untuk itu.