前言#
Void Linux 是一個極簡的滾動發行版,但與其他滾動發行版不同,Void 具有比較好的穩定性,但軟體可能就沒那麼新了。
Void Linux 是一個極為小眾的 Linux 發行版,它也提供了相對於多數 Linux 發行版比較小眾的 Musl libc 和 runit,這是 Void Linux 的顯著優勢。
Musl 輕量快速,通常被認為比 glibc 更標準,更簡單,對於開發人員來說,Musl 的原始碼優雅乾淨很多,對於用戶來說,Musl 編譯出來的包更小,非常適合追求極致精簡高效的發行版。
相比與 Musl,還是 runit 更吸引我。我曾經是一個 Arch Linux 用戶 ||(雖然我目前仍然在伺服器上用)|| Arch Linux 上的一切都很好...... 除了 systemd,systemd 太 “重” 了,且做了太多 init 系統不該做的事情,背離了 UNIX 的哲學。而 runit 就輕量很多,程式庫非常小,足夠穩定,維護起來要方便多了。
Void Linux 的包管理器 xbps 從頭開始設計,十分迅速,且提供了 xbps-src 構建器,可以使用 Linux 命名空間在容器中構建軟體。
安裝前的準備#
在下載映像之前,我們可以選擇一個更符合自己習慣的映像,"base" 映像不提供圖形介面,就像 archiso 那樣。與 Arch Linux 不同 Void Linux 是有 TUI 安裝程序的,但我會更喜歡手動命令行安裝,就像 Arch Linux 那樣。musl 和 glibc 就看個人喜好吧,我希望我的系統能更加小巧,所以我選擇 Musl
::: banner {warn}
Musl 並非完美。Musl 的標準化使運行的程式也需要遵守標準編寫,否則可能在 Musl 下無法正常工作,如果你是一個 VIM 用戶,Musl 下 VIM 無法正常顯示中文。
詳細內容 : https://wiki.musl-libc.org/functional-differences-from-glibc.html
:::
Void Linux 在國內僅有少數映像源,您可以從以下鏈接下載 Void Linux 安裝映像。
清華源:https://mirrors.tuna.tsinghua.edu.cn/voidlinux/live/current
北外源:https://mirrors.bfsu.edu.cn/voidlinux/live/current
Fastly Global CDN : https://repo-fastly.voidlinux.org/live/current
供參考的下載鏈接 (musl base) : https://repo-fastly.voidlinux.org/live/current/void-live-x86_64-musl-20221001-base.iso
當然您也可以不使用 Void Linux 的 livecd,可以用 archiso 或其他發行版的 livecd 來進行安裝,需要下載 Void 的 rootfs 解壓到已經格式化的根分區上。
供參考的 rootfs 下載鏈接 (musl) : https://repo-fastly.voidlinux.org/live/current/void-x86_64-musl-ROOTFS-20221001.tar.xz
注意事項#
如果您是 N 卡用戶,在 Void livecd 引導界面按 Tab,添加 nomodeset
內核參數,防止無法進入 tty。
如果您之前不是 runit 用戶,對 Livecd 啟動時陌生的啟動流程不必感到疑惑,runit 的啟動流程與 sysemd 等 init 系統不同。
Livecd 的 root 用戶密碼為 voidlinux,anon 用戶的密碼為 voidlinux。
安裝#
進入 LiveCD 後,登入 root 用戶。
Void Linux 默認映像國內速度感人,我們首先更換 國內映像源,我使用北外映像源。
# mkdir -p /etc/xbps.d
# cp /usr/share/xbps.d/*-repository-*.conf /etc/xbps.d/
# sed -i 's|https://repo-default.voidlinux.org|https://mirrors.bfsu.edu.cn/voidlinux|g' /etc/xbps.d/*-repository-*.conf
接下來讓 xbps 同步更改
# xbps-install -S
硬碟分區#
我使用一整塊硬碟安裝 Void Linux,當然也可以在現有系統的硬碟單獨分區用於安裝 Void Linux。
我習慣用 gptfdisk (以下簡稱 gdisk) 工具對硬碟進行分區,首先需要在 LiveCD 上安裝 gdisk
# xbps-install -Sy gptfdisk
使用 gdisk 進行分區:
步驟解析:
-
創建一個新的 GPT 分區表,並確認執行 (y)。
-
創建一個 ef02 標籤的 2MB 的分區
/dev/sda1
,使 Legacy Boot 可以識別並引導 GPT 硬碟上的 GRUB2。 -
創建一個 ef00 標籤的 500MB 的分區
/dev/sda2
,在 Legacy Boot 上僅作為/boot
分區存放 GRUB2 引導程序和 Linux 內核,使用 UEFI 引導可以作為/boot/efi
分區。 -
創建一個利用所有空閒空間的分區,作為
/
分區(根分區)/dev/sda3
。 -
寫入到硬碟,並確認更改 (y)。
::: banner {info}
這裡我的硬碟在系統中是 /dev/sda
,您需要將自己的實際情況替換掉我的硬碟和分區,您可以使用fdisk -l
命令查看,順帶一提這裡我並沒有使用 swap。
:::
準備檔案系統#
我們的分區情況大概是一個額外分區,一個根分區和一個 boot 分區,我們需要格式化後面二者。
使用 mkfs.ext4
將 /dev/sda3
(根分區)格式化為 EXT4 分區。
# mkfs.ext4 /dev/sda3
使用 mkfs.vfat
將/dev/sda2
(boot 分區)格式化為 FAT32 分區。
# mkfs.vfat /dev/sda2
將上面的兩個分區掛載分別掛載到 /
和/boot
# mount /dev/sda3 /mnt
# mount /dev/sda2 /mnt/boot --mkdir
基礎系統安裝#
我選擇下載 rootfs 安裝的方式,這同樣適用於其他發行版的 LiveCD。
在 LiveCD 安裝 wget
。
# xbps-install wget -y
下載 rootfs 包。
# wget https://repo-fastly.voidlinux.org/live/current/void-x86_64-musl-ROOTFS-20221001.tar.xz
使用 tar 將 rootfs 包解壓到我們的根分區。
# tar -xvf void-x86_64-musl-ROOTFS-20221001.tar.xz -C /mnt
對於 Void LiveCD,可以直接使用 xchroot
工具自動進入 Chroot。
# xchroot /mnt /bin/sh
非 Void LiveCD 需要手動完成。
# mount -t proc none /mnt/proc
# mount -t sysfs none /mnt/sys
# mount --rbind /dev /mnt/dev
# mount --rbind /run /mnt/run
Void Linux 的 rootfs 包更新並不及時,其中的軟體包通常是已經過時的,而且沒有完整的base-system
包組。我們需要更新 rootfs 包現有軟體包並安裝base-system
包組。
# xbps-install -Su xbps
# xbps-install -u
# xbps-install base-system
# xbps-remove base-voidstrap
設置主機名,我這裡設置為 "InSnh-Gd"。
# echo 'InSnh-Gd' > /etc/hostname
設置時區,對於 Void Linux,可以直接修改 rc.conf
,將 "TIMEZONE=" 的默認值改為 Asia/Shanghai
即可。
# 在/etc/rc.conf 下修改
TIMEZONE=Asia/Shanghai
如果使用 glibc 分支,需要編輯 /etc/default/libc-locales
,取消 "zh_CN.UTF-8" 一行的註釋。
修改 root 密碼並創建 wheel
組的用戶,再使用 'visudo' 修改 /etc/sudoers,取消 "#% wheel ALL=(ALL) ALL" 一行的註釋。
# passwd
# useradd -m -G wheel <user>
# visudo
配置 fstab,可以直接複製/proc/mounts
將當前掛載的檔案系統參數寫入/etc/fstab
# cp /proc/mounts
刪除根分區 /
與 boot 分區 /boot
以外的行。如果你有創建 swap 分區那將 swap 一行保留。
最後的結果看起來大概像這樣:
/dev/sda3 / ext4 rw,realtime 0 0
/dev/sda2 /boot vfat rw,realtime 0 0
配置網路#
我們還需要配置網路,可以安裝 dhcpcd
用於自動配置網路,啟用它的服務。
# xbps-install dhcpcd -y
# ln -s /etc/sv/dhcpcd /etc/runit/runsvdir/default/
我選擇使用靜態 IP,我認為如果網路管理器對你來說並不是強制性的需求(比如配置網橋等),你也可以像我一樣直接使用 iproute2
工具配置一個固定 IP 而不去安裝 NerworkManager
之類的管理程序,這樣你的系統又能精簡一點。為了實現開機自動配置網路,可以將命令寫入 /etc/rc.local
如果不存在就創建它。
我習慣使用 ethX 形式的網卡名稱,並使用 net.ifnames=0
內核參數將網卡名改為 eth0
,你需要根據自己的網卡名稱修改命令,建議先運行 ip addr
命令查看自己的網卡名以及內網 IP 段,IP 建議寫為 x.x.x.200~254 以防止 IP 衝突。
# echo "
ip addr add 192.168.2.200/16 dev eth0
ip route add default via 192.168.2.1" >> /etc/rc.local
安裝引導程序 GRUB2#
使用 xbps-install
安裝 GRUB2,使用 Legacy Boot(BIOS 系統)引導,安裝 grub
包。
# xbps-install grub -y
使用 UEFI 引導,安裝 grub-x86_64-efi
包
# xbps-install grub-x86_64-efi
我使用 Legacy Boot,所以只需要運行grub-install /dev/sda
。
如果你使用 UEFI 引導,則需要運行以下命令。特別需要注意自己的 boot 分區或者是 efi 分區的掛載點,如果你完全跟著我的步驟此時 boot 分區的掛載點為 /boot
,那麼將 --efi-directory
的 /boot/efi
改為 /boot
。
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id="Void"
完成安裝#
使用 xbps-reconfigure
確保所有安裝了的軟體包全部正確配置。
# xbps-reconfigure -fa
至此,我們已經獲得了一個基本完整的 Void Linux,退出 chroot,重啟電腦。
[xchroot /mnt]# exit
# umount -R /mnt
# shutdown -r now
說說我安裝時的感受吧,雖然說我已經基本離開了 Arch Linux,但我安裝 Linux 發行版的方式還是變成了 Arch Linux 的模樣(嗚,還是忘不掉 Arch)。從安裝過程中可以足以看出 Void Linux 的精簡,xbps 包管理的強大,還有幹人事的 runit!!!它真的只是作為 init 系統和 supervision,這麼好的東西為什麼沒多少人用呢,難道人們寧願用 sh*t 山一般的 systemd,也不願用其他人不用的 runit 嗎,還是咱太極端了,太守舊了。
Void Linux 安裝完大小比 Arch Linux 安裝大致同數量的包還要少 100MB 左右,這波啊,這波是 Void Linux 精確拆包和 Musl 的雙重作用,太強力。
參考資料#
runit-- a UNIX init scheme with service supervision
此文由 Mix Space 同步更新至 xLog 原始鏈接為 https://blog.insnhgd.com/posts/build/1