build-image-extlinux.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. for dir in "/usr/lib/syslinux/bios" "/usr/lib/syslinux" "/usr/share/syslinux"; do
  13. if [ -d $dir ]; then
  14. syslinux_dir=$dir
  15. break
  16. fi
  17. done
  18. if [ -z $syslinux_dir ]; then
  19. echo "can't find syslinux directory"
  20. exit 1
  21. fi
  22. disk_usage() {
  23. if [ "$(uname -s)" = "Darwin" ]; then
  24. du -sm "$1" | cut -f1
  25. else
  26. du -sm --apparent-size "$1" | cut -f1
  27. fi
  28. }
  29. DISK_SIZE=$(($(disk_usage "$SERENITY_SOURCE_DIR/Base") + $(disk_usage Root) + 300))
  30. echo "setting up disk image..."
  31. dd if=/dev/zero of=extlinux_disk_image bs=1M count="${DISK_SIZE:-800}" status=none || die "couldn't create disk image"
  32. chown "$SUDO_UID":"$SUDO_GID" extlinux_disk_image || die "couldn't adjust permissions on disk image"
  33. echo "done"
  34. printf "creating loopback device... "
  35. dev=$(losetup --find --partscan --show extlinux_disk_image)
  36. if [ -z "$dev" ]; then
  37. die "couldn't mount loopback device"
  38. fi
  39. echo "loopback device is at ${dev}"
  40. cleanup() {
  41. if [ -d mnt ]; then
  42. printf "unmounting filesystem... "
  43. umount mnt || ( sleep 1 && sync && umount mnt )
  44. rmdir mnt
  45. echo "done"
  46. fi
  47. if [ -e "${dev}" ]; then
  48. printf "cleaning up loopback device... "
  49. losetup -d "${dev}"
  50. echo "done"
  51. fi
  52. }
  53. trap cleanup EXIT
  54. printf "creating partition table... "
  55. parted -s "${dev}" mklabel msdos mkpart primary ext2 32k 100% -a minimal set 1 boot on || die "couldn't partition disk"
  56. partition_number="p1"
  57. echo "done"
  58. printf "destroying old filesystem... "
  59. dd if=/dev/zero of="${dev}${partition_number}" bs=1M count=1 status=none || die "couldn't destroy old filesystem"
  60. echo "done"
  61. printf "creating new filesystem... "
  62. mke2fs -q -I 128 "${dev}${partition_number}" || die "couldn't create filesystem"
  63. echo "done"
  64. printf "mounting filesystem... "
  65. mkdir -p mnt
  66. mount "${dev}${partition_number}" mnt/ || die "couldn't mount filesystem"
  67. echo "done"
  68. script_path=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
  69. "$script_path/build-root-filesystem.sh"
  70. if [ -z "$1" ]; then
  71. extlinux_cfg="$SERENITY_SOURCE_DIR"/Meta/extlinux.conf
  72. else
  73. extlinux_cfg=$1
  74. fi
  75. echo "installing extlinux with $extlinux_cfg..."
  76. mkdir -p mnt/boot/extlinux
  77. extlinux --install mnt/boot/extlinux
  78. cp "$extlinux_cfg" mnt/boot/extlinux/extlinux.conf
  79. for module in mboot.c32 menu.c32 libutil.c32 libcom32.c32; do
  80. cp $syslinux_dir/$module mnt/boot/extlinux/
  81. done
  82. dd bs=440 count=1 conv=notrunc if=$syslinux_dir/mbr.bin of="$dev"
  83. echo "done"