Advertisement
AdmiralNemo

Gentoo libvirt VM install

Mar 19th, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.93 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. DOMNAME="$1"
  4. STAGE_TBZ="$2"
  5. KERNEL_PKG="$3"
  6.  
  7. if [ -z "${DOMNAME}" ]; then
  8.     echo "usage: ${0##*/} name [stage_tarball [kernel_pkg]]"
  9.     exit 2
  10. fi
  11.  
  12. unset $(env | awk -F= '/^LC_/{print $1}')
  13. export LC_ALL=C
  14.  
  15. set -e
  16.  
  17.  
  18. : ${POOL:=default}
  19. : ${HOSTNAME:=$(printf ${DOMNAME} | tr '[A-Z]' '[a-z]')}
  20. : ${BINPKG_DIR:=default-linux/amd64/amdfam10}
  21. : ${PORTAGE_PROFILE=default/linux/amd64/13.0}
  22.  
  23. mountpoint=${TMPDIR:-/tmp}/${HOSTNAME}
  24. mkdir ${mountpoint}
  25.  
  26. virsh vol-create-as ${POOL} ${DOMNAME}.img ${VDISKSIZE:-6G}
  27. vol_path=$(virsh vol-path ${DOMNAME}.img ${POOL})
  28.  
  29. i=$(pgrep -fa ^nbd | sed -r 's/[0-9]+\s+nbd//' | sort -nr | head -n1)
  30. blkdev=/dev/nbd$((${i:--1} + 1))
  31. unset i
  32.  
  33. echo 'Creating logical volumes and filesystems ...'
  34. sudo /bin/sh -e <<EOS
  35. qemu-nbd -c ${blkdev} ${vol_path}
  36.  
  37. sgdisk -a 4096 -Z -g \
  38.     -n 1::+1M \
  39.     -t 1:EF02 \
  40.     -c 1:'BIOS boot partition' \
  41.     -n 2::+32M \
  42.     -c 2:'Linux filesystem' \
  43.     -n 3:: \
  44.     -t 3:8E00 \
  45.     -c 3:'Linux LVM' \
  46.     ${blkdev}
  47.  
  48. pvscan > /dev/null
  49.  
  50. pvcreate ${blkdev}p3
  51. vgcreate ${HOSTNAME} ${blkdev}p3
  52. lvcreate -nswap -L1G ${HOSTNAME}
  53. lvcreate -nroot -L300M ${HOSTNAME}
  54. lvcreate -nusr -L1200M ${HOSTNAME}
  55. lvcreate -nvar -L400M ${HOSTNAME}
  56. lvcreate -nopt -L100M ${HOSTNAME}
  57. lvcreate -nhome -L100M ${HOSTNAME}
  58. mkswap -Lswap /dev/${HOSTNAME}/swap
  59. mkfs.ext4 -q -Lboot ${blkdev}p2
  60. for v in root usr var opt home; do
  61.     mkfs.xfs -q -L\$v /dev/${HOSTNAME}/\$v
  62. done
  63. EOS
  64.  
  65. [ -z "${STAGE_TBZ}" ] && exit 0
  66.  
  67. echo 'Mounting filesystems ...'
  68. sudo /bin/sh -e <<EOS
  69. mount /dev/${HOSTNAME}/root ${mountpoint}
  70.  
  71. install -d ${mountpoint}/boot
  72. mount ${blkdev}p2 ${mountpoint}/boot
  73.  
  74. for v in usr var opt home; do
  75.     install -d ${mountpoint}/\$v
  76.     mount /dev/${HOSTNAME}/\$v ${mountpoint}/\$v
  77. done
  78. EOS
  79.  
  80. echo 'Extracting stage tarball ...'
  81. sudo tar -xaf "${STAGE_TBZ}" -C ${mountpoint}
  82.  
  83. portdir=$(portageq repos_config / | python3 -c '
  84. import configparser, sys
  85. c = configparser.ConfigParser()
  86. c.read_file(sys.stdin)
  87. s = c["DEFAULT"]["main-repo"]
  88. print(c[s]["location"])
  89. ')
  90. distdir=$(portageq envvar DISTDIR)
  91. while ! mountpoint -q ${pkgdir:=$(portageq envvar PKGDIR)}; do
  92.     pkgdir=${pkgdir%/*}
  93.     test -n "${pkgdir}"
  94. done
  95.  
  96. echo 'Configuring portage ...'
  97. sudo /bin/sh -e <<EOS
  98. cd ${mountpoint}
  99. rm -rf run/openrc
  100. mount -t proc proc proc
  101. mount -t sysfs sysfs sys
  102. mount -t tmpfs tmpfs tmp
  103. mount -t tmpfs tmpfs run
  104. mount -obind /dev dev
  105. mount -obind /dev/pts dev/pts
  106. mount -obind /dev/shm dev/shm
  107.  
  108. install -d \
  109.     var/cache/portage/tree \
  110.     var/cache/portage/distfiles \
  111.     var/cache/portage/binpkgs
  112. mount -obind ${portdir} var/cache/portage/tree
  113. mount -obind ${distdir} var/cache/portage/distfiles
  114. mount -obind ${pkgdir} var/cache/portage/binpkgs
  115.  
  116. cd ${mountpoint}/etc/portage
  117. rm -rf repos.conf
  118. mkdir repos.conf
  119. sed -r -e s@/usr/portage@/var/cache/portage/tree@ \
  120.     < /usr/share/portage/config/repos.conf \
  121.     > repos.conf/gentoo.conf
  122.  
  123. rm -rf make.conf
  124. mkdir make.conf
  125. cat > make.conf/00_base.conf <<EOF
  126. CHOST="x86_64-pc-linux-gnu"
  127. CFLAGS="-O2 -pipe"
  128. CXXFLAGS="\${CFLAGS}"
  129.  
  130. DISTDIR="${distdir}"
  131. PKGDIR="${pkgdir}"
  132.  
  133. EMERGE_DEFAULT_OPTS="--usepkg --jobs --load-average=3 --quiet-fail=y"
  134. FEATURES=""
  135. MAKEOPTS="-j9"
  136. EOF
  137. cat > make.conf/05_default-use.conf <<EOF
  138. USE="caps -cups filecaps -gpm"
  139. EOF
  140. cat > make.conf/10_cpu-flags.conf <<EOF
  141. CPU_FLAGS_X86="3dnow 3dnowext mmx mmext sse sse2"
  142. EOF
  143. EOS
  144.  
  145. echo 'Configuring host ...'
  146. sudo chroot ${mountpoint} /bin/sh -e <<EOS
  147. env-update
  148.  
  149. eselect profile set ${PORTAGE_PROFILE}
  150.  
  151. FEATURES=-news emerge --noreplace --quiet grub xfsprogs
  152. grub2-install ${blkdev}
  153. cat > /boot/grub/grub.cfg <<EOF
  154. timeout=1
  155.  
  156. menuentry 'Gentoo Linux' {
  157.     root=hd0,gpt2
  158.     linux /vmlinuz root=/dev/${HOSTNAME}/root dolvm net.ifnames=0 quiet
  159.     initrd /initramfs
  160. }
  161. EOF
  162.  
  163. sed -i s/localhost/${HOSTNAME}/ /etc/conf.d/hostname
  164.  
  165. cat > /etc/fstab <<EOF
  166. LABEL=swap  none    swap    sw  0 0
  167. LABEL=boot  /boot   ext4    noauto,noatime  1 2
  168. /dev/${HOSTNAME}/root   /   xfs ro,noatime  0 1
  169. /dev/${HOSTNAME}/usr    /usr    xfs ro,noatime  0 2
  170. /dev/${HOSTNAME}/var    /var    xfs noatime 0 2
  171. /dev/${HOSTNAME}/opt    /opt    xfs ro,noatime  0 2
  172. /dev/${HOSTNAME}/home   /home   xfs noatime 0 2
  173. tmpfs   /tmp    tmpfs   defaults    0 0
  174. EOF
  175.  
  176. ln -snf /proc/self/mounts /etc/mtab
  177. ln -snf /run/resolv.conf /etc/resolv.conf
  178. ln -snf /run/ntp.conf /etc/ntp.conf
  179.  
  180. passwd -d root
  181. EOS
  182.  
  183. if [ -n "${KERNEL_PKG}" ]; then
  184.     echo 'Extracting kernel package ...'
  185.     sudo tar --no-same-owner --no-same-permissions --strip-components=1 \
  186.         -xaf "${KERNEL_PKG}" -C ${mountpoint}
  187. fi
  188.  
  189. echo 'Cleaning up ...'
  190. awk '$5~/'${HOSTNAME}'/{print $5}' /proc/self/mountinfo | tac \
  191.     | xargs sudo umount
  192. sudo vgchange -an ${HOSTNAME}
  193. sudo qemu-nbd -d ${blkdev}
  194.  
  195. virt-install --name ${DOMNAME} \
  196.     --ram ${VRAM:-1024} \
  197.     --vcpus ${VCPUS:-2} \
  198.     --os-type linux \
  199.     --os-variant rhel7 \
  200.     --boot hd \
  201.     --disk ${vol_path} \
  202.     --network bridge=${VNET:-br0} \
  203.     --graphics vnc \
  204.     --video cirrus \
  205.     --memballoon model=virtio \
  206.     --noautoconsole
  207.  
  208. rmdir ${mountpoint}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement