sudo -i : 원활한 실습을 위해 루트 권한 로그인
우분투 클라우드 이미지 웹사이트: https://cloud-images.ubuntu.com/
Ubuntu 클라우드 이미지 다운로드
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
apt update : 패키지 목록 정보 업데이트
apt install guestfs-tools libvirt-clients libvirt-daemon-system qemu-kvm virtinst cloudimage-utils bridge-utils -y : 필요한 패키지 설치
cloud-init에서 참고하는 파일
user-data
#cloud-config
hostname: vm01
manage_etc_hosts: true
users:
- name: ubuntu
sudo:
- ALL=(ALL) NOPASSWD:ALL
groups:
- users
- admin
home: /home/ubuntu
shell: /bin/bash
lock_passwd: false
ssh_pwauth: true
disable_root: false
chpasswd:
list:
- ubuntu:1111
expire: false
hostname: 인스턴스의 호스트 이름을 설정
manage_etc_hosts: 인스턴스의 /etc/hosts 파일을 관리할지 여부 결정 : true이니 IP주소와 호스트 이름이 /etc/hosts에 자동으로 추가 됨
users: 사용자 계정 추가 - ubuntu, 해당 사용자에 관한 권한, 그룹, 홈 디렉토리, 쉘 등을 설정
sudo: 사용자에게 sudo 권한을 부여
ALL=(ALL) NOPASSWD:ALL: 모든 사용자와 그룹이 sudo를 실행할 때 암호를 입력하지 않고, 모든 명령어를 실행할 수 있도록 설정
groups: 사용자가 속한 그룹을 설정 - "users"와 "admin" 그룹에 사용자 추가
home: 사용자의 홈 디렉토리 경로 설정
shell: 사용자의 로그인 쉘 설정
lock_passwd: 사용자 계정의 암호를 잠금 여부를 나타내는 설정
ssh_pwauth: SSH 암호 인증을 사용할지 여부 결정 - "true"는 SSH 암호 인증 활성화
disable_root: root 계정을 사용할 수 있는지 여부를 결정. "false"는 root 계정을 사용할 수 있음
chpasswd: 사용자 암호 설정 - “list”키를 사용하여 “ubuntu" 사용자의 암호를 1111로 설정
expire: 암호 만료 - “false”는 암호 만료를 사용하지 않도록 설정
user-data파일을 cloud-localds 명령을 통해 읽어들여 클라우드 인스턴스에 필요한 초기화 파일 생성
cloud-localds -v -d qcow2 vm01-base.qcow2 user-data
cloud-localds: 클라우드 인스턴스를 시작할 때 사용할 초기화 파일을 생성하는 명령어
-v: 명령 실행 중 상세한 출력 표시
-d qcow2: 생성할 디스크 이미지 파일 포맷을 지정하는 옵션
vm01-base.qcow2: 생성할 디스크 이미지 파일 이름
user-data: 클라우드 인스턴스에 필요한 초기화 파일을 생성하는 데 사용되는 파일 이름
qcow2 파일들을 다른 경로로 복사 → 파일의 접근 권한 및 관리
cp vm01-base.qcow2 /var/lib/libvirt/images/vm01-base.qcow2
cp focal-server-cloudimg-amd64.img /var/lib/libvirt/images/focal-server-cloudimg-amd64-vm01.img
/var/lib/libvirt/images: KVM, QEMU 가상화 플랫폼에서 가상 디스크 이미지 저장하는 기본 dir
vir-network.xml - 가상 네트워크 정의 xml파일
<network>
<name>vir-network</name>
<bridge name="virbr1"/>
<forward mode="nat"/>
<ip address="192.168.123.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.123.2" end="192.168.123.254"/>
</dhcp>
</ip>
</network>
<network>: 가상 네트워크를 정의하기 위한 최상위 요소
<name>: 가상 네트워크의 이름
<bridge>: 가상 네트워크와 호스트 네트워크 간의 브리지를 설정하는 요소
<forward>: 가상 네트워크의 전달 방식을 설정
<ip>: 가상 네트워크의 IP 주소와 서브넷 마스크를 설정
<dhcp>: 가상 머신에 자동으로 IP 주소를 할당하기 위한 DHCP 서버를 가상 네트워크에 설정
<range>: DHCP 서버가 할당할 IP 주소 범위를 설정
virsh 명령어를 사용 - vir-network.xml 파일을 통해 가상 네트워크 정의
virsh net-define vir-network.xml: vir-network.xml 파일을 통해 가상 네트워크 정의
virsh net-start vir-network: vir-network라는 이름의 가상 네트워크를 시작
virsh net-list: 가상 네트워크 목록 조회
virsh net-info vir-network: vir-network 가상 네트워크 정보 조회
virsh net-autostart vir-network: vir-network 가상 네트워크가 부팅 시 자동으로 시작되도록 설정
ip a 명령어를 입력하면 virbr1 브릿지 생성된 것을 볼 수 있다
가상머신 제어
가상 머신을 정의하고 시작: virt-install 명령어 사용
virsh define [가상머신 정의 xml 파일]
virsh start [정의된 가상머신의 이름]
가상 머신을 콘솔로 접속: virsh console [정의된 가상머신의 이름]
가상 머신 제거 방법: virsh destroy [정의된 가상머신의 이름]
가상 머신의 정의 해제: virsh undefine [정의된 가상머신의 이름]
user-data 수정 - hostname을 vm02로 설정
클라우드 인스턴스에 필요한 초기화 파일 생성
cloud-localds -v -d qcow2 vm02-base.qcow2 user-data2
vm01때와 똑같은 방법 사용
cp vm02-base.qcow2 /var/lib/libvirt/images/vm02-base.qcow2
cp focal-server-cloudimg-amd64.img /var/lib/libvirt/images/focal-server-cloudimg-amd64- vm02.img
vm2.xml - 가상 머신 정의
<domain type='kvm'>
<name>vm2</name>
<memory unit='KiB'>2097152</memory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc-q35-2.9'>hvm</type>
<boot dev='hd'/>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/focal-servercloudimg-amd64-vm02.img'/>
<target dev='vda' bus='virtio'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/vm02-base.qcow2'/>
<target dev='vdb' bus='virtio'/>
</disk>
<interface type='network'>
<mac address='52:54:00:12:34:59'/>
<source network='vir-network'/>
<model type='virtio'/>
</interface>
<console type='pty'>
<target port='0'/>
</console>
<serial type='pty'>
<target port='0'/>
</serial>
</devices>
</domain>
<domain>: KVM 가상 머신의 설정을 정의
<name>: 가상 머신의 이름을 정의
<memory>: 가상 머신의 메모리 크기를 정의
<vcpu>: 가상 머신의 가상 CPU 수를 정의
<os>: 가상 머신의 운영 체제 정보를 정의
<type>: 가상 머신의 운영 체제 유형을 지정
<boot>: 가상 머신의 부팅 순서를 정의
<devices>: 가상 머신의 하드웨어 장치를 정의
<disk>: 가상 머신의 디스크 장치를 정의
<driver>: 디스크 드라이버를 지정
<source>: 디스크 이미지 파일의 경로를 지정
<target>: 디스크 장치의 이름 및 버스를 정의
<interface>: 가상 머신의 네트워크 인터페이스를 정의
<mac>: 인터페이스의 맥 주소를 정의
<source>: 가상 브리지의 이름을 지정
<model>: 네트워크 인터페이스 모델을 지정
<console>: 가상 머신의 콘솔에 대한 설정을 정의
<target>: 콘솔의 타겟 포트를 지정
<serial>: 가상 머신의 시리얼 포트에 대한 설정을 정의
<target>: 시리얼 포트의 타겟 포트를 지정
가상 머신 정의/생성/조회
virsh define vm2.xml: vm2.xml 파일을 통해 가상 머신 정의
virsh start vm2: vm2 이라는 이름의 가상 머신 시작
virsh list: 가상 머신 목록 조회
virsh dominfo vm2: vir-network 가상 네트워크 정보 조회
가상 머신 콘솔 접속 및 접속 종료
virsh console vm2: vm2 가상머신을 콘솔로 접속 → user-data2에 작성했던 유저 계정 입력 및 비밀번호 입력
Ctrl + ]: 가상 머신의 콘솔에서 밖으로 나가기
가상 머신의 일시 중단 및 재게
virsh suspend vm2: vm2라는 가상머신 일시 중단
특징
virsh resume vm2: 다시 재개
가상 머신 종료, 시작
virsh shutdown vm2 : vm2라는 가상머신 종료
shutdown과 suspend 차이:
virsh start vm2: vm2이라는 가상 머신을 시작
스냅샷
virsh snapshot-create-as vm2 --name initial-version :
vm2 가상 머신에 대한 initial-version 이라는 이름의 스냅샷을 생성
virsh snapshot-list vm2: 해당 스냅샷이 생성되었는지 확인
touch hello_vm2: 가상 머신 내부에서 파일을 생성
virsh snapshot-revert vm2 initial-version:
vm2 가상 머신에 대한 initial-version 이라는 이름의 스냅샷으로 복구
virsh snapshot-delete vm2 initial-version: initial-version 스냅샷 삭제
virsh snapshot-list vm2: 해당 스냅샷이 삭제되었는지 확인
네트워크 관련 명령어
virsh net-list: 현재 호스트에서 사용 가능한 가상 네트워크 목록을 출력
virsh iface-list: 현재 호스트의 물리 네트워크 인터페이스 목록을 출력
virsh domifaddr vm2: 가상 머신의 네트워크 인터페이스 목록 출력
virsh domifstat vm2 vnet3: vm2 가상 머신의 vnet3 인터페이스에 대한 네트워크 I/O 통계 정보 출력
가상머신에 웹서버 구동
virsh console vm2: 가상머신에 콘솔로 접속
sudo apt-get update: 패키지 매니저를 업데이트하여 최신 패키지 목록을 가져옴
sudo apt-get install apache2: 아파치 웹 서버 설치
sudo service apache2 start : 아파치 웹 서버 시작
sudo vi /var/www/html/index.html : vi편집기로 html파일 수정
curl + IP : 웹서버에 요청 보내고 결과 출력
윈도우에서 접속하기
iptables -t nat -I PREROUTING -d [UBUNTU_IP] -p tcp --dport [ACCESS PORT] -j DNAT --to-destination [apache vm ip]:[apache webserver port] : Ubuntu 호스트에서 들어오는 특정 포트 접근 요청을 Apache VM의 IP 주소와 웹 서버 포트로 변경하여 전달
iptables -t filter -I FORWARD -p tcp -d [apache vm의 ip] --dport [apache webserver port] -j ACCEPT : 목적지 주소가 Apache VM의 IP 주소와 웹 서버 포트인 패킷 허용
iptables - 방화벽, 네트워크 주소 변환(NAT), 패킷 로깅, 트래픽 제어