Як створити жорстке посилання на inode (ext4)?


17

Якщо я знаю індексний вузол (inode) файлу, але я не знаю його шлях (або будь-який його шлях), чи можливо створити жорстке посилання на цю іноду безпосередньо?

Я міг би знайти файл за допомогою, sudo find / -inum 123546а потім створити жорстке посилання, але це було б занадто повільно для мого додатка.

NB: Я використовую файлову систему ext4.


1
Тісно пов’язане: видалення або перейменування файлу через його inode (обидва це однаково неможливо зробити безпосередньо).
перестань бути злим"

Відповіді:


23

AFAIK, не з API ядра. Якщо такий інтерфейс існував, його доведеться обмежувати надпокористувачем, інакше це дозволить будь-кому отримати доступ до файлів у каталогах, до яких вони не мають доступу до пошуку.

Але ти міг би скористатися debugfs це у файловій системі (після її відключення) для цього (якщо у вас є доступ для запису на блоковий пристрій).

debugfs -w / dev / блок / пристрій

(замінити /dev/block/device фактичним пристроєм блоку, в якому знаходиться файлова система).

Тоді за підказом debugfs , введіть

stat < 123 >
(з кутовими дужками, замінюючи 123 фактичним номером inode), щоб перевірити, чи існує файл (у кількості індексів кількість посилань більше 0) і чи не є каталогом.

Якщо все добре, введіть:

ln < 123 > шлях / до / новий файл
створити жорстке посилання (зауважте, що шлях відносно кореня файлової системи). Далі:

ми < 123 >
щоб збільшити кількість посилань (натисніть Enterдля всіх полів, крім кількості посилань, де ви хочете додати 1 до поточного значення).


6
Такий інтерфейс повинен також перевірити, що файл має ненульовий кількість посилань, інакше можна буде відновити видалений, але все-таки відкритий файл, який IIRC був відхилений, оскільки він порушує інваріанти ядра.
перестань бути злим"


1
@PhilipCouling, то виконати дозвіл біт на каталог переводить пошук дозволу. Я вже говорив, що в каталогах тоді немає доступу до пошуку .
Стефан Шазелас

3
@OrangeDog, дозвіл на пошук - це термінологія, що використовується стандартом POSIX.
Стефан Шазелас

1
@mosvy: Цю перевірку можна видалити з ядра. Ви повинні заклеїти пару місць у VFS, щоб не шлакувати себе. Я це зробив, працюючи над дисертацією років тому.
Джошуа

3

Залежно від випадку використання, іншим підходом може бути спочатку зібрати всіх кандидатів у файли в один каталог шляхом жорсткого посилання, а потім жорсткого посилання на файли, які вас особливо цікавлять.

Як от

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

(припускаючи, що кількість ваших inode становить менше 1 000 000, створіть більше каталогів, якщо це необхідно).

Після цього ваші вставки групуються в 1000 разів і збираються в by-inode/ дереві. Звідти ви можете зв’язати їх за потребою.

Зауважте, що це означає, що видалення файлів під <path>не буде повертати простір через це надмірно жорстке посилання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.