3. qemu-img命令学习

3.1. 1.QEMU常见操作

qemu-img是QEMU的磁盘管理工具,在完成QEMU源码编译后就会默认编译好qemu-img这个二进制文件。qemu-img也是QEMU/KVM使用过程中一个比较重要的工具。

qemu-img工具的命令行基本用法如下:


qemu-img [standard options] command [command options]

下面的命令行演示了两个转换:

将VMware的vmdk格式镜像转换为KVM可以使用的raw格式的镜像,

将一个raw镜像文件转化为qcow2格式的镜像。


[root@kvm-host ~]# qemu-img convert -O raw my-VMware.vmdk my-kvm.img
#此处并无实际存在vmdk文件,仅演示其命令行操作

[root@kvm-host ~]# qemu-img convert -O qcow2 rhel7.img rhel7-a.qcow2

参考文献:

https://blog.csdn.net/weixin_34185560/article/details/93117304

3.2. 2.QEMU支持的镜像文件格式

3.2.1. 2.1 raw

原始的磁盘镜像格式,也是qemu-img命令默认的文件格式。这种格式的文件的优势在于它非常简单,且非常容易移植到其他模拟器(emulator,QEMU也是一个emulator)上去使用。如果客户机文件系统(如Linux的ext2/ext3/ext4、Windows的NTFS)支持“空洞”(hole),那么镜像文件只有在被写有数据的扇区才会真正占用磁盘空间,从而节省磁盘空间,就如前面用“qemu-img info”命令查看镜像文件信息中看到的那样。

raw格式只有一个参数选项:preallocation。它有3个值:off,falloc,full。

  1. off就是禁止预分配空间,即采用稀疏文件方式,这是默认值。

  2. falloc是qemu-img创建镜像时候调用posix_fallocate()函数来预分配磁盘空间给镜像文件(但不往其中写入数据,所以也能瞬时完成)。

  3. full是除了实实在在地预分配空间以外,还逐字节地写0,所以很慢。

[root@kvm-host ~]# time qemu-img create -f raw test.img -o preallocation=off 100G
Formatting 'test.img', fmt=raw size=107374182400 preallocation=off

real   0m0.003s
user   0m0.001s
sys   0m0.003s

[root@kvm-host ~]# time qemu-img create -f raw test_falloc.img -o preallocation=falloc 10G
Formatting 'test_falloc.img', fmt=raw size=10737418240 preallocation=falloc

real   0m0.041s
user   0m0.001s
sys   0m0.002s

[root@kvm-host ~]# time qemu-img create -f raw test_full.img -o preallocation=full 10G
Formatting 'test_full.img', fmt=raw size=10737418240 preallocation=full

real   1m26.129s
user   0m0.009s
sys      0m7.356s
[root@kvm-host ~]# du -h test*.img
10G      test_falloc.img
10G      test_full.img
0      test.img

在不追求性能的情况下,我们推荐使用默认的off方式。

3.2.2. 2.2 qcow2

qcow2是QEMU目前推荐的镜像格式,它是使用最广、功能最多的格式。它支持稀疏文件(即支持空洞)以节省存储空间,它支持可选的AES加密以提高镜像文件安全性,支持基于zlib的压缩,支持在一个镜像文件中有多个虚拟机快照。

在qemu-img命令中,qcow2支持如下几个选项:

·size,指定镜像文件的大小。等同于qemu-img create-f fmtsize。

·compat(兼容性水平,compatibility level),可以等于0.10或者1.1,表示适用于0.10版本以后的QEMU,或者是1.1版本以后的QEMU。


[root@kvm-host ~]# qemu-img create -f qcow2 -o compat=0.10,size=10G test.qcow2
Formatting 'test.qcow2', fmt=qcow2 size=10737418240 compat=0.10 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
[root@kvm-host ~]# qemu-img info test.qcow2
image: test.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 0.10
    refcount bits: 16

[root@kvm-host ~]# qemu-img create -f qcow2 -o compat=1.1,size=10G test.qcow2
Formatting 'test.qcow2', fmt=qcow2 size=10737418240 compat=1.1 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16
[root@kvm-host ~]# qemu-img info test.qcow2
image: test.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

3.2.3. 3.3 qcow

这是较旧的QEMU镜像格式,现在已经很少使用了,一般用于兼容比较老版本的QEMU。它支持size、backing_file(后端镜像)和encryption(加密)3个选项。

3.2.4. 3.4 vdi

兼容Oracle(Sun)VirtualBox1.1的镜像文件格式(Virtual Disk Image)。

3.2.5. 3.5 vmdk

兼容VMware 4版本以上的镜像文件格式(Virtual Machine Disk Format)。

3.2.6. 3.6 vpc

兼容Microsoft的Virtual PC的镜像文件格式(Virtual Hard Disk format)。

3.2.7. 3.7 vhdx

兼容Microsoft Hyper-V的镜像文件格式。

3.2.8. 3.8 sheepdog

sheepdog项目是由日本NTT实验室发起的、为QEMU/KVM做的一个开源的分布式存储系统,为KVM虚拟化提供块存储。它无单点故障(无类似于元数据服务器的中央节点),方便扩展(已经支持上千个节点数量),配置简单,运维成本较低。总的来说,它具有高可用性、易扩展性、易管理性等优势。sheepdog项目的官方网站为:http://www.osrg.net/sheepdog/

3.3. 3.客户机存储方式

在QEMU/KVM中,客户机镜像文件可以由很多种方式来构建,其中几种如下:

·本地存储的客户机镜像文件。

·物理磁盘或磁盘分区。

·LVM(Logical Volume Management),逻辑分区。

·NFS(Network File System),网络文件系统。

·iSCSI(Internet Small Computer System Interface),基于Internet的小型计算机系统接口。

·本地或光纤通道连接的LUN(Logical Unit Number)。

·GFS2(Global File System 2)。

使用文件来做镜像的优点如下:

1)存储方便,在一个物理存储设备上可以存放多个镜像文件;

2)易用性,管理多个文件比管理多个磁盘、分区、逻辑分区等都要方便;

3)可移动性,可以非常方便地将镜像文件移动到另外一个本地或远程的物理存储系统中去;

4)可复制性,可以非常方便地复制或修改一个镜像文件,从而供另一个新的客户机使用;

5)稀疏文件可以节省磁盘空间,仅占用实际写入过数据的空间;

6)网络远程访问,镜像文件可以方便地存储在通过网络连接的远程文件系统(如NFS)中。

在宿主机中,挂载NFS文件系统,建立qcow2镜像,然后启动客户机演示如下

[root@kvm-host ~]# mount my-nfs:/images /images/

[root@kvm-host ~]# qemu-img create -f qcow2 -o backing_file=/images/linux/ia32e_rhel7.img,size=20G rhel7.qcow2
Formatting 'rhel7.qcow2', fmt=qcow2 size=21474836480 backing_file='/images/linux/ia32e_rhel7.img' encryption=off cluster_size=65536


[root@kvm-host ~]# qemu-system-x86_64 -smp 2 -m 1024 -net nic -net tap -hda rhel7.qcow2 -vnc :0 -daemonize

3.4. 4.图形显示

3.4.1. 4.1 SDL的使用

SDL(Simple DirectMedia Layer)是一个用C语言编写的、跨平台的、免费和开源的多媒体程序库,它提供了一个简单的接口用于操作硬件平台的图形显示、声音、输入设备等。SDL库被广泛应用于各种操作系统(如Linux、FreeBSD、Windows、MacOS、iOS、Android等)上的游戏开发、多媒体播放器、模拟器(如QEMU)等众多应用程序之中。尽管SDL是用C语言编写的,但是其他很多流行的编程语言(如C++、C#、Java、Objective C、Lisp、Erlang、Pascal、Perl、Python、PHP、Ruby等)都提供了对SDL库的绑定,在这些编程语言中可以很方便地调用SDL的功能。

在QEMU模拟器中的图形显示默认使用的就是SDL。

[root@kvm-host root]# qemu-system-x86_64 rhel7.img
Could not initialize SDL(No available video device) - exiting

3.4.2. 4.2 VNC的使用

VNC(Virtual Network Computing)是图形化的桌面分享系统,它使用RFB(Remote FrameBuffer)协议来远程控制另外一台计算机系统。它通过网络将控制端的键盘、鼠标的操作传递到远程受控计算机中,而将远程计算机中的图形显示屏幕反向传输回控制端的VNC窗口中。VNC是不依赖于操作系统的,在Windows、Linux上都可以使用VNC,可以从Windows系统连接到远程的Linux VNC服务,也可以从Linux系统连接到远程的Windows系统,当然也可以在Windows对Windows系统之间、Linux对Linux系统之间使用VNC连接。

下面分别讲述在宿主机中直接使用VNC和在通过qemu命令行创建客户机时采用VNC方式的图形显示。

1.宿主机中的VNC使用

1)在宿主机中安装VNC的服务器软件包(如tigervnc-server)。可以用如下命令查询vnc server的安装情况。


[root@kvm-host ~]# rpm -q tigervnc
tigervnc-1.3.1-9.el7.x86_64
[root@kvm-host ~]# rpm -q tigervnc-server
tigervnc-server-1.3.1-9.el7.x86_64

如果没有安装vnc server,则可以使用“yum install tigervnc-server”这样的命令来安装。

2)设置宿主机中的安全策略,使其允许VNC方式的访问,主要需要设置防火墙和SELinux的安全策略。这里为了简单起见,直接关闭了防火墙和SELinux,在实际生产环境中,需要根据特定的安全策略去设置。

可以使用“setup”命令来设置或关闭防火墙,也可以用“systecmctl stop firewalld”命令来实现同样的效果。

