VirtualBox 관리 Script
VirtualBox 관리 Shell script 

Virtual Machine List
Virtual Machine List  
 
 #!/bin/bash

echo -e "\n"
echo "##############################################"
echo "############# VM List START ! ##########" 
echo "##############################################"

echo -e "\n## Virtural Images list ##" 
allVm=$(/usr/bin/VBoxManage list vms | awk '{print($1)}' | sort)

# Check Status
VmStatus(){
 vmStatus=$(/usr/bin/VBoxManage showvminfo $1 | grep -e ^State | sed s/\ \ //g )
 echo ${vmStatus}
}

# All VM Print
PrintVmList(){
 for i in $allVm
 do
 vmname=$(echo $i | sed -e "s/\"//g")
 echo " > " $vmname " , Status=" $(VmStatus $vmname)
 done
}

cd /home/hyunsu/BackUpCenter/20221014-exportVM/
PrintVmList

echo -e "\n"
echo "##############################################"
echo "############# VM List END ! ############"
echo "##############################################"
echo -e "\n"
 
 사용 & 결과  
 [hyunsu@joang BackUpCenter]$ ./000-VMList.sh

##############################################
############# VM List START ! ##########
##############################################

## Virtural Images list ##
 > 0-RockyNAS , Status= State: running (since 2024-10-09T16:01:50.678000000)
 > 1-RockyKubeMaster , Status= State: running (since 2024-10-09T22:39:41.958000000)
 > 10-Deloitte001 , Status= State: running (since 2024-10-09T16:02:01.092000000)
 > 4-RockyWorker1 , Status= State: running (since 2024-10-10T04:19:36.495000000)
 > 9-GitRepo , Status= State: running (since 2024-10-09T16:02:16.701000000)
 > Test-RockyDesktop , Status= State: powered off (since 2023-12-23T15:01:41.000000000)
 > ex-RockyWorker2 , Status= State: running (since 2024-10-10T04:21:54.371000000)
 > ex-RockyWorker3 , Status= State: running (since 2024-10-10T04:23:14.112000000)

##############################################
############# VM List END ! ############
##############################################

Virtual Machine Power Off
Virtual Machine power off  
 
 #!/bin/sh

export _SDATE=$(date +"%Y%m%d%H")

echo "============== Power Off VM ============="
echo ">> VMNAME : $1"
echo ">> DATE : $_SDATE"

# VM Pweroff 
VmPause()
{
 vm=$1
 /usr/bin/VBoxManage controlvm $vm poweroff 
 echo ">> " $vm " Poweroffed " 
}

echo ">> VM Name = " $1 
VmPause $1

echo "============== VM Power Off END ! ==========="

 
 실행 & 결과  
 [hyunsu@joang BackUpCenter]$ ./002-poweroffVm.sh
============== Power Off VM =============
>> VMNAME : 1-RockyKubeMaster
>> DATE : 2024101021
>> VM Name = 1-RockyKubeMaster
>> 1-RockyKubeMaster Poweroffed
============== VM Power Off END ! ===========
 
  

Virtual Machine Status 상태 확인
Virtual Machine Status 상태 확인  
 #!/bin/bash

export _SDATE=$(date +"%Y%m%d%H")

echo "============== Show info VM ============="
echo ">> VMNAME : $1"
echo ">> DATE : $_SDATE"

# VM Pweroff 
VmPause()
{
 vm=$1
 /usr/bin/VBoxManage showvminfo $vm 
 echo "Running ? "
 /usr/bin/VBoxManage showvminfo $vm | grep State:
}

echo "##### VM Name = " $1 "#####"
VmPause $1

echo "============== Show info END ! ===========" 
 실행 % 결과  
 [hyunsu@joang BackUpCenter]$ ./003-showvminfoVm.sh 1-RockyKubeMaster
============== Show info VM =============
>> VMNAME : 1-RockyKubeMaster
>> DATE : 2024101022
##### VM Name = 1-RockyKubeMaster #####
Name: 1-RockyKubeMaster
Encryption: disabled
Groups: /Kubernetes-Hyunsu
Platform Architecture: x86
Guest OS: Red Hat (64-bit)
UUID: d416ace7-184b-4c22-bc26-a9afb3808039
Config file: /home/hyunsu/VirtualBox VMs/Kubernetes-Hyunsu/1-RockyKubeMaster/1-RockyKubeMaster.vbox
Snapshot folder: /data/ext/4TB/backup/Snapshots/1-RockyKubeMaster
Log folder: /home/hyunsu/VirtualBox VMs/Kubernetes-Hyunsu/1-RockyKubeMaster/Logs
Hardware UUID: d416ace7-184b-4c22-bc26-a9afb3808039
Memory size: 30048MB
Page Fusion: disabled
VRAM size: 16MB
CPU exec cap: 100%
CPUProfile: host
Chipset: piix3
Firmware: BIOS
Number of CPUs: 40
HPET: disabled
PAE: enabled
Long Mode: enabled
Triple Fault Reset: disabled
APIC: enabled
X2APIC: enabled
Nested VT-x/AMD-V: disabled
CPUID overrides: None
Hardware Virtualization: enabled
Nested Paging: enabled
Large Pages: enabled
VT-x VPID: enabled
VT-x Unrestricted Exec.: enabled
AMD-V Virt. Vmsave/Vmload: enabled
CPUID Portability Level: 0
Boot menu mode: message and menu
Boot Device 1: HardDisk
Boot Device 2: DVD
Boot Device 3: Not Assigned
Boot Device 4: Not Assigned
ACPI: enabled
IOAPIC: enabled
BIOS APIC mode: APIC
Time offset: 0ms
BIOS NVRAM File: /home/hyunsu/VirtualBox VMs/Kubernetes-Hyunsu/1-RockyKubeMaster/1-RockyKubeMaster.nvram
RTC: UTC
IOMMU: None
Paravirt. Provider: Default
Effective Paravirt. Prov.: KVM
State: running (since 2024-10-09T22:39:41.958000000)
Graphics Controller: VMSVGA
Monitor count: 1
3D Acceleration: disabled
Teleporter Enabled: disabled
Teleporter Port: 0
Teleporter Address:
Teleporter Password:
Tracing Enabled: disabled
Allow Tracing to Access VM: disabled
Tracing Configuration:
Autostart Enabled: disabled
Autostart Delay: 0
Default Frontend:
VM process priority: default
Storage Controllers:
#0: 'IDE', Type: PIIX4, Instance: 0, Ports: 2 (max 2), Bootable
 Port 1, Unit 0: Empty
#1: 'SATA', Type: IntelAhci, Instance: 0, Ports: 1 (max 30), Bootable
 Port 0, Unit 0: UUID: 0c33d809-198c-426b-bf17-b8556a91d066
 Location: "/home/hyunsu/VirtualBox VMs/Kubernetes-Hyunsu/1-RockyKubeMaster/1-RockyKubeMaster-2024100500-disk001.vdi"
NIC 1: MAC: 08002773BA2F, Attachment: Bridged Interface 'enp3s0', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: allow-all, Bandwidth group: none
NIC 2: disabled
NIC 3: disabled
NIC 4: disabled
NIC 5: disabled
NIC 6: disabled
NIC 7: disabled
NIC 8: disabled
Pointing Device: PS/2 Mouse
Keyboard Device: PS/2 Keyboard
UART 1: disabled
UART 2: disabled
UART 3: disabled
UART 4: disabled
LPT 1: disabled
LPT 2: disabled
Audio: enabled (Driver: Default, Controller: AC97, Codec: AD1980)
Audio playback: enabled
Audio capture: disabled
Clipboard Mode: disabled
Clipboard file transfers: disabled
Drag and drop Mode: disabled
Session name: headless
Video mode: 720x400x0 at 0,0 enabled
VRDE: disabled
OHCI USB: enabled
EHCI USB: enabled
xHCI USB: disabled
USB Device Filters: <none>
Available remote USB devices: <none>
Currently attached USB devices: <none>
Bandwidth groups: <none>
Shared folders: <none>
VRDE Connection: not active
Clients so far: 0
Recording status: stopped
Recording enabled: no
Recording screens: 1
 Screen 0:
 Enabled: yes
 ID: 0
 Record video: yes
 Destination: File
 File: /home/hyunsu/VirtualBox VMs/Kubernetes-Hyunsu/1-RockyKubeMaster/1-RockyKubeMaster-screen0.webm
 Options: vc_enabled=true,ac_enabled=false,ac_profile=med
 Video dimensions: 1024x768
 Video rate: 512kbps
 Video FPS: 25fps
* Guest:
Configured memory balloon: 0MB
OS type: Linux26_64
Additions run level: 2
Additions version: 7.0.10 r158379
Guest Facilities:
Facility "VirtualBox Base Driver": active/running (last update: 2024/10/09 22:39:52 UTC)
Facility "VirtualBox System Service": active/running (last update: 2024/10/09 22:40:00 UTC)
Facility "Seamless Mode": not active (last update: 2024/10/09 22:39:52 UTC)
Facility "Graphics Mode": not active (last update: 2024/10/09 22:39:52 UTC)

Running ?
State: running (since 2024-10-09T22:39:41.958000000)
============== Show info END ! ===========
 
  

Virtual Machine START headless
Virtual Machine START headless 
 #!/bin/sh

echo "============== VM START START ! ==========="
echo ">> VMNAME : $1"

# Start VM 
StartVM()
{
 vm=$1
 /usr/bin/VBoxManage startvm $vm --type headless
 echo " > " $vm " Started VM"
 sleep 10 
}

StartVM $1

echo "============== VM START END ! ==========="
 
 실행 & 결과  
 [hyunsu@joang BackUpCenter]$ ./004-StartVm.sh Test-RockyDesktop
============== VM START START ! ===========
>> VMNAME : Test-RockyDesktop
Waiting for VM "Test-RockyDesktop" to power on...
 > Test-RockyDesktop Started VM
============== VM START END ! ===========
[hyunsu@joang BackUpCenter]$

Virtual Machine PAUSE / RESUMING
Virtual Machine PAUSE / RESUMING 
 PAUSE 
 #!/bin/sh

export VMNAME=$1

echo "=========== SNAPSHOT PAUSE START ! ============="
echo ">> VMNAME : $1"
echo ">> Pause $1 VM for snapshot " 
VBoxManage controlvm $1 pause 
echo "=========== SNAPSHOT PAUSE END ! ============="
 
 RESUMING 
 #!/bin/sh

export _SDATE=$(date +"%Y%m%d%H")
export VMNAME=$1

echo "=========== SNAPSHOT Resuming START ! ============="
echo ">> VMNAME : $1"
echo ">> " $1 " Resuming VM"
VBoxManage controlvm $1 resume 
echo ">> " $1 " Resume VM"
echo "=========== SNAPSHOT Resuming END ! ============="
 
   
  

Virtual Machine Snapshot Delete
vm snapshot을 삭제한다.  
 전체 스냅샷 중에서 FinalSnapshotDueDay이전의 스냅샷을 지우되 FinalSnapshotCnt 이하로 지우지는 않는다.  
 #!/bin/bash

export _SDATE=$(date +"%Y%m%d%H")
export FinalSnapshotCnt=10
export FinalSnapshotDueDay=60
export VMNAME=$1
export NOW=`date +%Y%m%d%H`
export FinalSnapshotDay=`date +%Y%m%d%H --date="$FinalSnapshotDueDay days ago"`

echo "=========== SNAPSHOT BACKUP&DELETE START ! ============="
echo ">> VMNAME : $1"
echo ">> DATE : $_SDATE"
echo ">> FinalBackupDay : $FinalSnapshotDueDay"
echo ">> FinalSnapshotDay : $FinalSnapshotDay"
echo ">>> ## Old $VMNAME snapshot delete ! ##"
TotalsnapshotCnt=`VBoxManage snapshot $VMNAME list | grep Name | awk '{print ($2)}' | wc -l`
echo ' >> Total snapshot count = ' $TotalsnapshotCnt
echo ' >> Final snapshot remain count = ' $FinalSnapshotCnt
TargetdeleteSnapshotCnt=`expr $TotalsnapshotCnt - $FinalSnapshotCnt`
echo ' >> Total snapshot count - Final snapshot count =' $TargetdeleteSnapshotCnt

BackupAllFiles=$(VBoxManage snapshot $VMNAME list | grep Name | awk '{print ($2)}' | sort -n)
cnt=1
echo ' > ' $FinalSnapshotDay ' day before delete target snapshot list'
for i in $BackupAllFiles
do
 snapshotDate=`echo $i | awk -F "-" '{print $1}'`
 echo $cnt " : " $i 
 if [ $snapshotDate -le $FinalSnapshotDay ]
 then
	 if [ $TargetdeleteSnapshotCnt -ge $cnt ]
	 then
		snapshotDate=`echo $i | awk -F "-" '{print $1}'`
		#echo $snapshotDate " vs " $FinalSnapshotDay
		if [ $snapshotDate -le $FinalSnapshotDay ]
		then
		 echo "Delete snapshot $i"
		 VBoxManage snapshot $1 delete $i
		fi
	 else
		echo " >> skip snapshot : " $i
	 fi
 fi
 cnt=$(expr $cnt + 1)
done

echo "=========== SNAPSHOT BACKUP&DELETE END ! ============="

 
  

Snapshot All VM
모든 VM에 대하여 snapshot을 생성합니다.  
 
 전체 VM 리스트를 출력
 
 이름만 분리하고 오름차순으로 정렬한다.  
 "를 제거하고 VM명과 상태를 출력한다.  
 
 
 VM 전체를 Pause 한다
 
 전체 vm 리스트에 대한 pause를 실행  
 vm명에 "ex"가 있는 경우 skip하고자 하였으나 운영 상 스냅샷을 하는 것이 좋을 것 같아 나중에 수정함  
 단 vm명에 "ex"가 있는 경우

 
 실행 상태 확인
 
 실행상태
 
 이미 pause 상태를 확인하고 pause인 경우 skip , pause가 아닌 경우 pause pause 실행 
 
 
 
 
 실행 상태가 아닌 경우

 
 skip 
 
 
 
 
 vm명에 "ex"가 없는 경우

 
 실행 상태 확인
 
 실행상태
 
 이미 pause 상태를 확인하고 pause인 경우 skip , pause가 아닌 경우 pause Pause 실행 
 
 
 
 
 실행 상태가 아닌 경우

 
 skip 
 
 
 
 
 
 
 스냅샷을 생성한다
 
 스냅샷도 Pause와 공일한데 단 "ex"는 시행하지 않는다.  
 
 
 오래된 스냅샷을 삭제한다.   Delete 

 
 "ex", "Test"인경우 skip 
 pause된 vm에 한정하여 삭제한다.  : 전체 스냅샷 중에서 FinalSnapshotDueDay이전의 스냅샷을 지우되 FinalSnapshotCnt 이하로 지우지는 않는다.  
 
 
 Pause를 풀고 Resuming한다.

 
 "ex"인 경우 : pause인 경우 재개한다. pause가 아닌 경우 실행하고 있는 걍우는 skip 그렇지 않은 경우 재개  
 "Test"인 경우 : 모두 skip 
 그 외에는 running 경우를 제외하고 모두 재개한다.  
 
 
 
 #!/bin/bash

echo -e "\n"
echo "##############################################"
echo "############# MAKE SNAPSHOT START ! ##########" 
echo "##############################################"
export _SDATE=$(date +"%Y-%m-%d %H")
echo "START "$_SDATE

echo -e "\n## Virtural Images list ##" 
allVm=$(/usr/bin/VBoxManage list vms | awk '{print($1)}' | sort)
runningVm=$(/usr/bin/VBoxManage list runningvms | awk '{print($1)}' | sort -nr)

# Check Status
VmStatus(){
 vmStatus=$(/usr/bin/VBoxManage showvminfo $1 | grep -e ^State | sed s/\ \ //g )
 echo ${vmStatus}
}

# All VM Print
PrintVmList(){
 for i in $allVm
 do
 vmname=$(echo $i | sed -e "s/\"//g")
 echo " > " $vmname " , Status=" $(VmStatus $vmname)
 done
}

# Check Running
IfRunning(){
 runnable=1
 vmStatus=$(/usr/bin/VBoxManage showvminfo $1 | grep -e ^Name: -e ^State | sed s/\ \ //g | grep running | awk '{print($2)}')
 if [ -z $vmStatus ] ; then
 runnable=1
 elif [ $vmStatus = "running" ] ; then
 runnable=0
 else
 runnable=1
 fi
 echo ${runnable}
}

# Check Pause
IfPause(){
 pausevm=1
 vmStatus=$(/usr/bin/VBoxManage showvminfo $1 | grep -e ^Name: -e ^State | sed s/\ \ //g | grep paused | awk '{print($2)}')
 if [ -z $vmStatus ] ; then
 pausevm=1
 elif [ $vmStatus = "paused" ] ; then
 pausevm=0
 else
 pausevm=1
 fi
 echo ${pausevm}
}

# All VM PAUSE 
PauseVM(){
	echo -e "\n## All Running Virtural Images Pause ##" 
	for i in $allVm
	do
 		vmname=$(echo $i | sed -e "s/\"//g")
 ex=$(echo $vmname | awk -F'-' '{print $1}')
 		if [ "$ex" = "ex" ] ; then
 if [ $(IfRunning $vmname) = 0 ] ; then
 if [ $(IfPause $vmname) = 0 ] ; then
 echo " > " $vmname " is running but Already paused, Ex Skip PAUSE START ! "
 else
 echo " > " $vmname " is running and not paused, Ex PAUSE START ! "
 ./002-snapshotVMPause.sh $vmname
 fi
 else
 echo " > " $vmname " is not running, Ex PAUSE Skip Pause !"
 fi
 else
 if [ $(IfRunning $vmname) = 0 ] ; then
 if [ $(IfPause $vmname) = 0 ] ; then
 echo " > " $vmname " Already paused, notEx Skip PAUSE START ! "
 else
 echo " > " $vmname " is running and not paused, notEx PAUSE START ! "
 ./002-snapshotVMPause.sh $vmname
 fi
 else
 echo " > " $vmname " is not running, notEx Skip Pause !"
 fi
 fi
	done
}

# VM Snapshot
Snapshot(){
	echo -e "\n## Virtural Images Snapshot ##"
 for i in $allVm
 do
 vmname=$(echo $i | sed -e "s/\"//g")
 ex=$(echo $vmname | awk -F'-' '{print $1}')
 if [ "$ex" = "ex" ] ; then
 if [ $(IfPause $vmname) = 0 ] ; then
 echo " > " $vmname " is pause, Ex Snapshot Skip ! "
 else
 echo " > " $vmname " is not pause, Ex Snapshot Skip !"
 fi
 else
 if [ $(IfPause $vmname) = 0 ] ; then
 if [ "$ex" = "Test" ] ; then
 echo " > " $vmname " is pause, notEx but it is Test VM so Snapshot Skip !"
 else
 echo " > " $vmname " is pause, notEx Snapshot START !"
 ./003-snapshotVM.sh $vmname
 fi
 else
 echo " > " $vmname " is not pause, notEx Snapshot Skip ! "
 fi
 fi 
 done
}

# VM Delete 
Delete(){
 echo "\n## Virtural Images Backup Snapshot Delete ##"
 for i in $allVm
 do
 vmname=$(echo $i | sed -e "s/\"//g")
 ex=$(echo $vmname | awk -F'-' '{print $1}')
 if [ "$ex" = "ex" ] ; then
 echo " > " $vmname " Skip Snapshot Delete !"
 else
 if [ "$ex" = "Test" ] ; then
 echo " > " $vmname " is disable VM so Skip Snapshot Delete !"
 else
 if [ $(IfPause $vmname) = 0 ] ; then
 echo " > " $vmname " is pause, Snapshot Delete START ! "
 ./004-snapshotiDeleteVM.sh $vmname
 else
 echo " > " $vmname " is not pause, notEx Skip Snapshot Delete !"
 fi
 fi
 fi
 done
}

# VM Resuming
Resuming(){
 echo "\n## Virtural Images Snapshot ##"
 for i in $allVm
 do
 vmname=$(echo $i | sed -e "s/\"//g")
 ex=$(echo $vmname | awk -F'-' '{print $1}')
 if [ "$ex" = "ex" ] ; then
 if [ $(IfPause $vmname) = 0 ] ; then
 echo " > " $vmname " is pause, Ex START ! "
 ./005-snapshotResuming.sh $vmname
 else
 echo " > " $vmname " is not pause, Ex Check Start VM !"
 if [ $(IfRunning $vmname) = 0 ] ; then
 echo " > " $vmname " is running, Ex Skip Start VM !"
 else
 echo " > " $vmname " is not running, Ex Start VM !"
 ./005-snapshotResuming.sh $vmname
 fi
 fi
 else
 if [ "$ex" = "Test" ] ; then
 echo " > " $vmname " is disable VM so Not Start VM !"
 else
 if [ $(IfPause $vmname) = 0 ] ; then
 echo " > " $vmname " is pause, notEx Start VM !"
 ./005-snapshotResuming.sh $vmname
 else
 echo " > " $vmname " is not pause, notEx Check Start VM !"
 if [ $(IfRunning $vmname) = 0 ] ; then
 echo " > " $vmname " is running, Ex Skip Start VM !"
 else
 echo " > " $vmname " is not running, Ex Start VM !"
 ./005-snapshotResuming.sh $vmname
 fi
 fi 
 sleep 5
 fi
 fi
 done
}

cd /home/hyunsu/BackUpCenter/20221014-snapshot/
PrintVmList
PauseVM
Snapshot
Delete
Resuming

echo -e "\n"
echo "##############################################"
echo "############# MAKE SNAPSHOT END ! ############"
echo "##############################################"
echo -e "\n"