【虚拟化】计算虚拟化技术简介,CentOS使用KVM、QEMU安装并管理虚拟机

【虚拟化】计算虚拟化技术简介,CentOS使用KVM、QEMU安装并管理虚拟机

文章目录

1、什么是虚拟化,容器化

技术栈介绍:

  • 虚拟化:在本体Centos上使用KVM/Xen管理虚拟机,其中 KVM 提供了内核级别的虚拟化支持,QEMU 扮演了用户空间中的虚拟机管理和设备仿真的角色。
  • 实例化:镜像管理,Packer 支持使用 KVM 作为虚拟化提供者,通过定义一个适合 KVM 的构建器(builder),Packer 能在 KVM 环境中自动化创建虚拟机映像。
  • 容器化:docker容器化是一种在共享操作系统内核的基础上,将应用程序及其依赖环境封装在独立的运行环境(容器)中进行隔离的技术。

虚拟化和容器化是两种计算技术,旨在隔离应用并提供灵活的资源管理,但它们的实现方式和适用场景有所不同。

虚拟化介绍:

  • 虚拟化是通过在单一物理服务器上运行多个虚拟机(VM)来实现资源隔离。每个虚拟机都有完整的操作系统和虚拟硬件,可以独立运行和管理。
  • 技术实现1(裸金属)-直接运行在物理硬件上,例如 VMware ESXi、Microsoft Hyper-V、KVM。
  • 技术实现2(托管型)-运行在宿主操作系统之上,例如 VMware Workstation、Oracle VirtualBox。

容器化介绍:

  • 容器化是一种在共享操作系统内核的基础上,将应用程序及其依赖环境封装在独立的运行环境(容器)中进行隔离的技术。
  • 容器引擎:容器化依靠容器引擎来管理和运行容器,例如 Docker、Containerd、CRI-O。
  • Namespace 和 Cgroups:Linux 中的 Namespace 和 Cgroups 技术用于实现资源隔离和限制。
  • 镜像:容器应用程序及其依赖项被打包成镜像,镜像层叠加在基础镜像之上。

虚拟化与容器化对比:

特性 虚拟化 容器化
隔离性 强(拥有完整的操作系统) 较弱(共享操作系统内核)
资源利用率 相对较低 相对较高
启动速度 慢(需要启动完整的操作系统) 快(轻量级运行环境)
便携性 依赖于虚拟机格式和平台 高(一次构建,到处运行)
管理和部署 复杂(需要管理多个完整的操作系统) 简单(集中管理和复制)
典型应用 数据中心、高可用架构、开发测试系统等 微服务、DevOps、CI/CD 流程

2、什么是KVM & KVM安装

KVM(Kernel-based Virtual Machine)是一种基于 Linux 内核的开源虚拟化技术,允许用户在 Linux 上运行多个虚拟机,每个虚拟机都有私有的虚拟硬件(CPU、内存、磁盘等)。

参考资料:1

工作原理:

  • 内核模块:KVM 是 Linux 内核的一部分,通过将 Linux 内核转换为一个裸机的 Hypervisor 实现硬件虚拟化。
  • 用户空间工具:通过 libvirt 库和 virsh 命令行工具进行管理,还有 virt-manager 提供图形界面管理。
  • 硬件支持:需要支持虚拟化扩展的 CPU(如 Intel VT-x 或 AMD-V)。

典型使用场景:

  • 运行多个独立操作系统实例以充分利用硬件资源。
  • 设置开发或测试环境来模拟不同的硬件和软件配置。
  • 在数据中心中部署和管理虚拟机

检测是否支持KVM:

  • KVM 是基于 x86 虚拟化扩展(Intel VT 或者 AMD-V) 技术的虚拟机软件,所以查看 CPU 是否支持 VT 技术,就可以判断是否支持KVM。
    有返回结果,如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的。
shell 复制代码
cat /proc/cpuinfo | egrep 'vmx|svm'

flags   : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc

关闭SELinux

  • 将 /etc/sysconfig/selinux 中的 SELinux=enforcing 修改为 SELinux=disabled
shell 复制代码
vi /etc/sysconfig/selinux

通过 yum 安装 kvm 基础包和管理工具

