# chisel **Repository Path**: OpenCloudOS/chisel ## Basic Information - **Project Name**: chisel - **Description**: chisel是一个用于切割 TencentOS/OpencloudOS的rpm软件包的工具 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-04-02 - **Last Updated**: 2025-10-13 ## Categories & Tags **Categories**: os **Tags**: None ## README # chisel ## 介绍 chisel是一个用于切割 TencentOS/OpencloudOS的rpm软件包的工具 它来源于**包切片**的思想————软件包会被切分成多个slices(每个slice包含一组具有特定功能的文件集合),软件包之间的依赖关系也更精细地表现为slice之间的依赖 一般情况下,制作一个应用容器镜像会直接使用`RUN dnf install`在镜像中打包所需的应用及其依赖软件包。这种以RPM为最小粒度的镜像打包方式, 虽然可以由发行版保证定期的CVE修复,但是会导致镜像内包含冗余文件,暴露更多攻击点,并且额外增加镜像体积影响传播。 Distroless镜像是一种精简的容器镜像,旨在最小化容器的大小和攻击面。与一般的容器镜像不同,distroless镜像不包含操作系统的许多组件,只包含运行应用程序所需的最小依赖项。这种镜像减少了攻击者利用未解决的安全漏洞的机会,但是一旦发布后续难以长期维护 两全其美的方式:使用TencentOS/OpencloudOS chisel, 该工具的使得chisel distroless镜像继承了TencentOS/OpencloudOS发行版的优点:定期更新和长期维护,为创建和运行容器应用程序提供可靠且安全的平台, 同时最终交付的是经过裁剪不包含冗余文件的最小化镜像 TencentOS/OpencloudOS chisel distroless镜像构建时,首先使用chisel对RPM软件包进行切片处理,每个软件包会被切分成多个slices,然后以slice为最小构建单元生成最终的distroless镜像,可以有效减少冗余文件,进而降低安全风险。 ![img.png](docs/pictures/slice.png) 如上图所示,软件包 A 和 B 都被解构为多个切片。在包级别,B 依赖于 A,但实际上,A 中可能存在 B 并不真正需要的文件(例如,B 不需要 A_slice3 才能正常运行)。有了这个切片定义,Chisel 就能够提取 TencentOS 发行版的高度定制和专门的 Slice。 ## 软件架构 软件架构说明 ## 安装指南 1. 安装系统依赖 ``` dnf install python3-pip ``` 2. 克隆源码仓库 ``` git clone https://gitee.com/OpenCloudOS/chisel.git cd chisel pip3 install -r requirements.txt pip3 install -e . ``` 3. 验证 查看帮助摘要 ``` chisel --help ``` 查看具体某个命令的描述 ``` chisel -h ``` ## 使用说明 OpencloudOS/TencentOS的slice生成依赖于切片数据库,所有release的切片定义位于[chisel-releases](https://gitee.com/OpenCloudOS/chisel-releases)。 ### 查看软件包支持的切片 以openssl为例,我们查看openssl在分支opencloudos-stream-23上支持哪些切片 ``` > chisel find --release opencloudos-stream-23 glib2 Slice Summary glib2_bins - glib2_copyright - glib2_core - glib2_libgmodule - glib2_libgobject - glib2_libgthread - glib2_libs - glibc_config - glibc_copyright - glibc_gconv - glibc_libs - ``` glib2软件包含11个切片 ### 查看切片详情 1.如果需要查看整个软件包所有切片的具体定义,即切片包含哪些内容,执行如下命令 ``` > chisel info --release opencloudos-stream-23 glib2 name: glib2 path: /root/.cache/chisel/releases/opencloudos-stream-23/slices/glib2.yaml slices: bins: essential: - glib2_copyright - glib2_libs contents: - /usr/bin/gapplication - /usr/bin/gdbus - /usr/bin/gio - /usr/bin/gio-querymodules - /usr/bin/glib-compile-schemas core: essential: - glib2_copyright - libatomic_libs - glibc_libs - pcre2_libs contents: - /usr/lib*/libglib-2.0.so.0* libgmodule: essential: - glib2_copyright - glib2_core contents: - /usr/lib*/libgmodule-2.0.so.0* libgobject: essential: - glib2_copyright - libffi_libs - glib2_core contents: - /usr/lib*/libgobject-2.0.so.0* libgthread: essential: - glib2_copyright - glib2_core contents: - /usr/lib*/libgthread-2.0.so.0* libs: essential: - glib2_copyright - libffi_libs - glib2_core - glib2_libgmodule - glib2_libgobject - glib2_libgthread - libmount_libs - libselinux_libs - zlib_libs contents: - /usr/lib/*-linux-*/libgio-2.0.so.0* copyright: essential: [] contents: - /usr/share/licenses/glib2/COPYING ``` 上述内容来源glib2.yaml文件中,这些slice所包含的文件内容(详细信息请查看[chisel-releases](https://gitee.com/OpenCloudOS/chisel-releases))。 2. 如果只查看某个具体切片详情 ``` > chisel info --release opencloudos-stream-23 glib2_bins name: glib2 path: /root/.cache/chisel/releases/opencloudos-stream-23/slices/glib2.yaml slices: bins: essential: - glib2_copyright - glib2_libs contents: - /usr/bin/gapplication - /usr/bin/gdbus - /usr/bin/gio - /usr/bin/gio-querymodules - /usr/bin/glib-compile-schemas ``` ### 生成slice chisel使用cut命令行对软件包切分生成所需的slices ``` chisel cut --release opencloudos-stream-23 --arch x86_64 --root ./rootfs openssl_bins bash_bins ``` 上述命令中`-r/--release`指定所需slices所属的TencentOS/OpencloudOS版本,`-a/--arch`指定OS架构(如果不指定,采用当前系统的架构),`--root`指定生成slices的输出路径,`openssl_bins bash_bins`是用户指定要的slices。 ### 验证本地修改后的切片 将[chisel-releases](https://gitee.com/OpenCloudOS/chisel-releases)clone到本地, 切换到对应分支,如果本地修改了openssl_bins相关的切片,直接执行如下命令 ``` chisel cut --release /chisel-release --arch x86_64 --root ./rootfs openssl_bins bash_bins