mkimage.sh.in 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/bin/sh
  2. #-
  3. # Copyright (c) 2013 Juan Romero Pardines.
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions
  8. # are met:
  9. # 1. Redistributions of source code must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. # 2. Redistributions in binary form must reproduce the above copyright
  12. # notice, this list of conditions and the following disclaimer in the
  13. # documentation and/or other materials provided with the distribution.
  14. #
  15. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  16. # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  17. # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  18. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  19. # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20. # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  21. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  22. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  24. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. #-
  26. readonly PROGNAME=$(basename $0)
  27. readonly ARCH=$(uname -m)
  28. trap 'printf "\nInterrupted! exiting...\n"; cleanup; exit 0' INT TERM HUP
  29. cleanup() {
  30. umount -f ${ROOTFSDIR}/boot 2>/dev/null
  31. umount -f ${ROOTFSDIR} 2>/dev/null
  32. if [ -e "$LOOPDEV" ]; then
  33. partx -d $LOOPDEV 2>/dev/null
  34. losetup -d $LOOPDEV 2>/dev/null
  35. fi
  36. [ -d "$ROOTFSDIR" ] && rmdir $ROOTFSDIR
  37. }
  38. info_msg() {
  39. printf "\033[1m$@\n\033[m"
  40. }
  41. die() {
  42. echo "FATAL: $@"
  43. exit 1
  44. }
  45. usage() {
  46. echo "Usage: $PROGNAME [-b fstype] [-o filename] [-r fstype] [-hV] <rootfs-tarball> [size]"
  47. echo
  48. echo " The <rootfs-tarball> argument expects a file generated by void-mkrootfs."
  49. echo " The <size> argument expects a number (GB). If <size> is not set, defaults to 2."
  50. echo
  51. echo "OPTIONS"
  52. echo " -b <fstype> Set /boot <fstype> (defaults to FAT, 32MB)"
  53. echo " -o <filename> Set output <filename>."
  54. echo " -r <fstype> Set / <fstype> (defaults to ext4, 32MB - <size>)"
  55. echo " -p <platform> Set platform type: cubieboard2, rpi, odroid-u2"
  56. echo
  57. echo " Resulting image will have 2 partitions, /boot and / of total <size>."
  58. exit 0
  59. }
  60. #
  61. # main()
  62. #
  63. while getopts "b:o:r:p:hV" opt; do
  64. case $opt in
  65. b) BOOT_FSTYPE="$OPTARG";;
  66. o) FILENAME="$OPTARG";;
  67. r) ROOT_FSTYPE="$OPTARG";;
  68. p) PLATFORM="$OPTARG";;
  69. V) echo "$PROGNAME @@MKLIVE_VERSION@@"; exit 0;;
  70. h) usage;;
  71. esac
  72. done
  73. shift $(($OPTIND - 1))
  74. ROOTFS_TARBALL="$1"
  75. if [ -z "$ROOTFS_TARBALL" ]; then
  76. usage
  77. elif [ ! -r "$ROOTFS_TARBALL" ]; then
  78. die "Cannot read rootfs tarball: $ROOTFS_TARBALL"
  79. fi
  80. if [ "$(id -u)" -ne 0 ]; then
  81. die "need root perms to continue, exiting."
  82. fi
  83. IMGSIZE="$2"
  84. if [ -z "$IMGSIZE" ]; then
  85. IMGSIZE="2G"
  86. else
  87. IMGSIZE="${2}G"
  88. fi
  89. if [ -z "$BOOT_FSTYPE" ]; then
  90. BOOT_FSTYPE="vfat"
  91. fi
  92. if [ -z "$ROOT_FSTYPE" ]; then
  93. ROOT_FSTYPE="ext4"
  94. fi
  95. if [ -z "$FILENAME" ]; then
  96. FILENAME="void-image-$(date +%Y%m%d).img"
  97. fi
  98. case "$PLATFORM" in
  99. cubieboard2|odroid-u2|rpi);;
  100. *) die "Unknown platform or platform unset, set it with -p!"
  101. esac
  102. for f in parted partx losetup mount mkfs.${BOOT_FSTYPE} mkfs.${ROOT_FSTYPE}; do
  103. if ! which ${f} >/dev/null; then
  104. die "Cannot find ${f}, exiting."
  105. fi
  106. done
  107. # dd conv=sparse support first appeared in coreutils-8.16, disable it in
  108. # older versions.
  109. DD_VERSION=$(dd --version|head -n1|awk '{print $3}')
  110. case "$DD_VERSION" in
  111. [8-9].1[6-9]*|[8-9].[2-9]*) DD_SPARSE="conv=sparse";;
  112. esac
  113. info_msg "Creating disk image ($IMGSIZE) ..."
  114. dd if=/dev/zero of=$FILENAME bs=$IMGSIZE count=1 ${DD_SPARSE} >/dev/null 2>&1
  115. info_msg "Creating disk image partitions/filesystems ..."
  116. parted $FILENAME mktable msdos
  117. if [ "$BOOT_FSTYPE" = "vfat" ]; then
  118. _btype="fat32"
  119. _args="-I"
  120. fi
  121. parted $FILENAME mkpart primary ${_btype} 4096s 64M
  122. parted $FILENAME mkpart primary ext2 64M 100%
  123. parted $FILENAME toggle 1 boot
  124. LOOPDEV=$(losetup --show --find $FILENAME)
  125. partx -a $LOOPDEV
  126. mkfs.${BOOT_FSTYPE} $_args ${LOOPDEV}p1 >/dev/null
  127. mkfs.${ROOT_FSTYPE} ${LOOPDEV}p2 >/dev/null 2>&1
  128. info_msg "Unpacking rootfs tarball ..."
  129. ROOTFSDIR=$(mktemp -d)
  130. mount ${LOOPDEV}p2 $ROOTFSDIR
  131. mkdir -p ${ROOTFSDIR}/boot
  132. mount ${LOOPDEV}p1 ${ROOTFSDIR}/boot
  133. tar xfp $ROOTFS_TARBALL -C $ROOTFSDIR
  134. BOOT_UUID=$(blkid -o value -s UUID ${LOOPDEV}p1)
  135. ROOT_UUID=$(blkid -o value -s UUID ${LOOPDEV}p2)
  136. echo "UUID=$BOOT_UUID /boot $BOOT_FSTYPE defaults 0 0" >> ${ROOTFSDIR}/etc/fstab
  137. echo "UUID=$ROOT_UUID / $ROOT_FSTYPE defaults 0 1" >> ${ROOTFSDIR}/etc/fstab
  138. if [ -s ${ROOTFSDIR}/boot/cmdline.txt ]; then
  139. sed -e "s,rootfstype=ext4,rootfstype=${ROOT_FSTYPE}," -i ${ROOTFSDIR}/boot/cmdline.txt
  140. fi
  141. # For cubieboard we need to flash u-boot to the image.
  142. if [ "$PLATFORM" = "cubieboard2" ]; then
  143. dd if=${ROOTFSDIR}/boot/u-boot-sunxi-with-spl.bin of=${LOOPDEV} bs=1024 seek=8 >/dev/null 2>&1
  144. elif [ "$PLATFORM" = "odroid-u2" ]; then
  145. dd if=${ROOTFSDIR}/boot/E4412_S.bl1.HardKernel.bin of=${LOOPDEV} seek=1 >/dev/null 2>&1
  146. dd if=${ROOTFSDIR}/boot/bl2.signed.bin of=${LOOPDEV} seek=31 >/dev/null 2>&1
  147. dd if=${ROOTFSDIR}/boot/u-boot.bin of=${LOOPDEV} seek=63 >/dev/null 2>&1
  148. dd if=${ROOTFSDIR}/boot/E4412_S.tzsw.signed.bin of=${LOOPDEV} seek=2111 >/dev/null 2>&1
  149. fi
  150. umount ${ROOTFSDIR}/boot
  151. umount $ROOTFSDIR
  152. partx -d $LOOPDEV
  153. losetup -d $LOOPDEV
  154. rmdir $ROOTFSDIR
  155. chmod 644 $FILENAME
  156. info_msg "Successfully created $FILENAME ($PLATFORM) image."
  157. # vim: set ts=4 sw=4 et: