vm-start/vm-start.sh

353 lines
9.2 KiB
Bash
Raw Normal View History

#!/usr/bin/bash
2024-01-13 17:50:37 +01:00
#
2024-01-31 20:52:46 +01:00
#RESULT_POSSIBLE=("init","list","start","start_backup","create","backup","restore","suppr")
2024-01-21 20:11:24 +01:00
# Constante d'éxecutions.
2024-01-31 21:45:08 +01:00
Version="0.7.0-developpement_01-31-2021"
2024-01-31 20:52:46 +01:00
USAGE="vm-start [PARAMETTER] [ NAME COMMAND [OPTION] ]
Script to manage virtual machine easily.
NAME is the name of the virtual machine to use.
2024-01-31 20:52:46 +01:00
PARAMETTER available
-h, --help Print this help and exit
-v, --version Print the version of this program and quit
2024-01-31 21:45:08 +01:00
-l, --list Print the list of all availables machines and quit
2024-01-31 20:52:46 +01:00
COMMAND available
2024-01-24 02:00:49 +01:00
init Create the conf file in conf/NAME_var.sh
start Start the virtual machine using the variabes in conf/NAME_var.sh
start-backup Start the virtual machine using the backup volume if it exists.
create Create the virtual machine using the conf in conf/NAME_var.sh
backup Create a backup file for the vm
restore Restore the virtual machine using to backup file
suppr Suppr all data related to the virtual machine other than the conf file.
COMMAND TODO
2024-01-24 02:00:49 +01:00
suppr-all Suppr all data related to the vm even the conf file #TODO
OPTION available
2024-01-24 02:00:49 +01:00
nproc=<nb proc> Def the number of proc of the vm
memory=<mem> Def the qty of memory allocated to the vm
size=<size> Def the size that should be allocated by create
uefi Select if there will be an UEFI by default.
can be either set or unset. By default is unset.
options=<option> additinal options to give to qemu. By default is
-display gtk -vga qxl
create_disk=<loc_disk> Def a create disk to boot on. Is necessary for using create, or need the variable INSTALLATION_DISK_LOCATION to be set.
net=nat:id Add a nat connection to the vm. By default there is already one.
net=tap:<tapInterface> Connect the vm to the tap interface <tapInterface>. Please use the script set-tap.sh as root to create the tap interface. in the conf file, a mac field have to be set. for two vm to connect togethers, their mac addresses on the same network have to be differents.
net=none The vm will have no network interface
"
MAIN_LOCATION="$HOME/virtual_machine"
# if MAIN_LOCATION doesn't exists, create the folder.
if [ -f "$MAIN_LOCATION" ]
then
mkdir "$MAIN_LOCATION" || exit 0 #Exit in case the folder can't be created.
echo "$MAIN_LOCATION created to contain all virtual machines."
fi
OPTION="-display gtk \
-usbdevice tablet"
# other options choices
#
#-display sdl
#-vga qxl
#-usbdevice tablet \
2024-01-21 20:11:24 +01:00
2024-01-31 21:45:08 +01:00
list() {
echo "this is the list of all vm actually configured."
for vm in $(ls conf); do
echo "${vm%-vm_var.sh}"
done
exit 0
}
2024-01-21 20:11:24 +01:00
HELP() {
echo "$USAGE"
exit 0
}
2024-01-13 17:50:37 +01:00
INIT() {
echo "INIT for vm $1"
NAME="$1"
2024-01-22 01:32:12 +01:00
read -p "How many proccessor will you use ? " -r NPROC
read -p "How much memory will you need ? " -r MEMORY
read -p "Do you want to forward ssh port (y/n) " -r entry
2024-01-13 17:50:37 +01:00
if echo "$entry" | grep -q "^[yY]$"
2024-01-13 17:50:37 +01:00
then
FORWARD=",hostfwd=tcp::10022-:22" # forward VM 22 port to Host 10022
fi
mkdir -p conf
2024-01-22 01:32:12 +01:00
cat << EOF > "conf/$NAME-vm_var.sh"
2024-01-24 00:31:58 +01:00
NAME="${NAME}"
VMHOSTNAME="\${NAME}-vm"
VMDRIVE="\${VMHOSTNAME}.cow"
2024-01-24 00:31:58 +01:00
NPROC="${NPROC}"
MEMORY="${MEMORY}"
FORWARD="${FORWARD}"
LOCATION="\${NAME}-sandbox"
2024-01-22 01:32:12 +01:00
EOF
chmod +x "conf/$NAME-vm_var.sh"
2024-01-13 17:50:37 +01:00
}
start_the_vm() {
if [ "${network}" == "" ]
then
network="-net nic \
-net user${FORWARD},hostname=${VMHOSTNAME}"
fi
2024-01-13 17:50:37 +01:00
qemu-system-x86_64 \
-enable-kvm \
-cpu host \
-smp "$NPROC" \
$network \
-m "$MEMORY" \
2024-01-24 02:00:49 +01:00
-drive file="${MAIN_LOCATION}/${LOCATION}/${VMDRIVE}",index=2,id=maindrive,media=disk \
$OPTION
}
START() {
start_the_vm
2024-01-13 17:50:37 +01:00
}
2024-01-22 01:32:12 +01:00
START_BACKUP() {
VMDRIVE="${VMDRIVE}.backup"
start_the_vm
2024-01-13 17:50:37 +01:00
}
CREATE() {
if [ -z "${SIZE+x}" ]
then
SIZE="40G"
fi
if [ ! -f "${MAIN_LOCATION}/${LOCATION}/${VMHOSTNAME}.cow" ]
2024-01-13 17:50:37 +01:00
then
echo "create directory ${MAIN_LOCATION}/${LOCATION}/"
mkdir -p "${MAIN_LOCATION}/${LOCATION}/"
qemu-img create -f qcow2 "${MAIN_LOCATION}/${LOCATION}/${VMHOSTNAME}.cow" "$SIZE"
fi
2024-01-22 01:32:12 +01:00
if [ "${UEFI}" == "set" ]
then
echo "create UEFIVAR"
if [ ! -f "${MAIN_LOCATION}/${LOCATION}/OVMF_VARS.4m.fd" ]
then
cp /usr/share/edk2/x64/OVMF_VARS.4m.fd "${MAIN_LOCATION}/${LOCATION}"
else
echo "INFO, UEFIVAR already existing"
fi
2024-01-13 17:50:37 +01:00
fi
OPTION="$OPTION \
2024-01-13 17:50:37 +01:00
-boot d \
2024-01-24 02:00:49 +01:00
-drive file=$1,if=none,media=cdrom,id=drive-cd1 \
-device ide-cd,drive=drive-cd1,id=cd1,bootindex=1"
start_the_vm
2024-01-13 17:50:37 +01:00
}
RESTORE() {
read -p "Are you sure you want to restore the rescue? (y/N) " -r entry
2024-01-24 00:26:37 +01:00
if echo "$entry" | grep -q "^[yY]$"
2024-01-13 17:50:37 +01:00
then
cp -i "${MAIN_LOCATION}/${LOCATION}/${VMHOSTNAME}.cow.backup" "${MAIN_LOCATION}/${LOCATION}/${VMHOSTNAME}.cow"
2024-01-13 17:50:37 +01:00
echo "Done"
fi
}
BACKUP() {
2024-01-22 01:32:12 +01:00
read -p "Are you sure you want to backup the volume? If you continue the previous backup will be lost (y/N) " -r entry
2024-01-24 00:26:37 +01:00
if echo "$entry" | grep -q "^[yY]$"
2024-01-13 17:50:37 +01:00
then
cp -i "${MAIN_LOCATION}/${LOCATION}/${VMHOSTNAME}.cow" "${MAIN_LOCATION}/${LOCATION}/${VMHOSTNAME}.cow.backup"
2024-01-13 17:50:37 +01:00
echo "Done"
fi
}
SUPPRESS() {
2024-01-22 01:32:12 +01:00
read -p "Are you sure you want to delete all data relative to the vm $1? (y/N)" -r entry
2024-01-24 00:26:37 +01:00
if echo "$entry" | grep -q "^[yY]$"
then
rm -Ri "${MAIN_LOCATION}/${LOCATION}"
fi
}
2024-01-13 17:50:37 +01:00
2024-01-24 00:31:58 +01:00
set_uefi() {
UEFI="set"
OPTION="${OPTION} \
-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \
-drive if=pflash,format=raw,file=${MAIN_LOCATION}/${LOCATION}/OVMF_VARS.4m.fd"
}
set_net() {
case "${1%:*}" in
"nat")
echo "ajout de l'interface ${1#*:}"
network="${network} \
-netdev user,id=${1#*:} \
-device virtio-net,netdev=${1#*:}"
;;
"tap")
echo "ajout de l'interface tap ${1#*:}"
if [ "${mac}" == "" ]
then
echo "error, no mac set"
exit 1
fi
network="${network} \
-netdev bridge,id=${1#*:} \
-device virtio-net,netdev=${1#*:},mac=${mac}"
;;
"none")
echo "no interface will be connected."
network="-nic none"
;;
*)
echo "type ${1%:*} not known, it should be either nat, tap or none" >&2
exit 1
;;
esac
}
2024-01-21 20:11:24 +01:00
2024-01-31 21:45:08 +01:00
# change active directory to became the one is stored vm-start. In case it is impossible, quit.
cd "$( dirname "$( readlink -f "$0" )" )" || exit
2024-01-21 20:11:24 +01:00
2024-01-31 21:45:08 +01:00
# gère les paramètres
for i in "$@"; do
2024-01-31 21:45:08 +01:00
case "$i" in
"-h" | "--help")
HELP
;;
"-v" | "--version")
echo "vm-start ${Version}"
exit 0
;;
"-l" | "--list")
list
;;
esac
2024-01-21 20:11:24 +01:00
done
# verifie au moins assez d'options pour utiliser le programme.
2024-01-13 17:50:37 +01:00
if [ $# -lt 2 ]
then
2024-01-22 01:32:12 +01:00
echo "Error, not enough args" >&2
2024-01-21 20:11:24 +01:00
HELP
2024-01-13 17:50:37 +01:00
fi
2024-01-21 20:11:24 +01:00
# vérifie que le dossier pour stocker les vms existe & change le dossier actif pour qu'il soit cellui du lanceur.
mkdir -p "$MAIN_LOCATION"
2024-01-13 17:50:37 +01:00
2024-01-31 21:45:08 +01:00
# Vérifie qu'il y ait bien un fichier de config pour la vm que l'on tente de démarer dans la cas contraire en génére un.
2024-01-21 20:11:24 +01:00
# possibilitée de générer à nouveau le fichier de config avec vm-start nom-vm init
2024-01-24 02:00:49 +01:00
if [ ! -f "conf/$1-vm_var.sh" ]
2024-01-13 17:50:37 +01:00
then
2024-01-21 20:11:24 +01:00
echo "no config file found. creating one in conf/${1}-vm_var.sh"
INIT "$1"
2024-01-24 02:00:49 +01:00
if [ "$2" == "init" ]
then
# Exit, it is the end of the program.
exit 0
fi
2024-01-13 17:50:37 +01:00
fi
2024-01-21 20:11:24 +01:00
#Vérifie si l'option UEFI est set dans le fichier de config. Si oui l'ajoutte aux options.
. "conf/$1-vm_var.sh"
2024-01-21 20:11:24 +01:00
for (( i=3; i<=$#; i++)); do
case "${!i%=*}" in
"nproc")
NPROC="${!i#*=}"
;;
"memory")
MEMORY="${!i#*=}"
;;
"uefi")
2024-01-24 00:31:58 +01:00
set_uefi
;;
2024-01-24 02:00:49 +01:00
"create_disk")
INSTALLATION_DISK_LOCATION="${!i#*=}"
;;
"net")
param="${!i#*=}"
set_net "${param}"
;;
esac
2024-01-21 20:11:24 +01:00
done
2024-01-22 01:32:12 +01:00
if [ "${UEFI}" == "yes" ]
then
2024-01-24 00:31:58 +01:00
set_uefi
fi
2024-01-13 17:50:37 +01:00
case "$2" in
"start")
echo "starting VM $1"
START
;;
"start-backup")
echo "starting VM rescue"
START_BACKUP
;;
"backup")
echo "backup VM"
BACKUP
;;
"restore")
echo "restore backup"
RESTORE
;;
"create")
echo "creating VM"
2024-01-24 02:00:49 +01:00
if [ ! "${INSTALLATION_DISK_LOCATION}" == "" ]
then
2024-01-24 02:00:49 +01:00
echo "using image disk ${INSTALLATION_DISK_LOCATION}"
CREATE "${INSTALLATION_DISK_LOCATION}"
else
echo "Error, no image defined." >&2
fi
;;
"suppr")
echo "suppressing all data of the vm $1"
SUPPRESS "$1"
;;
2024-01-24 02:00:49 +01:00
"init")
echo "Init volume $1"
INIT "$1"
;;
*)
echo "commande $2 inconnue" >&2
HELP
esac
2024-01-13 17:50:37 +01:00