From e9dcf7e9c56004af4f8b53975b7ea49ecc4ac6a1 Mon Sep 17 00:00:00 2001 From: "antoine.perederii" Date: Fri, 9 Dec 2022 10:05:46 +0100 Subject: [PATCH] kk --- vdn/bin/vdn-start | 993 ---------------------------------------------- 1 file changed, 993 deletions(-) delete mode 100755 vdn/bin/vdn-start diff --git a/vdn/bin/vdn-start b/vdn/bin/vdn-start deleted file mode 100755 index 9dc538f..0000000 --- a/vdn/bin/vdn-start +++ /dev/null @@ -1,993 +0,0 @@ -#!/usr/bin/env bash - -set -eu - -set -m # Jobs control - -# Script pour l'exécution d'un système virtuel -# -------------------------------------------- - -NICE=10 -EXPR="" -READ_ON_ERROR=0 -GUI=0; -VDN_TERM=0 -BG=0 - -EXCLUDE_SERVICES="" - -set -a - -# Dans le cas où une redirection (cf. REDIRS ci-dessus) échoue, -# attendre que le port se libère (0) ou chercher le premier port libre -# suivant (1). - -PORT_INC_ALLOWED=1 - -set +a - -# début des fonctions - -synopsis() { - cat << EOF -Usage : `basename $0` [-h] [-f] [-g] [-e] [-t] [-v expr] system -EOF -} - -help() { - cat << EOF - -`basename $0` démarre un système virtuel. - -`synopsis` - -Un nom de système correspond au nom d'un répertoire situé dans le -sous répertoire "systems" de Vdn. - --h : affiche cette aide --b : execute le système en arrière plan. --d : mode DEBUG. --g : si l'interface graphique est démarrée, lui délègue le démarrage. --t : le terminal courant est utilisé en console. --e : Attendre "Entrée" si erreur. --v exp : évalue une expression. Pratique pour la surcharge de variables. - exemple : -v "MEMORY=32; SWAP_SIZE=32" - -EOF -} - -usage() { - synopsis - exit 2 -} - -args() { - local opt - while getopts "hebdgtv:" opt; do - case $opt in - h) help; exit 0;; - b) BG=1;; - d) export VDN_DEBUG=1;; - e) READ_ON_ERROR=1;; - g) GUI=1;; - t) VDN_TERM=1;; - v) export EXPR="$OPTARG";; - ?) usage;; - esac - done - shift $(($OPTIND - 1)) - [ $# -ne 1 ] && usage - - GUEST_NAME="$1" - if echo $GUEST_NAME | grep -q '/'; then - error "$GUEST_NAME est un nom de système invalide" - fi - - case "$GUEST_NAME" in - sae103) - - VDN_TERM=1 - - net=$(vdn-get-network) - if [ "$net" != "/home/ia/vdn/sae103" ]; then - vdn-set-network-dir /home/ia/vdn/sae103 - export NETWORK_DIR=/home/ia/vdn/sae103 - SAVE_DIR="$SAVE_PATH/$(basename $NETWORK_DIR)" - fi - ;; - esac -} - -testIfAlreadyStarted() { - set +e - vdn-alive $GUEST_NAME - r=$? - - [ $r -eq 0 ] && error "Le système virtuel $GUEST_NAME est déjà lancé" -} - - -testVariables() { - [ -z "$AUFS_SIZE" ] && error "AUFS_SIZE not set" -} - -createConfigFile() { - local dir=$TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-config/etc/vdn - set +u - [ -z "$http_proxy" ] && export http_proxy="" - [ -z "$https_proxy" ] && export https_proxy="" - [ -z "$POST_BOOT" ] && POST_BOOT="" - set -u - - NB_ETH=$(echo $NETWORKS | wc -w) - - - echo -n "Compute network vars... " - #PUBLICS_IP=$(for i in $(vdn-list); do ip=$(vdn-infos $i | grep PUB | sed -re 's/^.*"([0-9.]+)" .*$/\1/'); echo -n "$i:$ip "; done) - PUBLICS_IP=$(for i in $(vdn-list); do ip=$(vdn-query PUBLIC_IP $i); echo -n "$i:$ip "; done) - - PUBLIC_IP=$(vdn-query PUBLIC_IP 0 $GUEST_NAME.$NETWORK_NAME) - - echo "done" - - echo >&2 - echo "NETWORKS : $NETWORKS" >&2 - echo "NB_ETH : $NB_ETH" >&2 - echo "PUBLICS_IP: $PUBLICS_IP" >&2 - - cat < $dir/config - -PUBLICS_IP="$PUBLICS_IP" -HOSTS="$HOSTS" -NETWORKS="$NETWORKS" -NETWORK_DIR="$NETWORK_DIR" - -VDN_RESOLV="$VDN_RESOLV" - -VDN_RESOURCES_ALLOCATOR="$VDN_RESOURCES_ALLOCATOR" - - -VDN_PATH="$VDN_PATH" -GUEST_SYS="$GUEST_SYS" -MOUNT_ROOT_PATH="$MOUNT_ROOT_PATH" -EMULATOR="$EMULATOR" - -MODE="$MODE" - -HDA="$HDA" -HDB="$HDB" -HDB_PART_FORMAT="$HDB_PART_FORMAT" -HDB_DIRS="$HDB_DIRS" - -GUEST_PATH="$GUEST_PATH" -GUEST_NAME="$GUEST_NAME" -GUEST_OWNER="$GUEST_OWNER" - -NB_ETH="$NB_ETH" -NB_DISK="$NB_DISK" -PUBLIC_IP="$PUBLIC_IP" - -ON_BOOT="$ON_BOOT" # deprecié -POST_BOOT="$POST_BOOT" -SET_HOSTNAME="$SET_HOSTNAME" - -EXTRA_ETH="$EXTRA_ETH" -EXTRA_ETH_DEFAULT_ROUTE="$EXTRA_ETH_DEFAULT_ROUTE" -EXTRA_ETH_MASQUERADING="$EXTRA_ETH_MASQUERADING" -SET_PROXY="$SET_PROXY" - -AUFS_FILE="$AUFS_FILE" -AUFS_SIZE="$AUFS_SIZE" - -SAVE_EXCLUDE="$SAVE_EXCLUDE" -CLEAR_LOG_WHEN_SAVE="$CLEAR_LOG_WHEN_SAVE" -DELETE_LOG_GZ="$DELETE_LOG_GZ" - -SWAP_FILE="$SWAP_FILE" -SWAP_SIZE="$SWAP_SIZE" - -SSH_IDENTITY="$SSH_IDENTITY" - -EXTRA_SERVICES="$EXTRA_SERVICES" -EXCLUDE_SERVICES="$EXCLUDE_SERVICES" - -RUNLEVEL="$RUNLEVEL" - -DATE=`date +%Y.%m.%d-%T` - -if [ "\$SET_PROXY" = 1 ]; then - - HTTP_PROXY="$http_proxy" - HTTPS_PROXY="$https_proxy" - - echo "export http_proxy=\"\$HTTP_PROXY\"" >> /etc/bash.bashrc - echo "export https_proxy=\"\$HTTPS_PROXY\"" >> /etc/bash.bashrc -fi - -DEFAULT_LANG="$DEFAULT_LANG" - -TIMEZONE="$TIMEZONE" - -XKBMODEL="$XKBMODEL" -XKBLAYOUT="$XKBLAYOUT" -XKBVARIANT="$XKBVARIANT" -XKBOPTIONS="$XKBOPTIONS" -BACKSPACE="$BACKSPACE" - -VDN_DEBUG="$VDN_DEBUG" -EOF -} - -waitEndOfRedirsOld() { - local n=0 - #while netstat -A inet -a -n | grep TIME_WAIT | \ - while ss -a -f inet -n -i state time-wait | \ - grep -q "^$1[[:space:]].*:$2[[:space:]]"; do - if [ $n = 0 ]; then - echo "Attente de la libération du port $2 (1 minute environ...)">&2 - fi - n=1 - sleep 1 - done -} - - - -# Create partition for union - -createUnionPart() { - echo "Create overlayfs ($AUFS_SIZE Mo). " - - - - if [ -n "$AUFS_FILE" ]; then - - [ ! -d $(dirname $AUFS_FILE) ] && mkdir -p $(dirname $AUFS_FILE) - - [ -e $AUFS_FILE ] && rm $AUFS_FILE - dd of=$AUFS_FILE bs=1k seek=$(($AUFS_SIZE*1024)) count=0 &> /dev/null - /sbin/mke2fs -q -F -t ext4 $AUFS_FILE - fi - - #rm -f $OUT_FILE - #dd of=$OUT_FILE bs=1k seek=$(($AUFS_SIZE*1024)) count=0 - - -} - -prepareSwap() { - if [ -n "$SWAP_FILE" ]; then - [ -e $SWAP_FILE ] && rm $SWAP_FILE - if [ -z "$SWAP_SIZE" ]; then - echo -e "SWAP_SIZE not set !" >&2 - exit 2 - fi - echo "Create swap ($SWAP_SIZE Mo). " - dd of=$SWAP_FILE bs=1k seek=$(($SWAP_SIZE*1024)) count=0 &> /dev/null - chmod 600 $SWAP_FILE - /sbin/mkswap $SWAP_FILE > /dev/null - #echo " done." - fi -} - -tgzPrepare() { - createUnionPart -} - -injectScriptsInConfigDir() { - local srcDir=$1 - local dstDir=$2 - - if [ -d $srcDir ]; then - local list=$(cd $srcDir; ls | grep -v prepare.sh*) - if [ -n "$list" ]; then - ( cd $srcDir; cp -a $list $dir/etc/vdn ) - if [ -e $dir/etc/vdn/rc.local ]; then - mv $dir/etc/vdn/rc.local $dir/etc - chmod 755 $dir/etc/rc.local - #echo "SET FILE : $dir/etc/rc.local" - #echo "=== EXTRA === : " - #cat $dir/etc/rc.local | grep EXTRA - fi - fi - fi -} - -createConfigDir() { - local dir=$TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-config - local tgz="$dir.tgz" - - - #echo "Create config dir..." - - rm -Rf $dir - - mkdir -m 700 $dir - - mkdir -p $dir/etc/vdn - - # Copie des fichiers d'initialisation (/etc/rc.local et autres - # du répertoire direct - - injectScriptsInConfigDir $VDN_PATH/distribs/guests/direct/$GUEST_SYS $dir - - # idem mais spécialise les fichiers (COW, OVERLAY, TGZ) - - if [ $MODE != direct ]; then - injectScriptsInConfigDir $VDN_PATH/distribs/guests/$MODE/$GUEST_SYS $dir - fi - - createConfigFile - - local cp=0 - - for i in $SSH_IDENTITY; do - [ ! -d $dir/etc/vdn/.ssh ] && { - mkdir -p $dir/etc/vdn/.ssh - chmod 700 $dir/etc/vdn/.ssh - } - if [ -e $i ]; then - cp $i $dir/etc/vdn/.ssh/ - cp=1 - fi - done - - [ $cp = 0 ] && error "Aucune clé SSH !" - - [ -e $NETWORK_DIR/authorized-root.txt ] && \ - cp $NETWORK_DIR/authorized-root.txt $dir/etc/vdn - - # Add host files - - for i in $HOST_FILES; do - [ ! -d $dir/etc/vdn/host/$(dirname $i) ] && mkdir -p $dir/etc/vdn/host/$(dirname $i) || : - cp -a $i $dir/etc/vdn/host/$(dirname $i) - done - - if [ -d $NETWORK_DIR/all ]; then - [ ! -d $dir/etc/vdn/all ] && mkdir -p $dir/etc/vdn/all - ( cd $NETWORK_DIR/all && tar czf - . ) | ( cd $dir/etc/vdn/all && tar -xpzf -) - fi - - if [ -d $NETWORK_DIR/$GUEST_NAME ]; then - [ ! -d $dir/etc/vdn/guest ] && mkdir -p $dir/etc/vdn/guest - ( cd $NETWORK_DIR/$GUEST_NAME && tar czf - . ) | ( cd $dir/etc/vdn/guest && tar -xpzf - ) - fi - - # note used - #cp /etc/hosts $dir/etc/vdn - #cp /etc/resolv.conf $dir/etc/vdn - - if [ -d $VDN_PATH/scripts ]; then - cp -a $VDN_PATH/scripts/* $dir/etc/vdn - fi - - # Add allocator - [ -d $dir/etc/vdn/allocators ] && rm -Rf $dir/etc/vdn/allocators - cp -a $VDN_PATH/allocators $dir/etc/vdn - - # Add vdn resolv - cp $VDN_PATH/tools/libnss_vdn.so $dir/etc/vdn - - # Build disk - - ( cd $dir; tar -czf $tgz .; chmod 600 $tgz) - #echo -n "Create config disk... " - dd if=/dev/zero bs=512 count=1 >> $tgz 2> /dev/null - #echo "done." - - #echo "done." - -} - -### KVM (Kernel Virtual Machine) - - -kvm_query_networks() { - - . $VDN_PATH/allocators/$VDN_RESOURCES_ALLOCATOR - - - # 1. redirections - - #if [ $EXTRA_ETH = 1 ]; then - - rm -f $TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-redirs - REDIRS=$(echo "$REDIRS" | sed -re 's/[[:space:]]+/ /g') - REDIRS=$(echo "$REDIRS" | sed -re 's/^[[:space:]]+//g') - REDIRS=$(echo "$REDIRS" | sed -re 's/[[:space:]]+$//g') - REDIRS=$(echo "$REDIRS" | sed -re 's/[[:space:]]/\n/g') - - - #echo "REDIRS:$REDIRS" >&2 - - redirs=` - redirsOpt="" - [ -n "$REDIRS" ] || error "REDIRS empty !" - echo "$REDIRS" | ( - export IFS=":" - i=0 - while read proto dstPort com; do - [ -z "$dstPort" ] && continue - - - #echo "dstPort:$dstPort" >&2 - #srcPort=$(vdn_redir $dstPort) - [ -z "$proto" ] && continue - - #set -x - - srcPort=$(computeRedir $GUEST_NAME $proto $dstPort) - - echo "port:$srcPort" >&2 - #set +x - - #if [ "$PORT_INC_ALLOWED" = 1 ]; then - # srcPort=$(findUnusedPort $proto $srcPort $dstPort) - #fi - #waitEndOfRedirs $proto $srcPort - redirsOpt="$redirsOpt -redir $proto:$srcPort::$dstPort" - - echo "Add to : $TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-redirs" >&2 - echo "$proto:$srcPort:$dstPort:$com">>$TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-redirs - done - echo "$redirsOpt" - ) - ` - #fi - - # 2. cartes Ethernet - - set - $NETWORKS - - #echo -n "-net user " - - #for i in `seq 0 $(($NB_ETH-1))`; do - - ETH=0 - - for i; do - #set -x - net="$i" - - comment=$(echo $net | cut -d '#' -f 2) - net=$(echo $net | cut -d '#' -f 1) - [ "$net" = "$comment" ] && comment="" - - - - [ "$net" = "NET_G" ] && net="NET_0" - - [ "$net" = "$comment" ] && comment="" - - netNum=$(echo $net | sed -re 's/^ *NET_([0-9]+).*$/\1/') - - mac=$(computeMacAddr $GUEST_NAME $ETH) - - if [ "$net" = "none" ]; then - local qemuVersion=$(qemu-system-x86_64 --version | grep version | sed -re 's/^.*version ([0-9.]+).*$/\1/') - if [ "$qemuVersion" \< "3.0.0" ]; then - echo -n "-device virtio-net-pci,mac=$mac " - else - echo -n "-device virtio-net-pci,mac=$mac -nic none " - fi - else - if [ $netNum = 0 ]; then - group=$MCAST_COMMON_ADDR - port=$MCAST_BASE_PORT - else - mcast=$(computeEthLink $GUEST_NAME $netNum) - echo "inetNum:$netNum mcast:$mcast" >&2 - group=`echo $mcast | cut -d : -f 1` - port=`echo $mcast | cut -d : -f 2` - fi - - echo -n "-device virtio-net-pci,netdev=n$(($netNum)),mac=$mac -netdev socket,id=n$(($netNum)),mcast=$group:$port " - fi - - ETH=$(($ETH+1)) - - done - - [ $EXTRA_ETH = 1 ] && { - mac=$(computeMacAddr $GUEST_NAME $NB_ETH) - redirs=$(echo $redirs | sed -re 's/^ *//') - - echo -n "-device virtio-net-pci,netdev=e0,mac=$mac -netdev user,id=e0$redirs" - #echo -n "-net nic,vlan=0,model=$NET_MODEL -net user,vlan=0$redirs" - - } || : -} - -kvm_graphic() { - GRAPHICAL_OPTS="" - - if [ $KVM_VIEWER = "vnc" ]; then - set +e - ps auwx | grep -v grep |grep -q 'ruby.*vdn-gui' - GUI_RUNNING=$? - set -e - if [ $KVM_VIEWER_AUTOSTART = 1 ]; then - if [ $KVM_VIEWER_EMBEDDED = 1 -a $GUI_RUNNING = 0 ]; then - ( sleep 3; sendToGui "vnc-viewer $GUEST_NAME" ) & - else - (sleep 3; vdn-vnc-viewer $GUEST_NAME ) & - fi - fi - GRAPHICAL_OPTS="-serial mon:stdio -monitor null -vnc unix:$TMPDIR/vdn-vnc-$USER-$GUEST_NAME-socket -spice unix,disable-ticketing,addr=$TMPDIR/vdn-spice-$USER-$GUEST_NAME-socket" - #GRAPHICAL_OPTS="$GRAPHICAL_OPTS -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent -device virtserialport,chardev=vdagent,name=com.redhat.spice.0" - - elif [ $KVM_VIEWER = "spice" ]; then - set +e - ps auwx | grep -v grep |grep -q 'ruby.*vdn-gui' - GUI_RUNNING=$? - set -e - if [ $KVM_VIEWER_AUTOSTART = 1 ]; then - #if [ $KVM_VIEWER_EMBEDDED = 1 -a $GUI_RUNNING = 0 ]; then - # ( sleep 3; sendToGui "spice-viewer $GUEST_NAME" ) & - #else - (sleep 1; vdn-spice-viewer -b $GUEST_NAME ) & - #fi - fi - GRAPHICAL_OPTS="-serial mon:stdio -monitor null -vnc unix:$TMPDIR/vdn-vnc-$USER-$GUEST_NAME-socket -spice unix,disable-ticketing,addr=$TMPDIR/vdn-spice-$USER-$GUEST_NAME-socket" - GRAPHICAL_OPTS="$GRAPHICAL_OPTS -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent -device virtserialport,chardev=vdagent,name=com.redhat.spice.0" - #GRAPHICAL_OPTS="$GRAPHICAL_OPTS -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel1,id=channel1,name=org.spice-space.stream.0 -chardev spiceport,name=org.spice-space.stream.0,id=charchannel1" - - elif [ $KVM_VIEWER = "sdl" ]; then - GRAPHICAL_OPTS="-serial mon:stdio -monitor null" - - else - GRAPHICAL_OPTS="-serial mon:stdio -monitor null -nographic" - fi -} - -startKvmTgz() { - - # Config - - local r=0 - - [ ! -d $(dirname $SAVE_FILE) ] && mkdir -p $(dirname $SAVE_FILE) - - case "$MODE" in - tgz) - # Sauvegarde - [ ! -e $SAVE_FILE ] && { - #echo -n "Create minimal save file. " - dd if=/dev/zero of=$SAVE_FILE count=1 bs=1 &> /dev/null - #echo "done." - } - DISK_OPTS="$DISK_OPTS -drive file=$SAVE_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - # aufs part - DISK_OPTS="$DISK_OPTS -drive file=$AUFS_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - # swap - [ -n "$SWAP_FILE" ] && - DISK_OPTS="$DISK_OPTS -drive file=$SWAP_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - #DISK_OPTS="$DISK_OPTS -drive file=$OUT_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - ;; - tgz2) - # Sauvegarde - [ ! -e $SAVE_FILE ] && { - #echo -n "Create minimal save file. " - dd if=/dev/zero of=$SAVE_FILE count=1 bs=1 &> /dev/null - #echo "done." - } - DISK_OPTS="$DISK_OPTS -drive file=$SAVE_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - # aufs part - DISK_OPTS="$DISK_OPTS -drive file=$AUFS_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - # swap - [ -n "$SWAP_FILE" ] && - DISK_OPTS="$DISK_OPTS -drive file=$SWAP_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - - ;; - overlay) - # Sauvegarde - [ ! -e $SAVE_FILE ] && { - #echo -n "Create minimal save file. " - dd of=$SAVE_FILE bs=1k seek=$(($AUFS_SIZE*1024)) count=0 &> /dev/null - /sbin/mke2fs -q -F -t ext4 $SAVE_FILE - #echo "done." - } - DISK_OPTS="$DISK_OPTS -drive file=$SAVE_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - # aufs part - # none, is $SAVE_FILE - - # swap - - [ -n "$SWAP_FILE" ] && - DISK_OPTS="$DISK_OPTS -drive file=$SWAP_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - ;; - esac - - KVM_NETWORKS_OPTS="$networks" - - # Options passées au noyau - - case "$MODE" in - tgz2) KOPTS="";; - *) KOPTS="root=/dev/vda1 ro console=ttyS0,115200n8" - KOPTS="$KOPTS vdn-emulator=kvm vdn-mode=$MODE" - KOPTS="$KOPTS net.ifnames=0 noresume" # fastboot quiet" - - KOPTS="root=/dev/vda1 ro console=ttyS0,115200n8" - KOPTS="$KOPTS vdn-emulator=kvm vdn-mode=$MODE" - KOPTS="$KOPTS net.ifnames=0 noresume" # fastboot quiet" - esac - - createConfigDir - - # config disk (last disk) - configTgz=$TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-config.tgz - DISK_OPTS="$DISK_OPTS -drive file=$configTgz,if=$KVM_DISK_MODEL,media=disk,format=raw" - - kvm_graphic - - echo "Start begin (EMULATOR=$EMULATOR, SAVE_FILE=$SAVE_FILE)" - - case "$MODE" in - tgz2) cmd="ionice -c 3 nice -$NICE $EMULATOR \ - $KVM_OPTS $GRAPHICAL_OPTS \ - $DISK_OPTS \ - $KVM_NETWORKS_OPTS \ - " - - echo "==> CMD: $cmd" - - ;; - - *) cmd="ionice -c 3 nice -$NICE $EMULATOR \ - $KVM_OPTS $GRAPHICAL_OPTS \ - -initrd $VDN_PATH/files/$INITRAMFS \ - -kernel $VDN_PATH/files/$KERNEL \ - -append '$KOPTS' \ - $DISK_OPTS \ - $KVM_NETWORKS_OPTS \ - " - ;; - esac - - set +u - [ -z "$FORCE_BG" ] && export FORCE_BG=0 || : - - set -u - - #echo $cmd | tr ' ' '\n' - - if [ $BG = 1 -o \( $FORCE_BG = 1 -a $WITH_GUI = 0 \) ]; then - eval $cmd < /dev/null &> /dev/null & - #r=$? - #trap - 0 - return 0 - fi - #if [ $FORCE_BG = 1 ]; then - # eval $cmd & - #fi - - - if [ "$VDN_TERM" = 0 ]; then - set -e - - $VDN_PATH/bin/vdn-terminal "$cmd" - - r=$? - set +e - else - set +e - eval $cmd - r=$? - stty sane - set -e - fi - return $r -} - -startKvmDirectOrCow() { - - local r=0 - - set +u - if [ "$HDA" = "$VDN_DISK_ENV" ]; then - error "Impossible de monter en écriture le disque $VDN_DISK_ENV \nservant à l'environnement chroot.\nAbandon" - fi - set -u - - if [ ! -e "$VDN_PATH/files/$HDA" ]; then - [ -z "$HDA_SIZE" ] && error "Need HDA_SIZE (in Mo)" - echo "Create $HDA. Size=$HDA_SIZE (Mo)" - dd if=/dev/zero of=$VDN_PATH/files/$HDA count=1 bs=512 - dd of=$VDN_PATH/files/$HDA count=0 bs=1M seek=$HDA_SIZE - fi - - [ $MODE = direct -a ! -w $VDN_PATH/files/$HDA ] && \ - error "No write permission on $VDN_PATH/files/$HDA" - - KVM_NETWORKS_OPTS="$networks" - #KVM_NETWORKS_OPTS="$(eval echo $networks)" - - [ -n "$SWAP_FILE" ] && - DISK_OPTS="$DISK_OPTS -drive file=$SWAP_FILE,if=$KVM_DISK_MODEL,media=disk,format=raw" - - createConfigDir - configTgz=$TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-config.tgz - - set +u - [ -z "$DISK_OPTS" ] && DISK_OPTS="" - set -u - - DISK_OPTS="$DISK_OPTS -drive file=$configTgz,if=$KVM_DISK_MODEL,media=disk,format=raw" - - kvm_graphic - - echo "Start startKvmDirect begin (EMULATOR=$EMULATOR)" - - cmd="ionice -c 3 nice -$NICE $EMULATOR \ - $KVM_OPTS $GRAPHICAL_OPTS \ - $DISK_OPTS \ - $KVM_NETWORKS_OPTS \ - " - - if [ $BG = 1 ]; then - eval $cmd < /dev/null &> /dev/null & - r=$? - trap - 0 - return $r - fi - - if [ "$VDN_TERM" = 0 ]; then - set -e - $VDN_PATH/bin/vdn-terminal "$cmd" - r=$? - set +e - else - set +e - eval $cmd - r=$? - stty sane - set -e - fi - - return $r -} - -startKvm() { - - local r=0 - - echo "Start KVM" - - networks=`kvm_query_networks` - - # for last QEMU versions ( -redir -> hostfwd ) - if echo "$networks" | grep -q -- -redir; then - n=$(echo "$networks" | sed -re 's/-redir +(tcp|udp):([^:]+)::([0-9]+)( |$)/,hostfwd=\1::\2-:\3/g') - networks=$(echo "$n" | sed -re 's/-net user /-net user/g') - fi - - echo "networks : $NETWORKS" >&2 - - NB_DISK=0 - DISK_OPTS="" - - #echo "MODE 1:$MODE" - case "$MODE" in - tgz|overlay|tgz2) - [ $BOOT_CDROM = 1 ] && error "BOOT_CDROM=1 : Can't boot on cdrom !" - #[ -n "$CDROM" ] && warning "CDROM not allowed in tgz mode" - #CDROM="" - tgzPrepare - ;; - cow) - [ -z "$HDA" ] && error "Mode COW : Need HDA Disk" || : - [ -z "$SAVE_FILE" ] && error "Mode COW : Need SAVE_FILE" || : - [ ! -d $(dirname $SAVE_FILE) ] && mkdir -p $(dirname $SAVE_FILE) - [ ! -e "$SAVE_FILE" ] && { - #echo "Create $SAVE_FILE" - - [ $VDN_DEBUG = 1 ] && set -x || : - ( umask 077; qemu-img create -b $VDN_PATH/files/$HDA -f qcow2 $SAVE_FILE ) - set +x - } - ;; - esac - - local boot_hda=on - local boot_cdrom=off - local boot_drive=c - local boot_order=c - - [ $BOOT_CDROM = 1 ] && { - boot_hda=off - boot_cdrom=on - local boot_drive=d - local boot_order=d - } - - #set +x - - case "$MODE" in - tgz|overlay|tgz2) - DISK_OPTS="-boot order=$boot_order -drive file=$VDN_PATH/files/$HDA,if=$KVM_DISK_MODEL,snapshot=on,format=raw" - ;; - cow) - DISK_OPTS="-boot order=$boot_order -drive file=$SAVE_FILE,if=$KVM_DISK_MODEL" - ;; - direct) - DISK_OPTS="-boot order=$boot_order -drive file=$VDN_PATH/files/$HDA,if=$KVM_DISK_MODEL,format=raw" - ;; - *) error "Invalide mode : $MODE" - ;; - esac - - NB_DISK=$(($NB_DISK+1)) - - set +u - [ -z "$SAVE_DIR_HDB" ] && SAVE_DIR_HDB=$SAVE_DIR || : - set -u - - [ ! -d $SAVE_DIR_HDB ] && mkdir -p $SAVE_DIR_HDB || : - - [ -n "$HDB" ] && { - [ ! -e "$SAVE_DIR_HDB/$HDB" ] && { - [ -n "$HDB_SIZE" ] && { - #echo -n "Create HDB ($HDB_SIZE) : $SAVE_DIR_HDB/$HDB... " - dd of=$SAVE_DIR_HDB/$HDB count=0 bs=1M seek=$HDB_SIZE - #echo "done." - } - } - DISK_OPTS="$DISK_OPTS -drive file=$SAVE_DIR_HDB/$HDB,if=$KVM_DISK_MODEL,format=raw" - NB_DISK=$(($NB_DISK+1)) - } - - [ -n "$CDROM" ] && { - [ ! -e "$VDN_PATH/files/$CDROM" ] && { - warning "Cdrom \"$CDROM\" not found !" - } || { - DISK_OPTS="-boot order=$boot_order $DISK_OPTS -drive file=$VDN_PATH/files/$CDROM,media=cdrom" - #NB_DISK=$(($NB_DISK+1)) # /dev/cdrom -> /dev/sr0 - } - } - - prepareSwap - - if [ $KVM_USB_DEVICE_TABLET = 1 ]; then - KVM_OPTS="$KVM_OPTS -usbdevice tablet" - fi - - case $KVM_VIEWER in - no) KVM_OPTS="$KVM_OPTS -nographic";; - sdl) ;; - vnc) ;; - esac - - case "$EMULATOR" in - kvm) [ -w /dev/kvm ] && { - KVM_OPTS="-enable-kvm -cpu host $KVM_OPTS" - cpu=$(getconf _NPROCESSORS_ONLN) - KVM_OPTS="-smp $cpu $KVM_OPTS" - } - EMULATOR=qemu-system-x86_64 - - ;; - qemu) KVM_OPTS="-smp 1 $KVM_OPTS" - EMULATOR=qemu-system-x86_64 - ;; - esac - - #echo "MODE: beforeStart : $MODE" - case $MODE in - tgz|overlay|tgz2) startKvmTgz; r=$?;; - direct|cow) startKvmDirectOrCow; r=$?;; - *) error "Mode $MODE not available" - esac - - return $r - -} - -quit() { - echo "" - #echo "*** $GUEST_NAME stopped !" - #echo "Wait return before rm files !" - #read - #rm -Rf $TMPDIR/vdn-$GUEST_NAME-$GUEST_OWNER-* -} - -# Programme principal - -echo "vdn-start $@" - -VDN_PATH=$(readlink -f $(dirname $0)/..); . $VDN_PATH/bin/functions.sh - -args "$@" - -myLocalHostname=$(hostname) - -if [ "$myLocalHostname" = "tokyo" -o "$myLocalHostname" = "iutclinfvm01l" ]; then - echo "Lancer des VM sur $myLocalHostname n'est ni autorisé ni judicieux !" >&2 - echo "Allez sur une machine de TP (commande scan-dept pour lister celles allumées) !" >&2 - exit 9 -fi - -set +u -[ "$VDN_DEBUG" = "1" ] && set -x || : -set -u - -#verifIdent || exit 2 - -export HOSTS="" - -setGuestVars $GUEST_NAME - -GUEST_OWNER=$USER - -DIRECT=0 - -loadGuestVars $GUEST_NAME - -#if ! /sbin/route -n | grep -q '0.0.0.0' ; then -if ! /sbin/ip route | grep -q default; then - error "Pas de route par défaut ! Consultez la FAQ" -fi - -AUFS_OPTS="" - -NB_ETH=`echo $NETWORKS | wc -w` - - -testIfAlreadyStarted - - -# Délègue à interface graphique - -set +u -[ -z "$WITH_GUI" ] && export WITH_GUI=0 -[ -z "$VDN_GUI" ] && export VDN_GUI=0 -set -u - -if [ $GUI = 1 ]; then - if ps auwx | grep -v grep | grep -q 'ruby.*vdn-gui' ; then - sendToGui "start $GUEST_NAME $EXPR" - exit 0 - fi -fi - -set +u -if [ ! -e $VDN_PATH/files/$INITRAMFS_PATH ]; then - if [ $MODE = "tgz" -o $MODE = "overlay" -o $MODE = "tgz2"]; then - error "Impossible de trouver : $INITRAMFS_PATH" - fi -fi -set -u - - -export MOUNT_ROOT_PATH="$VDN_PATH/distribs/guests/$GUEST_SYS/mount-root" - -#echo -#echo "*** Start $GUEST_NAME ($EMULATOR)" -#echo - - -trap quit 0 - -[ -z "$EMULATOR" ] && EMULATOR="kvm" - -case "$EMULATOR" in - kvm|qemu*) - #EXCLUDE_SERVICES="" - #echo "Start kvm..." - startKvm - r=$?;; - - *) echo "L'émulateur $EMULATOR n'est pas supporté !" >&2; exit 2;; -esac - -exit $r -