proxmox 쉘에서 vm 진입하는 스크립트입니다. (pct enter 같은역할)
아래 스크립트를 vms.sh 로 저장하고 해당 파일을 .bashrc 에서 불러오시면 됩니다.
/root/.bashrc 파일에 source /root/vms.sh 정도로 추가하시면 이용이 가능합니다.
이용방법----
proxmox 의 root 쉘에서 vms [엔터] 하면 현재 설치된 lxc 와 qemu vm 정보를 표시합니다.
root@prox:~# vms [엔터]
lxc/202 minecraft running
lxc/204 minecraft stopped
lxc/400 docker stopped
lxc/401 docker1 stopped
qemu/601 debian12 running
여기서 해당 vm 콘솔에 접근하고자 할경우
root@prox:~# 202 [엔터] 혹은
root@prox:~# 601 [엔터] 로 해당 vmid 를 치고 엔터를 누르면 진입이 되며, 구동중이 아닐경우 구동여부를
물어 start 후 진입이 가능합니다. (lxc 가 아닌경우 ssh 접근을 시도합니다)
================================ 스크립트 vms.sh ============
#!/bin/bash
vmlist() {
parsed_vm_list=$(pvesh get /cluster/resources -type vm | egrep "qemu|lxc" | awk '{for (i = 1; i <= NF; i++) if ($i ~ /^[0-9a-zA-Z]+/) printf ("%s", $i); print ""}' |awk '{print $1,$13,$15}' )
echo "$parsed_vm_list"
}
vms() {
vmlist | sed -e "s/^.*running.*$/\x1B[1;36;40m&\x1B[0m/g" -e "s/^.*stopped.*$/\x1B[1;31;40m&\x1B[0m/g"
}
command_not_found_handle() {
enter_vm() {
local vmid=$1
local vm_type=$2
if [ "$vm_type" == "qemu" ]; then
if [ "$startvm" == "qemu" ] ; then # qemu 가 금방 부팅된 경우, 지연시간 필요
timeout=300
echo -n "Booting up. checking IP $vmid ."
while (( $( qm agent $vmid network-get-interfaces > /dev/null 2>&1 ; echo $?) != 0 )) ; do
echo -n "."
sleep 1 ; ((count++))
(( $count > $timeout )) && echo "Unknown IP address. " && exit 1
done
echo
fi
local agent_info=$(qm agent $vmid network-get-interfaces 2>/dev/null)
local vm_ip=$(echo "$agent_info" | grep -B1 "ipv4" | grep 'ip-address' | grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | grep -v '^127\.0\.0\.1')
if [ "$vm_ip" ] ; then
echo "Entering $vmid (root@$vm_ip) ... " && sleep 2 && ssh root@$vm_ip
else
echo "Unknown IP address. " && exit 1
fi
elif [ "$vm_type" == "lxc" ]; then
echo "Entering $vmid ..." && sleep 1 && pct enter $vmid
fi
}
wait_for_vm() {
local vmid=$1
local timeout=60
local interval=1
local elapsed_time=0
while true; do
echo -n "."
vm_info=$(vmlist | awk -v VMID="/$vmid" '$1 ~ VMID')
vm_status=$(echo "$vm_info" | awk '{print $3}')
if [ "$vm_status" == "running" ]; then
echo ; break
elif [[ "$vm_status" =~ ^[0-9]+s$ ]]; then
local wait_time=$(echo "$vm_status" | grep -Po '^[0-9]+')
for ((i=0; i < wait_time; i++)); do
echo -n '.'
sleep $interval
done
elapsed_time=$((elapsed_time + wait_time))
fi
if [ $elapsed_time -ge $timeout ]; then
echo ; echo "Timeout reached when waiting for VM to be ready"
return 1
fi
done
return 0
}
if [[ $1 =~ ^[0-9]+$ ]]; then
vms
vmid="$1"
vm_info=$( vmlist | awk -v VMID="/$vmid" '$1 ~ VMID')
if [ "$vm_info" ]; then
vm_id=$(echo "$vm_info" | awk '{split($1, arr, "/"); print arr[2]}')
vm_type=$(echo "$vm_info" | awk '{split($1, arr, "/"); print arr[1]}')
vm_name=$(echo "$vm_info" | awk '{print $2}')
vm_status=$(echo "$vm_info" | awk '{print $3}')
if [ "$vm_status" != "running" ]; then
echo "This VM is not in the running state"
read -p "Would you like to start it? (y/N) " start_vm_answer
if [[ "$start_vm_answer" =~ ^[Yy]$ ]]; then
case $vm_type in
"qemu")
qm start $vmid ; startvm=qemu ; echo -n "Starting $vmid ." ;;
"lxc")
pct start $vmid ; startvm=pct ; echo -n "Starting $vmid ." ;;
*)
echo "Unknown VM type" ;;
esac
if wait_for_vm "$vmid"; then
sleep 1
else
echo "The VM failed to start"
return
fi
else
echo "VM not started"
return
fi
fi # end of [ "$vm_status" != "running" ]
enter_vm $vmid $vm_type ; vms
return 0
else
echo "$1: command not found"
fi # end of [ "$vm_info" ]
else
echo "$1: command not found"
fi # end of [[ $1 =~ ^[0-9]+$ ]
return 1
}
=========================================== end of vms.sh
vm은 ssh ID@IP -p 22 (포트22면 생략가능)
이렇게 치고 들어갈 수도 있긴 합니다.
cmt alert