Przejdź do treści
Lekcja 63 z 117

Kurs › Moduł 6 › Lekcja 63

Dyski przez sieć

⏱ ok. 10 min czytania· moduł 6: Dyski i systemy plików

Po tej lekcji: kursant udostępnia folder przez NFS (/etc/exports, exportfs) i montuje go na kliencie, wystawia udział Samby dla Windowsa i Maca, montuje go przez CIFS, ustawia automatyczne montowanie przez autofs i wie, czym różni się iSCSI i jak podłączyć dysk przez iscsiadm.

Wstęp

pięć serwerów, każdy ma własną kopię folderu wspolne, w każdej inna wersja pliku cennik.xlsx

Firma ma pięć serwerów aplikacji. Każdy potrzebuje tych samych plików: zdjęć produktów, dokumentów, raportów. Kopiujesz je na każdy osobno? To po tygodniu masz pięć różnych wersji prawdy i każdy klient widzi inny cennik.

A księgowość na Windowsie i grafik na Macu chcą mieć ten sam folder jako zwykły dysk w swoim systemie.

Dziś wynosimy dysk za drzwi serwera. Jeden serwer trzyma pliki, reszta świata podpina je przez sieć, jakby były lokalne. Linux z Linuksem przez NFS, z Windowsem i Makiem przez Sambę. A do tego drzwi, które otwierają się same, kiedy podchodzisz, i dysk na bardzo długim przedłużaczu.

NFS, czyli skrzydło w innym budynku

Pamiętasz montowanie z lekcji 59? Podłączenie skrzydła budynku do głównego korytarza. NFS robi to samo, tylko skrzydło stoi w zupełnie innym budynku po drugiej stronie ulicy, a między budynkami jest przejście, czyli sieć. Idziesz korytarzem /mnt/wspolne, otwierasz drzwi i nawet nie wiesz, że właśnie przeszedłeś przez kładkę nad jezdnią.

NFS, Network File System, sieciowy system plików. Linuksowy standard udostępniania folderów między serwerami. Działa na porcie 2049.

Pakiety: [Ubuntu] serwer to nfs-kernel-server, klient nfs-common. [RHEL] i serwer, i klient to nfs-utils.

NFS: serwer

Na serwerze robimy folder i wpisujemy go do listy udostępnień, pliku /etc/exports:

sudo mkdir -p /srv/nfs/wspolne
echo '/srv/nfs/wspolne  192.168.1.0/24(rw,sync,no_subtree_check)' | sudo tee -a /etc/exports
sudo exportfs -ra
sudo exportfs -v
/srv/nfs/wspolne
		192.168.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)

Linijka w exports to trzy rzeczy: co udostępniam, komu, na jakich zasadach. Tu: folder /srv/nfs/wspolne, całej sieci 192.168.1.0/24, z zapisem (rw). sync znaczy, że serwer potwierdza zapis dopiero, kiedy dane naprawdę są na dysku. Wolniej, ale bezpieczniej.

exportfs -ra wczytuje plik od nowa, a -v pokazuje, co naprawdę jest udostępnione. I patrz: w wyniku jest więcej opcji, niż wpisałem. Jedna z nich jest bardzo ważna: root_squash. To znaczy, że root z klienta na tym udziale nie jest rootem, tylko nikim. Inaczej każdy, kto ma roota na dowolnym laptopie w sieci, byłby rootem na Twoich plikach. Jak gość z przepustką dyrektora innej firmy: w swoim biurowcu dyrektor, u nas gość.

Usługa i zapora:

sudo systemctl enable --now nfs-server

[RHEL] sudo firewall-cmd --permanent --add-service=nfs i sudo firewall-cmd --reload. [Ubuntu] sudo ufw allow from 192.168.1.0/24 to any port nfs.

NFS: klient

showmount -e 192.168.1.10
sudo mkdir -p /mnt/wspolne
sudo mount -t nfs 192.168.1.10:/srv/nfs/wspolne /mnt/wspolne
df -h /mnt/wspolne

showmount -e pyta serwer o listę udostępnień. Uwaga: pyta starszym językiem, więc serwer ustawiony tylko na NFS w wersji 4 może nic nie odpowiedzieć, choć montowanie działa. Składnia montowania: serwer:ścieżka. Dwukropek oddziela adres od folderu.

Na stałe, w /etc/fstab:

192.168.1.10:/srv/nfs/wspolne  /mnt/wspolne  nfs  defaults,_netdev,nofail  0 0

_netdev mówi systemowi: to jest dysk sieciowy, nie próbuj go montować, zanim nie wstanie sieć. nofail znasz z lekcji o montowaniu: serwer plików leży, a my i tak startujemy.

Samba, czyli tłumacz dla Windowsa i Maca

