公告

Gentoo交流群:87709706 欢迎您的加入

#1 2023-05-30 18:20:15

semes
管理团队
注册时间: 2022-11-09
帖子: 24

gentoo on zfs

在OpenZFS上安装Gentoo Linux
前言本指南将向您展示如何在x86_64上安装Gentoo Linux:

* UEFI-GPT (EFI System Partition - Unencrypted FAT32 partition as per UEFI Spec)
* /boot on ZFS (Featureless & Unencrypted)
* /, /home on ZFS (Encrypted ZFS if desired)
* swap on a regular partition
* OpenZFS 2.1.4
* GRUB 2.04+
* OpenRC (or systemd)
* Gentoo Stable (x86_64)

所需工具
您将需要一个包含OpenZFS的ISO。幸运的是,Gentoo管理光盘提供了所需的软件包。你可以从Gentoo下载页面下载“管理光盘”。之后,我们将使用它来制作可启动的USB。

Linux目录
对于以下命令,我们将假设您的 USB 是 /dev/sda。

格式化 USB
root #dd if=admincd-amd64-20220612T170541Z_OpenZFS_2.1.4.iso of=/dev/sda bs=1M status=progress
root #sync




windows系统
Rufus是我在Windows上推荐的USB实用程序。refus

启动refus
从“设备”下拉列表中选择您的 USB 设备。
通过单击选择选择您的 ISO。
分区方案:MBR
目标系统:BIOS 或 UEFI
卷标: 管理光盘
文件系统:FAT32
群集大小:4096 字节(默认)
单击“开始”。

通用写入磁盘镜像   balenaEtcher
gui 操作
选择gentoo_live.iso 
选择驱动器
flash!!!


这应该是拥有可启动 USB 所需的全部内容。

假设
只在单个驱动器上安装Gentoo(同一池中的多个驱动器应该会自动工作)。
/boot 池是无特征且未加密的。
/boot/efi 是符合 UEFI 规范的未加密 FAT32 分区。
交换分区位于 ZFS 外部且位于专用分区上。
正在使用 GRUB 2.04+
Gentoo Admin CD (包含 OpenZFS)
Kernel: gentoo-kernel-bin
Initramfs: Bliss-initramfs
初始化:OpenRC



您可以自由地用上述任何内容代替您想要的任何内容。但是,支持将 仅在使用上述配置时由我提供。此外,本指南是方式 我安装Gentoo,不完全是手册上的方式。

将系统引导至 ISO
由于这高度依赖于计算机,因此您需要弄清楚如何启动USB 在您的系统上,然后进入实时环境。如果出现这种情况,您可能需要禁用安全启动 导致您的 USB 被拒绝。确保您的系统 BIOS/UEFI 设置为启动 UEFI 设备, 而不是 BIOS 设备(旧版)。

确认您在 UEFI 模式下启动
启动到 Live CD 后,请确保通过键入以下内容引导到 UEFI 模式:

root #ls /sys/firmware/efi
如果上述目录为空或不存在,则您未处于 UEFI 模式。 重新启动并启动到 UEFI 模式。

警告
在不处于 UEFI 模式的情况下继续安装 很可能会产生无法启动的系统。如果要在 BIOS 模式下安装,则需要不同的设置。
分区
我们现在将对驱动器进行分区,并旨在创建以下布局(对于指南的其余部分,我们将假设 /dev/nvme0n1 是您的主驱动器):

/dev/nvme0n1p1   | 512 MiB        |   EFI System Partition                            | /boot/efi
/dev/nvme0n1p2   | 1024 MiB      |   Boot Partition (ZFS, No Feature Flags)   | /boot
/dev/nvme0n1p3   | 2048 MiB      |   swap                                                  | swap
/dev/nvme0n1p4   | Rest of Disk  |   ZFS (or Encrypted ZFS)                        | /, /home, ...
警告
有许多 UEFI 主板固件非常有问题。我们将尝试使用 512 MiB FAT32 分区配置来提高成功率。
在 GNU parted 中打开您的驱动器并告诉它使用最佳对齐方式:

root #parted -a optimal /dev/nvme0n1
警告
请记住,以下所有操作将立即影响磁盘。GNU parted 不会像 fdisk 或 gdisk 那样进行更改。
将单位设置为兆字节
(parted)unit mib
创建 GPT 分区布局
这将删除所有分区并创建新的 GPT 表。

