Festplatte programmgesteuert partitionieren

10

Ich versuche, ein Bash-Skript zu erstellen, das eine neue Partition mit einem Dateisystem auf einer Festplatte mit vorhandenen Partitionen erstellt.

Es sieht so aus, als ob es einfach ist, Partitionen programmgesteuert mit parted zu erstellen. Sie müssen jedoch wissen, wo die neue Partition gestartet und gestoppt werden soll, und hier habe ich Probleme.

Ich möchte mich nicht darauf verlassen, dass die Festplatte Partitionen in einer bestimmten Position / Größe hat. Das heißt, ich möchte eine neue Partition erstellen, die unmittelbar nach der letzten vorhandenen beginnt. Ich möchte dann in der Lage sein, die Partition entweder mit einer festen Größe zu erstellen oder den verbleibenden Speicherplatz zu füllen.

Gibt es in Bash eine zuverlässige Methode zur Bestimmung?

a) die Endposition der letzten Partition und
b) der verbleibende nicht partitionierte Speicherplatz nach der letzten Partition?

Alex
quelle
1
Selbst wenn du es schaffst, würde ich es nicht tun. Stellen Sie sich vor, welchen Schaden ein Tippfehler hier anrichten kann ...
Joseph R.
Besser nicht. Installer einiger Distributionen haben Repartitionierer und es ist nicht wirklich einfach, eine zu schreiben. Zu viele Eckfälle, zu viele Dinge, die Sie durcheinander bringen können. Tu es nicht. Wenn Sie dies tun, lassen Sie es eine vorgeschlagene Konfiguration erstellen, die vom Bediener genehmigt werden muss.
Peterph
Ich bin damit einverstanden, dass dies gefährlich ist. Dies ist jedoch ein Skript, das zunächst alle Partitionen auf der Festplatte löscht, sodass es keine große Sache ist, die Partitionen danach durcheinander zu bringen. Das einzige Risiko besteht darin, dass der Benutzer die falsche Festplatte angibt, was mit jedem Partitionstool genauso einfach ist.
Alex

Antworten:

4

partedkann freien Speicherplatz drucken. Beispiel (Ich habe absichtlich ein kompliziertes ausgewählt):

# parted /dev/sda unit s print free
[...]
Number  Start      End        Size       Type      File system  Flags
        63s        2047s      1985s                Free Space
 1      2048s      4196351s   4194304s   primary   fat32        lba
        4196352s   4198399s   2048s                Free Space
 2      4198400s   6295551s   2097152s   primary   ext2         boot
        6295552s   6297599s   2048s                Free Space
 3      6297600s   27269119s  20971520s  primary   ext2
        27269120s  27271167s  2048s                Free Space
 4      27271168s  31115263s  3844096s   extended               lba
 5      27273216s  29192191s  1918976s   logical   ext2
 6      29194240s  31115263s  1921024s   logical   ext2
        31115264s  31116287s  1024s                Free Space

Wie Sie sehen, erhalten Sie direkt die Position und Größe der Partition, die Sie möglicherweise erstellen können, dh die allerletzte Zeile, in der steht Free Space. Sie können eine Partition erstellen, die bei 31115264 beginnt und bei 31116287 endet.

Ohne die Gefahr wäre die erweiterte Partition nicht groß genug!

Aber vielleicht verwenden Sie bereits GPT, wenn Sie nicht an solchen Komplikationen leiden.

Das Auffinden der Zahlen sollte einfach genug sein.

function make_partition
{
    parted -s "$1" unit s mkpart primary "$2" "$3"
}

make_partition /dev/sda `parted /dev/sda unit s print free | grep 'Free Space' | tail -n 1`

Oder etwas ähnliches. (Natürlich möchten Sie hier noch einige Gesundheitsprüfungen durchführen.)

@swisscheese machte einen guten Kommentar in der anderen Antwort, ich wusste nicht, partedangeboten parse freundliche Ausgabe. Sie können sich stattdessen dafür entscheiden. Beispiel für das Ergreifen des letzten größten freien:

# parted -m /dev/sda unit s print free | grep 'free;' | sort -t : -k 4n -k 2n | tail -n 1
1:27269120s:27271167s:2048s:free;

Ob dies für Ihre Situation zutrifft (in meinem Beispiel konnten Sie dort auch keine Partition erstellen, sie ist bereits voll), müssen Sie selbst herausfinden. :) :)

Frostschutz
quelle
Vielen Dank! Als Referenz habe ich Ihre make_partition-Funktion verwendet, aber mit etwas anderen Argumenten: make_partition $ diskparted -m $disk unit s print free | grep "free;" | tail -n 1 | awk -F':' '{print $2 " " $3}'
Alex
-1

Es ist einfach, mkpartedeine hat --listOption, müssen Sie verwenden awk und --listdie letzte Partition abzurufen , und dann verwenden mkpart part-type [fs-type] start end,

Aber deine Antwort:

Zuerst sollten Sie alle Partitionen erhalten und mit:

mystartgroup=`parted --list |awk {'print $2'}`
myendgroup=`parted --list |awk {'print $3'}`

Anmerkungen:

  1. Sie sollten konvertieren GBzu MG.
  2. Sie sollten jeweils den letzten Wert verwenden variable
  3. Sie sollten -sin Ihrem parted commandendgültigen Skript verwenden.

Wenn ich Zeit habe, vervollständige dieses Skript. Entschuldigung, ich habe keine Zeit.

Persischer Golf
quelle
Hallo, haben Sie tatsächlich die von Ihnen vorgeschlagenen Befehlssequenzen ausgeführt? Ich glaube nicht, dass sie tun, was Sie von ihnen erwarten .. :(
swisscheese
Ich habe aktualisiert, bitte noch einmal lesen.
PersianGulf
Option 2 wurde ebenfalls geändert.
PersianGulf
2
Hallo, was ich meinte war, 'parted --list | awk' {print $ 2} 'ist nur blindlings zu awk! Es bekommt NICHT was du willst. Sie sollten die Option -m zum Trennen verwenden, die eine "Analyse-freundliche" Ausgabe bietet.
Swisscheese
1
Nichts mehr zu sagen, viel Glück.
Swisscheese