build-image-grub.sh 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/bin/sh
  2. set -e
  3. die() {
  4. echo "die: $*"
  5. exit 1
  6. }
  7. if [ "$(id -u)" != 0 ]; then
  8. exec sudo -E -- "$0" "$@" || die "this script needs to run as root"
  9. else
  10. : "${SUDO_UID:=0}" "${SUDO_GID:=0}"
  11. fi
  12. grub=$(command -v grub-install 2>/dev/null) || true
  13. if [ -z "$grub" ]; then
  14. grub=$(command -v grub2-install 2>/dev/null) || true
  15. fi
  16. if [ -z "$grub" ]; then
  17. echo "can't find a grub-install or grub2-install binary, oh no"
  18. exit 1
  19. fi
  20. echo "using grub-install at ${grub}"
  21. disk_usage() {
  22. if [ "$(uname -s)" = "Darwin" ]; then
  23. du -sm "$1" | cut -f1
  24. else
  25. du -sm --apparent-size "$1" | cut -f1
  26. fi
  27. }
  28. DISK_SIZE=$(($(disk_usage "$SERENITY_SOURCE_DIR/Base") + $(disk_usage Root) + 300))
  29. echo "setting up disk image..."
  30. if [ "$1" = "ebr" ]; then
  31. DISK_SIZE=
  32. fi
  33. dd if=/dev/zero of=grub_disk_image bs=1M count="${DISK_SIZE:-800}" status=none || die "couldn't create disk image"
  34. chown "$SUDO_UID":"$SUDO_GID" grub_disk_image || die "couldn't adjust permissions on disk image"
  35. echo "done"
  36. printf "creating loopback device... "
  37. dev=$(losetup --find --partscan --show grub_disk_image)
  38. if [ -z "$dev" ]; then
  39. die "couldn't mount loopback device"
  40. fi
  41. echo "loopback device is at ${dev}"
  42. cleanup() {
  43. if [ -d mnt ]; then
  44. printf "unmounting filesystem... "
  45. umount mnt || ( sleep 1 && sync && umount mnt )
  46. rmdir mnt
  47. echo "done"
  48. fi
  49. if [ -e "${dev}" ]; then
  50. printf "cleaning up loopback device... "
  51. losetup -d "${dev}"
  52. echo "done"
  53. fi
  54. }
  55. trap cleanup EXIT
  56. printf "creating partition table... "
  57. if [ "$1" = "mbr" ]; then
  58. parted -s "${dev}" mklabel msdos mkpart primary ext2 1MiB 100% -a minimal set 1 boot on || die "couldn't partition disk"
  59. partition_number="p1"
  60. partition_scheme="mbr"
  61. elif [ "$1" = "gpt" ]; then
  62. parted -s "${dev}" mklabel gpt mkpart BIOSBOOT ext3 1MiB 8MiB mkpart OS ext2 8MiB 290MiB set 1 bios_grub || die "couldn't partition disk"
  63. partition_number="p2"
  64. partition_scheme="gpt"
  65. elif [ "$1" = "ebr" ]; then
  66. parted -s "${dev}" mklabel msdos mkpart primary 32k 200MiB mkpart primary 200MiB 201MiB mkpart primary 201MiB 202MiB mkpart extended 250MiB 739MiB mkpart logical 372MiB 739MiB -a minimal set 1 boot on || die "couldn't partition disk"
  67. partition_number="p5"
  68. partition_scheme="ebr"
  69. else
  70. parted -s "${dev}" mklabel msdos mkpart primary ext2 1MiB 100% -a minimal set 1 boot on || die "couldn't partition disk"
  71. partition_number="p1"
  72. partition_scheme="mbr"
  73. fi
  74. echo "done"
  75. printf "destroying old filesystem... "
  76. dd if=/dev/zero of="${dev}${partition_number}" bs=1M count=1 status=none || die "couldn't destroy old filesystem"
  77. echo "done"
  78. printf "creating new filesystem... "
  79. mke2fs -q -I 128 "${dev}${partition_number}" || die "couldn't create filesystem"
  80. echo "done"
  81. printf "mounting filesystem... "
  82. mkdir -p mnt
  83. mount "${dev}${partition_number}" mnt/ || die "couldn't mount filesystem"
  84. echo "done"
  85. script_path=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
  86. "$script_path/build-root-filesystem.sh"
  87. if [ -z "$2" ]; then
  88. grub_cfg="$SERENITY_SOURCE_DIR"/Meta/grub-"${partition_scheme}".cfg
  89. else
  90. grub_cfg=$2
  91. fi
  92. echo "installing grub using $grub with $grub_cfg..."
  93. $grub --boot-directory=mnt/boot --target=i386-pc --modules="ext2 part_msdos" "${dev}"
  94. if [ -d mnt/boot/grub2 ]; then
  95. cp "$grub_cfg" mnt/boot/grub2/grub.cfg
  96. else
  97. cp "$grub_cfg" mnt/boot/grub/grub.cfg
  98. fi
  99. echo "done"