create_arm_debootstrap.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #!/bin/bash
  2. ######################
  3. # Debootstrap #
  4. ######################
  5. set -e
  6. set -x
  7. show_usage() {
  8. cat <<EOF
  9. # NAME
  10. $(basename $0) -- Script to create a minimal deboostrap
  11. # OPTIONS
  12. -d debian release (wheezy, jessie) (default: jessie)
  13. -b olinux board (see config_board.sh) (default: a20lime)
  14. -a add packages to deboostrap
  15. -n hostname (default: olinux)
  16. -t target directory for debootstrap (default: /olinux/debootstrap)
  17. -y install yunohost (doesn't work with cross debootstrap)
  18. -c cross debootstrap
  19. -p use aptcacher proxy
  20. -i set path for kernel package or install from testing (set '-i testing' to install from debian testing)
  21. -e configure for encrypted partition (default: false)
  22. EOF
  23. exit 1
  24. }
  25. DEBIAN_RELEASE=jessie
  26. TARGET_DIR=/olinux/debootstrap
  27. DEB_HOSTNAME=olinux
  28. REP=$(dirname $0)
  29. APT='apt-get install -y --force-yes'
  30. while getopts ":a:b:d:n:t:i:ycpe" opt; do
  31. case $opt in
  32. d)
  33. DEBIAN_RELEASE=$OPTARG
  34. ;;
  35. b)
  36. BOARD=$OPTARG
  37. ;;
  38. a)
  39. PACKAGES=$OPTARG
  40. ;;
  41. n)
  42. DEB_HOSTNAME=$OPTARG
  43. ;;
  44. t)
  45. TARGET_DIR=$OPTARG
  46. ;;
  47. i)
  48. INSTALL_KERNEL=$OPTARG
  49. ;;
  50. y)
  51. INSTALL_YUNOHOST=yes
  52. ;;
  53. c)
  54. CROSS=yes
  55. ;;
  56. p)
  57. APTCACHER=yes
  58. ;;
  59. e)
  60. ENCRYPT=yes
  61. ;;
  62. \?)
  63. show_usage
  64. ;;
  65. esac
  66. done
  67. . ${REP}/config_board.sh
  68. rm -rf $TARGET_DIR && mkdir -p $TARGET_DIR
  69. chroot_deb (){
  70. LC_ALL=C LANGUAGE=C LANG=C chroot $1 /bin/bash -c "$2"
  71. }
  72. umount_dir (){
  73. # Umount proc, sys, and dev
  74. umount -l "$1"/dev/pts
  75. umount -l "$1"/dev
  76. umount -l "$1"/proc
  77. umount -l "$1"/sys
  78. }
  79. if [ ${CROSS} ] ; then
  80. # Debootstrap
  81. mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
  82. bash ${REP}/script/binfmt-misc-arm.sh unregister
  83. bash ${REP}/script/binfmt-misc-arm.sh
  84. debootstrap --arch=armhf --foreign $DEBIAN_RELEASE $TARGET_DIR
  85. cp /usr/bin/qemu-arm-static $TARGET_DIR/usr/bin/
  86. cp /etc/resolv.conf $TARGET_DIR/etc
  87. chroot_deb $TARGET_DIR '/debootstrap/debootstrap --second-stage'
  88. elif [ ${APTCACHER} ] ; then
  89. debootstrap $DEBIAN_RELEASE $TARGET_DIR http://localhost:3142/ftp.fr.debian.org/debian/
  90. else
  91. debootstrap $DEBIAN_RELEASE $TARGET_DIR
  92. fi
  93. # mount proc, sys and dev
  94. mount -t proc chproc $TARGET_DIR/proc
  95. mount -t sysfs chsys $TARGET_DIR/sys
  96. mount -t devtmpfs chdev $TARGET_DIR/dev || mount --bind /dev $TARGET_DIR/dev
  97. mount -t devpts chpts $TARGET_DIR/dev/pts || mount --bind /dev/pts $TARGET_DIR/dev/pts
  98. # Configure debian apt repository
  99. cat <<EOT > $TARGET_DIR/etc/apt/sources.list
  100. deb http://ftp.fr.debian.org/debian $DEBIAN_RELEASE main contrib non-free
  101. deb http://security.debian.org/ $DEBIAN_RELEASE/updates main contrib non-free
  102. EOT
  103. cat <<EOT > $TARGET_DIR/etc/apt/apt.conf.d/71-no-recommends
  104. APT::Install-Suggests "0";
  105. EOT
  106. if [ ${APTCACHER} ] ; then
  107. cat <<EOT > $TARGET_DIR/etc/apt/apt.conf.d/01proxy
  108. Acquire::http::Proxy "http://localhost:3142";
  109. EOT
  110. fi
  111. chroot_deb $TARGET_DIR 'apt-get update'
  112. if [ $ENCRYPT ] ; then
  113. PACKAGES=$PACKAGES" dropbear busybox cryptsetup "
  114. fi
  115. # Add useful packages
  116. chroot_deb $TARGET_DIR "$APT openssh-server ntp parted locales vim-nox bash-completion rng-tools $PACKAGES"
  117. echo 'HRNGDEVICE=/dev/urandom' >> $TARGET_DIR/etc/default/rng-tools
  118. echo '. /etc/bash_completion' >> $TARGET_DIR/root/.bashrc
  119. # Use dhcp on boot
  120. cat <<EOT > $TARGET_DIR/etc/network/interfaces
  121. auto lo
  122. iface lo inet loopback
  123. allow-hotplug eth0
  124. iface eth0 inet dhcp
  125. post-up ip a a fe80::42:babe/128 dev eth0
  126. allow-hotplug usb0
  127. iface usb0 inet dhcp
  128. EOT
  129. # Debootstrap optimisations from igorpecovnik
  130. # change default I/O scheduler, noop for flash media, deadline for SSD, cfq for mechanical drive
  131. cat <<EOT >> $TARGET_DIR/etc/sysfs.conf
  132. block/mmcblk0/queue/scheduler = noop
  133. #block/sda/queue/scheduler = cfq
  134. EOT
  135. # flash media tunning
  136. if [ -f "$TARGET_DIR/etc/default/tmpfs" ]; then
  137. sed -e 's/#RAMTMP=no/RAMTMP=yes/g' -i $TARGET_DIR/etc/default/tmpfs
  138. sed -e 's/#RUN_SIZE=10%/RUN_SIZE=128M/g' -i $TARGET_DIR/etc/default/tmpfs
  139. sed -e 's/#LOCK_SIZE=/LOCK_SIZE=/g' -i $TARGET_DIR/etc/default/tmpfs
  140. sed -e 's/#SHM_SIZE=/SHM_SIZE=128M/g' -i $TARGET_DIR/etc/default/tmpfs
  141. sed -e 's/#TMP_SIZE=/TMP_SIZE=1G/g' -i $TARGET_DIR/etc/default/tmpfs
  142. fi
  143. # Generate locales
  144. sed -i "s/^# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/" $TARGET_DIR/etc/locale.gen
  145. sed -i "s/^# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/" $TARGET_DIR/etc/locale.gen
  146. chroot_deb $TARGET_DIR "locale-gen en_US.UTF-8"
  147. # Update timezone
  148. echo 'Europe/Paris' > $TARGET_DIR/etc/timezone
  149. chroot_deb $TARGET_DIR "dpkg-reconfigure -f noninteractive tzdata"
  150. if [ "$DEBIAN_RELEASE" = "jessie" ] ; then
  151. # Add fstab for root
  152. chroot_deb $TARGET_DIR "echo '/dev/mmcblk0p1 / ext4 defaults 0 1' >> /etc/fstab"
  153. # Configure tty
  154. install -m 755 -o root -g root ${REP}/config/ttyS0.conf $TARGET_DIR/etc/init/ttyS0.conf
  155. chroot_deb $TARGET_DIR 'cp /lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service'
  156. chroot_deb $TARGET_DIR 'sed -e s/"--keep-baud 115200,38400,9600"/"-L 115200"/g -i /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service'
  157. # specifics packets add and remove
  158. #chroot_deb $TARGET_DIR "debconf-apt-progress -- apt-get -y install libnl-3-dev busybox-syslogd software-properties-common python-software-properties"
  159. #chroot_deb $TARGET_DIR "apt-get -y remove rsyslog"
  160. # don't clear screen tty1
  161. #chroot_deb $TARGET_DIR 'sed -e s,"TTYVTDisallocate=yes","TTYVTDisallocate=no",g -i /etc/systemd/system/getty.target.wants/getty@tty1.service'
  162. # enable root login for latest ssh on jessie
  163. chroot_deb $TARGET_DIR "sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config"
  164. else
  165. # Configure tty
  166. echo T0:2345:respawn:/sbin/getty -L ttyS0 115200 vt100 >> $TARGET_DIR/etc/inittab
  167. fi
  168. # Good right on some directories
  169. chroot_deb $TARGET_DIR 'chmod 1777 /tmp/'
  170. chroot_deb $TARGET_DIR 'chgrp mail /var/mail/'
  171. chroot_deb $TARGET_DIR 'chmod g+w /var/mail/'
  172. chroot_deb $TARGET_DIR 'chmod g+s /var/mail/'
  173. # Set hostname
  174. echo $DEB_HOSTNAME > $TARGET_DIR/etc/hostname
  175. sed -i "1i127.0.1.1\t${DEB_HOSTNAME}" $TARGET_DIR/etc/hosts
  176. # Add firstrun and secondrun init script
  177. install -m 755 -o root -g root ${REP}/script/firstrun $TARGET_DIR/usr/local/bin/
  178. install -m 755 -o root -g root ${REP}/script/secondrun $TARGET_DIR/usr/local/bin/
  179. install -m 444 -o root -g root ${REP}/script/firstrun.service $TARGET_DIR/etc/systemd/system/
  180. install -m 444 -o root -g root ${REP}/script/secondrun.service $TARGET_DIR/etc/systemd/system/
  181. chroot_deb $TARGET_DIR "/bin/systemctl daemon-reload >> /dev/null"
  182. chroot_deb $TARGET_DIR "/bin/systemctl enable firstrun >> /dev/null"
  183. if [ $INSTALL_YUNOHOST ] ; then
  184. chroot_deb $TARGET_DIR "$APT git"
  185. chroot_deb $TARGET_DIR "git clone https://github.com/YunoHost/install_script /tmp/install_script"
  186. chroot_deb $TARGET_DIR "cd /tmp/install_script && ./install_yunohostv2 -a"
  187. fi
  188. if [ $INSTALL_KERNEL ] ; then
  189. if [ $INSTALL_KERNEL = 'testing' ] ; then
  190. echo 'deb http://ftp.fr.debian.org/debian testing main' > $TARGET_DIR/etc/apt/sources.list.d/testing.list
  191. # Install linux-image, u-boot and flash-kernel from testing (Debian strech)
  192. cat <<EOT > ${TARGET_DIR}/etc/apt/preferences.d/kernel-testing
  193. Package: linux-image*
  194. Pin: release o=Debian,a=testing
  195. Pin-Priority: 990
  196. Package: u-boot*
  197. Pin: release o=Debian,a=testing
  198. Pin-Priority: 990
  199. Package: flash-kernel*
  200. Pin: release o=Debian,a=testing
  201. Pin-Priority: 990
  202. Package: *
  203. Pin: release o=Debian,a=testing
  204. Pin-Priority: 50
  205. EOT
  206. umount_dir $TARGET_DIR
  207. chroot_deb $TARGET_DIR 'apt-get update'
  208. chroot_deb $TARGET_DIR 'apt-get upgrade -y --force-yes'
  209. mkdir $TARGET_DIR/etc/flash-kernel
  210. echo $FLASH_KERNEL > $TARGET_DIR/etc/flash-kernel/machine
  211. if [ $ENCRYPT ] ; then
  212. PACKAGES="stunnel dropbear busybox"
  213. echo 'LINUX_KERNEL_CMDLINE="console=ttyS1 hdmi.audio=EDID:0 disp.screen0_output_mode=EDID:1280x720p60 root=/dev/mapper/root cryptopts=target=root,source=/dev/mmcblk0p2,cipher=aes-xts-plain64,size=256,hash=sha1 rootwait sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_no_mali_mem_reserve sunxi_fb_mem_reserve=0 panic=10 loglevel=6 consoleblank=0"' > $TARGET_DIR/etc/default/flash-kernel
  214. echo 'aes' >> $TARGET_DIR/etc/initramfs-tools/modules
  215. echo 'aes_x86_64' >> $TARGET_DIR/etc/initramfs-tools/modules
  216. echo 'aes_generic' >> $TARGET_DIR/etc/initramfs-tools/modules
  217. echo 'dm-crypt' >> $TARGET_DIR/etc/initramfs-tools/modules
  218. echo 'dm-mod' >> $TARGET_DIR/etc/initramfs-tools/modules
  219. echo 'sha256' >> $TARGET_DIR/etc/initramfs-tools/modules
  220. echo 'sha256_generic' >> $TARGET_DIR/etc/initramfs-tools/modules
  221. echo 'lrw' >> $TARGET_DIR/etc/initramfs-tools/modules
  222. echo 'xts' >> $TARGET_DIR/etc/initramfs-tools/modules
  223. echo 'crypto_blkcipher' >> $TARGET_DIR/etc/initramfs-tools/modules
  224. echo 'gf128mul' >> $TARGET_DIR/etc/initramfs-tools/modules
  225. else
  226. echo 'LINUX_KERNEL_CMDLINE="console=ttyS1 hdmi.audio=EDID:0 disp.screen0_output_mode=EDID:1280x720p60 root=/dev/mmcblk0p1 rootwait sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_no_mali_mem_reserve sunxi_fb_mem_reserve=0 panic=10 loglevel=6 consoleblank=0"' > $TARGET_DIR/etc/default/flash-kernel
  227. fi
  228. chroot_deb $TARGET_DIR "DEBIAN_FRONTEND=noninteractive $APT linux-image-armmp flash-kernel u-boot-sunxi u-boot-tools $PACKAGES"
  229. if [ $ENCRYPT ] ; then
  230. echo 'root /dev/mmcblk0p2 none luks' >> $TARGET_DIR/etc/crypttab
  231. echo '/dev/mapper/root / ext4 defaults 0 1' > $TARGET_DIR/etc/fstab
  232. echo '/dev/mmcblk0p1 /boot ext4 defaults 0 2' >> $TARGET_DIR/etc/fstab
  233. sed -i -e 's#DEVICE=#DEVICE=eth0#' $TARGET_DIR/etc/initramfs-tools/initramfs.conf
  234. cp ${REP}/script/initramfs/cryptroot $TARGET_DIR/etc/initramfs-tools/hooks/cryptroot
  235. cp ${REP}/script/initramfs/openvpn $TARGET_DIR/etc/initramfs-tools/hooks/openvpn
  236. cp ${REP}/script/initramfs/httpd $TARGET_DIR/etc/initramfs-tools/hooks/httpd
  237. cp ${REP}/script/initramfs/httpd_start $TARGET_DIR/etc/initramfs-tools/scripts/local-top/httpd
  238. cp ${REP}/script/initramfs/httpd_stop $TARGET_DIR/etc/initramfs-tools/scripts/local-bottom/httpd
  239. cp ${REP}/script/initramfs/stunnel $TARGET_DIR/etc/initramfs-tools/hooks/stunnel
  240. cp ${REP}/script/initramfs/stunnel.conf $TARGET_DIR/etc/initramfs-tools/
  241. cp ${REP}/script/initramfs/stunnel_start $TARGET_DIR/etc/initramfs-tools/scripts/local-top/stunnel
  242. cp ${REP}/script/initramfs/stunnel_stop $TARGET_DIR/etc/initramfs-tools/scripts/local-bottom/stunnel
  243. mkdir -p $TARGET_DIR/etc/initramfs-tools/root
  244. cp -r ${REP}/script/initramfs/www $TARGET_DIR/etc/initramfs-tools/root/
  245. chroot_deb $TARGET_DIR "update-initramfs -u -k all"
  246. fi
  247. else
  248. cp ${INSTALL_KERNEL}/*.deb $TARGET_DIR/tmp/
  249. chroot_deb $TARGET_DIR 'dpkg -i /tmp/*.deb'
  250. rm $TARGET_DIR/tmp/*
  251. cp ${INSTALL_KERNEL}/boot.scr $TARGET_DIR/boot/
  252. chroot_deb $TARGET_DIR "ln -s /boot/dtb/$DTB /boot/board.dtb"
  253. umount_dir $TARGET_DIR
  254. fi
  255. fi
  256. # Add 'olinux' for root password and force to change it at first login
  257. chroot_deb $TARGET_DIR '(echo olinux;echo olinux;) | passwd root'
  258. chroot_deb $TARGET_DIR 'chage -d 0 root'
  259. # Remove useless files
  260. chroot_deb $TARGET_DIR 'apt-get clean'
  261. rm $TARGET_DIR/etc/resolv.conf
  262. if [ ${CROSS} ] ; then
  263. rm $TARGET_DIR/usr/bin/qemu-arm-static
  264. fi
  265. if [ ${APTCACHER} ] ; then
  266. rm $TARGET_DIR/etc/apt/apt.conf.d/01proxy
  267. fi