Void Linux 安装记

前言

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 默认镜像国内速度感人，我们首先更换 国内镜像源，我使用北外镜像源。

Copy
# 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 同步更改

Copy
# xbps-install -S

硬盘分区

我使用一整块硬盘安装 Void Linux，当然也可以在现有系统的硬盘单独分区用于安装 Void Linux。

我习惯用 gptfdisk (以下简称为 gdisk) 工具对硬盘进行分区，首先需要在 LiveCD 上安装 gdisk

Copy
# 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 分区。

Copy
# mkfs.ext4 /dev/sda3

使用 mkfs.vfat将/dev/sda2（boot 分区）格式化为 FAT32 分区。

Copy
# mkfs.vfat /dev/sda2

将上面的两个分区挂载分别挂载到 / 和/boot

Copy
# mount /dev/sda3 /mnt
# mount /dev/sda2 /mnt/boot --mkdir

基础系统安装

我选择下载 rootfs 安装的方式，这同样适用于其他发行版的 LiveCD。

在 LiveCD 安装 wget。

Copy
# xbps-install wget -y

下载 rootfs 包。

Copy
# wget https://repo-fastly.voidlinux.org/live/current/void-x86_64-musl-ROOTFS-20221001.tar.xz

使用 tar 将 rootfs 包解压到我们的根分区。

Copy
# tar -xvf void-x86_64-musl-ROOTFS-20221001.tar.xz -C /mnt

对于 Void LiveCD，可以直接使用 xchroot 工具自动进入 Chroot。

Copy
# xchroot /mnt /bin/sh

非 Void LiveCD 需要手动完成。

Copy
# 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包组。

Copy
# xbps-install -Su xbps
# xbps-install -u
# xbps-install base-system
# xbps-remove base-voidstrap

设置主机名，我这里设置为 "InSnh-Gd"。

Copy
# echo 'InSnh-Gd' > /etc/hostname

设置时区，对于 Void Linux，可以直接修改 rc.conf ，将 "TIMEZONE=" 的默认值改为 Asia/Shanghai即可。

Copy
# 在/etc/rc.conf 下修改
TIMEZONE=Asia/Shanghai

如果使用 glibc 分支，需要编辑 /etc/default/libc-locales，取消 "zh_CN.UTF-8" 一行的注释。

修改 root 密码并创建 wheel 组的用户，再使用 'visudo' 修改 /etc/sudoers，取消 "#% wheel ALL=(ALL) ALL" 一行的注释。

Copy
# passwd
# useradd -m -G wheel <user>
# visudo

配置 fstab，可以直接复制/proc/mounts将当前挂载的文件系统参数写入/etc/fstab

Copy
# cp /proc/mounts

删除根分区 / 与 boot 分区 /boot 以外的行。如果你有创建 swap 分区那将 swap 一行保留。

最后的结果看起来大概像这样：

Copy
/dev/sda3 / ext4 rw,realtime 0 0
/dev/sda2 /boot vfat rw,realtime 0 0

配置网络

我们还需要配置网络，可以安装 dhcpcd 用于自动配置网络，启用它的服务。

Copy
# 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 冲突。

Copy
# 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 包。

Copy
# xbps-install grub -y

使用 UEFI 引导，安装 grub-x86_64-efi 包

Copy
# xbps-install grub-x86_64-efi

我使用 Legacy Boot，所以只需要运行grub-install /dev/sda。

如果你使用 UEFI 引导，则需要运行以下命令。特别需要注意自己的 boot 分区或者是 efi 分区的挂载点，如果你完全跟着我的步骤此时 boot 分区的挂载点为 /boot ，那么将 --efi-directory 的 /boot/efi 改为 /boot。

Copy
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id="Void"

完成安装

使用 xbps-reconfigure 确保所有安装了的软件包全部正确配置。

Copy
# xbps-reconfigure -fa

至此，我们已经获得了一个基本完整的 Void Linux，退出 chroot，重启电脑。

Copy
[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 的双重作用，太强力。

参考资料

ArchWiki - GRUB

Void Linux Handbook

musl libc

runit-- a UNIX init scheme with service supervision

Void Linux manpages

VoidLinux 中文网

此文由 Mix Space 同步更新至 xLog
原始链接为 https://blog.insnhgd.com/posts/build/1