Qemu命令行教程,看完包会
Linux User001
—
- Qemu的官网在这里,各位同学可以在官网找到自己需要的版本和官方文档
- 友情链接:作者自制的只适用于Debian和基于Debian操作系统的qemu脚本生成器
下载和安装
Linux
$ git clone https://mirrors.bfsu.edu.cn/git/qemu.git
$ cd qemu
$ ./configure
$ make && sudo make install
Windows
—
基本命令
创建磁盘
::创建磁盘
> 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
答案:<b>C</b>。简单!
正式使用
- 我们知道,想要让一台像电脑一台
破烂
工作起来,我们必须准备以下几种硬件: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