ZFS-Root & ZFSBootMenu

1 minute read

Vorraussetzung: Mit einer ZFS fähigen Bootdisk (z.B. SystemRescue-ZFS) gestartet.

Festplatte vorbereiten:

mkdir --parents /mnt/gentoo

sgdisk -Z /dev/sda
sgdisk -a 4096 --new=1:+0:+1G --typecode=1:EF00 --change-name=1:"EFI" /dev/sda
sgdisk -a 4096 --new=2:+129M:+4G --typecode=2:8200 --change-name=2:"Linux swap" /dev/sda
sgdisk -a 4096 --new=3:+129M:-129M --typecode=3:bf00 --change-name=3:"tank" /dev/sda

ZFS Pool anlegen

zpool create -f \
 -o ashift=12 -o autotrim=on \
 -O acltype=posixacl -O xattr=sa -O atime=off -O compression=lz4 \
 -m none tank /dev/sda3

zfs create -o mountpoint=none tank/OS
zfs create -o mountpoint=/ -o canmount=noauto tank/OS/gentoo
zfs create -o mountpoint=/home -o relatime=on tank/HOME

zfs create -o mountpoint=none -o setuid=off tank/GENTOO
zfs create -o mountpoint=/var/db/repos -o exec=off tank/GENTOO/repos
zfs create -o mountpoint=/var/db/repos/gentoo tank/GENTOO/portage
zfs create -o mountpoint=/var/cache/distfiles -o compression=off -o exec=off tank/GENTOO/distfiles
zfs create -o mountpoint=/var/tmp/portage -o sync=disabled tank/GENTOO/build-dir

zfs create -o mountpoint=none -o setuid=off tank/VAR
zfs create -o mountpoint=/var/log -o sync=disabled tank/VAR/log
zfs create -o mountpoint=/tmp -o sync=disabled tank/VAR/tmp

zfs create -o mountpoint=none -o setuid=off tank/SRV
zfs create -o mountpoint=/var/www tank/SRV/www
...

zpool set bootfs=tank/OS/gentoo tank
zpool export tank

ZFS Pool laden

zpool import -N -R /mnt/gentoo tank

zfs mount tank/OS/gentoo
zfs mount -R tank/HOME
zfs mount -R tank/GENTOO
zfs mount -R tank/VAR
zfs mount -R tank/SRV

Hilfspartitionen formatieren

mkswap /dev/sda2
swapon /dev/sda2

mkfs.vfat -F 32 /dev/sda1
mkdir --parents /mnt/gentoo/boot/efi
mount /dev/sda1 /mnt/gentoo/boot/efi

Gentoo installieren

chmod 1777 /mnt/gentoo/tmp
wget 'ftp://gentoo.osuosl.org/pub/gentoo/releases/amd64/autobuilds/current-stage3-amd64-openrc/stage3-amd64-openrc-[0-9]*.tar.xz'
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/gentoo

cp --dereference /etc/resolv.conf /mnt/gentoo/etc/

echo 'MAKEOPTS="-j4 -l5"' >> /mnt/gentoo/etc/portage/make.conf
echo 'RUSTFLAGS="${RUSTFLAGS} -C target-cpu=native"' >> /mnt/gentoo/etc/portage/make.conf

Standard Programm zu world hinzufügen

cat >> /var/lib/portage/world <<EOF
app-admin/rsyslog
app-admin/sudo
app-arch/bzip3
app-arch/ouch
app-crypt/dehydrated
app-editors/vim
app-emulation/open-vm-tools
app-misc/tmux
app-misc/mc
app-portage/cpuid2cpuflags
app-portage/eix
app-portage/gentoolkit
app-shells/bash-completion
dev-python/dns-lexicon
dev-util/git-delta
dev-vcs/git
dev-vcs/gitui
mail-mta/opensmtpd
net-dns/dns-doge
net-misc/chrony
net-misc/dropbear
net-misc/mosh
net-misc/sendme
sys-apps/bat
sys-apps/eza
sys-apps/fd
sys-apps/ripgrep
sys-boot/efibootmgr
sys-boot/zfsbootmenu
sys-kernel/dracut-crypt-ssh
sys-kernel/gentoo-sources
sys-process/cronclearer
sys-process/cronie
sys-process/htop
sys-process/lsof
virtual/openssh
www-servers/nginx
EOF

mkdir -p /etc/portage/package.accept_keywords
cat >> /etc/portage/package.accept_keywords/system <<EOF
app-arch/ouch 
dev-vcs/gitui 
net-dns/dns-doge
net-misc/sendme 
sys-boot/zfsbootmenu 
sys-kernel/dracut-crypt-ssh 
sys-process/cronclearer
EOF

cat >> /etc/portage/package.use/system <<EOF
*/*     -X -gtk -gnome dracut cacert vim-syntax zstd lz4 nftables kernel-install uuid jit

app-emulation/open-vm-tools  -vgauth -resolutionkms -deploypkg
sys-apps/systemd-utils  boot
sys-devel/binutils      -hardened
sys-devel/gcc           -hardened -jit

EOF

Alphaquadrant-Overlay installieren


mkdir -p /etc/portage/repos.conf
cat <<EOF > /etc/portage/repos.conf/migmedia.conf
[AlphaQuadrant]
priority = 20
location = /var/db/repos/alpha-quadrant
sync-type = git
sync-uri = https://git.migmedia.net/gentoo/alpha-quadrant.git
auto-sync = true
masters = gentoo
EOF

emaint sync -a

… weiter mit der Standard Gentoo Installation

emerge @world -uaDtvNU -j3 --keep-going

eselect kernel set 1

cd /usr/src/linux

Kernel konfigurieren und compilieren

make localmodconfig
make nconfig

nice make -j11
make modules_install

emerge -av sys-fs/zfs

make install

ZFSbootmenu installieren

Alphaquadrant-Overlay installieren


mkdir -p /etc/portage/repos.conf
cat <<EOF > /etc/portage/repos.conf/migmedia.conf
[AlphaQuadrant]
priority = 20
location = /var/db/repos/alpha-quadrant
sync-type = git
sync-uri = https://git.migmedia.net/gentoo/alpha-quadrant.git
auto-sync = true
masters = gentoo
EOF

emaint sync -a

emerge -av sys-boot/zfsbootmenu sys-boot/efibootmgr

zfs set org.zfsbootmenu:commandline="quiet loglevel=4" tank/OS

curl https://gentoo.migmedia.net/alpha-quadrant/gentoo.bmp -o /etc/zfsbootmenu/gentoo.bmp

Datei /etc/zfsbootmenu/config.yaml ändern:

Global:
  ManageImages: true
  BootMountPoint: /boot/efi
[...]
EFI:
  Enabled: true
  #Stub: /usr/lib/systemd/boot/efi/linuxx64.elf.stub
Kernel:
  CommandLine: ro quiet loglevel=0 zbm.timeout=30

ZFSbootmenu Kernel installieren

generate-zbm

efibootmgr -c -d /dev/sda -p 1 -L "ZFSBootMenu" -l \\EFI\\ZBM\\VMLINUZ.EFI

ZFS-Service beim Booten starten

rc-update add zfs-import boot
rc-update add zfs-load-key boot
rc-update add zfs-mount boot
rc-update add zfs-zed default
rc-update add zfs-share default

rc-update add rsyslog default
rc-update add cronie default
rc-update add chronyd default
rc-update add sshd default
rc-update add vmware-tools

Root-Passwort setzen & sudo erlauben

passwd -l root

echo "%wheel ALL=(ALL:ALL) ALL" > /etc/sudoers.d/wheel

User mit eigenem ZFS-Dataset anlegen

export NUSER=user
useradd -M -G wheel -s /bin/bash $NUSER
zfs create tank/HOME/$NUSER
cp -r /etc/skel/.* /home/$NUSER/
chown -R $NUSER:$NUSER /home/$NUSER

passwd $NUSER

System laden zum Reparieren

mkdir /mnt/gentoo
zpool import -N -R /mnt/gentoo tank -f
zfs mount tank/OS/gentoo
zfs mount -R tank/HOME
zfs mount -R tank/VAR
zfs mount -R tank/GENTOO
zfs mount -R tank/SRV
mount /dev/sda1 /mnt/gentoo/boot/efi

Referenzen: