1. 安装环境

# yum install qemu-kvm libvirt virt-install virt-manager virt-viewer -y
# systemctl start libvirtd
# virt-host-validate

授予 qemu 用户访问某个目录的权限:

# setfacl -R -m u:qemu:rwx YOUR_DIRECTORY

2. VM相关操作

从 ISO 文件启动 VM

# 创建一个虚拟磁盘
# qemu-img create -f raw -o size=10G ./ubuntu16.img # 在虚拟磁盘上安装操作系统
# virt-install --name ubuntu16-server --ram 1024 --disk path=./ubuntu16.img --vcpus 2 \
--os-variant ubuntu16.04 --network bridge=virbr0 \
--cdrom ./ubuntu-16.04.7-server-amd64.iso

查看 os-variant:  osinfo-query os

从磁盘映像启动 VM

# virt-install --name ubuntu16 --ram 1024 --disk path=./ubuntu16.img --vcpus 2 \
--os-variant ubuntu16.04 --network bridge=virbr0 --import

从 xml 文件启动 VM:

virsh define vm1.xml
virsh start vm1

等同于如下命令:

virsh create vm1.xml

查看 VM

# 查看有哪些 VM 及其状态
# virsh list --all # 查看某个 VM 的详细信息(数字表示 vm id)
# virsh dominfo 6 # 查看 vm1 的xml定义文件
# virsh dumpxml vm1

启停 VM:

# 关机
# virsh shutdown 6 # 强制关机
# virsh destroy 6 # 删除:再也查看不到,但不删除磁盘映像
# virsh undefine ubuntu16-server # 启动
# virsh start ubuntu16 # 重启
# virsh reboot ubuntu16 # 自动启动:随 hypervisor 的启动而启动
# virsh autostart ubuntu16 # 取消自动启动:随 hypervisor 的启动而启动
# virsh autostart --disable ubuntu16

启动 virt-manager

# virt-manager

通过控制台连接 VM

# 在 ubuntu16 vm 中执行
sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service # 在宿主机上执行
virsh console 8

ps1:需要按一次回车键才会显示登陆。

ps2:centos vm设置方法参考 https://www.cnblogs.com/heiguu/p/10121084.html

按 ctrl+] 退出控制台连接。

3. 虚拟磁盘相关操作

创建虚拟磁盘

# qemu-img create -f raw -o size=2G ./disk1.img

磁盘格式转换

# qemu-img convert -f raw -O qcow2 ./disk1.img ./disk1.qcow2

查看磁盘信息

# qemu-img info ./disk1.qcow2

挂载磁盘

# 1 是 vm id;vdb是磁盘在 vm 中的名称
# virsh attach-disk 1 /home/ming/kvm/disk1.img vdb --live --config

查看 vm 挂载了哪些块设备

# virsh domblklist 1

卸载磁盘

# virsh detach-disk 1 vdb

创建快照

# qemu-img snapshot -c s1 disk1.qcow2 

ps:不支持 raw 格式。

查看快照

# qemu-img snapshot -l disk1.qcow2

从快照中恢复

# qemu-img snapshot -a s1 disk1.qcow2

删除快照

# qemu-img snapshot -d s1 disk1.qcow2

4. 存储池相关操作

定义存储池:基于目录

# virsh pool-define-as --name pool1 --type dir --target /home/ming/kvm/pool1/

定义、构建存储池:基于 LVM

# virsh pool-define-as --name pool2 --type logical --source-dev /dev/sdb1 --source-name pool2_vg --target /dev/vgs
# virsh pool-build pool2

# 可以看到 pool2_vg
# vgdisplay

定义并启动存储池:需要 pool-build 的不适合此用法

# virsh pool-create-as --name pool1 --type dir --target /home/ming/kvm/pool1/

启停存储池:

# 启动
# virsh pool-start pool1 # 停止
# virsh pool-destroy pool1 # 删除源设备
# virsh pool-delete pool1 # 取消定义
# virsh pool-undefine pool1 # 自动启动
# virsh pool-autostart pool1 # 取消自动启动
# virsh pool-autostart --disable pool1

