]> git.ipfire.org Git - people/ms/bricklayer.git/commitdiff
master: Create a basic GRUB configuration file
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 28 May 2021 14:04:18 +0000 (14:04 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 28 May 2021 14:04:18 +0000 (14:04 +0000)
This does not fully work yet, but the menu is shown and a kernel is
being booted.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/bricklayer-master

index 293feab33154047fa4131249f2c4f0fabe0d5e82..1be5848642ebb64798a7dcdc7fa6a021b9f2c935 100644 (file)
@@ -27,6 +27,7 @@ PACKAGES=(
        "@Base"
        "dracut"
        "kernel"
+       "/etc/os-release"
 )
 
 BUILDSYSTEM_PACKAGES=(
@@ -92,7 +93,8 @@ in_buildsystem() {
 
 make_live_system_image() {
        local filename="${1}"
-       shift
+       local os_release="${2}"
+       shift 2
 
        local tempdir="$(mktemp -d)"
 
@@ -104,6 +106,13 @@ make_live_system_image() {
                return 1
        fi
 
+       # Copy /etc/os-release
+       if ! cat "${tempdir}/etc/os-release" > "${os_release}"; then
+               echo "Could not extract /etc/os-release" >&2
+               rm -rf "${tempdir}"
+               return 1
+       fi
+
        # Create a squashfs image
        if ! mksquashfs "${tempdir}" "${filename}" \
                        -comp zstd -Xcompression-level "${ZSTD_COMPRESSION_LEVEL}"; then
@@ -153,11 +162,50 @@ make_grub_bios_image() {
        return 0
 }
 
+make_grub_config() {
+       local path="${1}"
+       local name="${2}"
+       local class="${3}"
+       local arch="${4}"
+
+       cat > "${path}" <<EOF
+# Bricklayer GRUB configuration
+
+# Select the first entry
+set default=0
+
+# Try loading video output
+insmod efi_gop
+insmod efi_uga
+insmod video_bochs
+insmod video_cirrus
+insmod all_video
+
+# Keep resolution selected by the BIOS
+set gfxpayload=keep
+
+# Wait for 60 seconds for the user to make a decision
+set timeout=60
+
+menuentry 'Install ${name} (${arch})' --class ${class} --id install {
+       linux /boot/vmlinuz
+       initrd /boot/initramfs.img
+}
+
+submenu 'Other Installation Options -->' {
+       menuentry 'Unattended installation' --class ${class} --id install.unattended {
+               linux /boot/vmlinuz installer.unattended=1
+               initrd /boot/initramfs.img
+       }
+}
+EOF
+}
+
 make_grub_efi_config() {
        local label="${1}"
 
        echo "search.fs_label \"${label}\" root"
-       echo "set prefix=(\$root)/EFI/BOOT"
+       echo "set prefix=(\$root)/boot/grub"
 }
 
 make_grub_efi_image() {
@@ -417,8 +465,33 @@ mkimage() {
                )
        fi
 
+       local os_release="$(mktemp)"
+
        # Create the live system image
-       if ! make_live_system_image "${tempdir}/live-os.img" "kernel = ${kernel_release}"; then
+       if ! make_live_system_image "${tempdir}/live-os.img" "${os_release}" \
+                       "kernel = ${kernel_release}"; then
+               rm -rf "${tempdir}" "${os_release}"
+               return 1
+       fi
+
+       # Source /etc/os-release
+       . "${os_release}"
+       rm -f "${os_release}"
+
+       # Check if all necessary variables are set
+       local variable
+       for variable in PRETTY_NAME ID; do
+               if [ -n "${!variable}" ]; then
+                       echo "WARNING: ${variable} is not set in /etc/os-release" >&2
+               fi
+       done
+
+       mkdir -p "${tempdir}/boot/grub"
+
+       # Generate GRUB configuration
+       if ! make_grub_config "${tempdir}/boot/grub/grub.cfg" \
+                       "${PRETTY_NAME}" "${ID}" "${arch}"; then
+               echo "Could not generate GRUB configuration" >&2
                rm -rf "${tempdir}"
                return 1
        fi
@@ -429,7 +502,7 @@ mkimage() {
        fi
 
        # Cleanup
-       rm -rf "${tempdir}"
+       rm -rf "${tempdir}" "${os_release}"
 
        return "${r}"
 }