我正在尝试在我的 Linux 子系统上使用 QEMU 模拟 Raspberry-pi/Raspbian。我按照这个关联并执行以下步骤
$ mkdir ~/qemu_vms/
Download/copy Raspbian Wheezy to ~/qemu_vms/
Download kernel-qemu to ~/qemu_vms/
$ sudo apt-get install qemu-system
$ file ~/qemu_vms/2013-02-09-wheezy-raspbian.img
From the output of the file command, take the partition 2 'startsector' value an multiply by 512, and use this figure as the offset value in the mount command below.
$ sudo mount ~/qemu_vms/2013-02-09-wheezy-raspbian.img -o offset=62914560 /mnt
$ sudo nano /mnt/etc/ld.so.preload
Comment out the line in the file (use a # as the first character of the line) and save the file (CTRL+X, then "Y" for yes).
$ sudo umount ~/qemu_vms/2013-02-09-wheezy-raspbian.img /mnt
当我运行上述命令中的最后一条命令时,我的输出是
umount: /mnt: not mounted.
这是什么意思?无论如何,我认为我走在正确的轨道上,我继续并执行了以下步骤
$ cd ~/qemu_vms/
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1" -hda ~/qemu_vms/2013-02-09-wheezy-raspbian.img -redir tcp:5022::22
但是 QEMU 并没有给我一个 root shell,而是出现了以下输出错误
qemu-system-arm: -redir: invalid option
我到底哪里犯了错误以及如何成功完成这个过程?
如果这个过程依赖于我的 Linux 子系统,以下是我的 ubuntu 版本:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
我目前在文件夹中的内容qemu_vms
以及2013-02-09-wheezy-raspbian.img
我kernel-qemu
从中获取的内容这里
如果有人能提供解决这个问题的方法那就太好了!
答案1
不要使用那种糟糕的古老方式,使用 arm1176、多用途 fb、只有 256 Mb RAM、单核、自定义古老内核和软件等。Qemu 现在支持raspi2机器,具有 USB、1GiB RAM、4 个内核(Qemu 在运行模拟时将其负载分散到物理内核)。它运行由 Raspberry Pi 基金会正式发布的未修改的主流 Raspberry Pi OS 最新版本。这没有很好的记录,但我设法找到了一种运行这种机器的方法。
这是我使用的命令行:
screen -mS raspi2 qemu-system-arm \
-M raspi2 \
-drive file=2020-12-02-raspios-buster-armhf-full.qcow2,format=qcow2,if=sd,discard=unmap,detect-zeroes=unmap \
-append "console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw dwc_otg.fiq_fsm_enable=0" \
-kernel boot/kernel7.img \
-dtb boot/bcm2709-rpi-2-b.dtb \
-vnc :1 \
-monitor stdio \
-name raspi2 \
-device usb-tablet -device usb-kbd \
-device usb-net,netdev=mytap6,mac=02:ca:fe:f0:0e:01 \
-netdev tap,id=mytap6,ifname=tap6,script=no,downscript=no
这适用于原始 SD 卡图像,但您需要扩展图像,使其大小精确为 2 的幂;这可以使用 来完成qemu-img
。图像文件名反映了我开始使用的特定版本:2020-12-02-raspios-buster-armhf-full
;我还成功尝试了“精简”版本。我将该图像转换为qcow2
格式以节省空间(因此它有 3 GiB 而不是 8 GiB,我还可以应用 qcow2 压缩)。
此外,您需要从 SD 映像中提取启动目录。每次更新内核(或写入/boot
分区的任何数据包)后,您都需要执行此操作。就我的磁盘格式而言qcow2
,最简单的方法是将其连接到/dev/nbd0
,qemu-nbd
然后像往常一样挂载其分区。总是连接 NBD 之前停止 VM和启动 VM 之前断开 NBD 连接再次。自初始配置以来,我已成功更新内核。
tap6
是我的用户 ID 拥有的虚拟 Tap 适配器集,因此我以非特权用户身份运行 qemu。它是我与物理 NIC 的桥接的一部分,因此这个虚拟 Raspberry Pi 与我的计算机一起出现在 LAN 中,并成功从 DHCP 服务器接收地址等。
我将其放入脚本中,这样run.sh
就不必每次都构建命令行。我使用screen
它能够将其与终端分离。要连接到此 RasPi 屏幕,我运行vncviewer localhost:1
。因此,可以通过 SSH 远程运行此命令,并且可以通过相同的 SSH 隧道传输 VNC。
注意:即使在相对较快的工作站上它也很慢。例如,它在 i5-3470 上大约 10 分钟即可启动到完整 GUI。我认为这是因为巨大的仿真开销。内核启动日志:
[ 0.000000] Booting Linux on physical CPU 0xf00
[ 0.000000] Linux version 5.4.83-v7+ (dom@buildbot) (gcc version 8.4.0 (Ubuntu/Linaro 8.4.0-3ubuntu1)) #1379 SMP Mon Dec 14 13:08:57 GMT 2020
[ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
[ 0.000000] CPU: div instructions available: patching division code
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Raspberry Pi 2 Model B
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] Reserved memory: created CMA memory pool at 0x38000000, size 64 MiB
[ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[ 0.000000] On node 0 totalpages: 245760
[ 0.000000] Normal zone: 2160 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 245760 pages, LIFO batch:63
[ 0.000000] percpu: Embedded 20 pages/cpu s49740 r8192 d23988 u81920
[ 0.000000] pcpu-alloc: s49740 r8192 d23988 u81920 alloc=20*4096
[ 0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 243600
[ 0.000000] Kernel command line: console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw dwc_otg.fiq_fsm_enable=0
[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] Memory: 892624K/983040K available (9216K kernel code, 698K rwdata, 2608K rodata, 1024K init, 827K bss, 24880K reserved, 65536K cma-reserved)
...
答案2
如果-redir
参数是错误的,您可能需要尝试其他语法来使主机-客户机端口转发正常工作。qemu 文档的这一部分建议这样做:
-device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp::5022-:22
代替:
-redir tcp:5022::22
进一步阅读
- qemu 中删除了 redir 选项
- 使用 redir对这个家伙也不起作用
- 这是一篇非常好的文章,解释了
-device
它们-netdev
之间的关系-redir