跳转至

kvm

一、安装过程

1.1 安装

# CentOS Linux release 7.5.1804 (Core)

egrep 'vmx|svm' /proc/cpuinfo

yum install -y -q \
    qemu-kvm qemu-img \
    virt-manager libvirt libvirt-python python-virtinst libvirt-client \
    virt-install virt-viewer

lsmod | grep -i kvm

brctl show

# virsh net-list

systemctl start libvirtd
systemctl enable libvirtd
systemctl is-enabled libvirtd

cd /etc/sysconfig/network-scripts/
# 编辑 ifcfg-em2 & ifcfg-br0
cat > ifcfg-br0 <<EOF
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.1.2.109
PREFIX=24
EOF

cat > ifcfg-em2 <<EOF
TYPE=Ethernet
BOOTPROTO=none
NAME=em2
DEVICE=em2
ONBOOT=yes
BRIDGE=br0
EOF

# 激活网卡
ip l set br0 up # ifup br0
ip l set em2 up # ifup em2

# systemctl restart NetworkManager
systemctl restart network

# 释放多余的桥接和网络接口
ip l set dev virbr0-nic down
brctl delif virbr0 virbr0-nic
brctl delbr virbr0

ip l set dev virbr0 down
ip l del virbr0-nic

# METHOD VNC
virt-install --name UAT-BIGDATA-000 \
    --virt-type kvm \
    --ram=8192 \
    --vcpus=2 \
    --cdrom=/data/backup/CentOS-7-x86_64-DVD-2009.iso \
    --disk path=/data/lib/kvm/UAT-BIGDATA-001/UAT-BIGDATA-000-SDA.raw \
    --network bridge=br0 \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole

virt-install --name UAT-BIGDATA-000 \
    --virt-type kvm  \
    --ram 4096 \
    --vcpus 2 \
    --boot hd \
    --disk path=/data/lib/kvm/UAT-BIGDATA-001/UAT-BIGDATA-000-SDA.qcow2 \
    --mac=52:54:0A:01:02:32 \
    --network bridge=br1 \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole

# METHOD Console
mkdir -p /data/lib/kvm/UAT-BIGDATA-000
qemu-img create -f qcow2 /data/lib/kvm/UAT-BIGDATA-000-SDA.img 50G

virt-install --name UAT-BIGDATA-000 \
    --ram=8192 \
    --vcpus=2 \
    --location=/data/backup/CentOS-7-x86_64-DVD-2009.iso \
    --disk path=/data/lib/kvm/UAT-BIGDATA-000-SDA.img \
    --network bridge=br0,mac=52:54:0A:01:02:32 \
    --graphics=none \
    --console=pty,target_type=serial \
    --extra-args="console=ttyS0"

virsh autostart UAT-BIGDATA-000

# MAC 地址生成策略
echo 10.1.2.50 | \
    awk -F'.' '{
        printf("52:54");
        for(i=1;i<NF+1;i++){
            if($i<=10){printf(":0%X",$i)}
            else{printf(":%X",$i)}}
    printf("\n")}'

# 常用命令
virsh list --all        查看所有虚拟机状态
virsh start vm_name     开机 
virsh shutdown vm_name  关机
virsh destroy vm_name   强制关闭电源 
virsh undefine vm_name  移除虚拟机
virsh suspend vm_name   暂停虚拟机
virsh resume vm_name    恢复虚拟机
virsh autostart vm_name 设置随开机启动 # 生成成软链 /etc/libvirt/qemu/autostart/vm_server.xml 
virsh autostart --disable vm_name 取消随开机启动

1.2 扩容

1.2.1 CPU

virsh help domain

# 查看信息
virsh dominfo UAT-BIGDATA-000

# 更改CPU(重启生效)
virsh setvcpus UAT-BIGDATA-000 4 --maximum --config
virsh setvcpus UAT-BIGDATA-000 4 --config
virsh shutdown UAT-BIGDATA-000

virsh setvcpus UAT-BIGDATA-000 4 --current
virsh start UAT-BIGDATA-000

# 需要重启
virsh define UAT-BIGDATA-000.xml
virsh reboot UAT-BIGDATA-000

1.2.2 内存

# 查看信息
virsh dominfo UAT-BIGDATA-000

# 更改内存(需要关机修改)
virsh shutdown UAT-BIGDATA-000

virsh setmaxmem UAT-BIGDATA-000 8388608 --config
virsh dominfo UAT-BIGDATA-000
virsh start UAT-BIGDATA-000

# 更改内存(开机状态时生效--前提maxmem以内变更)
virsh setmem UAT-BIGDATA-000 4194304 --live --config