Windows nie mówi po NFS-owemu. Mówi protokołem SMB, który w starszych tekstach nazywa się też CIFS. Mac też go rozumie. Samba to serwer, który uczy Linuksa tego języka. Jak tłumacz w urzędzie, który obsługuje petentów z zagranicy, choć sam urząd pracuje po polsku.

Pakiet samba w obu rodzinach. Konfiguracja w /etc/samba/smb.conf. Dopisujemy udział:

[dzial]
   path = /srv/samba/dzial
   valid users = ania
   read only = no
   browseable = yes

Nazwa w nawiasach to nazwa udziału, którą widzą ludzie. valid users to lista osób wpuszczanych do środka. Sprawdzamy składnię, zanim cokolwiek zrestartujemy:

testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.

Loaded services file OK to zielone światło. Potem hasło. Samba ma własną listę haseł, osobną od systemowej, a konto w systemie musi już istnieć:

sudo smbpasswd -a ania
sudo systemctl restart smbd

[Ubuntu] usługa to smbd, zapora sudo ufw allow samba. [RHEL] usługa to smb, zapora firewall-cmd --permanent --add-service=samba. A na RHEL dochodzi SELinux: folder spoza domyślnych ścieżek trzeba oznaczyć dla Samby, inaczej klient dostanie odmowę mimo dobrych uprawnień. Szczegóły w lekcji o SELinux.

Test z samego serwera, bez Windowsa, narzędziem smbclient:

smbclient -L localhost -U ania
smbclient //localhost/dzial -U ania -c 'put raport.txt; ls'
	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	dzial           Disk
	IPC$            IPC       IPC Service (vm server (Samba, Ubuntu))

putting file raport.txt as \raport.txt (1.7 kb/s) (average 1.7 kb/s)
  .                                   D        0  Tue Nov  3 22:19:33 2026
  ..                                  D        0  Tue Nov  3 22:19:33 2026
  raport.txt                          A        7  Tue Nov  3 22:19:33 2026

Na Windowsie w Eksploratorze wpisujesz \\192.168.1.10\dzial. [macOS] W Finderze Cmd+K i adres smb://192.168.1.10/dzial.

CIFS: Linux jako klient Samby

A jeśli to Linux ma się podłączyć do udziału na Windowsie albo na Sambie? Pakiet cifs-utils w obu rodzinach i typ cifs:

sudo mount -t cifs //192.168.1.10/dzial /mnt/dzial -o username=ania

Na stałe nie wpisuj hasła do fstab, bo ten plik czyta każdy. Hasło idzie do osobnego pliku z prawami tylko dla roota:

printf 'username=ania\npassword=TuHaslo\n' | sudo tee /root/.smb-dzial
sudo chmod 600 /root/.smb-dzial
//192.168.1.10/dzial  /mnt/dzial  cifs  credentials=/root/.smb-dzial,_netdev,nofail  0 0

autofs, czyli drzwi, które otwierają się same

Dysk sieciowy zamontowany na stałe ma wadę: jak serwer plików znika, klient potrafi zawisnąć na każdym ls i df. A jeśli masz sto udziałów, z których naraz używasz dwóch, montowanie wszystkich przy starcie to jak zapalanie światła w całym biurowcu, bo ktoś idzie do toalety.

autofs to automatyczne drzwi w Biedronce. Podchodzisz, otwierają się. Odchodzisz, po chwili się zamykają. Folder montuje się w chwili, kiedy ktoś do niego wchodzi, a po określonym czasie bezczynności sam się odmontowuje. Pakiet autofs w obu rodzinach.

Dwa pliki. Główny, /etc/auto.master, mówi: którym folderem zarządza autofs i gdzie jest jego mapa.

/mnt/nfs  /etc/auto.nfs  --timeout=60

A mapa, /etc/auto.nfs, mówi, co pod jaką nazwą montować:

wspolne  -rw  192.168.1.10:/srv/nfs/wspolne
sudo systemctl enable --now autofs
ls /mnt/nfs
ls /mnt/nfs/wspolne

I tu jest magia, która na początku wygląda jak błąd. ls /mnt/nfs pokazuje pusty folder. Nie ma tam żadnego wspolne. Ale wpisujesz ls /mnt/nfs/wspolne i jest. To drzwi, których nie widać, dopóki pod nie nie podejdziesz. Sprawdziłem to na swojej maszynie z mapą wskazującą lokalny folder:

