通常云服务商提供的多为基础镜像主机,无法定制系统环境。

本篇主要为了解决项目上云过程有自定义镜像需求以达到快速部署集群需求以节约时间成本的场景

如:项目镜像需要集成k8s、agent脚本等各种集成场景。

本篇为新手入门向的基础教程,详细命令可参考:

libvirt命令帮助手册——筑梦之路_筑梦之路的博客-CSDN博客

准备环节:

一个VNC工具,强烈建议用mobax

一个vmware

1,电脑上装个vmware,并且用镜像起个linux系统。建议单独给这个台机器再单独挂个50G的盘把一会起虚机用镜像放里面(注意在处理器那里打开虚拟化)

Index of /centos-vault/7.6.1810/isos/x86_64/ 上古镜像下载地址

附,阿里云镜像站CENTOS7.9镜像下载地址:https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

2.建议装个GUI界面,系统安装结束,进入系统,这里用要改用阿里的yum源的话建议先用原来yum源install一个wgetinstall -y install wget

然后直接

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

或自行更改/etc/yum.repos.d源(可以使用rm -rf /etc/yum.repos.d/*清空原系统自带yum源)

注(如没有,可无视这段跳到3.):如果你像我一样还没yum wget就先把yum的.repo文件全删了,导致vmware-tools也没法安装,就建议改一下vmware当前虚拟机的网卡配置,改成仅主机模式和你个人电脑在同一个网络内,然后配置一下linux的/etc/sysconf/network-scripts/目录下的ifcfg-xxx;我这里是ifcfg-ens33,网卡配置文件。

然后BOOTPROTO=如果是none的话改成static(静态IP)

prefix改成24或者其他,只要别是默认的32位掩码就行..

onboot=yes(开机时候启动本网卡)

IPADDR=192.168.110.110(改一个IP,和你本机电脑的vmware虚拟网卡要在同一个网段)

然后wq!保存

systemctl restart network重启网卡

再配一下你个人电脑vmware的虚拟网卡就OK,注意掩码别搞错,或者和虚拟机IP冲突建议用24掩码,就是255.255.255.0,能ping通就OK,然后用xshell或者xmoba ssh过去可以复制粘贴yum源了,灰常方便。

3.yum kvm虚拟化组件

这里命令照搬参考CentOS7 KVM环境下制作qcow2格式镜像 - 云+社区 - 腾讯云

简单解释一哈kvm:kvm(底层虚拟化)qemu(辅助kvm虚拟化)libvirt(承载于kvm-qemu之上负责管理虚拟机) virt(最小化虚拟机控制台)

yum -y install qemu-kvm qemu-img kvm qemu-kvm-tools libvirt bridge-utils

yum install virt-*

systemctl enable libvirtd (默认启动虚拟机管理服务)

systemctl start libvirtd (启动服务)

echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf (ip转发)

sysctl -p (重新加载本机系统参数)

4.上传要做的qcow2镜像源iso文件到这台主机(我上传到的目录是/data)

试了一下没有办法直接调用qume-kvm 软连接一下

ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm

创建一个给一会启动的虚拟机存储的地方 我这里创建的40G 一会镜像也这么大

(设定的大小决定上云后系统盘大小,以预防系统盘满了无法写入扩容增加成本,建议40G+,)

qemu-img create -f qcow2 CentOS7.6_x86.qcow2 40G

这里写三种虚拟机网络的情况:

1.default (默认)2.bridge(网桥)3.bridge(网桥模式访问公网)

其中网卡启动时候使用default比较无脑就带过了

重点在bridge适用场景更广一些,和宿主机共享同一网络,可操作性性更高

(一)default (默认)情况

启动虚拟机(蓝色背景文字,请根据自己路径或情况写)

virt-install --name centos7.6 --ram 2048 --vcpus 2 --os-type linux --os-variant rhel7.6 --arch=x86_64 \
--network network=default,model=virtio --disk path=/data/CentOS7.6_x86.qcow2,format=qcow2 --location /data/CentOS-7-x86_64-Minimal-1810.iso\
--console pty,target_type=serial\
--graphics vnc,listen=0.0.0.0,port=7788

这里我用mobax启动虚拟机时候启动X服务自动弹出VNC;或者用其他vnc工具连接宿主机的7788端口都可以,下文就不赘述了。

(二)bridge (网桥)情况

本段网桥配置参考版权声明:CSDN博主「wayees」,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41248237/article/details/115443878

首先确定宿主机的virbr0 NAT网卡是否正常

ifconfig virbr0   没有ifconfig可以用 ip a 看看有没有这张网卡就可以

没起来的话就 ifup 网卡名 起来

确定virbr0网卡正常之后 因为在装组件的时候不会自动生成他的配置文件 故需要手动写入一下网卡的配置文件

vi /etc/sysconfig/network-scripts/ifcfg-br0
 

BOOTPROTO=static
NAME=br0
DEVICE=br0
TYPE=Bridge
IPADDR=(建议和你个人电脑相同的网段)
NETMASK=255.255.255.0(根据网络场景写)
GATEWAY=(根据网络场景写)
ONBOOT=yes

然后配置宿主机原生lo之外的另一张网卡,我这里网卡名叫ens33

配置ens33

TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0

systemctl restart network 重启网卡

virt-install --name centos7.6 --ram 2048 --vcpus 2 --os-type linux --os-variant rhel7.6 --arch=x86_64 \
--network bridge=br0,model=virtio --disk path=/data/CentOS7.6_x86.qcow2,format=qcow2 --location /data/CentOS-7-x86_64-Minimal-1810.iso\
--console pty,target_type=serial\
--graphics vnc,listen=0.0.0.0,port=7788

注:网桥模式的虚拟机可以配置虚拟机网卡和宿主机br0同一网段IP,同时宿主机和个人电脑也是同一个网段,便可以达到个人电脑可以访问到虚拟机效果

#宿主机
BOOTPROTO=static
NAME=br0
DEVICE=br0
TYPE=Bridge
IPADDR=192.168.110.110
NETMASK=255.255.255.0(根据网络场景写)
#GATEWAY=(根据网络场景写)
ONBOOT=yes
--------------------
#虚拟机
BOOTPROTO=static
NAME=ens3
DEVICE=ens3
TYPE=Ethernet
IPADDR=192.168.110.111
NETMASK=255.255.255.0(根据网络场景写)
#GATEWAY=(根据网络场景写)
ONBOOT=yes

随后重启虚拟机网卡

我的环境(供参考)

宿主机br0:192.168.110.110

虚拟机ens3 :192.168.110.111,

个人电脑vm网卡:192.168.110.252

 左侧宿主机        右侧个人电脑

能ping通 此刻个人电脑可以访问到虚拟机

(三)bridge(网桥模式访问公网)

VMware宿主机的br0网卡变更为可以访问到公网的状态

可以在物理直连模式使用网关上网,我这里用的NAT模式

宿主机能够上网之后开始配置虚拟机上网

虚拟机也有多种情况可配置上网,NAT、直连网关等等

这里只记录桥接这一种情况

vi /etc/sysconfig/network-scripts/ifcfg-br0  如(二)写一下配置文件 ,不同点在于模式改为DHCP

BOOTPROTO=DHCP
NAME=br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes

接下来如(二)将vm自带的网卡ens33绑到br0    ↓

TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0

systemctl restart network重启网卡后

启动主机  详见(二)的virt-install bridge模式主机拉起命令

安装步骤这里就略过了,进入后查看ens3网卡配置

然后测试ping 8.8.8.8

network根据自己情况可以选择网桥或者其他模式;

5.根据自己情况对虚拟机定制一下配置,可以改改yum文件或者关闭selinux之类的。

6.清一下虚拟机历史记录history -c,然后poweroff关机即可

7.宿主机 用virsh list --all看虚拟机名字

virt-sysprep -d 虚拟机名 清一下机器信息

而后对镜像进行空隙压缩

virt-sparsify --compress /data/CentOS7.6_x86.qcow2 /data/centos.7.6.qcow2

virt-sparsify --compress /xxx/源镜像.qcow2 /xxxx/压缩生成镜像.qcow2

8.测试压缩后镜像是否能启动virt-install --virt-type kvm --name Centos7.6 --memory 2048 --vcpus=4  --import --disk path=/data/centos.7.6.qcow2,format=qcow2  --graphics vnc,listen=0.0.0.0,port=7788 --os-type=linux

(如提示ERROR    internal error: qemu unexpectedly closed the monitor: Cannot set up guest memory 'pc.ram': Cannot allocate memory
Domain installation does not appear to have been successful,则代表本宿主机启动虚拟机所需的内存不足,须将memory调小

测试了一下登陆没问题,这一步我的vnc卡住了..

在宿主机virsh shutdown 虚机名 可以给虚机关机,同理virsh start 主机名 可以把离线的主机拉起来

virt-sysprep -d 主机名 再清一哈

弹出VNC的login界面,即代表测试无误。

附vritsh基础指令

virsh list --all 可以查看当前主机上所有虚拟机

将虚机拉起:virsh start 虚机名————仅在虚机关机的情况下

关机:virsh shutdown 虚机名————正常关机

断电:virsh destroy 虚机名————可以理解为强制关机 直接把虚机干碎关机

删除虚拟机:virsh undefine 虚机名    将虚拟机从宿主机删除

9.到此qcow2就搞完了,拖出去用就可以。

-------------------------------

(扩展部分)windows镜像有安装virito的需求

这里用2008r2的标准版做例子

(一)启动部分

virt-install --name win2008 \
--ram 2048 --vcpus=2 \
--os-type=windows \
--os-variant=win2k8r2 \
--disk path=/data/winserver08.qcow2,format=qcow2,bus=virtio \
--network bridge=br0,model=virtio \
--cdrom=/data/cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso \
--disk path=/data/virtio-win-0.1-81.iso,device=cdrom \
--graphics vnc,port=7788 \
--noautoconsole \
--autostart

可以看到这里网卡和硬盘都用的virtio模式↓

--disk path=/data/winserver08.qcow2,format=qcow2,bus=virtio \
--network bridge=br0,model=virtio \

并且再在挂载安装cdrom的iso的基础上,需要挂载virtio驱动的镜像,以在安装过程中加载virtio驱动(要不一会连驱动器都认不出来),这一行↓

--disk path=/data/virtio-win-0.1-81.iso,device=cdrom \

需要注意的是virtio的新版本不支持如:win2008、XP...等老版本系统,如果是要给老版本装windows2008这种则需要下载如:virtio-win-0.1-81等老版本。

下载地址:Index of /groups/virt/virtio-win/deprecated-isos/stable

还有比较新的:

Index of /groups/virt/virtio-win/direct-downloads/archive-virtio

然后拉起来就OK

(二)启动过程报错

这里我的报错了,提示驱动器里没有boot驱动,一般是没有加载到 系统.iso导致的,和启动顺序有关系

于是先把机器关一下

virsh destroy 虚机名

(因为多驱动器的关系,关一次可能关不上,隔几秒再关一次就好啦)

然后virsh edit 虚拟机名

观察devices的disk启动顺序

可以看到包含系统.iso的dev顺序是hdb而hda则是virtio.iso,也就是说会先读virtio.iso,但是里面没有系统,所以报错是正常的。

由此,我们需要修改一下顺序(这里我改过,然后保存了,再次打开了他上下顺序颠倒了一下)

再修改boot的模式由hd变更为cdrom(因为这里挂载iso是以cdrom挂载的):

变更为

再把机器拉起来

virsh start 虚拟机

vnc连一下,现在可以正常加载系统了

(三)驱动加载

到选择 选择安装系统位置 这一步时,点击加载驱动程序

选择 浏览 找到我们挂载的virtio所在的盘符

选取与自己系统版本对应的目录以及操作系统位数(这里我是win2008R2 x64位所以会选win7/amd64)

对应关系我是从这看的..

1325078 – Add TargetOSVersion to driver inf files

加载scsi的然后 下一步,等一会

就可以看到盘啦,正常分区加载系统就ok

等系统装好后,进设备管理器更新一下还没被加载的驱动。

下面这两个都更新加载一下

手动选择virito的盘内,自己对应的驱动目录

安装

这里因为用到的这三种,装好之后可以看到这三个

然后关机

(四)还原虚拟机启动信息(可选)

cdrom还原回hd

disk部分把两个cdrom的iso对应的<disk>内容删掉就OK

再把机器拉起来看一下有没有报错,以及两个iso的cdrom没有自动挂载上就ok了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