OpenCloudOS 是企业级社区研发的定制化服务器操作系统。该系统集成了众多服务器系列的优点,加入自主研发的软件,便于用户操作使用,提供全方位的操作系统支持。系统特点:安全、易用、稳定、快速、长久支持。 OpenCloudOS 社区的发展离不开用户的贡献。本文将从四个步骤,向大家介绍如何向 OpenCloudOS 的用户态软件提交 patch。
一、获取源码。这部分会介绍如何获取目标软件的源码压缩包。
二、制作补丁。这部分会介绍如何为软件制作 patch 文件。
三、打包构建。这部分会介绍如何将制作好的 patch 文件加入构建过程,并进行构建测试。
四、提交代码。这部分会介绍如何向托管在 gitee 平台的 OpenCloudOS 项目提交代码。
首先我们需要一个 OpenCloudOS 8 系统环境,您可以在 https://www.opencloudos.org/iso 下载到最新镜像。您也可以在购买腾讯云 CVM 时,选择 OpenCloudOS 镜像。
本文以一个全新安装的 OpenCloudOS 8.6 为例,向大家详细介绍每一个步骤。
进入系统后,我们打开终端。首先要安装基本的构建工具,并作基本的必要配置。当然,根据项目的不同,您可能需要额外安装不同的编译、构建工具。终端命令(以root用户执行):
dnf install -y git rpm-build make
如果您之前从未安装配置过 Git,此处我们配置一下基本信息。在实际项目中,请将 email:demo@opencloudos.org 和 name:opencloudos 替换为自己的信息。终端命令:
git config --global user.email "demo@opencloudos.org"
git config --global user.name "opencloudos"
OpenCloudOS 的用户态软件包源代码目前托管在 gitee 的 src-opencloudos-rpms 空间下,以 file 为例,我们在浏览器访问:https://gitee.com/src-opencloudos-rpms/file
我们在 OpenCloudOS 8 环境,因此选择 oc8 分支
将项目 Fork 至自己的空间。(此处需要您已经注册并登录 Gitee,如果有疑问,可以参考Gitee官方文档 https://help.gitee.com/)
将 Fork 后的项目 clone 至本地并切换到一个固定版本方便演示。(******替换为你的用户名)终端命令:
git clone https://gitee.com/******/file.git
cd file
git checkout oc8
git reset --hard b0e54a57fc5917226d3971f4c812c9aa84d733f3
我们查看文件夹的结构:
[root@VM-16-5-opencloudos file]# tree
.
├── SOURCES
│ ├── file-4.17-rpm-name.patch
│ ├── file-5.04-volume_key.patch
│ ├── file-5.33-bound-file_strncmp.patch
│ ├── file-5.33-clamav.patch
│ ├── file-5.33-covscan.patch
│ ├── file-5.33-CVE-2018-10360.patch
│ ├── file-5.33-gif.patch
│ ├── file-5.33-more-python.patch
│ ├── file-5.33-msooxml-magic.patch
│ ├── file-5.33-other-languages.patch
│ ├── file-5.33-pie-executable-revert.patch
│ ├── file-5.33-ppc-swap.patch
│ ├── file-5.33-python-space.patch
│ ├── file-5.33-seccomp.patch
│ ├── file-5.33-whitespace-compare.patch
│ ├── file-5.34-ebpf-magic.patch
│ ├── file-5.35-man-apple.patch
│ ├── file-5.35-netpbm.patch
│ ├── file-5.35-ppc-core.patch
│ ├── file-5.37-CVE-2019-18218.patch
│ ├── file-5.37-jffs-magic.patch
│ ├── file-localmagic.patch
│ └── file-magic-filesystems.patch
└── SPECS
└── file.spec
2 directories, 24 files
查看项目根目录全部文件
[root@VM-16-5-opencloudos file]# ls -lah
total 28K
drwxr-xr-x 5 root root 4.0K May 24 10:52 .
dr-xr-x--- 7 root root 4.0K May 24 10:51 ..
-rw-r--r-- 1 root root 66 May 24 10:52 .file.metadata
drwxr-xr-x 8 root root 4.0K May 24 10:52 .git
-rw-r--r-- 1 root root 25 May 24 10:52 .gitignore
drwxr-xr-x 2 root root 4.0K May 24 10:52 SOURCES
drwxr-xr-x 2 root root 4.0K May 24 10:52 SPECS
我们发现,除了 SOURCES、SPECS 文件夹,还有 .file.metadata 、 .gitignore 隐藏文件。
.file.metadata 文件记录了源代码压缩包的信息
[root@VM-16-5-opencloudos file]# cat .file.metadata
31a67e4dc0a3d7a8d1b850429c3f625314700240 SOURCES/file-5.33.tar.gz
.gitignore 文件记录了 git 忽略文件列表
[root@VM-16-5-opencloudos file]# cat .gitignore
SOURCES/file-5.33.tar.gz
根据 .file.metadata 的内容,可以下载项目的源码包(tarball)到 SOURCES 文件夹。终端命令:
curl https://git.opencloudos.tech/sources/file/oc8/31a67e4dc0a3d7a8d1b850429c3f625314700240 --output SOURCES/file-5.33.tar.gz
url 的路径中,file 为项目名,oc8 为分支名,31a67e4dc0a3d7a8d1b850429c3f625314700240 为 .metadata 文件里记录的源代码压缩包 tarball 的 sha1sum。
验证一下:
[root@VM-16-5-opencloudos file]# sha1sum SOURCES/file-5.33.tar.gz
31a67e4dc0a3d7a8d1b850429c3f625314700240 SOURCES/file-5.33.tar.gz
进入 SOURCES 文件夹,解压源代码压缩包,进入目标源代码路径
cd SOURCES
tar xf file-5.33.tar.gz
cd file-5.33/
利用 Git 生产补丁:
git init
git add .
git commit -m 'init'
我们将 file 源码包的原始状态记录下来
[root@VM-16-5-opencloudos file-5.33]# git status
On branch master
nothing to commit, working tree clean
[root@VM-16-5-opencloudos file-5.33]# git log
commit 23ebfe8b2078d674b6aa093e058ed4f402dc2e7e (HEAD -> master)
Author: opencloudos <demo@opencloudos.org>
Date: Wed May 24 11:04:07 2023 +0800
init
对源码作出需要的修改,以 file.c 的 help() 为例。我们安装 file 软件后,默认的 --help 指令为
[invain@localhost projects]$ file --help
Usage: file [OPTION...] [FILE...]
Determine type of FILEs.
--help display this help and exit
-v, --version output version information and exit
-m, --magic-file LIST use LIST as a colon-separated list of magic
number files
-z, --uncompress try to look inside compressed files
-Z, --uncompress-noreport only print the contents of compressed files
-b, --brief do not prepend filenames to output lines
-c, --checking-printout print the parsed form of the magic file, use in
conjunction with -m to debug a new magic file
before installing it
-e, --exclude TEST exclude TEST from the list of test to be
performed for file. Valid tests are:
apptype, ascii, cdf, compress, elf, encoding,
soft, tar, text, tokens
-f, --files-from FILE read the filenames to be examined from FILE
-F, --separator STRING use string as separator instead of `:'
-i, --mime output MIME type strings (--mime-type and
--mime-encoding)
--apple output the Apple CREATOR/TYPE
--extension output a slash-separated list of extensions
--mime-type output the MIME type
--mime-encoding output the MIME encoding
-k, --keep-going don't stop at the first match
-l, --list list magic strength
-L, --dereference follow symlinks
-h, --no-dereference don't follow symlinks (default)
-n, --no-buffer do not buffer output
-N, --no-pad do not pad output
-0, --print0 terminate filenames with ASCII NUL
-p, --preserve-date preserve access times on files
-P, --parameter set file engine parameter limits
indir 15 recursion limit for indirection
name 30 use limit for name/use magic
elf_notes 256 max ELF notes processed
elf_phnum 128 max ELF prog sections processed
elf_shnum 32768 max ELF sections processed
-r, --raw don't translate unprintable chars to \ooo
-s, --special-files treat special (block/char devices) files as
ordinary ones
-C, --compile compile file specified by -m
-d, --debug print debugging messages
Report bugs to http://bugs.gw.com/
我们可以修改 file --help 的输出,在 src/file.c 的 help 函数里,文件的第 657 行加入 fprintf(stdout, "\nmodified by OpenCloudOS experiment\n");
sed -i '657i \\tfprintf(stdout, "\\nmodified by OpenCloudOS experiment\\n");' src/file.c
实际修改效果:
然后生成补丁:
git add src/file.c
git commit -m 'patch help'
git format-patch HEAD^
命令执行后,当前路径下会生成一个 0001-patch-help.patch 文件,将其移动到 SOURCES 文件夹
mv 0001-patch-help.patch ..
回到 file 文件夹路径
cd ../..
将补丁加入 spec 文件
sed -i '87i Patch1000: 0001-patch-help.patch' SPECS/file.spec
修改 release
sed -i '18s/}/}.1/' SPECS/file.spec
实际修改:
我们知道,修改前`file --help`命令并不包含自定义的内容。我们此时构建新的带补丁的 file 版本,然后安装测试。
首先安装必要的依赖
yum-builddep -y SPECS/file.spec
然后构建
rpmbuild -bb --define "_topdir $(pwd)" SPECS/file.spec
这里我们将 file 项目的根路径作为 rpmbuild 的根路径,直接在当前路径生成二进制 rpm 包。
构建成功后进行安装。(演示的机器架构为 x86_64,如果您的机器架构为其他类型,请修改对应路径)
dnf install -y RPMS/x86_64/*.rpm RPMS/noarch/*.rpm
安装成功后,再次执行`file --help`,可以验证最后出现了"modified by OpenCloudOS experiment"。
将修改提交到本地 Git
git add SPECS/file.spec SOURCES/0001-patch-help.patch
git commit -m 'add custom message to help'
git push
输入 Gitee 的用户名和密码,将代码提交到个人空间。
在浏览器访问 Gitee 个人空间:https://gitee.com/******/file/tree/oc8/,******替换为您的用户名。
创建 Pull Request 时,请您在「标题」里简明扼要的描述补丁的内容,并在「说明」中详细描述补丁解决的问题。
项目管理员在确认补丁内容后会合入您的代码。
管理员也可能驳回您的 Pull request,此时您应该作出必要的修改,重新提交。
代码正式合入后,构建工程师会提交新的构建,您的修改将进入测试流程,直至在下一个发布周期正式发布。
恭喜你!至此你已经完成了一次完整的 patch 提交!
相关链接
查阅 OpenCloudOS 文档库 : https://docs.opencloudos.org/
参与OpenCloudOS的讨论:https://bugs.opencloudos.tech/
内核源代码:https://gitee.com/OpenCloudOS/OpenCloudOS-Kernel
用户态软件源代码:
https://gitee.com/src-opencloudos-rpms/
https://gitee.com/src-opencloudos-modules/
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。