作者dobedobedo (DoBe)
看板Linux
标题[分享] 在ZFS档案系统上安装完整Manjaro
时间Tue Jun 8 00:27:15 2021
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 feature@allocation_classes=enabled \
-o feature@async_destroy=enabled \
-o feature@bookmarks=enabled \
-o feature@embedded_data=enabled \
-o feature@empty_bpobj=enabled \
-o feature@enabled_txg=enabled \
-o feature@extensible_dataset=enabled \
-o feature@filesystem_limits=enabled \
-o feature@hole_birth=enabled \
-o feature@large_blocks=enabled \
-o feature@lz4_compress=enabled \
-o feature@project_quota=enabled \
-o feature@resilver_defer=enabled \
-o feature@spacemap_histogram=enabled \
-o feature@spacemap_v2=enabled \
-o feature@userobj_accounting=enabled \
-o feature@zpool_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 --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Manjaro
grub-mkconfig -o /boot/grub/grub.cfg
如果使用的是 systemd-boot 的话, 执行
bootctl install
然後建立 /boot/loader/entries/manjaro5.10.conf 的 entry 设定档, 内容大约如下
title Manjaro Linux 5.10
linux /vmlinuz-5.10-x86_64
initrd /amd-ucode.img
initrd /intel-ucode.img
initrd /initramfs-5.10-x86_64.img
options zfs=zroot/manjaro/root rw
此设定档也可以透过安装 systemd-boot-manager 并执行sdboot-manage gen 来自动産生
接着启动必要的 systemd 服务使系统能自动挂载 ZFS datasets
systemctl enable zfs.target
systemctl enable zfs-import-cache
systemctl enable zfs-mount
systemctl enable zfs-import.target
接着启动显示管理员 (display manager) 的服务使系统能直接在开机时进入桌面环境
以 KDE 版本为例, 其预设的显示管理员为 SDDM, 因此我们启动
systemctl enable sddm.service
最後, 我们需要在系统産生 hostid 的设定档, 否则系统在关机或重开机的过程中会无法卸载 ZFS
执行
zgenhostid $(hostid)
至此为止, 系统已安装完成且可正常运作. 下一步我们将客制化系统.
# 6. 设置系统并新增一般使用者
以下的设置流程应该也适用其他发行版. 我们将设定键盘配置, 系统语言, 时区, 系统时钟, 主机名称, 主机名称设定档, 开启管理员权限, 网路功能, 时间同步功能及 Root 密码
接着上面的流程, 我们还是在 chroot 环境之下
6.1 键盘配置
键盘配置的清单位於 /usr/share/kbd/keymaps 底下. 键盘配置的设定档位於 /etc/vconsole.conf 预设为 US 键盘, 内容为
KEYMAP=us
FONT=
FONT_MAP=
若想改用其他如德国键盘配置, 将 us 改为 de 即可
6.2 系统语言
编辑 /etc/locale.gen 档案, 将想使用的语言 ( 如 zh-TW.UTF-8) 去掉注解, 然後执行
locale-gen
然後编辑 /etc/locale.conf 档案, 将 LANG 参数设定为指定的语言
6.3 时区
时区列表位於 /usr/share/zoneinfo/ 之下. 如要设定为台湾时区, 我们可将 /usr/share/zoneinfo/Asia/Taipei 符号连结到 /etc/localtime
ls -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime
6.4 系统时钟
让系统使用 UTC 加上时区资讯的方式记录时间
hwclock --systohc --utc
6.5 主机名称
设定主机名称
echo 主机名称 > /etc/hostname
6.6 主机名称设定档
编辑 /etc/hosts, 内容大约如下
127.0.0.1 localhost
::1 localhost
127.0.1.1 主机名称.localdomain 主机名称
如果系统使用静态 IP 连接网路的话, 将 127.0.1.1 改成该 IP 即可
6.7 设定管理员权限
此步骤是为了让 wheel 群组的成员有管理员权限
执行
visudo
然後找到 %wheel ALL=(ALL) ALL 的行并移除开头的注解符号
按 ESC+shift+z+z 存档并离开
6.8 开启网路功能
systemctl enable NetworkManager
6.9 开启时间同步功能
systemctl enable systemd-timesyncd
6.10 设定 Root 密码
passwd
6.11 建立一般使用者
useradd -m -G lp,network,power,sys,wheel -s /bin/bash 使用者名称
passwd 使用者名称
若不想让使用者有管理员权限的话, 不要加入 wheel 群组即可
至此我们已完成所有系统设定. 可输入 exit 离开 chroot 环境
# 7 卸载档案系统并汇出 ZFS pool
ZFS pool 必须要先汇出, 否则在重开机後挂载将出现问题
首先先卸载非 ZFS 档案系统 (如 /boot)
sudo umount 挂载点
再来卸载所有 ZFS datasets
sudo zfs unmount -a
最後汇出所有 ZFS pool
sudo zpool export <zfs-pool-name>
接着就能重新开机, 系统应当能正常运作并进入桌面环境了.
# 设定例行性资料擦洗
例行性资料擦洗 (data scrubbing) 是维持 ZFS pool 良好的秘诀. 使用者可自行建立 systemd 服务与计时器来安排例行性资料擦洗
Arch Linux 及其分支发行版可安装 AUR 套件 systemd-zpool-scrub.
该套件会建立 zpool scrub 的 systemd 服务及计时器, 预设为每周排程
启动计时器的指令为
sudo systemctl enable zpool-scrub@<zfs-pool-name>.timer
========心得========
ZFS 是个先进的档案系统, 有许多优秀的功能能防止资料损毁, 并提供了相当的弹性.
以上的流程主要为 Manjaro, 但在准备磁碟分割及 ZFS dataset 的部份应适用於各发行版. 使用者可在安装系统及客制化的部份根据各发行版自行调整.
希望以上教程能帮助推广 ZFS 在 Linux 上的普及.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 109.171.229.79 (沙乌地阿拉伯)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1623083242.A.53A.html
※ 编辑: dobedobedo (109.171.229.79 沙乌地阿拉伯), 06/08/2021 00:29:04
1F:推 Jerr: 推 06/08 01:37
※ 编辑: dobedobedo (109.171.229.79 沙乌地阿拉伯), 06/08/2021 02:52:57
2F:推 mihonisizumi: 推 想请问大大觉得zfs btrfs xfs在一般个人使用上有 06/08 18:57
3F:→ mihonisizumi: 什麽主要差异吗 谢谢 06/08 18:58
我看到的资讯是 Btrfs 目前的稳定性还不够 (尤其是在RAID上), 且不支援 native encryption. 有些工具如 btrfs check 还会造成磁碟问题.
XFS 的话看到是对大档案的处理速度相当快, 但不适合用於储存很多小档案.
ZFS 大概只是因为 licence 问题所有比较没有普及, 但他在功能上应该算得上最先进的. 他在设计时就是 128 位元架构, 所以不用担心未来系统扩充的问题.
※ 编辑: dobedobedo (109.171.229.79 沙乌地阿拉伯), 06/08/2021 22:23:49
4F:推 bamchisu: 推 ZFS 号称究极档案系统 06/08 23:28
5F:推 s9209122222: 所以 EXT4 不好吗? 06/09 00:17
以家用使用者来说 EXT4 没什麽问题. 使用其他档案系统只是为了更优化的效能及其他资料管理的目的.
※ 编辑: dobedobedo (109.171.229.79 沙乌地阿拉伯), 06/09/2021 21:28:02
6F:推 Hurricaneger: 没办法,Oracle家的东西,要用还是会怕怕。 06/11 01:58
7F:→ Adama: 不是有OpenZFS吗 06/11 11:32
8F:→ dobedobedo: Linux 上的 ZFS 是 OpenZFS, 跟 Oracle 无关 06/11 14:33
9F:推 extraymond: 激推zfs,搭lxd做测试环境snapshot回溯都超方便!! 06/11 23:28
10F:推 Adama: zfs回溯lxd snapshot只能回溯最新的那个,更旧的就不行了 06/13 16:33
12F:→ Adama: btrfs还比zfs多了两个yes 06/13 16:35
13F:推 extraymond: 感谢A大分享,跳板切我都乖乖发布.. btrfs可以自由跳? 06/13 22:12
14F:→ extraymond: 如果只是要切版用copy+rename也可以,这样就不用一个 06/13 22:13
15F:→ extraymond: 一个回溯 06/13 22:14
16F:推 extraymond: 看到文件了!改天来玩玩看,再次感谢A大推荐 06/13 22:41
17F:推 zwin: 要用zfs的话直上BSD吧 06/15 14:03
18F:→ dobedobedo: 很多 Linux 上的桌面软体 BSD 不支援唷 06/15 15:56
19F:推 holishing: 哪个BSD www 06/16 05:24
20F:→ holishing: 很多 Windows 上的桌面软体 Linux 也不支援唷 06/16 05:26
21F:→ dobedobedo: 我以为一般讲的 BSD 是指 FreeBSD XD 06/16 13:44