Alpine Linux和postmarketOS都是使用musl libc作為C函式庫,跟主流GNU/Linux所採用的glibc不相容。在執行或編譯一些強制依賴glibc的程式會出問題。在無法修改原始碼的情況下,我們有一些作法可以迴避。
如果要執行的程式只是單一執行檔,那麼用Adélie Linux開發的 gcompat就行了,指令類似wine
gcompat "執行檔路徑"
但是,大部份時候不會這麼簡單,gcompat不能當headers使用,拿它來編譯程式照樣會失敗。
這時我們得使用自帶依賴套件的容器技術,跳脫依賴宿主機musl的問題。
例如:
- chroot:薑是老的辣,使用
debootrap建立Ubuntu環境,或是
pacstrap
建立Arch Linux環境。如想簡化進入chroot流程可善用 arch-chroot指令稿。 - DistroBox:可以用來裝圖形程式。Alpine Linux似乎偏好以Podman作為後端。在Alpine Linux需要將root掛載:
sudo mount --make-rshared /
,DistroBox才可以正常運作。 - Flatpak:可以用來裝圖形程式。
- Docker:
跑其他主流發行版,例如Ubuntu的映像檔。什麼?你說你的Alpine Linux就是跑在Docker容器裡?啊這…
跳船吧請改用內含glibc的特製Alpine映像檔,例如 jeanblanchard/docker-alpine-glibc
以上套件Alpine Linux的套件庫都有收。
注意 Snap是不可行的,因為Alpine Linux不支援Systemd。儘管postmarketOS有支援Systemd,但預設init依然是用OpenRC。
順帶一提,目前Nvidia CUDA(驅動版本555)無法在musl的發行版執行,連Nvidia Container ToolKit都不行。因為這涉及到驅動程式問題,而Nvidia閉源驅動壓根不支援musl,且沒有原始碼,不可移植。