Advertisement
Guest User

mkbiosefi

a guest
Jan 28th, 2019
438
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.68 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # https://blog.heckel.xyz/2017/05/28/creating-a-bios-gpt-and-uefi-gpt-grub-bootable-linux-system/#mkbiosefi.sh
  4.  
  5. DISK=$1
  6. BOOTLABEL=$2
  7. ROOTDIR=$3
  8.  
  9. if [ -z "$DISK" -o -z "$BOOTLABEL" ]; then
  10.   echo "Syntax: $0 <image|disk> <root-label> [<chroot-dir>]"
  11.   exit 1
  12. fi
  13.  
  14. if [ "$UID" != "0" ]; then
  15.   echo "Must be root."
  16.   exit 1
  17. fi
  18.  
  19. # Exit on errors
  20. set -xe
  21.  
  22. # Install dependencies
  23. apt-get install -y --force-yes \
  24.   debootstrap \
  25.   gdisk \
  26.   rsync \
  27.   grub-efi-amd64-bin \
  28.   e2fsprogs
  29.  
  30. # Create chroot (if requested)
  31. if [ -z "$ROOTDIR" ]; then
  32.   ROOTDIR=chroot/
  33.  
  34.   # Bootstrap minimal system
  35.   debootstrap --variant=minbase xenial chroot
  36.  
  37.   # Install kernel and grub
  38.   for d in dev sys proc; do mount --bind /$d chroot/$d; done
  39.   DEBIAN_FRONTEND=noninteractive chroot chroot apt-get install linux-image-generic grub-pc -y --force-yes
  40.   umount chroot/{dev,proc,sys}
  41. fi
  42.  
  43. # Create sparse file (if we're not dealing with a block device)
  44. if [ ! -b "${DISK}" ]; then
  45.   truncate --size 30G $DISK
  46. fi
  47.  
  48. # Create partition layout
  49. sgdisk --clear \
  50.   --new 1::+1M --typecode=1:ef02 --change-name=1:'BIOS boot partition' \
  51.   --new 2::+100M --typecode=2:ef00 --change-name=2:'EFI System' \
  52.   --new 3::-0 --typecode=3:8300 --change-name=3:'Linux root filesystem' \
  53.   $DISK
  54.  
  55. # Loop sparse file
  56. LOOPDEV=$(losetup --find --show $DISK)
  57. partprobe ${LOOPDEV}
  58.  
  59. # Create filesystems
  60. mkfs.fat -F32 ${LOOPDEV}p2
  61. mkfs.ext4 -F -L "${BOOTLABEL}" ${LOOPDEV}p3
  62.  
  63. # Mount OS partition, copy chroot, install grub
  64. MOUNTDIR=$(mktemp -d -t demoXXXXXX)
  65. mount ${LOOPDEV}p3 ${MOUNTDIR}
  66.  
  67. rsync -a ${ROOTDIR}/ ${MOUNTDIR}/
  68.  
  69. for d in dev sys proc; do mount --bind /$d ${MOUNTDIR}/$d; done
  70. chroot ${MOUNTDIR}/ grub-install --modules="ext2 part_gpt" ${LOOPDEV}
  71. chroot ${MOUNTDIR}/ update-grub
  72.  
  73. umount $MOUNTDIR/{dev,proc,sys,}
  74. rmdir $MOUNTDIR
  75.  
  76. # Mount EFI partition
  77. MOUNTDIR=$(mktemp -d -t demoXXXXXX)
  78. mount ${LOOPDEV}p2 $MOUNTDIR
  79.  
  80. mkdir -p ${MOUNTDIR}/EFI/BOOT
  81. grub-mkimage \
  82.   -d /usr/lib/grub/x86_64-efi \
  83.   -o ${MOUNTDIR}/EFI/BOOT/bootx64.efi \
  84.   -p /efi/boot \
  85.   -O x86_64-efi \
  86.     fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop \
  87.     efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background \
  88.     gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf
  89.  
  90. # Create grub config
  91. cat <<GRUBCFG > ${MOUNTDIR}/EFI/BOOT/grub.cfg
  92. search --label "${BOOTLABEL}" --set prefix
  93. configfile (\$prefix)/boot/grub/grub.cfg
  94. GRUBCFG
  95.  
  96. umount $MOUNTDIR
  97. rmdir $MOUNTDIR
  98.  
  99. # Remove loop device
  100. sync ${LOOPDEV}
  101. losetup -d ${LOOPDEV}
  102.  
  103. echo "Done. ${DISK} is ready to be booted via BIOS and UEFI."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement