Skip to main content

Command Palette

Search for a command to run...

Virtualization and Unix Practice with NetBSD

Updated
38 min read
Virtualization and Unix Practice with NetBSD
H
Hi there, I'm a full time software engineering student, and full time mum based in Brisbane, QLD, Australia. Korean is my native language and English is my second, but I love learning software in English. My posts are a mix of both Korean and English, so there's something for everyone! All my posts come straight from my lecture notes, so follow along my study journey with me <3

Introduction to Virtualization and Unix Installation (가상화와 Unix 설치 개요)

이번 시간에는 운영체제(Operating System) 수업의 실습 준비 과정으로 가상화(Virtualization)의 개념을 간단히 살펴보고, Unix(유닉스)를 설치하는 과정을 다룬다. 앞으로 실습에서는 실제 컴퓨터에 직접 운영체제를 설치하는 것이 아니라, 가상화 환경(Virtualized Environment)을 이용해 별도의 운영체제를 실행하게 된다.

가상화(Virtualization)란 하나의 실제 컴퓨터 안에서 또 다른 컴퓨터 환경을 만들어 사용하는 기술이다. 예를 들어 현재 사용 중인 Windows나 macOS 안에서 가상 머신(Virtual Machine)을 만들고, 그 안에 Unix나 Linux 같은 다른 운영체제를 설치해 실행할 수 있다. 이렇게 하면 실제 컴퓨터의 설정을 크게 변경하지 않고도 다양한 운영체제 환경을 실습할 수 있다는 장점이 있다.

이번 수업의 목표는 가상화(Virtualization)가 무엇인지 이해하고, 이를 이용해 Unix(유닉스)를 설치해 보는 것이다. 수업이 끝난 후에는 가상화가 어떤 개념인지 간단히 설명할 수 있어야 하며, Unix 환경에서 기본적인 명령어(Command)를 실행할 준비가 되어 있어야 한다.

Unix(유닉스)는 Linux(리눅스)와 완전히 같은 운영체제는 아니지만, 역사적 맥락과 사용 방식이 매우 비슷하다. 특히 터미널(Terminal)에서 사용하는 기본 명령어(Command)는 상당 부분 동일하거나 유사하다. 따라서 Unix를 학습하면 Linux를 이해하는 데에도 도움이 되고, 반대로 Linux에서 배운 명령어 지식도 Unix 환경에서 활용할 수 있다.

이번 실습에서는 Unix를 직접 설치하면서 운영체제 실습 환경을 구성하게 된다. 이후 수업에서 파일 시스템(File System), 프로세스(Process), 명령어(Command), 권한(Permission) 등 운영체제의 핵심 개념을 배우기 위해서는 먼저 Unix 또는 Linux와 같은 실습 환경이 필요하다. 따라서 이번 시간은 본격적인 운영체제 실습을 시작하기 위한 기초 준비 단계라고 볼 수 있다.

Additional Notes (추가 설명)

가상 머신(Virtual Machine)은 실제 컴퓨터 안에 만들어진 “가짜 컴퓨터”라고 생각하면 이해하기 쉽다. 이 가상 머신 안에는 별도의 운영체제(Operating System)를 설치할 수 있고, 실제 컴퓨터와는 분리된 환경에서 안전하게 실습할 수 있다.

Unix(유닉스)와 Linux(리눅스)는 같은 것은 아니지만, Linux는 Unix의 철학과 구조를 많이 참고하여 만들어졌다. 그래서 명령어(Command), 파일 구조(File Structure), 터미널 사용 방식(Terminal Usage)이 비슷하다.

운영체제 수업에서 Unix/Linux 환경을 사용하는 이유는 운영체제의 내부 구조를 이해하기 좋기 때문이다. 특히 프로세스(Process), 파일(File), 권한(Permission), 메모리(Memory), 커널(Kernel) 같은 개념을 명령어와 실습을 통해 직접 확인할 수 있다.


Booting, BIOS, and UEFI (부팅, BIOS, UEFI)

Computer Components (컴퓨터 구성 요소)

이번 내용은 가상화(Virtualization)를 이해하기 전에, 컴퓨터가 기본적으로 어떻게 구성되고 어떻게 부팅(Booting)되는지를 살펴보는 부분이다. 컴퓨터를 사용하려면 먼저 하드웨어(Hardware)가 필요하고, 그 하드웨어 위에서 동작하는 소프트웨어(Software)가 필요하다.

하드웨어(Hardware)는 컴퓨터의 물리적인 장치들을 의미한다. 대표적으로 CPU(Central Processing Unit), 메모리(Memory), 스토리지(Storage), 마더보드(Motherboard), 파워서플라이(Power Supply), 그리고 입출력 장치(I/O Device)가 있다. CPU는 명령을 처리하는 핵심 장치이고, 메모리는 실행 중인 프로그램이 임시로 사용하는 공간이다. 스토리지는 운영체제와 파일이 저장되는 장치이며, 마더보드는 여러 부품을 연결하는 중심 역할을 한다.

반면 소프트웨어(Software)는 하드웨어 위에서 실행되는 프로그램을 의미한다. 대표적으로 운영체제(Operating System), 응용 프로그램(Application Program), 컴파일러(Compiler) 등이 있다. 운영체제는 하드웨어와 응용 프로그램 사이에서 중간 역할을 하며, 사용자가 컴퓨터 자원을 편리하게 사용할 수 있도록 관리한다.


Booting as a Connection Between Hardware and Software (하드웨어와 소프트웨어의 결합으로서의 부팅)

부팅(Booting)이란 컴퓨터가 전원이 켜진 뒤 운영체제(Operating System)를 실행할 준비를 하는 과정이다. 다시 말해, 하드웨어(Hardware)와 소프트웨어(Software)가 연결되는 첫 단계라고 볼 수 있다.

컴퓨터는 전원이 켜지자마자 바로 운영체제를 실행할 수 있는 것이 아니다. 먼저 하드웨어가 정상적으로 작동하는지 확인하고, 어느 저장 장치(Storage)에서 운영체제를 불러올지 찾아야 한다. 이 과정을 담당하는 것이 과거에는 BIOS(Basic Input-Output System)였고, 최근 컴퓨터에서는 주로 UEFI(Unified Extensible Firmware Interface)가 사용된다.

리눅스(Linux)의 부팅 과정을 예로 들면, 크게 BIOS를 사용하는 방식과 UEFI를 사용하는 방식으로 나눌 수 있다. 쉽게 말하면 BIOS는 오래된 컴퓨터에서 많이 사용되던 방식이고, UEFI는 최근 컴퓨터에서 사용하는 방식이라고 이해할 수 있다.


BIOS Booting (BIOS 기반 부팅)

BIOS(Basic Input-Output System)는 오래된 방식의 펌웨어(Firmware)이다. 펌웨어(Firmware)는 하드웨어와 운영체제 사이에서 가장 먼저 실행되는 낮은 수준의 소프트웨어라고 볼 수 있다.

BIOS 방식에서는 컴퓨터가 켜지면 먼저 마더보드(Motherboard)와 기본 하드웨어를 확인한다. 그 후 운영체제를 부팅하기 위해 정해진 위치를 찾는다. 이때 중요한 개념이 MBR(Master Boot Record)이다.

MBR(Master Boot Record)은 저장 장치(Storage)의 특정 위치에 존재하는 부팅 정보 영역이다. BIOS는 이 위치를 찾아가고, 그곳에 있는 부트로더(Bootloader)를 실행한다. 부트로더(Bootloader)는 운영체제를 실제로 불러오는 역할을 한다.

예전에는 이 부팅 위치가 손상되면 나머지 데이터가 멀쩡하더라도 컴퓨터가 정상적으로 부팅되지 않는 문제가 있었다. 예를 들어 하드디스크 안의 파일들은 그대로 남아 있어도, 부트 섹터(Boot Sector)가 손상되면 운영체제를 시작할 수 없었다. 그래서 예전 컴퓨터에서는 부팅 관련 영역을 복구하는 작업이 중요한 문제였다.


UEFI Booting (UEFI 기반 부팅)

UEFI(Unified Extensible Firmware Interface)는 BIOS를 대체하기 위해 등장한 새로운 방식의 펌웨어(Firmware)이다. 최근 컴퓨터에서는 대부분 UEFI를 사용한다.

UEFI 방식에서는 GPT(GUID Partition Table)를 사용한다. GPT는 GUID Partition Table의 약자로, 기존의 MBR보다 더 현대적인 파티션 테이블(Partition Table) 방식이다. 여기서 GUID(Globally Unique Identifier)는 전 세계적으로 고유한 식별자를 의미한다.

UEFI에서는 부트로더(Bootloader)가 EFI 부트로더(EFI Bootloader) 형태로 관리된다. 리눅스(Linux) 환경에서는 GRUB(Grand Unified Bootloader)이 자주 사용된다. GRUB은 사용자가 여러 운영체제 중 하나를 선택하거나, 리눅스 커널(Linux Kernel)을 불러오는 역할을 한다.

BIOS가 정해진 부트 섹터(Boot Sector)를 찾아가는 방식에 가깝다면, UEFI는 더 구조화된 방식으로 부팅 정보를 관리한다. 그래서 큰 용량의 저장 장치(Storage)를 다루거나, 다양한 운영체제 환경을 관리하는 데 더 적합하다.


Why UEFI Replaced BIOS (UEFI가 BIOS를 대체하게 된 이유)

BIOS는 초기 개인용 컴퓨터 시대에 만들어진 방식이다. 당시에는 저장 장치(Storage)의 용량이 지금처럼 크지 않았다. 교수님 설명처럼 예전에는 킬로바이트(KB), 메가바이트(MB) 단위의 저장 용량을 사용하는 경우가 많았지만, 지금은 스마트폰조차 기가바이트(GB) 단위의 저장 용량을 사용한다.

이처럼 컴퓨터의 저장 용량과 하드웨어 구조가 크게 발전하면서, 기존 BIOS 방식만으로는 현대적인 컴퓨터 환경을 충분히 지원하기 어려워졌다. 그래서 더 큰 저장 장치, 더 유연한 부팅 방식, 더 확장성 있는 구조를 지원하기 위해 UEFI가 등장하게 되었다.

즉, BIOS에서 UEFI로 변화한 이유는 단순히 이름이 바뀐 것이 아니라, 컴퓨터 하드웨어의 발전과 저장 장치 용량 증가에 맞춰 부팅 구조 자체가 더 현대적으로 바뀐 것이라고 볼 수 있다.


Additional Notes (추가 설명)

가상화(Virtualization)를 공부할 때 부팅(Booting)을 먼저 이해하면 도움이 된다. 가상 머신(Virtual Machine)도 결국 하나의 “가짜 컴퓨터”처럼 동작하기 때문에, 그 안에서도 BIOS 또는 UEFI와 비슷한 방식으로 운영체제가 부팅된다.

BIOS와 UEFI의 차이는 처음에는 어렵게 느껴질 수 있지만, 간단히 정리하면 BIOS는 오래된 부팅 방식이고 UEFI는 현대적인 부팅 방식이다. BIOS는 MBR과 관련이 깊고, UEFI는 GPT와 관련이 깊다고 함께 기억하면 좋다.

리눅스(Linux)를 설치할 때 설치 화면에서 BIOS 모드인지 UEFI 모드인지에 따라 파티션 설정 방식이 달라질 수 있다. 특히 UEFI 환경에서는 EFI System Partition(ESP)이라는 별도의 파티션이 사용될 수 있다. 지금 단계에서는 세부 설정을 모두 외우기보다는, 운영체제가 부팅되기 위해서는 펌웨어(Firmware), 부트로더(Bootloader), 저장 장치(Storage)의 부팅 정보가 함께 작동해야 한다는 흐름을 이해하는 것이 중요하다.


Linux Boot Process and Runlevel (리눅스 부팅 과정과 런레벨)

What is Booting? (부팅이란 무엇인가)

부팅(Booting)이란 컴퓨터에 전원이 켜진 뒤, 운영체제(Operating System)를 사용할 수 있는 상태가 되기까지의 과정이다. 컴퓨터는 전원이 들어온다고 바로 사용할 수 있는 것이 아니라, 먼저 하드웨어(Hardware)가 정상인지 확인하고 운영체제를 불러오는 단계를 거친다.

이 과정에서 CPU, RAM, 마더보드(Motherboard), 스토리지(Storage) 등이 제대로 연결되어 있는지 확인된다. 특히 서버(Server)는 메모리 용량이 크기 때문에 부팅 중 메모리 체크(Memory Check)에 시간이 오래 걸릴 수 있다.

BIOS, UEFI, and GRUB (BIOS, UEFI, GRUB)

부팅이 시작되면 가장 먼저 BIOS(Basic Input-Output System) 또는 UEFI(Unified Extensible Firmware Interface)가 실행된다. 이들은 하드웨어를 확인하고, 운영체제를 불러올 수 있는 저장 장치(Storage)를 찾는 역할을 한다.

그 다음에는 GRUB(Grand Unified Bootloader)이라는 부트로더(Bootloader)가 실행된다. GRUB은 리눅스에서 사용할 커널(Kernel)을 선택하고 불러오는 역할을 한다. 즉, BIOS나 UEFI가 하드웨어적인 준비를 담당한다면, GRUB은 운영체제의 핵심인 커널을 실행하는 단계로 연결해 준다.

Kernel and initramfs (커널과 initramfs)

GRUB이 커널(Kernel)을 불러오면, 커널은 메모리(Memory)에 올라가 실행된다. 커널은 보통 압축된 형태로 저장되어 있기 때문에 부팅 과정에서 압축을 해제한 뒤 실행된다.

이후 initramfs(initial RAM file system) 또는 initrd(initial RAM disk)가 사용된다. 이것은 실제 루트 파일 시스템(Root File System)을 사용하기 전까지 임시로 사용하는 파일 시스템이다. 쉽게 말하면, 리눅스가 본격적으로 시작되기 전 필요한 준비 작업을 하기 위한 임시 공간이다.

커널은 하드웨어를 초기화하고, 필요한 드라이버(Driver)를 불러온 뒤, 실제 루트 파일 시스템(Root File System)을 마운트(Mount)한다. 루트 파일 시스템은 리눅스 전체 파일 구조의 출발점이기 때문에 반드시 정상적으로 연결되어야 한다.

init Process and Runlevel (init 프로세스와 런레벨)

커널 초기화가 끝나면 init 프로세스(init process)가 실행된다. init 프로세스는 PID 1(Process ID 1)을 가지며, 사용자 영역(User Space)에서 가장 먼저 실행되는 프로세스이다.

이후 시스템은 정해진 런레벨(Runlevel)에 따라 어떤 상태로 부팅할지 결정한다. 전통적인 리눅스에서는 런레벨이 0부터 6까지 나뉜다.

Runlevel 0은 시스템 종료(Halt), Runlevel 1은 싱글 유저 모드(Single-user Mode), Runlevel 2와 3은 멀티 유저 모드(Multi-user Mode), Runlevel 5는 GUI(Graphical User Interface)가 포함된 멀티 유저 모드, Runlevel 6은 재부팅(Reboot)을 의미한다.

서버(Server)는 보통 그래픽 화면을 사용하지 않기 때문에 Runlevel 3과 비슷한 환경에서 동작한다. 반대로 GUI 환경을 설치하면 Runlevel 5처럼 그래픽 화면으로 부팅될 수 있다.

Boot Flow Summary (부팅 흐름 요약)

리눅스 부팅 과정은 간단히 다음 흐름으로 정리할 수 있다.

전원 켜짐 → BIOS/UEFI 실행 → GRUB 실행 → 커널(Kernel) 로딩 → initramfs/initrd 사용 → 루트 파일 시스템(Root File System) 마운트 → init 프로세스 실행 → 런레벨(Runlevel)에 따른 사용자 환경 진입

Additional Notes (추가 설명)

전통적인 리눅스에서는 Runlevel(런레벨)을 사용했지만, 최신 Ubuntu, Fedora, CentOS 계열에서는 대부분 systemd를 사용한다. 그래서 실제 명령어에서는 runlevel보다 target이라는 표현을 더 자주 볼 수 있다.

운영체제 수업에서는 부팅 과정을 외우는 것보다 흐름을 이해하는 것이 더 중요하다. 핵심 흐름은 “펌웨어(Firmware) → 부트로더(Bootloader) → 커널(Kernel) → initramfs/initrd → 루트 파일 시스템(Root File System) → init/systemd → 사용자 환경(User Environment)” 순서로 기억하면 좋다.


Real and Virtual Computers (진짜와 가짜 컴퓨터)

Virtualization Concept (가상화의 개념)

가상화(Virtualization)는 실제 하드웨어(Hardware)를 그대로 사용하는 것이 아니라, 하드웨어처럼 보이는 환경을 소프트웨어적으로 만들어 사용하는 것을 말한다. 예를 들어 우리가 리눅스(Linux)를 실제 컴퓨터에 직접 설치하지 않고, Virtual Machine(가상 머신)에 설치해서 사용하는 것도 가상화의 한 예이다.

컴퓨터를 구성하는 CPU, Memory, Storage, Motherboard 같은 하드웨어 요소를 실제 물리 장치가 아닌 “가짜 환경”으로 만들어 사용하면, 하나의 컴퓨터 안에서 여러 운영체제(Operating System)를 실행하거나 실습 환경을 안전하게 구성할 수 있다.

Virtual, Emulate, Simulate (Virtual, Emulate, Simulate의 차이)

가짜로 무언가를 만든다는 의미에서 비슷하게 사용되는 용어로 Virtual, Emulate, Simulate가 있다. 세 단어는 모두 “진짜는 아니지만 진짜처럼 보이거나 동작하게 만든다”는 공통점이 있지만, 의미에는 조금씩 차이가 있다.

Virtual(가상)은 실제로 존재하지 않지만, 실제와 같거나 실제와 같은 효과를 얻는 것을 의미한다. 예를 들어 Virtual Machine(가상 머신)은 실제 컴퓨터 한 대가 더 있는 것은 아니지만, 사용자는 마치 별도의 컴퓨터를 사용하는 것처럼 운영체제를 설치하고 실행할 수 있다.

Emulate(에뮬레이트)는 어떤 대상을 흉내 내거나 복제해서 원래의 것과 같거나 비슷하게 동작하도록 만드는 것이다. 다만 실제 원본과 완전히 같은 것은 아니며, 원본의 동작 방식을 따라 하도록 만든 것에 가깝다. 예를 들어 특정 게임기나 오래된 컴퓨터 환경을 현대 컴퓨터에서 실행하는 Emulator(에뮬레이터)가 이에 해당한다.

Simulate(시뮬레이트)는 실제는 아니지만, 겉으로 보기에 실제와 비슷하게 보이거나 동작하도록 만드는 것이다. 원래 대상의 내부 구조를 완전히 복제한다기보다는, 외부에서 관찰되는 현상이나 동작을 비슷하게 재현하는 데 초점이 있다.

Virtual은 실제와 같은 효과를 제공하는 것, Emulate는 원래 대상을 흉내 내어 동작하게 만드는 것, Simulate는 실제처럼 보이는 상황이나 동작을 재현하는 것에 가깝다. 운영체제 수업에서 사용하는 가상 머신(Virtual Machine)은 이 중 Virtualization의 대표적인 예라고 볼 수 있다.

Additional Notes (추가 설명)

간단히 구분하면 Virtualization은 “실제로 있는 것처럼 사용하게 만드는 것”, Emulation은 “다른 시스템을 흉내 내는 것”, Simulation은 “현상이나 상황을 비슷하게 재현하는 것”이라고 이해하면 된다.

운영체제 실습에서는 Virtual Machine(가상 머신)을 통해 Unix나 Linux를 설치하기 때문에, 실제 컴퓨터를 망가뜨릴 걱정 없이 안전하게 명령어와 시스템 설정을 실습할 수 있게 된다.


History of Virtualization (가상화의 역사)

Background of Virtualization (가상화의 등장 배경)

가상화(Virtualization)는 갑자기 등장한 기술이 아니라, 1960년대부터 시작된 오래된 개념이다. 초기의 컴퓨터(Computer)는 지금처럼 개인이 쉽게 사용하는 장비가 아니었다. 가격이 매우 비쌌고, 크기도 컸으며, 전문 지식을 가진 사람만 다룰 수 있는 도구였다.

문제는 이렇게 비싼 컴퓨터를 한 번에 한 사람만 사용할 수 있었다는 점이다. 컴퓨터 자체의 비용뿐만 아니라, 컴퓨터를 관리할 전문가(Expert), 설치 공간(Space), 운영 비용도 필요했기 때문에 자원을 효율적으로 사용하는 방법이 중요해졌다.

Batch Processing (배치 처리)

초기에는 컴퓨터가 쉬는 시간을 줄이기 위해 Batch Processing(배치 처리) 방식이 등장했다. Batch Processing은 사람이 직접 하나씩 명령을 실행하는 것이 아니라, 여러 작업(Job)을 모아서 한 번에 컴퓨터에 전달하는 방식이다.

이 방식은 컴퓨터의 낭비되는 시간을 줄이는 데 도움이 되었다. 하지만 여전히 여러 사람이 동시에 컴퓨터를 사용하는 것은 어려웠다.

Time Sharing (시분할)

여러 사용자가 하나의 컴퓨터를 함께 사용하기 위해 등장한 개념이 Time Sharing(시분할)이다. Time Sharing은 컴퓨터의 사용 시간을 아주 짧은 단위로 나누어 여러 사용자에게 번갈아 제공하는 방식이다.

사용자 입장에서는 자신이 혼자 컴퓨터를 사용하는 것처럼 느끼지만, 실제로는 컴퓨터가 매우 빠르게 여러 사용자의 작업을 번갈아 처리하고 있는 것이다. 이를 통해 한 사용자의 작업이 끝날 때까지 다른 사용자가 기다릴 필요 없이, 여러 사람이 동시에 시스템을 공유할 수 있게 되었다.

Connection to Virtualization (가상화와의 연결)

가상화(Virtualization)는 이러한 자원 공유(Resource Sharing)의 필요성에서 발전한 개념이다. 실제 하드웨어(Hardware)는 하나이지만, 사용자나 시스템 입장에서는 여러 개의 독립된 환경을 사용하는 것처럼 보이게 만드는 것이다.

즉, 가상화의 핵심은 컴퓨터 자원을 더 효율적으로 사용하기 위한 것이다. 초기 컴퓨터의 비싼 비용과 제한된 사용 방식이 Batch Processing과 Time Sharing을 만들었고, 이러한 흐름이 이후 가상화 기술로 이어졌다고 볼 수 있다.

Additional Notes (추가 설명)

Batch Processing(배치 처리)은 “작업을 모아서 한 번에 처리하는 방식”이고, Time Sharing(시분할)은 “여러 사용자가 동시에 쓰는 것처럼 시간을 나눠 사용하는 방식”이다.

가상화(Virtualization)를 이해할 때는 “가짜 컴퓨터를 만든다”는 표현보다, “비싼 하드웨어 자원을 더 효율적으로 나누어 쓰기 위해 발전한 기술”이라고 이해하면 더 정확하다.


Evolution of Virtualization (가상화의 발전 과정)

1970s: Operating Systems and Virtual Resources (1970년대: 운영체제와 가상 자원)

1970년대에는 운영체제(Operating System)가 발전하면서 하나의 컴퓨터 안에서 여러 프로그램이 독립적으로 자원을 사용할 수 있게 되었다. 이때부터 운영체제에서 Virtual(가상)이라는 개념이 자주 등장한다.

대표적인 예가 Virtual Memory(가상 메모리)이다. 실제 RAM(Random Access Memory)은 하나이지만, 각 프로그램은 자신만의 독립적인 메모리 공간을 사용하는 것처럼 동작한다. 또한 VFS(Virtual File System)처럼 실제 파일 시스템의 차이를 숨기고, 프로그램이 통일된 방식으로 파일에 접근할 수 있게 해주는 구조도 가상화의 한 형태라고 볼 수 있다.

즉, 하나의 Mainframe Computer(메인프레임 컴퓨터)에서 여러 프로그램이 독립적으로 하드웨어 자원(Hardware Resource)을 사용하는 것처럼 만들어졌고, 이를 통해 여러 프로그램을 동시에 실행할 수 있게 되었다.

1980s: Personal Computers and Swap (1980년대: 개인용 컴퓨터와 스왑)

1980년대에는 Personal Computer(개인용 컴퓨터)가 대중화되기 시작했다. 이전에는 회사나 기관에서 주로 사용하던 컴퓨터가 점차 개인 가정에서도 사용되기 시작한 것이다.

이 시기에는 Virtual Memory(가상 메모리) 개념과 함께 Swap(스왑)이 중요해졌다. Swap은 RAM이 부족할 때 Storage(스토리지)의 일부 공간을 마치 메모리처럼 사용하는 방식이다. 예를 들어 RAM 용량이 작아서 더 이상 프로그램을 실행하기 어려운 상황에서, 디스크 공간을 임시 메모리처럼 활용해 하드웨어의 한계를 보완하려는 시도였다.

또한 당시에는 업무용 컴퓨터와 개인용 컴퓨터의 하드웨어 특성이 달랐기 때문에, 같은 프로그램이라도 환경에 맞게 따로 만들어야 하는 문제가 있었다. 서로 다른 컴퓨터 간에 데이터(Data)를 주고받는 것도 지금처럼 자연스럽지 않았기 때문에, 호환성(Compatibility)이 중요한 과제가 되었다.

1990s: Diverse Operating Systems and JVM (1990년대: 다양한 운영체제와 JVM)

1990년대에는 Windows, Macintosh, OS/2 등 다양한 Operating System(운영체제)이 등장했다. 운영체제와 하드웨어가 다양해지면서, 개발자는 각각의 환경에 맞게 프로그램을 작성하고 Compile(컴파일)해야 하는 어려움을 겪었다.

이 문제를 해결하는 데 중요한 역할을 한 것이 JVM(Java Virtual Machine)이다. JVM은 Java 프로그램이 특정 하드웨어나 운영체제에 직접 의존하지 않고 실행될 수 있도록 해주는 가상 실행 환경이다. 즉, JVM만 설치되어 있다면 같은 Java 프로그램을 여러 운영체제에서 실행할 수 있었다.

이 개념은 당시 매우 혁신적이었고, Java가 인기를 얻는 중요한 이유가 되었다. 또한 Android(안드로이드) 환경에도 가상 머신(Virtual Machine)의 개념이 사용된다.

이후 VMware와 같은 상용 Virtualization Software(가상화 소프트웨어)도 등장했다. 이를 통해 하나의 컴퓨터 안에서 여러 운영체제를 실행하는 환경이 점점 현실화되었다.

After the 2000s: Virtual Machines, Containers, and Cloud (2000년대 이후: 가상 머신, 컨테이너, 클라우드)

2000년대 이후에는 현재 우리가 사용하는 Virtual Machine(가상 머신) 개념이 본격적으로 정착되었다. 예전에는 Multi-booting(멀티 부팅)을 통해 하나의 컴퓨터에 여러 운영체제를 설치할 수는 있었지만, 한 번에 하나의 운영체제만 실행할 수 있었다.

예를 들어 Windows와 Linux를 같은 컴퓨터에 설치해도 동시에 사용할 수는 없었고, 부팅할 때 하나를 선택해야 했다. 또한 각 운영체제의 데이터가 따로 관리되기 때문에 공용으로 사용하려면 별도의 저장 방식이 필요했다.

하지만 Virtual Machine(가상 머신)을 사용하면 하나의 실제 컴퓨터 안에서 여러 운영체제를 동시에 실행할 수 있다. Windows를 사용하면서 Linux를 함께 실행하거나, 실습용 Unix/Linux 환경을 따로 구성하는 것이 가능해진 것이다.

이후 가상화 기술은 Container(컨테이너) 기술로도 발전했다. 컨테이너는 운영체제 전체를 가상화하기보다는, 애플리케이션(Application)이 실행되는 환경을 가볍게 분리하는 방식이다.

이러한 발전은 Cloud Computing(클라우드 컴퓨팅)이 대중화되는 중요한 기반이 되었다. 하나의 물리 서버(Physical Server)를 여러 사용자와 서비스가 나누어 사용할 수 있게 되었고, 필요한 만큼 서버 환경을 빠르게 만들고 관리할 수 있게 되었다.

Additional Notes (추가 설명)

Virtual Machine(가상 머신)Container(컨테이너)는 비슷해 보이지만 차이가 있다. 가상 머신은 운영체제 전체를 포함한 컴퓨터 환경을 가상화하고, 컨테이너는 애플리케이션 실행 환경을 가볍게 분리한다.

간단히 말하면, Virtual Machine은 “가짜 컴퓨터 한 대를 만드는 것”에 가깝고, Container는 “프로그램이 실행될 공간만 따로 분리하는 것”에 가깝다. 클라우드와 서버 개발에서는 두 개념 모두 매우 중요하게 사용된다.


Features, Advantages, and Disadvantages of Virtualization (가상화의 특징, 장점과 단점)

Advantages of Virtualization (가상화의 장점)

가상화(Virtualization)의 가장 큰 장점은 자원 사용률(Resource Utilization)을 높일 수 있다는 점이다. 하나의 물리 머신(Physical Machine)에서 여러 개의 가상 머신(Virtual Machine)을 실행할 수 있기 때문에, CPU, Memory, Storage 같은 하드웨어 자원을 쉬는 시간 없이 더 효율적으로 사용할 수 있다.

또한 비용 절감(Cost Reduction)이 가능하다. 예전에는 새로운 컴퓨터 환경이 필요할 때마다 하드웨어를 따로 준비하고, 디스크를 포맷한 뒤 운영체제(Operating System)와 필요한 프로그램을 설치해야 했다. 하지만 가상화 환경에서는 이미 만들어 둔 가상화 이미지(Virtualization Image)를 복제하면 거의 같은 환경을 빠르게 만들 수 있다.

이처럼 가상 머신을 소프트웨어적으로 빠르게 생성할 수 있다는 점은 매우 큰 장점이다. 물리적인 컴퓨터를 새로 구매하거나 설치하지 않아도 되기 때문에 개발 환경, 실습 환경, 테스트 환경을 빠르게 구성할 수 있다.

또 다른 장점은 장애 복구(Failure Recovery)가 쉬워졌다는 점이다. 가상 머신은 이미지나 스냅샷(Snapshot) 형태로 관리할 수 있기 때문에, 문제가 생겼을 때 이전 상태로 되돌리거나 같은 환경을 다시 만드는 과정이 상대적으로 간단하다. 물론 파일 자체가 손상된 경우에는 별도의 복구 과정이 필요하지만, 전체 시스템 환경을 복원하는 작업은 훨씬 쉬워졌다.

이러한 특징들이 모여 클라우드 컴퓨팅(Cloud Computing)을 가능하게 만든 기반이 되었다. 클라우드에서는 하나의 물리 서버(Physical Server)를 여러 가상 환경으로 나누어 사용자에게 제공할 수 있기 때문이다.


Disadvantages of Virtualization (가상화의 단점)

가상화에는 단점도 있다. 먼저 가상화 소프트웨어(Virtualization Software) 자체가 자원을 사용한다. 실제 하드웨어 위에 가상화 계층(Virtualization Layer)이 하나 더 추가되기 때문에, CPU나 Memory 같은 자원의 일부가 가상화 소프트웨어를 운영하는 데 사용된다.

또한 업무용 환경에서는 추가 비용(Cost)이 발생할 수 있다. 개인 사용자는 무료 가상화 프로그램을 사용할 수 있는 경우가 많지만, 기업 환경에서는 VMware 같은 상용 가상화 솔루션을 사용해야 할 수도 있고, 라이선스 비용이 발생할 수 있다.

마지막으로 가상화 환경을 운영하고 유지관리(Maintenance)하기 위한 전문 인력(Expert Staff)이 필요하다. 가상 머신을 만들고 관리하는 것 자체는 쉬워졌지만, 실제 기업 환경에서는 성능 관리, 장애 대응, 보안 설정, 백업 관리 등이 필요하기 때문에 전문적인 지식이 요구된다.

Additional Notes (추가 설명)

가상화의 핵심은 “하드웨어를 더 효율적으로 나누어 쓰는 것”이다. 그래서 서버, 클라우드, 개발 환경에서 매우 중요하게 사용된다.

단점으로는 성능 오버헤드(Overhead)가 있다. Overhead는 어떤 기능을 사용하기 위해 추가로 들어가는 자원이나 비용을 의미한다. 가상화에서는 가상화 소프트웨어가 중간에 들어가기 때문에 약간의 성능 손실이 생길 수 있다. 다만 현대 가상화 기술에서는 이 손실이 많이 줄어들었기 때문에, 장점이 단점보다 큰 경우가 많다.


Basic Terms in Virtualization (가상화 기본 용어)

Hypervisor / VMM (하이퍼바이저 / 가상 머신 모니터)

Hypervisor(하이퍼바이저) 또는 VMM(Virtual Machine Monitor)은 가상 머신(Virtual Machine)과 실제 하드웨어(Hardware) 사이에서 동작하는 프로그램이다.

가상 머신이 CPU, Memory, Storage 같은 하드웨어 자원을 사용할 수 있도록 관리하며, 가상 머신의 생성(Create), 삭제(Delete), 실행(Run), 중지(Stop) 같은 작업도 담당한다.

즉, Hypervisor는 여러 개의 가상 머신이 하나의 물리 컴퓨터 자원을 나누어 사용할 수 있게 해주는 핵심 소프트웨어이다.

Virtual Machine, VM (가상 머신)

Virtual Machine(VM, 가상 머신)은 실제 컴퓨터처럼 동작하는 가상의 컴퓨터 환경이다. 실제 하드웨어에 운영체제(Operating System)를 직접 설치한 컴퓨터와 구분하기 위해 VM이라는 용어를 사용한다.

VM은 하나의 물리 컴퓨터 자원을 공유해서 사용하지만, 각 VM은 서로 독립적으로 분리(Isolation)되어 있다. 따라서 일반적으로 한 VM에서 발생한 일이 다른 VM에 직접 영향을 주지 않는다.

각 VM은 별도의 운영체제를 설치하고, 사용자 계정도 따로 만들며, 네트워크에서도 별도의 MAC Address(MAC 주소)를 받을 수 있다. 그래서 사용자는 VM을 마치 독립된 컴퓨터처럼 사용할 수 있다.

물론 설정에 따라 Host와 Guest 사이에 파일 공유나 네트워크 연결을 만들 수 있지만, 기본 개념은 서로 분리된 독립적인 컴퓨터 환경이라고 이해하면 된다.

Host and Guest (호스트와 게스트)

Host(호스트)는 Hypervisor가 설치되어 있는 실제 물리 컴퓨터를 의미한다. 예를 들어 내 노트북에 VirtualBox나 VMware를 설치했다면, 그 노트북이 Host가 된다.

Guest(게스트)는 Hypervisor 위에서 실행되는 가상 컴퓨터이다. 즉, VirtualBox 안에 설치한 Linux나 Unix 같은 운영체제가 Guest Operating System(게스트 운영체제)에 해당한다.

Host와 Guest라는 용어를 따로 사용하는 이유는 두 환경의 역할이 다르기 때문이다. Host Operating System(호스트 운영체제)은 실제 컴퓨터에서 실행되는 운영체제이고, Guest Operating System(게스트 운영체제)은 가상 머신 안에서 실행되는 운영체제이다.

Full Virtualization (전가상화)

Full Virtualization(전가상화)은 하드웨어를 거의 완벽하게 흉내 내는 가상화 방식이다. Guest Operating System(게스트 운영체제)은 자신이 가상화 환경에서 실행되고 있다는 사실을 몰라도 된다.

즉, 운영체제를 수정하지 않고 그대로 설치해서 사용할 수 있다. 사용자는 실제 컴퓨터에 운영체제를 설치하는 것과 거의 같은 방식으로 VM에 운영체제를 설치할 수 있다.

이 방식은 사용하기 편하고 이상적인 방식이지만, 하드웨어를 완전히 흉내 내야 하기 때문에 성능 부담(Overhead)이 생길 수 있다.

Para-virtualization (반가상화)

Para-virtualization(반가상화)은 Guest Operating System이 자신이 가상화 환경에서 실행되고 있다는 사실을 알고 동작하는 방식이다.

이 방식에서는 Guest Operating System의 수정이 필요할 수 있다. 대신 Hypercall(하이퍼콜)을 사용하여 Hypervisor와 더 직접적으로 소통할 수 있기 때문에, 더 좋은 성능을 얻을 수 있다.

Full Virtualization이 “운영체제를 그대로 설치해서 쓰는 방식”이라면, Para-virtualization은 “가상화 환경에 맞게 운영체제가 협력하는 방식”이라고 이해할 수 있다.

Additional Notes (추가 설명)

Full Virtualization(전가상화)은 편리하지만 성능 부담이 있을 수 있고, Para-virtualization(반가상화)은 운영체제 수정이 필요할 수 있지만 성능 면에서 유리할 수 있다.

초보 단계에서는 이렇게 기억하면 된다.
Full Virtualization은 “그냥 일반 컴퓨터인 것처럼 속여서 실행하는 방식”이고, Para-virtualization은 “가상화 환경임을 알고 협력해서 실행하는 방식”이다.


QEMU Virtualization Environment (QEMU 가상화 환경)

What is QEMU? (QEMU란 무엇인가)

QEMU는 오픈소스(Open Source) 가상화 및 에뮬레이션 도구이다. QEMU는 하드웨어 전체를 가상으로 제공할 수 있으며, 이를 통해 실제 컴퓨터 안에서 또 다른 컴퓨터 환경을 실행할 수 있다.

QEMU는 단순히 운영체제(Operating System)를 실행하는 것뿐만 아니라, 특정 CPU나 하드웨어 환경을 흉내 내는 기능도 제공한다. 그래서 다른 CPU 구조에 맞게 컴파일된 프로그램이나 운영체제를 실행할 수 있다.

System Emulation (시스템 에뮬레이션)

System Emulation은 컴퓨터 전체를 가상으로 흉내 내는 방식이다. CPU, Memory, Disk, I/O Device 같은 하드웨어를 가상으로 제공해서, Guest Operating System(게스트 운영체제)이 실제 컴퓨터에 설치된 것처럼 동작하게 만든다.

예를 들어 QEMU가 특정 CPU 모델과 하드웨어 구성을 제공하면, 운영체제는 자신이 실제 그 하드웨어 위에서 실행되고 있다고 인식할 수 있다. 즉, QEMU는 운영체제가 필요로 하는 하드웨어 환경을 소프트웨어적으로 만들어주는 역할을 한다.

User Mode Emulation (유저 모드 에뮬레이션)

QEMU는 User Mode Emulation도 지원한다. 이는 운영체제 전체를 실행하는 것이 아니라, 특정 CPU에 맞게 컴파일된 프로그램을 다른 환경에서 실행할 수 있게 해주는 방식이다.

예를 들어 A라는 CPU용으로 만들어진 프로그램이 있다면, QEMU가 A CPU처럼 동작하는 환경을 제공해서 해당 프로그램이 실행될 수 있도록 도와준다. 이때 프로그램은 마치 원래 CPU에서 실행되는 것처럼 동작할 수 있다.

Example Commands (예시 명령어)

사진에 나온 명령어는 QEMU에서 가상 머신을 실행하거나 디스크 이미지를 만드는 예시이다.

qemu-system-x86_64 --machine pc --cpu max --smp 4 --m 2048

이 명령어는 x86_64 아키텍처용 가상 머신을 실행하는 명령어이다. --machine pc는 일반 PC 형태의 가상 머신을 사용한다는 의미이고, --cpu max는 가능한 CPU 기능을 최대한 사용하겠다는 의미이다. --smp 4는 CPU 코어를 4개 사용한다는 뜻이며, --m 2048은 메모리 2048MB, 즉 2GB를 할당한다는 의미이다.

qemu-img create -f raw img_disk 10G

이 명령어는 10GB 크기의 디스크 이미지(Disk Image)를 만드는 명령어이다. -f raw는 raw 형식의 이미지 파일을 만들겠다는 뜻이고, img_disk는 생성될 이미지 파일의 이름이다.

Additional Notes (추가 설명)

QEMU는 단독으로도 사용할 수 있지만, Linux 환경에서는 KVM(Kernel-based Virtual Machine)과 함께 사용하면 성능이 더 좋아질 수 있다. QEMU가 하드웨어를 가상으로 제공하고, KVM이 실제 CPU의 가상화 기능을 활용해 실행 속도를 높여주는 방식이다.

