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 123546
a następnie utworzyć łącze twarde, ale byłoby to zbyt wolne dla mojej aplikacji.
NB: Używam systemu plików ext4.
Odpowiedzi:
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ć
debugfs
do tego systemu plików (gdy jest odmontowany), aby to zrobić (zakładając, że masz dostęp do zapisu do urządzenia blokowego).(zamień
/dev/block/device
na rzeczywiste urządzenie blokowe, w którym znajduje się system plików).Następnie po znaku zachęty
(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.debugfs
wpiszJeśli wszystko dobrze, wpisz:
aby utworzyć dowiązanie twarde (zwróć uwagę, że ścieżka jest względna względem katalogu głównego systemu plików). Śledzony przez: 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).źródło
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
(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.źródło