2 set -e -f ${DRY_RUN:+-n} -u ${TRACE:+-x}
3 # -e: erreur si une commande non testée échoue.
4 # -f: désactive les jokers dans les chemins.
5 # -u: erreur si une variable non-définie est utilisée.
6 # -x: affiche les commandes exécutées sur la sortie d'erreur standard.
13 DESCRIPTION: ce script regroupe des fonctions utilitaires
14 pour gérer la VM des ateliers _depuis_ son hôte ;
15 il sert à la fois d'outil et de documentation.
16 Voir \`$tool/ateliers_hosted' pour les utilitaires côté VM hébergée.
17 SYNTAX: $0 \$RULE \${RULE}_SYNTAX
19 $(sed -ne 's/^rule_\([^ ]*\) () {\( *#.*\|\)/\t\1\2/p' "$0")
21 $(sed -ne 's/^readonly \([^ =]*\).*}\( *#.*\|\)$/\t$\1\2/p' "$tool"/env.sh "$0")
25 readonly dev_disk
="/dev/xvda"
26 readonly dev_disk_boot
="${dev_disk}1"
27 readonly dev_disk_swap
="${dev_disk}5"
28 readonly dev_disk_root
="${dev_disk}6"
29 readonly dev_disk_var
="${dev_disk}7"
30 readonly dev_disk_home
="${dev_disk}8"
32 rule_xen_config_init
() {
33 tee /etc
/xen
/$vm_fqdn.cfg
<<-EOF
34 # -*- mode: python; -*-
40 vif = ['mac=$vm_mac,bridge=$vm_bridge']
41 disk = ['phy:/dev/domU/$vm_fqdn-disk,hda,w']
42 kernel = "/usr/lib/xen-4.0/boot/hvmloader"
44 device_model = 'qemu-dm'
47 # boot on floppy (a), hard disk (c) or CD-ROM (d)
53 #vnclisten = "0.0.0.0"
59 on_poweroff = 'destroy'
65 sudo xm create
$vm_fqdn.cfg
68 sudo xm shutdown
$vm_fqdn.cfg
72 # Montage du disque de la VM depuis l'hôte
73 test ! -e $vm_dev_disk
74 sudo xm block-attach
0 phy
:/dev
/domU
/$vm_fqdn-disk $vm_dev_disk w
76 rule_disk_unmount
() {
77 # Démontage du disque de la VM depuis l'hôte
79 ! mountpoint
/mnt
/$vm_fqdn
80 sudo xm block-detach
0 $vm_dev_disk
83 # Partitionage du disque de la VM
84 # NOTE: on fait le choix de ne pas utiliser LVM sur la machine virtuelle car :
85 # - pour l'extension de mémoire:
86 # 1. on créera une nouvelle partition sur le LVM de l'hôte
87 # 2. on l'ajoutera comme un disque supplémentaire dans /etc/xen/$vm_fqdn.cfg
88 # 3. on le montera sur /home2 en pensant à changer DHOME=/home2 dans /etc/adduser.conf
89 # - pour la sauvegarde: LVM snapshoot est trop
90 # 1. sauvegarde au niveau applicatif (pgdump, mysqldump)
91 # 2. sauvegarde des configurations (etckeeper, git)
92 # 3. sauvegarde incrémentale et chiffrée des autres fichiers (duplicity)
94 sudo sfdisk
-d $vm_dev_disk <<-EOF
95 # partition table of $vm_dev_disk
98 ${vm_dev_disk}1 : start= 63, size= 497952, Id=83, bootable
99 ${vm_dev_disk}2 : start= 498015, size=418927005, Id= 5
100 ${vm_dev_disk}3 : start= 0, size= 0, Id= 0
101 ${vm_dev_disk}4 : start= 0, size= 0, Id= 0
102 ${vm_dev_disk}5 : start= 498078, size= 1959867, Id=82
103 ${vm_dev_disk}6 : start= 2458008, size= 29302497, Id=83
104 ${vm_dev_disk}7 : start= 31760568, size= 9767457, Id=83
105 ${vm_dev_disk}8 : start= 41528088, size=377896932, Id=83
109 rule_boot_format
() {
110 mount |
grep -q "^$vm_dev_disk_boot "
111 sudo mkfs.ext2
-m 0 -T small
-L "boot" $vm_dev_disk_boot
114 ! mountpoint
/mnt
/$vm_fqdn/boot
115 sudo mount
-v $vm_dev_disk_boot /mnt
/$vm_fqdn/boot
117 rule_boot_unmount
() {
118 mountpoint
/mnt
/$vm_fqdn/boot
119 sudo unmount
-v /mnt
/$vm_fqdn/boot
123 # NOTE: long, optionnel
124 # Déjà fait à la main histoire de pouvoir créer la machine virtuelle plus
125 # rapidement le jour venu.
127 eval "sudo dd if=/dev/urandom of=\$vm_dev_disk_$part"
129 rule_part_clean_stat
() {
130 # USE: exécuter cette fonction dans un shell distinct de rule_part_clean()
131 # lui fait afficher sa progression.
133 eval "pkill -USR1 -f \"^dd if=/dev/urandom of=\$vm_dev_disk_$part\""
135 rule_part_format_root
() {
136 # DECRIPTION: Formatage de /
138 eval dev
="\$vm_dev_disk_$part"
139 sudo cryptsetup luksFormat
--hash=sha512
--key-size=512 --key-file=- \
140 --cipher=aes-xts-essiv
:sha256
--align-payload=8 $dev
141 sudo cryptsetup luksOpen
--key-file=- $dev ${vm}_
${part}_deciphered
142 sudo mkfs.ext4
-m 5 -T ext4
-L ${vm}_
$part -E stripe_width
=32,resize
=15G \
143 /dev
/mapper
/${vm}_
${part}_deciphered
145 rule_format_part
() {
146 # DESCRIPTION: formatage d'une partition distincte de /
147 # NOTE: la clef de chiffrement est dérivée de celle de /,
148 # / doit être déchiffrée pour que cela fonctionne.
150 eval dev
="\$vm_dev_disk_$part"
151 test -e /dev
/mapper
/${vm}_root_deciphered
152 sudo
/lib
/cryptsetup
/scripts
/decrypt_derived
${vm}_root_deciphered |
153 sudo cryptsetup luksFormat
--key-file=- --hash=sha512
--key-size=512 --cipher=aes-xts-essiv
:sha256
$dev
157 eval dev
="\$vm_dev_disk_$part"
158 test -e /dev
/mapper
/${vm}_root_deciphered
159 sudo
/lib
/cryptsetup
/scripts
/decrypt_derived
${vm}_root_deciphered |
160 sudo cryptsetup luksOpen
--key-file=- $dev ${vm}_
${part}_deciphered
162 rule_unmount_part
() {
164 eval dev
="\$vm_dev_disk_$part"
165 sudo cryptsetup luksClose
${vm}_
${part}_deciphered
167 rule_part_format_swap
() {
169 rule_format_part
$part
170 rule_mount_part
$part
171 sudo mkswap
-f -L ${vm}_swap /dev/mapper/${vm}_${part}_deciphered
172 rule_unmount_part
$part
174 rule_part_format_var
() {
176 rule_format_part
$part
177 rule_mount_part
$part
178 sudo mkfs.ext4
-m 5 -T ext4
-L ${vm}_$part -E stripe_width=32,resize=5G /dev/mapper/${vm}_${part}_deciphered
179 rule_unmount_part
$part
181 rule_part_format_home
() {
183 rule_format_part
$part
184 rule_mount_part
$part
185 sudo mkfs.ext4
-m 5 -T ext4
-L ${vm}_$part -E stripe_width=32,resize=200G /dev/mapper/${vm}_${part}_deciphered
186 rule_unmount_part
$part
189 rule_install_debian
() {
190 sudo DEBOOTSTRAP_DIR
=/usr
/share
/debootstrap
/ debootstrap \
191 --arch=$vm_arch --verbose --keyring=/usr
/share
/keyrings
/debian-archive-keyring.gpg \
193 --include=$
(printf '%s,' \
226 $vm_lsb_name /mnt
/$vm_fqdn/ http
://ftp.fr.debian.org
/debian
/
229 mountpoint
/mnt
/$vm_fqdn
230 mountpoint
/mnt
/$vm_fqdn/boot
231 mount
--bind /dev
/mnt
/$vm_fqdn/dev
232 sudo chroot
/mnt
/$vm_fqdn /bin
/bash
233 umount
/mnt
/$vm_fqdn/dev