Bieda-NAS i druga młodość routera WiFi

Jakież było moje zdziwienie, gdy podczas porządków w okolicach domowego routera WiFi odkryłem, że posiada on port USB. Zdziwienie tym większe, że w oryginalnym oprogramowaniu do tego sprzętu nie znalazłem ani słowa o tym, do czego ten port USB mógłby się przydać. Router położony jest w takich okolicach, że podłączenie do niego lampki na USB jest mało adekwatne, a apetyt rośnie w miarę jedzenia. Bo skoro USB, to mam dyski na USB, pendrive’y i inne gadżety. Machinalnie przyszło mi do głowy wpięcia tam jednego z penrive’ów i zrobienia z niego podręcznego i zawsze widocznego lokalnego zasobu sieciowego, gdzie lądowałyby Ważne Pliki dostępne od ręki, niezależnie od akurat włączonego i używanego w domu komputera. Po nitce do kłębka i doszedłem do wniosków i decyzji, że mój AirRouter przejdzie pod kontrolę systemu OpenWrt, czyli Linuksa spreparowanego pod sprzętowe routery WiFi. A ja tym samym uzyskam kontrolę nad portem USB i ziszczą się tym samym sny o NAS.

Na początku jednak ostrzeżenie – poniższe wywody dotyczą dość istotnej ingerencji w oprogramowanie routera, zatem jeżeli ktoś nie czuje się na siłach, by w razie problemów przywrócić routerowi oryginalne oprogramowanie, powinien zająć się czymś pożyteczniejszym niż lektura tego wpisu.

1. Siostro, skalpel, czyli potrzebne komponenty

Koncepcja powyższa opiera się o obsługiwany przez OpenWrt sprzętowy router WiFi posiadający port USB, dowolny dysk USB lub pendrive, jak też odpowiedni stopień samodesperacji. Zanim zatem przystąpimy do prac, należy się upewnić, że nasz router posiada rzeczony port oraz widnieje na liście urządzeń wspieranych przez OpenWrt. Jeżeli go tam nie ma, istnieje szansa, że jednak są dostępne dla niego aktualne…

obrazy bin (wersja Attitude Adjustment RC1)

… lub jeszcze aktualniejsze…

snapshoty (najświeższe kompilacje)

(wymagana świadomość zaszytego w urządzeniu procesora lub wyszukiwania po nazwie). Po namierzeniu wymaganych plików dla naszego urządzenia, pobieramy te o nazwach:

*-squashfs-factory.bin
*-squashfs-sysupgrade.bin

(np. dla mojego AirRoutera i wydania OpenWrt Attitude Adjustment są to pliki openwrt-ar71xx-generic-ubnt-airrouter-squashfs-factory.bin oraz openwrt-ar71xx-generic-ubnt-airrouter-squashfs-sysupgrade.bin).

Te pliki to nic innego jak system OpenWrt, który wgramy na nasz router. Warto przed tym krokiem uzbroić się na wszelki wypadek w oryginalne firmware ze strony producenta (zawsze będzie można go wgrać za pomocą tftp). JEŻELI WIEMY CO ROBIMY i jesteśmy tego pewni, przystępujemy do zamiany systemu. W opcjach routera wybieramy aktualizację oprogramowania i wybieramy najpierw plik *-factory.bin. Po jego wgraniu i zaktualizowaniu się sprzętu, musimy zalogować się ponownie (UWAGA – router będzie działał na ustawieniach domyślnych – adres IP 192.168.1.1, login/hasło – root/puste hasło) i tym razem tym samym sposobem (ale już za pomocą nowego systemu OpenWrt) przesłać do urządzenia plik *-sysupgrade.bin.

2. Na nowych śmieciach

