Ubuntu 18.04 Root auf ZFS

Letztes Jahr musste ich Anweisungen zur Installation des Ubuntu 18.04-Betriebssystems erstellen. Die Installation von Ubuntu ist übrigens nicht kompliziert, aber es gibt eine Nuance: Ich wollte das ZFS-Dateisystem als Basis verwenden. Einerseits unterstützt Ubuntu ZFS auf Kernel-Ebene, aber es gibt noch kein Installationsprogramm dafür, aber es gibt eine Anweisung, ja:


https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS


Die Reihenfolge der Aktionen in diesem Handbuch ist im Allgemeinen korrekt, einige Punkte müssen jedoch angepasst werden. Was folgt, ist also keine direkte Übersetzung der Anweisungen, sondern kostenlos, unter Berücksichtigung von Korrekturen, meiner Erfahrung mit ZFS und anderen Dingen. Ich berücksichtige auch keine Probleme mit der Festplattenverschlüsselung und verwende den MBR-Bootloader. Meine Installationsanweisungen finden Sie hier.



0. Servervorbereitung


Das erste, was in den Anweisungen fehlt und in keiner Weise berücksichtigt wird, ist, dass ZFS nicht sehr gut mit Hardware-RAID-Arrays funktioniert, insbesondere ist es mit dem Schreibcache verbunden, was verständlich ist: Das ZFS-Dateisystem wird aufgezeichnet und erfordert eine vollständige Kontrolle über die Schreibvorgänge. Wenn Sie ein vorgefertigtes Hardware-RAID-Array verwenden, gehen die ZFS-Funktionen in Bezug auf Cache, Ersatz und mehr verloren. Daher müssen alle Festplatten in den HBA-Modus übertragen werden. Wenn dies nicht möglich ist, erstellen Sie für jede Festplatte ein separates RAID und deaktivieren Sie den Write Cache-Controller.


Wenn Sie die Aggregation von Netzwerkports verwenden, können Sie diese auch in der Installationsphase deaktivieren, um sie nicht zu komplizieren (ich werde alle weiteren Vorgänge ohne Verbindung ausführen).


1. Vorbereiten der Installationsumgebung


1.1. Livecd


Wie bereits erwähnt, gibt es leider kein vorgefertigtes Ubuntu-Installationsprogramm, das root unter ZFS verwendet. Die Installation erfolgt daher mit einer LiveCD-CD:


Download von hier: http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso


Gleichzeitig habe ich mit Kollegen versucht, verschiedene Disk-Images zu verwenden, da ich die grafische Shell nicht wirklich verwenden wollte, aber dies führte zu nichts Gutem.

Wir booten von der LiveCD, wählen Ubuntu ausprobieren und öffnen das Terminal (Strg + Alt + T).


1.2. Aktualisieren und Installieren von Repositorys

''
sudo apt-add-repository universe sudo apt update 

Hier warten wir auf den ersten Mist, wenn die Netzwerkeinstellungen des Servers nicht durch DHCP bestimmt werden. Das Aktualisieren von Repositorys funktioniert nicht. Richten Sie das Netzwerk ein.

Wir schauen uns die Netzwerkschnittstellen an und finden die, über die wir uns verbinden werden:


 sudo ip a 

Konfigurieren Sie die Netzwerkschnittstelle:


 sudo echo "auto {{ NAME }}" >> /etc/network/interfaces sudo echo "iface {{ NAME }} inet static" >> /etc/network/interfaces sudo echo " address {{ IP }}" >> /etc/network/interfaces sudo echo " netmask {{ NETMASK }}" >> /etc/network/interfaces sudo echo " gateway {{ GATEWAY }}" >> /etc/network/interfaces sudo service networking restart 

Und DNS-Resolver:


 sudo echo 'nameserver 8.8.8.8' >> /etc/resolv.conf 

Aktualisieren von Repositorys:


 sudo apt update 

1.3. SSH-Server (optional)


Zur Vereinfachung der Installation können Sie den OpenSSH-Server anheben und alle weiteren Vorgänge über den SSH-Client ausführen


