Raspberry Pi jako domowy serwer plików – nie ma się czego wstydzić
Na początku trzeba powiedzieć sobie otwarcie – Raspberry Pinie jest idealnym komputerkiem do budowy dysku sieciowego (NAS). Brak jej kontrolera SATA, wszystkie złącza USBi gniazdo Ethernetu zmuszone są do współdzielenia pojedynczego,półdupleksowego kontrolera USB 2.0 (tylko 480 Mbit/s), a zasilaniejest słabe. Czemu więc w ogóle próbować? Odpowiedź jest prosta:Raspberry Pi jest tanie i cieszy się świetnym wsparciemspołeczności. Jak zaś pokażemy, w zastosowaniach czysto domowychmoże być całkiem dobrym NAS-em. Podpinając do niego nawet zwykły,tani dysk twardy 2,5” ze starego laptopa uzyskamy sprzętwystarczający do tego, by np. strumieniować filmy w rozdzielczościFullHD – wystarczy jedynie Malinę odpowiednio skonfigurować.
Zasilanie: pół ampera to za mało
Pierwszym problemem, z jakim się spotkacie przy próbiepodłączenia do Raspberry Pi zewnętrznego dysku, będzie jegozasilanie. W wypadku dysków 3,5” nie ma co się spodziewać, żeMalina sobie z nimi poradzi, kieszenie na takie zewnętrzne dyski itak są zresztą oferowane z własnymi zasilaczami. Wydawałoby się,że wypadku dysków 2,5” takich problemów nie będzie – w końcupo podpięciu ich do peceta zazwyczaj działają bez problemu. Jednakw standardowej konfiguracji Raspberry Pi oferuje na USB 2.0 zaledwie0,6 A – za mało, by obsłużyć taki dysk twardy.
W niniejszym artykule udział wzięły:
- Raspberry Pi 2 Model B
- chińska ładowarka microUSB 5 V 2,1 A
- przejściówka JMicron JM20329 SATA-USB Bridge
- Dysk twardy Western Digital WD5000BPKT
Rozwiązania są dwa. Pierwsze sprzętowe, polega na wykorzystaniuaktywnego huba USB 2.0. Przeznaczony specjalnie do Raspberry Pi hubPiHut pozwala na podłączenie nawet siedmiu urządzeń USB ikosztuje ok. 65 zł. Zaletą tego rozwiązania jest to, że w tensposób podłączyć będziemy mogli więcej niż jeden dysk iskonfigurować software'ową macierz RAID. Wadą – oczywiściecena, oraz zwiększenie plątaniny kabli, hub ma oczywiście swójwłasny zasilacz. Jeśli zamierzacie podłączyć po prostu jedenzewnętrzny dysk przez mostek USB-SATA, poradzić sobie można i bezaktywnego huba.
W tym celu zaczniemy (na wszelki wypadek od aktualizacji firmwareMaliny. Po uruchomieniu Raspbiana, w teminalu wydajemy polecenie sudorpi-update, a gdy zakończy pracę, sudo reboot. Po restarcie musimyprzeedytować plik konfiguracyjny config.txt. Wydajemy więcpolecenie sudo nano /boot/config.txt, dodając tam linijkę
max_usb_current=1
Opcja ta nie działała w starszych wersjach firmware (trzeba byłoustawiać wtedy konfigurację szyny GPIO). Jeśli wiecie, że macienajnowszą wersję, możecie oczywiście aktualizację pominąć. Porestarcie (sudo reboot) i podłączeniu dysku po USB, powinien on sięuaktywnić.
Jeśli się nie uaktywnił, należy sprawdzić stan pinu 38szyny, wydając polecenie gpio -g read 38. Jeśli w wyniku otrzymamy1, to znaczy, że natężenie prądu jest wystarczające i problemleży np. w kontrolerze lub dysku. Jeśli w wyniku otrzymamy 0,należy wydać polecenie gpio -g write 38 1. Jeśli i to nie pomoże,najpewniej mamy za słaby zasilacz dla Maliny – sam komputerek możepotrzebować 0,8-1 A, a co dopiero dysk? Telefoniczna ładowarka tu niewystarczy, najlepiej użyć przynajmniej tych tabletowych ładowarek2,1 A.
Gdy usłyszymy charakterystyczny dźwięk uruchamianego dysku,możemy wydać polecenie sudo blkid, by zobaczyć listę wszystkichpodpiętych urządzeń blokowych. W wypadku Raspbiana dysk twardypojawi się na niej na końcu, jako urządzenie /dev/sda1.
Konfiguracja dysku
Pierwszym krokiem powinno być sformatowanie dysku.Najprawdopodobniej taki dysk zewnętrzny będzie już sformatowany wktórymś z windowsowych systemów plików, FAT32 lub NTFS. Co prawdalinuksowy system naszej Maliny może je obsłużyć, ale powiedzmysobie szczerze, ich wydajność jest kiepska. O wiele lepiej będzieskorzystać z natywnych linuksowych systemów plików. Który wybrać?Z przeprowadzonego przez nas porównania, polegającego na kopiowaniupliku 1 GB z karty microSD na zewnętrzny dysk, uzyskaliśmynastępujące wyniki:
FAT32: 21 MB/s (i pamiętajmy o nieobsługiwaniu uprawnieńdostępu) NTFS: 3,7 MB/s (naprawdę źle) EXT4: 28 MB/s XFS: 30 MB/s
Stworzony dawno temu dla stacji roboczych z systemem Irix XFSjest dziś tak dojrzały i wydajny, że wybrano go jako domyślnysystem plików na biznesowej klasy systemu Red Hat Enterprise Linux.Z naszych doświadczeń wynika, że to obecnie najlepszy systemplików do takich zastosowań jak dyski NAS. Jego jedyną wadą jestto, że stosunkowo trudno podpiąć sformatowany w nim dysk dokomputera z Windowsem – dostępne narzędzia obsługują go tylko wtrybie do odczytu. Co robić, Microsoft nigdy sobie nie radził zobsługą innych niż własne systemów plików. Jeśli zależy Wamna wydajności, polecamy więc XFS, jeśli na kompatybilności z„okienkami” – lepiej wybrać EXT4.
Aby zmienić system plików na zewnętrznym dysku, wykrytym jako/dev/sda1, wydajemy polecenie sudo cfdisk. W tej łatwiejszej wużyciu odmianie fdiska wybieramy z menu opcję Type, a następnie zlisty Select Partition Type wybieramy 83 – Linux. Następniezapisujemy zmiany, wybierając Write (i odpowiadajac na pytanie„yes”). O powodzeniu operacji będzie świadczył komunikat Thepartition table has been altered. Z programu wychodzimy przez Quiti bierzemy się do formatowania.
Do sformatowania w systemie EXT4 wykorzystuje się poleceniemkfs.ext4, zaś do sformatowania w systemie XFS – mkfs.xfs. Byskorzystać z tego ostatniego, musimy jednak w Raspbianiedoinstalować pakiet narzędzi XFS, poleceniem sudo apt-get installxfsprogs. Samo formatowanie polega na wydaniu polecenia sudo mkfs.xfs/dev/sda1 -f lub sudo mkfs.ext4 /dev/sda1 -f.
Teraz należy przygotować katalog, pod którym będziezamontowany nasz dysk, poleceniem sudo mkdir /mnt/extdisk (oczywiściezamiast extdisk możecie użyć własnej nazwy). Możemy od razuzałożyć w nim podkatalogi, które będą oferowane jako zasobysieciowe, np. publiczny i prywatny, na hasło – poleceniem mkdir/mnt/extdisk/public && mkdir /mnt/extdisk/files.
Zamontowanie podpiętego dysku zapewni dziś automatycznie system(choć w razie czego można zrobić to ręcznie, poleceniem sudomount /dev/sda1 /mnt/extdisk, ale w sytuacji, gdy chcemy korzystać zMaliny jako NAS-a, trzeba to zrobić tak, by dysk był montowanypodczas startu.
W tym celu zmodyfikujemy tablicę fstab, korzystając zunikatowego identyfikatora nośnika (UUID) – dość długiejszesnastkowej liczby. Zobaczymy ją, wydając polecenie sudo blkid, którewyświetli nam /dev/sda1: UUID="xxxx-xxxx-xxxx". Liczbę kopiujemy do schowka iotwieramy plik fstab poleceniem sudo nano /etc/fstab.
Musimy teraz na końcu dopisać linijkę UUID=xxxx-xxxx-xxxx/mnt/extdisk xfs nofail,defaults 0 0. Po zapisaniu pliku, sprawdzamy,czy konfiguracja jest poprawna poleceniem sudo mount -a. Jeśli niepojawią się informacje o błędach, możemy zrestartować systempoleceniem sudo reboot.
W razie problemów z UUID możemy we wpisie do fstab wykorzystaćnazwę napędu, w powyższym wypadku będzie to /dev/sda1/mnt/extdisk xfs nofail,defaults 0 0. Różnica jest taka, żeużywając UUID mamy pewność, że podłączenie innego nośnikaniczego nie zmieni – system zawsze będzie się odwoływał dokonkretnego dysku o takim identyfikatorze.
Po zrestartowaniu należy ustawić prawa własności i dostępudla domyślnego użytkownika pi, tak by także w przyszłości byłyone zachowane. Zrobimy to poleceniami:
sudo chown -R pi:pi /mnt/extdisk/ sudo chmod -R 775 /mnt/extdisk/ sudo setfacl -Rdm g:pi:rwx /mnt/extdisk/ sudo setfacl -Rm g:pi:rwx /mnt/extdisk/Wydawałoby się, że to już wszystko – a jednak nie. Przyspecyfice pracy NAS nasz dysk zewnętrzny długo nie pożyje, jeślinie damy mu czasem odpocząć. Zrobimy to za pomocą narzędziahdparm. By sprawdzić, czy obsługuje on tryb standby, wydajemypolecenie sudo hdparm -y /dev/sda. Jeśli dysk ucichnie, a w konsolipojawi się komunikat /dev/sda: issuing standby command, towszystko dobrze. Sprawdzamy następnie obsługę buforu zapisu: sudohdparm -I /dev/sda | grep cache. W odpowiedzi powinniśmy uzyskać *Write cache.
Jeśli tak jest, to pozostaje jedynie zmienić na stałekonfigurację w pliku hdparm.conf. W tym celu wydajemy polecenie sudonano /etc/hdparm.conf i dopisujemy na końcu:
/dev/sda Wartość parametru spindown_time pomnożona przez pięć daje nam liczbę sekund:120 oznacza więc 600 sekund, 10 minut. Możecie to oczywiściedowolnie modyfikować.
Jeśli korzystacie ze starego dysku, który nie obsługujestandby ani write cache, możecie skorzystać z narzędzia hd-idle.Autor przetestował hd-idle ze starożytnym dyskiem 30 GB Hitachi,podłączanym przez przejściówkę IDE-USB, więc jeśli macie takstary sprzęt, możecie z nim spróbować. Opisanie tego narzędziawychodzi jednak poza ramy artykułu – praktycznie wszystkiewspółcześnie spotykane dyski powinny działać z hdparm.
Igraszki w sieci (lokalnej)
Mając już skonfigurowane Raspberry Pi z zewnętrznym dyskiem,pozostaje nam udostępnić jego zasoby pamięci masowej w naszejsieci. Tu mamy do dyspozycji dwa rozwiązania – albo skorzystać zsieciowego systemu plików NFS, albo z windowsowego systemu SMB.Każde z nich ma swoje wady i zalety. NFS jest wydajniejsze, bardziejniezawodne i mniej obciąża system, jednak skorzystanie z niego nakomputerach z Windowsem jest dość kłopotliwe. SMB działa jakdziała, ale w środowisku Windows nie powinno być z nim żadnychproblemów.
Jeśli korzystacie więc głównie z Windowsa, wykorzystajcie SMB.Jeśli zaś korzystacie z Maka, na swoim PC zainstalowaliścieLinuksa, czy chcecie strumieniować wideo z Malinki do np.linuksowego odtwarzacza z Kodi, wybierzcie NFS. Oczywiście możnazrobić jedno i drugie.
Samba
Zacznijmy od instalacji i konfiguracji serwera SMB. Na Linuksienosi on nazwę Samba. Instalujemy go poleceniem sudo apt-get installsamba samba-common-bin. Po kilku minutach, w trakcie którychdoinstalowane zostanie jeszcze kilkanaście pakietów, „windowsowa”technologia zagości na Malinie. Konfiguracja Samby znajduje się wpliku /etc/samba/smb.conf. Na początku możemy zmienić tu nazwęgrupy roboczej (domyślnie WORKGROUP), oraz dodać w sekcji [global]wpisy security = user oraz load printers = no.
Zdefiniujemy teraz dwa zasoby SMB, publiczny i dla zalogowanychużytkowników.
[public] comment = Katalog publiczny read only = no locking = no path = /mnt/extdisk/public create mask= 0666 directory mask = 0777 guest ok = yes [Files] comment = Pliki użytkowników path = /mnt/extdisk/files valid users = @users force group = users create mask = 0660 directory mask = 0771 read only = noDla domyślnego użytkownika pi należy teraz zdefiniować hasło,poleceniami sudo touch /etc/samba/smbpasswd && sudo smbpasswd-a pi, a następnie zrestartować serwer Samby poleceniem sudoservice smbd restart. W chwilę później w sieci lokalnej powinniśmyzobaczyć udostępnione zasoby SMB.
Możecie wypróbować zastosowanie optymalizacji ruchu sieciowegoSMB – niektórzy radzą dodać wpis socket_options =TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536. Niestety u nas nieprzyniosło to zauważalnych rezultatów.
NFS
Instalacja NFS jest jeszcze prostsza. Serwer instalujemypoleceniem sudo apt-get install nfs-kernel-server. Następnieotwieramy plik eksportowym, w którym ustalamy ścieżki dostępu iich uprawnienia, poleceniem sudo nano /etc/exports.
Na komputerach z Linuksem i Makach podłączenie się do zasobuNFS wygląda tak samo, jak każdego innego systemu plików. Abyzobaczyć to, co udostępnia host o adresie np. 192.168.1.45,wydajemy polecenie showmount -e 192.168.1.45. Aby podłączyć zasóbnp. pod /mnt/nfs, wydajemy polecenie sudo mount -t nfs 192.168.1.45:/mnt/nfs (albo na Maku wykorzystujemy Findera,który sam ładnie znajduje zasoby NFS). Oczywiście można takiezasoby powiązać na stałe z klientem, na Linuksie modyfikując plik/etc/fstab, a na Maku wykorzystując systemowy Disk Utility. Więcejznajdziecie w dokumentacji – możliwości jest tu bardzo dużo, ichopis wykracza poza ten poradnik. A co z Windowsami? Tu polecamyzainteresować się projektem nekodrive,dzięki któremu zasób NFS będzie widziany przez „okienka” jakolokalny dysk.
Najprostszą metodą udostępnienia całej zawartości /mnt/extdiskbędzie dodanie tam wiersza /mnt/extdisk *(rw,sync) – pozwala onkażdemu klientowi, z dowolnego adresu IP, pisać i czytać zawartośćtego katalogu. Jeśli z kolei chcemy ograniczyć się do własnejsieci lokalnej, możemy spróbować z /mnt/extdisk192.168.10.0/24(rw,sync).
W nawiasach okrągłych podajemy właściwości danego zasobu. rwoznacza prawo do zapisu i odczytu, ro tylko odczytu. sync tobezpieczny tryb synchroniczny, w którym serwer czeka z zakończeniempoprzedniej operacji, async to nieso szybszy i nieco mniej bezpiecznytryb asynchroniczny. W razie problemów z przeszukiwaniempodkatalogów można zastosować opcję no_subtree_check. Opcjaall_squash pozwala zaś ustawiać prawa do pliku na anonimowegoużytkownika, co przydatne jest w publicznych katalogach. Z kompletnąlistą opcji eksportu NFS możecie zapoznać się w dokumentacji.
Teraz pozostaje jedynie wyeksportować konfigurację i uruchomićusługi sieciowe.
sudo exportfs -ra sudo service rpcbind start sudo service nfs-common start sudo service nfs-kernel-server start Wnioski: nie ma się czego wstydzićJak wygląda wydajność naszego prostego serwera plików naRaspberry Pi? Całkiem nieźle, jak na ograniczenia tego sprzętu.Dla kierunku serwer›klient, przy kopiowaniu w sieci lokalnej plikuo rozmiarach ok. 1 GB przez SMB osiągnęliśmy średnio 6,4 MB/s.Korzystając z NFS udało się uzyskać średnio ponad 11 MB/s. Przykopiowaniu klient›serwer udało się uzyskać dla SMB ok. 6,2 MB/s,dla NFS 10,3 MB/s
Przy kopiowaniu katalogu z ok. setką zdjęć JPG z serwerauzyskaliśmy dla SMB ok 6,3 MB/s, dla NFS ok. 8,9 MB/s, w drugąstronę dla SMB 6,3 MB/s, zaś dla NFS 8,8 MB/s.
Biorąc pod uwagę to, że najlepsza teoretyczna przepustowośćdla Ethernetu 100 Mb/s między Raspberry Pi i klientem wynosi 11,8MB/s (teoretyczna – czyli bez jakiegokolwiek narzutu, przybezpośrednim połączeniu kablowym między urządzeniami), wynikuzyskany za pomocą domyślnej konfiguracji NFS jest znakomity.
Uzyskane wyniki dla Samby niekoniecznie świadczą o zawodnościserwera smbd. Problem leży tu bardziej po stronie linuksowegoklienta. Kopiowanie tego samego pliku >1 GB przy użyciu laptopa zWindows 7 przyniosło wyniki na poziomie 8,2 MB/s (z serwera) i 7,7MB/s (na serwer). Wciąż gorzej niż NFS, ale różnica niecostopniała.
Jak widać, w domowych zastosowaniach Raspberry Pi może byćprostym serwerem plików, szczególnie jeśli domowa sieć zrobionajest na Ethernecie 100 Mb/s i/lub Wi-Fi 802.11 g/n. To nie Malinabędzie tu wąskim gardłem, lecz kabelek, którego przepustowośćłatwo wysycić z wykorzystaniem NFS czy strumieniowania mediów poDLNA. Oczywiście dzisiaj standardem jest gigabitowy Ethernet, wtakiej sieci pełnowymiarowy dysk NAS (np. Synology) będzie znacznielepszym wyborem, zarazem jednak znacznie droższym i bardziejenergochłonnym.
Sytuacja jest o tyle ciekawa, że dość łatwo jest polepszyćwyniki Raspberry Pi jako serwera plików, dokupując modułgigabitowego Ethernetu na USB. Obecnie w polskich sklepachinternetowych ceny takiego sprzętu zaczynają się od ok. 70 zł, wsklepach chińskich znaleźć można taki moduł już nawet za 8dolarów. Po jego podłączeniu do Maliny, limit przepustowościrośnie do ok. 22 MB/s, a realnie udaje się uzyskać ok. 18-20 MB/s.
Streaming, torrenty i inne atrakcje
Jednym z najczęstszych zastosowań NAS-ów jest strumieniowaniemediów i pobieranie torrentów. Raspberry Pi (przynajmniej w wersji2) w przedstawionej konfiguracji całkiem dobrze się do tego nadaje.Lekki serwer minidlna pozwoli na wygodne strumieniowanie plikówwideo, CherryMusic zamieni naszą kolekcję muzyki w internetoweradio, Transmission będzie bardzo wygodnym, zarządzanym przezprzeglądarkę klientem BitTorrenta, zaś Ubooquity może posłużyćjako serwer e-booków. O tym, jak to wszystko zrobić już niebawem wnaszym cyklu Raspberry Pi nie tylko dla majsterkowiczów.
Nie ma więc co skreślać Malinki z typowo NAS-owych zastosowań.Do biura oczywiście się nie nadaje, ale w domu, gdzie posłuży conajwyżej kilku użytkownikom, może być bardzo dobrym rozwiązaniem.