주희아빠의 헝그리 라이딩

ARM - '라즈베리파이' 가 없다면 QEMU 로 만들어 구경해 보자. 본문

나름 IT 이야기

ARM - '라즈베리파이' 가 없다면 QEMU 로 만들어 구경해 보자.

도림천 버섯돌이 2023. 12. 1. 17:13

2023.12.2

1. 개요

'라즈베리파이 3B' 를 구하기 전에 너무 궁금해서 미리 구경을 해볼 방법이 없는지 찾아봤습니다. 3년전쯤에 라즈베리파이 OS 인 '라즈비안' 을 저사양 넷북에 올려본 적은 있었는데 이는 아무런 도움이 되지 않았습니다. 

OS 보다는 ARM 이 필요하다는 것을 깨닫습니다. QEMU 라는 에뮬레이터를 통해 ARM 환경을 구성해 볼 수 있다는 것을 알았습니다. 다만, 실제 사용할만한 성능은 아니므로 맛보기만 하는것을 목표로 합니다.

https://www.qemu.org/ 
** QEMU는 x86, PowerPC, ARM 등을 지원하는 에뮬레이터 또는 하이퍼바이저, 버추얼라이저이다. 보통 Linux의 KVM 기술과 함께 사용되며, 웹서버나 클라우드 서버를 운영하는 호스팅 업체나 데이터 센터에서 다수의 가상 머신을 운용하기 위하여 사용된다. - 출처. 나무위키.

qemu 를 사용해서 라즈베리파이를 구성하는 방법은 몇가지가 있습니다.

복잡한 방법으로는 리눅스 커널 컴파일을 통해 커널을 준비하고 Buildroot 을 통해 파일 시스템을 구성한뒤 사용하는 것입니다. 저는 처음엔 참고 문서를 잘못 골라서 이녀석으로 진행했습니다. 이 때 Buildroot 와 커널, dtb 등에 대해 알게되었으나 단순히 구경만 하려고 이과정을 하기에는 많이 버거운게 사실입니다.

간단하게는 라즈베리파이에서 제공하는 디스크 이미지를 사용하고 다음 사이트에서 제공하는 커널을 다운 받아 사용하면 됩니다.

https://github.com/dhruvvyas90/qemu-rpi-kernel\

 

GitHub - dhruvvyas90/qemu-rpi-kernel: Qemu kernel for emulating Rpi on QEMU

Qemu kernel for emulating Rpi on QEMU. Contribute to dhruvvyas90/qemu-rpi-kernel development by creating an account on GitHub.

github.com

 

 

2. Windows 에서 qemu 띄우기

2-1. 다음 사이트에서 qemu 를 다운 받아서 설치합니다.

https://qemu.weilnetz.de/w64/

글쓰는 시점에서 안정 버전은 다음과 같습니다.

https://qemu.weilnetz.de/w64/qemu-w64-setup-20231126.exe

설치된 qemu 버전을 확인해 봅니다.

C:\Users\multitab\Downloads>"C:\Program Files\qemu\qemu-system-arm.exe" --version
QEMU emulator version 8.1.91 (v8.2.0-rc1-12040-g59b55cb373)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

 

2-2. 라즈베리파이 이미지를 다운받아 줍니다.

라즈베리파이 전용 OS 인 '라즈비안' 은 (너무) 최신 버전인 '데비안 12 기반의 Bookwoom', 이제는 Legacy 로 구분되는 '11 - Bullseye', 올드버전이지만 아직까지도 많이 사용되는 '10 - Buster' 버전이 있습니다.

더 이전 버전인 '9 - stretch' 나 '8 - jessie' 은 이제는 그만 보내줄 때가 지났습니다. 혹시 인터넷에서 검색되는 문서중에 stretch 나 Jessie 같은 단어가 나온다면 어느정도 걸러서 보시기 바랍니다. 너무 오래된 정보가 많고 그동안 많이 바뀌었습니다.

이중 다음 이미지를 다운 받아 줍니다. 10 - buster 버전이며 armhf 가 있으면 32bit 버전입니다. lite 가 포함된 파일은 GUI 를 포함하지 않는 Command Line 이미지입니다. 우리는 구경하는게 목적이므로 lite 가 붙어 있지 않는 Desktop 버전을 골랐습니다.

.xz 으로 압축되어 있는데 7zip 이나 반디집을 사용해도 되고 그냥 윈도우 기본에서도  풀리는군요.

https://downloads.raspberrypi.org/raspios_oldstable_armhf/images/raspios_oldstable_armhf-2023-05-03/2023-05-03-raspios-buster-armhf.img.xz

 