kvm相关安装包及其作用:

  • qemu-kvm 主要的KVM程序包
  • python-virtinst 创建虚拟机所需要的命令行工具和程序库
  • virt-manager GUI虚拟机管理工具
  • virt-top 虚拟机统计命令
  • virt-viewer GUI连接程序,连接到已配置好的虚拟机
  • libvirt C语言工具包,提供libvirt服务
  • libvirt-client 为虚拟客户机提供的C语言工具包
  • virt-install 基于libvirt服务的虚拟机创建命令
  • bridge-utils 创建和管理桥接设备的工具
bash 复制代码
安装 kvm 
# ------------------------
# yum -y install qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
yum -y install qemu-kvm libvirt virt-install bridge-utils 

# 重启宿主机,以便加载 kvm 模块
# ------------------------
reboot

# 查看KVM模块是否被正确加载
# ------------------------
lsmod | grep kvm

kvm_intel             162153  0
kvm                   525259  1 kvm_intel

开启kvm服务,并且设置其开机自动启动

bash 复制代码
systemctl start libvirtd
systemctl enable libvirtd

查看状态操作结果 ,如Active: active (running),说明运行情况良好

bash 复制代码
systemctl status libvirtd
systemctl is-enabled libvirtd

● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since 二 2001-01-02 11:29:53 CST; 1h

3、使用KVM创建虚拟机,配置网络

创建命令

  • 安装前要设置环境语言为英文LANG="en_US.UTF-8",如果是中文的话某些版本可能会报错。CentOS 7 在这里修改 /etc/locale.conf。
  • kvm创建虚拟机,特别注意.iso镜像文件一定放到/home 或者根目录重新创建目录,不然会因为权限报错,无法创建虚拟机。
bash 复制代码
virt-install \
--virt-type=kvm \
--name=centos78 \
--vcpus=2 \
--memory=4096 \
--location=/tmp/CentOS-7-x86_64-Minimal-1511.iso \
--disk path=/home/vms/centos78.qcow2,size=40,format=qcow2 \
--network bridge=br0 \
--graphics none \
--extra-args='console=ttyS0' \
--force
# ------------------------
virt-install --virt-type=kvm --name=centos88 --vcpus=2 --memory=4096 --location=/tmp/CentOS-7-x86_64-Minimal-1511.iso --disk path=/home/vms/centos88.qcow2,size=40,format=qcow2 --network bridge=br0 --graphics none --extra-args='console=ttyS0' --force

命令行配置系统

bash 复制代码
1.带 [!] 基本都是要配置的,按照顺序往下配置,按对用的数字以此进行设置。
2.Timezone settings 时区设置选择 5) Asia亚洲,再选择城市 62) Shanghai上海
3.Installation source 安装源输入数字  2)  local ISO file
4.Software selection 软件选择
5.Installation Destination 安装目的地
6.此处也可以只设置 Root 密码和Installation Destination 安装目的地其它进入系统设置比如时区设置如下:
echo "TZ='Asia/Shanghai'; export TZ" >> /etc/profile

连接/退出虚拟机

bash 复制代码
# 查看虚拟机
virsh list              # 查看在运行的虚拟机
virsh list --all         # 查看所有虚拟机

 Id    Name                           State
----------------------------------------------------
 7     centos72                       running

# 通过 virsh console <虚拟机名称> 命令来连接虚拟机
virsh console centos72

# 通过vnc连接虚拟机
virsh vncdisplay centos72
5900+:3

# 退出虚拟机
exit # 退出系统到登录界面
Ctrl+5 # 从虚拟机登录页面,退出到宿主机命令行页面
Ctrl+] # 或者下面

配置虚拟机网络

  • 本文仅配置虚拟机访问内网外网,参考 1,
  • 更多,配置物理机网络,端口转发,公网访问,宿主机网络桥接模式等等可以见开始的参考文献
bash 复制代码
# 设置(替换成自己的ip,记得先自己到宿主机判断对应的内网ip没有被占用)
nmcli c m enp1s0 ipv4.method manual ipv4.address 10.xxx.0.xxx/26 ipv4.gate 10.xxx.0.101
nmcli c m enp1s0 ipv4.dns 114.114.114.114

# 更新&测试
nmcli c up enp1s0
ping 10.xxx.0.xxx

4、使用KVM管理虚拟机

虚拟机状态管理(开关机等)

