虚拟运行环境搭建一、QEMU虚拟机介绍QEMU是一套由FabriceBellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由kqemu这个开源的加速器,QEMU能模拟至接近真实电脑的速度。QEMU有两种主要运作模式:Usermode模拟模式,亦即是使用者模式。QEMU能启动那些为不同中央处理器编译的Linux程序。而Wine及Dosemu是其主要目标。Systemmode模拟模式,亦即是系统模式。QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。它使得为系统源代码进行测试及除错工作变得容易。其亦能用来在一部主机上虚拟数部不同虚拟电脑。二、安装QEMU虚拟机如果是在Debian系统中,使用apt-getinstall命令安装qemu软件包即可,相关依赖的包也会一并安装。sudoapt-getinstallqemu注意:安装qemu的同时,系统会选择与之关联的其他程序的安装。如果是在Ubuntu系统中,则还要使用apt-getinstall命令安装qemu-kvmqemu-kvm-extras软件包。sudoapt-getinstallqemuqemu-kvmqemu-kvm-extras安装完成后通过命令qemu--help/--version可以查看安装情况。三、QEMU虚拟机常用选项一般选项-Mmachine选择模拟的机器(我们可以输入-M?提到一个模拟的机器列表)-fdafile-fdbfile使用file作为软盘镜像.我们也可以通过将/dev/fd0作为文件名来使用主机软盘.-hdafile-hdbfile-hdcfile-hddfile使用file作为硬盘0,1,2,3的镜像.-cdromfile使用文件作为CD-ROM镜像(但是我们不可以同时使用'-hdc'和'-cdrom').我们可以通过使用'/dev/cdrom'作为文件名来使用主机的CD-ROM.-boot[a|c|d]由软盘(a),硬盘(c)或是CD-ROM(d).在默认的情况下由硬盘启动.-snapshot写入临时文件而不是写入磁盘镜像文件.在这样的情况下,并没有写回我们所使用的磁盘镜像文件.然而我们却可以通过按下C-as来强制写回磁盘镜像文件.-mmegs设置虚拟内存尺寸为megsM字节.在默认的情况下为128M.-smpn模拟一个有n个CPU的SMP系统.为PC机为目标,最多可以支持255个CPU.-nographic在通常情况下,Qemu使用SDL来显示VGA输出.使用这个选项,我们可以禁止所有的图形输出,这样Qemu只是一个简单的命令行程序.模拟的串口将会重定向到命令行.所以,我们仍然可以在Qemu平台上使用串口命令来调试Linux内核.-klanguage使用键盘布局语言(例如fr为法语).这个选项只有在不易得到PC键盘的情况下使用.我们在PC/Linux或是PC/Windows主机不需要使用这个选项.默认的为en-us,可用的布局如下:arde-chesfofr-cahujamknopt-brsvdaen-gbetfrfr-chisltnlplruthdeen-usfifr-behritlvnl-beptsltr-audio-help这个选项将会显示声音子系统的帮助:驱动列表以及可调用的参数.-soundhwcard1,card2....or-soundhwall允许声音并选择声音硬件.使用?可以列出所有可用的声音硬件qemu-soundhwsb16,adlibhdaqemu-soundhwes1370hdaqemu-soundhwallhdaqemu-soundhw?-localtime设置时钟为本地时间(默认为UTC时间).如果在MS-DOS或是Windows上这个选项则需要正确的日期.-full-screen以全屏方式启动.-pidfilefile在file文件中存许Qemu的进程PID.如果我们是由脚本启动的,这个选项是相当有用的.-win2k-hack当安装Windows2000时可以使用这个选项来避免磁盘错误.在安装上Windows2000系统,我们就不再需要这个选项(这个选项降低IDE的传输速度).USB选项-usb允许USB驱动(很快就将成为默认的选项)-usbdevicedevname添加USB设备名.我们可以查看监视器命令usb_add来得到更为详细的信息.网络选项-netnic[,vlan=n][,macaddr=addr]创建一个新的网卡并与VLANn(在默认的情况下n=0)进行连接.在PC机上,NIC当前为NE2000.作为可选项的项目,MAC地址可以进行改变.如果没有指定-net选项,则会创建一个单一的NIC.-netuser[,vlan=n]使用用户模式网络堆栈,这样就不需要管理员权限来运行.如果没有指定-net选项,这将是默认的情况.-nettap[,vlan=n][,fd=h][,ifname=name][,script=file]将TAP网络接口name与VLANn进行连接,并使用网络配置脚本file进行配置.默认的网络配置脚本为/etc/qemu-ifup.如果没有指定name,OS将会自动指定一个.fd=h可以用来指定一个已经打开的TAP主机接口的句柄.例如:qemulinux.img-netnic-nettap下面的是一个更为复杂的例子(两个NIC,每一个连接到一个TAP设备):qemulinux.img-netnic,vlan=0-nettap,vlan=0,ifname=tap0\-netnic,vlan=1-nettap,vlan=1,ifname=tap1在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行与操作系统上的软件提供与硬件的网络设备完全相同的功能。TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TNU/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。-netsocket[,vlan=n][,fd=h][,listen=[host]:port][,connect=host:port]使用TCPsocket将VLANn与远程的另一个Qemu虚拟机的VLAN进行连接.如果指定了listen,Qemu将在port端口监听连入请求(host是可选的),connect可以用来使用listen选项与另一个Qemu实例进行连接.fd=h指定了一个已经打开的TCPsocket.例如:#launchafirstQEMUinstanceqemulinux.img-netnic,macaddr=52:54:00:12:34:56-netsocket,listen=:1234#connecttheVLAN0ofthisinstancetotheVLAN0ofthefirstinstanceqemulinux.img-netnic,macaddr=52:54:00:12:34:57-netsocket,connect=127.0.0.1:1234-netsocket[,vlan=n][,fd=h][,mcast=maddr:port]创建一个VLANn,并使用UDP多址通信套掊口与其他的QEMU虚拟机进行共享,尤其是对于每一个使用多址通信地址和端口的QEMU使用同一个总线.在这里我们要注意以下几点:几个QEMU可以运行在不同的主机上但却使用同一个总线(在这里假设为这些主机设置了正确的多址通信)mcast支持是与用户模式Linux相兼容的.使用fd=h指定一个已经打开的UDP多址通信套接口.例如:#launchoneQEMUinstanceqemulinux.img-netnic,macaddr=52:54:00:12:34:56-netsocket,mcast=230.0.0.1:1234#launchanotherQEMUinstanceonsamebusqemulinux.img-netnic,macaddr=52:54:00:12:34:57-netsocket,mcast=230.0.0.1:1234#launchyetanotherQEMUinstanceonsamebusqemulinux.img-netnic,macaddr=52:54:00:12:34:58-netsocket,mcast=230.0.0.1:1234下面的为用户模式Linux的例子:#launchQEMUinstance(notemcastaddressselectedisUML'sdefault)qemulinux.img-netnic,macaddr=52:54:00:12:34:56-netsocket,mcast=239.192.168.1:1102#launchUML/path/to/linuxubd0=/path/to/root_fseth0=mcast-netnone表明没有网络设备需要进行配置.如果没有指定-net选项,则会用来覆盖活跃的默认配置.-tftpprefix当使用用户模式网络堆栈,激活一个内置的TFTP服务器.所有的以prefix开始的文件将会使用一个TFTP客户端从主机下载到本地.在本地的TFTP客户端必须以二进制模式进行配置(使用Unix的TFTP客户端的bin命令).在客户机上的主机IP地址如通常的10.0.2.2.-smbdir-redir[tcp|udp]:host-port:[guest-host]:guest-port当使用用户模式网格栈,将连接到主机端口host-port的TCP或是UDP连接重定向到客户机端口guest-port上。如果没有指定客户机端口,他的值为10.0.2.15(由内建的DHCP服务器指定默认地址)。例如:要重定向从screen1到客户机screen0的X11连接,我们可以使用下面的方法:#onthehostqemu-redirtcp:6001::6000[...]#thishostxtermshouldopenintheguestX11serverxterm-display:1Toredirecttelnetconnectionsfromhostport5555totelnetportontheguest,usethefollowing:#onthehostqemu-redirtcp:5555::23[...]telnetlocalhost5555然后当我们在主机telnetlocalhost5555上使用时,我们连接到了客户机的telnet服务器上。Linux启动选项当我们使用这些选项时,我们可以使用一个指定的内核,而没有将他安装在磁盘镜像中。这对于简单的测试各种内核是相当有用的。`-kernelbzImage'使用bzImage作为内核映像。`-appendcmdline'使用cmdline作为内核的命令行。`-initrdfile'使用file作为初始的ram磁盘。调试选项`-serialdev'重定向虚拟串到主机的设备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)有名管道filena