본문 바로가기

카테고리 없음

[lisa-qemu] arm64 kernel 개발자를 위한 에뮬레이터 환경 (2)

arm64 커널 이미지 빌드를 위한 준비

sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu sudo apt-get build-dep -y linux sudo apt-get install -y libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf git fakeroot

 

커널 소스 다운로드 및 이미지 빌드

github.com/torvalds/linux

 

torvalds/linux

Linux kernel source tree. Contribute to torvalds/linux development by creating an account on GitHub.

github.com

커널 소스를 다운받을 디렉토리를 예를들어 ~/source/kernel 라고 하자.

mkdir -p ~/source/kernel

cd ~/source/kernel

git clone https://github.com/torvalds/linux

cp ~/source/kernel/lisa-qemu/linux-config/default-config.aarch64 ~/source/kernel/linux/.config

 

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bindeb-pkg -j8

 

커널 deb 이미지 VM에 설치

$ sudo python3 scripts/install_kernel.py -p ~/source/kernel/linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb

이미지 빌드는 잘 되었지만 설치 과정에서 에러가 나면서 설치가 안되었다.

 

scripts/install_kernel.py: image: /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/ubuntu.aarch64.img
scripts/install_kernel.py: kernel_pkg: /home/moley/source/kernel/linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb
scripts/install_kernel.py: new Debian package, version 2.0.
scripts/install_kernel.py: size 55725964 bytes: control archive=129404 bytes.
scripts/install_kernel.py: 388 bytes,    12 lines      control
scripts/install_kernel.py: 499767 bytes,  5160 lines      md5sums
scripts/install_kernel.py: 291 bytes,    12 lines   *  postinst             #!/bin/sh
scripts/install_kernel.py: 287 bytes,    12 lines   *  postrm               #!/bin/sh
scripts/install_kernel.py: 289 bytes,    12 lines   *  preinst              #!/bin/sh
scripts/install_kernel.py: 285 bytes,    12 lines   *  prerm                #!/bin/sh
scripts/install_kernel.py: Package: linux-image-5.8.0-rc4+
scripts/install_kernel.py: Source: linux-5.8.0-rc4+
scripts/install_kernel.py: Version: 5.8.0-rc4+-1
scripts/install_kernel.py: Architecture: arm64 
scripts/install_kernel.py: Maintainer: moley <moley@Moley-MacBookPro>
scripts/install_kernel.py: Installed-Size: 270108   
scripts/install_kernel.py: Section: kernel
scripts/install_kernel.py: Priority: optional
scripts/install_kernel.py: Homepage: http://www.kernel.org/
scripts/install_kernel.py: Description: Linux kernel, version 5.8.0-rc4+
scripts/install_kernel.py: This package contains the Linux kernel, modules and corresponding other
scripts/install_kernel.py: files, version: 5.8.0-rc4+.
scripts/install_kernel.py: image_path: /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/ubuntu.aarch64.img 
scripts/install_kernel.py: kernel_pkg_name: linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb
scripts/install_kernel.py: Converting to image type raw /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/ubuntu.aarch64.img -> /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/ubuntu.aarch64.img.raw
scripts/install_kernel.py: creating /home/moley/source/kernel/lisa-qemu/lisa-qemu/external/qemu/build/mnt
scripts/install_kernel.py: create loopback device for /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/ubuntu.aarch64.img.raw
scripts/install_kernel.py: loopback device is: /dev/loop21
scripts/install_kernel.py: mount image to /home/moley/source/kernel/lisa-qemu/lisa-qemu/external/qemu/build/mnt
scripts/install_kernel.py: mount host directories into /home/moley/source/kernel/lisa-qemu/lisa-qemu/external/qemu/build/mnt
scripts/install_kernel.py: parse /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/conf.yml
scripts/install_kernel.py: config file /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/conf-kernel-5.8.0-rc4+-1.yml written
scripts/install_kernel.py: move old kernels out of the way.
scripts/install_kernel.py: install kernel image linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb
scripts/install_kernel.py: Selecting previously unselected package linux-image-5.8.0-rc4+.
scripts/install_kernel.py: (Reading database ... 60051 files and directories currently installed.)
scripts/install_kernel.py: Preparing to unpack .../linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb ...
scripts/install_kernel.py: Unpacking linux-image-5.8.0-rc4+ (5.8.0-rc4+-1) ...
scripts/install_kernel.py: Setting up linux-image-5.8.0-rc4+ (5.8.0-rc4+-1) ...
update-initramfs: Generating /boot/initrd.img-5.8.0-rc4+
W: Possible missing firmware /lib/firmware/amdgpu/navi12_gpu_info.bin for module amdgpu
......
flash-kernel: deferring update (trigger activated)
flash-kernel: deferring update (trigger activated)
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.8.0-rc4+
Found initrd image: /boot/initrd.img-5.8.0-rc4+
done
scripts/install_kernel.py: Processing triggers for flash-kernel (3.98ubuntu11~18.04.1) ...
scripts/install_kernel.py: Unsupported platform on EFI system, doing nothing.
cp: cannot stat './mnt/boot/vmlinuz-5.8.0': No such file or directory
scripts/install_kernel.py: cmd failed with status: 1 cmd: cp ./mnt/boot/vmlinuz-5.8.0 /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/vmlinuz-5.8.0-rc4+-1
scripts/install_kernel.py: umount host directories from /home/moley/source/kernel/lisa-qemu/lisa-qemu/external/qemu/build/mnt
scripts/install_kernel.py: umount image from /home/moley/source/kernel/lisa-qemu/lisa-qemu/external/qemu/build/mnt
scripts/install_kernel.py: destroy loopback device /dev/loop21
scripts/install_kernel.py: remove temporary files

 

--debug로 디버깅을 해도 되겠지만 그냥 scp로 deb 패키지 파일을 카피하여 설치하는 것이 더 빠르고 낫겠다는 생각을 하게되었다. scp/ssh로 VM내에 테스트 바이너리 업로드를 하는 경우가 빈번 할 것으로 예상해서 scp와 ssh가 되는지 부터 살펴보았다.

 

SCP로 VM에 이미지 파일 카피

1. qemu VM에 등록된 ssh public key의 키쌍 private key로 접속

ssh -p 5555 qemu@127.0.0.1

그냥 ssh 접속을 시도하면 접속이 거부된다.

 

build/VM-ubuntu.aarch64/conf.yml 파일을 보면 private key 위치를 알 수 있다.

전체 파라메터를 기억하기 어려우므로 다음을 위해 ssh.sh 쉘스크립트로 만들어 두었다.

$ cat ssh.sh 
#!/bin/sh

ssh -t -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=60 -p 5555 -i /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/id_rsa -o SendEnv=https_proxy -o SendEnv=http_proxy -o SendEnv=ftp_proxy -o SendEnv=no_proxy qemu@127.0.0.1 /bin/bash

scp도 마찬가지고 편하게 쓰기위해 scp.sh로 만들어 보았다.

$ cat scp.sh 
#!/bin/sh

scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=60 -P 5555 -i /home/moley/source/kernel/lisa-qemu/lisa-qemu/build/VM-ubuntu.aarch64/id_rsa -o SendEnv=https_proxy -o SendEnv=http_proxy -o SendEnv=ftp_proxy -o SendEnv=no_proxy $@

이미지 파일 카피

./scp.sh ~/source/kernel/linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb qemu@127.0.0.1:/home/qemu
Warning: Permanently added '[127.0.0.1]:5555' (ECDSA) to the list of known hosts.
linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb             100%   53MB  15.4MB/s   00:03    

2. python3 scripts/launch_image.py로 ssh접속 후 VM에 호스트 일반 계정 ssh public key 등록

vi /home/qemu/.ssh/authorized_keys

로컬 계정의 public를 복사 그리고 붙이기를 한다.

vi /home/moley/.ssh/id_rsa.pub

그런 후 ssh -p 5555 qemu@127.0.0.1 을 하면 간단하게 접속이 가능하다. scp 사용시 포트번호 옵션 대문자 -P 유의.

ssh -p 5555 qemu@127.0.0.1

scp -P 5555 ~/source/kernel/linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb qemu@127.0.0.1:/home/qemu

커널 이미지 인스톨

qemu@ubuntu-aarch64-guest:~$ sudo dpkg -i linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb 
Selecting previously unselected package linux-image-5.8.0-rc4+.
(Reading database ... 60051 files and directories currently installed.)
Preparing to unpack linux-image-5.8.0-rc4+_5.8.0-rc4+-1_arm64.deb ...
Unpacking linux-image-5.8.0-rc4+ (5.8.0-rc4+-1) ...
Setting up linux-image-5.8.0-rc4+ (5.8.0-rc4+-1) ...
update-initramfs: Generating /boot/initrd.img-5.8.0-rc4+
flash-kernel: deferring update (trigger activated)
flash-kernel: deferring update (trigger activated)
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.8.0-rc4+
Found initrd image: /boot/initrd.img-5.8.0-rc4+
Found linux image: /boot/vmlinuz-4.15.0-109-generic
Found initrd image: /boot/initrd.img-4.15.0-109-generic
Adding boot menu entry for EFI firmware configuration
done
Processing triggers for flash-kernel (3.98ubuntu11~18.04.1) ...
Unsupported platform on EFI system, doing nothing.

 

 

로그아웃 후 다시 로그인하면 설치된 커널로 부팅된 VM을 만날 수 있다.

qemu@ubuntu-aarch64-guest:~$ uname -a
Linux ubuntu-aarch64-guest 5.8.0-rc4+ #1 SMP Sun Jul 12 08:30:42 +04 2020 aarch64 aarch64 aarch64 GNU/Linux