Oryginalny problem
Mam plik w jednym systemie plików: /data/src/file
i chcę na stałe połączyć go z: /home/user/proj/src/file
ale /home
jest na jednym dysku i /data
na innym, więc pojawia się błąd:
$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Okej, więc dowiedziałem się, że nie mogę na stałe połączyć się między urządzeniami Ma sens.
Problem pod ręką
Pomyślałem więc, że zrobię coś fantazyjnego i powiążę zamontowanie src
folderu w /data
systemie plików:
$ mkdir -p /data/other/src
$ cd /home/user/proj
$ sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link
Dlaczego to nadal nie działa?
Obejście
Wiem, że mam prawidłową konfigurację, ponieważ mogę utworzyć twardy link, dopóki jestem w katalogu „prawdziwym” /data
zamiast w powiązanym.
$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file
$
Niektóre informacje o systemie
$ uname -a
Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ findmnt
.
.
.
├─/home /dev/sdb8 ext4 rw,relatime,data=ordered
│ └─/home/usr/proj/src /dev/sda2[/other/src]
│ ext4 rw,relatime,data=ordered
└─/data /dev/sda2 ext4 rw,relatime,data=ordered
$ mountpoint -d /data
8:2
$ mountpoint -d /home/usr/proj/src/
8:2
Uwaga : ręcznie zmieniłem nazwy plików i katalogów, aby sytuacja była bardziej przejrzysta, więc może być literówka lub dwie w odczytach poleceń.
mount
ln
bind-mount
jdk1.0
źródło
źródło
/data
mogę uzyskać dostęp do i-węzła z katalogu podłączenia mount, więc albo połączenie bind musi znajdować się na tej samej partycji co/data
, albo łącze twarde działa na różnych urządzeniach, co powinno być nielegalne, ale i tak działa. czego mi brakuje?Odpowiedzi:
W kodzie jest rozczarowujący brak komentarzy . To tak, jakby nikt nigdy nie uważał tego za użyteczne, ponieważ montowania powiązań czasowych zostały zaimplementowane w wersji 2.4. Z pewnością wszystko, co musisz zrobić, to zastąpić
.mnt->mnt_sb
tam, gdzie jest napisane.mnt
...- Al Viro
Poniżej jest konkretny przykład
źródło
Powodem, dla którego nie możesz łączyć między urządzeniami, jest wprowadzanie niejednoznaczności. Pozycja katalogu dla pliku zawiera (w prostych systemach) numer i-węzła dla danego pliku. Dowiązanie twarde (tylko kolejny wpis w katalogu) musi również zawierać ten sam numer i-węzła. To dobrze, ale numery i-węzłów są unikalne tylko w jednym systemie plików (zwykle są gęstym zestawem od 1).
Twój bind mount nie rozwiązuje tego problemu. Tak, konstruuje swoistą „fikcję” struktury, ale nie wykonuje ponownej numeracji wszystkich i-węzłów w jednym systemie plików, aby upewnić się, że wszystkie są unikalne w obu systemach plików! To byłoby głupie.
To ograniczenie zawsze obowiązywało w systemach UNIX. Link symboliczny został wynaleziony częściowo w celu rozwiązania tego. Wiem, że nie są funkcjonalnie takie same, ale zazwyczaj są OK.
Spróbuj dowiązania symbolicznego? (
ln -s
)źródło
ls -l
. Na początku trochę głupie rozumowanie, ale potem doprowadziło to do króliczej nory i zacząłem się zastanawiać, co się dzieje z twardymi linkami ...