Arch auf ZFS: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
KKeine Bearbeitungszusammenfassung
 
(26 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Unvollständig}}
Dieser Artikel beschreibt die Schritte, um Arch Linux auf einem verschlüsselten ZFS-Dateisystem zu installieren.
 
Dieser Artikel beschreibt die Schritte um Arch Linux auf einem verschlüsselten ZFS-Dateisystem zu installieren.


== Anmerkung zu dieser Anleitung ==
== Anmerkung zu dieser Anleitung ==
Zeile 12: Zeile 10:
Siehe [[#Todo]].
Siehe [[#Todo]].


'''Warnung:''' Die Befehle in diesem Wiki blind zu kopieren wird gegebenenfalls 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]]
'''Warnung:''' Die Befehle in diesem Wiki blind zu kopieren wird gegebenenfalls 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 ==
== Vorbereitung ==
Zeile 19: Zeile 17:


Das ISO-Abbild beinhaltet nur die nötigen Programme, um ein minimales GNU/Linux Grundsystem zu installieren.
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]]).
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).
Nach dem Booten von CD/DVD/USB-Stick muss eine Internetverbindung hergestellt werden (Ethernet/WLAN).


Zuerst wird die Tastaturbelegung geändert:
Zuerst wird die Tastaturbelegung geändert:


  laodkeys de
  loadkeys de


Sollte eine WLAN-Verbindung aufgebaut werden, kann dies mit [[iwd]] erfolgen:
Sollte eine WLAN-Verbindung aufgebaut werden, kann dies mit [[iwd]] erfolgen:
Zeile 37: Zeile 35:


