diff --git a/qemu-adm b/qemu-adm index 36b4dc2..0e0c9d7 100755 --- a/qemu-adm +++ b/qemu-adm @@ -1,5 +1,7 @@ #!/bin/bash +#set -x + base_chemin_mv="/tmp/ramdisk/qemu-adm" bin_qemu="/usr/bin/qemu-system-x86_64" bin_qemu_img="/usr/bin/qemu-img" @@ -34,6 +36,10 @@ initEnv() die "La création du sous-volume dans le système de fichier cible n'est pas possible." 7 fi esac + ;; + "repMV") + mkdir -p ${base_chemin_mv}/${nom_mv} + ;; esac } @@ -47,7 +53,7 @@ nouvMV() echo "-name ${1} \\" > ${chemin_mv} ;; "cpu") - echo "-cpu ${1} -smp cores=${2},theads=${3},sockets=1 \\" >> ${chemin_mv} + echo "-cpu ${1} -smp cores=${2},threads=${3},sockets=1 \\" >> ${chemin_mv} ;; "memoire") echo "-m ${1} \\" >> ${chemin_mv} @@ -72,7 +78,7 @@ nouvMV() echo "-drive file=${1},if=virtio \\" >> ${chemin_mv} ;; "iso") - echo "--cdrom ${1} \\" >> ${chemin_mv} + echo "-cdrom ${1} \\" >> ${chemin_mv} ;; "reseau") if [[ "${4}" != "false" ]]; then @@ -86,9 +92,13 @@ nouvMV() echo "#8021Q=${7}" >> ${chemin_mv} ;; esac + echo "#INTERFACE=${1}" >> ${chemin_mv} echo "-device ${2},netdev=${1} -netdev tap,id=${1},ifname=${1},script=no,downscript=no \\" >> ${chemin_mv} ;; + "kvm") + echo "-enable-kvm \\" >> ${chemin_mv} + ;; "parametres") echo "$@ \\" >> ${chemin_mv} ;; @@ -386,16 +396,25 @@ creeMV() die "L'option ${1} a déjà été renseignée." 3 fi ;; - "-f") # Force - # Permet d'eviter la demande de confirmation de création - echo "force" # Debogage - if [[ ${temoin_f} -ne 1 ]]; then - #commandes_a_executer+=( "nouvMV ${nom_mv}") - temoin_s=f + "-k") # KVM + echo "KVM" + if [[ ${temoin_k} -ne 1 ]]; then + commandes_a_executer+=( "nouvMV kvm") + temoin_k=1 else die "L'option ${1} a déjà été renseignée." 3 fi ;; + # "-f") # Force + # # Permet d'eviter la demande de confirmation de création + # echo "force" # Debogage + # if [[ ${temoin_f} -ne 1 ]]; then + # #commandes_a_executer+=( "nouvMV ${nom_mv}") + # temoin_s=f + # else + # die "L'option ${1} a déjà été renseignée." 3 + # fi + # ;; '-h') # Aide usage "cree" exit 0 @@ -419,13 +438,127 @@ creeMV() die "Les parametres -c et -m sont obligatoires." 2 fi #verifMVExiste ${nom_mv} + commandes_init_a_executer+=( "initEnv repMV" ) execCmd "${commandes_init_a_executer[@]}" - mkdir -p ${base_chemin_mv}/${nom_mv} execCmd "${commandes_a_executer[@]}" echo "########## FICHIER ##########" # Debogage cat ${chemin_mv} # Debogage } +genCmdIntRzo(){ + # Création d'une interface non étiqueté (access) + if [[ "${pont_init}" -eq 1 && "${vlan_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then + commandes_a_executer+=( "ip tuntap add ${interface} mode tap" ) + commandes_a_executer+=( "ip link set ${interface} up" ) + commandes_a_executer+=( "ip link set ${interface} master ${pont}" ) + commandes_a_executer+=( "bridge vlan del dev ${interface} vid 1 PVID untagged master" ) + commandes_a_executer+=( "bridge vlan add dev ${interface} vid ${vlan} pvid untagged master" ) + + # Réinitialisation des variables témoins + pont_init=0 + vlan_init=0 + interface_init=0 + + # Création d'une interface étiqueté (trunk) + elif [[ "${pont_init}" -eq 1 && "${ieee8021q_init}" -eq 1 && "${interface_init}" -eq 1 ]]; then + commandes_a_executer+=( "ip tuntap add ${interface} mode tap" ) + commandes_a_executer+=( "ip link set ${interface} up" ) + commandes_a_executer+=( "ip link set ${interface} master ${pont}" ) + commandes_a_executer+=( "bridge vlan del dev ${interface} vid 1 PVID untagged master" ) + for ((id_label_vlan=0 ; "${nb_params_label}" - "${id_label_vlan}" ; id_label_vlan++)); do + commandes_a_executer+=( "bridge vlan add dev ${interface} vid ${label_vlan[${id_label_vlan}]} tagged master" ) + done + + # Réinitialisation des variables témoins + pont_init=0 + ieee8021q_init=0 + interface_init=0 + + fi + echo "commandes_a_executer=${commandes_a_executer[@]}" # Debogage +} + +# Fonction exécuté en premier. Récupère les paramètres du fichier de configuration du conteneur +recupParams(){ + declare -a params_int=( $(grep -B 3 "^-device" ${chemin_mv}) ) + nb_params="${#params_int[*]}" + echo "nb_params=${nb_params}" # Debogage + + for ((id_param_fichier=0 ; "${nb_params}" - "${id_param_fichier}" ; id_param_fichier++)); do + nom_param=$(echo "${params_int[${id_param_fichier}]}" | grep -v '#.*-device' | sed "s/=.*//" | sed "s/#//") + val_param=$(echo "${params_int[${id_param_fichier}]}" | sed "s/.*=//") + echo "nom_param=${nom_param}" # Debogage + echo "val_param=${val_param}" # Debogage + + # Récupération des données d'après le fichier de configuration + if [ "${nom_param}" == "PONT" ]; then + echo "ip link show ${val_param}" # Debogage + if [[ $(ip link show "${val_param}" 2> /dev/null) ]]; then + pont="${val_param}" + pont_init=1 + echo "pont_init=1" # Debogage + else + echo "Erreur: le pont ${val_param} n'existe pas. Arrêt immédiat du script \"${0}\" sans aucune modification du système." + exit 1 + fi + elif [ "${nom_param}" == "VLAN" ]; then + if [[ "${val_param}" =~ ^-?[0-9]+$ && "${val_param}" -ge 1 && "${val_param}" -le 4094 && $(echo -n "${val_param}" | cut -c 1) -ne 0 ]]; then + if [[ "${pont_init}" -eq 1 ]]; then + vlan="${val_param}" + vlan_init=1 + echo "vlan_init=1" # Debogage + else + echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant." + exit 1 + fi + else + echo "Erreur: le VLAN \"${val_param}\" n'est pas un entier compris entre 1 et 4094. Arrêt immédiat du script \"${0}\" sans aucune modification du système." + exit 1 + fi + elif [ "${nom_param}" == "8021Q" ]; then + declare -a label_vlan=( $(echo ${val_param} | sed 's/,/\n/g') ) + nb_params_label="${#label_vlan[*]}" + + for ((id_label_vlan=0 ; "${nb_params_label}" - "${id_label_vlan}" ; id_label_vlan++)); do + if [[ "${label_vlan[${id_label_vlan}]}" =~ ^-?[0-9]+$ && "${label_vlan[${id_label_vlan}]}" -ge 1 && "${label_vlan[${id_label_vlan}]}" -le 4094 && $(echo -n "${label_vlan[${id_label_vlan}]}" | cut -c 1) -ne 0 ]]; then + if [[ "${pont_init}" -eq 1 ]]; then + ieee8021q_init=1 + echo "ieee8021q_init=1" # Debogage + else + echo "Erreur: le paramètre \"#PONT=votrePont\" est manquant." + exit 1 + fi + else + echo "Erreur: le tronc 802.1Q comporte un identifiant de VLAN (\"${val_param}\") qui n'est pas un entier compris entre 1 et 4094. Arrêt immédiat du script \"${0}\" sans aucune modification du système." + exit 1 + fi + done + elif [ "${nom_param}" == "INTERFACE" ]; then + if [[ ! $(ip link show "${val_param}" 2> /dev/null) ]]; then + if [[ "${vlan_init}" -eq 1 || "${ieee8021q_init}" -eq 1 ]]; then + interface="${val_param}" + interface_init=1 + echo "interface_init=1" # Debogage + else + echo "Erreur: le paramètre \"#VLAN=votreVLAN\" est manquant." + exit 1 + fi + elif [[ $(ls /run/network/ | sed -e "s/ifstate//g" -e "s/^.//" -e "/^$/d" -e "/^lo$/d" | grep "${val_param}" 2> /dev/null) ]]; then + pont_init=0 + vlan_init=0 + ieee8021q_init=0 + interface_init=0 + else + echo "Erreur: l'interface ${val_param} est déjà existante. Arrêt immédiat du script \"${0}\" sans aucune modification du système." + exit 1 + fi + fi + + # Génération des commandes de création des interfaces réseau du conteneur + genCmdIntRzo + done +} + usage() { case ${1} in @@ -496,10 +629,24 @@ case ${1} in if [[ "${1}" == "-h" ]]; then usage "demarre" fi - nom_mv="${1}" + nom_mv="$(basename ${1})" + if [[ "$(dirname ${1})" != "." ]];then + base_chemin_mv="$(dirname ${1})" + fi + chemin_mv="${base_chemin_mv}/${nom_mv}/qemu-${nom_mv}.mv" + echo "chemin_mv=${chemin_mv}" # Debogage echo "nom_mv=${nom_mv}" # Debogage + echo "base_chemin_mv=${base_chemin_mv}" # Debogage shift echo 1 "$#" # Debogage + if [[ $# -eq 0 ]]; then + echo "Demarrage de la MV..." # Debogage + #recupParams + #execCmd "${commandes_a_executer[@]}" + commande_qemu=$(grep -Ev '^#|^$' ${chemin_mv} | tr -d '\n' | tr -d '\\') + echo "${bin_qemu} ${commande_qemu}" # Debogage + ${bin_qemu} ${commande_qemu} + fi while [[ $# -gt 0 ]]; do case "${1}" in '-d') #demon