초보 단계에서는 QEMU를 “가상의 컴퓨터 하드웨어를 만들어주는 도구”라고 이해하면 충분하다.


KVM and Virtualization Tools (KVM과 가상화 도구)

KVM (Kernel-based Virtual Machine)

KVM(Kernel-based Virtual Machine)은 리눅스 커널(Linux Kernel)에 포함되어 있는 오픈소스(Open Source) 가상화 기술이다. KVM은 별도의 외부 프로그램처럼만 존재하는 것이 아니라, 리눅스 커널 소스 코드 안에 포함되어 함께 배포된다. 따라서 리눅스 커널 소스를 내려받으면 KVM 관련 소스도 함께 포함되어 있다고 볼 수 있다.

KVM은 Intel VT(Intel Virtualization Technology) 또는 AMD-V(AMD Virtualization) 같은 하드웨어 가상화 기능을 지원하는 x86 하드웨어에서 Full Virtualization(전가상화)을 제공한다. 즉, 게스트 운영체제(Guest Operating System)를 특별히 수정하지 않고도 가상 머신(Virtual Machine) 안에 설치해 사용할 수 있다.

KVM as a Kernel Module (커널 모듈로서의 KVM)

KVM은 리눅스의 커널 모듈(Kernel Module) 형태로 동작할 수 있다. 커널 모듈은 리눅스 커널에 필요한 기능을 추가로 붙여 사용하는 방식이다.

즉, KVM은 리눅스 커널 수준에서 CPU의 가상화 기능을 활용하여 가상 머신이 더 효율적으로 실행되도록 돕는다. 그래서 단순히 소프트웨어로 모든 하드웨어를 흉내 내는 방식보다 성능 면에서 유리하다.

virt-install (가상 머신 설치 도구)

사진에 나온 virt-install은 KVM 자체가 아니라, 가상 머신을 생성하고 설치할 때 사용하는 관리 도구이다. 이 도구를 사용하면 명령어로 가상 머신의 이름, CPU 개수, RAM 용량, 디스크 이미지, 설치 ISO, 네트워크 설정 등을 지정할 수 있다.

예시 명령어에서는 ubuntu24-vm이라는 이름의 가상 머신을 만들고, CPU 2개, RAM 4096MB, 디스크 20GB를 할당한다. 또한 Ubuntu 24.04 ISO 파일을 CD-ROM처럼 연결하여 운영체제를 설치할 수 있게 한다.

여기서 중요한 점은 실제 컴퓨터에 물리적인 CD-ROM이 없어도, ISO 이미지(ISO Image)를 가상 CD-ROM처럼 연결해서 운영체제를 설치할 수 있다는 것이다.

Additional Notes (추가 설명)

QEMU와 KVM은 함께 사용되는 경우가 많다. QEMU는 가상 하드웨어를 제공하고, KVM은 리눅스 커널의 가상화 기능을 이용해 실행 성능을 높여준다.

초보 단계에서는 KVM을 “리눅스 커널이 제공하는 빠른 가상화 기능”, virt-install을 “가상 머신을 만드는 명령어 도구”로 이해하면 충분하다.

KVM(Kernel-based Virtual Machine): 리눅스 커널에 포함된 오픈소스 가상화 기술

Linux Kernel(리눅스 커널): 리눅스 운영체제의 핵심 부분

Kernel Module(커널 모듈): 커널에 기능을 추가하기 위해 사용하는 모듈

Intel VT(Intel Virtualization Technology): 인텔 CPU에서 제공하는 하드웨어 가상화 기능

AMD-V(AMD Virtualization): AMD CPU에서 제공하는 하드웨어 가상화 기능

Full Virtualization(전가상화): 게스트 운영체제를 수정하지 않고 그대로 실행할 수 있는 가상화 방식

virt-install: 명령어로 가상 머신을 생성하고 운영체제를 설치하는 도구

ISO Image(ISO 이미지): CD/DVD 내용을 파일 하나로 만든 이미지 파일

Guest Operating System(게스트 운영체제): 가상 머신 안에 설치되어 실행되는 운영체제


Containers and Virtualization (컨테이너와 가상화)

What is a Container? (컨테이너란 무엇인가)

컨테이너(Container)는 말 그대로 하나의 “박스”처럼 생각할 수 있다. 프로그램을 실행하는 데 필요한 파일, 라이브러리(Library), 설정(Configuration), 실행 환경(Runtime Environment)을 하나로 묶어 패키징(Packaging)한 것이다.

가상 머신(Virtual Machine)은 보통 운영체제(Operating System) 전체를 포함해서 하나의 컴퓨터처럼 동작한다. 반면 컨테이너(Container)는 운영체제 전체를 새로 설치하기보다는, 응용 프로그램(Application)을 실행하는 데 필요한 최소한의 요소만 담는 방식으로 발전했다.

Minimal Environment (최소 실행 환경)

수업에서 리눅스(Linux)를 설치할 때 서버 버전(Server Version)을 minimal로 설치하면, 일반 설치보다 프로그램이 적게 설치된다. 이는 서버에서 굳이 필요하지 않은 그래픽 환경(GUI), 로그인 도구, 여러 응용 프로그램 등을 제외하고 꼭 필요한 기능만 남긴 것이다.

컨테이너(Container)도 이와 비슷한 방향으로 이해할 수 있다. 초기에는 컨테이너 안에 운영체제에 가까운 구성 요소가 많이 포함되기도 했지만, 최근에는 응용 프로그램(Application)과 실행에 필요한 라이브러리(Library), 도구(Tool)만 담는 가벼운 방식으로 많이 사용된다.

즉, 컨테이너는 “프로그램 실행에 필요한 것만 담은 작은 실행 상자”라고 볼 수 있다.

Difference Between VM and Container (가상 머신과 컨테이너의 차이)

가상 머신(Virtual Machine)은 운영체제 전체를 포함한 독립적인 컴퓨터 환경을 만든다. 그래서 VM 안에는 게스트 운영체제(Guest Operating System)가 설치되고, 그 위에서 프로그램이 실행된다.

반면 컨테이너(Container)는 보통 운영체제 전체를 포함하지 않고, 호스트 운영체제(Host Operating System)의 커널(Kernel)을 공유하면서 실행된다. 대신 각 컨테이너는 서로 분리(Isolation)되어 독립적으로 동작한다.

이 때문에 컨테이너는 가상 머신보다 용량이 작고, 실행 속도가 빠르며, 필요한 환경을 더 쉽게 배포할 수 있다.

Containers and Microservices (컨테이너와 마이크로서비스)

컨테이너(Container)는 마이크로서비스(Microservices) 구조에서도 많이 사용된다. 마이크로서비스는 하나의 큰 프로그램을 여러 개의 작은 서비스(Service)로 나누어 독립적으로 관리하는 방식이다.

예를 들어 하나의 컨테이너에는 웹 서버(Web Server)만 넣고, 다른 컨테이너에는 데이터베이스(Database)를 넣고, 또 다른 컨테이너에는 컴파일(Compile)이나 코드 관리 도구를 넣을 수 있다. 이렇게 각 기능을 작은 단위로 나누면 개발, 배포, 유지보수가 더 쉬워진다.

즉, 컨테이너는 각각 독립적으로 실행되는 작은 실행 환경이고, 마이크로서비스는 이런 작은 실행 환경들을 조합해 전체 프로그램을 구성하는 방식이라고 이해할 수 있다.

Additional Notes (추가 설명)

가상 머신(Virtual Machine)은 “컴퓨터 한 대를 통째로 가상으로 만드는 것”에 가깝고, 컨테이너(Container)는 “프로그램 실행에 필요한 환경만 가볍게 포장하는 것”에 가깝다.

그래서 운영체제 실습처럼 전체 OS 환경이 필요할 때는 가상 머신이 적합하고, 실제 서비스 배포나 개발 환경 분리에는 컨테이너가 많이 사용된다.


NetBSD and BSD Family Overview (NetBSD와 BSD 계열 운영체제 개요)

Origin of NetBSD’s Name (NetBSD 이름의 유래)

NetBSD는 BSD 계열에서 발전한 Unix-like Operating System(유닉스 계열 운영체제)이다. 쉽게 말하면, Unix의 영향을 받은 BSD를 기반으로 만들어진 무료 오픈소스 운영체제(Open Source Operating System)라고 이해할 수 있다.

NetBSD라는 이름에서 Net은 Internet(인터넷)과 관련이 있다. NetBSD 프로젝트는 인터넷을 통해 협업하고, 이메일과 네트워크 기반 버전 관리 시스템(Version Control System)을 사용해 운영체제를 개발한 초기 오픈소스 프로젝트 중 하나였다. 그래서 Internet이 프로젝트를 가능하게 한 중요한 기반이 되었고, 이를 반영해 이름에 Net이 들어가게 되었다.

BSD는 Berkeley Software Distribution의 약자로, Unix에서 파생된 운영체제 계열을 의미한다. 따라서 NetBSD라는 이름은 Internet을 기반으로 협업한 BSD 계열 운영체제라는 의미를 담고 있다.

NetBSD and Real-World Usage (NetBSD와 실제 활용)

NetBSD는 소프트웨어와 하드웨어 제품 개발에 활용될 수 있다. 강의에서는 예시로 Apple의 Darwin, Sony PlayStation, Apple AirPods 등이 언급되었다. 즉, BSD 계열 운영체제나 그 구조는 실제 상용 제품과 임베디드 장치(Embedded Device)에서도 사용될 수 있다.

여기서 중요한 점은 NetBSD가 단순히 학습용 운영체제가 아니라, 다양한 하드웨어 환경에서 동작할 수 있도록 설계된 운영체제라는 것이다.

NetBSD, FreeBSD, and OpenBSD

BSD 계열에는 대표적으로 NetBSD, FreeBSD, OpenBSD가 있다. 모두 Unix-like Operating System이지만, 중점적으로 추구하는 방향이 조금씩 다르다.

NetBSD는 Portability(이식성)Clean Code(깔끔한 코드)를 중요하게 여긴다. 다양한 하드웨어에서 동작할 수 있도록 설계되어 있으며, 임베디드 시스템(Embedded System)이나 특정 장치 환경에서 활용될 수 있다.

