diff --git a/0001-fix-Fix-some-spelling-errors-in-docs.patch b/0001-fix-Fix-some-spelling-errors-in-docs.patch new file mode 100644 index 0000000000000000000000000000000000000000..52f3c01975d8020bada380db1c90e2963d81fdf0 --- /dev/null +++ b/0001-fix-Fix-some-spelling-errors-in-docs.patch @@ -0,0 +1,61 @@ +From e44e963748c8f2c19bd95383074c49fe35110ac2 Mon Sep 17 00:00:00 2001 +From: weihao +Date: Wed, 27 Nov 2024 09:45:45 +0800 +Subject: [PATCH 01/11] fix: Fix some spelling errors in docs + +--- + docs/quick-start.md | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/docs/quick-start.md b/docs/quick-start.md +index 1d59048e..da379062 100644 +--- a/docs/quick-start.md ++++ b/docs/quick-start.md +@@ -163,7 +163,7 @@ + * 使用kubernetes的声明式API进行配置,部署CRD(CustomResourceDefinition),operator,proxy以及rbac机制的YAML需要用户自行编写 + * YAML举例说明模板参见本目录下example文件夹下的文件夹,你也可以将config文件夹拷贝到docs上一级目录,并进行简单的修改使用 + * 这些YAML配置文件,由K8s集群管理员加载,如果恶意在yaml文件里面写了病毒,K8s集群管理员如果放行,传到我们的处理模块我们也是没有办法校验的,此处有风险 +- * operator和proxy部署在kubernets集群中,operator应部署为deployment,proxy应部署为damonset ++ * operator和proxy部署在kubernetes集群中,operator应部署为deployment,proxy应部署为damonset + * 尽量部署好k8s的安全措施,如rbac机制,pod的service account和security policy配置等。**注意**:operator所在容器仅需要普通用户权限运行,proxy所在容器需要root权限运行以访问worker节点上的os-agent.sock,但是可以drop全部的capabilities,如: + + ```yaml +@@ -345,7 +345,7 @@ + version: edit.os.version + configs: + - model: kernel.sysctl +- contents: ++ contents: + - key: kernel param key1 + value: kernel param value1 + - key: kernel param key2 +@@ -361,7 +361,7 @@ + version: 1.0.0 + configs: + - model: kernel.sysctl +- contents: ++ contents: + - key: kernel param key4 + value: kernel param value4 + ``` +@@ -536,7 +536,7 @@ + apiVersion: upgrade.openeuler.org/v1alpha1 + kind: OS + metadata: +- name: os-sample ++ name: os-sample + spec: + imagetype: "" + opstype: rollback +@@ -728,7 +728,7 @@ hostshell + + #### kernel Settings + +-* kenerl.sysctl:临时设置内核参数,重启后无效,key/value 表示内核参数的 key/value, key与value均不能为空且key不能包含“=”,该参数不支持删除操作(operation=delete)示例如下: ++* kernel.sysctl:临时设置内核参数,重启后无效,key/value 表示内核参数的 key/value, key与value均不能为空且key不能包含“=”,该参数不支持删除操作(operation=delete)示例如下: + + ```yaml + configs: +-- +2.39.5 (Apple Git-154) + diff --git a/0002-docs-update-kbimg-docs.patch b/0002-docs-update-kbimg-docs.patch new file mode 100644 index 0000000000000000000000000000000000000000..bb5321134eaf176af4b25ee190d3a2a154da1884 --- /dev/null +++ b/0002-docs-update-kbimg-docs.patch @@ -0,0 +1,1209 @@ +From 63d4c8914090ac3fdb24ddc2b43dbd44795a5f95 Mon Sep 17 00:00:00 2001 +From: Yuhang Wei +Date: Wed, 27 Nov 2024 17:31:43 +0800 +Subject: [PATCH 02/11] docs: update kbimg docs + +Signed-off-by: Yuhang Wei +--- + docs/quick-start.md | 33 +- + ...275\234\346\214\207\345\257\274-binary.md" | 469 +++++++++++++++++ + ...75\234\346\214\207\345\257\274-scripts.md" | 169 ++++++ + ...66\344\275\234\346\214\207\345\257\274.md" | 485 ------------------ + 4 files changed, 641 insertions(+), 515 deletions(-) + create mode 100644 "docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" + create mode 100644 "docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-scripts.md" + delete mode 100644 "docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" + +diff --git a/docs/quick-start.md b/docs/quick-start.md +index 1d59048e..599b17b6 100644 +--- a/docs/quick-start.md ++++ b/docs/quick-start.md +@@ -112,41 +112,14 @@ + * 请确保os-agent属主和属组为root,建议os-agent文件权限为500 + + * 容器OS虚拟机镜像制作 +- 进入scripts目录,执行脚本 ++ 在KubeOS项目根目录下,执行 + + ```shell +- cd scripts +- bash kbimg.sh create vm-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' ++ cargo run --package kbimg -- create -f KubeOS-Rust/kbimg/kbimg.toml vm-img + ``` + +- 参数说明如下: +- +- ```bash +- Usage : kbimg create vm-image -p iso-path -v os-version -b os-agent-dir -e os-password +- or +- kbimg create vm-image -d repository/name:tag +- +- options: +- -p repo path +- -v KubeOS version +- -b path of os-agent binary +- -e os encrypted password +- -d docker image like repository/name:tag +- -l boot to legacy BIOS mode, if not specify, then UEFI mode +- -h,--help show help information +- ``` +- +- * 其中 xxx.repo 为制作镜像所需要的 yum 源,yum 源建议配置为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。 +- * 容器 OS 镜像制作完成后,会在 scripts 目录下生成: +- * raw格式的系统镜像system.img,system.img大小默认为20G,支持的根文件系统分区大小<2020MiB,持久化分区<16GB。 +- * qcow2 格式的系统镜像 system.qcow2。 +- * 可用于升级的根文件系统分区镜像 update.img 。 +- * 制作出来的容器 OS 虚拟机镜像目前只能用于 CPU 架构为 x86 和 AArch64 的虚拟机场景。若x86 架构的虚拟机需要使用 legacy 启动模式,需制作镜像时指定-l参数 +- * 默认root密码为openEuler12#$ +- * 您可通过`openssl passwd -6 -salt $(head -c18 /dev/urandom | openssl base64)`命令生成root密码并通过`-e`参数配置密码 +- * 容器OS运行底噪<150M (不包含k8s组件及相关依赖kubernetes-kubeadm,kubernetes-kubelet, containernetworking-plugins,socat,conntrack-tools,ebtables,ethtool) ++ 详细配置文件和命令行参数说明请见[KubeOS镜像制作指导](../docs/user_guide/KubeOS镜像制作指导-binary.md): + * 本项目不提供容器OS镜像,仅提供裁剪工具,裁剪出来的容器OS内部的安全性由OS发行商保证。 +- * 详细参数说明请见[《容器OS镜像制作指导》](../docs/user_guide/%E5%AE%B9%E5%99%A8OS%E9%95%9C%E5%83%8F%E5%88%B6%E4%BD%9C%E6%8C%87%E5%AF%BC.md) + + * 声明: os-agent使用本地unix socket进行通信,因此不会新增端口。下载镜像的时候会新增一个客户端的随机端口,1024~65535使用完后关闭。proxy和operator与api-server通信时作为客户端也会有一个随机端口,基于kubernetes的operator框架,必须使用端口。他们部署在容器里。 + +diff --git "a/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" "b/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" +new file mode 100644 +index 00000000..b951b388 +--- /dev/null ++++ "b/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" +@@ -0,0 +1,469 @@ ++# KubeOS镜像制作说明 ++ ++## 简介 ++ ++kbimg是使用Rust语言编写的二进制工具,通过解析用户的[toml配置文件](#详细toml配置文件示例),动态生成脚本,制作KubeOS虚拟机镜像、PXE物理机镜像、升级镜像和admin容器镜像。 ++ ++## 命令介绍 ++ ++kbimg - CLI tool for generating various types of image for KubeOS ++ ++```text ++Usage: kbimg [OPTIONS] ++ ++Commands: ++ create Create a new KubeOS image ++ help Print this message or the help of the given subcommand(s) ++ ++Options: ++ -d, --debug Enable debug mode, generate the scripts without execution ++ -h, --help Print help ++ -V, --version Print version ++``` ++ ++kbimg-create - Create a new KubeOS image ++ ++```text ++Usage: kbimg create --file ++ ++Arguments: ++ [possible values: vm-img, pxe-img, upgrade-img, admin-container] ++ ++Options: ++ -f, --file Path to the toml configuration file ++ -h, --help Print help ++``` ++ ++## 注意事项 ++ ++* 请确保已安装`qemu-img bc parted tar yum docker dosfstools` ++* 制作启用dm-verity功能的镜像,需要安装`pesign nss openssl veritysetup crypto-policies` ++* KubeOS镜像制作需要使用root权限 ++* 制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库 ++* KubeOS镜像制作之前需要先将当前机器上的selinux关闭或者设为允许模式 ++* 使用默认rpmlist进行KubeOS镜像制作至少需要有25G的剩余空间 ++* KubeOS镜像制作工具执行异常中断,可能会残留文件、目录或挂载,需用户手动清理,对于可能残留的rootfs目录,该目录虽然权限为555,但容器OS镜像制作在开发环境进行,不会对生产环境产生影响 ++* 请确保os-agent属主和属组为root,建议os-agent文件权限为500 ++ ++## 配置文件说明 ++ ++### from_repo ++ ++从 repo 创建升级容器镜像、虚拟机镜像或PXE物理机镜像 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | agent_path | os-agent 二进制的路径 | ++ | legacy_bios | 镜像为 legacy 引导或 UEFI 引导 | ++ | repo_path | repo 文件的路径,repo 文件中配置制作镜像所需要的 yum 源 | ++ | root_passwd | root 用户密码,与/etc/shadow文件内密码格式一致,可使用`openssl passwd -6 -salt $(head -c18 /dev/urandom \| openssl base64)`命令生成 | ++ | version | KubeOS 镜像的版本,将写入/etc/os-release文件内作为OS标识 | ++ | rpmlist | 期望安装进镜像内的rpm包列表 | ++ | upgrade_img | [OPTIONAL]指定生成的升级容器镜像的镜像名(制作升级容器镜像必需) | ++ ++### admin_container ++ ++制作admin运维容器 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | hostshell | hostshell二进制路径,可在项目根目录下通过`make hostshell`编译 | ++ | img_name | 指定生成的容器镜像名 | ++ ++### pxe_config ++ ++在制作PXE物理机镜像时,配置该参数用于PXE安装。制作PXE物理机镜像时必需。 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | server_ip | 用于下载根文件系统 tar 包的 HTTP 服务器地址 | ++ | rootfs_name | 放置于 HTTP 服务器的文件系统 tar 包名称 | ++ | disk | 安装 KubeOS 系统的目标磁盘名 | ++ | route_ip | 配置目标机器网卡的路由 IP | ++ | dhcp | [OPTIONAL] 默认为 false,启用 DHCP 模式配置网络 | ++ | local_ip | [OPTIONAL] 配置目标机器网卡的 IP,dhcp 为 false 时必需 | ++ | net_name | [OPTIONAL] 配置目标机器网卡名,dhcp 为 false 时必需 | ++ | netmask | [OPTIONAL] 配置目标机器网卡的子网掩码,dhcp 为 false 时必需 | ++ ++### users ++ ++[OPTIONAL] 添加用户 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | name | 用户名 | ++ | passwd | 密码 | ++ | primary_groups | [OPTIONAL] 用户主组 | ++ | groups | [OPTIONAL] 用户附加组 | ++ ++### copy_files ++ ++[OPTIONAL] 拷贝文件到rootfs内指定目录 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | dst | 目标路径 | ++ | src | 源文件路径 | ++ | create_dir | [OPTIONAL]拷贝前创建文件夹 | ++ ++### grub ++ ++[OPTIONAL] grub配置,配置dm-verity时必需 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | passwd | grub 密码 | ++ ++### systemd_service ++ ++[OPTIONAL] 新增 systemd 服务 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | name | systemd 服务名 | ++ ++### chroot_script ++ ++[OPTIONAL] 自定义 chroot 脚本 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | path | 脚本路径 | ++ | rm | [OPTIONAL]执行完毕后是否删除该脚本 | ++ ++### disk_partition ++ ++[OPTIONAL] 自定义分区大小和镜像大小 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | root | root分区大小, 单位为MiB | ++ | img_size | [OPTIONAL]镜像大小,单位为GB | ++ ++### persist_mkdir ++ ++[OPTIONAL] persist 分区新建目录 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | name | 目录名 | ++ ++### dm_verity ++ ++[OPTIONAL] 制作启用dm-verity功能的虚拟机或升级镜像 ++ ++ | 参数 | 描述 | ++ | --- | --- | ++ | efi_key | efi明文口令 | ++ | grub_key | grub明文口令 | ++ | keys_dir |[OPTIONAL]可指定密钥文件夹,复用先前制作镜像创建的密钥 | ++ ++## 使用示例 ++ ++### KubeOS 虚拟机镜像制作 ++ ++* 支持CPU 架构为 x86 和 aarch64 的虚拟机场景。若x86架构的虚拟机需要使用 legacy 启动模式,请在`[from_repo]`下配置`legacy_bios`为`true` ++* `repo_path`为制作镜像所需要的 yum 源文件路径,yum 源建议配置为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。 ++* 默认root密码为openEuler12#$ ++* 容器OS运行底噪<150M (不包含k8s组件及相关依赖`kubernetes-kubeadm,kubernetes-kubelet, containernetworking-plugins,socat,conntrack-tools,ebtables,ethtool`) ++ ++* 配置文件示例 ++ ++```toml ++[from_repo] ++agent_path = "./bin/rust/release/os-agent" ++legacy_bios = false ++repo_path = "/etc/yum.repos.d/openEuler.repo" ++root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" # default passwd: openEuler12#$ ++rpmlist = [ ++ "NetworkManager", ++ "cloud-init", ++ "conntrack-tools", ++ "containerd", ++ "containernetworking-plugins", ++ "cri-tools", ++ "dhcp", ++ "ebtables", ++ "ethtool", ++ "iptables", ++ "kernel", ++ "kubernetes-kubeadm", ++ "kubernetes-kubelet", ++ "openssh-server", ++ "passwd", ++ "rsyslog", ++ "socat", ++ "tar", ++ "vi", ++] ++version = "v1" ++``` ++ ++* 结果说明 ++容器 OS 镜像制作完成后,会在 ./scripts-auto 目录下生成 ++ * system.qcow2: qcow2 格式的系统镜像,大小默认为 20GiB,支持的根文件系统分区大小 < 2560 MiB,持久化分区 < 15GB 。 ++ * system.img: img 格式的系统镜像,大小默认为 20GiB,支持的根文件系统分区大小 < 2560 MiB,持久化分区 < 15GB 。 ++ * kubeos.tar: 用于升级的根文件系统tar包 ++ ++### KubeOS 升级容器镜像制作 ++ ++* 制作KubeOS容器镜像 ++ ++```toml ++[from_repo] ++agent_path = "./bin/rust/release/os-agent" ++legacy_bios = false ++repo_path = "/etc/yum.repos.d/openEuler.repo" ++root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" # default passwd: openEuler12#$ ++rpmlist = [ ++ "NetworkManager", ++ "cloud-init", ++ "conntrack-tools", ++ "containerd", ++ "containernetworking-plugins", ++ "cri-tools", ++ "dhcp", ++ "ebtables", ++ "ethtool", ++ "iptables", ++ "kernel", ++ "kubernetes-kubeadm", ++ "kubernetes-kubelet", ++ "openssh-server", ++ "passwd", ++ "rsyslog", ++ "socat", ++ "tar", ++ "vi", ++] ++upgrade_img = "kubeos-upgrade:v1" ++version = "v1" ++``` ++ ++* 制作完成后,通过`docker images`查看制作出来的KubeOS容器镜像 ++ ++### KubeOS PXE物理机安装所需镜像及文件制作 ++ ++* 支持CPU 架构为 x86 和 aarch64 的物理机场景,不支持legacy引导模式 ++* PXE物理机镜像制作不支持dm-verity功能 ++* 首先需要修改```kbimg.toml```中```pxe_config```的配置,对相关参数进行配置,详细参数可见[参数说明](#pxe_config),ip目前仅支持ipv4,配置示例如下 ++ ++ ```toml ++ [pxe_config] ++ dhcp = false ++ # rootfs file name ++ rootfs_name = "kubeos.tar" ++ # select the target disk to install kubeOS ++ disk = "/dev/vda" ++ # pxe server ip address where stores the rootfs on the http server ++ server_ip = "192.168.122.50" ++ # target machine ip ++ local_ip = "192.168.122.100" ++ # target machine route ++ route_ip = "192.168.122.1" ++ # target machine netmask ++ netmask = "255.255.255.0" ++ # target machine netDevice name ++ net_name = "eth0" ++ ``` ++ ++* 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用```copy_files```字段将配置文件拷贝到```/etc```目录 ++ ++ ```toml ++ [[copy_files]] ++ dst = "/etc" ++ src = "" ++ ``` ++ ++* KubeOS物理机安装所需镜像制作,及pxe_config配置全示例 ++ ++ ```toml ++ [from_repo] ++ agent_path = "./bin/rust/release/os-agent" ++ legacy_bios = false ++ repo_path = "/etc/yum.repos.d/openEuler.repo" ++ root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" # default passwd: openEuler12#$ ++ rpmlist = [ ++ "NetworkManager", ++ "cloud-init", ++ "conntrack-tools", ++ "containerd", ++ "containernetworking-plugins", ++ "cri-tools", ++ "dhcp", ++ "ebtables", ++ "ethtool", ++ "iptables", ++ "kernel", ++ "kubernetes-kubeadm", ++ "kubernetes-kubelet", ++ "openssh-server", ++ "passwd", ++ "rsyslog", ++ "socat", ++ "tar", ++ "vi", ++ "coreutils", ++ "dosfstools", ++ "dracut", ++ "gawk", ++ "hwinfo", ++ "net-tools", ++ "parted", ++ ] ++ version = "v1" ++ ++ [pxe_config] ++ dhcp = true ++ rootfs_name = "kubeos.tar" ++ disk = "/dev/vda" ++ server_ip = "192.168.122.50" ++ route_ip = "192.168.122.1" ++ #local_ip = "192.168.1.100" ++ #netmask = "255.255.255.0" ++ #net_name = "eth0" ++ ``` ++ ++* 结果说明 ++ * initramfs.img: 用于pxe启动用的 initramfs 镜像 ++ * kubeos.tar: pxe安装所用的根分区文件系统 ++ ++### admin运维容器镜像制作 ++ ++* 首先在KubeOS项目根目录下,执行`make hostshell`命令编译hostshell二进制 ++* 在toml配置文件内,填入以下示例配置制作admin运维容器镜像 ++ ++```toml ++[admin_container] ++img_name = "kubeos-admin-container:v1" ++hostshell = "./bin/hostshell" ++``` ++ ++* 制作完成后,通过`docker images`查看制作出来的KubeOS容器镜像 ++ ++## 使用说明 ++ ++### 使用cloud-init在KubeOS启动时初始化 ++ ++在`[from_repo]`配置内的`rpmlist`中,配置`cloud-init`包,可在KubeOS启动时使用`cloud-init`进行初始化。 ++若用户需要覆盖默认的cloud-init配置,可配置如下示例 ++ ++ ```toml ++ [[copy_files]] ++ dst = "/etc/cloud" ++ src = "./cloud.cfg" ++ ``` ++ ++### 创建systemd服务 ++ ++* 新增 systemd 服务需要将对应的 .service 文件或 .mount 文件拷贝至镜像```/etc/systemd/system```目录下 ++ ++ ```toml ++ [[copy_files]] ++ dst = "/etc/systemd/system" ++ src = "./containerd.service" ++ ++ [systemd_service] ++ name = ["containerd"] ++ ``` ++ ++## 附录 ++ ++### 详细toml配置文件示例 ++ ++请根据需求和[配置文件说明](#配置文件说明),修改如下示例配置文件,生成所需镜像。 ++ ++```toml ++[from_repo] ++agent_path = "./bin/rust/release/os-agent" ++legacy_bios = false ++repo_path = "/etc/yum.repos.d/openEuler.repo" ++root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" # default passwd: openEuler12#$, use "openssl passwd -6 -salt $(head -c18 /dev/urandom | openssl base64)" to generate your passwd ++rpmlist = [ ++ "NetworkManager", ++ "cloud-init", ++ "conntrack-tools", ++ "containerd", ++ "containernetworking-plugins", ++ "cri-tools", ++ "dhcp", ++ "ebtables", ++ "ethtool", ++ "iptables", ++ "kernel", ++ "kubernetes-kubeadm", ++ "kubernetes-kubelet", ++ "openssh-server", ++ "passwd", ++ "rsyslog", ++ "socat", ++ "tar", ++ "vi", ++ # Below packages are required for pxe-image. Uncomment them if you want to generate pxe-image. ++ # "coreutils", ++ # "dosfstools", ++ # "dracut", ++ # "gawk", ++ # "hwinfo", ++ # "net-tools", ++ # "parted", ++] ++upgrade_img = "kubeos-upgrade:v1" ++version = "v1" ++ ++# [admin_container] ++# img_name = "kubeos-admin-container:v1" ++# hostshell = "./bin/hostshell" ++ ++# [pxe_config] ++# dhcp = false ++# disk = "/dev/vda" ++# local_ip = "192.168.1.100" ++# net_name = "eth0" ++# netmask = "255.255.255.0" ++# rootfs_name = "kubeos.tar" ++# route_ip = "192.168.1.1" ++# server_ip = "192.168.1.50" ++ ++# [[users]] ++# groups = ["admin", "wheel"] ++# name = "foo" ++# passwd = "foo" ++# primary_group = "foo" ++ ++# [[users]] ++# groups = ["example"] ++# name = "bar" ++# passwd = "bar" ++ ++# [[copy_files]] ++# create_dir = "/root/test" ++# dst = "/root/test/foo.txt" ++# src = "/root/KubeOS/foo.txt" ++ ++# [[copy_files]] ++# dst = "/etc/bar.txt" ++# src = "../bar.txt" ++ ++# [grub] ++# passwd = "foo" ++ ++# [systemd_service] ++# name = ["containerd", "kubelet"] ++ ++# [chroot_script] ++# path = "./my_chroot.sh" ++# rm = true ++ ++# [disk_partition] ++# img_size = 30 # GB ++# root = 3000 # MiB ++ ++# [persist_mkdir] ++# name = ["bar", "foo"] ++ ++# [dm_verity] ++# efi_key = "foo" ++# grub_key = "bar" ++# keys_dir = "./keys" ++``` +diff --git "a/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-scripts.md" "b/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-scripts.md" +new file mode 100644 +index 00000000..2b147107 +--- /dev/null ++++ "b/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-scripts.md" +@@ -0,0 +1,169 @@ ++# KubeOS镜像制作指导 ++ ++## 简介 ++ ++kbimg.sh是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg.sh制作KubeOS 容器,虚拟机和物理机镜像 ++ ++## 命令介绍 ++ ++### 命令格式 ++ ++**bash kbimg.sh** \[ --help | -h \] create \[ COMMANDS \] \[ OPTIONS \] ++ ++### 参数说明 ++ ++* COMMANDS ++ ++ | 参数 | 描述 | ++ |------------------------------| ---------------------------------------------- | ++ | upgrade-image | 生成用于安装和升级的OCI镜像格式的 KubeOS 镜像 | ++ | vm-image | 生成用于部署和升级的虚拟机镜像 | ++ | pxe-image | 生成物理机安装所需的镜像及文件 | ++ ++* OPTIONS ++ ++ | 参数 | 描述 | ++ | ------------ | ------------------------------------------------------------ | ++ | -p | repo 文件的路径,repo 文件中配置制作镜像所需要的 yum 源 | ++ | -v | 制作出来的KubeOS镜像的版本 | ++ | -b | os-agent二进制的路径 | ++ | -e | KubeOS 镜像 root 用户密码,加密后的带盐值的密码,可以用 openssl,kiwi 命令生成 | ++ | -d | 生成或者使用的 docke r镜像 | ++ | -l | 如果指定参数,则镜像为legacy引导,不指定默认是UEFI引导 | ++ | -h --help | 查看帮助信息 | ++ ++## 使用说明 ++ ++### 注意事项 ++ ++* kbimg.sh 执行需要 root 权限 ++* 当前仅支持 x86和 AArch64 架构使用 ++* 容器 OS 镜像制作工具的 rpm 包源为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库 ++ ++### KubeOS OCI 镜像制作 ++ ++#### 注意事项 ++ ++* 制作的 OCI 镜像仅用于后续的虚拟机/物理机镜像制作或升级使用,不支持启动容器 ++* 使用默认 rpmlist 进行容器OS镜像制作时所需磁盘空间至少为6G,如自已定义 rpmlist 可能会超过6G ++ ++#### 使用示例 ++ ++* 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件 ++ ++```shell ++ cd /opt/kubeOS/scripts ++ touch resolv.conf ++ vim resolv.conf ++``` ++ ++* 制作KubeOS容器镜像 ++ ++``` shell ++cd /opt/kubeOS/scripts ++bash kbimg.sh create upgrade-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' -d your_imageRepository/imageName:version ++``` ++ ++* 制作完成后查看制作出来的KubeOS容器镜像 ++ ++``` shell ++docker images ++``` ++ ++### KubeOS 虚拟机镜像制作 ++ ++#### 注意事项 ++ ++* 如使用 docker 镜像制作请先拉取相应镜像或者先制作docker镜像,并保证 docker 镜像的安全性 ++* 制作出来的容器 OS 虚拟机镜像目前只能用于 CPU 架构为 x86 和 AArch64 的虚拟机 ++* 容器 OS 目前不支持 x86 架构的虚拟机使用 legacy 启动模式启动 ++* 使用默认rpmlist进行容器OS镜像制作时所需磁盘空间至少为25G,如自已定义rpmlist可能会超过25G ++ ++#### 使用示例 ++ ++* 使用repo源制作 ++ * 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件 ++ ++ ```shell ++ cd /opt/kubeOS/scripts ++ touch resolv.conf ++ vim resolv.conf ++ ``` ++ ++ * KubeOS虚拟机镜像制作 ++ ++ ``` shell ++ cd /opt/kubeOS/scripts ++ bash kbimg.sh create vm-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' ++ ``` ++ ++* 使用docker镜像制作 ++ ++ ``` shell ++ cd /opt/kubeOS/scripts ++ bash kbimg.sh create vm-image -d your_imageRepository/imageName:version ++ ``` ++ ++* 结果说明 ++ 容器 OS 镜像制作完成后,会在 /opt/kubeOS/scripts 目录下生成: ++ * system.qcow2: qcow2 格式的系统镜像,大小默认为 20GiB,支持的根文件系统分区大小 < 2020 MiB,持久化分区 < 16GiB 。 ++ * update.img: 用于升级的根文件系统分区镜像 ++ ++### KubeOS 物理机安装所需镜像及文件制作 ++ ++#### 注意事项 ++ ++* 如使用 docker 镜像制作请先拉取相应镜像或者先制作 docker 镜像,并保证 docker 镜像的安全性 ++* 制作出来的容器 OS 物理安装所需的镜像目前只能用于 CPU 架构为 x86 和 AArch64 的物理机安装 ++* Global.cfg配置中指定的ip为安装时使用的临时ip,请在系统安装启动后请参考《openEuler 22.09 管理员指南-配置网络》进行网络配置 ++* 不支持多个磁盘都安装KubeOS,可能会造成启动失败或挂载紊乱 ++* 容器OS 目前不支持 x86 架构的物理机使用 legacy 启动模式启动 ++* 使用默认rpmlist进行镜像制作时所需磁盘空间至少为5G,如自已定义 rpmlist 可能会超过5G ++ ++#### 使用示例 ++ ++* 首先需要修改```00bootup/Global.cfg```的配置,对相关参数进行配置,参数均为必填,ip目前仅支持ipv4,配置示例如下 ++ ++ ```shell ++ # rootfs file name ++ rootfs_name=kubeos.tar ++ # select the target disk to install kubeOS ++ disk=/dev/sda ++ # pxe server ip address where stores the rootfs on the http server ++ server_ip=192.168.1.50 ++ # target machine temporary ip ++ local_ip=192.168.1.100 ++ # target machine temporary route ++ route_ip=192.168.1.1 ++ # target machine temporary netmask ++ netmask=255.255.255.0 ++ # target machine netDevice name ++ net_name=eth0 ++ ``` ++ ++* 使用 repo 源制作 ++ * 如需进行DNS配置,请在```scripts```目录下自定义```resolv.conf```文件 ++ ++ ```shell ++ cd /opt/kubeOS/scripts ++ touch resolv.conf ++ vim resolv.conf ++ ``` ++ ++ * KubeOS物理机安装所需镜像制作 ++ ++ ```shell ++ cd /opt/kubeOS/scripts ++ bash kbimg.sh create pxe-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' ++ ``` ++ ++* 使用 docker 镜像制作 ++ ++ ``` shell ++ cd /opt/kubeOS/scripts ++ bash kbimg.sh create pxe-image -d your_imageRepository/imageName:version ++ ``` ++ ++* 结果说明 ++ * initramfs.img: 用于pxe启动用的 initramfs 镜像 ++ * kubeos.tar: pxe安装所用的 OS +diff --git "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" "b/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" +deleted file mode 100644 +index d54cc837..00000000 +--- "a/docs/user_guide/\345\256\271\345\231\250OS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274.md" ++++ /dev/null +@@ -1,485 +0,0 @@ +-# 容器OS镜像制作指导 +- +-## 简介 +- +-kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制作KubeOS 容器,虚拟机和物理机镜像 +- +-## 命令介绍 +- +-### 命令格式 +- +-**bash kbimg.sh** \[ --help | -h \] create \[ COMMANDS \] \[ OPTIONS \] +- +-### 参数说明 +- +-* COMMANDS +- +- | 参数 | 描述 | +- |------------------------------| ---------------------------------------------- | +- | upgrade-image | 生成用于安装和升级的OCI镜像格式的 KubeOS 镜像 | +- | vm-image | 生成用于部署和升级的虚拟机镜像 | +- | pxe-image | 生成物理机安装所需的镜像及文件 | +- +-* OPTIONS +- +- | 参数 | 描述 | +- | ------------ | ------------------------------------------------------------ | +- | -p | repo 文件的路径,repo 文件中配置制作镜像所需要的 yum 源 | +- | -v | 制作出来的KubeOS镜像的版本 | +- | -b | os-agent二进制的路径 | +- | -e | KubeOS 镜像 root 用户密码,加密后的带盐值的密码,可以用 openssl,kiwi 命令生成 | +- | -d | 生成或者使用的 docke r镜像 | +- | -l | 如果指定参数,则镜像为legacy引导,不指定默认是UEFI引导 | +- | -h --help | 查看帮助信息 | +- +-## 使用说明 +- +-### 注意事项 +- +-* kbimg.sh 执行需要 root 权限 +-* 当前仅支持 x86和 AArch64 架构使用 +-* 容器 OS 镜像制作工具的 rpm 包源为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库 +- +-### KubeOS OCI 镜像制作 +- +-#### 注意事项 +- +-* 制作的 OCI 镜像仅用于后续的虚拟机/物理机镜像制作或升级使用,不支持启动容器 +-* 使用默认 rpmlist 进行容器OS镜像制作时所需磁盘空间至少为6G,如自已定义 rpmlist 可能会超过6G +- +-#### 使用示例 +- +-* 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件 +- +-```shell +- cd /opt/kubeOS/scripts +- touch resolv.conf +- vim resolv.conf +-``` +- +-* 制作KubeOS容器镜像 +- +-``` shell +-cd /opt/kubeOS/scripts +-bash kbimg.sh create upgrade-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' -d your_imageRepository/imageName:version +-``` +- +-* 制作完成后查看制作出来的KubeOS容器镜像 +- +-``` shell +-docker images +-``` +- +-### KubeOS 虚拟机镜像制作 +- +-#### 注意事项 +- +-* 如使用 docker 镜像制作请先拉取相应镜像或者先制作docker镜像,并保证 docker 镜像的安全性 +-* 制作出来的容器 OS 虚拟机镜像目前只能用于 CPU 架构为 x86 和 AArch64 的虚拟机 +-* 容器 OS 目前不支持 x86 架构的虚拟机使用 legacy 启动模式启动 +-* 使用默认rpmlist进行容器OS镜像制作时所需磁盘空间至少为25G,如自已定义rpmlist可能会超过25G +- +-#### 使用示例 +- +-* 使用repo源制作 +- * 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件 +- +- ```shell +- cd /opt/kubeOS/scripts +- touch resolv.conf +- vim resolv.conf +- ``` +- +- * KubeOS虚拟机镜像制作 +- +- ``` shell +- cd /opt/kubeOS/scripts +- bash kbimg.sh create vm-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' +- ``` +- +-* 使用docker镜像制作 +- +- ``` shell +- cd /opt/kubeOS/scripts +- bash kbimg.sh create vm-image -d your_imageRepository/imageName:version +- ``` +- +-* 结果说明 +- 容器 OS 镜像制作完成后,会在 /opt/kubeOS/scripts 目录下生成: +- * system.qcow2: qcow2 格式的系统镜像,大小默认为 20GiB,支持的根文件系统分区大小 < 2020 MiB,持久化分区 < 16GiB 。 +- * update.img: 用于升级的根文件系统分区镜像 +- +-### KubeOS 物理机安装所需镜像及文件制作 +- +-#### 注意事项 +- +-* 如使用 docker 镜像制作请先拉取相应镜像或者先制作 docker 镜像,并保证 docker 镜像的安全性 +-* 制作出来的容器 OS 物理安装所需的镜像目前只能用于 CPU 架构为 x86 和 AArch64 的物理机安装 +-* Global.cfg配置中指定的ip为安装时使用的临时ip,请在系统安装启动后请参考《openEuler 22.09 管理员指南-配置网络》进行网络配置 +-* 不支持多个磁盘都安装KubeOS,可能会造成启动失败或挂载紊乱 +-* 容器OS 目前不支持 x86 架构的物理机使用 legacy 启动模式启动 +-* 使用默认rpmlist进行镜像制作时所需磁盘空间至少为5G,如自已定义 rpmlist 可能会超过5G +- +-#### 使用示例 +- +-* 首先需要修改```00bootup/Global.cfg```的配置,对相关参数进行配置,参数均为必填,ip目前仅支持ipv4,配置示例如下 +- +- ```shell +- # rootfs file name +- rootfs_name=kubeos.tar +- # select the target disk to install kubeOS +- disk=/dev/sda +- # pxe server ip address where stores the rootfs on the http server +- server_ip=192.168.1.50 +- # target machine temporary ip +- local_ip=192.168.1.100 +- # target machine temporary route +- route_ip=192.168.1.1 +- # target machine temporary netmask +- netmask=255.255.255.0 +- # target machine netDevice name +- net_name=eth0 +- ``` +- +-* 使用 repo 源制作 +- * 如需进行DNS配置,请在```scripts```目录下自定义```resolv.conf```文件 +- +- ```shell +- cd /opt/kubeOS/scripts +- touch resolv.conf +- vim resolv.conf +- ``` +- +- * KubeOS物理机安装所需镜像制作 +- +- ```shell +- cd /opt/kubeOS/scripts +- bash kbimg.sh create pxe-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' +- ``` +- +-* 使用 docker 镜像制作 +- +- ``` shell +- cd /opt/kubeOS/scripts +- bash kbimg.sh create pxe-image -d your_imageRepository/imageName:version +- ``` +- +-* 结果说明 +- * initramfs.img: 用于pxe启动用的 initramfs 镜像 +- * kubeos.tar: pxe安装所用的 OS +- +- +-# KubeOS-Rust 镜像制作说明 +- +-## 简介 +- +-KubeOS 虚拟机镜像制作的 Rust 二进制版本 +- +-## 命令介绍 +- +-### 命令格式 +- +-**.../kbimg** \[ --config | -c \] \ +- +-## 配置文件说明 +- +-* from_repo: 从 repo 创建 OCI 镜像、虚拟机镜像或物理机镜像 +- +- | 参数 | 描述 | +- | --- | --- | +- | agent_path | os-agent 二进制的路径 | +- | image_type | upgrade: 用于安装和升级的 OCI 镜像格式的 KubeOS 镜像; vm-repo: 用于部署和升级的虚拟机镜像; pxe-repo: 物理机安装所需的镜像及文件 | +- | legacy_bios | 镜像为 legacy 引导或 UEFI 引导 | +- | repo_path | repo 文件的路径,repo 文件中配置制作镜像所需要的 yum 源 | +- | root_passwd | KubeOS 镜像 root 用户密码,加密后的带盐值的密码,可以用 openssl、kiwi 命令生成 | +- | version | 制作出来的 KubeOS 镜像的版本 | +- | rpmlist | 镜像所需的 rpm 包 | +- | docker_img | 生成或者使用的 docker 镜像 | +- +-* from_docker: 从 docker 镜像创建虚拟机镜像或物理机镜像 +- +- | 参数 | 描述 | +- | --- | --- | +- | docker_img | 生成或者使用的 docker 镜像 | +- | image_type | vm-docker: 用于部署和升级的虚拟机镜像; pxe-docker: 物理机安装所需的镜像及文件 | +- +-* admin_container: +- +- | 参数 | 描述 | +- | --- | --- | +- | dockerfile | dockerfile 路径 | +- | docker_img | 生成或者使用的 docker 镜像 | +- +-* [OPTIONAL] users: 添加用户 +- +- | 参数 | 描述 | +- | --- | --- | +- | groups | [OPTIONAL] 用户组 (第一个为主组,其他为附加组) | +- | name | 用户名 | +- | passwd | 密码 | +- | sudo | [OPTIONAL] 用户是否具有 sudo 权限 | +- +-* [OPTIONAL] copy_files: 拷贝文件到指定目录 +- +- | 参数 | 描述 | +- | --- | --- | +- | dst | 目标目录 | +- | src | 源文件路径 | +- +-* [OPTIONAL] grub: grub配置 +- +- | 参数 | 描述 | +- | --- | --- | +- | passwd | [OPTIONAL] grub 密码 | +- +-* [OPTIONAL] systemd_service: 新增 systemd 服务 +- +- | 参数 | 描述 | +- | --- | --- | +- | name | systemd 服务名 | +- +-* [OPTIONAL] chroot_script: 自定义 chroot 脚本 +- +- | 参数 | 描述 | +- | --- | --- | +- | path | 脚本路径 | +- +-* [OPTIONAL] disk_partition: 自定义分区大小和镜像大小 +- +- | 参数 | 描述 | +- | --- | --- | +- | first | 引导分区大小 | +- | second | ROOT-A 分区大小 | +- | third | ROOT-B 分区大小 | +- | img_size | 镜像大小 | +- +-* [OPTIONAL] persist_mkdir: persist 分区新建目录 +- +- | 参数 | 描述 | +- | --- | --- | +- | name | 目录名 | +- +-## 使用说明 +- +-#### 注意事项 +- +-* 新增 systemd 服务需要将对应的 .service 文件或 .mount 文件拷贝至镜像```/usr/lib/systemd/system```目录 +- +- ```toml +- [[copy_files]] +- dst = "/usr/lib/systemd/system" +- src = ".../containerd.service" +- +- [systemd_service] +- name = ["containerd"] +- ``` +- +- * 如需挂载数据盘,请先自定义```persist-data.mount```文件,并启用```copy_files```和```systemd_service```字段设置启动时挂载,启用```persist_mkdir```字段创建挂载点 +- * .mount文件名由挂载点路径生成,将斜杠替换为连字符 +- * 请先在磁盘映像文件上创建ext4文件系统 +- +- ``` +- # persist-data.mount +- [Unit] +- Description=Mount Disk +- Documentation=man:systemd.mount(5) +- +- [Mount] +- What=/dev/vdb +- Where=/persist/data +- Type=ext4 +- Options=defaults,noatime +- +- [Install] +- WantedBy=local-fs.target +- ``` +- +- ```toml +- [[copy_files]] +- dst = "/usr/lib/systemd/system" +- src = ".../persist-data.mount" +- +- [systemd_service] +- name = ["persist-data.mount"] +- +- [persist_mkdir] +- name = ["data"] +- ``` +- +- * 如需配置逻辑卷,请先自定义```volume.service```文件,并启用```copy_files```和```systemd_service```设置启动时配置逻辑卷,启用```persist_mkdir```字段创建挂载点 +- +- ``` +- # volume.service +- [Unit] +- Description=Mount Logical Volume +- After=local-fs.target +- +- [Service] +- Type=oneshot +- RemainAfterExit=yes +- ExecStart=pvcreate /dev/vdb +- ExecStart=pvcreate /dev/vdc +- ExecStart=vgcreate my_vg /dev/vdb /dev/vdc +- ExecStart=lvcreate -L 15G -n my_lv my_vg +- ExecStart=mkfs.ext4 /dev/my_vg/my_lv +- ExecStart=mount /dev/my_vg/my_lv /persist/lv_data +- +- [Install] +- WantedBy=local-fs.target +- ``` +- +- ```toml +- [[copy_files]] +- dst = "/usr/lib/systemd/system" +- src = ".../volume.service" +- +- [systemd_service] +- name = ["volume"] +- +- [persist_mkdir] +- name = ["lv_data"] +- ``` +- +-## 使用示例 +- +-### KubeOS OCI 镜像制作 +- +-* 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用```copy_files```字段将配置文件拷贝到```/etc```目录 +- +- ```shell +- touch \/resolv.conf +- vim \resolv.conf +- ``` +- +- ```toml +- [[copy_files]] +- dst = "/etc" +- src = "" +- ``` +- +-* 制作KubeOS容器镜像 +- +- ```toml +- [from_repo] +- agent_path = "/bin/os-agent" +- image_type = "upgrade" +- legacy_bios = false +- repo_path = "xxx.repo" +- root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" +- version = "v1" +- docker_img = "your_imageRepository/imageName:version" +- rpmlist = [ +- # your rpms +- ] +- ``` +- +-* 制作完成后查看制作出来的KubeOS容器镜像 +- ``` shell +- docker images +- ``` +- +-### KubeOS 虚拟机镜像制作 +- +-* 使用repo源制作 +- +- * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用**copy_files**字段将配置文件拷贝到```/etc```目录 +- +- ```shell +- touch \/resolv.conf +- vim \resolv.conf +- ``` +- +- ```toml +- [[copy_files]] +- dst = "/etc" +- src = "" +- ``` +- +- * KubeOS虚拟机镜像制作 +- +- ```toml +- [from_repo] +- agent_path = "/bin/os-agent" +- image_type = "vm-repo" +- legacy_bios = false +- repo_path = "xxx.repo" +- root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" +- version = "v1" +- rpmlist = [ +- # your rpms +- ] +- ``` +- +-* 使用docker镜像制作 +- +- ```toml +- [from_dockerimg] +- docker_img = "your_imageRepository/imageName:version" +- image_type = "vm-docker" +- ``` +- +-* 结果说明 +- 容器 OS 镜像制作完成后,会在 ./scripts-auto 目录下生成 +- * system.qcow2: qcow2 格式的系统镜像,大小默认为 20GiB,支持的根文件系统分区大小 < 2020 MiB,持久化分区 < 16GiB 。 +- * update.img: 用于升级的根文件系统分区镜像 +- +-### KubeOS 物理机安装所需镜像及文件制作 +- +-* 首先需要修改```kbimg.toml```中```pxe_config```的配置,对相关参数进行配置,参数均为必填,ip目前仅支持ipv4,配置示例如下 +- +- ```toml +- [pxe_config] +- # rootfs file name +- rootfs_name = "kubeos.tar" +- # select the target disk to install kubeOS +- disk = "/dev/sda" +- # pxe server ip address where stores the rootfs on the http server +- server_ip = "192.168.1.50" +- # target machine ip +- local_ip = "192.168.1.100" +- # target machine route +- route_ip = "192.168.1.1" +- # target machine netmask +- netmask = "255.255.255.0" +- # target machine netDevice name +- net_name = "eth0" +- ``` +- +-* 使用 repo 源制作 +- * 如需进行DNS配置,请先自定义```resolv.conf```文件,并启用```copy_files```字段将配置文件拷贝到```/etc```目录 +- +- ```shell +- touch \/resolv.conf +- vim \resolv.conf +- ``` +- +- ```toml +- [[copy_files]] +- dst = "/etc" +- src = "" +- ``` +- +- * KubeOS物理机安装所需镜像制作 +- ```toml +- [from_repo] +- agent_path = "/bin/os-agent" +- image_type = "pxe-repo" +- legacy_bios = true +- repo_path = "xxx.repo" +- root_passwd = "$1$xyz$RdLyKTL32WEvK3lg8CXID0" +- version = "v1" +- rpmlist = [ +- # your rpms +- ] +- ``` +- +-* 使用 docker 镜像制作 +- ```toml +- [from_dockerimg] +- docker_img = "your_imageRepository/imageName:version" +- image_type = "vm-docker" +- ``` +- +-* 结果说明 +- * initramfs.img: 用于pxe启动用的 initramfs 镜像 +- * kubeos.tar: pxe安装所用的 OS +-- +2.39.5 (Apple Git-154) + diff --git a/0003-fix-os-agent-use-findmnt-to-find-out-which-device-mo.patch b/0003-fix-os-agent-use-findmnt-to-find-out-which-device-mo.patch new file mode 100644 index 0000000000000000000000000000000000000000..f0b67389fd4331570875b6618d04a593d0eeaf7f --- /dev/null +++ b/0003-fix-os-agent-use-findmnt-to-find-out-which-device-mo.patch @@ -0,0 +1,191 @@ +From 59de6f644def5555c41e2ef14317e9178c40259f Mon Sep 17 00:00:00 2001 +From: Yuhang Wei +Date: Wed, 27 Nov 2024 18:34:14 +0000 +Subject: [PATCH 03/11] fix(os-agent): use findmnt to find out which device + mounted on / + +use "findmnt -no SOURCE --mountpoint /" to get the device name mounted on / +use "lsblk -blno FSTYPE,SIZE" to get the fstype and partition size +This patch fixes the problem if there are multiple mountpoints on a device + +Signed-off-by: Yuhang Wei +--- + KubeOS-Rust/manager/src/sys_mgmt/config.rs | 21 ++---- + KubeOS-Rust/manager/src/utils/partition.rs | 86 +++++++++------------- + 2 files changed, 41 insertions(+), 66 deletions(-) + +diff --git a/KubeOS-Rust/manager/src/sys_mgmt/config.rs b/KubeOS-Rust/manager/src/sys_mgmt/config.rs +index 8e42fa18..a491a429 100644 +--- a/KubeOS-Rust/manager/src/sys_mgmt/config.rs ++++ b/KubeOS-Rust/manager/src/sys_mgmt/config.rs +@@ -826,13 +826,10 @@ mod tests { + let mut executor = MockCommandExec::new(); + + // the output shows that current root menuentry is A +- let command_output1 = r#"vda 23622320128 +-vda1 /boot/efi vfat 61865984 BOOT +-vda2 / ext4 3145728000 ROOT-A +-vda3 ext4 2621440000 ROOT-B +-vda4 /persist ext4 17791188992 PERSIST +-"#; +- executor.expect_run_command_with_output().times(1).returning(|_, _| Ok(command_output1.to_string())); ++ let findmnt_output1 = "/dev/vda2"; ++ let lsblk_output1 = "ext4 3145728000\n"; ++ executor.expect_run_command_with_output().times(1).returning(|_, _| Ok(findmnt_output1.to_string())); ++ executor.expect_run_command_with_output().times(1).returning(|_, _| Ok(lsblk_output1.to_string())); + + let result = grub_cmdline.get_config_partition(executor).unwrap(); + // it should return false because the current root menuentry is A and we want to configure current partition +@@ -840,14 +837,8 @@ vda4 /persist ext4 17791188992 PERSIST + + let mut executor = MockCommandExec::new(); + +- // the output shows that current root menuentry is A +- let command_output1 = r#"vda 23622320128 +-vda1 /boot/efi vfat 61865984 BOOT +-vda2 / ext4 3145728000 ROOT-A +-vda3 ext4 2621440000 ROOT-B +-vda4 /persist ext4 17791188992 PERSIST +-"#; +- executor.expect_run_command_with_output().times(1).returning(|_, _| Ok(command_output1.to_string())); ++ executor.expect_run_command_with_output().times(1).returning(|_, _| Ok(findmnt_output1.to_string())); ++ executor.expect_run_command_with_output().times(1).returning(|_, _| Ok(lsblk_output1.to_string())); + grub_cmdline.is_cur_partition = false; + let result = grub_cmdline.get_config_partition(executor).unwrap(); + // it should return true because the current root menuentry is A and we want to configure next partition +diff --git a/KubeOS-Rust/manager/src/utils/partition.rs b/KubeOS-Rust/manager/src/utils/partition.rs +index 4941ee9d..b2c095c6 100644 +--- a/KubeOS-Rust/manager/src/utils/partition.rs ++++ b/KubeOS-Rust/manager/src/utils/partition.rs +@@ -25,43 +25,33 @@ pub struct PartitionInfo { + + /// get_partition_info returns the current partition info and the next partition info. + pub fn get_partition_info(executor: &T) -> Result<(PartitionInfo, PartitionInfo), anyhow::Error> { +- let lsblk = executor.run_command_with_output("lsblk", &["-blno", "NAME,MOUNTPOINT,FSTYPE,SIZE,LABEL"])?; + let mut cur_partition = PartitionInfo::default(); + let mut next_partition = PartitionInfo::default(); +- let mut found_boot = 0; +- trace!("get_partition_info lsblk command output:\n{}", lsblk); +- for line in lsblk.lines() { +- let res: Vec<&str> = line.split_whitespace().collect(); +- if res.len() == 5 && res[4] == "BOOT" { +- trace!("Found boot partition:\n{:?}", res); +- found_boot = 2; +- continue; +- } +- if found_boot > 0 { +- trace!("Handling two root partitions:\n{:?}", res); +- if res[1] == "/" { +- // current partition +- cur_partition.device = format!("/dev/{}", res[0]).to_string(); +- cur_partition.fs_type = res[2].to_string(); +- cur_partition.size = res[3] +- .parse() +- .with_context(|| format!("Failed to parse current partition size to i64: \"{}\"", res[3]))?; +- cur_partition.menuentry = if res[0].contains("2") { String::from("A") } else { String::from("B") }; +- } else { +- // next partition +- next_partition.device = format!("/dev/{}", res[0]).to_string(); +- next_partition.fs_type = res[1].to_string(); +- next_partition.size = res[2] +- .parse() +- .with_context(|| format!("Failed to parse next partition size to i64: \"{}\"", res[2]))?; +- next_partition.menuentry = if res[0].contains("2") { String::from("A") } else { String::from("B") }; +- } +- found_boot -= 1; +- } ++ cur_partition.device = executor.run_command_with_output("findmnt", &["-no", "SOURCE", "--mountpoint", "/"])?; ++ trace!("{} is mounted on /", cur_partition.device); ++ if cur_partition.device.contains('2') { ++ cur_partition.menuentry = String::from("A"); ++ next_partition.menuentry = String::from("B"); ++ next_partition.device = cur_partition.device.replace("2", "3"); ++ } else if cur_partition.device.contains('3') { ++ cur_partition.menuentry = String::from("B"); ++ next_partition.menuentry = String::from("A"); ++ next_partition.device = cur_partition.device.replace("3", "2"); ++ } else { ++ bail!("Failed to get partition info, / is not mounted on the second or the third partition"); + } +- if cur_partition.menuentry.is_empty() || next_partition.menuentry.is_empty() { +- bail!("Failed to get partition info, lsblk output: {}", lsblk); ++ let lsblk = executor.run_command_with_output("lsblk", &["-blno", "FSTYPE,SIZE", &cur_partition.device])?; ++ trace!("get_partition_info lsblk command output:\n{}", lsblk); ++ let elements: Vec<&str> = lsblk.split_whitespace().collect(); ++ if elements.len() != 2 { ++ bail!("Failed to get partition info of FSTYPE and SIZE, lsblk output: {}", lsblk); + } ++ cur_partition.fs_type = elements[0].to_string(); ++ next_partition.fs_type = elements[0].to_string(); ++ cur_partition.size = elements[1] ++ .parse() ++ .with_context(|| format!("Failed to parse current partition size to i64: \"{}\"", elements[1]))?; ++ next_partition.size = cur_partition.size; + Ok((cur_partition, next_partition)) + } + +@@ -94,14 +84,11 @@ mod tests { + #[test] + fn test_get_partition_info() { + init(); +- let command_output1 = r#"vda 23622320128 +-vda1 /boot/efi vfat 61865984 BOOT +-vda2 / ext4 3145728000 ROOT-A +-vda3 ext4 2621440000 ROOT-B +-vda4 /persist ext4 17791188992 PERSIST +-"#; ++ let findmnt_output1 = "/dev/vda2"; ++ let lsblk_output1 = "ext4 3145728000\n"; + let mut mock = MockCommandExec::new(); +- mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(command_output1.to_string())); ++ mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(findmnt_output1.to_string())); ++ mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(lsblk_output1.to_string())); + let res = get_partition_info(&mock).unwrap(); + let expect_res = ( + PartitionInfo { +@@ -114,25 +101,22 @@ vda4 /persist ext4 17791188992 PERSIST + device: "/dev/vda3".to_string(), + menuentry: "B".to_string(), + fs_type: "ext4".to_string(), +- size: 2621440000, ++ size: 3145728000, + }, + ); + assert_eq!(res, expect_res); + +- let command_output2 = r#"vda 23622320128 +-vda1 /boot/efi vfat 61865984 BOOT +-vda2 ext4 3145728000 ROOT-A +-vda3 / ext4 2621440000 ROOT-B +-vda4 /persist ext4 17791188992 PERSIST +-"#; +- mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(command_output2.to_string())); ++ let findmnt_output2 = "/dev/vda3"; ++ let lsblk_output2 = "ext4 3145728000\n"; ++ mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(findmnt_output2.to_string())); ++ mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(lsblk_output2.to_string())); + let res = get_partition_info(&mock).unwrap(); + let expect_res = ( + PartitionInfo { + device: "/dev/vda3".to_string(), + menuentry: "B".to_string(), + fs_type: "ext4".to_string(), +- size: 2621440000, ++ size: 3145728000, + }, + PartitionInfo { + device: "/dev/vda2".to_string(), +@@ -148,8 +132,8 @@ vda4 /persist ext4 17791188992 PERSIST + let res = get_partition_info(&mock); + assert!(res.is_err()); + +- let command_output4 = "sda4 / ext4 13000245248"; +- mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(command_output4.to_string())); ++ let findmnt_output3 = "/dev/vda4"; ++ mock.expect_run_command_with_output().times(1).returning(|_, _| Ok(findmnt_output3.to_string())); + let res = get_partition_info(&mock); + assert!(res.is_err()); + } +-- +2.39.5 (Apple Git-154) + diff --git a/0004-style-format-code.patch b/0004-style-format-code.patch new file mode 100644 index 0000000000000000000000000000000000000000..84294339fed32ec37210cd5080da5c83e63201c4 --- /dev/null +++ b/0004-style-format-code.patch @@ -0,0 +1,70 @@ +From 9cbf66603c5459be84467ba9de1f9248d082cbdf Mon Sep 17 00:00:00 2001 +From: Yuhang Wei +Date: Wed, 27 Nov 2024 21:30:17 +0000 +Subject: [PATCH 04/11] style: format code + +Signed-off-by: Yuhang Wei +--- + KubeOS-Rust/manager/src/sys_mgmt/config.rs | 2 +- + KubeOS-Rust/manager/src/sys_mgmt/values.rs | 12 ++++++------ + KubeOS-Rust/proxy/src/controller/apiserver_mock.rs | 2 +- + 3 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/KubeOS-Rust/manager/src/sys_mgmt/config.rs b/KubeOS-Rust/manager/src/sys_mgmt/config.rs +index a491a429..787d5bbd 100644 +--- a/KubeOS-Rust/manager/src/sys_mgmt/config.rs ++++ b/KubeOS-Rust/manager/src/sys_mgmt/config.rs +@@ -59,7 +59,7 @@ lazy_static! { + ); + config_map.insert( + values::PAM_LIMTS.to_string(), +- Box::new(PamLimits{config_path: values::DEFAULT_PAM_LIMITS_PATH.to_string()}) ++ Box::new(PamLimits { config_path: values::DEFAULT_PAM_LIMITS_PATH.to_string() }) + as Box, + ); + config_map +diff --git a/KubeOS-Rust/manager/src/sys_mgmt/values.rs b/KubeOS-Rust/manager/src/sys_mgmt/values.rs +index 3236caf3..e1addfa4 100644 +--- a/KubeOS-Rust/manager/src/sys_mgmt/values.rs ++++ b/KubeOS-Rust/manager/src/sys_mgmt/values.rs +@@ -14,17 +14,17 @@ pub const KERNEL_SYSCTL: &str = "kernel.sysctl"; + pub const KERNEL_SYSCTL_PERSIST: &str = "kernel.sysctl.persist"; + pub const GRUB_CMDLINE_CURRENT: &str = "grub.cmdline.current"; + pub const GRUB_CMDLINE_NEXT: &str = "grub.cmdline.next"; +-pub const KUBERNETES_KUBELET:&str = "kubernetes.kubelet"; +-pub const CONTAINER_CONTAINERD:&str = "container.containerd"; +-pub const PAM_LIMTS:&str = "pam.limits"; ++pub const KUBERNETES_KUBELET: &str = "kubernetes.kubelet"; ++pub const CONTAINER_CONTAINERD: &str = "container.containerd"; ++pub const PAM_LIMTS: &str = "pam.limits"; + + pub const DEFAULT_PROC_PATH: &str = "/proc/sys/"; + pub const DEFAULT_KERNEL_CONFIG_PATH: &str = "/etc/sysctl.conf"; + pub const DEFAULT_GRUB_CFG_PATH: &str = "/boot/efi/EFI/openEuler/grub.cfg"; + pub const DEFAULT_GRUBENV_PATH: &str = "/boot/efi/EFI/openEuler/grubenv"; +-pub const DEFAULT_KUBELET_CONFIG_PATH: &str = "/var/lib/kubelet/config.yaml"; +-pub const DEFAULT_CONTAINERD_CONFIG_PATH: &str = "/etc/containerd/config.toml"; +-pub const DEFAULT_PAM_LIMITS_PATH:&str = "/etc/security/limits.conf"; ++pub const DEFAULT_KUBELET_CONFIG_PATH: &str = "/var/lib/kubelet/config.yaml"; ++pub const DEFAULT_CONTAINERD_CONFIG_PATH: &str = "/etc/containerd/config.toml"; ++pub const DEFAULT_PAM_LIMITS_PATH: &str = "/etc/security/limits.conf"; + + pub const PERSIST_DIR: &str = "/persist"; + pub const ROOTFS_ARCHIVE: &str = "os.tar"; +diff --git a/KubeOS-Rust/proxy/src/controller/apiserver_mock.rs b/KubeOS-Rust/proxy/src/controller/apiserver_mock.rs +index a96043b6..45949600 100644 +--- a/KubeOS-Rust/proxy/src/controller/apiserver_mock.rs ++++ b/KubeOS-Rust/proxy/src/controller/apiserver_mock.rs +@@ -28,8 +28,8 @@ use kube::{ + core::{ListMeta, ObjectList}, + Client as KubeClient, Resource, ResourceExt, + }; +-use serde_json::json; + use mockall::mock; ++use serde_json::json; + + use self::mock_error::Error; + use super::{ +-- +2.39.5 (Apple Git-154) + diff --git a/0005-docs-add-description-of-the-configuration.patch b/0005-docs-add-description-of-the-configuration.patch new file mode 100644 index 0000000000000000000000000000000000000000..cd50d5dc4467ee5c298dd6356a34dd64e9921c38 --- /dev/null +++ b/0005-docs-add-description-of-the-configuration.patch @@ -0,0 +1,110 @@ +From c53a851af1460b037c1dd22e434318963717eabc Mon Sep 17 00:00:00 2001 +From: liyuanr +Date: Wed, 27 Nov 2024 15:46:31 +0800 +Subject: [PATCH 05/11] docs: add description of the configuration + +add description of the configuration of kubelet, +containerd and pam limts + +Signed-off-by: liyuanr +--- + .../figures/kubeos-architecture_2024.png | Bin 0 -> 241051 bytes + .../config/crd/upgrade.openeuler.org_os.yaml | 2 +- + docs/quick-start.md | 65 ++++++++++++++++++ + 3 files changed, 66 insertions(+), 1 deletion(-) + create mode 100644 docs/design/figures/kubeos-architecture_2024.png + +diff --git a/docs/design/figures/kubeos-architecture_2024.png b/docs/design/figures/kubeos-architecture_2024.png +new file mode 100644 +index 00000000..1862a1c4 +Binary files /dev/null and b/docs/design/figures/kubeos-architecture_2024.png differ +diff --git a/docs/example/config/crd/upgrade.openeuler.org_os.yaml b/docs/example/config/crd/upgrade.openeuler.org_os.yaml +index 97d0d27b..0ec657b2 100644 +--- a/docs/example/config/crd/upgrade.openeuler.org_os.yaml ++++ b/docs/example/config/crd/upgrade.openeuler.org_os.yaml +@@ -147,7 +147,7 @@ spec: + operation: + type: string + value: +- type: string ++ x-kubernetes-preserve-unknown-fields: true + type: object + type: array + model: +diff --git a/docs/quick-start.md b/docs/quick-start.md +index 6c5f47a2..5730c164 100644 +--- a/docs/quick-start.md ++++ b/docs/quick-start.md +@@ -767,3 +767,68 @@ hostshell + operation: delete + - key: crash_kexec_post_notifiers + ``` ++### kubelet配置 ++* kuberntes.kubelet: 配置节点kubelet的配置文件中的参数,参数说明和约束如下: ++ * 仅支持```KubeletConfiguration```中的配置参数。 ++ * 节点kubelet配置文件需要为yaml格式的文件。 ++ * 如不指定configpath,默认配置文件路径为```/var/lib/kubelet/config.yaml```,并且需要注意的是配置文件的路径需要与kubelet启动时的```-- config```参数指定的路径一致才能生效。 ++ * 如配置存在嵌套,则通过```'.'```连接嵌套的key值,例如如果修改如下yaml示例中```cacheAuthorizedTTL```参数为1s。 ++ ``` ++ authorization: ++ mode: Webhook ++ webhook: ++ cacheAuthorizedTTL: 0s ++ ``` ++ 参数配置示例如下: ++ ``` ++ configs: ++ - model: kuberntes.kubelet ++ configpath: /etc/test.yaml ++ contents: ++ - key: authorization.webhook.cacheAuthorizedTTL ++ value: 1s ++ ``` ++ * kubernetes.kubelet进行删除时,不对value与配置文件中的值进行比较 ++### containerd配置 ++* container.containerd: 配置节点上containerd的配置文件中的参数,参数说明和约束如下: ++ * containerd需要配置文件为toml格式,所以key为toml中该参数的表头.键名,例如希望修改如下toml示例中```no_shim```为true。 ++ ``` ++ [plugins."io.containerd.runtime.v1.linux"] ++ no_shim=false ++ runtime="runc" ++ runtime_root=" ++ ``` ++ 参数配置示例如下: ++ ``` ++ configs: ++ - model: container.containerd ++ configpath: /etc/test.toml ++ contents: ++ - key: plugins."io.containerd.runtime.v1.linux".no_shim ++ value: true ++ ``` ++ * toml使用```"."```分割键,os-agent识别时与toml保持一致,所以当键名中包含```"."```时,该键名需要使用```""```,例如上例中的```"io.containerd.runtime.v1.linux"```为一个键 ++ * 如不指定configpath,默认配置文件路径为```/etc/containerd/config.toml``` ++ * container.conatainerd配置的key和value均不能为空 ++ * container.containerd进行删除时,不对value与配置文件中的值进行比较 ++### Pam Limits配置 ++* pam.limits:配置节点上/etc/security/limits.conf文件 ++ * key为domain值,value的格式需要为type.item.value(limits.conf文件要求每行格式为:\ \ \ \),例如: ++ ``` ++ configs: ++ - model: pam.limits ++ contents: ++ - key: ftp ++ value: soft.core.0 ++ ``` ++ * 更新时,如不需要对type/item/value更新时,可以使用```"_"```,忽略对此参数的更新,但value必须为点隔的三段式,例如: ++ ``` ++ configs: ++ - model: pam.limits ++ contents: ++ - key: ftp ++ value: hard._.1 ++ ``` ++ * pam.limits新增时,value中不允许包含```"_"``` ++ * pam.limits删除时,会对value进行校验,当value与配置文件中的值不同时,删除失败 ++ * pam.limits配置的key和value均不能为空 +\ No newline at end of file +-- +2.39.5 (Apple Git-154) + diff --git a/0006-fix-os-agent-fix-settings-of-kubelet-and-add-log.patch b/0006-fix-os-agent-fix-settings-of-kubelet-and-add-log.patch new file mode 100644 index 0000000000000000000000000000000000000000..3de5128da65fd52b33901dce7cc6fa6c67c38699 --- /dev/null +++ b/0006-fix-os-agent-fix-settings-of-kubelet-and-add-log.patch @@ -0,0 +1,77 @@ +From 4acf9ad93decfcd50e1b10671fdc866e7766ac85 Mon Sep 17 00:00:00 2001 +From: liyuanr +Date: Fri, 29 Nov 2024 16:31:11 +0800 +Subject: [PATCH 06/11] fix(os-agent): fix settings of kubelet and add log + +1.Fix the error where kernel.sysctl value cannot be configured when set to +string +2.Add logs when adding configurations to kubelet and pam.limts +3.Kubelet configuration reports error when reading a file in the wrong +format and unable to convert it to a map + +Signed-off-by: liyuanr +--- + KubeOS-Rust/manager/src/sys_mgmt/config.rs | 22 +++++++++++++++++----- + 1 file changed, 17 insertions(+), 5 deletions(-) + +diff --git a/KubeOS-Rust/manager/src/sys_mgmt/config.rs b/KubeOS-Rust/manager/src/sys_mgmt/config.rs +index 787d5bbd..ebf04d39 100644 +--- a/KubeOS-Rust/manager/src/sys_mgmt/config.rs ++++ b/KubeOS-Rust/manager/src/sys_mgmt/config.rs +@@ -102,13 +102,13 @@ impl Configuration for KernelSysctl { + if key_info.operation == "delete" { + warn!("Failed to delete kernel.sysctl config with key \"{}\"", key); + } else if !key_info_value.is_empty() && key_info.operation.is_empty() { +- fs::write(&proc_path, format!("{}\n", &key_info.value).as_bytes()) ++ fs::write(&proc_path, format!("{}\n", &key_info_value).as_bytes()) + .with_context(|| format!("Failed to write kernel.sysctl with key: \"{}\"", key))?; +- info!("Configured kernel.sysctl {}={}", key, key_info.value); ++ info!("Configured kernel.sysctl {}={}", key, key_info_value); + } else { + warn!( + "Failed to parse kernel.sysctl, key: \"{}\", value: \"{}\", operation: \"{}\"", +- key, key_info.value, key_info.operation ++ key, key_info_value, key_info.operation + ); + } + } +@@ -529,7 +529,18 @@ impl Configuration for KubernetesKubelet { + if value_iter.is_null() { + *value_iter = serde_yaml::Value::Mapping(serde_yaml::Mapping::new()); + } +- let value_mapping = value_iter.as_mapping_mut().unwrap(); ++ let value_mapping = match value_iter.as_mapping_mut() { ++ Some(m) => m, ++ None => { ++ warn!( ++ "Failed to convert yaml value to mapping, maybe read the file in the wrong format, ++ or write wrong value when handle the configuration of key {}", ++ key ++ ); ++ break; ++ }, ++ }; ++ info!("Add configuration \"{}: {}\"", key, key_info.value.clone()); + value_mapping.insert(Value::String(k.to_string()).into(), config_value); + break; + } +@@ -651,7 +662,7 @@ impl Configuration for ContainerContainerd { + config_value = toml::Value::Table(value_tmp); + key_index = key_index - 1; + } +- debug!("Add key is {}, value is {:?}", key_list[i..].join("."), config_value); ++ info!("Add configuration \"{}: {}\"", key, key_info.value.clone()); + value_iter.insert(k.to_string(), config_value); + break; + } +@@ -782,6 +793,7 @@ fn handle_add_key_pam_limits(new_configs: &HashMap) -> Vec +Date: Wed, 27 Nov 2024 16:45:27 +0800 +Subject: [PATCH 07/11] docs: add dm-verity user-guide + +--- + docs/user_guide/dm-verity.md | 187 +++++++++++++++++++++++++++++++++++ + 1 file changed, 187 insertions(+) + create mode 100644 docs/user_guide/dm-verity.md + +diff --git a/docs/user_guide/dm-verity.md b/docs/user_guide/dm-verity.md +new file mode 100644 +index 00000000..224c8650 +--- /dev/null ++++ b/docs/user_guide/dm-verity.md +@@ -0,0 +1,187 @@ ++## dm-verity功能介绍 ++ ++KubeOS基于[dm-verity](https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html)提供对根文件系统rootfs的完整性保护。Dm-verity对目标设备rootfs分成固定大小(4096)的块,每块分别计算hash得到第一层hash。第一层hash按照固定大小的块再次计算hash形成第二层。如此迭代,形成一棵hash树,最终得到roothash。示意如下 ++``` ++0层:rootfs block0 ... blockx ... blockx ..... blockn ++ | | | | | ++1层:对0层计算hash h1.0 ... h1.x ... h1.x ..... h1.n ++ \______________/ \__________________/ \__________/ ++ | | | ++2层:对1层计算hash h2.0 h2.x h2.n ++ \ ............. ............/ ++ ++逐层计算hash \ ....... ..... / ++ \... .../ ++ \ / ++root层 roothash ++ ++``` ++hash树除roothash外的中间节点hash作为元数据验证rootfs的完整性,验证时重新计算roothash,并与存储的初始roothash进行比对,一致则rootfs完整。因此,dm-verity的关键在于保证roothash的完整性。 ++ ++## dm-verity当前实现 ++ ++KubeOS当前基于dm-verity+安全启动实现对rootfs的完整性保护,安全启动用于保护roothash完整性。由于安全启动只支持UEFI模式启动,因此当前只支持UEFI启动的场景,不支持legacy启动场景。 ++ ++安全启动基于密码学签名机制实现信任传递。通过在BIOS中引入可信证书,BIOS验证shim的签名,shim验证grub签名,grub验证kernel签名,签名验证失败则启动失败,由此完成系统启动,保证启动内核完整性。为保护dm-verity的roothash的完整,此处扩展安全启动功能,通过在grub中导入可信公钥,实现grub对initramfs、grub.cfg的签名验证,roothash在制作镜像时写入grub.cfg,系统启动时从grub.cfg获取roothash作为对比基线,借助dm-verity实现对rootfs的完整性校验。制作镜像时,安全启动的根信任证书保存在boot分区EFI目录下,名称为`rsa4BIOS.der`,首次启动时需要将该证书导入UEFI固件中**PK Options**和**DB Options**,参考如下安全启动设置。 ++ ++安全启动需要用户自行生成证书及相关签名密钥,并设置口令保护签名私钥。此处不对口令做复杂性校验,建议包含大小写字母、数字等。主要涉及的口令有以下三个: ++* BIOS签名私钥口令(pesign签名数据库口令):明文口令,用于安全启动中保护签名私钥的安全性。此签名私钥存于镜像制作服务器上,用于对shim、grub进行签名。每次制作镜像需要输入该口令,否则无法签名。 ++* grub配置文件签名私钥口令:明文口令,用于保护grub配置文件签名私钥。grub中导入公钥,对应私钥存于镜像制作服务器上,用于对配置文件grub.cfg签名,签名私钥由该口令保护,每次制作镜像需要输入。 ++* grub shell口令:明文口令,如果在镜像启动时要进入grub shell则需要输入该口令。 ++ ++dm-verity+安全启动采用双boot+root,此时磁盘分区对应如下: ++``` ++ ---------------- ++part1 | boot1 | ++ ---------------- ++part2 | root1 | ---- Grub menuentry 'A' ++ ---------------- ++part3 | hash1 | ++ ---------------- ++part4 | boot2 | ++ ---------------- ++part5 | root2 | ---- Grub menuentry 'B' ++ ---------------- ++part6 | hash2 | ++ ---------------- ++part7 | persist | ++ ---------------- ++``` ++其中boot分区包含启动文件,ROOT分区存放rootfs,hash分区存放hash元数据,用于验证root分区的完整性。 ++ ++当前实现说明如下: ++ ++* dm-verity开启后不支持grub阶段加载mod,因此grub.cfg中`insmod xx`命令删除,使用dm-verity/grub.cfg文件替换 ++* dm-verity+安全启动模式下,grub.cfg文件不支持修改。如需修改需要在镜像制作服务器上修改并重新签名 ++* 当前dm-verity/grub.cfg中,menuentry选项默认设置第一个disk, virtio类型设备:`set root='hd0,gpt2'`, `root=/dev/vda2` or `root=/dev/vda5` ++* 开启dm-verity,用户可以配置`ESP/EFI/openEuler/grubenv`文件,实现部分配置grub环境变量(白名单形式),如启动项(从哪一个root启动) ++* 开启dm-verity,rootfs以只读方式挂载`/dev/mapper/kubeos-root`。当前dm-verity通过veritysetup工具实现,可以通过如下命令查看rootfs完整性状态 ++``` ++veritysetup status kubeos-root # 显示状态(verified)、目标数据设备、hash元数据设备、roothash ++ ++veritysetup verify /dev/vda2 /dev/vda3 roothash --debug # status显示的数据设备、hash设备、roothash,验证成功Command successful ++``` ++* 如果当前rootfs(如root1)验证失败,尝试从另一个rootfs(root2)启动,若均验证失败,则系统启动失败 ++* 安全启动证书基于rsa签名,制作镜像时通过openssl生成自签名证书`rsa4BIOS.der` ++* 安全启动可以通过mokutil工具查看,`mokutil --sb` ++* 镜像制作服务器需要安装如下包 ++``` ++yum install -y pesign nss openssl veritysetup crypto-policies ++``` ++* **密钥管理** 当前第一次开启dm-verity功能,镜像制作服务器会自动生成相关证书和密钥文件,默认位置为`my/path/to/KubeOS/scripts/dm-verity/keys`,密钥均由口令保护。不建议频繁更换密钥、证书文件,否则系统可能无法正常启动(签名验证失败)。密钥、证书生成过程见**附录**。 ++ - 安全启动依赖证书`rsa4BIOS.der`,每次更新需要进入BIOS重新导入证书(导入DB Options),否则系统无法启动,不建议频繁更新此证书。可选地,安全启动可以通过BIOS直接关闭 ++ - roothash完整性验证依赖`grub配置文件签名公钥`,该公钥在镜像制作时导入grub,对应私钥用于grub.cfg签名,为防止系统启动失败,不建议频繁更换。此处验签功能可以通过进入grub-shell(需要上述grub shell 口令)进行关闭,输入`set check_signatures=no`, `configfile (hd0,1 or 4)/EFI/openEuler/grub.cfg`进入系统 ++ ++## 安全启动配置 ++ ++ ++KubeOS支持在**虚拟机**镜像制作时开启dm-verity+安全启动配置。以下介绍以HOST侧操作系统为openEuler系统为例,介绍KubeOS虚机安全启动配置步骤,参考[openEuler虚机安全启动介绍](https://docs.openeuler.org/zh/docs/24.03_LTS/docs/Virtualization/%E7%AE%A1%E7%90%86%E8%99%9A%E6%8B%9F%E6%9C%BA.html)。对于其他操作系统,参考相应安全启动配置(配置文件名称、路径、依赖等有差异)。 ++ ++**xml文件修改** ++ ++虚拟机安全启动依赖于UEFI BIOS的实现,HOST侧需要安装edk2。 以aarch64为例,需安装`yum install -y edk2-aarch64`, edk2 rpm包中的组件安装于/usr/share/edk2/aarch64目录下,包括QEMU_EFI-pflash.raw和vars-template-pflash.raw。虚拟机启动UEFI BIOS部分xml配置如下: ++``` ++ ++ hvm ++ /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw ++ /path/to/QEMU-VARS.fd ++ ++``` ++其中/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw为UEFI BIOS镜像路径。/usr/share/edk2/aarch64/vars-template-pflash.raw为nvram镜像模板路径,/path/to/QEMU-VARS.fd为当前虚拟机nvram镜像文件路径,用于保存UEFI BIOS系统中的环境变量。 ++ ++X86架构略有差异,需安装`yum install edk2-ovmf`,xml示例如下 ++``` ++ ++ hvm ++ /usr/share/edk2/ovmf/OVMF_CODE.fd ++ /path/to/OVMF_VARS.fd ++ ++``` ++ ++**BIOS导入证书文件** ++ ++当前实现中,制作KubeOS镜像时通过openssl生成自签名证书`rsa4BIOS.der`,证书文件存在BOOT分区EFI目录下。 ++虚拟机启动后,点击`F2`进入BIOS界面,配置路径如下 ++``` ++Device Manager ++ -> Secure Boot Configuration ++ -> Secure Boot Mode ++ -> Custom Mode ++ -> Custom Secure Boot Option ++ -> PK Options ++ -> Enroll PK ++ -> Enroll PK Using File ++ -> BOOT / EFI / rsa4BIOS.der ++ -> DB Options ++ -> Enroll Signature ++ -> Enroll Signature Using File ++ -> BOOT / EFI / rsa4BIOS.der ++``` ++证书导入完成点击`F10`保存修改,执行`reset`,完成系统重置。 ++ ++## dm-verity升级&回滚 ++ ++开启dm-verity功能,升级通过`dd`命令将升级镜像导入对应分区。注意事项如下: ++ ++* 升级前后root分区的LABEL相同,均为`ROOT-A` ++* 升级失败回滚 ++ - boot分区故障,无需手动操作,自动尝试另一个boot分区进行引导 ++ - root分区故障,需要手动切换另一个root分区,假如升级到A失败需要回滚到B,则手动选择从B启动,系统会重启2次:第一次手动选取B,第二次无需手动操作,系统自动选取B完成回滚 ++ ++## 附录: 生成密钥/证书 ++ ++KubeOS提供密钥、证书生成脚本支持用户生成自定义密钥、证书文件。当前实现基于RSA密码算法,国密SM算法支持可参考[这里](https://docs.openeuler.org/zh/docs/23.03/docs/ShangMi/%E5%AE%89%E5%85%A8%E5%90%AF%E5%8A%A8.html),密钥生成过程如下: ++ ++``` ++ # 准备密钥目录 ++ KEYDIR="my/path/to/keys" ++ CERTDB="$KEYDIR/certdb" ++ BIOSkeyname="rsa4BIOS" ++ PIN_PASSWORD="foo" ++ keyname="$BIOSkeyname" ++ ++ # 生成RSA密钥、证书,其中PIN_PASSWORD为BIOS签名私钥口令(pesign签名数据库口令) ++ mkdir -p "${CERTDB}" ++ cat > "${KEYDIR}/pinfile" << EOF ++$PIN_PASSWORD ++EOF ++ ++ openssl genrsa -out "${KEYDIR}/${keyname}.key" 4096 ++ openssl req -new -key "${KEYDIR}/${keyname}.key" -out "${KEYDIR}/${keyname}.csr" -subj '/C=AA/ST=BB/O=CC/OU=DD/CN=BIOS-cert-for-kubeos-secure-boot' ++ openssl x509 -req -days 365 -in "${KEYDIR}/${keyname}.csr" -signkey "${KEYDIR}/${keyname}.key" -out "${KEYDIR}/${keyname}.crt" ++ openssl x509 -in "${KEYDIR}/${keyname}.crt" -out "${KEYDIR}/${keyname}.der" -outform der ++ ++ # 创建pesign签名数据库 ++ certutil -N -d "${CERTDB}" -f "${KEYDIR}/pinfile" ++ certutil -A -n ${keyname} -d "${CERTDB}" -t CT,CT,CT -i "${KEYDIR}/${keyname}.crt" -f "${KEYDIR}/pinfile" ++ openssl pkcs12 -export -out "${KEYDIR}/${keyname}.p12" -inkey "${KEYDIR}/${keyname}.key" -in "${KEYDIR}/${keyname}.crt" -password pass:"${PIN_PASSWORD}" ++ pk12util -d "${CERTDB}" -i "${KEYDIR}/${keyname}.p12" -w "${KEYDIR}/pinfile" -k "${KEYDIR}/pinfile" ++ ++ # 签名示例,对shimx64.efi签名 ++ SHIM="my/path/to/shimx64.efi" ++ pesign -n "${CERTDB}" -c ${BIOSkeyname} --pinfile "${KEYDIR}/pinfile" -s -i "$SHIM" -o "${SHIM}.signed" ++ ++ ++ # 生成GPG签名密钥,用于对配置文件grub.cfg签名,其中GPG_PASSWORD为grub配置文件签名密钥保护口令 ++ GPG_PASSWORD="foo" ++ GPGkeyid="gpgKey4kubeos" ++ cat > "${KEYDIR}/gpg.batch.file" << EOF ++Key-Type: RSA ++Key-Length: 4096 ++Subkey-Type: RSA ++Subkey-Length: 4096 ++Name-Real: ${GPGkeyid} ++Expire-Date: 0 ++Passphrase: ${GPG_PASSWORD} ++EOF ++ ++ gpg --batch --gen-key "${KEYDIR}/gpg.batch.file" ++ gpg --list-keys --keyid-format LONG ${GPGkeyid} | grep pub > "${KEYDIR}/gpg.log" ++ GPG_KEY=$(gpg --list-keys --keyid-format LONG ${GPGkeyid} | grep pub | awk -F 'rsa4096/' '{print $2}' | cut -b 1-16) ++ gpg --export "$GPG_KEY" > "${KEYDIR}/gpg.key" ++ ++ # 签名示例 ++ GRUB_CFG="my/path/to/grub.cfg" ++ gpg --pinentry-mode=loopback --passphrase "${GPG_PASSWORD}" --default-key "$GPG_KEY" --detach-sign "${GRUB_CFG}" ++``` ++注意:密钥/证书文件生成后应及时删除口令和私钥文件 +\ No newline at end of file +-- +2.39.5 (Apple Git-154) + diff --git a/0008-docs-update-readme.patch b/0008-docs-update-readme.patch new file mode 100644 index 0000000000000000000000000000000000000000..253b176e3962cb4eef2719e919235e3c6a0ff32b --- /dev/null +++ b/0008-docs-update-readme.patch @@ -0,0 +1,140 @@ +From 2c31929f3f32cfcd7db422fdbab66c75b5ad9175 Mon Sep 17 00:00:00 2001 +From: Yuhang Wei +Date: Thu, 28 Nov 2024 10:46:03 +0800 +Subject: [PATCH 08/11] docs: update readme + +Signed-off-by: Yuhang Wei +--- + README.md | 117 +++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 108 insertions(+), 9 deletions(-) + +diff --git a/README.md b/README.md +index 7f325623..cb17d89e 100644 +--- a/README.md ++++ b/README.md +@@ -1,14 +1,113 @@ + # KubeOS +-## Introduction +-KubeOS 是针对业务以容器的形式运行的场景,专门设计的一种轻量级操作系统。KubeOS 通过 kubernetes CRD + operator 扩展机制将将 OS 作为组件接入 kubernetes,使 OS 和业务处于同等地位,用户通过 kubernetes 集群统一管理节点上的容器和节点 OS,实现一套系统管理容器和 OS。 +-## Architecture +-KubeOS架构的介绍请见: [architecture](docs/design/architecture.md) +-## Getting Started +-### Build from source and deploy +-从源码构建指南请见: [quick-start.md](docs/quick-start.md). +-### User Guide +-用户指南请见:[user guide](https://docs.openeuler.org/zh/docs/22.03_LTS_SP1/docs/KubeOS/overview.html) ++ ++在云计算场景中,容器和 Kubernetes 的应用日益广泛。然而,当前容器和操作系统(OS)独立管理的方式常常面临功能冗余,以及两套调度系统难以协同的问题。此外,OS 的版本管理也存在诸多挑战:相同版本的 OS 在使用过程中会因安装、更新或删除不同的软件包而逐渐产生差异,导致版本分裂。同时,OS 与业务紧耦合,造成大版本升级难度较高,进一步增加了运维复杂性。 ++ ++**KubeOS** 是专为以容器形式运行业务的场景设计的一种轻量级操作系统。通过 Kubernetes 的 CRD(自定义资源定义)与 Operator 扩展机制,KubeOS 将 OS 作为 Kubernetes 的一个组件接入,使 OS 和业务处于同等地位。用户可通过 Kubernetes 集群统一管理节点上的容器和节点的 OS,从而实现一套系统同时管理容器与 OS。 ++ ++KubeOS 的组件利用 Kubernetes Operator 扩展机制来控制容器 OS 的升级流程,支持对 KubeOS 的整体原子化升级。这种升级方式在升级前会将业务迁移到未升级的节点上,从而最大程度减少升级和配置过程对业务的影响。同时,通过原子化升级保持 OS 始终与预期状态同步,确保集群内 OS 的版本一致性,有效避免版本分裂问题。 ++ ++![架构](docs/design/figures/kubeos-architecture_2024.png) ++ ++以下链接可协助您使用KubeOS: ++ ++* [KubeOS组件构建指南](docs/quick-start.md)涵盖了从编译、制作和部署KubeOS组件的全流程。 ++* [镜像制作指导](docs/user_guide/KubeOS镜像制作指导-binary.md)包含了KubeOS镜像制作工具的详细使用方法。 ++* [KubeOS架构](docs/design/architecture.md)展示了其文件系统的设计理念及核心组件的详细信息。 ++* [用户指南](https://docs.openeuler.org/zh/docs/24.03_LTS/docs/KubeOS/overview.html)链接至openEuler容器OS文档。 ++ ++## 特性介绍 ++ ++### 升级 ++ ++与传统的包管理器逐一升级软件包不同,KubeOS 在升级时会通过预制的完整根分区文件系统镜像实现全量升级。升级流程包括从 HTTP 服务器或容器镜像仓库下载升级镜像,并将新的根分区文件系统覆盖到备用的 root 分区。随后,节点从备用 root 分区启动,完成操作系统的全量升级。 ++ ++此外,KubeOS 支持一键回滚至上一版本的操作系统。通过切换至备用分区启动,快速恢复节点的 OS 状态。 ++ ++* **os-operator**: 部署在 Master 节点的 OS 自定义资源控制器,负责管理集群内所有节点 OS 的升级、回滚以及配置请求的下发。 ++* **os-proxy**: 部署在每个节点上的 OS 控制器,将针对该节点的升级、回滚和配置请求转发至 os-agent。 ++* **os-agent**: 部署在每个节点 OS 的 systemd 服务,负责执行具体的升级、回滚和配置任务。 ++ ++更多详细信息,可见[升级指导](docs/quick-start.md#升级指导)。 ++ ++### 配置 ++ ++KubeOS 通过 Kubernetes 下发 OS 自定义资源,实现对集群内所有容器 OS 的统一配置管理。目前支持以下配置类型: ++ ++* 内核参数(临时/持久化) ++* 内核启动参数 ++* pam_limits ++* KubeletConfiguration ++* containerd ++ ++更多详细信息,可见[配置指导](docs/quick-start.md#配置(Settings)指导) ++ ++### Admin运维容器 ++ ++为了保持系统的轻量化,KubeOS 可不安装 SSH 服务(sshd)。在必要情况下,管理员可以通过部署 Admin 容器到目标节点,SSH 登录到容器内,再切换到节点主机命名空间,完成运维操作。 ++ ++Admin 容器内可以安装丰富的调试工具,从而在主机命名空间下调用容器内的命令完成调试和检测任务。 ++ ++更多详细信息,可见[Admin容器镜像制作部署和使用](docs/quick-start.md#admin容器镜像制作部署和使用)。 ++ ++### dm-verity静态完整性保护 ++ ++KubeOS当前基于[dm-verity](https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html)+安全启动实现对rootfs的完整性保护,安全启动用于保护roothash完整性。 ++ ++更多详细信息,可见[dm-verity介绍](docs/user_guide/dm-verity.md)。 ++ ++### 镜像制作 ++ ++KubeOS 支持制作多种类型的镜像,包括: ++ ++* 普通虚拟机镜像 ++* PXE 物理机镜像 ++* 升级容器镜像 ++* 启用 dm-verity 特性的虚拟机镜像 ++ ++目前支持 x86 和 aarch64 架构,默认使用UEFI引导模式,部分支持 legacy 引导模式。 ++ ++您可以通过以下命令创建 KubeOS 镜像: ++ ++```bash ++make rust-agent ++cargo run --package kbimg -- create -f KubeOS-Rust/kbimg/kbimg.toml ++``` ++ ++更多详细信息,可见[镜像制作指导](docs/user_guide/KubeOS镜像制作指导-binary.md) ++ ++## Roadmap ++ ++### 即将到来 ++ ++* **2025**: ++ * [ ] Pod热迁移:提供用户无感、业务中断时间短的Pod热迁移解决方案 ++ ++### 当前进展 ++ ++* **2024**: ++ * [x] 灵活、多维度的运维策略:分组分批次升级,基于时间窗升级的升级策略 ++ * [x] KubeOS 镜像定制化制作:支持用户根据需求制作定制化镜像 ++ * [x] 更强安全能力:支持安全启动和dm-verity ++ * [x] 更丰富的配置管理:支持统一管理节点`containerd`和`kubelet`配置 ++ ++* **2023**: ++ * [x] 支持容器镜像(containerd)升级 ++ * [x] 新增settings配置功能 ++ * [x] 新增Admin容器功能 ++ * [x] 内存底噪优化:降低os-proxy和os-agent内存底噪80% ++ ++* **2022**: ++ * [x] 支持物理机安装、升级 ++ * [x] 支持容器镜像(docker)升级 ++ ++* **2021**: ++ * [x] KubeOS发布 ++ * [x] 支持ARM架构 ++ + ## How to Contribute ++ + 我们非常欢迎新贡献者加入到项目中来,也非常高兴能为新加入贡献者提供指导和帮助。您可以通过issue或者合入PR来贡献 ++ + ## Licensing ++ + KubeOS 使用 Mulan PSL v2. +-- +2.39.5 (Apple Git-154) + diff --git a/0009-fix-kbimg-exit-with-error-code-on-image-creation-fai.patch b/0009-fix-kbimg-exit-with-error-code-on-image-creation-fai.patch new file mode 100644 index 0000000000000000000000000000000000000000..0741b1378a4cdedc54ee36dc193172606a8c2e89 --- /dev/null +++ b/0009-fix-kbimg-exit-with-error-code-on-image-creation-fai.patch @@ -0,0 +1,26 @@ +From 6760d1adc236ccbe2d5bb1ae6a12087a8eb82d90 Mon Sep 17 00:00:00 2001 +From: Yuhang Wei +Date: Thu, 28 Nov 2024 10:08:25 +0000 +Subject: [PATCH 09/11] fix(kbimg): exit with error code on image creation + failure + +Signed-off-by: Yuhang Wei +--- + KubeOS-Rust/kbimg/src/main.rs | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs +index 3fc68cb1..8639f81f 100644 +--- a/KubeOS-Rust/kbimg/src/main.rs ++++ b/KubeOS-Rust/kbimg/src/main.rs +@@ -130,6 +130,7 @@ fn main() { + }, + Err(e) => { + error!("Failed to create image: {:?}", e); ++ exit(1); + }, + } + } +-- +2.39.5 (Apple Git-154) + diff --git a/0010-docs-update-kbimg-pxe-guide.patch b/0010-docs-update-kbimg-pxe-guide.patch new file mode 100644 index 0000000000000000000000000000000000000000..077f1eb51ee9fac26a1322f23eb76ba0e074d2d0 --- /dev/null +++ b/0010-docs-update-kbimg-pxe-guide.patch @@ -0,0 +1,26 @@ +From 6f0357c10320202d62ecca286b39a9f7fc80baa2 Mon Sep 17 00:00:00 2001 +From: Yuhang Wei +Date: Tue, 3 Dec 2024 10:44:41 +0800 +Subject: [PATCH 10/11] docs: update kbimg pxe guide + +Signed-off-by: Yuhang Wei +--- + ...7\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git "a/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" "b/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" +index b951b388..d01a41ce 100644 +--- "a/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" ++++ "b/docs/user_guide/KubeOS\351\225\234\345\203\217\345\210\266\344\275\234\346\214\207\345\257\274-binary.md" +@@ -246,6 +246,8 @@ version = "v1" + + * 支持CPU 架构为 x86 和 aarch64 的物理机场景,不支持legacy引导模式 + * PXE物理机镜像制作不支持dm-verity功能 ++* 使用默认的 rpmlist 进行镜像制作时,所需磁盘空间至少为 5GB。如果使用自定义的 rpmlist,可能需要超过 5GB 的磁盘空间。 ++* 在 PXE 安装阶段,需要从 HTTP 服务器下载根分区 tar 包。请确保机器拥有足够的内存空间以存储根分区 tar 包及临时中间文件。 + * 首先需要修改```kbimg.toml```中```pxe_config```的配置,对相关参数进行配置,详细参数可见[参数说明](#pxe_config),ip目前仅支持ipv4,配置示例如下 + + ```toml +-- +2.39.5 (Apple Git-154) + diff --git a/0011-fix-kbimg-prevent-concurrent-execution-by-checking-a.patch b/0011-fix-kbimg-prevent-concurrent-execution-by-checking-a.patch new file mode 100644 index 0000000000000000000000000000000000000000..12c5057c96f9e1e9a031bfd4a58aafc0a1afcff5 --- /dev/null +++ b/0011-fix-kbimg-prevent-concurrent-execution-by-checking-a.patch @@ -0,0 +1,30 @@ +From d882aa4202dec390cb8b9683e974b9705b4c19eb Mon Sep 17 00:00:00 2001 +From: Yuhang Wei +Date: Tue, 3 Dec 2024 11:01:56 +0800 +Subject: [PATCH 11/11] fix(kbimg): prevent concurrent execution by checking a + lock file + +Signed-off-by: Yuhang Wei +--- + KubeOS-Rust/kbimg/src/main.rs | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/KubeOS-Rust/kbimg/src/main.rs b/KubeOS-Rust/kbimg/src/main.rs +index 8639f81f..43e9d422 100644 +--- a/KubeOS-Rust/kbimg/src/main.rs ++++ b/KubeOS-Rust/kbimg/src/main.rs +@@ -40,6 +40,11 @@ trait CreateImage { + + fn process(info: Box, mut config: Config, debug: bool) -> Result<()> { + let dir = PathBuf::from(SCRIPTS_DIR); ++ let lock = dir.join("test.lock"); ++ if lock.exists() { ++ error!("It looks like another kbimg process is running. Please wait it to finish."); ++ exit(1); ++ } + if dir.exists() { + debug!("Removing existing scripts directory"); + fs::remove_dir_all(&dir)?; +-- +2.39.5 (Apple Git-154) + diff --git a/KubeOS.spec b/KubeOS.spec index e34ddc8517b0df157993d93b84c228d85fa164dd..1583845477f10357e50accada9a7c67179f421e4 100644 --- a/KubeOS.spec +++ b/KubeOS.spec @@ -2,10 +2,21 @@ Name: KubeOS Version: 1.0.7 -Release: 1 +Release: 2 Summary: O&M platform used to update the whole OS as an entirety License: Mulan PSL v2 Source0: https://gitee.com/openeuler/KubeOS/repository/archive/v%{version}.tar.gz +Patch1: 0001-fix-Fix-some-spelling-errors-in-docs.patch +Patch2: 0002-docs-update-kbimg-docs.patch +Patch3: 0003-fix-os-agent-use-findmnt-to-find-out-which-device-mo.patch +Patch4: 0004-style-format-code.patch +Patch5: 0005-docs-add-description-of-the-configuration.patch +Patch6: 0006-fix-os-agent-fix-settings-of-kubelet-and-add-log.patch +Patch7: 0007-docs-add-dm-verity-user-guide.patch +Patch8: 0008-docs-update-readme.patch +Patch9: 0009-fix-kbimg-exit-with-error-code-on-image-creation-fai.patch +Patch10: 0010-docs-update-kbimg-pxe-guide.patch +Patch11: 0011-fix-kbimg-prevent-concurrent-execution-by-checking-a.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: make rust cargo openssl-devel @@ -70,6 +81,12 @@ install -p -m 0600 ./KubeOS-Rust/kbimg/kbimg.toml %{buildroot}/opt/kubeOS/script rm -rfv %{buildroot} %changelog +* Tue Dec 03 2024 Yuhang Wei - 1.0.7-2 +- Type:requirement +- CVE:NA +- SUG:restart +- DESC:sync from upstream + * Tue Nov 26 2024 Yuhang Wei - 1.0.7-1 - Type:requirement - CVE:NA