注意:部分文章发布时间较长,可能存在未知因素,购买时建议在本站搜索商家名称,先充分了解商家动态。
交流:唯一投稿邮箱:hostvps@88.com。
网上可以找到的 SolusVM KVM 系统模板制作教程都比较粗略,很多操作上的坑没有提到。包括来自官方的文档,官方有两个教程(链接一、链接二)。前者是 SolusVM 自带的功能脚本(1.13.00 版开始提供),操作简单也是测试可行方法。后者使用 libguestfs 工具包命令制作,测试没有成功。
下载系统镜像
SSH 登录 SolusVM 主控服务器,下载系统 ISO 安装镜像到指定目录(选 Minimal 版本)。
示例下载 CentOS 7.6 1810 Minimal(获取 CentOS 最新版或历史版本)。
cd /home/solusvm/kvm/iso && wget http://mirrors.maine.edu/CentOS/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso
如要确认文件完整性,可用 sha256sum 命令校验文件指纹。
添加同步 ISO
SolusVM 菜单栏 Configuration -> Media Groups 创建一个 ISO 组,然后 Media -> Add ISO,其中 PAE 选项设置为 Off。
Media -> Media Sync -> Create 同步媒体任务,把添加的 ISO 同步到节点服务器上。刷新 Jobs 选项卡页面查看同步进度,等状态变为 Completed。
创建 KVM 虚拟机
Virtual Servers -> Add Virtual Server 创建一台 KVM 虚拟机,Plan 选 Custom 以便手动设定配置。硬盘不要设得太大,不然制作出来的系统模板无法应用在比它小的虚拟机上(错误见下图 2)。
安装 CentOS 7 Minimal 为例,3G 硬盘空间就足够了(若要额外安装软件,则适当调整),内存不要设太低(过低可能无法加载图形安装界面)。笔者这里配置硬盘 3G、内存 512M,Swap 256M,CPU 1核)。主机名填 localhost.localdomain,选中添加的 ISO 系统镜像,没有 IPv6 就填 0。
更新:为减小而后制作的系统模板体积,建议硬盘多给两三 G,例如 5 G。
创建后先不急于安装,将 Disk Driver 由 ide (default) 改为 virtio 模式,性能会好一些。之后点击 Reboot 使设置生效,等待片刻再通过 HTML5 VNC 进入系统安装。
虚拟机系统安装
来到 CentOS 7 系统安装界面,主要设置安装位置和网络 & 主机名选项。
设置安装位置,选中“I will configure partitioning”,点击左上角“Done”进入分区设置。
选择“Standard Partition”,右下角加号添加分区。SolusVM 二代系统模板不支持扩展和逻辑分区(第一代支持,但因其局限性不被主流所使用)。这里创建两个固定大小标准分区,具体如下(系统模板在应用时会自动调整分区大小,故这里设置值不用有特别考虑)。
-
第一个分区挂载点设置
/
,文件系统选 Ext4(Ext3 也可以,勿用 XFS 因其不支持压缩); - 第二个分区类型选择 swap,文件系统也是 swap(内存交换分区非必需,不创建可降低硬盘 I/O 读写);
主分区文件系统这里有个坑,CentOS 7/Debian 9/Ubuntu 18 如果用 Ext4,制作出来的系统模板在运行 CentOS 6 节点服务器上 SolusVM 有的功能会失效(不能自动调整虚拟机分区大小),使用 Ext3 则正常。在这个问题上折腾了好久,参考官方系统模板找到解决方法,下文有介绍。
另外如果制作 Debian 9/Ubuntu 18 系统模板,必须在运行 CentOS 7 的节点服务器上操作,不然会制作失败,出来的镜像文件过大且无法使用!解决方法是添加 ELRepo 软件源更新内核,测试更新到 4.4 内核一切正常。
笔者这里/
分区设置 2G,Swap 分区设置 256M。设置后点“Done”,按提示应用分区更改。
设置网络和主机名。网络配置不用修改,使用默认 DHCP 方式。如果之后要安装软件,则开启网络连接。右下角设置主机名,点击“Apply”。
返回界面点击开始安装,过程中设置 Root 密码,完成后点 Reboot。至此系统安装完成。
定制修改所需系统环境
VNC 或 SSH 登录刚安装的系统,完成以下必须项设置。其它更改定制也在此过程中操作,譬如更新软件、禁用 SELinux、开启 BBR 等。如果系统安装时没有开启网络连接,可以在虚拟机控制面板点“Re-Configure”,SolusVM 会自动配置网络连接。
可选项一:卸载不必要已安装软件,用 yum list installed
命令查询。例如卸载 NetworkManager。
yum -y remove NetworkManager NetworkManager-*
必设项一: 编辑 /etc/fstab
文件,将硬盘分区 UUID 改为设备名(下面红色部分)。如果不修改,之后创建的系统模板用来开虚拟机时会找不到硬盘分区。
# # /etc/fstab # Created by anaconda on Mon Jan 8 06:13:00 2018 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/vda1 / ext4 defaults 1 1 /dev/vda2 swap swap defaults 0 0
必设项二:编辑 /etc/default/grub
文件,在 GRUB_CMDLINE_LINUX 参数里添加以下红色内容,目的是设置使用传统 ifcfg-ethx 网卡命名方式。
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0 biosdevname=0" GRUB_DISABLE_RECOVERY="true"
修改后运行 grub2-mkconfig -o /boot/grub2/grub.cfg
命令重新生成 grub 配置文件。
必设项三:编辑 /etc/sysconfig/network-scripts/ifcfg-eth0
网卡文件,清除里面的网络配置信息,设置 DHCP 自动分配方式。可直接复制下面内容替换。
DEVICE=eth0 NAME=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=dhcp PROXY_METHOD=none BROWSER_ONLY=no DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy IPV6_PRIVACY=no
之后 service network restart
重启网络(会断开 SSH,确认已完成需要网络的操作)。
必设项四:创建调整分区大小的系统服务和脚本文件,以解决 SolusVM 不能自动完成问题。
vi /usr/lib/systemd/system/guestfs-firstboot.service
[Unit] Description=libguestfs firstboot service After=network.target Before=prefdm.service [Service] Type=oneshot ExecStart=/usr/lib/virt-sysprep/firstboot.sh start RemainAfterExit=yes StandardOutput=journal+console StandardError=inherit [Install] WantedBy=default.target
运行下面命令刷新配置和设置服务开机启动。
systemctl daemon-reload systemctl enable guestfs-firstboot.service
创建上面服务关联的脚本文件,其工作方式查看其中注释。
mkdir -p /usr/lib/virt-sysprep/scripts vi /usr/lib/virt-sysprep/firstboot.sh
#!/bin/sh - ### BEGIN INIT INFO # Provides: virt-sysprep # Required-Start: $null # Should-Start: $all # Required-Stop: $null # Should-Stop: $all # Default-Start: 2 3 5 # Default-Stop: 0 1 6 # Short-Description: Start scripts to run once at next boot # Description: Start scripts to run once at next boot # These scripts run the first time the guest boots, # and then are deleted. Output or errors from the scripts # are written to ~root/virt-sysprep-firstboot.log. ### END INIT INFO d=/usr/lib/virt-sysprep/scripts d_done=/usr/lib/virt-sysprep/scripts-done logfile=~root/virt-sysprep-firstboot.log echo "$0" "$@" 2>&1 | tee -a $logfile echo "Scripts dir: $d" 2>&1 | tee -a $logfile if test "$1" = "start" then mkdir -p $d_done for f in $d/* ; do if test -x "$f" then # move the script to the 'scripts-done' directory, so it is not # executed again at the next boot mv $f $d_done echo '=== Running' $f '===' 2>&1 | tee -a $logfile $d_done/$(basename $f) 2>&1 | tee -a $logfile fi done rm -f $d_done/* fi
创建执行操作的脚本文件。如果不要自动运行更新,去掉其中的 yum -y update;
。该脚本只在虚拟机首次启动时运行,之后会自动取消服务开机启动。
vi /usr/lib/virt-sysprep/scripts/0001-swapoff--dev-vda2-mkswap--dev-vda2-swapon--dev-vda2-resize2f
swapoff /dev/vda2;mkswap /dev/vda2;swapon /dev/vda2;resize2fs /dev/vda1;yum -y update;systemctl disable guestfs-firstboot;reboot
设置上述两个脚本可执行权限。
chmod +x /usr/lib/virt-sysprep/firstboot.sh chmod +x /usr/lib/virt-sysprep/scripts/0001-swapoff--dev-vda2-mkswap--dev-vda2-swapon--dev-vda2-resize2f
必设项五:完成所需系统定制操作后,清除操作日志及缓存。
CentOS 6 和较早 Debian 版本可能还需运行下面命令使网络可正常工作。
rm /mnt/etc/udev/rules.d/70-persistent-net.rules touch /mnt/etc/udev/rules.d/70-persistent-net.rules chattr +i /mnt/etc/udev/rules.d/70-persistent-net.rules
完成系统修改后,虚拟机控制面板点 Shutdown 关闭虚拟机,准备制作系统模板。
生成 KVM 系统模板
SSH 登录虚拟机所在的节点服务器,使用下面命令制作 KVM 系统模板。
查看虚拟机分区情况。其中的 kvm102 是虚拟机 ID,可在 SolusVM 控制面板看到。
/scripts/kvmtemplate --mode=prescan --vmid=kvm102 --generation=2
删除虚拟机内的 SSH 密钥、MAC 地址、udev 规则(有些日志、配置文件需人工检查清理)。
/scripts/kvmtemplate --mode=prepare --vmid=kvm102 --generation=2
生成系统模板文件,过程需时几分钟。CentOS 7 Minimal 系统模板正常体积大小五六百M。
/scripts/kvmtemplate --mode=package --vmid=kvm102 --generation=2
修改系统模板文件名,遵循下面格式(避免随意命名,SolusVM 社区看到多个帖子因命名问题导致出现莫名问题)。
cd /home/solusvm/kvm/template mv template-c79ea4b7adda861ebb0d193715970d2a9ca28806.gz linux-centos-7-x86_64-min-gen2-v1.gz
补充:如果生成系统模板后想要修改其中文件,可用挂载方式修改。由于挂载非 Raw 格式镜像文件需要 libguestfs 和 libguestfs-tools 软件包,先用 rpm -q <软件包>
命令查询是否已安装。没有则安装。
yum -y install libguestfs libguestfs-tools
mkdir /mnt_tmp
创建挂载目录,运行下面命令挂载系统模板文件。
guestmount -a /home/solusvm/kvm/template/linux-centos-7-x86_64-min-gen2-v1.gz -i --rw /mnt_tmp
修改后用 fusermount -u /mnt_tmp
命令取消挂载,这样就不用重新制作模板而进行修改了。
同步系统模板并测试
用 scp 命令将制作好的系统模板同步到 SolusVM 主控服务器。
scp /home/solusvm/kvm/template/linux-centos-7-x86_64-min-gen2-v1.gz 123.123.123.123:/home/solusvm/kvm/template
添加 KVM 系统模板(添加方法之前文章有介绍,添加项 Generation 选 2,Disk Driver 选 virtio,Partition # to Resize 填 1,Swap Partition 填 2,这两个选项对应硬盘分区编号)。之后开个不同配置虚拟机,用df -hT
或lsblk
命令测试硬盘分区大小调整是否正常,内存用free -h
命令查看。
如上图所示测试正常。到此,SolusVM KVM 系统模板就制作完成了,后续有时间再介绍其它 Linux 发行版的系统模板制作。