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

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

풀비누 287

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
번호 분류 제목 글쓴이 날짜 조회 추천
오픈소스 개인 구독 추적기 Wallos 2 달소 6시간 전23:26 75 +1
질문 /var/www 폴더가 삭제되었습니다. ㅜ,.ㅜ 2 니속사정 2일 전20:42 261 +1
잡담 jellyfin 자원 진짜 안쓰네요 1 kmw_ 2일 전19:26 379 +1
3902
image
달소 6시간 전23:26 75 +1
3901 잡담
image
달소 7시간 전22:44 49 0
3900 질문
normal
맛밥 1일 전16:13 176 0
3899 질문
normal
니속사정 2일 전20:42 261 +1
3898 잡담
image
kmw_ 2일 전19:26 379 +1
3897 잡담
image
ljr10 2일 전18:44 241 0
3896 질문
image
ljr10 2일 전12:45 170 0
3895 잡담
image
purndal 3일 전00:52 202 +2
3894 질문
normal
스키피95 4일 전00:07 134 0
3893 질문
normal
고심분투 4일 전17:10 233 0
3892 질문
image
경호 4일 전15:50 102 0
3891 질문
normal
경호 4일 전13:23 74 0
3890 잡담
image
기현 4일 전07:34 485 +2
3889 잡담
image
keiminem 5일 전13:12 574 0
3888 잡담
normal
달소 5일 전11:38 336 +2
3887 질문
image
EXP 6일 전23:48 97 0
3886 질문
normal
홍익 6일 전19:26 240 0
3885 정보
image
지딱코 6일 전14:31 243 +1
3884 가이드
image
달소 24.05.01.22:22 425 +3
3883 가이드
image
ljr10 24.05.01.08:20 191 0