一、KVM简介
1.1 搭建KVM服务器
1.1.1 虚拟化概念
• virtualization 资源管理
– x个物理资源 –> y个逻辑资源
– 实现程度:完全、部分、硬件辅助(CPU)
1.1.2 虚拟化概述
• 虚拟化主要厂商及产品
1.1.3 安装虚拟化服务器平台
1. 虚拟化服务器软件
• qemu-kvm
– 为 kvm 提供底层仿真支持
• libvirt-daemon
– libvirtd 守护进程,管理虚拟机
• libvirt-client
– 用户端软件,提供客户端管理命令
• libvirt-daemon-driver-qemu
– libvirtd 连接 qemu 的驱动 // libvirtd可以管理各种虚拟化技术
• 可选功能
– virt-install # 系统安装工具
– virt-manager # 图形管理工具
– virt-v2v # 虚拟机迁移工具
– virt-p2v # 物理机迁移工具
• 虚拟化平台的安装
-
yum
install -y qemu-kvm \
-
libvirt-daemon \
-
libvirt-
client \
-
libvirt-daemon-driver-qemu
-
systemctl
start libvirtd //启动虚拟机管理服务
1.1.4 虚拟机的组成
• 虚拟机的组成
– 内核虚拟化模块(KVM)
– 系统设备仿真(QEMU)
– 虚拟机管理程序(LIBVIRT)
KVM提供CPU硬件的虚拟化,QEMU提供除CPU以外的辅助硬件虚拟化,LIVIRTD提供管理虚拟机的命令
1.KVM是linux内核的模块,它需要CPU的支持,采用硬
件辅劣虚拟化技术 Intel-VT,AMD-V,内存的相关如
Intel的 EPT 和 AMD 的 RVI 技术
2. QEMU 是一个虚拟化的仿真工具,通过 ioctl 与内核
kvm 交互完成对硬件的虚拟化支持
3. Libvirt 是一个对虚拟化管理的接口和工具,提供用户
端程序 virsh ,virt-install, virt-manager, virt-view 与用户交互
– 一个 XML 文件(虚拟机配置声明文件) 【告诉虚拟机,你有几个网卡,几个cpu,多大的磁盘】
– 位置 /etc/libvirt/qemu/
– 一个磁盘镜像文件(虚拟机的硬盘) 【虚拟机存放数据的地方】
– 位置 /var/lib/libvirt/images/
1.2 管理KVM平台
1.2.1 virsh 命令
1.virsh命令工具介绍
提供管理各虚拟机的命令接口
– 支持交互模式,查看/创建/停止/关闭 .. ..
– 格式:virsh 控制指令 [虚拟机名称] [参数]
[root@nova01 ~]# virsh
Welcome to virsh, the virtualization interactive terminal.
Type: ‘help’ for help with commands
‘quit’ to quit
virsh #
2.查看虚拟化信息
2.1 查看KVM节点(服务器)信息【物理机】
– virsh nodeinfo
2.2 列出虚拟机
– virsh list [–all]
2.3 列出虚拟网络
– virsh net-list [–all]
2.4 查看指定虚拟机的信息
– virsh dominfo 虚拟机名称
3.开关机操作
3.1 运行|重启|关闭指定的虚拟机
– virsh start|reboot|shutdown 虚拟机名称
3.2 强制关闭指定的虚拟机
– virsh destroy 虚拟机名称
3.3 将指定的虚拟机设为开机自动运行【随着libvirtd启动】
– virsh autostart [–disable] 虚拟机名称
1.2.2 qcow2简介
1.常用镜像盘类型
• 虚拟机的磁盘镜像文件格式
qcow2的IO性能比RAW稍低,但是QCOW2文件格式占用的空间小,支持压缩、快照盘复用
1.2.3 qemu-img 命令
1.qemu-img命令简介
• qemu-img 是虚拟机的磁盘管理命令
• qemu-img 支持非常多的磁盘格式,例如 raw、qcow2、vdi、vmdk 等等
2.qemu-img 命令格式
– qemu-img 命令 参数 块文件名称 大小
qemu-img create [-b 后端盘] -f qcow2 块文件名称 [大小] //这个大小定的是最大能存多大的数据
– 常用的命令有
– create 创建一个磁盘
– convert 转换磁盘格式
– info 查看磁盘信息
– snapshot 管理磁盘快照
3.创建新的镜像盘文件
– qemu-img create -f 格式 磁盘路径 大小
– qemu-img create -f qcow2 disk.img 50G
4.查询镜像盘文件的信息
– qemu-img info 磁盘路径
– qemu-img info disk.img
5.-b 使用后端模板文件【以后端文件拷贝一个镜像文件,化整为零的拷贝】
– qemu-img create -b disk.img -f qcow2 disk1.img
1.2.4 COW技术原理
• Copy On Write,写时复制
– 直接映射原始盘的数据内容
– 当对前端盘进行数据修改时,如果没有数据,会在修改之前从后端盘复制一份到前端盘
– 对前端盘的修改不回写到原始盘
二、Virsh管理
2.1 virsh虚拟机管理
2.1.1 连接本地/远程KVM
• 使用 virsh 客户端工具
1.连接本地
– virsh
– virsh# connect qemu:///system (默认选项)
2.连接远程
– virsh# connect
qemu+ssh://user@ip.xx.xx.xx:port/system
2.1.2 虚拟机远程管理
• 使用 virt-manager 客户端工具
– virt-manager 也可以通过 add connection 管理其它
机器上的虚拟机,一般通过”remote tunnel over ssh”
就可以了
– 需要注意的是 virt-manager 需要使用 ssh 免密码登录
如果没有免密码登录需要单独安装 python 的 ssh 相
关模块,这里我们可以使用部署 key 的方法解决
2.1.3 创建虚拟交换机
• libvirtd 网络接口
– 原理:调用 dnsmasq 提供DNS、DHCP等功能
– 创建配置文件 /etc/libvirt/qemu/networks/vbr.xml
-
<network>
-
<name>vbr
</name>
-
<bridge name="vbr"/>
-
<forward mode="nat"/>
-
<ip address="192.168.1.254" netmask="255.255.255.0">
-
<dhcp>
-
<range start="192.168.1.100" end="192.168.1.200"/>
-
</dhcp>
-
</ip>
-
</network>
2.1.4 网络管理
• virsh 管理虚拟网络
– net-list 查看虚拟网络
– net-define vbr.xml 创建虚拟网络
– net-undefine vbr 删除虚拟网络
– net-start vbr 启劢虚拟网络
– net-destroy vbr 停止虚拟网络
– net-edit vbr 修改 vbr 网络的配置
– net-autostart vbr 设置 vbr 虚拟网络开机自启动
三、xml管理
3.1 导出虚拟机
3.1.1 xml配置文件
– 定义了一个虚拟机的名称、CPU、内存、虚拟磁盘、网卡等各种参数设置
– 默认位于 /etc/libvirt/qemu/虚拟机名.xml
• 导出xml配置文件
– 查看:virsh dumpxml 虚拟机名
– 备份:virsh dumpxml 虚拟机名 > 虚拟机名.xml
3.2 编辑虚拟机设置
3.2.1 对虚拟机的配置进行调整
– 编辑:virsh edit 虚拟机名
– 若修改 name、memory、disk、network,可自劢保
存为新虚拟机配置
[root@kvmsvr ~]# virsh edit v1
<name>node</name>
<uuid>76d5dc2c-5eef-4e30-8b6c-e58851814f84</uuid>
<disk type=’file’ device=’disk’>
<source file=’/var/lib/libvirt/images/node.img’/>
.. ..
<interface type=’network’>
<mac address=’52:54:00:91:52:e4’/>
.. ..
3.3 导入虚拟机
3.3.1 根据修改后的独立xml文件定义新虚拟机
– virsh define XML描述文件
定义域 CentOS7_node1.xml
~]# virsh define /etc/libvirt/qemu/CentOS7_node1.xml
– 查看域主机
[root@kvmsvr ~]# virsh list –all
3.4 删除虚拟机
3.4.1 必要时可去除多余的xml配置
– 比如虚拟机改名的情况
– 避免出现多个虚拟机的磁盘戒MAC地址冲突
– virsh undefine 虚拟机名
[root@kvmsvr ~]# virsh undefine node1 //node1对应的xml配置文件会从/etc/libvirt/qemu目录下删除
四、自定义虚拟机
4.1 自定义虚拟机安装
4.1.1 网络 yum 源的安装配置
1.快速配置网络 yum 源
– 配置ftp
yum install vsftp
– 修改配置文件 /etc/vsftpd/vsftpd.conf
– listen=YES
– listen_ipv6=NO
– systemctl enable vsftpd
– systemctl start vsftpd
– vsftp 默认根目录为 /var/ftp
– 在 ftp 跟目录创建文件夹 centos7
– 把 CentOS7 的光盘挂载到刚刚创建的目录上
mount –t iso9660 –o loop,ro /xx/xx.iso /var/ftp/centos7
– 在客户机里面配置 /etc/yum.repos.d/xxx.repo
[Centos_repo]
name= CentOS packet
baseurl=ftp://xx.xx.xx.xx/centos7
enabled=1
gpgcheck=0
– yum repolist
4.1.2 virt-manager 安装虚拟机
1.启劢 virt-manager 软件,选择新建虚拟机
2.选择网络安装源
3.在/var/lib/libvirt/images目录下创建node.qcow2
– qemu-img create -f qcow2 node.qcow2 16G
4.网络选择自定义的 vbr,这张网卡的模式是nat模式
5.语言选择英语English (United States)
6.软件选择 minimal 、关闭 KDUMP、选择手工分区
6.手动分区,点击左上角的DONE
7.使用标准分区格式,只分一个根分区
8.点击New CentOS7 Instatllation下面的小加号,选择跟挂载点,选择Add mount point
9.选取一个根分区,开启安装系统
五、虚拟机模板制作
5.1 初始化虚拟机
5.1.1 修改 /etc/selinux/config
SELINUX=disabled
5.1.2 配置网卡配置文件
~] # vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=”eth0” //网卡设备名称
ONBOOT=”yes“ //开机自动启动
NM_CONTROLLED=”no” //不让NetWorkManger控制网络服务
TYPE=”Ethernet” //网卡类型是Ethernet
BOOTPROTO =”dhcp” //网卡启动协议是dhcp
5.1.3 停止 firewalld NetworkManager
~] # systemctl stop firewalld
~] # systemctl stop NetworkManager
5.1.4 卸载firewalld NetworkManger
~] # yum remove -y NetworkManager-* firewalld-* python-firewall
5.1.5 重启机器/查看eth0的ip
配置正确会重新给接在vbr网桥上的eth0分配ip地址
[root@centos7temp ~]# ip a ls dev eth0
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
….
inet 192.168.5.154/24 brd 192.168.5.255 scope global dynamic eth0
5.1.6 配置 yum 源
yum.repos.d]# vim CentOS7.repo
[local_repo]
name=CentOS-$releasever - Base
baseurl=”ftp://192.168.5.254/CentOS7-Base”
enabled=1
gpgcheck=0
5.1.7 安装软件
1.安装必须的软件包
yum provides 命令
yum install 包名
5.1.8 验证数字签名
1. 下载 RPM-GPG-KEY-CentOS-7
[root@room9pc01 CentOS7-Base]# scp RPM-GPG-KEY-CentOS-7 192.168.5.112:/root/
2. 导入 rpm –import RPM-GPG-KEY-CentOS-7
[root@centos7_temp ~]# rpm –import RPM-GPG-KEY-CentOS-7
3.修改CentOS7.repo 配置文件
[root@centos7_temp ~]# vim /etc/yum.repos.d/CentOS7.repo
local.repo gpgcheck=1
4.使用 yum install lftp lrzsz briges-utils 验证,不报错就证明签名文件导入成功
[root@centos7_temp ~]# yum -y install lftp
lftp sftp://192.168.5.254/ -u root //通过lftp直接下载对方主机文件
5.1.9 配置网络,禁用空路由
1. 修改配置文件 /etc/sysconfig/network
]# vim /etc/sysconfig/network
NOZEROCONF=”yes”
[root@centos7_temp ~]# systemctl restart network
]# ip r s //查看空路由的命令 -r, -resolve -s, -stats
5.1.10 添加串口终端
1.配置文件 /etc/default/grub
GRUB_CMDLINE_LINUX=”biosdevname=0 net.ifnames=0
console=ttyS0,115200n8”
GRUB_DISABLE_LINUX_UUID=”true”
GRUB_ENABLE_LINUX_LABEL=”true”
2.修改完成之后创建grub.cfg引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg
5.1.11 修改 fstab
1. 不同磁盘的UUID不同,需要指定设备路径
[root@centos7_temp ~]# blkid
/dev/vda1: UUID=”c4b11f39-6a67-471f-865f-a88a5e589712” TYPE=”xfs”
[root@centos7_temp ~]# vim /etc/fstab
修改 UUID=xxxxxx 为 /dev/vda1
5.1.12 安装分区扩展软件
1.设置语言为英文 LANG=en_US.UTF-8
2.安装分区软件
~] # yum install -y cloud-utils-growpart
3.扩展磁盘分区空间(让 /dev/vda1 变大)
~]#/usr/bin/growpart /dev/vda 1 (1代表vda磁盘的第一个分区)
4.扩展文件系统识别空间(让 df -h 可使用空间变大)
~]#/usr/sbin/xfs_growfs /
5.1.13 关闭虚拟机,清理信息 (真机)
1.设置语言为英文 LANG=en_US.UTF-8
2.关闭虚拟机
[root@room9pc01 ~] # virsh destroy CentOS7_TEMP[虚拟机名称]
3.清理虚拟机
[root@room9pc01 ~] # virt-sysprep -d 虚拟机名称
[ 0.0] Examining the guest …
[ 38.5] Performing “abrt-data” …
[ 38.5] Performing “backup-files” …
[ 39.9] Performing “bash-history” …
[ 39.9] Performing “blkid-tab” …
[ 39.9] Performing “crash-data” …
[ 39.9] Performing “cron-spool” …
….
5.1.14 删除虚拟机定义
1.取消虚拟机定义,会删除CentOS7_TEMP.xml配置文件
~] # virsh undefine CentOS7_TEMP
5.1.15 使用后端盘创建虚拟机
例如创建虚拟机 node1
1.创建磁盘文件
cd /var/lib/libvirt/images
images]# qemu-img create -b node.img -f qcow2 node1.img 32G
2.创建虚拟机配置文件,定义虚拟机
qemu]# sed ‘s/node/CentOS7_node1/’ node.xml >/etc/libvirt/qemu/CentOS7_node1.xml
virsh define /etc/libvirt/qemu/node1.xml
3.启动虚拟机
~] # virsh start CentOS7_node1
4.连接查看虚拟机
~] # virsh console CentOS7_node1
六、虚拟设备管理
6.1 xml详解
6.1.1 内存、cpu设置
1.保存 node 虚拟机配置文件
virsh dumpxml node >demo.xml
2.内存设置,以KB为单位
<name>centos7.0</name>
<memory unit=’KiB’>2097152</memory>
<currentMemory unit=’KiB’>2097152</currentMemory>
– memory unit 虚拟机最大使用内存,可以手动调整
– currentmemory 创建虚拟机使用内存
3.cpu 设置,可以调整
<vcpu placement=’static’>2</vcpu>
6.1.2 磁盘、网卡设置
1.磁盘配置
<disk type=’file’ device=’disk’>
<driver name=’qemu’ type=’qcow2’/> //磁盘类型
<source file=’/var/lib/libvirt/images/node.img’/> //使用的磁盘镜像
<target dev=’vda’ bus=’virtio’/> //磁盘名称
<address type=’pci’ domain=’0x0000’ bus=’0x00’ slot=’0x05’ function=’0x0’/> //总线地址,再添加一块磁盘这行可以删除
</disk>
2.网卡设置
<interface type=’bridge’>
<mac address=’52:54:00:dd:9d:9b’/>
<source bridge=’vbr’/> //网卡的名称
<model type=’virtio’/> //网卡的类型
<address type=’pci’ domain=’0x0000’ bus=’0x00’ slot=’0x03’ function=’0x0’/> //总线地址,再添加一块磁盘这行可以删除
6.2 创建访问虚拟机
6.2.1 快速创建虚拟机
1. xml 文件配置
把我们的 xml 模板文件进行复制
修改名称及磁盘文件
sed ‘s/node/CentOS7_node1/’ node.xml >/etc/libvirt/qemu/CentOS7_node1.xml
2. img 文件创建
以我们刚刚装系统的模板为后端文件创建虚拟机
qemu-img create –b CentOS7_TEMP.img -f qcow2 CentOS7_node1.img
3.完成虚拟机注册及启动虚拟机
– virsh define CentOS7_node1.xml
– virst start CentOS7_node1
– virsh console CentOS7_node1
6.2.2 使用 guestmount 工具
1. 使用 guestmount 工具
– 支持离线挂载 raw、qcow2 格式虚拟机磁盘
– 可以在虚拟机关机的情冴下,直接修改磁盘中的文档
– 方便对虚拟机定制、修复、脚本维护
!!! 需要注意 SELinux 机制的影响
2. 基本用法
guestmount -a 虚拟机磁盘路径 -i /挂载点
[root@kvmsvr ~]# mkdir /mnt/kdisk
[root@kvmsvr ~]# guestmount -a CentOS7_node1.img -i /mnt/kdisk
[root@kvmsvr ~]# ls /mnt/kdisk
七、OpenStack环境准备 (真机)
7.1 禁用Selinux和firewalld
1.禁用 selinux , 配置文件 /etc/selinux/config
SELINUX=disabled
2.禁用 firewalld
systemctl stop firewalld
systemctl (un)mask firewalld
7.2 yum 源的安装和配置(网络yum源)
1.光盘作为 yum 源 CentOS7-1708.iso (共9591包),把这个镜像挂载到/var/www/html目录下,这样可以让虚拟机访问到磁盘镜像
有 repodata 目录的才可以作为 yum 源
2.自定义 yum 源 [这一步是扩展操作,可以跳过]
创建一个 repodata
createrepo .
更新
createrepo –update .
7.3 dns 服务
1.装bind,bind-chroot软件包~] # yum install bind bind-chroot
2.编辑配置文件 named.conf
listen-on port 53 { 192.168.5.254; };
allow-query { any; };
forwarders { 8.8.8.8; }; //缓存服务器的的关键配置
dnssec-enable no;
dnssec-validation no;
3.重启服务测试
~ ] # nslookup www.baidu.com 192.168.5.254
7.4 时间服务器
1.服务端安装chrony
yum install -y chrony
2.服务端配置[服务端是阿里云时间服务器的客户端,是其他同步时间虚拟机的服务端]
server:配置 /etc/chrony.conf
server ntp1.aliyun.com iburst
bindacqaddress 0.0.0.0
allow 0/0
3.客户端
client:配置 /etc/chrony.conf
server 192.168.5.254 iburst
检查状态
chronyc sources -v
* 同步成功,+ 备胎 , ? 同步失败
附:openstack准备环境文档 cloud.txt