标签搜索

qemu保姆级教程,看完包会

Linux User001
2022-07-16 / 0 评论 / 5 阅读 / 正在检测是否收录...

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
  • 使用Windows的同学们可以直接下载32位64位

    MacOS
    #HomeBrew
    % brew install qemu
    #MacPorts
    % sudo port install qemu

基本命令

  • 目前Qemu提供了以下架构:i386x86_64,s390x,aarch64&aarch64w,ppcppc64,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的同学应该都知道,它的网卡有两种模式:usertap,所以

$ 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]abcd
动作软盘1软盘2硬盘光盘
$ qemu-system-x86_64 -boot c -nographic

Booting from Hand Disk...
  • 注意:在挂载了内核之后,-boot参数就会被禁用,此时的第一启动项永远都是内核

    END

0

评论 (0)

取消