Legen Sie das Passwort für den Ubuntu-Benutzer fest:


 passwd 

Es ist wichtig! Da sonst der Zugriff über ssh ohne Passwort mit sudo-Rechten erfolgt. Sie können jedoch kein einfaches Kennwort festlegen.

Installieren Sie OpenSSH und führen Sie es aus:


 sudo apt install openssh-server sudo service ssh start 

Und im Terminal der Workstation:


 ssh ubuntu@{{ ip server }} 

1.4. Wurzel werden


 sudo -s 

1.5. Installieren der ZFS-Unterstützung in einer LiveCD-Umgebung


 apt install --yes debootstrap gdisk zfs-initramfs 

2. Partitionieren und Formatieren von Festplatten


2.0. Festplatten-Arrays definieren


Die Hauptanweisung enthält keinen wichtigen Punkt zum Bestimmen von Festplatten-Arrays.


In der Regel beträgt die Anzahl der Festplatten auf Servern:


  • 2 Scheiben;
  • 4 Scheiben;
  • viele Scheiben;

Wir betrachten 1 Festplatte nicht, da es sich im Allgemeinen um eine Anomalie handelt.


2.0.1. 2 Scheiben


Hier ist alles einfach, ein MIRROR-Array (RAID1). Wenn es ein anderes drittes Laufwerk gibt, können Sie es in ein Ersatzlaufwerk (SPARE) legen oder ein RAIDZ-Array (RAID5) zusammenbauen. 3 Festplatten im Server sind jedoch sehr selten.


2.0.2. 4 Scheiben


Wenn alle Laufwerke gleich sind, gibt es nur drei Optionen (das vierte RAID0 berücksichtige ich grundsätzlich nicht):


  • MIRROR + MIRROR ist ein Analogon von RAID10, genauer gesagt RAID01, da es in ZFS Spiegel + Spiegel ist. 50% des verfügbaren Speicherplatzes;
  • RAIDZ ist ein Analogon zu RAID5. 75% des verfügbaren Speicherplatzes;
  • RAIDZ2 ist ein Analogon zu RAID6. 50% des verfügbaren Speicherplatzes;

In der Praxis verwende ich das MIRROR + MIRROR-Array, während es offensichtlich ist, dass das RAIDZ-Array am rentabelsten ist, da es mehr Speicherplatz bietet, aber es gibt Nuancen


In Bezug auf die Fehlertoleranz sind Arrays in dieser Reihenfolge angeordnet (vom Besten zum Schlechtesten):


  • RAIDZ2 - Zwei Festplatten können ohne Datenverlust verloren gehen.
  • MIRROR + MIRROR - Eine Festplatte kann ohne Datenverlust verloren gehen, und mit einer Wahrscheinlichkeit von 66% kann eine zweite Festplatte ohne Datenverlust verloren gehen.
  • RAIDZ - nur eine Festplatte kann ohne Datenverlust verloren gehen;

In Bezug auf die Geschwindigkeit sind Arrays in dieser Reihenfolge angeordnet:


  • SPIEGEL + SPIEGEL - sowohl beim Schreiben als auch beim Lesen;
  • RAIDZ - in Bezug auf die Aufzeichnung ist langsamer, da zusätzlich zur Aufzeichnung die Prüfsumme berechnet werden muss;
  • RAIDZ2 - in Bezug auf das Schreiben ist es noch langsamer, da komplexere Prüfsummen berechnet werden müssen.

In Bezug auf die Geschwindigkeit des Arrays während der Verschlechterung einer Platte:


  • SPIEGEL + SPIEGEL - Wenn ein Laufwerk ausfällt und im Wesentlichen nur das parallele Lesen von einem Spiegel verloren geht, arbeitet der zweite Spiegel ohne Leistungseinbußen.
  • RAIDZ2 - Die Verschlechterung der Leistungsverschlechterung ist höher, da eine Rückwärtszuweisung des Blocks aus der Prüfsumme für 1/4 der Daten + Block-Suche erforderlich ist.
  • RAIDZ - Die Verschlechterung ist viel größer, da für 1/3 der Daten- + Blocksuche eine Neuberechnung des Blocks aus der Prüfsumme erforderlich ist.

