上回书说到Linux镜像构建和部署工具的选型建议

这次我们细说KIWI。半瓦的文字希望大家能读到不同的内容,不希望只是翻译或者简单重复已有资料。笔者先会说下为什么对KIWI情有独钟;再分享下自己学习KIWI的思路;最后切入KIWI使用细节。对前言不感兴趣的小伙伴可以直接拉到第一个标题👇

笔者在suse第一次用kiwi是给opensuse for arm做映像,觉得还是比较灵活易用的。后来去了华为,在arm64 uefi和acpi完善前,os的测试也用kiwi制作镜像。在海航工作期间,也有封闭场景使用过kiwi。这些跳坑经历促成了现在《Linux自动化部署工具》系列文章(之一之二)。

为什么要写KIWI呢?其实KIWI自身有详细的手册和google groups讨论组(见参考资料[1], [2]),但是中文资料比较少,网上中文材料基本说的都是kiwi不是最新的kiwi-ng,而且缺乏具体技巧。另一方面,对于没有操作系统定制经验的人,直接看手册和讨论组可能不得要领,甚至问题不知道怎么问。笔者试图按照自己跳坑经历和大家分享KIWI的使用:

本地构建KIWI镜像

上次使用openSUSE的build service构建镜像。如果仅仅为了构建镜像,不需要build service。kiwi-ng的命令行🔧是一个单机工具。下文说明如何用kiwi命令行工具构建镜像(下文无特殊说明时,kiwi代表kiwi-ng)。

KIWI构建需要安装kiwi命令和kiwi所需的配置文件,具体过程见参考资料[1]。这里分享笔者自己的脚本。该脚本可以通过ssh连接到openSUSE机器并构建KIWI镜像。可以对照官方文档看本脚本。脚本地址:https://github.com/bjzhang/small_tools_collection/blob/master/appliance_helper/build_kiwi_image_remote.sh

执行下面的脚本即可构建镜像:

build_kiwi_image_remote.sh kiwi_machine --appliance centos/x86_64/centos-07.0-JeOS

build_kiwi_image_remote.sh通过ssh登陆到kiwi_machine,并执行build_kiwi_image.sh。其中kiwi_machine是opensuse的机器(物理机,虚拟机build_kiwi_image_remote.sh不支持容器)。”–appliance”表示具体使用的配置文件,上述参数可以构建centos 7.0的最小系统。build_kiwi_image.sh做的工作包括:

  1. 安装/更新kiwi命令;
  2. 下载KIWI官方配置文件;
  3. 构建前置条件检查;
  4. 构建指定的镜像。

上述直接执行构建任务的是kiwi-ng命令,下文直接使用kiwi-ng命令讲解。kiwi description是KIWI构建操作系统的配置文件,包含不同发行版(suse(包含SUSE和openSUSE),redhat,centos,debian)的模版,基于模版修改即可。实际的配置文件一般在第三层,例如”suse/x86_64/suse-leap-42.3-JeOS”表示suse发行版的x86_64架构的leap-42.3这个版本的最小系统(JeOS)。leap-42.3即openSUSE Leap42.3,是opensuse的最新版本。使用kiwi-ng命令指定目录即可构建对应的发行版,例如下面命令分别构建了opensuse42.3和centos7的镜像(由于墙的影响,发行版的测速不准确。故实际使用默认的配置文件时下载包的速度会比较慢,后文会给出国内源的例子):

APPLIANCE=suse/x86_64/suse-leap-42.3-JeOS/
sudo kiwi-ng --debug --color-output --type oem system build --target-dir $HOME/works/software/kiwi --description $APPLIANCE
APPLIANCE=centos/x86_64/centos-07.0-JeOS/
sudo kiwi-ng --debug --color-output --type oem system build --target-dir $HOME/works/software/kiwi --description $APPLIANCE

构建成功后会输出镜像文件:

[ INFO    ]: 04:07:37 | Result files:
[ INFO    ]: 04:07:37 | --> disk_image: /home/vagrant/works/software/kiwi/LimeJeOS-Leap-42.3.x86_64-1.42.3.raw
[ INFO    ]: 04:07:37 | --> image_packages: /home/vagrant/works/software/kiwi/LimeJeOS-Leap-42.3.x86_64-1.42.3.packages
[ INFO    ]: 04:07:37 | --> image_verified: /home/vagrant/works/software/kiwi/LimeJeOS-Leap-42.3.x86_64-1.42.3.verified
[ INFO    ]: 04:07:37 | --> installation_image: /home/vagrant/works/software/kiwi/LimeJeOS-Leap-42.3.x86_64-1.42.3.install.iso
[ INFO    ]: 04:07:37 | Cleaning up BootImageDracut instance

其中*.raw是硬盘文件,可以直接dd到硬盘;install.iso是镜像安装光盘,把这张按照光盘像平时安装Linux一样插入光驱,选择Install再选择硬盘即可完成安装。此外构建之后要删除—target-dir,否则会提示:

[ INFO    ]: 03:53:22 | Setup root directory: /home/vagrant/works/software/kiwi/build/image-root
[ ERROR   ]: 03:53:22 | KiwiRootDirExists: Root directory /home/vagrant/works/software/kiwi/build/image-root already exists
[ INFO    ]: 03:53:22 | Cleaning up SystemPrepare instance
vagrant@os74:~/works/source/kiwi-descriptions> sudo rm -rf ~/works/software/kiwi/build/image-root

初识KIWI配置文件

基于上面的本地构建结果,我们可以通过修改KIWI的配置文件定制自己所需要的镜像。先来看看KIWI的配置文件包括哪些:

kiwi-description-files

例说KIWI定制镜像

前面提到,KIWI定制镜像的核心配置文件是config.xml,官方文档在:https://suse.github.io/kiwi/development/schema.html。请大家看了下面的子标题,先去看官方文档,再回来看本文。希望本文看完了,schema也看熟练了。

修改或增加软件源

比如公司或学校内网有个镜像,可以这样修改config.xml

commit cafb99c233d958f01845eb8aa54f538783d709dd (HEAD -> kiwi_customization)
Author: Bamvor Zhang <bamv2005@gmail.com>
Date:   Sat Mar 10 10:31:27 2018 +0800

	examples: use tsinghua mirror instead of the default one

	Signed-off-by: Bamvor Zhang <bamv2005@gmail.com>

diff --git a/suse/x86_64/suse-leap-42.3-JeOS/config.xml b/suse/x86_64/suse-leap-42.3-JeOS/config.xml
index 0886cbc..7747b69 100644
--- a/suse/x86_64/suse-leap-42.3-JeOS/config.xml
+++ b/suse/x86_64/suse-leap-42.3-JeOS/config.xml
@@ -42,7 +42,7 @@
		 <source path="obs://Virtualization:Appliances:Builder/openSUSE_Leap_42.3"/>
	 </repository>
	 <repository type="rpm-md" alias="Leap_42_3" imageinclude="true">
-        <source path="obs://openSUSE:Leap:42.3/standard"/>
+        <source path="https://mirrors.tuna.tsinghua.edu.cn/opensuse/distribution/leap/42.3/repo/oss/"/>
	 </repository>
	 <packages type="image">
		 <package name="checkmedia"/>

比如想增加一个源,并且希望这个源在镜像中也有效,例如我希望测试最新社区内核(没有suse补丁)的某个特性,我可以这样修改;

commit c4c416c9884081ae5cc50bd8e77df50a60624e50 (HEAD -> kiwi_customization)
Author: Bamvor Zhang <bamv2005@gmail.com>
Date:   Sat Mar 10 10:57:57 2018 +0800

	examples: use lastest uptream kernel for kernel tester and low level user space development

	Signed-off-by: Bamvor Zhang <bamv2005@gmail.com>

diff --git a/suse/x86_64/suse-tumbleweed-JeOS/config.xml b/suse/x86_64/suse-tumbleweed-JeOS/config.xml
index 71c715a..55d7d77 100644
--- a/suse/x86_64/suse-tumbleweed-JeOS/config.xml
+++ b/suse/x86_64/suse-tumbleweed-JeOS/config.xml
@@ -29,6 +29,9 @@
	 <repository type="yast2" alias="Tumbleweed" imageinclude="true">
		 <source path="http://download.opensuse.org/tumbleweed/repo/oss"/>
	 </repository>
+    <repository type="yast2" alias="Kernel HEAD"  priority="2" imageinclude="true">
+        <source path="https://download.opensuse.org/repositories/Kernel:/HEAD/standard/"/>
+    </repository>
	 <packages type="image">
		 <package name="patterns-openSUSE-base"/>
		 <package name="plymouth-branding-openSUSE"/>
@@ -52,7 +55,7 @@
		 <package name="bash-completion"/>
		 <package name="dhcp-client"/>
		 <package name="which"/>
-        <package name="kernel-default"/>
+        <package name="kernel-vanilla"/>
		 <package name="timezone"/>
	 </packages>
	 <packages type="iso">

增加软件包

比如我希望在centos7镜像里面加入docker命令,可以这样修改:

commit 219124102d731debc0544b4aa1772568104b9e5a (HEAD -> kiwi_customization)
Author: Bamvor Zhang <bamv2005@gmail.com>
Date:   Sat Mar 10 11:10:28 2018 +0800

    examples: add docker command in centos7 image

    Signed-off-by: Bamvor Zhang <bamv2005@gmail.com>

diff --git a/centos/x86_64/centos-07.0-JeOS/config.xml b/centos/x86_64/centos-07.0-JeOS/config.xml
index d1491f8..8df4692 100644
--- a/centos/x86_64/centos-07.0-JeOS/config.xml
+++ b/centos/x86_64/centos-07.0-JeOS/config.xml
@@ -51,6 +51,7 @@
         <package name="grub2"/>
         <package name="kernel"/>
         <package name="plymouth-theme-charge"/>
+        <package name="docker"/>
     </packages>
     <packages type="iso">
         <package name="dracut-kiwi-live"/>

增加二进制包

比如我一个第三方下载的软件,没有安装源,只有二进制,可以这样修改

<archive name="binaries.tar.gz"/>

修改系统配置

上文提到kiwi description目录有个root目录,root目录的文件会覆盖步骤1中安装软件包之后的文件,例如我希望修改系统级的sysctl配置,可以增加文件root/etc/sysctl.d/99-tidb.conf,添加如下内容:

net.core.somaxconn = 32768
vm.swappiness = 0
net.ipv4.tcp_syncookies = 0
fs.file-max = 1000000

例如fs.file-max表示系统允许最大打开的文件数量是10万。下面我们修改config.sh时,修改的是名为tidb的用户的最大上限是10万。

其它镜像定制要求

下面的config.sh片段是笔者使用kiwi准备TiDB部署环境的例子:

echo "configure tidb"
deploy_user=tidb
echo "Configuration system and user limitation"
LIMITS_CONF="/etc/security/limits.conf"
echo "$deploy_user        soft        nofile        1000000" >> $LIMITS_CONF
echo "$deploy_user        hard        nofile        1000000" >> $LIMITS_CONF
echo "$deploy_user        soft        core          unlimited" >> $LIMITS_CONF
echo "$deploy_user        soft        stack         10240" >> $LIMITS_CONF
mv /binaries/tidb-v1.0.6-linux-amd64/bin/ /home/tidb/deploy
mkdir -p /home/tidb/deploy/log
chown tidb:tidb /home/tidb/deploy/log -R
mkdir -p /home/tidb/deploy/status
chown tidb:tidb /home/tidb/deploy/status -R

注:TiDB时新一代(NewSQL)与MYSQL兼容的分布式数据库,主要贡献公司是国内的创业公司Pincap(https://www.pingcap.com/),开发和使用社区都很活跃,github已经超过1万3千星。

KIWI参考资料

  1. kiwi quick start: https://suse.github.io/kiwi/quickstart.html
  2. google group: https://groups.google.com/forum/#!forum/kiwi-images
  3. YaST 映像创建程序是 KIWI 映像工具的图形界面: https://www.suse.com/zh-cn/documentation/sles-12/book_sle_deployment/data/cha_imgcreator.html
  4. kiwi-ng与legacy kiwi比较: https://suse.github.io/kiwi/overview/legacy_kiwi.html

你可能感兴趣的文章

这是本月的第三篇文章。半瓦平时有随手记笔记的习惯,公众号原创文章只分享自己有体会的信息,希望能促进价值信息流动。任何建议欢迎给我留言或添加我的微信(公众号回复“微信”,可以看到半瓦的微信):

本文首发本文公众号《敏达生活》,欢迎关注,拍砖,转发。