rebuild-iso.sh 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #!/bin/bash
  2. set -e
  3. # SELF_DIR=$(dirname $(readlink -f $0))
  4. # . ${SELF_DIR}/params.sh
  5. # echo "ISO_FILE=$ISO_FILE, MOUNT_DIR=$MOUNT_DIR, TARGET_DIR=$TARGET_DIR, SQUASH_DIR=$SQUASH_DIR"
  6. ISO_FILE="my.iso"
  7. MOUNT_DIR="mount"
  8. TARGET_DIR="target"
  9. SQUASH_DIR="squashfs"
  10. DEB_FILE="my.deb"
  11. function usage() {
  12. echo -e "USAGE:\n\
  13. $(basename $0) --help # 使用帮助\n\
  14. $(basename $0) --iso file.iso # 挂载iso\n\
  15. $(basename $0) --umount # 卸载iso\n\
  16. $(basename $0) --unsquash # 解压squash\n\
  17. $(basename $0) --insdeb file.deb # 安装deb包\n\
  18. $(basename $0) --squash # 打包squash\n\
  19. $(basename $0) --mkiso # 打包iso\n\
  20. $(basename $0) --mkiso-skip # 打包iso,不重新计算 filesystem.size\n\
  21. $(basename $0) --mkiso-arm64 # 打包arm64 iso\n\
  22. $(basename $0) --mkiso-arm64-skip # 打包arm64 iso,不重新计算 filesystem.size"
  23. exit 1
  24. }
  25. # 判断是否为root用户
  26. if [ "$(id -u)" != "0" ]; then
  27. echo "please run as root" 1>&2
  28. exit 1
  29. fi
  30. # 判断参数个数
  31. if [ $# -eq 0 ]; then
  32. usage
  33. fi
  34. ARGS=$(getopt -a -o h -l help,iso:,umount,unsquash,insdeb:,squash,mkiso,mkiso-skip,mkiso-arm64,mkiso-arm64-skip -- "$@")
  35. eval set -- "${ARGS}"
  36. while true; do
  37. case "$1" in
  38. -h | --help)
  39. usage
  40. ;;
  41. --iso)
  42. ISO_FILE=$2
  43. # TARGET_DIR=$(basename ${2%.*})
  44. # echo "mount -> ${TARGET_DIR}"
  45. if ! mountpoint -q "${MOUNT_DIR}"; then
  46. if [ -f "${ISO_FILE}" ]; then
  47. [ -d "${MOUNT_DIR}" ] || mkdir "${MOUNT_DIR}"
  48. mount -o loop "${ISO_FILE}" "${MOUNT_DIR}"
  49. echo -e "\n---> rsync ${MOUNT_DIR} --> ${TARGET_DIR}"
  50. # rsync -av --progress --exclude=casper/filesystem.squashfs "${MOUNT_DIR}" "${TARGET_DIR}"
  51. rsync -a --exclude=casper/filesystem.squashfs "${MOUNT_DIR}/" "${TARGET_DIR}"
  52. else
  53. echo "${ISO_FILE} not exist!"
  54. fi
  55. else
  56. echo "alread mount"
  57. fi
  58. shift
  59. ;;
  60. --umount)
  61. for mpoint in $(df | grep '/dev/loop' | awk '{print $NF}'); do
  62. echo "umount $mpoint"
  63. umount $mpoint
  64. done
  65. shift
  66. ;;
  67. --unsquash)
  68. echo -e "\n---> 解压 filesystem.squashfs"
  69. unsquashfs -d "${SQUASH_DIR}" "${MOUNT_DIR}/casper/filesystem.squashfs"
  70. shift
  71. ;;
  72. --insdeb)
  73. DEB_FILE=$2
  74. if [ -d "${SQUASH_DIR}" ] && [ -f "${DEB_FILE}" ]; then
  75. cp "${DEB_FILE}" "${SQUASH_DIR}"
  76. PKG_NAME=$(dpkg-deb --info "${DEB_FILE}" | grep "Package:" | awk '{print $2}')
  77. echo -e "\n---> 卸载 ${PKG_NAME}"
  78. chroot "${SQUASH_DIR}" dpkg -r ${PKG_NAME}
  79. DEB_FILE_NAME=$(basename ${DEB_FILE})
  80. echo -e "\n---> 安装 ${DEB_FILE_NAME}"
  81. chroot "${SQUASH_DIR}" dpkg -i "${DEB_FILE_NAME}"
  82. rm "${SQUASH_DIR}/${DEB_FILE_NAME}"
  83. else
  84. echo "dir '${SQUASH_DIR}' or ${DEB_FILE} not exist!"
  85. fi
  86. shift
  87. ;;
  88. --squash)
  89. chroot "${SQUASH_DIR}" dpkg-query -W --showformat='${Package} ${Version}\n' >${TARGET_DIR}/casper/filesystem.manifest
  90. [ -f ${TARGET_DIR}/casper/filesystem.squashfs ] && rm ${TARGET_DIR}/casper/filesystem.squashfs
  91. echo -e "\n---> 打包 filesystem.squashfs"
  92. mksquashfs "${SQUASH_DIR}" ${TARGET_DIR}/casper/filesystem.squashfs
  93. shift
  94. ;;
  95. --mkiso)
  96. # timestamp=$(date '+%Y-%m-%d_%H-%M-%S')
  97. timestamp=$(date '+%Y-%m-%d')
  98. NEW_ISO_FILE="new-${timestamp}.iso"
  99. echo -e "\n---> 制作 ${NEW_ISO_FILE}"
  100. printf $(du -sx --block-size=1 ${SQUASH_DIR} | cut -f1) >${TARGET_DIR}/casper/filesystem.size
  101. cd ${TARGET_DIR}
  102. rm md5sum.txt
  103. find -type f -print0 | xargs -0 md5sum | grep -v isolinux/boot.cat | tee md5sum.txt
  104. mkisofs -D -r -V "${NEW_ISO_FILE%.*}" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../"${NEW_ISO_FILE}" .
  105. cd ..
  106. # ln -sf "${NEW_ISO_FILE}" new.iso
  107. shift
  108. ;;
  109. --mkiso-skip)
  110. timestamp=$(date '+%Y-%m-%d')
  111. NEW_ISO_FILE="new-${timestamp}.iso"
  112. echo -e "\n---> 制作 ${NEW_ISO_FILE},不重新计算 filesystem.size"
  113. cd ${TARGET_DIR}
  114. rm md5sum.txt
  115. find -type f -print0 | xargs -0 md5sum | grep -v isolinux/boot.cat | tee md5sum.txt
  116. mkisofs -D -r -V "${NEW_ISO_FILE%.*}" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../"${NEW_ISO_FILE}" .
  117. cd ..
  118. # ln -sf "${NEW_ISO_FILE}" new.iso
  119. shift
  120. ;;
  121. --mkiso-arm64)
  122. timestamp=$(date '+%Y-%m-%d')
  123. NEW_ISO_FILE="arm64-${timestamp}.iso"
  124. echo -e "\n---> 制作 ${NEW_ISO_FILE}"
  125. printf $(du -sx --block-size=1 ${SQUASH_DIR} | cut -f1) >${TARGET_DIR}/casper/filesystem.size
  126. cd ${TARGET_DIR}
  127. rm md5sum.txt
  128. find -type f -print0 | xargs -0 md5sum | grep -v isolinux/boot.cat | tee md5sum.txt
  129. mkisofs -J -r -V "${NEW_ISO_FILE%.*}" -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -o ../"${NEW_ISO_FILE}" .
  130. # I: -input-charset not specified, using utf-8 (detected in locale settings)
  131. cd ..
  132. # ln -sf "${NEW_ISO_FILE}" new.iso
  133. shift
  134. ;;
  135. --mkiso-arm64-skip)
  136. timestamp=$(date '+%Y-%m-%d')
  137. NEW_ISO_FILE="arm64-${timestamp}.iso"
  138. echo -e "\n---> 制作 ${NEW_ISO_FILE},不重新计算 filesystem.size"
  139. cd ${TARGET_DIR}
  140. rm md5sum.txt
  141. find -type f -print0 | xargs -0 md5sum | grep -v isolinux/boot.cat | tee md5sum.txt
  142. mkisofs -J -r -V "${NEW_ISO_FILE%.*}" -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -o ../"${NEW_ISO_FILE}" .
  143. # I: -input-charset not specified, using utf-8 (detected in locale settings)
  144. cd ..
  145. # ln -sf "${NEW_ISO_FILE}" new.iso
  146. shift
  147. ;;
  148. --)
  149. shift
  150. break
  151. ;;
  152. esac
  153. shift
  154. done