Montowanie zasobów dyskowych w OpenWrt
Ostatnia zmiana: 2017-12-04 22:57
OpenWrt od wersji 8.09 standardowo posiada obsługę montowania zasobów dyskowych. Jeżeli chcemy podłączyć dysk na USB (pendrive, dysk zewnętrzny itd) to ten poradnik opisuje właśnie to rozwiązanie. Poniższe wskazówki działają także z SDMOD lub dyskiem (o ile router ma wbudowany dysk twardy).
Nie wolno odłączać nośnika podczas pracy rutera! Router musi być wyłączony przed wyjęciem urządzenia z USB lub należy wcześniej odmontować dysk.
Dyski zasilane tylko z USB (2,5") mogą nie działać z racji większego zapotrzebowania na energię. Należy w takich przypadkach użyć zewnętrznego zasilanego huba USB.
Ten mechanizm działa tylko dla urządzeń blokowych, takich jak dyski, karty SD, czytniki czy pendrive. Nie działa dla zasobów sieciowych typu cifs lub nfs.
Założenia - nośnik (dysk, pendrive) ma jedną lub więcej partycji, może mieć także swap.
Attitude Adjustment
Obsługa USB
# opkg update
# opkg install kmod-usb-core kmod-usb2 kmod-usb-storage
# opkg install block-mount
Jeżeli w systemie nie ma jeszcze pakietów od obsługi USB to należy je zainstalować. W zależności od sprzętu może okazać się także zainstalowanie pakietu
kmod-usb-uhci-iv,
kmod-usb-uhci lub
kmod-usb-ohci. W przypadku niektórych mostków usb<>ide może okazać się koniecznie zainstalowanie także pakietu
kmod-usb-storage-extras. Po instalacji niezbędne będzie wykonanie restartu urządzenia.
Dodatkowo należy zainstalować odpowiednie pakiety do obsługi systemów plików:
# opkg install kmod-fs-ext4 (obsługuje on zarówno ext2, ext3 jak i ext4)
# opkg install kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1
(tylko dla moich wersji firmware)
# opkg install kmod-fs-hfsplus kmod-nls-utf8
(
block-mount z BB nie potrafi montować automatycznie partycji ntfs czy exfat)
Nazewnictwo partycji
Partycje dysku widoczne są pod nazwą
/dev/sdaX gdzie X to numer odpowiedniej partycji, czyli partycja pierwsza widoczna jest pod nazwą np.
/dev/sda1.
Jeżeli podłączone zostanie więcej dysków może zmienić się litera dysku (
sdX). Jak będzie widoczny dany dysk można przekonać się wydając polecenie
logread po podłączeniu nośnika.
Montowanie zasobów
Jak to działa: przy starcie systemu, o ile zainstalowany jest pakiet
block-mount, montowane są wszystkie partycje które są zdefiniowane w sekcjach
mount oraz mają ustawione
enabled na 1. Więc to sprawdzi się dla dysku ide czy karty SD. Jeżeli w czasie działania systemu podłączymy nośnika na USB to najpierw sprawdzane są sekcje
automount i
autoswap czy należy montować partycje. Jeżeli tak - odszukiwana jest odpowiednia sekcja
mount czy
swap na podstawie urządzenia i montowana jest partycja. Jeżeli takiej nie ma - o ile ustawione są odpowiednie opcje partycja montowana jest z domyślnymi parametrami.
Odpowiada za to plik
/etc/config/fstab. Podzielony jest na kilka sekcji które definiują zachowanie się podsystemu:
Sekcja automount
config global automount
option from_fstab 1
option anon_mount 1
Pierwsza opcja,
from_fstab, jeżeli jest ustawiona na 1 oznacza że zostaną sprawdzone sekcje
mount w celu zamontowania nośnika wg parametrów w nich zawartych (patrz dalej).
Druga opcja,
anon_mount, jeżeli jest ustawiona na 1 oznacza że nośnik zostanie zamontowany automatycznie nawet jeżeli nie ma go zdefiniowanego w sekcji
mount. Czyli zwykły mechanizm hotplug - wkładamy pendrive i jest on montowany z domyślnymi opcjami w katalogu
/mnt pod nazwą dysku i numerem partycji czyli np.
sda1.
Sekcja autoswap
config global autoswap
option from_fstab 1
option anon_swap 0
Podobnie jak w poprzednim przypadku - pierwsza opcja oznacza że będzie podłączony swap definiowany w sekcji
swap tego pliki. Druga - każda inna partycja swap może być automatycznie widziana przez system. Z reguły nie ustawia się drugiej opcji gdyż może powodować komplikacje przy nagłym usunięciu nośnika.
Sekcja mount
config mount
option target /home
option device /dev/sda1
option fstype ext4
option options rw,noatime
option enabled 1
option enabled_fsck 1
Opcje:
- target: miejsce montowania partycji (utworzy się samodzielnie jeżeli nie ma tego katalogu)
- fstype: typ systemu plików
- options: opcje montowania, mogą być specyficzne dla danego systemu plików
- enabled: 1 - sekcja włączona
- enabled_fsck: 1 - jeżeli został zainstalowany pakiet
e2fsprogs to przy starcie rutera zostanie wykonane także sprawdzenie systemu plików (dotyczy ext2/ext3/ext4).
Dysk można zidentyfikować na trzy sposoby:
- przez UUID (
option uuid): unikalny identyfikator, więc tylko ten dysk/partycja będzie wykorzystana do tego celu (do odczytania przez program
blkid)
- przez etykietę (
option label): można posiadać wiele nośników z różnymi konfiguracjami, jeżeli tylko będzie miał odpowiednią etykietę to będzie wykorzystany
- przez nazwę urządzenia (
option device): każdy podłączony nośnik, o ile oczywiście ma odpowiedni system plików, będzie wykorzystany
Jeżeli używamy klika fizycznych nośników to należy podawać uuid lub label, bo nazwa urządzenia może się zmienić w zależności od kolejności wykrywania urządzeń przez system. Sekcji
mount należy zrobić tyle, ile chcemy montować partycji w określonym miejscu. Jeżeli nie zrobimy sekcji
mount to partycja może być zamontowana automatycznie jeżeli jest ustawiona opcja
anon_mount.
Sekcja swap
Niezależnie od nośnika (karta SD, dysk USB czy pendrive) można utworzyć tzw.
swap. Swap pomaga przy pracy wielu zasobożernych programów jak klienci torrentów.
Jeżeli wcześniej zadbaliśmy o odpowiedni podział dysku i mamy wolną partycję, można z niej zrobić swap poleceniem
zakładając że
/dev/sda2 to właśnie wolna partycja. Partycja powinna być typu 82 (Linux swap).
Konfiguracja to dodanie odpowiedniego zapisu w
/etc/config/fstab
config swap
option device /dev/sda2
option enabled 1
Jeżeli nie mamy wolnej partycji można zrobić swap w pliku. W tym celu wydajemy polecenie
# dd if=/dev/zero of=/hdd/swap count=262144
# mkswap /hdd/swap
Wcześniej
musi być zamontowany dysk w /hdd. Powyższe polecenie zrobi swap o wielkości 128MB (liczba 262144 to ilość bloków po 512 bajtów czyli 128MB).
Konfiguracja w
/etc/config/fstab
config swap
option device /hdd/swap
option enabled 1
Swap w pliku jest wolniejszy, ale skuteczny jak nie mamy wolnej partycji.
Ręczne montowanie swapa w miarę potrzeby to
Sprawdzanie systemu plików
Jeżeli na dysku pojawią się błędy można sprawdzić system plików. PRZED sprawdzeniem należy koniecznie odmontować nośnik. Jeżeli dysk jest dużej pojemności może zabraknąć pamięci podczas sprawdzania systemu plików, dlatego też warto wcześniej zamontować swap (tylko jeżeli swap jest na partycji a nie jako plik w sprawdzanym dysku). Całe polecenie może wyglądać następująco (należy wcześniej zainstalować pakiet
e2fsprogs, w pamięci rutera, nie na zewnętrznym nośniku!)
# umount /dev/sda1
# e2fsck -y /dev/sda1
Sprawdzanie dla dysku 500GB z błędami może trwać ok 30 minut, więc należy uzbroić się w cierpliwość i nie przerywać polecenia, nie restartować rutera i nie odłączać dysku. Wymaga także dostatecznej ilości wolnej pamięci RAM. Jeżeli mamy bardzo duży dysk, to sprawdzenie go mając 32MB ramu może się nie udać.
Zakończenie
Odpowiednie montowanie zasobów można też
wyklikać korzystając z gui LuCI. Zobacz także
extroot w którym opisano metodę formatowania partycji oraz przeniesienia systemu plików na zewnętrzny nośnik (jeżeli np. brakuje miejsca we flash).
Przykłady montowania systemów plików
config mount
option target /mnt/dysk
option device /dev/sda1
option fstype ext3
option options rw,noatime
option enabled 1
config mount
option target /mnt/dysk
option device /dev/sda1
option fstype vfat
option options rw
option enabled 1
- Montowanie z udostępnieniem katalogów dla wszystkich (vfat nie obsługuje uprawnień!)
config mount
option target /mnt/dysk
option device /dev/sda1
option fstype vfat
option options 'rw,umask=0,dmask=0'
option enabled 1
- Montowanie ntfs (nie dotyczy BB)
config mount
option target /mnt/dysk
option device /dev/sda1
option fstype ntfs-3g
option options rw
option enabled 1
config mount
option target /mnt/dysk
option device /dev/sda1
option fstype hfsplus
option options ro
option enabled 1
HFS+ z kroniką montowane jest w tryb odczytu. Jeżeli chcemy mieć zapis należy albo wyłączyć kronikę na tym nośniku (do wykonania z poziomu MacOS) lub dodać opcję
force (option options 'rw,force'), ale na własne ryzyko.
Uruchamianie serwisu przy podłączeniu dysku
Działanie niektórych serwisów ma sens, jeżeli jest podłączony nośnik, np
minidlna lub
Transmission. W
moich obrazach możliwe jest teraz uruchamianie usług po podłączeniu dysku i ich zatrzymanie po odłączeniu (skrypt dostępny jest na forum openwrt.org). Serwis należy zainstalować i nie uruchamiać go po starcie systemu:
# opkg install minidlna vsftpd
# /etc/init.d/minidlna disable
# /etc/init.d/vsftpd disable
A następnie w sekcji /etc/config/fstab należy zdefiniować listę
service, np.
config 'mount'
option 'enabled' '1'
option 'device' '/dev/sda1'
option 'target' '/mnt/sda1'
option 'fstype' 'vfat'
option 'options' 'rw'
list 'service' 'minidlna'
list 'service' 'vsftpd'
Wartość tych opcji to nazwa skryptu który musi być w katalogu
/etc/init.d. Po zamontowaniu wykonywania jest akcja "/etc/init.d/<skrypt> start", po usunięciu nośnika "/etc/init.d/<skrypt> stop". Po takiej konfiguracji podane programy (w tym przykładzie: minidlna, vsftpd) uruchomią się dopiero po podłączeniu dysku. Dzięki temu można także zrobić i uruchomić swój własny skrypt, który wykona się po zamontowaniu nośnika. Działa to zarówno dla opcji
device jak i
uuid, jednakże dla tej drugiej opcji (
uuid) nie nastąpi zakończenie serwisu po odłączeniu nośnika (ponieważ go już nie ma to nie ma jak sprawdzić uuid nośnika). Uruchamianie może nie zadziałać dla dysków podłączonych na stałe do routera z zainstalowanym pakietem
block-mount - w tym przypadku wykrywanie partycji wykonywane jest wcześniej niż jest uruchomiony podsystem hotplug, więc po prostu nie zachodzą te zdarzenia.
Aby uzyskać tą funkcjonalność należy do systemu pobrać dodatkowy skrypt:
# wget http://dl.eko.one.pl/projekty/60-services -O /etc/hotplug.d/block/60-services
Rozwiązanie to działa w wydaniu Attitude Adjustment.
Barrier Breaker i późniejsze wydania
Nowe wydanie OpenWrt przynosi lekko zmodyfikowany podsystem montowania - zmieniła się składnia pliku konfiguracyjnego, skrypty zostały zastąpione programem
block. BB/CC nie montuje też domyślnie zasobów. Obsługę USB i systemów plików należy zainstalować identycznie jak to było dla wydania AA, czyli np:
# opkg update
# opkg install kmod-usb-core kmod-usb2 kmod-usb-storage
# opkg install block-mount
# opkg install kmod-fs-ext4 # obsługuje zarówno ext2, ext3 jak i ext4
# opkg install kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1
Dla niektórych interfejsów usb może być konieczne zainstalowanie dodatkowych pakietów:
# opkg install kmod-usb-storage-extras kmod-usb-storage-uas
Pakiet
kmod-usb-storage-uas dostępny jest od wydania LEDE.
Składnia pliku konfiguracyjnego
/etc/config/fstab jest trochę inna (jeżeli go nie ma należy go wygenerować poleceniem
block detect > /etc/config/fstab):
config 'global'
option anon_swap '0' # montuje swap który nie ma swojej sekcji konfiguracyjnej
option anon_mount '0' # montuje partycje które nie ma swojej sekcji konfiguracyjnej
option auto_swap '1' # automatycznie montuje swap ze zdefiniowanych sekcji, o ile jest włączona
option auto_mount '1' # automatycznie montuje partycje ze zdefiniowanych sekcji, o ile jest włączona
option delay_root '5' # opóźnienie na starcie systemu przy oczekiwaniu na montowanie partycji root
option check_fs '0' # uruchamianie sprawdzania systemu plików przed montowaniem
Aby system samodzielnie montował podłączony nośnik bez podawania jakiegokolwiek polecenia należy ustawić opcję
anon_mount na
1, czyli:
# uci set fstab.@global[0].anon_mount=1
# uci commit
Pakiet block-mount z BB/CC nie montuje wszystkich systemów plików - w szczególności nie zamontuje automatycznie dysków z systemem plików NTFS.
Jeżeli chcemy dodać
zdefiniowaną sekcję specyficzną dla danej partycji można wykonać to poleceniem (mając podłączony dysk):
# block detect > /etc/config/fstab
Wygeneruje to konfigurację typu:
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
config 'mount'
option target '/mnt/sda1'
option uuid 'f6da8132-0199-4264-87b1-c52b2b4298d6'
option enabled '0'
Należy teraz sekcję włączyć (enabled przestawić na 1), ew. zmienić target na docelowe miejsce montowania, np.
# uci set fstab.@mount[0].target=/tmp/dysk
# uci set fstab.@mount[0].enabled=1
# uci commit
Ponowne podłączenie nośnika powoduje zamontowanie go w tym przypadku w katalogu
/tmp/dysk. Oczywiście wymagane zmiany można wykonać także przy pomocy zwykłego edytora tekstowego np.
vi.