购买洋垃圾E5-2696装机 并 使用KVM虚拟技术一键创建安装虚拟机(Centos7系统)

716 阅读24分钟

最近捣鼓了个洋垃圾 E5-2696 V3,虽说总被人称为洋垃圾,但是在我眼里他并不是,而是:洋宝贝! 因为36核cpu已经足够满足我玩虚拟机,集群,部署项目了。再加上我自己买的:

  • 内存条:(32*4=128 GB 内存)
  • 磁盘:(三星998 pro 固态1TB + 希捷酷鱼 机械2TB)
  • 阿卓帕16英尺 2.5k显示器

这些配件一堆上来,我。。。。 image.png 真的,真的,真的,在我眼里它真的是宝贝啊!因为他满足了我心中的期待,也赋予了我很强的价值,除了技术价值之外,更为重要的是情绪价值,这滋味或许只有我自己能get,哈哈!

一、购买洋宝贝&安装物理机系统

image.png

某鱼购买,机器到货

一顿挑选,入手E5-2696 V3,到货了,当时心情其实和我当年买mac到货是一样的! (当年我的mac配送当天,我是去配送站取得mac,没等到快递小哥给我送😂😂😂,那心情:多巴胺内啡肽疯狂分泌哈哈哈WechatIMG184.jpeg

火力不足恐惧症(换固态 1T、加机械 2T、换大内存 32*4=128GB)

WechatIMG186.jpeg WechatIMG185.jpeg image.png

装系统

由于之前的用户是用来做多开,所以是装的win系统,我是要做linux服务器的,自然要重装系统为Linux,所以我开始研究了下怎么装,我还咨询了2个修电脑店家,告知安一个linux(centos7)系统要400多 ,我擦,干脆我自己来吧。花400装个系统何必呢? (幸亏没花钱找人装,一套linux系统装下来我才发现,也不是很难,要是找人装,看到这么简单,我肯定会后悔😂😂)

制作引导U盘

其实主要就是做引导U盘,也就是需要: 将iso 镜像写入 U 盘,然后通过 U 盘引导安装linux系统。

准备个空的u盘,如果里边有东西需要格式化

(我这新买的,其实各不格式化无所谓,但是还是格式化下,确保干净) image.png 抹掉所有(格式化) image.png

使用命令检测是否被我的电脑(mac)识别: image.png

格式化后,卸载u盘 image.png

使用 dd命令 生成引导U盘

(注意在刻盘前,你要提前有个iso镜像文件,没有的话去下载一下)这个文章开头有写下载路径:Mac使用VirtualBox安装Centos7及配置桥接模式(亲测)

重新插入u盘,然后使用命令:

sudo dd if=/Users/hzz/Downloads/CentOS-7-x86_64-DVD-2009.iso of=/dev/disk2 bs=2m

此操作耗时比较久,需要耐心等待会: image.png 之后引导u盘就做好了,接下来插到洋宝贝上,开始安装centos7系统。

开机并狂按F12进入UEFI启动菜单,开始从引导u盘安装系统

开机启动win10系统,并连续按下 F12/F9/F10/F11/ESC(具体哪个键我记不清了大概率是F12) 键进入 UEFI启动菜单,并选择我的 金士顿引导u盘: WechatIMG189.jpeg

在物理机 安装centos7系统

WechatIMG190.jpeg 选择系统配置: WechatIMG193.jpeg 接下来的,就没啥可说的了,静静等待安装完成即可。到此物理机就安装好了。是不是so easy?

二、使用kvm安装&管理虚拟机

安装完物理机后,我势必是需要安装虚拟机的,否则一台机器的作用太有限,也不能玩集群,所以我调研了几种虚拟机创建的方式并比较了他们的优劣,如下:

几种虚拟机比较后总结

特性KVMQEMUVirtualBoxVMware WorkstationESXiDocker(容器)
适用场景服务器、生产环境各种仿真、测试桌面开发和测试桌面开发和测试数据中心、大规模虚拟化应用层轻量级隔离
性能中等一般极高
易用性中等复杂简单简单需要专业知识简单
开源/收费开源开源开源/付费功能收费收费开源
操作系统支持Linux多平台多平台多平台基于Linux的虚拟化平台多平台
隔离性中等中等极高
硬件虚拟化支持是 (VT-x, AMD-V)

其实VirtualBox也很好用(因为他有桌面,操作起来比较简单),我在我的mac上就是用的VirtualBox,但是论性能和隔离性方面,不如KVM,综合比较之下,我决定选择KVM来创建&管理虚拟机。在使用之前,我们先简单介绍下kvm。

说明:(我的物理机信息) image.png

KVM 虚拟化技术

什么是KVM?

KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是一种集成在 Linux 内核中的开源虚拟化技术。通过 KVM,Linux 系统可以变身为一个强大的虚拟机管理程序(Hypervisor),从而使一台主机能够同时运行多个隔离的虚拟环境(即虚拟机,VM)。每个虚拟机可以独立运行不同的操作系统,并与其他虚拟机隔离。

KVM 于 2006 年首次发布,并在 2007 年开始合并到 Linux 主线内核(2.6.20 版本以及之后的更新版本)中。由于 KVM 完全基于现有的 Linux 代码,它能够很方便的利用所有新的 Linux 功能、补丁和改进,无需额外开发。这种深度集成带来了更高的性能和稳定性,使得 KVM 成为 Linux 环境中最流行的虚拟化方案之一。

作为一项虚拟化技术,KVM 在云计算、数据中心和开发环境中得到了广泛应用。其开放源码、与 Linux 内核的无缝集成、出色的隔离性和效率,使得 KVM 成为一个可靠、灵活且高度可扩展的虚拟化解决方案

KVM 工作原理简述

在说KVM原理之前先来了解下:Hypervisor

Hypervisor简述:

Hypervisor(虚拟机监控器)是一种软件、固件或硬件层,允许单个物理主机运行多个虚拟机(Virtual Machines, VM),这些虚拟机彼此隔离,并且可以运行不同的操作系统。Hypervisor 管理和分配主机的硬件资源(如 CPU、内存、存储等)给各个虚拟机,确保资源的高效利用和虚拟机之间的隔离。

Hypervisor 的类型:

  • Type 1 Hypervisor (裸金属虚拟机监控器):

    安装在物理硬件之上直接控制硬件资源,没有底层操作系统的依赖。例如,VMware ESXi、Microsoft Hyper-V、Xen。 优势:性能高、延迟低、更加安全,适用于企业级服务器和数据中心。

  • Type 2 Hypervisor(宿主机虚拟机监控器):

    安装在操作系统之上,依赖宿主操作系统来管理硬件。例如,VirtualBox、VMware Workstation。 优势:易于安装和使用,适用于开发、测试或个人使用环境。

  • KVM 是 Type 1 还是 Type 2?

    KVM 是一种内核级别的虚拟化技术,虽然运行在 Linux 操作系统上,但因为 Linux 本身具备直接控制硬件的能力,因此 KVM 实际上可视为: Type 1 Hypervisor !

KVM(Kernel-based Virtual Machine)的工作原理主要包括以下几个关键步骤:

  1. Linux 内核转变为 Hypervisor:KVM 是 Linux 内核的一个模块。启用 KVM 后,Linux 内核就具备了作为 Hypervisor 的能力,从而管理多个虚拟机实例。每个虚拟机被视为一个独立的 Linux 进程,并且各自隔离,拥有独立的资源。
  2. 硬件虚拟化支持:KVM 依赖硬件虚拟化扩展,如 Intel 的 VT-x 和 AMD 的 AMD-V。这些技术提供 CPU 级别的虚拟化支持,使虚拟机可以直接访问硬件资源,从而提高虚拟机的性能和资源利用率。
  3. 虚拟化资源管理
    • 虚拟 CPU:KVM 为每个虚拟机创建虚拟 CPU,映射到物理 CPU 内核。这使得虚拟机可以高效地执行指令。
    • 内存虚拟化:KVM 管理并分配物理内存给虚拟机,通过内存隔离技术确保虚拟机间的内存不互相干扰。
    • 网络和存储 I/O:通过 Virtio 驱动提供高效的网络和存储接口,虚拟机可以以接近物理机的速度访问网络和存储资源。
  4. QEMU 协助虚拟化:KVM 结合 QEMU 使用,QEMU 作为用户空间的虚拟机管理器,负责设备模拟(如网络、磁盘),提供与外部系统的接口。QEMU 与 KVM 协同工作,可以提供完整的虚拟机环境。
  5. 进程管理和隔离:KVM 将每个虚拟机实例化为标准 Linux 进程。借助 Linux 的进程管理功能,虚拟机的资源(如 CPU、内存、磁盘)可以被精确分配和隔离,确保每个虚拟机的独立运行和高隔离性。

KVM 优劣总结

  1. 优:
    1. 内核集成:KVM 是 Linux 内核的模块,不需要额外的 Hypervisor(因为当启用 KVM 后,Linux 内核就具备了 Hypervisor 的能力,不需要额外安装一个独立的 Hypervisor)。
    2. 高性能:借助硬件虚拟化(Intel VT-x 和 AMD-V)技术提供接近裸机的性能。
    3. 支持多种操作系统:支持几乎所有的主流操作系统,包括不同版本的 Linux 和 Windows。
    4. 灵活性和可扩展性:KVM 结合了 QEMU 提供的设备仿真,可以灵活创建虚拟机资源,支持动态调整。
    5. 内置 Virtio 驱动:KVM 使用 Virtio 驱动模型(Virtio驱动是linux内核的一部分)来提供虚拟化的网络、磁盘等 I/O,进一步提升了性能。
    6. 开源和免费:与许多商业 Hypervisor(如 VMware vSphere 和 Hyper-V)相比,KVM 是开源的,且免费。
    7. 高效:因为它直接集成在 Linux 内核中,KVM 可以最大程度地利用硬件资源和 Linux 的调度能力。
    8. 安全:通过隔离虚拟机,确保了每个虚拟机的安全性。结合 Linux 安全功能,如 SELinux 和 cgroups,进一步加强了安全和资源控制。
    9. 可扩展性:KVM 支持在单一主机上运行大量虚拟机,并且可以通过扩展硬件来扩展虚拟化环境。
  2. 劣:
    1. 需要硬件支持:KVM 依赖于 CPU 提供的硬件虚拟化扩展(如 Intel VT-x 或 AMD-V),因此需要相应的硬件支持。
    2. 对非 Linux 系统的兼容性:KVM 是 Linux 原生的虚拟化解决方案,对于 Windows 环境的支持不如其他专有虚拟化方案(如 VMware 和 Hyper-V)。
    3. 图形化管理工具较少:虽然有 Virt-manager,但总体来说 KVM 的管理工具偏向命令行,对于习惯于图形界面的用户来说可能不够友好。

KVM 相关生态组件

KVM 的虚拟化通常依赖多个组件共同协作,包括:

  • QEMU:提供硬件仿真(如 CPU、网卡、磁盘等),与 KVM 结合使用以创建虚拟机。
  • libvirt:用于管理虚拟化平台的 API 工具库,为 KVM 提供命令行和图形化管理工具。
  • virt-manager:libvirt 提供的图形化界面,用于管理 KVM 虚拟机的生命周期、网络、存储等。
  • Virtio 驱动:KVM 的虚拟化驱动,用于提高磁盘和网络 I/O 性能。

KVM总结

KVM 非常适用于构建服务器虚拟化环境、云平台(如 OpenStack 大量采用 KVM 作为其 Hypervisor),以及生产、开发和测试环境中创建隔离的虚拟机实例。由于 KVM 提供了稳定的性能和较低的资源开销,它也是大型企业和数据中心的理想选择。作为一款强大且灵活的虚拟化解决方案,KVM 具有开源、性能优越、与 Linux 深度集成等优势,已经成为 Linux 生态系统中主流的虚拟化技术。在许多虚拟化部署环境中,KVM 被广泛应用,并且凭借持续发展,KVM 逐渐具备了与其他商用 Hypervisor 竞争的能力。

KVM 安装、创建、管理虚拟机

确认物理机是否支持虚拟化!【这是前提】

使用下边这个命令检测当前 CPU 是否支持虚拟化技术(例如 Intel 的 VT-x(vmx)或 AMD 的 AMD-V(svm)),(想玩虚拟机,cpu必须支持虚拟化技术,否则玩不了啊肯定!这是前提

使用下边命令检测是否支持虚拟化:

egrep -c '(vmx|svm)' /proc/cpuinfo

简单解释下:
# `egrep -c`**:使用 `egrep` 进行正则表达式匹配并返回匹配到的行数。
# `'(vmx|svm)'`** :`vmx` 是 Intel 虚拟化技术的标志,`svm` 是 AMD 虚拟化技术的标志。
# `/proc/cpuinfo`**:Linux 系统文件,包含了 CPU 的详细信息。

# 如果结果是大于 `0` 的数值,表示系统支持虚拟化技术,并显示支持虚拟化的 CPU 核心数。
# 如果结果是 `0`,则表示该系统的 CPU 不支持硬件虚拟化功能。

我的洋宝贝(E5-2696 V3)的输出结果

image.png

确认支持虚拟化后,接下来就开干了!

首先安装 KVM 和相关工具

虽然 KVM 是内置在 Linux 内核中的,但要使用和管理 KVM 虚拟机,仍然需要安装一些工具来辅助实现这些功能。具体来说:

  1. KVM 内核模块:KVM 虽然内置在 Linux 内核中,但仅包含了基本的虚拟化功能。要管理虚拟机的配置和操作,需要更多的用户态工具和库(即不在内核层面),比如 libvirt 和 virt-manager,以便更好地与内核模块配合工作。
  2. QEMU:KVM 仅支持 CPU 和内存的虚拟化,而 QEMU 提供了必要的设备仿真(如磁盘和网络)。与 KVM 结合,QEMU 可以提供完整的硬件虚拟化支持。通过 qemu-kvm 包,KVM 能够实现完整的虚拟化功能。
  3. 管理工具(libvirt、virt-install、virt-manager)
    • libvirt 是一个 API 和守护进程,允许你通过命令行、图形界面或 API 来管理虚拟机。
    • virt-installvirt-manager 是基于 libvirt 的管理工具,使虚拟机的管理和创建更加直观和方便。
  4. 网络支持(bridge-utils) :如果你需要虚拟机通过桥接网络来与外部通信,就需要 bridge-utils 等网络工具来支持桥接配置。

总结一下:

  • qemu-kvm:提供完整的硬件虚拟化支持。
  • libvirt:用于管理 KVM 的服务。
  • virt-install:(基于libvirt) ,用于通过命令行安装虚拟机的工具。
  • bridge-utils:用于创建和管理网络桥接。
  • virt-manager:(基于libvirt)的图形化界面,操作起来相对命令行来说简单些。

接下来我们使用一条命令即可安装这 5个辅助工具,命令如下:

sudo yum install qemu-kvm libvirt virt-install bridge-utils virt-manager -y

# 加上 `-y` 参数表示自动确认安装,无需用户手动输入 `yes`

执行成功后,可以看到如下界面: image.png

依次执行以下命令可以看到这5个组件的版本信息,说明安装成功:

rpm -qi qemu-kvm
libvirtd --version
virt-install --version
brctl --version
virt-manager --version

image.png

启动 libvirt,并设置为开机自启

# 启动 libvirt
sudo systemctl start libvirt

# 开机自启 libvirt
sudo systemctl enable libvirt

image.png

创建并编辑kickstart.cfg 文件

如果你通过管理界面安装过centos7系统的话,想必一定知道在安装centos7系统过程中,需要我们选择这些信息(界面如下:来自我之前安装物理机centos7时的一个拍照): WechatIMG182.jpeg

  • 语言
  • 键盘
  • iso文件
  • 时区
  • 设置root密码
  • 设置一个普通用户
    • image.png
  • 磁盘分区
    • WechatIMG183.jpeg
  • 要安装一个什么类型的系统?比如你如果通过界面安装的话会让你勾选
    • image.png

而我们这里不使用UI界面的方式一样也能定义上边这些信息,那就是通过 kickstart.cfg文件来定义,然后在创建安装虚拟机时 会自动根据你的 kickstart.cfg 配置来创建&定义centos7系统,我的kickstart.cfg文件如下:

# Kickstart 文件配置

# 安装源设置,使用 CDROM 作为安装源,表示安装程序将从物理机的 CD/DVD 驱动器加载操作系统镜像文件
#(通常是 ISO 文件),而不是通过网络或本地磁盘等其他方式获取系统安装文件。
cdrom

# 系统语言设置为中文(简体),编码为 UTF-8
lang zh_CN.UTF-8

# 键盘布局设置为美国英语
keyboard us

# 设置时区为上海,并使用 UTC 时间
timezone Asia/Shanghai --isUtc

# 网络配置,手动设置静态 IP、子网掩码、网关和 DNS
# 这里网关设置成192.168.122.1,因为我得这些虚拟机的模式都是nat模式,需要通过物理机的(创建安装虚拟机时
# libvirt创建的虚拟网桥:)virbr0进行外部网络访问,而192.168.122.1 是virbr0网桥的默认网关ip。
network --device=eth0 --bootproto=static --ip=192.168.122.150 --netmask=255.255.255.0 --gateway=192.168.122.1 --nameserver=114.114.114.114

# 设置 root 用户密码
rootpw --plaintext xzlladg

# 禁用防火墙和 SELinux
firewall --disabled
selinux --disabled

# 创建一个普通用户 hzz 并设置密码
user --name=hzz --password=xzlladg --plaintext --gecos="User hzz"

# 系统安装完成后是否重启
#reboot

# 安装引导程序到 MBR(主引导记录)
bootloader --location=mbr


# 磁盘分区配置(home 200GB 根分区 200GB,具体如下:)
# 清除所有现有分区,并设置新的分区方案(使用 LVM 管理分区)
clearpart --all --initlabel

# 创建 /boot 分区(/boot 需要单独分区且不能在 LVM 中)
part /boot --fstype="xfs" --size=1024  # 设置 boot 分区大小为 1024MB

# 创建一个物理卷和卷组
part pv.01 --size=500000 --grow  # 创建一个物理卷,占用所有剩余空间(500GB)

# 创建卷组
volgroup vg_main --pesize=4096 pv.01  # 创建一个卷组 vg_main

# 创建逻辑卷并设置挂载点
logvol swap --fstype="swap" --name=lv_swap --vgname=vg_main --size=8192  # 设置 
logvol / --fstype="xfs" --name=lv_root --vgname=vg_main --size=200000  # 设置根
logvol /home --fstype="xfs" --name=lv_home --vgname=vg_main --size=200000  
logvol /data --fstype="xfs" --name=lv_data --vgname=vg_main --grow --size=1 

# 软件包选择
%packages
@core                       # 基础系统必需组件
@开发工具                     # 包含编译和开发工具
@系统管理                    # 包含系统管理工具
@系统管理工具                 # 其他系统管理工具
@传统 UNIX 兼容性             # 传统 UNIX 环境的兼容组件
@兼容性程序库                 # 旧版本兼容性库
@安全性工具                   # 系统安全性工具
        
# 常用开发语言及库也一并安装好吧,java maven啥的就按完虚拟机后自己手动安装了
python3             # Python3 编程语言
wget                # 网络下载工具
curl                # 网络请求工具
unzip               # 文件解压工具
net-tools           # 网络工具
vim                 # 文本编辑器
telnet              # 网络测试工具
lsof                # 查看打开文件和端口的工具
tcpdump             # 网络数据包抓取工具
firewalld           # 防火墙管理工具
%end

# 配置完成后启用调试日志,输出到 /root/kickstart.log 文件中
%post
echo "Kickstart 配置已完成。" > /root/kickstart.log
%end

如果你不知道都支持哪些软件包的话可以使用 yum group list查看,如下标红的就是可用的,不能写不存在的否则安装会失败,以下是我的可用安装包: image.png

使用virt-install一键创建并安装虚拟机

kickstart.cfg搞好后,就可以使用virt-install 创建&安装 虚拟机了。命令如下:

sudo virt-install \
  --name hzz10 \
  --ram 16384 \
  --vcpus 8 \
  --disk size=500,path=/vm_storage/hzz10/hzz10.qcow2 \
  --os-type linux \
  --os-variant centos7.0 \
  --location /home/hzz/centos7_iso/CentOS-7-x86_64-DVD-2009.iso \
  --initrd-inject=/home/hzz/kvm/kickstart.cfg \
  --extra-args="ks=file:/kickstart.cfg console=ttyS0" \
  --wait -1 \
  --graphics none

有些东西较生疏,下边解释一下这个命令:

  1. --name hzz10
    设置虚拟机的名称为 hzz10。
  2. --ram 16384
    指定虚拟机的内存大小为 16384 MB(16 GB)。
  3. --vcpus 8
    设置虚拟机的虚拟 CPU 数量为 8。
  4. --disk size=500,path=/vm_storage/hzz10/hzz10.qcow2
    创建一个大小为 500 GB 的虚拟磁盘(此虚拟机上的所有磁盘操作都是在这个虚拟磁盘上进行),文件路径为 /vm_storage/hzz10/hzz10.qcow2,目录需要有,但是hzz10.qcow2文件是会在安装期间自动创建的
  5. --os-type linux 指定虚拟机的操作系统类型为 Linux。
  6. --os-variant centos7.0
    设置虚拟机的操作系统版本类型为 centos7.0系列,帮助virt-install识别并优化安装过程,注意:并不代表安装的就是centos7.0系统 , 具体安装的系统 取决于你的iso文件(我的是centos7)。
  7. --location /home/hzz/centos7_iso/CentOS-7-x86_64-DVD-2009.iso
    使用本地的 CentOS ISO 文件作为安装源,路径为 /home/hzz/centos7_iso/CentOS-7-x86_64-DVD-2009.iso。
  8. --initrd-inject=/home/hzz/kvm/kickstart.cfg
    将 Kickstart 文件(kickstart.cfg)注入虚拟机安装过程,用于自动化安装配置centos7系统。
  9. --extra-args="ks=file:/kickstart.cfg console=ttyS0"
    • ks=file:/kickstart.cfg:告诉安装程序使用注入的 kickstart.cfg 文件作为配置文件。
    • console=ttyS0:设置控制台输出为 ttyS0,方便在无图形界面下安装。
  10. --wait -1
    设置等待时间为 -1,表示不限制安装超时时间,直到安装完成。
  11. --graphics none
    禁用图形界面安装,适用于无界面的服务器环境下的安装过程

接下来我们就看下安装过程:

执行后,会自动输出安装日志(如果中途界面乱了(我就遇到过) , 可以重新打开一个会话,执行 virsh console hzz10 就会继续输出了): image.png image.png image.png image.png image.png 耐心等待几分钟就安装好了,接下来我们可使用 virsh list --all查看虚拟机列表已经有hzz10虚拟机了,之后启动hzz10这个虚拟机,如下: image.png 使用ssh连接试试: 由于我之前使用ssh连接了相同ip的虚拟机并且卸载了,所以会有下边的提示,使用 sudo vim ~/.ssh/known_hosts删除对应ip的秘钥即可解决此问题。 image.png 删除后,使用ssh重连,可以连接成功了,访问内网机器(vm06)以及外网都没问题,ip,分区,预装软件啥的也都和我的预期一致: image.png

安装失败?卸载虚拟机即可

大多数情况下,可能安装并不是那么顺利,这时候就需要卸载虚拟机,使用下边命令:

virsh destroy hzz10
sudo virsh undefine hzz10
rm -rf /vm_storage/hzz10/hzz10.qcow2 

根据日志排查问题后修改,卸载完后,重新安装即可。

virsh常用命令

以下是一些常用的 virsh命令,用于管理虚拟机,下边列出:


# 查看虚拟机状态
virsh list                      # 列出所有正在运行的虚拟机
virsh list --all                # 列出所有虚拟机(包括关闭的)

# 启动/关闭虚拟机
virsh start <vm-name>           # 启动虚拟机
virsh shutdown <vm-name>        # 关闭虚拟机(正常关机)
virsh destroy <vm-name>         # 强制停止虚拟机(类似拔电)

# 暂停/恢复虚拟机
virsh suspend <vm-name>         # 暂停虚拟机
virsh resume <vm-name>          # 恢复暂停的虚拟机

# 重启虚拟机
virsh reboot <vm-name>          # 重启虚拟机

# 删除虚拟机
virsh undefine <vm-name>                 # 从列表中永久删除虚拟机(不会删除磁盘文件)
virsh undefine <vm-name> --remove-all-storage  # 删除虚拟机及其磁盘文件

# 虚拟机快照管理
virsh snapshot-create-as <vm-name> <snapshot-name>  # 创建虚拟机快照
virsh snapshot-list <vm-name>                      # 查看某虚拟机的快照
virsh snapshot-revert <vm-name> <snapshot-name>    # 恢复到指定快照状态
virsh snapshot-delete <vm-name> <snapshot-name>    # 删除指定快照

# 网络管理
virsh net-list --all                # 列出所有网络
virsh net-start <network-name>      # 启动网络
virsh net-destroy <network-name>    # 停止网络
virsh net-define <network-file.xml> # 定义网络(从 XML 文件)
virsh net-undefine <network-name>   # 取消定义网络

# 存储池管理
virsh pool-list --all             # 列出所有存储池
virsh pool-start <pool-name>      # 启动存储池
virsh pool-destroy <pool-name>    # 停止存储池
virsh pool-create <pool-file.xml> # 从 XML 定义文件创建存储池
virsh pool-undefine <pool-name>   # 删除存储池

# 查看虚拟机资源信息
virsh dominfo <vm-name>        # 查看虚拟机的 CPU、内存等信息
virsh domblklist <vm-name>     # 查看虚拟机磁盘
virsh domiflist <vm-name>      # 查看虚拟机网络接口

# 设置虚拟机资源
virsh setmem <vm-name> <size-in-kb> --live    # 增加虚拟机内存(热插拔内存)
virsh setvcpus <vm-name> <number-of-cpus> --live  # 设置虚拟机 CPU 数量

# 虚拟机控制台
virsh console <vm-name>          # 连接到虚拟机控制台
virsh vncdisplay <vm-name>       # 通过 VNC 连接到虚拟机

# 虚拟机 XML 配置
virsh dumpxml <vm-name> > <vm-name>.xml  # 将虚拟机配置导出为 XML 文件
virsh define <vm-name>.xml               # 使用 XML 文件定义虚拟机
virsh edit <vm-name>                     # 在线编辑虚拟机配置

查看虚拟机的定义文件: hzz10.xml

image.png

此文件是在我们使用virsh-install安装&创建虚拟机过程中,帮我们自动生成的,通过阅读此文件,我们可以得到关于虚拟机的一些基本信息,不解释了,文件内容如下:

<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit hzz10
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>hzz10</name>
  <uuid>ec921eb9-69fa-4402-bcef-a6ee1214e4bf</uuid>
  <memory unit='KiB'>16777216</memory>
  <currentMemory unit='KiB'>16777216</currentMemory>
  <vcpu placement='static'>8</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Haswell-noTSX-IBRS</model>
    <feature policy='require' name='md-clear'/>
    <feature policy='require' name='spec-ctrl'/>
    <feature policy='require' name='ssbd'/>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/vm_storage/hzz10/hzz10.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:b8:ff:4b'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </rng>
  </devices>
</domain>

假如根分区设置小了,如何扩容?

注: 本扩容演示基于:使用 lvm管理磁盘分区的情况 下

扩容前根分区情况

现在我的根分区是200gb ,假设经过长时间运行,根分区已经不够用了,那么这时候就需要为其扩容了。现在的(分区前) hzz10虚拟机分区情况如下:

image.png

要想扩容首先我们得扩容虚拟磁盘,因为这个是某虚拟机的总空间。扩容虚拟磁盘前 需要先关机虚拟机。

扩容 qcow2文件

# 关机
virsh shutdown hzz10
# 扩容
sudo qemu-img resize /vm_storage/hzz10/hzz10.qcow2 +100G

image.png 虚拟磁盘扩容后,我使用 virsh start hzz10 启动虚拟机,在里边进行扩容操作,启动后连上机器,使用 lsblk 可以观察到总磁盘大小已经是600GB了。 image.png

确认虚拟磁盘扩容到600GB后,接下来开始扩容根分区。

新建分区vda3

qcow2扩展后的空间不会自动被分区识别到,所以需要我们将新扩展的磁盘空间(100GB)创建为新的分区(vda3),供 LVM 使用,新建vda3分区的命令如下:

fdisk /dev/vda
  • 输入以下步骤以重新创建分区并保存数据:
  • 输入 n 创建新分区,选择分区号 3,之后回车即可
  • 输入 w 保存并退出 fdisk

重新同步分区表(确保系统识别新分区vda3)

sudo partprobe

image.png

创建 LVM 物理卷 vda3 并加入卷组

  • 创建 LVM 物理卷:vda3
pvcreate /dev/vda3
  • 验证 vda3 是否成功初始化:
pvs

image.png

  • vda3 添加到 vg_main 卷组中
vgextend vg_main /dev/vda3
  • 验证 vg_main 是否已包含新空间:
vgdisplay vg_main

image.png

扩展逻辑卷 lv_root & 扩展根分区文件系统

  • lv_root 增加 99GB 的空间:
lvextend -L +99G /dev/vg_main/lv_root
  • 扩展根分区文件系统
xfs_growfs /
  • 验证根分区新容量:
- df -h 

image.png 可以看到 根分区 / 已经扩展为 293GB (之前是193GB),根分区扩容成功。

其实分区挺复杂的涉及的东西老多了,如果你看过鸟哥的私房菜分区相关的知识点,就知道了他说的那句“不装个10遍系统玩不明白分区”这句话的真实性了!

使用 virt-clone 克隆虚拟机

一般在建好一个虚拟机后,需要安装各种基础配置 如java maven docker环境啥的,等到都按照的差不多时,可以根据需要 进行虚拟机克隆,从而实现多虚拟机,这也是玩集群的基础。所以这里说一下如何clone虚拟机。

创建文件夹

mkdir /vm_storage/hzz11/

使用 virt-clone进行克隆 源虚拟机:hzz10 , 新虚拟机 hzz11

sudo virt-clone --original hzz10 --name hzz11 --file /vm_storage/hzz11/hzz11.qcow2

image.png

注意: 克隆后 新虚拟机的 mac ip 都会变,一般需要使用 virsh_console hzz11 去连接到虚拟机控制台,查看新克隆的虚拟机的ip 这样我们才能在宿主机 使用ssh连上 , 要不ip都不知道没法连接的。

可以看到磁盘分区啥的都和hzz10一致,并且内外网都可访问: image.png

使用x11连接virt-manager管理界面

下载 xquartz:www.xquartz.org/

image.png

使用xclock测试并唤醒 xquartz软件

image.png

使用ssh并添加-Y参数,连接到物理机,并在物理机 输入 virt-manager 唤起 虚拟机管理工具:virt-manager

image.png

通过界面可以查看虚拟机详情

image.png

三、最后

当然还有些内网穿透,端口转发,ssh隧道的东西这里就不写出来了。 image.png

此机器给我了极大的情绪价值,已经远超其本身的价值,只凭这一点,已经让我心满意足了! image.png

哈哈!