Advertisement
chatchai_j

buildvdiimage

Feb 1st, 2013
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 25.61 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # --------------------------------------------------------------------- #
  4. # buildvdimage  - Build raw disk image for VirtualBox and install   #
  5. #         debian system on it. So we can start using the new    #
  6. #         virtual machine immediately without to install and    #
  7. #         configure that system manually.           #
  8. #                                   #
  9. #         Part of this script was modified from         #
  10. #         http://blog.quinthar.com/2008/07/         #
  11. #           building-1gb-bootable-qemu-image-using.html #
  12. #                                   #
  13. # version 0.1   - cj (2010-06-25) init.                 #
  14. # version 0.2   - cj (2010-07-09) ...                   #
  15. # version 0.2e  - cj (2010-07-12) various fixed.            #
  16. # version 0.3   - cj (2010-07-17) various fixed, use with blade{3,4}    #
  17. # version 0.3a  - cj (2010-07-20) add tasksel, and additional pacakages #
  18. # version 0.4   - cj (2010-07-26) WUNCA22 version.          #
  19. # version 0.5   - cj (2010-08-03) ...
  20. # --------------------------------------------------------------------- #
  21.  
  22. export LANG=C
  23.  
  24. VBOXHDD="/home/cj/.VirtualBox/HardDisks"
  25. DIST="lucid"
  26.  
  27. # SVR="ftp.th.debian.org"
  28. SVR="ftp.psu.ac.th"
  29.  
  30. FTPSITE="$SVR"
  31. VMFTPSITE="$SVR"
  32.  
  33. # FTPSITE="localhost:3142/$SVR"
  34. # VMFTPSITE="10.0.2.2:3142/$SVR"
  35.  
  36. # DEBREPO="http://$SVR/debian"
  37. # DEBREPO="file:///var/cache/apt-cacher-ng/$SVR/debian"
  38.  
  39. # DEBREPO="http://$FTPSITE/debian"
  40. DEBREPO="http://$FTPSITE/pub/ubuntu"
  41.  
  42. # TASKLIST="thai-desktop"
  43. TASKLIST=""
  44. # PKGLIST="netcat zenity tshark wireshark"
  45. PKGLIST=""
  46.  
  47. USER="me"
  48. PASSWORD="********"
  49. USERNAME="Who am I"
  50.  
  51. VMHOSTNAME="lucid32"
  52.  
  53. SWAPSIZE=128
  54. BOOTSIZE=128
  55. HOMESIZE=256
  56.  
  57. MOUNT="mount"
  58.  
  59. dumphdinfo="VBoxManage -q internalcommands dumphdinfo"
  60.  
  61. hdinfo="/tmp/${VMHOSTNAME}.hdinfo"
  62. fstab="/tmp/${VMHOSTNAME}.fstab"
  63. devlist="/tmp/${VMHOSTNAME}.devlist"
  64. parted="/tmp/${VMHOSTNAME}.parted"
  65.  
  66. # --------------------------------------------------------------------- #
  67. # Check that whether binary needed for this setup  is existed.      #
  68. # --------------------------------------------------------------------- #
  69.  
  70. check_command() {
  71.     local CMD="$1"
  72.     if [ ! -x "$CMD" ]; then
  73.         echo "$CMD not exist."
  74.         exit
  75.     fi
  76. }
  77.  
  78. # --------------------------------------------------------------------- #
  79. # Create various configuration files                    #
  80. # --------------------------------------------------------------------- #
  81.  
  82. ### ----- /etc/resolv.conf ----- ###
  83. # It's difficult to generate /etc/resolv.conf by ourself,
  84. # but it should be safe to copy from building host to the VM
  85. # since it is likely to be used in the same environment.
  86.  
  87. create_resolv_conf() {
  88.     local MOUNT="$1"
  89.  
  90.     [ -z "$MOUNT" ] && echo "ERR: resolv.conf" && exit
  91.     sudo cp /etc/resolv.conf $MOUNT/etc
  92. }
  93.  
  94. ### ----- /etc/hosts ----- ###
  95. # Standard /etc/hosts, without self IP address and name...
  96. create_hosts() {
  97.     local MOUNT="$1"
  98.  
  99.     [ -z "$MOUNT" ] && echo "ERR: hosts" && exit
  100.     cat << _EOT_ > /tmp/hosts.$$
  101. 127.0.0.1   localhost localhost.localdomain
  102.  
  103. ::1     localhost ip6-localhost ip6-loopback
  104. fe00::0 ip6-localnet
  105. ff00::0 ip6-mcastprefix
  106. ff02::1 ip6-allnodes
  107. ff02::2 ip6-allrouters
  108. _EOT_
  109.     sudo mv -vf /tmp/hosts.$$ $MOUNT/etc/hosts
  110. }
  111.  
  112. ### ----- /etc/hostname ----- ###
  113. create_hostname() {
  114.     local MOUNT="$1"
  115.  
  116.     [ -z "$MOUNT" ] && echo "ERR: hostname" && exit
  117.     sudo sh -c "(echo '$VMHOSTNAME' > $MOUNT/etc/hostname)"
  118. }
  119.  
  120. ### ----- /etc/fstab ----- ###
  121. create_fstab() {
  122.     local MOUNT="$1"
  123.  
  124.     [ -z "$MOUNT" ] && echo "ERR: fstab" && exit
  125.     cat << _EOT_ > /tmp/fstab.$$
  126. # <file system> <mount point> <types> <options> <dump> <pass>
  127. proc        /proc   proc    defaults        0   0
  128. _EOT_
  129.     cat $fstab >> /tmp/fstab.$$
  130.     sudo mv -vf /tmp/fstab.$$ $MOUNT/etc/fstab
  131. }
  132.  
  133. ### ----- /etc/kernel-img.conf ----- ###
  134. create_kernel_img_conf() {
  135.     local MOUNT="$1"
  136.  
  137.     [ -z "$MOUNT" ] && echo "ERR: kernel-img.conf" && exit
  138.     cat << _EOT_ > /tmp/kernel-img.conf.$$
  139. do_symlinks = yes
  140. relative_links = yes
  141. do_bootloader = yes
  142. do_bootfloppy = no
  143. do_initrd = yes
  144. link_in_boot = no
  145. _EOT_
  146.     sudo mv -vf /tmp/kernel-img.conf.$$ $MOUNT/etc/kernel-img.conf
  147. }
  148.  
  149. ### ----- /etc/apt/sources.list ----- ### packages update during install ###
  150. create_tmp_apt_sources_list() {
  151.     local MOUNT="$1"
  152.  
  153.     [ -z "$MOUNT" ] && echo "ERR: sources.list" && exit
  154.     cat << _EOT_ > /tmp/sources.list.$$
  155. deb http://${FTPSITE}/pub/ubuntu lucid main
  156. _EOT_
  157.     sudo mv -vf /tmp/sources.list.$$ $MOUNT/etc/apt/sources.list
  158. }
  159.  
  160. ### ----- /etc/apt/sources.list ----- ### supposed to be real one ###
  161. create_real_apt_sources_list() {
  162.     local MOUNT="$1"
  163.    
  164.     [ -z "$MOUNT" ] && echo "ERR: sources.list" && exit
  165.     cat << _EOT_ > /tmp/sources.list.$$
  166. deb http://${FTPSITE}/pub/ubuntu lucid main
  167. _EOT_
  168.     sudo mv -vf /tmp/sources.list.$$ $MOUNT/etc/apt/sources.list
  169. }
  170.  
  171. ### ----- /etc/apt/sources.list ----- ### real one using under VM ###
  172. create_vm_apt_sources_list() {
  173.     local MOUNT="$1"
  174.  
  175.     [ -z "$MOUNT" ] && echo "ERR: sources.list" && exit
  176.     cat << _EOT_ > /tmp/final-sources.list.$$
  177. deb http://${FTPSITE}/put/ubuntu lucid main
  178. _EOT_
  179.     sudo mv -vf /tmp/final-sources.list.$$ $MOUNT/etc/apt/sources.list
  180. }
  181.  
  182. ### ----- /etc/network/interfaces ----- ###
  183. create_network_interfaces() {
  184.     local MOUNT="$1"
  185.  
  186.     [ -z "$MOUNT" ] && echo "ERR: interfaces" && exit
  187.     cat << _EOT_ > /tmp/interfaces.$$
  188. auto lo
  189. iface lo inet loopback
  190.  
  191. allow-hotplug eth0
  192. iface eth0 inet dhcp
  193. _EOT_
  194.  
  195.     sudo mv -f /tmp/interfaces.$$ $MOUNT/etc/network/interfaces
  196. }
  197.  
  198. ### ----- various config files in /etc ----- ###
  199. create_config_files() {
  200.     local MOUNT="$1"
  201.  
  202.     [ -z "$MOUNT" ] && echo "ERR: config files" && exit
  203.     create_resolv_conf $MOUNT       # /etc/resolv.conf
  204.     create_hosts $MOUNT         # /etc/hosts
  205.     create_hostname $MOUNT          # /etc/hostname
  206.     create_fstab $MOUNT         # /etc/fstab
  207.     create_kernel_img_conf $MOUNT       # /etc/kernel_img_conf
  208.     create_tmp_apt_sources_list $MOUNT  # /etc/apt/sources.list
  209.     create_network_interfaces $MOUNT    # /etc/network/interfaces
  210. }
  211.  
  212. ### ----- /boot/grub/menu.lst ----- ###
  213. create_boot_grub_menu_list() {
  214.     local MOUNT="$1"
  215.  
  216.     [ -z "$MOUNT" ] && echo "ERR: menu.list" && exit
  217.     # check whether if /boot are in different partition
  218.     local boot="$(grep /boot $fstab)"
  219.  
  220.     # No separate boot partition?
  221.     if [ -z "$boot" ]; then
  222.         BOOT="/boot"
  223.         ROOT="/dev/sda1"
  224.     else
  225.         BOOT=""
  226.         ROOT="/dev/sda2"
  227.     fi
  228.  
  229.     cat << _EOT_ > /tmp/menu.lst.$$
  230. timeout 3
  231. default 0
  232.  
  233. _EOT_
  234.  
  235.     (
  236.     cd $MOUNT/boot;
  237.     for k in vmlinuz-*; do
  238.         v=$(echo $k | cut -f2- -d-)
  239.         if [ -f "initrd.img-$v" ]; then
  240.             cat << _EOT_ >> /tmp/menu.lst.$$
  241. title Debian Linux $v
  242. root (hd0,0)
  243. kernel $BOOT/vmlinuz-$v root=$ROOT ro verbose
  244. initrd $BOOT/initrd.img-$v
  245.  
  246. _EOT_
  247.         fi
  248.     done
  249.     )
  250.  
  251.     sudo mv -f /tmp/menu.lst.$$ $MOUNT/boot/grub/menu.lst
  252. }
  253.  
  254. # --------------------------------------------------------------------- #
  255. # create_policy_rc_d    Create policy-rc.d for handle tasksel tasks #
  256. #           install on chroot environment.          #
  257. # --------------------------------------------------------------------- #
  258.  
  259. create_policy_rc_d() {
  260.     local MOUNT="$1"
  261.  
  262.     [ -z "$MOUNT" ] && echo "ERR: policy-rc.d" && exit
  263.     cat << _EOT_ > /tmp/policy-rc.d.$$
  264. #!/bin/sh
  265. exit 101
  266. _EOT_
  267.     chmod a+rx /tmp/policy-rc.d.$$
  268.     sudo mv -vf /tmp/policy-rc.d.$$ $MOUNT/usr/sbin/policy-rc.d
  269. }
  270.  
  271. # --------------------------------------------------------------------- #
  272. # config_grub   This must be done after grub and kernel has been    #
  273. #       installed to the raw disk device.           #
  274. # --------------------------------------------------------------------- #
  275.  
  276. config_grub() {
  277.     local device="$1" MOUNT="$2"
  278.  
  279.     [ -z "$device" ] && echo "ERR: device of grub" && exit
  280.     [ -z "$MOUNT" ] && echo "ERR: grub.input" && exit
  281.     cat << _EOT_ > /tmp/grub.input
  282. device (hd0) $device
  283. root (hd0,0)
  284. setup --stage2=/boot/grub/stage2 (hd0)
  285. quit
  286. _EOT_
  287.  
  288.     sudo mkdir $MOUNT/boot/grub
  289.     sudo cp $MOUNT/usr/lib/grub/i386-pc/* $MOUNT/boot/grub
  290.  
  291.     create_boot_grub_menu_list $MOUNT
  292.  
  293.     sudo chroot $MOUNT grub --batch --device-map=/dev/null  \
  294.         < /tmp/grub.input               \
  295.         > /tmp/grub.log
  296.  
  297.     # If first time failed, then try once again, ...
  298.     if [ "$(grep ^Error /tmp/grub.log)" ]; then
  299.         sudo chroot $MOUNT grub --batch --device-map=/dev/null  \
  300.             < /tmp/grub.input               \
  301.             > /tmp/grub2.log
  302.  
  303.         # If it still failed, then we gave up!
  304.         if [ "$(grep ^Error /tmp/grub2.log)" ]; then
  305.             echo "Failed to install grub."
  306.             echo "Please see /tmp/grub.log /tmp/grub2.log"
  307.             exit
  308.         fi
  309.     fi
  310. }
  311.  
  312. # --------------------------------------------------------------------- #
  313. # binding_mount     Binding mount points to chroot environment  #
  314. # --------------------------------------------------------------------- #
  315.  
  316. binding_mount() {
  317.     local MOUNT="$1"
  318.  
  319.     [ -z "$MOUNT" ] && echo "ERR: mount" && exit
  320.     # Binding mount point
  321.     echo "Bind /proc to $MOUNT/proc"
  322.     sudo mount --bind /proc $MOUNT/proc
  323.  
  324.     echo "Mount $MOUNT/dev/pts"
  325.     sudo mount -t devpts none $MOUNT/dev/pts
  326. }
  327.  
  328. # --------------------------------------------------------------------- #
  329. # binding_umount    Un-binding mount points from chroot environment #
  330. # --------------------------------------------------------------------- #
  331.  
  332. binding_umount() {
  333.     local MOUNT="$1"
  334.  
  335.     [ -z "$MOUNT" ] && echo "ERR: umount" && exit
  336.     sudo umount $MOUNT/proc
  337.     sudo umount $MOUNT/dev/pts
  338. }
  339.  
  340. # --------------------------------------------------------------------- #
  341. # create_vdi    - Create the fixed size VDI disk image file.        #
  342. # --------------------------------------------------------------------- #
  343.  
  344. create_vdi() {
  345.     local name="$1" size="$2"
  346.  
  347.     [ -f "$name" ] && echo "File '$name' already exist." && exit
  348.     [ -z "$size" ] && echo "ERR: create_vdi size" && exit
  349.  
  350.     VBoxManage -q createhd --filename "$name" --size "$size" \
  351.         --format VDI --variant Fixed
  352. }
  353.  
  354. # --------------------------------------------------------------------- #
  355. # verify_vdi    - Verify that the vdi is actual fixed size VDI image.   #
  356. # --------------------------------------------------------------------- #
  357.  
  358. verify_vdi() {
  359.     local file="$1"
  360.  
  361.     [ -z "$file" ] && echo "ERR: verify_vdi filename" && exit
  362.  
  363.     $dumphdinfo $file > $hdinfo
  364.     if [ "$(grep 'Format autodetect failed' $hdinfo)" ]; then
  365.         echo "File '$file' is not a VDI file."
  366.         exit
  367.     fi
  368.  
  369.     version=$(  grep '^Header: Version=' $hdinfo    |\
  370.             cut -f3 -d=             |\
  371.             cut -f1 -d' '               )
  372.  
  373.     [ -z "$version" -o "$version" != "2" ]              && \
  374.         echo "File '$file' is not a fixed disk VDI image."  && \
  375.         exit
  376.  
  377. }
  378.  
  379. # --------------------------------------------------------------------- #
  380. # loop_dev_setup    - Setup loop device for the disk image for  #
  381. #             create partition on the image file.       #
  382. # --------------------------------------------------------------------- #
  383.  
  384. loop_dev_setup() {
  385.     local file="$1"
  386.  
  387.     [ -z "$file" ] && echo "ERR: loop_dev_setup filename" && exit
  388.  
  389.     loopdev=$(sudo losetup -f)
  390.  
  391.     offset=$(   $dumphdinfo $file       |\
  392.             grep offStartData       |\
  393.             cut -f4 -d=         )
  394.  
  395.     echo "Setup loop device $loopdev for $file"
  396.     sudo losetup --offset $offset $loopdev $file
  397.     sudo losetup -a
  398.  
  399.     # We need to do this first to get disksize
  400.     sudo parted -s $loopdev mklabel msdos
  401.  
  402.     disk_size=$(sudo parted -s $loopdev print | grep ^Disk | cut -f3 -d' ')
  403.  
  404.     # Check that size should be in MB unit
  405.     if [ "$(echo $disk_size | sed -e 's/^[0-9]*//')" != "MB" ]; then
  406.         echo "Disk size '$disk_size' is not in MB unit."
  407.         exit
  408.     fi
  409.  
  410.     # Get only number part
  411.     disk_size=$(echo $disk_size | sed -e 's/MB$//')
  412. }
  413.  
  414. # --------------------------------------------------------------------- #
  415. # set_part_scheme   - Set partition scheme. Select the predefine    #
  416. #             partitions, for create that on disk image.    #
  417. # --------------------------------------------------------------------- #
  418.  
  419. set_part_scheme() {
  420.     local scheme="$1"
  421.  
  422.     case "$scheme" in
  423. # --------------------------------------------------------------------- #
  424. # /dev/sda1 /   ext3    defaults 0 1    -- everything       #
  425. # --------------------------------------------------------------------- #
  426.     1)
  427.     boot_size=0
  428.     swap_size=0
  429.     root_size=$disk_size
  430.     home_size=0
  431.     ;;
  432. # --------------------------------------------------------------------- #
  433. # /dev/sda1 /   ext3    defaults 0 1    -- the rest     #
  434. # /dev/sda5 none    swap    sw   0 0    -- 128 MB SWAP      #
  435. # --------------------------------------------------------------------- #
  436.     2)
  437.     boot_size=0
  438.     swap_size=$SWAPSIZE
  439.     root_size=$(( $disk_size - $swap_size ))
  440.     home_size=0
  441.     ;;
  442. # --------------------------------------------------------------------- #
  443. # /dev/sda1 /boot   ext3    defaults 0 1    -- 128 MB /boot     #
  444. # /dev/sda2 /   ext3    defaults 0 1    -- the rest     #
  445. # /dev/sda5 none    swap    sw   0 0    -- 128 MB SWAP      #
  446. # --------------------------------------------------------------------- #
  447.     3)
  448.     boot_size=$BOOTSIZE
  449.     swap_size=$SWAPSIZE
  450.     root_size=$(( $disk_size - $boot_size - $swap_size ))
  451.     home_size=0
  452.     ;;
  453. # --------------------------------------------------------------------- #
  454. # /dev/sda1 /boot   ext3    defaults 0 1    -- 128 MB /boot     #
  455. # /dev/sda2 /   ext3    defaults 0 1    -- the rest     #
  456. # /dev/sda3 /home   ext3    defaults 0 1    -- 256 MB /home     #
  457. # /dev/sda5 none    swap    sw   0 0    -- 128 MB SWAP      #
  458. # --------------------------------------------------------------------- #
  459.     4)
  460.     home_size=$HOMESIZE
  461.     boot_size=$BOOTSIZE
  462.     swap_size=$SWAPSIZE
  463.     root_size=$(( $disk_size - $boot_size - $swap_size - $home_size))
  464.     ;;
  465.  
  466.     *)  echo "Invalid scheme"
  467.         exit
  468.     ;;
  469.     esac
  470.  
  471. }
  472.  
  473. # --------------------------------------------------------------------- #
  474. # Create parition here.                         #
  475. # --------------------------------------------------------------------- #
  476.  
  477. create_partitions() {
  478.  
  479.     [ -z "$loopdev" ] && echo "ERR: create_partitions loopdev" && exit
  480.  
  481.     boot_start=0
  482.     boot_end=$(($boot_start + $boot_size))
  483.     root_start=$boot_end
  484.     root_end=$(($root_start + $root_size))
  485.     home_start=$root_end
  486.     home_end=$(($home_start + $home_size))
  487.     swap_start=$home_end
  488.     swap_end=$(($swap_start + $swap_size))
  489.     ext_start=$swap_start
  490.     ext_end=$swap_end
  491.  
  492.     sudo parted -s $loopdev mklabel msdos
  493.  
  494.     # clear temporary fstab file
  495.     > $fstab
  496.     devno=1
  497.  
  498. if [ "$boot_size" != 0 ]; then
  499.     sudo parted -s $loopdev mkpart primary ext2 $boot_start $boot_end
  500.     echo "/dev/sda$devno /boot ext3 errors=remount-ro 0 0" >> $fstab
  501.     devno=$(($devno + 1))
  502. fi
  503. if [ "$root_size" != 0 ]; then
  504.     sudo parted -s $loopdev mkpart primary ext2 $root_start $root_end
  505.     echo "/dev/sda$devno / ext3 errors=remount-ro 0 0" >> $fstab
  506.     devno=$(($devno + 1))
  507. fi
  508. if [ "$home_size" != 0 ]; then
  509.     sudo parted -s $loopdev mkpart primary ext2 $home_start $home_end
  510.     echo "/dev/sda$devno /home ext3 errors=remount-ro 0 0" >> $fstab
  511.     devno=$(($devno + 1))
  512. fi
  513. if [ "$swap_size" != 0 ]; then
  514.     devno=5
  515.     sudo parted -s $loopdev mkpart extended $ext_start $ext_end
  516.     sudo parted -s $loopdev mkpart logical linux-swap $swap_start $swap_end
  517.     echo "/dev/sda$devno none swap sw 0 0" >> $fstab
  518.    
  519. fi
  520.     sudo parted -s $loopdev set 1 boot on
  521.     sudo parted -s $loopdev print > $parted
  522. }
  523.  
  524. # --------------------------------------------------------------------- #
  525. # loop_part_mkfs- Make filesystem on each partition accessible by   #
  526. #         loop device.                      #
  527. #         This might be the most dangerous part of this script. #
  528. #         It will format filesystem without asking any question #
  529. # --------------------------------------------------------------------- #
  530.  
  531. loop_part_mkfs() {
  532.     [ -z "$devlist" -o -z "$loopdev" ] && echo "ERR: loop_part_mkfs" && exit
  533.     # Clean up device list
  534.     > $devlist
  535.     sudo sfdisk -uS -l $loopdev         |\
  536.         sed -e 's/\*//'             |\
  537.         grep ^/                 |\
  538.         grep Linux              |\
  539.     while read line; do
  540.         start=$(echo $line | awk '{ print $2; }')
  541.         end=$(echo $line | awk '{ print $3; }')
  542.         swap=$(echo $line | grep 'swap')
  543.  
  544.         offset=$(( $start * 512 ))
  545.         sizelimit=$(( ($end - $start) * 512 ))
  546.  
  547.         looppart=$(sudo losetup -f)
  548.         sudo losetup --offset $offset --sizelimit $sizelimit \
  549.             $looppart $loopdev
  550.  
  551.         # Check whether it is a "Linux swap" partition
  552.         if [ -z "$swap" ]; then
  553.             echo "Make e2fs on $looppart ..."
  554.             sudo mke2fs -j $looppart
  555.             echo "$looppart" >> $devlist
  556.         else
  557.             echo "Make swap on $looppart ..."
  558.             sudo mkswap $looppart
  559.             echo "#$looppart" >> $devlist
  560.         fi
  561.     done
  562. }
  563.  
  564. # --------------------------------------------------------------------- #
  565. # mount_dev Mount one device                    #
  566. # --------------------------------------------------------------------- #
  567.  
  568. mount_dev() {
  569.     local dev="$1" mount="$2"
  570.  
  571.     [ -z "$dev" ] && echo "device is not defined" && exit
  572.     [ -z "$mount" ] && echo "mount point is not defined" && exit
  573.  
  574.     echo "Try mount '$dev' to '$mount'"
  575.     sudo mount -t ext3 $dev $mount || {
  576.         echo "Failed to mount '$dev' to '$mount'"
  577.         exit
  578.     }
  579. }
  580.  
  581. # --------------------------------------------------------------------- #
  582. # loop_part_mount   Mount partition from loop device.       #
  583. # --------------------------------------------------------------------- #
  584.  
  585. # Mount loop device partition for installation
  586. loop_part_mount() {
  587.     local MOUNT="$1"
  588.  
  589.     [ -z "$MOUNT" ] && echo "ERR: loop_part_mount" && exit
  590.  
  591.     local LOOPDEVLIST="$(cat $devlist | grep -v ^# | tr '\n' ' ')"
  592.  
  593.     count=$(echo "$LOOPDEVLIST" | wc -w)
  594.     p1=$(echo "$LOOPDEVLIST" | awk '{ print $1; }')
  595.     p2=$(echo "$LOOPDEVLIST" | awk '{ print $2; }')
  596.     p3=$(echo "$LOOPDEVLIST" | awk '{ print $3; }')
  597.     case $count in
  598.     1)
  599.         mount_dev $p1 $MOUNT
  600.     ;;
  601.     2)
  602.         mount_dev $p2 $MOUNT
  603.         sudo mkdir -p $MOUNT/boot
  604.         mount_dev $p1 $MOUNT/boot
  605.     ;;
  606.     3)
  607.         mount_dev $p2 $MOUNT
  608.         sudo mkdir -p $MOUNT/boot $MOUNT/home
  609.         mount_dev $p1 $MOUNT/boot
  610.         mount_dev $p3 $MOUNT/home
  611.     ;;
  612.     *)
  613.         echo "Hmmm, looppartmount found "$count" partition list"
  614.         echo "List = $LOOPDEVLIST"
  615.         echo "This is unexpected, bail out"
  616.         exit
  617.     ;;
  618.     esac
  619. }
  620.  
  621. # --------------------------------------------------------------------- #
  622. # install_tasks     Install predefined packages using tasksel   #
  623. # --------------------------------------------------------------------- #
  624.  
  625. install_tasks() {
  626.     local MOUNT="$1"
  627.     local TASKLIST=""
  628.  
  629.     [ -z "$MOUNT" ] && echo "ERR: install_tasks" && exit
  630.     shift
  631.     TASKLIST="$@"
  632.     cat << _EOT_ >> /tmp/tasksel.$$
  633. #!/bin/sh
  634. DEBIAN_FRONTEND=noninteractive
  635. DEBIAN_PRIORITY=critical
  636. LANG=C
  637. export DEBIAN_FRONTEND DEBIAN_PRIORITY LANG
  638.  
  639. _EOT_
  640.  
  641.     for task in $TASKLIST; do
  642.         echo "tasksel --new-install install $task" >> /tmp/tasksel.$$
  643.     done
  644.  
  645.     chmod a+rx /tmp/tasksel.$$
  646.     sudo cp /tmp/tasksel.$$ $MOUNT/tmp/tasksel
  647.     sudo chroot $MOUNT /tmp/tasksel
  648. }
  649.  
  650. # --------------------------------------------------------------------- #
  651. # install_packages  Install additional packages         #
  652. # --------------------------------------------------------------------- #
  653.  
  654. install_packages() {
  655.     local MOUNT="$1"
  656.     local PKGLIST=""
  657.  
  658.     [ -z "$MOUNT" ] && echo "ERR: install_pacakges" && exit
  659.     shift
  660.     PKGLIST="$@"
  661.     echo "Install additional package :: $PKGLIST"
  662.     sudo chroot $MOUNT apt-get -y install $PKGLIST
  663. }
  664.  
  665.  
  666. # --------------------------------------------------------------------- #
  667. # cleanup_loopdev   Cleanup loop device             #
  668. # --------------------------------------------------------------------- #
  669.  
  670. cleanup_loopdev() {
  671.     local LOOPDEVLIST="$(cat $devlist | tr '#' ' ' | tr '\n' ' ')"
  672.  
  673.     [ -z "$loopdev" ] && echo "ERR: cleanup_loopdev." && exit
  674.     # then umount every loop device
  675.     for looppart in $LOOPDEVLIST; do
  676.         if [ "$(mount | grep ^$looppart)" ]; then
  677.             echo "Unmount $looppart ..."
  678.             sudo umount $looppart
  679.         fi
  680.     done
  681.  
  682.     # try again, cause we didn't have looppart arrange in order...
  683.     for looppart in $LOOPDEVLIST; do
  684.         if [ "$(mount | grep ^$looppart)" ]; then
  685.             echo "Unmount $looppart ..."
  686.             sudo umount $looppart
  687.         fi
  688.     done
  689.  
  690.     for looppart in $LOOPDEVLIST; do
  691.         echo "Remove loop device $looppart ..."
  692.         sudo losetup -d $looppart
  693.     done
  694.  
  695.     sleep 3
  696.     echo "Finally remove loop device $loopdev"
  697.     sudo losetup -d $loopdev
  698.  
  699.     C=0
  700.     while [ "$(sudo losetup -a | grep $loopdev)" ]; do
  701.         sleep 3
  702.         echo "Remove $loopdev failed, try once again"
  703.         sudo losetup -d $loopdev
  704.         C=$(($C + 1))
  705.         if [ "$C" -gt 3 ]; then
  706.             echo "Too many attempts had been made, I gave up."
  707.             exit
  708.         fi
  709.     done
  710. }
  711.  
  712. # --------------------------------------------------------------------- #
  713. # Main Start Here                           #
  714. # --------------------------------------------------------------------- #
  715.  
  716. [ -z "$3" ] && echo "Usage: $0 file size scheme" && exit
  717.  
  718. file="$1"
  719. size="$2"
  720. scheme="$3"
  721.  
  722. if [ -z "$(echo $file | grep '\.vdi$')" ]; then
  723.     echo "Filename should be in form 'file.vdi'"
  724.     exit
  725. fi
  726.  
  727. check_command /sbin/parted
  728. check_command /usr/sbin/debootstrap
  729. check_command /usr/bin/VBoxManage
  730. check_command /bin/mount
  731. check_command /sbin/losetup
  732.  
  733. [ "$size" -lt 256 -o "$size" -gt 8192 ] && {
  734.     echo "Please choose size between 256-8192"
  735.     exit
  736. }
  737.  
  738. case "$scheme" in
  739.     1|2|3|4)
  740.     ;;
  741.     *)
  742.         echo "Invalid scheme, please choose [1-4]"
  743.         exit
  744.     ;;
  745. esac
  746.  
  747. vdifile="$VBOXHDD/$file"
  748.  
  749. # Get rid of the existing one...
  750. [ -f $vdifile ] && rm -f $vdifile
  751.  
  752. # OK now create a new one, also do create partition on it.
  753. # We will use simple, single partition here, for simplicity.
  754.  
  755. echo "### ====================================================="
  756. echo "### Creating VDI file and also setup it as loop device"
  757. echo "### ====================================================="
  758.  
  759. create_vdi $file $size
  760. verify_vdi $vdifile
  761. loop_dev_setup $vdifile
  762.  
  763. echo "### ====================================================="
  764. echo "### Select parition scheme"
  765. echo "### ====================================================="
  766.  
  767. set_part_scheme $scheme
  768.  
  769. echo "### ====================================================="
  770. echo "### Create Partitions"
  771. echo "### ====================================================="
  772.  
  773. create_partitions
  774.  
  775. # Create filesystem on loopdevice
  776. echo "### ====================================================="
  777. echo "### Create filesystem on loop devices"
  778. echo "### ====================================================="
  779.  
  780. loop_part_mkfs
  781.  
  782. echo "### ====================================================="
  783. echo "### Create mount point '$MOUNT'"
  784. echo "### ====================================================="
  785.  
  786. mkdir -p $MOUNT
  787.  
  788. echo "### ====================================================="
  789. echo "### Mount filesystem to mount points"
  790. echo "### ====================================================="
  791.  
  792. loop_part_mount $MOUNT
  793.  
  794. # Using debootstrap to install debian to raw disk image
  795.  
  796. DEBIAN_FRONTEND=noninteractive
  797. DEBIAN_PRIORITY=critical
  798. export DEBIAN_FRONTEND DEBIAN_PRIORITY
  799.  
  800. echo "### ====================================================="
  801. echo "### Installing $DIST into $MOUNT"
  802. echo "### ====================================================="
  803.  
  804. sudo debootstrap --arch i386 $DIST $MOUNT $DEBREPO
  805.  
  806. # Create various configuration files in mount point
  807. echo "### ====================================================="
  808. echo "### Create various config files"
  809. echo "### ====================================================="
  810.  
  811. create_config_files $MOUNT
  812.  
  813. echo "### ====================================================="
  814. echo "### Binding /proc and /dev/pts"
  815. echo "### ====================================================="
  816.  
  817. binding_mount $MOUNT
  818.  
  819. # trap exit_cleanup EXIT INT
  820.  
  821. create_policy_rc_d $MOUNT
  822.  
  823. echo "### ====================================================="
  824. echo "### Installing kernel into $MOUNT"
  825. echo "### ====================================================="
  826.  
  827. sudo chroot $MOUNT apt-get update
  828. sudo chroot $MOUNT apt-get -y install sudo gnupg grub linux-image-2.6-686
  829.  
  830. echo "### ====================================================="
  831. echo "### Config grub on device $loopdev via mount point $MOUNT"
  832. echo "### ====================================================="
  833.  
  834. config_grub $loopdev $MOUNT
  835.  
  836. echo "### ====================================================="
  837. echo "### Install sshd"
  838. echo "### ====================================================="
  839.  
  840. sudo chroot $MOUNT apt-get -y install ssh
  841. sudo chroot $MOUNT /etc/init.d/ssh stop
  842.  
  843. echo "### ====================================================="
  844. echo "### Setup user account and predefined password"
  845. echo "### ====================================================="
  846. sudo chroot $MOUNT usermod -p '!' root
  847.  
  848. sudo chroot $MOUNT useradd -m -c "$USERNAME" -G sudo $USER
  849. echo "$USER:$PASSWORD" | sudo chroot $MOUNT chpasswd $USER
  850.  
  851. echo "### ====================================================="
  852. echo "### Setup sudoers"
  853. echo "### ====================================================="
  854.  
  855. sudo sh -c "(sed -ie 's/# %sudo/%sudo/' $MOUNT/etc/sudoers)"
  856.  
  857. echo "### ====================================================="
  858. echo "### Install root's sshd key"
  859. echo "### ====================================================="
  860.  
  861. sudo mkdir -p $MOUNT/root/.ssh
  862. if [ -f ~/.ssh/id_rsa.pub ]; then
  863.     sudo cp ~/.ssh/id_rsa.pub $MOUNT/root/.ssh/authorized_keys
  864. fi
  865. sudo chmod -R 755 $MOUNT/root/.ssh
  866.  
  867. if [ "$TASKLIST" ]; then
  868.     echo "### ====================================================="
  869.     echo "### Install preselected tasks"
  870.     echo "### ====================================================="
  871.  
  872.     install_tasks $MOUNT $TASKLIST
  873. fi
  874.  
  875. if [ "$PKGLIST" ]; then
  876.     echo "### ====================================================="
  877.     echo "### Install additional packages."
  878.     echo "### ====================================================="
  879.  
  880.     install_packages $MOUNT $PKGLIST
  881. fi
  882.  
  883. echo "### ====================================================="
  884. echo "### Setup vm's /etc/apt/sources.list"
  885. echo "### ====================================================="
  886.  
  887. create_vm_apt_sources_list $MOUNT
  888.  
  889. echo "### ====================================================="
  890. echo "### Cleaning up"
  891. echo "### ====================================================="
  892.  
  893. binding_umount $MOUNT
  894.  
  895. sudo losetup -a > /tmp/${VMHOSTNAME}.loopdevlist
  896. sudo mount | grep ^/dev/loop > /tmp/${VMHOSTNAME}.loopmount
  897.  
  898. # Umounting and Cleaning up loop devices
  899. cleanup_loopdev
  900.  
  901. # rm -f $devlist
  902.  
  903. echo "Done."
  904.  
  905. # --------------------------------------------------------------------- #
  906. # end of file.                              #
  907. # --------------------------------------------------------------------- #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement