Alpine Linux migruje na Musl

07 kwiecień 2014

Od kilku miesięcy trwają prace nad udostępnieniem odsłony Alpine Linux opartej na bibliotece Musl zamiast uClibc. Sądząc po stale malejącej liczbie niebudujących się pakietów nic nie stoi na przeszkodzie by wydanie 3.0 ujrzało światło dziennie w maju bieżącego roku, tak jak od początku planowano. Za zmianą standardowej biblioteki stoi kilka czynników, nie obyło się również bez efektów ubocznych związanych z aktualizacją z poprzednich wydań dystrybucji oraz samym planem wydawniczym.

Głównym problemem związanym z korzystaniem z uClibc jest mało żwawy rozwój, nawet w kwestii mniej lub bardziej prostych poprawek błędów. W efekcie podczas kilku wydań skończyliśmy praktycznie z forkiem projektu przekładającym się na około 40 łat. Inne problemy takie jak brak możliwości statycznego linkowania z pthreads, niska jakość kodu czy kulejąca obsługa UTF-8 okazały się zdecydowanie poza zasięgiem z powodu ogromu koniecznej pracy wobec małej liczby chętnych oraz zaledwie jednego stale zatrudnionego developera. Tymczasem Musl jest aktywnie rozwijany, nie ustępuje wydajnością innym rozwiązaniom, kod wynikowy potrafi zajmować mniej miejsca niż dotychczas, a autorzy chętnie współpracują w razie problemów i potrzeby wprowadzania brakujących funkcji. Oferuje także lepsze wsparcie Unicode. Konsekwencją dobrze napisanego kodu jest większa surowość – o ile uClibc wybaczał używanie różnych rozszerzeń GNU lub głupich błędów programistycznych, Musl nie wybacza nigdy i zmusza do naprawiania problematycznych fragmentów.

Początkowo Natanael Copa planował wydać "standardowe" 2.8 oraz 3.0 z Musl, jednak już podczas prac nad wersją rozwojową okazało się, że utrzymanie dwóch gałęzi dostarczających te same wersje wymaga zbyt dużo wysiłku. Wielokrotnie zdarzało się, że łaty naprawiające kompilację z muszlą psuły budowę z uClibc i odwrotnie, zatem po kilku rozmowach zdecydowaliśmy o przedłużeniu wsparcia dla wersji 2.7 i rezygnacji z 2.8. Wydanie 3.0 (i być może 3.1) będzie uznawane jako wersja testowa, nadające się do środowisk w produkcyjnych w mniejszym stopniu niż 2.x. Okres wsparcia wyniesie od 9 do 12 miesięcy, podczas których chcemy wyłapać jak najwięcej błędów związanych ze zmianą biblioteki.

Trwają również prace nad dodaniem wsparcia dla architektury określanej w Debianie mianem armhf. Timo Teras wykonał kawał świetnej roboty i nie tylko przygotował infrastrukturę do automatycznego budowania pakietów, udostępnił również obrazy dla testerów. Ciężko mi powiedzieć czy wydanie 3.0 okaże się pierwszym z obsługą procesorów ARM, ale na pewno jest to możliwe do wykonania w perspektywie kilku miesięcy.

Aktualizacja do 3.0/Edge Musl

Innym zagadnieniem jest proces aktualizacji dla obecnych użytkowników. W przypadku wersji stabilnych pierwszym krokiem jest aktualizacja systemu do gałęzi rozwojowej edge, nadal opartej o uClibc. Następnie należy zainstalować pakiet apk-tools-static, który dostarcza statycznie skompilowany menedżer pakietów. W celu migracji na Musl konieczne jest ręczne zmodyfikowanie pliku /etc/apk/repositories tak, aby wskazywał na repozytorium edge-musl:

http://mirror.bpiotrowski.pl/alpine/edge-musl/main
@testing http://mirror.bpiotrowski.pl/alpine/edge-musl/testing

Właściwe polecenie do aktualizacji wygląda następująco:

apk.static upgrade -U -a --no-self-upgrade

Podczas aktualizacji może okazać się, że generacja initramfs nie powiodła się z powodu… braku uClibc. Aby to naprawić, zawartość pliku /etc/mkinitfs/files.d/base należy zastąpić następującymi wpisami:

/bin/busybox
/bin/sh
/lib/libcrypto.*
/lib/libz.*
/lib/ld*-musl*.so*
/lib/mdev
/sbin/apk
/etc/modprobe.d/*.conf
/etc/mdev.conf

Pozostaje jeszcze przeinstalować kernel:

apk fix linux-grsec

Po ponownym uruchomieniu system będzie korzystać wyłącznie z Musl.