静看光阴荏苒
不管不顾不问不说也不念

Hetzner独服安装Debian11并将ZFS作为根文件系统

手上还有一台ax41-nvme,这台机器是uefi引导的,之前ks的那台机器是传统的bios引导,把zfs配置为根文件系统的话,在这两种不同的引导方式中配置也是有很大不同的,这里记录一下在uefi引导模式下的配置过程。

首先启动hz的救援系统,这个救援系统实际上就相当于一个debian11的livecd,还是经过hz定制过的,这就很舒服了,版本很新就不用像ks那样用qemu-kvm去套娃:

先随便执行一个zfs相关的命令,比如:

zpool

这时候会自动运行一个编译安装zfs的脚本,按y即可开始编译安装:

不得不说这里hz做的真的很人性化。。如果没有这个脚本的话,还得自己去编译。。那就麻烦大了。。因为hz救援系统的这个内核不是debian官方的内核。。

还是老样子查看硬盘的分区情况:

lsblk

机器有两块nvme的盘,nvme0n1是第一块盘,nvme1n1是第二块盘,分别有2个分区:

如果有raid阵列就先停止阵列,我这里没有就不用做了,所以直接清除两块硬盘的分区表即可:

wipefs -a /dev/nvme0n1p1
wipefs -a /dev/nvme1n1p1
wipefs -a /dev/nvme0n1p2
wipefs -a /dev/nvme1n1p2
wipefs -a /dev/nvme0n1
wipefs -a /dev/nvme1n1

给硬盘分区,两块硬盘都使用相同的分区方案,这里我以nvme0n1这块盘为例:

fdisk /dev/nvme0n1
fdisk /dev/nvme1n1

首先创建一个efi引导分区,给512m即可:

接着创建一个用于bpool池的分区,给1g即可:

最后把硬盘剩下的空间都划分掉,用于rpool池:

这里建议给efi分区做一个raid1,注意要添加–metadata=1.0参数:

mdadm --create /dev/md0 --level=raid1 --raid-devices=2 --metadata=1.0 /dev/nvme0n1p1 /dev/nvme1n1p1

创建文件系统:

mkfs.vfat /dev/md0

创建bpool池:

zpool create \
    -f \
    -o cachefile= \
    -o ashift=12 -d \
    -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@livelist=enabled \
    -o feature@lz4_compress=enabled \
    -o feature@spacemap_histogram=enabled \
    -o feature@zpool_checkpoint=enabled \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O devices=off -O normalization=formD -O relatime=on -O xattr=sa \
    -O mountpoint=/boot -R /mnt \
    bpool \
    /dev/nvme0n1p2 \
    /dev/nvme1n1p2

创建rpool池:

zpool create \
    -f \
    -o ashift=12 \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O normalization=formD -O relatime=on \
    -O xattr=sa -O mountpoint=/ -R /mnt \
    rpool \
    /dev/nvme0n1p3 \
    /dev/nvme1n1p3

创建文件系统数据集:

zfs create -o canmount=off -o mountpoint=none bpool/BOOT
zfs create -o canmount=off -o mountpoint=none rpool/ROOT

为根和引导文件系统创建数据集:

zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/debian
zfs mount rpool/ROOT/debian
zfs create -o mountpoint=/boot bpool/BOOT/debian

使用debootstrap把debian11的基础系统载入到/mnt目录:

debootstrap --arch amd64 bullseye /mnt

挂载虚拟文件系统:

mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --rbind /dev /mnt/dev

chroot到debian11的基础系统内:

chroot /mnt /bin/bash

编辑系统内的存储库配置文件:

nano /etc/apt/sources.list

把完整的存储库配置写上去:

deb http://deb.debian.org/debian bullseye main contrib non-free
deb-src http://deb.debian.org/debian bullseye main contrib non-free

deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
deb-src http://deb.debian.org/debian-security/ bullseye-security main contrib non-free

deb http://deb.debian.org/debian bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian bullseye-updates main contrib non-free

编辑网络配置文件:

nano /etc/network/interfaces

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
        address xx.xx.xx.xx
        gateway xx.xx.xx.xx
        netmask xx.xx.xx.xx

iface eth0 inet6 static
        address xx:xx:xx:xx::xx
        netmask 64
        gateway fe80::1

这里的ip/网关/子网掩码参考你机器原系统内的配置即可。

配置dns服务器:

nano /etc/resolv.conf

写入如下配置:

nameserver 8.8.8.8
nameserver 8.8.4.4

设置主机名:

echo imlala > /etc/hostname

创建/boot/efi目录:

mkdir /boot/efi

把之前做好的raid1设备挂载到/boot/efi:

mount /dev/md0 /boot/efi

然后查看/dev/md0这个设备的uuid:

blkid

如图所示,记下箭头所指的内容:

编辑fstab:

nano /etc/fstab

用你刚才看到的UUID替换掉下面的配置:

UUID=1D14-9F5A /boot/efi vfat rw,relatime,errors=remount-ro 0 0

这里只需要配置efi分区的挂载点就够了,zfs不依赖fstab来挂载,所以不需要在fstab里面配置zfs相关的挂载点。

安装locales以及console-setup,配置系统的编码和时间:

apt -y install locales console-setup
dpkg-reconfigure locales
dpkg-reconfigure tzdata

具体的配置这里就省略了,可以参考:https://lala.im/8300.html

安装内核和zfs,这里额外装了一个firmware-realtek,我这个机器是螃蟹卡,需要装这个固件:

apt -y install dpkg-dev linux-headers-amd64 linux-image-amd64
apt -y install firmware-realtek
apt -y install zfs-initramfs
echo REMAKE_INITRD=yes > /etc/dkms/zfs.conf

[重要]生成zpool.cache缓存文件:

zpool set cachefile= bpool
zpool set cachefile= rpool

可以检查一下zpool.cache文件是否存在:

cat /etc/zfs/zpool.cache

安装grub,注意这里的包名不再是grub-pc而是grub-efi-amd64,grub-pc是用于传统bios引导的,而grub-efi-amd64才是用于uefi引导的,另外这里必须要安装mdadm,因为在之前我们把efi分区做了一个raid1:

apt -y install grub-efi-amd64 shim-signed mdadm

安装grub:

grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian --recheck --no-floppy --no-nvram --removable

注意这里必须要加上–no-nvram或者–removable参数,否则是不能正常安装的,原因参见:https://wiki.debian.org/UEFI#RAID_for_the_EFI_System_Partition

编辑grub配置文件:

nano /etc/default/grub

加入net.ifnames=0的内核启动参数,目的是让内核使用eth0这样的传统接口名:

GRUB_CMDLINE_LINUX_DEFAULT="quiet net.ifnames=0"

更新grub配置:

update-grub

验证一下zfs引导文件系统能否被识别,如果正常的话会回显zfs:

grub-probe /boot

刷新initrd:

update-initramfs -c -k all

设置root密码:

passwd

安装ssh服务:

apt -y install openssh-server

编辑ssh配置文件:

nano /etc/ssh/sshd_config

修改下面的配置以允许root登录:

PermitRootLogin yes

退出chroot环境:

exit

卸载所有zfs文件系统:

mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | \
    xargs -i{} umount -lf {}

导出全部池:

zpool export -a

在hz后台重启服务器即可,新系统内简单检查一下:

赞(12)
未经允许不得转载:荒岛 » Hetzner独服安装Debian11并将ZFS作为根文件系统
分享到: 更多 (0)

评论 3

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    一直在看你的博客很久了,一直没有勇气询问,终于现在鼓起勇气问问大神,请问有没有推荐自学debian的网址或书籍吗……或者关于自学你有什么建议吗?就是个人业务爱好,并不是当作生产力

    michae2年前 (2022-06-11) Chrome 102.0.5005.87 Chrome 102.0.5005.87 iPhone iOS 14.6 iPhone iOS 14.6回复

分享创造快乐

广告合作资源投稿