Qemu命令行教程,看完包会
Linux User001
下载和安装
Linux
$ git clone https://mirrors.bfsu.edu.cn/git/qemu.git
$ cd qemu
$ ./configure
$ make && sudo make install
Windows
基本命令
- 目前Qemu提供了以下架构:i386,x86_64,s390x,aarch64&aarch64w,ppc,ppc64,mips,mips64,riscv32,riscv64,arm&armw。但是笔者实力有限,只能写出i386和x86_64的较为完整的命令行,还请见谅
首先,要使用Qemu,磁盘是必不可少的,
qemu-img
提供了新建和管理虚拟磁盘的方式这里以Windows为例,Linux或者MacOS同理,只需把.exe去掉即可
> qemu-img.exe [commands] [options]
创建磁盘
::创建磁盘 > qemu-img.exe create [options] [files] [size] ::[options] : -q -> 静默输出 ::-f [format] -> 格式化&类型,支持的格式化有blkdebug blklogwrites blkverify bochs cloop ::compress copy-before-write copy-on-read dmg file ftp ftps host_device http https luks ::nbd null-aio null-co parallels preallocate qcow qcow2 qed quorum raw replication ::throttle vdi vhdx vmdk vpc vvfat ::-o [option] -> 向磁盘创建命令传入参数,不同的格式化会有不同的参数,各位可以使用 > qemu-img.exe -f [format] -o ? ::获得帮助
示例
> qemu-img.exe create -f raw virtdisk.img -o stze=40G ::创建一个40G的名字叫virtdisk.img,的硬盘,并且格式为raw ::或者也可以不用-o > qemu-img.exe create -f raw virtdisk.img 40G
转换磁盘格式
::转换磁盘格式 > qemu-img.exe convert -f [input_format] -O [output_format]
- 很好,你已经掌握了Qemu磁盘创建了,那么请听题:
我要创建一个能在Hyper-V,VirtualBox,Qemu都通用的一个40GB的虚拟磁盘,名字就叫virtual,请问我要创建的文件全名和磁盘格式应该选什么?
A、virtual.img,raw B、virtual.qcow2,qcow2 C、virtual.vhdx,vpc D、virtual.vdi,vpc
答案:C。简单!
正式使用
- 我们知道,想要让一台像电脑一台
破烂
工作起来,我们必须准备以下几种硬件:CPU、主板、电源、内存、硬盘、基本输入输出系统(BIOS)、显卡和系统,但如果我们再进一步,打造的应该是一台电脑,那么我们还需要声卡、网卡、光驱、软驱(?)、显示器。所以,开始qemu之旅!
内部设备
CPU、主板(芯片组)、内存
- CPU:qemu功能强大,提供了数十种CPU和主板模拟,我们只需要用
-cpu [model]
选择一个型号,如果不知道自己编译或安装的qemu能支持什么型号,可以用-cpu ?
查询。 - 主板:主板同理,我们只需要
-M [model]
即可选择一个芯片组,-M ?
也可以查询支持的芯片组型号 - 内存:这个很简单,但是要注意的是,指定内存所用的命令是
-m [number]
,小心别跟-M
搞混了
总结
$ qemu-system-x86_64 -cpu ?
#查询可用的CPU型号
$ qemu-system-x86_64 -cpu EPYC
#选用一个EPYC的CPU
$ qemu-system-x86_64 -M ?
#查询可用的芯片组型号
$ qemu-system-x86_64 -M q35
#选用一个q35的芯片组
$ qemu-stsrem-x86_64 -m 1024
#为虚拟机提供1024MiB的内存
存储设备
- 存储设备:存储设备一共有三种:硬盘、软盘和光驱。
软盘:
-fda [file]
示例:$ qemu-system-x86_64 -fda image.img #选择一个名为image.img的软盘镜像
光盘:
-cdrom [file]
示例:$ qemu-system-x86_64 -cdrom winxp.iso #选择一个名为winxp.iso的光盘镜像
硬盘:
-hda [file]
或-drive if=none,file=[file],id=[id],format=[format]
示例:$ qemu-system-x86_64 -hda win7.qcow2 #选择一个名为win7.qcow2的虚拟磁盘
拟外部设备
在这里,拟外部设备有网卡、声卡、显卡、显示器和哑终端(串口传输)。
声卡:很简单,我们只需要用-soundhw [model]
即可启用声卡,同样,-soundhw ?
可以查询支持的声卡型号,也可以直接用-enable-audio
来直接启用声卡。
显卡:同样简单,-vga [model]
即可启用显卡,-vga help
可以查询可用的显卡。
网卡:相对声卡和显卡,网卡配置比较麻烦,所以敲黑板!
用过libmo emulator的同学应该都知道,它的网卡有两种模式:user和tap,所以
$ qemu-system-x86_64 -net [block]
就是设置网卡模式的参数,同样-netdev help
可以查询所支持的网卡模式,当然,在Linux系统,网卡模式是由网络回环块设备控制的,所以在Linux查询得到的结果应该是比Windows多的。
下一个
$ qemu-system-x86_64 -netdev [block],id=[id]
这个很好理解,就是网卡名称.
继续
$ qemu-system-x86_64 -netdev user,id=[id] -net nic #注意,nic是必填项,指的是网卡类型为网络接口卡(Network Interface Card)
很好
$ qemu-system-x86_64 -netdev user,id=[id] -net nic,model=[model]
没错,现在我们才能开始网卡型号的配置,同样
-net nic,model=?
可以查询支持的网卡型号。显示器
通过显示器参数,我们可以设置虚拟机屏幕的映射,比如本地或局域网,一般不设置,它会默认显示在本机。
-sdl
可以调用libxsdl来显示一个是由画面的窗口。-vnc :[port]
可以将画面共享到局域网中,我们甚至可以用手机的VNC Viewer来连接。
示例$ qemu-system-x86_64 -vnc :1 #通过端口1将画面投放到局域网中
哑终端
- 我们都知道,Unix系统流行的时候(System V),人们访问Unix主机的资源都是通过大主机加几个串口线连到以前的大水牛电视机,通过它们输出的黑底白字(绿字?)命令行来控制Unix主机。
- 但是,在qemu中,它模拟了两种哑终端,一种是连接到Linux虚拟机的真正的串口哑终端,另一种则是qemu用来管理虚拟机和可移动设备的控制台。
熟悉qemu-arm平台的同学们都知道,启用哑终端的参数应该是
-nographic
。但是我们一旦加入这个参数之后,显示器功能将会被禁用,同时,不支持哑终端的虚拟机在命令行界面将会一片空白,什么也输入不了,甚至是Ctrl-C$ qemu-system-aarch64 -nographic Booting from ROM...^C $
第二种:在我们使用没有前端管理工具的qemu时,可能都为如何更换光盘而烦恼。那么现在,我们就不必烦恼了
$ qemu-system-x86_64 -monitor stdio #从stdio,即standard input output中获得命令行 (qemu) test No Command "test" Found Type "help" For Help
当出现
(qemu)
的时候,就说明这是qemu控制台了
同样,-monitor
也可以投放到局域网中,协议是telnet$ qemu-system-x86_64 -monitor telnet,server,nowait,::[port]
$ telnet 127.0.0.1 [port] (qemu)
Linux内核直接挂载
- 这个功能非常神奇,说实在的,到底是Sea BIOS还是qemu的功劳,作者也不知道。
,反正能用就对了! 试想一下,当我们刚刚编译好了一个内核,比如开机画面的调整或者内核模块的增减,想开机测试一把,该怎么做呢?
正确(错误)示例$ sudo cp vmlinux /boot/vmlinux_new $ sudo cp initrd /boot/initrd_new $ sudo grub-mkconfig -o /boot/grub/grub.cfg $ sudo reboot
不不不,大可不必这么麻烦还风险极大的方法
-kernel
和-initrd
两兄弟:这两个就是用来挂载内核的参数,用法很简单,-kernel [kernel_file]
和-initrd [initramfs_file]
就可以在qemu上成功启动这个内核文件。我们还可以加一个-nographic使用它的哑终端功能。是的,我猜有的同学已经去试过了,无一例外,无论是显示器还是哑终端,我们都只有一个
(initramfs)
的提示符,根本没办法启动系统。先别急,我们看看下面的grub配置文件menuentry "Ubuntu with 5.13 kernel" --class ubuntu { insmod ntfs set root=(hd0,gpt1) echo Loading linux kernel... linux /boot/vmlinuz-5.13 ro quiet root={UUID} echo Loading initramfs... initrd /boot/initrd-5.13 boot }
- 除去ntfs模块的加载及grub的根目录挂载和启动命令,我们不难发现,加载vmlinuz的一行有个
root={UUID}
,这个参数表示告诉内核:“帮我转告给initramfs,它要的文件都在{UUID}这个磁盘里面,管够!”那我们该如何给qemu添加内核参数呢? -append [options]
:这个参数就是qemu的黑科技:将参数传入内核,但是[options]必须要加双引号,所以上面的配置文件就能写成$ qemu-system-x86_64 -kernel vmlinuz-5.13 -initrd initrd-5.13 -append "ro quiet root={UUID}" -m 2048
BIOS和启动
BIOS
- BIOS(Basic Input Output System)全程叫基本输入输出系统,它用于掌管系统设备和它们的状态。又因为引导方式的不同,我们通常会把BIOS分成两种:Legacy和UeFI,这里不再多讲。
- OVMF是一个qemu下的UEFI BIOS项目,它配合TianoCore写出了许多能在qemu使用的UEFI BIOS固件,其中这里可以下载32位和64位的固件,我们要感谢他们!
-bios [bios_file]
:是的,很简单,不过我们也可以用-pflash [bios_file]
来指定。按F2可打开TianoCore BIOS的设置
启动
- 非常简单,根本不用学。它根据以前的Windows计算机(想想我这里为什么说计算机而不是电脑)的基本配置来决定的
- 这里我给出了一个表格,方便大家来写启动项参数,其中
-boot [options]
即可更换启动项
[options] | a | b | c | d |
---|---|---|---|---|
动作 | 软盘1 | 软盘2 | 硬盘 | 光盘 |
$ qemu-system-x86_64 -boot c -nographic
Booting from Hand Disk...
注意:在挂载了内核之后,-boot参数就会被禁用,此时的第一启动项永远都是内核
END
评论 (0)