(parted)mklabel gpt
创建并标记分区
(parted)mkpart esp 1 513
(parted)mkpart boot 513 1537
(parted)mkpart swap 1537 3585
(parted)mkpart rootfs 3585 -1
在 ESP 分区上设置可引导标志
(parted)set 1 boot on
最终视图
(parted)print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/nvme0n1: 40960MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start    End       Size      File system  Name     Flags
1      1.00MiB  513MiB    512MiB                 primary
2      513MiB   1537MiB   1024MiB                boot
3      1537MiB  3585MiB   2048MiB                swap
4      3585MiB  40959MiB  37374MiB               rootfs

退出应用程序

(parted)quit
格式化驱动器
创建启动分区
root #mkfs.fat -F32 /dev/nvme0n1p1
警告
此分区必须是 FAT32,因为它是 UEFI 要求。否则,您的系统将无法启动!
创建你的 zpool
创建您的 zpool,其中包含您的驱动器和数据集:

root #zpool create -f -o ashift=12 -o cachefile= -O compression=lz4 -O atime=off -m none -R /mnt/gentoo tank /dev/nvme0n1p4
如果要使用本机 zfs 加密(带有密码),只需同时指定 -O 加密=on -O keyformat=passphrase 选项即可。

创建您的 zfs 数据集
我们将保持简单,只为 / 和 /home 创建一些数据集。ZFS 非常灵活,您将来可以轻松添加或删除数据集。

root #zfs create tank/os
root #zfs create -o mountpoint=/ tank/os/main
root #zfs create -o mountpoint=/home tank/home
创建启动池
对我们来说,创建一个单独的 zpool 会更安全,该 zpool 禁用了所有功能标志。这是因为即使 grub 当前支持 ZFS 0.6.5 版本的最新功能标志,在没有适当引导加载程序支持的情况下添加到 ZFS 的新功能标志也会使您的系统无法引导。由于 GRUB 2 对没有功能标志的 zpool 有坚实的支持,我们将创建一个单独的无功能引导池。但是,我们的主系统仍将启用所有功能。

root #zpool create -f -d -o ashift=12 -o cachefile= -m /boot -R /mnt/gentoo boot /dev/nvme0n1p2
警告
切勿在启动池上进行 zpool 升级或启用加密!这样做会使您的系统无法启动。
创建您的交换
root #mkswap -f /dev/nvme0n1p3
root #swapon /dev/nvme0n1p3
注意
不要以任何容量(数据集或 zvol)将交换放入 ZFS 中。当我的 RAM 为 100% 并且系统在 ZFS 上交换时开始交换时,我经历过锁定。当交换位于正常分区上时,它不会崩溃。
验证一切正常
您可以通过运行以下命令来验证所有这些操作是否正常工作:

root #zpool status
  pool: boot
state: ONLINE
status: The pool is formatted using a legacy on-disk format.  The pool can
        still be used, but some features are unavailable.
action: Upgrade the pool using 'zpool upgrade'.  Once this is done, the
        pool will no longer be accessible on software that does not support
        feature flags.
  scan: none requested
config:

        NAME             STATE     READ WRITE CKSUM
        boot             ONLINE       0     0     0
          nvme0n1p2      ONLINE       0     0     0

errors: No known data errors

  pool: tank
state: ONLINE
  scan: none requested
config:

        NAME             STATE     READ WRITE CKSUM
        tank             ONLINE       0     0     0
          nvme0n1p4      ONLINE       0     0     0

errors: No known data errors
root #zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
boot                     36.2M  742M     35.1M  /boot
tank                     315G   402G      192K  none
tank/home                320K   402G      320K  /home
tank/os                  310G   402G      310G  /
tank/os/main             310G   402G      310G  /
现在我们已经准备好安装Gentoo了!

安装Gentoo浏览器
设置日期和时间
假设现在是 18 年 2022 月 11 日 @ 48:23 下午(48 小时内为 24:<>),我们将执行以下操作:

root #date 061823482022

06 18 2348 2022(月、日、24小时时间、年)。目前将是UTC,但您可以在重新启动后修复它。
准备唱歌
首先,让我们将 EFI 引导分区挂载在 chroot 目录中:

root #cd /mnt/gentoo
root #mkdir boot/efi
root #mount /dev/nvme0n1p1 boot/efi
并在此处下载 OpenRC(或 systemd)amd64 映像并将其解压缩:

root #wget <file>
root #tar xpf <file>
注意:
您还可以在我的服务器上找到管理员 CD 的镜像副本:https://xyinn.org/gentoo/livecd/。
复制 zpool 缓存
root #mkdir etc/zfs
root #cp /etc/zfs/zpool.cache etc/zfs
复制网络设置
root #cp /etc/resolv.conf etc/
安装所需设备
root #mount --rbind /dev dev
root #mount --rbind /proc proc
root #mount --rbind /sys sys
root #mount --make-rslave dev
root #mount --make-rslave proc
root #mount --make-rslave sys
进入您的环境
root #env -i HOME=/root TERM=$TERM chroot . bash -l
编辑 fstab
一切都在 zfs 上,所以除了 efi 目录和交换条目之外,我们不需要任何东西。 我的 fstab 如下所示:

root #nano /etc/fstab

/dev/nvme0n1p1               /boot/efi       vfat            noauto        1 2
/dev/nvme0n1p3               none            swap            sw            0 0
警告
不要自动挂载 /boot/efi 分区。如果这样做,init 系统将创建 /boot/efi 文件夹(如果不存在),这将阻止引导 zpool 挂载。
修改 make.conf
让我们修改我们的 /etc/portage/make.conf,这样我们就可以开始安装具有良好基础的东西(将其更改为您需要的内容):

root #nano /etc/portage/make.conf

USE="-branding"

# This should be your number of processors + 1
MAKEOPTS="-j5"

EMERGE_DEFAULT_OPTS="--with-bdeps=y --keep-going=y --quiet-build=y"
FEATURES="buildpkg"
LINGUAS="en en_US"

# This is required so that when we compile GRUB later, EFI support is built.
GRUB_PLATFORMS="efi-64"
获取搬运树
复制默认示例搬运配置

root #cp /usr/share/portage/config/repos.conf /etc/portage/repos.conf
root #emerge --sync
内核安装
为了简单起见,我们将只使用预构建的gentoo内核。

禁用“initramfs”USE标志
由于我们使用的是 bliss-initramfs,我们将禁用 gentoo-kernel-bin 上的 'initramfs' USE 标志。

root #echo "sys-kernel/gentoo-kernel-bin -initramfs" >> /etc/portage/package.use/gentoo-kernel-bin
安装内核
root #emerge gentoo-kernel-bin
注意
考虑固定已安装的内核版本,以便在将来进行内核升级时,emerge --depclean 不会从 /boot 目录中删除我们的内核文件。如果出现安装的 gentoo-kernel ebuild 是:gentoo-kernel-bin-5.15.48,我们会做:

root #emerge --noreplace =gentoo-kernel-bin-5.15.48
安装所需的应用程序
在 GRUB 中启用 ZFS 支持

root #echo "sys-boot/grub libzfs" >> /etc/portage/package.use
现在安装应用程序:

root #emerge bliss-initramfs grub zfs
将引导加载程序安装到驱动器上
我们需要将引导加载程序安装到驱动器上。但是,在我们这样做之前,让我们看看 GRUB 是否可以检测到我们的 /boot 和 /boot/efi 文件系统类型:

root #grub-probe /boot
这应该说“zfs”。如果没有,则出现问题,您的系统将无法启动!

root #grub-probe /boot/efi
这应该说“胖”。如果没有,则出现问题,您的系统将无法启动!

在安装引导加载程序之前,我们需要对 efi nvram 变量具有读/写访问权限。现在让我们重新挂载我们的 efivar:

root #mount -o remount,rw /sys/firmware/efi/efivars/
现在运行以下命令将引导加载程序安装到驱动器:

root #grub-install --efi-directory=/boot/efi
上面的命令会将 grub 引导加载程序文件安装到 /boot 中,将 efi 文件安装到 /boot/efi 中。它应返回“安装已完成。未报告错误。如果没有,则出现问题,您的系统将无法启动!

警告
如果在重新启动后 UEFI 主板未检测到引导加载程序,则可能是因为主板固件有问题。尝试将“--可移动”标志传递给 grub 安装,然后重试。这会将 efi 文件安装到 EFI 规范的回退目录。
创建 GRUB 2 配置文件
您可以使用以下配置文件作为系统的基础:

root #nano /boot/grub/grub.cfg

set default=0
set timeout=1

insmod part_gpt
insmod fat
insmod efi_gop
insmod efi_uga

menuentry "Gentoo - 5.15.48-gentoo-dist" {
    linux /@/vmlinuz-5.15.48-gentoo-dist root=tank/os/main by=id elevator=noop quiet logo.nologo refresh
    initrd /@/initrd-5.15.48-gentoo-dist
}
如果您使用的是本机 ZFS 加密,请将加密标志也添加到内核行中。

在重新启动之前/之后生成新的 zpool.cache 文件
ZFS 对 zpool.cache 文件中包含的数据非常敏感,此时,当我们重新启动时,其中的信息可能并不完全准确。为了确保我们有一个好的缓存文件,我们在上面的引导加载程序配置中指示 bliss-initramfs,忽略系统上的当前缓存文件,并创建一个最新的新缓存文件。我们只需要这样做一次。