Der Vergleich der Merkmale ist subjektiv, spiegelt jedoch meine Wahl als Mittelweg ausreichend wider.


Gleichzeitig müssen Sie verstehen, dass "langsamer" und "noch langsamer" manchmal nicht ist, im schlimmsten Fall jedoch nur 10 bis 20%. Wenn Ihre Datenbank oder Anwendung für die Arbeit mit Festplatten nicht optimiert ist, sinkt die Geschwindigkeit im Prinzip nicht bemerken. Der Aufnahmegeschwindigkeitsfaktor sollte nur berücksichtigt werden, wenn Sie ihn wirklich benötigen.


2.0.2. Viele Scheiben


Das Hauptproblem ist, dass wir, wenn wir viele Festplatten haben und für alles ein gemeinsames Array erstellen möchten, jede Festplatte mit dem Bootsektor markieren oder eine kleine Finte mit unseren Ohren machen müssen. In der Praxis versuche ich für Multi-Disc-Plattformen, diese Konfiguration zu erstellen:


  • 2 SSD-Festplatten - Wir erstellen einen Spiegel und als Hauptstartarray mit dem Betriebssystem und dem ZFS-Cache für das zweite Festplattenarray.
  • Der Rest ist mit SATA- oder SAS-Festplatten verstopft und ohne Markup sammeln wir ein ZFS-Festplattenarray.

Gleiches gilt für 4-Disk-Server, wenn wir eine ziemlich universelle Plattform erhalten möchten.


Wenn die Festplatten alle gleich sind und es keinen Sinn macht, zwei Festplatten für ein separates Array zuzuweisen (z. B. 6 Festplatten mit jeweils 8 TB), können Sie die Festplatten der ersten Gruppe des Arrays bootfähig machen. Das heißt, wenn Sie ein Array wie MIRROR + MIRROR + MIRROR oder RAIDZ + RAIDZ erstellen möchten, markieren wir den Bootsektor nur für die erste Gruppe. Im Prinzip ist es möglich, auch nur ein Laufwerk zu partitionieren, selbst für MIRROR und RAIDZ, und den Rest in Rohform zu ersetzen. ZFS erstellt das Array durch das kleinere Element selbst. In diesem Fall verlieren Sie jedoch die einzige Startdiskette, wenn das erste Laufwerk ausfällt es lohnt sich das zu tun.


Es ist wichtig zu verstehen, dass es sich im ZFS-Stripe-Dateisystem nicht genau um RAID0 handelt, dass es ein wenig anders funktioniert und nicht die gleichen Festplattengrößen erfordert. Wenn Sie also einen kleinen Speicherplatz für den Bootsektor des Wetters zuweisen, wird dies nicht viel bewirken. Die Hauptsache ist, im BIOS die richtige Festplatte anzugeben, von der aus gestartet werden soll .


2.1. Partitionierung und Datenträgerbereinigung


Das mdadm-Paket wird verwendet, um die Festplatte zu markieren.


 apt install --yes mdadm 

Wir schauen uns an, welche Discs wir zur Verfügung haben:


 lsblk 

Und reinige sie:


 sgdisk --zap-all /dev/{{ disk name }} 

2.2. Festplattenlayout


Eigentlich ist die Boot-Partition:


 sgdisk -a1 -n1:34:2047 -t1:EF02 /dev/{{ disk name }} 

Der Hauptteil.


Hier kann es Abweichungen geben: Wenn Sie eine zusätzliche Partition von SSD-Festplatten zuweisen müssen, z. B. für ZFS-Cache oder für Aerospike, erstellen Sie die Hauptpartition mit begrenztem Volumen:

 sgdisk -n2:0:+100GB -t2:BF01 /dev/{{ disk name }} sgdisk -n3:0:0 -t2:BF01 /dev/{{ disk name }} 

Wenn wir den gesamten Speicherplatz nutzen, erstellen Sie einfach einen Abschnitt für den verbleibenden Speicherplatz:


 sgdisk -n2:0:0 -t2:BF01 /dev/{{ disk name }} 

Vergessen Sie nicht zu überprüfen, wie es sich herausstellte:


 lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 1.8T 0 disk ├─sda1 8:1 0 1007K 0 part └─sda2 8:2 0 1.8T 0 part sdb 8:16 0 1.8T 0 disk ├─sdb1 8:17 0 1007K 0 part └─sdb2 8:18 0 1.8T 0 part ... 

2.3. Erstellen eines ZFS-Arrays


 zpool create \ -o ashift=12 \ -O atime=off \ -O canmount=off \ -O compression=lz4 \ -O checksum=fletcher4 \ -O normalization=formD \ -m legacy \ -R /mnt \ -f \ tank \ mirror \ /dev/{{ disk a part 2}} \ /dev/{{ disk b part 2}} 

Der erste Rechen, auf den einer meiner vertrauten Administratoren sofort getreten ist, ist, dass beim Erstellen eines ZFS-Arrays nicht eine Festplatte, sondern eine Partition auf der Festplatte angegeben werden muss, sofern diese speziell dafür erstellt wurde.

Als nächstes in der Reihenfolge:


  • ashift = 12 - verwende die Blockgröße in 4K, im Prinzip verstehe ich immer noch nicht, warum in Betriebssystemen die Standardblockgröße oft 512 Bytes beträgt, wenn es praktisch keine solchen Festplatten gibt;
  • atime = off - Deaktiviere das Aktualisierungsdatum für den Zugriff auf Dateien. Ich deaktiviere es immer, da ich diese Informationen nie wirklich benötigt habe und es nicht erforderlich ist, den Kernel erneut zu laden.
  • canmount = off - Deaktiviert die Möglichkeit, die Root-Partition bereitzustellen.
  • Komprimierung = lz4 - Aktiviert die Datenkomprimierung mit dem LZ4-Algorithmus. Es wird empfohlen, diesen Parameter nicht nur einzuschließen, um Speicherplatz zu sparen, sondern auch um die Anzahl der E / A-Vorgänge zu verringern. Gleichzeitig ist für diesen Komprimierungs-Aglorhythmus die CPU-Auslastung extrem niedrig;
  • Prüfsumme = fletcher4 - der Standard-Prüfsummenalgorithmus, daher lohnt es sich, fletcher4 erneut zu überprüfen.
  • Normalisierung = formD - wird verwendet, um die Arbeit mit UTF-8 zu verbessern und die Möglichkeit der Verwendung von Nicht-UTF-8-Dateinamen einzuschränken. Hier entscheidet jeder für sich, in unserer Arbeit verwenden wir immer nur die UTF-8-Codierung;
  • xattr = sa - Beschleunigt die Arbeit mit erweiterten Attributen. Ich verwende diese Option nicht, da bei Verwendung dieser Option die Kompatibilität mit anderen OpenZFS-Implementierungen deaktiviert ist (z. B. FreeBSD). Und Kompatibilität mit Windows und übrigens muss ich. Darüber hinaus kann diese Option im letzten Abschnitt aktiviert werden.
  • -m Legacy - Mount-Punkt nach nirgendwo und keine Notwendigkeit, die Root-Partition zu mounten;
  • -R / mnt - temporäres Partitions-Mounting-Präfix für die Installation des Kernels;
  • -f - Array-Erstellung erzwingen. Wenn das ZFS-Array zuvor auf Datenträgern gesammelt wurde, funktioniert der Befehl create nicht. Sie wissen nie, vielleicht haben Sie einen Fehler gemacht und möchten wichtige Daten löschen.

Ich gebe gewöhnlich den Namen des Root-System-Festplatten-Arrays als Tank an, obwohl sie derzeit den Namen rpool (Root-Pool) in der Linux-Umgebung bevorzugen. In meiner Praxis verwende ich im Allgemeinen diese Benennung von Arrays:


  • Tank - das Hauptsystem-Array;
  • store - ein zusätzliches Array mit großen Festplatten zur Datenspeicherung;
  • Cache - ein zusätzliches Array von SSD-Festplatten, wenn sich die Hauptpartition nicht auf ihnen befindet;

