Jak utworzyć twardy link do i-węzła (ext4)?

17

Jeśli znam węzeł indeksu (i-węzeł) pliku, ale nie znam jego ścieżki (ani żadnej z jego ścieżek), czy jest możliwe bezpośrednie utworzenie twardego łącza do tego i-węzła?

Mogłem znaleźć plik za pomocą, sudo find / -inum 123546a następnie utworzyć łącze twarde, ale byłoby to zbyt wolne dla mojej aplikacji.

NB: Używam systemu plików ext4.

Kamień
źródło
1
Ściśle powiązane: usuwanie lub zmiana nazwy pliku za pomocą jego i-węzła (oba są równie niemożliwe do zrobienia bezpośrednio).
Gilles „SO- przestań być zły”

Odpowiedzi:

23

AFAIK, nie z interfejsem API jądra. Jeśli taki interfejs istniałby, musiałby być ograniczony do superużytkownika, ponieważ w przeciwnym razie każdy mógłby uzyskać dostęp do plików w katalogach, do których nie ma dostępu do wyszukiwania.

Ale możesz użyć debugfsdo tego systemu plików (gdy jest odmontowany), aby to zrobić (zakładając, że masz dostęp do zapisu do urządzenia blokowego).

debugfs -w / dev / block / device

(zamień /dev/block/devicena rzeczywiste urządzenie blokowe, w którym znajduje się system plików).

Następnie po znaku zachęty debugfswpisz

stat < 123 >
(za pomocą nawiasów kątowych, zamieniając 123 na rzeczywisty numer i-węzła), aby sprawdzić, czy plik istnieje (i-węzeł ma liczbę odsyłaczy większą niż 0) i nie jest katalogiem.

Jeśli wszystko dobrze, wpisz:

ln < 123 > ścieżka / do / nowego pliku
aby utworzyć dowiązanie twarde (zwróć uwagę, że ścieżka jest względna względem katalogu głównego systemu plików). Śledzony przez:

mi < 123 >
aby zwiększyć liczbę linków (naciśnij Enterdla wszystkich pól oprócz liczby linków, w których chcesz dodać 1 do bieżącej wartości).

Stéphane Chazelas
źródło
6
Taki interfejs musiałby również sprawdzić, czy plik ma niezerową liczbę linków, w przeciwnym razie byłoby możliwe wskrzeszenie usuniętego, ale wciąż otwartego pliku, który IIRC został odrzucony, ponieważ narusza niezmienniki jądra.
Gilles „SO- przestań być zły”
2
@Gilles related: unix.stackexchange.com/a/499760/308316
mosvy
1
@PhilipCouling, bit uprawnień do wykonania w katalogu jest tłumaczony na uprawnienia do wyszukiwania . Powiedziałem już w katalogach, więc nie mam dostępu do wyszukiwania .
Stéphane Chazelas
3
@OrangeDog, uprawnienie do wyszukiwania jest terminologią stosowaną przez standard POSIX.
Stéphane Chazelas
1
@mosvy: Ten czek można usunąć z jądra. Musisz jednak załatać kilka miejsc w VFS, żeby się nie spłukiwał. Zrobiłem to podczas pracy nad moją tezą lata temu.
Jozuego
3

W zależności od przypadku użycia innym podejściem może być najpierw zebranie wszystkich kandydatów na pliki w jednym katalogu poprzez twarde linkowanie, a następnie twarde linkowanie plików, którymi jesteś szczególnie zainteresowany.

Jak na przykład

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

(zakładając, że wszystkie liczby i-węzłów są mniejsze niż 1 000 000, w razie potrzeby utwórz więcej katalogów).

Następnie twoje i-węzły są pogrupowane 1000-krotnie i zebrane w by-inode/drzewie. Następnie możesz połączyć je w razie potrzeby.

Należy jednak pamiętać, że oznacza to, że usunięcie plików poniżej <path>nie zwróci miejsca z powodu tego dodatkowego twardego łącza.

glglgl
źródło