OpenWrt - HDD/USB/SDMOD
Montowanie zasobów dyskowych w OpenWrt
Ostatnia zmiana: 2013-05-14 16:40

1. Obsługa USB
2. Nazewnictwo partycji
3. Montowanie zasobów
 3.1. Sekcja automount
 3.2. Sekcja autoswap
 3.3. Sekcja mount
 3.4. Sekcja swap
4. Sprawdzanie systemu plików
5. Zakończenie
6. Przykłady montowania systemów plików
 6.1. Montowanie ext3
 6.2. Montowanie vfat
 6.3. Montowanie ntfs
 6.4. Montowanie HFS+
7. Uruchamianie serwisu przy podłączeniu dysku


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 nasz ruter ma wbudowany dysk twardy). Natomiast nie zadziała to z zasobami sieciowymi (np. nfs czy cifs).

UWAGA1: Nie wolno odłączać nośnika podczas pracy rutera! Ruter musi być wyłączony przed wyjęciem urządzenia z USB lub należy wcześniej odmontować zasoby.
UWAGA2: 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.
UWAGA3: Ten mechanizm działa tylko dla urządzeń blokowych, takich jak dyski, karty 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. Poniższe dane są prawdziwe dla wydania 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

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

    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://ecco.selfip.net/projekty/60-services -O /etc/hotplug.d/block/60-services 

Rozwiązanie to działa w wydaniu Attitude Adjustment.