注:第一次可以先看libvirt基础知识,这里是把常用的放在了前边

virsh使用

virt-manager使用

libvirtd使用

环境安装

比较推荐直接用apt/yum进行安装,否则依赖包太多太多。

  1. 切回ubuntu 默认源,然后
  2. sudo apt-get install -y libgnutls28-dev libnl-3-dev libnl-route-3-dev \
  3. libxml2-dev libdevmapper-dev python3-pip
  4. sudo apt-get install libnl-3-dev
  5. pip3 install rst2html5-tool
  6. export PATH=/home/inno/.local/bin/:$PATH
  7. wget https://libvirt.org/sources/libvirt-6.6.0.tar.xz
  8. sudo apt-get install python3-libvirt # python3 libvirt

编译安装(强烈不推荐,试过几次都陷入了依赖包管理中)

libvirt源码下载

  1. wget https://libvirt.org/sources/libvirt-4.0.0.tar.xz
  2. xz -d libvirt-4.0.0.tar.xz
  3. tar -xf libvirt-4.0.0.tar && rm libvirt-4.0.0.tar
  4. cd libvirt-4.0.0
  5. mkdir -p build install
  6. dst=$(realpath install)
  7. cd build && ../configure --prefix=${dst} && make && make install && cd ../install

注释:
中间得依赖包太复杂,可以通过下边方式解决

  1. apt-cache search xxx # 查找对应库
  2. apt-cache madison <<package name>> # 查看库支持版本
  3. apt-get install xxx # 安装对应库

可能需要的相关依赖包安装方式 /

libvirt基础知识

libvirt由libvirtd,virsh,virt-manager等组成,并给其他工具提供了虚拟机管理工具。

注意点:

  • 建议所有命令在root用户下执行,否则可能会出错
  • 只有virtsh/virt-manager创建的虚拟机,才能被libvirt管理到,qemu创建得看不到

**

libvirt

libvirt支持多种虚拟化方案,是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口

libvirt说明

ibvirt作为中间适配层,可以让底层Hypervisor对上层用户空间的管理工具是完全透明的,因为libvirt屏蔽了底层各种Hypervisor的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)
image.png
libvirt包含应用层和各种虚拟化架构的driver

Node,VMM,Domain

libvirt中涉及几个概念:

  • 节点(Node)就是服务器硬件,上面可能运行着多个虚拟客户机。Hypervisor和Domain都运行在节点上。
  • Hypervisor也称虚拟机监控器(VMM),如KVM、Xen、VMware、Hyper-V等,是虚拟化中的一个底层软件层,它可以虚拟化一个节点让其运行多个虚拟客户机(不同客户机可能有不同的配置和操作系统)。
  • 域(Domain)是在Hypervisor上运行的虚拟机。域也被称为实例(instance,如在亚马逊的AWS云计算服务中客户机就被称为实例)、客户机操作系统(guest OS)、虚拟机(virtual machine),它们都是指同一个概念。

image.png

libvirt组成和管理

libvirt给我们提供了三个东西

  • 作为lib库,当然提供API啊-对应用程序编程接口库
  • 基于自己lib库还给做了个命令行工具-virsh
  • libvirtd守护进程:负责执行对节点上的域的管理工作(必须要启动)。

注: libvirtd守护进程负责执行对节点上的域的管理工作,在用各种工具对虚拟机进行管理时,这个守护进程一定要处于运行状态中。而且这个守护进程可以分为两种:一种是root权限的libvirtd,其权限较大,可以完成所有支持的管理工作;一种是普通用户权限的libvirtd,只能完成比较受限的管理工作。

libvirtd操作(virt-服务连接不上的怀疑点之一)

virt模块之一是提供了后台libvirtd环境

  1. systemctl start libvirtd
  2. systemctl reload libvirtd
  3. systemctl status libvirtd
  4. (base) baiy@inno-MS-7B23:x86-test$ systemctl status libvirtd
  5. libvirtd.service - Virtualization daemon
  6. Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
  7. Active: active (running) since Thu 2020-08-27 15:34:44 CST; 1h 8min ago
  8. Docs: man:libvirtd(8)
  9. https://libvirt.org
  10. Main PID: 1027 (libvirtd)
  11. Tasks: 24 (limit: 32768)
  12. CGroup: /system.slice/libvirtd.service
  13. .....
  14. libvirtd启动参数:
  15. -d 后台运行
  16. -f [filename] 指定配置文件,就是上边的libvirtd.conf
  17. --version 版本信息
  18. -v/--verbose 没啥说的,打印

操蛋的virt配置文件

  1. (base) baiy@inno-MS-7B23:~$ tree /etc/libvirt/
  2. /etc/libvirt/
  3. ├── hooks
  4. ├── libvirt-admin.conf
  5. ├── libvirt.conf // 远程别名系统,qemu+ssh使用
  6. ├── libvirtd.conf // libvirtd网络和安全配置-反正我不敢动
  7. ├── libxl.conf
  8. ├── libxl-lockd.conf
  9. ├── lxc.conf
  10. ├── nwfilter
  11. ├── allow-arp.xml
  12. ├── .....
  13. ├── qemu // 虚拟机配置信息***重要
  14. ├── centOS7-baiy.xml // 我自己创建的虚拟机了
  15. ├── docker-test.xml
  16. ├── networks
  17. ├── autostart
  18. └── default.xml -> /etc/libvirt/qemu/networks/default.xml
  19. └── default.xml
  20. ├── ubuntu18.04.xml
  21. └── vm2.xml
  22. ├── qemu.conf
  23. ├── qemu-lockd.conf
  24. ├── qemu-sanlock.conf
  25. ├── secrets [error opening dir]
  26. ├── storage
  27. ├── autostart
  28. ├── default.xml -> /etc/libvirt/storage/default.xml
  29. ├── softwares.xml -> /etc/libvirt/storage/softwares.xml
  30. └── x86-test.xml -> /etc/libvirt/storage/x86-test.xml
  31. ├── default.xml
  32. ├── softwares.xml
  33. └── x86-test.xml
  34. ├── virtlockd.conf
  35. ├── virtlogd.conf
  36. └── virt-login-shell.conf

注:libvirt检测不到qemu启动的Guest

  1. libvirtd守护进程的启动或停止,并不会直接影响正在运行中的客户机。
  2. libvirtd在启动或重启完成时,只要客户机的XML配置文件是存在的,libvirtd会自动加载这些客户的配置,获取它们的信息。
  3. 当然,如果客户机没有基于libvirt格式的XML文件来运行(例如直接使用qemu命令行来启动的客户机),libvirtd则不能自动发现它。

virsh命令

virsh也属于libvirt提供工具之一,可以参考:
virsh查看/管理虚拟机
注:只有使用virsh/virt-manager等工具创建的虚拟机,才会被virsh进行管理。

基础命令

  1. virsh:直接进交互模式
  2. virsh nodeinfo:查看KVM节点(服务器)信息
  3. virsh list:列出正在运行的虚拟机
  4. virsh list --all:列出所有虚拟机(包括未启动的)
  5. virsh dominfo 虚拟机名称:查看指定虚拟机的信息
  6. virsh start 虚拟机名称:将指定的虚拟机开机
  7. virsh reboot 虚拟机名称:将指定的虚拟机重启
  8. virsh shutdown 虚拟机名称:将指定的虚拟机正常关机
  9. virsh destroy 虚拟机名称:将指定的虚拟机强制关机(相当于拔电源)
  10. virsh autostart 虚拟机名称:将指定的虚拟机设置随KVM自动开机
  11. virsh autostart --disable 虚拟机名称:禁止自动开机

测试举例:

  1. xapp1177$ sudo virsh nodeinfo
  2. CPU model: x86_64
  3. CPU(s): 4
  4. CPU frequency: 3600 MHz
  5. CPU socket(s): 1
  6. Core(s) per socket: 2
  7. Thread(s) per core: 2
  8. NUMA cell(s): 1
  9. Memory size: 8015952 KiB
  10. xapp1177$ sudo virsh list --all
  11. Id Name State
  12. ----------------------------------------------------
  13. 1 centos7.0 running
  14. xapp1177$ sudo virsh dominfo centos7.0
  15. Id: 1
  16. Name: centos7.0
  17. UUID: e711cf38-d9c8-41bd-a025-6939b404d955
  18. OS Type: hvm
  19. State: running
  20. CPU(s): 2
  21. CPU time: 294.6s
  22. Max memory: 2097152 KiB
  23. Used memory: 2097152 KiB
  24. Persistent: yes
  25. Autostart: disable
  26. Managed save: no
  27. Security model: apparmor
  28. Security DOI: 0
  29. Security label: libvirt-e711cf38-d9c8-41bd-a025-6939b404d955 (enforcing)

