在ZFS上安装Archlinux,使用ZFSBootmenu引导
刚折腾完Hyprland,又发现可以折腾zfs,那就继续折腾,用了两天的零碎时间,查了很多资料,安装了N遍,最后还是要照着archlinux wiki做最好
本次安装是在单独一块1T SSD硬盘操作,借用win11的ESP分区(已经将ESP分区扩展到1G)
没有单独分交换分区,而是使用 swap ZVOL 创建zfs卷
关于引导,放弃grub,使用zfsbootmenu和rEFInd组合来进行双系统引导
本人实机安装后一切正常,包括桌面环境
但是经过一天之后又滚回btrfs,如果想用ZFS,推荐FreeBSD
安装镜像选择:
有两种方式
1.使用支持ZFS的archlinux LiveCD(本次安装使用)
archzfs
最新的 iso 点击下载
这个LiveCD是基于Archlinux官方镜像,只加入了zfs模块
2.使用archlinux官方ISO
使用官方ISO启动后,用下面的命令安装zfs模块
curl -s https://archzfs.leibelt.de/media/setup/init | bash
注意:本文使用整个硬盘,不考虑使用虚拟机的情况
一、安装前准备工作
1、使用livecd引导
将下载的镜像丢进ventory里,然后重启,使用archzfs镜像引导
确保已经加载zfs模块
modprobe zfs
lsmod | grep zfs
2、清空整个硬盘
列出所有硬盘,确定自己要操作的硬盘,千万别选错了
# ls -la /dev/disk/by-id
找到要操作的硬盘后,设置一个变量,方便后续操作
# disk=/dev/disk/by-id/ata-CT1000MX500SSD1_2138E5D33BCE
清除与整个磁盘关联的任何 ZFS 标签
如果是新硬盘或者以前没有安装过ZFS的硬盘,可以忽略这条命令
# zpool labelclear -f $disk
清空分区表
# sgdisk --zap-all $disk
3、分区
3.1、创建EFI分区
我使用windows的EFI分区,就不单独创建了,
如果需要创建EFI分区或者SWAP分区,使用相应的命令创建
3.2、ROOT分区
整块硬盘分一个区
# sgdisk -n1:0:0 -t1:BF00 $disk
3.3、清空硬盘原有的zfs池(新硬盘或者从来没有用过ZFS的硬盘可以忽略)
# zpool labelclear -f &disk-part1
4、创建ZFS池
zpool create -f \
-o ashift=12 \
-O acltype=posixacl \
-o autotrim=on \
-O mountpoint=none \
-O canmount=off \
-O relatime=on \
-O xattr=sa \
-O normalization=formD \
-O dnodesize=legacy \
-O devices=off \
-O compression=zstd \
-R /mnt \
zroot ${disk}-part1
检查一下
# zpool status
pool: zroot
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
ata-CT1000MX500SSD1_2138E5D33BCE-part1 ONLINE 0 0 0
errors: No known data errors
5、创建数据集
5.1、创建系统数据集
# zfs create -o mountpoint=none zroot/data
# zfs create -o mountpoint=none zroot/ROOT
# zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT/default
# zfs create -o mountpoint=/home zroot/data/home
# zfs create -o mountpoint=/root zroot/data/home/root
可以根据个人需要创建其他数据集
5.2、创建交换数据集(SWAP)
大小根据个人需要创建
# zfs create -V 16G -b $(getconf PAGESIZE) \
-o compression=zle \
-o logbias=throughput \
-o sync=always \
-o primarycache=metadata \
-o secondarycache=none \
-o com.sun:auto-snapshot=false \
zroot/swap
格式化swap,不需要启用,如果使用swapon命令启用了,记得最后swapoff,不然无法导出zpool
# mkswap -f /dev/zvol/zroot/swap
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
zroot 23.8G 875G 96K none
zroot/ROOT 5.33G 875G 96K none
zroot/ROOT/default 5.33G 875G 5.33G /
zroot/data 1.49G 875G 96K none
zroot/data/home 1.49G 875G 1.49G /home
zroot/data/home/root 140K 875G 140K /root
zroot/swap 17.0G 892G 56K -
6、导入导出测试
应该没有任何错误提示
zpool export zroot
zpool import -d /dev/disk/by-id -R /mnt zroot -N
zfs mount zroot/ROOT/default
zfs mount -a
检查是否挂载
# mount | grep mnt
zroot/ROOT/default on /mnt type zfs (rw,relatime,xattr,posixacl,casesensitive)
zroot/data/home on /mnt/home type zfs (rw,relatime,xattr,posixacl,casesensitive)
zroot/data/home/root on /mnt/root type zfs (rw,elatime,xattr,posixacl,casesensitive)
7、配置系统
不能漏掉这里的每一条命令,不然可能会无法启动
7.1、设置 bootfs
# zpool set bootfs=zroot/ROOT/default zroot
7.2、创建cache并复制到新系统
# zpool set cachefile=/etc/zfs/zpool.cache zroot
# mkdir -p /mnt/etc/zfs
# cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache
7.3、挂载EFI分区
我挂载WIN11的EFI分区
# mkdir /mnt/efi
# mount -t vfat /dev/sda1 /mnt/efi
二、安装系统
1、安装基本系统
# pacstrap /mnt base base-devel linux-zen linux-zen-headers \
linux-firmware intel-ucode git dkms helix
// 提示:helix是文本编辑器,我用它来替换vim
2、生成fstab
将swap添加进去
# genfstab -U -p /mnt >> /mnt/etc/fstab
# echo '/dev/zvol/zroot/swap none swap discard 0 0' >> /mnt/etc/fstab
3、CHROOT
# arch-chroot /mnt
编辑fstab文件,注释掉所有zroot行,只保留EFI和swap
# helix /etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump> <pass>
# zroot/ROOT/default
#zroot/ROOT/default / zfs rw,nodev,xattr,posixacl,casesensitive 0 0
# zroot/data/home
#zroot/data/home /home zfs rw,nodev,xattr,posixacl,casesensitive 0 0
# zroot/data/home/root
#zroot/data/home/root /root zfs rw,nodev,xattr,posixacl,casesensitive 0 0
# /dev/sda1
UUID=A75B-1665 /efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
# swap-zvol
/dev/zvol/zroot/swap none swap discard 0 0
编辑/etc/pacman.conf,在最后加入下面代码
# helix /etc/pacman.conf
[archzfs]
# SigLevel = Optional TrustAll
# Origin Server - France
Server = http://archzfs.com/archzfs/x86_64
# Mirror - Germany
Server = http://mirror.sum7.eu/archlinux/archzfs/archzfs/x86_64
# Mirror - Germany
Server = https://mirror.biocrafting.net/archlinux/archzfs/archzfs/x86_64
# Mirror - India
Server = https://mirror.in.themindsmaze.com/archzfs/archzfs/x86_64
# Mirror - US
Server = https://zxcvfdsa.com/archzfs/archzfs/x86_64
# pacman-key -r DDF7DB817396A49B2A2723F7403BD972F75D9D76
# pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76
4、安装zfs模块
我使用dkms
# pacman -Sy zfs-dkms
编辑mkinitcpio文件,MODULES加入zfs,删除HOOK里的fsck,在filesystems前面加上zfs
# helix /etc/mkinitcpio.conf
MODULES=(zfs)
HOOK(... keyboard zfs filesystems)
生成 hostid
# zgenhostid $(hostid)
重新生成 initramfs
# mkinitcpio -P
5、安装其他软件
# pacman -S man-db man-pages efibootmgr networkmanager \
terminus-font texinfo mtools dosfstools \
pacman-contrib openssh bash-completion sudo
6、启动后台服务
# systemctl enable NetworkManager
# systemctl enable zfs.target
# systemctl enable zfs-import-cache
# systemctl enable zfs-mount
# systemctl enable zfs-import.target
# systemctl enable zfs-zed
7、安装引导
ZFSBootMenu 下载
写这篇文章的时候zfsbootmenu的版本是 zfsbootmenu-release-x86_64-v2.3.0-vmlinuz.EFI
将这个文件下载
# curl -O -L https://get.zfsbootmenu.org/zfsbootmenu.EFI
# mkdir -p /efi/EFI/zbm
# mv zfsbootmenu-release-x86_64-v2.3.0-vmlinuz.EFI /efi/EFI/zbm/zfsbootmenu-v2.3.0.EFI
设置启动参数 ,rw是必须的,不然只能以只读模式进入系统,无法进行任何操作,我安装的时候就忘记输入
最后重新用U盘启动,chroot进来加上这句才好
# zfs set org.zfsbootmenu:commandline="rw quiet loglevel=0 nowatchdog" zroot/ROOT
/dev/sda是我安装win11的硬盘,sda -p 1是efi分区
# efibootmgr -c -d /dev/sda -p 1 -L "ArchLinux(ZFS)" -l '\EFI\zbm\zfsbootmenu-v2.3.0.EFI'
可选:使用rEFInd管理启动菜单,如果不想用refind也可以,我是为了双启动方便
# pacman -S refind
# refind-install --usedefault /dev/sda1
编辑refind.conf文件,先注释掉全部menuentry的内容
然后加入下面的内容,其中icon项我安装的nord主题
# helix /efi/EFI/refind/refind.conf
dont_scan_dirs EFI/Boot,EFI/Microsoft/Boot,EFI/refind,EFI/zbm
dont_scan_volumes ext2,ext3,ext4,ntfs,OSX,EFI0,SYSTEM,EFIU,EFIM
scan_all_linux_kernels false
menuentry "Archlinux (ZBM)" {
loader \EFI\zbm\zfsbootmenu-v2.3.0.EFI
icon \EFI\refind\themes\nord\icons\os_arch.png
options "quiet loglevel=0"
}
menuentry "Windows 11 Pro" {
icon \EFI\refind\themes\nord\icons\os_win.png
loader \EFI\Microsoft\Boot\bootmgfw.efi
}
如果安装了theme,在这里导入
include themes/nord/theme.conf
}
三 、按照Archlinux wiki继续完成系统的安装
1、时区
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# hwclock --systohc
2、locale
# helix /etc/locale.gen
搜索en_US和zh_CN
取消下面两行的注释
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
保存退出
# locale-gen
3、LANG
不建议设为zh_CN
# echo "LANG=en_US.UTF-8" > /etc/locale.conf
4、主机名
# echo '主机名' > /etc/hostname
5、HOSTS
echo -e '127.0.0.1 localhost\n::1 localhost\n127.0.1.1 主机名' >> /etc/hosts
5、root密码
# passwd
四. 重启进入新系统
生成快照
# zfs snapshot zroot@install
# exit
# umount /mnt/efi
# zfs umount -a
# zpool export zroot
# reboot
五、重启后的一些设置
先用root登录
创建用户并设置密码
# useradd -m -G wheel 用户名
# passwd 用户名
设置一下sudo
# EDITOR=helix visudo
找到下面一行,取消注释
%wheel ALL=(ALL:ALL) ALL
双系统时间问题
百度:Windows 系统使用 UTC
# timedatectl set-ntp 1
设置archlinuxcn
# helix /etc/pacman.conf
取消Color和ParallelDownloads = 5 两行的注释,添加一行ILoveCandy(下载包时使用吃豆人动画)
Color
ParallelDownloads = 5
ILoveCandy
在文件最后加入archlinuxcn仓库
全部仓库地址在这里
[archlinuxcn]
Server = https://mirrors.bfsu.edu.cn/archlinuxcn/$arch
# pacman-key --lsign-key "farseerfc@archlinux.org"
# pacman -Sy archlinuxcn-keyring
安装rust,学习rust中~
先退出root,用自己的账号登录
配置rustup使用国内境像,编辑.bashrc,如果后期使用zsh,则在.zshrc中添加下面两行
$ ~/.bashrc
export RUSTUP_DIST_SERVER=“https://rsproxy.cn”
export RUSTUP_UPDATE_ROOT=“https://rsproxy.cn/rustup”
$ source ~/.bashrc
创建cargo文件夹,新建config文件,加入下面的内容
$ mkdir -v ~/.cargo
$ helix ~/.cargo/config
[source.crates-io]
replace-with = ‘rsproxy-sparse’
[source.rsproxy]
registry = “https://rsproxy.cn/crates.io-index”
[source.rsproxy-sparse]
registry = “sparse+https://rsproxy.cn/index/”
[registries.rsproxy]
index = “https://rsproxy.cn/crates.io-index”
[net]
git-fetch-with-cli = true
安装rust
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装paru
$ sudo pacman -S paru
修改一下paru配置文件,具体项目根据自己需求设置
$ sudo helix /etc/paru.conf
这是我的paru配置文件
[options]
PgpFetch
Devel
Provides
DevelSuffixes = -git -cvs -svn -bzr -darcs -always -hg -fossil
BottomUp
RemoveMake
SudoLoop = true
CleanAfter
安装字体
$ sudo pacman -S noto-fonts noto-fonts-cjk
打开字体引擎 (注:这个文件在安装桌面环境之后才会有)
$ helix /etc/profile.d/freetype2.sh
取消最后一行的注释
安装输入法
$ pacman -S fcitx5-im fcitx5-chinese-addons
$ sudo helix /etc/environment
加入下面的内容
INPUT_METHOD=fcitx
GTK_IM_MODULE=fcitx #这一行可以注释掉
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=ibus
AUR编译优化
$ sudo helix /etc/makepkg.conf
CFLAGS=“-march=native -O2 …” # 先将 -march 和 -mtune 删除,再添加 -march=native
MAKEFLAGS=“-j$(nproc)” # 不要忘记去掉“#”,多核处理器可以启用并行编译,缩短编译时间
BUILDDIR=/tmp/makepkg # 去掉“#”,使用内存文件系统进行编译
COMPRESSZST=(zstd -c -z -q --threads=0 -) # 在压缩时使用多个 CPU 核心
注意:
在 tmpfs 中构建大型软件包时可能会内存不足。
tmpfs 目录挂载时不能使用 noexec 选项,否则编译命令无法执行。
在 tmpfs 中编译的文件重启后会消失,设置 PKGDEST 选项可以将构建结果保存到其它目录。
OK,基本系统安装完毕
安装桌面可以看看我前几天写的Hyprland桌面安装