Skip to content

Instantly share code, notes, and snippets.

@herry13
Last active October 26, 2021 20:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save herry13/5931cac426da99820de843477e41e89e to your computer and use it in GitHub Desktop.
Save herry13/5931cac426da99820de843477e41e89e to your computer and use it in GitHub Desktop.
An example on how to use pyparted to create partitions on disk
#!/usr/bin/env python
#
# Requirements:
# - python
# - python-dev
# - pyparted
import parted
# Create a disk image then attach it to a loopback device (e.g. /dev/loop0)
'''
dd if=/dev/zero of=disk.img bs=512 count=2097152
losetup -f disk.img
kpartx -a /dev/loop0
'''
device = '/dev/loop0'
loop0 = parted.getDevice(device)
loop0.clobber() # destroy existing partition table
disk = parted.newDisk(loop0)
# create partition 1
geometry1 = parted.Geometry(start=0,
length=parted.sizeToSectors(48, 'MiB', loop0.sectorSize),
device=loop0)
filesystem1 = parted.FileSystem(type='fat32', geometry=geometry1)
partition1 = parted.Partition(disk=disk,
type=parted.PARTITION_BOOT,
fs=filesystem1,
geometry=geometry1)
disk.addPartition(partition1, constraint=loop0.optimalAlignedConstraint)
disk.commit()
# partition 2
geometry2 = parted.Geometry(start=partition1.geometry.end,
length=parted.sizeToSectors(256, 'MiB', loop0.sectorSize),
device=loop0)
filesystem2 = parted.FileSystem(type='ext4', geometry=geometry2)
partition2 = parted.Partition(disk=disk,
type=parted.PARTITION_NORMAL,
fs=filesystem2,
geometry=geometry2)
disk.addPartition(partition2, constraint=loop0.optimalAlignedConstraint)
disk.commit()
# partition 3
geometry3 = parted.Geometry(start=partition2.geometry.end,
length=parted.sizeToSectors(256, 'MiB', loop0.sectorSize),
device=loop0)
filesystem3 = parted.FileSystem(type='ext4', geometry=geometry3)
partition3 = parted.Partition(disk=disk,
type=parted.PARTITION_NORMAL,
fs=filesystem3,
geometry=geometry3)
disk.addPartition(partition3, constraint=loop0.optimalAlignedConstraint)
disk.commit()
# partition 4: Extended
geometry4 = parted.Geometry(start=partition3.geometry.end,
end=loop0.length,
device=loop0)
partition4 = parted.Partition(disk=disk,
type=parted.PARTITION_EXTENDED,
geometry=geometry4)
disk.addPartition(partition4, constraint=loop0.optimalAlignedConstraint)
disk.commit()
# partition 5: Logical
geometry5 = parted.Geometry(start=partition4.geometry.start,
length=parted.sizeToSectors(48, 'MiB', loop0.sectorSize),
device=loop0)
filesystem5 = parted.FileSystem(type='btrfs', geometry=geometry5)
partition5 = parted.Partition(disk=disk,
type=parted.PARTITION_EXTENDED,
fs=filesystem5,
geometry=geometry5)
disk.addPartition(partition5, constraint=loop0.optimalAlignedConstraint)
disk.commit()
# partition 6: Logical
geometry6 = parted.Geometry(start=partition5.geometry.start,
end=partition4.geometry.end,
device=loop0)
filesystem6 = parted.FileSystem(type='btrfs', geometry=geometry6)
partition6 = parted.Partition(disk=disk,
type=parted.PARTITION_EXTENDED,
fs=filesystem6,
geometry=geometry6)
disk.addPartition(partition6, constraint=loop0.optimalAlignedConstraint)
disk.commit()
### Example of resizing a partition
### source: https://github.com/dcantrell/pyparted/issues/38
'''
device = parted.Device(image)
disk = parted.Disk(device)
partition = disk.partitions[0]
start = partition.geometry.start
end = device.length
geom = parted.Geometry(device=device, start=start, length=end-start)
constraint = parted.Constraint(exactGeom=geom)
disk.maximizePartition(partition=partition, constraint=constraint)
disk.commit()
'''
@sonneveld
Copy link

This is a good starting example but (ignoring the extended partitions) it won't quite work for GPT partitions. You might need to use disk.getFreeSpaceRegions() to determine allowed starting/end positions.

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