在前边的博客中我们介绍了如何创建kvm虚拟机,以及一些常用的工具的介绍和使用,今天我们来了解下kvm原始工具qemu-kvm;为什么说qemu-kvm是一个原始的工具呢,如果你用kvm虚拟机,心细的你一定会发现我们不管用什么工具创建kvm虚拟机,在宿主机上表现的都是一个以/usr/libexec/qemu-kvm的进程;这意味着我们之前用的工具它们都调用了qemu-kvm这个工具来创建虚拟机,从而我们在宿主机上看到的都是qemu-kvm进程;如下所示:

  提示:以上centos7这个虚拟机上我们之前使用virt-install这个工具在命令行中直接创建的;

  qemu-kvm这个工具是使用kvm虚拟机时核心工具,从上面的进程信息可以看到,它可以完整的实现一个虚拟机实例,模拟出各种IO设备;其实我们在使用内核kvm功能时,我们只安装qemu-kvm就可以使用qemu-kvm这个用户空间工具来使用内核kvm功能了;

  好了,接下来我们来看看这个神奇的工具qemu-kvm吧!!qemu-kvm这个工具默认安装以后,它会把二进制文件放到/usr/libexec/这个目录下,它这样做的主要目的是不让用户直接在命令行执行它,为了我们不用每次都输绝对路径,我们可以把这个工具连接到我们的PATH环境变量目录下。

  1、链接qemu-kvm到/usr/bin/目录下

[root@node1 ~]# ll /usr/libexec/qemu-kvm
-rwxr-xr-x 1 root root 5259704 5月 12 23:44 /usr/libexec/qemu-kvm
[root@node1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
"/usr/bin/qemu-kvm" -> "/usr/libexec/qemu-kvm"
[root@node1 ~]# ll /usr/bin/qemu-kvm
lrwxrwxrwx 1 root root 21 8月 21 18:20 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm
[root@node1 ~]#

  2、查看qemu-kvm的帮助

  提示:从上面的过滤信息可了解到,qemu-kvm这个工具有变准选项,块设备相关选项,usb相关选项,显示相关选项,网络相关选项,字符设备相关选项,引导相关选项等等;

  3、qemu-kvm工具使用语法格式

[root@node1 ~]# qemu-kvm -h
QEMU emulator version 1.5.3 (qemu-kvm-1.5.3-173.el7_8.3), Copyright (c) 2003-2008 Fabrice Bellard WARNING: Direct use of qemu-kvm from the command line is not supported by Red Hat.
WARNING: Use libvirt as the stable management interface.
WARNING: Some command line options listed here may not be available in future releases. usage: qemu-kvm [options] [disk_image] 'disk_image' is a raw hard disk image for IDE hard disk 0

  提示:从上面的帮助信息可以看到,qemu-kvm这个工具使用很简单,就是qemu-kvm +一堆选项来创建虚拟机;

  4、qemu-kvm标准选项

    -machine [type=]name:-machine help是用来获取支持的主机类型列表,该选项用来指定虚拟主机的类型;支持的类型有kvm, xen, tcg,默认不指定是tcg类型;

    -cpu cpu:-cpu help来获取支持的cpu类型列表;用于指定要模拟的CPU型号;-cpu hsot表示模拟和宿主机一样信号的cpu

    -smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:用于指定cpu架构,其中socket表示有几颗CPU;cores表示每颗cup有几核心;threads表示每个CPU核心有机线程;maxcpus=socket*cores*threads;n等于小于maxcpus即可;

    -boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]:该选项用于指定启动设备顺序的;order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备;-boot order=dc,once=d;once表示第一次启动使用什么设备引导,once=d表示第一次启动使用光驱设备引导;

    -m megs:以M为单位指定虚拟机的内存大小;

    -name NAME:指定当前虚拟机的名称,要惟一;

  5、块设备相关的选项

    -hda/-hdb file:指明IDE总线类型的磁盘映射文件路径;第0和第1个;依次类推-hdc/-hdd file就表示第2和第3个IDE类型的磁盘;通常这种方式使用的很少,比较常用的方式是直接用-drive 来指定设备总线的类型;

    -cdrom file:指定要使用光盘映像文件;

    -drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:用来指定虚拟设备的相关属性;其中file表示映像文件;if=TYPE:块设备总线类型,常用的总线类型有ide, scsi, sd, floppy, virtio等等;media=TYPE:介质类型,常用的介质类型有cdrom和disk;index=i:设定同一类型设备多个设备的编号;cache=writethrough|writeback|none|directsync|unsafe:缓存方式;none表示不使用cache;format=f:磁盘映像文件的格式;

  6、显示相关选项

    -display type:显示的类型,sdl, curses, none和vnc;

    -nographic:不使用图形接口; 不使用图形接口就表示没有显卡,没有显卡就只能使用串口来串行显示;

    -vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;

    -vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口;在前边的博客中我们也介绍过vnc,vnc会与窗口号进行关联,第0号窗口就对应宿主机的5900端口;我们可以这样理解,第n号窗口,它对应宿主机上的端口就是5900+n;这里的n是从0开始;通常我们这里指定的都是窗口号;当然也是可以值指定监听的地址和端口,也可以指定密码;

    -monitor stdio:在标准输出上显示monitor界面;Ctrl-a, c:在console和monitor之间切换;

  7、网络相关选项

    -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]:用于指定创建虚拟机时在虚拟机上对应的接口相关属性;model=type:指明模拟出的网卡的型号,常用的网卡型号有ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;可以使用qemu-kvm -net nic,model=?来查看支持虚拟的网卡型号;macaddr=mac:指明mac地址;默认是52:54:00:开头;

    -net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:用于指定创建虚拟机时在宿主机上对应的接口相关属性;script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup(一般需要手动编写);downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown(不需要手动编写,它自身就可以不依赖脚本从而卸载掉相关接口);ifname=NAME:自定义接口名称;

  8、其他选项

    -daemonize:以守护进程运行;

  好了,简单的了解了上述的选项以后我们就可以来使用qemu-kvm创建一个虚拟机了;

  示例:用qemu-kvm来创建虚拟机

  准备工作

  创建磁盘,这个步骤如果还不熟悉,请参考我的博客《虚拟化技术之kvm磁盘管理工具qemu-img》;

