Béton brut

Kanał subskrybcji Napisz do mnie…

Raspberry z papierka

2020-07-29

Jeśli definicją szaleństwa jest „robieni tego samego, spodziewanie się innego rezultatu” to należy powiedzieć, że programowanie i administracja muszą być przeciwieństwem szaleństwa. Oba zawody polegają na rozkładaniu problemu na części pierwsze, ekstrakcję sensu i zamykanie całości w powtarzalny element, który raz wykonany oszczędzi nam technologicznego jąkania.

Szaleństwo w obu zawodach wypływa z innego źródła: nasze rozwiązania często są kruche i produkcja ich zajmuje dłużej niż suma powtórzeń. Nikt nie powiedział, że mamy wszystkie odpowiedzi, zwykle nie znamy nawet pytań.

Po raz kolejny zgrzytałem zębami, gdy przegrywałem czysty obraz dystrybucji na kartę SD abym mógł zaprząc Raspberry do męczenia się nad moim nowym pomysłem. Mimo tego, że mam dostęp do dziesiątek serwerów znajduję przyjemność w zerkaniu przez ramię na lodówkę i szydercze uśmiechanie się w kierunku zwisających z za krótkich kabli ethernetowych mikro-komputerów.

Do tej pory widzieliście już jak Jeżyna mrugała LED-ami czy też pieczołowicie zbierała klatki z kamer. Ostatnio zacząłem zostawiać laptopa w pracy i zbudowałem sobie „maszynę do pisania” w nadziei, że to natchnie mnie twórczo. Głównym rezultatem było szukanie fontów, które dają się czytać na 3.2 calowym ekranie i które mają polskie znaki.

Dziś znów coś wymyśliłem i od razu rozbolała mnie głowa. Znów ustawianie WiFi, znów parowanie urządzeń BT, przegranie tego czy owego. Zawsze to samo. Ale przecież nie trzeba tak żyć. Postanowiłem zobaczyć, czy uda się łatwo zmodyfikować obraz tak, abym zawsze mógł startować z wygodnego mi miejsca. Rozważałem Ansible, ale to zakłada obecność sieci.

Rozpocząłem od pobrania czystej wersji systemu i rozpakowania jej. Dostajemy wtedy plik YYYY-MM-DD-raspios-ver-distro.img. Jest to obraz zawierający dwie partycje: /boot i rootfs. Teoretycznie można je zamontować przy użyciu -o loop, ale trzeba znać ich przesunięcia, a my tu gadamy o automatyzacji. Na szczęście istnieje kpartx zajmujący się czytaniem tych informacji.

% sudo kpartx -v -a 2020-05-27-raspios-buster-lite-armhf.img
add map loop8p1 (254:0): 0 524288 linear 7:8 8192
add map loop8p2 (254:1): 0 3088384 linear 7:8 532480

Otrzymaliśmy dwa urządzenia reprezentujące wyżej wspomniane partycje. Teraz możemy je normalnie podmontować.

% mkdir /tmp/{1,2}
% sudo mount /dev/mapper/loop8p1 /tmp/1
% sudo mount /dev/mapper/loop8p2 /tmp/2

Mając dostęp do zamontowanych partycji możemy podciągnąć nasz system do stanu, który nam bardziej odpowiada. Przykładowo sudo touch /tmp/1/ssh, zgodnie z dokumentacją odpali nam SSHd przy piewszym uruchomieniu. Oto kilka modyfikacji, które dodałem dla własnej wygody:

  1. Edycja hostname, bo komputer musi się jakoś fajnie nazywać.
  2. Wgranie własnego klucza żebym się nie musiał bawić we wpisywanie haseł. Wystarczy stworzyć katalog .ssh w home/pi w ścieżce drugiej partycji i wrzucić co trzeba do authorized_keys
  3. Dostaję wścieklizny, gdy za każdym razem muszę usuwać odcisk palca hostu. Utworzyłem więc i przegrałem do etc/ssh/ wcześniej wygenerowane pliki ssh_host_* upewniając się, że nigdy nie zobaczę spanikowanego komunikatu o potencjalnym zagrożeniu. Jedna uwaga do tego, unit systemd odpowiedzialny za tworzenie kluczy ignoruje obecność już istniejących. „Rozwiązałem” ten problem usuwając go z lib/systemd/system. Pewnie jest mądrzejszy sposób, np. usunięcie symlinka.
  4. Podobnie jak z aktywacją SSHd możemy wrzucić do podmontowanego /boot wpa_supplicant.conf z definicją domowego/pracowego WiFi.
  5. Dograłem trochę oprogramowania, którego i tak zawsze potrzebuję, a nie znajduje się w pakietach.

Jest jeszcze jedna sztuczka, której nie będę opisywał, bo już zrobili to za mnie. Używając qemu możemy dokonać chroota w obcy architektonicznie system i poinstalować/poodpalać rzeczy bez potrzeby wkładania karty do Raspberry.

Kiedy skończymy modyfikacje kluczowe jest odmontowanie partycji i usunięcie mappera stworzonego przez kpartx. Podczas pierwszych eksperymentów udało mi się dokonać sztuki, w której co innego widziała karta, a co innego obraz.

% sudo umount /tmp/1 && sudo umount /tmp/2
% sudo kpartx -d 2020-05-27-raspios-buster-lite-armhf.img
loop deleted : /dev/loop8

Po tej operacji nasz zmodyfikowany obraz możemy odłożyć gdzieś na bok i w przyszłości generować systemy typu „zupka chińska”, tylko zalać wodą.

Pomiędzy dwoma rozwiązaniami, które rozważałem: uruchamianie z TFTP lub modyfikacja obrazu źródłowego ten drugi okazał się być dużo mniej wymagający. Może w przyszłości zautomatyzuję tę automatyzację (zwłaszcza tę część z qemu, ale wpierw naciszę się tym małym, środowym, sukcesem.