변경점 비교

가상 머신으로 안드로이드 운영체제 실행하기

변경후: 2025. 10. 21. 13:05:27 (luasenvy (luasenvy))

## 개요

지난번 작성한  [가상 머신을 활용하여 서브 시스템 구성하기](/p?id=%EA%B0%80%EC%83%81-%EB%A8%B8%EC%8B%A0%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EC%84%9C%EB%B8%8C-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0)에 이어서 이번에는 안드로이드를 설치하여 구성해보자. `qemu-system` 패키지 설치와 `qcow2 디스크 만들기`같은 기본적인 작동방법은 이전 포스트를 통하여 확인할 수 있으니 올바른 안드로이드 설치파일과 설치방법 그리고 구동 방법만 알면 쉽게 사용할 수 있다.

## 안드로이드 설치 이미지

안드로이드 설치 이미지는 [android-x86](https://sourceforge.net/projects/android-x86/files/) 프로젝트에서 확인할 수 있다. 가장 최신버전인 `android-x86_64-9.0-r2.iso`를 다운받으면 된다. 소스포지는 생소하고 광고 범벅인 사이트라 거부감이 들 수 있는데 Github 이전에 오픈소스를 공유하던 저장소 사이트이니 너무 걱정할 필요는 없다.

## 안드로이드 설치

```bash:CLI
qemu-img create -f qcow2 android.qcow2 16G
qemu-system-x86_64 
  -m 4096 
  -smp 4 
  -accel kvm 
  -boot d 
  -cdrom "$HOME/.config/qemu/android/android-x86_64-9.0-r2.iso" 
  -hda android.qcow2 
  -net nic,model=virtio-net-pci 
  -net user 
  -vga virtio 
  -display sdl,gl=on
```

완료했으면 qemu 실행 명령을 통해서 설치를 진행하면 된다. 디스크로 사용할 qcow2를 만들고 다운로드 받은 iso 이미지를 통해 부팅을 진행한다. 옵션들에 대한 자세한 설명은 이전 포스트를 참고하면 된다.

![Installation height-350](/api/image/2025/10/21/9/c587cc65cfa3c7bae6164fa601a30470-o)

부팅에 성공하면 이런 화면이 표시된다. 세번째 메뉴 `Installation - Install Android-x86 to harddisk`를 선택하여 진입한다.

![Partition height-300](/api/image/2025/10/21/10/16ad4af637cb5143ca41aa6ef46bb58c-o)

이후 진행은 일반적인 운영체제 설치 진행과 비슷하다. 파티션을 나누고 포맷을 설정하고 나면 자동으로 설치가 완료된다. qcow2로 파일만 준비해둔 것이므로 우리는 `Create/Modify partitions` 메뉴를 선택하면 된다.

![GPT height-150](/api/image/2025/10/21/9/316bbefc6ced8d1208945662cd5eab21-o)

GPT 디스크 유형을 말한다. 자신의 환경에 맞게 선택하면 되지만 이후에 부팅 이슈를 해결하기 위하여 GRUB 설치가 필요하다. 여기서 설치되는 레거시 GRUB은 GPT 디스크에 설치할 수 없기 때문에 `< No >`를 선택하여 MBR 방식의 디스크로 만들어지도록 하면 된다.

| cgdisk | primary | sizes |
|:------:|:------:|:-------:|
|![cgdisk height-300](/api/image/2025/10/21/10/7829b44bd4b5f5741e6d790b3ef7fc3c-o)|![Primary height-300](/api/image/2025/10/21/10/ac3ab6117a3b3a6524d99f1042f9bafe-o)|![new height-300](/api/image/2025/10/21/10/261e85b1dc3e8545fee35499425aaa4d-o)|

비교적 생소한 파티셔닝 프로그램이 표시되는데 방향키로 메뉴를 이동할 수 있고 `Enter`키를 통해 확정할 수 있다. `[New]` 메뉴를 선택하면 해당 볼륨에 대한 파티셔닝을 진행하는데 `Primary`를 선택하고 나머지 설정은 특이사항이 없을 경우 아무 입력도 하지 않고 엔터키만 입력하여 기본값으로 진행한다.

![Bootable height-300](/api/image/2025/10/21/10/fb42b2cdcec0dfb67fb42f714e940133-o)

생성된 Primary 파티션을 `[Bootable]` 메뉴를 선택하여 Flags가 Boot로 설정되도록 하고 `[Write]` 메뉴를 선택해서 현재 변경점을 직접 디스크에 쓴 뒤 `[Quit]` 메뉴로 cgdisk를 빠져나가면 파티셔닝은 완료이다.

완료되면 파티션이 두개로 나뉘는데 마찬가지로 방향키로 `[Write]`로 커서를 옮기고 `Enter`키로 진행할 수 있다. 디스크를 실제로 적용하는 단계로 `yes`라고 입력한 후 엔터를 입력하면 디스크 쓰기가 진행된다. 모든 작업이 완료되면 `[Quit]`를 선택하여 cgdisk를 빠져나간다.

| 파티션 선택 | 파티션 포맷 | 진행 물음 |
|:-----:|:-----:|:---:|
|![파티션 선택 height-300](/api/image/2025/10/21/11/c901b249c509ccd8acfd211afedf3009-o)|![Format height-300](/api/image/2025/10/21/10/874c4a88a1f33d09472ea6721d9fa242-o)|![question height-300](/api/image/2025/10/21/10/32596dddbedc1294a68e94d025c8489e-o)|

cgdisk를 빠져나오면 다시 안드로이드 설치 진행 창으로 돌아오게 되는데 방금 작업한 파티션을 선택할 수 있는 메뉴가 더 표시된다. 해당 메뉴로 커서를 옮기고 `<  OK  >`를 선택한다. 설치 진행 전 파티셔닝을 방금 진행했기 때문에 디스크의 포맷을 설정해야 한다. `ext4`를 선택하고 `<  OK  >`를 선택하면 포맷을 진행할 수 있다.

| GRUB | WARNING |
|:-------:|:-------:|
|![GRUB Installation height-300](/api/image/2025/10/21/10/05ea5bce9e2943b363dd54fbde30e1a5-o)|![GRUB WARNING height-300](/api/image/2025/10/21/11/8ef6cc5a50b5282eef9c706488f8bcc9-o)|

포맷이 진행되고나면 부트로더 설치를 물어본다. 앞서 설명했듯이 이후에 부팅이슈를 해결하기 위해서 `<  Yes  >`를 선택하여 설치하도록 한다. 디버그를 위해서 /system 볼륨을 `read-write`로 설정할 수 있다는 물음도 나오는데 모바일 환경을 활용할 용도로만 쓸 것이라 `< No >`를 선택하였다.

| 완료 | 실행 |
|:----:|:----:|
|![완료 height-300](/api/image/2025/10/21/11/062a860583e695ee78e5ae77ef04158f-o)|![Boot height-300](/api/image/2025/10/21/11/a227b3db8f7d69e3abaa890744ab69f8-o)|

설치가 완료되면 실행할지 재부팅할지 메뉴가 나온다. 무엇을 선택해도 우선 첫 실행은 실패할 것이다. 부팅은 성공하지만 우리가 원하는 GUI 환경으로 진입하지 않고 CLI 환경이 표시된다.

## GUI 진입 문제 해결

```base:CLI
qemu-system-x86_64 
  -m 4096 
  -smp 4 
  -accel kvm 
  -hda android.qcow2 
  -net nic,model=virtio-net-pci 
  -net user 
  -vga virtio 
  -display sdl,gl=on
```

우선 설치를 위해 실행했던 qemu 창을 종료시키고 부팅용 명령을 통해 재실행한다. 크게 다른 점은 없지만 올바른 부팅을 위해 설치용 CDROM 설정을 제거했다.

| GRUB | Boot |
|:----:|:----:|
|![GRUB height-300](/api/image/2025/10/21/11/3d089641bb945e689eff1dadbb24335f-o)|![BOOT height-300](/api/image/2025/10/21/11/1e67461e3b53bad2c1fc7522e1f04f69-o)|

부팅이 실행되면 부트 로더인 GRUB이 표시되고 메뉴들이 나온다. `Debug mode`를 선택하여 엔터키로 진입한다. 부팅이 완료되면 CLI 환경으로 진입하게 된다. 여기서 우리는 GRUB 설정을 변경하여 올바른 GUI로 접근할 수 있도록 설정해야 한다.

|Remount|Edit GRUB|
|:------:|:------:|
|![Remount height-300](/api/image/2025/10/21/11/500c6fd675ab5f67bf4b1c5bc5105259-o)|![Edit GRUB height-300](/api/image/2025/10/21/11/83867bf70bb782fd4b0fd37938d79734-o)|

```bash:CLI
mount -o remount,rw /mnt
vi /mnt/grub/menu.lst
```

부트로더 진입화면에서 일회성으로 수정하여 진입할 수도 있겠지만 동일한 동작을 영구적으로 유지시키려면 GRUB 설정을 파일에서 변경해야 한다. 입력줄이 보이지 않으면 엔터를 한 번 입력하면 되며 `mount -o remount,rw /mnt` 명령을 입력하여 `EXT4-fs (sda1): re-mounted.`라는 성공 응답을 확인한다. `vi /mnt/grub/menu.lst`를 입력하여 편집기를 실행하고 사진에 밑줄친 부분과 같이 `nomodeset xforcevesa` 옵션을 추가한 뒤 저장한 후 재부팅하면 된다. 재부팅은 `reboot -f` 명령으로도 가능하고 단순히 창을 끄고 qemu 명령을 통해 다시 실행해도 된다.

|GRUB|GUI|HOME|
|:------:|:------:|:------:|
|![GRUB height-300](/api/image/2025/10/21/11/156795af8460ba520016090f6024dc36-o)|![Android height-300](/api/image/2025/10/21/12/9a02de8d00532c5996b339dbb80f72c6-o)|![Google Play height-300](/api/image/2025/10/21/12/daca2dca01d3882dbc538cbc8f586733-o)|

방금 수정했던 GRUB 메뉴를 선택하고 진행하면 된다. 이전과 동일하게 CLI 화면이 잠시 뜨는 것을 볼 수도 있는데 조금 기다리면 정상적으로 GUI 부팅이 되는 것을 확인할 수 있다. 이런 저런 설정들을 마치고 나면 자유롭게 사용할 수 있다.