Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

System Ready Minimal Images fixes #137

Merged
merged 11 commits into from
Sep 13, 2023
3 changes: 3 additions & 0 deletions pkg/disk/partition_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type PartitionTable struct {

SectorSize uint64 // Sector size in bytes
ExtraPadding uint64 // Extra space at the end of the partition table (sectors)
StartOffset uint64 // Starting offset of the first partition in the table (Mb)
}

func NewPartitionTable(basePT *PartitionTable, mountpoints []blueprint.FilesystemCustomization, imageSize uint64, lvmify bool, requiredSizes map[string]uint64, rng *rand.Rand) (*PartitionTable, error) {
Expand Down Expand Up @@ -77,6 +78,7 @@ func (pt *PartitionTable) Clone() Entity {
Partitions: make([]Partition, len(pt.Partitions)),
SectorSize: pt.SectorSize,
ExtraPadding: pt.ExtraPadding,
StartOffset: pt.StartOffset,
}

for idx, partition := range pt.Partitions {
Expand Down Expand Up @@ -364,6 +366,7 @@ func (pt *PartitionTable) relayout(size uint64) uint64 {
}

start := pt.AlignUp(header)
start += pt.StartOffset
achilleas-k marked this conversation as resolved.
Show resolved Hide resolved
size = pt.AlignUp(size)

var rootIdx = -1
Expand Down
55 changes: 44 additions & 11 deletions pkg/distro/fedora/distro.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/osbuild/images/internal/common"
"github.com/osbuild/images/internal/environment"
"github.com/osbuild/images/internal/fsnode"
"github.com/osbuild/images/internal/oscap"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/osbuild"
Expand All @@ -31,8 +32,11 @@ const (
// blueprint package set name
blueprintPkgsKey = "blueprint"

//Kernel options for ami, qcow2, openstack, vhd and vmdk types
defaultKernelOptions = "ro no_timer_check console=ttyS0,115200n8 biosdevname=0 net.ifnames=0"
//Default kernel command line
defaultKernelOptions = "ro"

// Added kernel command line options for ami, qcow2, openstack, vhd and vmdk types
cloudKernelOptions = "ro no_timer_check console=ttyS0,115200n8 biosdevname=0 net.ifnames=0"
)

var (
Expand Down Expand Up @@ -61,6 +65,13 @@ var (
"dbus-parsec",
}

minimalRawServices = []string{
"NetworkManager.service",
"firewalld.service",
"initial-setup.service",
"sshd.service",
}

// Image Definitions
imageInstallerImgType = imageType{
name: "image-installer",
Expand Down Expand Up @@ -237,7 +248,7 @@ var (
"cloud-init-local.service",
},
},
kernelOptions: defaultKernelOptions,
kernelOptions: cloudKernelOptions,
bootable: true,
defaultSize: 5 * common.GibiByte,
image: diskImage,
Expand Down Expand Up @@ -265,7 +276,7 @@ var (
osPkgsKey: vmdkCommonPackageSet,
},
defaultImageConfig: vmdkDefaultImageConfig,
kernelOptions: defaultKernelOptions,
kernelOptions: cloudKernelOptions,
bootable: true,
defaultSize: 2 * common.GibiByte,
image: diskImage,
Expand All @@ -283,7 +294,7 @@ var (
osPkgsKey: vmdkCommonPackageSet,
},
defaultImageConfig: vmdkDefaultImageConfig,
kernelOptions: defaultKernelOptions,
kernelOptions: cloudKernelOptions,
bootable: true,
defaultSize: 2 * common.GibiByte,
image: diskImage,
Expand Down Expand Up @@ -346,6 +357,12 @@ var (
packageSets: map[string]packageSetFunc{
osPkgsKey: minimalrpmPackageSet,
},
defaultImageConfig: &distro.ImageConfig{
EnabledServices: minimalRawServices,
// NOTE: temporary workaround for a bug in initial-setup that
// requires a kickstart file in the root directory.
Files: []*fsnode.File{initialSetupKickstart()},
},
rpmOstree: false,
kernelOptions: defaultKernelOptions,
bootable: true,
Expand All @@ -354,7 +371,7 @@ var (
buildPipelines: []string{"build"},
payloadPipelines: []string{"os", "image", "xz"},
exports: []string{"xz"},
basePartitionTables: defaultBasePartitionTables,
basePartitionTables: minimalrawPartitionTables,
}
)

Expand Down Expand Up @@ -706,10 +723,12 @@ func newDistro(version int) distro.Distro {
&platform.Aarch64{
BasePlatform: platform.BasePlatform{
FirmwarePackages: []string{
"arm-image-installer", // ??
"arm-image-installer",
"bcm283x-firmware",
"iwl7260-firmware",
"uboot-images-armv8", // ??
"brcmfmac-firmware",
"iwlwifi-mvm-firmware",
"realtek-firmware",
"uboot-images-armv8",
},
},
UEFIVendor: "fedora",
Expand All @@ -721,7 +740,7 @@ func newDistro(version int) distro.Distro {
liveInstallerImgType,
)
aarch64.addImageTypes(
&platform.Aarch64_IoT{
&platform.Aarch64_Fedora{
BasePlatform: platform.BasePlatform{
ImageFormat: platform.FORMAT_RAW,
},
Expand Down Expand Up @@ -771,10 +790,18 @@ func newDistro(version int) distro.Distro {
minimalrawImgType,
)
aarch64.addImageTypes(
&platform.Aarch64{
&platform.Aarch64_Fedora{
UEFIVendor: "fedora",
BasePlatform: platform.BasePlatform{
ImageFormat: platform.FORMAT_RAW,
FirmwarePackages: []string{
"arm-image-installer",
"bcm283x-firmware",
"uboot-images-armv8",
},
},
BootFiles: [][2]string{
{"/usr/share/uboot/rpi_arm64/u-boot.bin", "/boot/efi/rpi-u-boot.bin"},
},
},
minimalrawImgType,
Expand All @@ -793,8 +820,10 @@ func newDistro(version int) distro.Distro {
"grub2-tools",
"grub2-tools-extra",
"grub2-tools-minimal",
"brcmfmac-firmware",
"iwlwifi-dvm-firmware",
"iwlwifi-mvm-firmware",
"realtek-firmware",
"microcode_ctl",
"syslinux",
"syslinux-nonlinux",
Expand All @@ -816,6 +845,10 @@ func newDistro(version int) distro.Distro {
"grub2-tools",
"grub2-tools-extra",
"grub2-tools-minimal",
"brcmfmac-firmware",
"iwlwifi-dvm-firmware",
"iwlwifi-mvm-firmware",
"realtek-firmware",
"uboot-images-armv8",
},
},
Expand Down
14 changes: 14 additions & 0 deletions pkg/distro/fedora/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/osbuild/images/internal/common"
"github.com/osbuild/images/internal/fdo"
"github.com/osbuild/images/internal/fsnode"
"github.com/osbuild/images/internal/ignition"
"github.com/osbuild/images/internal/oscap"
"github.com/osbuild/images/internal/users"
Expand Down Expand Up @@ -224,6 +225,9 @@ func osCustomizations(
osc.PwQuality = imageConfig.PwQuality
osc.WSLConfig = imageConfig.WSLConfig

osc.Files = append(osc.Files, imageConfig.Files...)
osc.Directories = append(osc.Directories, imageConfig.Directories...)

return osc
}

Expand Down Expand Up @@ -684,3 +688,13 @@ func makeOSTreePayloadCommit(options *ostree.ImageOptions, defaultRef string) (o
RHSM: options.RHSM,
}, nil
}

// initialSetupKickstart returns the File configuration for a kickstart file
// that's required to enable initial-setup to run on first boot.
func initialSetupKickstart() *fsnode.File {
file, err := fsnode.NewFile("/root/anaconda-ks.cfg", nil, "root", "root", []byte("# Run initial-setup on first boot\n# Created by osbuild\nfirstboot --reconfig\n"))
if err != nil {
panic(err)
}
return file
}
6 changes: 6 additions & 0 deletions pkg/distro/fedora/package_sets.go
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,12 @@ func minimalrpmPackageSet(t *imageType) rpmmd.PackageSet {
return rpmmd.PackageSet{
Include: []string{
"@core",
"initial-setup",
"libxkbcommon",
"NetworkManager-wifi",
"brcmfmac-firmware",
"realtek-firmware",
"iwlwifi-mvm-firmware",
},
}
}
Expand Down
95 changes: 95 additions & 0 deletions pkg/distro/fedora/partition_tables.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,101 @@ var defaultBasePartitionTables = distro.BasePartitionTableMap{
},
}

var minimalrawPartitionTables = distro.BasePartitionTableMap{
platform.ARCH_X86_64.String(): disk.PartitionTable{
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Type: "gpt",
StartOffset: 8 * common.MebiByte,
Partitions: []disk.Partition{
{
Size: 200 * common.MebiByte,
Type: disk.EFISystemPartitionGUID,
UUID: disk.EFISystemPartitionUUID,
Payload: &disk.Filesystem{
Type: "vfat",
UUID: disk.EFIFilesystemUUID,
Mountpoint: "/boot/efi",
Label: "EFI-SYSTEM",
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 2,
},
},
{
Size: 500 * common.MebiByte,
Type: disk.XBootLDRPartitionGUID,
UUID: disk.FilesystemDataUUID,
Payload: &disk.Filesystem{
Type: "ext4",
Mountpoint: "/boot",
Label: "boot",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
},
{
Size: 2 * common.GibiByte,
Type: disk.FilesystemDataGUID,
UUID: disk.RootPartitionUUID,
Payload: &disk.Filesystem{
Type: "ext4",
Label: "root",
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
},
},
},
platform.ARCH_AARCH64.String(): disk.PartitionTable{
UUID: "0xc1748067",
Type: "dos",
StartOffset: 8 * common.MebiByte,
Partitions: []disk.Partition{
{
Size: 200 * common.MebiByte,
Type: "06",
Bootable: true,
Payload: &disk.Filesystem{
Type: "vfat",
UUID: disk.EFIFilesystemUUID,
Mountpoint: "/boot/efi",
Label: "EFI-SYSTEM",
FSTabOptions: "defaults,uid=0,gid=0,umask=077,shortname=winnt",
FSTabFreq: 0,
FSTabPassNo: 2,
},
},
{
Size: 500 * common.MebiByte,
Type: "83",
Payload: &disk.Filesystem{
Type: "ext4",
Mountpoint: "/boot",
Label: "boot",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
},
{
Size: 2 * common.GibiByte,
Type: "83",
Payload: &disk.Filesystem{
Type: "ext4",
Label: "root",
Mountpoint: "/",
FSTabOptions: "defaults",
FSTabFreq: 0,
FSTabPassNo: 0,
},
},
},
},
}

var iotBasePartitionTables = distro.BasePartitionTableMap{
platform.ARCH_X86_64.String(): disk.PartitionTable{
UUID: "D209C89E-EA5E-4FBD-B161-B461CCE297E0",
Expand Down
4 changes: 4 additions & 0 deletions pkg/distro/image_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"reflect"

"github.com/osbuild/images/internal/fsnode"
"github.com/osbuild/images/internal/shell"
"github.com/osbuild/images/pkg/osbuild"
"github.com/osbuild/images/pkg/subscription"
Expand Down Expand Up @@ -62,6 +63,9 @@ type ImageConfig struct {
UdevRules *osbuild.UdevRulesStageOptions
GCPGuestAgentConfig *osbuild.GcpGuestAgentConfigOptions
WSLConfig *osbuild.WSLConfStageOptions

Files []*fsnode.File
Directories []*fsnode.Directory
}

// InheritFrom inherits unset values from the provided parent configuration and
Expand Down
3 changes: 3 additions & 0 deletions pkg/distro/rhel7/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,9 @@ func osCustomizations(
osc.UdevRules = imageConfig.UdevRules
osc.GCPGuestAgentConfig = imageConfig.GCPGuestAgentConfig

osc.Files = append(osc.Files, imageConfig.Files...)
osc.Directories = append(osc.Directories, imageConfig.Directories...)

return osc
}

Expand Down
16 changes: 15 additions & 1 deletion pkg/distro/rhel8/edge.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"

"github.com/osbuild/images/internal/common"
"github.com/osbuild/images/internal/fsnode"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/platform"
"github.com/osbuild/images/pkg/rpmmd"
Expand Down Expand Up @@ -148,8 +149,14 @@ func minimalRawImgType(rd distribution) imageType {
packageSets: map[string]packageSetFunc{
osPkgsKey: minimalrpmPackageSet,
},
defaultImageConfig: &distro.ImageConfig{
EnabledServices: minimalrawServices(rd),
// NOTE: temporary workaround for a bug in initial-setup that
// requires a kickstart file in the root directory.
Files: []*fsnode.File{initialSetupKickstart()},
},
rpmOstree: false,
kernelOptions: "ro no_timer_check console=ttyS0,115200n8 biosdevname=0 net.ifnames=0",
kernelOptions: "ro",
bootable: true,
defaultSize: 2 * common.GibiByte,
image: diskImage,
Expand Down Expand Up @@ -401,3 +408,10 @@ func edgeServices(rd distribution) []string {

return edgeServices
}

func minimalrawServices(rd distribution) []string {
// Common Services
var minimalrawServices = []string{"NetworkManager.service", "firewalld.service", "sshd.service", "initial-setup.service"}

return minimalrawServices
}
Loading
Loading