Raspberry Pi — serwer torrentów — część 1, czyli lanie wody
Witam serdecznie, za długi wpis przepraszam. I tak już podzieliłem na 2 części.
W dzisiejszym odcinku przygód z Raspberry Pi, zajmiemy się wstępem do torrentowego serwera, który będzie zapisywać pliki na dysku USB, a interfejs obsługi programu będziemy mogli doinstalować na systemie Windows / Linux lub na telefonie Android. Dodatkowo (o ile dobrze pamiętam) możemy do takiego serwera po prostu zajrzeć przez internetową przeglądarkę :)
Ze względu na naturalną obronną reakcję przed iPhone'ami niestety nie dodam informacji, czy przedstawioną solucję można stosować z produktami tej firmy. Podejrzewam że można, ale po prostu nie wiem (mimo wielkiego zrozumienia wobec geniuszu Steve'a Jobsa i jego podejścia unikam iPhone'ów. Po prostu jestem innym typem klienta a produkty od jabłuszka nie są skierowane dla mnie).
Osobnym tematem do rozmów będzie na pewno kwestia moralnego podejścia do tematyki "torrentów" jednak tutaj chyba najłatwiej będzie dla mnie wytłumaczyć to w ten sposób. Każdy ma swój własny kręgosłup moralny i podejście do etyki lub (w prostszym języku) po prostu byciem "fair" w stosunku do twórców dzieł/utworów.
Torrent sam w sobie nie jest niczym złym, choć pewnie tak samo mówiono jak wynaleziono proch/dynamit czy inne bronie. Ja podchodzę do tematu trochę inaczej - jeśli produkt jest dobry - to za niego płacę. Choćbym już miał jego "kradzioną" kopię.
Jeśli ktoś czułby się tym oburzony, to wytłumaczę się tym, że pochodzę jeszcze z czasów kiedy w jedną grę można było grać miesiącami, a jak producent wypuszczał demo, to później w finalnej wersji nie czułem się jak beta-tester bo wszystko nie działa. Ostatnio jednak odnoszę wrażenie, że rynek zalewany jest półproduktami, które i tak przecież ktoś kupuje. Pytanie tylko czy czasami nie wytworzyło się błędne koło i producent nie zasłania się piractwem i stratami przez "kradzież" (cudzysłów nieprzypadkowy) żeby oznajmić że gra jest jaka jest a nie ma jak poprawić bo budżet był za wysoki a przychody ze sprzedaży za niskie. Stąd wniosek dla mnie taki - zainstalowałem, zagrałem, spodobało mi się - szukam na Steamie promocji i po prostu kupuję.
Nowości zazwyczaj omijam bo ich cena jest dyktowana premierą, choć są tytuły które zakupuję od razu (jak np. Wiedźmin 3, nie mając nawet komputera aby w niego zagrać). Jeśli po 1‑2 dniach grania uznaję że tytuł jest słaby - usuwam.
Proste... Tylko problem polega w tym, że ja na granie mam czas może 2 godziny w tygodniu. I chyba bym zapłakał się gdybym wydał 200zł na nową część Batmana żeby zobaczyć zestaw bugów i wycieków godnych wersji pre‑alpha release. "Zwrotów nie przyjmujemy".
Kwestia następna - produkty niedostępne ze względów idiotycznych. Siedzę w UK (czemu? to osobny temat) i naprawdę chciałbym obejrzeć niektóre seriale lub programy telewizyjne. Że tak brzydko powiem - śpię na pieniądzach więc szukam VOD'a który pozwoli mi zapłacić za pożądaną treść. 10 zł za odcinek serialu? Nie ma problemu, płącę i uwaga - przykro mi - dany materiał jest niedostępny dla Twojego kraju z powodów licencyjnych.
Nie chcę nawet wnikać jaką licencję musisz posiadać w innym kraju aby móc obejrzeć np. Gotowanie z Ewą z kanału Kuchnia+. Uprzedzając pytania - tak - widzę sens licencjonowania i całkowicie to rozumiem, ale błagam was - nie każcie mi wykupywać proxy w Polsce aby móc "legalnie" zapłacić spore pieniądze za "video na życzenie" kiedy nie ma innej alternatywy.
Tu też pewnie się kłania jak Polacy musieli przez lata używać Netflixa i VPN'ów / proxy aby móc "prawie" legalnie obejrzeć House of Cards. A już osobną sprawą jest podejście producentów do potencjalnego rynku którego a) boją się b) zupełnie nie rozumieją. Dobrym przykładem jest wypuszczanie książek na rynek tylko w postaci drukowanej, kiedy rynek czytelników którzy korzystają z czytników ebooków naprawdę rośnie. Albo (bo mamy taką a nie inną politykę i przepisy) ceny ebooków, które mnie jako "obcokrajowca" nie przerażają, ale jednak - cena książki drukowanej - 30 zł, cena ebooka 29.99.
Tak wiem - są przeceny, tak wiem są promocje i tak wiem - są też i deale, że można zakupić książkę papierową a ebooka dostaniemy gratis - ale ja się po prostu pytam - czy naprawdę na książki papierowe można utrzymać niski podatek, ale na ebooki jest już 23%? To już też chyba wątek na osobny wpis. (a już najgorsze, że przecież ta książka w wersji wydrukowanej powstała z wersji elektronicznej, której konwersja i wstawienie w sprzedaż online to koszt tak niski, że sprzedanie 20 sztuk ebooków zwraca nakład wydania ebooka). Tak więc torrenty torrentami - można pewnie sporo dywagować i dyskutować (a zapraszam do dyskusji w komentarzach), my zajmijmy się po prostu instalacją serwera.
Jeśli chodzi o serwer torrentów. Niejednokrotnie zdenerwowany i zirytowany że muszę korzystać z wielu rozwiązań (np. program tu, program tam, a komputer musi być włączony bo peerów mało), to wymyśliłem, że może by tak zrobić, że jak faktycznie znajdę coś ciekawego, to wyślę to do Raspberry, a malinka już się wszystkim zajmie i pliki będą dostępne dla każdego urządzenia w sieci lokalnej?
Jak wymyśliłem, tak wymyśliłem i stało się. Do Raspberry Pi podłączyłem kilka dysków twardych z interfejsem USB, do tego oczywiście wpięcie w sieć.
Wymagania projektu:
Działające Raspberry Pi z systemem Raspbian (w moim przypadku, dystrybucja Wheezy). Raspberry Pi podłączone do lokalnej sieci Dla wygody: dostęp poprzez SSH używając np. putty
Zaczniemy od:
Podłączenie dysków USB
I tak na wstępie - Adam Golański (eimi) uprzedził mnie i zrobił naprawdę porządny wpis na temat Raspberry Pi jako serwer plików. Nie będe ukrywał, że wszystko co wypisałem poniżej, mniej więcej pokrywa się z tym co eimi już napisał.
Artykuł można znaleźć pod tym linkiem
Podłączenie dysku USB bezpośrednio pod Raspberry Pi zazwyczaj kończy się źle. Raspberry po prostu nie posiada wystarczająco "mocy" żeby zasilić dyski twarde. Klawiatury czy myszki to nie problem, ale weźmy pod uwagę, że natężenie zasilacza który zasila nasz mały komputer to zazwyczaj 1A, ale na portach USB jest tylko 0,5A (czyli tyle, ile wymaga dysk). Jeśli podłączymy dysk, to na Raspberry pozostaje wtedy maksymalnie 0,5A a to już samo w sobie nie jest wystarczające do stabilnej pracy. Raspberry to nie komputer który ma 400‑750 watowy zasilacz i wiele linii napięć. Stąd aby podłączyć dyski USB, zalecane jest używanie "aktywnego" huba USB, inaczej mówiąc - zasilanego rozgałęźnika USB. I tutaj też moja mała uwaga - nie polecam oszczędzać na tych rozgałęźnikach, bo może skończyć się tak - że będziemy w kółko denerwować się znikającymi dyskami czy dokupywać kolejne zasilacze do rozgałęźników. Nie mówiąc o ryzyku spalenia elektroniki sterującej dyskiem. Sam kupiłem bardzo dużo różnego sprzętu na eBayu a skończyło się wizytą w sklepie po markowy HUB marki Belkin. A że dysków mam sporo - to i hubów mam kilka.
Jeśli chodzi o HUB'y - to pozostaje jeszcze taka kwestia, że warto byłoby, żeby HUB'y nie zasilały urządzeń podłączonych do niego, kiedy nie jest podłączony żaden zasilacz. Sam nieźle się namęczyłem, kiedy okazało się że "zasilane" huby USB wcale nie potrzebują zasilacza, aby podawać napięcie na dyski USB co prowadziło do wysypywania się systemu Raspberry. Jak? Niestety dokładnie nie wiem, ale wiem że wiążę się to z tzw. backfeedem czyli podawaniem prądu z powrotem do Raspberry, więc jeśli HUB ciągnie prąd z Raspberry Pi i podaje na dyski, to wahania natężenia prądu powodują skoki napięcia na płytce Raspberry, bo wraca to z powrotem na urządzenie, które HUB zasila.
Jako krótkie podsumowanie tego problemu z zasilaniem powiem tak: sam się prawie że poddałem aż w końcu zrobiłem tak, że do Raspberry Pi wpiąłem pasywne rozgąłeźniki kupione w sklepie po 5zł, a do tych rozgałeźników wpiąłem dopiero aktywne HUB'y Belkina. W tych pasywnych HUBach po prostu przeciąłem przewód zasilający +5V zostawiając tylko Data+ / Data- i GND -> Ground.
W ten sposób dane są wciąż przesyłane pomiędzy dyskami a Raspberry, ale prąd "leci" tylko z zasilaczy Belkina.
Konfiguracja dysków USB
Jeśli już mamy chociaż jeden podłączony dysk do Raspberry Pi, to podejrzewam, że będzie to dysk w systemie zapisu NTFS. Linuxowe formaty zapisu pliku nie pomogą, jeśli będziemy chcieli z tego samego dysku korzystać w systemach Windows, a FAT32 nie sprawdzi się, jeśli chcemy korzystać z plików większych niż 4GB. Stąd pozostaje NTFS. No chyba że dysk zawsze będzie podpięty do Raspberry i nie zależy nam na Windowsowskiej uniwersalności, wtedy polecam pozostać przy EXT4
Podpięliśmy dysk, więc na początek warto sprawdzić czy widnieje na liście urządzeń podłączonych poprzez USB.
W terminalu wpisujemy:
sudo lsusb
po czym szukamy urządzeń które będą wskazywać na dysk twardy. Jeśli brak - warto sprawdzić czy na pewno dysk ma wystarczająco dużo mocy aby pracować (niedobory zazwyczaj słychać, bo dysk stuka).
Jeśli jest na liście, to zaczniemy od sprawdzenia, pod jaką nazwą urządzenia znajduje się nasz dysk
sudo blkid
Odnalezienie dysku nie powinno stanowić dla nas problemu.
Warto zwrócić uwagę na nazwę punktu podłączenia (np. /dev/sda1) oraz numer UUID. Numer UUID oznacza nic innego jak: universally unique identifier czyli uniwersalny, unikalny identyfikator.
Zainstalujmy wsparcie dla systemu plików NTFS
sudo apt-get install ntfs-3g -y
następnie - trochę inaczej niż w systemach Windows, musimy "zamontować" pliki z dysku (lub sam pusty dysk) pod nasz wybrany folder. Osobiście używam folderu /media/ gdzie utworzyłem foldery dla każdego z podłączonych dysków.
Przyjmijmy, że do Raspberry podpięliśmy dysk Samsung.
Aby utworzyć folder, wpisujemy:
sudo mkdir /media/Samsung
po czym nadajemy uprawnienia odczytu i zapisu dla wszystkich użytkowników
sudo chmod 775 /media/Samsung
Ok. Mamy podłączony dysk - powiedzmy, że jest dostępny pod /dev/sda1
Edytujemy plik fstab za pomocą komendy:
sudo nano /etc/fstab
W podanym pliku wpisujemy numer UUID dysku oraz miejsce gdzie ma być zamontowany. Oczywiście wartości oddzielamy "tabulatorem" czyli przyciskiem "Tab" na klawiaturze.
Przykładowy wpis:
UUID=48DAC8E27AA8D6FF /media/Samsung ntfs-3g defaults 0 0
Dzięki dodaniu tej linii, po ponownym uruchomieniu Raspberry Pi (sudo reboot) nasz dysk będzie automatycznie "montowany" do katalogu /media/Samsung.
Niektóre poradniki używają miejsca podłączenia dysku (np. /dev/sda2) natomiast sam polecam jednak używać numer UUID, gdyż w przypadku odłączenia dysku i podłączenia go ponownie (ale np. pod inny port USB), numer podłączenia może się zmienić i dysk nie będzie już podłączony do /dev/sda2 ale np. /dev/sdb1). Dzięki korzystaniu z UUID, nie musimy się po prostu martwić, że pewnego dnia dysk będzie pod innym numerem.
Zamiast ponownego uruchamiania Raspberry, polecam wykorzystać komendę "mount" i zamontować podłączone urządzenia do odpowiadającym im folderom. Wpisujemy:
sudo mount -a
po czym przechodzimy do katalogu gdzie powinna znajdować się zawartość dysku
cd /media/Samsung
i listujemy jego zawartość za pomocą
ls -l
Jeśli dysk jest pusty. to nic się nie pojawi, ale jeśli mamy jakiekolwiek katalogi na tym dysku, to powinniśmy widzieć je wylistowane na ekranie.
Tak tylko dodam jeszcze, że według tego co znalazłem w internecie, wsparcie dla systemu plików NTFS w systemach Linux nigdy nie było dodane oficjalnie, przez co wydajność takich dysków podłączonych do Raspberry Pi niestety jest trochę niska. Obciążenie procesora przy kopiowaniu / zapisywaniu / odczycie plików z dysków z systemem NTFS jest dosyć wysokie.
A do tego dochodzi jeszcze obsługa przecież protokołów sieciowych i utrzymanie systemu raspberry aby wszystko działało. Ostrzegam też, żeby nie stawiać takiego serwera NAS za pomocą Raspberry Pi podłączonego do naszego routera/switcha za pomocą WiFi bo wtedy możemy już w ogóle odpuścić sobie oglądanie filmów z dysków podłączonych do Raspberry Pi.
Na dzień dzisiejszy mogę powiedzieć tak: Raspberry jako serwer NAS spisuje mi się całkiem dobrze. Nie jest to 100% odporne na wszystko dookoła, zdarza mi się że dyski znikają (znaczy są podłączone, ale są puste) i należy je ponownie zamontować do katalogów, nie będę też ukrywał, że prędkość transferu danych pozostawia naprawdę wiele do życzenia i np. trzymanie obrazów systemów (*.iso) czy dużych projektów graficznych czy projektów video nie ma tutaj żadnego zastosowania, jednakże przechowywanie kolekcji mp3, filmów czy (ostatecznie) zdjęć jeszcze ma jakieś zastosowanie. Sam na dyskach podłączonych do Raspberry Pi przechowuje save'y do gier, bibliotekę filmów czy stare dokumenty lub stare obrazu systemów. Mam je zawsze pod ręką, ale są to dane na których nie zależy mi aby mogły np. szybko znaleźć się na pendrivie, lub aby móc na nich na "żywo pracować".
Prędkość transferu po sieci jednak spokojnie wystarcza aby móc odtworzyć plik mkv w rozdzielczości full hd, choć zauważyłem że przy plikach o wielkości powyżej 7GB, wyszukiwanie napisów trwa bardzo, bardzo długo. Dlaczego? Tego nie wiem - może napiprojekt próbuje odczytać więcej danych niż tylko nazwę pliku, jego długość i wielkość.
Po przejrzeniu dziesiątek stron na temat słabych wyników przesyłania plików po sieci z Raspberry, można tylko szukać poprawy poprzez: a) posiadanie dysku który nie jest zasilany przewodem USB a osobnym zasilaczem. W tym momencie przewód USB idzie bezpośrednio do Raspberry Pi i omija HUB'y. Podobno może mieć to wpływ na wydajność b) zamiana systemu NTFS (który obciąża procesor malinki) na np. EXT4 c) podkręcenie procesora maliny, co wydaje się dziwnym kiedy człowiek przypomni sobie że na Celeronie 400MHz obsługa dysków nie była tak tragiczna żeby trzeba było podkręcać procesor. Ale znowu przypominam, że obsługa NTFS w Linuxie nie jest taka "domyślna" do jakiej przywykliśmy
To są tylko teorię i po raz kolejny odsyłam do wpisu eimi (link na początku tego artykułu) który (o ile dobrze pamiętam) w bardziej "naturalny" i przyjazny człowiekowi sposób podał ładnie cyfry zapisu/odczytu i jak można ulepszyć system plików.
W drugiej części zapraszam już do instalacji serwera torrentów, bo w tym wpisie dochodzę do limitu znaków (jeśli taki istnieje) :) - druga część będzie dostępna już w prima aprilis