进一步阅读

进一步阅读

我正在尝试在我的 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.imgkernel-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/nbd0qemu-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

进一步阅读

相关内容