「KVM」- 通过 libvirt 管理 VM 实例

解决方案
在这里,“KVM”指的是基于QEMU-KVM的虚拟化;“virsh”指的是管理KVM的工具,属于libvirt软件包。
没有libvirt软件包,使用QEMU-KVM提供的程序依旧可以管理KVM虚拟机。
使用 virsh 命令
将当前用户(非 root 用户)加入 libvirt 组,可以允许当前用户通过 libvirt 管理虚拟机。
使用virsh查看虚拟机
Linux list a KVM vm guest using virsh command
使用virsh启动、停止虚拟机
KVM: Starting / Stopping Guest Operating Systems With virsh Command
给虚拟机添加硬盘
向虚拟机中添加硬盘,对虚拟机进行扩容。「给KVM虚拟机增加硬盘」
#1 主机创建硬盘文件
#2 修改虚拟机XML配置
#3 重启虚拟机或热加载
之后,就可以在虚拟机中查看新添加的硬盘。
使用virsh创建和恢复快照
创建快照之后可以快速的恢复重置虚拟机到指定的时间点。 How to Create VM snapshot on KVM virsh创建和恢复快照 KVM-快照管理
通过VNC访问虚拟机
通过VNC来访问虚拟机“显示器”。 KVM: Connect to a virtual machine(SSH, VNC, Console, virt-viewer etc) kvm虚拟机vnc和spice配置 KVM Virtualization: Start VNC Remote Access For Guest Operating Systems enabling vnc after using virt-install
退出virsh console的连接
How to exit a “virsh console” connection?
常用软件包
libvirtd、virt-manager、virt-install
用KVM的话,直接把这三个软件包都装上把,一般都会用到的
休眠虚拟机(dompmsuspend)
Features/Virt Guest Suspend Hibernate 8.12. Guest Virtual Machine Power Management
参考文献
Install guest CentOS 7 on KVM also on CentOS7 without GUI[……]

READ MORE

「libvirt」- Domain XML format

Element and attribute overview
CPU related
「20.11. CPU Model and Topology」
使用lscpu命令查看CPU的架构,然后使用virsh cpu-models来查看支持的CPU型号。 「1.4. Supported Guest CPU Models」
Example configs
参考文献
libvirt: Domain XML format[……]

READ MORE

「KVM」- CPU model and topology

简单介绍
可以使用以下元素指定CPU「型号」、「特征」、「拓扑」。

<cpu match=’exact’>
<model fallback=’allow’>core2duo</model>
<vendor>Intel</vendor>
<topology sockets=’1′ cores=’2′ threads=’1’/>
<cache level=’3′ mode=’emulate’/>
<feature policy=’disable’ name=’lahf_lm’/>
</cpu>

<cpu mode=’host-model’>
<model fallback=’forbid’/>
<topology sockets=’1′ cores=’2′ threads=’1’/>
</cpu>

<cpu mode=’host-passthrough’>
<cache mode=’passthrough’/>
<feature policy=’disable’ name=’lahf_lm’/>

如果不需要对CPU「型号」及其「特征」进行限制,可以简单的使用一个cpu元素:

<cpu>
<topology sockets=’1′ cores=’2′ threads=’1’/>
</cpu>

配置结构
一个完整的结构如下:

<cpu match=”minimum/exact/strict” check=”none/partial/full” mode=”custom/host-model/host-passthrough”>
<model />
<vendor />
<topology sockets=’1′ cores=’2′ threads=’1’/>
<feature />
<cache />
<numa>
<cell id=”” cpus=”” memory=”” unit=”” memAccess=”” discard=””>
<distances>
<sibling id=” value=”/>
</distances>
</cell>
</numa&g[……]

READ MORE

「KVM」- Working with Guest VM

当虚拟机启动时,进入 BIOS 界面: 1)在 Virt Manager 中,Boot Options ⇒ Enable boot menu[……]

READ MORE

「KVM」- 虚拟机创建

问题描述
在 libvirt 中,具有创建虚拟机的 virsh 命令,能够使用 virsh create configuration-file.xml 命令来创建虚拟机。所以,在使用该命令创建虚拟机前,需要先要创建描述虚拟机信息的 XML 文件,然而编写 XML 文件是件繁琐的工作。
我们希望找到创建虚拟机的快捷方法,能够快速且批量地创建虚拟机,而非简单重复的手动安装。当然,如果使用 IaaS 平台(比如 OpenStack、OpenNebula 等等)管理 KVM 虚拟化,则通常无需这些方法,因为很多 IaaS 平台已经具备这些功能。
该笔记将记录:当使用 KVM 虚拟化时,创建虚拟机的方法,以及常见问题处理。
解决方案
virt-manager(图形化界面安装)
概述:该方法并没有实现快速安装,属于传统的操作系统安装。但是,比创建 XML 文件的方法容易许多。
如果喜欢使用图形化工具,使用 virt-manager 命令。在 Debian 中,该命令属于 virt-manager 软件包:

