最近捣鼓了个洋垃圾 E5-2696 V3,虽说总被人称为洋垃圾,但是在我眼里他并不是,而是:洋宝贝! 因为36核cpu已经足够满足我玩虚拟机,集群,部署项目了。再加上我自己买的:
- 内存条:(32*4=128 GB 内存)
- 磁盘:(三星998 pro 固态1TB + 希捷酷鱼 机械2TB)
- 阿卓帕16英尺 2.5k显示器
这些配件一堆上来,我。。。。
真的,真的,真的,在我眼里它真的是宝贝啊!因为他满足了我心中的期待,也赋予了我很强的价值,除了技术价值之外,更为重要的是情绪价值,这滋味或许只有我自己能get,哈哈!
一、购买洋宝贝&安装物理机系统
某鱼购买,机器到货
一顿挑选,入手E5-2696 V3,到货了,当时心情其实和我当年买mac到货是一样的! (当年我的mac配送当天,我是去配送站取得mac,没等到快递小哥给我送😂😂😂,那心情:多巴胺内啡肽疯狂分泌哈哈哈)
火力不足恐惧症(换固态 1T、加机械 2T、换大内存 32*4=128GB)
装系统
由于之前的用户是用来做多开,所以是装的win系统,我是要做linux服务器的,自然要重装系统为Linux,所以我开始研究了下怎么装,我还咨询了2个修电脑店家,告知安一个linux(centos7)系统要400多 ,我擦,干脆我自己来吧。花400装个系统何必呢? (幸亏没花钱找人装,一套linux系统装下来我才发现,也不是很难,要是找人装,看到这么简单,我肯定会后悔😂😂)
制作引导U盘
其实主要就是做引导U盘,也就是需要: 将iso 镜像写入 U 盘,然后通过 U 盘引导安装linux系统。
准备个空的u盘,如果里边有东西需要格式化
(我这新买的,其实各不格式化无所谓,但是还是格式化下,确保干净)
抹掉所有(格式化)
使用命令检测是否被我的电脑(mac)识别:
格式化后,卸载u盘
使用 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
此操作耗时比较久,需要耐心等待会:
之后引导u盘就做好了,接下来插到洋宝贝上,开始安装centos7系统。
开机并狂按F12进入UEFI启动菜单,开始从引导u盘安装系统
开机启动win10系统,并连续按下 F12/F9/F10/F11/ESC(具体哪个键我记不清了大概率是F12) 键进入 UEFI启动菜单,并选择我的 金士顿引导u盘:
在物理机 安装centos7系统
选择系统配置:
接下来的,就没啥可说的了,静静等待安装完成即可。到此物理机就安装好了。是不是so easy?
二、使用kvm安装&管理虚拟机
安装完物理机后,我势必是需要安装虚拟机的,否则一台机器的作用太有限,也不能玩集群,所以我调研了几种虚拟机创建的方式并比较了他们的优劣,如下:
几种虚拟机比较后总结
特性 | KVM | QEMU | VirtualBox | VMware Workstation | ESXi | Docker(容器) |
---|---|---|---|---|---|---|
适用场景 | 服务器、生产环境 | 各种仿真、测试 | 桌面开发和测试 | 桌面开发和测试 | 数据中心、大规模虚拟化 | 应用层轻量级隔离 |
性能 | 高 | 中等 | 一般 | 高 | 极高 | 高 |
易用性 | 中等 | 复杂 | 简单 | 简单 | 需要专业知识 | 简单 |
开源/收费 | 开源 | 开源 | 开源/付费功能 | 收费 | 收费 | 开源 |
操作系统支持 | Linux | 多平台 | 多平台 | 多平台 | 基于Linux的虚拟化平台 | 多平台 |
隔离性 | 高 | 中等 | 中等 | 高 | 极高 | 低 |
硬件虚拟化支持 | 是 (VT-x, AMD-V) | 否 | 是 | 是 | 是 | 否 |
其实VirtualBox也很好用(因为他有桌面,操作起来比较简单),我在我的mac上就是用的VirtualBox
,但是论性能和隔离性方面,不如KVM,综合比较之下,我决定选择KVM来创建&管理虚拟机。在使用之前,我们先简单介绍下kvm。
说明:(我的物理机信息)
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)的工作原理主要包括以下几个关键步骤:
- Linux 内核转变为 Hypervisor:KVM 是 Linux 内核的一个模块。启用 KVM 后,Linux 内核就具备了作为 Hypervisor 的能力,从而管理多个虚拟机实例。每个虚拟机被视为一个独立的 Linux 进程,并且各自隔离,拥有独立的资源。
- 硬件虚拟化支持:KVM 依赖硬件虚拟化扩展,如 Intel 的 VT-x 和 AMD 的 AMD-V。这些技术提供 CPU 级别的虚拟化支持,使虚拟机可以直接访问硬件资源,从而提高虚拟机的性能和资源利用率。
- 虚拟化资源管理:
- 虚拟 CPU:KVM 为每个虚拟机创建虚拟 CPU,映射到物理 CPU 内核。这使得虚拟机可以高效地执行指令。
- 内存虚拟化:KVM 管理并分配物理内存给虚拟机,通过内存隔离技术确保虚拟机间的内存不互相干扰。
- 网络和存储 I/O:通过 Virtio 驱动提供高效的网络和存储接口,虚拟机可以以接近物理机的速度访问网络和存储资源。
- QEMU 协助虚拟化:KVM 结合 QEMU 使用,QEMU 作为用户空间的虚拟机管理器,负责设备模拟(如网络、磁盘),提供与外部系统的接口。QEMU 与 KVM 协同工作,可以提供完整的虚拟机环境。
- 进程管理和隔离:KVM 将每个虚拟机实例化为标准 Linux 进程。借助 Linux 的进程管理功能,虚拟机的资源(如 CPU、内存、磁盘)可以被精确分配和隔离,确保每个虚拟机的独立运行和高隔离性。
KVM 优劣总结
- 优:
- 内核集成:KVM 是 Linux 内核的模块,不需要额外的 Hypervisor(因为当启用 KVM 后,Linux 内核就具备了 Hypervisor 的能力,不需要额外安装一个独立的 Hypervisor)。
- 高性能:借助硬件虚拟化(Intel VT-x 和 AMD-V)技术提供接近裸机的性能。
- 支持多种操作系统:支持几乎所有的主流操作系统,包括不同版本的 Linux 和 Windows。
- 灵活性和可扩展性:KVM 结合了 QEMU 提供的设备仿真,可以灵活创建虚拟机资源,支持动态调整。
- 内置 Virtio 驱动:KVM 使用 Virtio 驱动模型(Virtio驱动是linux内核的一部分)来提供虚拟化的网络、磁盘等 I/O,进一步提升了性能。
- 开源和免费:与许多商业 Hypervisor(如 VMware vSphere 和 Hyper-V)相比,KVM 是开源的,且免费。
- 高效:因为它直接集成在 Linux 内核中,KVM 可以最大程度地利用硬件资源和 Linux 的调度能力。
- 安全:通过隔离虚拟机,确保了每个虚拟机的安全性。结合 Linux 安全功能,如 SELinux 和 cgroups,进一步加强了安全和资源控制。
- 可扩展性:KVM 支持在单一主机上运行大量虚拟机,并且可以通过扩展硬件来扩展虚拟化环境。
- 劣:
- 需要硬件支持:KVM 依赖于 CPU 提供的硬件虚拟化扩展(如 Intel VT-x 或 AMD-V),因此需要相应的硬件支持。
- 对非 Linux 系统的兼容性:KVM 是 Linux 原生的虚拟化解决方案,对于 Windows 环境的支持不如其他专有虚拟化方案(如 VMware 和 Hyper-V)。
- 图形化管理工具较少:虽然有 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)的输出结果:
确认支持虚拟化后,接下来就开干了!
首先安装 KVM 和相关工具
虽然 KVM 是内置在 Linux 内核中的,但要使用和管理 KVM 虚拟机,仍然需要安装一些工具来辅助实现这些功能。具体来说:
- KVM 内核模块:KVM 虽然内置在 Linux 内核中,但仅包含了基本的虚拟化功能。要管理虚拟机的配置和操作,需要更多的用户态工具和库(即不在内核层面),比如 libvirt 和 virt-manager,以便更好地与内核模块配合工作。
- QEMU:KVM 仅支持 CPU 和内存的虚拟化,而 QEMU 提供了必要的设备仿真(如磁盘和网络)。与 KVM 结合,QEMU 可以提供完整的硬件虚拟化支持。通过
qemu-kvm
包,KVM 能够实现完整的虚拟化功能。 - 管理工具(libvirt、virt-install、virt-manager) :
libvirt
是一个 API 和守护进程,允许你通过命令行、图形界面或 API 来管理虚拟机。virt-install
、virt-manager
是基于 libvirt 的管理工具,使虚拟机的管理和创建更加直观和方便。
- 网络支持(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`
执行成功后,可以看到如下界面:
依次执行以下命令可以看到这5个组件的版本信息,说明安装成功:
rpm -qi qemu-kvm
libvirtd --version
virt-install --version
brctl --version
virt-manager --version
启动 libvirt,并设置为开机自启
# 启动 libvirt
sudo systemctl start libvirt
# 开机自启 libvirt
sudo systemctl enable libvirt
创建并编辑kickstart.cfg 文件
如果你通过管理界面安装过centos7系统的话,想必一定知道在安装centos7系统过程中,需要我们选择这些信息(界面如下:来自我之前安装物理机centos7时的一个拍照):
- 语言
- 键盘
- iso文件
- 时区
- 设置root密码
- 设置一个普通用户
- 磁盘分区
- 要安装一个什么类型的系统?比如你如果通过界面安装的话会让你勾选
而我们这里不使用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
查看,如下标红的就是可用的,不能写不存在的否则安装会失败,以下是我的可用安装包:
使用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
有些东西较生疏,下边解释一下这个命令:
--name hzz10
设置虚拟机的名称为 hzz10。--ram 16384
指定虚拟机的内存大小为 16384 MB(16 GB)。--vcpus 8
设置虚拟机的虚拟 CPU 数量为 8。--disk size=500,path=/vm_storage/hzz10/hzz10.qcow2
创建一个大小为 500 GB 的虚拟磁盘(此虚拟机上的所有磁盘操作都是在这个虚拟磁盘上进行),文件路径为 /vm_storage/hzz10/hzz10.qcow2,目录需要有,但是hzz10.qcow2文件是会在安装期间自动创建的--os-type linux
指定虚拟机的操作系统类型为 Linux。--os-variant centos7.0
设置虚拟机的操作系统版本类型为 centos7.0系列,帮助virt-install识别并优化安装过程,注意:并不代表安装的就是centos7.0系统 , 具体安装的系统 取决于你的iso文件(我的是centos7)。--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。--initrd-inject=/home/hzz/kvm/kickstart.cfg
将 Kickstart 文件(kickstart.cfg)注入虚拟机安装过程,用于自动化安装配置centos7系统。--extra-args="ks=file:/kickstart.cfg console=ttyS0"
- ks=file:/kickstart.cfg:告诉安装程序使用注入的 kickstart.cfg 文件作为配置文件。
- console=ttyS0:设置控制台输出为 ttyS0,方便在无图形界面下安装。
--wait -1
设置等待时间为 -1,表示不限制安装超时时间,直到安装完成。--graphics none
禁用图形界面安装,适用于无界面的服务器环境下的安装过程
接下来我们就看下安装过程:
执行后,会自动输出安装日志(如果中途界面乱了(我就遇到过) , 可以重新打开一个会话,执行 virsh console hzz10 就会继续输出了):
耐心等待几分钟就安装好了,接下来我们可使用
virsh list --all
查看虚拟机列表已经有hzz10虚拟机了,之后启动hzz10这个虚拟机,如下:
使用ssh连接试试:
由于我之前使用ssh连接了相同ip的虚拟机并且卸载了,所以会有下边的提示,使用
sudo vim ~/.ssh/known_hosts
删除对应ip的秘钥即可解决此问题。
删除后,使用ssh重连,可以连接成功了,访问内网机器(vm06)以及外网都没问题,ip,分区,预装软件啥的也都和我的预期一致:
安装失败?卸载虚拟机即可
大多数情况下,可能安装并不是那么顺利,这时候就需要卸载虚拟机,使用下边命令:
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
此文件是在我们使用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虚拟机分区情况如下:
要想扩容首先我们得扩容虚拟磁盘,因为这个是某虚拟机的总空间。扩容虚拟磁盘前 需要先关机虚拟机。
扩容 qcow2文件
# 关机
virsh shutdown hzz10
# 扩容
sudo qemu-img resize /vm_storage/hzz10/hzz10.qcow2 +100G
虚拟磁盘扩容后,我使用
virsh start hzz10
启动虚拟机,在里边进行扩容操作,启动后连上机器,使用 lsblk 可以观察到总磁盘大小已经是600GB了。
确认虚拟磁盘扩容到600GB后,接下来开始扩容根分区。
新建分区vda3
qcow2扩展后的空间不会自动被分区识别到,所以需要我们将新扩展的磁盘空间(100GB
)创建为新的分区(vda3
),供 LVM 使用,新建vda3分区的命令如下:
fdisk /dev/vda
- 输入以下步骤以重新创建分区并保存数据:
- 输入
n
创建新分区,选择分区号3
,之后回车即可 - 输入
w
保存并退出fdisk
。
重新同步分区表(确保系统识别新分区vda3)
sudo partprobe
创建 LVM 物理卷 vda3
并加入卷组:
- 创建 LVM 物理卷:vda3
pvcreate /dev/vda3
- 验证
vda3
是否成功初始化:
pvs
- 将
vda3
添加到vg_main
卷组中
vgextend vg_main /dev/vda3
- 验证
vg_main
是否已包含新空间:
vgdisplay vg_main
扩展逻辑卷 lv_root & 扩展根分区文件系统
- 为
lv_root
增加 99GB 的空间:
lvextend -L +99G /dev/vg_main/lv_root
- 扩展根分区文件系统
xfs_growfs /
- 验证根分区新容量:
- df -h
可以看到 根分区 / 已经扩展为 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
注意: 克隆后 新虚拟机的 mac ip 都会变,一般需要使用 virsh_console hzz11 去连接到虚拟机控制台,查看新克隆的虚拟机的ip 这样我们才能在宿主机 使用ssh连上 , 要不ip都不知道没法连接的。
可以看到磁盘分区啥的都和hzz10一致,并且内外网都可访问:
使用x11连接virt-manager管理界面
下载 xquartz:www.xquartz.org/
使用xclock测试并唤醒 xquartz软件
使用ssh并添加-Y参数,连接到物理机,并在物理机 输入 virt-manager 唤起 虚拟机管理工具:virt-manager
通过界面可以查看虚拟机详情
三、最后
当然还有些内网穿透,端口转发,ssh隧道的东西这里就不写出来了。
此机器给我了极大的情绪价值,已经远超其本身的价值,只凭这一点,已经让我心满意足了!
哈哈!