Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # https://blog.heckel.xyz/2017/05/28/creating-a-bios-gpt-and-uefi-gpt-grub-bootable-linux-system/#mkbiosefi.sh
- DISK=$1
- BOOTLABEL=$2
- ROOTDIR=$3
- if [ -z "$DISK" -o -z "$BOOTLABEL" ]; then
- echo "Syntax: $0 <image|disk> <root-label> [<chroot-dir>]"
- exit 1
- fi
- if [ "$UID" != "0" ]; then
- echo "Must be root."
- exit 1
- fi
- # Exit on errors
- set -xe
- # Install dependencies
- apt-get install -y --force-yes \
- debootstrap \
- gdisk \
- rsync \
- grub-efi-amd64-bin \
- e2fsprogs
- # Create chroot (if requested)
- if [ -z "$ROOTDIR" ]; then
- ROOTDIR=chroot/
- # Bootstrap minimal system
- debootstrap --variant=minbase xenial chroot
- # Install kernel and grub
- for d in dev sys proc; do mount --bind /$d chroot/$d; done
- DEBIAN_FRONTEND=noninteractive chroot chroot apt-get install linux-image-generic grub-pc -y --force-yes
- umount chroot/{dev,proc,sys}
- fi
- # Create sparse file (if we're not dealing with a block device)
- if [ ! -b "${DISK}" ]; then
- truncate --size 30G $DISK
- fi
- # Create partition layout
- sgdisk --clear \
- --new 1::+1M --typecode=1:ef02 --change-name=1:'BIOS boot partition' \
- --new 2::+100M --typecode=2:ef00 --change-name=2:'EFI System' \
- --new 3::-0 --typecode=3:8300 --change-name=3:'Linux root filesystem' \
- $DISK
- # Loop sparse file
- LOOPDEV=$(losetup --find --show $DISK)
- partprobe ${LOOPDEV}
- # Create filesystems
- mkfs.fat -F32 ${LOOPDEV}p2
- mkfs.ext4 -F -L "${BOOTLABEL}" ${LOOPDEV}p3
- # Mount OS partition, copy chroot, install grub
- MOUNTDIR=$(mktemp -d -t demoXXXXXX)
- mount ${LOOPDEV}p3 ${MOUNTDIR}
- rsync -a ${ROOTDIR}/ ${MOUNTDIR}/
- for d in dev sys proc; do mount --bind /$d ${MOUNTDIR}/$d; done
- chroot ${MOUNTDIR}/ grub-install --modules="ext2 part_gpt" ${LOOPDEV}
- chroot ${MOUNTDIR}/ update-grub
- umount $MOUNTDIR/{dev,proc,sys,}
- rmdir $MOUNTDIR
- # Mount EFI partition
- MOUNTDIR=$(mktemp -d -t demoXXXXXX)
- mount ${LOOPDEV}p2 $MOUNTDIR
- mkdir -p ${MOUNTDIR}/EFI/BOOT
- grub-mkimage \
- -d /usr/lib/grub/x86_64-efi \
- -o ${MOUNTDIR}/EFI/BOOT/bootx64.efi \
- -p /efi/boot \
- -O x86_64-efi \
- fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop \
- efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background \
- gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf
- # Create grub config
- cat <<GRUBCFG > ${MOUNTDIR}/EFI/BOOT/grub.cfg
- search --label "${BOOTLABEL}" --set prefix
- configfile (\$prefix)/boot/grub/grub.cfg
- GRUBCFG
- umount $MOUNTDIR
- rmdir $MOUNTDIR
- # Remove loop device
- sync ${LOOPDEV}
- losetup -d ${LOOPDEV}
- echo "Done. ${DISK} is ready to be booted via BIOS and UEFI."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement