• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글

proxmox 쉘에서 vm 진입하는 스크립트입니다. (pct enter 같은역할)

풀비누 290

0

4

아래 스크립트를 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

 

신고공유스크랩
4
2등
희라 2023.07.01. 15:04
혹시 내부 vm접근할떄 vm에 네트워크 세팅이 되어있지 않아도 접근이 가능한가요??
3등
풀비누 글쓴이 2023.07.05. 21:45
lxc 는 바로 쉘 접근이 가능합니다. qemu vm 은 ssh 를 통해 접속시도를 하므로 아이피가 잡혀 있어야 하며, qemu-guest-agent 역시 설치가 되어 있어야 합니다.
섭리 2023.07.11. 00:15
lxc는 lxc-attach ###
vm은 ssh ID@IP -p 22 (포트22면 생략가능)
이렇게 치고 들어갈 수도 있긴 합니다.

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story
번호 분류 제목 글쓴이 날짜 조회 추천
잡담 서브 미니PC Proxmox로 집합시켰습니다.. 5 EXP 1일 전21:58 260 +1
가이드 나만의 구독 관리하기 Wallos 서버 구축하기. 8 달소 3일 전17:19 269 +2
후기 네트워크 구성도와 상세 스펙 공유 3 맘맘 3일 전16:17 271 +1
3931
image
달소 21.06.22.13:19 19626 0
3930
image
달소 22.03.17.22:09 19138 +14
3929
image
달소 23.01.27.14:15 16521 +8
3928
image
달소 20.12.25.17:18 16311 +5
3927
image
똥쓰똥쓰 22.09.24.16:54 8202 +3
3926
image
달소 21.01.02.13:32 8192 0
3925
image
달소 21.04.28.14:05 8176 +6
3924 정보
image
달소 21.05.06.11:38 7946 +4
3923
image
달소 21.02.26.15:02 7723 +1
3922
image
달소 22.03.17.23:40 7167 +2
3921
image
달소 21.07.30.17:12 7131 +4
3920 정보
image
달소 21.06.11.13:24 6956 +4
3919 질문
image
달소 21.04.23.12:51 6159 +3
3918 정보
image
달소 22.05.06.13:12 5961 +3
3917
image
ExpBox 22.04.16.23:19 5961 +4
3916
image
에프킬라 22.04.19.22:08 5929 +6
3915
image
달소 21.07.30.11:40 5762 +1
3914 정보
image
달소 21.10.21.17:59 5613 +3
3913
image
달소 23.04.09.14:13 5382 +4
3912
image
달소 22.03.17.22:25 5135 +11