本文试着用qemu安装一个debian 12系统。
$ pacman -S mingw-w64-x86_64-qemu
从任何一个debian-cd镜像站下载iso文件,比如163网易的镜像站:
https://mirrors.163.com/debian-cd/12.6.0/arm64/iso-cd/debian-12.6.0-arm64-netinst.iso
在windows下打开iso文件,提取install.a64下面的vmlinuz和initrd.gz文件。
内核和initrd,将用来启动安装系统。通常对于pc来讲,从iso启动,就能启动安装系统,但是qemu arm64需要指定内核和rootfs,因此需要单独提取出来。
$ qemu-img create -f qcow2 debian-aarch64.qcow2 8G
到这一步,基本所有的资源都准备好了,开始启动一个qemu aarch64虚拟进行系统的安装
$ qemu-system-aarch64 \
-machine type=virt \
-kernel ./vmlinuz -append "console=ttyAMA0" \
-initrd ./initrd.gz \
-m 1024 -cpu max \
-drive file=./debian-12.6.0-arm64-netinst.iso,id=cdrom,if=none,media=cdrom \
-device virtio-scsi-device \
-device scsi-cd,drive=cdrom \
-drive file=./debian-aarch64.qcow2,id=hd,if=none,media=disk \
-device virtio-scsi-device \
-device scsi-hd,drive=hd \
-nographic
一步步安装,这个过程很漫长,安装了2个小时。安装完毕后,退出qemu进程。
由于qemu不能直接从硬盘启动引导,需要提取安装后的kernel和initrd
将硬盘文件拷贝到ubuntu或者debian系统
$ sudo apt install libguestfs-tools
$ sudo virt-ls -a debian-aarch64.qcow2 /boot/
System.map-6.1.0-22-arm64
config-6.1.0-22-arm64
initrd.img
initrd.img-6.1.0-22-arm64
initrd.img.old
lost+found
vmlinuz
vmlinuz-6.1.0-22-arm64
vmlinuz.old
$ sudo virt-copy-out -a debian-aarch64.qcow2 /boot/vmlinuz-6.1.0-22-arm64 /boot/initrd.img-6.1.0-22-arm64 .
运行安装后的debian,此时已经不需要kernel和initrd引导了。只要添加磁盘文件就可以了。
$ qemu-system-aarch64 \
-machine type=virt -m 1024 -cpu max \
-kernel ./vmlinuz-6.1.0-22-arm64 -append "root=/dev/sda2 console=ttyAMA0 rootfstype=ext4" \
-initrd ./initrd.img-6.1.0-22-arm64 \
-drive file=./debian-aarch64.qcow2,id=hd,if=none,media=disk \
-device virtio-scsi-device \
ls-device scsi-hd,drive=hd \
-nographic
然而,启动后,kernel command line把 /dev/sda2变成了:
Kernel command line: root=F:/msys2/dev/sda2 console=ttyAMA0
导致挂载rootfs失败:
[ 33.931370] F:/msys2/dev/sda2: Can't open blockdev
mount: mounting F:/msys2/dev/sda2 on /root failed: No such file or directory
Failed to mount F:/msys2/dev/sda2 as root file system.
msys2会自动转换,设置环境变量: MSYS2_ARG_CONV_EXCL='*' 就可以了。
启动后,可以登录:
debian login: yuanjp
Password:
Linux debian 6.1.0-22-arm64 #1 SMP Debian 6.1.94-1 (2024-06-21) aarch64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
l yuanjp@debian:~$ ls
lhyuanjp@debian:~$ cd /
l yuanjp@debian:/$ ls
bin dev home lost+found mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
lhuanjp@debian:/$
lhyuanjp@debian:/$
l yuanjp@debian:/$ ip route
default via 10.0.2.2 dev enp0s1
10.0.2.0/24 dev enp0s1 proto kernel scope link src 10.0.2.15
lyuanjp@debian:/$ ping baidu.com
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=255 time=45.1 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=255 time=42.9 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 42.891/44.006/45.122/1.115 ms
lyuanjp@debian:/$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s1
valid_lft 86253sec preferred_lft 86253sec
inet6 fec0::5054:ff:fe12:3456/64 scope site dynamic mngtmpaddr
valid_lft 86252sec preferred_lft 14252sec
inet6 fe80::5054:ff:fe12:3456/64 scope link
valid_lft forever preferred_lft forever