查看存储池:

# 罗列存储池
# virsh pool-list --all # 查看某个存储池的详细信息
# virsh pool-info pool1 # 查看 xml 定义文件
# virsh pool-dumpxml pool1

创建存储卷:

# virsh vol-create-as pool1 vol1 1G

挂载卷:

virsh attach-disk vm1 /home/ming/kvm/pool1/vol1 vdb --live --config

查看卷信息:

# 罗列存储卷
# virsh vol-list --pool pool1 # 查看详细信息
# virsh vol-info --pool pool1 vol1 # 查看 xml 定义文件
# virsh vol-dumpxml --pool pool1 vol1 # 查看卷的路径
# virsh vol-path --pool pool1 vol1 # 根据卷路径查看所在的存储池
# virsh vol-pool /home/ming/kvm/pool1/vol1 # 根据卷路径查看卷名
# virsh vol-name /home/ming/kvm/pool1/vol1

擦除卷:

virsh vol-wipe --pool pool1 vol1

修改卷大小:

# 指定增量
# virsh vol-resize --pool pool1 vol1 --delta +1G
# virsh vol-resize --pool pool1 vol1 --delta -1G --shrink # 直接指定大小
# virsh vol-resize --pool pool1 vol1 2G

5. 网络相关操作(使用 ovs)

创建网络配置文件

# cat net1.xml
<network>
<name>net1</name>
<forward mode="bridge"/>
<bridge name="br0"/>
<virtualport type="openvswitch"/>
</network>

定义网络

# virsh net-define net1.xml

启动网络

# virsh net-start net1

创建网络:(定义并启动)

virsh net-create net1.xml

终止网络

# virsh net-destroy net1

删除网络

# virsh net-undefine net1

查看网络

# virsh net-list --all
# virsh net-info net1

# 查看 xml 定义文件
virsh net-dumpxml net1

网络自启动

# virsh net-autostart net1

# 取消自启动
# virsh net-autostart --disable net1

创建 ovs 网桥,设置 vm 使用指定的网络

# ovs-vsctl add-br br0

# virt-install --name vm1 --ram 512 --disk path=./ubuntu16-1.img --vcpus 1 \
--os-variant ubuntu16.04 --network bridge=virbr0 --import
# virt-install --name vm2 --ram 512 --disk path=./ubuntu16-2.img --vcpus 1 \
--os-variant ubuntu16.04 --network network=net1 --import # ovs-vsctl show
98c62161-cb7e-44e9-a94d-8bc0b01e60af
Bridge "br0"
Port "vnet0"
Interface "vnet0"
Port "vnet1"
Interface "vnet1"
Port "br0"
Interface "br0"
type: internal

配置 vm 的 IP地址

# vm1
root@ubuntu:~# ip addr add 10.0.0.3/24 dev ens3 # vm2
root@ubuntu:~# ip addr add 10.0.0.4/24 dev ens3 # vm2
root@ubuntu:~# ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=2.21 ms

参考资料

https://www.cnblogs.com/zrp2013/p/4529820.html

https://blog.csdn.net/s7799653/article/details/106024674

https://blog.csdn.net/wuliangtianzu/article/details/81870551

