Bagaimana cara membuat tautan keras ke inode (ext4)?

18

Jika saya tahu simpul indeks (inode) dari suatu file, tetapi saya tidak tahu path-nya (atau path-nya), apakah mungkin membuat tautan langsung ke inode itu secara langsung?

Saya dapat menemukan file menggunakan sudo find / -inum 123546dan kemudian membuat hardlink, tetapi itu akan terlalu lambat untuk aplikasi saya.

NB Saya menggunakan sistem file ext4.

Sebuah batu
sumber
1
Terkait erat: menghapus atau mengganti nama file melalui inode-nya (keduanya sama-sama mustahil dilakukan secara langsung).
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

23

AFAIK, tidak dengan API kernel. Jika antarmuka seperti itu ada, itu harus dibatasi untuk pengguna-super karena jika tidak akan membiarkan siapa pun mengakses file dalam direktori yang tidak memiliki akses pencarian.

Tetapi Anda dapat menggunakan debugfspada sistem file (setelah itu dilepas) untuk melakukannya (dengan asumsi Anda memiliki akses tulis ke perangkat blok).

debugfs -w / dev / block / perangkat

(ganti /dev/block/devicedengan perangkat blok aktual tempat sistem file berada).

Kemudian, saat diminta debugfs, masukkan

stat < 123 >
(dengan kurung sudut, mengganti 123 dengan nomor inode yang sebenarnya) untuk memeriksa apakah file tersebut ada (inode memiliki jumlah tautan lebih besar dari 0) dan bukan direktori.

Jika semuanya baik, masukkan:

Pada < 123 > path / ke / file baru
untuk membuat hardlink (perhatikan bahwa path relatif terhadap root dari sistem file). Diikuti oleh:

mi < 123 >
untuk menambah jumlah tautan (tekan Enteruntuk semua bidang kecuali jumlah tautan di mana Anda ingin menambahkan 1 ke nilai saat ini).

Stéphane Chazelas
sumber
6
Antarmuka seperti itu juga harus memeriksa bahwa file tersebut memiliki jumlah tautan bukan nol, jika tidak dimungkinkan untuk menghidupkan kembali file yang terhapus tapi masih terbuka, yang ditolak oleh IIRC karena melanggar invarian kernel.
Gilles 'SANGAT berhenti menjadi jahat'
2
@Gilles related: unix.stackexchange.com/a/499760/308316
mosvy
1
@ PhilipCouling, bit izin eksekusi pada direktori diterjemahkan menjadi izin pencarian . Saya sudah mengatakan di direktori maka tidak memiliki akses pencarian .
Stéphane Chazelas
3
@OrangeDog, izin pencarian adalah terminologi yang digunakan oleh standar POSIX.
Stéphane Chazelas
1
@mosvy: Pemeriksaan itu dapat dihapus dari kernel. Anda harus menambal beberapa tempat di VFS agar tidak menyemprot sendiri. Saya melakukannya saat mengerjakan tesis saya bertahun-tahun yang lalu.
Joshua
3

Bergantung pada kasus penggunaan Anda, pendekatan lain mungkin untuk pertama mengumpulkan semua kandidat file dalam satu direktori dengan menautkannya dengan keras dan kemudian menautkan file yang Anda sangat tertarik.

Seperti

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(dengan asumsi nomor inode Anda semuanya kurang dari 1.000.000, buat lebih banyak direktori jika perlu).

Setelah itu, inode Anda dikelompokkan 1000-bijaksana dan dikumpulkan di by-inode/pohon. Dari sana, Anda dapat menautkannya sesuai kebutuhan.

Perhatikan bahwa itu berarti menghapus file di bawah <path>tidak akan mendapatkan kembali ruang karena tautan ekstra keras itu.

glglgl
sumber