Dlaczego nie mogę utworzyć „twardego łącza” do pliku z katalogu „mount --bind” w tym samym systemie plików?


9

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 /homejest na jednym dysku i /datana 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 srcfolderu w /datasystemie 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” /datazamiast 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ń.


2
Nie ma znaczenia, gdzie montujesz folder. Są fizycznie na różnych partycjach. Każda partycja ma własną tabelę plików, a hardlink jest po prostu zapisywany w tej tabeli.
— user996142,

2
Chodzi o to, że pliki NIE znajdują się na fizycznie różnych partycjach. To ten sam system plików z tej samej partycji. Różnica polega na zamontowaniu opraw.
— roaima

Bindowanie to tylko fikcja. Nie zmienia struktur danych na dyskach. Systemy plików są nadal fizycznie oddzielne.
— Bob Eager

Ale kiedy tworzę łącze twarde, /datamogę 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?
— jdk1.0,

Odpowiedzi:


6

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_sbtam, gdzie jest napisane .mnt...

Ponieważ daje to granicę bezpieczeństwa wokół poddrzewa.

PS: zostało to omówione kilka razy, ale aby uniknąć wyszukiwania: rozważ np. Mount --bind / tmp / tmp; teraz masz sytuację, w której użytkownicy nie mogą tworzyć linków do innych plików bez rootowania, nawet jeśli mają zapis / tmp do nich zapisywalny. Podobne techniki działają w przypadku innych potrzeb związanych z izolacją - w zasadzie możesz ograniczyć nazwę / link do danego poddrzewa. IOW, to celowa funkcja. Pamiętaj, że możesz powiązać wiązkę drzew w chroot i uzyskać przewidywalne ograniczenia, niezależnie od tego, jak rzeczy mogą zostać uporządkowane rok później w głównym drzewie itp.

- Al Viro

Poniżej jest konkretny przykład

Ilekroć otrzymujemy mount -r --bind działający poprawnie (którego używam do umieszczania kopii niezbędnych bibliotek współdzielonych w więzieniach chroot, jednocześnie umożliwiając współdzielenie pamięci podręcznej strony), funkcja ta naruszyłaby bezpieczeństwo.

mkdir /usr/lib/libs.jail
for i in $LIST_OF_LIBRARIES; do
ln /usr/lib/$i /usr/lib/libs.jail/$i
done
mount -r /usr/lib/libs.jail /jail/lib
chown prisoner /usr/log/jail
mount /usr/log/jail /jail/usr/log
chrootuid /jail prisoner /bin/untrusted &

Chociaż zabezpieczenia powinny wystarczyć, ale wolałbym unikać linku więźnia /jail/lib/libfoo.so (zapis zwraca EROFS) do / jail / usr / log, gdzie jest potencjalnie zapisywalny.


-1

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)


Nie byłoby tutaj nazwy dla żadnej numeracji i-węzła. Istnieje tylko jeden podstawowy system plików z dwoma widokami.
— Gilles 'SO - przestań być zły'

Jednym z powodów, dla których nie chciałem symbolicznego linku, było to, że moje ścieżki były długie, a robienie tego było nieuporządkowane 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 ...
— jdk1.0,

@Gilles, tak mówiłem. Chodziło mi o to, że zmiana numeracji i-węzłów byłaby śmieszna. Nie mam pojęcia, dlaczego poprawna odpowiedź została odrzucona.
— Bob Eager

Wniosek jest słuszny, ale twoje wyjaśnienie jest błędne w tak wielu miejscach, że twoja odpowiedź jako całość jest bardzo myląca. Dobre wyjaśnienie znajduje się w odpowiedzi na źródłojedjedi.
— Gilles 'SO - przestań być zły'

Nie widzę żadnych błędów, chociaż przyznaję, że mógłbym być jaśniejszy.
— Bob Eager
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.