allows building a 32bit system on a 64bit host (though you can't build a 64bit
system on a 32bit system/kernel of course). Please notice that real
crosscompiling (like building a ppc system on x86) isn't possible due to the
-nature and the need of working in a chroot. Currently supported values: i386
-and amd64.
+nature and the need of working in a chroot. Currently supported values: i386,
+amd64 and arm64.
-b::
-c **CLASSES**::
Specify the CLASSES to be used for building the ISO via FAI. By default only
-the classes GRMLBASE, GRML_FULL and I386/AMD64 (depending on system
+the classes GRMLBASE, GRML_FULL and I386/AMD64/ARM64 (depending on system
architecture) are assumed. Additionally you can specify a class providing a
(grml-)kernel (see <<classes,the 'CLASSES' section in this document>> for
details about available classes). So instead of GRML_FULL you can also use e.g.
The main and base class provided by grml-live is named GRMLBASE. It's strongly
recommended to **always** use the class GRMLBASE when building an ISO using
grml-live, as well as the architecture dependent class which provides the kernel
-(being 'I386' for x86_32 and 'AMD64' for x86_64) and a GRML_* class (like
-GRML_SMALL or GRML_FULL). The following files and directories are
-relevant for class GRMLBASE by default:
+(being 'I386' for x86_32, 'AMD64' for x86_64 and 'ARM64' for arm64) and a GRML_*
+class (like GRML_SMALL or GRML_FULL).
+The following files and directories are relevant for class GRMLBASE by default:
${GRML_FAI_CONFIG}/config/scripts/GRMLBASE/
${GRML_FAI_CONFIG}/config/debconf/GRMLBASE
If you want to use your own configuration, extend an existing configuration
and/or add additional packages to your ISO just invent a new class (or extend an
-existing one). For example if you want to use your own class named "FOOBAR" just
-set CLASSES="GRMLBASE,GRML_SMALL,AMD64,FOOBAR" inside /etc/grml/grml-live.local
-or invoke grml-live using the classes option: "grml-live -c
-GRMLBASE,GRML_SMALL,AMD64,FOOBAR ...".
+existing one). For example if you want to use your own class named "FOOBAR" on
+your amd64 build, et CLASSES="GRMLBASE,GRML_SMALL,AMD64,FOOBAR" inside
+/etc/grml/grml-live.local or invoke grml-live using the classes option:
+"grml-live -c GRMLBASE,GRML_SMALL,AMD64,FOOBAR ...".
More details regarding the class concept can be found in the documentation of
FAI itself (being available at /usr/share/doc/fai-doc/).
# mkdir -p /etc/grml/fai/config/basefiles/
# mv I386.tar.gz /etc/grml/fai/config/basefiles/
# mv AMD64.tar.gz /etc/grml/fai/config/basefiles/
+ # mv ARM64.tar.gz /etc/grml/fai/config/basefiles/
# install relevant tools
apt-get --no-install-recommends install grml-live
% isohybrid grml.iso
[[create-a-base-tgz]]
-How do I create a base tar.gz (I386.tar.gz or AMD64.tar.gz)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+How do I create a base tar.gz (I386.tar.gz or AMD64.tar.gz or ARM64.tar.gz)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[[basetgz]]
First of all create the chroot using debootstrap (requires root):
BASECHROOT='/tmp/basefile' # path where the chroot gets generated
SUITE='bookworm' # using the current stable release should always work
- debootstrap --exclude=info,tasksel,tasksel-data "$SUITE" "$BASECHROOT" http://ftp.debian.org/debian
+ debootstrap --exclude=info,tasksel,tasksel-data,isc-dhcp-client,isc-dhcp-common "$SUITE" "$BASECHROOT" http://deb.debian.org/debian
tar -C "$BASECHROOT" --exclude='var/cache/apt/archives/*.deb' -zcf "${SUITE}".tar.gz ./
[TIP]
host system. If you're using an amd64 system and want to build an i386 base.tgz
then invoke debootstrap using the '--arch i386' option. Disclaimer: building an
AMD64 base.tgz won't work if you are using a 32bit kernel system of course.
+Also building an ARM64 base.tgz requires an arm64 system.
Finally place the generated tarball in /etc/grml/fai/config/basefiles/ (note
that it needs to be uppercase letters matching the class names, so: e.g.
-AMD64.tar.gz for amd64 and I386.tar.gz for i386).
+AMD64.tar.gz for amd64, I386.tar.gz for i386 or ARM64.tar.gz for arm64).
Then executing grml-live should use this file as base system instead of executing
debootstrap. Check out the output for something like:
Usage: $PN [options, see as follows]
- -a <architecture> architecture; available values: i386 and amd64
+ -a <architecture> architecture; available values: i386, amd64 + arm64
-A clean build directories before and after running
-b build the ISO without updating the chroot via FAI
-B build the ISO without touching the chroot (skips cleanup)
[ -n "$OUTPUT" ] || bailout 1 "Error: \$OUTPUT unset, please set it in $LIVE_CONF or
specify it on the command line using the -o option."
+if [[ "$(dpkg --print-architecture)" != "arm64" ]] && [[ "$ARCH" == "arm64" ]] ; then
+ eerror "Failure: trying to build for arm64, but not running on arm64."
+ eend 1
+ bailout
+fi
+
# trim characters that are known to cause problems inside $GRML_NAME;
# for example isolinux does not like '-' inside the directory name
[ -n "$GRML_NAME" ] && export SHORT_NAME="$(echo $GRML_NAME | tr -d ',./;\- ')"
[ -n "$RELEASENAME" ] && export RELEASENAME="$RELEASENAME"
# }}}
+
# ZERO_LOGFILE - check for backwards compatibility reasons {{{
# this was default behaviour until grml-live 0.9.34:
if [ -n "$ZERO_LOGFILE" ] ; then
# architecture (option), otherwise installation of kernel will fail
if echo $CLASSES | grep -qw I386 ; then
if ! [[ "$ARCH" == "i386" ]] ; then
- log "Error: You specified the I386 class but are trying to build something else (AMD64?)."
- eerror "Error: You specified the I386 class but are trying to build something else (AMD64?)."
+ log "Error: You specified the I386 class but are trying to build something else (AMD64/ARM64?)."
+ eerror "Error: You specified the I386 class but are trying to build something else (AMD64/ARM64?)."
eerror "Tip: Either invoke grml-live with '-a i386' or adjust the architecture class. Exiting."
eend 1
bailout
fi
elif echo $CLASSES | grep -qi amd64 ; then
if ! [[ "$ARCH" == "amd64" ]] ; then
- log "Error: You specified the AMD64 class but are trying to build something else (I386?)."
- eerror "Error: You specified the AMD64 class but are trying to build something else (I386?)."
+ log "Error: You specified the AMD64 class but are trying to build something else (I386/ARM64?)."
+ eerror "Error: You specified the AMD64 class but are trying to build something else (I386/ARM64?)."
eerror "Tip: Either invoke grml-live with '-a amd64' or adjust the architecture class. Exiting."
eend 1
bailout
fi
+elif echo $CLASSES | grep -qi arm64 ; then
+ if ! [[ "$ARCH" == "arm64" ]] ; then
+ log "Error: You specified the ARM64 class but are trying to build something else (I386/AMD64?)."
+ eerror "Error: You specified the ARM64 class but are trying to build something else (I386/AMD64?)."
+ eerror "Tip: Either invoke grml-live with '-a arm64' or adjust the architecture class. Exiting."
+ eend 1
+ bailout
+ fi
fi
# generate nfsroot configuration for FAI on the fly
# grub boot {{{
grub_setup() {
- BOOTX64="/boot/bootx64.efi"
- BOOTX32="/boot/bootia32.efi"
EFI_IMG="/boot/efi.img"
local efi_size
efi_size='8M'
fi
- if [[ "$ARCH" == "amd64" ]] ; then
+ if [[ "$ARCH" == "amd64" ]] || [[ "$ARCH" == "arm64" ]] ; then
+ case "$ARCH" in
+ arm64)
+ BOOTX64="/boot/bootaa64.efi"
+ ;;
+ amd64)
+ BOOTX64="/boot/bootx64.efi"
+ ;;
+ esac
+
# important: this depends on execution of ${GRML_FAI_CONFIG}/config/scripts/GRMLBASE/45-grub-images
if ! [ -r "${CHROOT_OUTPUT}/${BOOTX64}" ] ; then
log "Can not access GRUB efi image ${CHROOT_OUTPUT}/${BOOTX64}, required for Secure Boot support"
log "Secure Boot is disabled."
einfo "Secure Boot is disabled." ; eend 0
- # install "$BOOTX64" as ::EFI/BOOT/bootx64.efi inside image file "$EFI_IMG":
- mcopy -i "${CHROOT_OUTPUT}/${EFI_IMG}" "${CHROOT_OUTPUT}/${BOOTX64}" ::EFI/BOOT/bootx64.efi >/dev/null || bailout 53
+ # install "$BOOTX64" as ::EFI/BOOT/{bootx64.efi|bootaa64.efi} inside image file "$EFI_IMG":
+ case "$ARCH" in
+ arm64)
+ mcopy -i "${CHROOT_OUTPUT}/${EFI_IMG}" "${CHROOT_OUTPUT}/${BOOTX64}" ::EFI/BOOT/bootaa64.efi >/dev/null || bailout 53
+ ;;
+ amd64)
+ mcopy -i "${CHROOT_OUTPUT}/${EFI_IMG}" "${CHROOT_OUTPUT}/${BOOTX64}" ::EFI/BOOT/bootx64.efi >/dev/null || bailout 53
+ ;;
+ esac
log "Generated 64-bit EFI image $BOOTX64"
einfo "Generated 64-bit EFI image $BOOTX64" ; eend 0
fi
if [[ "$ARCH" == "i386" ]] ; then
+ BOOTX32="/boot/bootia32.efi"
if ! [ -r "${CHROOT_OUTPUT}/${BOOTX32}" ] ; then
log "Can not access GRUB efi image ${CHROOT_OUTPUT}/${BOOTX32}."
eerror "Can not access GRUB efi image ${CHROOT_OUTPUT}/${BOOTX32}." ; eend 1
mkdir -p "$BUILD_OUTPUT" || bailout 6 "Problem with creating $BUILD_OUTPUT for stage ARCH"
# prepare ISO
-if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
+if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] || [ "$ARCH" = arm64 ] ; then
if [ -n "$BOOTSTRAP_ONLY" ] ; then
log "Skipping stage 'boot' as building with bootstrap only."
ewarn "Skipping stage 'boot' as building with bootstrap only." ; eend 0
grub_setup
# EFI boot files
- if [ -r "${CHROOT_OUTPUT}/boot/efi.img" -a -r "${CHROOT_OUTPUT}/boot/bootx64.efi" ] ; then
- einfo "Copying 64-bit EFI boot files into ISO path."
- log "Copying 64-bit EFI boot files into ISO path."
+ if [ -r "${CHROOT_OUTPUT}/boot/efi.img" -a -r "${CHROOT_OUTPUT}/boot/bootaa64.efi" ] ; then
+ einfo "Copying 64-bit EFI boot files (arm64) into ISO path."
+ log "Copying 64-bit EFI boot files (arm64) into ISO path."
+ RC=$0
+ cp "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/" || RC=$?
+ mkdir -p "${BUILD_OUTPUT}/EFI/BOOT/" || RC=$?
+ cp "${CHROOT_OUTPUT}/boot/bootaa64.efi" "${BUILD_OUTPUT}/EFI/BOOT/bootaa64.efi" || RC=$?
+ eend $?
+ elif [ -r "${CHROOT_OUTPUT}/boot/efi.img" -a -r "${CHROOT_OUTPUT}/boot/bootx64.efi" ] ; then
+ einfo "Copying 64-bit EFI boot files (amd64) into ISO path."
+ log "Copying 64-bit EFI boot files (amd64) into ISO path."
RC=$0
cp "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/" || RC=$?
mkdir -p "${BUILD_OUTPUT}/EFI/BOOT/" || RC=$?
eend $?
elif [ -r "${CHROOT_OUTPUT}/boot/efi.img" -a -r "${CHROOT_OUTPUT}/boot/bootia32.efi" ] ; then
einfo "Copying 32-bit EFI boot files into ISO path."
- log "Copying 32-bit EFI boot files into ISO path."
+ log "Copying 32-bit EFI boot files into ISO path."
RC=$0
cp "${CHROOT_OUTPUT}/boot/efi.img" "${BUILD_OUTPUT}/boot/" || RC=$?
mkdir -p "${BUILD_OUTPUT}/EFI/BOOT/" || RC=$?
fi
echo "source /boot/grub/footer.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
- # copy grub files from target
- mkdir -p "${BUILD_OUTPUT}"/boot/grub/i386-pc/
- cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/i386-pc/
- cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/i386-pc/
- cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/i386-pc/
- cp -a "${CHROOT_OUTPUT}"/usr/share/grub/ascii.pf2 "${BUILD_OUTPUT}"/boot/grub/
- cp -a "${CHROOT_OUTPUT}"/boot/grub/core.img "${BUILD_OUTPUT}"/boot/grub/
- cp -a "${CHROOT_OUTPUT}"/boot/grub/grub.img "${BUILD_OUTPUT}"/boot/grub/
-
- # copy modules for UEFI grub, 64-bit
- mkdir -p "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
- cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/x86_64-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
-
- # copy modules for UEFI grub, 32-bit
- mkdir -p "${BUILD_OUTPUT}"/boot/grub/i386-efi/
- cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/i386-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/i386-efi/
+ # copy modules for GRUB
+ if [ "${ARCH}" = "arm64" ] ; then
+ mkdir -p "${BUILD_OUTPUT}"/boot/grub/arm64-efi/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/arm64-efi/*.mod "${BUILD_OUTPUT}"/boot/grub/arm64-efi/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/arm64-efi/*.lst "${BUILD_OUTPUT}"/boot/grub/arm64-efi/
+ # NOTE: usage of /boot/grub/core.img + /boot/grub/grub.img unclear yet
+ elif [ "${ARCH}" = "amd64" ] || [ "${ARCH}" = "i386" ] ; then
+ # grub-pc-bin
+ mkdir -p "${BUILD_OUTPUT}"/boot/grub/i386-pc/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/i386-pc/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/i386-pc/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/i386-pc/
+
+ # grub-efi-amd64-bin
+ mkdir -p "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/x86_64-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
+
+ # grub-efi-ia32-bin
+ mkdir -p "${BUILD_OUTPUT}"/boot/grub/i386-efi/
+ cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/i386-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/i386-efi/
+
+ cp -a "${CHROOT_OUTPUT}"/boot/grub/core.img "${BUILD_OUTPUT}"/boot/grub/
+ cp -a "${CHROOT_OUTPUT}"/boot/grub/grub.img "${BUILD_OUTPUT}"/boot/grub/
+ fi
+
+ # arch independent files
+ cp -a "${CHROOT_OUTPUT}"/usr/share/grub/ascii.pf2 "${BUILD_OUTPUT}"/boot/grub/
+ cp -a "${CHROOT_OUTPUT}"/usr/share/grub/unicode.pf2 "${BUILD_OUTPUT}"/boot/grub/ # clarify
if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then
log "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting."