From c54ad674318c097fdaa307e21353430969dcab10 Mon Sep 17 00:00:00 2001 From: Dan Johansen Date: Tue, 6 Dec 2022 23:13:17 +0000 Subject: [PATCH] Add generic-efi device option --- README.md | 2 + manjaro-arm-installer | 308 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 252 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index 108c5f7..22370ec 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ This script is "interactive". Meaning that it asks you questions when run to cus * btrfs-progs (for btrfs filesystem support) * f2fs-tools (for f2fs filesystem support) * cryptsetup (for encryption support) +* grub-efi-arm64 (only needed when script is run from other arcitectures than `aarch64`) (from AUR) (for `generic-efi` support) ## Installing and using from Manjaro (x64 and ARM) repositories: To use this script, please make sure that the following is correct: @@ -59,6 +60,7 @@ sudo bash ./manjaro-arm-installer ## Supported Devices: * ClockworkPi DevTerm * Generic +* Generic EFI * Beelink GT1 Ultimate * Odroid C4 * Odroid C2 diff --git a/manjaro-arm-installer b/manjaro-arm-installer index 89c8ca5..2f352b6 100755 --- a/manjaro-arm-installer +++ b/manjaro-arm-installer @@ -58,8 +58,8 @@ for i in "${DEPENDENCIES[@]}"; do done if [[ "$CARCH" != "aarch64" ]]; then -if [ ! -f "/usr/lib/binfmt.d/qemu-static.conf" ]; then - echo "qemu-static.conf file is missing. Please install the relevant package." +if [ ! -f "/usr/lib/binfmt.d/qemu-aarch64-static.conf" ]; then + echo "qemu-aarch64-static.conf file is missing. Please install the relevant package." exit 1 fi fi @@ -292,6 +292,9 @@ create_install() { rm -f $TMPDIR/Manjaro-ARM-$ARCH-latest.tar.gz* msg "$DEVICE $EDITION install complete" + if [[ "$DEVICE" = "generic-efi" ]]; then + msg "Please run 'sudo update-grub' after boot to correctly configure Grub!" + fi } prepare_card () { @@ -316,73 +319,133 @@ prepare_card () { parted -s $SDCARD mklabel gpt 1> /dev/null 2>&1 ;; esac - parted -s $SDCARD mkpart primary fat32 32M 512M 1> /dev/null 2>&1 + if [[ "$DEVICE" = "generic-efi" ]]; then + parted -s $SDCARD mkpart primary fat32 0% 512M > /dev/null 2>&1 + else + parted -s $SDCARD mkpart primary fat32 32M 512M 1> /dev/null 2>&1 + fi sleep 5 START=`cat /sys/block/$DEV_NAME/${DEV_NAME}${SDDEV}1/start` SIZE=`cat /sys/block/$DEV_NAME/${DEV_NAME}${SDDEV}1/size` END_SECTOR=$(expr $START + $SIZE) case "$FSTYPE" in btrfs) - parted -s $SDCARD mkpart primary btrfs "${END_SECTOR}s" 100% 1> /dev/null 2>&1 - partprobe $SDCARD 1> /dev/null 2>&1 - mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO 1> /dev/null 2>&1 - mkfs.btrfs -m single -L ROOT_MNJRO -f "${SDCARD}${SDDEV}2" 1> /dev/null 2>&1 + case "$DEVICE" in + generic-efi) + parted -s $SDCARD mkpart primary btrfs "${END_SECTOR}s" 100% > /dev/null 2>&1 + parted -s $SDCARD set 1 esp on + partprobe $SDCARD > /dev/null 2>&1 + mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO > /dev/null 2>&1 + mkfs.btrfs -m single -L ROOT_MNJRO "${SDCARD}${SDDEV}p2" > /dev/null 2>&1 + + # Create and mount the subvolumes + info "Creating btrfs subvolumes..." + mkdir -p $TMPDIR/root + mkdir -p $TMPDIR/boot/efi + mount ${SDCARD}${SDDEV}1 $TMPDIR/boot/efi + mount -o compress=zstd "${SDCARD}${SDDEV}2" $TMPDIR/root + btrfs su cr $TMPDIR/root/@ > /dev/null 2>&1 + btrfs su cr $TMPDIR/root/@home > /dev/null 2>&1 + umount $TMPDIR/root + mount -o compress=zstd,subvol=@ "${SDCARD}${SDDEV}2" $TMPDIR/root + mkdir -p $TMPDIR/root/home + mount -o compress=zstd,subvol=@home "${SDCARD}${SDDEV}2" $TMPDIR/root/home + ;; + *) + parted -s $SDCARD mkpart primary btrfs "${END_SECTOR}s" 100% 1> /dev/null 2>&1 + partprobe $SDCARD 1> /dev/null 2>&1 + mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO 1> /dev/null 2>&1 + mkfs.btrfs -m single -L ROOT_MNJRO -f "${SDCARD}${SDDEV}2" 1> /dev/null 2>&1 - mkdir -p $TMPDIR/root - mkdir -p $TMPDIR/boot - # Do subvolumes - mount -o compress=zstd "${SDCARD}${SDDEV}2" $TMPDIR/root - btrfs su cr $TMPDIR/root/@ 1> /dev/null 2>&1 - btrfs su cr $TMPDIR/root/@home 1> /dev/null 2>&1 - umount $TMPDIR/root - mount -o compress=zstd,subvol=@ "${SDCARD}${SDDEV}2" $TMPDIR/root - mkdir -p $TMPDIR/root/home - mount -o compress=zstd,subvol=@home "${SDCARD}${SDDEV}2" $TMPDIR/root/home - mount ${SDCARD}${SDDEV}1 $TMPDIR/boot + mkdir -p $TMPDIR/root + mkdir -p $TMPDIR/boot + # Do subvolumes + mount -o compress=zstd "${SDCARD}${SDDEV}2" $TMPDIR/root + btrfs su cr $TMPDIR/root/@ 1> /dev/null 2>&1 + btrfs su cr $TMPDIR/root/@home 1> /dev/null 2>&1 + umount $TMPDIR/root + mount -o compress=zstd,subvol=@ "${SDCARD}${SDDEV}2" $TMPDIR/root + mkdir -p $TMPDIR/root/home + mount -o compress=zstd,subvol=@home "${SDCARD}${SDDEV}2" $TMPDIR/root/home + mount ${SDCARD}${SDDEV}1 $TMPDIR/boot + ;; + esac ;; f2fs) - parted -s $SDCARD mkpart primary f2fs "${END_SECTOR}s" 100% 1> /dev/null 2>&1 - partprobe $SDCARD 1> /dev/null 2>&1 - mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO 1> /dev/null 2>&1 - mkfs.f2fs -f -l ROOT_MNJRO -O extra_attr,inode_checksum,sb_checksum,compression "${SDCARD}${SDDEV}2" 1> /dev/null 2>&1 + case "$DEVICE" in + generic-efi) + parted -s $SDCARD mkpart primary f2fs "${END_SECTOR}s" 100% > /dev/null 2>&1 + parted -s $SDCARD set 1 esp on + partprobe $SDCARD > /dev/null 2>&1 + mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO > /dev/null 2>&1 + mkfs.f2fs -f -l ROOT_MNJRO -O extra_attr,inode_checksum,sb_checksum,compression "${SDCARD}${SDDEV}2" 1> /dev/null 2>&1 + mkdir -p $TMPDIR/root + mkdir -p $TMPDIR/boot/efi + mount ${SDCARD}${SDDEV}1 $TMPDIR/boot/efi + mount -t f2fs ${SDCARD}${SDDEV}2 $TMPDIR/root + ;; + *) + parted -s $SDCARD mkpart primary f2fs "${END_SECTOR}s" 100% 1> /dev/null 2>&1 + partprobe $SDCARD 1> /dev/null 2>&1 + mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO 1> /dev/null 2>&1 + mkfs.f2fs -f -l ROOT_MNJRO -O extra_attr,inode_checksum,sb_checksum,compression "${SDCARD}${SDDEV}2" 1> /dev/null 2>&1 - mkdir -p $TMPDIR/root - mkdir -p $TMPDIR/boot - mount ${SDCARD}${SDDEV}1 $TMPDIR/boot - mount -t f2fs ${SDCARD}${SDDEV}2 $TMPDIR/root + mkdir -p $TMPDIR/root + mkdir -p $TMPDIR/boot + mount ${SDCARD}${SDDEV}1 $TMPDIR/boot + mount -t f2fs ${SDCARD}${SDDEV}2 $TMPDIR/root + ;; + esac ;; ext4) - parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100% 1> /dev/null 2>&1 - partprobe $SDCARD 1> /dev/null 2>&1 - mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO 1> /dev/null 2>&1 + case "$DEVICE" in + generic-efi) + parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100% > /dev/null 2>&1 + parted -s $SDCARD set 1 esp on + partprobe $SDCARD > /dev/null 2>&1 + mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO > /dev/null 2>&1 + mkfs.ext4 -O ^metadata_csum,^64bit "${SDCARD}${SDDEV}2" -L ROOT_MNJRO > /dev/null 2>&1 + mkdir -p $TMPDIR/root + mkdir -p $TMPDIR/boot/efi + mount ${SDCARD}${SDDEV}1 $TMPDIR/boot/efi + mount ${SDCARD}${SDDEV}2 $TMPDIR/root + ;; + *) + parted -s $SDCARD mkpart primary ext4 "${END_SECTOR}s" 100% 1> /dev/null 2>&1 + partprobe $SDCARD 1> /dev/null 2>&1 + mkfs.vfat "${SDCARD}${SDDEV}1" -n BOOT_MNJRO 1> /dev/null 2>&1 - if [[ "$CRYPT" != "yes" ]]; then - mkfs.ext4 -O ^metadata_csum,^64bit "${SDCARD}${SDDEV}2" -L ROOT_MNJRO 1> /dev/null 2>&1 - else - info "Create encryption password:" - cryptsetup luksFormat -q "${SDCARD}${SDDEV}2" - info "Confirm encryption password:" - cryptsetup open "${SDCARD}${SDDEV}2" ROOT_MNJRO - mkfs.ext4 -O ^metadata_csum,^64bit /dev/mapper/ROOT_MNJRO 1> /dev/null 2>&1 - fi + if [[ "$CRYPT" != "yes" ]]; then + mkfs.ext4 -O ^metadata_csum,^64bit "${SDCARD}${SDDEV}2" -L ROOT_MNJRO 1> /dev/null 2>&1 + else + info "Create encryption password:" + cryptsetup luksFormat -q "${SDCARD}${SDDEV}2" + info "Confirm encryption password:" + cryptsetup open "${SDCARD}${SDDEV}2" ROOT_MNJRO + mkfs.ext4 -O ^metadata_csum,^64bit /dev/mapper/ROOT_MNJRO 1> /dev/null 2>&1 + fi - mkdir -p $TMPDIR/root - mkdir -p $TMPDIR/boot - mount ${SDCARD}${SDDEV}1 $TMPDIR/boot - if [[ "$CRYPT" != "yes" ]]; then - mount ${SDCARD}${SDDEV}2 $TMPDIR/root - else - [ ! -e /dev/mapper/ROOT_MNJRO ] && cryptsetup open "${SDCARD}${SDDEV}2" ROOT_MNJRO - mount /dev/mapper/ROOT_MNJRO $TMPDIR/root - fi + mkdir -p $TMPDIR/root + mkdir -p $TMPDIR/boot + mount ${SDCARD}${SDDEV}1 $TMPDIR/boot + if [[ "$CRYPT" != "yes" ]]; then + mount ${SDCARD}${SDDEV}2 $TMPDIR/root + else + [ ! -e /dev/mapper/ROOT_MNJRO ] && cryptsetup open "${SDCARD}${SDDEV}2" ROOT_MNJRO + mount /dev/mapper/ROOT_MNJRO $TMPDIR/root + fi + ;; + esac ;; esac } cleanup () { - msg "Writing bootloader and cleaning up after install..." - # Move boot files - mv $TMPDIR/root/boot/* $TMPDIR/boot + if [[ "$DEVICE" != "generic-efi" ]]; then + msg "Writing bootloader and cleaning up after install..." + # Move boot files + mv $TMPDIR/root/boot/* $TMPDIR/boot + fi # Flash bootloader case "$DEVICE" in oc2) @@ -421,7 +484,11 @@ cleanup () { # Change boot script and fstab to root partition UUID ROOT_PARTUUID=$(lsblk -p -o NAME,PARTUUID | grep ${DEV_NAME}${SDDEV}2 | awk '{print $2}') + ROOT_UUID=$(blkid | grep ${DEV_NAME}${SDDEV}2 | awk '{print $3}' | grep -oP "[^/]=\K.*" | sed 's/\"//g') info "Set root partition to $ROOT_PARTUUID in the relevant boot script and /etc/fstab..." + if [[ "$DEVICE" = "generic-efi" ]]; then + info "Set root partition to $ROOT_UUID in /boot/grub/grub.cfg..." + fi if [ -f $TMPDIR/boot/extlinux/extlinux.conf ]; then sed -i "s/LABEL=ROOT_MNJRO/PARTUUID=$ROOT_PARTUUID/g" $TMPDIR/boot/extlinux/extlinux.conf elif [ -f $TMPDIR/boot/efi/extlinux/extlinux.conf ]; then @@ -471,14 +538,134 @@ cleanup () { echo "PARTUUID=$ROOT_PARTUUID / $FSTYPE defaults 0 1" >> $TMPDIR/root/etc/fstab ;; esac + + if [[ "$DEVICE" = "generic-efi" ]]; then + sed -i "s|/boot|/boot/efi|g" $TMPDIR/root/etc/fstab + + msg "Setup GRUB for EFI..." + grub-install --target=arm64-efi --efi-directory=$TMPDIR/boot/efi --removable --boot-directory=$TMPDIR/root/boot --bootloader-id=grub ${SDCARD} + mkdir -p $TMPDIR/root/boot/grub + if [ -f $TMPDIR/root/boot/Image ]; then + KERNEL="/boot/Image" + INITRAMFS="/boot/initramfs-linux.img" + else + KERNEL="/boot/$(ls $TMPDIR/root/boot/ | grep vmlinuz)" + INITRAMFS="/boot/$(ls $TMPDIR/root/boot/ | grep initramfs | grep -v fallback)" + fi + echo "Kernel image is $KERNEL..." + echo "Initramfs image is $INITRAMFS..." + echo "Creating minimal grub configuration..." + echo '### BEGIN /etc/grub.d/00_header ### +insmod part_gpt +insmod part_msdos +if [ -s $prefix/grubenv ]; then + load_env +fi +if [ "${next_entry}" ] ; then + set default="${next_entry}" + set next_entry= + save_env next_entry + set boot_once=true +else + set default="${saved_entry}" +fi + +if [ x"${feature_menuentry_id}" = xy ]; then + menuentry_id_option="--id" +else + menuentry_id_option="" +fi + +export menuentry_id_option + +if [ "${prev_saved_entry}" ]; then + set saved_entry="${prev_saved_entry}" + save_env saved_entry + set prev_saved_entry= + save_env prev_saved_entry + set boot_once=true +fi + +function savedefault { + if [ -z "${boot_once}" ]; then + saved_entry="${chosen}" + save_env saved_entry + fi +} + +function load_video { + if [ x$feature_all_video_module = xy ]; then + insmod all_video + else + insmod efi_gop + insmod efi_uga + insmod ieee1275_fb + insmod vbe + insmod vga + insmod video_bochs + insmod video_cirrus + fi +} + +set menu_color_normal=white/black +set menu_color_highlight=green/black + +if [ x$feature_default_font_path = xy ] ; then + font=unicode +else +insmod part_gpt +insmod ext2 +search --no-floppy --fs-uuid --set=root $ROOT_UUID + font="/usr/share/grub/unicode.pf2" +fi + +if loadfont $font ; then + set gfxmode=auto + load_video + insmod gfxterm +fi +terminal_input console +terminal_output gfxterm +if [ x$feature_timeout_style = xy ] ; then + set timeout_style=menu + set timeout=5 +# Fallback normal timeout code in case the timeout_style feature is +# unavailable. +else + set timeout=5 +fi +### END /etc/grub.d/00_header ###' > $TMPDIR/root/boot/grub/grub.cfg + + echo "### BEGIN /etc/grub.d/10_linux ### +menuentry 'Manjaro ARM' --class manjaro --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-$ROOT_UUID' { + savedefault + load_video + set gfxpayload=keep + insmod gzio + insmod part_gpt + insmod ext2 + search --no-floppy --fs-uuid --set=root $ROOT_UUID + linux $(if [[ "$FILESYSTEM" = "btrfs" ]]; then echo "/@"; fi)$KERNEL root=UUID=$ROOT_UUID rw quiet splash plymouth.ignore-serial-consoles $(if [[ "$FSTYPE" = "btrfs" ]]; then echo "rootflags=subvol=@ rootfstype=btrfs"; fi) + initrd $(if [[ "$FILESYSTEM" = "btrfs" ]]; then echo "/@"; fi)$INITRAMFS +}" >> $TMPDIR/root/boot/grub/grub.cfg + fi + #clean up if [[ "$FSTYPE" = "btrfs" ]]; then umount $TMPDIR/root/home umount $TMPDIR/root - umount $TMPDIR/boot + if [[ "$DEVICE" = "generic-efi" ]]; then + umount $TMPDIR/boot/efi + else + umount $TMPDIR/boot + fi else umount $TMPDIR/root - umount $TMPDIR/boot + if [[ "$DEVICE" = "generic-efi" ]]; then + umount $TMPDIR/boot/efi + else + umount $TMPDIR/boot + fi if [[ "$CRYPT" = "yes" ]]; then cryptsetup close /dev/mapper/ROOT_MNJRO fi @@ -528,6 +715,7 @@ DEVICE=$(dialog --clear --title "Manjaro ARM Installer v${VERSION}" \ --menu "Choose a device:" 20 75 10 \ "clockworkpi-a06" "ClockworkPi DevTerm" \ "generic" "Generic" \ + "generic-efi" "Generic EFI" \ "gt1-ultimate" "Beelink GT1 Ultimate" \ "oc4" "Odroid C4" \ "oc2" "Odroid C2" \ @@ -733,12 +921,16 @@ else fi if [ ! -z "$SDCARD" ]; then - FSTYPE=$(dialog --clear --title "Manjaro ARM Installer v${VERSION}" \ - --menu "Choose a filesystem:" 10 90 10 \ - "ext4" "Regular ext4 filesystem for the root partition" \ - "btrfs" "Uses btrfs for root partition and makes / and /home subvolumes" \ - "f2fs" "Use f2fs for the root partition" \ - 3>&1 1>&2 2>&3 3>&-) + if [[ "$DEVICE" = "generic-efi" ]]; then + FSTYPE="ext4" + else + FSTYPE=$(dialog --clear --title "Manjaro ARM Installer v${VERSION}" \ + --menu "Choose a filesystem:" 10 90 10 \ + "ext4" "Regular ext4 filesystem for the root partition" \ + "btrfs" "Uses btrfs for root partition and makes / and /home subvolumes" \ + "f2fs" "Use f2fs for the root partition" \ + 3>&1 1>&2 2>&3 3>&-) + fi else clear exit 1