다양한 버전의 이미지는 다음을 참고해 주십시오.

https://downloads.raspberrypi.org/

 

2-3. 커널과 장치관리 파일인 dtb 파일을 다운 받습니다.

https://github.com/dhruvvyas90/qemu-rpi-kernel

kernel-qemu-4.19.50-buster 과 versatile-pb-buster.dtb 을 다운 받습니다. 파일을 선택해주면 우측에 있는 아이콘을 클릭해서 다운로드 할 수 있습니다.

 

준비된 재료를 확인해 봅니다.

 

위 git 사이트의 README 에서 가이드하고 있는 커맨드대로 실행을 하면 다음처럼 에러가 나며 실행되지 않습니다. 아마 Windows 라서 약간 다른 부분이 있나봅니다.

C:\Users\multitab\Downloads>"C:\Program Files\qemu\qemu-system-arm.exe" -M versatilepb -cpu arm1176 -m 256 -hda 2023-05-03-raspios-buster-armhf.img -net nic -net user,hostfwd=tcp::5022-:22 -dtb versatile-pb-buster.dtb -kernel kernel-qemu-4.19.50-buster -append 'root=/dev/sda2 panic=1' -no-reboot
WARNING: Image format was not specified for '2023-05-03-raspios-buster-armhf.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
C:\Program Files\qemu\qemu-system-arm.exe: panic=1': drive with bus=0, unit=0 (index=0) exists

C:\Users\multitab\Downloads>

 

다음처럼 옵션을 살짝 조정하니 'Warning' 이 좀 나오긴 하지만 실행이 됩니다.

C:\Users\multitab\Downloads>"C:\Program Files\qemu\qemu-system-arm.exe" -M versatilepb -cpu arm1176 -m 256 -hda 2023-05-03-raspios-buster-armhf.img -net nic -net user,hostfwd=tcp::5022-:22 -dtb versatile-pb-buster.dtb -kernel kernel-qemu-4.19.50-buster -append "root=/dev/sda2 rootfstype=ext4 rw" -no-reboot

 

처음이라서 몇가지 세팅을 해주면 됩니다. 기본 세팅은 영국으로 되어 있는데 키보드 레이아웃의 문제가 있어 US 로 바꾸어 주는게 좋습니다.

기본 유저는 pi 이며 암호를 세팅해 줍니다. 참고로 lite 버전에서는 이과정이 없으며 기본 암호는 pi/ raspberry 입니다.

마지막에 Update Software 는 Skip 하십시오. 필요하면 나중에 하는게 좋습니다.

 

설정이 완료된후 reboot 하라고 하는데 다시 한번 실행하고 각종 정보를 확인해 봅니다.

 

3. Linux 에서 qemu 띄우기

사실은 Windows 에서 실행되는 WSL2 환경입니다. Ubuntu 22.04 입니다.

windows 와 마찬가지로 라즈비안 OS 이미지와 커널, dtb 파일을 다운 받습니다. 한가지 주의할 것은 git 에서 파일을 다운 받을 때 그냥 저장으로 선택하면 binary 가 아니라 html(json) 이 받아지는 경우가 있습니다.

 

3-1. qemu 설치하기

apt 로 qemu 를 설치했는데 버전 문제가 있어서 지우고 직접 설치하였습니다.

-- apt 로 qemu 설치한 경우 qemu 버전이 최신이 아니라 사이트에서 가이드하는 옵션이 일부 안먹는 경우가 있습니다.
$ sudo apt install qemu-system

$ qemu-system-arm --version
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.15)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

-- 혹시라도 설치했다면 기존것을 지워주십시오.
$ sudo apt remove qemu-system
$ sudo apt autoremove

 

깔끔하게 소스 다운로드를 통해 새로 설치해 주기로 합니다.

-- build-dep 라는 명령은 컴파일 시점이 아니라 실행 시점에 필요한 종속성을 찾아줍니다.
-- 그래서 패키지 리스트뿐 아니라 source 리포지터리까지 검색이 필요합니다.
multitab@MULTITAB-T420S:~/tmp2$ sudo apt build-dep qemu
Reading package lists... Done
E: You must put some 'deb-src' URIs in your sources.list

-- /etc/apt/sources.list 를 열어서 주석으로 막힌 deb-src 항목을 열어줍니다.
multitab@MULTITAB-T420S:~/tmp2$ sudo vi /etc/apt/sources.list
multitab@MULTITAB-T420S:~/tmp2$ sudo apt update

-- 다시 진행
multitab@MULTITAB-T420S:~/tmp2$ sudo apt build-dep qemu
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following package was automatically installed and is no longer required:
  libsamplerate0
Use 'sudo apt autoremove' to remove it.
The following packages will be REMOVED:
  libjack-jackd2-0
The following NEW packages will be installed:
...뭔가 엄청 많이 나옵니다. 중략..
  xml-core xorg-sgml-doctools xsltproc xtrans-dev zlib1g-dev
0 upgraded, 340 newly installed, 1 to remove and 1 not upgraded.
Need to get 266 MB of archives.
After this operation, 881 MB of additional disk space will be used.
Do you want to continue? [Y/n]

-- 추가로 필요한 패키지를 설치해 줍니다.
$ sudo apt install python3-venv python3-pip ninja-build acpica-tools sparse libglib2.0-dev libpixman-1-dev flex bison libslirp-dev libfdt-dev zlib1g-dev libgtk-3-dev


-- qemu 본격 컴파일
$ wget https://download.qemu.org/qemu-8.1.3.tar.xz 
$ tar xvf qemu-8.1.3.tar.xz
$ cd qemu-8.1.3

-- 네트워크 옵션 포함. 이거 없어도 컴파일은 다 되는데 나중에 네트웍이 동작을 안합니다.
$ ./configure --enable-slirp

-- 컴파일에 시간 좀 걸립니다. 제 노트북 WSL2 에서는 100분 정도 걸렸네요. -_-;
-- 저는 보통 time make; date 이렇게 명령을 내립니다. 나중에 컴파일 시간을 확인하기 좋습니다.
$ make
$ sudo make install

$ qemu-system-arm --version
qemu-arm version 8.1.3
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

 

라즈베리파이 이미지 및 관련 파일들도 다운받아 줍니다. Windows 에서 받은 것을 복사해와도 됩니다.

-- Raspberry Pi OS (Legacy) with desktop. 32bit kernel 5.10. debian version 10(buster)
$ wget https://downloads.raspberrypi.org/raspios_oldstable_armhf/images/raspios_oldstable_armhf-2023-05-03/2023-05-03-raspios-buster-armhf.img.xz
$ unxz -v 2023-05-03-raspios-buster-armhf.img.xz

-- https://github.com/dhruvvyas90/qemu-rpi-kernel 에서 다음 파일을 다운받습니다.
-- kernel-qemu-4.19.50-buster
-- versatile-pb-buster.dtb

 

준비된 재료를 확인해 봅니다.

-- git 사이트에 나온 대로 실행을 하면 잘 됩니다.
$ qemu-system-arm \
  -M versatilepb \
  -cpu arm1176 \
  -m 256 \
  -hda 2023-05-03-raspios-buster-armhf.img \
  -net user,hostfwd=tcp::5022-:22 \
  -dtb versatile-pb-buster.dtb \
  -kernel kernel-qemu-4.19.50-buster \
  -append 'root=/dev/sda2 panic=1' \
  -no-reboot

 

리눅스에서도 다음과 같은 화면을 볼 수 있습니다. 이하 진행은 위의 Windows 와 같습니다.

 

Tip 1.

-- 다음과 같은 에러가 난다면 dtb 파일의 형식을 확인해 보십시오.
$ qemu-system-arm   -M versatilepb   -cpu arm1176   -m 256   -hda 2023-05-03-raspios-buster-armhf.img   -net nic   -net user,hostfwd=tcp::5022-:22   -dtb versatile-pb-buster.dtb   -kernel kernel-qemu-4.19.50-buster   -append 'root=/dev/sda2 panic=1'   -no-reboot
WARNING: Image format was not specified for '2023-05-03-raspios-buster-armhf.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
qemu-system-arm: Unable to copy device tree in memory
Couldn't open dtb file versatile-pb-buster.dtb
multitab@MULTITAB-T420S:~/tmp2$

-- dtb 와 kernel 파일을 보면 다음처럼 나와야 합니다. json 이라고 나오면 잘 못 받아진 것입니다.
$ file *
2023-05-03-raspios-buster-armhf.img: DOS/MBR boot sector; partition 1 : ID=0xc, start-CHS (0x40,0,1), end-CHS (0x3ff,3,32), startsector 8192, 524288 sectors; partition 2 : ID=0x83, start-CHS (0x3ff,3,32), end-CHS (0x3ff,3,32), startsector 532480, 7200768 sectors
kernel-qemu-4.19.50-buster:          Linux kernel ARM boot executable zImage (little-endian)
qemu-8.1.3:                          directory
qemu-8.1.3.tar.xz:                   XZ compressed data, checksum CRC64
versatile-pb-buster.dtb:             Device Tree Blob version 17, size=8573, boot CPU=0, string block size=477, DT structure block size=8040

 

커널이 올바르지 않은 경우에는 다음처럼 커널 로딩에 실패합니다.

 

Tip 2.

GUI 가 없는 Lite 버전도 다음처럼 쉽게 설치할 수 있습니다. 처음 접속 정보는 pi/ raspberry 입니다.

-- Raspberry Pi OS (Legacy). 32bit kernel 5.10. debian version 10(buster)
$ wget https://downloads.raspberrypi.org/raspios_oldstable_lite_armhf/images/raspios_oldstable_lite_armhf-2023-05-03/2023-05-03-raspios-buster-armhf-lite.img.xz
$ unxz -v 2023-05-03-raspios-buster-armhf-lite.img.xz

$ qemu-system-arm \
  -M versatilepb \
  -cpu arm1176 \
  -m 256 \
  -hda 2023-05-03-raspios-buster-armhf-lite.img \
  -net user,hostfwd=tcp::5022-:22 \
  -dtb versatile-pb-buster.dtb \
  -kernel kernel-qemu-4.19.50-buster \
  -append 'root=/dev/sda2 panic=1' \
  -no-reboot

 

 

Tip 3.

lite 버전으로 OS 를 띄우고 sshd 를 띄운후에 외부에서 접속하면 간단한 arm 환경을 구성하고 테스트할 수 있습니다.

pi@raspberrypi:~ $ sudo raspi-config
-- 3. Interfrace Options - P2 SSH - Enable 을 해줍니다.
-- 5. Localisation Options 에서 
-- L2 Timezone - Asia - Seoul
-- L3 Keyboard layout 을 Generic 105 - Other - English(US) 로 바꾸어 줍니다.

-- Windows 나 리눅스에서 ssh/putty 로 접속을 하면 됩니다.
--이때 target 주소는 10.0.2.15 가 아니라 127.0.0.1 이고 port 는 5022 입니다.
$ ssh -p 5022 pi@127.0.0.1

 

 

$ sudo apt update && sudo apt upgrade 만 수행을 해도 Disk Full 이 나오네요. 용량을 늘려줍니다.

-- Windows 에서는 다음처럼 하면 됩니다.
C:\Users\multitab\Downloads>"C:\Program Files\qemu\qemu-img.exe" resize 2023-05-03-raspios-buster-armhf-lite.img +2G
WARNING: Image format was not specified for '2023-05-03-raspios-buster-armhf-lite.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
Image resized.

C:\Users\multitab\Downloads>dir *.img
2023-12-02(토)  오후 09:00     4,164,943,872 2023-05-03-raspios-buster-armhf-lite.img

-- 리눅스에서는 다음처럼 하면 됩니다.
multitab@MULTITAB-T420S:~/tmp2$ qemu-img resize 2023-05-03-raspios-buster-armhf-lite.img +2G


-- 이하는 qemu raspi 에서 진행합니다.
-- 이전 정보의 글들에서는 fdisk 와 resize2fs 를 직접 수행해야 했는데 이제는 raspi-config 에서 한번에 수행해 줍니다.
pi@raspberrypi:~ $ sudo raspi-config
-- 6번 Advanced Options - A1 Expand Filesystem
-- 저장후 reboot 

-- 용량이 늘은 것을 볼 수 있습니다.
pi@raspberrypi:~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       3.6G  1.3G  2.1G  39% /

 

Tip 4.

qemu 8.1.91 에서는 machine 옵션으로 '라즈베리파이 3B' 까지 사전 정의가 되어 있습니다. 구체적으로 어떻게 다른지는 모르겠습니다만 이 프리셋으로도 진행을 해봐야겠습니다.

C:\Users\multitab>"C:\Program Files\qemu\qemu-system-arm.exe" -version
QEMU emulator version 8.1.91 (v8.2.0-rc1-12040-g59b55cb373)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers

C:\Users\multitab>"C:\Program Files\qemu\qemu-system-arm.exe" -machine help
Supported machines are:
...중략...
raspi0               Raspberry Pi Zero (revision 1.2)
raspi1ap             Raspberry Pi A+ (revision 1.1)
raspi2b              Raspberry Pi 2B (revision 1.1)

C:\Users\multitab>"C:\Program Files\qemu\qemu-system-aarch64.exe" -machine help
Supported machines are:
...중략...
raspi0               Raspberry Pi Zero (revision 1.2)
raspi1ap             Raspberry Pi A+ (revision 1.1)
raspi2b              Raspberry Pi 2B (revision 1.1)
raspi3ap             Raspberry Pi 3A+ (revision 1.0)
raspi3b              Raspberry Pi 3B (revision 1.2)

 

반응형