概述 Linux虚拟化技术kvm在集群中应用广泛,在hpc集群中也能够启动关键的作用。
本次项目实践练习,主要在centos7操作系统中,安装kvm虚拟化环境,并且能够使用kvm虚拟化进行虚拟机的安装,管理等
实践练习要求
环境 1.检查宿主机是否支持虚拟化
1 [root@kvm ~]# egrep -o 'vmx | svm' /proc/cpuinfo | wc -l
如果显示数值是 0,则表示该 CPU 不支持虚拟化。
2.虚拟机开启虚拟化
3.关闭iptables 和 selinux
1 2 3 4 5 6 关闭 iptables 服务: [root@kvm ~]# service iptables stop 关闭 selinux: [root@kvm ~]# setenforce 0 [root@kvm ~]# vi /etc/selinux/config SELINUX=disabled
安装和配置 kvm 环境 1.查看是否加载kvm
1 2 3 4 [root@kvm ~]# lsmod | grep kvm kvm_intel 188644 0 kvm 621480 1 kvm_intel irqbypass 13503 1 kvm
2.安装kvm相关软件包
1 yum -y install qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
3.开启kvm服务libvirt并设置开机自启
1 2 [root@kvm ~]# systemctl start libvirtd [root@kvm ~]# systemctl enable libvirtd
4.设置机器的存储
在/home目录下创建两个目录,一个存放系统镜像,一个做虚拟机的存储盘
1 2 [root@kvm ~]# mkdir /home/iso [root@kvm ~]# mkdir /home/images
上传镜像并将镜像放到/home/iso目录下
5.创建物理桥接设备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@kvm ~]# cd /etc/sysconfig/network-scripts/ [root@kvm ~]# cp ifcfg-ens33 ifcfg-br0 [root@kvm ~]# vi ifcfg-ens33 DEVICE=ens33 TYPE=Ethernet ONBOOT=yes BOOTPROTO=none BRIDGE=br0 [root@kvm ~]# vi ifcfg-br0 DEVICE=br0 TYPE=Bridge ONBOOT=yes BOOTPROTO=static IPADDR=172.50.20.15 PREFIX=24 GATEWAY=172.50.20.1 DNS1=114.114.114.114 NAME=br0 # 重启网络 [root@kvm ~]# service network restart
桥接设备关联网卡
创建虚拟机 1.使用virt-manager命令打开虚拟机管理器
virt-manager(这里可以通过图形化创建或者命令行)
libvirtd服务配置文件参数含义 libvirtd配置文件 libvirtd.conf是libvirt的守护进程libvirtd的配置文件 ,被修改后需要让libvirtd重新加载配置文件 (或重启libvirtd )才会生效。
在libvirtd.conf中配置了libvirtd启动时的许多设置,包括是否建立TCP、UNIX domain socket等连接方式及其最大连接数,以及这些连接的认证机制,设置libvirtd的日志级别等
qemu.conf是libvirt对QEMU的驱动的配置文件 ,包括VNC、SPICE等,以及连接它们时采用的权限认证方式的配置,也包括内存大页、SELinux、Cgroups等相关配置。
在qemu目录下存放的是使用QEMU驱动的域的配置文件 。查看qemu目录如下:
其中包括了两个域的XML配置文件 这是用virt-manager工具创建的两个域,默认会将其配置文件保存到/etc/libvirt/qemu/目录下。而其中的networks目录 保存了创建一个域时默认使用的网络配置 。
libvirtd是一个作为libvirt虚拟化管理系统中的服务器端的守护程序 ,要让某个节点能够利用libvirt进行管理(无论是本地还是远程管理! ),都需要在这个节点上运行libvirtd这个守护进程 ,以便让其他上层管理工具可以连接到该节点 ,libvirtd 负责执行 其他管理工具发送给它的虚拟化管理操作指令 。
而libvirt的客户端工具 (包括virsh 、virt-manager 等)可以连接 到本地或远程的libvirtd进程 ,以便管理节点上的客户机 (启动、关闭、重启、迁移等)、收集节点上的宿主机 !和客户机的配置和资源使用状态。
libvirtd命令参数含义 (1)-d或–daemon
表示让libvirtd作为守护进程 (daemon)在后台运行 。
(2)-f或–config FILE
指定libvirtd的配置文件为FILE ,而不是使用默认值(通常是/etc/libvirt/libvirtd.conf )。
(3)-l或–listen
开启配置文件中配置的TCP/IP连接。
(4)-p或–pid-file FILE
将libvirtd进程的PID写入FILE文件 中,而不是使用默认值 (通常是/var/run/libvirtd.pid )。
(5)-t或–timeout SECONDS
设置对libvirtd连接的超时时间 为SECONDS秒。
(6)-v或–verbose
执行命令输出详细的输出信息 。特别是在运行出错时,详细的输出信息便于用户查找原因。
(7)–version
显示libvirtd程序的版本信息 。
创建虚拟磁盘文件
通过qemu-img创建虚拟磁盘文件,给虚拟机创建(共享)存储
虚拟机配置文件位置 通过修改配置文件来添加硬盘,我们首先要关闭虚拟机,否则无法正常添加。
关闭虚拟机,然后使用virsh edit命令修改虚拟机的主配置文件。
虚拟机的所有配置文件都存放在/etc/libvirt/qemu
1 2 3 4 5 6 [root@kvm qemu]# ll 总用量 16 drwx------. 3 root root 42 12月 14 10:39 networks -rw------- 1 root root 4546 12月 14 15:56 node01.xml -rw------- 1 root root 4288 12月 14 14:30 node02.xml [root@kvm qemu]#
编辑虚拟机配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@kvm qemu]# qemu-img create -f qcow2 /home/images/add1.qcow2 5G Formatting '/home/images/add1.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off [root@kvm qemu]# virsh edit node01 <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/home/images/node01.qcow2'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hdb' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/home/images/add1.qcow2'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> 编辑了域 node01 XML 配置。 [root@kvm qemu]# virsh start node01 域 node01 已开始
查看添加的磁盘
vda磁盘添加成功
虚拟机的克隆 将虚拟机 centos7 克隆为虚拟机 node01
注意:克隆前需要先关闭虚拟机;克隆完毕,一般需要设置虚拟机的网络。
1 2 3 4 5 6 7 8 9 10 [root@kvm images]# virt-clone -o centos7 -n node02 -f /home/images/node02.qcow2 正在分配 'node02.qcow2' | 30 GB 00:01:47 成功克隆 'node02'。 [root@kvm images]# virsh list --all Id 名称 状态 ---------------------------------------------------- - centos7 关闭 - node01 关闭 - node02 关闭
创建虚拟机快照和恢复快照 创建快照的条件
虚拟机是关机状态。
虚拟机镜像格式是 qcow2。
创建、恢复快照
1 2 3 4 5 6 7 8 9 [root@kvm ~]# virsh snapshot-create-as centos7 02 已生成域快照 02 [root@kvm ~]# virsh snapshot-list centos7 名称 生成时间 状态 ------------------------------------------------------------ 01 2022-12-13 17:12:23 +0800 shutoff 02 2022-12-13 17:16:20 +0800 shutoff [root@kvm ~]# virsh snapshot-revert centos7 02
删除快照 1 [root@kvm ~]# virsh snapshot-delete centos7 02
快照文件存储位置 1 /var/lib/libvirt/qemu/snapshot
kvm虚拟网络配置 固定虚拟机分配固定的ip地址
首先用virsh dumpxml查看网卡的MAC地址:
1 2 [root@kvm networks]# virsh dumpxml node02 |grep 'mac address' <mac address='52:54:00:2b:3b:d7'/>
修改libvirt网络配置:
1 2 3 4 5 6 7 8 [root@kvm networks]# virsh net-edit default <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> <host mac='52:54:00:2b:3b:d7' name='node02' ip='192.168.122.100'/> </dhcp> </ip> 已编辑网络 default XML 配置
存盘退出。重启网络:
1 2 virsh net-destroy default virsh net-start default
查看配置结果
使用iptables转发虚拟机端口
在虚拟机使用iptables转发虚拟机端口,暴露22端口
在nat表中添加了这2条规则:
iptables -t nat -A PREROUTING -d 192.168.137.105 -p tcp -m tcp –dport 8022 -j DNAT –to-destination 192.168.122.100:22
iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.100 -p tcp -m tcp –dport 22 -j SNAT –to-source 192.168.122.1
注意这两条IPtables规则:
第一条规则很好理解,就是把所有访问192.168.137.105:8022的请求转发到192.168.122.100:22的端口上。
第二条规则我的理解是,把所有来自192.168.122.0/255.255.255.0网段访问192.168.122.100:22的数据全部通过192.168.122.1这个网关转发出去。
删除了表格过滤器FORWARD链的规则4和5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@kvm ~]# $sudo iptables -nL -v --line-numbers -t filter Chain INPUT (policy ACCEPT 294 packets, 25782 bytes) num pkts bytes target prot opt in out source destination 1 14 901 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 2 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 3 1 328 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 4 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 77 5884 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED 2 86 6568 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 3 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 4 9 500 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 5 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 6 0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.122.100 state NEW tcp dpt:22 Chain OUTPUT (policy ACCEPT 232 packets, 27575 bytes) num pkts bytes target prot opt in out source destination 1 1 328 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68 [root@kvm ~]# $sudo iptables -D FORWARD 5 -t filter [root@kvm ~]# $sudo iptables -D FORWARD 4 -t filter
连接虚拟机node02
1 2 3 4 5 [root@slqxhhtt ~]# ssh -p 8022 root@192.168.137.105 Warning: Permanently added '[192.168.137.105]:8022' (ECDSA) to the list of known hosts. root@192.168.137.105's password: Last login: Thu Dec 15 10:50:04 2022 [root@node02 ~]#