상세 컨텐츠

본문 제목

25.03.07. 가상머신 생성 및 설정, 리눅스 쉘, NFS && mount

AWS CLOUD SCHOOL 9기

by AI Engineer crystal 2025. 3. 7. 11:38

본문

가상 머신 생성 및 설정

1. 이미지 파일 다운로드 및 확인

[root@rocky1 ~]# wget <https://dl.rockylinux.org/pub/rocky/8/images/x86_64/Rocky-8-GenericCloud-Base.latest.x86_64.qcow2>
  • 이 명령어는 Rocky-8-GenericCloud-Base.latest.x86_64.qcow2라는 이름의 기본 클라우드 이미지를 다운로드합니다. 이 이미지는 Rocky Linux 8의 베이스 이미지입니다.
[root@rocky1 ~]# ll
total 2038284
-rw-r--r--  1 root root **2065760256** May 29  2024 Rocky-8-GenericCloud-Base.latest.x86_64.qcow2
  • 다운로드한 이미지 파일 Rocky-8-GenericCloud-Base.latest.x86_64.qcow2의 파일 크기(2.06 GB)를 확인합니다.

2. virt-customize로 루트 비밀번호 설정

[root@rocky1 ~]# virt-customize -a Rocky-8-GenericCloud-Base.latest.x86_64.qcow2 --root-password password:test123
  • virt-customize 명령어는 가상 머신 이미지를 사용자 정의하는 데 사용됩니다.
  • 여기서는 루트 비밀번호를 test123으로 설정하고 있습니다.

3. 이미지 파일 이름 변경

[root@rocky1 ~]# mv Rocky-8-GenericCloud-Base.latest.x86_64.qcow2 Rocky-Base.qcow2
  • 이미지를 Rocky-Base.qcow2라는 이름으로 변경합니다. 이제 이 이미지를 기반으로 가상 머신을 생성할 것입니다.

4. 스크립트 생성 및 실행

[root@rocky1 ~]# touch test1.sh ; chmod +x test1.sh
[root@rocky1 ~]# vi test1.sh
  • test1.sh라는 스크립트를 만들고 실행 권한을 부여합니다. 그런 다음 vi 편집기를 사용하여 스크립트를 작성합니다.

5. 스크립트 내용

#!/bin/bash

# 가상머신 이름을 담기위한 변수
vmname=""

echo -n "가상머신 이름 : "
read vmname
  • 스크립트에서 vmname이라는 변수를 정의하고, 사용자로부터 가상 머신의 이름을 입력받습니다.
# base image -> $vmname.qcow2
cp Rocky-Base.qcow2 ${vmname}.qcow2
  • Rocky-Base.qcow2 이미지를 사용자가 입력한 이름을 가진 새로운 이미지 파일로 복사합니다. 예를 들어, 사용자가 myinstance1을 입력하면 myinstance1.qcow2라는 이름으로 복사됩니다.
virt-install --name $vmname --vcpus 2 --ram 2048 --disk ${vmname}.qcow2 --import --graphics none --noautoconsole
  • virt-install 명령어로 가상 머신을 생성합니다.
    • -name $vmname: 가상 머신 이름을 사용자가 입력한 이름으로 설정합니다.
    • -vcpus 2: 가상 머신에 2개의 가상 CPU를 할당합니다.
    • -ram 2048: 가상 머신에 2GB의 메모리를 할당합니다.
    • -disk ${vmname}.qcow2: 앞에서 복사한 qcow2 디스크 이미지를 사용합니다.
    • –import: 기존 이미지를 그대로 가져옵니다.
    • -graphics none: 그래픽 출력을 사용하지 않도록 설정합니다.
    • -noautoconsole: 자동으로 콘솔을 연결하지 않도록 설정합니다.
sleep 5
  • 가상 머신이 시작되도록 5초간 대기합니다.
echo -e "\\t\\t결과화면"
echo -e "\\t생성된 인스턴스 목록"
virsh list --all
  • 가상 머신이 생성된 후 virsh list --all 명령어를 통해 현재 생성된 모든 가상 머신의 목록을 출력합니다.

6. 스크립트 실행

[root@rocky1 ~]# ./test1.sh
The name of VM : myinstance1
  • 스크립트를 실행하고 가상 머신의 이름을 myinstance1으로 입력합니다.
WARNING  No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.
  • 경고 메시지가 나타납니다. 이는 virt-install 명령어에서 운영 체제를 명시하지 않았기 때문에 성능이 저하될 수 있다는 내용입니다. -os-variant 옵션을 사용하여 운영 체제를 지정하는 것이 좋습니다.
Starting install...
Domain creation completed.
                result screen
        instance list
 Id   Name          State
-----------------------------
 1    myinstance1   running
  • 가상 머신이 성공적으로 생성되었고, myinstance1이라는 이름의 가상 머신이 실행 중임을 보여줍니다.

7. 가상 머신 콘솔 접속

[root@rocky1 ~]# virsh console myinstance1  또는 virsh console 5roo
  • virsh console 명령어를 사용하여 생성된 가상 머신에 콘솔로 접속할 수 있습니다.
  • myinstance1은 생성한 가상 머신의 이름입니다.

8. 가상 머신에 로그인하기

localhost login: root
Password:
  • 콘솔에 로그인할 때 root 계정으로 로그인합니다.
  • Password:는 virt-customize로 설정했던 루트 패스워드인 test123을 입력합니다.

9. 네트워크 연결 확인

  • 가상 머신은 rock1에서 제공하는 virsh0 즉, 기본 네트워크에 연결됩니다.
  • 이 네트워크를 통해 192.168.122.*와 같은 IP 주소를 할당받습니다. 이 주소는 NAT를 통해 외부와 통신할 수 있습니다.
  • 외부 통신이 잘 되는지 확인하려면 ping 명령어를 사용할 수 있습니다.
ping www.google.com -c 3
  • 이 명령어는 www.google.com에 대해 3번의 패킷을 보내고, 응답을 확인합니다.

10. 가상 머신 콘솔에서 나가기

  • 가상 머신 콘솔에서 나오려면 Ctrl + ] 키를 눌러 콘솔을 종료할 수 있습니다.

11. SSH를 통한 원격 접속

[root@rocky1 ~]# ssh -l root 192.168.122.146
  • ssh -l root 192.168.122.146 명령어를 사용하여 가상 머신의 사설 IP 주소인 192.168.122.146으로 SSH 접속할 수 있습니다.
  • 이를 통해 rocky1에서 인스턴스에 SSH로 연결할 수 있게 됩니다.

12. 가상 머신 상태 확인

[root@rocky1 ~]# virsh list --all
 Id   Name          State
-----------------------------
 1    myinstance1   running
  • virsh list --all 명령어를 사용하여 현재 관리 중인 모든 가상 머신의 상태를 확인할 수 있습니다.
  • 위 예시에서는 myinstance1이라는 가상 머신이 running 상태임을 알 수 있습니다.

13. 가상 머신 종료 및 정의 해제

[root@rocky1 ~]# virsh destroy myinstance1
Domain 'myinstance1' destroyed
  • virsh destroy myinstance1 명령어를 사용하여 가상 머신 myinstance1을 종료할 수 있습니다.
  • destroy는 가상 머신을 강제 종료하는 명령어입니다.
[root@rocky1 ~]# virsh undefine myinstance1
Domain 'myinstance1' has been undefined
  • virsh undefine myinstance1 명령어를 사용하여 가상 머신 myinstance1을 정의 해제합니다.
  • undefine 명령어는 가상 머신을 완전히 제거하며, 해당 가상 머신의 설정도 삭제됩니다.

Linux shell

명령어 실행 결과 변수에 담기

# 명령어 실행 결과를 변수에 담기
date_today=$(date)  # 현재 날짜를 변수에 담음
echo $date_today  # 현재 날짜 출력
  • date 명령어의 결과를 date_today 변수에 저장하고, 그 값을 출력합니다. 명령어 변수에 담는 식은 $( ) 구문을 사용합니다.

계산식 사용하기

# 변수에 계산식을 담기
a=5
b=3
sum=$[a + b]  # a와 b를 더한 값을 sum에 저장
echo $sum  # 8 출력
  • a와 b 값을 더한 결과를 sum 변수에 저장한 후 출력합니다. 계산식은 $[ ] 구문을 사용합니다.

조건문 (if)

# 조건문 예시 1: 숫자 비교
a=5
b=10
if [ $a -eq $b ]; then
    echo "a와 b는 같습니다."
else
    echo "a와 b는 다릅니다."  # a와 b가 다르므로 이 문장이 출력됩니다.
fi
# 조건문 예시 2: 문자 비교
vmname="Rocky"
if [ -z $vmname ]; then
    echo "vmname은 비어있습니다."
else
    echo "vmname 값은: $vmname"  # vmname은 비어있지 않으므로 이 문장이 출력됩니다.
fi
# 조건문 예시 3: 파일 존재 여부 확인
file="test.txt"
if [ -e $file ]; then
    echo "$file 파일이 존재합니다."
else
    echo "$file 파일이 존재하지 않습니다."
fi
  • 첫 번째 예시는 숫자 비교를 사용하여 a와 b가 같은지 확인합니다.
  • 두 번째 예시는 문자열 비교로 vmname이 비어있는지 확인합니다.
  • 세 번째 예시는 test.txt라는 파일이 존재하는지 확인합니다.

직전 명령어 결과 확인

# 직전 명령어 결과 확인
mkdir /tmp/testdir  # 새로운 디렉토리 생성
echo $?  # 직전 명령어가 성공했으므로 0이 출력됩니다.

rm /tmp/nonexistentfile  # 존재하지 않는 파일 삭제 시도
echo $?  # 직전 명령어가 실패했으므로 1이 출력됩니다.
  • echo $?는 직전 명령어의 종료 상태를 출력합니다. 0은 성공, 그 외의 숫자는 실패를 나타냅니다.

반복문 (for)

# 리스트를 반복문으로 처리
for var in a b c
do
    echo $var  # a, b, c가 차례대로 출력됩니다.
done
# 숫자 반복문 (1부터 10까지)
for (( i=1; i<=10; i++ ))
do
    echo "The next number is $i"  # 1부터 10까지 출력됩니다.
done
  • 첫 번째 예시는 a, b, c를 차례대로 출력하는 반복문입니다.
  • 두 번째 예시는 숫자 1부터 10까지 출력하는 반복문입니다.

반복문 (while)

# 조건이 참일 때 반복문 실행
count=1
while [ $count -le 5 ]
do
    echo "Count is $count"  # 1부터 5까지 출력됩니다.
    ((count++))  # count 값을 1씩 증가시킴
done
  • while 반복문은 count가 5 이하일 동안 실행됩니다. count++로 값이 증가하고, count가 6이 되면 반복을 종료합니다.

반복문 제어

# break를 사용하여 반복문 종료
for i in 1 2 3 4
do
    if [ $i -eq 3 ]; then
        break  # i가 3이면 반복문 종료
    fi
    echo "i is $i"
done

출력:

i is 1
i is 2
  • i가 3일 때 break가 실행되어 반복문이 종료됩니다. i=3은 출력되지 않습니다.
# continue를 사용하여 반복문 건너뛰기
for i in 1 2 3 4
do
    if [ $i -eq 3 ]; then
        continue  # i가 3이면 해당 반복을 건너뛰고 다음 반복으로 넘어갑니다.
    fi
    echo "i is $i"
done

출력:

i is 1
i is 2
i is 4
  • i=3일 때 continue가 실행되어 i=3은 출력되지 않지만 반복은 종료되지 않고 계속됩니다.
# 중첩된 반복문에서 break와 continue 사용
for i in 1 2
do
    for j in 1 2
    do
        if [ $i -eq 2 ]; then
            break  # 내부 반복문 종료
        fi
        echo "$i $j"
    done
done

출력:

1 1
1 2
  • 외부 반복문(i)이 2일 때, 내부 반복문(j)에서 break가 실행되어 내부 반복문이 종료됩니다. i=2일 때는 내부 반복이 실행되지 않습니다.

NFS && mount

1. NFS 서비스 실행

sudo systemctl status nfs-server  # NFS 서버 상태 확인
sudo systemctl start nfs-server   # NFS 서버 시작
sudo systemctl enable nfs-server  # NFS 서버 부팅 시 자동 시작 설정

2. NFS 공유 디렉토리 마운트

[root@rocky1 ~]# sudo mount -t nfs 211.183.3.102:/shared /remote
  • sudo mount -t nfs 211.183.3.102:/shared /remote: 211.183.3.102 IP 주소의 서버에서 /shared 디렉토리를 rocky1의 /remote 디렉토리에 NFS(Network File System) 방식으로 마운트하는 명령어입니다.
    • 이 명령어는 rocky1에서 Apache 웹 서버가 사용하는 디렉토리에 원격 서버의 파일 시스템을 연결하는 것입니다.
    • t nfs: 파일 시스템 타입을 NFS로 지정합니다.

# 클라이언트와 서버

Rocky1 = Client

  • 제공받은 파일 시스템을 마운트하여 사용하는 역할
  • Compute 자원

Rocky2 = Server

  • 파일 공유를 제공하고, 다른 시스템이 접근할 수 있게 하는 역할
  • Storage 자원

관련글 더보기