Im Allgemeinen empfehle ich dringend, sofort eine Praxis zu entwickeln, bei der etwas benannt wird, das nicht verwechselt werden kann.


3. Systeminstallation


3.1. und 3.2. Erstellen eines Root-Dateisystems


Ich habe die Absätze 3.1 speziell kombiniert. und 3.2. da ich glaube, dass die Angabe der Root-Partition auf der dritten Ebene absolut redundant ist. Das stimmt, für mehrere Jahre der Arbeit mit ZFS musste ich nie Manipulationen an der Root-Partition vornehmen. Darüber hinaus gibt es Bilder, mit denen Sie Kontrollpunkte setzen können. Daher ist mein Wurzelabschnitt Tank / Wurzel:

 zfs create -o mountpoint=/ tank/root 

Gleichzeitig wird der erste schwerwiegende Fehler in der ursprünglichen Anweisung erkannt, nämlich das Fehlen einer Startpartition für das Festplattenarray:

 zpool set bootfs=tank/root tank 

3.3. Erstellen Sie zusätzliche Partitionen


In diesem Teil der Grundanleitung können Sie alles werfen und vergessen. Die Jungs haben es offensichtlich mit Crushing und Optionen übertrieben, weshalb ich auf dem Weg etwas reparieren musste. Es hat zwar nicht viel geholfen. Da später wieder Probleme auftreten und sich am Ende herausstellt, dass dies trotzdem nicht funktioniert, wird in Absatz 4.11. dies wird wieder korrigiert.


Das Trennen eines separaten Abschnitts für / var / games sieht ziemlich episch aus. Es macht mir nichts aus, aber das ist eindeutig zu viel.


Die Tatsache, dass Partitionen in ZFS einfach erstellt werden und eine Hierarchie unterstützen, bedeutet nicht, dass klassische Verzeichnisse aufgegeben werden sollten. Ein einfaches Beispiel: Ich hatte einmal mehr als 4K ZFS-Partitionen auf einer Servergruppe, es war notwendig, aber der Neustart des Servers wurde aufgrund des Mounten dieser Partitionen für einige Minuten verlangsamt.


Beginnen wir mit einer sauberen Tafel.


Es gibt statische und dynamische Dateipartitionen.


Statische Dateibereiche enthalten Abschnitte mit Programmen und deren Einstellungen. Sie werden einmal gefüllt und ändern sich während des Betriebs nicht. Gleichzeitig wurden frühere statische Partitionen in System- und Benutzerpartitionen (/ usr) unterteilt, aber im Moment sind sie in den Linux-Betriebssystemen gemischt, und es macht keinen Sinn, sie zu trennen, und es wird nicht funktionieren.


Dynamische Dateibereiche enthalten Abschnitte, in denen Folgendes gespeichert ist:


  • Temporäre Daten - Gl.: Tmp, swap;
  • Arbeitsprotokolle - Gl.: Var / log;
  • Benutzerdaten - Gl.: Home;
  • Daten - Gl.: Var / db und wie viel Glück;
  • Andere Programmergebnisse in Form von Dateien;

In den Linux-Familien enthalten dynamische Partitionen / tmp und / var, aber dies ist nicht korrekt, da sie in / var / lib, Programme und Bibliotheken gelangen können. Im Allgemeinen ist alles gemischt, aber dennoch ...


Zuerst müssen Sie entscheiden, ob Sie die / tmp-Partition auf der Festplatte oder im Speicher als tmpfs erstellen möchten. Wenn wir auf der Festplatte erstellen, erstellen Sie eine separate Partition dafür:


 zfs create -o mountpoint=legacy tank/tmp 

Optionen com.sun: auto-snapshot = false setuid = off gut, egal wie das Wetter ist, nicht komplizieren. Aber mit SWAP werden wir später in Schritt 7 tun.

Trennen Sie den var-Abschnitt separat:


 zfs create -o mountpoint=legacy tank/var 

Und Benutzerabschnitte:


 zfs create -o mountpoint=/home tank/home zfs create -o mountpoint=legacy tank/home/root 