apt-get install virt-manager

鉴于图形界面比较容器使用,这里不再叙述详细的使用方法。
vrit-install(从命令行安装)
概述:通过命令行安装,我们使用固定的命令行参数,每次都执行相同的命令,也许能简化初始过程。但是,操作系统的安装过程依旧需要我们人工进行,填写必要参数,完成操作系统的安装。
命令 virt-install 是个命令行工具,用于创建虚拟机。在 Debian 中,该命令属于 virtinst 软件包(实际上来自于 virt-manager 软件包,只是发行版将其拆分到不同的包中)。在 CentOS 中,该命令属于 virt-viewer 软件包。(注意,在不同的Linux发行版、或相同Linux发行版的不同版本中,软件包的名字可能会有些许的差异,大体上是一样的)
首先,创建虚拟机。如下命令,指定了虚拟机的名称、内存大小、硬盘大小:

virt-install \
–connect qemu:///system \
–virt-type kvm \
–name guestosname \
–memory 500 \
–disk size=10 \
–cdrom /path/to/os.iso

至此,虚拟机已经从操作系统镜像 /path/to/os.iso 启动,并进入了安装界面。(就像平时从U盘启动后,进入安装界面。)
然后,安装操作系统。接下来,进入显示控制台,进行安装步骤。就像实体机安装操作系统一样,进行操作系统的安装:[……]

READ MORE

「KVM」- 快速创建虚拟机:虚拟机克隆

问题描述
我们需要创建多台虚拟机,那对于我们的场景来说,最简单的方法便是虚拟机克隆。
该笔记将记录:在 KVM 中,如何克隆虚拟机,以及常见问题处理。
解决方案
注意事项: 1)克隆虚拟机不能克隆原主机的特征信息,比如 主机密钥、日志文件、用户帐号、网络设置 等等。所以,在克隆前,需要进行准备工作。
实验环境:Ubuntu 20.04 LTS
第一步、安装命令工具

# apt-file search -x bin/virt-sysprep
libguestfs-tools: /usr/bin/virt-sysprep

# apt-file search -x bin/virt-clone
virtinst: /usr/bin/virt-clone

# apt-get install -y libguestfs-tools virtinst

第二步、安装虚拟机
虚拟机的创建过程不再赘述,假设我们已创建名为 tmpl-ubuntu-1804 的虚拟机。
第三步、准备虚拟机
停止虚拟机:

virsh shutdown tmpl-ubuntu-1804

处理虚拟机(创建模板):

# virt-sysprep -d tmpl-ubuntu-1804
[ 0.0] Examining the guest …
[ 175.9] Performing “abrt-data” …
[ 175.9] Performing “backup-files” …
[ 176.7] Performing “bash-history” …

[ 177.7] Performing “yum-uuid” …
[ 177.7] Performing “customize” …
[ 177.7] Setting a random seed
[ 177.8] Setting the machine ID in /etc/machine-id
[ 178.2] Performing “lvm-uuids” …

该操作将处理虚拟机的诸如主机密钥、日志文件、用户帐号、网络设置等等,防止在克隆时复制这些信息。
第四步、克隆虚拟机
执行如下命令,将自动克隆虚拟机,创建名为 k8s-cp-01 的虚拟机,并创建新的存储:

# virt-clone –original tmpl-ubuntu-1804 –name k8s-cp-01 –auto-clone
Allocating ‘k8s-cp-01.qcow2′[……]

READ MORE

「libvirt」- VNC Console Access

配置VNC远程访问虚拟机控制台(桌面)。
默认是SPICE类型,并且只能本地访问。
修改与的定义,执行命令:virsh edit –domain ‘your-domain’
默认值为<graphics type=’spice’ autoport=’yes’><listen type=’address’/><image compression=’off’/></graphics>是不允许远程访问的。
若向开启远程访问,则定义为:<graphics type=’vnc’ port=’-1′ autoport=’yes’ listen=’0.0.0.0′>,监听多有网卡并且没有密码保护。
如果想使用密码保护,则定义:<grphics type=’vnc’ port=’-1′ autoport=’yes’ listen=’0.0.0.0′ passwd=’yourpassword’>
也可以值监听特定的IP地址,修改listen字段即可。
通过 Console 访问

virsh console –domain “<your-vm-name>”

参考文献
Adjusting VNC Console Access via Libvirt XML 在Windows X86-64主机上运行的qemu-system-aarch64中启用虚拟机图形[……]

READ MORE

「KVM」- 虚拟机迁移

在Host之间迁移Guest是一个复杂的问题,有许多可能的解决方案,每个解决方案都各有优劣。为了实现「Hypervisor集成」和「管理员部署」的最大灵活性,libvirt实现了多种迁移选项。
数据的传输方式
迁移期间使用的数据传输有两种选择:可以是Hypervisor的「原始传输」;或者通过libvirtd连接进行「隧道传输」。
原始传输(由Hypervisor提供)
「原始传输」不一定支持加密,取决于所讨论的Hypervisor,但通常会通过最小化所涉及的数据副本的数量来实现最低的计算成本。「原始传输」还需要管理员在部署Host时进行额外的“Hypervisor特定”的网络配置步骤。对于某些Hypervisor,可能需要在防火墙上打开大量端口,以允许多个并发迁移操作。
隧道传输(由libvirt提供)
「隧道传输」能够进行强加密,因为它们能够利用libvirt的RPC协议中内置的功能。然而,「隧道传输」的缺点是,当数据在libvirtd和Hypervisor之间移动时,源主机和目标主机上都会涉及额外的数据副本。对于RAM非常大的Guest来说,这可能是一个更重要的问题,这会很快损坏内存页面。在部署方面,「隧道传输」不需要对libvirtd进行额外的网络配置,满足「远程访问」即可,并且只需要在防火墙上打开单个端口以支持多个并发迁移操作。
通讯的控制流
迁移虚拟机需要对「所涉及的两个主机」以及「调用迁移的程序」进行紧密协调,这可能有三台主机:源主机、目的主机、第三个主机。
管理的直接迁移(通过client完成)
通过「管理直接迁移」,「libvirt客户端进程」可控制迁移的各个阶段。「客户端」必须能够同时与「源主机」和「目标主机」上的libvirtd守护程序进行连接和身份验证。两个libvirtd守护进程不需要相互通信。如果「客户端」在迁移过程中因为崩溃(或以其他方式)失去与libvirtd的连接,则将尝试中止迁移,并重新启动「源主机」上的Guest的CPU。可能存在无法安全完成此操作的情况,在这种情况下,Guest将暂停在一个或两个主机上。
管理的对等迁移(通过libvirtd完成)
通过「对等迁移」,「libvirt客户端进程」只与「源主机」上的「libvirtd守护进程」通信。「源libvirtd守护程序」通过直接连接「目标主机libvirtd」来控制整个迁移过程。如果「客户端程序」因崩溃(或以其他方式)失去与libvirtd的连接,迁移过程将继续不间断直到完成。
请注意,「源libvirtd」使用自己的凭据(通常是root)连接到「目标libvirtd」,而不是「客户端」用于连接「源libvirtd」的凭据;如果这些不同,通常会遇到「客户端」可以直接连接到「目标主机[……]

READ MORE

「libvirt」- 离线迁移

问题描述
把笔记本上的5个虚拟机实例迁移到Gen10上,之前的虚拟机都在我的笔记本上,现在要迁移到Gen10上;
因为之前用libvirt来管理虚拟机,所参照官方文档的说明就可以了。
什么是离线迁移?
离线迁移传输不活动的域定义 —— 是的,它只传输域的定义(就是 XML 文件),而不会传输虚拟磁盘文件!
当迁移成功完成后,两端域的状态如下:

在「原始主机」上的「域」将保持其当前状态
在「目标主机」上定义「域」,但出于不活动状态

「离线迁移」比”先在「原始主机」上进行virsh dumpxml,后在「目标主机」上进行virsh define“的做法更精巧。因为「离线迁移」将运行「预迁移钩子」,以更新「目标主机上的域XML」。
当前,在「离线迁移」期间,不支持复制「非共享存储」或其他「基于文件的存储」(例如 UEFI 可变存储)。
迁移环境
原始主机:ThinkPad T540p, 172.31.253.2
目的主机:Microserver Gen10, 172.31.253.238
没有共享存储;两台设备网卡直连;
迁移流程
第一步、网络迁移
网络迁移并不复杂,分为两步:1)导出原有的网络配置。2)向目的主机导入网络配置。
我的环境并不复杂,只有一个「默认网络」和一个「隔离网络」。「默认网络」不用处理,只需导出「隔离网络」:

#!/bin/sh

# 导出隔离网络配置(在笔记本上执行)
virsh net-dumpxml –network isolated > /tmp/isolated.xml

# 复制到远程主机中(在笔记本上执行)
scp /tmp/isolated.xml 172.31.253.238:/tmp/isolated.xml

# 在远程主机中导入网络定义(在Microserver Gen10上执行)
virsh net-define /tmp/isolated.xml # 导入网络定义
virsh net-list –all # 查看所有网络,以确定导入成功
virsh net-autostart isolated # 设置自动启动
virsh net-start isolated # 启动网络

第二步、迁移域定义
迁移虚拟机,准确的说是“迁移Guest定义文件”,因为libvirt只能迁移「域定义」:

#!/bin/sh

################################################################################
# 示例一、迁移单台[……]

READ MORE

「KVM」- Networking

