centos7下搭建与使用kvm
# 1、安装
# 1.1 检查宿主机CPU是否支持虚拟化及开启虚拟化
检查:
cat /proc/cpuinfo | egrep '(vmx|svm)' | wc -l;
结果大于0表示支持
esxi 交换机/端口组(开启):
- 混杂模式
- MAC 地址更改
- 伪传输
esxi 全局开启虚拟化:
- ssh 连接到esxi
- 编辑 /etc/vmware/config,最后一行添加
vhv.enable = "TRUE"
- 重启esxi
esxi 单个虚拟机开启虚拟化:
- 关闭虚拟机
- "编辑虚拟机设置" ---> "选项" ---> "高级" ---> "常规" ---->"配置参数"
- 在配置参数中添加三个变量
nce.enable = TRUE
hypervisor.cpuid.v0 = FALSE
vhv.enable= TRUE
# 1.2 KVM核心软件包
安装:
yum install kvm libvirt python-virtinst qemu-kvm virt-viewer bridge-utils -y
如果服务器上有桌面环境,想使用图形界面管理器virt-manager,可以安装完整的KVM环境:
yum groupinstall Virtualization 'Virtualization Client' 'Virtualization Platform' 'Virtualization Tools' -y
验证内核模块是否加载:
lsmod | grep kvm
启动虚拟机管理接口服务并设置开机启动:
systemctl enable libvirtd && systemctl restart libvirtd
启动libvirtd后,会自动创建了一个网卡NAT
,并启动dnsmasq服务,用来为虚拟机分配IP地址
# 1.3 libvirtd配置(可不配置)
mkdir /etc/default
vim /etc/default/libvirt-bin
start_libvirtd="yes"
libvirtd_opts="-d -l"
cat /etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
tcp_port = "16509"
listen_addr = "0.0.0.0"
unix_sock_group = "libvirtd"
unix_sock_ro_perms = "0777"
unix_sock_rw_perms = "0770"
auth_unix_ro = "none"
auth_unix_rw = "none"
auth_tcp = "none"
auth_tls = "none"
cat /etc/libvirt/qemu.conf
# vnc_listen = "0.0.0.0"
vnc_tls = 0
# vnc_password = ""
systemctl restart libvirtd
# 2、配置桥接网络
cd /etc/sysconfig/network-scripts
cp ifcfg-ens192 ifcfg-br0
ifcfg-br0 修改TYPE
、NAME
、DEVICE
, 删除UUID
TYPE="Bridge"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
IPADDR="192.168.1.120"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="223.5.5.5"
DNS2="8.8.8.8"
IPV6_PRIVACY="no"
ifcfg-ens192 增加BRIDGE=br0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens192"
UUID="dfb90216-70bf-445c-a308-a94cea27854f"
DEVICE="ens192"
ONBOOT="yes"
IPADDR="192.168.1.120"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="223.5.5.5"
DNS2="8.8.8.8"
IPV6_PRIVACY="no"
BRIDGE=br0
systemctl restart network && systemctl restart docker
# 3、创建虚拟机
# 3.1 创建相应目录
/kvm/
img/
vm/
# 3.2 下载iso文件
cd /kvm/img
wget https://repo.huaweicloud.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
# 3.3 创建模版虚拟机
vm1.sh
virt-install \
--name vm1 \
--memory 1024 \
--vcpus 1 \
--location /kvm/img/CentOS-7-x86_64-DVD-2009.iso \
--os-type linux \
--os-variant rhel7 \
--disk path=/kvm/vm/vm1.qcow2,size=10 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--accelerate \
--autostart
创建虚拟机
sh vm1.sh
目录结构
/kvm/
img/
CentOS-7-x86_64-DVD-2009.iso
template/
vm/
vm1.qcow2
vm1.sh
# 3.4 制作镜像模板
# 虚拟机执行
yum install cloud-init -y
# 宿主机执行
yum install libguestfs-tools -y
cp /kvm/vm/vm1.qcow2 /kvm/template/vmt.qcow2
virt-sysprep -a /kvm/template/vmt.qcow2
# 3.5 cloud-init自定义创建虚拟机
metadata.yaml
instance-id: VM_NAME
local-hostname: VM_NAME
user-data.yaml
#cloud-config
preserve_hostname: False
hostname: VM_NAME
fqdn: VM_NAME.vm.pascall.cn
ssh_pwauth: true
users:
- name: root
chpasswd:
expire: false
list: |
root:ROOT_PWD
timezone: Asia/Shanghai
runcmd:
- sed -i 's/BOOTPROTO=dhcp/BOOTPROTO=static/' /etc/sysconfig/network-scripts/ifcfg-eth0
- echo "PROXY_METHOD=none" >> /etc/sysconfig/network-scripts/ifcfg-eth0
- echo "NAME=eth0" >> /etc/sysconfig/network-scripts/ifcfg-eth0
- echo "IPADDR=IP_ADDR" >> /etc/sysconfig/network-scripts/ifcfg-eth0
- echo "NETMASK=255.255.255.0" >> /etc/sysconfig/network-scripts/ifcfg-eth0
- echo "GATEWAY=192.168.1.1" >> /etc/sysconfig/network-scripts/ifcfg-eth0
- echo "DNS1=223.5.5.5" >> /etc/sysconfig/network-scripts/ifcfg-eth0
- echo "DNS2=8.8.8.8" >> /etc/sysconfig/network-scripts/ifcfg-eth0
- systemctl restart network
- systemctl restart docker
- touch /etc/cloud/cloud-init.disabled
镜像扩容(不可缩容)
qemu-img info ./vm5.qcow2c
qemu-img resize ./vm5.qcow2c 20G
qemu-img info ./vm5.qcow2c
create.sh
VM_NAME=$1
CPU_NUM=$2
MEM_NUM=$3
IP_ADDR=$4
ROOT_PWD=$5
echo "VM_NAME: $VM_NAME, CPU_NUM: $CPU_NUM, MEM_NUM: $MEM_NUM, IP_ADDR: $IP_ADDR, ROOT_PWD: $ROOT_PWD"
if [ ! -n "$VM_NAME" ] ;then
echo "VM_NAME参数为空"
exit 1
fi
if [ ! -n "$CPU_NUM" ] ;then
echo "CPU_NUM参数为空"
exit 1
fi
if [ ! -n "$MEM_NUM" ] ;then
echo "MEM_NUM参数为空"
exit 1
fi
if [ ! -n "$IP_ADDR" ] ;then
echo "IP_ADDR参数为空"
exit 1
fi
if [ ! -n "$ROOT_PWD" ] ;then
echo "ROOT_PWD参数为空"
exit 1
fi
mkdir /kvm/vm/$VM_NAME
cp /kvm/template/vmt.qcow2 /kvm/vm/$VM_NAME/$VM_NAME.qcow2
cp /kvm/template/metadata.yaml /kvm/vm/$VM_NAME/metadata.yaml
sed -i "s/VM_NAME/$VM_NAME/" /kvm/vm/$VM_NAME/metadata.yaml
cp /kvm/template/user-data.yaml /kvm/vm/$VM_NAME/user-data.yaml
sed -i "s/VM_NAME/$VM_NAME/" /kvm/vm/$VM_NAME/user-data.yaml
sed -i "s/IP_ADDR/$IP_ADDR/" /kvm/vm/$VM_NAME/user-data.yaml
sed -i "s/ROOT_PWD/$ROOT_PWD/" /kvm/vm/$VM_NAME/user-data.yaml
cloud-localds /kvm/vm/$VM_NAME/init.img /kvm/vm/$VM_NAME/user-data.yaml /kvm/vm/$VM_NAME/metadata.yaml
virt-install --name $VM_NAME \
--vcpus $CPU_NUM \
--memory $MEM_NUM \
--os-variant=rhel7.9 \
--network bridge=br0,model=virtio \
--disk /kvm/vm/$VM_NAME/$VM_NAME.qcow2 \
--disk /kvm/vm/$VM_NAME/init.img,device=cdrom \
--import \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--accelerate \
--autostart
delete.sh
VM_NAME=$1
echo "VM_NAME: $VM_NAME"
if [ ! -n "$VM_NAME" ] ;then
echo "VM_NAME参数为空"
exit 1
fi
virsh destroy $VM_NAME \
&& virsh undefine $VM_NAME \
&& rm -rf /kvm/vm/$VM_NAME
start
sh create.sh vm2 1 1024 192.168.1.112 root
delete
sh delate.sh vm2
目录结构
/kvm/
img/
CentOS-7-x86_64-DVD-2009.iso
template/
vmt.qcow2
metadata.yaml
user-data.yaml
vm/
vm1.qcow2
vm1.sh
create.sh
delete.sh
# 3.6 模版创建虚拟机
导出模版配置
virsh dumpxml --domain vm1 > /kvm/template/vmt.xml
修改vmt.xml, 修改disk>source
引用模板vmt.qcow2
, 删除字段name
、uuid
、devices.interface.mac
<domain type='kvm'>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</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'>Broadwell</model>
</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='/kvm/template/vmt.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='bridge'>
<source bridge='br0'/>
<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='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<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>
创建虚拟机:
virt-clone \
--connect qemu:///system \
--original-xml /kvm/template/vmt.xml \
--name=vm4 \
--file=/kvm/vm/vm4.qcow2
修改ip:
# 虚拟机内操作
vim /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network && systemctl restart docker
目录结构:
/kvm/
img/
CentOS-7-x86_64-DVD-2009.iso
template/
vmt.qcow2
vmt.xml
vm/
vm4.qcow2
vm1.sh
# 4 WebVirtMgr安装-docker
宿主机设置映射文件:
sudo groupadd -g 1010 webvirtmgr
mkdir /data && mkdir /data/vm
sudo useradd -u 1010 -g webvirtmgr -s /sbin/nologin -d /data/vm webvirtmgr
sudo chown -R webvirtmgr:webvirtmgr /data/vm
运行容器:
docker run -d -p 8080:8080 -p 6080:6080 --restart always --name webvirtmgr -v /data/vm:/data/vm primiano/docker-webvirtmgr
修改监听地址及修改密码、添加免密登录:
docker exec -it webvirtmgr bash
# 修改监听地址
sed -i 's/172.17.42.1/0.0.0.0/g' /webvirtmgr/vrtManager/create.py
# 修改admin密码
cd /webvirtmgr
python manage.py changepassword admin # 等待输入密码
# 添加免密登录
su - webvirtmgr -s /bin/bash
ssh-keygen # 一直回车
touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
chmod 0600 ~/.ssh/config
ssh-copy-id root@192.168.1.120 # 等待输入kvm主机ssh密码
exit