# 需要重启
virsh define UAT-BIGDATA-000.xml
virsh reboot UAT-BIGDATA-000

1.2.3 磁盘

磁盘类型有 qcow2raw,默认是raw

# 创建磁盘
qemu-img create -f qcow2 /data/lib/kvm/UAT-BIGDATA-000-SDB.img 100G

# 挂载磁盘(需要实例在运行中)
virsh attach-disk \
    UAT-BIGDATA-000 \
    /data/lib/kvm/UAT-BIGDATA-000-SDB.img \
    sdb \
    --cache none \
    --targetbus scsi \
    --subdriver qcow2 \
    --live \
    --config 

mkfs.xfs /dev/sdb && blkid /dev/sdb

echo 'UUID=903a6ade-c1ab-4593-9ac2-293afdb1ed55 /data xfs     defaults        0 0' >> /etc/fstab

mkdir -p /data && mount -a

# 分离磁盘
virsh detach-disk UAT-BIGDATA-000 /data/lib/kvm/UAT-BIGDATA-000-SDB.img

# 扩容原磁盘(需要停机)
qemu-img resize /data/lib/kvm/UAT-BIGDATA-000-SDB.img +20G
# virt-resize --expand /dev/sda1 
lsblk
vgdisplay
lvdisplay
lvextend -L +20G /dev/centos/root

# ext 系统格式使用:
resize2fs /dev/centos/root
# xfs 系统格式使用下面命令
xfs_growfs /dev/centos/root

# LVM操作集锦
## 追加一个主分区
fdisk /dev/vda
 p
 m
 n #+分区 选择主分区 p
 w
partprobe # 内核重新加载

# vg 追加 pv,lv 扩展
pvcreate /dev/vda4
vgextend vg /dev/vda4
lvextend --extents +100%FREE /dev/mapper/vg-lv_data1
mount -a
xfs_growfs /dev/mapper/vg-lv_data1

1.3 克隆

1.3.1 通用操作

# METHOD AUTO(需要关机)
# -o 旧虚拟机
# -n 新虚拟机
# virt-clone --auto-clone -o old-vm-server -n new-vm-server
# e.g.
# virt-clone --auto-clone -o UAT-BIGDATA-000 -n UAT-BIGDATA-001

virt-clone --auto-clone -o old-vm-server -n new-vm-server \
    -f /data/lib/kvm/new-vm-server-SDA.img \
    -m 52:54:0A:01:02:33

# METHOD MANUAL
# 备份磁盘文件
cp old-vm-server.qcow2 new-vm-server.qcow2 
# 导出配置文件
virsh dumpxml old-vm-server > new-vm-server.xml
# 编辑配置文件:修改名称、移除UUID、修改磁盘文件名、删除MAC地址
vim new-vm-server.xml
# 导入配置文件
virsh define new-vm-server.xml 
# 启动虚拟机
virsh start new-vm-server

1.3.2 批量克隆

## 如克隆5台机器
a=20
b=46
for i in {1..5}
do
virt-clone --auto-clone -o UAT-STUDY-020 -n UAT-STUDY-0$((i+a)) \
    -f /data/lib/kvm/UAT-STUDY-0$((i+a))-SDA.img \
    -m 52:54:0A:01:02:$((i+b))
mv /data/lib/kvm/UAT-STUDY-020-SDB-clone.img /data/lib/kvm/UAT-STUDY-0$((i+a))-SDB.img
sed -i 's/UAT-STUDY-020-SDB-clone.img/UAT-STUDY-0'$((i+a))'-SDB.img/' UAT-STUDY-0$((i+a)).xml
virsh define UAT-STUDY-0$((i+a)).xml
done

1.3.3 修改信息

mv /data/lib/kvm/UAT-STUDY-020-SDB-clone.img /data/lib/kvm/UAT-STUDY-0YY-SDB.img

hostnamectl set-hostname UAT-STUDY-0YY --transient
hostnamectl set-hostname UAT-STUDY-0YY --static
hostnamectl set-hostname UAT-STUDY-0YY --pretty

sed -i 's/10.1.2.70/10.1.2.77/' /etc/sysconfig/network-scripts/ifcfg-eth0

1.4 笔记

1.4.1 克隆+CPU+内存

# create machine PRD-SLB-NGINX-02
virt-clone --auto-clone -o TEMPLATE -n PRD-SLB-NGINX-02 \
    -f /data/lib/kvm/PRD-SLB-NGINX-01-SDA.img \
    -m 52:54:0A:01:01:37