Ponieważ nasz router został wyczyszczony z ustawień, nie mamy innego wyjścia, jak ustawić go sobie ponownie (wireless, lan, dhcp, firewall, itp.). Najlepiej i najszybciej można to zrobić przez interfejs WWW, jeżeli nie chcemy od razu zapuszczać się na głębokie wody konfigurowania OpenWrt z poziomu linii komend. Do dalszych działań najistotniejsze jest aktywowanie dostępu SSH poprzez System -> Administration. Wszystko w celu… Obsługi routera z poziomu linii komend. Bowiem teraz się zacznie…

Założenia są takie – mając dostęp do usług i zasobów routera, możemy sobie teraz uruchomić co tylko zechcemy. Jednak większość routerów posiada nikczemną ilość pamięci – 4/8MB i to w takiej objętości musielibyśmy się zmieścić z danymi naszego NASa. To oczywiście niewiele, ale jeżeli komuś to wystarczy, może opuścić następne punkty. A jak zwiększyć powierzchnię nośną routera?

W ogromnym i aroganckim skrócie – struktura systemu plików OpenWrt (podyktowana specyfiką pamięci routera) jest taka, że nas interesuje zapisywalny katalog /overlay, w którym znajdują się ustawienia, instalowane pakiety i inne. To te dane przeniesiemy na nowy nośnik i podmontujemy go pod /overlay. I tym samym będzie nam dane instalować pakiety do woli, oraz wydzielić katalog na nasze dane. Ale o tym za chwilę.

3. Almanach kodów tajemnych

Po zalogowaniu się na router poprzez SSH rozpoczynamy instalowanie pakietów potrzebnych do obsługi USB, oraz wdrażanie pendrive’a (w moim przypadku) do konfiguracji systemu. Poznajemy też pierwsze polecenie specyficzne dla OpenWrt – opkg (odpowiednik apt-get):

# opkg update
# opkg install kmod-usb-core kmod-usb-uhci kmod-usb-storage kmod-usb2 kmod-fs-ext4 block-mount hotplug2

Wpinamy pendrive, resetujemy router (choć z hotplug2 może to nie będzie konieczne). Za pomocą np. polecenia blkid upewniamy się, że system widzi pendrive (lub cat /proc/bus/usb/devices). Montujemy w tymczasowe miejsce partycję przeznaczoną na główną (W moim przypadku na nośniku znajdowała się jedna jedyna partycja ext4) i kopiujemy z /overlay dane routera:

# mount /dev/sda1 /mnt
# cp -ar /overlay/* /mnt/
# umount /mnt

Jeżeli kopiowanie się powiodło, teraz zapniemy pendrive pod /overlay – w tym celu przerobimy bazowy plik fstab. Zanim to zrobimy, słowo wyjaśnienia – oryginalne ustawienia routera nie zginą po wpięciu pendrive, a po jego wypięciu router uruchomi się z ustawieniami sprzed zmapowania pendrive pod /overlay. A tak w ogóle – poznamy kolejne polecenie, uci:

# uci set fstab.@mount[0].target=/overlay
# uci set fstab.@mount[0].device=/dev/sda1
# uci set fstab.@mount[0].fstype=ext4
# uci set fstab.@mount[0].options=rw,noatime
# uci set fstab.@mount[0].enabled=1
# uci commit fstab
# /etc/init.d/fstab enable
# reboot

Router się zresetuje, a my sprawdzamy czy mamy zamontowane /dev/sda1 tam gdzie trzeba:

# mount
...
/dev/sda1 on /overlay type ext4 (rw,noatime,user_xattr,barrier=1,data=ordered)

To działa!

4. Usługi na usługach