TARGET              SOURCE                     FSTYPE
/mnt/auto           /etc/auto.c60              autofs
`-/mnt/auto/wspolne /dev/vda[/srv/nfs/wspolne] ext4

Na górze strażnik autofs, pod nim zamontowany udział, dokładnie w chwili, kiedy w niego wszedłem.

Najczęstszy przypadek z egzaminów i z życia: foldery domowe użytkowników na serwerze NFS. Jedna linijka obsługuje wszystkich:

*  -rw  192.168.1.10:/home/&

Gwiazdka znaczy „dowolna nazwa”, a & wstawia tę nazwę w ścieżkę. Wchodzisz do ania, montuje się /home/ania. Wchodzisz do bartek, montuje się /home/bartek. Na mojej maszynie dokładnie tak się stało: dwa wejścia, dwa osobne montowania.

A --timeout=60 to czas w sekundach, po którym nieużywany udział się odmontowuje. Bez tej opcji obowiązuje wartość z /etc/autofs.conf, na Ubuntu 300 sekund.

iSCSI, czyli dysk na przedłużaczu

NFS i Samba udostępniają pliki. Serwer ma system plików, a Ty prosisz go o konkretny plik. Jak wypożyczalnia: mówisz, którą książkę chcesz, a bibliotekarka ją przynosi.

iSCSI udostępnia cały dysk, surowe bloki. Serwer daje Ci pusty regał, a co na nim postawisz, to Twoja sprawa. Na kliencie widzisz nowy dysk /dev/sdb, robisz na nim partycje, LVM, system plików, jakby był włożony do środka. Tylko kabel do niego jest bardzo długi, bo to sieć. Tak serwery wirtualizacji podpinają macierze dyskowe.

Dwa słowa: target to serwer, który wystawia dysk. Initiator to klient, który go podpina. Każdy ma nazwę w formacie IQN, na przykład iqn.2004-10.com.ubuntu:01:97c8111ad562. Nazwę swojego klienta znajdziesz w /etc/iscsi/initiatorname.iscsi. Port to 3260.

Klient: [Ubuntu] pakiet open-iscsi, [RHEL] iscsi-initiator-utils. Narzędzie to w obu iscsiadm, w trzech krokach:

sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.20
sudo iscsiadm -m node -T iqn.2026-11.pl.firma:dysk1 -p 192.168.1.20 -l
sudo iscsiadm -m session
lsblk

Najpierw pytasz serwer, jakie ma dyski (discovery). Potem logujesz się do wybranego (-l, login). Potem sprawdzasz sesję i w lsblk pojawia się nowy dysk. Wylogowanie to -u. W fstabie taki dysk montujesz z _netdev, jak każdy sieciowy.

Jak to działa pod spodem

Przy NFS program na kliencie robi zwykłe open i read. Jądro widzi, że ścieżka leży na systemie plików nfs, i zamiast pytać dysk, pakuje prośbę w wiadomość sieciową do serwera: „daj mi bajty od 0 do 4096 z pliku X”. Serwer NFS też działa w jądrze, czyta plik ze swojego dysku i odsyła. Klient trzyma kopię w pamięci podręcznej, żeby nie pytać o to samo co chwilę.

Samba działa inaczej: serwer to zwykły program smbd w przestrzeni użytkownika, który dla każdego połączenia uruchamia osobny proces z uprawnieniami zalogowanej osoby. Dlatego uprawnienia linuksowe na folderze dalej obowiązują.

autofs ma dwie części. W jądrze siedzi specjalny system plików autofs, który pilnuje folderu. Kiedy ktoś do niego wchodzi, jądro zatrzymuje ten proces i budzi demona automount, a ten robi zwykłe mount. Proces czeka ułamek sekundy i nawet nie wie, że drzwi przed nim właśnie się otworzyły.

A iSCSI pakuje polecenia SCSI, te same, które normalnie idą kablem do dysku, w pakiety TCP. Jądro klienta tworzy z tego zwykłe urządzenie blokowe, więc wyżej nikt nie wie, że dysk jest w innej szafie.

Ściąga flag

KomendaFlagaCo robi
exportfs-rawczytuje /etc/exports od nowa
exportfs-vpokazuje udostępnienia z pełnymi opcjami
showmount-e SERWERlista udostępnień NFS na serwerze
mount-t nfs / -t cifsmontowanie NFS / SMB
mount-o credentials=PLIKhasło do CIFS z osobnego pliku
fstab_netdevdysk sieciowy, czekaj na sieć
testparmsprawdza smb.conf
smbpasswd-a UŻYTKOWNIKdodaje hasło Samby
smbclient-L SERWERlista udziałów
smbclient//SERWER/UDZIAŁ -U UŻYTKOWNIKwejście do udziału jak przez FTP
auto.master--timeout=Npo ilu sekundach odmontować
iscsiadm-m discovery -t sendtargets -p IPpyta serwer o dyski
iscsiadm-m node -T IQN -p IP -l / -ulogowanie / wylogowanie
iscsiadm-m sessionaktywne sesje

⚠ Typowy błąd

Jedna spacja w /etc/exports:

/srv/nfs/wspolne  192.168.1.0/24 (rw,sync,no_subtree_check)

Widzisz ją? Między adresem sieci a nawiasem. Wygląda niewinnie. A tak na to odpowiada exportfs -v:

exportfs: No host name given with /srv/nfs/wspolne (rw,sync,no_subtree_check), suggest *(rw,sync,no_subtree_check) to avoid warning
/srv/nfs/wspolne
		192.168.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,root_squash,no_all_squash)
/srv/nfs/wspolne
		<world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)

Przeczytaj to powoli. Twoja sieć dostała dostęp tylko do odczytu, bo przy niej nie ma już żadnych opcji. A nawias, który stał osobno, został potraktowany jak wpis dla wszystkich: <world>, cały świat, z zapisem. Dokładnie odwrotnie, niż chciałeś. Jak ochroniarz, który zrozumiał „wpuszczaj tylko pracowników” jako „pracowników tylko patrzeć, a wszystkich innych wpuszczać”.

Naprawa: usunąć spację, exportfs -ra i zawsze, ale to zawsze, czytać exportfs -v po każdej zmianie. Ostrzeżenia w pierwszej linijce nie wolno przewinąć.

✎ Zadanie

To ostatnie zadanie modułu o dyskach, więc składa w całość to, co było w kilku lekcjach:

Na maszynie wirtualnej dodaj nowy dysk 1 GB. Zrób na nim LVM (PV, VG, LV na 500 MB), system plików ext4, zamontuj na stałe w /dane przez UUID w /etc/fstab, sprawdź mount -a, zrestartuj i sprawdź, że wstało. Potem powiększ LV o 200 MB razem z systemem plików.

Pokaż rozwiązanie

Zadanie było grube: nowy dysk, LVM, system plików, montowanie na stałe, restart i powiększanie. Lecimy po kolei. Najpierw: jak się nazywa nowy dysk?

lsblk

Szukasz dysku 1 GB bez partycji i bez punktu montowania. W VirtualBoxie to zwykle /dev/sdb, na KVM /dev/vdb. Sprawdź dwa razy. Pomyłka o jedną literkę i formatujesz dysk z systemem. To jak pomylić pokój 12 z pokojem 13 i wymalować cudzy gabinet na różowo.

sudo pvcreate /dev/sdb
sudo vgcreate vgdane /dev/sdb
sudo lvcreate -n lvdane -L 500M vgdane
sudo mkfs.ext4 /dev/vgdane/lvdane
sudo mkdir /dane
sudo blkid -s UUID -o value /dev/vgdane/lvdane

Regały na kółkach z lekcji o LVM: pvcreate oznacza dysk jako materiał na regały, vgcreate składa z niego magazyn, lvcreate wydziela w magazynie regał na 500 MB. Ostatnia komenda wypisuje sam UUID, czyli numer seryjny systemu plików. U mnie:

0ab65a5a-2691-4791-9928-5ccdd3ed07a4

Ten numer wpisujesz do /etc/fstab, najlepiej przez sudo nano /etc/fstab, jedną linijką na końcu:

UUID=0ab65a5a-2691-4791-9928-5ccdd3ed07a4  /dane  ext4  defaults  0  2

I teraz najważniejsze: sprawdzamy przed restartem, nie po.

sudo systemctl daemon-reload
sudo findmnt --verify
sudo mount -a
findmnt /dane

findmnt --verify czyta fstab i marudzi, jeśli coś się nie zgadza. mount -a montuje wszystko z fstaba, czego jeszcze nie ma. daemon-reload jest po to, żeby systemd przeczytał zmieniony fstab, bo on z niego robi sobie własne jednostki montowania. Jeśli findmnt /dane pokazuje Twój wolumin, dopiero wtedy sudo reboot, a po restarcie jeszcze raz findmnt /dane.

Na koniec powiększanie:

sudo lvextend -r -L +200M /dev/vgdane/lvdane
df -h /dane

Plus przed 200M znaczy „dołóż”, a nie „ustaw na”. Bez plusa prosiłbyś o wolumin 200 MB, czyli mniejszy niż masz, i LVM by się zbuntował. A -r to skrót od --resizefs: powiększa od razu system plików. Bez niego regał jest większy, ale półki w środku zostają te same i df dalej pokazuje stary rozmiar.

Jeśli po restarcie maszyna wstała w trybie awaryjnym, to też jest wynik zadania. Po prostu z modułu o naprawianiu systemu.

Co dalej

Dyski mamy opanowane, ale na pustych dyskach nic nie działa. Trzeba coś zainstalować. W następnej lekcji zaczynamy moduł o oprogramowaniu: menedżery pakietów, czyli hurtownia z kurierem, i to we wszystkich ważnych rodzinach Linuksa, od apt i dnf po pacman i apk.