Advertisement
Guest User

debootstrap-ng.sh with sign_and_compress function

a guest
Sep 13th, 2016
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.60 KB | None | 0 0
  1. # Copyright (c) 2015 Igor Pecovnik, igor.pecovnik@gma**.com
  2. #
  3. # This file is licensed under the terms of the GNU General Public
  4. # License version 2. This program is licensed "as is" without any
  5. # warranty of any kind, whether express or implied.
  6. #
  7. # This file is a part of tool chain https://github.com/igorpecovnik/lib
  8. #
  9.  
  10. # Functions:
  11. # debootstrap_ng
  12. # create_rootfs_cache
  13. # prepare_partitions
  14. # create_image
  15. # install_dummy_initctl
  16. # mount_chroot
  17. # umount_chroot
  18. # unmount_on_exit
  19.  
  20. # custom_debootstrap_ng
  21. #
  22. # main debootstrap function
  23. #
  24. debootstrap_ng()
  25. {
  26. display_alert "Starting build process for" "$BOARD $RELEASE" "info"
  27.  
  28. [[ "ext4 f2fs btrfs nfs fel" != *$ROOTFS_TYPE* ]] && exit_with_error "Unknown rootfs type" "$ROOTFS_TYPE"
  29.  
  30. # Fixed image size is in 1M dd blocks (MiB)
  31. # to get size of block device /dev/sdX execute as root:
  32. # echo $(( $(blockdev --getsize64 /dev/sdX) / 1024 / 1024 ))
  33. [[ "btrfs f2fs" == *"$ROOTFS_TYPE"* && -z $FIXED_IMAGE_SIZE ]] && exit_with_error "Please define FIXED_IMAGE_SIZE"
  34.  
  35. [[ $ROOTFS_TYPE != ext4 ]] && display_alert "Assuming $BOARD $BRANCH kernel supports $ROOTFS_TYPE" "" "wrn"
  36.  
  37. # small SD card with kernel, boot scritpt and .dtb/.bin files
  38. [[ $ROOTFS_TYPE == nfs ]] && FIXED_IMAGE_SIZE=64
  39.  
  40. # trap to unmount stuff in case of error/manual interruption
  41. trap unmount_on_exit INT TERM EXIT
  42.  
  43. # stage: clean and create directories
  44. rm -rf $CACHEDIR/{sdcard,mount}
  45. mkdir -p $CACHEDIR/{sdcard,mount,rootfs} $DEST/images
  46.  
  47. # stage: verify tmpfs configuration and mount
  48. # default maximum size for tmpfs mount is 1/2 of available RAM
  49. # CLI needs ~1.2GiB+ (Xenial CLI), Desktop - ~2.2GiB+ (Xenial Desktop w/o HW acceleration)
  50. # calculate and set tmpfs mount to use 2/3 of available RAM
  51. local phymem=$(( $(awk '/MemTotal/ {print $2}' /proc/meminfo) / 1024 * 2 / 3 )) # MiB
  52. if [[ $BUILD_DESKTOP == yes ]]; then local tmpfs_max_size=2500; else local tmpfs_max_size=1500; fi # MiB
  53. if [[ $FORCE_USE_RAMDISK == no ]]; then local use_tmpfs=no
  54. elif [[ $FORCE_USE_RAMDISK == yes || $phymem -gt $tmpfs_max_size ]]; then
  55. local use_tmpfs=yes
  56. fi
  57.  
  58. [[ $use_tmpfs == yes ]] && mount -t tmpfs -o size=${tmpfs_max_size}M tmpfs $CACHEDIR/sdcard
  59.  
  60. # stage: prepare basic rootfs: unpack cache or create from scratch
  61. create_rootfs_cache
  62.  
  63. # stage: install kernel and u-boot packages
  64. # install distribution and board specific applications
  65.  
  66. mkdir -p $CACHEDIR/sdcard/tmp/debs
  67. mount --bind $DEST/debs/ $CACHEDIR/sdcard/tmp/debs
  68.  
  69. install_distribution_specific
  70. install_common
  71.  
  72. # install additional applications
  73. [[ $EXTERNAL == yes ]] && install_external_applications
  74.  
  75. # install desktop files
  76. [[ $BUILD_DESKTOP == yes ]] && install_desktop
  77.  
  78. if [[ $RELEASE == jessie || $RELEASE == xenial ]]; then
  79. # install locally built packages
  80. [[ $EXTERNAL_NEW == compile ]] && chroot_installpackages_local
  81. # install from apt.armbian.com
  82. [[ $EXTERNAL_NEW == prebuilt ]] && chroot_installpackages "yes"
  83. fi
  84.  
  85. # cleanup for install_kernel and install_board_specific
  86. umount $CACHEDIR/sdcard/tmp/debs && rm -rf $CACHEDIR/sdcard/tmp/debs
  87.  
  88. # stage: user customization script
  89. # NOTE: installing too many packages may fill tmpfs mount
  90. customize_image
  91.  
  92. # stage: cleanup
  93. rm -f $CACHEDIR/sdcard/usr/sbin/policy-rc.d
  94. rm -f $CACHEDIR/sdcard/usr/bin/$QEMU_BINARY
  95. [[ -x $CACHEDIR/sdcard/sbin/initctl.REAL ]] && mv -f $CACHEDIR/sdcard/sbin/initctl.REAL $CACHEDIR/sdcard/sbin/initctl
  96. [[ -x $CACHEDIR/sdcard/sbin/start-stop-daemon.REAL ]] && mv -f $CACHEDIR/sdcard/sbin/start-stop-daemon.REAL $CACHEDIR/sdcard/sbin/start-stop-daemon
  97.  
  98. umount_chroot "$CACHEDIR/sdcard"
  99.  
  100. # to prevent creating swap file on NFS (needs specific kernel options)
  101. # and f2fs/btrfs (not recommended or needs specific kernel options)
  102. [[ $ROOTFS_TYPE != ext4 ]] && touch $CACHEDIR/sdcard/var/swap
  103.  
  104. if [[ $ROOTFS_TYPE == fel ]]; then
  105. FEL_ROOTFS=$CACHEDIR/sdcard/
  106. display_alert "Starting FEL boot" "$BOARD" "info"
  107. source $SRC/lib/fel-load.sh
  108. else
  109. prepare_partitions
  110. create_image
  111. fi
  112.  
  113. # stage: unmount tmpfs
  114. [[ $use_tmpfs = yes ]] && umount $CACHEDIR/sdcard
  115.  
  116. rm -rf $CACHEDIR/sdcard
  117.  
  118. # remove exit trap
  119. trap - INT TERM EXIT
  120. } #############################################################################
  121.  
  122. # create_rootfs_cache
  123. #
  124. # unpacks cached rootfs for $RELEASE or creates one
  125. #
  126. create_rootfs_cache()
  127. {
  128. local packages_hash=$(get_package_list_hash $PACKAGE_LIST)
  129. local cache_fname=$CACHEDIR/rootfs/${RELEASE}-ng-$ARCH.$packages_hash.tgz
  130. local display_name=${RELEASE}-ng-$ARCH.${packages_hash:0:3}...${packages_hash:29}.tgz
  131. if [[ -f $cache_fname ]]; then
  132. local date_diff=$(( ($(date +%s) - $(stat -c %Y $cache_fname)) / 86400 ))
  133. display_alert "Extracting $display_name" "$date_diff days old" "info"
  134. pv -p -b -r -c -N "$display_name" "$cache_fname" | pigz -dc | tar xp --xattrs -C $CACHEDIR/sdcard/
  135. else
  136. display_alert "Creating new rootfs for" "$RELEASE" "info"
  137.  
  138. # stage: debootstrap base system
  139. if [[ $NO_APT_CACHER != yes ]]; then
  140. # apt-cacher-ng apt-get proxy parameter
  141. local apt_extra="-o Acquire::http::Proxy=\"http://${APT_PROXY_ADDR:-localhost:3142}\""
  142. local apt_mirror="http://${APT_PROXY_ADDR:-localhost:3142}/$APT_MIRROR"
  143. else
  144. local apt_mirror="http://$APT_MIRROR"
  145. fi
  146.  
  147. # fancy progress bars (except for Wheezy target)
  148. [[ -z $OUTPUT_DIALOG && $RELEASE != wheezy ]] && local apt_extra_progress="--show-progress -o DPKG::Progress-Fancy=1"
  149.  
  150. display_alert "Installing base system" "Stage 1/2" "info"
  151. eval 'debootstrap --include=locales ${PACKAGE_LIST_EXCLUDE:+ --exclude=${PACKAGE_LIST_EXCLUDE// /,}} \
  152. --arch=$ARCH --foreign $RELEASE $CACHEDIR/sdcard/ $apt_mirror' \
  153. ${PROGRESS_LOG_TO_FILE:+' | tee -a $DEST/debug/debootstrap.log'} \
  154. ${OUTPUT_DIALOG:+' | dialog --backtitle "$backtitle" --progressbox "Debootstrap (stage 1/2)..." $TTY_Y $TTY_X'} \
  155. ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  156.  
  157. [[ ${PIPESTATUS[0]} -ne 0 || ! -f $CACHEDIR/sdcard/debootstrap/debootstrap ]] && exit_with_error "Debootstrap base system first stage failed"
  158.  
  159. cp /usr/bin/$QEMU_BINARY $CACHEDIR/sdcard/usr/bin/
  160.  
  161. mkdir -p $CACHEDIR/sdcard/usr/share/keyrings/
  162. cp /usr/share/keyrings/debian-archive-keyring.gpg $CACHEDIR/sdcard/usr/share/keyrings/
  163.  
  164. display_alert "Installing base system" "Stage 2/2" "info"
  165. eval 'chroot $CACHEDIR/sdcard /bin/bash -c "/debootstrap/debootstrap --second-stage"' \
  166. ${PROGRESS_LOG_TO_FILE:+' | tee -a $DEST/debug/debootstrap.log'} \
  167. ${OUTPUT_DIALOG:+' | dialog --backtitle "$backtitle" --progressbox "Debootstrap (stage 2/2)..." $TTY_Y $TTY_X'} \
  168. ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  169.  
  170. [[ ${PIPESTATUS[0]} -ne 0 || ! -f $CACHEDIR/sdcard/bin/bash ]] && exit_with_error "Debootstrap base system second stage failed"
  171.  
  172. mount_chroot "$CACHEDIR/sdcard"
  173.  
  174. # policy-rc.d script prevents starting or reloading services during image creation
  175. printf '#!/bin/sh\nexit 101' > $CACHEDIR/sdcard/usr/sbin/policy-rc.d
  176. chmod 755 $CACHEDIR/sdcard/usr/sbin/policy-rc.d
  177. install_dummy_initctl
  178.  
  179. # stage: configure language and locales
  180. display_alert "Configuring locales" "$DEST_LANG" "info"
  181.  
  182. [[ -f $CACHEDIR/sdcard/etc/locale.gen ]] && sed -i "s/^# $DEST_LANG/$DEST_LANG/" $CACHEDIR/sdcard/etc/locale.gen
  183. eval 'LC_ALL=C LANG=C chroot $CACHEDIR/sdcard /bin/bash -c "locale-gen $DEST_LANG"' ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  184. eval 'LC_ALL=C LANG=C chroot $CACHEDIR/sdcard /bin/bash -c "update-locale LANG=$DEST_LANG LANGUAGE=$DEST_LANG LC_MESSAGES=$DEST_LANG"' \
  185. ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  186.  
  187. if [[ -f $CACHEDIR/sdcard/etc/default/console-setup ]]; then
  188. sed -e 's/CHARMAP=.*/CHARMAP="UTF-8"/' -e 's/FONTSIZE=.*/FONTSIZE="8x16"/' \
  189. -e 's/CODESET=.*/CODESET="guess"/' -i $CACHEDIR/sdcard/etc/default/console-setup
  190. eval 'LC_ALL=C LANG=C chroot $CACHEDIR/sdcard /bin/bash -c "setupcon --save"'
  191. fi
  192.  
  193. # stage: create apt sources list
  194. create_sources_list "$RELEASE" "$CACHEDIR/sdcard/"
  195.  
  196. # stage: add armbian repository and install key
  197. case $RELEASE in
  198. wheezy|trusty)
  199. echo "deb http://apt.armbian.com $RELEASE main" > $CACHEDIR/sdcard/etc/apt/sources.list.d/armbian.list
  200. ;;
  201. jessie|xenial)
  202. echo "deb http://apt.armbian.com $RELEASE main utils ${RELEASE}-desktop" > $CACHEDIR/sdcard/etc/apt/sources.list.d/armbian.list
  203. ;;
  204. esac
  205. cp $SRC/lib/bin/armbian.key $CACHEDIR/sdcard
  206. eval 'chroot $CACHEDIR/sdcard /bin/bash -c "cat armbian.key | apt-key add -"' \
  207. ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  208. rm $CACHEDIR/sdcard/armbian.key
  209.  
  210. # stage: update packages list
  211. display_alert "Updating package list" "$RELEASE" "info"
  212. eval 'LC_ALL=C LANG=C chroot $CACHEDIR/sdcard /bin/bash -c "apt-get -q -y $apt_extra update"' \
  213. ${PROGRESS_LOG_TO_FILE:+' | tee -a $DEST/debug/debootstrap.log'} \
  214. ${OUTPUT_DIALOG:+' | dialog --backtitle "$backtitle" --progressbox "Updating package lists..." $TTY_Y $TTY_X'} \
  215. ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  216.  
  217. #[[ ${PIPESTATUS[0]} -ne 0 ]] && exit_with_error "Updating package lists failed"
  218.  
  219. # stage: upgrade base packages from xxx-updates and xxx-backports repository branches
  220. display_alert "Upgrading base packages" "Armbian" "info"
  221. eval 'LC_ALL=C LANG=C chroot $CACHEDIR/sdcard /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -y -q \
  222. $apt_extra $apt_extra_progress upgrade"' \
  223. ${PROGRESS_LOG_TO_FILE:+' | tee -a $DEST/debug/debootstrap.log'} \
  224. ${OUTPUT_DIALOG:+' | dialog --backtitle "$backtitle" --progressbox "Upgrading base packages..." $TTY_Y $TTY_X'} \
  225. ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  226.  
  227. #[[ ${PIPESTATUS[0]} -ne 0 ]] && exit_with_error "Upgrading base packages failed"
  228.  
  229. # new initctl and start-stop-daemon may be installed after upgrading base packages
  230. install_dummy_initctl
  231.  
  232. # stage: install additional packages
  233. display_alert "Installing packages for" "Armbian" "info"
  234. eval 'LC_ALL=C LANG=C chroot $CACHEDIR/sdcard /bin/bash -c "DEBIAN_FRONTEND=noninteractive apt-get -y -q \
  235. $apt_extra $apt_extra_progress --no-install-recommends install $PACKAGE_LIST"' \
  236. ${PROGRESS_LOG_TO_FILE:+' | tee -a $DEST/debug/debootstrap.log'} \
  237. ${OUTPUT_DIALOG:+' | dialog --backtitle "$backtitle" --progressbox "Installing Armbian system..." $TTY_Y $TTY_X'} \
  238. ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  239.  
  240. [[ ${PIPESTATUS[0]} -ne 0 ]] && exit_with_error "Installation of Armbian packages failed"
  241.  
  242. # DEBUG: print free space
  243. echo -e "\nFree space:"
  244. eval 'df -h | grep "$CACHEDIR/"' ${PROGRESS_LOG_TO_FILE:+' | tee -a $DEST/debug/debootstrap.log'}
  245.  
  246. # stage: remove downloaded packages
  247. chroot $CACHEDIR/sdcard /bin/bash -c "apt-get clean"
  248.  
  249. # stage: make rootfs cache archive
  250. display_alert "Ending debootstrap process and preparing cache" "$RELEASE" "info"
  251. sync
  252. # the only reason to unmount here is compression progress display
  253. # based on rootfs size calculation
  254. umount_chroot "$CACHEDIR/sdcard"
  255.  
  256. tar cp --xattrs --directory=$CACHEDIR/sdcard/ --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./tmp/*' \
  257. --exclude='./sys/*' . | pv -p -b -r -s $(du -sb $CACHEDIR/sdcard/ | cut -f1) -N "$display_name" | pigz --fast > $cache_fname
  258. fi
  259. mount_chroot "$CACHEDIR/sdcard"
  260. } #############################################################################
  261.  
  262. # prepare_partitions
  263. #
  264. # creates image file, partitions and fs
  265. # and mounts it to local dir
  266. # FS-dependent stuff (boot and root fs partition types) happens here
  267. #
  268. prepare_partitions()
  269. {
  270. display_alert "Preparing image file for rootfs" "$BOARD $RELEASE" "info"
  271.  
  272. # possible partition combinations
  273. # ext4 root only (BOOTSIZE == 0 && ROOTFS_TYPE == ext4)
  274. # ext4 boot + non-ext4 local root (BOOTSIZE == 0; ROOTFS_TYPE != ext4 or nfs)
  275. # fat32 boot + ext4 root (BOOTSIZE > 0 && ROOTFS_TYPE == ext4)
  276. # fat32 boot + non-ext4 local root (BOOTSIZE > 0; ROOTFS_TYPE != ext4 or nfs)
  277. # ext4 boot + NFS root (BOOTSIZE == 0; ROOTFS_TYPE == nfs)
  278. # fat32 boot + NFS root (BOOTSIZE > 0; ROOTFS_TYPE == nfs)
  279.  
  280. # declare makes local variables by default if used inside a function
  281. # NOTE: mountopts string should always start with comma if not empty
  282.  
  283. # array copying in old bash versions is tricky, so having filesystems as arrays
  284. # with attributes as keys is not a good idea
  285. declare -A parttype mkopts mkfs mountopts
  286.  
  287. parttype[ext4]=ext4
  288. parttype[fat]=fat16
  289. parttype[f2fs]=ext4 # not a copy-paste error
  290. parttype[btrfs]=btrfs
  291. # parttype[nfs] is empty
  292.  
  293. # metadata_csum is supported since e2fsprogs 1.43
  294. local codename=$(lsb_release -sc)
  295. if [[ $codename == sid || $codename == stretch ]]; then
  296. mkopts[ext4]='-O ^64bit,^metadata_csum,uninit_bg -q -m 2'
  297. else
  298. mkopts[ext4]='-q -m 2'
  299. fi
  300.  
  301. mkopts[fat]='-n BOOT'
  302. # mkopts[f2fs] is empty
  303. # mkopts[btrfs] is empty
  304. # mkopts[nfs] is empty
  305.  
  306. mkfs[ext4]=ext4
  307. mkfs[fat]=vfat
  308. mkfs[f2fs]=f2fs
  309. mkfs[btrfs]=btrfs
  310. # mkfs[nfs] is empty
  311.  
  312. mountopts[ext4]=',commit=600,errors=remount-ro'
  313. # mountopts[fat] is empty
  314. # mountopts[f2fs] is empty
  315. # mountopts[btrfs] is empty
  316. # mountopts[nfs] is empty
  317.  
  318. # stage: calculate rootfs size
  319. local rootfs_size=$(du -sm $CACHEDIR/sdcard/ | cut -f1) # MiB
  320. display_alert "Current rootfs size" "$rootfs_size MiB" "info"
  321. if [[ -n $FIXED_IMAGE_SIZE && $FIXED_IMAGE_SIZE =~ ^[0-9]+$ ]]; then
  322. display_alert "Using user-defined image size" "$FIXED_IMAGE_SIZE MiB" "info"
  323. local sdsize=$FIXED_IMAGE_SIZE
  324. # basic sanity check
  325. if [[ $ROOTFS_TYPE != nfs && $sdsize -lt $rootfs_size ]]; then
  326. exit_with_error "User defined image size is too small" "$sdsize <= $rootfs_size"
  327. fi
  328. else
  329. local imagesize=$(( $rootfs_size + $OFFSET + $BOOTSIZE )) # MiB
  330. # Hardcoded overhead +40% and +128MB for ext4 is needed for desktop images, for CLI it can be lower
  331. # extra 128 MiB for emergency swap file
  332. local sdsize=$(bc -l <<< "scale=0; ($imagesize * 1.4) / 1 + 128")
  333. fi
  334.  
  335. # stage: create blank image
  336. display_alert "Creating blank image for rootfs" "$sdsize MiB" "info"
  337. dd if=/dev/zero bs=1M status=none count=$sdsize | pv -p -b -r -s $(( $sdsize * 1024 * 1024 )) | dd status=none of=$CACHEDIR/tmprootfs.raw
  338.  
  339. # stage: determine partition configuration
  340. if [[ $ROOTFS_TYPE != ext4 && $BOOTSIZE == 0 ]]; then
  341. local bootfs=ext4
  342. BOOTSIZE=32 # MiB
  343. elif [[ $BOOTSIZE != 0 ]]; then
  344. local bootfs=fat
  345. fi
  346.  
  347. # stage: calculate boot partition size
  348. BOOTSTART=$(($OFFSET * 2048))
  349. ROOTSTART=$(($BOOTSTART + ($BOOTSIZE * 2048)))
  350. BOOTEND=$(($ROOTSTART - 1))
  351.  
  352. # stage: create partition table
  353. display_alert "Creating partitions" "${bootfs:+/boot: $bootfs }root: $ROOTFS_TYPE" "info"
  354. parted -s $CACHEDIR/tmprootfs.raw -- mklabel msdos
  355. if [[ $ROOTFS_TYPE == nfs ]]; then
  356. parted -s $CACHEDIR/tmprootfs.raw -- mkpart primary ${parttype[$bootfs]} ${BOOTSTART}s -1s
  357. elif [[ $BOOTSIZE == 0 ]]; then
  358. parted -s $CACHEDIR/tmprootfs.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${ROOTSTART}s -1s
  359. else
  360. parted -s $CACHEDIR/tmprootfs.raw -- mkpart primary ${parttype[$bootfs]} ${BOOTSTART}s ${BOOTEND}s
  361. parted -s $CACHEDIR/tmprootfs.raw -- mkpart primary ${parttype[$ROOTFS_TYPE]} ${ROOTSTART}s -1s
  362. fi
  363.  
  364. # stage: mount image
  365. LOOP=$(losetup -f)
  366. [[ -z $LOOP ]] && exit_with_error "Unable to find free loop device"
  367.  
  368. # NOTE: losetup -P option is not available in Trusty
  369. losetup $LOOP $CACHEDIR/tmprootfs.raw
  370. partprobe $LOOP
  371.  
  372. # stage: create fs
  373. if [[ $BOOTSIZE == 0 ]]; then
  374. eval mkfs.${mkfs[$ROOTFS_TYPE]} ${mkopts[$ROOTFS_TYPE]} ${LOOP}p1 ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  375. [[ $ROOTFS_TYPE == ext4 ]] && tune2fs -o journal_data_writeback ${LOOP}p1 > /dev/null
  376. else
  377. if [[ $ROOTFS_TYPE != nfs ]]; then
  378. eval mkfs.${mkfs[$ROOTFS_TYPE]} ${mkopts[$ROOTFS_TYPE]} ${LOOP}p2 ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  379. [[ $ROOTFS_TYPE == ext4 ]] && tune2fs -o journal_data_writeback ${LOOP}p2 > /dev/null
  380. fi
  381. eval mkfs.${mkfs[$bootfs]} ${mkopts[$bootfs]} ${LOOP}p1 ${OUTPUT_VERYSILENT:+' >/dev/null 2>/dev/null'}
  382. fi
  383.  
  384. # stage: mount partitions and create proper fstab
  385. rm -f $CACHEDIR/sdcard/etc/fstab
  386. if [[ $BOOTSIZE == 0 ]]; then
  387. mount ${LOOP}p1 $CACHEDIR/mount/
  388. echo "/dev/mmcblk0p1 / ${mkfs[$ROOTFS_TYPE]} defaults,noatime,nodiratime${mountopts[$ROOTFS_TYPE]} 0 1" >> $CACHEDIR/sdcard/etc/fstab
  389. else
  390. if [[ $ROOTFS_TYPE != nfs ]]; then
  391. mount ${LOOP}p2 $CACHEDIR/mount/
  392. echo "/dev/mmcblk0p2 / ${mkfs[$ROOTFS_TYPE]} defaults,noatime,nodiratime${mountopts[$ROOTFS_TYPE]} 0 1" >> $CACHEDIR/sdcard/etc/fstab
  393. else
  394. echo "/dev/nfs / nfs defaults 0 0" >> $CACHEDIR/sdcard/etc/fstab
  395. fi
  396. # create /boot on rootfs after it is mounted
  397. mkdir -p $CACHEDIR/mount/boot/
  398. mount ${LOOP}p1 $CACHEDIR/mount/boot/
  399. echo "/dev/mmcblk0p1 /boot ${mkfs[$bootfs]} defaults${mountopts[$bootfs]} 0 2" >> $CACHEDIR/sdcard/etc/fstab
  400. fi
  401. echo "tmpfs /tmp tmpfs defaults,nosuid 0 0" >> $CACHEDIR/sdcard/etc/fstab
  402.  
  403. # stage: create boot script
  404. if [[ $ROOTFS_TYPE == nfs ]]; then
  405. # copy script provided by user if exists
  406. if [[ -f $SRC/userpatches/nfs-boot.cmd ]]; then
  407. display_alert "Using custom NFS boot script" "userpatches/nfs-boot.cmd" "info"
  408. cp $SRC/userpatches/nfs-boot.cmd $CACHEDIR/sdcard/boot/boot.cmd
  409. else
  410. cp $SRC/lib/scripts/nfs-boot.cmd.template $CACHEDIR/sdcard/boot/boot.cmd
  411. fi
  412. elif [[ $BOOTSIZE != 0 && -f $CACHEDIR/sdcard/boot/boot.cmd ]]; then
  413. sed -i 's/mmcblk0p1/mmcblk0p2/' $CACHEDIR/sdcard/boot/boot.cmd
  414. sed -i "s/rootfstype=ext4/rootfstype=$ROOTFS_TYPE/" $CACHEDIR/sdcard/boot/boot.cmd
  415. fi
  416. [[ -f $CACHEDIR/sdcard/boot/boot.cmd ]] && \
  417. mkimage -C none -A arm -T script -d $CACHEDIR/sdcard/boot/boot.cmd $CACHEDIR/sdcard/boot/boot.scr > /dev/null 2>&1
  418.  
  419. } #############################################################################
  420.  
  421. # create_image
  422. #
  423. # finishes creation of image from cached rootfs
  424. #
  425. create_image()
  426. {
  427. # stage: create file name
  428. local version="Armbian_${REVISION}_${BOARD^}_${DISTRIBUTION}_${RELEASE}_${VER/-$LINUXFAMILY/}"
  429. [[ $BUILD_DESKTOP == yes ]] && version=${version}_desktop
  430. [[ $ROOTFS_TYPE == nfs ]] && version=${version}_nfsboot
  431.  
  432. if [[ $ROOTFS_TYPE != nfs ]]; then
  433. display_alert "Copying files to image" "tmprootfs.raw" "info"
  434. rsync -aHWXh --exclude="/boot/*" --exclude="/dev/*" --exclude="/proc/*" --exclude="/run/*" --exclude="/tmp/*" \
  435. --exclude="/sys/*" --info=progress2,stats1 $CACHEDIR/sdcard/ $CACHEDIR/mount/
  436. else
  437. display_alert "Creating rootfs archive" "rootfs.tgz" "info"
  438. tar cp --xattrs --directory=$CACHEDIR/sdcard/ --exclude='./boot/*' --exclude='./dev/*' --exclude='./proc/*' --exclude='./run/*' --exclude='./tmp/*' \
  439. --exclude='./sys/*' . | pv -p -b -r -s $(du -sb $CACHEDIR/sdcard/ | cut -f1) -N "rootfs.tgz" | pigz > $DEST/images/${version}-rootfs.tgz
  440. fi
  441.  
  442. # stage: rsync /boot
  443. display_alert "Copying files to /boot partition" "tmprootfs.raw" "info"
  444. if [[ $(findmnt --target $CACHEDIR/mount/boot -o FSTYPE -n) == vfat ]]; then
  445. # fat32
  446. rsync -rLtWh --info=progress2,stats1 $CACHEDIR/sdcard/boot $CACHEDIR/mount
  447. else
  448. # ext4
  449. rsync -aHWXh --info=progress2,stats1 $CACHEDIR/sdcard/boot $CACHEDIR/mount
  450. fi
  451.  
  452. # DEBUG: print free space
  453. display_alert "Free space:" "SD card" "info"
  454. eval 'df -h | grep "$CACHEDIR/"' ${PROGRESS_LOG_TO_FILE:+' | tee -a $DEST/debug/debootstrap.log'}
  455.  
  456. # stage: write u-boot
  457. write_uboot $LOOP
  458.  
  459. # unmount /boot first, rootfs second, image file last
  460. sync
  461. [[ $BOOTSIZE != 0 ]] && umount -l $CACHEDIR/mount/boot
  462. [[ $ROOTFS_TYPE != nfs ]] && umount -l $CACHEDIR/mount
  463. losetup -d $LOOP
  464.  
  465. if [ ${BUILD_ALL} = TRUE ]; then
  466. TEMP_DIR="$(mktemp -d $CACHEDIR/${version}.XXXXXX)"
  467. cp $CACHEDIR/sdcard/etc/armbian.txt "${TEMP_DIR}/"
  468. mv "$CACHEDIR/tmprootfs.raw" "${TEMP_DIR}/${version}.raw"
  469. cd "${TEMP_DIR}/"
  470. sign_and_compress &
  471. else
  472. cp $CACHEDIR/sdcard/etc/armbian.txt $CACHEDIR/
  473. mv $CACHEDIR/tmprootfs.raw $CACHEDIR/${version}.raw
  474. cd $CACHEDIR/
  475. sign_and_compress
  476. fi
  477. } #############################################################################
  478.  
  479. # sign_and_compress
  480. #
  481. # signs and compresses the image
  482. #
  483. sign_and_compress()
  484. {
  485. # stage: compressing or copying image file
  486. if [[ $COMPRESS_OUTPUTIMAGE != yes ]]; then
  487. mv -f ${version}.raw $DEST/images/${version}.raw
  488. display_alert "Done building" "$DEST/images/${version}.raw" "info"
  489. else
  490. display_alert "Signing and compressing" "Please wait!" "info"
  491. # stage: generate sha256sum
  492. sha256sum -b ${version}.raw > sha256sum
  493. # stage: sign with PGP
  494. if [[ -n $GPG_PASS ]]; then
  495. echo $GPG_PASS | gpg --passphrase-fd 0 --armor --detach-sign --batch --yes ${version}.raw
  496. echo $GPG_PASS | gpg --passphrase-fd 0 --armor --detach-sign --batch --yes armbian.txt
  497. fi
  498. if [[ $SEVENZIP == yes ]]; then
  499. local filename=$DEST/images/${version}.7z
  500. if [ ${BUILD_ALL} = TRUE ]; then
  501. nice -n 19 7za a -t7z -bd -m0=lzma2 -mx=3 -mfb=64 -md=32m -ms=on $filename ${version}.raw armbian.txt *.asc sha256sum >/dev/null 2>&1
  502. else
  503. 7za a -t7z -bd -m0=lzma2 -mx=3 -mfb=64 -md=32m -ms=on $filename ${version}.raw armbian.txt *.asc sha256sum >/dev/null 2>&1
  504. fi
  505. else
  506. local filename=$DEST/images/${version}.zip
  507. zip -FSq $filename ${version}.raw armbian.txt *.asc sha256sum
  508. fi
  509. rm -f ${version}.raw *.asc armbian.txt sha256sum
  510. if [ ${BUILD_ALL} = TRUE ]; then
  511. cd .. && rmdir "${TEMP_DIR}"
  512. else
  513. local filesize=$(ls -l --b=M $filename | cut -d " " -f5)
  514. display_alert "Done building" "$filename [$filesize]" "info"
  515. fi
  516. fi
  517. } #############################################################################
  518.  
  519. # install_dummy_initctl
  520. #
  521. # helper to reduce code duplication
  522. #
  523. install_dummy_initctl()
  524. {
  525. if [[ -x $CACHEDIR/sdcard/sbin/start-stop-daemon ]] && ! cmp -s $CACHEDIR/sdcard/sbin/start-stop-daemon <(printf '#!/bin/sh\necho "Warning: Fake start-stop-daemon called, doing nothing"'); then
  526. mv $CACHEDIR/sdcard/sbin/start-stop-daemon $CACHEDIR/sdcard/sbin/start-stop-daemon.REAL
  527. printf '#!/bin/sh\necho "Warning: Fake start-stop-daemon called, doing nothing"' > $CACHEDIR/sdcard/sbin/start-stop-daemon
  528. chmod 755 $CACHEDIR/sdcard/sbin/start-stop-daemon
  529. fi
  530. if [[ -x $CACHEDIR/sdcard/sbin/initctl ]] && ! cmp -s $CACHEDIR/sdcard/sbin/initctl <(printf '#!/bin/sh\necho "Warning: Fake initctl called, doing nothing"'); then
  531. mv $CACHEDIR/sdcard/sbin/initctl $CACHEDIR/sdcard/sbin/initctl.REAL
  532. printf '#!/bin/sh\necho "Warning: Fake initctl called, doing nothing"' $CACHEDIR/sdcard/sbin/initctl
  533. chmod 755 $CACHEDIR/sdcard/sbin/initctl
  534. fi
  535. } #############################################################################
  536.  
  537. # mount_chroot <target>
  538. #
  539. # helper to reduce code duplication
  540. #
  541. mount_chroot()
  542. {
  543. local target=$1
  544. mount -t proc chproc $target/proc
  545. mount -t sysfs chsys $target/sys
  546. mount -t devtmpfs chdev $target/dev || mount --bind /dev $target/dev
  547. mount -t devpts chpts $target/dev/pts
  548. } #############################################################################
  549.  
  550. # umount_chroot <target>
  551. #
  552. # helper to reduce code duplication
  553. #
  554. umount_chroot()
  555. {
  556. local target=$1
  557. umount -l $target/dev/pts >/dev/null 2>&1
  558. umount -l $target/dev >/dev/null 2>&1
  559. umount -l $target/proc >/dev/null 2>&1
  560. umount -l $target/sys >/dev/null 2>&1
  561. } #############################################################################
  562.  
  563. # unmount_on_exit
  564. #
  565. unmount_on_exit()
  566. {
  567. trap - INT TERM EXIT
  568. umount_chroot "$CACHEDIR/sdcard/"
  569. umount -l $CACHEDIR/sdcard/tmp >/dev/null 2>&1
  570. umount -l $CACHEDIR/sdcard >/dev/null 2>&1
  571. umount -l $CACHEDIR/mount/boot >/dev/null 2>&1
  572. umount -l $CACHEDIR/mount >/dev/null 2>&1
  573. losetup -d $LOOP >/dev/null 2>&1
  574. rm -rf $CACHEDIR/sdcard
  575. exit_with_error "debootstrap-ng was interrupted"
  576. } #############################################################################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement