前因:
因为项目需要,用qemu虚拟机模拟一个ppc64的环境,然后安装Axianux 3.0 SP1 ppc64版本。过程曲折,最后成功了。虽然慢点,但是测试还是可用的。
宿主机环境:ubuntu 11.04,因为我本上装的是11.04,需要哪些包直接升级即可,不需要自己编译了。
qemu:ubuntu11.04源中自带的0.14.50。
||/ 名称 版本 描述
+++-==============-==============-============================================
ii qemu-system 0.14.50-2011.0 QEMU full system emulation binaries
GuestOS:Axianux 3.0 SP1 ppc64。
宿主机环境准备:
找一台配置稍微好点的机器,安装ubuntu11.04,安装完毕之后,可以使用新立得安装kvm、qemu、qemu-system、openssh、xvnc4viewer。如果希望支持pxe,还需要安装kvm-pxe。依赖关系都是自动解决的。
安装完毕可以使用qemu-system-ppc命令创建一台ppc64的虚拟机了。
意外问题1:openbios-ppc不存在。
qemu安装完毕,使用qemu-system-ppc命令时却报出一个错误:没有找到openbios-ppc。
root@fan3838:/vm/kvm# qemu-system-ppc
qemu: hardware error: qemu: could not load PowerPC bios 'openbios-ppc'
CPU £;0:
NIP fffffffc LR 00000000 CTR 00000000 XER 00000000
MSR 00000040 HID0 00000000 HF 00000000 idx 1
TB 00000000 00000000 DECR fffffffe
GPR00 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR04 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR08 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR24 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR28 0000000000000000 0000000000000000 0000000000000000 0000000000000000
CR 00000000 [ - - - - - - - - ] RES ffffffff
FPR00 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR04 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR08 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR20 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR24 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR28 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPSCR 00000000
SRR0 00000000 SRR1 00000000 SDR1 00000000
Aborted
这个问题在网上搜索了一下还是有很多人碰到的,只需要安装openbios-ppc即可。
虽然ubuntu源里面没有这个包,但是从网上海选了一下,有人提供方法:可以使用debian上的相应包。
下载地址如下(ubuntu 11.04可用):
安装完毕,将/usr/share/openbios-ppc/openbios-ppc拷贝到/usr/share/qemu下面。然后执行qemu-system-ppc可以正常打开一个界面,说明ppc可以正常模拟了。
意外问题2:无法从ppc的光盘启动。
首先将Asianux3.0SP1的光盘镜像iso下载到宿主机上,并创建一个img文件当作磁盘
qemu-img create -f qcow2 /opt/ppc.img 8G
然后使用qemu-system-ppc加上参数从光盘启动开始安装。
root@fan3838:/vm/kvm# qemu-system-ppc -hda /opt/ppc.img -cdrom /home/test/Asianux-3-ppc-dvd-200902230051.iso -boot -d
但是按照上面的命令能出现窗口,但是没有任何提示。无法安装,应该是无法从光驱引导。
原因不明。
看网上有人安装ubuntu-ppc版本,并不时使用iso镜像引导,而是使用内核和initrd文件引导,也下载常识一下。
root@fan3838:/vm/kvm# qemu-system-ppc -hda /opt/ppc.img -kernel /tmp/vmlinux -initrd initrd.gz
既然ubuntu0-ppc是可以通过kernel文件正常启动安装界面的,那么Asianux 3.0 SP1也常识用kernel和initrd方式来启动。
root@fan3838:/vm/kvm#mount -oloop /home/test/Asianux-3-ppc-dvd-200902230051.iso /mnt/dc/
root@fan3838:/vm/kvm# cd /mnt/dc
root@fan3838:/mnt/dc# cd ppc/ppc64/
root@fan3838:/mnt/dc/ppc/ppc64# ls
ramdisk.image.gz TRANS.TBL vmlinuz yaboot.conf
root@fan3838:/mnt/dc/ppc/ppc64# qemu-system-ppc -hda /opt/ppc.img -kernel vmlinuz -initrd ramdisk.image.gz
qemu-system-ppc虚拟机里面仍然无法引导启动?这是为何?
后来惯性尝试了一下qemu-system-ppc64,终于看到了期盼已久的安装界面。
root@fan3838:/mnt/dc/ppc/ppc64# qemu-system-ppc64 -hda /opt/ppc.img -kernel vmlinuz -initrd ramdisk.image.gz -cdrom /home/test/Asianux-3-ppc-dvd-200902230051.iso -m 512 -boot d
其实Asiaunx 3.0 SP1 ppc是ppc64位的操作系统,而qemu-system-ppc应该是启动类似苹果系统那样的32位ppc。
正常安装系统:
启动安装已经成功,安装过程没有什么问题,只是慢,特别的慢。
意外问题3:无法从安装好的硬盘启动。
安装完毕之后,却无法从ppc.img启动,刚看到bios相关提示,马上就退出了。
root@fan3838:~# qemu-system-ppc64 -hda /opt/ppc.img -boot c
qemu: fatal: Trying to execute code outside RAM or ROM at 0xfffffffffff088c8
NIP fffffffffff088c8 LR 0000000000000704 CTR fffffffffff088c8 XER
0000000000000000
MSR 8000000000001000 HID0 0000000060000000 HF 8000000000000000 idx 1
TB 00000000 166492027 DECR 4128475370
GPR00 0000000000003030 0000000007de8000 0000000000000000 0000000000000704
GPR04 fffffffffff088c8 fffffffffff02464 0000000000000000 0000000000000000
GPR08 fffffffffff39000 ffffffffffffffff 0000000000000002 000000000000000e
GPR12 0000000000000012 0000000000000000 0000000000000000 0000000000000000
GPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
GPR20 00000000fff36b32 00000000fff35fa1 0000000000000000 00000000fffbbb0c
GPR24 00000000fff36b32 00000000fff35fa1 00000000fffba018 00000000fffc0000
GPR28 0000000000000000 00000000004f4200 0000000000000000 0000000000100200
CR 24000044 [ E G - - - - G G ] RES ffffffffffffffff
FPR00 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR04 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR08 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR12 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR16 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR20 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR24 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPR28 0000000000000000 0000000000000000 0000000000000000 0000000000000000
FPSCR 00000000
SRR0 00000000003f4000 SRR1 0000000000083030 SDR1 0000000007e00000
已放弃
root@fan3838:~#
这个结果让我感觉前面的工作白费了。很沮丧。
从网上搜索了一下,很多人遇到同样的问题,但是没有成熟的解决办法。
第二天。
突然想到:既然能够从kernel启动安装,那么也可以通过kernel正常启动系统阿。
所以指定一个计划:
1、仍然用光盘中的kerenl引导通过iso进入救援模式
2、将已经安装成功的系统里面的kernel文件(vmlinuz/initrd.img)拷贝到宿主机
3、从vmlinuz引导启动
这个想法让我兴奋了半天,因为我还没有解决怎么让qemu和局域网通信,所以只能先创建一个share.img文件,有个30M就够用,然后进入救援模式。
(不过第一次忘记-cdrom参数,说救援模式找不到光盘,白等了半天。第二次犯了致命错误,将hdb1挂载到了/mnt下,导致所有命令都无效,又白费半天劲)
root@fan3838:/home/test# nohup qemu-system-ppc64 -hda /opt/ppc.img -hdb /opt/share.img --kernel /mnt/cdrom/ppc/ppc64/vmlinuz -append "rescue" -initrd /mnt/cdrom/ppc/ppc64/ramdisk.image.gz -cdrom /home/test/Asianux-3-ppc-dvd-200902230051.iso -m 1024M -vnc 172.16.86.114:1 &
--append添加内核参数
-vnc 172.16.86.114:1将界面调用vncserver输出,这样可以实现远程(多人)操作。
进入救援模式,将hdb分区格式化成vfat格式,将hdb1挂载/mnt/123/下面,将/mnt/sysimage/boot下的initrd-2.6.18-53.13AXS3.img、vmlinuz-2.6.18-53.13AXS3和etc/yaboot.conf拷贝的/mnt/123下面。关机后将share.img加到xp的虚拟机里面,结果xp不认,只能在xp里面重新分区格式化,再次将这个share.img文件以救援模式放到ppc里面,将内核和initrd.img拷贝到share.img这个虚拟硬盘中。
将share.img再次加到xp虚拟机里面,将内核和initrd.img拷贝到宿主机,然后用这内核和initrd.img启动ppc,成功。
root@fan3838:/opt# nohup qemu-system-ppc64 -hda /opt/ppc.img -hdb /opt/share.img --kernel /opt/vmlinuz-2.6.18-53.13AXS3 -append "root=/dev/VolGroup00/LogVol00" -initrd /opt/initrd-2.6.18-53.13AXS3.img -cdrom /home/test/Asianux-3-ppc-dvd-200902230051.iso -m 1024M -vnc 172.16.86.114:1 &
总结:整个过程前后费时5天,主要是硬件配置较差和前期摸索时间较长,遇到中间的3个问题找方法耗时较长。其实这些问题网上早有人遇到并解决了,只是没有人系统的整理过,所以整理出来。其实即使大家按我的过程操作估计也会有意想不到的结果而导致失败。
后记:
为了让GuestOS也能够和局域网通信,所以还需要搞定网络。以网桥的方式来实现,创建网桥的方式:
ifdown eth0
brctl addbr br0
brctl addif br0 eth0
brctl show
ifconfig br0 172.16.86.113 netmask 255.255.248.0
route add default gw 172.16.80.1 dev br0
ifconfig eth0 0.0.0.0 up
ifconfig
GuestOS启动也需要添加相应参数:
nohup qemu-system-ppc64 -hda /opt/qemu-ppc64/ppcnew.img -hdb /opt/qemu-ppc64/share.img --kernel /opt/qemu-ppc64/vmlinuz-2.6.18-53.13AXS3 -append "root=/dev/VolGroup00/LogVol00" -initrd /opt/qemu-ppc64/initrd-2.6.18-53.13AXS3.img -m 1024M -localtime -vnc 172.16.86.114:1 -net nic -net tap,vlan=0,ifname=tap0 -monitor stdio &
测试过程发现GuestOS经常与局域网的网络断开,原因待查。