Es ist sinnvoll, Benutzerpartitionen zuzuweisen, da sie in der Praxis regelmäßig mit verschiedenen Artefakten verstopft sind. Um die Überwachung zu vereinfachen, ist es besser, separate Partitionen für sie sowie das Home-Verzeichnis des Root-Benutzers zu erstellen (insbesondere für diejenigen, die gerne als Root arbeiten). Die Verwendung von Kontingenten in Benutzerverzeichnissen hilft nicht nur, den Speicherplatz zu verstopfen, sondern stört auch, da Benutzer in solchen Fällen Artefakte überall hinterlassen und es später schwierig sein kann, sie zu finden. Dies wird nicht behandelt, Sie müssen also nur die Hände kontrollieren und schlagen.

Der Mount Point Tank / Home / Root wird als Legacy aufgeführt, nicht als / Root. Dies ist korrekt, da die Montage dieses Abschnitts in Abschnitt 4.11 erfolgt


Jetzt müssen wir unsere dynamischen Partitionen vorübergehend in / mnt mounten:


 cd /mnt/ mkdir var tmp root mount -t zfs tank/var /mnt/var/ mount -t zfs tank/tmp /mnt/tmp/ mount -t zfs tank/home/root /mnt/root/ 

3.4 Kernel installieren


In der Hauptanweisung gibt es noch ein paar unnötige Befehle, wir achten nicht darauf, anscheinend Artefakte von Experimenten:

 debootstrap bionic /mnt 

Als Ergebnis sollten Sie ungefähr Folgendes erhalten:


 zfs list NAME USED AVAIL REFER MOUNTPOINT tank 213M 1.76T 96K legacy tank/home 208K 1.76T 96K /mnt/home tank/home/root 112K 1.76T 112K legacy tank/root 147M 1.76T 147M /mnt tank/tmp 96K 1.76T 96K legacy tank/var 64.6M 1.76T 64.6M legacy 

Bei der Größe der leeren 96K-Partition blieb jeweils nur tank / tmp leer, und der Rest wurde während der Kernelinstallation aufgezeichnet, was bedeutet, dass die Partitionen korrekt bereitgestellt wurden.


4. Systemkonfiguration


4.1. Konfigurieren Sie Hosts und Hostnamen


 echo HOSTNAME > /mnt/etc/hostname echo “127.0.0.1 localhost” > /mnt/etc/hosts echo “127.0.0.1 HOSTNAME” >> /mnt/etc/hosts 

4.2. Konfigurieren Sie die Netzwerkschnittstelle


Also ja, wir haben hier schon einen Netplan:

 nano /mnt/etc/netplan/setup.yaml network: version: 2 renderer: networkd ethernets: eno2: dhcp4: no dhcp6: no addresses: [ {{ IP }}/{{ netmask }}, ] gateway4: {{ gateway IP }} nameservers: addresses: [8.8.8.8] 

4.3. Konfigurieren Sie passende Repositorys


 nano /mnt/etc/apt/sources.list deb http://archive.ubuntu.com/ubuntu/ bionic main restricted universe deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted universe deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe 

src - wird meistens nicht benötigt

4.4. Wir mounten virtuelle Dateibereiche LiveCD und "gehen" zum neuen System


 mount --rbind /dev /mnt/dev mount --rbind /proc /mnt/proc mount --rbind /sys /mnt/sys chroot /mnt /bin/bash --login 

Es ist erforderlich, - rbind zu verwenden, aber nicht - bind

Wir sind bereits im neuen System ...


4.5. Richten Sie die Basisumgebung ein


 ln -s /proc/self/mounts /etc/mtab chmod 1777 /tmp apt update 

Gebietsschema und Zeit:


 dpkg-reconfigure locales * en_US.UTF-8 * ru_RU.UTF-8 dpkg-reconfigure tzdata 

Und weitere Redakteure, denen was gefällt:


 apt install --yes vim nano 

4.6. Installieren der ZFS-Unterstützung


 apt install --yes --no-install-recommends linux-image-generic apt install --yes zfs-initramfs 

4.8. Installieren Sie den Bootloader


Wie bereits erwähnt, verwende ich einen veralteten MBR:


 apt install --yes grub-pc 

