Wie erstelle ich eine feste Verbindung zu einer Inode (ext4)?

17

Wenn ich den Indexknoten (Inode) einer Datei kenne, aber den Pfad (oder einen der Pfade) nicht kenne, ist es dann möglich, direkt eine feste Verbindung zu diesem Inode herzustellen?

Ich könnte die Datei mit finden sudo find / -inum 123546und dann einen Hardlink erstellen, aber das wäre für meine Anwendung viel zu langsam.

Hinweis: Ich verwende ein ext4-Dateisystem.

Ein Stein
quelle
1
Eng verbunden: Entfernen oder Umbenennen einer Datei über ihren Inode (beides ist gleichermaßen nicht direkt möglich).
Gilles 'SO - hör auf böse zu sein'

Antworten:

23

AFAIK, nicht mit der Kernel-API. Wenn eine solche Schnittstelle vorhanden wäre, müsste sie auf den Superuser beschränkt sein, da sonst jeder auf Dateien in Verzeichnissen zugreifen kann, auf die er keinen Suchzugriff hat.

Sie können dies jedoch debugfsauf dem Dateisystem tun (sobald es nicht gemountet ist) (vorausgesetzt, Sie haben Schreibzugriff auf das Block-Gerät).

debugfs -w / dev / block / device

(Ersetzen Sie /dev/block/devicedurch das tatsächliche Blockgerät, in dem sich das Dateisystem befindet.)

Geben Sie dann an der Eingabeaufforderung von debugfsein

stat < 123 >
(mit den spitzen Klammern, wobei 123 durch die tatsächliche Inode-Nummer ersetzt wird), um zu überprüfen, ob die Datei existiert (Inode hat eine Linkanzahl größer als 0) und ist kein Verzeichnis.

Wenn alles in Ordnung ist, geben Sie Folgendes ein:

Im < 123 > Pfad / zu / newfile
zum Erstellen des Hardlinks (beachten Sie, dass der Pfad relativ zum Stammverzeichnis des Dateisystems ist). Gefolgt von:

mi < 123 >
um die Linkanzahl zu erhöhen (drücken Sie Enterfür alle Felder mit Ausnahme der Linkanzahl, bei der Sie dem aktuellen Wert 1 hinzufügen möchten).

Stéphane Chazelas
quelle
6
Eine solche Schnittstelle müsste auch prüfen, ob die Anzahl der Verknüpfungen in der Datei ungleich Null ist. Andernfalls könnte eine gelöschte, aber noch geöffnete Datei wiederhergestellt werden, die vom IIRC zurückgewiesen wurde, weil sie gegen Kernel-Invarianten verstößt.
Gilles 'SO - hör auf böse zu sein'
2
@ Gilles Related: unix.stackexchange.com/a/499760/308316
mosvy
1
@PhilipCouling, das Ausführungsberechtigungsbit für ein Verzeichnis wird in eine Suchberechtigung übersetzt . Ich habe schon in Verzeichnissen gesagt, dann habe ich keinen Suchzugriff auf .
Stéphane Chazelas
3
@OrangeDog, Suchberechtigung ist die vom POSIX-Standard verwendete Terminologie.
Stéphane Chazelas
1
@mosvy: Diese Prüfung kann vom Kernel entfernt werden. Sie müssen ein paar Stellen in VFS flicken, damit es sich nicht abspritzt. Ich habe es vor Jahren während der Arbeit an meiner Diplomarbeit gemacht.
Joshua
3

Abhängig von Ihrem Anwendungsfall besteht ein anderer Ansatz darin, zuerst alle Dateikandidaten in einem Verzeichnis zu sammeln, indem Sie sie fest verknüpfen und dann die Dateien, an denen Sie besonders interessiert sind, fest verknüpfen.

Sowie

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

(Unter der Annahme, dass Ihre Inode-Nummern alle unter 1.000.000 liegen, erstellen Sie bei Bedarf weitere Verzeichnisse).

Anschließend werden Ihre Inodes 1000-fach gruppiert und im by-inode/Baum gesammelt . Von dort aus können Sie sie nach Bedarf verknüpfen.

Beachten Sie jedoch, dass das Löschen von Dateien unter <path>nicht den Speicherplatz beansprucht, der durch diesen zusätzlichen festen Link verursacht wird.

glglgl
quelle