master
parent
b0ca9e8fa5
commit
e9dcf7e9c5
@ -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 <<EOF > $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
|
||||
|
Loading…
Reference in new issue