From 81df27d701e6c4be803f75b928413defb8855009 Mon Sep 17 00:00:00 2001 From: Sayan Paul Date: Wed, 24 Jan 2024 17:00:30 +0530 Subject: [PATCH] rhel9/images:Custom service to create mountpoints Filesystem customization mountpoints does not persists any upgrade due to the property of ostree which only persists data on /var and /etc. This feature will ingest the filesystem customization and create a unit file which can create the required mountpoints if it doesnot exist. fixes: https://github.com/osbuild/images/issues/352 Signed-off-by: Sayan Paul --- pkg/distro/rhel9/images.go | 32 ++++++++++++++++++++++++++++++++ pkg/distro/rhel9/imagetype.go | 6 ++++++ 2 files changed, 38 insertions(+) diff --git a/pkg/distro/rhel9/images.go b/pkg/distro/rhel9/images.go index e04bc95d5e..6604490e1e 100644 --- a/pkg/distro/rhel9/images.go +++ b/pkg/distro/rhel9/images.go @@ -480,6 +480,11 @@ func edgeRawImage(workload workload.Workload, } img.PartitionTable = pt + customServiceFile := createFilesystemMounpointService(customizations) + if customServiceFile != nil { + img.Files = append(img.Files, customServiceFile) + } + img.Filename = t.Filename() img.Compression = t.compression @@ -537,6 +542,11 @@ func edgeSimplifiedInstallerImage(workload workload.Workload, } rawImg.PartitionTable = pt + customServiceFile := createFilesystemMounpointService(customizations) + if customServiceFile != nil { + rawImg.Files = append(rawImg.Files, customServiceFile) + } + rawImg.Filename = t.Filename() // 92+ only @@ -702,3 +712,25 @@ func initialSetupKickstart() *fsnode.File { } return file } + +// fixes: https://github.com/osbuild/images/issues/352 +// Creates a unit file that create mountpoints if it doesnot exits. +// This ensures that the filesystem created using image builder continues to work after upgrade. +func createFilesystemMounpointService(customizations *blueprint.Customizations) *fsnode.File { + mntpnts := customizations.GetFilesystems() + if mntpnts != nil { + customServiceUnit := "[Unit]\nDescription=Create mountpoints if does not exists\nDefaultDependencies=no\n" + customService := "[Service]\nType=oneshot\nRemainAfterExit=yes\nExecStartPre=chattr -i /\nExecStopPost=chattr +i /\nExecStart=mkdir -p" + for _, mountpoint := range mntpnts { + customServiceUnit = customServiceUnit + "ConditionPathExists=|!" + mountpoint.Mountpoint + "\n" + customService = customService + " " + mountpoint.Mountpoint + } + finalCustomService := customServiceUnit + customService + "\n" + "[Install]\nWantedBy=local-fs.target\n" + file, err := fsnode.NewFile("/etc/systemd/system/osbuild-ostree-mountpoints.service", nil, nil, nil, []byte(finalCustomService)) + if err != nil { + panic(err) + } + return file + } + return nil +} diff --git a/pkg/distro/rhel9/imagetype.go b/pkg/distro/rhel9/imagetype.go index 3589b69809..a9bb74ce56 100644 --- a/pkg/distro/rhel9/imagetype.go +++ b/pkg/distro/rhel9/imagetype.go @@ -239,6 +239,12 @@ func (t *imageType) Manifest(bp *blueprint.Blueprint, cw.Services = services.Enabled cw.DisabledServices = services.Disabled } + // enable custom-service that creates mountpoints , refer func: createFilesystemMounpointService + if t.name == "edge-simplified-installer" || t.name == "edge-raw-image" || t.name == "edge-ami" || t.name == "edge-vsphere" { + if filesystemCustomization := bp.Customizations.GetFilesystems(); filesystemCustomization != nil { + cw.Services = append(cw.Services, "osbuild-ostree-mountpoints.service") + } + } w = cw }