Skip to content

Instantly share code, notes, and snippets.

@Scott31393
Last active July 20, 2022 10:16
Show Gist options
  • Save Scott31393/bf7795457d1d411908cbc1e70523dee9 to your computer and use it in GitHub Desktop.
Save Scott31393/bf7795457d1d411908cbc1e70523dee9 to your computer and use it in GitHub Desktop.

Resize GPT Partition cmdline/yocto

Cmdline using sgdisk

sgdisk -e /dev/mmcblk2
sgdisk -d 6 -n 6:3008462:0 -c 6:home -u 6:8A98FF9D-DE45-4A5E-90E9-49982B5A72A3 -t 6:0700 /dev/mmcblk2

All in a script

#!/bin/sh
# Grow up last partition side till the end of the disk size

PART_NAME=home
PART_DEV=/dev/mmcblk2
PART_PART_NUM=6
PART_SECTOR_START=$(sgdisk -p $PART_DEV | grep $PART_NAME | awk '{print $2}')
PART_GUID=$(sgdisk $PART_DEV -p | grep GUID | awk '{print $4}')
PART_TYPECODE=$(sgdisk -p $PART_DEV | grep $PART_NAME | awk '{print $6}')
PART_IS_NOT_FULL_SIZE_ERR=$(sgdisk -v $PART_DEV | grep -i problem | grep secondary)

# Check if partition is already at full size
if [ -n "$PART_IS_NOT_FULL_SIZE_ERR" ]; then
    # move second header to end of disk
    sgdisk -e $PART_DEV

    # sgdisk option used:
    #
    # -d delete's PART_PART_NUM partition
    # -n create new partition PART_PART_NUM start from PART_SECTOR_START
    #    sector till the End sector (End sector = "0")
    # -c set label of PART_PART_NUM to PART_NAME
    # -u set GUID of PART_PART_NUM to PART_GUID
    # -t set PART_TYPECODE to PART_PART_NUM
    sgdisk -d $PART_PART_NUM \
    -n $PART_PART_NUM:$PART_SECTOR_START:0 \
    -c $PART_PART_NUM:$PART_NAME \
    -u $PART_PART_NUM:$PART_GUID \
    -t $PART_PART_NUM:$PART_TYPECODE \
    $PART_DEV
else
    echo "Partition: $PART_NAME already at maximum size, skipped"
fi

Or:

DISK=/dev/sdd
PART_NAME=fluxdata
# move backup gpt to end of disk
sgdisk -e $DISK
# get last sector
ENDSECTOR=$(sgdisk -E $DISK)
# delete current partition
sgdisk -d 9 $DISK
# replace with new
sgdisk -N 9 -c 9:$PART_NAME $DISK
# change partition name
sgdisk -c 9:$PART_NAME
# re-read the partition table entries
partx -u /dev/sdd
# resize the partition
resize2fs /dev/sdd9


# print size
sgdisk -p $DISK

Yocto implemetation using parted

Packages needed:

e2fsprogs e2fsprogs-resize2fs e2fsprogs-mke2fs

File:

.
├── files
│   └── grow-data-partition.service
└── recipe.bb

grow-data-part.service

[Unit]
Description=Service to grow data partition size
DefaultDependencies=no
Before=home.mount

[Service]
Type=oneshot
RemainAfterExit=yes

ExecStart=/usr/sbin/sgdisk /dev/disk/by-path/platform-30b60000.mmc -e
ExecStart=/usr/sbin/parted --script /dev/mmcblk2 resizepart 6 100%
ExecStart=/sbin/resize2fs /dev/disk/by-partlabel/home

[Install]
WantedBy=home.mount

recipe.bb

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI:append := "  \
	file://grow-data-partition.service \
"

inherit systemd

SYSTEMD_PACKAGES += "grow-data-part"
SYSTEMD_SERVICE:grow-data-part = "grow-data-partition.service"
SYSTEMD_AUTO_ENABLE = "enable"

RDEPENDS:grow-data-part += "parted gptfdisk e2fsprogs"

do_install:append() {
	install -d ${D}${systemd_unitdir}/system/
	install -m 0644 ${WORKDIR}/grow-data-partition.service ${D}${systemd_unitdir}/system/
}

RRECOMMENDS:append = "grow-data-part"
PACKAGES =+ "grow-data-part"
FILES:${PN}-grow-data-part = "${systemd_unitdir}/system/grow-data-partition.service"

Yocto implemetation using sgdisk

File tree:

resizepart/
├── files/
│   ├── grow-partition.service
│   └── resize_part.sh
└── resizepart.bb

Yocto recipe: resizepart.bb

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI:append := "  \
	file://grow-partition.service \
	file://resize_part.sh \
"

inherit systemd

SYSTEMD_PACKAGES += "grow-part"
SYSTEMD_SERVICE:grow-part = "grow-partition.service"
SYSTEMD_AUTO_ENABLE = "enable"

RDEPENDS:grow-part += "gptfdisk"

do_install:append() {
	install -d 644 ${D}${sysconfdir}/init.d
	install -m 0755 ${WORKDIR}/resize_part.sh ${D}${sysconfdir}/init.d

	install -d ${D}${systemd_unitdir}/system/
	install -m 0644 ${WORKDIR}/grow-partition.service ${D}${systemd_unitdir}/system/
}

RRECOMMENDS:${PN}:append = " grow-part"
PACKAGES =+ "grow-part"
FILES:grow-part = "${systemd_unitdir}/system/grow-data-partition.service"

File: grow-partition.service

[Unit]
Description=Grow partition size Service
DefaultDependencies=no
Before=home.mount

[Service]
Type=oneshot
RemainAfterExit=yes

ExecStart=/etc/init.d/resize_part.sh

[Install]
WantedBy=home.mount

File: resize_part.sh

#!/bin/sh
# Grow up last partition side till the end of the disk size

PART_NAME=home
PART_DEV=/dev/mmcblk2
PART_PART_NUM=6
PART_SECTOR_START=$(sgdisk -p $PART_DEV | grep $PART_NAME | awk '{print $2}')
PART_GUID=$(sgdisk $PART_DEV -p | grep GUID | awk '{print $4}')
PART_TYPECODE=$(sgdisk -p $PART_DEV | grep $PART_NAME | awk '{print $6}')
PART_IS_NOT_FULL_SIZE_ERR=$(sgdisk -v $PART_DEV | grep -i problem | grep secondary)

# Check if partition is already at full size
if [ -n "$PART_IS_NOT_FULL_SIZE_ERR" ]; then
    # move second header to end of disk
    sgdisk -e $PART_DEV

    # sgdisk option used:
    #
    # -d delete's PART_PART_NUM partition
    # -n create new partition PART_PART_NUM start from PART_SECTOR_START
    #    sector till the End sector (End sector = "0")
    # -c set label of PART_PART_NUM to PART_NAME
    # -u set GUID of PART_PART_NUM to PART_GUID
    # -t set PART_TYPECODE to PART_PART_NUM
    sgdisk -d $PART_PART_NUM \
    -n $PART_PART_NUM:$PART_SECTOR_START:0 \
    -c $PART_PART_NUM:$PART_NAME \
    -u $PART_PART_NUM:$PART_GUID \
    -t $PART_PART_NUM:$PART_TYPECODE \
    $PART_DEV
else
    echo "Partition: $PART_NAME already at maximum size, skipped"
fi

References:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment