mkimg.sh 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #!/bin/sh
  2. # Build disk image and populate boot data
  3. # Copyright Brian Conway <bconway@rcesoftware.com>, see LICENSE for details
  4. if [ -n "${com0sp+1}" ]; then
  5. COM0="com0_${com0sp}-"
  6. else
  7. COM0=
  8. fi
  9. IMAGE=resflash-${MACHINE}-${imgsizemb}MB-${COM0}${DATE}.img
  10. echo "Creating disk image: ${IMAGE}"
  11. # Build the disk image
  12. dd if=/dev/zero of=${IMAGE} bs=1m count=0 seek=${imgsizemb} status=none
  13. get_next_vnd
  14. imgvnd=${NEXTVND}
  15. vnconfig ${imgvnd} ${IMAGE} > /dev/null
  16. # Fdisk the image
  17. # CHS is bogus, we're not going to deal with it and require an LBA-aware BIOS
  18. ${ESCECHO} "e 0\n${DOSPARTID}\n\n${DOSSTART}\n\
  19. $((DOSPARTMB * 1024 * 1024 / BYTESECT))\ne 3\nA6\n\n\
  20. $((DOSPARTMB * 1024 * 1024 / BYTESECT + DOSSTART))\n*\n\
  21. flag ${FLAGPART}\n\
  22. update\n\
  23. write\n\
  24. exit\n"|fdisk -e ${imgvnd} >> ${BUILDPATH}/00.mkimg.00.fdisk.img 2>&1
  25. if [ -f ${basedir}/usr/mdec/mbr ]; then
  26. fdisk -uy -f ${basedir}/usr/mdec/mbr ${imgvnd} >> \
  27. ${BUILDPATH}/00.mkimg.01.fdisk.updatembr 2>&1
  28. fi
  29. fdisk -v ${imgvnd} >> ${BUILDPATH}/00.mkimg.02.fdisk.out 2>&1
  30. # Build the disklabel: ${MBRPARTMB} MB /mbr, optional swap, two /, 100+ MB /cfg
  31. dlroot=$(bc -e "${fssizekb} * 1024 / ${BYTESECT}" -e quit)
  32. if [ ${swapsizemb} -gt 0 ]; then
  33. dlswap=$(bc -e "${swapsizemb} * 1024 * 1024 / ${BYTESECT}" -e quit)
  34. addswap="a b\n\n${dlswap}\n\n"
  35. fi
  36. ${ESCECHO} "a a\n$((MBRSTART * 1024 * 1024 / BYTESECT))\n\
  37. $((MBRPARTMB * 1024 * 1024 / BYTESECT))\n\n\
  38. ${addswap}\
  39. a d\n\n${dlroot}\n\n\
  40. a e\n\n${dlroot}\n\n\
  41. a f\n\n\n\n\
  42. q\n\n"|disklabel -E ${imgvnd} >> ${BUILDPATH}/00.mkimg.03.disklabel.img 2>&1
  43. disklabel ${imgvnd} >> ${BUILDPATH}/00.mkimg.04.disklabel.out 2>&1
  44. # Create /mbr, /cfg, and /${DOSMNT} filesystems and mount
  45. mkdir -p ${BUILDPATH}/mbr ${BUILDPATH}/cfg ${BUILDPATH}/${DOSMNT}
  46. newfs -O 2 ${imgvnd}a >> ${BUILDPATH}/00.mkimg.05.newfs.a 2>&1
  47. newfs -O 2 ${imgvnd}f >> ${BUILDPATH}/00.mkimg.06.newfs.f 2>&1
  48. newfs_msdos -L ${DOSMNT} ${imgvnd}i >> ${BUILDPATH}/00.mkimg.07.newfs.i 2>&1
  49. mount -o noatime /dev/${imgvnd}a ${BUILDPATH}/mbr
  50. mount -o noatime /dev/${imgvnd}f ${BUILDPATH}/cfg
  51. mount -o noatime /dev/${imgvnd}i ${BUILDPATH}/${DOSMNT}
  52. mkdir -p ${BUILDPATH}/mbr/etc ${BUILDPATH}/cfg/{etc,var} \
  53. ${BUILDPATH}/cfg/upgrade_overlay/{etc,home,root,var} \
  54. ${BUILDPATH}/${DOSMNT}/${DOSBOOTDIR}
  55. chmod 700 ${BUILDPATH}/cfg/upgrade_overlay/root
  56. # Install biosboot(8), boot(8) on amd64/i386, boot scaffold on arm64, and
  57. # boot.conf most places
  58. if [ ${MACHINE} = 'amd64' ] || [ ${MACHINE} = 'i386' ]; then
  59. # Binaries for installboot, biosboot(8), and boot(8) must be in sync, run from
  60. # current install
  61. if [ ${CROSSARCH} -eq 0 ]; then
  62. installboot -v -r ${BUILDPATH}/mbr ${imgvnd} /usr/mdec/biosboot \
  63. /usr/mdec/boot >> ${BUILDPATH}/00.mkimg.08.installboot.pc 2>&1
  64. else
  65. # Cross-arch installboot may fail silently if releases differ
  66. installboot -v -r ${BUILDPATH}/mbr ${imgvnd} ${basedir}/usr/mdec/biosboot \
  67. ${basedir}/usr/mdec/boot >> ${BUILDPATH}/00.mkimg.09.installboot.cross 2>&1
  68. fi
  69. echo 'set device hd0d' >> ${BUILDPATH}/mbr/etc/boot.conf
  70. elif [ ${MACHINE} = 'arm64' ]; then
  71. mkdir -p ${BUILDPATH}/${DOSMNT}/overlays
  72. cp /usr/local/share/raspberrypi-firmware/boot/bcm2710-rpi-2-b.dtb \
  73. ${BUILDPATH}/${DOSMNT}/
  74. cp /usr/local/share/raspberrypi-firmware/boot/bcm2710-rpi-3-b.dtb \
  75. ${BUILDPATH}/${DOSMNT}/
  76. cp /usr/local/share/raspberrypi-firmware/boot/bcm2710-rpi-3-b-plus.dtb \
  77. ${BUILDPATH}/${DOSMNT}/
  78. cp /usr/local/share/raspberrypi-firmware/boot/bcm2710-rpi-cm3.dtb \
  79. ${BUILDPATH}/${DOSMNT}/
  80. cp /usr/local/share/raspberrypi-firmware/boot/bcm2711-rpi-4-b.dtb \
  81. ${BUILDPATH}/${DOSMNT}/
  82. cp /usr/local/share/raspberrypi-firmware/boot/bcm2711-rpi-400.dtb \
  83. ${BUILDPATH}/${DOSMNT}/
  84. cp /usr/local/share/raspberrypi-firmware/boot/bcm2711-rpi-cm4.dtb \
  85. ${BUILDPATH}/${DOSMNT}/
  86. cp /usr/local/share/raspberrypi-firmware/boot/bootcode.bin \
  87. ${BUILDPATH}/${DOSMNT}/
  88. cp /usr/local/share/raspberrypi-firmware/boot/start.elf \
  89. ${BUILDPATH}/${DOSMNT}/
  90. cp /usr/local/share/raspberrypi-firmware/boot/start4.elf \
  91. ${BUILDPATH}/${DOSMNT}/
  92. cp /usr/local/share/raspberrypi-firmware/boot/fixup.dat \
  93. ${BUILDPATH}/${DOSMNT}/
  94. cp /usr/local/share/raspberrypi-firmware/boot/fixup4.dat \
  95. ${BUILDPATH}/${DOSMNT}/
  96. cp /usr/local/share/raspberrypi-firmware/boot/overlays/disable-bt.dtbo \
  97. ${BUILDPATH}/${DOSMNT}/overlays/
  98. cp /usr/local/share/u-boot/rpi_arm64/u-boot.bin ${BUILDPATH}/${DOSMNT}/
  99. dd if=/usr/local/share/u-boot/pine64_plus/u-boot-sunxi-with-spl.bin \
  100. of=/dev/r${imgvnd}c bs=1024 seek=8 conv=sync >> \
  101. ${BUILDPATH}/00.mkimg.10.dd.sunxi 2>&1
  102. echo 'set device sd0d' >> ${BUILDPATH}/mbr/etc/boot.conf
  103. echo ${DOSBOOTBINS} >> ${BUILDPATH}/${DOSMNT}/${DOSBOOTDIR}/startup.nsh
  104. echo 'arm_64bit=1' >> ${BUILDPATH}/${DOSMNT}/config.txt
  105. echo 'enable_uart=1' >> ${BUILDPATH}/${DOSMNT}/config.txt
  106. echo 'dtoverlay=disable-bt' >> ${BUILDPATH}/${DOSMNT}/config.txt
  107. echo 'kernel=u-boot.bin' >> ${BUILDPATH}/${DOSMNT}/config.txt
  108. fi
  109. # Install ${DOSBOOTBINS} bootloaders manually due to MBR, if available
  110. for bootbin in ${DOSBOOTBINS}; do
  111. if [ -f ${basedir}/usr/mdec/${bootbin} ]; then
  112. cp ${basedir}/usr/mdec/${bootbin} ${BUILDPATH}/${DOSMNT}/${DOSBOOTDIR}/
  113. fi
  114. done
  115. # Set com0 console on arches that default to ttyC*, if directed
  116. if [ -n "${com0sp+1}" ] && [ ${MACHINE} != 'arm64' ]; then
  117. # Change speed first to skip extra 5s wait
  118. echo "stty com0 ${com0sp}" >> ${BUILDPATH}/mbr/etc/boot.conf
  119. echo 'set tty com0' >> ${BUILDPATH}/mbr/etc/boot.conf
  120. fi