在 ZFS 上使用原生加密的根目录
本指南介绍如何在加密的 ZFS 卷上安装 Alpine Linux 的根分区,使用 ZFS 自身的加密功能。系统在关机时将被加密,需要在启动时输入密码短语才能解锁。为了能够启动系统,`/boot` 分区保持未加密状态。
OpenZFS 指南
OpenZFS 网站上的指南支持原生加密、UEFI 启动和传统启动以及多磁盘。请参阅此处。
下载 Alpine
从 https://alpinelinux.cn/downloads/ 下载 extended 版本,因为在撰写本文时 (2022-02-12) 只有它包含 zfs 内核模块。
将其写入 USB 设备并从中启动。
初始设置
运行以下命令开始安装过程
setup-alpine
回答所有问题,并在提示您要使用的磁盘时按 Ctrl+C。
可选:SSH 访问
本节是可选的,并假设您已连接互联网。您可以启用 sshd,以便您可以通过 SSH 连接到该机器,并将这些说明中的其余命令复制粘贴到终端窗口中。
编辑 /etc/ssh/sshd_config 并搜索 `Permit`。将 `PermitRootLogin` 后面的值更改为 `yes`
保存并退出到 shell。运行 service sshd restart
现在您可以 root 用户身份通过 SSH 登录。完成后不要忘记返回并注释掉此行,因为它将在生成的机器上启用。本文档末尾会再次提醒您。
添加必需的软件包
apk add zfs sfdisk e2fsprogs syslinux
分区设置
我们假设 /dev/sda 是本文档中目标存储设备,但您要安装到的存储设备名称可能不同。要查看存储设备列表并确定正确的设备,请键入 sfdisk -l。
echo -e "/dev/sda1: start=1M,size=100M,bootable\n/dev/sda2: start=101M" | sfdisk --quiet --label dos /dev/sda
创建设备节点
mdev -s
创建 /boot 文件系统
mkfs.ext4 /dev/sda1
ZFS 设置
创建根 zpool
modprobe zfs zpool create -f -o ashift=12 \ -O acltype=posixacl -O canmount=off -O compression=lz4 \ -O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa \ -O encryption=aes-256-gcm -O keylocation=prompt -O keyformat=passphrase \ -O mountpoint=/ -R /mnt \ rpool /dev/sda2
此时您将必须输入密码短语。请明智地选择,因为您的密码短语很可能 是此设置中最薄弱的环节。
关于提供给 zpool 的选项的一些注意事项
- ashift=12 在这里推荐,因为今天许多驱动器都有 4KiB (或更大) 的物理扇区,即使它们呈现 512B 逻辑扇区
- acltype=posixacl 全局启用 POSIX ACL
- normalization=formD 消除了与 UTF-8 文件名规范化相关的一些极端情况。它还启用 `utf8only=on`,这意味着只接受具有有效 UTF-8 文件名的文件。
- xattr=sa 大大提高了扩展属性的性能,但仅限于 Linux。如果您关心在其他 OpenZFS 实现上使用此池,请不要指定此选项。
完成此操作后,确认池已创建
# zpool status
应该返回类似以下内容
pool: rpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 sda2 ONLINE 0 0 0 errors: No known data errors
创建所需的数据集并挂载根目录
zfs create -o mountpoint=none -o canmount=off rpool/ROOT zfs create -o mountpoint=legacy rpool/ROOT/alpine mount -t zfs rpool/ROOT/alpine /mnt/
挂载 /boot 文件系统
mkdir /mnt/boot/ mount -t ext4 /dev/sda1 /mnt/boot/
启用 ZFS 服务
rc-update add zfs-import sysinit rc-update add zfs-mount sysinit
安装 Alpine Linux
setup-disk /mnt dd if=/usr/share/syslinux/mbr.bin of=/dev/sda # 写入 mbr 以便我们可以启动
重启并享受!
😉
注意: 如果您执行了可选步骤,请务必在重启后禁用 root 登录。