Istniejący katalog jest potrzebny jako punkt podłączenia .
$ ls
$ sudo mount /dev/sdb2 ./datadisk
mount: mount point ./datadisk does not exist
$ mkdir datadisk
$ sudo mount /dev/sdb2 ./datadisk
$
Uważam to za mylące, ponieważ nakłada się na istniejącą zawartość katalogu. Istnieją dwie możliwe treści katalogu punktu podłączenia, które mogą zostać nieoczekiwanie przełączone (dla użytkownika, który nie wykonuje montowania).
Dlaczego nie mount
dzieje się w nowo utworzonym katalogu? W ten sposób graficzne systemy operacyjne wyświetlają nośniki wymienne. Byłoby jasne, czy katalog jest podłączony (istnieje), czy nie został podłączony (nie istnieje). Jestem pewien, że istnieje dobry powód, ale jeszcze go nie odkryłem.
udisksctl
. Dlaczego warto korzystaćmount
?better design than Unix!
[potrzebne źródło]Odpowiedzi:
Jest to przypadek szczegółu implementacji, który wyciekł.
W systemie UNIX każdy katalog składa się z listy nazw odwzorowanych na numery i- węzłów . I-węzeł przechowuje metadane, które informują system, czy jest to plik, katalog, urządzenie specjalne, nazwany potok itp. Jeśli jest to plik lub katalog, informuje również system, gdzie znaleźć zawartość pliku lub katalogu na dysku. Większość i-węzłów to pliki lub katalogi.
-i
Opcjals
będzie lista numerów węzłów.Montowanie systemu plików zajmuje i-węzeł katalogu i ustawia flagę na kopii w pamięci jądra, aby powiedzieć „tak naprawdę, patrząc na zawartość tego katalogu, spójrz zamiast tego na inny system plików” (patrz slajd 10 tej prezentacji ). Jest to stosunkowo łatwe, ponieważ zmienia pojedynczy element danych.
Dlaczego zamiast tego nie tworzy pozycji katalogu wskazującej na nowy i-węzeł? Istnieją dwa sposoby, aby to zaimplementować, oba mają wady. Jednym z nich jest fizyczne zapisanie nowego katalogu w systemie plików - ale to się nie powiedzie, jeśli system plików jest tylko do odczytu! Drugim jest dodanie do każdego procesu wyświetlania katalogu listy „dodatkowych” rzeczy, których tak naprawdę nie ma. Jest to kłopotliwe i potencjalnie powoduje niewielki spadek wydajności przy każdej operacji na pliku.
Jeśli chcesz dynamicznie tworzone punkty montowania,
automount
system może to zrobić. Specjalne systemy plików inne niż dyskowe mogą również tworzyć katalogi na woli, na przykładproc
,sys
,devfs
i tak dalej.Edycja: zobacz także odpowiedź na Co się stanie, gdy „zamontujesz” istniejący folder z zawartością?
źródło
sudo mount --bind / /mnt ; ls /mnt/proc
-> pusty. Zastanawiam się, jak to działa.fs/namespace.c
Myślę, że dokładna operacja się rozpoczęła ; Nie znam źródła i nie chciałem spędzać zbyt dużo czasu na wierceniu szczegółów. „Flaga na i-węźle” pochodzi z połączonej prezentacji./var/cache
pewnym momencie, gdy/var
nie udało się zamontować.) Zobacz takżepath_resolution(7)
. (Starsze strony linux-man miały tę stronę podręcznika w sekcji 2, np. Die.net) IDK jak Linux faktycznie działa wewnętrznie, aby zoptymalizować sprawdzenie każdego komponentu katalogu jako możliwego montowania. Może przypiąć ten wpis VFS do pamięci podręcznej?fs/namei.c
(ścieżka -> wyszukiwanie i-węzłów) wywołuje jednak plik namespace.clookup_mnt()
. Na zębatce znajduje się flaga (pozycja w pamięci podręcznej katalogu). Ale to tylko optymalizacja aka szczegóły implementacji. Nie mówi ci, który system plików jest tam zamontowany; musisz zajrzeć do tabeli montażu. (Zobacz m_hash (), aby uzyskać więcej informacji na temat implementacji. Linux przynajmniej unika dodatkowych porównań łańcuchów, a AFAICS w tym samym czasie udaje się ponownie użyć dentry między np. Oprawami łączenia, ponieważ jest napisany przez kreatorów).man 8 mount
::mount --bind foo foo
.mount
Wywołanie wiązania dołącza tylko (część) jednego systemu plików, nie jest możliwe podliczanie. Cała hierarchia plików, w tymmount --rbind olddir newdir
Jeśli
mount(2)
wymagane jest utworzenie nowego katalogu, który będzie punktem podłączenia, nie można zamontować niczego w systemie plików tylko do odczytu. To byłoby głupie, więc możemy to wykluczyć.Gdyby mount opcjonalnie utworzył nowy katalog jako punkt podłączenia, byłoby to dziwne. Nie jest tak, że montowanie / odmontowywanie odbywa się cały czas, więc umieszczenie dodatkowej logiki w jądrze, aby wykonać te dwa kroki za pomocą jednego wywołania systemowego, nie byłoby ważnym przyspieszeniem. Wystarczy pozostawić przestrzeń użytkownika, aby wykonać
mkdir(2)
połączenie systemowe, jeśli chce. Odpowiedź Dmitry'ego wskazuje, żemount(2)
zrobienie obu rzeczy sprawiłoby, że nie byłby to atom. A ty chcesz dodatkowy argumentmount(2)
z flagi trybu podobaopen(2)
trwa, dlaO_CREAT
,O_EXCL
itp byłoby to po prostu głupie porównaniu do przestrzeni użytkownika pozwalając zrobić.A może pytałeś o to, czy
mount(8)
(tradycyjny program, który wykonujemount(2)
wywołania systemowe) to robi? Byłoby to możliwe, ale już doskonale nadaje sięmkdir(1)
do tego zadania, a konstrukcja Uniksa polega na dobrych małych narzędziach, które można łączyć. Jeśli potrzebujesz narzędzia, które spełnia oba te warunki, łatwo jest napisać skrypt powłoki, aby zbudować to narzędzie z dwóch prostszych narzędzi. (Lub, jak skomentował Muru,udisksctl
już to robi, więc nie musisz tego pisać). Ponadto, normalny Linuxmount(8)
z util-linux obsługujemount -o x-mount.mkdir[=mode]
używanie jegox-
składni dla opcji przestrzeni użytkownika, a nie opcji, które mają być przekazywane do systemu plików.Teraz bardziej interesujące pytanie: dlaczego w ogóle nadrzędny system plików musi mieć katalog?
Jak wskazuje odpowiedź pjc50 (brak relacji, nawet jeśli ma moje inicjały!), Posiadanie punktów montowania wyświetlanych na listach katalogów wymagałoby wtedy dodatkowej kontroli każdego
readdir()
.Posiadanie punktów montowania, ponieważ katalogi w katalogu je zawierającym (na nadrzędnym FS) to niezła sztuczka.
readdir()
wcale nie musi zauważać, że jest to punkt montowania. Dzieje się tak tylko wtedy, gdy punkt montowania jest używany jako komponent ścieżki. Rozdzielczość ścieżki oczywiście musi sprawdzać tabelę montowania dla każdego elementu katalogu ścieżki.źródło
If mount(2) required the creation of a new directory to be the mount point, you couldn't mount anything under a read-only filesystem. That would be dumb
- Twierdzę, że jest mądrzejszy: z punktu widzenia użytkownika system plików tylko do odczytu nie powinien się zmieniać, ale zezwolenie na montowanie oznacza, że możero
. Istnieje wiele przypadków użycia systemów plików tylko do odczytu, w których argument nie ma sensu.man 8 mount
:x-mount.mkdir[=mode]
Zezwól na utworzenie katalogu docelowego (mountpoint). Opcjonalny tryb argumentów określa tryb dostępu do systemu plików używanymkdir(2)
w notacji ósemkowej. Domyślnym trybem jest 0755. Ta funkcja jest obsługiwana tylko dla użytkowników root./tmp
oraz/home
. Lub montowany tylko do odczytu NFS/usr
z/usr/local
zamontowanym na nim lokalnym . Lub bardziej ogólnie, każdy wspólny obraz tylko do odczytu z zamontowaną modyfikowalną częścią. (lokalne modyfikacje obrazu tylko do odczytu można również wykonać dla poszczególnych plików za pomocą niestandardowych systemów plików, takich jak overlayfs lub inne unijne systemy plików dla systemu Linux, używanych w obrazach rozruchowych LiveCD.) Początkowo myślałem o root FS początkowo zamontowanym RO w boot, ale sprawienie, by rw mogło się zdarzyć przed innymi montowaniami.Montowanie do istniejącego katalogu powoduje wywołanie
mount
praktycznie atomowej: albo kończy się niepowodzeniem, przynajmniej z perspektywy użytkownika. Gdybymount
musiał sam utworzyć punkt montowania, miałby dwa punkty awarii, co uniemożliwiłoby zagwarantowanie czystego wycofania. Wyobraź sobie następujący scenariusz:mount
pomyślnie tworzy punkt montowaniamount
próbuje zamontować nowy system plików w tym katalogu, ale kończy się niepowodzeniemmount
próbuje usunąć punkt montowania, ale kończy się niepowodzeniemSystem kończy się efektem ubocznym niepowodzenia
mount
.Oto kolejny:
umount
pomyślnie odmontowuje system plikówumount
próbuje usunąć punkt montowania, ale kończy się niepowodzeniemA teraz, czy
umount
powróci sukces czy porażka?źródło
mount
ma 8 różnych kodów powrotu dla błędów, które można również łączyć. Może po prostu dodać kolejny, gdy usunięcie katalogu nie powiedzie się. man7.org/linux/man-pages/man8/mount.8.html#RETURN_CODESmount
wywołanie systemowe go nie tworzy. Chociaż może to była tylko moja interpretacja / oczekiwanie tego, o co myślałem, że OP chciał zapytać, lub o co zapytałbym, gdybym pytał.Kolejny przypadek, który może wystąpić:
Podczas uruchamiania podstawowy obraz tylko do odczytu jest ładowany do katalogu głównego. Więc chcesz to zmienić, jeśli chcesz kopać prawdziwy root. Możesz więc sobie wyobrazić, że mount syscall po prostu zamienia punkt
ro
montowania narw
.Tutaj wyobraźmy sobie, że masz problem z systemem plików w głównym punkcie montowania. Chciałbyś móc spróbować go naprawić. Dzięki nakładaniu się montowania możesz odmontować system plików i użyć
fsck
dostarczonego obrazu podstawowego do jego rozwiązania.Ta funkcja może być również przydatna w systemach wymagających silnych zabezpieczeń, aby śledzić zmiany między
ro
partycją arw
jedną.źródło
mount
potrzeby utworzenia nowego katalogu w miejscu punktu montowania nie można zamontować niczego na systemie plików tylko do odczytu? Pierwszy akapit jest mylący: nie tak działa Linux initrd. Używapivot_root
wywołania systemowego, aby zmienić root fs, a nie tylko montować na nim więcej rzeczy. Utrudniało to przestrzeganie logiki w następnych akapitach, ponieważ myślałem, że mówiszpivot_root(2)
.pivot_root
i następnieumount
ramdysk. Ale initramfs to rootfs: nie możesz anipivot_root
rootfs, ani odmontować go . Zamiast tego usuń wszystko z rootfów, aby zwolnić miejsce (find -xdev / -exec rm {} \;
), zamontuj rootfsy za pomocą nowego roota (cd /newmount; mount --move . /; chroot .
), dołącz stdin / stdout / stderr do nowego / dev / console iexec
nowegoinit
Zawsze też się nad tym zastanawiałem.
Proste opakowanie, takie jak:
zapisany jako skrypt wykonywalny o nazwie
mount
w katalogu nadpisującym/bin
w ŚCIEŻCE powinien się tym zająć, jeśli zbytnio Ci to przeszkadza(Przed uruchomieniem rzeczywistego
mount
pliku binarnego tworzy katalog nazwany na podstawie ostatniego argumentumount
, jeśli taki katalog jeszcze nie istnieje).Alternatywnie, jeśli nie chcesz, aby nieudane wywołania
mount
opakowania tworzyły katalogi, możesz:źródło
mount
polecenie nie powinno zatem używać utworzonego katalogu?mount /dev/foo /some/path
:? Zakładałem, że to zadziała tak jakudisksctl
działa, więc ucieknieszmount /dev/foo
.eval
rozwijania$#
, używając"${@:-1}"
. Testowałem to z DASH, ponieważ myślę, że nie obsługuje on niczego poza tym, co jest wymagane do obsługi POSIX sh./bin/dash -c 'echo ${@:-1}' foo bar
odbitkibar
.man -o x-mount.mkdir
...