FreeBSD는 Performance(성능)Scalability(확장성)에 강점이 있다. 서버(Server) 환경에서 안정적으로 동작하는 데 초점이 있으며, 상용 서비스나 서버 운영 환경에 적합하다. 다만 실제 서버 운영에서는 Linux가 더 익숙하거나 편하다면 Linux를 사용해도 큰 문제는 없다.

OpenBSD는 Security(보안)Correctness(정확성)에 중점을 둔다. 보안성이 중요한 시스템, 예를 들어 Firewall(방화벽), IPS(Intrusion Prevention System, 침입 방지 시스템) 같은 보안 장비를 만들 때 활용될 수 있다. 직접 운영체제를 새로 개발하는 것은 어렵고 시간이 많이 들기 때문에, 이미 검증된 OpenBSD 같은 운영체제를 기반으로 사용할 수 있다.

Additional Notes (추가 설명)

BSD 계열과 Linux는 모두 Unix-like Operating System으로 분류되지만, 역사와 라이선스(License), 개발 방식에는 차이가 있다. 처음 학습할 때는 “Linux와 BSD는 명령어와 사용 방식이 비슷한 Unix 계열 운영체제”라고 이해하면 충분하다.

NetBSD, FreeBSD, OpenBSD를 간단히 구분하면 다음처럼 기억할 수 있다. NetBSD는 다양한 장치에서 동작하는 이식성 중심, FreeBSD는 서버 성능 중심, OpenBSD는 보안 중심이다.


Preparing to Install NetBSD on Linux (Linux에서 NetBSD 설치 준비)

Installation Environment (설치 환경)

이번 실습에서는 Linux(리눅스) 환경 안에서 Unix-like Operating System(유닉스 계열 운영체제)인 NetBSD를 설치하는 준비 과정을 다룬다. 굳이 Linux 안에서 NetBSD를 설치하는 이유는 이 과목이 Linux를 중심으로 진행되는 수업이기 때문이다.

현재 실습 구조를 보면, 실제 하드웨어(Hardware) 위에 Windows 운영체제가 있고, 그 위에 VirtualBox(버추얼박스)를 설치한 뒤 Linux를 실행하고 있다. 그리고 다시 그 Linux 안에서 QEMU를 이용해 NetBSD를 설치하려는 구조이다.

즉, NetBSD는 실제 물리 컴퓨터에 직접 설치되는 것이 아니라, QEMU가 제공하는 가상 하드웨어(Virtual Hardware) 위에서 실행된다. 엄밀히 말하면 Linux는 VirtualBox가 보여주는 가상 하드웨어를 사용하고, NetBSD는 Linux 안에서 QEMU가 보여주는 또 다른 가상 하드웨어를 사용하는 것이다.

Step 1: Install QEMU (1단계: QEMU 설치)

첫 번째 준비 단계는 QEMU를 설치하는 것이다. QEMU는 가상 하드웨어를 제공해주는 오픈소스(Open Source) 가상화 및 에뮬레이션 도구이다.

Linux에서 QEMU를 설치하기 위해 다음 명령어를 사용할 수 있다.

여기서 sudo는 관리자 권한으로 명령어를 실행한다는 의미이고, apt install은 Ubuntu 계열 Linux에서 패키지를 설치할 때 사용하는 명령어이다. qemu-system은 시스템 전체를 에뮬레이션하거나 가상 머신을 실행하는 데 필요한 QEMU 패키지이다.

Step 2: Download NetBSD Image (2단계: NetBSD 이미지 다운로드)

두 번째 단계는 NetBSD 설치 이미지(Image)를 다운로드하는 것이다. NetBSD 공식 웹사이트에 접속해서 자신의 가상 하드웨어 환경에 맞는 이미지를 선택해 다운로드한다.

NetBSD는 다양한 하드웨어에서 동작하는 것을 목표로 하는 운영체제이기 때문에, 다운로드할 때 어떤 CPU 아키텍처(Architecture)나 시스템용 이미지를 받을지 선택해야 한다. 일반적인 PC 환경이라면 x86 또는 amd64 계열 이미지를 선택하는 경우가 많다.

다운로드한 NetBSD 이미지 파일은 이후 QEMU에서 가상 CD-ROM이나 설치 디스크처럼 사용된다. 즉, 실제 CD나 USB 없이도 이미지 파일을 이용해 운영체제를 설치할 수 있다.

Additional Notes (추가 설명)

이번 실습 구조는 “가상 머신 안에서 또 다른 가상 머신을 실행하는 구조”에 가깝다. 그래서 실제 컴퓨터에 직접 설치하는 것보다 성능이 느릴 수 있다.

하지만 실습 목적에서는 안전하게 여러 운영체제를 설치하고 삭제해볼 수 있다는 장점이 있다. 운영체제 설치 실습에서는 실제 컴퓨터를 건드리지 않고 가상 환경에서 연습하는 것이 훨씬 안전하다.


Creating and Running a NetBSD Virtual Machine with QEMU (QEMU로 NetBSD 가상 머신 생성 및 실행)

Creating a Virtual Disk Image (가상 디스크 이미지 만들기)

이제 NetBSD를 설치하기 위한 실제 단계로 들어간다. 운영체제(Operating System)를 설치하려면 CPU, RAM, Disk 같은 하드웨어 자원이 필요하다. QEMU에서는 실제 하드디스크 대신 디스크 이미지(Disk Image) 파일을 만들어 가상 하드디스크처럼 사용한다.

예시 명령어는 다음과 같다.

qemu-img create -f qcow2 netbsd.qcow2 4G

이 명령어는 netbsd.qcow2라는 이름의 4GB짜리 가상 디스크를 만든다. 여기서 qcow2는 QEMU에서 자주 사용하는 디스크 이미지 형식이다. 지금 단계에서는 qcow2의 내부 구조까지 자세히 알 필요는 없고, “가상 머신이 사용할 하드디스크 파일”이라고 이해하면 충분하다.

Running the QEMU Virtual Machine (QEMU 가상 머신 실행하기)

디스크 이미지를 만들었다면, 다음 단계는 QEMU로 가상 머신(Virtual Machine)을 실행하는 것이다.

예시 명령어는 다음과 같다.

qemu-system-x86_64 -m 512m -smp 1 -drive file=netbsd.qcow2,format=qcow2 \
-cdrom NetBSD-10.1-amd64.iso -boot d -net nic,model=virtio -net user

이 명령어는 x86_64 구조의 가상 머신을 실행하고, RAM은 512MB, CPU는 1개로 설정한다. -drive 옵션은 앞에서 만든 netbsd.qcow2 디스크 이미지를 가상 하드디스크로 연결하는 부분이다.

-cdrom NetBSD-10.1-amd64.iso는 다운로드한 NetBSD ISO 이미지를 가상 CD-ROM처럼 연결하는 옵션이다. 실제 CD-ROM을 사용하지 않더라도, ISO 파일을 CD처럼 인식시켜 운영체제를 설치할 수 있다.

-boot d는 CD-ROM에서 먼저 부팅하겠다는 의미이다. 즉, NetBSD 설치 ISO로 부팅해서 가상 디스크에 NetBSD를 설치하는 흐름이다.

GUI Display Issue and SSH X Forwarding (GUI 화면 문제와 SSH X 포워딩)

QEMU를 실행했을 때 gtk initialization failed 같은 메시지가 보일 수 있다. 이는 QEMU가 그래픽 화면(GUI, Graphical User Interface)을 띄우려고 했지만, 현재 환경에서 그래픽 화면을 표시할 수 없을 때 발생할 수 있다.

SSH 접속은 기본적으로 텍스트 기반 CLI(Command Line Interface) 접속이다. 하지만 QEMU처럼 그래픽 창을 띄워야 하는 프로그램은 화면 정보를 내 컴퓨터로 전달해야 한다. 이때 사용하는 것이 X Forwarding(X 포워딩)이다.

원격 Linux에 SSH로 접속해서 QEMU 그래픽 화면을 띄우려면 ssh -Y 또는 ssh -X 옵션을 사용할 수 있다. Windows에서 접속하는 경우에는 Xming 같은 X Server(X 서버)가 필요하고, macOS에서는 XQuartz를 사용할 수 있다.

X Server는 원격에서 전달된 그래픽 화면 정보를 내 컴퓨터에서 표시해주는 역할을 한다. 즉, SSH로 접속한 원격 서버에서 실행한 GUI 프로그램을 내 컴퓨터 화면에 띄울 수 있게 해준다.

Additional Notes (추가 설명)

지금 단계에서 중요한 것은 명령어 옵션을 모두 외우는 것이 아니라, QEMU가 “가상의 컴퓨터”를 만들기 위해 CPU, RAM, Disk, CD-ROM 같은 요소를 옵션으로 지정한다는 흐름을 이해하는 것이다.

간단히 정리하면 qemu-img는 가상 디스크를 만드는 명령어이고, qemu-system-x86_64는 실제로 가상 머신을 실행하는 명령어이다.


NetBSD Installation Steps: Boot and Disk Setup

Starting the NetBSD Installer (NetBSD 설치 프로그램 시작)

앞에서 만든 QEMU 가상 머신(QEMU Virtual Machine) 실행 명령어를 입력하면 NetBSD 설치 화면이 나타난다. 처음 부팅 화면에서는 1. Boot normally를 선택하면 된다. 이는 특별한 복구 모드나 옵션 없이 일반적인 방식으로 NetBSD 설치 환경을 시작한다는 의미이다.

부팅 후 파란색 설치 화면이 나타나면 언어 선택 화면에서 Installation messages in English를 선택한다. 한국어는 선택지에 없는데, 이는 NetBSD 사용자가 상대적으로 많지 않고 한국어 번역 지원이 제공되지 않기 때문이라고 이해할 수 있다.

그 다음 Keyboard Type(키보드 종류) 선택 화면에서는 특별히 바꿀 필요가 없다면 unchanged를 선택한다. 만약 본인이 사용하는 키보드 배열이 다르다면 해당하는 옵션을 선택하면 된다.

Choosing Installation to Hard Disk (하드디스크 설치 선택)

다음으로 NetBSD-10.1 Install System 화면이 나오면 NetBSD를 하드디스크(Hard Disk)에 설치하는 옵션을 선택한다. 여기서 말하는 하드디스크는 실제 컴퓨터의 물리 디스크가 아니라, 앞에서 만든 netbsd.qcow2 가상 디스크 이미지(Disk Image)를 의미한다.

