ubuntuusers.de

GPT partition anlegen in Shellscript

Status: Ungelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

frank-w

Anmeldungsdatum:
30. September 2008

Beiträge: 419

Hallo,

ich möchte eine GPT für ein arm64-board anlegen und habe eine vorhandene gpt, wo ich die letzten beiden Partitionen vom user definierbar machen möchte.

aktuell schaue ich mir das mit (s)gdisk an:

$ sudo gdisk /dev/sdb
[sudo] Passwort für frank: 
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sdb: 62333952 sectors, 29.7 GiB
Model: SD/MMC/MS PRO   
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 2BD17853-102B-4500-AA1A-8A21D4D7984D
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 62333918
Partitions will be aligned on 2-sector boundaries
Total free space is 49528798 sectors (23.6 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            8191   4.0 MiB     8300  bl2
   2            8192            9215   512.0 KiB   8300  u-boot-env
   3            9216           13311   2.0 MiB     8300  factory
   4           13312           17407   2.0 MiB     8300  fip
   5           17408          222207   100.0 MiB   8300  kernel
   6          222208        12805120   6.0 GiB     8300  rootfs

diese gpt möchte ich jetzt erstmal via sgdisk anlegen. was mich wundert ist, dass die manpage immer von sektoren redet

Some options take no arguments, others take one argument (typically a partition number), and others take compound arguments with colon delimitation. For instance, -n (--new) takes a partition number, a starting sector number, and an ending sector number, as in sgdisk -n 2:2000:50000 /dev/sdc, which creates a new partition, numbered 2, starting at sector 2000 an ending at sector 50,000, on /dev/sdc.

im https://wiki.ubuntuusers.de/gdisk/#Anlegen-einer-Partition aber von bytes gesprochen wird

Die neue Partition erhält die Nummer 1, wird 1024 Bytes groß und vor die anderen Partitionen in den Bereich von 1024-2048 Bytes gelegt (-n 1:1024:2048)

wie oben zu sehen ist, ist die Sektor-größe 512 byte, ich möchte aber trotzdem gerne das richtige alignment verwenden (nur 1024 bleibt dann bei geraden sektoren)...

so ganz passt das mit dem alignment nicht, der Wert wird scheinbar auch als sektor verwendet und nicht als bytes

aktuell sieht mein Script so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
echo "losetup needs root permissions"
dev=$(sudo losetup -f)
img=$(mktemp)

#imgsize=7000
imgsize=10
echo "using image ${img} with size ${imgsize}MiB and dev ${dev}"

read -n1 -p "continue? [yn]:" choice
if [[ "$choice" == "y" ]]; then
        dd if=/dev/zero of=${img} bs=1M count=${imgsize}
        sudo losetup ${dev} ${img}
        sudo sgdisk -o ${dev}
        sudo sgdisk -a 1 -n 1:34:8191     -t 1:8300 -c 1:"bl2"        ${dev}
        sudo sgdisk -a 1 -n 2:8192:9215   -t 2:8300 -c 2:"u-boot-env" ${dev}
        sudo sgdisk -a 1 -n 3:9216:13311  -t 3:8300 -c 3:"factory"    ${dev}
        sudo sgdisk -a 1 -n 4:13312:17407 -t 4:8300 -c 4:"fip"        ${dev}

        sudo sgdisk -p ${dev}

        sudo losetup -d ${dev}
fi

und das erzeugt zumindest die Tabelle wie ich sie brauche:

Number Start (sector) End (sector) Size Code Name 1 34 8191 4.0 MiB 8300 bl2 2 8192 9215 512.0 KiB 8300 u-boot-env 3 9216 13311 2.0 MiB 8300 factory 4 13312 17407 2.0 MiB 8300 fip

den MBR sehe ich aber aktuell nicht...wird der mit angelegt?

(alignment jetzt mal auf 1 gesetzt weil sowohl 1024 als auch der default von 2048 für ein verschieben gesorgt haben):

Information: Moved requested sector from 34 to 2048 in order to align on 2048-sector boundaries.

wie kann ich mit sgdisk den "protected MBR" anlegen, oder wird der per default erzeugt?

Wie wäre der sauberste Weg den Anfang der rootfs-partition auszurechnen, wenn man die boot-partition mit M(i)B (aktuell 100) angibt?

Normalerweise startsektor_root = startsektor_boot + (MiB*1024*2), also in der original-Tabelle 222208=17408+(100*1024*2) ähnlich müsste man ja auch den endsektor von der boot-partition ausrechnen (nur dann halt -1)

Gruß Frank

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9702

Wohnort: Münster

frank-w schrieb:

[…][…] sgdisk […] was mich wundert ist, dass die manpage immer von sektoren redet […]

Natürlich. Wovon sollte ein Partitionierungsprogramm sonst reden?

Man kann aber die gemeinten Sektoren sowohl als Sektornummer als auch als Datenmenge angeben. Wenn man Bytes meint, muss man die Maßeinheit als Suffix zur Zahl angeben: I.d.F. K = 1 KiB, M = 1 MiB usw. s. Manpage.

im https://wiki.ubuntuusers.de/gdisk/#Anlegen-einer-Partition aber von bytes gesprochen wird

Die Beschreibung im Wiki ist fehlerhaft! Wird bei Gelegenheit geändert. Danke für den Hinweis.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Das Beispiel im Wiki ist ein wenig schief.

Es gibt aber auch Laufwerke mit anderen Sektorgrößen als 512 Bytes, da kommt dann (bei Angabe von Sektornummern) leider das falsche raus. Man muss also vorher die (logische) Sektorgröße prüfen, oder Bytes (KiB, MiB, ...) angeben und die Umrechnung dem Partitionierungsprogramm überlassen.

So gesehen nicht falsch mit Bytes zu arbeiten (üblicherweise im MiB-Alignment).

Den PMBR hast du bei GPT immer, interessant wirds wenn du dort noch ein Bootflag setzen willst/musst. Alte Systeme die GPT noch nicht kennen, booten ohne das Bootflag manchmal nicht. Alte HP Kisten waren da bekannt für...

frank-w

(Themenstarter)

Anmeldungsdatum:
30. September 2008

Beiträge: 419

kB schrieb:

frank-w schrieb:

[…][…] sgdisk […] was mich wundert ist, dass die manpage immer von sektoren redet […]

Natürlich. Wovon sollte ein Partitionierungsprogramm sonst reden?

ja, mich hat es nur in Verbindung mit der Wiki-Beschreibung irritiert ☺

wenn ich das richtig sehe, kann ich als alignment nur 1 und 2 verwenden, da sonst meine Partitionen verschoben werden. Es ist aber wichtig, dass zumindest die erste (bl2 wird vom bootrom angesprungen, somit unveränderbar) und die fip-partition (ist im bl2 definiert, müsste sonst gepatcht werden) genau an dieser Stelle sind.

for boot+root ist mein aktueller Weg dieser:

1
2
3
4
5
6
7
8
9
read -p "size of boot? (MiB):" bootsize
bootend=$(( 17408+(${bootsize}*1024*2)-1 ))
read -p "size of root? (MiB):" rootsize
rootstart=$(( ${bootend}+1 ))
rootend=$(( ${rootstart} + (${rootsize}*1024*2) ))
echo "using boot-part till ${bootend} and ${rootstart}:${rootend}"
...
        sudo sgdisk -a 1 -n 5:17408:${bootend} -t 5:8300 -c 5:"boot"        ${dev}
        sudo sgdisk -a 1 -n 6:${rootstart}:${rootend} -t 6:8300 -c 6:"rootfs"        ${dev}

mit den werten 100 für boot und 6144 ( = 6*1024 = 6 GiB) komme ich auf die gleichen Sektor-Grenzen wie in dem Original

Es werden aber maximal bei der boot und root-partitionen größere Datenzugriffe geben, von daher ist das alignment der ersten 4 eher uninteressant, denke ich...bei boot und besonders bei root wäre ein korrektes alignment wichtig...boot ist mit Sektor 17408 zwar an 1024 aligned aber nicht am Standard 2048, wenn ich das richtig sehe...root mit aktuell 222208 ähnlich...reicht dass, um keine Performance-Einbußen zu haben? oder braucht man wirklich die 2048?

somit wäre das vermutlich besser:

1
2
        sudo sgdisk -a 1024 -n 5:17408:${bootend} -t 5:8300 -c 5:"boot"        ${dev}
        sudo sgdisk -a 1024 -n 6:${rootstart}:${rootend} -t 6:8300 -c 6:"rootfs"        ${dev}

bleibt noch die Frage, wie das mit dem protected MBR...das wird bei gdisk -l nicht mit ausgegeben, aber laut Man-Page mit "sgdisk -o" erzeugt...kann ich das irgendwie anzeigen lassen, was bei gdisk beim start dasteht?

die GPT soll dann auf einer micro-sd-Karte zum Einsatz kommen, weis nicht, ob die immer 512 byte haben...das image wird aber in einem loopdev erstellt (welches dann später via dd auf die SD wandert). Kann noch gar nicht sagen, ob ich ein boot-flag o.ä. brauche 😉 kann ich das mit gdisk auch irgendwie auslesen? in der normalen Ausgabe steht davon jedenfalls nichts

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

frank-w schrieb:

oder braucht man wirklich die 2048?

Braucht man nicht unbedingt, das hat sich nur so etabliert… schöne runde Zahl die bei der nächsten Sektorgröße immer noch passt (für 512e, 4Kn, aber auch 8K, 16K, 64K, ... eben bis 1M). Da braucht man dann gar nicht mehr übers Alignment nachdenken…

Was das Dateisystem dann macht ist wieder eine andere Geschichte. Meistens "nur" 4K Alignment... reicht ja in der Regel auch.

frank-w

(Themenstarter)

Anmeldungsdatum:
30. September 2008

Beiträge: 419

Danke funktioniert soweit. Wen es interessiert,hier das komplette Script:

https://github.com/frank-w/u-boot/blob/mtk-atf/build.sh#L70

Und ich habe für das eine Board (bpi-r3) noch das legacy boot flag gebraucht

sudo sgdisk --attributes=1:set:2 ${LDEV}

Bzw. Beim Anlegen der Partition

sudo sgdisk -a 1 -n 1:34:8191 -A 1:set:2 -t 1:8300 -c 1:"bl2" ${LDEV}

Wird das do-not-automount flag von Ubuntu ausgewertet? Bis auf boot und root sollen die Partitionen nicht gemounted werden.

Evtl. Ist auch der Partitionstyp ungünstig...habe mich da an die originale gpt gehalten...fat auf einer 8300 ist sicher auch nicht ganz korrekt (boot vom r3)

Antworten |