distro/rhel84: generate fstab stage from partition table

Now that we have an abstract partition table definition, we can use it to
generate org.osbuild.fstab stage options.

This is extremely nice because it removes magic contains.

Signed-off-by: Ondřej Budai <ondrej@budai.cz>
This commit is contained in:
Ondřej Budai 2020-12-15 11:14:39 +01:00 committed by Ondřej Budai
parent 76926ecd35
commit d52c1ea1f8
2 changed files with 79 additions and 37 deletions

View file

@ -4,7 +4,11 @@
// All of them can be 1:1 converted to osbuild.QEMUAssemblerOptions. // All of them can be 1:1 converted to osbuild.QEMUAssemblerOptions.
package disk package disk
import "github.com/osbuild/osbuild-composer/internal/osbuild" import (
"sort"
"github.com/osbuild/osbuild-composer/internal/osbuild"
)
type PartitionTable struct { type PartitionTable struct {
// Size of the disk. // Size of the disk.
@ -34,6 +38,12 @@ type Filesystem struct {
UUID string UUID string
Label string Label string
Mountpoint string Mountpoint string
// The fourth field of fstab(5); fs_mntops
FSTabOptions string
// The fifth field of fstab(5); fs_freq
FSTabFreq uint64
// The sixth field of fstab(5); fs_passno
FSTabPassNo uint64
} }
// Converts PartitionTable to osbuild.QEMUAssemblerOptions that encode // Converts PartitionTable to osbuild.QEMUAssemblerOptions that encode
@ -52,6 +62,26 @@ func (pt PartitionTable) QEMUAssemblerOptions() osbuild.QEMUAssemblerOptions {
} }
} }
// Generates org.osbuild.fstab stage options from this partition table.
func (pt PartitionTable) FSTabStageOptions() *osbuild.FSTabStageOptions {
var options osbuild.FSTabStageOptions
for _, p := range pt.Partitions {
fs := p.Filesystem
if fs == nil {
continue
}
options.AddFilesystem(fs.UUID, fs.Type, fs.Mountpoint, fs.FSTabOptions, fs.FSTabFreq, fs.FSTabPassNo)
}
// sort the entries by PassNo to maintain backward compatibility
sort.Slice(options.FileSystems, func(i, j int) bool {
return options.FileSystems[i].PassNo < options.FileSystems[j].PassNo
})
return &options
}
// Converts Partition to osbuild.QEMUPartition that encodes the same partition. // Converts Partition to osbuild.QEMUPartition that encodes the same partition.
func (p Partition) QEMUPartition() osbuild.QEMUPartition { func (p Partition) QEMUPartition() osbuild.QEMUPartition {
var fs *osbuild.QEMUFilesystem var fs *osbuild.QEMUFilesystem

View file

@ -231,6 +231,12 @@ func sources(packages []rpmmd.PackageSpec) *osbuild.Sources {
} }
func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec) (*osbuild.Pipeline, error) { func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec) (*osbuild.Pipeline, error) {
var pt *disk.PartitionTable
if t.partitionTableGenerator != nil {
table := t.partitionTableGenerator(options, t.arch)
pt = &table
}
p := &osbuild.Pipeline{} p := &osbuild.Pipeline{}
p.SetBuild(t.buildPipeline(repos, *t.arch, buildPackageSpecs), "org.osbuild.rhel84") p.SetBuild(t.buildPipeline(repos, *t.arch, buildPackageSpecs), "org.osbuild.rhel84")
@ -244,8 +250,11 @@ func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOp
p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(*t.arch, repos, packageSpecs))) p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(*t.arch, repos, packageSpecs)))
p.AddStage(osbuild.NewFixBLSStage()) p.AddStage(osbuild.NewFixBLSStage())
if pt != nil {
p.AddStage(osbuild.NewFSTabStage(pt.FSTabStageOptions()))
}
if t.bootable { if t.bootable {
p.AddStage(osbuild.NewFSTabStage(t.fsTabStageOptions(t.arch.uefi)))
if t.arch.Name() != "s390x" { if t.arch.Name() != "s390x" {
p.AddStage(osbuild.NewGRUB2Stage(t.grub2StageOptions(t.kernelOptions, c.GetKernel(), t.arch.uefi, t.arch.legacy))) p.AddStage(osbuild.NewGRUB2Stage(t.grub2StageOptions(t.kernelOptions, c.GetKernel(), t.arch.uefi, t.arch.legacy)))
} }
@ -328,12 +337,6 @@ func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOp
)) ))
} }
var pt *disk.PartitionTable
if t.partitionTableGenerator != nil {
table := t.partitionTableGenerator(options, t.arch)
pt = &table
}
p.Assembler = t.assembler(pt, options, t.arch) p.Assembler = t.assembler(pt, options, t.arch)
return p, nil return p, nil
@ -445,15 +448,6 @@ func (t *imageType) systemdStageOptions(enabledServices, disabledServices []stri
} }
} }
func (t *imageType) fsTabStageOptions(uefi bool) *osbuild.FSTabStageOptions {
options := osbuild.FSTabStageOptions{}
options.AddFilesystem("efe8afea-c0a8-45dc-8e6e-499279f6fa5d", "xfs", "/", "defaults", 0, 0)
if uefi {
options.AddFilesystem("7B77-95E7", "vfat", "/boot/efi", "defaults,uid=0,gid=0,umask=077,shortname=winnt", 0, 2)
}
return &options
}
func (t *imageType) grub2StageOptions(kernelOptions string, kernel *blueprint.KernelCustomization, uefi bool, legacy string) *osbuild.GRUB2StageOptions { func (t *imageType) grub2StageOptions(kernelOptions string, kernel *blueprint.KernelCustomization, uefi bool, legacy string) *osbuild.GRUB2StageOptions {
id := uuid.MustParse("efe8afea-c0a8-45dc-8e6e-499279f6fa5d") id := uuid.MustParse("efe8afea-c0a8-45dc-8e6e-499279f6fa5d")
@ -506,9 +500,12 @@ func defaultPartitionTable(imageOptions distro.ImageOptions, arch distro.Arch) d
Type: "C12A7328-F81F-11D2-BA4B-00A0C93EC93B", Type: "C12A7328-F81F-11D2-BA4B-00A0C93EC93B",
UUID: "68B2905B-DF3E-4FB3-80FA-49D1E773AA33", UUID: "68B2905B-DF3E-4FB3-80FA-49D1E773AA33",
Filesystem: &disk.Filesystem{ Filesystem: &disk.Filesystem{
Type: "vfat", Type: "vfat",
UUID: "7B77-95E7", UUID: "7B77-95E7",
Mountpoint: "/boot/efi", Mountpoint: "/boot/efi",
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 2,
}, },
}, },
{ {
@ -516,10 +513,13 @@ func defaultPartitionTable(imageOptions distro.ImageOptions, arch distro.Arch) d
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4", Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562", UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562",
Filesystem: &disk.Filesystem{ Filesystem: &disk.Filesystem{
Type: "xfs", Type: "xfs",
UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d", UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d",
Label: "root", Label: "root",
Mountpoint: "/", Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
}, },
}, },
}, },
@ -536,9 +536,12 @@ func defaultPartitionTable(imageOptions distro.ImageOptions, arch distro.Arch) d
Type: "C12A7328-F81F-11D2-BA4B-00A0C93EC93B", Type: "C12A7328-F81F-11D2-BA4B-00A0C93EC93B",
UUID: "68B2905B-DF3E-4FB3-80FA-49D1E773AA33", UUID: "68B2905B-DF3E-4FB3-80FA-49D1E773AA33",
Filesystem: &disk.Filesystem{ Filesystem: &disk.Filesystem{
Type: "vfat", Type: "vfat",
UUID: "7B77-95E7", UUID: "7B77-95E7",
Mountpoint: "/boot/efi", Mountpoint: "/boot/efi",
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 2,
}, },
}, },
{ {
@ -546,10 +549,13 @@ func defaultPartitionTable(imageOptions distro.ImageOptions, arch distro.Arch) d
Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4", Type: "0FC63DAF-8483-4772-8E79-3D69D8477DE4",
UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562", UUID: "6264D520-3FB9-423F-8AB8-7A0A8E3D3562",
Filesystem: &disk.Filesystem{ Filesystem: &disk.Filesystem{
Type: "xfs", Type: "xfs",
UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d", UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d",
Label: "root", Label: "root",
Mountpoint: "/", Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
}, },
}, },
}, },
@ -568,9 +574,12 @@ func defaultPartitionTable(imageOptions distro.ImageOptions, arch distro.Arch) d
{ {
Start: 10240, Start: 10240,
Filesystem: &disk.Filesystem{ Filesystem: &disk.Filesystem{
Type: "xfs", Type: "xfs",
UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d", UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d",
Mountpoint: "/", Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
}, },
}, },
}, },
@ -585,9 +594,12 @@ func defaultPartitionTable(imageOptions distro.ImageOptions, arch distro.Arch) d
Start: 2048, Start: 2048,
Bootable: true, Bootable: true,
Filesystem: &disk.Filesystem{ Filesystem: &disk.Filesystem{
Type: "xfs", Type: "xfs",
UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d", UUID: "efe8afea-c0a8-45dc-8e6e-499279f6fa5d",
Mountpoint: "/", Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
}, },
}, },
}, },