kvm实战的更多相关文章

  1. <Mastering KVM Virtualization>:第二章 KVM内部原理

    在本章中,我们将讨论libvirt.QEMU和KVM的重要数据结构和内部实现.然后,我们将深入了解KVM下vCPU的执行流程. 在这一章,我们将讨论: libvirt.QEMU和KVM的内部运作方式. ...

  2. 《Linux企业应用案例精解》一书配套视频发布

    <Linux企业应用案例精解>一书配套视频发布(每周更新视频教程),通过读者平台账号,可以在平台下载AVI格式.所有读者都能获得本书中涉及的软件资料,轻松搭建你的学习环境. 当当购书地址: ...

  3. Linux运维工程师应具备哪些技能?

      对于我们这些刚入门的运维小白来说,极强的好奇心总会驱使我们去涉猎各种技术,弄到最后很可能该学的知识半懵半解,知识体系混乱,学习毫无章法.因此,我们学习 时要有一个明确的目标和知识体系(也是我学习的 ...

  4. 2019年最新老男孩高性能Web架构与自动化运维架构视频教程

    课程目录L001-老男孩架构15期-Web架构之单机时代L002-老男孩架构15期-Web架构之集群时代L003-老男孩架构15期-Web架构之dnsL004-老男孩架构15期-Web架构之缓存体系L ...

  5. 【原创】Linux虚拟化KVM-Qemu分析(一)

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  6. 云计算之KVM虚拟化实战

    1 基础环境规划 1.1 主机环境规划 系统版本 主机名 IP地址 内存 磁盘 CentOS6.9 kvm-node1 10.0.0.200 2G 20G CentOS6.9 kvm-node2 10 ...

  7. KVM+Qemu+Libvirt实战

    上一篇的文章是为了给这一篇文件提供理论的基础,在这篇文章中我将带大家一起来实现在linux中虚拟出ubuntu的server版来 我们需要用KVM+Qemu+Libvirt来进行kvm全虚拟化,创建虚 ...

  8. Linux实战教学笔记54:开源虚拟化KVM(二)管理虚拟存储

    五,管理虚拟存储 5.1 虚拟磁盘概述 5.1.1 虚拟化项目中存储的注意事项 [x] 存储的性能几乎总是虚拟化的瓶颈 [x] 通过多个硬盘驱动以分布磁盘I/O来实现存储解决方案 [x] 考虑部署集中 ...

  9. Linux实战教学笔记55:开源虚拟化KVM(三)管理虚拟网络

    六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...

随机推荐

  1. Java并发包之 CopyOnWriteArrayList

    大家在学习Java的过程中,或者工作中,始终都绕不开集合.在单线程环境下,ArrayList就可以满足要求.多线程时,我们可以使用CopyOnWriteArrayList来保证数据安全.下面我们一起来 ...

  2. [WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点

    1. 需求 在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 Vie ...

  3. Python(循环语句与数据类型)

    循环语句 对于python来说 基本上循环用的两个 wile 跟静态语言相似 下来是for循环 这个就跟静态语言大大不同了 wile 条件:–>while 循环也就是 当条件为真的时候会一直循环 ...

  4. Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案

    继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...

  5. 7.mysql8.0版本MGR搭建

    搭建MGR 1.配置文件 loose-group_replication_ip_whitelist = 192.168.124.0/24 loose-group_replication_start_o ...

  6. 个人MySQL的事务特性原理学习笔记总结

    目录 个人MySQL的事务特性原理笔记总结 一.基础概念 2. 事务控制语句 3. 事务特性 二.原子性 1. 原子性定义 2. 实现 三.持久性 1. 定义 2. 实现 3. redo log存在的 ...

  7. Git 仓库拆分

    方案对比 subtree 使用命令 git subtree split -P dirPath -b branchName 将目标文件夹的代码都保存到指定分支.试了下,该方案虽然保留了 commit,但 ...

  8. [LeetCode]129. Sum Root to Leaf Numbers路径数字求和

    DFS的标准形式 用一个String记录路径,最后判断到叶子时加到结果上. int res = 0; public int sumNumbers(TreeNode root) { if (root== ...

  9. jQuery 库中的 $() 是什么?

    概述: $() 函数是 jQuery() 函数的别称. $() 函数用于将任何对象包裹成 jQuery 对象,接着就被允许调用定义在 jQuery 对象上的多个不同方法. 可以将一个选择器字符串传入 ...

  10. Mono for android,Xamarin点击事件的多种写法

    (一)原本java的写法(相信很多是学过java的): 需要实现接口View.IOnClickListener,最好也继承类:Activity,因为View.IOnClickListener接口又继承 ...