=== ZFS Modul nachladen ===
=== ZFS Modul nachladen ===
Neben der, unten 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 https://github.com/eoli3n/archiso-zfs] {{sprache|en}}.
Neben der, unten erörterten Möglichkeit, ein selbsterstelltes [[archiso]] mit integriertem ZFS zu erstellen, wird hier das ZFS-Modul mithilfe eines Skripts in die laufende archiso-Instanz nachgeladen. Für Details siehe [https://github.com/eoli3n/archiso-zfs https://github.com/eoli3n/archiso-zfs] {{sprache|en}}.


  curl -s https://eoli3n.github.io/archzfs/init | bash
  curl -s https://raw.githubusercontent.com/eoli3n/archiso-zfs/master/init | bash


=== Alternativ: ISO-Datei mit integriertem ZFS erstellen ===
=== Alternativ: ISO-Datei mit integriertem ZFS erstellen ===
Zeile 51: Zeile 49:
Als Basis für das Abbild wird das bestehende Profil "releng" (mit welchem auch die offiziellen monatlichen ISO-Dateien erstellt werden) herhalten. Hierzu wird das Profil in ein für uns beschreibbares Verzeichnis kopiert (zum Beispiel unser home-Verzeichnis):
Als Basis für das Abbild wird das bestehende Profil "releng" (mit welchem auch die offiziellen monatlichen ISO-Dateien erstellt werden) herhalten. Hierzu wird das Profil in ein für uns beschreibbares Verzeichnis kopiert (zum Beispiel unser home-Verzeichnis):


  cp -r /usr/share/archiso/config/releng archisozfs
  cp -r /usr/share/archiso/configs/releng archisozfs
  cd archisozfs
  cd archisozfs


==== Modifikation der Konfiguration ====
==== Modifikation der Konfiguration ====
Als erstes wird in der {{ic|pacman.conf}}-Datei im {{ic|archisozfs}}-Verzeichnis das archzfs-Repository eingefügt (an den bisherigen Inhalt anhängen):
Als Erstes wird in der {{ic|pacman.conf}}-Datei im {{ic|archisozfs}}-Verzeichnis das archzfs-Repository eingefügt (an den bisherigen Inhalt anhängen):


  [archzfs]
  [archzfs]
Zeile 64: Zeile 62:


  archzfs-linux
  archzfs-linux
==== pacman.conf mit archzfs-Repository ins Image einfügen ====
Zuerst wird die aktuelle pacman.conf in das Image eingefügt:
cp /etc/pacman.conf ./airootfs/etc
Sollte diese das archzfs-Repository noch nicht enthalten, wird auch dieses an das Ende von {{ic|./airootfs/etc/pacman.conf}} angefügt:
[archzfs]
Server = http://archzfs.com/$repo/x86_64
SigLevel = Optional TrustAll


==== Optional: ISO-Metadaten anpassen ====
==== Optional: ISO-Metadaten anpassen ====
Zeile 77: Zeile 86:
  mkdir work
  mkdir work


Als nächstes wird das Bauen der ISO-Datei angestoßen (dies kann je nach Hardware eine ganze Zeit dauern und benötigt auch etwas freie Festplattenkapazität):
Als Nächstes wird das Bauen der ISO-Datei angestoßen (dies kann je nach Hardware eine ganze Zeit dauern und benötigt auch etwas freie Festplattenkapazität):


  sudo mkarchiso -v -w ./work .
  sudo mkarchiso -v -w ./work .
Zeile 88: Zeile 97:
  run_archiso -i ./out/datei.iso -u
  run_archiso -i ./out/datei.iso -u


Hier muss {{ic|datei.iso}} mit dem tatsächlichen Namen der ISO-Datei ersetzt werden (abhängig von den im Profil definierten Name und des Datums ändert sich der Name). {{ic|-i}} bewirkt, dass im Testvorgang via [[UEFI]] gebootet wird.
Hier muss {{ic|datei.iso}} mit dem tatsächlichen Namen der ISO-Datei ersetzt werden (abhängig von den im Profil definierten Name und des Datums ändert sich der Name). {{ic|-i}} bewirkt, dass im Testvorgang via UEFI gebootet wird.


==== Aufräumen des Arbeitsverzeichnis ====
==== Aufräumen des Arbeitsverzeichnis ====
Zeile 96: Zeile 105:


== Partitionierung ==  
== Partitionierung ==  
ZFS unterstützt sowohl GTP als auch MBR Partitionstabellen und verwaltet seine Partitionen selbst. Daher wird nur ein minimale Partitionstabelle benötigt.
ZFS unterstützt sowohl GTP als auch MBR Partitionstabellen und verwaltet seine Partitionen selbst. Daher wird nur eine minimale Partitionstabelle benötigt.
Die Trennung zwischen der 1GB Partition für <code>/boot</code> und der restlichen Größe für <code>/</code> ist dem geschuldet, dass [[GRUB2]] nicht alle Feature/Funktionen von ZFS unterstützt.
Die Trennung zwischen der 1 GB Partition für {{ic|/boot}} und der restlichen Größe für {{ic|/}} 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 <code>/boot</code> keine Snapshots angefertigt werden können und evtl. auch nicht von alten Snapshots gebootet werden kann) oder auf dem Wurzeldateisystem <code>/</code> 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.
Alternativen wären entweder GRUB nicht auf einem ZFS-Pool zu installieren (was dazu führt, dass von {{ic|/boot}} keine Snapshots angefertigt werden können und evtl. auch nicht von alten Snapshots gebootet werden kann) oder auf dem Wurzeldateisystem {{ic|/}} 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.
Für Festplatten welche größer als 2 TB sind, wird eine GPT-Partitionstabelle benötigt.


In dieser Anleitung wird folgendes Partitionsschema bentutzt:
In dieser Anleitung wird folgendes Partitionsschema benutzt:


  Part    Size  Type
  Part    Size  Type
Zeile 110: Zeile 119:
     3    XXXG  Solaris Root (bf00)
     3    XXXG  Solaris Root (bf00)


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


Zeile 136: Zeile 145:
== Pool-Erstellung ==
== Pool-Erstellung ==
=== Empfehlung ===
=== 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 <code>rpool</code> und <code>bpool</code> eine zufällige ID anzuhängen, z.B. <code>rpool_f6231d</code>. 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.  
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 {{ic|rpool}} und {{ic|bpool}} eine zufällige ID anzuhängen, z.B. {{ic|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 ===
=== Pool: bpool ===
Dieser Pool dient haupsächlich für die spätere Bereitstellung von <code>/boot</code>. Hier können nur gewisse ZFS-Features aktiviert werden, da viele Features noch nicht von [[GRUB2]] unterstützt werden.
Dieser Pool dient hauptsächlich für die spätere Bereitstellung von {{ic|/boot}}. Hier können nur gewisse ZFS-Features aktiviert werden, da viele Features noch nicht von [[GRUB2]] unterstützt werden.


  zpool create \
  zpool create \
Zeile 161: Zeile 170:


=== Pool: rpool ===
=== Pool: rpool ===
Dieser Pool wird später 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 Fermilab] {{sprache|en}}.
Dieser Pool wird später zur Bereitstellung des von {{ic|/}} genutzt werden. Hier werden alle Daten gespeichert (außer die zum Starten benötigten Verzeichnisse {{ic|/boot}} und {{ic|/boot/efi}} liegen). Dieser nutzt als Komprimierung lz4. Für eine höhere Komprimierungsrate bei niedrigerer Performance kann zum Beispiel auch {{ic|zstd}} 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 Fermilab] {{sprache|en}}.
 
==== Verschlüsselter rpool ====
Wird ein verschlüsselter Pool gewünscht, kann dieser wie folgt angelegt werden (empfohlen):


  zpool create \
  zpool create \
Zeile 167: Zeile 179:
     -O encryption=aes-256-gcm \
     -O encryption=aes-256-gcm \
     -O keylocation=prompt -O keyformat=passphrase \
     -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
==== Alternativ: Nicht verschlüsselter rpool ====
Sollte keine Verschlüsselung auf dem Pool gewünscht sein, kann dieser wie folgt angelegt werden (ohne die folgenden Dateisystemeigenschaften, welche durch {{ic|-O}} spezifiziert werden: {{ic|encryption}}, {{ic|keylocation}} und {{ic|keyformat}}).
zpool create \
    -o ashift=12 \
     -O acltype=posixacl -O canmount=off -O compression=lz4 \
     -O acltype=posixacl -O canmount=off -O compression=lz4 \
     -O dnodesize=auto -O normalization=formD -O relatime=on \
     -O dnodesize=auto -O normalization=formD -O relatime=on \
Zeile 187: Zeile 209:


  zfs create -o canmount=on rpool/ROOT/default/usr
  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/var


  zfs create -o canmount=on rpool/ROOT/default/usr/local
  zfs create -o canmount=on rpool/ROOT/default/usr/local
Zeile 196: Zeile 218:
=== Nachträgliche Änderungen von Optionen ===
=== Nachträgliche Änderungen von Optionen ===


Sollten nachträgliche Anpassungen an Optionen wie zum Beispiel <code>canmount</code> und <code>mountpoint</code> notwendig sein, sind folgende Befehle hilfreich:
Sollten nachträgliche Anpassungen an Optionen wie zum Beispiel {{ic|canmount}} und {{ic|mountpoint}} notwendig sein, sind folgende Befehle hilfreich:


==== Beispiel: Auslesen der Option ====
==== Beispiel: Auslesen der Option ====
Zeile 215: Zeile 237:
  zpool import -R /mnt -N bpool
  zpool import -R /mnt -N bpool


Hierbei dient <code>-R</code> dazu die angegebenen Mountpoints unter <code>/mnt</code> anstatt <code>/</code> einzuhängen und <code>-N</code> verhindert ein automatisches mounten.
Hierbei dient {{ic|-R}} dazu die angegebenen Mountpoints unter {{ic|/mnt}} anstatt {{ic|/}} einzuhängen und {{ic|-N}} verhindert ein automatisches mounten.


Nun muss die Verschlüsselung geöffnet werden (sofern diese denn beim anlegen des Pools aktiviert wurde):
Nun muss die Verschlüsselung geöffnet werden (sofern diese denn beim anlegen des Pools aktiviert wurde):
Zeile 234: Zeile 256:
  zfs mount | column -t
  zfs mount | column -t


Nun werden die Berechtigungen für <code>/var/tmp</code> noch gesetzt:
Nun werden die Berechtigungen für {{ic|/var/tmp}} noch gesetzt:


  chmod 1777 /mnt/var/tmp
  chmod 1777 /mnt/var/tmp


== Vorbereitung der EFI-Partition ==
== Vorbereitung der EFI-Partition ==
Nun wird eine FAT-Partition für <code>/boot/efi</code> erstellt und gemountet.
Nun wird eine FAT-Partition für {{ic|/boot/efi}} erstellt und gemountet.


  mkfs.vfat -n EFI $DISK-part1
  mkfs.vfat -n EFI $DISK-part1
