Как создать жесткую ссылку на индекс (ext4)?

17

Если я знаю индексный узел (inode) файла, но я не знаю его пути (или любого из его путей), возможно ли создать жесткую ссылку на этот inode напрямую?

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

NB Я использую файловую систему ext4.

Камень
источник
1
Близко связано: удаление или переименование файла через его индекс (оба из которых одинаково невозможно сделать напрямую).
Жиль "ТАК - перестать быть злым"

Ответы:

23

AFAIK, а не с API ядра. Если бы такой интерфейс существовал, он должен был быть ограничен суперпользователем, так как в противном случае это позволило бы любому получить доступ к файлам в каталогах, к которым у них нет доступа для поиска.

Но вы можете использовать это debugfsв файловой системе (если она отключена) (если у вас есть права на запись на блочное устройство).

debugfs -w / dev / block / device

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

Затем по запросу debugfsвведите

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

Если все хорошо, введите:

ln < 123 > path / to / newfile
создать жесткую ссылку (обратите внимание, что путь относительно корня файловой системы). С последующим:

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

Стефан Шазелас
источник
6
Такой интерфейс также должен был бы проверить, что файл имеет ненулевой счетчик ссылок, иначе было бы возможно воскресить удаленный, но все еще открытый файл, который был отклонен IIRC, потому что он нарушает инварианты ядра.
Жиль "ТАК - перестать быть злым"
2
@ Связанные с Жилем: unix.stackexchange.com/a/499760/308316
Мосви
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

(при условии, что все номера ваших инодов меньше 1 000 000, при необходимости создайте больше каталогов).

После этого ваши иноды группируются по 1000 и собираются в by-inode/дереве. Оттуда вы можете связать их по мере необходимости.

Обратите внимание, что это означает, что удаление файлов в разделе <path>не освободит место из-за этой дополнительной жесткой ссылки.

glglgl
источник