Letzte Partition automatisch erweitern, um den gesamten nicht zugewiesenen Speicherplatz im Batch-Modus zu verwenden

19

Kurz gesagt, ich muss dies alles automatisch beim Booten ausführen (eingebettetes System).

Unsere Ingenieure werden Bilder auf Produktionsgeräte flashen. Diese Images enthalten eine kleine Partitionstabelle. Beim Booten muss ich die letzte Partition (# 3) automatisch erweitern, um den gesamten verfügbaren Speicherplatz auf der Festplatte zu nutzen.

Folgendes erhalte ich, wenn ich den freien Speicherplatz auf meiner Festplatte betrachte.

> parted /dev/sda print free
Model: Lexar JumpDrive (scsi)
Disk /dev/sda: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
        17.4kB  1049kB  1031kB  Free Space
 1      1049kB  25.3MB  24.2MB  fat16        primary  legacy_boot
        25.3MB  26.2MB  922kB   Free Space
 2      26.2MB  475MB   449MB   ext4         primary
 3      475MB   1549MB  1074MB  ext4         primary
        1549MB  32.0GB  30.5GB  Free Space

Ich muss Partition 3 um N (30,5 GB) Bytes erweitern

Wie führe ich diesen Schritt automatisch ohne Aufforderung aus? Dies muss mit einer dynamischen Größe des verfügbaren Speicherplatzes nach der 3. Partition funktionieren.

Paul Knopf
quelle
Erwarten Sie nicht, ein fertiges Skript zu erhalten, ohne es zu versuchen! Können Sie uns also zeigen, was Sie bis jetzt versucht haben? Eine andere Sache, die Partition, deren Größe Sie ändern, muss nicht während des Vorgangs gemountet werden ....
Luciano Andress Martini
Ich habe versucht, resizepartBefehl, und es funktioniert, aber es erfordert eine genaue Größe. Ich brauche es, um dynamisch zu sein.
Paul Knopf
resize2fsVielleicht ist es das, wonach ich suche. linux.die.net/man/8/resize2fs
Paul Knopf

Antworten:

21

In der aktuellen Versionen von parted, resizepartsollte für die Partition arbeitet ( partedversteht 100%oder Dinge wie -1s, letztere auch Bedürfnisse --zu stoppen Optionen auf dem cmdline Parsing). Um den genauen Wert zu bestimmen können Sie verwenden unit s, print free. resize2fskommt danach für das Dateisystem.


Alte Versionen von partedhatten einen resizeBefehl, der sowohl die Partition als auch das Dateisystem in einem Rutsch verkleinerte, es funktionierte sogar für vfat.

In einer Kobo-Ereader-Modifikation habe ich dies verwendet, um die Größe der dritten Partition des internen Speichers auf das Maximum zu bringen:

start=$(cat /sys/block/mmcblk0/mmcblk0p3/start)
end=$(($start+$(cat /sys/block/mmcblk0/mmcblk0p3/size)))
newend=$(($(cat /sys/block/mmcblk0/size)-8))

if [ "$newend" -gt "$end" ]
then
    parted -s /dev/mmcblk0 unit s resize 3 $start $newend
fi

Sie können die Werte also auch abrufen, /sys/block/.../wenn der Kernel dies unterstützt. Aber partedentfernt , um den resizeBefehl , so dass Sie nun zwei Schritte tun, um resizepartdie Partition zu wachsen, und was auch immer Werkzeug , um Ihr Dateisystem sieht vor, dass wachsen, wie resize2fsfür ext*.

Frostschutz
quelle
Genau das habe ich gesucht. Danke für Ihre Hilfe!
Paul Knopf
Nebenfrage, was ist mit den 8 Bytes am Ende?
Paul Knopf
Vermeiden Sie die Größenänderung durch einen einzelnen Sektor ... Sie müssten dies auf -40 oder so ändern (GPT-Backup-Header am Ende der Festplatte).
Frostschutz
Hat partedunterstützt keine automatische Verlängerung von der Kommandozeile? Denn es ist es interaktiv unterstützen. Bei interaktiver Ausführung werden Sie gefragt, ob Sie die GPT-Partitionstabelle so korrigieren möchten, dass sie der Größe des Datenträgers (Datenträgertyp fix) entspricht. Anschließend können Sie sie ausführen resizepart 3 -1. Ich habe versucht, über die Befehlszeile herauszufinden, wie ich das erreichen kann.
Harvey
Nicht so schnell: Der Befehl zum Ändern der Größe wurde in Parted 3.0 entfernt. Versuchen Sie es mit sfdisk oder gparted.
GregD
14

Da das Skript nicht ordnungsgemäß getrennt werden konnte (es wurde um Bestätigung gebeten, da die Partition angehängt war, und im Gegensatz zu anderen Antworten, die ich nicht verstand -1soder fand 100%), habe ich gerade das Growpart-Tool gefunden, das genau dies ausführt .

Die Verwendung ist einfach: growpart /dev/sda 3(und dann resize2fs /dev/sda3oder ein anderer geeigneter Befehl für den verwendeten Dateisystemtyp).

In Debian und Ubuntu ist es als Cloud-Guest-Utils gepackt .

Ivo Smits
quelle
Dies ist der bequemste Weg, den ich derzeit dafür finden kann. Es hat wunderbar funktioniert.
SebiF
Dies war die Lösung für mich - parted mochte ext4 nicht als Dateisystem und es schien keine Möglichkeit zu geben, die Größe des Dateisystems zu ändern ...
Antti Haapala
funktioniert nicht für Ubuntu 18.04
DreamFlasher
@DreamFlasher Ich kann nicht sagen, warum es bei dir nicht funktioniert hat. Soweit ich sehe, können Sie einfach das Paket cloud-guest-utils installieren. Da dies die einzige Funktion ist, die von growpart bereitgestellt wird, sollte es funktionieren, es sei denn, es liegt ein Fehler vor, es wird falsch verwendet oder etwas außerhalb seiner Kontrolle läuft schief. Beachten Sie, dass das letzte Argument (3 im Beispiel) die Partition ist, deren Größe geändert werden soll, und dass direkt nach der Partition ausreichend Speicherplatz verfügbar sein muss, um die Größe auf diese Weise ändern zu können.
Ivo Smits
7

Der richtige Weg, dies zu tun, besteht darin, die Tatsache zu nutzen, dass der Begriff "getrennt" Prozentangaben enthält. So

parted /dev/sda resize 3 100%
Jonathan Buzzard
quelle
1
veraltet, funktioniert nicht mit Ubuntu 18.04 und höher
DreamFlasher
Wenn der Befehl zum Ändern der Größe in Parted Version 3 nicht mehr vorhanden ist, müssen Sie jetzt den Befehl resizepart verwenden und dann die Größe des zugrunde liegenden Dateisystems oder PV separat ändern, wenn Sie dies verwenden. Für ext4 lautet der Befehl resize2fs oder für XFS xfs_growfs. Beides geschieht normalerweise, wenn das Dateisystem eingehängt ist und das Argument in beiden Fällen der Einhängepunkt ist.
Jonathan Buzzard
0

In Ubuntu 18.04 kann ich die Größe ändern, um nicht zugewiesenen Speicherplatz in einem Skript wie folgt zu füllen:

sudo parted -s /dev/sdb "resizepart 2 -1" quit
sudo mount -av
sudo umount /dev/sdb2
sudo mount /dev/sdb2 /mnt
sudo resize2fs /dev/sdb2

Es ist möglicherweise nicht erforderlich, vor dem Ändern der Größe eine Montage durchzuführen. Ich habe es getan, um eine Abfrage von resize2fs für Benutzereingaben zu unterdrücken.

Nolan Zinn
quelle