SolusVM KVM 系统模板制作方法

Eric 教程 538 次浏览 抢沙发

网上可以找到的 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。

Add Media Groups
创建 ISO 媒体组
Add ISO Media
添加 ISO 系统镜像

Media -> Media Sync -> Create 同步媒体任务,把添加的 ISO 同步到节点服务器上。刷新 Jobs 选项卡页面查看同步进度,等状态变为 Completed。

Create Media Sync
同步 ISO 系统镜像
Media Sync Jobs
检查同步任务进度

创建 KVM 虚拟机

Virtual Servers -> Add Virtual Server 创建一台 KVM 虚拟机,Plan 选 Custom 以便手动设定配置。硬盘不要设得太大,不然制作出来的系统模板无法应用在比它小的虚拟机上(错误见下图 2)。

Select a Node & Plan
选择虚拟机开设节点和配置
Boot failed: could not read the boot disk
不当配置导致系统启动引导失败

安装 CentOS 7 Minimal 为例,3G 硬盘空间就足够了(若要额外安装软件,则适当调整),内存不要设太低(过低可能无法加载图形安装界面)。笔者这里配置硬盘 3G、内存 512M,Swap 256M,CPU 1核)。主机名填 localhost.localdomain,选中添加的 ISO 系统镜像,没有 IPv6 就填 0。

更新:为减小而后制作的系统模板体积,建议硬盘多给两三 G,例如 5 G。

Add Virtual Server

创建后先不急于安装,将 Disk Driver 由 ide (default) 改为 virtio 模式,性能会好一些。之后点击 Reboot 使设置生效,等待片刻再通过 HTML5 VNC 进入系统安装。

Disk Driver Virtio
更改硬盘设备类型
Virtual Server Options
虚拟机控制选项

虚拟机系统安装

来到 CentOS 7 系统安装界面,主要设置安装位置和网络 & 主机名选项。

Install CentOS 7
CentOS 7 安装界面
Installation Summary
CentOS 7 安装选项

设置安装位置,选中“I will configure partitioning”,点击左上角“Done”进入分区设置。

Installation Destination

选择“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”,按提示应用分区更改。

Manual Partitioning
添加标准分区
Create Partitioning
创建所需分区

设置网络和主机名。网络配置不用修改,使用默认 DHCP 方式。如果之后要安装软件,则开启网络连接。右下角设置主机名,点击“Apply”。

Network & HostName

返回界面点击开始安装,过程中设置 Root 密码,完成后点 Reboot。至此系统安装完成。

User Settings
设置 Root 密码
Install Complete
安装完成重启

定制修改所需系统环境

VNC 或 SSH 登录刚安装的系统,完成以下必须项设置。其它更改定制也在此过程中操作,譬如更新软件禁用 SELinux开启 BBR 等。如果系统安装时没有开启网络连接,可以在虚拟机控制面板点“Re-Configure”,SolusVM 会自动配置网络连接。

Virtual Server Re-Configure

可选项一:卸载不必要已安装软件,用 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" "[email protected]" 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 关闭虚拟机,准备制作系统模板。

Virtual Server 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 -hTlsblk命令测试硬盘分区大小调整是否正常,内存用free -h命令查看。

KVM Template Test

如上图所示测试正常。到此,SolusVM KVM 系统模板就制作完成了,后续有时间再介绍其它 Linux 发行版的系统模板制作。码字整理好累……

发表评论

电邮地址用于 Gravatar 头像显示,不会被公开可见。