虚拟运行环境搭建
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
虚拟运行环境搭建
一、QEMU虚拟机介绍
QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。
它与Bochs,PearPC 近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。
经由kqemu这个开源的加速器,QEMU能模拟至接近真实电脑的速度。
QEMU有两种主要运作模式:
User mode模拟模式,亦即是使用者模式。
QEMU能启动那些为不同中央处理器编译的Linux程序。
而Wine及Dosemu是其主要目标。
System mode模拟模式,亦即是系统模式。
QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。
它使得为系统源代码进行测试及除错工作变得容易。
其亦能用来在一部主机上虚拟数部不同虚拟电脑。
二、安装QEMU虚拟机
如果是在Debian系统中,使用apt-get install命令安装qemu软件包即可,相关依赖的包也会一并安装。
sudo apt-get install qemu
注意:安装qemu的同时,系统会选择与之关联的其他程序的安装。
如果是在Ubuntu系统中,则还要使用apt-get install命令安装qemu-kvm qemu-kvm-extras软件包。
sudo apt-get install qemu qemu-kvm qemu-kvm-extras
安装完成后通过命令qemu --help/--version可以查看安装情况。
三、QEMU虚拟机常用选项
一般选项
-M machine
选择模拟的机器(我们可以输入-M?提到一个模拟的机器列表)
-fda file
-fdb file
使用file作为软盘镜像.我们也可以通过将/dev/fd0作为文件名来使用主机软盘.
-hda file
-hdb file
-hdc file
-hdd file
使用file作为硬盘0,1,2,3的镜像.
-cdrom file
使用文件作为CD-ROM镜像(但是我们不可以同时使用'-hdc'和'-cdrom').我们可以通过使用'/dev/cdrom'作为文件名来使用主机的CD-ROM.
-boot [a|c|d]
由软盘(a),硬盘(c)或是CD-ROM(d).在默认的情况下由硬盘启动.
-snapshot
写入临时文件而不是写入磁盘镜像文件.在这样的情况下,并没有写回我们所使用的磁盘镜像文件.然而我们却可以通过按下C-a s来强制写回磁盘镜像文件.
-m megs
设置虚拟内存尺寸为megs M字节.在默认的情况下为128M.
-smp n
模拟一个有n个CPU的SMP系统.为PC机为目标,最多可以支持255个CPU.
-nographic
在通常情况下,Qemu使用SDL来显示VGA输出.使用这个选项,我们可以禁止所有的图形输出,这样Qemu只是一个简单的命令行程序.模拟的串口将会重定向到命令行.所以,我们仍然可以在Qemu平台上使用串口命令来调试Linux内核.
-k language
使用键盘布局语言(例如fr为法语).这个选项只有在不易得到PC键盘的情况下使用.
我们在PC/Linux或是PC/Windows主机不需要使用这个选项.默认的为en-us,可用的布局如下:
ar de-ch es fo fr-ca hu ja mk no pt-br sv
da en-gb et fr fr-ch is lt nl pl ru th
de en-us fi fr-be hr it lv nl-be pt sl tr
-audio-help
这个选项将会显示声音子系统的帮助:驱动列表以及可调用的参数.
-soundhw card1,card2 .... or -soundhw all
允许声音并选择声音硬件.使用?可以列出所有可用的声音硬件
qemu -soundhw sb16,adlib hda
qemu -soundhw es1370 hda
qemu -soundhw all hda
qemu -soundhw ?
-localtime
设置时钟为本地时间(默认为UTC时间).如果在MS-DOS或是Windows上这个选项则需要正确的日期.
-full-screen
以全屏方式启动.
-pidfile file
在file文件中存许Qemu的进程PID.如果我们是由脚本启动的,这个选项是相当有用的.
-win2k-hack
当安装Windows 2000时可以使用这个选项来避免磁盘错误.在安装上Windows 2000系统,我们就不再需要这个选项(这个选项降低IDE的传输速度).
USB选项
-usb
允许USB驱动(很快就将成为默认的选项)
-usbdevice devname
添加USB设备名.我们可以查看监视器命令usb_add来得到更为详细的信息.
网络选项
-net nic[,vlan=n][,macaddr=addr]
创建一个新的网卡并与VLAN n(在默认的情况下n=0)进行连接.在PC机上,NIC当前为NE2000.作为可选项的项目,MAC地址可以进行改变.如果没有指定-net选项,则会创建一个单一的NIC.
-net user[,vlan=n]
使用用户模式网络堆栈,这样就不需要管理员权限来运行.如果没有指定-net选项,这将是默认的情况.
-net tap[,vlan=n][,fd=h][,ifname=name][,script=file]
将TAP网络接口name与VLAN n进行连接,并使用网络配置脚本file进行配置.默认的网络配置脚本为/etc/qemu-ifup.如果没有指定name,OS 将会自动指定一个.fd=h 可以用来指定一个已经打开的TAP主机接口的句柄.例如:
qemu linux.img -net nic -net tap
下面的是一个更为复杂的例子(两个NIC,每一个连接到一个TAP设备):
qemu linux.img -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
-net nic,vlan=1 -net tap,vlan=1,ifname=tap1
-net socket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]
使用TCP socket 将VLAN n与远程的另一个Qemu虚拟机的VLAN进行连接.如果指定了listen,Qemu将在port端口监听连入请求(host是可选的), connect可以用来使用listen选项与另一个Qemu实例进行连接.fd=h指定了一个已经打开的TCP socket.
例如:
# launch a first QEMU instance
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net
socket,listen=:1234
# connect the VLAN 0 of this instance to the VLAN 0 of the first instance qemu linux.img -net nic,macaddr=52:54:00:12:34:57 -net
socket,connect=127.0.0.1:1234
-net socket[,vlan=n][,fd=h][,mcast=maddr:port]
创建一个VLAN n,并使用UDP 多址通信套掊口与其他的QEMU虚拟机进行共享,
尤其是对于每一个使用多址通信地址和端口的QEMU使用同一个总线. 在这里我们要注意以下几点:
∙几个QEMU可以运行在不同的主机上但却使用同一个总线(在这里假设为这些主机设置了正确的多址通信)
∙mcast支持是与用户模式Linux相兼容的.
使用fd=h指定一个已经打开的UDP 多址通信套接口.
例如:
# launch one QEMU instance
qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net
socket,mcast=230.0.0.1:1234
# launch another QEMU instance on same "bus"
qemu linux.img -net nic,macaddr=52:54:00:12:34:57 -net
socket,mcast=230.0.0.1:1234
# launch yet another QEMU instance on same "bus"
qemu linux.img -net nic,macaddr=52:54:00:12:34:58 -net
socket,mcast=230.0.0.1:1234
下面的为用户模式Linux的例子:
# launch QEMU instance (note mcast address selected is UML's default) qemu linux.img -net nic,macaddr=52:54:00:12:34:56 -net
socket,mcast=239.192.168.1:1102
# launch UML
/path/to/linux ubd0=/path/to/root_fs eth0=mcast
-net none
表明没有网络设备需要进行配置.如果没有指定-net选项,则会用来覆盖活跃的默认配置.
-tftp prefix
当使用用户模式网络堆栈,激活一个内置的TFTP服务器.所有的以prefix开始的文件将会使用一个TFTP客户端从主机下载到本地.在本地的TFTP客户端必须以二进制模式进行配置(使用Unix的TFTP客户端的bin命令).在客户机上的主机IP地址如通常的10.0.2.2.
-smb dir
-redir [tcp|udp]:host-port:[guest-host]:guest-port
当使用用户模式网格栈,将连接到主机端口host-port的TCP或是UDP 连接重定向到客户机端口guest-port上。
如果没有指定客户机端口,他的值为10.0.2.15(由内建的DHCP服务器指定默认地址)。
例如:要重定向从screen 1到客户机screen 0的X11连接,我们可以使用下面的方法:
# on the host
qemu -redir tcp:6001::6000 [...]
# this host xterm should open in the guest X11 server
xterm -display :1
To redirect telnet connections from host port 5555 to telnet port on the guest, use the following:
# on the host
qemu -redir tcp:5555::23 [...]
telnet localhost 5555
然后当我们在主机telnet localhost 5555上使用时,我们连接到了客户机的telnet服务器上。
Linux启动选项
当我们使用这些选项时,我们可以使用一个指定的内核,而没有将他安装在磁盘镜像中。
这对于简单的测试各种内核是相当有用的。
`-kernel bzImage'
使用bzImage作为内核映像。
`-append cmdline'
使用cmdline作为内核的命令行。
`-initrd file'
使用file作为初始的ram磁盘。
调试选项
`-serial dev'
重定向虚拟串到主机的设备dev。
可用的设备如下:
vc
虚拟终端
pty
(Linux)伪TTY(自动分配一个新的TTY)
null
空设备
/dev/XXX"
(Linux)使用主机的tty。
例如,'/dev/ttyS0'。
主机的串口参数通过模拟进行设置。
/dev/parportN
(Linux)使用主机的并口N。
当前只可以使用SPP的并口特征。
file:filename
将输出写入到文件filename中。
没有字符可读。
stdio
(Unix)标准输入/输出
pipe:filename
(Unix)有名管道filename
在图形模式下的默认设备为vc,而在非图形模式下为stdio.这个选项
可以被多次使用,最多可以模拟4个串口。
'-parallel dev'
重定向虚拟并口到主机的设备dev(与串口相同的设备)。
在Linux主机上,`/dev/parportN'可以被用来使用与相应的并口相连的硬件设备。
这个选项可以使用多次,最多可以模拟3个并口。
`-monitor dev'
重定向临视器到主机的设备dev(与串口相同的设备)。
在图形模式下
的默认设备为vc,而在非图形模式下为stdio。
'-s'
等待gdb连接到端口1234.
`-p port'
改变gdb连接端口。
`-S'
在启动时并不启动CPU(我们必须在监视器中输入'c')
'-d'
输出日志到/tmp/qemu.log
`-hdachs c,h,s,[,t]'
强制硬盘0的物理参数(1 <= c <= 16383, 1 <= h <= 16, 1 <= s <=63),并且可以选择强制BIOS的转换模式(t=none, lba or auto).通常QEMU可以检测这些参数.这个选项对于老的MS-DOS磁盘映像是相当有用的.
`-std-vga'
模拟一个Bochs VBE扩展的标准VGA显卡(默认情况下为Cirrus Logic GD5446 PCI VGA)
`-loadvm file'
从一个保存状态启动.
组合键
在图形模拟时,我们可以使用下面的这些组合键:
Ctrl-Alt-f
全屏
Ctrl-Alt-n
切换虚拟终端'n'.标准的终端映射如下:
∙n=1 : 目标系统显示
∙n=2 : 临视器
∙n=3 : 串口
Ctrl-Alt
抓取鼠标和键盘
在虚拟控制台中,我们可以使用Ctrl-Up, Ctrl-Down, Ctrl-PageUp 和
Ctrl-PageDown在屏幕中进行移动.
在模拟时,如果我们使用`-nographic'选项,我们可以使用Ctrl-a h来得到终端命令:
Ctrl-a h
打印帮助信息
Ctrl-a x
退出模拟
Ctrl-a s
将磁盘信息保存入文件(如果为-snapshot)
Ctrl-a b
发出中断
Ctrl-a c
在控制台与监视器进行切换
Ctrl-a Ctrl-a
发送Ctrl-a
磁盘映像
从0.6.1起,QEMU支持多种磁盘映像格式,包括增长的磁盘映像,压缩与加密的磁盘映像.
我们可以用下面的命令来创建一个磁盘映像:
qemu-img create myimage.img mysize
这里myimage.img是磁盘映像的文件名,而mysize是以K表示的尺寸.我们可以使用M前缀来使用M表示尺寸或是G作为前缀使用G表示尺寸.
qemu-img选项
可以支持下面的一些命令:
`create [-e] [-b base_image] [-f fmt] filename [size]'
`commit [-f fmt] filename'
`convert [-c] [-e] [-f fmt] filename [-O output_fmt] output_filename' `info [-f fmt] filename
命令参数
filename
磁盘映像文件名.
base_image
只读的磁盘映像,可以作为拷贝到写映像的基础.写映像上的拷贝只存储修改的数据.
fmt
磁盘映像格式.在大多数情况下可以自动检测.可以支持下面的格式: ∙raw
raw 磁盘格式(默认).这种格式有简单并且易于移植到其他模拟器的优
点.如果我们的文件系统支持holes(例如在Linux上的ext2或是 ext3),然后只有写入的部分保持空白.使用qemu-img info来得到映像使用的实际的大小或是在Unix/Linux上使用 ls -ls.
∙qcow
QEMU映像格式.最通用的格式.使用他可以获得较小的映像(如果我们的文件系统不支持holes,例如在Windows上,这是相当有用的),可以选用AES加密或是基于zlib的压缩.
∙cow
在写映像格式上的用户模式的Linux拷贝.在QEMU中作为增长的映像格式使用.这个选项只是为了与以前版本的兼容,并不能在Win32上使用.
∙vmdk
VMware 3 或是 4 兼容的映像格式.
∙cloop
Linux压缩的循环映像,重用直接压缩的CD-ROM映像.
∙size
以K表示的磁盘映像的尺寸.同时可以支持M或是G作为前缀.
∙output_filename
目的磁盘映像文件名
∙output_fmt
目标格式
∙-c
表明目标映像必须是压缩的(只是qcow格式)
-e
表明目标映像必须是加密的(只是qcow格式)
四、安装armel架构的debian
可以先从debian提供给个人的网站上下载网友已经制作完成的镜像来使用。
/~aurel32/qemu/armel/
其中下载以下的文件即可:
README.txt
debian_lenny_armel_small.qcow2
initrd.img-2.6.26-1-versatile
vmlinuz-2.6.26-1-versatile
将这些文件通过samba服务器或U盘传入Debian中,保存地址~/armel
使用以下命令即可启动armel架构的虚拟机:
qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.26-1-versatile -initrd initrd.img-2.6.26-1-versatile -hda debian_lenny_armel_small.qcow2 -append "root=/dev/sda1"
根据提示,使用root用户登录,密码为:root
通过以下命令查看CPU信息:more /proc/cpuinfo
more /proc/meminfo
这个qemu映像是德国人做的,都使用了德语的键盘映射和语言环境。
因此需要重新配置一下环境数据。
安装locales,使用dpkg-reconfigure配置它,选上en_US(iso8859-1)
dpkg-reconfigure locales
dpkg-reconfigure console-data
选择使用内核的键盘映射就好了。
另外,其软件包的源也是来自德国的,建议改成美国的。
五、配置QEMU网络连接
1.安装QEMU的虚拟网卡
执行以下命令安装qemu的虚拟网桥工具:
sudo apt-get install bridge-utils uml-utilities
2.QEMU的两种联网方法
QEMU虚拟机可以通过NA T、TUN/TAP虚拟网卡与外界通信,两种通信方式各有优缺点:
user mode network :
这种方式实现虚拟机上网很简单,类似vmware里的nat,qemu启动时加入-user-net参数,虚拟机里使用dhcp方式,即可与互联网通信,但是这种方式虚拟机与主机的通信不方便。
tap/tun network :
这种方式要比user mode复杂一些,但是设置好后虚拟机<-->互联网虚拟机<-->主机通信都很容易,这种方式设置上类似vmware的host-only,qemu使用tun/tap设备在主机上增
加一块虚拟网络设备(tun0),然后就可以象真实网卡一样配置它.
一般来说虚拟机用NA T方式连接Internet,用虚拟网卡或网桥连接内部局域网。
具体到qemu的网络设置上,我们可通过编写/etc/qemu-ifup和/etc/qemu-ifdown两个SHELL脚本来完成。
3.QEMU的网络设置脚本
当qemu启动时,默认会执行/etc/qemu-ifup脚本,因此创建文件/etc/qemu-ifup,内容如下:
#!/bin/sh
## 获取原来主系统eth0 的IP和网关
unset LANG
IP=`ifconfig eth0|grep "inet addr"|awk '{print $2}'|sed 's/addr://'`
GA TEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'`
## 删除eth0 的IP
ifconfig eth0 del $IP
## 激活tap0 ($1 是qemu传递过来的网卡名称,即tap0)
ifconfig $1 up
## 停止并删除存在的网桥
ifconfig br0 down >/dev/null 2>&1
brctl delbr br0 >/dev/null 2>&1
## 添加网桥接口br0
brctl addbr br0
## 将eth0 加入网桥
brctl addif br0 eth0
## 将tap0 加入网桥
brctl addif br0 $1
## 启动网桥
ifconfig br0 $IP up
IP=`echo $IP|awk -F. '{printf "%d.%d.%d.%d",$1,$2,$3,18}'`
ifconfig eth0 $IP up
## 添加默认路由
route add default gw $GA TEWAY
当qemu关闭时,默认会执行/etc/qemu-ifdown脚本,因此创建文件/etc/qemu-ifdown,内容如下:
#!/bin/sh
##如果关闭了虚拟机,需要恢复原来的网络设置
unset LANG
IP=`ifconfig br0|grep "inet addr"|awk '{print $2}'|sed 's/addr://'`
GA TEWAY=`route -n|grep ^0.0.0.0|awk '{print $2}'`
ifconfig br0 $IP down
brctl delbr br0
ifconfig eth0 $IP up
route add default gw $GA TEWAY
需要注意的是脚本中的“eth0”应该对应Host机的一张网卡,这张网卡可以是虚拟网卡,也可以是真实的网卡。
如果此时“eth0”是NA T方式的虚拟网卡,那么target和host将在同一个虚拟网络中,此网络外部局域网是访问不到的,但内网的机器能够访问到外部局域网。
如果此时“eth0”是虚拟网桥或真实的网卡,那么target和host将在同一个真实的局域网中,此网络将成为外部局域网的一部分,同时分配的IP地址也和外部局域网一样,都在同一网段内。
4.启动QEMU设置的网络
使用以下命令启动带网卡的虚拟机:
sudo qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.26-1-versatile -initrd initrd.img-2.6.26-1-versatile -hda debian_lenny_armel_small.qcow2 -append "root=/dev/sda1" -net nic -net tap -localtime
5.debian-armel的网络设置
从网站上下载的debian-armel镜像中,dhcp-client版本比较老旧,需要升级后才能正常工作。
请先使用apt-get update更新源的信息,然后在执行apt-get install dhcp-client。
安装升级完成后,重启虚拟机就可以相互ping通虚拟机和Host主机了。
并且两个相同都可以同时访问外网。
六、常用数据通信方式
telnet+zmodem方式
在QEMU虚拟机的armel-debian中安装:
sudo apt-get install telnetd lrzsz
在Debian中安装:
sudo apt-get install telnet zssh lrzsz
首先通过telnet登录到target,并切换到指定目录,然后通过sz命令导出文件,rz命令传入文件。
详细参考实践操作:
记住快捷键Ctrl+2,从在远程终端切换到本地终端。
记住快捷键Ctrl+D,从在本地终端切换到远程终端。
上面是从host向target发送文件,下面则是从target向host发送文件。
注意:操作时,先执行发送命令,后执行接收命令。
ftp方式
在QEMU虚拟机的armel-debian中安装:
sudo apt-get install vsftpd ftp
在Debian中安装:
sudo apt-get install vsftpd ftp
修改配置文件/etc/vsftpd.conf
打开以下参数:
local_enable=YES
write_enable=YES
chroot_local_user=YES
重新启动vsftpd:/etc/init.d/vsftpd restart
注意:put和get命令执行的方向。
put是将文件传入target,get是从target取文件。
nfs 方式
在QEMU虚拟机的armel-debian中安装:
sudo apt-get install nfs-common
在Debian中安装:
sudo apt-get install nfs-kernel-server
首先,在host设置/etc/exports配置文件。
然后重启nfs-server服务器。
最后在target中挂接nfs目录。
以上三种是较为常见的通信方式,另外还有SSH通信,我们将会在后续课程中详细介绍。
七、在虚拟机中执行程序
现在就可以将我们之前编译好的armel版本程序下载到虚拟机执行了,大家试试看。