1.虚拟化基础-2.libvirt-《计算机知识》

admin 2025-11-02 22:30:19 系统网络 来源:ZONE.CI 全球网 0 阅读模式
  • virsh使用
  • virt-manager使用
  • libvirtd使用
  • 环境安装
  • libvirt基础知识
    • libvirt
      • libvirt说明
      • Node,VMM,Domain
      • libvirt组成和管理
      • libvirtd操作(virt-服务连接不上的怀疑点之一)
      • 操蛋的virt配置文件
    • virsh命令
      • 基础命令
      • virsh虚拟机的xml配置
    • virt-manager工具
  • 源代码分析
    • virsh代码分析
    • libvirtd源码分析
  • FAQ
    • libvirt
    • virt启动失败
    • virt-manager
    • 安装时虚拟机键盘不能用
    • Virtual Network Inactive

    注:第一次可以先看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.pnglibvirt包含应用层和各种虚拟化架构的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. ... 修改name和uuid
    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

    • [v]lvm2下载时0大小
    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

    • libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7’ not found自编译的包安装的时候,需要清理之前的安装在安装路径下执行 : sudo make uninstall; make distclean

    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.pngimage.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
    01-shell脚本介绍-《shell脚本》 系统网络

    01-shell脚本介绍-《shell脚本》

    一、shell脚本是什么二、为什么要学shell,而不是其他计算机语言三、学习这门课程的优势四、学了能干什么五、学习什么内容六、学习的技巧七、成长路径八、学习环
    评论:0   参与:  12