https://www.yes24.com/Product/Goods/122109062
그림으로 배우는 리눅스 구조 - 예스24
선배가 옆에서 하나하나 알려주듯 친절히 설명해주는실습과 그림으로 배우는 리눅스 지식의 모든 것 * Go 언어와 Python, Bash 스크립트 실습 코드 제공* 이 도서는 『실습과 그림으로 배우는 리눅
www.yes24.com
1. 가상화 기능이란 무엇인가
가상화 기능은 PC나 서버 등의 물리적인 기기에서 가상 머신을 동작시키는 소프트웨어 기능 및 그러한 동작을 돕는 하드웨어 기능의 조합이다. 예를 들면 다음과 같은 용도에서 이용한다.
- 하드웨어를 최대한 활용하기 : 1대의 물리 기기에서 여러 시스템을 가동한다.
- 서버 통합 : 수십 대의 물리 기기로 구성된 시스템을 가상 머신으로 대체해서 훨씬 숫자가 줄어든 물리 기기에 집약한다.
- 레거시 시스템 수명 연장 : 하드웨어 지원이 끝난 오래된 시스템을 가동한다.
- 어떤 OS에서 다른 OS를 실행하기
- 개발, 테스트 환경을 가상적으로 구축
2. 가상화 소프트웨어
가상화 소프트웨어는 물리 기기의 하드웨어 자원을 관리하고 가상 머신에 나누어 준다. 이때 물리 기기의 CPU를 물리 CPU, 가상 머신의 CPU를 가상 CPU라고 한다.
가상화 소프트웨어와 가상 머신간의 관계는, 커널과 프로세스의 관계와 유사하다. 이를 통해 가상화 소프트웨어 위에 가상 머신이 올라가는 구조를 그림으로 나타내면 다음과 같다.
가상화 소프트웨어를 Hypervisor 라고 하며, 실제 예시들은 VMware, VirtualBox, Hyper-V, Xen 등이 있다.
3. 교재에서의 가상화 실습
이 장에서는 다음 세 종류의 소프트웨어를 조합해서 가상 머신을 작성 및 관리한다.
- KVM(kernel-based virtual machine) : 리눅스 커널이 제공하는 가상화 기능
- QEMU : CPU 및 하드웨어 에뮬레이터로, KVM과 조합해 사용하면 CPU 에뮬레이션 기능은 사용하지 않는다.
- virt-manager : 가상 머신 생성, 관리, 삭제를 지원한다. 생성한 후에는 QEMU가 담당한다.
위 세 소프트웨어는 다양한 리눅스 배포판에 사용할 수 있고, 무엇보다 오픈 소스이다.
물리 기기에서 작동하는 OS를 호스트 OS(host OS), 가상 머신에서 작동하는 OS를 게스트 OS(guest OS)라고 부르는 경우가 많다.
virt-manager와 QEMU는 리눅스 커널 입장에서는 프로세스에 불과하다. 따라서 가상화 소프트웨어와 함꼐 일반적인 프로세스를 실행할 수 있다는 점이 장점이다. 이러한 과정을 나타내면 다음과 같다.
- virt-manager가 새로운 가상 머신 기반 형태를 만든다.
- virt-manger가 가상 머신을 생성해서 QEMU를 가동한다.
- QEMU와 KVM이 연계해서 가상 머신을 필요한 만큼 실행한다.
- virt-manager가 사용이 끝난 가상 머신을 삭제한다.
따라서 이를 이용해 user가 입출력 장치로 조작하면 QEMU와 KVM에 의해 가상 머신이 작동된다.
4. 가상화를 지원하는 CPU 기능
가상화 기능을 지원하는 CPU는 물리 기기에서 user <-> kernel 모드의 동작을 확장해서, 물리 기기 처리를 하는 VMX-root 모드, 가상 머신 처리를 하는 VMX-nonroot 모드가 나뉜다.(따라서 가상 머신에서의 user mode, kernel mode 모두 VMX-nonroot 모드이다.) 예를 들어 가상 머신을 처리할 때 하드웨어 인터럽트가 발생하면 CPU가 VMX-root 모드가 되고, 물리 기기 제어로 자동적으로 전환한다.
x86 아키텍처에서는 CPU 가상화 기능 지원을 VT-x, AMD에서는 SVM이라고 부른다. 아키텍처별로 CPU 레벨의 명령어셋이 달라지는데, 이러한 부분을 KVM이 해결해준다. 이것을 고급스러운 말로, '하드웨어 기능 추상화' 라고 부른다. 다음 명령으로 현재 사용하는 환경에서 가상 기능이 유효한지 알려준다. 이 값이 양수 라면 유효, 0이라면 무효이다.
$ egrep -c '^flags.*(vmx|svm)' /proc/cpuinfo
필자의 노트북에서는 가능하다고 나온다. 만약 무효라고 나오면, 우선 가상화 기능을 지원하는지 검색해보고, 가능하다면BIOS에 접속해서 바이오스 설정을 바꾸면 된다.
5. QEMU + KVM 장치 접근 시나리오
가상 머신에 리눅스가 설치된 경우, 어떤 식으로 동작 과정이 이루어질지 시나리오로 분석해보자.
가정 : 가상 user 프로세스에서 어떤 장치의 레지스터에 접근하고 싶어함. -> 하드웨어 에뮬레이터는 QEMU이므로 QEMU까지 접근했다가 와야 함.
- VMX nonroot user mode에서 시스템 콜 호출
- VMX nonroot kernel mode에서 레지스터에 접근
- VMX root kernel mode로 모드 전환
- QEMU(user process)에 접근 -> VMX root user mode로 전환
- QEMU에서 레지스터 데이터를 kernel로 결과 전달 -> VMX root kernel mode로 전환
- VMX nonroot kernel mode로 다시 전환해서 데이터 보냄
- VMX nonroot user mode로 데이터 갖다줌.
가상 머신에서 가상 머신의 하드웨어(QEMU)에 접근하는 것도 복잡한데, 가상 머신에서 물리 기기의 하드웨어(진짜 하드웨어)로 접근하는 것은 더더욱 복잡하다. 차후에 설명하겠다.
6. 가상 머신 생성
명령줄을 다음과 같이 입력해서 ubuntu2004 가상 머신을 만들자.
$ virt-install --name ubuntu2004 --vcpus 1 --cpuset=0 --memory 2048 --os-variant ubuntu20.04 --graphics none --extra-args 'console=ttyS0 --- console=ttyS0' --location http://us.archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/
천천히 설치해주면 된다.(너무오래걸린다...) 이름은 ubuntu2004로한다.
이후 가상 머신에 SSH 접속 해주면 실습이 가능하다.
앞으로는 가상 머신을 조작하기 위해 virsh CUI 명령어를 사용한다. virsh dumpxml ubuntu2004 명령어를 실행하면 다음과 같은 XML이 출력된다.
xml을 보면 name, memory, vcpu(가상 cpu 개수), devices, disk, arch 등을 알 수 있다.
이제 다음 명령어로 가상 머신을 가동하자.
virsh list --all 명령으로 Id 값을 알 수 있다. 이름 대신 Id 값을 입력하는 커맨드도 있으니 이 명령어를 사용하면 된다.
이 상태로 ps ax 명령어를 실행하면 qemu-system-x86_64 프로세스가 존재함을 알 수 있고, 이 프로세스가 가상 머신에 1:1 대응함을 알 수 있다.
여기에서 qemu는 프로세스이므로, virsh 가 qemu에 xml 문서 내용을 인수 형태로 전달하고, qemu는 이걸 전달받아서 실제 가상 머신 ubuntu2004를 실행하고 있음을 알 수 있다. 꽤 중요한 인수들은 다음과 같다.
인수 | 값의 의미 |
m | 가상 머신에 설치된 메모리 용량 MiB 단위 |
guest | 가상 머신을 식별하는 이름. virsh list 출력 결과에서 name필드에 해당 |
smp | 가상 머신의 논리 CPU 개수 |
device | 가상 머신에 설치된 개별 하드웨어 |
drive | 가상 머신에 설치된 저장 장치. 이어서 나오는 file은 저장 장치에 대응하는 파일명 |
가상 머신은 virsh destroy {id} 로 제거할 수 있다.
여러 머신을 실행하기 위해서는 virt-clone 명령어를 이용해서 만들면 된다. 만든 후 두 가상머신을 기동해보면,
잘 생성되었음을 알 수 있다. 커널 입장에서 볼 땐 단순히 두 개의 프로세스가 실행된 것이라고 볼 수 있다 .앞으로의 실습에서는 가상 머신은 1대면 충분하므로 virsh destory 3 으로 삭제하자.
'Linux > 그림으로 배우는 리눅스 구조' 카테고리의 다른 글
[그림으로 배우는 리눅스 구조] 9. 블록 계층 (0) | 2024.08.31 |
---|---|
[그림으로 배우는 리눅스 구조] 8. 메모리 계층 (0) | 2024.08.31 |
[그림으로 배우는 리눅스 구조] 7. 파일 시스템 (0) | 2024.08.30 |
[그림으로 배우는 리눅스 구조] 6. 장치 접근(2) (0) | 2024.08.30 |
[그림으로 배우는 리눅스 구조] 6. 장치 접근(1) (0) | 2024.08.30 |