GNU/Linux >> Belajar Linux >  >> Linux

Cara unlink (menghapus) hardlink khusus. dibuat untuk folder?

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.


Linux
  1. Cara membuka dan menutup direktori di terminal Linux

  2. Bagaimana saya bisa menguji RAM untuk kerusakan data pada sistem berbasis ARM?

  3. Bagaimana cara menambahkan subdirektori bin dari direktori pertama di GOPATH ke PATH?

  1. Bagaimana Cara Menginstal R 3.3.1 Di Direktori Sendiri?

  2. Bagaimana cara saya secara terprogram mendapatkan ruang disk kosong untuk direktori di Linux

  3. Bagaimana cara menghapus file ._ dalam direktori? Ubuntu

  1. Bagaimana cara mengubah direktori di Git Bash dengan Git untuk Windows?

  2. cara mencari direktori dari terminal di ubuntu

  3. Bagaimana cara membuat find mengecualikan folder yang dicarinya?