QEMU에서는 이 이미지 파일을 가상 하드디스크처럼 보여주기 때문에, NetBSD 설치 프로그램은 마치 실제 디스크에 운영체제를 설치하는 것처럼 인식한다.

Partition Concept (파티션 개념)

설치 과정에서 디스크를 변경해도 되는지 묻는 화면이 나온다. 운영체제를 설치하려면 디스크에 파일 시스템(File System)을 만들고, 필요한 영역을 나누는 작업이 필요하기 때문이다.

디스크(Disk)는 하나의 저장 공간이지만, 필요에 따라 여러 구역으로 나누어 사용할 수 있다. 이 구역을 Partition(파티션)이라고 한다. 예전에는 디스크 전체를 하나의 운영체제가 모두 사용하는 경우가 많았지만, 저장 장치의 용량이 커지면서 하나의 디스크를 여러 용도로 나누어 사용하는 방식이 중요해졌다.

예를 들어 하나의 디스크 안에서 일부는 NetBSD, 일부는 Linux, 일부는 Windows용으로 나누어 사용할 수 있다. 이렇게 나누어진 각각의 영역이 파티션이다.

Boot Sector and GPT (부트 섹터와 GPT)

운영체제를 설치할 때는 단순히 파일만 복사하는 것이 아니라, 컴퓨터가 어디에서 부팅해야 하는지도 정해야 한다. 이와 관련된 개념이 Boot Sector(부트 섹터)와 Partition Table(파티션 테이블)이다.

이번 설치에서는 디스크 크기를 앞에서 만든 그대로 4GB로 사용한다. 이후 파티션 방식으로는 기본값인 GPT(Guid Partition Table)를 선택한다. GPT는 현대적인 파티션 테이블 방식으로, UEFI 환경에서 많이 사용된다.

지금 단계에서는 GPT의 세부 구조를 모두 이해할 필요는 없고, “디스크를 어떻게 나누고 부팅 정보를 어떻게 관리할지 정하는 방식”이라고 이해하면 충분하다.

Additional Notes (추가 설명)

이번 실습에서 디스크를 변경한다고 해도 실제 Windows나 Linux 디스크가 바뀌는 것은 아니다. QEMU 안에서 사용하는 netbsd.qcow2 파일만 가상 하드디스크로 사용되기 때문에 비교적 안전하게 실습할 수 있다.

다만 설치 과정에서는 항상 “내가 지금 실제 디스크를 건드리는지, 가상 디스크를 건드리는지”를 구분하는 습관이 중요하다. 실제 운영체제 설치에서는 이 부분을 잘못 선택하면 기존 데이터가 삭제될 수 있기 때문이다.


NetBSD Disk Partitioning and Swap

Disk Geometry and Partition Setup (디스크 구조와 파티션 설정)

NetBSD 설치 과정에서 디스크 크기를 4GB로 설정한 뒤에는 This is the correct geometry를 선택하면 된다. 여기서 말하는 geometry는 디스크 구조를 의미하는데, 이번 실습에서는 QEMU에서 만든 가상 디스크(Disk Image)를 사용하므로 기본값을 그대로 사용하면 된다.

그다음에는 NetBSD에 맞게 디스크 파티션(Partition)을 설정하는 단계가 나온다. 실제 하드디스크라면 기존 파티션을 삭제하거나, 직접 크기를 조정하거나, 다른 운영체제와 나누어 사용하는 등 여러 선택지가 있을 수 있다. 하지만 이번 실습에서는 새로 만든 4GB 가상 디스크를 사용하므로 자동 설정 옵션인 Set sizes of NetBSD partitions를 선택하면 된다.

파티션(Partition)이란 하나의 디스크(Disk)를 여러 구역으로 나누어 사용하는 것이다. 예를 들어 하나의 디스크 안에 일부는 NetBSD, 일부는 Linux, 일부는 Windows용으로 나누어 사용할 수 있다. 운영체제를 설치할 때는 어느 영역에 시스템을 설치할지, 부팅 정보는 어디에 둘지 등을 정해야 한다.

Swap Partition (스왑 파티션)

파티션 설정 화면을 보면 Swap(스왑)이라는 항목이 보인다. Swap은 RAM(Random Access Memory)이 부족할 때 디스크(Storage)의 일부 공간을 임시 메모리처럼 사용하는 기능이다.

예를 들어 가상 머신에 RAM을 512MB로 설정했는데 여러 프로그램이 실행되면서 메모리가 부족해질 수 있다. 이때 당장 자주 사용하지 않는 메모리 내용을 디스크의 Swap 영역으로 옮기고, RAM 공간을 비워 다른 작업을 계속할 수 있게 한다.

물론 디스크는 RAM보다 훨씬 느리기 때문에 Swap을 사용하면 성능은 느려질 수 있다. 하지만 메모리가 부족해서 프로그램을 아예 실행하지 못하는 것보다는, 느리더라도 디스크를 보조 메모리처럼 사용하는 것이 더 나은 선택이 될 수 있다.

Swap and Modern Systems (스왑과 현대 시스템)

과거에는 RAM 용량이 작았기 때문에 Swap이 매우 중요했다. 예를 들어 32비트(32-bit) 시스템에서는 주소 지정(Addressing)의 한계 때문에 사용할 수 있는 메모리에 제한이 있었다. 그래서 부족한 메모리를 보완하기 위해 Swap을 자주 사용했다.

하지만 현재는 64비트(64-bit) 시스템이 일반적이고, 컴퓨터에 장착되는 RAM 용량도 매우 커졌다. 그래서 일반적인 데스크톱 환경에서는 예전만큼 Swap을 적극적으로 사용하지 않는 경우도 있다. 그럼에도 서버나 가상 머신 환경에서는 메모리 부족 상황을 대비해 Swap 영역을 설정하는 것이 여전히 의미가 있다.

Additional Notes (추가 설명)

이번 실습에서는 실제 디스크가 아니라 QEMU의 가상 디스크를 사용한다. 따라서 파티션을 설정하거나 포맷해도 실제 Windows나 Linux 디스크가 변경되는 것은 아니다.

Swap은 “RAM을 늘려주는 마법 같은 기능”이라기보다는, RAM이 부족할 때 디스크를 임시 대기 공간으로 사용하는 기능이다. 그래서 시스템 안정성에는 도움이 되지만, 성능 자체는 RAM보다 느리다는 점을 함께 기억하면 좋다.


NetBSD Installation Configuration

Partition Size Check (파티션 크기 확인)

NetBSD 설치 과정에서 디스크 설정을 진행하면 free space 2131 MB와 같은 문구가 보일 수 있다. 이는 해당 공간이 아직 사용되지 않은 빈 공간(Free Space)으로 남아 있다는 의미이다. 이번 실습에서는 특별히 수정하지 않고 그대로 진행하면 된다.

이후 파티션 크기(Partition Size)를 확인하는 화면에서 a: 3583, b: 512와 같은 값이 보인다. 여기서 a는 NetBSD가 설치될 주요 파일 시스템(File System) 영역이고, b는 스왑(Swap) 영역으로 이해할 수 있다.

설정이 괜찮다면 Partition sizes ok를 선택하고, 이어서 Shall we continue? 질문에는 Yes를 선택한다.

Console and Installation Type (콘솔과 설치 방식 선택)

다음 단계에서는 콘솔(Console)을 선택한다. 여기서는 Use BIOS console을 선택하면 된다. 이는 설치 화면을 어떤 방식으로 표시할지 정하는 부분이다.

그다음 Select your distribution 화면에서는 Full installation을 선택한다. 처음 설치하는 단계에서는 굳이 구성 요소를 제외할 필요가 없기 때문에 전체 설치를 선택하는 것이 좋다. 필요에 따라 가벼운 설치를 원한다면 minimal 설치를 선택할 수도 있다.

Installation Source (설치 소스 선택)

설치 파일을 어디에서 가져올지 선택하는 화면에서는 CD-ROM / DVD / install image media를 선택한다. 앞에서 QEMU 실행 명령어를 통해 NetBSD ISO Image(ISO 이미지)를 가상 CD-ROM(Virtual CD-ROM)으로 연결했기 때문이다.

만약 네트워크를 통해 설치하려면 HTTP, FTP, NFS 같은 옵션을 사용할 수도 있다. 하지만 이번 실습에서는 이미 다운로드한 ISO 이미지를 사용하므로 CD-ROM 방식으로 진행한다.

Password and Device Setup (비밀번호와 장치 설정)

설치가 진행된 뒤 Hit enter to continue 메시지가 나오면 Enter를 눌러 다음 단계로 넘어간다.

이후 Root Password(루트 비밀번호)를 설정하는 화면이 나온다. 루트 계정(root account)은 시스템 관리자 권한을 가진 계정이므로, 설치 후 관리 작업에 사용된다.

그 다음 USB 장치 등을 지금 테스트할 것인지 묻는 화면이 나오면 Not now, continue!를 선택한다. 이는 지금 바로 외부 장치를 연결해 확인하지 않고, 다음 단계로 넘어가겠다는 의미이다.

Final Configuration and SSHD (최종 설정과 SSHD)

마지막으로 지금까지 선택한 설정을 확인하는 화면이 나온다. 여기서 파티션 설정, 설치할 프로그램, 시스템 설정 등을 확인할 수 있다.

이 상태로 설치를 마치려면 Finished configuring을 선택하면 된다.

다만 원격 접속(Remote Access)을 사용하려면 Enable sshd 항목을 Yes로 바꾸는 것이 좋다. sshd는 SSH 서버 데몬(SSH Server Daemon)으로, 외부에서 SSH(Secure Shell)를 통해 NetBSD에 접속할 수 있게 해준다.

키보드의 방향키와 Spacebar(스페이스바)를 이용해 항목을 이동하고, Enter를 눌러 Yes/No 값을 바꿀 수 있다. Enable sshdYes로 설정한 뒤 Finished configuring을 선택하면 기본 설정이 완료된다.

이번 단계에서는 NetBSD 설치를 위한 파티션 크기를 확인하고, BIOS Console을 사용하도록 설정한 뒤, Full installation을 선택한다. 설치 소스는 앞에서 연결한 ISO 이미지를 사용하므로 CD-ROM/DVD/install image media를 선택한다.

