Montowanie
Po tej lekcji: kursant montuje i odmontowuje systemy plików, radzi sobie z „target is busy”, sprawdza wszystko przez findmnt i bezpiecznie dopisuje montowanie na stałe do /etc/fstab przez UUID, z opcjami defaults, noatime i nofail, testując je mount -a.
Wstęp
Piątek, szesnasta. Dodałeś nowy dysk do serwera, dopisałeś jedną linijkę do /etc/fstab, wpisałeś reboot i poszedłeś po kawę.
Wracasz. Serwer nie odpowiada na pingi. Strona nie działa. Na konsoli w panelu wirtualizacji: tryb awaryjny. Serwer dosłownie nie wpuścił się do własnego domu, bo w jednej linijce była literówka.
Dziś nauczymy się montować dyski tak, żeby to Ci się nigdy nie przydarzyło. A jeśli się przydarzy, wyjdziesz z tego w pięć minut. Po drodze rozwiążemy też drugi klasyk: „nie mogę odmontować, bo target is busy”.
Montowanie, czyli podłączanie skrzydła budynku
W Linuksie jest jedno drzewo folderów. Jedno. Zaczyna się od /. Nie ma tu dysku C, D i E jak w Windowsie. Każdy nowy dysk, pendrive czy udział sieciowy trzeba przyłączyć w jakimś miejscu tego drzewa.
Pamiętasz analogię? Montowanie to podłączanie skrzydła budynku. Masz biurowiec, dobudowujesz nowe skrzydło z magazynem, a potem w korytarzu na drugim piętrze wybijasz drzwi z tabliczką „dane”. Od tej chwili kto wejdzie przez te drzwi, jest w nowym skrzydle. Te drzwi to punkt montowania, mount point: zwykły, pusty folder.
sudo mkdir -p /mnt/dane
sudo mount /dev/loop1p1 /mnt/dane
ls /mnt/danelost+foundmount bierze dwa argumenty: co podłączyć i gdzie. Typ systemu plików rozpozna sam. Jeśli chcesz go wymusić, jest -t ext4. A lost+found to biuro rzeczy znalezionych, które ext4 zakłada przy mkfs. Skoro je widzimy, jesteśmy w nowym skrzydle.
Mała, ale ważna ciekawostka. Co, jeśli w folderze /mnt/dane już coś było? Sprawdziłem: przed montowaniem położyłem tam plik UKRYTY_PLIK_POD_SPODEM. Po zamontowaniu zniknął, widać było tylko lost+found. Po odmontowaniu wrócił. Plik nie zniknął, tylko drzwi zasłoniły to, co było w korytarzu. Klasyczny powód paniki: „po restarcie zniknęły mi dane!”. Nie zniknęły. Ktoś po prostu nie zamontował dysku i patrzysz na pusty korytarz zamiast na skrzydło.
Co jest zamontowane: findmnt
Klasyczna odpowiedź to mount bez argumentów. Wypisze wszystko, łącznie z kilkudziesięcioma systemami plików, które system montuje sam dla siebie. Ściana tekstu. Lepiej zapytać celowo:
findmnt /mnt/dane
mount | grep /mnt/dane
df -hT /mnt/daneTARGET SOURCE FSTYPE OPTIONS
/mnt/dane /dev/loop1p1 ext4 rw,relatime
/dev/loop1p1 on /mnt/dane type ext4 (rw,relatime)
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop1p1 ext4 452M 24K 417M 1% /mnt/danefindmnt to współczesne narzędzie do tego pytania. Bez argumentów rysuje drzewo wszystkich montowań. Z punktem montowania mówi tylko o nim. findmnt -t ext4,xfs pokaże tylko prawdziwe dyski, bez systemowych dodatków. A findmnt -no OPTIONS /mnt/dane wypisze same opcje, co przydaje się w skryptach. Jeśli findmnt nic nie wypisze i zwróci kod 1, to pod tym adresem nic nie jest zamontowane. Kciuk w dół, ale za to jaki czytelny.
Opcje montowania
Przez -o mówisz, na jakich zasadach drzwi mają działać. Na przykład tylko do odczytu:
sudo mount -o ro /dev/loop1p1 /mnt/dane
touch /mnt/dane/xtouch: cannot touch '/mnt/dane/x': Read-only file systemDrzwi z kratą: można patrzeć, nie można wnosić. Żeby zmienić opcje bez odmontowywania, jest remount:
sudo mount -o remount,rw /mnt/dane
findmnt -no OPTIONS /mnt/danerw,relatimeTo samo -o remount,rw / ratuje życie w trybie awaryjnym, kiedy główny system plików jest tylko do odczytu, a Ty musisz poprawić /etc/fstab. Zapamiętaj, za chwilę wróci.
Dwie opcje, które zobaczysz w każdym fstab:
defaults to zestaw domyślny. Według podręcznika mount to: rw, suid, dev, exec, auto, nouser, async. Czyli: zapis i odczyt, programy mogą się uruchamiać, montuj automatycznie przy starcie, tylko root montuje. Rozsądne ustawienie fabryczne.
noatime wyłącza zapisywanie czasu ostatniego odczytu pliku. Bo wyobraź sobie bibliotekę, w której przy każdym zajrzeniu do książki bibliotekarz biegnie do karty katalogowej i zapisuje „przeglądana o 14:03”. Każdy odczyt robi się zapisem. Na serwerze z milionem małych plików to czysta strata.
sudo mount -o noatime /dev/loop1p1 /mnt/dane
stat -c 'Access: %x' /mnt/dane/raport.txt
cat /mnt/dane/raport.txt > /dev/null
stat -c 'Access: %x' /mnt/dane/raport.txtAccess: 2026-11-03 22:26:22.263872636 +0100
Access: 2026-11-03 22:26:22.263872636 +0100Przeczytałem plik, czas dostępu stoi w miejscu. Domyślnie jest relatime, kompromis: czas dostępu zapisuje się tylko wtedy, gdy jest starszy od czasu ostatniej zmiany. Sprawdziłem i to: przy relatime, gdy czas dostępu był starszy niż czas modyfikacji, cat go zaktualizował.
umount i „target is busy”
Odmontowanie to umount. Uwaga na pisownię: bez „n”. umount, nie unmount. Ktoś kiedyś oszczędzał literki, a my płacimy za to do dziś.
sudo umount /mnt/danePodajesz punkt montowania albo urządzenie, wszystko jedno. Zwykle po prostu działa. Zwykle. Bo czasem:
umount: /mnt/dane: target is busy.Kod wyjścia 32. Ktoś stoi w drzwiach i nie da się ich zamurować. Najczęściej to Ty: masz drugie okno terminala, w którym zrobiłeś cd /mnt/dane. Albo jakiś program ma tam otwarty plik. Kto? Pytamy:
sudo fuser -vm /mnt/dane
sudo lsof /mnt/dane USER PID ACCESS COMMAND
/mnt/dane: root kernel mount /mnt/dane
root 24812 ..c.. sleep
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 24812 root cwd DIR 259,4 4096 2 /mnt/danefuser -vm mówi: proces 24812, sleep, a litera c znaczy, że ma tam bieżący folder, „current directory”. lsof mówi to samo: cwd. Rozwiązanie: wyjdź z tego folderu w drugim oknie, zamknij program albo zatrzymaj usługę, a potem umount jeszcze raz. W ostateczności kill, najpierw grzeczny SIGTERM, a nie od razu wyłączanie prądu.
Jest jeszcze umount -l, „lazy”, leniwe odmontowanie. Odpina drzwi od korytarza od razu, a skrzydło sprząta, kiedy ostatni gość wyjdzie. Sprawdziłem: umount -l się udał, findmnt przestał widzieć montowanie, ale proces dalej siedział w środku. Wygodne, ale podstępne: dysk wygląda na odpięty, a ktoś na nim jeszcze pisze. Podręcznik ostrzega, że po takim zabiegu w niektórych przypadkach warto się spodziewać restartu. Używaj świadomie. A umount -f jest pomyślane dla niedostępnych udziałów NFS, nie dla zwykłych dysków.
/etc/fstab: lista drzwi do otwarcia przy starcie
Wszystko, co zamontujesz ręcznie, zniknie po restarcie. Żeby dysk montował się sam, dopisujesz go do pliku /etc/fstab, „file systems table”. To lista, którą kierownik zmiany, czyli systemd, czyta przy każdym starcie: które skrzydła podłączyć i jakimi drzwiami.
Każda linijka ma sześć kolumn oddzielonych spacjami:
UUID=3d211a77-05fd-4f40-af9e-a59e28329d1f /mnt/dane ext4 defaults,noatime 0 2| Kolumna | Przykład | Co znaczy |
|---|---|---|
| 1. co | UUID=3d21… | urządzenie: najlepiej przez UUID, może też być LABEL=, /dev/sdb1 albo /dev/mapper/... |
| 2. gdzie | /mnt/dane | punkt montowania, folder musi istnieć |
| 3. typ | ext4 | system plików: ext4, xfs, vfat, swap… |
| 4. opcje | defaults,noatime | opcje po przecinku, bez spacji |
| 5. dump | 0 | stary program do kopii zapasowych; dziś prawie zawsze 0 |
| 6. fsck | 2 | kolejność sprawdzania przy starcie: 1 dla /, 2 dla reszty, 0 to „nie sprawdzaj” |
Dlaczego UUID, a nie /dev/sdb1? Bo nazwy sdX nadawane są w kolejności, w jakiej jądro znajdzie dyski. Dołożysz dysk, zmienisz kontroler, a sdb stanie się sdc. Wtedy montujesz nie ten dysk albo żaden. UUID to PESEL systemu plików, nie zmienia się przy przeprowadzce.
Dla XFS w szóstej kolumnie zwykle stoi 0, bo jak pamiętasz, fsck.xfs i tak nic nie robi. [RHEL]
Na świeżo zainstalowanym Ubuntu i RHEL zobaczysz w fstab właśnie wpisy przez UUID=, a przy LVM ścieżki /dev/mapper/..., o których za dwa lekcje. Zajrzyj: cat /etc/fstab. Linijki z # na początku to komentarze. [Ubuntu] [RHEL]
Bezpieczna procedura: zanim zrestartujesz
Edytujesz fstab jak saper. Oto procedura, która chroni przed piątkowym horrorem z haka.
Krok pierwszy: kopia.
sudo cp /etc/fstab /etc/fstab.bakKrok drugi: dopisz linijkę. Edytorem albo przez tee -a, nigdy przez pojedynczą strzałkę, która nadpisałaby cały plik:
echo 'UUID=3d211a77-05fd-4f40-af9e-a59e28329d1f /mnt/dane ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstabKrok trzeci: niech findmnt sprawdzi plik.
sudo findmnt --verifySuccess, no errors or warnings detectedKrok czwarty: zamontuj wszystko z fstab, co jeszcze nie jest zamontowane. To jest generalna próba restartu, bez restartu:
sudo mount -a
findmnt /mnt/daneTARGET SOURCE FSTYPE OPTIONS
/mnt/dane /dev/loop1p1 ext4 rw,noatimemount -a milczy, jeśli wszystko jest dobrze. Kciuk w górę bez słów. Jeśli coś jest źle, krzyczy teraz, kiedy masz jeszcze działający system, a nie przy starcie.
Na systemach z systemd mount może jeszcze dopisać podpowiedź: mount: (hint) your fstab has been modified, but systemd still uses the old version; use 'systemctl daemon-reload' to reload. Posłuchaj go: sudo systemctl daemon-reload. Ten tekst wyciągnąłem prosto z programu mount, więc to nie jest wymysł.
Krok piąty, opcjonalny, ale uczciwy: restart w spokojnej chwili i sprawdzenie findmnt po starcie. Wtedy masz pewność.
nofail: dysk, bez którego da się żyć
Co dokładnie zepsuło serwer w haku? Przy starcie systemd zamienia każdą linijkę fstab w zadanie montowania. Te zadania są wymagane przez cel o nazwie local-fs.target, czyli „lokalne dyski gotowe”. A ten cel ma w swojej definicji linijkę OnFailure=emergency.target. Sprawdziłem w pliku jednostki. Jedno nieudane montowanie, cały start ląduje w trybie awaryjnym.
Opcja nofail mówi: ten dysk jest mile widziany, ale nie wymagany. Podręcznik systemd pisze wprost, że z nofail start idzie dalej bez czekania na ten dysk, niezależnie od tego, czy się zamontuje.
Sprawdźmy na własnej skórze. Zrobię literówkę w ostatnim znaku UUID:
sudo mount -amount: /mnt/dane: can't find UUID=3d211a77-05fd-4f40-af9e-a59e28329d10.Kod 32. Przy restarcie to byłby tryb awaryjny. findmnt --verify też to łapie:
/mnt/dane
[E] unreachable on boot required source: UUID=3d211a77-05fd-4f40-af9e-a59e28329d10Zwróć uwagę na słowo „required”, wymagane. Teraz ta sama zepsuta linijka z defaults,noatime,nofail: mount -a kończy się kodem 0 i nic nie mówi, bo według podręcznika nofail znaczy „nie zgłaszaj błędów, jeśli urządzenia nie ma”.
Kiedy używać nofail? Dla dysków z danymi, kopiami, pendrive'ów, dysków USB, udziałów sieciowych. Dla czegoś, bez czego serwer i tak nie ma sensu, na przykład folderu z bazą danych, czasem lepiej, żeby start się zatrzymał, niż żeby baza zaczęła pisać do pustego folderu na dysku systemowym. Pamiętasz pusty korytarz za drzwiami? Właśnie tam by pisała.
Jak to działa pod spodem
mount to dla jądra wywołanie systemowe, które mówi: „w tym miejscu drzewa, czyli w tym folderze, zamiast jego zawartości pokazuj korzeń tamtego systemu plików”. Warstwa VFS z poprzedniej lekcji zapamiętuje to w tablicy montowań. Każdy proces może ją podejrzeć w /proc/self/mountinfo, i właśnie stamtąd findmnt bierze swoje drzewo.
/etc/fstab jądra w ogóle nie obchodzi. To plik dla ludzi i dla narzędzi. Przy starcie systemd uruchamia mały program systemd-fstab-generator, który zamienia każdą linijkę na jednostkę typu .mount, na przykład mnt-dane.mount. Dlatego po edycji fstab trzeba zrobić systemctl daemon-reload: żeby generator przeczytał plik jeszcze raz. Dlatego też w systemctl list-units --type=mount zobaczysz swoje dyski jako zwykłe usługi, które można sprawdzić systemctl status.
A „target is busy”? Jądro trzyma licznik odwołań do każdego zamontowanego systemu plików: otwarte pliki, bieżące foldery procesów, inne montowania w środku. Dopóki licznik nie spadnie do zera, zwykłe umount odmawia. umount -l odpina drzwi od drzewa od razu, a sprzątanie odkłada do chwili, kiedy licznik spadnie.
Ściąga flag
| Komenda | Flaga | Co robi |
|---|---|---|
mount | URZ PUNKT | montuje urządzenie w folderze |
mount | -t TYP | wymusza typ systemu plików |
mount | -o ro / -o rw | tylko do odczytu / zapis i odczyt |
mount | -o remount,rw | zmienia opcje bez odmontowania |
mount | -o loop | montuje plik obrazu |
mount | -a | montuje wszystko z fstab, czego jeszcze nie ma |
umount | PUNKT lub URZ | odmontowuje |
umount | -l | leniwe odmontowanie, ostrożnie |
findmnt | (bez argumentów) | drzewo montowań |
findmnt | PUNKT | czy i co jest zamontowane w folderze |
findmnt | -t ext4,xfs | tylko wybrane typy |
findmnt | -no OPTIONS PUNKT | same opcje, bez nagłówka |
findmnt | --verify | sprawdza /etc/fstab |
fuser | -vm PUNKT | kto trzyma zamontowany system plików |
lsof | PUNKT | otwarte pliki i foldery w punkcie montowania |
fstab | defaults | rw,suid,dev,exec,auto,nouser,async |
fstab | noatime | nie zapisuj czasu odczytu |
fstab | nofail | brak dysku nie zatrzymuje startu |
systemctl | daemon-reload | systemd czyta fstab od nowa |
⚠ Typowy błąd
Literówka w fstab, restart, tryb awaryjny. Jak z tego wyjść?
Logujesz się hasłem roota na konsoli. Nie przez SSH, bo sieć mogła nie wstać, tylko przez konsolę w panelu wirtualizacji albo fizyczny monitor. Główny system plików bywa wtedy zamontowany tylko do odczytu, więc:
mount -o remount,rw /
cp /etc/fstab.bak /etc/fstab # albo popraw linijkę w nano
systemctl daemon-reload
mount -a
findmnt /mnt/dane
rebootAlbo jeszcze prościej: dopisz w zepsutej linijce nofail albo zakomentuj ją znakiem # i napraw spokojnie po starcie. Teraz już wiesz, po co był krok pierwszy z kopią fstab.bak. Kopia zapasowa to jedyny przedmiot w serwerowni, który jest nudny aż do chwili, kiedy staje się najważniejszy.
✎ Zadanie
Na maszynie wirtualnej zrób plik 200 MB, załóż na nim system plików ext4, zamontuj go w /mnt/test na stałe przez /etc/fstab z opcją nofail, sprawdź mount -a i findmnt /mnt/test.
Podpowiedź: plik zrobisz przez dd albo truncate, a w pierwszej kolumnie fstab może stać pełna ścieżka do pliku. Nie zapomnij o kopii fstab przed edycją.
Pokaż rozwiązanie
sudo dd if=/dev/zero of=/srv/dysk-test.img bs=1M count=200
sudo mkfs.ext4 /srv/dysk-test.img
sudo mkdir -p /mnt/test
echo '/srv/dysk-test.img /mnt/test ext4 loop,nofail 0 2' | sudo tee -a /etc/fstab
sudo systemctl daemon-reload
sudo mount -a
findmnt /mnt/testTARGET SOURCE FSTYPE OPTIONS
/mnt/test /dev/loop1 ext4 rw,relatimePlik zamiast dysku, więc w /etc/fstab jest opcja loop: system sam robi z pliku udawany dysk /dev/loop1. nofail mówi: jak tego pliku zabraknie, nie blokuj startu. mount -a bez błędu i findmnt z wynikiem znaczą, że po restarcie też wstanie. A systemctl daemon-reload to grzeczność wobec systemd, który trzyma w głowie starą wersję fstab i inaczej marudzi przy każdym mount. Jeśli mount -a milczy, to dobrze. W Linuksie cisza to pochwała. Jedyne miejsce na świecie, gdzie szef nic nie mówi, bo jest zadowolony.
Co dalej
Skoro umiemy już zrobić plik, sformatować go i podpiąć na stałe, w następnej lekcji zrobimy z pliku coś zupełnie innego: piwnicę dla pamięci RAM. Swap: plik i partycja wymiany, mkswap, swapon, swapoff i suwak vm.swappiness.