From 39ca35746a50faac3fb7c9c2fe284d4a651f3425 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Mon, 30 Sep 2024 23:25:39 +0800 Subject: [PATCH 01/13] Update articles related to TinyBPT --- articles/20240927-tinybpt-client-usage.md | 5 +++++ articles/20240927-tinybpt-design.md | 5 +++++ articles/20240927-tinybpt-server-usage.md | 5 +++++ 3 files changed, 15 insertions(+) create mode 100644 articles/20240927-tinybpt-client-usage.md create mode 100644 articles/20240927-tinybpt-design.md create mode 100644 articles/20240927-tinybpt-server-usage.md diff --git a/articles/20240927-tinybpt-client-usage.md b/articles/20240927-tinybpt-client-usage.md new file mode 100644 index 0000000..ded72a1 --- /dev/null +++ b/articles/20240927-tinybpt-client-usage.md @@ -0,0 +1,5 @@ +> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS \ No newline at end of file diff --git a/articles/20240927-tinybpt-design.md b/articles/20240927-tinybpt-design.md new file mode 100644 index 0000000..ded72a1 --- /dev/null +++ b/articles/20240927-tinybpt-design.md @@ -0,0 +1,5 @@ +> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS \ No newline at end of file diff --git a/articles/20240927-tinybpt-server-usage.md b/articles/20240927-tinybpt-server-usage.md new file mode 100644 index 0000000..ded72a1 --- /dev/null +++ b/articles/20240927-tinybpt-server-usage.md @@ -0,0 +1,5 @@ +> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS \ No newline at end of file -- Gitee From 66f8f874f4e8c68332219cd4637daa93baf28d1f Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:03:08 +0800 Subject: [PATCH 02/13] Update 20240927-tinybpt-design.md --- articles/20240927-tinybpt-design.md | 233 +++++++++++++++++++++++++++- 1 file changed, 232 insertions(+), 1 deletion(-) diff --git a/articles/20240927-tinybpt-design.md b/articles/20240927-tinybpt-design.md index ded72a1..8ae2039 100644 --- a/articles/20240927-tinybpt-design.md +++ b/articles/20240927-tinybpt-design.md @@ -2,4 +2,235 @@ > Date: 2024/09/27
> Revisor: falcon
> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS \ No newline at end of file +> Sponsor: PLCT Lab, ISCAS + +# TinyBPT 和面向 buildroot 的二进制包管理服务 设计简介与框架 + +## 前言 + +在 buildroot 的使用过程中,我们经常会遇到一些问题,比如因为网络链接导致的编译失败,编译时间过长,或者想要使用某些特定软件时需要重新编译整个系统等。 + +本项目旨在解决这些问题,为 buildroot 搭建国内镜像站并新建一套面向 buildroot 的二进制包管理服务。并提供一个简单的、易于使用的 buildroot 包管理工具,[TinyBPT](https://gitee.com/tinylab/tinybpt) 因此诞生了。 + +## 软件源与包管理 + +软件源镜像方法是确认上游源,同步到本地然后设置下载链接配置,还需要给同步程序设置选项使其忽略错误,防止因为某个软件包的链接失效导致整个同步过程失败,也可增加镜像站稳定性。同时,要补充 buildroot 源代码镜像的文档。 + +在搭建镜像站的过程中,一般会确定镜像站的上游源,使用rsync 或者 wget 等工具将上游源的数据同步到镜像站上,然后通过 HTTP 或者 FTP 等协议对外提供服务。添加 buildroot 的镜像源,需要将 buildroot 的软件包源同步到镜像站上,然后通过设置 buildroot 的配置文件,将软件包的下载地址指向镜像站的地址。 + +为了提供一个稳定并可以持续更新的 buildroot 国内镜像源,在[兰州大学开源镜像](https://mirrors.lzu.edu.cn/)站上,我使用 [tsumugu](https://github.com/taoky/tsumugu) 工具同步 buildroot 的官方镜像源,将同步后的数据上传到镜像站上,并对外提供服务。 + +在此基础上,我尝试设计了 buildroot 包管理工具 TinyBPT ,全称为 Tiny Buildroot Packaging Tool ,其设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 + +## 依赖和协议 + +我在调研了一些现有的包管理器,例如apt、yum、dnf、pacman 等后认为,它们都提供了类似的功 +能,但实现方式可能有所不同。例如,apt使用dpkg来管理软件包,而yum使用rpm,等等。 + +在apt实现中,软件包的信息存储在/var/lib/dpkg/status 文件中,这个文件包含了软件包的名称、版本、描述、依赖关系等信息。apt-getupdate 命令会从软件源获取最新的软件包信息,并更新/var/lib/dpkg/status 文件。 + +因此在整个项目中,最核心的部分在于编译后二进制包的依赖问题。首先,buildroot 软件包并没有规范的依赖文件,大多数配置被写在 .mk 以及 .in ,甚至 .in.host 文件中。这就导致了我需要自己去解析这些文件,提取出依赖关系。在通过对配置文件的简单分析后,我认为大部分都可以通过正则表达式来提取依赖关系。 + +在大多数 package 目录下的软件包配置文件中, .mk 文件格式大多不同,解析困难。但在大多数 .hash 文件中却有非常规范的 sha256、包名(含版本号)信息,例如: + +```shell +# Locally calculated after checking pgp signature +sha256 97203a72cae99ab89a067fe2210c1cbf052bc492b479eca7d226d9830883b0bd acl-2.3.2.tar.xz + +# Locally calculated +sha256 a45a845012742796534f7e91fe623262ccfb99460a2bd04015bd28d66fba95b8 doc/COPYING +sha256 01b1f9f2c8ee648a7a596a1abe8aa4ed7899b1c9e5551bda06da6e422b04aa55 doc/COPYING.LGPL +``` + +因此可以直接使用切片函数来获得信息: + +```python +with open(hash_file_path, "r", encoding="utf-8") as hash_file: + lines = hash_file.readlines() + if len(lines) > 1: + line = lines[1].strip() + pos = line.rfind(" ") + if pos != -1 and pos + 1 < len(line): + return line[pos + 1:] +``` + +同样的,大多数 .in 文件也包含着软件包的依赖信息,例如: + +```shell +config BR2_PACKAGE_BASH + bool "bash" + # uses fork() + depends on BR2_USE_MMU + depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS + select BR2_PACKAGE_NCURSES + select BR2_PACKAGE_READLINE +``` + +因此,可以通过正则表达式来提取依赖信息: + +```python +dep_regex = re.compile(r"BR2_PACKAGE_\w+") +``` + +处理提取出的依赖数据等过程则用到了不同的脚本,最终将依赖数据存储在一个 JSON 文件中,以便后续的使用。因为有许多的配置文件并非按照上述格式,所以部分数据可能会有遗漏。 + +协议问题的解决则尤为烦人,因为默认配置编译出的 buildroot 系统中自带 busybox ,其中的 wget 仅支持 http 协议,而大部分的软件包都是通过 https 协议下载的。因此,我需要使 TinyBPT 支持 https 协议的下载,以保证兼容性。我使用了基于 MIT 协议的第三方库 [cpp-httplib](https://github.com/yhirose/cpp-httplib) 支持 HTTPS 传输,并配置 CA certificates extracted from Mozilla 作为 CA 证书。 + +```cpp +httplib::SSLClient cli(mirror_url.c_str()); +cli.set_ca_cert_path("/etc/ssl/certs/cacert.pem"); +``` + +我也使用了 [nlohmann/json](https://github.com/nlohmann/json) 库来处理 JSON 文件。 + +## TinyBPT 基本框架 + +TinyBPT 的结构如下: + + +``` + +-------------------+ +-------------------+ + | | | | + | main.cpp | | utils.cpp | + | | | | + | - Handle CLI args| | - String handling| + | - Call pkg funcs | | - Time retrieval | + | | | - Pkg info lookup| + +---------+---------+ +---------+---------+ + | | + cacert.pem | | + | v v ++---------+---------+ | +---------+---------+ +---------+---------+ +| server | | | | | | +| | v | tinybpt.cpp |<------| json_utils.cpp | +| - Metadata Service|------>| | | | +| - Download Service| | - Install pkg | | - Handle JSON | +| - Package Storage | | - Uninstall pkg | | - List pkgs | +| - Compile Package | | - Download pkg | | - Find pkgs | +| | | - Manage deps | | - Update pkg info| +| | | | | - Read config | ++---------+---------+ +---------+---------+ +---------+---------+ + | | + v v + +---------+---------+ +---------+---------+ + | | | | + | Config struct | | Package struct | <--- tinybpt_db.json + | | | | + | - Mirror URL | | - Name | + | - Version info | | - Version | + | - config.json | | - Info | + | | | - Download time | + | | | - Dependencies | + +-------------------+ +-------------------+ +``` + +- src/ + - main.cpp: 处理命令行参数,调用包管理功能。 + - utils.cpp: 提供字符串处理、时间获取和包信息查找等功能。 + - tinybpt.cpp: 实现包的安装、卸载、下载和依赖管理功能。 + - json_utils.cpp: 处理 JSON 格式的包元数据,读取配置文件。 +- tinybpt_db.json: 存储配置信息,如镜像 URL 和版本信息。 +- cacert.pem: CA 证书,用于安全连接。 + +main.cpp 中的主函数负责处理命令行参数,调用包管理功能,其分析命令行输入的相关参数,然后调用 tinybpt.cpp 中的函数来执行相应的操作。 + +```cpp +int main(int argc, char *argv[]) { + if (argc < 2) { + print_help(); + return 1; + } + ··· +``` + +tinybpt.cpp 中包含了实现 TinyBPT 主要功能的函数。 + +例如函数 download_and_install_package,用于下载并安装指定的软件包。通过 find_version_by_name 查找软件包版本,构建下载地址并指定下载路径。调用 download_package 下载软件包,如果下载失败,输出错误信息并返回。读取软件包信息 read_package_info,遍历 packages 列表,找到匹配的软件包并更新本地信息。 + +```cpp +void download_and_install_package(const std::string &name, const std::string &url) { + std::string version = find_version_by_name(name, db_file); + std::string package_url = url + version + ".tar.gz"; + std::string output_path = download_path + "/" + name + "/"; + bool download_success = download_package(package_url, output_path, name); + if (!download_success) { + std::cerr << "Download and installation failed for package: " << name << std::endl; + return; + } + read_package_info(db_file, "packages"); + for (const auto &pkg : packages) { + if (pkg.name == name) { + update_local_package_info(db_file, pkg); + break; + } + } +} +``` + +因为处理 JSON 文件的操作较为繁琐,所以我将其封装在 json_utils.cpp 中,以便于调用。 + +例如函数 find_package 通过读取数据库文件中的软件包信息,查找并输出指定名称的软件包的详细信息(包括版本、信息和依赖项),如果未找到则输出提示信息。 + +```cpp +void find_package(const std::string &name, const std::string &key) { + read_package_info(db_file, key); + for (const auto &pkg : packages) { + if (pkg.name != name) + continue; + std::cout << "Found package: " << pkg.name << " (" << pkg.version << ")" << std::endl; + std::cout << "Info: " << pkg.info << std::endl; + std::cout << "Dependencies: " << pkg.dependencies << std::endl; + return; + } + std::cout << "Package not found: " << name << std::endl; +} +``` + +utils.cpp 则提供了一些功能相关的辅助函数。 + +例如函数 get_current_time 用于获取当前时间,返回一个格式化的时间字符串。 + +```cpp +std::string get_current_time() { + std::time_t now = std::time(nullptr); + char buf[80]; + std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", std::localtime(&now)); + return std::string(buf); +} +``` + +## 二进制包编译与服务端配置 + +使用 buildroot 的软件包进行交叉编译成 RISC-V 架构的二进制包,则需要借助 buildroot 编译过程中的中间文件,其保存在 output/build/ 目录下。在编译过程中,buildroot 会将软件包的源码下载到 output/build/ 目录下,并在此目录下进行编译。编译完成后,buildroot 会将编译好的二进制包安装到 output/target/ 目录下。 + +基于此,我使用脚本将 output/build/ 目录下编译成功的二进制包 `make install` 到指定目录下,然后将其打包成 tar.gz 文件,并在与配置文件进行对比处理后,上传到服务器上。 + +服务器端的配置如下: + +```shell +buildroot/ -- 源码镜像,直接镜像 buildroot 官方所有包的源码库 + +buildroot-pkgs/ -- 二进制包发布目录 + riscv64/ -- 处理器架构,独立的话方便第三方镜像 + main/2024.02.6/ -- main 用于存放所有 buildroot lts 版本的二进制包(动态编译) + tools/v6.10/ -- tools 用于存放 Linux lts 内核版本下的 tools 二进制包(以静态编译) + rootfs/ -- rootfs 用于存放 rootfs 包 + tinybpt/ + tinybpt-v0.1.0.tar.gz -- tinybpt 二进制包 + aarch64/ + main/2024.02.6/ + tools/v6.10/ + x86_64/ + main/2024.02.6/ + tools/v6.10/ +``` + +## 总结 + +本文介绍了 TinyBPT 以及面向 buildroot 的二进制包管理服务的设计简介与框架。TinyBPT 的设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能,主要包括了主程序、包管理、JSON 文件处理和辅助函数等模块。TinyBPT 的设计思路是通过解析依赖文件,提取出软件包的依赖关系,然后通过 HTTPS 协议下载软件包,最后安装软件包。 + +其他文章将继续介绍客户端和服务端的使用方法。 + +## 参考资料 + +- [TinyBPT](https://gitee.com/tinylab/tinybpt) \ No newline at end of file -- Gitee From e280c445111f81b930f6bb8c44a7f8420a651969 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:03:26 +0800 Subject: [PATCH 03/13] tinybpt-design.md: commit correct result of tinycorrect-tounix Signed-off-by: Petalzu --- articles/20240927-tinybpt-design.md | 471 ++++++++++++++-------------- 1 file changed, 236 insertions(+), 235 deletions(-) diff --git a/articles/20240927-tinybpt-design.md b/articles/20240927-tinybpt-design.md index 8ae2039..a656655 100644 --- a/articles/20240927-tinybpt-design.md +++ b/articles/20240927-tinybpt-design.md @@ -1,236 +1,237 @@ -> Author: 柴子轩
-> Date: 2024/09/27
-> Revisor: falcon
-> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS - -# TinyBPT 和面向 buildroot 的二进制包管理服务 设计简介与框架 - -## 前言 - -在 buildroot 的使用过程中,我们经常会遇到一些问题,比如因为网络链接导致的编译失败,编译时间过长,或者想要使用某些特定软件时需要重新编译整个系统等。 - -本项目旨在解决这些问题,为 buildroot 搭建国内镜像站并新建一套面向 buildroot 的二进制包管理服务。并提供一个简单的、易于使用的 buildroot 包管理工具,[TinyBPT](https://gitee.com/tinylab/tinybpt) 因此诞生了。 - -## 软件源与包管理 - -软件源镜像方法是确认上游源,同步到本地然后设置下载链接配置,还需要给同步程序设置选项使其忽略错误,防止因为某个软件包的链接失效导致整个同步过程失败,也可增加镜像站稳定性。同时,要补充 buildroot 源代码镜像的文档。 - -在搭建镜像站的过程中,一般会确定镜像站的上游源,使用rsync 或者 wget 等工具将上游源的数据同步到镜像站上,然后通过 HTTP 或者 FTP 等协议对外提供服务。添加 buildroot 的镜像源,需要将 buildroot 的软件包源同步到镜像站上,然后通过设置 buildroot 的配置文件,将软件包的下载地址指向镜像站的地址。 - -为了提供一个稳定并可以持续更新的 buildroot 国内镜像源,在[兰州大学开源镜像](https://mirrors.lzu.edu.cn/)站上,我使用 [tsumugu](https://github.com/taoky/tsumugu) 工具同步 buildroot 的官方镜像源,将同步后的数据上传到镜像站上,并对外提供服务。 - -在此基础上,我尝试设计了 buildroot 包管理工具 TinyBPT ,全称为 Tiny Buildroot Packaging Tool ,其设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 - -## 依赖和协议 - -我在调研了一些现有的包管理器,例如apt、yum、dnf、pacman 等后认为,它们都提供了类似的功 -能,但实现方式可能有所不同。例如,apt使用dpkg来管理软件包,而yum使用rpm,等等。 - -在apt实现中,软件包的信息存储在/var/lib/dpkg/status 文件中,这个文件包含了软件包的名称、版本、描述、依赖关系等信息。apt-getupdate 命令会从软件源获取最新的软件包信息,并更新/var/lib/dpkg/status 文件。 - -因此在整个项目中,最核心的部分在于编译后二进制包的依赖问题。首先,buildroot 软件包并没有规范的依赖文件,大多数配置被写在 .mk 以及 .in ,甚至 .in.host 文件中。这就导致了我需要自己去解析这些文件,提取出依赖关系。在通过对配置文件的简单分析后,我认为大部分都可以通过正则表达式来提取依赖关系。 - -在大多数 package 目录下的软件包配置文件中, .mk 文件格式大多不同,解析困难。但在大多数 .hash 文件中却有非常规范的 sha256、包名(含版本号)信息,例如: - -```shell -# Locally calculated after checking pgp signature -sha256 97203a72cae99ab89a067fe2210c1cbf052bc492b479eca7d226d9830883b0bd acl-2.3.2.tar.xz - -# Locally calculated -sha256 a45a845012742796534f7e91fe623262ccfb99460a2bd04015bd28d66fba95b8 doc/COPYING -sha256 01b1f9f2c8ee648a7a596a1abe8aa4ed7899b1c9e5551bda06da6e422b04aa55 doc/COPYING.LGPL -``` - -因此可以直接使用切片函数来获得信息: - -```python -with open(hash_file_path, "r", encoding="utf-8") as hash_file: - lines = hash_file.readlines() - if len(lines) > 1: - line = lines[1].strip() - pos = line.rfind(" ") - if pos != -1 and pos + 1 < len(line): - return line[pos + 1:] -``` - -同样的,大多数 .in 文件也包含着软件包的依赖信息,例如: - -```shell -config BR2_PACKAGE_BASH - bool "bash" - # uses fork() - depends on BR2_USE_MMU - depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS - select BR2_PACKAGE_NCURSES - select BR2_PACKAGE_READLINE -``` - -因此,可以通过正则表达式来提取依赖信息: - -```python -dep_regex = re.compile(r"BR2_PACKAGE_\w+") -``` - -处理提取出的依赖数据等过程则用到了不同的脚本,最终将依赖数据存储在一个 JSON 文件中,以便后续的使用。因为有许多的配置文件并非按照上述格式,所以部分数据可能会有遗漏。 - -协议问题的解决则尤为烦人,因为默认配置编译出的 buildroot 系统中自带 busybox ,其中的 wget 仅支持 http 协议,而大部分的软件包都是通过 https 协议下载的。因此,我需要使 TinyBPT 支持 https 协议的下载,以保证兼容性。我使用了基于 MIT 协议的第三方库 [cpp-httplib](https://github.com/yhirose/cpp-httplib) 支持 HTTPS 传输,并配置 CA certificates extracted from Mozilla 作为 CA 证书。 - -```cpp -httplib::SSLClient cli(mirror_url.c_str()); -cli.set_ca_cert_path("/etc/ssl/certs/cacert.pem"); -``` - -我也使用了 [nlohmann/json](https://github.com/nlohmann/json) 库来处理 JSON 文件。 - -## TinyBPT 基本框架 - -TinyBPT 的结构如下: - - -``` - +-------------------+ +-------------------+ - | | | | - | main.cpp | | utils.cpp | - | | | | - | - Handle CLI args| | - String handling| - | - Call pkg funcs | | - Time retrieval | - | | | - Pkg info lookup| - +---------+---------+ +---------+---------+ - | | - cacert.pem | | - | v v -+---------+---------+ | +---------+---------+ +---------+---------+ -| server | | | | | | -| | v | tinybpt.cpp |<------| json_utils.cpp | -| - Metadata Service|------>| | | | -| - Download Service| | - Install pkg | | - Handle JSON | -| - Package Storage | | - Uninstall pkg | | - List pkgs | -| - Compile Package | | - Download pkg | | - Find pkgs | -| | | - Manage deps | | - Update pkg info| -| | | | | - Read config | -+---------+---------+ +---------+---------+ +---------+---------+ - | | - v v - +---------+---------+ +---------+---------+ - | | | | - | Config struct | | Package struct | <--- tinybpt_db.json - | | | | - | - Mirror URL | | - Name | - | - Version info | | - Version | - | - config.json | | - Info | - | | | - Download time | - | | | - Dependencies | - +-------------------+ +-------------------+ -``` - -- src/ - - main.cpp: 处理命令行参数,调用包管理功能。 - - utils.cpp: 提供字符串处理、时间获取和包信息查找等功能。 - - tinybpt.cpp: 实现包的安装、卸载、下载和依赖管理功能。 - - json_utils.cpp: 处理 JSON 格式的包元数据,读取配置文件。 -- tinybpt_db.json: 存储配置信息,如镜像 URL 和版本信息。 -- cacert.pem: CA 证书,用于安全连接。 - -main.cpp 中的主函数负责处理命令行参数,调用包管理功能,其分析命令行输入的相关参数,然后调用 tinybpt.cpp 中的函数来执行相应的操作。 - -```cpp -int main(int argc, char *argv[]) { - if (argc < 2) { - print_help(); - return 1; - } - ··· -``` - -tinybpt.cpp 中包含了实现 TinyBPT 主要功能的函数。 - -例如函数 download_and_install_package,用于下载并安装指定的软件包。通过 find_version_by_name 查找软件包版本,构建下载地址并指定下载路径。调用 download_package 下载软件包,如果下载失败,输出错误信息并返回。读取软件包信息 read_package_info,遍历 packages 列表,找到匹配的软件包并更新本地信息。 - -```cpp -void download_and_install_package(const std::string &name, const std::string &url) { - std::string version = find_version_by_name(name, db_file); - std::string package_url = url + version + ".tar.gz"; - std::string output_path = download_path + "/" + name + "/"; - bool download_success = download_package(package_url, output_path, name); - if (!download_success) { - std::cerr << "Download and installation failed for package: " << name << std::endl; - return; - } - read_package_info(db_file, "packages"); - for (const auto &pkg : packages) { - if (pkg.name == name) { - update_local_package_info(db_file, pkg); - break; - } - } -} -``` - -因为处理 JSON 文件的操作较为繁琐,所以我将其封装在 json_utils.cpp 中,以便于调用。 - -例如函数 find_package 通过读取数据库文件中的软件包信息,查找并输出指定名称的软件包的详细信息(包括版本、信息和依赖项),如果未找到则输出提示信息。 - -```cpp -void find_package(const std::string &name, const std::string &key) { - read_package_info(db_file, key); - for (const auto &pkg : packages) { - if (pkg.name != name) - continue; - std::cout << "Found package: " << pkg.name << " (" << pkg.version << ")" << std::endl; - std::cout << "Info: " << pkg.info << std::endl; - std::cout << "Dependencies: " << pkg.dependencies << std::endl; - return; - } - std::cout << "Package not found: " << name << std::endl; -} -``` - -utils.cpp 则提供了一些功能相关的辅助函数。 - -例如函数 get_current_time 用于获取当前时间,返回一个格式化的时间字符串。 - -```cpp -std::string get_current_time() { - std::time_t now = std::time(nullptr); - char buf[80]; - std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", std::localtime(&now)); - return std::string(buf); -} -``` - -## 二进制包编译与服务端配置 - -使用 buildroot 的软件包进行交叉编译成 RISC-V 架构的二进制包,则需要借助 buildroot 编译过程中的中间文件,其保存在 output/build/ 目录下。在编译过程中,buildroot 会将软件包的源码下载到 output/build/ 目录下,并在此目录下进行编译。编译完成后,buildroot 会将编译好的二进制包安装到 output/target/ 目录下。 - -基于此,我使用脚本将 output/build/ 目录下编译成功的二进制包 `make install` 到指定目录下,然后将其打包成 tar.gz 文件,并在与配置文件进行对比处理后,上传到服务器上。 - -服务器端的配置如下: - -```shell -buildroot/ -- 源码镜像,直接镜像 buildroot 官方所有包的源码库 - -buildroot-pkgs/ -- 二进制包发布目录 - riscv64/ -- 处理器架构,独立的话方便第三方镜像 - main/2024.02.6/ -- main 用于存放所有 buildroot lts 版本的二进制包(动态编译) - tools/v6.10/ -- tools 用于存放 Linux lts 内核版本下的 tools 二进制包(以静态编译) - rootfs/ -- rootfs 用于存放 rootfs 包 - tinybpt/ - tinybpt-v0.1.0.tar.gz -- tinybpt 二进制包 - aarch64/ - main/2024.02.6/ - tools/v6.10/ - x86_64/ - main/2024.02.6/ - tools/v6.10/ -``` - -## 总结 - -本文介绍了 TinyBPT 以及面向 buildroot 的二进制包管理服务的设计简介与框架。TinyBPT 的设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能,主要包括了主程序、包管理、JSON 文件处理和辅助函数等模块。TinyBPT 的设计思路是通过解析依赖文件,提取出软件包的依赖关系,然后通过 HTTPS 协议下载软件包,最后安装软件包。 - -其他文章将继续介绍客户端和服务端的使用方法。 - -## 参考资料 - +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix]
+> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS + +# TinyBPT 和面向 buildroot 的二进制包管理服务 设计简介与框架 + +## 前言 + +在 buildroot 的使用过程中,我们经常会遇到一些问题,比如因为网络链接导致的编译失败,编译时间过长,或者想要使用某些特定软件时需要重新编译整个系统等。 + +本项目旨在解决这些问题,为 buildroot 搭建国内镜像站并新建一套面向 buildroot 的二进制包管理服务。并提供一个简单的、易于使用的 buildroot 包管理工具,[TinyBPT](https://gitee.com/tinylab/tinybpt) 因此诞生了。 + +## 软件源与包管理 + +软件源镜像方法是确认上游源,同步到本地然后设置下载链接配置,还需要给同步程序设置选项使其忽略错误,防止因为某个软件包的链接失效导致整个同步过程失败,也可增加镜像站稳定性。同时,要补充 buildroot 源代码镜像的文档。 + +在搭建镜像站的过程中,一般会确定镜像站的上游源,使用rsync 或者 wget 等工具将上游源的数据同步到镜像站上,然后通过 HTTP 或者 FTP 等协议对外提供服务。添加 buildroot 的镜像源,需要将 buildroot 的软件包源同步到镜像站上,然后通过设置 buildroot 的配置文件,将软件包的下载地址指向镜像站的地址。 + +为了提供一个稳定并可以持续更新的 buildroot 国内镜像源,在[兰州大学开源镜像](https://mirrors.lzu.edu.cn/)站上,我使用 [tsumugu](https://github.com/taoky/tsumugu) 工具同步 buildroot 的官方镜像源,将同步后的数据上传到镜像站上,并对外提供服务。 + +在此基础上,我尝试设计了 buildroot 包管理工具 TinyBPT ,全称为 Tiny Buildroot Packaging Tool ,其设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 + +## 依赖和协议 + +我在调研了一些现有的包管理器,例如apt、yum、dnf、pacman 等后认为,它们都提供了类似的功 +能,但实现方式可能有所不同。例如,apt使用dpkg来管理软件包,而yum使用rpm,等等。 + +在apt实现中,软件包的信息存储在/var/lib/dpkg/status 文件中,这个文件包含了软件包的名称、版本、描述、依赖关系等信息。apt-getupdate 命令会从软件源获取最新的软件包信息,并更新/var/lib/dpkg/status 文件。 + +因此在整个项目中,最核心的部分在于编译后二进制包的依赖问题。首先,buildroot 软件包并没有规范的依赖文件,大多数配置被写在 .mk 以及 .in ,甚至 .in.host 文件中。这就导致了我需要自己去解析这些文件,提取出依赖关系。在通过对配置文件的简单分析后,我认为大部分都可以通过正则表达式来提取依赖关系。 + +在大多数 package 目录下的软件包配置文件中, .mk 文件格式大多不同,解析困难。但在大多数 .hash 文件中却有非常规范的 sha256、包名(含版本号)信息,例如: + +```shell +# Locally calculated after checking pgp signature +sha256 97203a72cae99ab89a067fe2210c1cbf052bc492b479eca7d226d9830883b0bd acl-2.3.2.tar.xz + +# Locally calculated +sha256 a45a845012742796534f7e91fe623262ccfb99460a2bd04015bd28d66fba95b8 doc/COPYING +sha256 01b1f9f2c8ee648a7a596a1abe8aa4ed7899b1c9e5551bda06da6e422b04aa55 doc/COPYING.LGPL +``` + +因此可以直接使用切片函数来获得信息: + +```python +with open(hash_file_path, "r", encoding="utf-8") as hash_file: + lines = hash_file.readlines() + if len(lines) > 1: + line = lines[1].strip() + pos = line.rfind(" ") + if pos != -1 and pos + 1 < len(line): + return line[pos + 1:] +``` + +同样的,大多数 .in 文件也包含着软件包的依赖信息,例如: + +```shell +config BR2_PACKAGE_BASH + bool "bash" + # uses fork() + depends on BR2_USE_MMU + depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS + select BR2_PACKAGE_NCURSES + select BR2_PACKAGE_READLINE +``` + +因此,可以通过正则表达式来提取依赖信息: + +```python +dep_regex = re.compile(r"BR2_PACKAGE_\w+") +``` + +处理提取出的依赖数据等过程则用到了不同的脚本,最终将依赖数据存储在一个 JSON 文件中,以便后续的使用。因为有许多的配置文件并非按照上述格式,所以部分数据可能会有遗漏。 + +协议问题的解决则尤为烦人,因为默认配置编译出的 buildroot 系统中自带 busybox ,其中的 wget 仅支持 http 协议,而大部分的软件包都是通过 https 协议下载的。因此,我需要使 TinyBPT 支持 https 协议的下载,以保证兼容性。我使用了基于 MIT 协议的第三方库 [cpp-httplib](https://github.com/yhirose/cpp-httplib) 支持 HTTPS 传输,并配置 CA certificates extracted from Mozilla 作为 CA 证书。 + +```cpp +httplib::SSLClient cli(mirror_url.c_str()); +cli.set_ca_cert_path("/etc/ssl/certs/cacert.pem"); +``` + +我也使用了 [nlohmann/json](https://github.com/nlohmann/json) 库来处理 JSON 文件。 + +## TinyBPT 基本框架 + +TinyBPT 的结构如下: + + +``` + +-------------------+ +-------------------+ + | | | | + | main.cpp | | utils.cpp | + | | | | + | - Handle CLI args| | - String handling| + | - Call pkg funcs | | - Time retrieval | + | | | - Pkg info lookup| + +---------+---------+ +---------+---------+ + | | + cacert.pem | | + | v v ++---------+---------+ | +---------+---------+ +---------+---------+ +| server | | | | | | +| | v | tinybpt.cpp |<------| json_utils.cpp | +| - Metadata Service|------>| | | | +| - Download Service| | - Install pkg | | - Handle JSON | +| - Package Storage | | - Uninstall pkg | | - List pkgs | +| - Compile Package | | - Download pkg | | - Find pkgs | +| | | - Manage deps | | - Update pkg info| +| | | | | - Read config | ++---------+---------+ +---------+---------+ +---------+---------+ + | | + v v + +---------+---------+ +---------+---------+ + | | | | + | Config struct | | Package struct | <--- tinybpt_db.json + | | | | + | - Mirror URL | | - Name | + | - Version info | | - Version | + | - config.json | | - Info | + | | | - Download time | + | | | - Dependencies | + +-------------------+ +-------------------+ +``` + +- src/ + - main.cpp: 处理命令行参数,调用包管理功能。 + - utils.cpp: 提供字符串处理、时间获取和包信息查找等功能。 + - tinybpt.cpp: 实现包的安装、卸载、下载和依赖管理功能。 + - json_utils.cpp: 处理 JSON 格式的包元数据,读取配置文件。 +- tinybpt_db.json: 存储配置信息,如镜像 URL 和版本信息。 +- cacert.pem: CA 证书,用于安全连接。 + +main.cpp 中的主函数负责处理命令行参数,调用包管理功能,其分析命令行输入的相关参数,然后调用 tinybpt.cpp 中的函数来执行相应的操作。 + +```cpp +int main(int argc, char *argv[]) { + if (argc < 2) { + print_help(); + return 1; + } + ··· +``` + +tinybpt.cpp 中包含了实现 TinyBPT 主要功能的函数。 + +例如函数 download_and_install_package,用于下载并安装指定的软件包。通过 find_version_by_name 查找软件包版本,构建下载地址并指定下载路径。调用 download_package 下载软件包,如果下载失败,输出错误信息并返回。读取软件包信息 read_package_info,遍历 packages 列表,找到匹配的软件包并更新本地信息。 + +```cpp +void download_and_install_package(const std::string &name, const std::string &url) { + std::string version = find_version_by_name(name, db_file); + std::string package_url = url + version + ".tar.gz"; + std::string output_path = download_path + "/" + name + "/"; + bool download_success = download_package(package_url, output_path, name); + if (!download_success) { + std::cerr << "Download and installation failed for package: " << name << std::endl; + return; + } + read_package_info(db_file, "packages"); + for (const auto &pkg : packages) { + if (pkg.name == name) { + update_local_package_info(db_file, pkg); + break; + } + } +} +``` + +因为处理 JSON 文件的操作较为繁琐,所以我将其封装在 json_utils.cpp 中,以便于调用。 + +例如函数 find_package 通过读取数据库文件中的软件包信息,查找并输出指定名称的软件包的详细信息(包括版本、信息和依赖项),如果未找到则输出提示信息。 + +```cpp +void find_package(const std::string &name, const std::string &key) { + read_package_info(db_file, key); + for (const auto &pkg : packages) { + if (pkg.name != name) + continue; + std::cout << "Found package: " << pkg.name << " (" << pkg.version << ")" << std::endl; + std::cout << "Info: " << pkg.info << std::endl; + std::cout << "Dependencies: " << pkg.dependencies << std::endl; + return; + } + std::cout << "Package not found: " << name << std::endl; +} +``` + +utils.cpp 则提供了一些功能相关的辅助函数。 + +例如函数 get_current_time 用于获取当前时间,返回一个格式化的时间字符串。 + +```cpp +std::string get_current_time() { + std::time_t now = std::time(nullptr); + char buf[80]; + std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", std::localtime(&now)); + return std::string(buf); +} +``` + +## 二进制包编译与服务端配置 + +使用 buildroot 的软件包进行交叉编译成 RISC-V 架构的二进制包,则需要借助 buildroot 编译过程中的中间文件,其保存在 output/build/ 目录下。在编译过程中,buildroot 会将软件包的源码下载到 output/build/ 目录下,并在此目录下进行编译。编译完成后,buildroot 会将编译好的二进制包安装到 output/target/ 目录下。 + +基于此,我使用脚本将 output/build/ 目录下编译成功的二进制包 `make install` 到指定目录下,然后将其打包成 tar.gz 文件,并在与配置文件进行对比处理后,上传到服务器上。 + +服务器端的配置如下: + +```shell +buildroot/ -- 源码镜像,直接镜像 buildroot 官方所有包的源码库 + +buildroot-pkgs/ -- 二进制包发布目录 + riscv64/ -- 处理器架构,独立的话方便第三方镜像 + main/2024.02.6/ -- main 用于存放所有 buildroot lts 版本的二进制包(动态编译) + tools/v6.10/ -- tools 用于存放 Linux lts 内核版本下的 tools 二进制包(以静态编译) + rootfs/ -- rootfs 用于存放 rootfs 包 + tinybpt/ + tinybpt-v0.1.0.tar.gz -- tinybpt 二进制包 + aarch64/ + main/2024.02.6/ + tools/v6.10/ + x86_64/ + main/2024.02.6/ + tools/v6.10/ +``` + +## 总结 + +本文介绍了 TinyBPT 以及面向 buildroot 的二进制包管理服务的设计简介与框架。TinyBPT 的设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能,主要包括了主程序、包管理、JSON 文件处理和辅助函数等模块。TinyBPT 的设计思路是通过解析依赖文件,提取出软件包的依赖关系,然后通过 HTTPS 协议下载软件包,最后安装软件包。 + +其他文章将继续介绍客户端和服务端的使用方法。 + +## 参考资料 + - [TinyBPT](https://gitee.com/tinylab/tinybpt) \ No newline at end of file -- Gitee From fcf98279207cdda1d1c3d3ab655ebc233e9bd2e8 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:03:48 +0800 Subject: [PATCH 04/13] tinybpt-design.md: commit correct result of tinycorrect-spaces Signed-off-by: Petalzu --- articles/20240927-tinybpt-design.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/articles/20240927-tinybpt-design.md b/articles/20240927-tinybpt-design.md index a656655..d37e49a 100644 --- a/articles/20240927-tinybpt-design.md +++ b/articles/20240927-tinybpt-design.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces]
> Author: 柴子轩
> Date: 2024/09/27
> Revisor: falcon
@@ -21,7 +21,7 @@ 为了提供一个稳定并可以持续更新的 buildroot 国内镜像源,在[兰州大学开源镜像](https://mirrors.lzu.edu.cn/)站上,我使用 [tsumugu](https://github.com/taoky/tsumugu) 工具同步 buildroot 的官方镜像源,将同步后的数据上传到镜像站上,并对外提供服务。 -在此基础上,我尝试设计了 buildroot 包管理工具 TinyBPT ,全称为 Tiny Buildroot Packaging Tool ,其设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 +在此基础上,我尝试设计了 buildroot 包管理工具 TinyBPT,全称为 Tiny Buildroot Packaging Tool,其设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 ## 依赖和协议 @@ -30,9 +30,9 @@ 在apt实现中,软件包的信息存储在/var/lib/dpkg/status 文件中,这个文件包含了软件包的名称、版本、描述、依赖关系等信息。apt-getupdate 命令会从软件源获取最新的软件包信息,并更新/var/lib/dpkg/status 文件。 -因此在整个项目中,最核心的部分在于编译后二进制包的依赖问题。首先,buildroot 软件包并没有规范的依赖文件,大多数配置被写在 .mk 以及 .in ,甚至 .in.host 文件中。这就导致了我需要自己去解析这些文件,提取出依赖关系。在通过对配置文件的简单分析后,我认为大部分都可以通过正则表达式来提取依赖关系。 +因此在整个项目中,最核心的部分在于编译后二进制包的依赖问题。首先,buildroot 软件包并没有规范的依赖文件,大多数配置被写在 .mk 以及 .in,甚至 .in.host 文件中。这就导致了我需要自己去解析这些文件,提取出依赖关系。在通过对配置文件的简单分析后,我认为大部分都可以通过正则表达式来提取依赖关系。 -在大多数 package 目录下的软件包配置文件中, .mk 文件格式大多不同,解析困难。但在大多数 .hash 文件中却有非常规范的 sha256、包名(含版本号)信息,例如: +在大多数 package 目录下的软件包配置文件中,.mk 文件格式大多不同,解析困难。但在大多数 .hash 文件中却有非常规范的 sha256、包名(含版本号)信息,例如: ```shell # Locally calculated after checking pgp signature @@ -75,7 +75,7 @@ dep_regex = re.compile(r"BR2_PACKAGE_\w+") 处理提取出的依赖数据等过程则用到了不同的脚本,最终将依赖数据存储在一个 JSON 文件中,以便后续的使用。因为有许多的配置文件并非按照上述格式,所以部分数据可能会有遗漏。 -协议问题的解决则尤为烦人,因为默认配置编译出的 buildroot 系统中自带 busybox ,其中的 wget 仅支持 http 协议,而大部分的软件包都是通过 https 协议下载的。因此,我需要使 TinyBPT 支持 https 协议的下载,以保证兼容性。我使用了基于 MIT 协议的第三方库 [cpp-httplib](https://github.com/yhirose/cpp-httplib) 支持 HTTPS 传输,并配置 CA certificates extracted from Mozilla 作为 CA 证书。 +协议问题的解决则尤为烦人,因为默认配置编译出的 buildroot 系统中自带 busybox,其中的 wget 仅支持 http 协议,而大部分的软件包都是通过 https 协议下载的。因此,我需要使 TinyBPT 支持 https 协议的下载,以保证兼容性。我使用了基于 MIT 协议的第三方库 [cpp-httplib](https://github.com/yhirose/cpp-httplib) 支持 HTTPS 传输,并配置 CA certificates extracted from Mozilla 作为 CA 证书。 ```cpp httplib::SSLClient cli(mirror_url.c_str()); @@ -88,7 +88,6 @@ cli.set_ca_cert_path("/etc/ssl/certs/cacert.pem"); TinyBPT 的结构如下: - ``` +-------------------+ +-------------------+ | | | | @@ -234,4 +233,4 @@ buildroot-pkgs/ -- 二进制包发布目录 ## 参考资料 -- [TinyBPT](https://gitee.com/tinylab/tinybpt) \ No newline at end of file +- [TinyBPT](https://gitee.com/tinylab/tinybpt) -- Gitee From 29daf7a8427eb00cba86418e5d84510a566368c5 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:03:53 +0800 Subject: [PATCH 05/13] tinybpt-design.md: commit correct result of tinycorrect-header Signed-off-by: Petalzu --- articles/20240927-tinybpt-design.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/articles/20240927-tinybpt-design.md b/articles/20240927-tinybpt-design.md index d37e49a..27b43ab 100644 --- a/articles/20240927-tinybpt-design.md +++ b/articles/20240927-tinybpt-design.md @@ -1,9 +1,9 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces]
-> Author: 柴子轩
-> Date: 2024/09/27
-> Revisor: falcon
-> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces header]
+> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS # TinyBPT 和面向 buildroot 的二进制包管理服务 设计简介与框架 -- Gitee From 6dbd671c3516b3f3dacd964996ff2ec34796dcc6 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:05:39 +0800 Subject: [PATCH 06/13] Update 20240927-tinybpt-client-usage.md --- articles/20240927-tinybpt-client-usage.md | 146 +++++++++++++++++++++- 1 file changed, 145 insertions(+), 1 deletion(-) diff --git a/articles/20240927-tinybpt-client-usage.md b/articles/20240927-tinybpt-client-usage.md index ded72a1..555382f 100644 --- a/articles/20240927-tinybpt-client-usage.md +++ b/articles/20240927-tinybpt-client-usage.md @@ -2,4 +2,148 @@ > Date: 2024/09/27
> Revisor: falcon
> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS \ No newline at end of file +> Sponsor: PLCT Lab, ISCAS + +# TinyBPT 和面向 buildroot 的二进制包管理服务 客户端说明 + +## 前言 + +TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 + +本文档主要介绍 TinyBPT 客户端的使用。 + +## 安装方法 + +如果要在 `buildroot` 构建的子系统中直接安装,则需要在主机下载后通过构建本地 `HTTP` 服务的方式提供给子系统下载。(如果在构建系统时已经配置了 `HTTPS` 相关服务,则可以直接使用 `HTTPS` 服务下载。) + +默认下载为 RISC-V 64 位的版本,下载后解压到 `/` 目录下即可。 + +本地编译则需要先编译 `OpenSSL`,下载源码后执行如下命令: + +```shell +./Configure linux64-riscv64 no-zlib no-rc2 no-idea no-des no-bf no-cast no-md2 no-mdc2 no-dh no-err no-rc5 no-camellia no-seed no-tests -static --prefix=/usr/local/openssl/riscv64 --cross-compile-prefix=riscv64-linux-gnu- -flto + +make -j$(nproc) +make install_sw +``` + +使用 `no-*` 的配置选项目的是禁用多个加密算法和功能,以减少库的体积和依赖,并使用 `-flto` 启用链接时优化(Link Time Optimization),以提高生成代码的性能。 + +如果这些流程均在主机(非 `riscv` 机器)中完成,则需要将编译好的二进制文件,依赖文件和 `CA` 证书移动到嵌入式设备(`riscv` 机器)中。 + +如果是以调试为目的,可以使用 `ARCH=x86_64` 选项进行编译,或者使用 `CMake` 。编译完成后,只需要将依赖文件移动到相应位置,或者在环境变量中设置 `TINYBPT_DB_PATH` 。 + +### 直接安装 + +```shell +wget https://mirrors.lzu.edu.cn/buildroot-pkgs/riscv64/tinybpt/tinybpt-v0.1-rc1.tar.gz +mkdir -p /etc/tinybpt && mkdir -p /etc/ssl/certs +tar -xvf tinybpt-v0.1-rc1.tar.gz -C / +``` + +### 本地 Makefile 编译安装 + +移动到 `tinybpt` 目录下,执行如下命令: + +```shell +make ARCH=riscv64 -j$(nproc) +``` + +```shell +git clone https://gitee.com/tinylab/tinybpt.git +cd tinybpt +wget https://curl.se/ca/cacert.pem +make +make install +``` + +### 本地 CMake 编译安装 + +同上,先编译 `OpenSSL`,然后执行如下命令: + +```shell +git clone https://gitee.com/tinylab/tinybpt.git tinybpt +cmake -S tinybpt + -B build \ + -G Ninja +ninja -C build +ninja -C tinybpt/build install +``` + +### 使用环境变量指定依赖和下载路径(可选) + +默认情况下,TinyBPT 会将依赖和下载的文件存储在 `/etc/tinybpt` 和 `/var/cache/tinybpt` 目录下,如果需要指定其他路径,可以使用环境变量 `TINYBPT_DB_PATH` 和 `TINYBPT_DOWNLOAD_PATH`。 + +```shell +export TINYBPT_DB_PATH=/tinybpt_db.json +export TINYBPT_DOWNLOAD_PATH= +``` + +## 使用方法 + +```shell +# tinybpt +Tiny buildroot packaging tool + +Usage: tinybpt [options] + +Commands: + install Install package + uninstall [-f] Uninstall package (use -f to force uninstall) + list -all/-installed List all/installed packages + find Find package + +Options: + -h, -help + Show help information + -V, -version + Show version information + -set-mirror Set mirror URL + -get-mirror Show mirror URL +``` + +## 基本操作 + +使用 `tinybpt install/uninstall/list/find ` 进行包的安装、卸载、查找、列出操作。 + +```shell +# 安装包 +tinybpt install + +# 卸载包 +tinybpt uninstall + +# 列出所有包 +tinybpt list -all + +# 列出已安装的包 +tinybpt list -installed + +# 查找包 +tinybpt find + +# 设置镜像 URL +tinybpt -set-mirror + +# 获取镜像 URL +tinybpt -get-mirror + +# 显示帮助信息 +tinybpt -h + +# 显示版本信息 +tinybpt -V +``` + +## 其他说明 + +- 本工具仅支持 riscv64 buildroot 用户使用。 +- 本工具使用 CA 证书为 CA certificates extracted from Mozilla。 +- 本项目使用了基于 MIT 协议的第三方库 [nlohmann/json][001] 和 [cpp-httplib][002]。 + +## 参考资料 + +- [TinyBPT](https://gitee.com/tinylab/tinybpt) + +[001]: https://github.com/nlohmann/json +[002]: https://github.com/yhirose/cpp-httplib \ No newline at end of file -- Gitee From 6051566eaed39caddd5b404802c2fd83d6ffd09f Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:05:58 +0800 Subject: [PATCH 07/13] tinybpt-client-usage.md: commit correct result of tinycorrect-tounix Signed-off-by: Petalzu --- articles/20240927-tinybpt-client-usage.md | 297 +++++++++++----------- 1 file changed, 149 insertions(+), 148 deletions(-) diff --git a/articles/20240927-tinybpt-client-usage.md b/articles/20240927-tinybpt-client-usage.md index 555382f..8fca52e 100644 --- a/articles/20240927-tinybpt-client-usage.md +++ b/articles/20240927-tinybpt-client-usage.md @@ -1,149 +1,150 @@ -> Author: 柴子轩
-> Date: 2024/09/27
-> Revisor: falcon
-> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS - -# TinyBPT 和面向 buildroot 的二进制包管理服务 客户端说明 - -## 前言 - -TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 - -本文档主要介绍 TinyBPT 客户端的使用。 - -## 安装方法 - -如果要在 `buildroot` 构建的子系统中直接安装,则需要在主机下载后通过构建本地 `HTTP` 服务的方式提供给子系统下载。(如果在构建系统时已经配置了 `HTTPS` 相关服务,则可以直接使用 `HTTPS` 服务下载。) - -默认下载为 RISC-V 64 位的版本,下载后解压到 `/` 目录下即可。 - -本地编译则需要先编译 `OpenSSL`,下载源码后执行如下命令: - -```shell -./Configure linux64-riscv64 no-zlib no-rc2 no-idea no-des no-bf no-cast no-md2 no-mdc2 no-dh no-err no-rc5 no-camellia no-seed no-tests -static --prefix=/usr/local/openssl/riscv64 --cross-compile-prefix=riscv64-linux-gnu- -flto - -make -j$(nproc) -make install_sw -``` - -使用 `no-*` 的配置选项目的是禁用多个加密算法和功能,以减少库的体积和依赖,并使用 `-flto` 启用链接时优化(Link Time Optimization),以提高生成代码的性能。 - -如果这些流程均在主机(非 `riscv` 机器)中完成,则需要将编译好的二进制文件,依赖文件和 `CA` 证书移动到嵌入式设备(`riscv` 机器)中。 - -如果是以调试为目的,可以使用 `ARCH=x86_64` 选项进行编译,或者使用 `CMake` 。编译完成后,只需要将依赖文件移动到相应位置,或者在环境变量中设置 `TINYBPT_DB_PATH` 。 - -### 直接安装 - -```shell -wget https://mirrors.lzu.edu.cn/buildroot-pkgs/riscv64/tinybpt/tinybpt-v0.1-rc1.tar.gz -mkdir -p /etc/tinybpt && mkdir -p /etc/ssl/certs -tar -xvf tinybpt-v0.1-rc1.tar.gz -C / -``` - -### 本地 Makefile 编译安装 - -移动到 `tinybpt` 目录下,执行如下命令: - -```shell -make ARCH=riscv64 -j$(nproc) -``` - -```shell -git clone https://gitee.com/tinylab/tinybpt.git -cd tinybpt -wget https://curl.se/ca/cacert.pem -make -make install -``` - -### 本地 CMake 编译安装 - -同上,先编译 `OpenSSL`,然后执行如下命令: - -```shell -git clone https://gitee.com/tinylab/tinybpt.git tinybpt -cmake -S tinybpt - -B build \ - -G Ninja -ninja -C build -ninja -C tinybpt/build install -``` - -### 使用环境变量指定依赖和下载路径(可选) - -默认情况下,TinyBPT 会将依赖和下载的文件存储在 `/etc/tinybpt` 和 `/var/cache/tinybpt` 目录下,如果需要指定其他路径,可以使用环境变量 `TINYBPT_DB_PATH` 和 `TINYBPT_DOWNLOAD_PATH`。 - -```shell -export TINYBPT_DB_PATH=/tinybpt_db.json -export TINYBPT_DOWNLOAD_PATH= -``` - -## 使用方法 - -```shell -# tinybpt -Tiny buildroot packaging tool - -Usage: tinybpt [options] - -Commands: - install Install package - uninstall [-f] Uninstall package (use -f to force uninstall) - list -all/-installed List all/installed packages - find Find package - -Options: - -h, -help - Show help information - -V, -version - Show version information - -set-mirror Set mirror URL - -get-mirror Show mirror URL -``` - -## 基本操作 - -使用 `tinybpt install/uninstall/list/find ` 进行包的安装、卸载、查找、列出操作。 - -```shell -# 安装包 -tinybpt install - -# 卸载包 -tinybpt uninstall - -# 列出所有包 -tinybpt list -all - -# 列出已安装的包 -tinybpt list -installed - -# 查找包 -tinybpt find - -# 设置镜像 URL -tinybpt -set-mirror - -# 获取镜像 URL -tinybpt -get-mirror - -# 显示帮助信息 -tinybpt -h - -# 显示版本信息 -tinybpt -V -``` - -## 其他说明 - -- 本工具仅支持 riscv64 buildroot 用户使用。 -- 本工具使用 CA 证书为 CA certificates extracted from Mozilla。 -- 本项目使用了基于 MIT 协议的第三方库 [nlohmann/json][001] 和 [cpp-httplib][002]。 - -## 参考资料 - -- [TinyBPT](https://gitee.com/tinylab/tinybpt) - -[001]: https://github.com/nlohmann/json +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix]
+> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS + +# TinyBPT 和面向 buildroot 的二进制包管理服务 客户端说明 + +## 前言 + +TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 + +本文档主要介绍 TinyBPT 客户端的使用。 + +## 安装方法 + +如果要在 `buildroot` 构建的子系统中直接安装,则需要在主机下载后通过构建本地 `HTTP` 服务的方式提供给子系统下载。(如果在构建系统时已经配置了 `HTTPS` 相关服务,则可以直接使用 `HTTPS` 服务下载。) + +默认下载为 RISC-V 64 位的版本,下载后解压到 `/` 目录下即可。 + +本地编译则需要先编译 `OpenSSL`,下载源码后执行如下命令: + +```shell +./Configure linux64-riscv64 no-zlib no-rc2 no-idea no-des no-bf no-cast no-md2 no-mdc2 no-dh no-err no-rc5 no-camellia no-seed no-tests -static --prefix=/usr/local/openssl/riscv64 --cross-compile-prefix=riscv64-linux-gnu- -flto + +make -j$(nproc) +make install_sw +``` + +使用 `no-*` 的配置选项目的是禁用多个加密算法和功能,以减少库的体积和依赖,并使用 `-flto` 启用链接时优化(Link Time Optimization),以提高生成代码的性能。 + +如果这些流程均在主机(非 `riscv` 机器)中完成,则需要将编译好的二进制文件,依赖文件和 `CA` 证书移动到嵌入式设备(`riscv` 机器)中。 + +如果是以调试为目的,可以使用 `ARCH=x86_64` 选项进行编译,或者使用 `CMake` 。编译完成后,只需要将依赖文件移动到相应位置,或者在环境变量中设置 `TINYBPT_DB_PATH` 。 + +### 直接安装 + +```shell +wget https://mirrors.lzu.edu.cn/buildroot-pkgs/riscv64/tinybpt/tinybpt-v0.1-rc1.tar.gz +mkdir -p /etc/tinybpt && mkdir -p /etc/ssl/certs +tar -xvf tinybpt-v0.1-rc1.tar.gz -C / +``` + +### 本地 Makefile 编译安装 + +移动到 `tinybpt` 目录下,执行如下命令: + +```shell +make ARCH=riscv64 -j$(nproc) +``` + +```shell +git clone https://gitee.com/tinylab/tinybpt.git +cd tinybpt +wget https://curl.se/ca/cacert.pem +make +make install +``` + +### 本地 CMake 编译安装 + +同上,先编译 `OpenSSL`,然后执行如下命令: + +```shell +git clone https://gitee.com/tinylab/tinybpt.git tinybpt +cmake -S tinybpt + -B build \ + -G Ninja +ninja -C build +ninja -C tinybpt/build install +``` + +### 使用环境变量指定依赖和下载路径(可选) + +默认情况下,TinyBPT 会将依赖和下载的文件存储在 `/etc/tinybpt` 和 `/var/cache/tinybpt` 目录下,如果需要指定其他路径,可以使用环境变量 `TINYBPT_DB_PATH` 和 `TINYBPT_DOWNLOAD_PATH`。 + +```shell +export TINYBPT_DB_PATH=/tinybpt_db.json +export TINYBPT_DOWNLOAD_PATH= +``` + +## 使用方法 + +```shell +# tinybpt +Tiny buildroot packaging tool + +Usage: tinybpt [options] + +Commands: + install Install package + uninstall [-f] Uninstall package (use -f to force uninstall) + list -all/-installed List all/installed packages + find Find package + +Options: + -h, -help + Show help information + -V, -version + Show version information + -set-mirror Set mirror URL + -get-mirror Show mirror URL +``` + +## 基本操作 + +使用 `tinybpt install/uninstall/list/find ` 进行包的安装、卸载、查找、列出操作。 + +```shell +# 安装包 +tinybpt install + +# 卸载包 +tinybpt uninstall + +# 列出所有包 +tinybpt list -all + +# 列出已安装的包 +tinybpt list -installed + +# 查找包 +tinybpt find + +# 设置镜像 URL +tinybpt -set-mirror + +# 获取镜像 URL +tinybpt -get-mirror + +# 显示帮助信息 +tinybpt -h + +# 显示版本信息 +tinybpt -V +``` + +## 其他说明 + +- 本工具仅支持 riscv64 buildroot 用户使用。 +- 本工具使用 CA 证书为 CA certificates extracted from Mozilla。 +- 本项目使用了基于 MIT 协议的第三方库 [nlohmann/json][001] 和 [cpp-httplib][002]。 + +## 参考资料 + +- [TinyBPT](https://gitee.com/tinylab/tinybpt) + +[001]: https://github.com/nlohmann/json [002]: https://github.com/yhirose/cpp-httplib \ No newline at end of file -- Gitee From 1dda29e16880083ae3c2f65b6d79e2c111347f6e Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:06:27 +0800 Subject: [PATCH 08/13] Update 20240927-tinybpt-server-usage.md --- articles/20240927-tinybpt-server-usage.md | 94 ++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/articles/20240927-tinybpt-server-usage.md b/articles/20240927-tinybpt-server-usage.md index ded72a1..5f71dff 100644 --- a/articles/20240927-tinybpt-server-usage.md +++ b/articles/20240927-tinybpt-server-usage.md @@ -2,4 +2,96 @@ > Date: 2024/09/27
> Revisor: falcon
> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS \ No newline at end of file +> Sponsor: PLCT Lab, ISCAS + +# TinyBPT 和面向 buildroot 的二进制包管理服务 服务端说明 + +## 前言 + +TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 + +本文档主要介绍为了向 TinyBPT 提供服务,服务端的配置和使用。 + +## 在服务器端配置 buildroot 源码 + +### 使用工具 tsumugu 来更新源 + +```shell +wget https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Ftaoky%2Ftsumugu +``` + +配置运行脚本: + +```shell +RUST_LOG=Error /usr/local/bin/tsumugu sync --parser lighttpd http://sources.buildroot.net /mnt/tank2/buildroot +``` + +在网页设置中添加定时任务,每天更新一次,并将其路径展示在网页上,以 nginx 为例: + +```shell +server { +··· + + location ~* ^/(bmclapi|ubuntu|centos|debian-security|debian|archlinux|archlinuxcn|debian-nonfree|gentoo|manjaro|opensuse|ubuntukylin|wepe|cygwin|debian-cd|debian-multimedia|deepin-cd|openeuler|rpmfusion|ubuntukylin-cdimage|almalinux|buildroot|buildroot-pkgs|epel|rocky|radxa-apt|debian-ports) { + include /etc/nginx/config.d/backend.conf; + include /etc/nginx/config.d/cache.conf; + } +··· +``` + +## 二进制包 + +### 二进制包源 + +目前,二进制包在 `https://mirrors.lzu.edu.cn/buildroot-pkgs` 已经开始提供。 + +### 目录结构 + +```shell +buildroot/ -- 源码镜像,直接镜像 buildroot 官方所有包的源码库 + +buildroot-pkgs/ -- 二进制包发布目录 + riscv64/ -- 处理器架构,独立的话方便第三方镜像 + main/2024.02.6/ -- main 用于存放所有 buildroot lts 版本的二进制包(动态编译) + tools/v6.10/ -- tools 用于存放 Linux lts 内核版本下的 tools 二进制包(以静态编译) + rootfs/ -- rootfs 用于存放 rootfs 包 + tinybpt/ + tinybpt-v0.1.0.tar.gz -- tinybpt 二进制包 + aarch64/ + main/2024.02.6/ + tools/v6.10/ + x86_64/ + main/2024.02.6/ + tools/v6.10/ +``` + +### 编译选项 + +如果要自行编译,编译配置在 TinyBPT 仓库的 `/web/settings/.config` 中,使用编译配置替换原有配置,或使用 `make menuconfig` 自行勾选需要编译的包。 + +```shell +cd buildroot +make -j$(nproc) +``` + +### 二进制包的发布 + +完成后,进入 `output/build` 目录,运行 `web/script/install.sh` 脚本,将编译好的二进制包打包到 `/mnt/tinybpt` 目录下。 + +将打包目录下的所有文件名列出到 `deploy-pkgs-version.txt` 文件中,确保已有依赖文件 `packages.json` 也在运行目录下,运行 `web/script/compare.py` 脚本和 `web/script/del.py` 脚本,对比和删除不必要的包,更新依赖文件。 + +注意:二进制包的编译和发布方式会导致某些包无法编译,原因在于目录结构不同等。 + +### 提醒事项 + +为了解决编译中的问题,我们需要在编译前进行一些配置,例如目前已发现的: + +1. Buildroot 无法编译 host-heimdal,问题是heimdal的配置脚本使用了已被删除的变量,需要手动修改,在 `buildroot-2024.02.6/package/heimdal/heimdal.mk` 文件中,将 `ac_cv_sys_large_files=1 ac_cv_sys_file_offset_bits=64` 添加到 `HOST_HEIMDAL_CONF_ENV` 变量中。 + +软件源码包大小约为 468 GB。 + +编译后的 RISC-V 二进制包大小约为 12 GB。 + +## 参考资料 + +- [TinyBPT](https://gitee.com/tinylab/tinybpt) \ No newline at end of file -- Gitee From ee908b7b1607134c6ffca5702aa8daa304e29551 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:06:40 +0800 Subject: [PATCH 09/13] tinybpt-server-usage.md: commit correct result of tinycorrect-tounix Signed-off-by: Petalzu --- articles/20240927-tinybpt-server-usage.md | 193 +++++++++++----------- 1 file changed, 97 insertions(+), 96 deletions(-) diff --git a/articles/20240927-tinybpt-server-usage.md b/articles/20240927-tinybpt-server-usage.md index 5f71dff..a02c374 100644 --- a/articles/20240927-tinybpt-server-usage.md +++ b/articles/20240927-tinybpt-server-usage.md @@ -1,97 +1,98 @@ -> Author: 柴子轩
-> Date: 2024/09/27
-> Revisor: falcon
-> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS - -# TinyBPT 和面向 buildroot 的二进制包管理服务 服务端说明 - -## 前言 - -TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 - -本文档主要介绍为了向 TinyBPT 提供服务,服务端的配置和使用。 - -## 在服务器端配置 buildroot 源码 - -### 使用工具 tsumugu 来更新源 - -```shell -wget https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Ftaoky%2Ftsumugu -``` - -配置运行脚本: - -```shell -RUST_LOG=Error /usr/local/bin/tsumugu sync --parser lighttpd http://sources.buildroot.net /mnt/tank2/buildroot -``` - -在网页设置中添加定时任务,每天更新一次,并将其路径展示在网页上,以 nginx 为例: - -```shell -server { -··· - - location ~* ^/(bmclapi|ubuntu|centos|debian-security|debian|archlinux|archlinuxcn|debian-nonfree|gentoo|manjaro|opensuse|ubuntukylin|wepe|cygwin|debian-cd|debian-multimedia|deepin-cd|openeuler|rpmfusion|ubuntukylin-cdimage|almalinux|buildroot|buildroot-pkgs|epel|rocky|radxa-apt|debian-ports) { - include /etc/nginx/config.d/backend.conf; - include /etc/nginx/config.d/cache.conf; - } -··· -``` - -## 二进制包 - -### 二进制包源 - -目前,二进制包在 `https://mirrors.lzu.edu.cn/buildroot-pkgs` 已经开始提供。 - -### 目录结构 - -```shell -buildroot/ -- 源码镜像,直接镜像 buildroot 官方所有包的源码库 - -buildroot-pkgs/ -- 二进制包发布目录 - riscv64/ -- 处理器架构,独立的话方便第三方镜像 - main/2024.02.6/ -- main 用于存放所有 buildroot lts 版本的二进制包(动态编译) - tools/v6.10/ -- tools 用于存放 Linux lts 内核版本下的 tools 二进制包(以静态编译) - rootfs/ -- rootfs 用于存放 rootfs 包 - tinybpt/ - tinybpt-v0.1.0.tar.gz -- tinybpt 二进制包 - aarch64/ - main/2024.02.6/ - tools/v6.10/ - x86_64/ - main/2024.02.6/ - tools/v6.10/ -``` - -### 编译选项 - -如果要自行编译,编译配置在 TinyBPT 仓库的 `/web/settings/.config` 中,使用编译配置替换原有配置,或使用 `make menuconfig` 自行勾选需要编译的包。 - -```shell -cd buildroot -make -j$(nproc) -``` - -### 二进制包的发布 - -完成后,进入 `output/build` 目录,运行 `web/script/install.sh` 脚本,将编译好的二进制包打包到 `/mnt/tinybpt` 目录下。 - -将打包目录下的所有文件名列出到 `deploy-pkgs-version.txt` 文件中,确保已有依赖文件 `packages.json` 也在运行目录下,运行 `web/script/compare.py` 脚本和 `web/script/del.py` 脚本,对比和删除不必要的包,更新依赖文件。 - -注意:二进制包的编译和发布方式会导致某些包无法编译,原因在于目录结构不同等。 - -### 提醒事项 - -为了解决编译中的问题,我们需要在编译前进行一些配置,例如目前已发现的: - -1. Buildroot 无法编译 host-heimdal,问题是heimdal的配置脚本使用了已被删除的变量,需要手动修改,在 `buildroot-2024.02.6/package/heimdal/heimdal.mk` 文件中,将 `ac_cv_sys_large_files=1 ac_cv_sys_file_offset_bits=64` 添加到 `HOST_HEIMDAL_CONF_ENV` 变量中。 - -软件源码包大小约为 468 GB。 - -编译后的 RISC-V 二进制包大小约为 12 GB。 - -## 参考资料 - +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix]
+> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS + +# TinyBPT 和面向 buildroot 的二进制包管理服务 服务端说明 + +## 前言 + +TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 + +本文档主要介绍为了向 TinyBPT 提供服务,服务端的配置和使用。 + +## 在服务器端配置 buildroot 源码 + +### 使用工具 tsumugu 来更新源 + +```shell +wget https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Ftaoky%2Ftsumugu +``` + +配置运行脚本: + +```shell +RUST_LOG=Error /usr/local/bin/tsumugu sync --parser lighttpd http://sources.buildroot.net /mnt/tank2/buildroot +``` + +在网页设置中添加定时任务,每天更新一次,并将其路径展示在网页上,以 nginx 为例: + +```shell +server { +··· + + location ~* ^/(bmclapi|ubuntu|centos|debian-security|debian|archlinux|archlinuxcn|debian-nonfree|gentoo|manjaro|opensuse|ubuntukylin|wepe|cygwin|debian-cd|debian-multimedia|deepin-cd|openeuler|rpmfusion|ubuntukylin-cdimage|almalinux|buildroot|buildroot-pkgs|epel|rocky|radxa-apt|debian-ports) { + include /etc/nginx/config.d/backend.conf; + include /etc/nginx/config.d/cache.conf; + } +··· +``` + +## 二进制包 + +### 二进制包源 + +目前,二进制包在 `https://mirrors.lzu.edu.cn/buildroot-pkgs` 已经开始提供。 + +### 目录结构 + +```shell +buildroot/ -- 源码镜像,直接镜像 buildroot 官方所有包的源码库 + +buildroot-pkgs/ -- 二进制包发布目录 + riscv64/ -- 处理器架构,独立的话方便第三方镜像 + main/2024.02.6/ -- main 用于存放所有 buildroot lts 版本的二进制包(动态编译) + tools/v6.10/ -- tools 用于存放 Linux lts 内核版本下的 tools 二进制包(以静态编译) + rootfs/ -- rootfs 用于存放 rootfs 包 + tinybpt/ + tinybpt-v0.1.0.tar.gz -- tinybpt 二进制包 + aarch64/ + main/2024.02.6/ + tools/v6.10/ + x86_64/ + main/2024.02.6/ + tools/v6.10/ +``` + +### 编译选项 + +如果要自行编译,编译配置在 TinyBPT 仓库的 `/web/settings/.config` 中,使用编译配置替换原有配置,或使用 `make menuconfig` 自行勾选需要编译的包。 + +```shell +cd buildroot +make -j$(nproc) +``` + +### 二进制包的发布 + +完成后,进入 `output/build` 目录,运行 `web/script/install.sh` 脚本,将编译好的二进制包打包到 `/mnt/tinybpt` 目录下。 + +将打包目录下的所有文件名列出到 `deploy-pkgs-version.txt` 文件中,确保已有依赖文件 `packages.json` 也在运行目录下,运行 `web/script/compare.py` 脚本和 `web/script/del.py` 脚本,对比和删除不必要的包,更新依赖文件。 + +注意:二进制包的编译和发布方式会导致某些包无法编译,原因在于目录结构不同等。 + +### 提醒事项 + +为了解决编译中的问题,我们需要在编译前进行一些配置,例如目前已发现的: + +1. Buildroot 无法编译 host-heimdal,问题是heimdal的配置脚本使用了已被删除的变量,需要手动修改,在 `buildroot-2024.02.6/package/heimdal/heimdal.mk` 文件中,将 `ac_cv_sys_large_files=1 ac_cv_sys_file_offset_bits=64` 添加到 `HOST_HEIMDAL_CONF_ENV` 变量中。 + +软件源码包大小约为 468 GB。 + +编译后的 RISC-V 二进制包大小约为 12 GB。 + +## 参考资料 + - [TinyBPT](https://gitee.com/tinylab/tinybpt) \ No newline at end of file -- Gitee From 1fe07af2050a065f23448aea4855c3b8890cb45a Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:06:57 +0800 Subject: [PATCH 10/13] tinybpt-server-usage.md: commit correct result of tinycorrect-spaces Signed-off-by: Petalzu --- articles/20240927-tinybpt-server-usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/articles/20240927-tinybpt-server-usage.md b/articles/20240927-tinybpt-server-usage.md index a02c374..e1dab11 100644 --- a/articles/20240927-tinybpt-server-usage.md +++ b/articles/20240927-tinybpt-server-usage.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces]
> Author: 柴子轩
> Date: 2024/09/27
> Revisor: falcon
@@ -95,4 +95,4 @@ make -j$(nproc) ## 参考资料 -- [TinyBPT](https://gitee.com/tinylab/tinybpt) \ No newline at end of file +- [TinyBPT](https://gitee.com/tinylab/tinybpt) -- Gitee From f86f8ae1862db591c5c64d4aa86951c039eb087a Mon Sep 17 00:00:00 2001 From: Petalzu Date: Tue, 22 Oct 2024 19:08:10 +0800 Subject: [PATCH 11/13] Update articles --- articles/20240927-tinybpt-client-usage.md | 6 +++--- articles/20240927-tinybpt-design.md | 18 ++++++++++++------ articles/20240927-tinybpt-server-usage.md | 12 ++++++------ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/articles/20240927-tinybpt-client-usage.md b/articles/20240927-tinybpt-client-usage.md index 8fca52e..14e139d 100644 --- a/articles/20240927-tinybpt-client-usage.md +++ b/articles/20240927-tinybpt-client-usage.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces]
> Author: 柴子轩
> Date: 2024/09/27
> Revisor: falcon
@@ -32,7 +32,7 @@ make install_sw 如果这些流程均在主机(非 `riscv` 机器)中完成,则需要将编译好的二进制文件,依赖文件和 `CA` 证书移动到嵌入式设备(`riscv` 机器)中。 -如果是以调试为目的,可以使用 `ARCH=x86_64` 选项进行编译,或者使用 `CMake` 。编译完成后,只需要将依赖文件移动到相应位置,或者在环境变量中设置 `TINYBPT_DB_PATH` 。 +如果是以调试为目的,可以使用 `ARCH=x86_64` 选项进行编译,或者使用 `CMake`。编译完成后,只需要将依赖文件移动到相应位置,或者在环境变量中设置 `TINYBPT_DB_PATH`。 ### 直接安装 @@ -147,4 +147,4 @@ tinybpt -V - [TinyBPT](https://gitee.com/tinylab/tinybpt) [001]: https://github.com/nlohmann/json -[002]: https://github.com/yhirose/cpp-httplib \ No newline at end of file +[002]: https://github.com/yhirose/cpp-httplib diff --git a/articles/20240927-tinybpt-design.md b/articles/20240927-tinybpt-design.md index 27b43ab..6a8a840 100644 --- a/articles/20240927-tinybpt-design.md +++ b/articles/20240927-tinybpt-design.md @@ -1,4 +1,4 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces header]
+> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces header urls]
> Author: 柴子轩
> Date: 2024/09/27
> Revisor: falcon
@@ -11,7 +11,7 @@ 在 buildroot 的使用过程中,我们经常会遇到一些问题,比如因为网络链接导致的编译失败,编译时间过长,或者想要使用某些特定软件时需要重新编译整个系统等。 -本项目旨在解决这些问题,为 buildroot 搭建国内镜像站并新建一套面向 buildroot 的二进制包管理服务。并提供一个简单的、易于使用的 buildroot 包管理工具,[TinyBPT](https://gitee.com/tinylab/tinybpt) 因此诞生了。 +本项目旨在解决这些问题,为 buildroot 搭建国内镜像站并新建一套面向 buildroot 的二进制包管理服务。并提供一个简单的、易于使用的 buildroot 包管理工具,[TinyBPT][001] 因此诞生了。 ## 软件源与包管理 @@ -19,7 +19,7 @@ 在搭建镜像站的过程中,一般会确定镜像站的上游源,使用rsync 或者 wget 等工具将上游源的数据同步到镜像站上,然后通过 HTTP 或者 FTP 等协议对外提供服务。添加 buildroot 的镜像源,需要将 buildroot 的软件包源同步到镜像站上,然后通过设置 buildroot 的配置文件,将软件包的下载地址指向镜像站的地址。 -为了提供一个稳定并可以持续更新的 buildroot 国内镜像源,在[兰州大学开源镜像](https://mirrors.lzu.edu.cn/)站上,我使用 [tsumugu](https://github.com/taoky/tsumugu) 工具同步 buildroot 的官方镜像源,将同步后的数据上传到镜像站上,并对外提供服务。 +为了提供一个稳定并可以持续更新的 buildroot 国内镜像源,在[兰州大学开源镜像][005]站上,我使用 [tsumugu][003] 工具同步 buildroot 的官方镜像源,将同步后的数据上传到镜像站上,并对外提供服务。 在此基础上,我尝试设计了 buildroot 包管理工具 TinyBPT,全称为 Tiny Buildroot Packaging Tool,其设计初衷是一个 buildroot 的二进制包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 @@ -75,14 +75,14 @@ dep_regex = re.compile(r"BR2_PACKAGE_\w+") 处理提取出的依赖数据等过程则用到了不同的脚本,最终将依赖数据存储在一个 JSON 文件中,以便后续的使用。因为有许多的配置文件并非按照上述格式,所以部分数据可能会有遗漏。 -协议问题的解决则尤为烦人,因为默认配置编译出的 buildroot 系统中自带 busybox,其中的 wget 仅支持 http 协议,而大部分的软件包都是通过 https 协议下载的。因此,我需要使 TinyBPT 支持 https 协议的下载,以保证兼容性。我使用了基于 MIT 协议的第三方库 [cpp-httplib](https://github.com/yhirose/cpp-httplib) 支持 HTTPS 传输,并配置 CA certificates extracted from Mozilla 作为 CA 证书。 +协议问题的解决则尤为烦人,因为默认配置编译出的 buildroot 系统中自带 busybox,其中的 wget 仅支持 http 协议,而大部分的软件包都是通过 https 协议下载的。因此,我需要使 TinyBPT 支持 https 协议的下载,以保证兼容性。我使用了基于 MIT 协议的第三方库 [cpp-httplib][004] 支持 HTTPS 传输,并配置 CA certificates extracted from Mozilla 作为 CA 证书。 ```cpp httplib::SSLClient cli(mirror_url.c_str()); cli.set_ca_cert_path("/etc/ssl/certs/cacert.pem"); ``` -我也使用了 [nlohmann/json](https://github.com/nlohmann/json) 库来处理 JSON 文件。 +我也使用了 [nlohmann/json][002] 库来处理 JSON 文件。 ## TinyBPT 基本框架 @@ -233,4 +233,10 @@ buildroot-pkgs/ -- 二进制包发布目录 ## 参考资料 -- [TinyBPT](https://gitee.com/tinylab/tinybpt) +- [TinyBPT][001] + +[001]: https://gitee.com/tinylab/tinybpt +[002]: https://github.com/nlohmann/json +[003]: https://github.com/taoky/tsumugu +[004]: https://github.com/yhirose/cpp-httplib +[005]: https://mirrors.lzu.edu.cn/ diff --git a/articles/20240927-tinybpt-server-usage.md b/articles/20240927-tinybpt-server-usage.md index e1dab11..9da2a74 100644 --- a/articles/20240927-tinybpt-server-usage.md +++ b/articles/20240927-tinybpt-server-usage.md @@ -1,9 +1,9 @@ -> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces]
-> Author: 柴子轩
-> Date: 2024/09/27
-> Revisor: falcon
-> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
-> Sponsor: PLCT Lab, ISCAS +> Corrector: [TinyCorrect](https://gitee.com/tinylab/tinycorrect) v0.2-rc2 - [tounix spaces header]
+> Author: 柴子轩
+> Date: 2024/09/27
+> Revisor: falcon
+> Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
+> Sponsor: PLCT Lab, ISCAS # TinyBPT 和面向 buildroot 的二进制包管理服务 服务端说明 -- Gitee From 4dd466e07b21012bb001a097bddd7eca097c14f7 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Wed, 23 Oct 2024 18:24:40 +0800 Subject: [PATCH 12/13] Update articles --- articles/20240927-tinybpt-client-usage.md | 4 ++-- articles/20240927-tinybpt-design.md | 15 ++++++++------- articles/20240927-tinybpt-server-usage.md | 12 +++++++----- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/articles/20240927-tinybpt-client-usage.md b/articles/20240927-tinybpt-client-usage.md index 14e139d..cebb7d2 100644 --- a/articles/20240927-tinybpt-client-usage.md +++ b/articles/20240927-tinybpt-client-usage.md @@ -5,13 +5,13 @@ > Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
> Sponsor: PLCT Lab, ISCAS -# TinyBPT 和面向 buildroot 的二进制包管理服务 客户端说明 +# TinyBPT 和面向 buildroot 的二进制包管理服务(2):客户端说明 ## 前言 TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 -本文档主要介绍 TinyBPT 客户端的使用。 +本文档主要介绍 TinyBPT 客户端的使用,其他架构的支持也将陆续开展,敬请期待! ## 安装方法 diff --git a/articles/20240927-tinybpt-design.md b/articles/20240927-tinybpt-design.md index 6a8a840..2ab2caf 100644 --- a/articles/20240927-tinybpt-design.md +++ b/articles/20240927-tinybpt-design.md @@ -5,7 +5,7 @@ > Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
> Sponsor: PLCT Lab, ISCAS -# TinyBPT 和面向 buildroot 的二进制包管理服务 设计简介与框架 +# TinyBPT 和面向 buildroot 的二进制包管理服务(1):设计简介与框架 ## 前言 @@ -17,7 +17,7 @@ 软件源镜像方法是确认上游源,同步到本地然后设置下载链接配置,还需要给同步程序设置选项使其忽略错误,防止因为某个软件包的链接失效导致整个同步过程失败,也可增加镜像站稳定性。同时,要补充 buildroot 源代码镜像的文档。 -在搭建镜像站的过程中,一般会确定镜像站的上游源,使用rsync 或者 wget 等工具将上游源的数据同步到镜像站上,然后通过 HTTP 或者 FTP 等协议对外提供服务。添加 buildroot 的镜像源,需要将 buildroot 的软件包源同步到镜像站上,然后通过设置 buildroot 的配置文件,将软件包的下载地址指向镜像站的地址。 +在搭建镜像站的过程中,一般会确定镜像站的上游源,使用 rsync 或者 wget 等工具将上游源的数据同步到镜像站上,然后通过 HTTP 或者 FTP 等协议对外提供服务。添加 buildroot 的镜像源,需要将 buildroot 的软件包源同步到镜像站上,然后通过设置 buildroot 的配置文件,将软件包的下载地址指向镜像站的地址。 为了提供一个稳定并可以持续更新的 buildroot 国内镜像源,在[兰州大学开源镜像][005]站上,我使用 [tsumugu][003] 工具同步 buildroot 的官方镜像源,将同步后的数据上传到镜像站上,并对外提供服务。 @@ -25,10 +25,10 @@ ## 依赖和协议 -我在调研了一些现有的包管理器,例如apt、yum、dnf、pacman 等后认为,它们都提供了类似的功 -能,但实现方式可能有所不同。例如,apt使用dpkg来管理软件包,而yum使用rpm,等等。 +我在调研了一些现有的包管理器,例如 apt 、 yum 、 dnf 、 pacman 等后认为,它们都提供了类似的功 +能,但实现方式可能有所不同。例如, apt 使用 dpkg 来管理软件包,而 yum 使用 rpm ,等等。 -在apt实现中,软件包的信息存储在/var/lib/dpkg/status 文件中,这个文件包含了软件包的名称、版本、描述、依赖关系等信息。apt-getupdate 命令会从软件源获取最新的软件包信息,并更新/var/lib/dpkg/status 文件。 +在 apt 实现中,软件包的信息存储在 `/var/lib/dpkg/status` 文件中,这个文件包含了软件包的名称、版本、描述、依赖关系等信息。`apt-get update` 命令会从软件源获取最新的软件包信息,并更新 `/var/lib/dpkg/status` 文件。 因此在整个项目中,最核心的部分在于编译后二进制包的依赖问题。首先,buildroot 软件包并没有规范的依赖文件,大多数配置被写在 .mk 以及 .in,甚至 .in.host 文件中。这就导致了我需要自己去解析这些文件,提取出依赖关系。在通过对配置文件的简单分析后,我认为大部分都可以通过正则表达式来提取依赖关系。 @@ -124,6 +124,7 @@ TinyBPT 的结构如下: +-------------------+ +-------------------+ ``` +源码结构说明如下: - src/ - main.cpp: 处理命令行参数,调用包管理功能。 - utils.cpp: 提供字符串处理、时间获取和包信息查找等功能。 @@ -201,9 +202,9 @@ std::string get_current_time() { ## 二进制包编译与服务端配置 -使用 buildroot 的软件包进行交叉编译成 RISC-V 架构的二进制包,则需要借助 buildroot 编译过程中的中间文件,其保存在 output/build/ 目录下。在编译过程中,buildroot 会将软件包的源码下载到 output/build/ 目录下,并在此目录下进行编译。编译完成后,buildroot 会将编译好的二进制包安装到 output/target/ 目录下。 +使用 buildroot 的软件包进行交叉编译成 RISC-V 架构的二进制包,则需要借助 buildroot 编译过程中的中间文件,其保存在 `output/build/` 目录下。在编译过程中,buildroot 会将软件包的源码下载到 `output/build/` 目录下,并在此目录下进行编译。编译完成后,buildroot 会将编译好的二进制包安装到 `output/target/` 目录下。 -基于此,我使用脚本将 output/build/ 目录下编译成功的二进制包 `make install` 到指定目录下,然后将其打包成 tar.gz 文件,并在与配置文件进行对比处理后,上传到服务器上。 +基于此,我使用脚本将 `output/build/` 目录下编译成功的二进制包 `make install` 到指定目录下,然后将其打包成 tar.gz 文件,并在与配置文件进行对比处理后,上传到服务器上。 服务器端的配置如下: diff --git a/articles/20240927-tinybpt-server-usage.md b/articles/20240927-tinybpt-server-usage.md index 9da2a74..60de88f 100644 --- a/articles/20240927-tinybpt-server-usage.md +++ b/articles/20240927-tinybpt-server-usage.md @@ -5,7 +5,7 @@ > Project: [RISC-V Linux 内核剖析](https://gitee.com/tinylab/riscv-linux)
> Sponsor: PLCT Lab, ISCAS -# TinyBPT 和面向 buildroot 的二进制包管理服务 服务端说明 +# TinyBPT 和面向 buildroot 的二进制包管理服务(3):服务端说明 ## 前言 @@ -18,7 +18,7 @@ TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具 ### 使用工具 tsumugu 来更新源 ```shell -wget https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Ftaoky%2Ftsumugu +wget https://github.com/taoky/tsumugu ``` 配置运行脚本: @@ -55,7 +55,9 @@ buildroot-pkgs/ -- 二进制包发布目录 riscv64/ -- 处理器架构,独立的话方便第三方镜像 main/2024.02.6/ -- main 用于存放所有 buildroot lts 版本的二进制包(动态编译) tools/v6.10/ -- tools 用于存放 Linux lts 内核版本下的 tools 二进制包(以静态编译) - rootfs/ -- rootfs 用于存放 rootfs 包 + rootfs// -- rootfs 用于存放 rootfs 包,以及相应的编译配置文件 + - rootfs-xxx.tar.gz + - rootfs-xxx.config tinybpt/ tinybpt-v0.1.0.tar.gz -- tinybpt 二进制包 aarch64/ @@ -68,7 +70,7 @@ buildroot-pkgs/ -- 二进制包发布目录 ### 编译选项 -如果要自行编译,编译配置在 TinyBPT 仓库的 `/web/settings/.config` 中,使用编译配置替换原有配置,或使用 `make menuconfig` 自行勾选需要编译的包。 +如果要自行编译,编译配置在 TinyBPT 仓库的 `/web/settings/.config` 中(后续计划连同 rootfs 一起发布),使用编译配置替换原有配置,或使用 `make menuconfig` 自行勾选需要编译的包。 ```shell cd buildroot @@ -87,7 +89,7 @@ make -j$(nproc) 为了解决编译中的问题,我们需要在编译前进行一些配置,例如目前已发现的: -1. Buildroot 无法编译 host-heimdal,问题是heimdal的配置脚本使用了已被删除的变量,需要手动修改,在 `buildroot-2024.02.6/package/heimdal/heimdal.mk` 文件中,将 `ac_cv_sys_large_files=1 ac_cv_sys_file_offset_bits=64` 添加到 `HOST_HEIMDAL_CONF_ENV` 变量中。 +1. Buildroot 无法编译 host-heimdal ,问题是 heimdal 的配置脚本使用了已被删除的变量,需要手动修改,在 `buildroot-2024.02.6/package/heimdal/heimdal.mk` 文件中,将 `ac_cv_sys_large_files=1 ac_cv_sys_file_offset_bits=64` 添加到 `HOST_HEIMDAL_CONF_ENV` 变量中。 软件源码包大小约为 468 GB。 -- Gitee From 1c5adb57583a4eda9bb639ac096c8112947097c5 Mon Sep 17 00:00:00 2001 From: Petalzu Date: Wed, 23 Oct 2024 18:26:13 +0800 Subject: [PATCH 13/13] Update articles --- articles/20240927-tinybpt-client-usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/articles/20240927-tinybpt-client-usage.md b/articles/20240927-tinybpt-client-usage.md index cebb7d2..f60e85f 100644 --- a/articles/20240927-tinybpt-client-usage.md +++ b/articles/20240927-tinybpt-client-usage.md @@ -11,7 +11,7 @@ TinyBPT (Tiny Buildroot Packaging Tool) 是一个 buildroot 的包管理工具,主要处理 buildroot 的包依赖关系,提供包的安装、卸载等功能。 -本文档主要介绍 TinyBPT 客户端的使用,其他架构的支持也将陆续开展,敬请期待! +本文档主要介绍 TinyBPT 客户端的使用。 ## 安装方法 @@ -138,7 +138,7 @@ tinybpt -V ## 其他说明 -- 本工具仅支持 riscv64 buildroot 用户使用。 +- 本工具仅支持 riscv64 buildroot 用户使用,其他架构的支持也将陆续开展,敬请期待! - 本工具使用 CA 证书为 CA certificates extracted from Mozilla。 - 本项目使用了基于 MIT 协议的第三方库 [nlohmann/json][001] 和 [cpp-httplib][002]。 -- Gitee