From 741c0553d5a4717e9c23197ada18825e791703a6 Mon Sep 17 00:00:00 2001 From: Clayton Craft <clayton@craftyguy.net> Date: Mon, 18 Mar 2024 16:38:21 -0700 Subject: [PATCH] Allow including initramfs-extra files in the initramfs (MR 48) This uses a "deviceinfo_create_initfs_extra" to allow including initramfs-extra files in the initramfs and skip creating a separate initramfs-extra archive when it's set to "false". If this variable is unset, mkinitfs uses a default value of "false". --- cmd/mkinitfs/main.go | 73 +++++++++++-------- doc/mkinitfs.1.scd | 1 + internal/bootdeploy/bootdeploy.go | 9 ++- pkgs/deviceinfo/deviceinfo.go | 3 + pkgs/deviceinfo/deviceinfo_test.go | 2 + .../test_resources/deviceinfo-unmarshal-1 | 1 + 6 files changed, 58 insertions(+), 31 deletions(-) diff --git a/cmd/mkinitfs/main.go b/cmd/mkinitfs/main.go index 6474602..138667b 100644 --- a/cmd/mkinitfs/main.go +++ b/cmd/mkinitfs/main.go @@ -106,30 +106,6 @@ func main() { modules.New("/usr/share/mkinitfs/modules"), modules.New("/etc/mkinitfs/modules"), }) - if err := initramfsAr.AddItems(initfs); err != nil { - log.Println(err) - log.Println("failed to generate: ", "initramfs") - retCode = 1 - return - } - if err := initramfsAr.Write(filepath.Join(workDir, "initramfs"), os.FileMode(0644)); err != nil { - log.Println(err) - log.Println("failed to generate: ", "initramfs") - retCode = 1 - return - } - misc.TimeFunc(start, "initramfs") - - // - // initramfs-extra - // - // deviceinfo.InitfsExtraCompression needs a little more post-processing - compressionFormat, compressionLevel = archive.ExtractFormatLevel(devinfo.InitfsExtraCompression) - log.Printf("== Generating %s ==\n", "initramfs-extra") - log.Printf("- Using compression format %s with level %q\n", compressionFormat, compressionLevel) - - start = time.Now() - initramfsExtraAr := archive.New(compressionFormat, compressionLevel) initfsExtra := initramfs.New([]filelist.FileLister{ hookfiles.New("/usr/share/mkinitfs/files-extra"), hookfiles.New("/etc/mkinitfs/files-extra"), @@ -138,19 +114,58 @@ func main() { modules.New("/usr/share/mkinitfs/modules-extra"), modules.New("/etc/mkinitfs/modules-extra"), }) - if err := initramfsExtraAr.AddItemsExclude(initfsExtra, initfs); err != nil { + + if err := initramfsAr.AddItems(initfs); err != nil { log.Println(err) - log.Println("failed to generate: ", "initramfs-extra") + log.Println("failed to generate: ", "initramfs") retCode = 1 return } - if err := initramfsExtraAr.Write(filepath.Join(workDir, "initramfs-extra"), os.FileMode(0644)); err != nil { + + // Include initramfs-extra files in the initramfs if not making a separate + // archive + if !devinfo.CreateInitfsExtra { + if err := initramfsAr.AddItems(initfsExtra); err != nil { + log.Println(err) + log.Println("failed to generate: ", "initramfs") + retCode = 1 + return + } + } + + if err := initramfsAr.Write(filepath.Join(workDir, "initramfs"), os.FileMode(0644)); err != nil { log.Println(err) - log.Println("failed to generate: ", "initramfs-extra") + log.Println("failed to generate: ", "initramfs") retCode = 1 return } - misc.TimeFunc(start, "initramfs-extra") + misc.TimeFunc(start, "initramfs") + + if devinfo.CreateInitfsExtra { + // + // initramfs-extra + // + // deviceinfo.InitfsExtraCompression needs a little more post-processing + compressionFormat, compressionLevel = archive.ExtractFormatLevel(devinfo.InitfsExtraCompression) + log.Printf("== Generating %s ==\n", "initramfs-extra") + log.Printf("- Using compression format %s with level %q\n", compressionFormat, compressionLevel) + + start = time.Now() + initramfsExtraAr := archive.New(compressionFormat, compressionLevel) + if err := initramfsExtraAr.AddItemsExclude(initfsExtra, initfs); err != nil { + log.Println(err) + log.Println("failed to generate: ", "initramfs-extra") + retCode = 1 + return + } + if err := initramfsExtraAr.Write(filepath.Join(workDir, "initramfs-extra"), os.FileMode(0644)); err != nil { + log.Println(err) + log.Println("failed to generate: ", "initramfs-extra") + retCode = 1 + return + } + misc.TimeFunc(start, "initramfs-extra") + } // Final processing of initramfs / kernel is done by boot-deploy if !disableBootDeploy { diff --git a/doc/mkinitfs.1.scd b/doc/mkinitfs.1.scd index f84f51a..7c08fda 100644 --- a/doc/mkinitfs.1.scd +++ b/doc/mkinitfs.1.scd @@ -42,6 +42,7 @@ mkinitfs reads deviceinfo values from */usr/share/deviceinfo/deviceinfo* and */etc/deviceinfo*, in that order. The following variables are *required* by mkinitfs: + - deviceinfo_create_initfs_extra - deviceinfo_generate_systemd_boot - deviceinfo_initfs_compression - deviceinfo_initfs_extra_compression diff --git a/internal/bootdeploy/bootdeploy.go b/internal/bootdeploy/bootdeploy.go index d91d2b2..ad4a33d 100644 --- a/internal/bootdeploy/bootdeploy.go +++ b/internal/bootdeploy/bootdeploy.go @@ -78,12 +78,17 @@ func (b *BootDeploy) Run() error { } // boot-deploy -i initramfs -k vmlinuz-postmarketos-rockchip -d /tmp/cpio -o /tmp/foo initramfs-extra - cmd := exec.Command("boot-deploy", + args := []string{ "-i", "initramfs", "-k", kernFilename, "-d", b.inDir, "-o", b.outDir, - "initramfs-extra") + } + + if b.devinfo.CreateInitfsExtra { + args = append(args, "initramfs-extra") + } + cmd := exec.Command("boot-deploy", args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr diff --git a/pkgs/deviceinfo/deviceinfo.go b/pkgs/deviceinfo/deviceinfo.go index d537971..a2e425a 100644 --- a/pkgs/deviceinfo/deviceinfo.go +++ b/pkgs/deviceinfo/deviceinfo.go @@ -21,6 +21,7 @@ type DeviceInfo struct { UbootBoardname string GenerateSystemdBoot string FormatVersion string + CreateInitfsExtra bool } // Reads the relevant entries from "file" into DeviceInfo struct @@ -112,6 +113,7 @@ func (d DeviceInfo) String() string { %s: %v %s: %v %s: %v + %s: %v }`, "deviceinfo_format_version", d.FormatVersion, "deviceinfo_", d.FormatVersion, @@ -120,5 +122,6 @@ func (d DeviceInfo) String() string { "deviceinfo_ubootBoardname", d.UbootBoardname, "deviceinfo_generateSystemdBoot", d.GenerateSystemdBoot, "deviceinfo_formatVersion", d.FormatVersion, + "deviceinfo_createInitfsExtra", d.CreateInitfsExtra, ) } diff --git a/pkgs/deviceinfo/deviceinfo_test.go b/pkgs/deviceinfo/deviceinfo_test.go index 41b2e47..7be15bf 100644 --- a/pkgs/deviceinfo/deviceinfo_test.go +++ b/pkgs/deviceinfo/deviceinfo_test.go @@ -42,6 +42,7 @@ func TestNameToField(t *testing.T) { {"modules_initfs", "ModulesInitfs"}, {"deviceinfo_initfs_compression___", "InitfsCompression"}, {"deviceinfo_initfs_extra_compression", "InitfsExtraCompression"}, + {"deviceinfo_create_initfs_extra", "CreateInitfsExtra"}, } for _, table := range tables { @@ -65,6 +66,7 @@ func TestUnmarshal(t *testing.T) { UbootBoardname: "foobar-bazz", InitfsCompression: "zstd:--foo=1 -T0 --bar=bazz", InitfsExtraCompression: "", + CreateInitfsExtra: true, }, }, } diff --git a/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1 b/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1 index 6dfcdc0..117d8d1 100644 --- a/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1 +++ b/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1 @@ -4,3 +4,4 @@ deviceinfo_uboot_boardname="foobar-bazz" deviceinfo_initfs_compression="zstd:--foo=1 -T0 --bar=bazz" # empty option deviceinfo_initfs_extra_compression="" +deviceinfo_create_initfs_extra="true" -- GitLab