本文介绍基于 libvirt 的应用程序使用的常见网络配置。此信息适用于所有「Hypervisor」,无论是 Xen,还是 KVM,又或者其他;
两种常见设置是:

虚拟网络:「NAT 转发」。开箱即用,无需过多设置;
共享设备:「桥接网络」。需要进行特定的手动配置;

本文主要介绍这两种网络。最后一部分是「网络设备直通」相关的内容;
虚拟网络:NAT 转发
#1 对 Host 配置
如果 libvirt 是标准安装的,那它默认提供基于 NAT 的虚拟机连接,开箱即用:

# virsh net-list –all
Name State Autostart Persistent
———————————————-
default inactive yes yes

如果不存在,可以进行定义或者激活:

# virsh net-define /usr/share/libvirt/networks/default.xml
Network default defined from /usr/share/libvirt/networks/default.xml

# virsh net-autostart default
Network default marked as autostarted

# virsh net-start default
Network default started

上面的 default.xml 文件内容类似于:

<!– virsh net-dumpxml –inactive –network default –>
<network>
<name>default</name>
<uuid>aa81e36e-28c6-4ba7-87d1-4599b2671550</uuid>
<forward mode=’nat’/>
<bridge name=’virbr0′ stp=’on’ delay=’0’/>
<mac address=’52:54:00:a3:b6:d1’/>
<ip address=’192.168.122.1′ netmask=’255.255.255.0′>
<dhcp>
<range start=’192.168.122.2′ end=’192.168.122.254’/>
&l[……]

READ MORE

「KVM」- 为虚拟机添加网卡

参考文献
Add a second NIC for a libvirt guest[……]

READ MORE

「KVM」- 实现 Host 与 Guest 访问

问题描述
在 KVM 中,我们经常为虚拟机选择桥接网络,以使虚拟机暴露在内网中,可以被其他主机访问。
但是,使用桥接网络的问题是:虚拟机(Guest)无法访问宿主机(Host),而我们希望两者能够互相访问。
该笔记将记录:在 KVM 中,如何实现宿主机与虚拟机的相互访问,以及常见问题的处理方法。
问题原因
在 KVM 中,Guest 在桥接模式下,无法访问 Host 主机,这并不是错误,而是 macvtap 设备的特性。物理设备绑定到 macvtap 网桥,进入网桥的流量被转发到了设备上,不通过Host的IP网络栈。除此之外,从Host的IP网络栈发出的流量被发往物理设备,也不会反弹到macvtap设备上。
解决方案
方案一、创建隔离网络
原理简述:其实并不复杂,这种做法相当于“为 Guest 添加 NAT 网卡”,这样 Guest 访问 Host 主机。但是,实际上并没有 NAT 转发,所以称为隔离网络。
操作步骤如下:

# 在 Host 上,创建隔离网络(修改 KVM 网络)
cat > /tmp/isolated.xml <<EOF
<network>
<name>isolated</name>
<ip address=’192.168.254.1′ netmask=’255.255.255.0′>
<dhcp>
<range start=’192.168.254.2′ end=’192.168.254.254′ />
</dhcp>
</ip>
</network>
EOF
virsh net-define /tmp/isolated.xml
virsh net-autostart isolated
virsh net-start isolated

# 修改 Host 网络配置,使用隔离网络;
# 如果使用 virt-manager 图形化工具,在为虚拟机添加网卡,选择 isolated 网络
# 或者,使用 virsh edit 修改:
<devices>
<interface type=’network’>
<source network=’isolated’/>
<model type=’virtio’/>
</interface>
</devices>

方案二、为 Host 创建 MACVLAN 网卡
原理简述:其实很简单,Guest 所使用的网卡都是基于物理网卡派生出来的 MACVLAN 类型网卡[……]

READ MORE

「libvirt」- Storage Pools

修改默认存储池
How to change the default Storage Pool from libvirt? libvirt/Chapter 5. Storage Pools
方法一、重新定义

# 查看
virsh pool-list

# 关闭,否则导入时会提示 pool 冲突;
virsh pool-destroy default

# 删除
virsh pool-destroy default

# 定义一个新的存储池
virsh pool-define-as –name default –type dir –target /media/work/kvm

# 自动启动及重启
virsh pool-autostart default
virsh pool-start default

方法二、编辑配置

# 编辑
virsh pool-edit default

# 重启 libvirt 服务
systemctl restart libvirtd.service[……]

READ MORE

「KVM」- 常见错误及注意事项

启动错误
invalid argument: could not find capabilities for arch=x86_64 domaintype=kvm
New KVM VM does not boot: Error: could not find capabilities for domaintype=kvm – Solus Help Center
问题描述:

…libvirtd[1244]: …: 1258: error : virCapabilitiesDomainDataLookupInternal:750 : invalid argument: could not find capabilities for arch=x86_64 domaintype=kvm
…libvirtd[1244]: …: 1257: error : virHostCPUGetTscInfo:1389 : Unable to open /dev/kvm: No such file or directory
…libvirtd[1244]: …: 1260: error : virHostCPUGetTscInfo:1389 : Unable to open /dev/kvm: No such file or directory

原因分析:主板禁用 VT 支持

# dmesg | grep kvm
[ 3.526143] kvm: disabled by bios
[ 3.541212] kvm: disabled by bios
[ 3.552389] kvm: disabled by bios

解决方案:重启主机,修改 BIOS 设置。
vmport is not available with this QEMU binary
问题描述:启动Guest时产生如下错误:

error: unsupported configuration: vmport is not available with this QEMU binary

问题原因:就是不支持嘛
解决办法:修改域定义文件,去掉<vmport/>节点,通常在<features/>中。
error: Unable to get index for interface enp0s25: No such device
问题描述:启动Guest时产生如下错误:

error: Unable to get index for interface enp0s25: No such device

问题[……]

READ MORE

「KVM」- 在休眠恢复时,出现极高的CPU占用

问题描述
在笔记本运行KVM虚拟机,然后休眠,在恢复时,出现CPU占用极高的现象。 在笔记本睡眠恢复时,在KVM中虚拟机出现CPU使用极高的现象。
原因分析
在休眠唤醒时,客户机的虚拟CPU认为自己错过了一些时间。然后,它会读取很多的数据到内存中,并将“内存”映射到“虚拟机的页偏移”将带来CPU与磁盘错误负载。
虚拟机的“暂停”与“恢复”需要“读取”与“重新映射”整个“内存转储”到“内存”中。
解决办法
所有问题都在于CPU时间上。
在Launchpad的「Bug #1174654」中有人给出了解决方案,但是没有经过严格验证,我也没有测试:

<clock offset=’localtime’>
<timer name=’rtc’ track=’guest’/>
</clock>

!!!我们没有深入研究,这是以个解决方向。
附加说明
回到需求当中,用Docker也可以解决问题(虽然用Linux发行版,但是我不是在Linux中运行Windows虚拟机),只需要在容器中运行systemd进程,然后将容器当作“虚拟机”使用即可。还没有到必须使用虚拟机的地步。
相关链接
!!! Live snapshot revert times increases linearly with snapshot age
参考文献
Why Linux inside KVM gets busy after I put the host to suspend-to-ram? qemu-system-x86_64 takes 100% CPU after host machine resumed from suspend to ram[……]

READ MORE

「Cloud Computing」- 三种主要云模型:公有云、私有云、混合云

公有云(Public Cloud)
这类云服务并非用户所拥有,公有云是面向大众提供计算资源的服务。由IDC服务商或第三方提供资源,如应用和存储,这些资源是在服务商的场所内部署。用户通过Internet互联网来获取这些资源的使用。
公有云服务提供商有Amazon、Google、Microsoft、阿里云、腾讯云等。
私有云(Private Cloud)
私有云是企业传统数据中心的延伸和优化,能够针对各种功能提供存储容量和处理能力。“私有”更多是指此类平台属于非共享资源,而非指其安全优势。私有云由于是客户独享,则用户拥有着构建云的基础设置,并可以控制在此技术设置上部署应有程序的方式。
混合云(Hybrid Cloud)
云平台由两种不同模式(私有或公有)云平台组合而成。它利用标准化或专有技术实现绑定,彼此之间能够进行数据和应用的移植。
混合云网络解决方案 VPN
参考文献
Private vs. Public vs. Hybrid Cloud – When to choose what? 三种云的区别:公有云、私有云、混合云 公有云和私有云的区别 一分钟看懂公有云和私有云的区别[……]

READ MORE

「CLOUD-COMPUTING」- 混合云

「混合云」与「MicroServer Gen10」的关系不大。实际上也不是真正的「混合云」,我只不过是把各个机器上运行了「L2TP」服务,然后各个机器连接到一台「云主机」上,夸网络组成了一个虚拟局域网,还是属于VPN的简单应用。
但是遇到不少的疑问和问题: 1)xl2tp – can not connect」- 在家用宽带里,多台主机无法同时连接「LNS」,但是换个宽带就没有问题。 2)xl2tpd – network thread select timeout」- 在xl2tdp的日志中,有一个select timeout with max retries错误提示。 3)Networking Solutions」- 混合云的网络解决方案。[……]

READ MORE

「PRIVATE-CLOUD」- 私有云

开源云计算平台(虚拟化管理平台)
选择哪个虚拟化管理平台,取决于需求场景,在我们场景中: 1)存在部分 ARM 服务器需要进行虚拟化
OpenNebula, Cloud and Edge Computing Platform
CloudStack, Open Source Cloud Computing
Apache CloudStack: Open Source Cloud Computing
CloudStack currently supports the most popular hypervisors: VMware, KVM, Citrix XenServer, Xen Cloud Platform (XCP), Oracle VM server and Microsoft Hyper-V.
# 10/15/2021 Apache CloudStack 4.15.2.0,仅能在 Raspberry Pi4 上部署 CloudStack Agent 服务;[……]

READ MORE

「OpenNebula」- 虚拟化管理平台

问题描述
OpenNebula,这是在某个运维群里推荐的,虚拟化管理平台,是个类似于 OpenStack 的平台。
添加节点及资源
参考 Open Cluster Deployment — OpenNebula 6.0.2 documentation 文档。
集群使用及操作
参考 Storage Management — OpenNebula 6.0.2 documentation 文档。
参考文献
OpenNebula Docs/Deployment Guide/Node Installation/Overview/Hypervisor Compatibility GitHub/OpenNebula[……]

READ MORE

「OpenNebula」- 添加 KVM 节点

问题描述
该笔记将记录:如何向 OpenNebula 中添加 KVM 节点,以及相关问题的解决方案。
解决方案
系统环境
Ubuntu 20.04 LTS CentOS Linux release 7.9.2009 (Core)
第一步、添加仓库
Ubuntu:

apt-get update
apt-get -y install gnupg wget apt-transport-https
wget -q -O- https://downloads.opennebula.io/repo/repo.key | apt-key add –

## Ubuntu 20.04

echo “deb https://downloads.opennebula.io/repo/6.0/Ubuntu/20.04 stable opennebula” > /etc/apt/sources.list.d/opennebula.list
apt-get update

## Ubuntu 18.04

echo “deb https://downloads.opennebula.io/repo/6.0/Ubuntu/18.04 stable opennebula” > /etc/apt/sources.list.d/opennebula.list
apt-get update

CentOS:

## CentOS/RHEL 7

cat << “EOT” > /etc/yum.repos.d/opennebula.repo
[opennebula]
name=OpenNebula Community Edition
baseurl=https://downloads.opennebula.io/repo/6.0/CentOS/7/$basearch
enabled=1
gpgkey=https://downloads.opennebula.io/repo/repo.key
gpgcheck=1
repo_gpgcheck=1
EOT

yum makecache fast

第二步、安装软件
Ubuntu:

apt-get update
apt-get -y install opennebula-node-kvm

systemctl restart libvirtd

CentOS:

yum -y install opennebula-node-kvm
systemctl restart libvirtd

第三步、禁用 SELinux 模块
CentOS:

SELINUX=disabled[……]

READ MORE

「OpenNebula」- 常见问题处理

[……]

READ MORE

「PVE」- Proxmox VE

问题描述
我们正在调研 PVE 虚拟化,需要形成对 PVE 的基础认识,所以我们记录该文档: 1)是我们对 Proxmox VE Administration Guide Release 7.1 的摘录; 2)仅包含我们感兴趣的内容,勉强算是学习笔记,并不具备实质的参考价值;
解决方案
官方文档的章节列表(参考 PDF 手册): Introduction Installing Proxmox VE: Installing and Upgrading Host System Administration Graphical User Interface Cluster Manager Proxmox Cluster File System (pmxcfs) Proxmox VE Storage Deploy Hyper-Converged Ceph Cluster Storage Replication Qemu/KVM Virtual Machines Proxmox Container Toolkit Software Defined Network Proxmox VE Firewall User Management High Availability Backup and Restore Important Service Daemons Useful Command Line Tools Frequently Asked Questions Bibliography Command Line Interface Service Daemons Configuration Files Calendar Events Firewall Macro Definitions Markdown Primer GNU Free Documentation License
相关链接
[經驗分享]淺談 Proxmox VE 版本更新與授權模式
Chapter 1 Introduction
GNU Affero General Public License, version 3
Hyper-converged Infrastructure,超融合基础设施
文档:https://pve.proxmox.com/wiki/Main_Page 论坛:https://forum.proxmox.com/
Chapter 2 Installing Proxmox VE
2.Installing and Upgrading
Chapter 3 Host System Administration
Repository
Proxmox VE Enterprise Repository,为订阅用户[……]

READ MORE

「PVE」- 安装、升级

问题描述
该笔记将记录:如何安装 PVE 环境,以及相关问题的处理方法。
解决方案
通过 PVE ISO 安装
官方提供 PVE 镜像,我们能够通过 PVE 镜像来直接安装:Installation – Proxmox VE

# for Linux
dd bs=1M conv=fdatasync if=./proxmox-ve_*.iso of=/dev/XYZ

# for Windows
# 通过 Etcher 或 Rufus 工具,将 ISO 写入 USB 存储设备;

通过 Debian-based 升级
Alternatively, Proxmox VE can be installed on top of an existing Debian system. 某些特殊硬件,鉴于比如硬件驱动等等原因,我们需要使用这种安装方法: Install Proxmox VE on Debian Buster – Proxmox VE
based on Debian 11(Install Proxmox VE on Debian 11 Bullseye – Proxmox VE):

# vim /etc/hosts

192.168.15.77 prox4m1.example.com prox4m1

# echo “deb [arch=amd64] http://download.proxmox.com/debian/pve bullseye pve-no-subscription” \
> /etc/apt/sources.list.d/pve-install-repo.list

# wget https://enterprise.proxmox.com/debian/proxmox-release-bullseye.gpg \
-O /etc/apt/trusted.gpg.d/proxmox-release-bullseye.gpg

# apt update && apt full-upgrade

# https://github.com/CumulusNetworks/ifupdown2/issues/177
# 否则,当后续装 PVE 环境时,会出现 ifupdwon2 安装错误(执行 Post Script 失败);
# systemctl enable networking

# apt install proxmox-ve postfix open-iscsi

# systemctl reboot

# apt remove linux-image-amd64 ‘linux-image-5.10*’
# u[……]

READ MORE

「PVE」- 集群管理

删除节点
Cluster Manager – Proxmox VE
1)数据迁移备份: 确保相关的数据已经迁移备份,然后再进行特定节点的移除操作;
2)查看所有节点,并登录非被删除节点:

hp1# pvecm nodes

Membership information
~~~~~~~~~~~~~~~~~~~~~~
Nodeid Votes Name
1 1 hp1 (local)
2 1 hp2
3 1 hp3
4 1 hp4

3)关闭需要被移除的节点,并保证其不会以当前配置再次启动; 如果节点再次启动,可能会破坏集群,并导致集群较难恢复;
4)删除节点:

hp1# pvecm delnode hp4
Could not kill node (error = CS_ERR_NOT_EXIST)
Killing node 4

// 如果出现 CS_ERR_NOT_EXIST 错误,可以忽略,该错误是因为 corosync 尝试删除离线节点;

// 从 SSH known_hosts 中删除被移除节点的主机密钥;

# pvecm updatecerts

5)查看集群状态:

hp1# pvecm status

如果希望重新使用被移除的节点: 1)官方建议重新安装,再加入集群; 2)如果不想重新安装(官方不推荐):Separate a Node Without Reinstalling
常见问题处理
… [TOTEM] Retransmit List: …
问题描述:加入节点失败,无法完成节点数据同步(/etc/pve 缺少文件),查看 corosync.service 日志,提示 … Retransmit List … 错误;
原因分析:网线的问题,该环境的网线采用 UTP 1236 wiring 接法,进而导致该问题;
解决方案:更换网线;[……]

READ MORE

「PVE」- 通过 prometheus-pve-exporter + Prometheus + Grafana Dashboard 监控

问题描述
该笔记将记录:通过 prometheus-pve-exporter + Prometheus + Grafana Dashboard 监控 PVE Cluster 的方法,以及相关问题的解决办法。
解决方案
prometheus-pve-exporter + Prometheus + Grafana Dashboard GitHub/prometheus-pve/prometheus-pve-exporter Hetzner Online Community/Gather metrics of your Proxmox server with Prometheus
Grafana Dashboard https://grafana.com/grafana/dashboards/10347-proxmox-via-prometheus/
第一步、prometheus-pve-exporter
Prometheus-pve-exporter Helm Chart | Datree prompve/prometheus-pve-exporter Tags | Docker Hub GitHub/prometheus-pve/prometheus-pve-exporter
# 10/22/2022 当前最新为 v2.2.4 版本;

helm repo add stenic https://charts.stenic.io/
helm repo update

helm pull stenic/prometheus-pve-exporter # prometheus-pve-exporter-0.1.1.tgz
helm show values ./prometheus-pve-exporter-0.1.1.tgz > prometheus-pve-exporter-0.1.1.helm-values.yaml

vim prometheus-pve-exporter-0.1.1.helm-values.yaml
…(1)修改 image.tag: “2.2.4” 参数;(尽管该 Chart 是针对于 pve-exporter 2.0.1 版本)
…(2)修改 pve.user pve.password pve.verify_ssl 参数;

helm install –namespace observing-system –create-namespace \
mon-exp-pve ./prometheus-pve-exporter-0.1.1.tgz -f[……]

READ MORE

「PVE」- 安全、用户、权限

创建用户
0)Permissions => Users => Add 1)Realm: Proxmox VE authentication server 2)其他字段按照要求进行填写即可;
关于 Realm 字段: 1)默认 root 用户,为 pam 域,但是该用户仅为本地用户。如果新添加的用户属于 pam 域,则在设置密码时会提示用户不存在。
授予权限
创建用于审计的用户,该用户仅具有只读权限,通常用户监控系统到 PVE 指标拉取数据;
0)Permissions => Add => User Permission 1)Role: PVEAuditor 2)其他字段按照要求进行填写即可;[……]