Während der Installation des Bootloaders müssen alle von uns als bootfähig identifizierten Festplatten ausgewählt werden. Während das Installationsprogramm auf alle anderen Festplatten außer der ersten schwört, stimmen wir zu und führen Schritt 5 aus (es ist nicht klar, warum der Rest für später übrig blieb):

4.8.1. (5.1) Überprüfen Sie, ob das Root-Dateisystem erkannt wird:


 grub-probe / zfs 

4.8.2. (5.2) Aktualisierung von initrd


 update-initramfs -u -k al 

4.8.3. (5.3) Vereinfachen Sie das GRUB-Debugging


 vi /etc/default/grub ... GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="console" ... 

4.8.4. (5.4.) Aktualisieren der Bootloader-Konfiguration


 update-grub 

4.8.5. (5.5.) Installieren Sie den Bootloader auf jeder Festplatte, die als bootfähig markiert ist


 grub-install /dev/sda grub-install /dev/sdb ... 

Es ist wichtig, dass diese Befehle korrekt funktionieren. Um ehrlich zu sein, konnte ich nicht mindestens einmal das Gegenteil feststellen, daher weiß ich nicht, was ich tun soll. Wenn Sie jedoch einen Fehler haben, haben Sie beim Markieren der Festplatte höchstwahrscheinlich etwas falsch gemacht (Abschnitt 2.2.).