[root@node1 ~]# ll /kvm/images/
总用量 1560712
-rw-r--r-- 1 qemu qemu 1598226432 8月 21 19:08 centos7.qcow2
[root@node1 ~]# qemu-img create -f qcow2 /kvm/images/test.img 5G
Formatting '/kvm/images/test.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off
[root@node1 ~]# ll /kvm/images/
总用量 1560908
-rw-r--r-- 1 qemu qemu 1598226432 8月 21 19:08 centos7.qcow2
-rw-r--r-- 1 root root 197120 8月 21 19:18 test.img
[root@node1 ~]#

  准备/etc/qemu-ifup脚本

#!/bin/bash

bridge=br0

if [ -n "$1" ];then
ip link set $ up
sleep
brctl addif $bridge $
[ $? -eq ]&& exit || exit
else
echo "Error:no interface specified."
exit
fi

  提示:以上脚本就做了一件事,判断传过来的网卡是否存在,如果存在就把它关联到$bridge指定的桥上,并启动起来;如果传过来的网卡名称不存在,则报错没有指定的网卡,然后退出;最后别忘记给这个脚本加上可执行权限;

  查看宿主机是否有br0,没有就创建一个br0,并把宿主机网卡ens33桥接到br0上;

[root@node1 ~]# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.41 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::20c:29ff:fe9a:dbd6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9a:db:d6 txqueuelen 1000 (Ethernet)
RX packets 3943 bytes 356924 (348.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2719 bytes 545299 (532.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 40 bytes 3112 (3.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 40 bytes 3112 (3.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:45:06:15 txqueuelen 1000 (Ethernet)
RX packets 285 bytes 18774 (18.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 246 bytes 19814 (19.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0-nic: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 52:54:00:45:06:15 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc54:ff:feff:51f1 prefixlen 64 scopeid 0x20<link>
ether fe:54:00:ff:51:f1 txqueuelen 1000 (Ethernet)
RX packets 285 bytes 22764 (22.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4051 bytes 217914 (212.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@node1 ~]#

  提示:从上面的输出信息可以看到br0并不存在;

  手动创建br0配置文件,并修改ens33的配置文件

[root@node1 network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.0.41
PREFIX=24
GATEWAY=192.168.0.1
DNS1=192.168.0.1
[root@node1 network-scripts]# cat ifcfg-ens33
TYPE=Ethernet
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
[root@node1 network-scripts]#

  重启网络

[root@node1 network-scripts]# systemctl restart network
[root@node1 network-scripts]#
[root@node1 network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.41 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::cc1c:b2ff:fe49:1138 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9a:db:d6 txqueuelen 1000 (Ethernet)
RX packets 20 bytes 2000 (1.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 36 bytes 4708 (4.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:9a:db:d6 txqueuelen 1000 (Ethernet)
RX packets 4544 bytes 411254 (401.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3108 bytes 608414 (594.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 40 bytes 3112 (3.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 40 bytes 3112 (3.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:45:06:15 txqueuelen 1000 (Ethernet)
RX packets 287 bytes 18878 (18.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 248 bytes 19946 (19.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc54:ff:feff:51f1 prefixlen 64 scopeid 0x20<link>
ether fe:54:00:ff:51:f1 txqueuelen 1000 (Ethernet)
RX packets 287 bytes 22896 (22.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4312 bytes 231514 (226.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@node1 network-scripts]#

  提示:如果重启网络后,crt没有断开,说明我们配置的网络没有问题;从上面的信息可以看到br0已经创建,并且拥有一个地址原是ens33的地址,而ens33现在却没有了地址,它直接桥接到br0上;

  准备好以脚本,磁盘文件,网络环境后,我们就可以基于某个光盘镜像来创建一个桥接到br0的虚拟机

[root@node1 network-scripts]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 centos7 running [root@node1 network-scripts]# qemu-kvm -name test \
> -smp 2,maxcpus=4,sockets=2,cores=2 \
> -m 1024 \
> -cpu host \
> -drive file=/kvm/images/test.img,media=disk,if=virtio,cache=writeback,format=qcow2, \
> -drive file=/kvm/iso/CentOS-7-x86_64-Minimal-1708.iso,media=cdrom \
> -boot order=dc,once=d \
> -vnc :1 \
> -net nic,macaddr=52:54:00:00:00:01,model=virtio \
> -net tap,script=/etc/qemu-ifup \
> -daemonize
[root@node1 network-scripts]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 centos7 running [root@node1 network-scripts]#

  提示:默认直接手动使用qemu-kvm来创建虚拟机,在virsh list 中山看不到的;

  提示:从上面的截图来看,我们虚拟机应该正常跑起来了,我们指定的1号窗口对应的端口已经处于监听状态,在进程列表中也能看到我们手动执行的命令也运行成进程;

  验证:用vnc连接宿主机的1号窗口,看看是否有虚拟机运行?

  提示:通过vnc连接1号窗口,可以看到我们指定的虚拟机已经创建好,正等着我们去装系统;

  提示:装好系统以后,我们需要关闭虚拟机(直接kill掉宿主机对应的进程即可),启动虚拟机时我们需要把光驱给卸载掉(不指定光驱设备),或者修改启动次序,不然它会一直以光驱做系统引导;

  关闭虚拟机

  修改启动次序,再次启动虚拟机

  提示:这里我们在原有的命令上,把once=d修改成once=c,其他选项都不要变;意思本次创建虚拟机,第一引导设备上是第一块硬盘;

  现在用vnc连接宿主机的1号窗口,看看虚拟机里装的系统是否启动起来了呢?

  提示:可以看到虚拟机里的系统已经正常启动了;从上面的过程来看,qemu-kvm本质上没有像virt-manager那样用图形界面创建虚拟机,装系统简单,我们需要手动的去指定各种设备,以及解决启动顺序,网络等等问题;所以通常qemu-kvm是通过一个磁盘镜像模板来(就是装有系统的磁盘文件),然后配合网络环境来启动虚拟机;

  从上面vnc连接虚拟机控制台看,eth0处于关闭状态,接下来我们把eth0启动起来,看看它是否获取同宿主机br0桥上同网段的ip地址呢?

  提示:临时启动eth0以后,可以看到eth0上就获取到了一个192.168.0.0网段地址,和宿主机br0在同一网段,说明虚拟机的网络上桥接到宿主机上的物理网卡上;以上是临时启动eth0,要用就开机自动启动,需要修改配置文件;

虚拟化技术之kvm虚拟机创建工具qemu-kvm的更多相关文章

  1. 虚拟化技术之kvm虚拟机创建工具virt-install

    在前边的博客中,我们创建KVM虚拟机用到了virt-manager,这个工具是一个图形化工具,创建虚拟机很方便:除此我们还是用virsh define/create +虚拟机配置文件来创建虚拟机,这种 ...

  2. 基于KVM、Xen、OpenVZ等虚拟化技术的WEB在线管理工具

    1.Proxmox proxmox是一个开源的虚拟化管理平台,支持集群管理和HA.在存储方面,proxmox除了支持常用的lvm,nfs,iscsi,还支持集群存储glusterfs和ceph,这也是 ...

  3. [ kvm ] 学习笔记 7:KVM 虚拟机创建的几种方式

    通过对 qemu-kvm.libvirt 的学习,总结三种创建虚拟机的方式: (1)通过 qemu-kvm 创建 (2)通过 virt-install 创建 (3)通过 virt-manager 创建 ...

  4. 1-3课 介绍虚拟化技术、在虚拟机中安装windows7

    虚拟化技术 可以使我们在同一台计算机上运行多个操作系统 用于教学环境 用于测试环境 和硬件无关  可移植到其他电脑直接使用 Ptov技术  不支持VtoP 节省管理成本 节省硬件投资  不用买设备 省 ...

  5. KVM虚拟机安装报错 KVM is not available

    在linux系统上使用kvm安装系统时,如果你的cpu不支持虚拟化技术那么可能会报以下错误: Warning:KVM is not available. This may mean the KVM p ...

  6. Openstack 实现技术分解 (2) 虚拟机初始化工具 — Cloud-Init & metadata & userdata

    目录 目录 前文列表 扩展阅读 系统环境 前言 Cloud-init Cloud-init 的配置文件 metadata userdata metadata 和 userdata 的区别 metada ...

  7. 给新建的kvm虚拟机创建网络接口

    (一)首先必须创建网卡连接桥接口的启动脚本和停止脚本,其中脚本中的 $1:表示为虚拟机的网卡的右边接口,这两个脚本就是讲虚拟机的网卡的右边接口接在网桥上,实现桥接模型     # 1:/etc/qem ...

  8. Linux虚拟化技术KVM、QEMU与libvirt的关系(转)

    说明:个人理解,KVM是内核虚拟化技术,而内核是不能使用在界面上使用的,那么此时QEMU提供了用户级别的使用界面,相互辅助.当然,单独使用QEMU也是可以实现一整套虚拟机,不过QEMU+KVM基本是标 ...

  9. Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机

    (1).虚拟化产品对比介绍 虚拟化技术有以下三种:仿真虚拟化,这是一种对系统硬件没有要求,但性能最低的虚拟化技术:半虚拟化,这是一种直接使用物理硬件,性能高,但需要修改内核的虚拟化技术:全虚拟化,这是 ...

随机推荐

  1. xctf-pwn level3

    这道题研究了很久,总算是理解了got表和plt表的关系和作用 checksec看防护 main函数里提示了vunlnerable函数 查看一下vulnerable函数 可以利用read函数栈溢出,但是 ...

  2. Windows下使用图形化mount挂载磁盘到文件夹

    Windows上也有类似于Linux上的mount命令,至于mount是什么: mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要 ...

  3. Python 字典(Dictionary) fromkeys()方法

    描述 Python 字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值.高佣联盟 www.cgewang.com 语法 from ...

  4. PHP rmdir() 函数

    定义和用法 rmdir() 函数删除空的目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 rmdir(dir,context) 参数 描述 dir 必需.规定要删除的目录. ...

  5. PDO::query

    PDO::query — 执行 SQL 语句,返回PDOStatement对象,可以理解为结果集(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 publ ...

  6. luogu P1973 [NOI2011]NOI 嘉年华 dp

    LINK:NOI 嘉年华 一道质量非常高的dp题目. 考虑如何求出第一问 容易想到dp. 按照左端点排序/右端点排序状态还是很难描述. 但是我们知道在时间上肯定是一次选一段 所以就可以直接利用时间点来 ...

  7. CF R 639 div2 F Review 贪心 二分

    LINK:Résumé Review 这道题让我眼前一亮没想到二分这么绝. 由于每个\(b_i\)都是局部的 全局只有一个限制\(\sum_{i=1}^nb_i=k\) 所以dp没有什么用 我们只需要 ...

  8. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

  9. bzoj 2780 [Spoj]8093 Sevenk Love Oimaster

    LINK:Sevenk Love Oimaster 询问一个模式串在多少个文本串中出现过. 考虑广义SAM 统计这种数量问题一般有三种做法. 一种 暴力bitset 这道题可能可以过? 一种 暴力跳p ...

  10. NameNode中的高可用方案

    NN中元数据的可靠性是可以保证的,但是其可用性并不高,因为Namenode是单节点的,所以一旦这个节点不能工作,那么整个hdfs都不能工作,但是由于SecondaryNameNode的机制,所以,即便 ...