CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
리눅스마스터 1급 · 1급리눅스마스터 1급
  • Week 1
    • 1.운영체제와 리눅스: 커널이 하는 일
    • 2.자유 소프트웨어와 배포판: 라이선스가 만든 생태계
    • 3.설치와 부팅: 전원을 켜는 순간부터
    • 4.파일시스템 구조와 파일의 종류: 모든 것은 파일이다
    • 5.Week 1 종합 복습: 개념을 꿰뚫는 시간
  • Week 2
  • Week 3
  • Week 4
  • Week 5
  • Week 6
  • Week 7
    • 1.패키지 관리: RPM·YUM/DNF와 DEB·APT 두 계열을 한 손에
    • 2.소스 컴파일과 라이브러리: tar→configure→make→make install의 의미
    • 3.커널과 모듈: 시스템의 심장과 그 확장 부품 다루기
    • 4.장치 관리와 프린터: /dev·udev로 하드웨어 다루고 CUPS로 인쇄하기
    • 5.Week 7 종합 복습: 백업과 시스템 관리의 큰 그림
    • 6.가상화 관리: 하이퍼바이저·KVM·컨테이너로 한 서버를 여럿처럼 쓰기
  • Week 8
  • Week 9
  • Week 10
  • Week 11
  • Week 12
  • Week 13
  • Week 14
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 1급/Week 7/Day 6

기준: 리눅스마스터 1급 출제 기준·오류 제보

리눅스마스터 1급· AssociateWeek 7 · Day 6읽기 약 14분
핵심 정리
  • 가상화의 유일한 분기점은 커널을 새로 띄우느냐(VM), 빌려 쓰느냐(컨테이너)다. VM은 무겁고(수 GB·수십 초) 다른 OS도 돌리며, 컨테이너는 가볍고(수십 MB·1초) 리눅스 커널 위에서만 돈다.
  • 전가상화는 게스트 커널 수정이 불필요(하이퍼바이저가 가로챔, KVM·ESXi), 반가상화는 커널을 고쳐 하이퍼콜로 요청한다(Xen PV).
  • Type 1은 하드웨어 바로 위(Xen·ESXi·Hyper-V·KVM), Type 2는 호스트 OS 위의 응용 프로그램(VirtualBox·VMware Workstation).
  • KVM은 CPU·메모리를 하드웨어 가속하고 QEMU가 주변 장치를 흉내 내며 libvirt/virsh가 관리한다. destroy(강제 종료) ≠ undefine(정의 삭제).
  • 컨테이너는 namespace(시야 격리) + cgroup(자원 제한)만으로 성립한다. Docker에서는 rm(컨테이너)/rmi(이미지), -p 호스트:컨테이너, Dockerfile의 RUN(빌드 시점)/CMD(실행 시점) 구분이 핵심.

Day 6 - 가상화 관리: 하이퍼바이저·KVM·컨테이너로 한 서버를 여럿처럼 쓰기

전가상화와 반가상화

  • 게스트가 하드웨어에 접근하려 할 때 그 요청을 누가 어떻게 받느냐로 방식이 갈린다.
구분전가상화(Full)반가상화(Para)
게스트 OS 수정불필요(있는 그대로 설치)필요(커널 수정)
하드웨어 접근하이퍼바이저가 가로채 처리게스트가 하이퍼콜로 직접 요청
게스트 OS 제약Windows 등 수정 불가 OS도 가능오픈소스 커널만 현실적
대표 예KVM, VMware ESXi, Xen HVMXen PV

전가상화는 게스트를 "속인다". 게스트 커널은 진짜 하드웨어 위에 있다고 믿고 특권 명령을 실행하는데 하이퍼바이저가 그것을 가로채(trap) 대신 처리한다 — Windows처럼 소스를 손댈 수 없는 OS를 돌리는 이유다. 반가상화는 게스트 커널을 수정해 특권 명령 대신 하이퍼콜(hypercall)로 부탁하게 만든다.

전가상화의 성능 문제는 Intel VT-x·AMD AMD-V가 해결했다. CPU가 게스트 모드를 직접 제공해 가로채기 비용을 없앴고, 그래서 전가상화가 표준이 됐다. 반가상화는 I/O 영역(virtio)에만 남았다.

grep -E 'vmx|svm' /proc/cpuinfo     # Intel=vmx, AMD=svm 플래그가 보이면 지원
grep -c -E 'vmx|svm' /proc/cpuinfo  # 지원 논리 코어 수(0이면 미지원 또는 BIOS 비활성)

하이퍼바이저 Type 1 vs Type 2

  • 하이퍼바이저(VMM)는 가상 머신을 만들고 물리 자원을 나눠주는 계층이다.
  • 분류 기준은 하나 — 하드웨어 바로 위인가, 호스트 OS 위인가.
구분Type 1 (베어메탈)Type 2 (호스트형)
위치하드웨어 바로 위호스트 OS 위의 응용 프로그램
호스트 OS / 성능불필요 / 높음필요 / 낮음
용도서버·데이터센터·클라우드데스크톱·개발·학습
대표 예Xen, VMware ESXi, Hyper-V, KVMVirtualBox, VMware Workstation
[Type 1]                    [Type 2]
+------------------+        +------------------+
| VM  | VM  | VM   |        | VM  | VM         |
+------------------+        +------------------+
|   하이퍼바이저   |        | 하이퍼바이저(앱) |
+------------------+        +------------------+
|     하드웨어     |        |    호스트 OS     |
+------------------+        +------------------+
                            |     하드웨어     |
                            +------------------+
  • Type 2가 느린 이유: 게스트의 요청이 하이퍼바이저 → 호스트 OS → 하드웨어로 한 단계를 더 거친다.
  • 그래서 서버실은 Type 1, 내 노트북은 Type 2가 정석이다.

⚠️ 함정: KVM의 분류가 헷갈리는 지점이다. KVM은 커널 모듈이라 "호스트 OS 위"처럼 보이지만, 적재되는 순간 리눅스 커널 자체가 하이퍼바이저로 변신한다. 그래서 통상 Type 1으로 분류하며, 시험 보기도 "KVM = Type 1, VirtualBox = Type 2"가 표준이다.

KVM — 리눅스 커널이 곧 하이퍼바이저

  • KVM(Kernel-based Virtual Machine)은 커널 2.6.20부터 메인라인에 포함된 리눅스 표준 가상화다.
  • 핵심은 커널 모듈이라는 점 — 어제 배운 모듈 관리 명령이 그대로 적용된다.
lsmod | grep kvm       # kvm, kvm_intel(또는 kvm_amd)가 보여야 한다
modprobe kvm_intel     # Intel CPU용 KVM 모듈 적재
ls -l /dev/kvm         # KVM이 노출하는 문자 장치(crw-rw----)
구성 요소역할
KVM(kvm.ko, kvm_intel/kvm_amd.ko)커널 모듈. CPU·메모리 가상화를 하드웨어 가속으로 처리
QEMU사용자 공간 에뮬레이터. 디스크·NIC·그래픽 등 주변 장치 에뮬레이션
libvirt / libvirtd가상화 관리 추상화 계층(API·데몬)
virsh / virt-managerlibvirt의 명령행 / GUI 클라이언트

KVM과 QEMU는 경쟁자가 아니라 분업 관계다. KVM은 CPU·메모리만 하드웨어 가속으로 담당하고, 디스크 컨트롤러·NIC·VGA 같은 주변 장치는 QEMU가 흉내 낸다. "KVM은 CPU, QEMU는 장치"로 외운다.

# RHEL/CentOS/Rocky 계열
dnf install qemu-kvm libvirt virt-install virt-manager
# Debian/Ubuntu 계열
apt install qemu-kvm libvirt-daemon-system virtinst virt-manager
systemctl enable --now libvirtd      # 공통: libvirt 데몬 기동

virsh — 가상 머신 관리 명령

  • virsh는 실기 단답의 핵심이다.
  • 용어 주의: libvirt에서는 가상 머신 하나를 도메인(domain)이라 부른다.
virsh list                  # 실행 중인 도메인만
virsh list --all            # 정지된 것까지 전부
virsh start vm1             # 시작
virsh shutdown vm1          # 정상 종료(ACPI 신호 전달)
virsh destroy vm1           # 강제 종료(전원 코드 뽑기) — 삭제 아님!
virsh undefine vm1          # 도메인 정의 삭제(제거)
virsh suspend vm1           # 일시 정지(메모리 유지)
virsh resume vm1            # 정지 해제
virsh dominfo vm1           # 상태·CPU·메모리 정보
virsh dumpxml vm1 > vm1.xml # 설정을 XML로 내보내기 (반대: virsh define vm1.xml)
virsh autostart vm1         # 호스트 부팅 시 자동 시작

⚠️ 함정: virsh destroy는 이름과 달리 가상 머신을 지우지 않는다. 전원 코드를 뽑듯 강제로 끄는 것이며, 디스크와 정의는 남아 virsh start로 다시 켤 수 있다. 등록을 지우는 명령은 virsh undefine이다.

libvirt가 존재하는 이유는 추상화다. virsh 명령은 KVM뿐 아니라 Xen·LXC에도 통하며 접속 URI만 바꾸면 된다. 도메인 XML은 /etc/libvirt/qemu/, 디스크 이미지 기본 저장소는 /var/lib/libvirt/images/다.

  • 새 VM은 virt-install로, 디스크 이미지는 qemu-img로 만든다.
  • raw : 단순해 빠르지만 처음부터 전체 용량을 차지한다.
  • qcow2 : 실제 쓴 만큼만 커지는 씬 프로비저닝과 스냅샷을 지원해 기본 선택지다.
qemu-img create -f qcow2 /var/lib/libvirt/images/vm1.qcow2 20G
qemu-img info /var/lib/libvirt/images/vm1.qcow2
 
virt-install --name vm1 --memory 2048 --vcpus 2 \
  --disk path=/var/lib/libvirt/images/vm1.qcow2,size=20 \
  --cdrom /iso/Rocky-9.iso --network bridge=br0 --graphics vnc

컨테이너 — 커널을 공유하는 격리

  • 컨테이너는 게스트 OS를 띄우지 않는다.
  • 호스트 커널을 그대로 쓰면서 커널의 두 기능으로 프로세스를 가둔다.
커널 기능하는 일
namespace무엇을 볼 수 있는가를 격리(PID·네트워크·마운트·호스트명·사용자·IPC)
cgroup(control group)자원을 얼마나 쓸 수 있는가를 제한(CPU·메모리·I/O)
비교가상 머신(VM)컨테이너
커널게스트마다 별도 커널호스트 커널 공유
크기 / 부팅수 GB / 수십 초수십~수백 MB / 1초 이내
격리 강도강함(하드웨어 수준)상대적으로 약함(커널 공유)
다른 OSWindows 등 가능리눅스 컨테이너는 리눅스만
대표KVM, VirtualBoxDocker, Podman, LXC
  • 두 기능을 한 줄로: "시야와 한도".
    • namespace는 시야 — 컨테이너 안에서 ps를 치면 자기 프로세스만, ip addr을 치면 자기 인터페이스만 보인다.
    • cgroup은 한도 — 한 컨테이너가 호스트 자원을 통째로 잡아먹지 못하게 막는다.

"컨테이너는 가벼운 가상 머신"이라는 표현은 시험에서 오답이다. 컨테이너에는 게스트 커널도 하이퍼바이저도 없다. 그래서 리눅스 호스트 위에서 Windows 컨테이너를 돌릴 수 없고, 커널 취약점이 뚫리면 격리도 함께 뚫린다.

컨테이너의 뿌리는 1979년 유닉스 chroot다. 리눅스에서 cgroup·namespace가 커널에 들어오며 기반이 갖춰졌고 LXC가 이를 묶었으며, 2013년 Docker가 이미지와 레지스트리라는 유통 개념을 얹으며 폭발적으로 퍼졌다 — 격리 기술보다 "배포 방식"이 혁신이었다.

Docker — 이미지와 컨테이너

  • Docker를 이해하는 열쇠는 이미지와 컨테이너의 구분이다.
개념정의
이미지(image)읽기 전용 템플릿(계층 구조). 실행되지 않음 — 설치 파일에 해당
컨테이너(container)이미지 위에 쓰기 가능 계층을 얹은 실행 인스턴스
레지스트리(registry)이미지를 보관·배포하는 저장소(Docker Hub 등)
docker pull nginx:1.25                       # 레지스트리에서 이미지 내려받기(태그 지정)
docker images                                # 로컬 이미지 목록
docker run -d -p 8080:80 --name web nginx    # 컨테이너 생성 + 실행
docker ps                                    # 실행 중인 컨테이너 (전부: docker ps -a)
docker exec -it web /bin/bash                # 실행 중인 컨테이너에서 명령 실행(셸 접속)
docker logs -f web                           # 컨테이너 표준출력 로그(실시간)
docker stop web                              # 정상 정지
docker rm web                                # 컨테이너 삭제(정지 상태여야 함)
docker rmi nginx                             # 이미지 삭제
docker build -t myapp:1.0 .                  # Dockerfile로 이미지 빌드
옵션의미
-ddetached, 백그라운드 실행
-it대화형(-i 표준입력 유지 + -t 유사 터미널)
-p 호스트:컨테이너포트 매핑(publish)
-v 호스트경로:컨테이너경로볼륨·바인드 마운트
--name / -e KEY=VALUE / --rm이름 지정 / 환경 변수 / 종료 시 자동 삭제

docker rm(컨테이너 삭제)과 docker rmi(이미지 삭제)를 바꿔 쓰는 문제가 있다 — i가 붙으면 image다. 또 -p 8080:80은 호스트 포트가 앞, 컨테이너 포트가 뒤이며 순서를 뒤집은 보기는 오답이다.

  • 컨테이너가 삭제되면 쓰기 계층이 통째로 사라진다. 그래서 보존할 데이터는 볼륨으로 밖에 둔다.
  • -v /host/data:/var/lib/mysql처럼 호스트 디렉터리를 연결하면(바인드 마운트) 컨테이너를 지워도 데이터가 남는다.

Dockerfile — 이미지를 코드로 정의하기

  • Dockerfile은 이미지를 만드는 절차를 적은 텍스트 파일이며, 각 지시어가 이미지의 한 계층(layer)이 된다.
FROM ubuntu:22.04                 # 베이스 이미지(반드시 첫 지시어)
ENV APP_HOME=/app                 # 환경 변수
WORKDIR /app                      # 작업 디렉터리(없으면 생성)
COPY ./src /app                   # 호스트 파일을 이미지로 복사
RUN apt-get update && apt-get install -y python3   # 빌드 시점에 실행
EXPOSE 8080                       # 사용할 포트를 문서화
CMD ["python3", "app.py"]         # 컨테이너 시작 시 실행할 기본 명령
지시어역할
FROM베이스 이미지 지정(항상 첫 줄)
RUN빌드 시점에 명령 실행(결과가 이미지에 남음)
COPY / ADD파일 복사(ADD는 URL·자동 압축 해제 지원)
WORKDIR / ENV / USER작업 디렉터리 / 환경 변수 / 실행 사용자
EXPOSE노출 포트 문서화(실제 개방은 -p)
CMD / ENTRYPOINT실행 시점의 기본 명령(덮어쓰기 가능) / 고정 실행 파일

RUN과 CMD의 시점이 다르다. RUN은 docker build 중 실행되어 결과가 이미지에 굳고, CMD는 docker run 할 때 실행되며 여러 번 써도 마지막 하나만 유효하다. EXPOSE는 문서화일 뿐 외부 접근을 열지 않는다.

  • Podman은 RHEL 8부터 Docker를 대체하는 기본 컨테이너 엔진이다.
  • Docker와의 차이는 두 가지 — 데몬리스(상주 데몬 dockerd 없이 컨테이너를 직접 띄움), 루트리스(일반 사용자 권한으로 실행).
  • 옵션은 Docker 호환이라 podman run -d -p 8080:80 nginx가 그대로 통한다. 시스템 컨테이너 계열 LXC/LXD도 알아둔다.
# 직접 쳐보기 — 가상화 지원과 격리 기능 관찰 (안전: 조회 위주)
grep -c -E 'vmx|svm' /proc/cpuinfo    # CPU 가상화 지원 코어 수(0이면 미지원)
lsmod | grep kvm                       # KVM 모듈 적재 여부
ls -l /dev/kvm 2>/dev/null || echo "KVM 미사용"
lsns | head                            # 시스템의 namespace 목록
ls /sys/fs/cgroup | head               # cgroup 계층
virsh list --all 2>/dev/null || echo "libvirt 미설치"
docker ps -a 2>/dev/null || echo "Docker 미설치"

VirtualBox — Type 2의 대표

  • VirtualBox는 오라클이 배포하는 대표적 Type 2 하이퍼바이저다.
  • GUI 외에 VBoxManage 명령행 도구를 제공하며, VBoxManage <하위명령> <VM이름> [옵션] 구조로 일관된다.
VBoxManage list vms                          # 등록된 VM 목록(실행 중만: list runningvms)
VBoxManage showvminfo "vm1"                  # VM 상세 정보
VBoxManage startvm "vm1" --type headless     # GUI 없이 백그라운드로 시작
VBoxManage controlvm "vm1" acpipowerbutton   # 정상 종료 요청(강제: poweroff)
VBoxManage modifyvm "vm1" --memory 2048      # 설정 변경(메모리)
VBoxManage snapshot "vm1" take "before-update"   # 스냅샷 생성
  • 함께 설치하는 Guest Additions는 게스트 안에 넣는 보조 드라이버다. 해상도 자동 조절·클립보드 공유·공유 폴더를 가능하게 한다(VMware Tools와 같은 역할).

암기 팁

  • 가상화 문제는 "같은 일을 하는 다른 도구의 명령"을 짝짓거나 비슷한 이름을 뒤바꾼 보기로 나온다.
  • 세 도구를 같은 작업끼리 묶어 외운다.
    • 전체 목록 : virsh list --all / docker ps -a / VBoxManage list vms
    • 강제 종료 : virsh destroy / docker kill / controlvm poweroff
    • 삭제 : virsh undefine / docker rm / unregistervm
헷갈리는 짝구분법
docker rm vs docker rmii가 붙으면 image 삭제
virsh destroy vs undefinedestroy=강제 종료, undefine=정의 삭제
RUN vs CMDRUN=빌드 시점, CMD=실행 시점
Type 1 vs Type 2아래가 하드웨어면 1, 호스트 OS면 2
전가상화 vs 반가상화게스트 커널 수정이 불필요면 전, 필요면 반
VM vs 컨테이너커널이 따로 있으면 VM, 공유하면 컨테이너

📖 용어

  • 가상화 : 물리 자원을 논리적으로 쪼개 한 대의 서버가 여러 대인 것처럼 동작하게 하는 기술.
  • 하이퍼바이저(VMM) : 가상 머신을 만들고 물리 자원을 나눠주는 계층. 위치에 따라 Type 1/Type 2로 나뉜다.
  • 전가상화 : 게스트를 "속여" 커널 수정 없이 그대로 돌리는 방식. 하이퍼바이저가 특권 명령을 가로챈다.
  • 반가상화 : 게스트 커널을 고쳐 하이퍼콜로 직접 요청하게 만드는 방식. 빠르지만 커널 수정이 필요하다.
  • VT-x / AMD-V : CPU가 제공하는 하드웨어 가상화 지원. /proc/cpuinfo의 vmx/svm 플래그로 확인한다.
  • KVM : 리눅스 커널 자체를 하이퍼바이저로 바꾸는 커널 모듈. CPU·메모리 가상화를 담당한다.
  • QEMU : 디스크·NIC·VGA 등 주변 장치를 흉내 내는 사용자 공간 에뮬레이터. KVM과 분업한다.
  • libvirt / virsh : 가상화 관리를 추상화한 계층과 그 명령행 클라이언트. Xen·LXC에도 같은 명령이 통한다.
  • 도메인(domain) : libvirt가 가상 머신 하나를 부르는 이름.
  • virsh destroy vs undefine : 전원 코드를 뽑듯 강제로 끄기(다시 켤 수 있음) vs 도메인 정의 자체를 지우기.
  • qcow2 : 실제 쓴 만큼만 커지고 스냅샷을 지원하는 QEMU 디스크 이미지 형식. raw는 처음부터 전체 용량을 잡는다.
  • namespace : 컨테이너가 무엇을 볼 수 있는지를 격리하는 커널 기능(PID·네트워크·마운트 등).
  • cgroup : 컨테이너가 자원을 얼마나 쓸 수 있는지를 제한하는 커널 기능(CPU·메모리·I/O).
  • 이미지 vs 컨테이너 : 실행되지 않는 읽기 전용 템플릿 vs 그 위에 쓰기 계층을 얹은 실행 인스턴스.
  • docker rm vs rmi : 컨테이너 삭제 vs 이미지 삭제. 끝의 i가 image다.
  • RUN vs CMD : 빌드 시점에 실행되어 이미지에 굳는 지시어 vs 컨테이너를 띄울 때 실행되는 기본 명령.
  • Podman : 데몬 없이(데몬리스), 일반 사용자 권한으로(루트리스) 도는 Docker 호환 컨테이너 엔진.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

전가상화(Full Virtualization)와 반가상화(Para Virtualization)의 차이로 가장 정확한 것은?

문제 2

Type 1(베어메탈) 하이퍼바이저와 Type 2(호스트형) 하이퍼바이저의 분류가 올바르게 짝지어진 것은?

문제 3

KVM에 대한 설명으로 옳지 않은 것은?

문제 4

실행 중인 가상 머신 vm1을 강제로 종료(전원 차단)하는 virsh 명령은?

문제 5

가상 머신(VM)과 컨테이너의 근본적 차이로 가장 적절한 것은?

문제 6

Docker에서 컨테이너를 백그라운드로 실행하면서 호스트의 8080 포트를 컨테이너의 80 포트로 연결하는 명령으로 올바른 것은?

문제 7

Docker 명령과 그 역할이 잘못 짝지어진 것은?

이전Week 7 종합 복습: 백업과 시스템 관리의 큰 그림Week 7 · Day 5다음 네트워크 기초: OSI 7계층과 IP 주소·서브넷 계산Week 8 · Day 1

참고 공식 자료

  • 리눅스마스터 1급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • 전가상화와 반가상화
  • 하이퍼바이저 Type 1 vs Type 2
  • KVM — 리눅스 커널이 곧 하이퍼바이저
  • virsh — 가상 머신 관리 명령
  • 컨테이너 — 커널을 공유하는 격리
  • Docker — 이미지와 컨테이너
  • Dockerfile — 이미지를 코드로 정의하기
  • VirtualBox — Type 2의 대표
  • 암기 팁
  • 용어
  • 연습 문제