Zeile 249: Zeile 271:


=== pacstrap ===
=== pacstrap ===
Nun findet, fast wie gewohnt, die Installation via [[pacstrap]] statt:
Nun findet, fast wie gewohnt, die Installation via {{ic|pacstrap}} statt:


  pacstrap /mnt base base-devel linux-firmware linux linux-headers neovim nano grub efibootmgr \
  pacstrap /mnt base base-devel linux-firmware linux linux-headers neovim nano grub efibootmgr \
Zeile 255: Zeile 277:
  pacstrap /mnt archzfs-dkms
  pacstrap /mnt archzfs-dkms


Neben der DKMS-Variante, kann auch <code>linux-lts archzfs-linux-lts</code> genutzt werden.
Neben der [[:en:DKMS|DKMS]]{{sprache|en}}-Variante, kann auch {{ic|linux-lts archzfs-linux-lts}} oder {{ic|linux archzfs-linux}} genutzt werden. Hier kann es allerdings Probleme beim Aktualisieren des Systems geben, wenn ein neuer Linux-Kernel veröffentlicht wurde, welcher von archzfs noch nicht unterstützt wird. Hier würde dann bis zum Erscheinen ein {{ic|--ignore linux-lts,linux-lts-headers,zfs-linux-lts}} beim Aktualisieren helfen.
 
Bei der DKMS-Variante wird das ZFS-Modul automatisch neu gebaut, wenn ein neuer Kernel installiert wird. Dies braucht zum einen mehr Zeit bei Updates, aber kann natürlich auch zu Problemen führen wenn nicht-kompatible Änderungen im neuen Kernel enthalten sind.
 
==== Anmerkung zur ISO-Datei mit integriertem ZFS ====
Sofern die pacman.conf-Datei welche in die ISO-Datei gebaut wird, nicht angepasst wurde, muss das archzfs-Repository von nochmals in der Datei {{ic|/etc/pacman.conf}} eingefügt werden:
 
[archzfs]
Server = http://archzfs.com/$repo/x86_64
SigLevel = Optional TrustAll


=== pacman.conf ===
=== pacman.conf ===
Zeile 267: Zeile 298:
  genfstab /mnt > /mnt/etc/fstab
  genfstab /mnt > /mnt/etc/fstab


Hierbei ist es wichtig in der generierten Datei alle Zeilen bis auf die <code>/boot/efi</code>-Zeile zu entfernen:
Hierbei ist es wichtig in der generierten Datei alle Zeilen bis auf die {{ic|/boot/efi}}-Zeile zu entfernen:


  vim /mnt/etc/fstab
  vim /mnt/etc/fstab
Zeile 282: Zeile 313:


=== mkinitcpio.conf ===
=== mkinitcpio.conf ===
Nun wird die <code>HOOKS</code>-Zeile der Datei <code>/etc/mkinitcpio.conf</code> wie folgt angepasst:
Nun wird die {{ic|HOOKS}}-Zeile der Datei {{ic|/etc/mkinitcpio.conf}} wie folgt angepasst:


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


Als nächstes wird die ramdisk erstellt:
Als nächstes wird eine {{ic|hostid}} erzeugt und die ramdisk erstellt:


hostid > /etc/hostid
  mkinitcpio -P
  mkinitcpio -P


=== zpool.cache ===
=== zpool.cache ===
Um die Pools später automatisch einbinden zu lassen wird die Datei <code>/etc/zfs/zpool.cache</code> benötigt.
Um die Pools später automatisch einbinden zu lassen wird die Datei {{ic|/etc/zfs/zpool.cache}} benötigt.


Diese wirde wie folgt für die Pools generiert:
Diese wirde wie folgt für die Pools generiert:
Zeile 306: Zeile 338:


=== default-Datei ===
=== default-Datei ===
Zuerst passen wir in der Datei <code>/etc/default/grub</code> folgende Zeile an:
Zuerst passen wir in der Datei {{ic|/etc/default/grub}} folgende Zeile an:


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


=== Installation ===
=== Probe ===
Die GRUB-Installation/-Konfiguration schlägt mit dem Fehler <code>error: failed to get canonical path of</code> fehl.
Die GRUB-Installation/-Konfiguration schlägt mit dem Fehler {{ic|error: failed to get canonical path of}} fehl.
 