关闭SELinux可以采取如下3种方式:

·在运行时执行“setenforce”命令来设置,命令行如下(这个效果是一次性的):


[root@kvm-host ~]# setenforce 0
setenforce: SELinux is disabled

# 永久关闭setenforce
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

3)在宿主机中启动VNC服务端,运行命令“vncserver :1”即可启动端口为5901(5900+1)的VNC远程桌面的服务器,

示例如下。可以启动多个VNC Server,使用不同的端口供多个客户端使用。如果是第一次启动vncserver,系统会提示设置连接时需要输入的密码,根据需要进行设置即可。

5)连接到远程的宿主机服务器,使用的格式为“IP(hostname):PORT”。在命令行用“vncviewer kvm-host:1”这样的命令来连接到某台机器的某个VNC桌面。在连上VNC后,会要求输入密码验证(这个密码就是第一次启动vncserver时输入的密码),验证成功后即可正常连接到远程VNC桌面。

介绍VNC的一些具体操作方法。

准备两个系统,一个是KVM的宿主机系统A(IP为192.168.199.176,主机名为kvm-host),另一个是类似环境的备用KVM系统B(IP为192.168.199.146,主机名为kvm-host2),这两个系统之间可以通过网络连通。

示例1:

在启动客户机时,带有一个不需要密码的对任何主机都可以连接的VNC服务。

在宿主机A系统中,运行如下命令即可启动服务。


[root@kvm-host ~]# qemu-system-x86_64 -smp 4 -m 16G -enable-kvm rhel7.img -device e1000,netdev=brnet0 -netdev bridge,id=brnet0,br=virbr0 -display vnc=:0
WARNING: Image format was not specified for 'rhel7.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.

在宿主机中,用如下命令连接到客户机中。


[root@kvm-host ~]# vncviewer :0

而在B系统中,用如下命令中即可连接到A主机中对客户机开启的VNC服务。


[root@kvm-host2 ~]# vncviewer 192.168.199.176:0

示例2:

在启动客户机时,带有一个需要密码的、仅能通过本机连接的VNC服务。

在宿主机A系统中,运行如下命令即可将其启动。如前面提过的,VNC的密码需要在QEMU monitor中设置,所以这里加了“-monitor stdio”参数,使monitor指向目前的标准输入输出,这样可以直接输入“change vnc password”命令来设置密码(否则,我们就没法连入guest了)。


[root@kvm-host ~]# qemu-system-x86_64 -smp 4 -m 16G -enable-kvm rhel7.img -device e1000,netdev=brnet0 -netdev bridge,id=brnet0,br=virbr0 -display vnc=localhost:0,password -monitor stdio

    Specify the 'raw' format explicitly to remove the restrictions.
QEMU 2.7.0 monitor - type 'help' for more information
(qemu) change vnc password "123456"
(qemu) change vnc password
Password: ******
(qemu)

示例3:

启动客户机时并不启动VNC,启动后根据需要使用命令才真正开启VNC。

在宿主机A系统中,将VNC参数中的display设置为none,然后在重定向到标准输入输出的QEMU monitor中使用“change vnc:0”命令来开启VNC。操作命令如下:


[root@kvm-host ~]# qemu-system-x86_64 -smp 4 -m 16G -enable-kvm rhel7.img -device e1000,netdev=brnet0 -netdev bridge,id=brnet0,br=virbr0 -display vnc=none -monitor stdio

WARNING: Image format was not specified for 'rhel7.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
QEMU 2.7.0 monitor - type 'help' for more information
(qemu) change vnc ?
no vnc port specified
(qemu) change vnc :0

3.4.3. 4.3 VNC显示中的鼠标偏移

用如下的命令启动客户机,可解决VNC中的鼠标偏移问题.


qemu-system-x86_64 win7.img -vnc :2 -usb -usbdevice tablet

或者,


qemu-system-x86_64 win7.img -vnc :2 -device piix3-usb-uhci -device usb-tablet

3.4.4. 4.4 非图形模式

在qemu命令行中,添加“-nographic”参数可以完全关闭QEMU的图形界面输出,从而让QEMU在该模式下成为简单的命令行工具。而在QEMU中模拟产生的串口被重定向到了当前的控制台(console)中,所以在客户机中对其内核进行配置使内核的控制台输出重定向到串口后,依然可以在非图形模式下管理客户机系统或调试客户机的内核。

用“-nographic”参数关闭图形输出,其启动命令行及客户机启动(并登录进入客户机)的过程如下所示。

[root@kvm-host ~]# qemu-system-x86_64 -enable-kvm -smp 2 -m 4G -nographic rhel7.img


kvm-guest login:
kvm-guest login: root      #这里就是客户机的登录界面了
Password:
Password:
Last login: Tue Aug  8 19:30:27 on :0
[root@kvm-guest ~]#