注:第一次可以先看libvirt基础知识,这里是把常用的放在了前边
virsh使用
virt-manager使用
libvirtd使用
环境安装
比较推荐直接用apt/yum进行安装,否则依赖包太多太多。
切回ubuntu 默认源,然后
sudo apt-get install -y libgnutls28-dev libnl-3-dev libnl-route-3-dev \
libxml2-dev libdevmapper-dev python3-pip
sudo apt-get install libnl-3-dev
pip3 install rst2html5-tool
export PATH=/home/inno/.local/bin/:$PATH
wget https://libvirt.org/sources/libvirt-6.6.0.tar.xz
sudo apt-get install python3-libvirt # python3 libvirt
编译安装(强烈不推荐,试过几次都陷入了依赖包管理中)
wget https://libvirt.org/sources/libvirt-4.0.0.tar.xz
xz -d libvirt-4.0.0.tar.xz
tar -xf libvirt-4.0.0.tar && rm libvirt-4.0.0.tar
cd libvirt-4.0.0
mkdir -p build install
dst=$(realpath install)
cd build && ../configure --prefix=${dst} && make && make install && cd ../install
注释:
中间得依赖包太复杂,可以通过下边方式解决
apt-cache search xxx # 查找对应库
apt-cache madison <<package name>> # 查看库支持版本
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)
libvirt包含应用层和各种虚拟化架构的driver
Node,VMM,Domain
libvirt中涉及几个概念:
- 节点(Node)就是服务器硬件,上面可能运行着多个虚拟客户机。Hypervisor和Domain都运行在节点上。
- Hypervisor也称虚拟机监控器(VMM),如KVM、Xen、VMware、Hyper-V等,是虚拟化中的一个底层软件层,它可以虚拟化一个节点让其运行多个虚拟客户机(不同客户机可能有不同的配置和操作系统)。
- 域(Domain)是在Hypervisor上运行的虚拟机。域也被称为实例(instance,如在亚马逊的AWS云计算服务中客户机就被称为实例)、客户机操作系统(guest OS)、虚拟机(virtual machine),它们都是指同一个概念。
libvirt组成和管理
libvirt给我们提供了三个东西
- 作为lib库,当然提供API啊-对应用程序编程接口库
- 基于自己lib库还给做了个命令行工具-virsh
- libvirtd守护进程:负责执行对节点上的域的管理工作(必须要启动)。
注: libvirtd守护进程负责执行对节点上的域的管理工作,在用各种工具对虚拟机进行管理时,这个守护进程一定要处于运行状态中。而且这个守护进程可以分为两种:一种是root权限的libvirtd,其权限较大,可以完成所有支持的管理工作;一种是普通用户权限的libvirtd,只能完成比较受限的管理工作。
libvirtd操作(virt-服务连接不上的怀疑点之一)
virt模块之一是提供了后台libvirtd环境
systemctl start libvirtd
systemctl reload libvirtd
systemctl status libvirtd
(base) baiy@inno-MS-7B23:x86-test$ systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-08-27 15:34:44 CST; 1h 8min ago
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 1027 (libvirtd)
Tasks: 24 (limit: 32768)
CGroup: /system.slice/libvirtd.service
.....
libvirtd启动参数:
-d 后台运行
-f [filename] 指定配置文件,就是上边的libvirtd.conf
--version 版本信息
-v/--verbose 没啥说的,打印
操蛋的virt配置文件
(base) baiy@inno-MS-7B23:~$ tree /etc/libvirt/
/etc/libvirt/
├── hooks
├── libvirt-admin.conf
├── libvirt.conf // 远程别名系统,qemu+ssh使用
├── libvirtd.conf // libvirtd网络和安全配置-反正我不敢动
├── libxl.conf
├── libxl-lockd.conf
├── lxc.conf
├── nwfilter
│ ├── allow-arp.xml
│ ├── .....
├── qemu // 虚拟机配置信息***重要
│ ├── centOS7-baiy.xml // 我自己创建的虚拟机了
│ ├── docker-test.xml
│ ├── networks
│ │ ├── autostart
│ │ │ └── default.xml -> /etc/libvirt/qemu/networks/default.xml
│ │ └── default.xml
│ ├── ubuntu18.04.xml
│ └── vm2.xml
├── qemu.conf
├── qemu-lockd.conf
├── qemu-sanlock.conf
├── secrets [error opening dir]
├── storage
│ ├── autostart
│ │ ├── default.xml -> /etc/libvirt/storage/default.xml
│ │ ├── softwares.xml -> /etc/libvirt/storage/softwares.xml
│ │ └── x86-test.xml -> /etc/libvirt/storage/x86-test.xml
│ ├── default.xml
│ ├── softwares.xml
│ └── x86-test.xml
├── virtlockd.conf
├── virtlogd.conf
└── virt-login-shell.conf
注:libvirt检测不到qemu启动的Guest
libvirtd守护进程的启动或停止,并不会直接影响正在运行中的客户机。
libvirtd在启动或重启完成时,只要客户机的XML配置文件是存在的,libvirtd会自动加载这些客户的配置,获取它们的信息。
当然,如果客户机没有基于libvirt格式的XML文件来运行(例如直接使用qemu命令行来启动的客户机),libvirtd则不能自动发现它。
virsh命令
virsh也属于libvirt提供工具之一,可以参考:
virsh查看/管理虚拟机
注:只有使用virsh/virt-manager等工具创建的虚拟机,才会被virsh进行管理。
基础命令
virsh:直接进交互模式
virsh nodeinfo:查看KVM节点(服务器)信息
virsh list:列出正在运行的虚拟机
virsh list --all:列出所有虚拟机(包括未启动的)
virsh dominfo 虚拟机名称:查看指定虚拟机的信息
virsh start 虚拟机名称:将指定的虚拟机开机
virsh reboot 虚拟机名称:将指定的虚拟机重启
virsh shutdown 虚拟机名称:将指定的虚拟机正常关机
virsh destroy 虚拟机名称:将指定的虚拟机强制关机(相当于拔电源)
virsh autostart 虚拟机名称:将指定的虚拟机设置随KVM自动开机
virsh autostart --disable 虚拟机名称:禁止自动开机
测试举例:
xapp1177$ sudo virsh nodeinfo
CPU model: x86_64
CPU(s): 4
CPU frequency: 3600 MHz
CPU socket(s): 1
Core(s) per socket: 2
Thread(s) per core: 2
NUMA cell(s): 1
Memory size: 8015952 KiB
xapp1177$ sudo virsh list --all
Id Name State
----------------------------------------------------
1 centos7.0 running
xapp1177$ sudo virsh dominfo centos7.0
Id: 1
Name: centos7.0
UUID: e711cf38-d9c8-41bd-a025-6939b404d955
OS Type: hvm
State: running
CPU(s): 2
CPU time: 294.6s
Max memory: 2097152 KiB
Used memory: 2097152 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: apparmor
Security DOI: 0
Security label: libvirt-e711cf38-d9c8-41bd-a025-6939b404d955 (enforcing)
virsh虚拟机的xml配置
看到了virsh支持这么多命令,那么如何创建/使用/删除虚拟机?
查看虚拟机的xml配置
xapp1177$ sudo virsh list --all
Id Name State
----------------------------------------------------
1 centos7.0 running
xapp1177$ sudo virsh dominfo centos7.0
...
# 其实,我个人更喜欢最直接的方式:
# 直接读取 /etc/libvirt/qemu/centos7.0.xml 即可
<domain type='kvm'>
<name>centos7.0</name # 这个名字也要唯一
<uuid>8643ed76-69c5-4021-a728-5ecb426e5579</uuid> # uuidgen可获取唯一的uid
拷贝虚拟机
xapp1177$ sudo cp /etc/libvirt/qemu/centos7.0.xml /tmp/test.xm
xapp1177$ uuidgen
b2495765-4139-476a-9a0f-d7b94ef91813
... 修改name和uuid
xapp1177$ sudo virsh define /tmp/test.xml
Domain test defined from /tmp/test.xml
xapp1177$ sudo virsh list --all
Id Name State
----------------------------------------------------
4 centos7.0 running
- test shut off
virt-manager工具
这个和vmware没啥区别,没啥好说的, 唯一不同的事:可以通过xmanager打开远程桌面。
源代码分析
virsh代码分析
main入口函数
struct _vshControl {
bool imode; /* interactive mode? 1是交互模式,0是非交互模式 */
};
virInitialize()
vshInit(ctl, cmdGroups, NULL)
virshParseArgv(ctl, argc, argv)
virshInit(ctl)
vshCommandRun(ctl, ctl->cmd); // 执行命令
libvirtd源码分析
FAQ
libvirt
- [v]lvm2下载时0大小
sudo apt-get purge lvm2
sudo apt autoremove
sudo apt install lvm2
virt启动失败
- [v]service libvirtd restart failed
root@inno-MS-7B23:/home/baiy# service libvirtd restart
Job for libvirtd.service failed because the control process exited with error code.
See "systemctl status libvirtd.service" and "journalctl -xe" for details.
先看journalctl -xe 问题原因: kvm-ok是正确的,但libvirtd启动不了
- [v] Start request repeated too quickly.
8月 27 14:30:52 inno-MS-7B23 systemd[1]: libvirtd.service: Start request repeated too quickly.
8月 27 14:30:52 inno-MS-7B23 systemd[1]: libvirtd.service: Failed with result 'exit-code'.
8月 27 14:30:52 inno-MS-7B23 systemd[1]: Failed to start Virtualization daemon.
出现这几句,基本上是版本乱了,参考RedHat bugzilla
- libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7’ not found
自编译的包安装的时候,需要清理之前的安装
在安装路径下执行 : sudo make uninstall; make distclean
virt-manager
下载
注:virt-manager一定要用sudo去打开,否则连接不上
- [v]链接不上
Error starting domain: Requested operation is not valid: network 'default' is not active
sudo virsh net-start default
sudo virsh net-autostart default
启动虚拟机命令: virt-manager
(virt) baiy@inno-MS-7B23:vrit-test$ sudo virsh net-list --all
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
安装时虚拟机键盘不能用
virt-manager 运行虚拟机后,发现键盘不能用?
创建虚拟机时先别安装,进入配置界面调整。
Virtual Network Inactive
# virsh net-list --all # 显示所有的virsh netlist
Name State Autostart Persistent
----------------------------------------------------------
default inactive no yes
# virsh net-start default # 激活virtual network default NAT
Network default started
# virsh net-list --all # 显示已激活
Name State Autostart Persistent
----------------------------------------------------------
default active no yes