From 1efb5c6a876eb247aae218bca52d07eca3715c7f Mon Sep 17 00:00:00 2001 From: braniz Date: Tue, 3 Oct 2023 19:23:42 +0200 Subject: [PATCH] No parallel --- hdd_vdi_create.sh | 169 ++++++++++++++++++++++++++-------------------- 1 file changed, 97 insertions(+), 72 deletions(-) mode change 100644 => 100755 hdd_vdi_create.sh diff --git a/hdd_vdi_create.sh b/hdd_vdi_create.sh old mode 100644 new mode 100755 index c3c1dcf..f6316c1 --- a/hdd_vdi_create.sh +++ b/hdd_vdi_create.sh @@ -1,19 +1,17 @@ #!/bin/bash -# Autor: Branislav Zeljak v0.4 +# Autor: Branislav Zeljak v0.6 # Beschreibung: Dieses Skript erstellt VirtualBox-VMs und klonet Festplatten parallel. # Verwendung: Führen Sie das Skript aus und befolgen Sie die Eingabeaufforderungen. clear -VAR_USER=$(whoami) - # %--------------------start/Funktionen--------------------% # Funktion zum Überprüfen der Benutzerexistenz check_user_existence() { - local VAR_USER="$1" - if ! grep -q "^$VAR_USER:" /etc/passwd; then - echo "Der Benutzer $VAR_USER existiert nicht auf diesem System." + local VAR_USER_IN_GROUP="$1" + if ! grep -q "^$VAR_USER_IN_GROUP:" /etc/passwd; then + echo "Der Benutzer $VAR_USER_IN_GROUP existiert nicht auf diesem System." exit 1 fi } @@ -31,9 +29,20 @@ get_group_users() { fi } +# Funktion, um einen zufälligen Host-Namen aus der Liste auszuwählen +get_random_name() { + # Liste der Namen + local names=("frodo" "samweis" "gandalf" "aragorn" "legolas" "gimli" "boromir" "meriadoc" "peregrin" "arwen" "galadriel" "celeborn" "elrond" "glorfindel" "faramir" "eowyn" "theoden" "treebeard" "gollum" "sauron" "saruman" "bilbo" "denethor" "radagast" "thranduil" "bard" "fíli" "kíli" "dori" "frodo") + + # Zufälligen Index auswählen + local random_index=$((RANDOM % ${#names[@]})) + echo "${names[random_index]}" + +} + # %--------------------end/Funktionen--------------------% -echo "User / Passwort: $VAR_USER/Start1234" +echo "User / Passwort: user00/Start1234" echo "Welches VDI-OS soll installiert werden" echo @@ -46,14 +55,14 @@ select opt in "${options[@]}" do case $opt in "Aktueller Benutzer") - VAR_USER=$(whoami) + VAR_GROUP_MEMBERS=$(whoami) ;; "Anderer Benutzer") - read -p "Bitte geben Sie einen Benutzernamen ein: " VAR_USER - if grep -q "^$VAR_USER:" /etc/passwd; then - echo "Der Benutzer $VAR_USER existiert auf diesem System." + read -p "Bitte geben Sie einen Benutzernamen ein: " VAR_GROUP_MEMBERS + if grep -q "^$VAR_GROUP_MEMBERS:" /etc/passwd; then + echo "Der Benutzer $VAR_GROUP_MEMBERS existiert auf diesem System." else - echo "Der Benutzer $VAR_USER existiert nicht auf diesem System." + echo "Der Benutzer $VAR_GROUP_MEMBERS existiert nicht auf diesem System." exit 1 fi ;; @@ -62,7 +71,7 @@ do if getent group "$VAR_GROUP" &>/dev/null; then echo "Mitglieder der Gruppe $VAR_GROUP:" get_group_users "$VAR_GROUP" - GROUP_MEMBERS=($(get_group_users "$VAR_GROUP")) + VAR_GROUP_MEMBERS=($(get_group_users "$VAR_GROUP")) else echo "Die Gruppe $VAR_GROUP existiert nicht auf diesem System." exit 1 @@ -76,8 +85,8 @@ do done COLUMNS=8 -PS3='Please enter your choice: ' -OPTIONS=("Ubuntu 2204 SRV BASE" "Ubuntu 2204 GUI BASE" "Ubuntu 2204 SRV" "Ubuntu 2204 GUI" "Quit") +PS3='Bitte wählen Sie die VM-Option: ' +OPTIONS=("Ubuntu 2204 SRV BASE" "Ubuntu 2204 GUI BASE" "Ubuntu 2204 SRV" "Ubuntu 2204 GUI" "Beenden") select opt in "${OPTIONS[@]}" do case $opt in @@ -97,15 +106,17 @@ do VAR_OS="Ubuntu_64" VAR_VDI="ubu2204-GUI.vdi" ;; - *) - echo "Invalid option $REPLY" + "Beenden") + exit ;; esac + + default_name=$(get_random_name) # Benutzereingaben read -p "Wie viele VMs werden benötigt? [1]: " VAR_QUANTITY VAR_QUANTITY=${VAR_QUANTITY:-1} - read -p "Präfix Host Name: " VAR_NAME_PREFIX + read -p "Präfix Host Name (Vorgabe: $default_name): " VAR_NAME_PREFIX read -p "CPUs [2]: " VAR_CPU VAR_CPU=${VAR_CPU:-2} read -p "Memory [2048]: " VAR_MEM @@ -120,69 +131,83 @@ do VAR_NIC1="Nat" VAR_NIC2="bridged" VAR_NET_INTERFACE="enp4s0f1" + VAR_NAME_PREFIX=${VAR_NAME_PREFIX:-$default_name} # Schleife zur Erzeugung der VMs für jeden Benutzer in der Gruppe - for VAR_USER_IN_GROUP in "${GROUP_MEMBERS[@]}" + for VAR_USER_IN_GROUP in "${VAR_GROUP_MEMBERS[@]}" do - # VM erstellen - sudo -u "$VAR_USER_IN_GROUP" VBoxManage createvm \ - --name "${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}" \ - --ostype "$VAR_OS" \ - --register \ - --basefolder "/srv/vbox/$VAR_USER_IN_GROUP" - - # VM-Konfigurieren - sudo -u "$VAR_USER_IN_GROUP" VBoxManage modifyvm "${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}" \ - --ioapic on \ - --memory "$VAR_MEM" \ - --cpus "$VAR_CPU" \ - --vram "$VAR_VIDEO_RAM" \ - --nic1 "$VAR_NIC1" \ - --graphicscontroller vmsvga \ - --nic2 "$VAR_NIC2" \ - --bridgeadapter2 "$VAR_NET_INTERFACE" \ - --vrde on \ - --vrdemulticon on \ - --vrdeport "$VAR_RDP_PORT" - - # Festplattencontroller hinzufügen - sudo -u "$VAR_USER_IN_GROUP" VBoxManage storagectl "${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}" \ - --name "SATA Controller" \ - --add sata \ - --controller IntelAhci - - # Klonen der Festplatte und Registrieren (in Hintergrundprozessen) - { - sudo -u "$VAR_USER_IN_GROUP" VBoxManage clonehd "${VAR_PATH_TO_VDI}/${VAR_VDI}" "/srv/vbox/$VAR_USER_IN_GROUP/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}-disk00.vdi" - sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}" \ - --storagectl "SATA Controller" \ - --port 0 \ - --device 0 \ - --type hdd \ - --medium "/srv/vbox/$VAR_USER_IN_GROUP/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}-disk00.vdi" - } & - - # Erzeugen und Zuweisen zusätzlicher Festplatten (HDDs) - for ((i = 1; i <= VAR_ADDITIONAL_HDD; i++)) + # Schleife zur Erzeugung der angeforderten Anzahl von VMs + for ((i = 1; i <= VAR_QUANTITY; i++)) do - HDD_NUM=$(printf "%02d" $i) - sudo -u "$VAR_USER_IN_GROUP" VBoxManage createhd \ - --filename "/srv/vbox/$VAR_USER_IN_GROUP/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}-disk$HDD_NUM.vdi" \ - --size 102400 \ - --format VDI - sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}" \ - --storagectl "SATA Controller" \ - --port $i \ - --device 0 \ - --type hdd \ - --medium "/srv/vbox/$VAR_USER_IN_GROUP/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}/${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}-disk$HDD_NUM.vdi" + # VM erstellen + VM_NAME="${VAR_NAME_PREFIX}-${VAR_USER_IN_GROUP}--VM$(printf "%02d" $i)" + VM_DIR="/srv/vbox/$VAR_USER_IN_GROUP/$VM_NAME" + + sudo -u "$VAR_USER_IN_GROUP" VBoxManage createvm \ + --name "$VM_NAME" \ + --ostype "$VAR_OS" \ + --register \ + --basefolder "$VM_DIR" + + # VM-Konfigurieren + sudo -u "$VAR_USER_IN_GROUP" VBoxManage modifyvm "$VM_NAME" \ + --ioapic on \ + --memory "$VAR_MEM" \ + --cpus "$VAR_CPU" \ + --vram "$VAR_VIDEO_RAM" \ + --nic1 "$VAR_NIC1" \ + --graphicscontroller vmsvga \ + --nic2 "$VAR_NIC2" \ + --bridgeadapter2 "$VAR_NET_INTERFACE" \ + --vrde on \ + --vrdemulticon on \ + --vrdeport "$VAR_RDP_PORT" + + # Festplattencontroller hinzufügen + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storagectl "$VM_NAME" \ + --name "SATA Controller" \ + --add sata \ + --controller IntelAhci + + # IDE-Controller für DVD + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storagectl "$VM_NAME" \ + --name "IDE Controller" \ + --add ide \ + --controller PIIX4 + + # Klonen der Festplatte und Registrieren (in Hintergrundprozessen) + { + sudo -u "$VAR_USER_IN_GROUP" VBoxManage clonehd "${VAR_PATH_TO_VDI}/${VAR_VDI}" "$VM_DIR/${VM_NAME}-disk00.vdi" + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "$VM_NAME" \ + --storagectl "SATA Controller" \ + --port 0 \ + --device 0 \ + --type hdd \ + --medium "$VM_DIR/${VM_NAME}-disk00.vdi" + } & + + # Erzeugen und Zuweisen zusätzlicher Festplatten (HDDs) + for ((j = 1; j <= VAR_ADDITIONAL_HDD; j++)) + do + HDD_NUM=$(printf "%02d" $j) + HDD_NAME="${VM_NAME}-disk$HDD_NUM.vdi" + sudo -u "$VAR_USER_IN_GROUP" VBoxManage createhd \ + --filename "$VM_DIR/$HDD_NAME" \ + --size 102400 \ + --format VDI + sudo -u "$VAR_USER_IN_GROUP" VBoxManage storageattach "$VM_NAME" \ + --storagectl "SATA Controller" \ + --port $j \ + --device 0 \ + --type hdd \ + --medium "$VM_DIR/$HDD_NAME" + done done done # Warten auf das Ende der Hintergrundprozesse wait - echo "VMs wurden für alle Mitglieder der Gruppe erstellt, Festplatten geklont und registriert." + echo "VMs wurden für alle wie angegeben erstellt." break done -