READ MORE

「PVE」- 场景及方案

通过接口获取数据
proxmoxer/proxmoxer: python wrapper for Proxmox API v2 (https://pve.proxmox.com/pve-docs/api-viewer/index.html)[……]

READ MORE

「PVE」- 虚拟机(Guests)

Qemu-guest-agent – Proxmox VE
复制粘贴
SPICE/Features Proxmox VE/SPICE 在 PVE 環境下使用 SPICE Client 連接 VM 桌面 [Jonathan’s Wiki 筆記]
All Linux distributions released after 2011 have the necessary qxl driver included as a part of the Xorg package.
在 Linux 中,通过 Remote Viewer 命令,来通过 pve-spice.vv 来连接:remote-viewer ./pve-spice.vv
删除虚拟机(删)

# qm destroy <vmid> –destroy-unreferenced-disks –purge

# for i in $(seq 0 9); do qm destroy 16801005${i}; done

修改虚拟机(改)
删除配置
An Example of using unlink – Remove virtual disks | Proxmox Support Forum
通过命令删除配置(图形化操作超时,命令行将成为替代方法):

# qm config 168010121 # cat /etc/pve/nodes/<node-name>/qemu-server/168010121.conf

unused0: cop-for-dev:vm-168010121-disk-0

# qm unlink 168010121 –idlist unused0

迁移磁盘

// qm disk move <vmid> <disk> [<storage>] [OPTIONS]
// qm move_disk
// qm move-disk

qm disk move 168010121 scsi0 SSD-RAID-5 –delete

迁移虚拟机

qm migrate 168010121 dell-r750xs-100245

… Host key verification failed …(虚拟机迁移失败) [SOLVED] – Host key verification failed when migrate | Proxmox Support Forum

ssh -o ‘Host[……]

READ MORE

「PVE」- 创建虚拟机:通过 cloud-init 安装 Guests 实例

问题描述
该笔记将记录:在 PVE 中,如何使用 cloud-init 进行快速地操作系统安装,以及相关问题解决办法。
解决方案
参考 PVE, Admin Guide, 7.1 / Chapter 10 / 10.1 Cloud-Init Support 文档,我们记录如下学习笔记。
虽然各 Linux 发行版已经提供 Cloud Image 文件,但是 PVE 仍旧建议我们根据需要来制作自己的镜像文件; 同时 PVE 建议我们将 Cloud Image 转化为 Template 以用于快速创建虚拟机(当创建虚拟机时,仅需要简单配置); 最后,PVE 还是通过创建 ISO 文件来传递配置,所以需要为虚拟机添加 CD-ROM 驱动; 很多 Cloud Image 假设具备串口控制台,所以 PVE 也建议我们在虚拟机中添加,以用于作为虚拟机的显示器;

// ### 第一步、准备 cloud-init 模板

wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img

qm create 9000 –memory 2048 –net0 virtio,bridge=vmbr1 # create a new VM
qm importdisk 9000 focal-server-cloudimg-amd64.img local-lvm # import the disk to local-lvm storage
qm set 9000 –scsihw virtio-scsi-pci –scsi0 local-lvm:vm-9000-disk-0 # Ubuntu Cloud-Init images require the virtio-scsi-pci controller type for SCSI drives.

qm set 9000 –ide2 local-lvm:cloudinit # configure a CD-ROM drive used to pass the Cloud-Init data to the VM.
qm set 9000 –boot c –bootdisk scsi0 # This will speed up booting
qm set 9000 –serial0 socket –vga serial[……]

READ MORE

「PVE」- 网络(Networking)

常见问题记录
关于链路聚合的问题(LACP 802.3ad)
在与华为交换机进行链路聚合时,如果在 PVE Web GUI 中调整链路聚合的配置,此时会出现建立失败的问题;
获取是 Linux 实现的问题(或许是 MAC-ADDRESS 相关的问题);
需要重启 PVE 得以解决该问题。当重启操作系统之后,或许是清除 Bond 相关的配置,使得其重新建立会话;
e1000e eno1: Detected Hardware Unit Hang
e1000e eno1: Detected Hardware Unit Hang: | Proxmox Support Forum
问题描述: 节点突然掉线,从显示屏查看,出现 e1000e eno1: Detected Hardware Unit Hang 错误信息。 PVE 7.1, Ethernet controller: Intel Corporation Ethernet Connection (2) I219-V
原因分析: 1)根据社区的描述,可能是驱动的问题;
解决方案: 1)社区提供的配置方法并没有解决我们的问题。 2)我们最终尝试将 PVE 7.1 升级到 PVE 7.2(Kernel 5.15.53-1-pve),问题得以解决(还需进一步观察);
# 09/20/2022 该问题还是未解决,我们只能暂时放弃使用该网卡。[……]

READ MORE