Hi,
最近成功的将完整的 Manjaro KDE edition 成功装在 ZFS 档案系统上
发现这里关于 ZFS 的讨论很少,于是想分享一下我的安装经验
原文发在 Manjaro 论坛上,有兴趣的也可以去看看
https://t.ly/C141
希望可以多推广 ZFS 在 Linux 上的使用.
教程上写的比我实际的情形来得简单许多. 比如我的 EFI 系统分割是装在软件磁盘阵列上, 教程中略过 RAID 设定的部份
========正文开始========
# 0. 准备 Live Media
随便找一个支援 ZFS 的版本并下载 ISO 档将其烧录成可开机媒介 (USB, DVD 等)
# 1. 开机并进入 Live environment
进入 BIOS/UEFI 将你的可开机媒介启动顺序调前并开机进入 Live 环境
# 2. 准备磁盘分割
我们要将系统碟至少做下列三个分割区:
(1) EFI system partition (ESP): 档案系统为 FAT32, 大小至少为 512 MB.
图形接口下记得加入 esp 旗标
(2) SWAP: 档案系统为 linuxswap, 大小依据内存及使用需求而异
(3) ZFS: 使用图形接口的话将其保留为未格式化, 然后标签为 Solaris Root
这里推荐使用 gdisk 做磁盘分割以利于设立正确的标签
# 3. 建立 ZFS pool 及 dataset
ZFS 档案系统使用虚拟磁盘机的概念, 我们可以将 pool 当作 container, 而 dataset 才是我们用来挂载的档案系统
这里要注意的是要事先规划好系统要使用哪种开机加载器 (GRUB 或 systemd-boot), 这将影响到建立 ZFS pool 的参数
首先以 sudo modprobe zfs 确认 zfs 模组已加载至核心
接着以 ls -lh /dev/disk/by-id 找出我们要用来建立 ZFS 的磁盘分割的 ID
再来使用下列指令来使用该磁盘分割建立 ZFS pool
sudo zpool create -f -o ashift=12 \
-O acltype=posixacl \
-O relatime=on \
-O xattr=sa \
-O dnodesize=legacy \
-O normalization=formD \
-O mountpoint=none \
-O canmount=off \
-O devices=off \
-R /mnt \
-O compression=lz4 \
<zfs-pool-name> /dev/disk/by-id/<id-to-partition-partx>
若是你要使用 GRUB 做为开机加载器的话, 使用以下指令
sudo zpool create -d -o ashift=12 \
-o [email protected]_classes=enabled \
-o [email protected]_destroy=enabled \
-o [email protected]=enabled \
-o [email protected]_data=enabled \
-o [email protected]_bpobj=enabled \
-o [email protected]_txg=enabled \
-o [email protected]_dataset=enabled \
-o [email protected]_limits=enabled \
-o [email protected]_birth=enabled \
-o [email protected]_blocks=enabled \
-o [email protected]_compress=enabled \
-o [email protected]_quota=enabled \
-o [email protected]_defer=enabled \
-o [email protected]_histogram=enabled \
-o [email protected]_v2=enabled \
-o [email protected]_accounting=enabled \
-o [email protected]_checkpoint=enabled \
<zfs-pool-name> /dev/disk/by-id/<id-to-partition-partx>
则该 ZFS pool 将只支援 GRUB 可使用的功能, 否则到后面执行 grub-install 时会失败
若想使用完整的 ZFS 功能, 推荐使用 systemd-boot 做为开机加载器, 设定上会简单点
接着若有其他的磁盘也想做为 ZFS 使用且该磁盘只有一个磁盘分割区的话, 那在建立 ZFS pool 时直接指定整颗磁盘 (没有-partx) 即可.
接着我们在已建立的 ZFS pool 底下建立 datasets 用来挂载系统
sudo zfs create -o mountpoint=none <zfs-pool-name>/manjaro
sudo zfs create -o mountpoint=/ -o canmount=noauto <zfs-pool-name>/manjaro/root
datasets 的层级设计很有弹性, 唯一要注意的是要挂载在 / 的 dataset 一定要加入 -o canmount=noauto
在所有的 ZFS pool 及 dataset 都建立好后, 我们要将其先汇出再汇入, 否则之后挂载会有问题
sudo zpool export <zfs-pool-name>
sudo zpool import -d /dev/disk/by-id -R /mnt <zfs-pool-name> -N
# 4. 挂载档案系统
先挂载做为 / 的 ZFS dataset
sudo zfs mount <zfs-pool-name>/<zfs-dataset-for-root>
若有其他 ZFS datasets 也依样画葫芦将其挂载. 接着再挂载其他非 ZFS 的档案系统及 ESP
此时注意若开机加载器使用的是 GRUB, 则将 ESP 挂载于 /mnt/boot/efi 下. 若使用 systemd-boot 的话则直接挂载在 /mnt/boot 底下即可.
接着我们要挂在于 / 的 ZFS pool 设定 bootfs 参数, 这样系统才知道要去哪里找系统
sudo zpool set bootfs=<zfs-pool-name>/<zfs-dataset-for-root> <zfs-pool-name>
然后为每个 ZFS pool 设定 cachefile 的位置
sudo zpool set cachefile=/etc/zfs/zpool.cache <zfs-pool-name>
最后将 zpool.cache 复制到准系统碟底下, 这样开机时才会自动挂载 ZFS datasets
sudo mkdir -p /mnt/etc/zfs
sudo cp /etc/zfs/zpool.cache /mnt/etc/zfs/zpool.cache
接着准系统的磁盘挂载都准备好在 /mnt 之下了. 以上的准备工作应该适用于各个发行版. 接下来的安装将会以 Manjaro 为主. 其他发行版若有手动安装的方式应该能自行套用
# 5. 使用官方发布的 iso-profile 及 basestrap 指令将完整系统安装到准系统碟
如果不想像 Arch 一样一切从基本系统开始的话, 我们可以用官方发布的 iso-profile 将完整的系统安装起来
首先先取得 iso-profile
git clone https://gitlab.manjaro.org/profiles-and-settings/iso-profiles.git ~/iso-profiles
底下有各个版本的 ISO 资料. 比如说我们想安装的是 KDE 版本, 我们就查看 ~/iso-profiles/manjaro/kde 这个目录, 底下应该有如下的档案结构
desktop-overlay
live-overlay -> ../../shared/manjaro/live-overlay
Packages-Desktop
Packages-Live -> ../../shared/Packages-Live
Packages-Mhwd -> ../../shared/Packages-Mhwd
Packages-Root -> ../../shared/Packages-Root
profile.conf
其中最重要的是 Packages-Desktop Packages-Root 这两个档案, 及 desktop-overlay 资料夹
那两个档案中是该 版本所安装的套件, 而 desktop-overlay 里是 Manjaro 为该版本所默认的设定档
需要注意的是 Packages-Root 里面的 KERNEL 套件为核心, 使用者需自行以 linux510 之类的名称来替换
我们接着随便以任何方法将里面的套件整理成清单, 要注意 KERNEL-zfs (linux510-zfs) 及 zfs-utils 这两个套件必须在清单内以提供 ZFS 支持
接着以 basestrap 安装所有清单内的套件
sudo basestrap /mnt <所有所需套件>
安装完之后, 再将 desktop-overlay 里的所有东西复制到 /mnt 底下, 系统就算基本安装完了. 我们还得先做些基本设定以确保系统能正常运作
第一件事是编辑 /etc/fstab 以让系统自动挂载其他非 ZFS 档案系统, 再来是在 initramfs 中加入 ZFS 的支持, 并且安装开机加载器及启动必要的 systemd 服务
在进入 chroot 环境之前, 我们先以 ls -lh /dev/disk/by-uuid 找出其他分割区的 UUID
接着执行
sudo manjaro-chroot /mnt /bin/bash
以 bash 进入 /mnt 的 chroot 环境
接着编辑 /etc/fstab, 内容大概如下
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump>
<pass>
UUID=1A66-24E1 /boot vfat defaults 0 0
UUID=5af3f596-1068-457f-9d64-4db5aa649caa none swap defaults 0 0
UUID=388de0df-1d0b-4f78-b6a7-2888859d3fa1 none swap defaults 0 0
再来我们编辑 /etc/mkinitcpio.conf 档案以对 initramfs 加入 zfs 支持
找到 HOOKS 那行, 并在 keyboard 及 filesystem 之间加入 zfs, 内容大概如下
HOOKS=(base udev autodetect modconf block keyboard zfs filesystems fsck)
接着执行 mkinitcpio -P 以重新建立 initramfs 供开机使用
接着安装开机加载器. 如果使用 GRUB 的话, 执行
grub-install