Um dies zu umgehen muss die Umgebungsvariable {{ic|1=ZPOOL_VDEV_NAME_PATH=1}} gesetzt sein.
 
Daher sollte der folgender Befehl {{ic|zfs}} ausgeben:


Um dies zu umgehen muss die Umgebungsvariable <code>ZPOOL_VDEV_NAME_PATH=1</code> gesetzt sein.
ZPOOL_VDEV_NAME_PATH=1 grub-probe /boot


Daher wird folgender Befehl ausgeführt:
=== Installation ===


  ZPOOL_VDEV_NAME_PATH=1 grub-install
  ZPOOL_VDEV_NAME_PATH=1 grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB


=== Konfiguration ===  
=== Konfiguration ===  
Zeile 326: Zeile 362:
== Boot ==
== Boot ==
Nun kann in das neue System gebootet werden und die weitere Einrichtung von dort erfolgen.
Nun kann in das neue System gebootet werden und die weitere Einrichtung von dort erfolgen.
Es empfiehlt sich dazu nach dem '''Verlassen der chroot''':
exit
und vor dem Neustart die Installationspfade auszuhängen und die ZFS Pools zu exportieren, damit der Import nicht scheitert und man im BusyBox Terminal hängen bleibt:
umount /mnt/boot/efi
zfs umount -a
zpool export -a
reboot


== Snapshot ==
== Snapshot ==
Zeile 333: Zeile 381:
  zfs snapshot -r bpool@install
  zfs snapshot -r bpool@install


<code>-r</code> steht hier für eine rekursive Durchführung der Snapshots auf den untergeordneten Datasets.
{{ic|-r}} steht hier für eine rekursive Durchführung der Snapshots auf den untergeordneten Datasets.


Die bestehenden Snapshots können mit
Die bestehenden Snapshots können mit
Zeile 340: Zeile 388:


aufgelistet werden.
aufgelistet werden.
== Troubleshooting ==
=== ISO-Erstellung: Fehler "Could not statisfy dependency 'linux[...]' required by zfs-linux ===
Falls beim Ausführen die hierstehende oder ähnliche Fehlermeldung auftritt, gibt es noch keine Veröffentlichung von archzfs-linux welche zu dem aktuellen Kernel (linux-Paket) passt.
error: failed to prepare transaction (could not satisfy dependencies)
:: unable to satisfy dependency 'linux=5.10.8.arch1-1' required by zfs-linux
Eine Alternative ist dann in {{ic|packages.x86_64}} den Eintrag {{ic|archzfs-linux}} mit {{ic|archzfs-dkms}} zu ersetzen.


