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).

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:

  • ext2/ext3/ext4


    # opkg install kmod-fs-ext4 (obsługuje on zarówno ext2, ext3 jak i ext4)


  • FAT16/FAT32


    # opkg install kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1


  • NTFS


    # opkg install ntfs-3g


  • exFAT


    # opkg install exfat

(tylko dla moich wersji firmware)

  • HFS+


    # 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.

  • Swap w postaci partycji
Jeżeli wcześniej zadbaliśmy o odpowiedni podział dysku i mamy wolną partycję, można z niej zrobić swap poleceniem


    # mkswap /dev/sda2

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


  • Swap w postaci pliku
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


    # swapon /hdd/swap

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


  • Montowanie ext3


    config mount
        option target /mnt/dysk
        option device /dev/sda1
        option fstype ext3
        option options rw,noatime
        option enabled 1


  • Montowanie vfat


    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


  • Montowanie HFS+


    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


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.