
Wie kann ich die Root-Partition ändern, von der Debian 10 booten soll?
Ich möchte die Größe meines Root-Dateisystems, das sich auf einem logischen LVM-Volume befindet, remote verringern, und zwar nur über SSH und ohne von einer Live-CD zu booten.
Da wir das Root-Dateisystem nicht verkleinern können, während es gemountet ist, habe ich mir gedacht, dass ich einfach das vorhandene Root-Dateisystem klone, damit boote und die Größenanpassung von dort aus vornehme, dann mit dem ursprünglichen Root-Dateisystem boote und das temporäre lösche.
Ich habe es in einer VM mit Ubuntu Server 18.04 versucht, da es meines Wissens nach dieselbe „Boot-Kette“ wie Debain 10 verwendet. Allerdings konnte ich die geklonte Partition nicht zuverlässig als Root festlegen. Nach einem Neustart habe ich es mit überprüft mount
und das ursprüngliche Root wird immer noch verwendet, obwohl
/etc/fstab
wurde aktualisiert/boot/grub/grub.cfg
wurde aktualisiertinitramfs
wurde aktualisiert
Aktuelle Konfiguration
- 1 TB RAID1
md0
- 4 TB RAID1
md1
- PV ein
md0
- PV ein
md1p1
- VG
vg0
mit beiden PVs - LV
root
als ursprüngliches Root-Dateisystem (UUIDxxx
) - LV
newroot
als temporäres Root-Flash-Laufwerk (UUIDyyy
) - ext4 ein
vg0-root
(UUIDaaa
) - ext4 ein
vg0-newroot
(UUIDbbb
)
/etc/fstab
wurde entsprechend geändert (Device-Mapper-Pfad ersetzt).
Bisher habe ich das komplette alte Root-Verzeichnis per rsync aaa
mit dem neuen Root-Verzeichnis synchronisiert bbb
und sämtliche Vorkommen von UUIDs aaa
und xxx
durch bbb
und yyy
in ersetzt /boot/grub/grub.cfg
(Hinweis: Ich verwende keinen grub2
UEFI-Boot).
initramfs
wurde mit aktualisiert update-initramfs -u
(nach dem Beheben von /etc/initramfs-tools/conf.d/resume
).
In dieser Reihenfolge. Aber meine Tests in einer VM haben entweder direkt zum alten Stamm gebootet oder mich in eine GRUB-Rettungsshell geworfen.
update-grub
hat das newroot
Volume erkannt und passende Einträge hinzugefügt grub.cfg
, diese beim Booten in meiner Test-VM manuell ausgewählt (über SSH nicht möglich ...) und auch das alte Root gebootet.
Ich habe auch gesehen, dass es eine ROOT
Option zum /etc/initramfs-tools/initramfs.conf
Festcodieren der Root-Partition gibt:
Ermöglicht optionales Hardcoding des Root-Bootarguments, wenn kein Root-Bootarg übergeben werden kann. Ein Root-Bootarg überschreibt diese spezielle Einstellung.
Da in meinem aber ein Bootarg für Root vorhanden ist, grub.cfg
sollte diese Einstellung keinen Effekt haben.
Was muss sonst noch konfiguriert werden, um beim nächsten Booten eine andere UUID als Root zu verwenden?
Antwort1
/boot/grub/grub.cfg
Es stellte sich heraus, dass ich vergessen hatte, das Bootarg „root=“ in … zu ersetzen .
Der Vollständigkeit halber:
So verschieben Sie die Root-Partition per SSH ohne Live-System auf ein anderes PV in LVM
Hinweis: Sichern Sie wichtige Daten immer! Diese Methode ist ein Hack und sollte nicht auf Produktionssystemen verwendet werden. In jedem Fall gehen Daten, die in der Zeit zwischen dem LV-Klon und dem Booten von der neuen Root-Partition geschrieben wurden, immer verloren.
Neues LVM auf anderer Festplatte erstellen
fdisk /dev/sdb #Create new partition for PV (sdb1)
pvcreate /dev/sdb1
vgcreate vg1 /dev/sdb1
lvcreate -n newroot -L10G vg1 #Size has to be larger than effective usage on current root
mkfs.ext4 -L newroot /dev/mapper/vg1-newroot
Sammeln Sie Informationen über neue LVM
lvdisplay
vgdisplay
pvdisplay
blkid
Die folgenden Befehle beziehen sich auf die hier dargestellten Informationen wie folgt:
- $pv0uuid = UUID des alten PV
- $pv1uuid = UUID des neuen PV
- $vg{0,1}uuid = UUID der {alten,neuen} VG
- $lv{0,1}UUID = UUID des {alten,neuen} LV
- $root{0,1}UUID = UUID des {alten,neuen} Root-Dateisystems
- $vg{0,1} = Name der {alten,neuen} VG
- $lv{0,1} = Name des {alten,neuen} LV
Und /etc/grub/grub.cfg
wird als angezeigt $grubcfg
. Bei UEFI-Systemen ist dies höchstwahrscheinlich /boot/grub2/grub.cfg
.
Ich empfehle, diese als Variablen festzulegen, bash
damit pv0uuid=xxxxxx-xxxx...
die folgenden Befehle kopiert und eingefügt werden können.
Neues Root-Recht in der GRUB-Konfiguration festlegen
Diese Befehle ersetzen Text in der GRUB-Konfiguration:
sed -i "s/$pv0uuid/$pv1uuid/g" $grubcfg
sed -i "s/$vg0uuid/$vg1uuid/g" $grubcfg
sed -i "s/$lv0uuid/$lv1uuid/g" $grubcfg
sed -i "s/$root0uuid/$root1uuid/g" $grubcfg
sed -i "s/$vg0/$vg1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/$lv0/$lv1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/\/dev\/mapper\/$vg0-$lv0/\/dev\/mapper\/$vg1-$lv1/g" /etc/fstab #BEWARE COMMON NAMES
Vorsicht vor gebräuchlichen Namen:
sed
wird ersetzenjedenVorkommen von übereinstimmendem Text. Es wird daher empfohlen, diese Änderungen manuell vorzunehmen, da das Ersetzen von Wörtern, wie sieroot
an anderer Stelle in der GRUB- oder fstab-Konfiguration verwendet werden, diese ungültig macht!
Ich empfehle, die VG- und LV-Namen zu verwenden nano
und danach zu suchen ( CTRL+W
) und sie dann manuell zu ersetzen. Es wird auch empfohlen, für alle Fälle nach dem PV-Gerätenamen zu suchen ...
Klonen Sie das Stammvolume
mount /dev/mapper/$vg1-$lv1 /mnt
rsync -rAa --one-file-system / /mnt/
umount /mnt
Neustart
Neustart (und beten). Überprüfen Sie, ob das neue LV gemountet wird /
.
Altes LVM löschen
lvremove /dev/$vg0/*
vgremove $vg0
pvremove /dev/sda2 #Path to $pv0uuid
Aufräumen
Optional, aber empfohlen
- Löschen Sie abschließend das alte VG,
/etc/lvm/archive
da es sonst bei jedem Bootvorgang gesucht wird und dadurch Verzögerungen entstehen. update-grub
update-initramfs -u
Anmerkungen
Getestet auf Ubuntu 18.04. Andere Distributionen handhaben die GRUB-Konfiguration möglicherweise anders (in Bezug auf UUIDs vs. Gerätepfade und Aktualisierungsbefehle).
Um den Datenverlust zu minimieren, sollten Sie natürlich vorher alle nicht benötigten Dienste beenden.
Es könnte eine Möglichkeit geben, (die meisten) Datenverluste durch die Verwendung von Systemd-Zielen, benutzerdefinierten Skripten und LVM-Snapshots zu vermeiden. Man müsste die Daten im letztmöglichen Moment vor dem Neustart erneut synchronisieren $lv0
. $lv1
Dies würde den Rahmen dieses Beitrags sprengen ...
Wenn /boot
es sich nicht um eine separate Partition handelt, überprüfen Sie $grubcfg
das neue Stammverzeichnis noch einmal, bevor Sie erneut einen Neustart durchführen.
Antwort2
Ich bin nicht sicher, ob Ihnen das hilft, aber ich habe erfolgreich versucht, die Root-Partition auf LV zu verkleinern:
- Erstellen Sie einen Snapshot der Root-Partition. Stellen Sie sicher, dass genügend Speicherplatz zugewiesen ist, da Sie ihn ändern werden.
- Führen Sie einen Fsck-Vorgang für den Schnappschuss durch.
- Passen Sie die Größe des Snapshots an (verkleinern Sie ihn) und stellen Sie sicher, dass zwischen der Oberseite des Dateisystems und der Grenze der Zielgröße des LV ein Puffer vorhanden ist – nur um auf Nummer sicher zu gehen.
- Führen Sie den Snapshot wieder mit Ihrem Rootfs-LV zusammen.
- Neustart. Die Zusammenführung wird tatsächlich an diesem Punkt durchgeführt (wahrscheinlich während des Bootens).
- Nach einem Neustart verkleinern Sie das RootFS-Volume und passen die Größe des RootFS ggf. erneut an, sodass der gesamte Speicherplatz bis zum oberen Rand des LV ausgefüllt wird.
Es gibt jedoch einen Nachteil: Sie VERLIEREN zwischen den Schritten 1 und 5 einige Daten und es KÖNNEN in Schritt 1 (abhängig vom verwendeten FS) einige Inkonsistenzen auftreten, da Sie einen Snapshot auf einem Live-Dateisystem erstellen.
Bei mir hat es überraschend gut funktioniert.
Im Idealfall würde Schritt 1 während des Bootvorgangs ausgeführt, bevor rootfs rw erneut gemountet wird, damit der Snapshot sauber ist. Ich habe nicht herausgefunden, wie das von Dracut aus geht – die Tools, die ich zu verwenden versucht habe, haben bei mir nicht funktioniert.