Nasz pendrive w systemie jest widoczny, system z niego korzysta, czas na kolejne etap zabawy. Ponieważ OpenWrt jest zbudowany jak normalny Linux, to osobom z nim zaznajomionym nie powinien sprawić większego problemu. Czas teraz na uzyskanie dostępu do pendrive z zewnątrz – abyśmy mogli na nim zapisywać dane i odczytywać. W roli poprawnie może spisać się np:

  • Chmura – czyli OwnCloud. Do tego celu potrzebujemy na routerze serwera HTTP (w tej roli Lighttpd) z obsługą PHP (w tej roli php5-cgi). Niestety, rozwiązanie to działało ślamazarnie, z racji ilości pamięci jaką dysponuje mój router (32MB) i ilością modułów php wymaganych przez OwnCloud,
  • Samba – jeżeli ktoś ma zacięcie do jej konfigurowania, jej użycie będzie jak najbardziej na miejscu,
  • NFS – czyli nieco zapomniany Network File Server, endemiczny protokół uniksowy. Z racji prostoty konfiguracji i wydajności to właśnie z nim powiązałem dalsze dzieje mojego Bieda-NASa.
  • W OpenWrt mamy do dyspozycji serwer unfs3 i to jego wykorzystamy:

    # opkg update
    # opkg install unfs3

    Teraz musimy jeszcze stworzyć i wskazać miejsce udostępniane przez unfs3:

    # mkdir /mnt/nfs

    W pliku /etc/exports umieszczamy:

    /mnt/nfs (rw,all_squash,insecure)

    Odpalamy i aktywujemy (aby uruchamiały się wraz z systemem) usługi:

    # /etc/init.d/portmap start
    # /etc/init.d/unfs3 start
    # /etc/init.d/portmap enable
    # /etc/init.d/unfs3 enable

    Czas na komputer stacjonarny, który będzie miał dostęp do tych zasobów. Konieczne w tym celu jest zainstalowanie paczki nfs-common i pierwsze montowanie możemy przeprowadzić ręcznie:

    sudo mkdir /home/_wspolny_
    sudo chmod 777 /home/_wspolny_
    sudo mount.nfs -t nfs 192.168.1.1:/mnt/nfs /home/_wspolny_

    192.168.1.1 to oczywiście numer IP naszego routera. Każdy użytkownik może sobie łatwo dodać katalog /home/_wspolny_ do ulubionych w swoim menadżerze plików. Aby zasób był montowany zawsze przy starcie systemu, w przypadku np. openSUSE, wystarczy uruchomić Yasta i odnaleźć Usługi Sieciowe -> Klient NFS. W Ubuntu (?) i Mincie trzeba posiłkować się ręcznym edytowaniem pliku /etc/fstab i montowaniem zasobu przy starcie systemu – dodajemy taką linijkę:

    192.168.1.1:/mnt/nfs /home/_wspolny_ nfs vers=3,bg 0 0

    Parametr ‘vers=3’ odpowiada za wymuszenie NFS3 (unfs3 tylko w takiej wersji się komunikuje), ‘bg’ wymusza montowanie zasobów w tle, dzięki czemu nie wstrzymuje startu systemu.

    5. Mowa końcowa

    Jak widać, powyższe rozwiązanie jest dość karkołomne, lecz po opanowaniu detali porozumiewania się z OpenWrt zupełnie wykonalne. Samo instalowanie OpenWrt i przepinanie systemu na pendrive’a wykonałem w pół godzinki (łącznie z szukaniem wskazówek po sieci). Stareńki pendrive którego wpiąłem u siebie do portu USB2.0 (wg. danych producenta), podczas testowania poleceniem hdparm wykazuje się osiągami na poziomie 10 – 12MB/s transferu. Nie jest to może demon prędkości, lecz do moich zastosowań wystarcza. Również strumieniowanie jednego pliku video/audio nie nastręcza żadnych problemów (przy większej ilości korzystających mogą się pojawić problemy). Należy mieć na względzie fakt, że takie rozwiązanie zdecydowanie nie zastąpi dedykowanego serwera NAS, ale gra jest warta świeczki, gdy i wymagania mamy mniejsze.

    Linki:
    OpenWrt Wiki
    OpenWrt, Linux, USB, notebooki i inne ciekawe rzeczy
    Polska strona poświęcona OpenWrt