4.8.6. (5.6.) Überprüfen Sie, ob das ZFS-Modul installiert ist


 ls /boot/grub/*/zfs.mod /boot/grub/i386-pc/zfs.mod 

4.10. Legen Sie das Root-Passwort fest (schwer!)


 passwd 

Und ja, wir werden openssh sofort installieren, andernfalls erhalten wir nach dem Neustart eine Überraschung, wenn wir remote arbeiten:

 apt install --yes openssh-server 

Vergessen Sie nicht, die sshd-Konfiguration zu korrigieren:


 vi /etc/ssh/sshd_config ... PermitRootLogin yes ... PasswordAuthentication yes ... 

4.11. Fix Mount Dateisysteme


Hier kamen wir zum interessantesten. Tatsache ist, dass ZFS-Partitionen nach dem Start einiger Daemons gemountet werden (wir haben auch ZFS_INITRD_ADDITIONAL_DATASETS in / etc / default / zfs beeinflusst), wodurch wiederum eine eigene Struktur in / var erstellt wird, die die Systemprotokolle ausfüllt. Wenn die Zeit zum Bereitstellen von ZFS-Partitionen gekommen ist, stellt sich heraus, dass die Bereitstellungspunkte nicht leer sind und nichts bereitgestellt wird, die Daten verstreut sind und alles schlecht ist. Daher müssen Sie Mountpunkte in / etc / fstab angeben, da systemd sich beim Zugriff auf den Ordner hauptsächlich auf diese konzentriert:

 vi /etc/fstab tank/var /var zfs noatime,nodev 0 0 tank/tmp /tmp zfs noatime,nodev 0 0 tank/home/root /root zfs noatime,nodev 0 0 

Der Rest liegt bei Ziffer 6. schon erledigt

6. Starten Sie zuerst neu


6.1. Machen Sie ein Bild von der Root-Partition


 zfs snapshot tank/root@setup 

Es macht keinen Sinn von ihm, in der Praxis habe ich die Root-Partition des Systems nie erschüttert und nie Snapshots dieser Partition verwendet, aber lassen Sie es trotzdem liegen, es kann nützlich sein

6.2. Chroot verlassen


 exit 

6.3. Hängen Sie LiveCD-Partitionen aus und exportieren Sie das ZFS-Array


 cd mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {} umount /mnt/root umount /mnt/var umount /mnt/tmp zpool export tank 

Export des Festplattenarrays erforderlich, um den zfs-Cache zu löschen

6.4 Neustart


Ein Neustart erfolgt am besten im LiveCD-Terminal, da ein Neustart über einen SSH-Client zum Einfrieren des Servers führen kann.

 reboot 

Wenn schließlich etwas schief gelaufen ist und der Server nicht neu gestartet wurde, können Sie auf jede Weise neu starten, da das ZFS-Array exportiert wird und es schwierig ist, es zu beschädigen.

6.5. Wir warten auf einen Neustart und gehen als root


6.6. Erstellen Sie Ihr Benutzerkonto


 zfs create tank/home/{{ LOGIN }} useradd -u {{ UID }} -G adm,sudo -d /home/{{ LOGIN }}/ -s /bin/bash {{ LOGIN }} cp -a /etc/skel/.[!.]* /home/{{ LOGIN }} chown -R {{ LOGIN }}:{{ LOGIN }} /home/{{ LOGIN }} 

Fügen Sie dem Benutzer den öffentlichen SSH-Schlüssel hinzu und legen Sie das Kennwort für ihn fest:


 su - {{ LOGIN }} mkdir .ssh chmod 0700 .ssh vi .ssh/authorized_keys exit passwd {{ LOGIN }} 

In OpenSSH entfernen wir die Möglichkeit, sich als Root- und Passwortauthentifizierung anzumelden:

 vi /etc/ssh/sshd_config ... PermitRootLogin no ... PubkeyAuthentication yes ... PasswordAuthentication no ... service ssh restart 

6.7. 6.8. Nicht mehr erforderlich


7. Swap konfigurieren


7.1. Erstellen Sie eine ZFS-Partition


 zfs create \ -V 32G \ -b $(getconf PAGESIZE) \ -o compression=zle \ -o logbias=throughput \ -o sync=always \ -o primarycache=metadata \ -o secondarycache=none \ tank/swap 

  • -V 32G - Mit der Größe unseres SWAP können Sie die Größe bestimmen, die wirklich benötigt wird.
  • -b $ (getconf PAGESIZE) - Blockgröße (4 KB mit Ashift = 12);
  • Komprimierung = zle - Wählen Sie den Komprimierungsalgorithmus aus, der im Hinblick auf den Ressourcenverbrauch minimal ist, da wir eine Blockgröße von 4 KB haben. Die Komprimierung allein ermöglicht keine E / A-Nutzung, es ist jedoch möglich, Nullblöcke einzusparen.
  • logbias = Durchsatz - Einstellen der Bandbreite zur Optimierung synchroner Vorgänge;
  • sync = always - synchronisiert immer den Datensatz. Dies verringert die Leistung geringfügig, garantiert jedoch die Zuverlässigkeit der Daten vollständig.
  • Primärcache = Metadaten - Nur Metadaten im Cache, da Swap nicht verwendet wird, um denselben Block mehrmals zu lesen.
  • sekundärer Cache = keine - Deaktivieren Sie den sekundären Cache aus den oben genannten Gründen vollständig.

7.2. Richten Sie die Swap-Partition ein


 mkswap -f /dev/zvol/tank/swap echo /dev/zvol/tank/swap none swap defaults 0 0 >> /etc/fstab echo RESUME=none > /etc/initramfs-tools/conf.d/resume 

7.3. Swap einschalten


 swapon -av 

Das Befolgen der Anweisungen ist nicht sehr interessant, da dies stark von den Einstellungen bestimmter Administratoren und den Aufgaben des gesamten Servers abhängt, mit Ausnahme eines Punktes: "Notfallstart".

Und vergessen Sie nicht, Firewall zu setzen


R. Notstiefel


Wir bereiten die Installationsumgebung vor (Punkt 1.)


Während der Vorbereitung wird das ZFS-Array importiert, daher müssen Sie es erneut importieren, jedoch mit dem richtigen Einhängepunkt:


 zpool export -a zpool import -N -R /mnt tank zfs mount -a 

, , , fstab, :

 mount -t zfs tank/var /mnt/var/ mount -t zfs tank/tmp /mnt/tmp/ mount -t zfs tank/home/root /mnt/root/ 

, , chroot .4.4., . 6.3.


D.


3.3. . , : , /spool, /data. ZFS .


Zusammenfassung


  • ZFS , , ;
  • ZFS, , . ZFS — , ;
  • .

Source: https://habr.com/ru/post/de439860/


All Articles