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
커널 소스 다운로드 및 이미지 빌드
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