== Siehe auch ==
== Siehe auch ==
Zeile 355: Zeile 413:
* Nochmaliges Korrekturlesen und Glättung
* Nochmaliges Korrekturlesen und Glättung
* BIOS-Boot (MBR)
* BIOS-Boot (MBR)
* Methode zum Überschreiben der entsprechenden Sektoren hinzufügen um alte ZFS-Pools zu entfernen
* Methode zum Überschreiben der entsprechenden Sektoren hinzufügen, um alte ZFS-Pools zu entfernen
* Prüfung Kompatibilität der Datasets/Pools mit [https://gitlab.com/m_zhou/bieaz biaz] und [https://gitlab.com/m_zhou/rozb3-pac rozb3-pac]
* Prüfung Kompatibilität der Datasets/Pools mit [https://gitlab.com/m_zhou/bieaz biaz] und [https://gitlab.com/m_zhou/rozb3-pac rozb3-pac]
* {{ic|/boot/efi}} in /etc/fstab wird beim Hochfahren nicht einghangen, händisch aber möglich (unkritisch, da die UEFI Firmware beim Booten die Partition liest, im laufenden System wird sie nicht benötigt)


[[Kategorie:Installation]]
[[Kategorie:Installation]]

Aktuelle Version vom 8. November 2022, 10:10 Uhr

Dieser Artikel beschreibt die Schritte, um Arch Linux auf einem verschlüsselten ZFS-Dateisystem zu installieren.

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 gegebenenfalls 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:

loadkeys 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 nachladen

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

curl -s https://raw.githubusercontent.com/eoli3n/archiso-zfs/master/init | bash

Alternativ: ISO-Datei mit integriertem ZFS erstellen

Hier wird auf einer bestehenden Arch-Linux-Installation gearbeitet.

Vorbereitung

Installation des archiso-Pakets:

sudo pacman -S archiso

Als Basis für das Abbild wird das bestehende Profil "releng" (mit welchem auch die offiziellen monatlichen ISO-Dateien erstellt werden) herhalten. Hierzu wird das Profil in ein für uns beschreibbares Verzeichnis kopiert (zum Beispiel unser home-Verzeichnis):

cp -r /usr/share/archiso/configs/releng archisozfs
cd archisozfs

Modifikation der Konfiguration

Als Erstes wird in der pacman.conf-Datei im archisozfs-Verzeichnis das archzfs-Repository eingefügt (an den bisherigen Inhalt anhängen):

[archzfs]
Server = http://archzfs.com/$repo/x86_64
SigLevel = Optional TrustAll

Nun wird in der packages.x86_64-Datei das entsprechende Paket eingefügt (ebenfalls an den bestehenden Inhalt anhängen):

archzfs-linux

pacman.conf mit archzfs-Repository ins Image einfügen

Zuerst wird die aktuelle pacman.conf in das Image eingefügt:

cp /etc/pacman.conf ./airootfs/etc

Sollte diese das archzfs-Repository noch nicht enthalten, wird auch dieses an das Ende von ./airootfs/etc/pacman.conf angefügt:

[archzfs]
Server = http://archzfs.com/$repo/x86_64
SigLevel = Optional TrustAll

Optional: ISO-Metadaten anpassen

Wenn gewünscht, können die Metadaten dieses Profils in der Datei profiledef.sh angepasst werden. Hier ein Beispiel wie die geänderten Zeilen aussehen könnten:

iso_name="archlinux-zfs"
iso_publisher="Ein Name <mail@adresse.de>"
iso_application="Arch Linux Live/Rescue CD with integrated ZFS"

ISO-Datei bauen

Zuerst muss das Arbeitsverzeichnis vorbereitet werden, in welchem mkarchiso die in der ISO-Datei benötigten Pakete herunterladen, vorbereiten etc. wird:

mkdir work

Als Nächstes wird das Bauen der ISO-Datei angestoßen (dies kann je nach Hardware eine ganze Zeit dauern und benötigt auch etwas freie Festplattenkapazität):

sudo mkarchiso -v -w ./work .

Hier steht -v für verbose (detailierte Ausgabe), -w für den Pfad zum Arbeitsverzeichnis und . für den Pfad zum Profil. Optional kann mit -o ein Ausgabe-Pfad für die ISO-Datei angegeben werden. Falls kein Ausgabe-Pfad angegeben wird, wird die ISO-Datei in den Ordner out geschrieben.

Test der ISO-datei

Falls auf dem Computer die Pakete edk2-ovmf und qemu installiert sind, kann die erstellte ISO in einer virtuellen Umgebung getestet werden:

run_archiso -i ./out/datei.iso -u

Hier muss datei.iso mit dem tatsächlichen Namen der ISO-Datei ersetzt werden (abhängig von den im Profil definierten Name und des Datums ändert sich der Name). -i bewirkt, dass im Testvorgang via UEFI gebootet wird.

Aufräumen des Arbeitsverzeichnis

Zuletzt kann das Arbeitsverzeichnis wieder gelöscht werden (bitte darauf achten, dass dies im richtigen Verzeichnis ausgeführt wird):

sudo rm -rf ./work

Partitionierung

ZFS unterstützt sowohl GTP als auch MBR Partitionstabellen und verwaltet seine Partitionen selbst. Daher wird nur eine minimale Partitionstabelle benötigt. Die Trennung zwischen der 1 GB 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 2 TB sind, wird eine GPT-Partitionstabelle benötigt.

In dieser Anleitung wird folgendes Partitionsschema benutzt:

Part     Size   Type
----     ----   -------------------------------
   1     1G     EFI System (ef00)
   2     1G     Solaris /usr & Apple ZFS (BF01)
   3     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:

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 hauptsä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 später zur Bereitstellung des von / genutzt werden. Hier werden alle Daten gespeichert (außer die zum Starten benötigten Verzeichnisse /boot und /boot/efi liegen). Dieser 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 Fermilab .

Verschlüsselter rpool

Wird ein verschlüsselter Pool gewünscht, kann dieser wie folgt angelegt werden (empfohlen):

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

Alternativ: Nicht verschlüsselter rpool

Sollte keine Verschlüsselung auf dem Pool gewünscht sein, kann dieser wie folgt angelegt werden (ohne die folgenden Dateisystemeigenschaften, welche durch -O spezifiziert werden: encryption, keylocation und keyformat).

zpool create \
    -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 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 bpool/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/default/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:

zpool export rpool
zpool export bpool
zpool import -R /mnt -N rpool
zpool 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 geöffnet werden (sofern diese denn beim anlegen des Pools aktiviert wurde):

zfs load-key rpool

Anschließend können wir die Partitionen mounten:

zfs mount rpool/ROOT/default
zfs mount -a

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

zfs mount

Um die Auflistung etwas übersichtlicher zu machen, kann auch folgender Befehl genutzt werden

zfs mount | column -t

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 oder linux archzfs-linux genutzt werden. Hier kann es allerdings Probleme beim Aktualisieren des Systems geben, wenn ein neuer Linux-Kernel veröffentlicht wurde, welcher von archzfs noch nicht unterstützt wird. Hier würde dann bis zum Erscheinen ein --ignore linux-lts,linux-lts-headers,zfs-linux-lts beim Aktualisieren helfen.

Bei der DKMS-Variante wird das ZFS-Modul automatisch neu gebaut, wenn ein neuer Kernel installiert wird. Dies braucht zum einen mehr Zeit bei Updates, aber kann natürlich auch zu Problemen führen wenn nicht-kompatible Änderungen im neuen Kernel enthalten sind.

Anmerkung zur ISO-Datei mit integriertem ZFS

Sofern die pacman.conf-Datei welche in die ISO-Datei gebaut wird, nicht angepasst wurde, muss das archzfs-Repository von nochmals in der Datei /etc/pacman.conf eingefügt werden:

[archzfs]
Server = http://archzfs.com/$repo/x86_64
SigLevel = Optional TrustAll

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 eine hostid erzeugt und die ramdisk erstellt:

hostid > /etc/hostid
mkinitcpio -P

zpool.cache

Um die Pools später automatisch einbinden zu lassen 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"

Probe

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 sollte der folgender Befehl zfs ausgeben:

ZPOOL_VDEV_NAME_PATH=1 grub-probe /boot

Installation

ZPOOL_VDEV_NAME_PATH=1 grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

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.

Es empfiehlt sich dazu nach dem Verlassen der chroot:

exit

und vor dem Neustart die Installationspfade auszuhängen und die ZFS Pools zu exportieren, damit der Import nicht scheitert und man im BusyBox Terminal hängen bleibt:

umount /mnt/boot/efi
zfs umount -a
zpool export -a
reboot

Snapshot

Um einen Snapshot von der initialen Grundinstallation zu haben werden folgende Befehle ausgeführt:

zfs snapshot -r rpool@install
zfs snapshot -r bpool@install

-r steht hier für eine rekursive Durchführung der Snapshots auf den untergeordneten Datasets.

Die bestehenden Snapshots können mit

zfs list -t snapshot

aufgelistet werden.

Troubleshooting

ISO-Erstellung: Fehler "Could not statisfy dependency 'linux[...]' required by zfs-linux

Falls beim Ausführen die hierstehende oder ähnliche Fehlermeldung auftritt, gibt es noch keine Veröffentlichung von archzfs-linux welche zu dem aktuellen Kernel (linux-Paket) passt.

error: failed to prepare transaction (could not satisfy dependencies)
:: unable to satisfy dependency 'linux=5.10.8.arch1-1' required by zfs-linux

Eine Alternative ist dann in packages.x86_64 den Eintrag archzfs-linux mit archzfs-dkms zu ersetzen.

Siehe auch

Weblinks

Todo

  • Nochmaliges Korrekturlesen und Glättung
  • BIOS-Boot (MBR)
  • 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
  • /boot/efi in /etc/fstab wird beim Hochfahren nicht einghangen, händisch aber möglich (unkritisch, da die UEFI Firmware beim Booten die Partition liest, im laufenden System wird sie nicht benötigt)