[命令] KVM 命令 qemu (管理系统镜像文件)

注意:

在使用 qemu 命令之前要先安装 KVM ,并且需要 root 权限

正文:

内容一:系统镜像文件显示

# qemu-img info disk.img 

(补充:这里以显示 disk.img 的系统镜像信息为例)

内容二:创建系统镜像文件

# qemu-img create -f qcow2 disk.img 50G 

(补充:这里以创建一个最大大小是 50G,格式为 qcow2 ,名为 disk.img 的镜像为例)


注意:
1) 这个系统镜像是空的,还需要往里面装系统
2) 克隆的系统镜像的容量一点要大于被克隆系统镜像的大小,显示镜像设置的大小的命令是:# qemu-img info disk.img,不是 # ls -l

内容三:克隆系统镜像文件

# qemu-img create -b disk.qcow2 -f qcow2 newdisk.img 

(说明:从 disk.qcow2 克隆出一个格式为 qcow2 的名为 newdisk.img 的系统镜像,最大大小与被克隆的镜像一样)

[命令] KVM 命令 virsh (管理虚拟机和虚拟网络)

注意:

在使用 virsh 命令之前要先安装 KVM ,并且需要 root 权限

正文:

内容目录:

内容一:virsh 命令所有选项的显示方法

内容二:虚拟机显示
2.1 显示所有虚拟机
2.2 显示所有正在运行的虚拟机
2.3 显示某一台虚拟机
2.4 显示某一台虚拟机的网卡情况

内容三:虚拟机管理
3.1 启动某一台虚拟机
3.2 重启某一台虚拟机
3.3 正常关闭某一台虚拟机
3.4 强制关闭某一台虚拟机
3.5 让某一台虚拟机自动启动
3.6 取消某一台虚拟机的自动启动
3.7 定义某一台虚拟机(也就是把虚拟机加入 KVM 虚拟机中)
3.8 取消定义某一台虚拟机(也就是把虚拟机从 KVM 软件删除)
3.9 修改名某一台虚拟机的配置文件
3.10 通过 console 口登陆某一台虚拟机

内容四:虚拟网络显示
4.1 显示所有虚拟网络
4.2 显示所有正在运行的虚拟网络
4.3 显示某一个虚拟网络

内容五:虚拟网络管理
5.1 启动某一个虚拟网络
5.2 强制关闭某一个虚拟网络
5.3 让某一个虚拟网络自动启动
5.4 取消某一个虚拟网络的自动启动
5.5 定义某一个虚拟网络(也就是把虚拟网络加入 KVM 软件)
5.6 取消定义某一台虚拟网络(也就是把虚拟网络从 KVM 软件删除)

内容六:虚拟机快照
6.1 给某一个台虚拟机创建虚拟机快照
6.2 显示某一台虚拟机的所有快照
6.3 删除某一台虚拟机的某一个快照
6.4 恢复某一台虚拟机的某一个快照

具体的内容:

内容一:virsh 命令所有选项的显示方法

# virsh --help

内容二:虚拟机显示
2.1 显示所有虚拟机

# virsh list --all

2.2 显示所有正在运行的虚拟机

# virsh list

2.3 显示某一台虚拟机

# virsh dominfo <host>

2.4 显示某一台虚拟机的网卡情况

# visrsh domiflist <host>

内容三:虚拟机管理
3.1 启动某一台虚拟机

# virsh start <host>

3.2 重启某一台虚拟机

# virsh reboot <host>

3.3 正常关闭某一台虚拟机

# virsh shutdown <host>

3.4 强制关闭某一台虚拟机

# virsh destroy <host>

3.5 让某一台虚拟机自动启动

# virsh autostart <host>

3.6 取消某一台虚拟机的自动启动

# virsh autostart --disable <host>

3.7 定义某一台虚拟机(也就是把虚拟机加入 KVM 虚拟机中)

# virsh define <host.xml>

(注意:要先生成好对应的系统镜像 host.img 和镜像配置文件 host.xml)

3.8 取消定义某一台虚拟机(也就是把虚拟机从 KVM 软件删除)

# virsh undefine <host>

3.9 修改名某一台虚拟机的配置文件

# virsh edit <host>

(注意:要先关闭此虚拟机再进行修改)

3.10 通过 console 口登陆某一台虚拟机

# virsh console <host>

内容四:虚拟网络显示
4.1 显示所有虚拟网络

# virsh net-list --all

4.2 显示所有正在运行的虚拟网络

# virsh net-list

4.3 显示某一个虚拟网络

# virsh net-info <network>

内容五:虚拟网络管理
5.1 启动某一个虚拟网络

# virsh net-start <network>

5.2 强制关闭某一个虚拟网络

# virsh net-destroy <network>

5.3 让某一个虚拟网络自动启动

# virsh net-autostart <network>

5.4 取消某一个虚拟网络的自动启动

# virsh net-autostart --disable <network>

5.5 定义某一个虚拟网络(也就是把虚拟网络加入 KVM 软件)

# virsh net-define <network.xml>

(注意:要先生成好虚拟网络配置文件 network.xml)

5.6 取消定义某一台虚拟网络(也就是把虚拟网络从 KVM 软件删除)

# virsh net-undefine <network>

内容六:虚拟机快照
6.1 给某一个台虚拟机创建虚拟机快照

# virsh snapshot-create-as <host> <snapshot>

6.2 显示某一台虚拟机的所有快照

# virsh snapshot-list <host>

6.3 删除某一台虚拟机的某一个快照

# virsh snapshot-delete <host> <snapshot>

6.4 恢复某一台虚拟机的某一个快照

# virsh snapshot-revert <host> <snapshot> --current

[工具] Shell 批量克隆 KVM 虚拟机 (中文版)

注意:

在克隆 KVM 虚拟机之前要先安装 KVM 、创建 KVM 虚拟网络和 KVM 模板机

介绍:

作者:朱明宇
名称:批量克隆 KVM 虚拟机(中文版)
作用:批量克隆 KVM 虚拟机(中文版)

使用方法:
1. 在此脚本的分割线内写入相应的内容
2. 给此脚本添加执行权限
3. 执行此脚本

脚本分割线里的变量:
1. templatedisk=”/test/kvm/images/rockylinux8.qcow2″ #模板机硬盘文件
2. templatexml=”/test/kvm/qemu/rockylinux8.xml” #模板机 xml 文件
3. templatename=”rockylinux8″ #模板机在 KVM 域中的名称
4. newdiskpath=”/test/kvm/images/” #新模版机硬盘文件目录
5. newxmlpath=”/test/kvm/qemu/” #新模版机硬盘文件目录

注意:
1. 在执行此脚本之前要先安装 KVM
2. 在执行此脚本之前要先准备好模板机的硬盘文件和 xml 文件
3. 请以 root 的权限执行次脚本

脚本:

#!/bin/bash
#作者:朱明宇
#名称:批量克隆 KVM 虚拟机
#作用:批量克隆 KVM 虚拟机
#使用方法:
#1.在此脚本的分割线内写入相应的内容
#2.给此脚本增加执行权限
#3.执行此脚本
#注意:
#1.在执行此脚本之前要先安装 KVM
#2.在执行此脚本之前要先准备好模板机的硬盘文件和 xml 文件
#3.请以 root 的权限执行次脚本

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

templatedisk="/test/kvm/images/rockylinux8.qcow2" #模板机硬盘文件
templatexml="/test/kvm/qemu/rockylinux8.xml" #模板机 xml 文件
templatename="rockylinux8" #模板机在 KVM 域中的名称
newdiskpath="/test/kvm/images/" #新模版机硬盘文件目录
newxmlpath="/test/kvm/qemu/" #新模版机硬盘文件目录

###此为分割线,分割线里的内容可让懂 Shell 用户自行修改,如果你不懂 Shell 请勿修改###

echo

mkdir $newdiskpath &> /dev/null

sudo systemctl start libvirtd &> /dev/null
if [ $? -ne 0 ];then
	echo
	echo -e "\033[31m你没有安装 KVM 或者你没有以 root 权限执行次脚本,脚本无法执行\033[0m"
	exit
fi

ls $templatedisk &> /dev/null
if [ $? -ne 0 ];then
        echo
        echo -e "\033[31m模版机硬盘文件不存在,脚本无法执行\033[0m"
        exit
fi

ls $templatexml &> /dev/null
if [ $? -ne 0 ];then
        echo
        echo -e "\033[31m模版机配置文件不存在,脚本无法执行\033[0m"
        exit
fi

