qemu armlinux折腾笔记

arm linux qemu折腾笔记
最近几天折腾qemu,涉及到了u-boot,nfs,mini2440等信息,新手,没有经验,遇到问题到网上未必能搜到,所以花了不少时间,现在把心得整理一下,本文只是描述可能遇到的问题,并不是完整的可跟随的记录。
qemu
我用的archlinux中的qemu已经是当时最新版本(1.4),但是如果需要定制等,可能还要自己编译,比如如果你在之后的运行中出现:

oss: Could not initialize DAC
oss: Failed to open `/dev/dsp'
oss: Reason: No such file or directory
oss: Could not initialize DAC
oss: Failed to open `/dev/dsp'
oss: Reason: No such file or directory
audio: Failed to create voice `lmxxx.out'

错误的话,这里就需要$./configure --audio-drv-list=alsa 之后重新编译。
在以后的运行过程中可能还需要设置环境变量:export QEMU_AUDIO_DRV=alsa
这个是在别人的博客中无意发现的,感谢原作者。
我编译的一个例子,第一个参数参考别人的做法,自己加入了 后两个参数
./configure --target-list=arm-softmmu --audio-drv-list=alsa --python=/usr/bin/python2.7
遇到错误:
GEN qemu-doc.html
./qemu-options.texi:1521: unknown command `list'
./qemu-options.texi:1521: table requires an argument: the formatter for @item
./qemu-options.texi:1521: warning: @table has text but no @item
make: *** [qemu-doc.html] Error 1
在邮件列表中找到解决办法,手动运行。
LC_ALL=C makeinfo --no-headers --no-split --number-sections --html qemu-doc.texi -o qemu-doc.html
还有错误,原来是make -j8 出现问题,改为单线程make正常
如果编译时提示缺少 Lxxx 就是缺少对应的库,用自己的linux发行版本的包管理工具搜索libxxx或者xxx,archlinux下也可以用pkgfile,来查找xx命令等在哪个包中
-M制定machine,默认的一般没有mini2440,需要自己编译,搜索mini2440 qemu就可发现,很详细。
关于网卡权限的问题,我在archlinux下,用mini2440版的qemu,执行,按照网上说的方法,加上sudo,系统就崩溃了,ubuntu下也是,黑屏无反应,强制关电源。
源里自带的qemu倒是没这个问题,只是不支持mini2440,当然还有一个办法,可以试试,在archlinux中可以不用sudo qemu...... 实现网络连接,ubuntu中还不能,还没有仔细研究
sudo tunctl -u $(whoami) -t tap1
sudo ifconfig tap1 192.168.1.1
sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev tap1
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
提示缺少tunctl等,自己搜索安装对应的软件包就好了,archlinux下可以用pkgfile,如果不了解包管理器的搜索办法,可以到google中搜索,关键字+发行版。
启动qemu
qemu-system-arm -m 64M -nographic -M versatilepb -kernel zImage\
-append "console=ttyAMA0 root=/dev/nfs rw nfsroot=192.168.1.1:/srv/nfs4/ ip=192.168.1.101"\
-net nic -net tap,ifname=tap1,script=no
versatilepb可以改成对应的其他

的,比如mini2440, append后面是内核参数,大多数都用ttyAMA0,可以制定-initrd参数,这里用nfs启动方法,192.168.1.1是服务端,也就是你的主机的ip,前面设定的tap1的那个网卡。
ip=是指定本机的ip,/dev/nfs表示网络启动,-net nic -net tap,ifname=tap1,script=no 表示不执行配置文件来配置,因为前面已经手动设定好了。 /srv/nfs4/是我的nfs目录,可以吧rootfs放到里面去
可以先把对应的文件解压到一个目录,然后 sudo mount --bind 目录名称(里面要有/usr /etc/ /bin等的那个目录,是你解压的那个,不是/) /srv/nfs4
注意一定要先mount,然后再通过客户端访问,如果先访问,后mount,可能不会更新,有问题。rootfs有现成的最好,没有自己做,不匹配可能遇到一些错误。
zImage(如果不在当前目录下面要制定路径)是为versatilepb编译的内核文件,要和平台匹配,u-boot也一样,所以都要为你要制定的平台编译,下面是u-boot的一个例子
qemu-system-arm -M versatilepb -nographic -net nic -net tap,ifname=tap1,script=no -kernel ./u-boot-2013.01.01/u-boot
-nographic 没有图形输出,并且把串口放到标准输入输出,你用的终端,qemu可以指定串口,用-serial stdio,如果不是stdio要换成其他的,比如你换成pty 然后会生产/dev/pts/n(n是一个数字,如果你用的是X,不是真正的终端,你在终端输入w可以看到你正在用的)
然后可以用minicom等去连接这个设备,更详细的 google 如何使用 QEMU 中的虚拟串口
还有如果出现
uncompressing linux done,boting the kernel 停止不动,参考
https://www.360docs.net/doc/0c8611117.html,/uid-14833587-id-3182144.html
nfs部分
nfs4中有一个fsid=0,如果在/etc/exports中指定了,那就是说要用
sudo mount -t nfs4 serverip:/
而不是
sudo mount -t nfs4 serverip:/srv/nfs4
遗憾的是你可能遇到问题,我猜测可能是ntfs4不一定被支持吧!当然你可以这样做
sudo mount -t nfs serverip:/srv/nfs4
同样在nfsroot那里也指定路径,而不是/,当然不用fsid=0最好了,如果遇到问题,可以先ping主机的ip,tap1的,不是其他设备的,因为我们使用tap1和qemu连接。
在前面所说的这种情况下可能出现的提示错误
Root-NFS: Server returned error -13 while mounting /
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
还有,要先看一下客户端ip对不对,用
ifconfig查看里面的eth0,部队可以设置,比如
ifconfig eth0 192.168.1.100
其他的系统自动配置
如果遇到下面的错误
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).
lockd_up: makesock failed, error=-5
前面加上 -o nolock 试试 也就是
mount -t nfs -o noloct .......
/etc/exports更改完要执行
exports -rav
挂载后,目录为空,尝试把 exports 中的crossmount 去掉

,nfs启动时遇到这种情况,qemu中提示信息为找不到init,快速提示,没有等待,比如:
Looking up port of RPC 100003/2 on 192.168.1.1
Looking up port of RPC 100005/1 on 192.168.1.1
VFS: Mounted root (nfs filesystem) on device 0:10.
Freeing init memory: 104K
Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[] (unwind_backtrace+0x0/0xf0) from [] (panic+0x40/0xc0)
Freeing init memory: 104K表明挂载成功了,但是找不到文件,就是前面说的问题。
nfs挂载的常见问题,一搜就能搜到,善用搜索,搜索出错提示信息就能找到。
内核编译可能遇到的问题:
Can't find default configuration "arch/x86/configs/versatile_defconfig"!
export ARCH=arm
export CROSS_COMPILE=arm-angstrom-linux-gnueabi- 或者arm-linux-gnueabi- 或者arm-elf-,看你用的是什么,把gcc去掉,用前面的,
如果你是4核8线程cpu,可以用 make -j8 当然 2核四线程 make -j4 多少线程就用几,这样很快。
make help查看帮助 不是make --help,后者是make的帮助,而不是编译内核的帮助。
内核目录里面的Documention目录里面有很多帮助文档,比如 /Documentation/filesystems/nfs/nfsroot.txt,你可以看到nfs启动的详细帮助。

相关文档
最新文档