bash 复制代码
virsh start centos72     # 虚拟机开启(启动)
virsh reboot centos72    # 虚拟机重新启动
virsh shutdown centos72  # 虚拟机关机
virsh destroy centos72   # 强制关机(强制断电)
virsh suspend centos72   # 暂停(挂起)KVM 虚拟机
virsh resume centos72    # 恢复被挂起的 KVM 虚拟机
virsh undefine centos72  # 该方法只删除配置文件,磁盘文件未删除
virsh autostart centos72 # 随物理机启动而启动(开机启动)
virsh autostart --disable centos72 # 取消标记为自动开始(取消开机启动)

修改虚拟机配置信息

bash 复制代码
# 静态修改:
直接通过vim命令修改: vim  /etc/libvirt/qemu/centos72.xml
通过virsh命令修改: virsh edit centos72

# 动态更改cpu数量和内存大小:
动态调整,如果超过给虚拟机分配的最大内存,需要重启虚拟机。
virsh list --all
#  Id    名称                         状态
# ----------------------------------------------------
#  2     working112                     running
virsh setvcpus working112 --maximum 4 --config # 更改CPU
virsh setmaxmem working112 1048576 --config # 更改内存
virsh dominfo working112 # 查看信息

磁盘挂载与镜像

bash 复制代码
# 挂载磁盘
创建磁盘: mkdir /home/vms
查看镜像信息:
virt-filesystems --long --parts --blkdevs -h -a working112.qcow2
qemu-img info working112.qcow2

# 给虚拟机镜像添加200G大小,注意需要停止working112虚拟机
qemu-img resize working112.qcow2 +200G

# 首先,我们制作如下所示的磁盘的备份副本。
cp working112.qcow2 working112-orig.qcow2

# 然后我们运行下面的命令来增加 /dev/sda
virt-resize --expand /dev/sda1 working112-orig.qcow2 working112.qcow2

# 查看镜像信息
qemu-img info working112.qcow2

# 进入虚拟机virsh console working112 查看信息:
vgdisplay # 显示卷组大小
lvdisplay # 显示逻辑卷大小

# 卷组大小已增加,下面需要分配容量给逻辑卷
lvextend -L +60G /dev/centos/root

# 还有最后一步,分配好了需要做系统调整
# ext 系统格式使用:
resize2fs /dev/centos/root
# xfs 系统格式使用下面命令
xfs_growfs /dev/centos/root


# 通过镜像创建虚拟机
创建虚拟机镜像文件
# 复制第一次安装的干净系统镜像,作为基础镜像文件,
# 后面创建虚拟机使用这个基础镜像
cp /home/vms/centos.88.qcow2 /home/vms/centos7.base.qcow2
# 使用基础镜像文件,创建新的虚拟机镜像
cp /home/vms/centos7.base.qcow2 /home/vms/centos7.113.qcow2
创建虚拟机配置文件
# 复制第一次安装的干净系统镜像,作为基础配置文件。
virsh dumpxml centos.88 > /home/vms/centos7.base.xml
# 使用基础虚拟机镜像配置文件,创建新的虚拟机配置文件
cp /home/vms/centos7.base.xml /home/vms/centos7.113.xml
# 主要是修改虚拟机文件名,UUID,镜像地址和网卡地址,其中 UUID 在 Linux 下可以使用 uuidgen 命令生成
virsh define /home/vms/centos7.113.xml

5、附:qemu安装与配置

参考资料:1官方源码

qemu介绍

  • qemu 是一个开源的虚拟化和仿真器工具,能够模拟各类计算机系统和架构。
    例如 x86、ARM、PowerPC、SPARC、MIPS 等,可以在一台物理机器上运行与主机硬件截然不同的操作系统。
  • 通过与 KVM(Kernel-based Virtual Machine)或 Xen 等虚拟化工具的集成,QEMU 还可以提供高效的虚拟机服务,接近原生性能。
  • QEMU 可以从磁盘映像、CD-ROM、ISO 文件、网络、USB 设备等多种介质启动虚拟机。快照功能:QEMU 支持创建虚拟机的快照,方便用户保存和恢复虚拟机的状态。
  • QEMU 的常见使用场景包括:
    开发和测试不同架构的软件,
    运行与主机不同架构的操作系统,
    创建和管理虚拟机.
  • 要使用 QEMU 创建或运行虚拟机,只需执行相应的命令即可。
    qemu-system-x86_64 -hda mydisk.img -m 1024 -boot c
    上述命令表示使用 QEMU 启动一个 64 位的 x86 虚拟机,从 mydisk.img 磁盘映像启动,并分配 1024 MB 的内存。在实际操作中,可以根据具体需求添加更多参数和选项。

qemu安装与配置

bash 复制代码
# 在 CentOS 或 Rocky Linux 上
sudo yum install qemu-kvm qemu-img

# 在 Ubuntu 或 Debian 上
sudo apt-get install qemu-system-x86

# 在 Fedora 上
sudo dnf install qemu-kvm qemu-img

# 在 macOS 上
brew install qemu

# 安装后,验证 qemu-system-x86_64 是否可以被系统找到:
qemu-system-x86_64 --version

# 检查 PATH 环境变量
export PATH=$PATH:/path/to/qemu # 临时添加
echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc # 永久添加
source ~/.bashrc

# 检查是否成功安装(找位置)
sudo find / -name qemu-system-x86_64
locate qemu-system-x86_64
rpm -qa | grep qemu
dpkg -l | grep qemu
yum search qemu
which qemu-system-x86_64
ls -la /usr/bin/qemu-system-x86_64
sudo chmod +x /usr/bin/qemu-system-x86_64

qemu常用命令2, 3

  • qemu-kvm:是QEMU的一个特定于KVM加速模块的分支,包含了很多关于KVM的特定代码,与KVM模块一起配合使用,提供了CPU虚拟化和内存虚拟化的支持
  • qemu-system-x86_64:运行某种架构的虚拟机。
  • qemu-ga:这是一个不利用网络实现guest和host之间交互的应用程序(使用virtio-serial),运行在guest中。
  • qemu-io:这是一个执行Qemu I/O操作的命令行工具
  • qemu-nbd:磁盘挂载工具,可以用来挂载QEMU镜像文件作为块设备
  • qemu-img:镜像相关,这里以镜像为例子举例放一些命令
  • qemu创建镜像
bash 复制代码
在QEMU中创建镜像文件通常涉及到使用`qemu-img`工具,这是一个命令行实用程序,用于创建、转换和查看QEMU虚拟磁盘镜像。以下是一些基本的`qemu-img`命令,用于创建和管理虚拟磁盘镜像。

1. 创建一个新的空白镜像
qemu-img create -f qcow2 /path/to/new_image.qcow2 20G
这里`-f qcow2`指定了镜像格式为QCOW2,这是一种支持快照和压缩的格式。`20G`是镜像的大小,可以根据需要调整。

2. 从现有的ISO文件创建镜像
qemu-img create -f qcow2 -o file=/path/to/iso_file.iso /path/to/output_image.qcow2
这个命令会从ISO文件创建一个新的QCOW2镜像。

3. 将物理磁盘转换成QEMU镜像
qemu-img convert /dev/sdx -O qcow2 /path/to/image.qcow2
`/dev/sdx`是物理磁盘的设备文件,`-O qcow2`指定输出格式。

4. 调整现有镜像的大小
qemu-img resize /path/to/image.qcow2 +10G
这个命令会增加镜像的大小10G。

5. 查看镜像信息
qemu-img info /path/to/image.qcow2
这个命令会显示镜像的格式、大小、实际使用空间等信息。

6. 克隆现有的镜像
qemu-img clone /path/to/source_image.qcow2 /path/to/cloned_image.qcow2
这个命令会创建一个镜像的完整副本。

7. 压缩QCOW2镜像
qemu-img convert -c /path/to/image.qcow2 -O qcow2 /path/to/compressed_image.qcow2
`-c`选项会在转换过程中压缩镜像。

8. 检查镜像文件的一致性
qemu-img check /path/to/image.qcow2
这个命令会检查镜像文件是否有损坏。

9. 创建一个镜像的快照
qemu-img snapshot -c snapshot_name /path/to/image.qcow2 /path/to/snapshot.qcow2
`-c`选项指定快照名称,`snapshot_name`是快照的标签。

10. 恢复到快照状态
qemu-img snapshot -a snapshot_name /path/to/image.qcow2
`-a`选项用于应用快照。
相关推荐
梅见十柒14 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热17 分钟前
路由基础(全)
linux·网络·网络协议·安全
传而习乎28 分钟前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
soulteary29 分钟前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
我们的五年37 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
IT果果日记1 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教1 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特1 小时前
环境变量简介
linux
小陈phd2 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
运维&陈同学2 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列