sudo virsh destroy $templatename &> /dev/null
sudo virt-sysprep -d $templatename &> /dev/null
dnet=`sudo virsh net-list | sed -n 3p  | awk '{print $1}'`

read -p "将要克隆虚拟机,单独克隆一台请输入 1,批量克隆请输入任意其他字符 " cloneway
if [ ! $cloneway ];then
	echo
	echo -e "\033[31m你没有输入任何值,立刻退出\033[0m"
	exit
fi

if [ $cloneway == 1 ];then
	read -p "要克隆产生的主机名称,没有默认值必须输入一个 " onename

	echo $onename | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m要克隆产生的主机名 '$onename' 不能有空格,停止克隆\033[0m"
                exit
        fi

        if [ ! $onename ];then
		echo
                echo -e "\033[31m你没有输入要克隆产生的主机名,停止克隆\033[0m"
                exit
        fi

	sudo virsh list --all | egrep -w $onename &> /dev/null
        if [ $? -eq 0 ];then
		echo
                echo -e "\033[31m要克隆产生的主机名 '$onename' 已经存在了,停止克隆\033[0m"
                exit
        fi

        read -p "要克隆的主机所属的虚拟网络,直接回车则是选择已创建的网络中排名最靠前的 $dnet " net

        echo $net | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m网络名 '$net' 不能有空格,停止克隆\033[0m"
                exit
        fi

	read -p "要克隆产生的主机 CPU 核心数,请只输入数字,最小为 1,单位个,直接回车则是使用默认值 1 " cpu

	echo $cpu | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m CPU 核心数 '$cpu' 不能有空格,停止克隆\033[0m"
                exit
        fi

	read -p "要克隆产生的主机内存大小,请只输入数字,单位 K,直接回车则是使用默认值 1048576 " mem

        echo $mem | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m内存大小 '$mem' 不能有空格,停止克隆\033[0m"
                exit
        fi

	read -p "要克隆产生的主机硬盘大小,请只输入数字,单位 G,直接回车则是使用默认值 10 " disk

        echo $disk | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m硬盘大小 '$disk' 不能有空格,停止克隆\033[0m"
                exit
        fi

	echo
	echo "名称:"
	echo "使用主机名 '$onename'"

else
	read -p "要批量克隆产生的主机名称的前缀名称,没有默认值必须输入一个 " name

	echo $name | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m要批量克隆产生的主机名称前缀 '$name' 不能有空格,停止克隆\033[0m"
                exit
        fi


        if [ ! $name ];then
		echo
                echo -e "\033[31m你没有输入要批量克隆产生的主机名称前缀,停止克隆\033[0m"
                exit
        fi

	read -p "要批量克隆产生的主机名后缀起始编号,没有默认值必须输入一个,请只输入数字 " snum

        if [ ! $snum ];then
		echo
                echo -e "\033[31m你没有输入要批量克隆产生的主机名后缀起始编号,停止克隆\033[0m"
                exit
        fi

        echo $snum | grep '\-' &> /dev/null
        if [ $? -eq 0 ];then
		snum=${snum##*-}
                echo -e "\033[33m你输入的要批量克隆产生的主机名后缀起始编号可能是一个负数,将只使用整数部分 $snum\033[0m"
        fi

        echo $snum | grep '\.' &> /dev/null
        if [ $? -eq 0 ];then
                snum=${snum%%.*}
                echo -e "\033[33m你输入的要批量克隆产生的主机名后缀起始编号可能是一个小数,将只使用数字部分 $snum\033[0m"
        fi

        let snum+0 &> /dev/null
        if [ $? -ne 0 ];then
                echo
                echo -e "\033[31m你输入的要批量克隆产生的主机名后缀起始编号 $snum 不是数字,无法克隆\033[0m"
        exit
        fi

	read -p "要批量克隆产生的主机名后缀结束编号,没有默认值必须输入一个,请只输入数字 " enum

        if [ ! $enum ];then
                echo -e "\033[31m你没有输入要批量克隆产生的主机名后缀结束编号,停止克隆\033[0m"
        fi

	echo $enum | grep '\-' &> /dev/null
        if [ $? -eq 0 ];then
                enum=${enum##*-}
                echo -e "\033[33m你输入的要批量克隆产生的主机名后缀结束编号可能是一个负数,将只使用数字部分 $enum\033[0m"
        fi

        echo $enum | grep '\.' &> /dev/null
        if [ $? -eq 0 ];then
                enum=${enum%%.*}
                echo -e "\033[33m你输入的要批量克隆产生的主机名后缀结束编号可能是一个小数,将只使用整数部分 $enum\033[0m"
        fi

        let enum+0 &> /dev/null
        if [ $? -ne 0 ];then
                echo -e "\033[31m你输入的要批量克隆产生的主机名后缀结束编号 $enum 不是数字,无法克隆\033[0m"
                exit
        fi

        read -p "要批量克隆的主机所属的虚拟网络,直接回车则是选择已创建的网络中排名最靠前的 $dnet " net

        echo $net | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m网络名 '$net' 不能有空格,停止克隆\033[0m"
                exit
        fi

	read -p "要批量克隆产生的主机 CPU 核心数,请只输入数字,最小为 1,单位个,直接回车则是使用默认值 1 " cpu

        echo $cpu | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m CPU 核心数 '$cpu' 不能有空格,停止克隆\033[0m"
                exit
        fi

	read -p "要批量克隆产生的主机内存大小,请只输入数字,单位 K,直接回车则是使用默认值 1048576 " mem

        echo $mem | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m内存大小 '$mem' 不能有空格,停止克隆\033[0m"
                exit
        fi

	read -p "要批量克隆产生的主机硬盘大小,请只输入数字,单位 G,直接回车则是使用默认值 10 " disk

        echo $disk | grep '\ ' &> /dev/null
        if [ $? -eq 0 ];then
                echo
                echo -e "\033[31m硬盘大小 '$disk' 不能有空格,停止克隆\033[0m"
                exit
        fi

	echo
	echo "名称:"
	for i in `seq $snum $enum`
	do
	sudo virsh list --all | egrep -w $name$i &> /dev/null
	if [ $? -eq 0 ];then
		echo -e "\033[33m使用主机名 '$name$i' ,已经存在了,将跳过不克隆它\033[0m"
	else
		echo "使用主机名 '$name$i' "
	fi
        done
fi

echo

echo "网络:"

sudo virsh net-list | grep $net &> /dev/null
if [ $? -eq 0 ];then
        echo "使用网络 $net"
fi

if [ ! $net ];then
        net=`sudo virsh net-list | sed -n 3p  | awk '{print $1}'`
	echo -e "\033[33m你没有输入网络,将使用默认网络 $net\033[0m"
	echo "使用网络 $net"
fi

sudo virsh net-list | grep $net &> /dev/null
if [ $? -ne 0 ];then
        net=`sudo virsh net-list | sed -n 3p  | awk '{print $1}'`
        echo -e "\033[33m你输入的要克隆主机的所属的网络不存在,将使用默认网络 $net\033[0m"
	echo "使用网络 $net"
fi

echo

echo "CPU:"

if [ ! $cpu ];then
	cpu=1
	echo -e "\033[33m你没有输入 CPU 核心数,将使用默认 CPU 核心数 1\033[0m"
else

        echo $cpu | grep '\-' &> /dev/null
        if [ $? -eq 0 ];then
                cpu=${cpu##*-}
                echo -e "\033[33m你输入的 CPU 核心数可能是一个负数,将只使用数字部分 $cpu\033[0m"
        fi

        echo $cpu | grep '\.' &> /dev/null
        if [ $? -eq 0 ];then
                cpu=${cpu%%.*}
                echo -e "\033[33m你输入的 CPU 核心数可能是一个小数,将只使用整数部分 $cpu\033[0m"
        fi

	let cpu=cpu+0 &> /dev/null
	if [ $? -ne 0 ];then
		echo -e "\033[33m你输入的 CPU 核心数不是数字,将使用默认值 1\033[0m"
                cpu=1
	fi

	if [ $cpu -lt 1 ];then
                echo -e "\033[33m你输入的 CPU 核心数小于 1,将使用默认值 1\033[0m"
		cpu=1
	fi
fi

echo "CPU 核心数 $cpu"

echo

echo "内存:"

if [ ! $mem ];then
	mem=1048576
        echo -e "\033[33m你没有输入内存大小,将使用默认内存大小 1048576 K\033[0m"

else

        echo $mem | grep '\-' &> /dev/null
        if [ $? -eq 0 ];then
                mem=${mem##*-}
                echo -e "\033[33m你输入的内存大小可能是一个负数,将只使用数字部分 $mem\033[0m"
        fi

        echo $mem | grep '\.' &> /dev/null
        if [ $? -eq 0 ];then
                mem=${mem%%.*}
                echo -e "\033[33m你输入的内存大小可能是一个小数,将只使用整数部分 $mem\033[0m"
        fi

	let mem=mem+0 &> /dev/null
	if [ $? -ne 0 ];then
		echo -e "\033[33m你输入的内存大小不是数字,将使用默认值 1048576\033[0m"
                mem=1048576
	fi

	if [ $mem -lt 1048576 ];then
                echo -e "\033[33m你输入的内存大小小于 1048576,将使用默认值 1048576\033[0m"
		mem=1048576
	fi
fi

echo "内存大小 $mem K"

echo

echo "硬盘:"

if [ ! $disk ];then
	disk=10
        echo -e "\033[33m你没有输入硬盘大小,将使用默认硬盘大小 10 G\033[0m"

else

        echo $disk | grep '\-' &> /dev/null
        if [ $? -eq 0 ];then
                disk=${disk##*-}
                echo -e "\033[33m你输入的硬盘大小可能是一个负数,将只使用数字部分 $disk\033[0m"
        fi

        echo $disk | grep '\.' &> /dev/null
        if [ $? -eq 0 ];then
                disk=${disk%%.*}
                echo -e "\033[33m你输入的硬盘大小可能是一个小数,将只使用整数部分 $disk\033[0m"
        fi

	let disk=disk+0 &> /dev/null
	if [ $? -ne 0 ];then
		echo -e "\033[33m你输入的硬盘大小不是数字,将使用默认值 10\033[0m"
	fi

	if [ $disk -lt 10 ];then
		echo -e "\033[33m你输入的硬盘大小小于 10,将使用默认值 10\033[0m"
		disk=10
	fi
fi

echo "硬盘大小 $disk G"

echo

echo "备注(可能没有任何信息):"

if [ $cloneway -eq 1 ];then
	sudo qemu-img create -f qcow2 -b $templatedisk $newdiskpath$onename.qcow2 ${disk}G &> /dev/null
	sudo cp $templatexml $newxmlpath$onename.xml
	sudo sed -i "/uuid/d" $newxmlpath$onename.xml
	sudo sed -i "/mac address/d" $newxmlpath$onename.xml
	sudo sed -i "s:<name>.*</name>:<name>$onename</name>:" $newxmlpath$onename.xml
	sudo sed -i "s:<source file=.*/>:<source file=\'$newdiskpath$onename.qcow2\'/>:" $newxmlpath$onename.xml
	sudo sed -i "s:<vcpu placement='static'>.*</vcpu>:<vcpu placement='static'>$cpu</vcpu>:" $newxmlpath$onename.xml
	sudo sed -i "s:.*</memory>:<memory unit='KB'>$mem</memory>:" $newxmlpath$onename.xml
	sudo sed -i "s:.*</currentMemory>:<currentMemory unit='KB'>$mem</currentMemory>:" $newxmlpath$onename.xml
        sudo sed -i "s:<source network=.*:<source network=\'$net\'/>:" $newxmlpath$onename.xml
	sudo virsh define $newxmlpath$onename.xml &> /dev/null
        sudo virsh start $onename &> /dev/null
	echo
	sudo virsh list --all
else
	for i in `seq $snum $enum`
	do
                sudo virsh list --all | egrep -w $name$i &> /dev/null
                if [ $? -eq 0 ];then
		      echo -e "\033[33m$name$i 没有被克隆\033[0m"
	       	      continue
                fi
		sudo qemu-img create -f qcow2 -b $templatedisk $newdiskpath$name$i.qcow2 $[disk]G &> /dev/null
		sudo cp $templatexml $newxmlpath$name$i.xml
		sudo sed -i "/uuid/d" $newxmlpath$name$i.xml
		sudo sed -i "/mac address/d" $newxmlpath$name$i.xml
		sudo sed -i "s:<name>.*</name>:<name>$name$i</name>:" $newxmlpath$name$i.xml
		sudo sed -i "s:<source file=.*/>:<source file=\'$newdiskpath$name$i.qcow2\'/>:" $newxmlpath$name$i.xml
		sudo sed -i "s:<vcpu placement='static'>.*</vcpu>:<vcpu placement='static'>$cpu</vcpu>:" $newxmlpath$name$i.xml
		sudo sed -i "s:.*</memory>:<memory unit='KB'>$mem</memory>:" $newxmlpath$name$i.xml
		sudo sed -i "s:.*</currentMemory>:<currentMemory unit='KB'>$mem</currentMemory>:" $newxmlpath$name$i.xml
                sudo sed -i "s:<source network=.*:<source network=\'$net\'/>:" $newxmlpath$name$i.xml
	        sudo virsh define $newxmlpath$name$i.xml &> /dev/null
                sudo virsh start $name$i &> /dev/null
      done
      echo
      sudo virsh list --all
fi

[步骤] KVM 的安装

步骤一:系统环境要求

服务器系统要配置好可用的软件源

步骤二:安装 KVM
2.1 CentOS&RHEL 安装 KVM

# yum -y install qemu-kvm libvirt-daemon libvirt-client libvirt-daemon-driver-qemu virt-install virt-manager virt-viewer virt-v2v

2.2 openSUSE&SUSE 安装 KVM

# zypper in -t pattern kvm_server
# zypper in -t pattern kvm_tools

步骤三:启动 KVM

# systemctl start libvirtd-manager

步骤四:使用 KVM

# virt-manager


补充:
1) qemu-kvm libvirt-daemon libvirt-client libvirt-daemon-driver-qemu 是必选安装项
2) virt-install(虚拟机命令行安装器) virt-manager(虚拟机图形界面安装和管理器) virt-v2v(虚拟机导入器) 是可选安装项

[步骤] KVM 虚拟机模板的创建 (CentOS Linux 7 版)

注意:

在创建 KVM 虚拟机之前要先安装 KVM 并创建 KVM 虚拟网络

软件准备:

在 CentOS 官网上下载安装系统所需要的镜像:

https://centos.org/download/

正文:

步骤目录:

步骤一:创建 KVM 虚拟机模板的目的

步骤二:为这个虚拟机创建硬盘文件
2.1 创建硬盘文件
2.2 确认硬盘文件已创建

步骤三:使用 KVM 和刚刚创建的硬盘文件新安装一台虚拟机
3.1 启动 KVM 的 virt-manager
3.2 在 virt-manager 上的左上角点击文件之后点击“新建虚拟机”
3.2.1 选择以本地安装介质的方式安装系统
3.2.2 选择安装系统的系统镜像
3.2.3 设置内存大小和 CPU 核心数
3.2.4 选择用刚刚创建的硬盘文件来安装系统
3.2.5 给虚拟机命名并选择虚拟网络
3.2.6 开始安装系统
3.2.7 选择系统语言
3.2.8 之后进行系统配置界面
3.2.8.1 通过 “INSTALLATION DESTINATION” 对硬盘进行分区
3.2.8.2 取消 “KDUMP”
3.2.9 之后点击右下角的 “Begin installation”
3.2.10 在安装的过程中设置 root 密码,安装完成后重启
3.2.11 在安装系统的过程中需要注意的内容总结

步骤四:进入新创建虚拟机修改配置
4.1 修改网卡个性化设置
4.1.1 修改网卡配置文件
4.1.2 使修改的网卡配置生效
4.2 禁用 selinux
4.3 禁用空路由
4.4 添加 Console 配置
4.4.1 修改 grub 内核配置文件
4.4.2 使修改的 grub 内核配置生效
4.5 将系统自动挂载的硬盘从使用 UUID 换成硬件路径
4.5.1 显示根分区的 UUID
4.5.2 在自动挂载文件里将根分区的 UUID 换成硬件路径
4.6 删除不用的程序
4.7 配置虚拟系统的 yum 源
4.7.1 备份旧 yum 源
4.7.1.1 创建备份目录
4.7.1.2 备份旧 yum 源
4.7.2 创建新的 yum 源文件
4.7.3 删除旧的 yum 源数据
4.7.4 刷新新的 yum 源
4.8 对虚拟系统进行升级
4.9 进行分区扩展
4.9.1 安装分区扩展软件
4.9.2 给开机自启配置文件相应的权限
4.9.3 设置开机自动扩容根目录
4.10 修改虚拟机系统的名称
4.11 启用 serial 服务实现通过 virsh console 命令控制虚拟机
4.12 清除虚拟系统的历史命令
4.13 关闭虚拟机

步骤五:在真机上对虚拟机进行清理优化

步骤六:此时就可以将此虚拟机的硬件文件作为模块批量克隆虚拟机了

具体的操作步骤:

步骤一:理解创建 KVM 虚拟机模板的目的

主要用于批量克隆出新的 KVM 机器,节约创建新虚拟机的时间

步骤二:为这个虚拟机创建硬盘文件
2.1 创建硬盘文件

(只在真机上执行以下步骤)

# qemu-img create -f qcow2 /var/lib/libvirt/images/template_centos_7_10g.qcow2 10G

(补充:这里以创建 10G 大小的 template_centos_7_10g.qcow2 硬盘文件为例)

2.2 确认硬盘文件已创建

(只在真机上执行以下步骤)

# ls /var/lib/libvirt/images/ | grep template_centos_7_10g.qcow2

(补充:这里以确认 template_centos_7_10g.qcow2 硬盘文件为例)

步骤三:使用 KVM 和刚刚创建的硬盘文件新安装一台虚拟机
3.1 启动 KVM 的 virt-manager

(只在真机上执行以下步骤)

# virt-manager

3.2 在 virt-manager 上的左上角点击文件之后 “点击新建虚拟机”

(只在真机上执行以下步骤)

(步骤略)

3.2.1 选择以本地安装介质的方式安装系统

(只在真机上执行以下步骤)

(图:1)

3.2.2 选择安装系统的系统镜像

(只在真机上执行以下步骤)

(图:2)

(补充:这里以使用 centos-7.6-x86_64-everythin-1810.iso 系统镜像为例)

3.2.3 设置内存大小和 CPU 核心数

(只在真机上执行以下步骤)
(图:3)

(补充:这里以设置 2048 MiB 内容和 2 核 CPU 为例)

3.2.4 选择用刚刚创建的硬盘文件来安装系统

(只在真机上执行以下步骤)

(图:4)

(补充:这里以使用 template_centos_7_10g.qcow2 硬盘文件为例)

3.2.5 给虚拟机命名为并选择虚拟网络

(注意:虚拟网络必须提前创建好)

(只在真机上执行以下步骤)

(图:5)

(补充:这里以将虚拟机命名为 template_centos_7_10g 并使用 vlan001 网络为例)

3.2.6 开始安装系统

(只在真机上执行以下步骤)

(图:6)

3.2.7 选择系统语言

(只在真机上执行以下步骤)

(图:7)

3.2.8 之后进行系统配置界面

(只在真机上执行以下步骤)

需要手动配置的地方有两个:
1) “INSTALLATION DESTINATION”
2) “KDUMP”
分别点击以后就可以配置了

3.2.8.1 通过 “INSTALLATION DESTINATION” 对硬盘进行分区

(只在真机上执行以下步骤)

(补充:完成后点击左上角的 “DONE”)

(注意:只分一个分区,只设置一个挂载点挂载到根,使用标准硬盘类型,硬盘格式设置为 XFS)

(图:8)
(图:9)

3.2.8.2 取消 “KDUMP”

(只在真机上执行以下步骤)

(补充:完成后点击左上角的 “DONE”)

(图:10)

3.2.9 设置完成之后点击右下角的 “Begin installation”

(只在真机上执行以下步骤)

(图:11)

3.2.10 在安装的过程中设置 root 密码,安装完成后重启

(只在真机上执行以下步骤)

(图:12)

3.2.11 在安装系统的过程中需要注意的内容总结

1) 一定要使用刚刚创建的 /var/lib/libvirt/images/template_centos_7_10g.qcow2 作为安装虚拟机的硬件文件
2) 虚拟机网络 “vlan001” 要提前创建好
3) 只分一个分区,只设置一个挂载点挂载到根,使用标准硬盘,硬盘格式是 XFS
4) 取消 “KDUMP”

步骤四:进入新创建虚拟机修改配置
4.1 修改网卡个性化设置
4.1.1 修改网卡配置文件

(只在虚拟机上执行以下步骤)

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

将全部内容进行如下修改:

BOOTPROTO=dhcp
NAME=eth0
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet

4.1.2 使修改的网卡配置生效

(只在虚拟机上执行以下步骤)

# service network restart

4.2 禁用 selinux

(只在虚拟机上执行以下步骤)

# vi /etc/selinux/config

将全部内容进行如下修改:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

4.3 禁用空路由

(只在虚拟机上执行以下步骤)

# vi /etc/sysconfig/network

将全部内容修改如下:

# Created by anaconda
NOZEROCONF="yes"

4.4 添加 Console 配置
4.4.1 修改 grub 内核配置文件

(只在虚拟机上执行以下步骤)

# vi /etc/default/grub

将全部内容修改如下:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --unit=1 --speed=115200"
GRUB_CMDLINE_LINUX="biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200n8"
GRUB_DISABLE_LINUX_UUID="true"
GRUB_ENABLE_LINUX_LABEL="true"
GRUB_DISABLE_RECOVERY="true"

4.4.2 使修改的 grub 内核配置生效

(只在虚拟机上执行以下步骤)

# grub2-mkconfig -o grub

4.5 将系统自动挂载的硬盘从使用 UUID 换成硬件路径
4.5.1 显示根分区的 UUID

(只在虚拟机上执行以下步骤)

# blkid
/dev/vda1: UUID="84ccf593-a924-4949-b7ef-584be43deef5" TYPE="xfs"

(补充:这里的 UUID 是: 84ccf593-a924-4949-b7ef-584be43deef5)

4.5.2 在自动挂载文件里将根分区的 UUID 换成硬件路径

# vi /etc/fstab

将以下内容:

......
UUID=84ccf593-a924-4949-b7ef-584be43deef5 /                   xfs     defaults        0 0

(补充:这里的 UUID 是: 84ccf593-a924-4949-b7ef-584be43deef5)

修改为:

......
/dev/vda1 /                   xfs     defaults        0 0

4.6 删除不用的程序

(只在虚拟机上执行以下步骤)

# yum -y remove NetworkManager-* firewalld-* python-firewall

4.7 配置虚拟系统的 yum 源
4.7.1 备份旧 yum 源
4.7.1.1 创建备份目录

(只在虚拟机上执行以下步骤)

# mkdir /etc/yum.repos.d/backup

4.7.1.2 备份旧 yum 源

(只在虚拟机上执行以下步骤)

# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup

4.7.2 创建新的 yum 源文件

(只在虚拟机上执行以下步骤)

# vi /etc/yum.repos.d/lan.repo

创建以下内容:

[CentOS7]
name=CentOS7
baseurl=http://192.168.100.254/CentOS7/
enabled=1
gpgcheck=0

(注意:这里的 http://192.168.1.250/centos7/ 需要根据真实环境的情况进行更改)

4.7.3 删除旧的 yum 源数据

(只在虚拟机上执行以下步骤)

# yum clean all

4.7.4 刷新新的 yum 源

(只在虚拟机上执行以下步骤)

# yum repolist

4.8 对虚拟系统进行升级

(只在虚拟机上执行以下步骤)

# yum -y update

4.9 进行分区扩展
4.9.1 安装分区扩展软件

(只在虚拟机上执行以下步骤)

# yum install -y cloud-utils-growpart

4.9.2 给开机自启配置文件相应的权限

(只在虚拟机上执行以下步骤)

# chmod 755 /etc/rc.local

4.9.3 设置开机自动扩容根目录

(只在虚拟机上执行以下步骤)

# vi /etc/rc.local

添加以下内容:

/usr/bin/growpart /dev/vda1 
/usr/sbin/xfs_growfs /

4.10 修改虚拟机系统的名称

(只在虚拟机上执行以下步骤)

# vi /etc/hostname

将全部内容修改如下:

template_centos_7_10g

4.11 启用 serial 服务实现通过 virsh console 命令控制虚拟机

(只在虚拟机上执行以下步骤)

# systemctl start serial-getty@ttyS0
# systemctl enable serial-getty@ttyS0

4.12 清除虚拟系统的历史命令

(只在虚拟机上执行以下步骤)

# history -c

4.13 关闭虚拟机

(只在虚拟机上执行以下步骤)

# poweroff

步骤五:在真机上对虚拟机进行清理优化

(只在真机上执行以下步骤)

# sudo virt-sysprep -d template_centos_7_10g

(补充:这里以清理 template_centos_7_10g 虚拟机为例)


注意:如果此命令不存在
1) CentOS 系统的话需要安装 libguestfs-tools
2) openSUSE 系统的话需要安装 guestfs-tools

步骤六:此时就可以将此虚拟机的硬件文件作为模块进行批量克隆虚拟机了

(只在真机上执行以下步骤)