1、linux
linux安装教程参考,https://blog.51cto.com/cloudcs/5245337
yum源配置
本地yum源配置:
8版本配置:将光盘iso挂载到某个目录,/dev/cdrom是/dev/sr0软链接,# mount /dev/cdrom /mnt,# ls /mnt
AppStream BaseOS EFI images isolinux media.repo TRANS.TBL
# cd /etc/yum.repos.d/ 全部备份后清空再新建 # vim test.repo
[os]
name = os
baseurl = file:///mnt/BaseOS
gpgcheck = 0
[app]
name = app
baseurl = file:///mnt/AppStream
gpgcheck = 0
清缓存 yum clean all,yum makecache 重新建立缓存,yum repolist all 列出所有repo
7版本配置,# vim test.repo
[os]
name = os
baseurl = file:///mnt
gpgcheck = 0
7版本在挂载点/mnt就有repodata和Packages目录(repodata引用Packages里面软件包)
8版本要进去挂载点/mnt的AppStream和BaseOS目录里面才有相应的repodata和Packages目录
在线yum源配置(要能连外网,找到vault过期源)
8版本,# cat abc.repo
[BaseOS]
name = BaseOS
baseurl = https://repo.huaweicloud.com/centos-vault/8.2.2004/BaseOS/x86_64/os/
gpgcheck = 0
[AppStream]
name = AppStream
baseurl = https://mirrors.aliyun.com/centos-vault/8.2.2004/AppStream/x86_64/os/
gpgcheck = 0
清缓存 yum clean all,yum makecache 重新建立缓存,yum repolist all 列出所有repo
7版本,# cat abc.repo
[os]
name = os
baseurl = http://mirrors.aliyun.com/centos-vault/7.6.1810/os/x86_64
gpgcheck = 0
2、虚拟化
虚拟化使得在一台物理服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存等硬件资源,但逻辑上虚拟机之间是相互隔离的。虚拟化是所有云的基础,虚拟化只提供基础架构,云可以提供服务。
CNA是个定制的欧拉系统EulerOS,基于centos内核只保留和kvm虚拟化相关的代码,CNA默认已经部署好kvm虚拟化的软件。在物理服务器上安装cna.iso操作系统,这台物理服务器就具备了虚拟化能力,可以将底层的物理资源如存储、计算、网络资源进行虚拟化,然后通过资源池化平台(云平台)再提供给上层的业务使用。
Guest OS 虚拟机操作系统
Guest Machine 虚拟机
Hypervisor 虚拟化软件层(Virtual Machine Monitor,VMM)
(对虚拟机的所有操作都是由这个虚拟化软件层实现,控制虚拟机的创建、删除、开启关闭等等)
Host OS 物理机操作系统
Host Machine 物理机
Hypervisor 虚拟化软件层(Virtual Machine Monitor,VMM)分类
1、裸金属型,VMM跑在物理硬件上(VMM虚拟化软件层是作为操作系统一部分直接运行在物理硬件上),例如安装cna.iso的物理服务器。
2、宿主型,VMM跑在物理服务器操作系统上(在物理硬件上跑的物理服务器操作系统,安装的虚拟化软件充当VMM虚拟化软件层,VMM虚拟化软件层是在物理服务器操作系统之上,不直接属于物理服务器操作系统),例如安装VMWare workstation虚拟化软件。
虚拟化历史:
1993年,IBM推出可升级的POWER并行系统,这是第一款采用RS/6000技术,基于微处理器的超级计算机。
1998年,著名的x86仿真模拟器Bochs发布。
1998年,VMware成立,1999年推出了可以流畅运行的商业虚拟化软件VMware Workstation。从此虚拟化技术终于走下了大型机的神坛。
1999年,IBM在AS/400上第一次提出了LPAR(Logical Partition,逻辑分区)虚拟化技术。
2000年,Citrix(思杰)桌面虚拟化产品发布。
2002年,Xen正式开源,后被Citrix(思杰)收购。
2004年,IBM发布了虚拟化解决方案APV(Advanced Power Virtualization),支持资源共享。该方案在2008年改名为PowerVM。
2005年,Xen 3.0.0发布,该版本可以在32位服务器上运行,是第一个支持Intel VT-x的虚拟机监控程序。
2006年,以色列的创业公司Qumranet在完成了虚拟化Hypervisor基本功能、动态迁移以及主要的性能优化之后,正式对外宣布了KVM(Kernel-based Virtual Machine,基于内核的虚拟机)的诞生。
2006-至今,云计算与大数据时代。
2007年,德国InnoTek公司开发了VirtualBox虚拟化软件,后被美国甲骨文Oracle收购。
2008年,Linux Container(LXC)发布0.1.0版本,可以提供轻量级的虚拟化。
2010年,红帽发布RHEL 6.0,这个版本将默认安装的Xen虚拟化机制彻底去除,仅提供KVM虚拟化机制。红帽在5.0加入Xen虚拟化,5.4版本xen和kvm虚拟化并行。
2013年,Docker推出(容器技术是内容空间的隔离、进程级别隔离,虚拟化是资源的隔离)
2015年,Kubernetes v1.0发布,进入云原生时代。
xen 和 kvm 区别,xen和kvm 都是开源虚拟化
2001-2002 xen ,2007年被思杰收购了。
2007年,红帽RHEL5.0 加入xen,红帽刚加入xen同年xen被思杰收购。
2006年的时候,出现了kvm基于内核虚拟化,后被红帽收购。
RHEL5.0-5.4 只有xen
从RHEL5.4-6.0 xen和kvm两个虚拟化产品并行。
RHEL6.0红帽剔除了 xen虚拟化。
xen虚拟化(当年还没有硬件辅助的时候),xen虚拟化需要修改guest os(虚拟机操作系统)内核源码的,以支持它本身的虚拟化特性,意味着xen当年只支持linux(开源),不支持windows(闭源)。
kvm虚拟化(Kernel-based Virtual Machine)基于内核的虚拟机。kvm已经作为了红帽内核源码的一部分了,内核的维护很方便。不仅支持linux,也支持windows。KVM是基于CPU的硬件辅助虚拟化方案,它需要CPU虚拟化特性的支持。
VMware虚拟化闭源的,不讨论。xen和kvm 是开源虚拟化。
思杰收购了xen,赞助了一家开源社区 cloudstack
红帽收购了kvm,赞助了一家开源社区 openstack
为什么红帽选择kvm?
1.xen虚拟化没有给红帽带来更多的收益
2.xen 被思杰收购了
3.最重要的:xen不愿意把源码内置到红帽源码里面。这就意味着红帽每发布一个产品,都要去维护两套内核。一套base基础内核,一套带了xen的内核。内核维护量非常大,非常不方便。
虚拟化技术分类
1、全虚拟化:利用二进制翻译技术实现的完全虚拟化,特权和敏感指令集都是由VMM(Hypervisor 虚拟化软件层)来传递,来回传递翻译,效率低。二进制翻译技术VMware率先实现的,本质就是通过VMM来回翻译,里面的虚拟机永远不知道自己是个虚拟机,所以二进制翻译技术(Binary Translation(BT))性能不太好。二进制翻译技术(BT)是一个软件实现的完全虚拟化。
2、半虚拟化:guest os 明确自己是虚拟机操作系统,修改内核,要求系统必须开源,指令无需中间虚拟化的封装解码操作,速度相对比较快,性能好一些。早期(xen)半虚拟化只支持 linux(开源),而不支持windows(闭源)。注意:半虚拟化是早期xen的解决方案,但是有了硬件辅助虚拟化之后,xen虚拟化也可以通过cpu硬件辅助虚拟化来实现完全虚拟化。所以现在的XEN:靠自己支持半虚拟化,靠硬件辅助虚拟化支持全虚拟化。
3、硬件辅助虚拟化(cpu硬件辅助虚拟化):直接在cpu底层修改cpu底层架构,cpu会直接捕获那些出现漏洞的指令集,通过cpu硬件辅助执行,效率非常高。
二进制翻译技术和CPU硬件辅助虚拟化都能实现完全虚拟化,二进制翻译技术是软件完全虚拟化,CPU硬件辅助虚拟化是硬件辅助完全虚拟化。
Vmware workstation安装 64位操作系统,如果未开启vt-x或amd-v cpu辅助虚拟化,则是无法创建虚拟机的。VMware支持二进制翻译技术实现的完全虚拟化,为什么还要开启cpu硬件辅助虚拟化,因为考虑性能问题,cpu硬件辅助虚拟化在性能上比二进制翻译技术要好些。
现在计算机大部分都默认开启使用CPU硬件辅助虚拟化,主板bios未开启虚拟化报错图(百度解决)
2、kvm
KVM是基于CPU的硬件辅助虚拟化方案,它需要CPU虚拟化特性的支持。在KVM中虚拟机其实就是一个Linux进程,由CPU进行调度运行。
KVM(Kernel-based Virtual Machine)是基于内核的虚拟机,因为KVM本身是一个Linux内核模块,当安装有Linux系统的物理机安装了这个模块后,就变成了Hypervisor虚拟化软件层,而且还不会影响原先在该Linux上运行的其它应用程序。KVM本质是Linux内核中的虚拟化功能模块kvm.ko,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。
通过KVM模块的加载将Linux内核转变成Hypervisor,Linux本身运行于内核模式,主机进程运行于用户模式,虚拟机则运行于客户模式,使得转变后的Linux内核可以将主机进程和虚拟机进行统一的管理和调度。KVM运行在内核空间,提供CPU、内存的虚拟化,它本身不执行任何模拟。运行在用户空间的QEMU提供硬件I/O的虚拟化模拟。
1、在KVM虚拟化方案中,KVM主要用于管理CPU和内存的虚拟化,IO设备的虚拟化则由QEMU来完成。QEMU是一个纯软件实现的开源(模拟)软件,它能够模拟整套虚拟机的实现,包括CPU、内存、IO设备、USB、网卡等。
2、KVM用来模拟CPU的运行,但缺少了对Network和I/O的支持。QEMU-KVM是一个完整的模拟器,它基于KVM上,提供了完整的I/O模拟支持。其中OpenStack为了跨VM性,所以不会直接控制QEMU-KVM,而是通过Libvirt的库去间接控制QEMU-KVM。
3、KVM离不开QEMU,KVM实现初期,为了简化开发和代码重用,在QEMU基础上进行了修改,主要是将比较消耗CPU性能的CPU虚拟化和内存虚拟化部分移交到了内核中实现,保留IO虚拟化模块在用户空间实现,避免了用户态和内核态的频繁切换,优化使用性能。QEMU是一个纯软件的实现,运行在用户空间,性能非常低下,所以从QEMU的角度可以说是QEMU使用了KVM的虚拟化功能,为自身虚拟机提供资源与加速。
4、/dev/kvm接口是QEMU和KVM交互的“桥梁”。/dev/kvm本身是一个设备文件,可以通过ioctl函数来对该文件进行控制和管理,从而完成用户空间与内核空间的数据交互。KVM与QEMU的通信过程主要就是一系列针对该设备文件的ioctl系统调用。
1、KVM基本结构如上图。KVM已经是内核模块,被看作是一个标准Linux字符集设备(/dev/kvm)。QEMU通过Libkvm应用程序接口,用fd(文件描述符)通过ioctl向设备驱动来发送创建、运行虚拟机命令。设备驱动KVM会解析命令。
2、KVM模块让Linux主机成为了一个Hypervisor虚拟化软件层,在原有执行模式基础上,增加了客户模式。在虚拟机运行时,三种模式的工作为:
客户模式:执行非I/O的客户代码,虚拟机运行在这个模式下。
用户模式:代表用户执行I/O指令,QEMU运行在这个模式下,它用来为虚拟机模拟执行I/O类的操作请求。
内核模式:实现客户模式切换,处理因I/O或者其他指令引起的从客户模式退出动作(VM-Exit)。KVM模块工作在这个模式下。此模式下可以真正操作硬件,当Guest OS执行I/O类操作或特权指令操作时,需要向用户模式提交请求,然后由用户模式再次发起硬件操作请求给内核模式,从而真正操作硬件。
1、用户模式的QEMU利用Libkvm通过ioctl进入内核模式,KVM模块为虚拟机创建虚拟内存、虚拟CPU后,执行VMLAUCH指令进入客户模式,加载Guest OS并执行。
2、如果Guest OS发生外部中断或影子页表缺失等情况,会暂停Guest OS(客户模式)的执行,退出客户模式到内核模式执行异常处理,之后重新进入客户模式,执行客户代码。
3、如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式(QEMU)进行处理,执行模拟。
Libvirt是为了更方便地管理平台虚拟化技术而设计的开放源代码的应用程序接口、守护进程和管理工具,它不仅提供了对虚拟化客户机的管理,也提供了对虚拟化网络和存储的管理。Libvirt对多种不同的Hypervisor的支持是通过一种基于驱动程序的架构来实现的。Libvirt对不同的Hypervisor提供了不同的驱动:对Xen有Xen的驱动,对QEMU/KVM有QEMU驱动。Libvirt屏蔽了底层各种Hypervisor的细节,为上层管理工具提供了一个统一的API接口。
Xen虚拟化
Xen的Hypervisor是服务器经过BIOS启动之后载入的首个程序,然后启动一个具有特定权限的虚拟机,称之为Domain 0(简称Dom0)。Dom0的操作系统可以是Linux或Unix,Domain 0实现对Hypervisor控制和管理功能。在所承载的虚拟机中,Dom0是唯一可以直接访问物理硬件(如存储和网卡)的虚拟机,它通过本身加载的物理驱动,为其它虚拟机(Domain U,简称DomU)提供访问存储和网卡的桥梁。
xen虚拟化(当年还没有CPU硬件辅助的时候),xen虚拟化需要修改guest os(虚拟机操作系统)内核源码的,以支持它本身的虚拟化特性,意味着xen当年只支持linux(开源),不支持windows(闭源)。注意:半虚拟化是早期xen的解决方案,但是有了CPU硬件辅助虚拟化之后,xen虚拟化也可以通过cpu硬件辅助虚拟化来实现完全虚拟化。所以现在的XEN:靠自己支持半虚拟化,靠硬件辅助虚拟化支持全虚拟化。
3、安装KVM
VMware Workstation开启虚拟机嵌套虚拟机
配置yum源后安装以这个Virtualization开头的包组
8版本本地yum源# cat abc.repo
[os]
name = os
baseurl = file:///mnt/BaseOS
gpgcheck = 0
[app]
name = app
baseurl = file:///mnt/AppStream
gpgcheck = 0
7版本本地yum源# cat test.repo
[os]
name = os
baseurl = file:///mnt
gpgcheck = 0
# yum grouplist 查看包组 # yum grouplist |grep Virtualization
# yum groupinstall Virtualization* 安装以这个Virtualization开头的包组
调出kvm虚拟化管理界面,# virt-manager 不能调出的话就安装 # yum install virt-manager -y 安装图形化管理kvm
查看当前正在运行的虚拟机 # virsh list,查看所有kvm虚拟机 # virsh list --all
最小化安装用 # ip a 查看ip信息
虚拟机通过命令ifconfig可看到一张虚拟网卡vritbr0,该虚拟网卡为kvm虚机default默认的 NAT网卡(192.168.122.1)
1、KVM图形化创建虚拟机(先把要安装的iso镜像传进来)
/etc/libvirt/qemu目录下有个xml配置文件,将物理机的/dev/sda映射给虚拟机的/vda,先在物理机挂载分区再通过xml配置文件映射给虚拟机使用。
2、用KVM图形化在指定虚拟机存储空间创建kvm虚拟机,KVM 默认磁盘类型 qcow2
KVM图形化创建的kvm虚拟机默认磁盘是存放在该目录下[root@centos8 ~]# ls /var/lib/libvirt/images/
centos7.qcow2
手工指定kvm虚拟机存储路径,创建kvm虚拟机所用的磁盘(虚拟机加一块20G磁盘操作)
[root@centos8 ~]# mkdir /data
[root@centos8 ~]# qemu-img create -f qcow2 /data/centos701.qcow2 20g
Formatting ‘/data/centos701.qcow2’, fmt=qcow2 size=21474836480 cluster_size=65536 lazy_refcounts=off refcount_bits=16
[root@centos8 ~]# ls /data
centos701.qcow2
之后通过图形化创建kvm虚拟机的时候可以选择刚才手工创建的存储磁盘centos701.qcow2
3、KVM命令行创建虚拟机
其实就是把前面图形化点击的步骤转换成了命令行操作。
[root@centos8 ~]# qemu-img create -f qcow2 /data/centos702.qcow2 20g
Formatting ‘/data/centos702.qcow2’, fmt=qcow2 size=21474836480 cluster_size=65536 lazy_refcounts=off refcount_bits=16
virt-install \
--name centos702 \
--memory 1024 \
--vcpus 1 \
--disk path=/data/centos702.qcow2 \
--location /ios/CentOS-7.6-x86_64-DVD-1810.iso \
--network network=default \
--noautoconsole
但后面的系统安装还是要手工进行的,只是将KVM创建虚拟机过程命令行化了。
4、KVM命令行创建虚拟机,kickstart全自动安装。
注意:CentOS 8 版本是没有 kickstart 工具的,可以使用 CentOS 7 版本生成配置文件给 8 版本使用。
先用7版本生成配置文件,yum install -y system-config-kickstart.noarch 安装工具
system-config-kickstart 启动工具
将工具生成好的配置文件ks.cfg保存好,后上传到8版本安装。scp ks.cfg root@10.1.1.30:/root/
8版本根据配置文件ks.cfg自动安装,yum install -y httpd 安装apache
systemctl start httpd 启动apache服务
systemctl stop firewalld 关闭防火墙
qemu-img create -f qcow2 /data/centos703.qcow2 20g 创建虚拟机所用的磁盘
安装并启动httpd服务后就有/var/www/html目录即默认访问路径了,把ks.cfg传到/var/www/html目录
虽然是通过命令行可以进行全自动安装,但是因为有图形化界面,所以便于观察虚拟机的具体信息。
如果没有图形化界面呢?安装过程及安装完成后根本不知道虚拟机的ip地址,也不知道进行到哪一步了,这时候怎么办?在kickstart的配置文件ks.cfg中添加 console=ttyS0,115200
bootloader --append="net.ifnames=0 biosdevname=0 console=ttyS0,115200" --location=mbr
就能通过 virsh console xxx 方式连接到虚拟机里面,相当于插上了一根console线。
[root@cen82 ks]# virsh console centos703
Connected to domain centos703
Escape character is ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-957.el7.x86_64 on an x86_64
localhost login: root
Password:
注:按ctrl + 】退出virsh console,而不是按ctrl + c 结束
要是已经安装好了KVM虚拟机,可修改KVM虚拟机这个文件# vim /etc/default/grub
在GRUB_CMDLINE_LINUX尾部增加 net.ifnames=0 console=ttyS0,115200
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=9802414f-9043-4df6-94c7-43d61984fd47 rhgb quiet net.ifnames=0 console=ttyS0,115200"
再# grub2-mkconfig -o /boot/grub2/grub.cfg写入引导程序中
后reboot重启就能在宿主机virsh console 连虚拟机了
virt-install \
--name centos703 \
--memory 2048 \
--vcpus 1 \
--disk path=/data/centos703.qcow2 \
--location /ios/CentOS-7.6-x86_64-DVD-1810.iso \
--network network=default \
--noautoconsole \
-x ks=http://10.1.1.30/ks.cfg
KVM基本命令:
virsh --help 查看帮助
virsh list --all 列出所有虚拟机(包括正在运行的和关闭的)
virsh list 列出所有虚拟机(仅运行中的)
virsh start centos703 启动虚拟机
virsh shutdown centos703 关闭虚拟机
virsh reboot centos703 重启虚拟机
如果虚拟机关不了,强制关闭,非正常关闭,virsh destroy centos705
清除配置,virsh undefine centos705