Raspberry Pi jest wspaniałym mikrokomputerem. Niezłe parametry sprzętowe, niska cena, a przede wszystkim – wspaniała społeczność która zawsze pomoże rozwiązać problemy. Tworzenie oprogramowania na ten mikrokomputer także jest przyjemne, gdyż jest tam zwykły Linux (Raspbian – modyfikacja Debiana). Więc każdy program działający i kompilujący się na pecetowym Debianie skompiluje się i będzie działał – lepiej lub gorzej – na Raspberry Pi.
Praca na oryginalnym sprzęcie przy opracowywaniu oprogramowania jest najwygodniejsza, ale nie zawsze możliwa. Czasami trzeba użyć pewnej formy emulacji. W dzisiejszym wpisie poruszymy temat stworzenia środowiska chroot (architektura ARM, Raspbian) na PC (architektura x86/AMD64, Debian). Jaki może być cel takiego rozwiązania? Łatwa i szybka cross-kompilacja oprogramowania na Raspberry PI. (Nie oszukujmy się – RPI nie należy do demonów szybkości). Innym zadaniem takiego środowiska może być testowanie oprogramowania (o ile nie wymaga ono np.: dostępu do pinów GPIO).
Instalacja niezbędnego oprogramowania i pobranie systemu
Pierwszym krokiem, który musimy wykonać, jest instalacja niezbędnego oprogramowania. Potrzebne nam będą dwa pakiety:
- debootstrap – pozwala na pobranie obrazu systemu i zainicjowanie obrazu
- qemu-user-static – mały pliczek, dzięki któremu możemy wykonać chroot do środowiska stworzonego dla innej architektury
Wydajemy polecenia:
1 2 3 | sudo apt-get install debootstrap qemu-user-static CHROOT=/path/to/chroot debootstrap --no-check-gpg --foreign --arch=armhf stretch $CHROOT http://archive.raspbian.org/raspbian |
Kilka linijek może wprowadzać w pewne zakłopotanie. Omówmy je po kolei.
Pierwsza linijka powyższego skryptu to po prostu instalacja odpowiednich pakietów. Mówiliśmy o tym nieco wyżej, zanim pokazałem listing. Druga linijka to stworzenie zmiennej środowiskowej CHROOT. Zamiast /path/to/chroot podstawiasz ścieżkę w której chcesz zainstalować „chrootowany” system operacyjny. Np.: /home/karol/rpi_chroot.
Najwięcej roboty odwala za nas linijka trzecia. Uruchamiamy debootstrap z całą chmarą parametrów. Co one oznaczają?
- –no-check-gpg – wyłącza sprawdzanie sygnatur gpg otrzymanych plików. Możesz pominąć ten parametr aczkolwiek istnieje możliwość pojawienia się kilku ostrzeżeń
- –foreign – parametr wymagany wtedy, kiedy wykonujemy debootstrapa innej architektury niż ta na której pracujemy. Foreign zapobiega wykonaniu tych części skryptu debootstrap, które wymagają wykonania chroota do wnętrza instalowanego systemu. (Póki nie przekopiujemy qemu-arm-static do wnętrza tworzonego środowiska, nie będzie to możliwe)
- –arch=armhf – architektura, której pliki chcemy ściągnąć i rozpakować
- stretch – wersja systemu operacyjnego, którą chcemy ściągnąć. W przypadku Raspbiana możemy wybierać spośród tych samych wersji w których wydawany jest system Debian. (aktualnie: jessie, stretch, buster, sid)
- $CHROOT – wykorzystujemy wcześniej stworzoną zmienną środowiskową aby wskazać programowi debootstrap gdzie oczekujemy instalacji naszego środowiska
- http://archive.raspbian.org/raspbian – adres internetowy spod którego zostaną ściągnięte pakiety budujące nasz OS
Kopiowanie plików qemu
Nie możemy w tej chwili wykonać chroota do wnętrza świeżutkiego systemu. Powita nas następujący błąd:
Aby rozwiązać ten problem, musimy skopiować plik qemu_arm_static na odpowiednie miejsce.
Ukończenie instalacji debootstrap
Instalacja i konfiguracja pakietów debootstrap może zostać w tym momencie ukończona. Nie bójmy się i wydajmy odpowiednie polecenie:
Powyższa komenda kończy konfigurację systemu znajdującego się w chroocie, dzięki czemu będzie zachowywał się prawie jak prawdziwy.
Konfiguracja prawidłowych repozytoriów
Ostatnią rzeczą którą musimy zrobić jest aktualizacja pliku /etc/apt/sources.list w chrootowanym środowisku. Gdybyśmy tego nie zrobili, nie otrzymalibyśmy prawdziwego raspbiana. Debootstrap domyślnie konfiguruje repozytoria tak, aby pakiety były zaciągane z serwerów oryginalnego Debiana. Nie jest to prawidłowe zachowanie w naszym przypadku i musimy je naprawić.
1 2 3 4 5 6 7 8 | cat > $CHROOT/etc/apt/sources.list << EOF deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi deb http://archive.raspberrypi.org/debian/ stretch main EOF chroot $CHROOT apt-get install dirmngr chroot $CHROOT \ apt-key adv --keyserver keyserver.ubuntu.com --recv 82B129927FA3303E chroot $CHROOT apt-get update |
Powyższy skrypt
- Wyczyści plik sources.list i wgra do niego prawidłowe repozytoria [1-4]
- Instaluje paczkę dirmngr, która jest niezbędna do zarządzania prawidłowego wykonania kolejnej komendy
- Zaloguje się do wnętrza chrootowanego systemu i doda odpowiednie klucze do apt
- Wejdzie do chrootowanego systemu i zaktualizuje listę pakietów
Jak wejść do środowiska za pomocą chroot?
Ukończyliśmy już konfigurację. Wejście do takiego środowiska jest banalne 🙂
Gdzie $CHROOT to wcześniej utworzona zmienna środowiskowa. Możesz robić w tym zamkniętym za pomocą chroota „kontenerze” absolutnie wszystko, co ci przyjdzie do głowy 🙂 Nie bój się, na pewno nie zaszkodzisz tym samym swojemu PC-towi, gdyż nie ma takiej możliwości.
Podsumowanie
Voila! Właśnie skonfigurowaliśmy system, który jest prawie identyczny z tym który instalujemy na Raspberry PI. Zachowuje się on prawie tak samo. Oczywiście, nie poddamy emulacji „typowo sprzętowych” cech, takich jak piny GPIO. Jednakże z powodzeniem możemy użyć takiego obrazu np.: do skompilowania oprogramowania które jest dostępne tylko w formie źródeł. Binarka przeniesiona ze środowiska chroot które właśnie stworzyliśmy uruchomi się bez problemu na Raspberry PI.