virsh虚拟机的xml配置

看到了virsh支持这么多命令,那么如何创建/使用/删除虚拟机?

查看虚拟机的xml配置

  1. xapp1177$ sudo virsh list --all
  2. Id Name State
  3. ----------------------------------------------------
  4. 1 centos7.0 running
  5. xapp1177$ sudo virsh dominfo centos7.0
  6. ...
  7. # 其实,我个人更喜欢最直接的方式:
  8. # 直接读取 /etc/libvirt/qemu/centos7.0.xml 即可
  9. <domain type='kvm'>
  10. <name>centos7.0</name # 这个名字也要唯一
  11. <uuid>8643ed76-69c5-4021-a728-5ecb426e5579</uuid> # uuidgen可获取唯一的uid

拷贝虚拟机

  1. xapp1177$ sudo cp /etc/libvirt/qemu/centos7.0.xml /tmp/test.xm
  2. xapp1177$ uuidgen
  3. b2495765-4139-476a-9a0f-d7b94ef91813
  4. ... 修改nameuuid
  5. xapp1177$ sudo virsh define /tmp/test.xml
  6. Domain test defined from /tmp/test.xml
  7. xapp1177$ sudo virsh list --all
  8. Id Name State
  9. ----------------------------------------------------
  10. 4 centos7.0 running
  11. - test shut off

virt-manager工具

这个和vmware没啥区别,没啥好说的, 唯一不同的事:可以通过xmanager打开远程桌面。
image.png

源代码分析

virsh代码分析

main入口函数

  1. struct _vshControl {
  2. bool imode; /* interactive mode? 1是交互模式,0是非交互模式 */
  3. };
  4. virInitialize()
  5. vshInit(ctl, cmdGroups, NULL)
  6. virshParseArgv(ctl, argc, argv)
  7. virshInit(ctl)
  8. vshCommandRun(ctl, ctl->cmd); // 执行命令

**

libvirtd源码分析

FAQ

libvirt

  1. sudo apt-get purge lvm2
  2. sudo apt autoremove
  3. sudo apt install lvm2

virt启动失败

  • [v]service libvirtd restart failed
  1. root@inno-MS-7B23:/home/baiy# service libvirtd restart
  2. Job for libvirtd.service failed because the control process exited with error code.
  3. See "systemctl status libvirtd.service" and "journalctl -xe" for details.

先看journalctl -xe 问题原因: kvm-ok是正确的,但libvirtd启动不了

  • [v] Start request repeated too quickly.
  1. 8 27 14:30:52 inno-MS-7B23 systemd[1]: libvirtd.service: Start request repeated too quickly.
  2. 8 27 14:30:52 inno-MS-7B23 systemd[1]: libvirtd.service: Failed with result 'exit-code'.
  3. 8 27 14:30:52 inno-MS-7B23 systemd[1]: Failed to start Virtualization daemon.

出现这几句,基本上是版本乱了,参考RedHat bugzilla

virt-manager

下载
注:virt-manager一定要用sudo去打开,否则连接不上

  • [v]链接不上
  1. Error starting domain: Requested operation is not valid: network 'default' is not active
  1. sudo virsh net-start default
  2. sudo virsh net-autostart default
  3. 启动虚拟机命令: virt-manager
  4. (virt) baiy@inno-MS-7B23:vrit-test$ sudo virsh net-list --all
  5. Name State Autostart Persistent
  6. ----------------------------------------------------------
  7. default active yes yes

安装时虚拟机键盘不能用

virt-manager 运行虚拟机后,发现键盘不能用?
创建虚拟机时先别安装,进入配置界面调整。
image.png
image.png

Virtual Network Inactive

image.png

  1. # virsh net-list --all # 显示所有的virsh netlist
  2. Name State Autostart Persistent
  3. ----------------------------------------------------------
  4. default inactive no yes
  5. # virsh net-start default # 激活virtual network default NAT
  6. Network default started
  7. # virsh net-list --all # 显示已激活
  8. Name State Autostart Persistent
  9. ----------------------------------------------------------
  10. default active no yes