distro: rhel85 create partition helper functions

This commit is contained in:
Gianluca Zuccarelli 2021-08-10 10:41:05 +01:00 committed by Tom Gundersen
parent 346eef7477
commit 6c4da2b821

View file

@ -10,7 +10,58 @@ import (
"github.com/osbuild/osbuild-composer/internal/distro"
)
const sectorSize = 512
const (
sectorSize = 512
biosBootPartitionType = "21686148-6449-6E6F-744E-656564454649"
biosBootPartitionUUID = "FAC7F1FB-3E8D-4137-A512-961DE09A5549"
bootPartitionType = "0FC63DAF-8483-4772-8E79-3D69D8477DE4"
bootPartitionUUID = "CB07C243-BC44-4717-853E-28852021225B"
bootEFIPartitionType = "C12A7328-F81F-11D2-BA4B-00A0C93EC93B"
bootEFIPartitionUUID = "68B2905B-DF3E-4FB3-80FA-49D1E773AA33"
bootEFIFilesystemUUID = "7B77-95E7"
defaultPartitionType = "0FC63DAF-8483-4772-8E79-3D69D8477DE4"
rootPartitionUUID = "6264D520-3FB9-423F-8AB8-7A0A8E3D3562"
)
var x86PartitionTable = disk.PartitionTable{
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Type: "gpt",
Partitions: []disk.Partition{},
}
var aarch64PartitionTable = disk.PartitionTable{
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Type: "gpt",
Partitions: []disk.Partition{},
}
var ppc64lePartitionTable = disk.PartitionTable{
UUID: "0x14fc63d2",
Type: "dos",
Partitions: []disk.Partition{},
}
var s390xPartitionTable = disk.PartitionTable{
UUID: "0x14fc63d2",
Type: "dos",
Partitions: []disk.Partition{},
}
var validArches = map[string]disk.PartitionTable{
x86_64ArchName: x86PartitionTable,
aarch64ArchName: aarch64PartitionTable,
ppc64leArchName: ppc64lePartitionTable,
s390xArchName: s390xPartitionTable,
}
var ec2ValidArches = map[string]disk.PartitionTable{
x86_64ArchName: x86PartitionTable,
aarch64ArchName: aarch64PartitionTable,
}
func createPartitionTable(
mountpoints []blueprint.FilesystemCustomization,
@ -18,310 +69,166 @@ func createPartitionTable(
arch distro.Arch,
rng *rand.Rand,
) disk.PartitionTable {
if arch.Name() == "x86_64" {
partitionTable := disk.PartitionTable{
Size: imageOptions.Size,
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Type: "gpt",
Partitions: []disk.Partition{
{
Bootable: true,
Size: 2048,
Start: 2048,
Type: "21686148-6449-6E6F-744E-656564454649",
UUID: "FAC7F1FB-3E8D-4137-A512-961DE09A5549",
},
{
Start: 4096,
Size: 204800,
Type: "C12A7328-F81F-11D2-BA4B-00A0C93EC93B",
UUID: "68B2905B-DF3E-4FB3-80FA-49D1E773AA33",
Filesystem: &disk.Filesystem{
Type: "vfat",
UUID: "7B77-95E7",
Mountpoint: "/boot/efi",
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 2,
},
},
},
}
start := uint64(4096 + 204800)
partitions := []disk.Partition{}
for _, m := range mountpoints {
if m.Mountpoint != "/" {
partition := createPartition(m, start, arch.Name(), rng)
partitions = append(partitions, partition)
start += uint64(m.MinSize / sectorSize)
}
}
// treat the root partition as a special case
// by setting it last and setting the size
// dynamically
rootPartition := disk.Partition{
Start: start,
Size: imageOptions.Size/sectorSize - start - 100,
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562",
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Label: "root",
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
}
partitions = append(partitions, rootPartition)
partitionTable.Partitions = append(partitionTable.Partitions, partitions...)
return partitionTable
} else if arch.Name() == "aarch64" {
partitionTable := disk.PartitionTable{
Size: imageOptions.Size,
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Type: "gpt",
Partitions: []disk.Partition{
{
Start: 2048,
Size: 204800,
Type: "C12A7328-F81F-11D2-BA4B-00A0C93EC93B",
UUID: "68B2905B-DF3E-4FB3-80FA-49D1E773AA33",
Filesystem: &disk.Filesystem{
Type: "vfat",
UUID: "7B77-95E7",
Mountpoint: "/boot/efi",
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 2,
},
},
},
}
start := uint64(2048 + 204800)
partitions := []disk.Partition{}
for _, m := range mountpoints {
if m.Mountpoint != "/" {
partition := createPartition(m, start, arch.Name(), rng)
partitions = append(partitions, partition)
start += uint64(m.MinSize / sectorSize)
}
}
rootPartition := disk.Partition{
Start: start,
Size: imageOptions.Size/sectorSize - start - 100,
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562",
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Label: "root",
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
}
partitions = append(partitions, rootPartition)
partitionTable.Partitions = append(partitionTable.Partitions, partitions...)
return partitionTable
} else if arch.Name() == "ppc64le" {
partitionTable := disk.PartitionTable{
Size: imageOptions.Size,
UUID: "0x14fc63d2",
Type: "dos",
Partitions: []disk.Partition{
{
Start: 2048,
Size: 8192,
Type: "41",
Bootable: true,
},
},
}
start := uint64(8192)
partitions := []disk.Partition{}
for _, m := range mountpoints {
if m.Mountpoint != "/" {
partition := createPartition(m, start, arch.Name(), rng)
partitions = append(partitions, partition)
start += uint64(m.MinSize / sectorSize)
}
}
rootPartition := disk.Partition{
Start: start,
Size: imageOptions.Size/sectorSize - start - 100,
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
}
partitions = append(partitions, rootPartition)
partitionTable.Partitions = append(partitionTable.Partitions, partitions...)
return partitionTable
} else if arch.Name() == "s390x" {
partitionTable := disk.PartitionTable{
Size: imageOptions.Size,
UUID: "0x14fc63d2",
Type: "dos",
Partitions: []disk.Partition{},
}
start := uint64(2048)
partitions := []disk.Partition{}
for _, m := range mountpoints {
if m.Mountpoint != "/" {
partition := createPartition(m, start, arch.Name(), rng)
partitions = append(partitions, partition)
start += uint64(m.MinSize / sectorSize)
}
}
rootPartition := disk.Partition{
Start: start,
Size: imageOptions.Size/sectorSize - start - 100,
Bootable: true,
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
}
partitions = append(partitions, rootPartition)
partitionTable.Partitions = append(partitionTable.Partitions, partitions...)
return partitionTable
archName := arch.Name()
partitionTable, ok := validArches[archName]
if !ok {
panic("unknown arch: " + archName)
}
panic("unknown arch: " + arch.Name())
partitionTable.Size = imageOptions.Size
partitions := []disk.Partition{}
var start uint64
if archName == x86_64ArchName {
biosBootPartition := disk.Partition{
Bootable: true,
Size: 2048,
Start: 2048,
Type: biosBootPartitionType,
UUID: biosBootPartitionUUID,
}
partitions = append(partitions, biosBootPartition)
bootEFIPartition := createPartition("/boot/efi", 204800, 4096, archName, rng)
partitions = append(partitions, bootEFIPartition)
start = uint64(4096 + 204800)
} else if archName == aarch64ArchName {
bootEFIPartition := createPartition("/boot/efi", 204800, 2048, archName, rng)
partitions = append(partitions, bootEFIPartition)
start = uint64(2048 + 204800)
} else if archName == ppc64leArchName {
biosBootPartition := disk.Partition{
Start: 2048,
Size: 8192,
Type: "41",
Bootable: true,
}
partitions = append(partitions, biosBootPartition)
start = uint64(10240)
} else if archName == s390xArchName {
start = uint64(2048)
}
for _, m := range mountpoints {
if m.Mountpoint != "/" {
partitionSize := uint64(m.MinSize) / sectorSize
partition := createPartition(m.Mountpoint, partitionSize, start, archName, rng)
partitions = append(partitions, partition)
start += uint64(m.MinSize / sectorSize)
}
}
// treat the root partition as a special case
// by setting it last and setting the size
// dynamically
rootSize := (imageOptions.Size / sectorSize) - start - 100
rootPartition := createPartition("/", rootSize, start, archName, rng)
partitions = append(partitions, rootPartition)
partitionTable.Partitions = append(partitionTable.Partitions, partitions...)
return partitionTable
}
func ec2PartitionTable(imageOptions distro.ImageOptions, arch distro.Arch, rng *rand.Rand) disk.PartitionTable {
var sectorSize uint64 = 512
if arch.Name() == "x86_64" {
return disk.PartitionTable{
Size: imageOptions.Size,
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Type: "gpt",
Partitions: []disk.Partition{
{
Bootable: true,
Size: 2048,
Start: 2048,
Type: "21686148-6449-6E6F-744E-656564454649",
UUID: "FAC7F1FB-3E8D-4137-A512-961DE09A5549",
},
{
Start: 4096,
Size: imageOptions.Size/sectorSize - 4096 - 100,
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562",
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Label: "root",
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
},
},
}
} else if arch.Name() == "aarch64" {
return disk.PartitionTable{
Size: imageOptions.Size,
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Type: "gpt",
Partitions: []disk.Partition{
{
Start: 2048,
Size: 409600,
Type: "C12A7328-F81F-11D2-BA4B-00A0C93EC93B",
UUID: "68B2905B-DF3E-4FB3-80FA-49D1E773AA33",
Filesystem: &disk.Filesystem{
Type: "vfat",
UUID: "7B77-95E7",
Mountpoint: "/boot/efi",
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 2,
},
},
{
Start: 411648,
Size: 1048576,
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: "CB07C243-BC44-4717-853E-28852021225B",
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Mountpoint: "/boot",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
},
{
Start: 1460224,
Size: imageOptions.Size/sectorSize - 1460224 - 100,
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562",
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Label: "root",
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
},
},
}
archName := arch.Name()
partitionTable, ok := ec2ValidArches[archName]
if !ok {
panic("unsupported EC2 arch: " + archName)
}
panic("unsupported EC2 arch: " + arch.Name())
partitionTable.Size = imageOptions.Size
partitions := []disk.Partition{}
var start uint64
if archName == x86_64ArchName {
biosBootPartition := disk.Partition{
Bootable: true,
Size: 2048,
Start: 2048,
Type: biosBootPartitionType,
UUID: biosBootPartitionUUID,
}
partitions = append(partitions, biosBootPartition)
start = 4096
} else if archName == aarch64ArchName {
bootEFIParition := createPartition("/boot/efi", 409600, 2048, archName, rng)
partitions = append(partitions, bootEFIParition)
bootPartition := createPartition("/boot", 1048576, 411648, archName, rng)
partitions = append(partitions, bootPartition)
start = 1460224
}
rootSize := (imageOptions.Size / sectorSize) - start - 100
rootPartition := createPartition("/", rootSize, start, archName, rng)
partitions = append(partitions, rootPartition)
partitionTable.Partitions = append(partitionTable.Partitions, partitions...)
return partitionTable
}
func createPartition(
m blueprint.FilesystemCustomization,
start uint64,
archName string,
rng *rand.Rand,
) disk.Partition {
if archName == "x86_64" || archName == "aarch64" {
func createPartition(mountpoint string, size uint64, start uint64, archName string, rng *rand.Rand) disk.Partition {
var filesystem disk.Filesystem
// /boot/efi mountpoint is a special case
// return early
if mountpoint == "/boot/efi" {
filesystem = createFilesystemDisk(mountpoint, bootEFIFilesystemUUID)
return disk.Partition{
Start: start,
Size: uint64(m.MinSize) / sectorSize,
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Mountpoint: m.Mountpoint,
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
Start: start,
Size: size,
Type: bootEFIPartitionType,
UUID: bootEFIPartitionUUID,
Filesystem: &filesystem,
}
}
return disk.Partition{
Start: start,
Size: uint64(m.MinSize),
Filesystem: &disk.Filesystem{
Type: "xfs",
UUID: uuid.Must(newRandomUUIDFromReader(rng)).String(),
Mountpoint: m.Mountpoint,
FSTabOptions: "defaults",
partition := disk.Partition{
Start: start,
Size: size,
Filesystem: &filesystem,
}
diskUUID := uuid.Must(newRandomUUIDFromReader(rng)).String()
filesystem = createFilesystemDisk(mountpoint, diskUUID)
if mountpoint == "/boot" {
partition.Type = bootPartitionType
partition.UUID = bootPartitionUUID
return partition
}
if archName == x86_64ArchName || archName == aarch64ArchName {
if mountpoint == "/" {
// set Label for root mountpoint
filesystem.Label = "root"
partition.Type = defaultPartitionType
partition.UUID = rootPartitionUUID
return partition
}
partition.Type = defaultPartitionType
partition.UUID = uuid.Must(newRandomUUIDFromReader(rng)).String()
return partition
}
if mountpoint == "/" && archName == s390xArchName {
partition.Bootable = true
}
return partition
}
func createFilesystemDisk(mountpoint string, uuid string) disk.Filesystem {
if mountpoint == "/boot/efi" {
return disk.Filesystem{
Type: "vfat",
UUID: uuid,
Mountpoint: mountpoint,
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 0,
},
FSTabPassNo: 2,
}
}
return disk.Filesystem{
Type: "xfs",
UUID: uuid,
Mountpoint: mountpoint,
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
}
}