安装 Arch Linux 和 Debian 双系统至同一分区

问题

之前,稣的服务器都用 Debian 和 Hyper-V Server,桌面则用 Debian、macOS、Windows,从不用不支持 Secure Boot 的 Arch Linux。

直到遇见一个需要在 Arch Linux 物理机下才容易编译的项目……那就装个双系统吧!

现状

Debian 的豪华 SSD 只分两个区:

  • /dev/nvme0n1p1:EFI 分区,64MiB;

  • /dev/nvme0n1p2:btrfs 分区,剩余空间。

没有 swap 分区,毕竟稣有 48GB 内存,而且从不使用休眠。

思考

  1. 重新分区显得格外 Secure Boot,毕竟稣就是因为某些系统强行分了 20~30GB 做系统的备份分区,而拉黑它。这可是高贵的 SSD,多一个分区就意味着空间利用率降低一分!系统和软件都能轻易地恢复,备份啥呢?依托答辩还占着 20~30GB 这么巨大的坑!这拿来备份数据不香吗?

  2. Debian 12 的 / 挂在 btrfs 分区的 @rootfs 子卷,据说其它系统可能用的是其它名字的子卷,所以它们天然是能和谐地装在同一个分区的。比如 Ubuntu 和 OpenSUSE(哦喷稣𢶍)用 @ 子卷。而 Arch Linux 出了名的啥都能(让)自定义,所以装在 @arch 子卷的话,还能和 OpenSUSE(哦喷稣𢶍)组个三系统。

  3. 安装顺序有影响吗?没有!虽然稣是先装的 Debian,但哪个先都行。只要装一个 grub 就行,那就用 Debian 的,Arch Linux 不装即可。

步骤

1. 安装 Debian

唯一要注意的是:根目录选择 btrfs 格式,其它请参考《快速安装 Debian》。

2. 把 /home 指向 @home 子卷

建议两个系统都这么干。因为虽然是双系统,但用户还是一套的好,避免精神分裂!这样的好处很多,比如:只要在任意系统里设置一次用户的登录公钥,就能在两个系统都生效。

1
2
3
4
5
6
7
# 在 Debian 上操作
sudo mount -t btrfs -o compress=zstd /dev/nvme0n1p2 /mnt
sudo btrfs subvolume create /mnt/@home
# 可能需要移动现有文件到 /mnt/@home
sudo umount /mnt
sudo mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p2 /home
# 改 /etc/fstab

3. 安装 Arch Linux

请参考以下链接:

注意:安装 Debian 时已经分过区,到这步,只需要创建子卷:

1
2
3
btrfs subvolume create /mnt/@arch
# 相应地,挂载 Arch 根目录所在子卷到 /mnt 那步改为
mount -t btrfs -o subvol=/@arch,compress=zstd /dev/nvme0n1p2 /mnt

然后,@home 子卷之前已经创建,直接挂载即可。

最后,**不要安装引导程序!**重启去 Debian,手动加 Arch 的启动项。这步解释起来麻烦,直接发一下 Debian 的 /boot/grub/grub.cfg 里的片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
menuentry 'Arch Linux' --class archlinux --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Arch Linux ...'
linux /@/boot/vmlinuz-linux root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@arch,compress=zstd nowatchdog
echo 'Loading initial ramdisk ...'
initrd /@/boot/initramfs-linux.img
}
menuentry 'Arch Linux fallback' --class archlinux --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Arch Linux ...'
linux /@/boot/vmlinuz-linux root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@arch quiet
echo 'Loading initial ramdisk ...'
initrd /@/boot/amd-ucode.img /@/boot/initramfs-linux-fallback.img
}
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Linux 6.1.0-21-amd64 ...'
linux /@rootfs/boot/vmlinuz-6.1.0-21-amd64 root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@rootfs quiet
echo 'Loading initial ramdisk ...'
initrd /@rootfs/boot/initrd.img-6.1.0-21-amd64
}

注意:直接修改 /boot/grub/grub.cfg 通常被认为是不好的,但这里的 Arch 是个不支持 Secure Boot 的擸𢶍,不用太客气。

答疑

  1. 这么做有啥好处?

    • 减少分区数量,提高 SSD 空间利用率,榨干每个颗粒。抠就要抠到极致。

    • 系统搞坏一个,还可能进另一个修。但比起虚拟机,没有安全性、健壮性上的优势。

    • 随时可以 chroot 到另一个系统。但比起容器,没有便捷性上的优势。

  2. EFI 分区 64MiB 够用吗?

    没翻过车,之前都用 40MiB 的,已经放大过。

如果您使用微信,也可以关注公众号 UMU618,在公众号文章里评论。