Ale*_*x44 22 linux qemu linux-kernel raspberry-pi raspbian
我正在尝试使用QEMU使用Raspian OS模拟Raspberry Pi.我尝试过在互联网上描述的几种方法但没有任何成功.
我想我需要修补一个适合所需操作系统的Linux内核.在我的例子中,我选择了带有内核4.4的Rasbian Lite:
wget https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2016-05-31/2016-05-27-raspbian-jessie-lite.zip
unzip 2016-05-27-raspbian-jessie-lite.zip
rm 2016-05-27-raspbian-jessie-lite.zip
Run Code Online (Sandbox Code Playgroud)
接下来,我从https://www.kernel.org/加载内核:
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.16.tar.gz
tar -xzf linux-4.4.16.tar.gz
rm linux-4.4.16.tar.gz
Run Code Online (Sandbox Code Playgroud)
现在交叉编译内核:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
cd linux-4.4.16
make vexpress_defconfig
make all
cd ..
Run Code Online (Sandbox Code Playgroud)
现在我可以将启动映像(即在RAM中自动提取的压缩内核映像)复制到我的工作区:
cp linux-4.4.16/arch/arm/boot/zImage zImage
Run Code Online (Sandbox Code Playgroud)
并运行QEMU
qemu-system-arm -kernel zImage -M vexpress-a9 -m 1024 -cpu cortex-a9 -no-reboot -serial stdio -hda 016-05-27-raspbian-jessie-lite.img -append "root=/dev/sda2 rootfstype=ext4"
Run Code Online (Sandbox Code Playgroud)
但我所看到的只是一个黑色的QEMU窗口.:(
我认为问题是获得正确的内核.从Internet复制某些内核从未取得成功,因为它们不适合操作系统.
如何构建/修补适合操作系统的内核(不下载现有的内核)以及如何正确运行QEMU?
先谢谢
Alex
我kernel-qemu从这里加载一个https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl=0并用它运行QEMU:
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -hda 2016-05-27-raspbian-jessie-lite.img
Run Code Online (Sandbox Code Playgroud)
这给我带来了以下输出:
这对我来说很有意义,因为内核是3.10.25并且比使用内核4.4.16的Raspbian Jessie更老.
使用来自https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.12-jessie的qemu内核
qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
Run Code Online (Sandbox Code Playgroud)
使用新内核-qemu 4.4.16的新尝试:
从https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools复制build-kernel-qemu 并添加以下行以签出内核4.4.16的版本:
git checkout b05965f284db3e086022f4e318e46cb5bffb1376
Run Code Online (Sandbox Code Playgroud)运行build-kernel-qemu以构建内核
sh build-kernel-qemu
Run Code Online (Sandbox Code Playgroud)运行QEMU
qemu-system-arm -kernel kernel-qemu -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img
Run Code Online (Sandbox Code Playgroud)
Dad*_*fix 12
您应该在开始之前展开Raspbian Image文件
使用kpartx挂载Raspbian映像文件(可能必须安装kpartx)
$ sudo kpartx -av your-image.img
add map loop0p1 (252:5): 0 117187 linear /dev/loop0 1
add map loop0p2 (252:6): 0 3493888 linear /dev/loop0 118784
$ sudo mount /dev/mapper/loop0p2 /mnt/img1
$ cd /mnt/img1
Run Code Online (Sandbox Code Playgroud)
修改/ etc/fstab并注释掉MMCBLK挂载
$ sudo nano etc/fstab
proc /proc proc defaults 0 0
#/dev/mmcblk0p1 /boot vfat defaults 0 2
#/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
Run Code Online (Sandbox Code Playgroud)
修改/etc/ld.so.preload并注释掉行...
$ sudo nano etc/ld.so.preload
#/usr/lib/arm-linux-gnueabihf/libarmmem.so
Run Code Online (Sandbox Code Playgroud)
从kpartx 卸载并销毁循环
$ sudo umount /mnt/img1
$ sudo kpartx -d your-image.img
Run Code Online (Sandbox Code Playgroud)
在这里获取与Raspbian图像匹配的Qemu内核 ...
https://github.com/dhruvvyas90/qemu-rpi-kernel
我用这个命令成功模拟了Raspbian Jessie
qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb \
-no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" \
-redir tcp:5022::22 \
-hda 2016-05-27-raspbian-jessie-lite.img
Run Code Online (Sandbox Code Playgroud)
您需要修改内核才能在QEMU中运行,因为QEMU中没有raspberry PI板硬件.这就是你的第一种方法失败的原因.
你的第二种方法是使用适当修补的内核在多功能板上运行(由QEMU支持),所以这很好,但内核3.x对于现代Raspbian来说太旧了.原则上你的最后一种方法应该有效.
我推荐这个更新的指南(2017年2月),我用4.4内核测试它,它可以立即使用.
qemu-system-arm -kernel $KERNEL -cpu arm1176 -m 256 -M versatilepb -net nic,macaddr=$MAC -net tap -no-reboot -append "root=/dev/sda2 panic=1" -drive format=raw,file=$IMG
Run Code Online (Sandbox Code Playgroud)
我不得不使用format=raw,file=$IMG选项来避免QEMU警告.
你不需要注释掉/etc/fstab,你可以添加/etc/udev/rules.d/90-qemu.rules
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"
Run Code Online (Sandbox Code Playgroud)
此外,ld.so.preload的东西很旧,不再适用了
上述指南中提供的脚本为您完成了所有这些操作,并通过与raspbian共享您的网络接口提供对您的raspbian的网络访问.
Ubuntu 16.04 主机,QEMU 2.9.0 -M raspi2,Raspbian 2016-05-27,vanilla 内核
好处:
-M raspi2,我们可以使用香草内核,所以该系统是比较有代表性的限制:
-M raspi2是在 QEMU 2.6.0 中添加的,而 Ubuntu 16.04 只有 QEMU 2.5.0,所以我们必须从源代码编译 QEMU。但这并不难。脚步:
从源代码编译 QEMU 2.9.0:
sudo apt-get build-dep qemu-system-arm
git clone --recursive git://git.qemu-project.org/qemu.git
cd qemu
git checkout v2.9.0
./configure
make `nproc`
Run Code Online (Sandbox Code Playgroud)下载图像并从中提取内核和 dts:
下载图片并解压:
wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip
unzip 2016-05-27-raspbian-jessie.zip
Run Code Online (Sandbox Code Playgroud)挂载分区的第二个映像。最简单的方法是:
sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img
Run Code Online (Sandbox Code Playgroud)
这仅适用losetup于 Ubuntu 16.04上的最新版本,其他方法位于:https : //askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576
这将打印一个循环设备,例如:
/dev/loop0
Run Code Online (Sandbox Code Playgroud)
所以我们这样做:
sudo mkdir /mnt/rpi
sudo mount /dev/loop0p1 /mnt/rpi
cp /mnt/rpi/kernel7.img bcm2709-rpi-2-b.dtb .
sudo umount /mnt/rpi
sudo losetup -d /dev/loop0
Run Code Online (Sandbox Code Playgroud)跑:
./arm-softmmu/qemu-system-arm \
-M raspi2 \
-append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" \
-cpu arm1176 \
-dtb bcm2709-rpi-2-b.dtb \
-sd 2016-05-27-raspbian-jessie.img \
-kernel kernel7.img \
-m 1G \
-smp 4 \
-serial stdio \
;
Run Code Online (Sandbox Code Playgroud)然后,您可以登录主机终端上显示的终端。
[失败] Ubuntu 17.04、QEMU 2.8.0 -M raspi2、Raspbian 2016-05-27、vanilla 内核
在这个较新的 Ubuntu 上,QEMU 2.8.0 是默认的,所以我们不需要从源代码为-M raspi2. 但是,2.8.0 在出现以下消息后挂起:
Console: switching to colour frame buffer device 100x30
Run Code Online (Sandbox Code Playgroud)
这表明-M raspi2仍然不稳定。
[失败] Ubuntu 16.04、QEMU 2.9.0 -M raspi2、Raspbian 2017-08-16、vanilla 内核
在这个较新的映像上,使用与 2016-05-27 相同的方法,内核在启动时出现以下情况:
Please append a correct "root=" boot option; here are the available partitions:
...
[ 4.138114] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
Run Code Online (Sandbox Code Playgroud)
bztsrc/raspi3-tutorial QEMU 上的 RPI3 裸机
https://github.com/bztsrc/raspi3-tutorial是一组很好的例子,只适用于 QEMU,超快速入门:https ://raspberrypi.stackexchange.com/questions/34733/how-to-do- qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135
| 归档时间: |
|
| 查看次数: |
18748 次 |
| 最近记录: |