( dzsolt | 2023. 07. 22., szo – 06:38 )

> Plusz az efistub nem tud normál ELF meg PE kerneleket tölteni Multiboot2-vel ;-)

Úgy értettem,hogy nekem mivel lenne jobb :) A backup egyszerűbb indítása már előny!

> Nagyszerű, köszönöm! Ezt érdemes lenne valahogy berakni a repóba, ha hozzájárulsz. Attribution requirements?

Előbb legyen egy 0.0.1-es verzió, mint mérföldkő és mellette a -9999 git verzió, aztán mehet. Csak git verzió azért nem jó, mert ha épp egy olyan pillanatban készül bináris ami eltörik, nincsen hová visszalépni és úgy sosem kerülhet be a hivatalos repóba. 

> Félreérted, a generálandó lemezképen nincs elég hely! Alapból 33 Mb-sre csinálja (a lehető legkissebb FAT32, ami létrehozható). Add meg "-p <mb>" kapcsolóval megabájtban, hogy mekkora boot partíciót szeretnél. (Ez azért kell, mert előre, még a másolás elkezdése előtt tudni kell, mekkora területet fog lefoglalni a FAT tábla.)

Ahh... :) Szóval csak optimalizálni kell valahogyan az initrd generálást, a dracut legutóbbi initrd-je 60+ Mb.

 

Épp dolgozom egy minimalizált hypervisoron gentoo alapokon. A képességei az összes járatos konténer technika és virtualizáció telepítésének  lehetősége, de választhatóan: egyik vagy másik konténer, minden konténer akár, virtualizációval vagy nélküle. A telepítőt írom éppen és mivel a minimalizált helyfoglalás a célom, a projekted nagyon is beleillik! Egyelőre a rootfs-el voltam elfoglalva, kicsit ránézek az initrd generálásra, mert ez eddig fel sem tűnt, hogy ekkora bazi nagy és ezt a szálat követem. 

Szerk: közben látom, hogy 6 órája megszületett a 0.0.1-es verzió, így a módosított ebuild a következő:

# Copyright 2023 .....
# Distributed under the terms of the GNU General Public License v2

EAPI=7

DESCRIPTION="Dependency-free, suckless bootable disk image creator"
HOMEPAGE="https://gitlab.com/bztsrc/simpleboot"

LICENSE="MIT"
SLOT="0"
IUSE="rebuild"

# If PV starts with 9999, use git-r3 for version control
if [[ ${PV} == 9999* ]]; then
    inherit git-r3
    EGIT_REPO_URI='https://gitlab.com/bztsrc/simpleboot.git'
else
    inherit vcs-snapshot
    EGIT_COMMIT="28164466"
    SRC_URI="https://gitlab.com/bztsrc/simpleboot/-/archive/${EGIT_COMMIT}/simpleboot-${EGIT_COMMIT}.tar.gz -> ${P}.tar.gz"
    KEYWORDS="~amd64 ~x86"
fi

BDEPEND="
    rebuild? (
        dev-lang/fasm
        sys-devel/llvm
        sys-devel/lld
    )
"

src_prepare() {
    default
    # Nothing specific to prepare
}

src_compile() {
    if use rebuild; then
        emake -C src distclean || die "Failed to execute 'make -C src distclean'"
    fi
    emake -C src -j1 || die "Failed to build simpleboot"
}

src_install() {
    dobin src/simpleboot || die "Failed to install simpleboot"

    # Create the /etc/simpleboot directory if it does not exist
    dodir /etc/simpleboot

    # Copy the example/simpleboot.cfg as simpleboot.cfg to /etc/simpleboot
    insinto /etc/simpleboot
    newins example/simpleboot.cfg simpleboot.cfg.example || die "Failed to copy simpleboot.cfg"
}