生成 initramfs 并将文件移动到正确的位置
在生成 initramfs 之前,请确保编辑 /etc/bliss-initramfs/settings.json 并包含引导系统所需的任何内核模块。在本指南中,我们需要加载 nvme 驱动程序,因为 gentoo-kernel-bin 将此驱动程序编译为模块。如果您的系统启动失败,则可能与未加载内核模块丢失有关。按照恢复部分中的说明返回到您的环境。

root #nano /etc/bliss-initramfs/settings.json

"modules": {
        "files": ["nvme"]
},
现在生成你的 initramfs 并将其移动到正确的位置:

root #bliss-initramfs -k 5.15.48-gentoo-dist
root #mv initrd-5.15.48-gentoo-dist /boot
重新启动前的最后步骤

OpenRC

root # rc-config add zfs-import boot
root # rc-config add zfs-mount boot

systemd

root # systemctl enable zfs.target
root # systemctl enable zfs-import-cache
root # systemctl enable zfs-mount
root # systemctl enable zfs-import.target
现在是魔术命令(交叉手指哈哈):

root # passwd
root # exit
root # reboot
重新启动后
从引导加载程序配置中删除 zpool.cache 刷新标志
打开你的 grub.cfg并从内核行中删除刷新标志。

root #nano /boot/grub/grub.cfg
导入启动池
您现在可以挂载启动池,以便 /boot 目录在 后续重新启动。启动池将通过缓存文件自动记住:

root #zpool import -o cachefile= boot
拍摄新系统的快照
由于我们现在有一个工作系统,我们将在想要返回或恢复文件时对其进行快照:

root #zfs snapshot boot@2022-06-18-2241-55-INSTALL
root #zfs snapshot -r tank@2022-06-18-2241-55-INSTALL
您可以通过检查这些快照各自的隐藏 .zfs 目录来查看这些快照的内容:

root #ls /boot/.zfs/snapshots
root #ls /.zfs/snapshots
root #ls /home/.zfs/snapshots
注意
我们以这种格式命名快照,因为它是我的“bliss-zfs-scripts”使用的格式,而且它也非常可读。
限制 ARC 大小
如果你想限制 ZFS ARC 增长超过某个点,你可以将字节数放在 /etc/modprobe.d/zfs.conf 文件中,然后重新制作你的 initramfs。当系统启动并加载模块时,这些选项将传递给 zfs 内核模块。(临时)将正在运行的系统的最大 ARC 更改为 4 GB

root #echo 4294967296 >> /sys/module/zfs/parameters/zfs_arc_max
(永久)将 4 GB ARC 上限另存为可加载内核参数

root #echo "options zfs zfs_arc_max=4294967296" >> /etc/modprobe.d/zfs.conf
一旦我们创建了上面的文件,让我们重新生成 initramfs。Bliss-initramfs Will 自动检测此文件是否存在,并将其复制到 InitramFS 中。重新启动时 您的机器,Initramfs 将使用参数加载 ZFS 内核模块 在文件中找到。

root #bliss-initramfs -k 5.15.48-gentoo-dist
root #mv initrd-5.15.48-gentoo-dist /boot
恢复
如果您需要从 livecd 环境返回到 zpool,您只需使用以下命令再次导入池:

root #zpool import -R /mnt/gentoo tank
root #zpool import -R /mnt/gentoo boot
如果您的池是加密的,您还需要传递 -l(小写 L)选项,即上面的 zpool 导入命令(这将要求您输入池的密码短语并因此加载密钥),或者您可以在导入没有密钥的池后使用以下命令:

root #zpool load-key tank
这还会要求您输入密码并加载池的密钥。完成此操作后,您应该能够通过执行以下操作查看加密池的可用值:

root #zfs get keystatus tank
您可能还希望导入启动池和 efi 分区:

root #zpool import -R /mnt/gentoo boot
root #mount /dev/nvme0n1p1 /mnt/gentoo/boot/efi
{{注|如果在重新启动池时启动池时遇到问题,请尝试在启动期间添加刷新标志。

您可能想要安装的其他内容
极乐 ZFS 脚本
以下脚本允许您自动: *拍摄泳池快照 * 将池复制到另一个池(完整备份和增量备份) * 清理池中的旧快照。 您可以将脚本下载、自定义并安装到 /usr/local/sbin 目录中。Github。 仅此而已。享受!

离线

页脚

Powered by FluxBB

本站由XREA提供空间支持