mv /data/lib/kvm/TEMPLATE-SDB-clone.img /data/lib/kvm/PRD-SLB-NGINX-02-SDB.img
sed -i 's/TEMPLATE-SDB-clone.img/PRD-SLB-NGINX-02-SDB.img/' /etc/libvirt/qemu/PRD-SLB-NGINX-02.xml
virsh define /etc/libvirt/qemu/PRD-SLB-NGINX-02.xml

virsh setvcpus  PRD-SLB-NGINX-02 4 --maximum --config
virsh setvcpus  PRD-SLB-NGINX-02 4 --config
virsh setmaxmem PRD-SLB-NGINX-02 8388608 --config

virsh setvcpus PRD-SLB-NGINX-02 4 --current
virsh start    PRD-SLB-NGINX-02

virsh setmem    PRD-SLB-NGINX-02 8388608 --live --config
virsh dominfo   PRD-SLB-NGINX-02
virsh autostart PRD-SLB-NGINX-02
virsh console   PRD-SLB-NGINX-02

hostnamectl set-hostname PRD-SLB-NGINX-02 --transient
hostnamectl set-hostname PRD-SLB-NGINX-02 --static
hostnamectl set-hostname PRD-SLB-NGINX-02 --pretty
sed -i 's/10.10.10.10/10.1.1.55/' /etc/sysconfig/network-scripts/ifcfg-eth0
cat /etc/sysconfig/network-scripts/ifcfg-eth0

reboot

1.4.2 克隆+CPU+内存+磁盘

# create machine PRD-KUBENODE-103 
virt-clone --auto-clone -o TEMPLATE -n PRD-KUBENODE-103 \
    -f /data/lib/kvm/PRD-KUBENODE-103-SDA.img \
    -m 52:54:0A:01:01:38

mv /data/lib/kvm/TEMPLATE-SDB-clone.img /data/lib/kvm/PRD-KUBENODE-103-SDB.img
sed -i 's/TEMPLATE-SDB-clone.img/PRD-KUBENODE-103-SDB.img/' /etc/libvirt/qemu/PRD-KUBENODE-103.xml
virsh define /etc/libvirt/qemu/PRD-KUBENODE-103.xml

virsh setvcpus  PRD-KUBENODE-103 8 --maximum --config
virsh setvcpus  PRD-KUBENODE-103 8 --config
virsh setmaxmem PRD-KUBENODE-103 33554432 --config

virsh setvcpus PRD-KUBENODE-103 8 --current
virsh start    PRD-KUBENODE-103

virsh setmem    PRD-KUBENODE-103 33554432 --live --config
virsh dominfo   PRD-KUBENODE-103
virsh autostart PRD-KUBENODE-103
virsh console   PRD-KUBENODE-103

ip a
hostnamectl set-hostname PRD-KUBENODE-103 --transient
hostnamectl set-hostname PRD-KUBENODE-103 --static
hostnamectl set-hostname PRD-KUBENODE-103 --pretty
sed -i 's/10.1.1.100/10.1.1.56/' /etc/sysconfig/network-scripts/ifcfg-eth0
cat /etc/sysconfig/network-scripts/ifcfg-eth0

virsh shutdown PRD-KUBENODE-103
qemu-img resize /data/lib/kvm/PRD-KUBENODE-103-SDB.img +400G
virsh start PRD-KUBENODE-103

virsh console PRD-KUBENODE-103
xfs_growfs /dev/sda

二、番外操作

网络相关

2.1 NAT

一般双网卡用于 NAT 上网

# 双网卡桥接内网上网
# 开启转发
sysctl -w net.ipv4.ip_forward=1

# 打开NAT(其中 em1 为上网网卡)
iptables -t nat -A POSTROUTING -o em1 -j MASQUERADE

# 设置路由(内网网卡 eth1: 10.1.2.109 为内网网段路由网关)
# 在内网网段server上替换默认路由
ip r del default via 10.1.2.1
ip r add default via 10.1.2.109

2.2 BOND+BRIDGE

# bond0 em1 & em2
# cat ifcfg-bond0 
TYPE=Ethernet
BOOTPROTO=none
IPV6INIT=no
DEVICE=bond0
NAME=bond0
DEVICE=bond0
ONBOOT=yes
BRIDGE=br0

# cat ifcfg-em1
DEVICE=em1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes

# cat ifcfg-em2
DEVICE=em2
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes

# cat ifcfg-br0 
DEVICE=br0
BOOTPROTO=static
ONBOOT=yes
TYPE=Bridge
DELAY=0
IPADDR=10.1.1.109
PREFIX=24
GATEWAY=10.1.1.254
DNS1=10.1.1.2

# cat /etc/modprobe.d/bonding.conf 
alias bond0 bonding
options bond0 miimon=100 mode=0

# 加载并设置随开机启动
modeprobe bonding 
ifenslave bond0 em1 em2