Merge branch 'feature/generic-efi-support' into 'master'

Add generic-efi device option

Closes #49

See merge request manjaro-arm/applications/manjaro-arm-installer!7
This commit is contained in:
Dan Johansen 2022-12-06 23:13:17 +00:00
commit 5f43d9dc62
2 changed files with 252 additions and 58 deletions

View File

@ -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

View File

@ -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