Arch auf ZFS: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
(→‎Todo: Alte ZFS-Pools entfernen)
(→‎Pool: rpool: Erwähnung von zst und performance)
Zeile 107: Zeile 107:


=== Pool: rpool ===
=== Pool: rpool ===
Dieser Pool wird zur Bereitstellung des von <code>/</code> genutzt werden. Dieser ist verschlüsselt und nutzt als Komprimierung lz4.
Dieser Pool wird zur Bereitstellung des von <code>/</code> genutzt werden. Dieser ist verschlüsselt und nutzt als Komprimierung lz4. Für eine höhere Komprimierungsrate bei niedrigerer Performance kann zum Beispiel auch <code>zstd</code> genutzt werden. Weitere Informationen zu Komprimierung und Performance findet sich bei [https://indico.fnal.gov/event/16264/contributions/36466/attachments/22610/28037/Zstd__LZ4.pdf Fermilabs] {{sprache|en}}.


  zpool create \
  zpool create \

Version vom 19. Januar 2021, 13:14 Uhr

Dieser Artikel oder Artikelabschnitt ist noch nicht vollständig!


Dieser Artikel beschreibt die Schritte um Arch Linux auf einem ZFS Dateisystem zu installieren (sowohl /boot als auch /root).

Anmerkung zu dieser Anleitung

Da Grub der OpenZFS-Entwicklung hinterher hängt, müssen einige Funktionen von ZFS auf dem Pool, von dem GRUB booten wird, deaktiviert werden. Daher ist es ratsam einen seperaten Pool zu erstellen der auf /boot gemountet wird.

Momentan behandelt diese Anleitung ausschließlich booten via EFI . Außerdem wird der ZFS-root-Pool verschlüsselt.

Siehe #Todo.

Warnung: Die Befehle in diesem Wiki blind zu kopieren wird nur eingeschränkt zu einem funktionstüchtigen System führen. Es ist notwendig sich die Zeit zu nehmen den Boot-Prozess, ZFS Pools und Datasets zu verstehen. Hier gibt es einige Links zum nachschlagen: #Weblinks

Vorbereitung

Allgemeines

Das neueste ISO-Abbild kann von der Arch-Linux Downloadseite heruntergeladen werden.

Das ISO-Abbild beinhaltet nur die nötigen Programme, um ein minimales GNU/Linux Grundsystem zu installieren. Als nächstes muss das ISO-Abbild geprüft und auf eine CD/DVD gebrannt oder einen USB-Stick übertragen werden (Anleitung für Einsteiger). Nach dem Booten von CD/DVD/USB-Stick muss eine Internetverbindung hergestellt werden (Ethernet/WLAN).

Zuerst wird die Tastaturbelegung geändert:

laodkeys de

Sollte eine WLAN-Verbindung aufgebaut werden, kann dies mit iwd erfolgen:

iwctl
devices list
station <device> scan
station <device> get-networks
station <device> connect <ssid>

Hierbei muss <device> und <ssid> entsprechend ersetzt werden.

ZFS Modul laden

Neben der, hier nicht erörterten Möglichkeit, ein selbsterstelltes archiso mit integriertem ZFS zu erstellen, wird hier das ZFS-Modul mithilfe eines Skript in die laufende archiso-Instanz nachgeladen. Für Details siehe https://github.com/eoli3n/archiso-zfs .

curl -s https://eoli3n.github.io/archzfs/init | bash

Partitionierung

ZFS unterstützt sowohl GTP als auch MBR Partitionstabellen und verwaltet seine Partitionen selbst. Daher wird nur ein minimale Partitionstabelle benötigt. Die Trennung zwischen der 1GB Partition für /boot und der restlichen Größe für / ist dem geschuldet, dass GRUB2 nicht alle Feature/Funktionen von ZFS unterstützt. Alternativen wären entweder GRUB nicht auf einem ZFS-Pool zu installieren (was dazu führt, dass von /boot keine Snapshots angefertigt werden können und evtl. auch nicht von alten Snapshots gebootet werden kann) oder auf dem Wurzeldateisystem / auf viele ZFS-Funktionen zu verzichten. Da beides nicht wünschenswert ist werden hier 2 ZFS-Pools erstellt; einen mit eingeschränkten Features für GRUB und ein Pool mit allen ZFS-Features für das restliche Dateisystem.

Für Festplatten welche größer als 2TB sind wird eine GPT-Partitionstabelle benötigt.

In dieser Anleitung wird folgendes Partitionsschema bentutzt:

Part     Size   Type
----     ----   -------------------------------
   1     1G     EFI System (ef00)
   2     1G     Solaris /usr & Apple ZFS (BF01)
   2     XXXG   Solaris Root (bf00)

Für die Arbeit mit ZFS müssen die Festplatten/Partitionen anstatt mit Festplatten-Identifiern wie /dev/sdX mit der ID angesprochen werden /dev/disk/by-id. Die Zuordnung zwischen beiden Adressierungsmöglichkeiten kann durch

ls -la /dev/disk/by-id

eingesehen werden.

Um die Arbeit zu erleichtern, wird der entsprechende Pfad in einer Variable gespeichert:

DISK=/dev/disk/by-id/<DISK>

Warnung: Alle auf der Festplatte gespeicherten Daten gehen verloren.

Die Partitionierung kann nach o.g. Tabelle einfach in cfdisk angelegt werden.

Alternativ kann das Partitionsschema wie folgt angelegt werden (Todo: Muss noch getestet werden):

sgdisk --zap-all $DISK
sgdisk -n1:1M:+1G -t1:EF00 $DISK
sgdisk -n2:0:+1G -t2:BF01 $DISK
sgdisk -n3:0:0 -t3:BF00 $DISK

Sollten früher bereits ZFS-Pools auf der Festplatte angelegt worden sein, kann es nötig sein die ersten und letzten Sektoren der Festplatte zu überschreiben.

Pool-Erstellung

Empfehlung

Für eine einfacherer Verwaltbarkeit mehrerer Festplatten (wenn man z.B. eine andere Festplatte mit weiteren ZFS-Pools anschließt), kann es ratsam sein anstatt der generischen Namen rpool und bpool eine zufällige ID anzuhängen, z.B. rpool_f6231d. Dann ist es später möglich einen anderen ZFS-Pool einfach zu importieren ohne diesen umbenennen zu müssen. Für die Einfachheit und Übersichtlichkeit wird in diesem Artikel darauf verzichtet.

Pool: bpool

Dieser Pool dient haupsächlich für die spätere Bereitstellung von /boot. Hier können nur gewisse ZFS-Features aktiviert werden, da viele Features noch nicht von GRUB2 unterstützt werden.

zpool create \
    -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@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=none -R /mnt \
    bpool ${DISK}-part2

Pool: rpool

Dieser Pool wird zur Bereitstellung des von / genutzt werden. Dieser ist verschlüsselt und nutzt als Komprimierung lz4. Für eine höhere Komprimierungsrate bei niedrigerer Performance kann zum Beispiel auch zstd genutzt werden. Weitere Informationen zu Komprimierung und Performance findet sich bei Fermilabs .

zpool create \
    -o ashift=12 \
    -O encryption=aes-256-gcm \
    -O keylocation=prompt -O keyformat=passphrase \
    -O acltype=posixacl -O canmount=off -O compression=lz4 \
    -O dnodesize=auto -O normalization=formD -O relatime=on \
    -O xattr=sa -O mountpoint=none -R /mnt \
    rpool ${DISK}-part3

Dataset-Erstellung

Nun werden die Datasets erstellt. Die hier erstellten Datasets sind ein bisheriges "Best practice" und kann je nach Anforderungen angepasst werden.

Die hier vorgeschlagene Struktur sollte zu biaz und rozb3-pac kompatibel sein. Geprüft wurde dies vom Autor aber nicht.

zfs create -o canmount=off -o mountpoint=none rpool/ROOT
zfs create -o canmount=off -o mountpoint=none bpool/BOOT
zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/default
zfs create -o canmount=on -o mountpoint=/boot bpoool/BOOT/default
zfs create -o canmount=off -o mountpoint=none rpool/HOME
zfs create -o canmount=on -o mountpoint=/home rpool/HOME/default
zfs create -o canmount=on rpool/ROOT/default/usr
zfs create -o canmount=on rpool/ROOT/defaul/var
zfs create -o canmount=on rpool/ROOT/default/usr/local
zfs create -o canmount=on rpool/ROOT/default/var/log
zfs create -o canmount=on rpool/ROOT/default/var/spool
zfs create -o canmount=on rpool/ROOT/default/var/tmp

Nachträgliche Änderungen von Optionen

Sollten nachträgliche Anpassungen an Optionen wie zum Beispiel canmount und mountpoint notwendig sein, sind folgende Befehle hilfreich:

Beispiel: Auslesen der Option

zfs get mountpoint rpool/ROOT/default

Beipsiel: Setzen der Option

zfs set mountpoint=/ rpool/ROOT/default

Prüfung der Pools und Datasets

Nun werden die Pools einmal exportiert und wieder importiert um die Korrektheit zu prüfen:

zfs export rpool
zfs export bpool
zfs import -R /mnt -N rpool
zfs import -R /mnt -N bpool

Hierbei dient -R dazu die angegebenen Mountpoints unter /mnt anstatt / einzuhängen und -N verhindert ein automatisches mounten.

Nun muss die Verschlüsselung geoffnet werden:

zfs laod-key rpool

Anschließend können wir die Partitionen mounten:

zfs mount rpool/ROOT/defazlt
zfs mount -a

Eine Auflistung, ob alle Mountpoints gemountet wurden, kann wie folgt stattfinden:

zfs mount

Nun werden die Berechtigungen für /var/tmp noch gesetzt:

chmod 1777 /mnt/var/tmp

Vorbereitung der EFI-Partition

Nun wird eine FAT-Partition für /boot/efi erstellt und gemountet.

mkfs.vfat -n EFI $DISK-part1
mkdir /mnt/boot/efi
mount $DISK-part1 /mnt/boot/efi

Arch-Installation

Diese Installation ist exemplarisch und enthält einige persönliche Preferenzen. Für weitere Informationen: #Siehe auch.

pacstrap

Nun findet, fast wie gewohnt, die Installation via pacstrap statt:

pacstrap /mnt base base-devel linux-firmware linux linux-headers neovim nano grub efibootmgr \
              sudo man networkmanager tmux zsh zsh-completions wget git rsync pacman-contrib
pacstrap /mnt archzfs-dkms

Neben der DKMS-Variante, kann auch linux-lts archzfs-linux-lts genutzt werden.

pacman.conf

Nun kopieren wir die bereits für archzfs angepasste pacman.conf-Datei:

cp /etc/pacman.conf /mnt/etc/pacman.conf

genfstab

Als nächstes wird die fstab-Datei generiert.

genfstab /mnt > /mnt/etc/fstab

Hierbei ist es wichtig in der generierten Datei alle Zeilen bis auf die /boot/efi-Zeile zu entfernen:

vim /mnt/etc/fstab

arch-chroot

Jetzt wechseln wird in das neu installierte System gewechselt:

arch-chroot /mnt

Standard-Schritte

An dieser Stelle sollten die Standard-Installationsschritte wie Passwort-Änderung, Benutzererstllung, locale-gen, Zeitzoneneinstellungen etc. erfolgen.

Dies wird in dieser Anleitung nicht explizit erörtert.

mkinitcpio.conf

Nun wird die HOOKS-Zeile der Datei /etc/mkinitcpio.conf wie folgt angepasst:

HOOKS=(base udev autodetect modconf block keyboard zfs filesystems)

Als nächstes wird die ramdisk erstellt:

mkinitcpio -P

zpool.cache

Um die Pools sppäter automatisch einzubinden wird die Datei /etc/zfs/zpool.cache benötigt.

Diese wirde wie folgt für die Pools generiert:

zpool set cachefile=/etc/zfs/zpool.cache rpool
zpool set cachefile=/etc/zfs/zpool.cache bpool

ZFS-Dienste/Targets aktivieren

Als nächstes aktivieren wir die benötigten systemd-Dienste/Targets:

systemctl enable zfs-import-cache zfs-import.target zfs-mount zfs-zed zfs.target

GRUB

default-Datei

Zuerst passen wir in der Datei /etc/default/grub folgende Zeile an:

GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/default"

Installation

Die Grub-Installation/-Konfiguration schlägt mit dem Fehler error: failed to get canonical path of fehl.

Um dies zu umgehen muss die Umgebungsvariable ZPOOL_VDEV_NAME_PATH=1 gesetzt sein.

Daher wird folgender Befehl ausgeführt:

ZPOOL_VDEV_NAME_PATH=1 grub-install

Konfiguration

Als nächstes wird die Konfiguration für GRUB erstellt:

ZPOOL_VDEV_NAME_PATH=1 grub-mkconfig -o /boot/grub/grub.cfg

Boot

Nun kann in das neue System gebootet werden und die weitere Einrichtung von dort erfolgen.

Siehe auch

Weblinks

Todo

  • Nochmaliges Korrekturlesen und Glättung
  • BIOS-Boot (MBR)
  • Prüfung der sgdisk-Befehle
  • Methode zum Überschreiben der entsprechenden Sektoren hinzufügen um alte ZFS-Pools zu entfernen
  • Prüfung Kompatibilität der Datasets/Pools mit biaz und rozb3-pac