이후 루트 비밀번호를 설정하고, 최종 설정 화면에서 필요하다면 Enable sshdYes로 변경한다. SSHD를 활성화하면 설치 후 원격에서 NetBSD 시스템에 접속할 수 있게 된다.

Additional Notes (추가 설명)

이번 실습에서는 가상 디스크를 사용하므로 파티션 설정을 기본값으로 진행해도 큰 문제가 없다. 실제 컴퓨터에 운영체제를 설치할 때는 기존 데이터가 삭제될 수 있으므로 파티션 선택을 훨씬 더 신중하게 해야 한다.

sshd는 서버 실습에서 매우 중요하다. GUI 없이 CLI 환경으로 서버를 관리할 때는 SSH를 통해 원격 접속하는 경우가 많기 때문이다.


Finishing NetBSD Installation and Exiting QEMU

Reboot After Installation (설치 후 재부팅)

NetBSD 설치 설정이 끝나면 다시 NetBSD-10.1 Install System 화면이 나타난다. 이때는 다시 설치를 반복하는 것이 아니라, Install NetBSD to hard disk가 아닌 Reboot the computer를 선택한다.

하지만 재부팅을 해도 다시 Installation messages in English 화면으로 돌아오고, 다시 설치 메뉴가 나타날 수 있다. 이는 설치가 실패했다는 뜻이라기보다는, QEMU가 여전히 NetBSD 설치 ISO Image(설치 이미지)로 부팅하고 있기 때문이다.

즉, 가상 머신(Virtual Machine)이 하드디스크가 아니라 CD-ROM ISO에서 다시 부팅하고 있어서 설치 화면이 반복되는 것이다.

Why the Installer Appears Again (설치 화면이 다시 나오는 이유)

앞에서 QEMU를 실행할 때 -cdrom NetBSD-10.1-amd64.iso 옵션을 사용했다. 이 옵션은 ISO 파일을 가상 CD-ROM(Virtual CD-ROM)처럼 연결한다는 뜻이다. 또한 -boot d 옵션을 사용하면 CD-ROM에서 먼저 부팅하게 된다.

그래서 NetBSD가 가상 디스크(Disk Image)에 설치되었더라도, QEMU를 같은 명령어로 다시 실행하면 계속 설치 ISO로 부팅될 수 있다. 이 때문에 설치 화면이 도돌이표처럼 반복되는 것이다.

How to Exit QEMU (QEMU 종료 방법)

이 상황에서 Windows 컴퓨터나 VirtualBox 전체를 끌 필요는 없다. QEMU는 Linux 터미널에서 실행 중인 하나의 프로세스(Process)이기 때문이다.

처음에 qemu-system-x86_64 ... 명령어를 실행했을 때, QEMU가 하나의 프로그램으로 실행되었다. 우리가 보는 파란 설치 화면은 실제 컴퓨터가 아니라, QEMU 프로세스가 보여주는 가상 머신 화면이다.

따라서 설치가 끝난 뒤 QEMU를 종료하려면 Linux 터미널에서 Ctrl + C를 누르면 된다. 그러면 실행 중이던 QEMU 프로세스가 종료되고, 가상 머신 화면도 사라진다.

After Exiting QEMU (QEMU 종료 후)

QEMU를 종료했다고 해서 설치한 NetBSD가 사라지는 것은 아니다. NetBSD는 앞에서 만든 netbsd.qcow2 디스크 이미지(Disk Image)에 설치되어 있다.

다음에 NetBSD를 실행할 때는 설치 ISO로 다시 부팅하지 않도록 해야 한다. 즉, CD-ROM 설치 이미지로 부팅하는 것이 아니라, 설치가 완료된 가상 하드디스크(Virtual Hard Disk)에서 부팅해야 한다.

Additional Notes (추가 설명)

설치가 끝난 뒤 다시 설치 화면이 나오는 가장 흔한 이유는 Boot Order(부팅 순서)가 여전히 CD-ROM을 먼저 보도록 되어 있기 때문이다.

간단히 말하면, 설치할 때는 ISO에서 부팅하고, 설치가 끝난 뒤에는 가상 디스크에서 부팅해야 한다.


Booting NetBSD from the Installed Disk

Running QEMU Without CD-ROM (CD-ROM 제거 후 QEMU 실행)

NetBSD 설치가 끝난 뒤에는 다시 Linux Terminal(리눅스 터미널)로 돌아온다. 이때 이전 설치 명령어와 달리 -cdrom 옵션이 빠진 명령어를 사용한다.

qemu-system-x86_64 -m 512m -smp 1 -drive file=netbsd.qcow2,format=qcow2 \
-net nic,model=virtio -net user

이 명령어는 이미 설치가 완료된 netbsd.qcow2 디스크 이미지(Disk Image)에서 NetBSD를 부팅하라는 의미이다. 설치할 때는 ISO Image(ISO 이미지)를 CD-ROM처럼 연결했지만, 이제는 운영체제가 디스크에 설치되어 있으므로 CD-ROM이 필요하지 않다.

여기서 -m 512m은 RAM을 512MB로 설정한다는 뜻이고, -smp 1은 CPU를 1개 사용한다는 뜻이다. -drive 옵션은 NetBSD가 설치된 가상 하드디스크(Virtual Hard Disk)를 연결하는 부분이다.

Logging into NetBSD (NetBSD 로그인)

QEMU를 실행하면 NetBSD 부팅 화면이 나타난다. 처음 메뉴에서는 1. Boot normally를 선택하면 된다. 이후 부팅 메시지가 화면에 출력되고, 마지막에 커서가 깜빡이는 로그인 화면이 나타난다.

이때 설치 과정에서 설정한 비밀번호를 입력하면 로그인할 수 있다. 로그인 후 프롬프트(Prompt)에 #가 보이면 Root User(루트 사용자)로 로그인한 상태이고, $가 보이면 일반 사용자(Regular User)로 로그인한 상태이다.

Root User는 시스템 관리자 권한을 가진 계정이므로, 시스템 설정이나 프로그램 설치 같은 작업을 수행할 수 있다.

Starting X Window (X Window 실행)

NetBSD에 로그인한 뒤 그래픽 환경을 실행하고 싶다면 프롬프트에서 다음 명령어를 입력한다.

startx

startx는 X Window System(X 윈도우 시스템)을 시작하는 명령어이다. X Window System은 Unix/Linux 계열 운영체제에서 GUI(Graphical User Interface)를 제공하는 기본적인 그래픽 시스템이다.

즉, 터미널 기반 CLI(Command Line Interface) 환경에서 그래픽 화면을 실행하고 싶을 때 startx를 사용할 수 있다.

Nested Virtualization Environment (중첩된 가상화 환경)

이번 실습 환경은 실제 컴퓨터 위에 Windows가 있고, 그 위에서 VirtualBox가 Linux를 실행하며, 다시 Linux 안에서 QEMU가 NetBSD를 실행하는 구조이다. 즉, 여러 단계로 가상화가 겹쳐 있는 Nested Virtualization(중첩 가상화) 환경이라고 볼 수 있다.

이런 구조에서도 NetBSD는 비교적 작은 용량으로 설치되고 실행된다. 실습에서는 RAM 512MB, 디스크 4GB 정도로도 기본적인 운영이 가능하다. 이를 통해 운영체제 자체는 생각보다 적은 하드웨어 자원으로도 동작할 수 있다는 점을 알 수 있다.

반대로 고성능 게임기나 그래픽 중심 장치에서는 운영체제보다 그래픽 처리 장치(Graphics Processing Unit, GPU)의 역할이 더 중요할 수 있다. 운영체제는 기본적인 시스템 관리를 담당하고, 화려한 그래픽 처리는 주로 그래픽 하드웨어의 지원을 받는다.

Summary (정리)

NetBSD 설치 후에는 더 이상 ISO 이미지로 부팅하지 않고, netbsd.qcow2 가상 디스크에서 직접 부팅한다. 이를 위해 QEMU 실행 명령어에서 -cdrom 옵션을 제거한다.

부팅 후 Boot normally를 선택하고 로그인하면 NetBSD를 사용할 수 있다. 프롬프트가 #이면 루트 사용자, $이면 일반 사용자이다. 그래픽 환경이 필요하면 startx 명령어로 X Window System을 실행할 수 있다.

Additional Notes (추가 설명)

설치할 때는 ISO 이미지에서 부팅하고, 설치가 끝난 뒤에는 가상 디스크에서 부팅해야 한다. 그래서 설치 후 실행 명령어에서는 -cdrom-boot d 옵션을 제거하는 것이 중요하다.

# 프롬프트는 강력한 관리자 권한을 의미하므로 명령어를 입력할 때 주의해야 한다. 시스템 파일을 수정하거나 삭제할 수 있기 때문이다.

실습 결과

설치 후 ISO 이미지 없이 netbsd.qcow2 가상 디스크에서 부팅하였고, root 계정으로 로그인하여 NetBSD가 정상적으로 실행되는 것을 확인하였다. Minimal installation으로 설치했기 때문에 X Window 실행은 진행하지 않았다

More from this blog

Software Testing End-of-Semester Review Notes: Quality, V-Model, Test Process, Test Techniques, and AI Testing

Software Testing Course Review 이번 강의는 새로운 소프트웨어 테스트(Software Testing) 내용을 배우는 시간이 아니라, 한 학기 동안 학습한 핵심 내용을 키워드 중심으로 정리하고 점검하는 시간이다. 지난 시간에는 AI 소프트웨어 테스트(AI Software Testing)의 정의와 필요성을 살펴보았다. 특히 일반 소프트웨

Jun 9, 202628 min read
Software Testing End-of-Semester Review Notes: Quality, V-Model, Test Process, Test Techniques, and AI Testing

Operating System File Management: Directory, Inode, Block, and File Descriptors

파일 시스템(File System)이 필요한 이유 첫 번째 질문이 있다. 컴퓨터에 파일을 저장하는 상황을 떠올려보자. 과제 파일, 사진, 동영상처럼 다양한 파일을 계속 저장하다 보면 파일의 수가 많아질수록 어떤 문제가 발생할까? 파일의 수가 많아지면 필요한 파일을 찾는 데 오랜 시간이 걸릴 수 있다. 또한 파일이 어디에 저장되어 있는지 헷갈릴 수도 있다

May 31, 202649 min read
Operating System File Management: Directory, Inode, Block, and File Descriptors

My dev journey

149 posts