云原生运维学习笔记:KVM实战——从环境搭建到热迁移的硬核体验

云原生运维学习笔记:KVM实战------从环境搭建到热迁移的硬核体验

前两天看PPT的时候,感觉自己脑子里塞满了GVA、HPA、敏感非特权指令这些抽象概念,虽然大概懂了虚拟化是咋回事,但总觉得有点飘在空中。今天这份实战文档算是彻底把我拉回了地面------动手实操KVM!从最基础的装系统、敲命令,到后面体验一把企业级的高级特性"虚拟机热迁移",整个流程走下来,感觉之前学的网络、存储(NFS)、Linux基础全都串起来了。这篇博客就详细记录一下我这几天折腾KVM的心路历程和完整操作步骤,希望能帮到同样在啃底层的朋友。


一、 万丈高楼平地起:KVM的两种安装方式

要玩KVM,第一步肯定是把它装出来。文档里给了两种方法,我跟着都试了一遍,各有各的好。

方式1:系统自带,一步到位(CentOS Stream 8)

这种方式最适合新手,直接在装系统的时候勾选好,系统装完,KVM也就绪了。

1. VMware虚拟机的准备

首先在VMware里新建虚拟机。配置这里有个大坑 :在"自定义硬件"里,点击处理器,一定要勾选"虚拟化Intel VT-x/EPT或AMD-V/RVI(V)"。如果不勾,哪怕你系统里装了KVM,也跑不起来虚拟机,因为CPU的硬件辅助虚拟化没开。

2. 安装CentOS Stream 8

挂载ISO镜像启动,一路按部就班(选择语言、设置时区上海、开启网卡自动获取IP、设置Root密码)。

关键的节点来了 :在"软件选择"(Software Selection)界面,默认是最小安装,我们要手动把它改成 "Virtualization Host"(虚拟化主机) 。选中之后,系统就会自动把KVM、QEMU、Libvirt这一套全家桶给你装好。

点击Begin Installation,等待装完重启。

3. 验证KVM

重启登录后,随便敲个命令验证一下:

bash 复制代码
[root@KVM1 ~]# virsh version
Compiled against library: libvirt 8.0.0
Using library: libvirt 8.0.0
Using API: QEMU 8.0.0
Running hypervisor: QEMU 6.2.0

只要能看到这些信息,说明底层虚拟化环境妥了!

方式2:Yum源安装,灵活定制

如果你手里只有一台装好基础系统的服务器(比如只选了最小安装),不想重装系统,那就用这种方式。

1. 基础环境准备

系统装好后,先配置好静态IP(比如192.168.108.101)。

因为这是内网实验环境,没外网,我们需要把系统的ISO光盘挂载起来做本地Yum源。

bash 复制代码
# 查看是否多了一个光盘设备(比如 /dev/sr0)
[root@KVM1 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1 12.8G  0 rom  /run/media/root/CentOS-Stream-8-BaseOS-x86_64
nvme0n1     259:0    0  100G  0 disk 
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0   99G  0 part 
  ├─cs-root 253:0    0 61.2G  0 lvm  /
  ├─cs-swap 253:1    0  7.9G  0 lvm  [SWAP]
  └─cs-home 253:2    0 29.9G  0 lvm  /home

# 手动挂载光盘到 /mnt
[root@KVM1 ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.

2. 配置Yum源

把系统自带的那些不能用的网络源全删了,写一个本地的。

bash 复制代码
[root@KVM1 ~]# cd /etc/yum.repos.d/
[root@KVM1 yum.repos.d]# rm -rf *
[root@KVM1 yum.repos.d]# vim dvd.repo
# 写入以下内容
[AppStream]
name=AppStream
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0

[BaseOS]
name=BaseOS
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0

3. 安装KVM全家桶

刷新缓存,直接装包组。

bash 复制代码
[root@KVM1 yum.repos.d]# yum clean all
[root@KVM1 yum.repos.d]# yum makecache
[root@KVM1 yum.repos.d]# yum group install "Virtualization Host" -y
# ... 等待一堆包安装完成 ...
Installed:
  libvirt-8.0.0-5.module_el8.5.0+1006+be5e9e50.x86_64
  qemu-kvm-6.2.0-11.module_el8.5.0+1040+bc7ad1d5.x86_64
  # 等等...
Complete!

装完重启一下,同样用 virsh version 验证即可。


二、 KVM日常操作:图形界面 vs 命令行

环境搭好了,怎么管?虽然KVM底层很硬核,但Libvirt给了我们很多好用的工具。

1. 图形化管理:virt-manager

如果你开了图形界面,或者在MobaXterm里支持X11转发,直接在终端敲:

bash 复制代码
[root@KVM1 ~]# virt-manager

界面上"Create a new virtual machine"一点,选ISO镜像,分配CPU、内存、磁盘,跟VMware差不多,非常直观。我在实验里装了个Win7,还顺手加了一块网卡和硬盘测试,完全没问题。

2. 命令行管家:virsh

服务器环境下,哪来的图形界面?必须靠命令行。文档里列了一大堆 virsh 命令,我挑几个最常用的记下来。

开机、关机与状态查看:

bash 复制代码
# 查看正在运行的虚拟机
[root@KVM1 ~]# virsh list
 Id   Name    State
---------------------
 1    win7    running

# 查看所有虚拟机(包括关机的)
[root@KVM1 ~]# virsh list --all
 Id   Name    State
---------------------
 -    win7    shut off

# 温柔地关机(发送ACPI信号,相当于点系统的关机)
[root@KVM1 ~]# virsh shutdown win7
Domain 'win7' is being shutdown

# 暴力关机(拔电源,进程直接被干掉)
[root@KVM1 ~]# virsh destroy win7
Domain 'win7' destroyed

挂起与恢复(神技):

这招我特别喜欢。中午去吃饭,虚拟机开着不想关,直接挂起,CPU和内存全释放。

bash 复制代码
[root@KVM1 ~]# virsh suspend win7
Domain 'win7' suspended
[root@KVM1 ~]# virsh list
 Id   Name    State
---------------------
 2    win7    paused

# 吃完饭回来,恢复继续用
[root@KVM1 ~]# virsh resume win7
Domain 'win7' resumed
[root@KVM1 ~]# virsh list
 Id   Name    State
---------------------
 2    win7    running

随宿主机开机自启:

bash 复制代码
[root@KVM1 ~]# virsh autostart win7
Domain 'win7' marked as autostarted

# 取消自启
[root@KVM1 ~]# virsh autostart --disable win7
Domain 'win7' unmarked as autostarted

3. 磁盘管理:qemu-img

KVM的磁盘就是一个qcow2格式的文件。

bash 复制代码
# 新建一块20G的虚拟磁盘
[root@KVM1 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/vm2.qcow2 20G
Formatting '/var/lib/libvirt/images/vm2.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=21474836480 lazy_refcounts=off refcount_bits=16

# 查看磁盘信息
[root@KVM1 ~]# qemu-img info /var/lib/libvirt/images/vm2.qcow2
image: /var/lib/libvirt/images/vm2.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes) # 虚拟大小20G
disk size: 196 KiB # 实际占用只有196K,也就是"精简置备"

4. 命令行纯手工装机:virt-install + VNC

不用图形界面,怎么装系统?用 virt-install,配合 VNC 连上去装。

bash 复制代码
# 创建磁盘
[root@KVM1 ~]# qemu-img create -f qcow2 /disk/vm3.qcow2 20G

# 执行安装命令
[root@KVM1 ~]# virt-install --name vm3 --memory 2048 --vcpus 1 --disk path=/disk/vm3.qcow2 --location /iso/CentOS-7-x86_64-Minimal-1810.iso --network network=default --noautoconsole --vnclisten=0.0.0.0 --vnc --vnport=5903

Starting install...
Retrieving file vmlinuz... 6.3 MB
Retrieving file initrd.img... 50 MB
Domain is still running. Installation may be in progress.
You can reconnect to the console to complete the installation process.

接着,找个VNC Viewer(比如RealVNC),连上 宿主机IP:5903,熟悉的CentOS安装界面就出来了,完美,根本不需要图形桌面!


三、 见证奇迹的时刻:KVM热迁移实验

这是今天最硬核的部分。**热迁移(Live Migration)**是什么?简单说,就是在虚拟机不断电、业务不中断的情况下,把它从一台物理机(KVM1)"瞬间移动"到另一台物理机(KVM2)上。这在实际运维中太有用了,比如你要给物理服务器升级内存或CPU,总不能把上面的业务停了吧?迁走就行!

1. 核心前提:共享存储

热迁移最关键的一点:虚拟机的磁盘不能跟着迁 ,太慢了。必须两台机器都能访问同一个磁盘。

实验架构:KVM1(101)、KVM2(102)、NFS(100)。

先配置一下 NFS 服务端。

bash 复制代码
# 在NFS节点上操作
[root@NFS ~]# mkdir /nfs
[root@NFS ~]# vim /etc/exports
/nfs *(rw,no_root_squash,no_subtree_check)

[root@NFS ~]# systemctl restart nfs-server.service
[root@NFS ~]# systemctl stop firewalld.service
[root@NFS ~]# showmount -e localhost
Export list for localhost:
/nfs *

然后在 KVM1 和 KVM2 上挂载它。

bash 复制代码
# 在KVM1和KVM2上操作
[root@KVM1 ~]# mkdir /NFS
[root@KVM1 ~]# mount -t nfs 192.168.108.100:/nfs /NFS

2. 准备"迁移源"

我们在 KVM1 上通过 virt-manager 连接,在存储池里添加刚才挂载的 /NFS 目录。然后创建一台虚拟机(比如CentOS 7),重点:把它的磁盘创建在 NFS 存储池里! 。

装好系统,这台虚拟机就成了一个完美的实验品。

3. 添加 KVM2 宿主机并执行迁移

在 KVM1 的 virt-manager 界面,点击 File -> Add Connection,把 KVM2(qemu+ssh://root@192.168.108.102/system)加进来。

两边都关闭防火墙(实验环境),准备好后,在 KVM1 的界面上右击正在运行的虚拟机,选择 "Migrate"。

选择目标主机 KVM2,点击 Migrate。

你会看到进度条走一下,然后这台虚拟机就在 KVM2 的列表里亮起绿灯了!在虚拟机的终端里跑个 ping baidu.com,你会发现丢包可能只有1-2个,甚至完全不丢包,业务根本无感知。


四、 学习心得与踩坑总结

这次把 KVM 从安装到热迁移走了一遍,感觉之前学的网络、存储、Linux基础命令全部串在一起了。

踩过的坑与心得:

  1. 虚拟机里面的虚拟机跑不起来 :一开始在 VMware 里装 KVM,后面创建 KVM 虚拟机死活起不来,提示找不到 /dev/kvm。排查半天发现,VMware 的 CPU 虚拟化选项没勾。嵌套虚拟化一定要记得在底层开。
  2. 磁盘格式搞混 :qemu-img create 创建出来的 qcow2 是稀疏文件,看着有 20G,实际只占几百 K,这就是云计算里说的"精简置备 (Thin Provisioning)",特别省空间。但如果你用了 raw 格式,它就是实打实占满,千万别搞错。
  3. 热迁移失败 :一开始搞迁移,死活报错,找不到磁盘路径。后来才恍然大悟,虚拟机创建的时候,磁盘放到了 /var/lib/libvirt/images(本地磁盘)去了。迁移只能迁内存和CPU状态,磁盘文件过去 KVM2 访问不到,当然失败。必须确保虚拟机挂载的是共享存储(NFS)里的盘。
  4. SSH 免密 :Libvirt 在跨主机管理时,默认走 qemu+ssh 协议。所以在 KVM1 上一定要配好到 KVM2 的 SSH 密钥免密登录,否则连不上对面,也迁移不了。

从底层的 CPU 虚拟化原理,到 virsh 命令行的运筹帷幄,再到见证虚拟机"乾坤大挪移"的热迁移,KVM 的这套体系确实精妙。掌握了这些,再去看华为 FusionCompute 或者是 OpenStack 这种云操作系统,就会觉得底层的逻辑其实是一脉相承的,只不过上面多了一层更漂亮的皮和管理机制。

下一阶段就要接触容器(Docker/K8s)了,虚拟化(VM)是重装甲,容器是轻骑兵。但在理解了 VM 的隔离和封装之后,再去理解容器的 Namespace 和 Cgroups,绝对是事半功倍。继续冲!

相关推荐
论文复现现场1 小时前
RTX 3090 云GPU租赁价格对比:8家平台配置、计费方式与环境测试
linux·运维·人工智能·pytorch·深度学习·云计算·3090
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】Trae生成代码介绍
网络·c++·人工智能·学习·架构
tellmewhoisi1 小时前
深度学习5:神经网络学习2:数值微分,偏导,梯度
深度学习·神经网络·学习
深圳老胡1 小时前
STM32C5 应用阶段开发难点解析:从选型到量产的实战经验
笔记·stm32·单片机·代码规范
辣知1 小时前
辣知·化智88 为民族示范变革代价与价值
学习
panpan16191 小时前
中考、高考、KET、PET高效学习工具
学习·高考
云飞云共享云桌面1 小时前
一台SolidWorks设计服务器多人共享落地方案和配置
运维·服务器·3d·电脑·制造
Pointer Pursuit1 小时前
进程优先级
linux·运维·服务器
skywalk81631 小时前
FreeBSD仿真环境里的Ubuntu linux系统,安装软件的时候不支持snap怎么办?
linux·运维·ubuntu·系统·freebsd