pkg_config() {
    einfo "Creating Simpleboot configuration file in /etc/simpleboot directory..."
    # Simpleboot configuration file creation in the /etc/simpleboot directory
    local simpleboot_cfg="${EROOT}/etc/simpleboot/simpleboot.cfg"
    local kernel_list=("${EROOT}"/boot/vmlinuz-*)

    # Find the latest and oldest kernel version
    local latest_kernel_version=""
    local oldest_kernel_version=""
    for kernel_file in "${kernel_list[@]}"; do
        kernel_version=$(basename "${kernel_file}" | cut -d- -f2-)
        if [[ -z "${latest_kernel_version}" ]] || [[ "${kernel_version}" > "${latest_kernel_version}" ]]; then
            latest_kernel_version="${kernel_version}"
        fi
        if [[ -z "${oldest_kernel_version}" ]] || [[ "${kernel_version}" < "${oldest_kernel_version}" ]]; then
            oldest_kernel_version="${kernel_version}"
        fi
    done

    echo "# New" > "${simpleboot_cfg}"
    echo "verbose 2" >> "${simpleboot_cfg}"
    echo "kernel vmlinuz-${latest_kernel_version}" >> "${simpleboot_cfg}"
    echo "module initramfs-${latest_kernel_version}.img" >> "${simpleboot_cfg}"
    echo "framebuffer 1920 1080 32" >> "${simpleboot_cfg}"
    echo "bootsplash #af00d7 splash.tga" >> "${simpleboot_cfg}"

    echo "" >> "${simpleboot_cfg}"

    echo "# Backup" >> "${simpleboot_cfg}"
    echo "verbose 3" >> "${simpleboot_cfg}"
    echo "backupkernel vmlinuz-${oldest_kernel_version}" >> "${simpleboot_cfg}"
    echo "backupmodule initramfs-${oldest_kernel_version}.img" >> "${simpleboot_cfg}"
    echo "backupframebuffer 640 480 32" >> "${simpleboot_cfg}"
    echo "backupbootsplash #af00d7 backup_splash.tga" >> "${simpleboot_cfg}"

    # Calculate the size of the latest kernel file
    local latest_kernel_file="${EROOT}/boot/vmlinuz-${latest_kernel_version}"
    local latest_kernel_size=0
    if [[ -f "${latest_kernel_file}" ]]; then
        latest_kernel_size=$(stat -c %s "${latest_kernel_file}")
    fi

    # Calculate the size of related initramfs and splash files
    local initramfs_file="${EROOT}/boot/initramfs-${latest_kernel_version}.img"
    local initramfs_size=0
    if [[ -f "${initramfs_file}" ]]; then
        initramfs_size=$(stat -c %s "${initramfs_file}")
    fi

    local splash_file="${EROOT}/boot/splash.tga"
    local splash_size=0
    if [[ -f "${splash_file}" ]]; then
        splash_size=$(stat -c %s "${splash_file}")
    fi

    # Calculate the total size of the latest files
    local latest_total_size=$((latest_kernel_size + initramfs_size + splash_size))

    # Calculate the size of the oldest kernel file
    local oldest_kernel_file="${EROOT}/boot/vmlinuz-${oldest_kernel_version}"
    local oldest_kernel_size=0
    if [[ -f "${oldest_kernel_file}" ]]; then
        oldest_kernel_size=$(stat -c %s "${oldest_kernel_file}")
    fi

    # Calculate the size of related backup initramfs and splash files
    local backup_initramfs_file="${EROOT}/boot/initramfs-${oldest_kernel_version}.img"
    local backup_initramfs_size=0
    if [[ -f "${backup_initramfs_file}" ]]; then
        backup_initramfs_size=$(stat -c %s "${backup_initramfs_file}")
    fi

    local backup_splash_file="${EROOT}/boot/backup_splash.tga"
    local backup_splash_size=0
    if [[ -f "${backup_splash_file}" ]]; then
        backup_splash_size=$(stat -c %s "${backup_splash_file}")
    fi

    # Calculate the total size of the oldest files
    local oldest_total_size=$((oldest_kernel_size + backup_initramfs_size + backup_splash_size))

    # Calculate the overall total size
    local overall_total_size=$((latest_total_size + oldest_total_size))

    # Print the sizes of the latest and oldest files
    einfo "Size of the latest files: ${latest_total_size} bytes"
    einfo "Size of the oldest files: ${oldest_total_size} bytes"

    # Check if the total size is too large
    if [[ ${overall_total_size} -gt 33000000 ]]; then
        ewarn "Total size of related files is too large (${overall_total_size} bytes). The generated image exceeds the allowed 33 MB size."
    fi

    # Print the content of the configuration file
    einfo "Content of Simpleboot configuration file:"
    cat "${simpleboot_cfg}"

    # Check if the configuration file exists in /etc/simpleboot
    if [[ -e "${EROOT}/etc/simpleboot/simpleboot.cfg" ]]; then
        einfo "Configuration file successfully copied to /etc/simpleboot."
    else
        ewarn "Failed to copy configuration file to /etc/simpleboot."
    fi
}

ezt kell menteni simpleboot-9999.ebuild néven majd másolni a simpleboot-0.0.1.ebuild fájlba. Ezen a ponton a 28164466 Commit lesz a 0.0.1-es verzió amíg nem lesz egy hivatalos letölthető 0.0.1 kiadás. Egyúttal a --config kiírja a konzolra az méreteket is és figyelmeztet ha a méret túl nagy.
A telepítés menetét is beleteheted a doksiba ha gondolod.

Saját repo létrehozása után a fájlokat a repo alatt a sys-boot/simpleboot mappába kell helyezni, majd

ebuild simpleboot-0.0.1.ebuild digest 

parancs ami létrehozza a Manifest fájlt. Ezután a 

echo "sys-boot/simpleboot ~amd64" >> /etc/portage/package.accept_keywords/sys-boot

engedélyezi a nem stabilnak kikiáltott csomagunkat és így telepíthető a

emerge -pv sys-boot/simpleboot
emerge -pv =sys-boot/simpleboot-9999
USE="rebuild" emerge -pv sys-boot/simpleboot

parancsok valamelyikével (a -p elhagyása után települ, így csak megmutatja, hogy mi történne ha...)

PS: az EGIT_COMMIT="28164466" helyett jobban tetszene egy kiadott verzió, egyszerűbben karbantartható az ebuild, mert akkor nem commit alapján kezeljük a verziót, hanem kiadás alapján.