ROOT
ROOT
文章目录
  1. 背景
  2. ISO 加载最小系统
  3. 备份已有系统
  4. 重建文件系统
  5. 更新 GRUB
  6. 注意事项
  7. 参考链接

使用 ZFS 作为 Linux 根文件系统

背景

现代文件系统一般支持 CoW、快照等特性,如果将它作为操作系统的根文件系统,那么可靠性能更胜一筹。

本文主要记录将现有的 Arch Linux 转成使用 ZFS 文件系统的过程,注意系统需要提前装上 zfs,这可以通过安装 zfs-dkms 包。

ISO 加载最小系统

重启系统进入 UEFI,选择安装镜像 iso 进入,该最小系统作为操作环境。官方提供的 archlinux-x86_64.iso 默认不支持 zfs,目前有两种方式:

备份已有系统

进入最小系统后,将 rootfs 挂载到 /mnt/ 下,同时挂载备份/mnt2

# mount /dev/vda2 /mnt # mount /dev/vdb /mnt2 # rsync -aAXHPv /mnt /mnt2 # umount /mnt

重建文件系统

目前系统存在两个分区 bootrootfs

# fdisk -l Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 88BCFD5A-DBB8-4B45-93C4-87C4DC4C5861 Device Start End Sectors Size Type /dev/vda1 2048 1026047 1024000 500M EFI System /dev/vda2 1026048 41940991 40914944 19.5G Linux filesystem

使用 fdisk 调整 rootfs 的类型为Solaris root

# fdisk /dev/vda Welcome to fdisk (util-linux 2.38.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): t Partition number (1,2, default 2): 2 Partition type or alias (type L to list all): 156 Changed type of partition 'Linux filesystem' to 'Solaris root'. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.

查看 rootfs 的 PARTID,并利用 zpool 创建池:

# blkid /dev/vda2 /dev/vda2: PARTUUID="fb4e1dbd-bf9a-3e41-bef3-f862d0eb699d" # zpool create -f -o ashift=12 -O atime=off -O compression=lz4 -O canmount=off -R /mnt zroot fb4e1dbd-bf9a-3e41-bef3-f862d0eb699d

创建两个 dataset,主要分别存放系统文件和用户数据文件:

# zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT # zfs create -o mountpoint=none zroot/DATA

系统分区:

# zfs create -o mountpoint=/var -o acltype=posixacl -o xattr=sa zroot/ROOT/var

数据分区:

# zfs create -o mountpoint=/home zroot/DATA/home # zfs create -o mountpoint=/root zroot/DATA/root

检查配置:

# zfs list -r zroot NAME USED AVAIL REFER MOUNTPOINT zroot 1.10M 18.9G 96K /mnt/zroot zroot/DATA 288K 18.9G 96K none zroot/DATA/home 96K 18.9G 96K /mnt/home zroot/DATA/root 96K 18.9G 96K /mnt/root zroot/ROOT 192K 18.9G 96K /mnt zroot/ROOT/var 96K 18.9G 96K /mnt/var

恢复数据:

# zpool export zroot # zpool import -d /dev/disk/by-partuuid/fb4e1dbd-bf9a-3e41-bef3-f862d0eb699d -R /mnt zroot -N # zfs mount zroot/ROOT # zfs mount -a # rsync -aAXHPv /mnt2/ /mnt/

挂载 boot 分区:

# mount /dev/vda1 /mnt/boot

设置启动标记:

# zpool set bootfs=zroot/ROOT zroot

更新 GRUB

使用 arch-chroot 进入系统:

# arch-chroot /mnt

删掉 /etc/fstab 多余的项,仅留下 `/boot’:

# cat /etc/fstab # <file system> <dir> <type> <options> <dump> <pass> UUID=482D-024B /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2

编辑 /etc/mkinitcpio.conf,将zfs 模块加到 HOOK 项里,注意顺序放到 keymap 后边:

HOOKS=(base udev autodetect modconf kms keyboard keymap zfs consolefont block filesystems fsck)

生成 initramfs:

# mkinitcpio -p linux

更新 grub 配置:

# grub-mkconfig -o /boot/grub/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-linux Found initrd image: /boot/initramfs-linux.img Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. Adding boot menu entry for UEFI Firmware Settings ... done

最后重启进入系统。

[root@archlinux ~]# neofetch -` root@archlinux .o+` -------------- `ooo/ OS: Arch Linux x86_64 `+oooo: Host: KVM/QEMU (Standard PC (Q35 + ICH9, 2009) pc-q35-7.2) `+oooooo: Kernel: 6.2.2-arch2-1 -+oooooo+: Uptime: 7 mins `/:-:++oooo+: Packages: 191 (pacman) `/++++/+++++++: Shell: bash 5.1.16 `/++++++++++++++: Resolution: 1280x800 `/+++ooooooooooooo/` Terminal: /dev/pts/0 ./ooosssso++osssssso+` CPU: Intel N100 (1) @ 806MHz .oossssso-````/ossssss+` GPU: 00:01.0 Red Hat, Inc. Virtio GPU -osssssso. :ssssssso. Memory: 210MiB / 946MiB :osssssss/ osssso+++. /ossssssss/ +ssssooo/- `/ossssso+/:- -:/+osssso+- `+sso+:-` `.-/+oso: `++:. `-/+/ .` `/ [root@archlinux ~]# df -h Filesystem Size Used Avail Use% Mounted on dev 463M 0 463M 0% /dev run 474M 732K 473M 1% /run zroot/ROOT 19G 3.2G 16G 18% / zroot/ROOT/var 16G 639M 16G 4% /var tmpfs 474M 0 474M 0% /dev/shm tmpfs 474M 0 474M 0% /tmp zroot/DATA/home 16G 44M 16G 1% /home zroot/DATA/root 16G 256K 16G 1% /root /dev/vda1 499M 90M 410M 18% /boot tmpfs 95M 0 95M 0% /run/user/0

注意事项

考虑 /var 作为 dataset 存在,在挂载之前 journald 已经往 /var 写日志,因此 zfs 将无法卸载 /var,考虑使用zfs-mount-generator 方案:https://wiki.archlinux.org/title/ZFS#Using_zfs-mount-generator

参考链接

支持一下
扫一扫,支持Netcan
  • 微信扫一扫
  • 支付宝扫一扫