diff --git a/docs/zh/server/administration/administrator/configuring_the_repo_server.md b/docs/zh/server/administration/administrator/configuring_the_repo_server.md index cc4d2bacc19ab872ac532c3de16711a586c9afba..96afeaf6e9134cd695066eed255a1aa40e958fcd 100644 --- a/docs/zh/server/administration/administrator/configuring_the_repo_server.md +++ b/docs/zh/server/administration/administrator/configuring_the_repo_server.md @@ -1,31 +1,7 @@ # 搭建repo服务器 >![](./public_sys-resources/icon-note.gif) **说明:** -<<<<<<<< HEAD:docs/zh/server/administration/administrator/configuring-the-repo-server.md >openEuler提供了多种repo源供用户在线使用,各repo源含义可参考[系统安装](../../releasenotes/releasenotes/os_installation.md)。若用户无法在线获取openEuler repo源,则可使用openEuler提供的ISO发布包创建为本地openEuler repo源。本章节中以openEuler-{version}-aarch64-dvd.iso发布包为例,请根据实际需要的ISO发布包进行修改。 -======== ->openEuler提供了多种repo源供用户在线使用,各repo源含义可参考[系统安装](../../..//server/releasenotes/releasenotes/os_installation.md)。若用户无法在线获取openEuler repo源,则可使用openEuler提供的ISO发布包创建为本地openEuler repo源。本章节中以openEuler-{version}-aarch64-dvd.iso发布包为例,请根据实际需要的ISO发布包进行修改。 - - - -- [搭建repo服务器](#搭建repo服务器) - - [概述](#概述) - - [创建/更新本地repo源](#创建更新本地repo源) - - [获取ISO发布包](#获取iso发布包) - - [挂载ISO创建repo源](#挂载iso创建repo源) - - [创建本地repo源](#创建本地repo源) - - [更新repo源](#更新repo源) - - [部署远端repo源](#部署远端repo源) - - [nginx安装与配置](#nginx安装与配置) - - [启动nginx服务](#启动nginx服务) - - [repo源部署](#repo源部署) - - [使用repo源](#使用repo源) - - [repo配置为yum源(软件源)](#repo配置为yum源软件源) - - [repo优先级](#repo优先级) - - [dnf相关命令](#dnf相关命令) - - ->>>>>>>> 6b124a04c (文档整改):docs/zh/server/administration/administrator/configuring_the_repo_server.md ## 概述 diff --git a/docs/zh/server/administration/administrator/process_management.md b/docs/zh/server/administration/administrator/process_management.md index 01baa36b1c2bed288a11720d6125b370d0b539d9..722db815e48f226ec9ece0972907b1d18c6b92fd 100644 --- a/docs/zh/server/administration/administrator/process_management.md +++ b/docs/zh/server/administration/administrator/process_management.md @@ -1,20 +1,7 @@ # 管理进程 操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主要存储,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源,当用户提出一个请求时,造成好像系统被用户独占的假象。实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户任务、操作系统任务、邮件和打印任务等。本章节将从用户的角度讲述如何控制进程。 - - -- [管理进程](#管理进程) - - [查看进程](#查看进程) - - [who命令](#who命令) - - [ps命令](#ps命令) - - [top命令](#top命令) - - [kill命令](#kill命令) - - [调度启动进程](#调度启动进程) - - [定时运行一批程序(at)](#定时运行一批程序at) - - [周期性运行一批程序(cron)](#周期性运行一批程序cron) - - [挂起/恢复进程](#挂起恢复进程) - - + ## 查看进程 Linux是一个多任务系统,经常需要对这些进程进行一些调配和管理。要进行管理,首先就要知道现在的进程情况:有哪些进程、进程的状态如何等。Linux提供了多种命令来了解进程的状况。 diff --git a/docs/zh/server/administration/administrator/service_management.md b/docs/zh/server/administration/administrator/service_management.md index 016841f40904c95ed82734313b2e75f85d535225..878d03eb2f44788f106de05c52d98e5b7a94eedd 100644 --- a/docs/zh/server/administration/administrator/service_management.md +++ b/docs/zh/server/administration/administrator/service_management.md @@ -1,44 +1,6 @@ # 管理服务 本章介绍如何使用systemd进行系统和服务管理。 - - -- [管理服务](#管理服务) - - [简介](#简介) - - [概念介绍](#概念介绍) - - [特性说明](#特性说明) - - [更快的启动速度](#更快的启动速度) - - [提供按需启动能力](#提供按需启动能力) - - [采用cgroup特性跟踪和管理进程的生命周期](#采用cgroup特性跟踪和管理进程的生命周期) - - [启动挂载点和自动挂载的管理](#启动挂载点和自动挂载的管理) - - [实现事务性依赖关系管理](#实现事务性依赖关系管理) - - [与SysV初始化脚本兼容](#与sysv初始化脚本兼容) - - [能够对系统进行快照和恢复](#能够对系统进行快照和恢复) - - [管理系统服务](#管理系统服务) - - [sysvinit命令和systemd命令](#sysvinit命令和systemd命令) - - [显示所有当前服务](#显示所有当前服务) - - [显示服务状态](#显示服务状态) - - [运行服务](#运行服务) - - [关闭服务](#关闭服务) - - [重启服务](#重启服务) - - [启用服务](#启用服务) - - [禁用服务](#禁用服务) - - [改变运行级别](#改变运行级别) - - [Target和运行级别](#target和运行级别) - - [查看系统默认启动目标](#查看系统默认启动目标) - - [查看当前系统所有的启动目标](#查看当前系统所有的启动目标) - - [改变默认目标](#改变默认目标) - - [改变当前目标](#改变当前目标) - - [切换到救援模式](#切换到救援模式) - - [切换到紧急模式](#切换到紧急模式) - - [关闭、暂停和休眠系统](#关闭暂停和休眠系统) - - [systemctl命令](#systemctl命令) - - [关闭系统](#关闭系统) - - [重启系统](#重启系统) - - [使系统待机](#使系统待机) - - [使系统休眠](#使系统休眠) - - ## 简介 diff --git a/docs/zh/server/administration/administrator/setting_up_the_database_server.md b/docs/zh/server/administration/administrator/setting_up_the_database_server.md index 16e2e649efde84f57abb1eb9f202f5f15f3cef1d..1fd897f2ad3731204960ee7aca906acbdbe2dc3b 100644 --- a/docs/zh/server/administration/administrator/setting_up_the_database_server.md +++ b/docs/zh/server/administration/administrator/setting_up_the_database_server.md @@ -200,7 +200,7 @@ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config ##### 初始化数据库 ->![](./public_sys-resources/icon-notice.gif) **须知:** +>![](./public_sys-resources/icon-notice.gif) **须知:** >此步骤在postgres用户下操作。 1. 切换到已创建的PostgreSQL用户。 diff --git a/docs/zh/server/administration/administrator/user_and_user_group_management.md b/docs/zh/server/administration/administrator/user_and_user_group_management.md index 382889b1804baac0143f35f9aa5fb053e5e4a5ea..14c45939e940610614034f5a65891b699f720a1d 100644 --- a/docs/zh/server/administration/administrator/user_and_user_group_management.md +++ b/docs/zh/server/administration/administrator/user_and_user_group_management.md @@ -4,23 +4,6 @@ 用户和用户组管理是系统安全管理的重要组成部分,本章主要介绍openEuler提供的用户管理和组管理命令,以及为普通用户分配特权的方法。 - - -- [管理用户](#管理用户) - - [管理用户](#管理用户-1) - - [增加用户](#增加用户) - - [修改用户帐号](#修改用户帐号) - - [删除用户](#删除用户) - - [管理员帐户授权](#管理员帐户授权) - - [管理用户组](#管理用户组) - - [增加用户组](#增加用户组) - - [修改用户组](#修改用户组) - - [删除用户组](#删除用户组) - - [将用户加入用户组或从用户组中移除](#将用户加入用户组或从用户组中移除) - - [切换用户组](#切换用户组) - - - ## 管理用户 ### 增加用户 diff --git a/docs/zh/server/development/FangTian/fangtian_environment_configuration.md b/docs/zh/server/development/FangTian/fangtian_environment_configuration.md index 85c06fa942fe42045e28d475bc65d12388027499..88253cb9d998a5cac8f79924ddd6ea2699e10edf 100644 --- a/docs/zh/server/development/FangTian/fangtian_environment_configuration.md +++ b/docs/zh/server/development/FangTian/fangtian_environment_configuration.md @@ -60,7 +60,6 @@ > 说明 > > - sa 代表一种系统能力,一个进程可包含多个 sa。ft.xml 配置了多个 sa,共同组成进程 ft。关于 samgr 及 sa 概念可以参考 OpenHarmony。 - > - 关于 sa 的配置 xml 及 sa_main samgr 均已在软件包安装时自动部署。 ## 基于 FangTian 做简单 GUI 应用开发运行 diff --git a/docs/zh/server/development/FangTian/fangtian_for_linux_waylan_and_openharmony_applications.md b/docs/zh/server/development/FangTian/fangtian_for_linux_waylan_and_openharmony_applications.md index 9723d13c9d738ebedd84ca3f647ee70540c6ae0b..ea1807eb1b75bddbd9cc1aeda1319f8093cfac3e 100644 --- a/docs/zh/server/development/FangTian/fangtian_for_linux_waylan_and_openharmony_applications.md +++ b/docs/zh/server/development/FangTian/fangtian_for_linux_waylan_and_openharmony_applications.md @@ -55,6 +55,7 @@ FangTian 当前支持 ArkUI 部分控件,如文本、按钮、图片等。开 ```shell unzip eletronicAlbum.hap ``` + 解压之后的路径为`~/apps/tmp/eletronicAlbum`。 3. 在启动[引擎](./FangTian环境配置.md#启动引擎)之后,运行 hap。 diff --git a/docs/zh/server/development/ai4c/ai4c_user_manual.md b/docs/zh/server/development/ai4c/ai4c_user_manual.md index 359f1a20da58744531d99dee72c8512c838782d8..054c4e9cdeeeef52216daa69d01876895d08e360 100644 --- a/docs/zh/server/development/ai4c/ai4c_user_manual.md +++ b/docs/zh/server/development/ai4c/ai4c_user_manual.md @@ -26,7 +26,7 @@ AI4C 代表 AI 辅助编译器的套件,是一个使编译器能够集成机 ## 3 AI4C 的安装构建 -### 3.1 直接安装AI4C +### 3.1 直接安装AI4C 若用户使用最新的openEuler系统(24.03-LTS-SP1),同时只准备使用`AI4C`的现有特性,可以直接安装`AI4C`包。 @@ -46,7 +46,7 @@ yum install -y AI4C # 安装 rpmdevtools yum install rpmdevtools ``` - + 2. 在主目录`/root`下生成 rpmbuild 文件夹: ```bash @@ -55,7 +55,7 @@ yum install -y AI4C ls ~/rpmbuild/ BUILD BUILDROOT RPMS SOURCES SPECS SRPMS ``` - + 3. 使用`git clone https://gitee.com/src-openeuler/AI4C.git`,从目标仓库的 `openEuler-24.03-LTS-SP1` 分支拉取代码,并把目标文件放入 rpmbuild 的相应文件夹下: ``` shell @@ -79,16 +79,16 @@ yum install -y AI4C ``` 注意事项:若系统因存有旧版本的 RPM 安装包而导致文件冲突,可以通过以下方式解决: - + ```shell # 解决方案一:强制安装新版本 rpm -ivh AI4C--..rpm --force # 解决方案二:更新安装包 rpm -Uvh AI4C--..rpm ``` - + 安装完成后,系统内会存在以下文件: - + * `/usr/bin/ai4c-*`: AI 使能的编译器以及自动调优工具的 wrapper * `/usr/lib64/libonnxruntime.so`: ONNX Runtime 的推理框架动态库 * `/usr/lib64/AI4C/*.onnx`: AI 辅助编译优化模型(ONNX 格式) @@ -101,7 +101,7 @@ yum install -y AI4C ### 3.3 源码构建安装流程 -AI4C 的源码地址:https://gitee.com/openeuler/AI4C +AI4C 的源码地址: #### 3.3.1 安装 ONNX Runtime 依赖 @@ -109,7 +109,7 @@ AI4C 的源码地址:https://gitee.com/openeuler/AI4C 在 GitHub 下载 1.16.3 版本,并解压相应架构的 tgz 文件,例如,aarch64 架构下,下载`onnxruntime-linux-aarch64-1.16.3.tgz`。 -地址:https://github.com/microsoft/onnxruntime/releases/tag/v1.16.3 +地址: **注意事项**:`tgz` 文件解压后,`libonnxruntime.so`的动态库存在于`lib`目录下,为构建 AI4C 框架,需将`lib`目录重命名为`lib64`,否则可能会导致`-lonnxruntime`找不到路径的报错。 @@ -184,6 +184,7 @@ pip3 install dist/ai4c----_.w ### 4.1 AI 辅助编译优化 当前的 AI 辅助编译优化模块,主要由三部分输入组成: + - ONNX 模型,训练后的辅助编译优化模型。 - 编译器插件(**当前仅支持 GCC 编译器**),用于运行 ONNX 模型推理并获取优化参数。 - AI4Compiler 框架,提供 ONNX 推理引擎和 GCC 优化编译命令。 @@ -366,7 +367,7 @@ ai4c-autotune dump -c coremark/input.yaml \ * 当前默认支持程序运行时间作为性能值。 -详细使用信息,请参考[细粒度调优使用手册](https://gitee.com/openeuler/AI4C/blob/master/python/docs/autotuner.md) 与该测试例:https://gitee.com/openeuler/AI4C/tree/master/python/test/autotuner/loop_unroll +详细使用信息,请参考[细粒度调优使用手册](https://gitee.com/openeuler/AI4C/blob/master/python/docs/autotuner.md) 与该测试例: LLVM 编译器的细粒度调优请参考 [Autotuner](https://gitee.com/openeuler/BiSheng-Autotuner) 仓库的使用教程。 @@ -460,7 +461,7 @@ ai4c-autotune autorun test_coarse_tuning.ini \ * 粗粒度调优暂不支持 dump 数据库内保存的历史数据。 * 当前的粗粒度调优支持与当前版本的 GCC 版本(12.3.1)配套使用,其他编译器版本会出现部分编译选项不支持的问题。可在`path/to/your/AI4C/aiframe/include/option_utils.h`中注释编译器未识别的编译选项。 -详细使用信息,请参考该测试例:https://gitee.com/openeuler/AI4C/tree/master/python/test/autotuner/coarse_tuning +详细使用信息,请参考该测试例: LLVM 编译器的粗粒度调优请参考 [Autotuner](https://gitee.com/openeuler/BiSheng-Autotuner) 仓库的使用教程。 @@ -486,8 +487,8 @@ yum install -y time ```shell # ---------- run_test.sh ---------- # parent_dir=$1 # path for intermediate tuning files -config=$(cat ${parent_dir}/tuning/config.txt) # current compiler configuration file -performance_file="${parent_dir}/tuning/performance.txt" # current performance data file +config=$(cat ${parent_dir}/tuning/config.txt) # current compiler configuration file +performance_file="${parent_dir}/tuning/performance.txt" # current performance data file measure_raw_file="time.txt" @@ -547,4 +548,4 @@ config_measure: 调优完成后,历史与最佳调优数据将保留在`${parent_dir}/tuning/train.csv`和`${parent_dir}/tuning/result.txt`中。 -详细使用信息,请参考该测试例:https://gitee.com/openeuler/AI4C/tree/master/python/test/option_tuner \ No newline at end of file +详细使用信息,请参考该测试例: diff --git a/docs/zh/server/development/gcc/kernel_fdo_user_guide.md b/docs/zh/server/development/gcc/kernel_fdo_user_guide.md index 952c29d9c7d95a6038add93d129efe65204d091f..439dfc86813a151ede9f637cc6d66e26d6e7e937 100644 --- a/docs/zh/server/development/gcc/kernel_fdo_user_guide.md +++ b/docs/zh/server/development/gcc/kernel_fdo_user_guide.md @@ -22,7 +22,9 @@ ```shell yum install -y kernel-source A-FOT make gcc flex bison elfutils-libelf-devel diffutils openssl-devel dwarves ``` + 复制内核源码 + ```shell cp -r /usr/src/linux-6.4.0-8.0.0.16.oe2309.aarch64 . ``` diff --git a/docs/zh/server/diversified_computing/dpu_offload/offload_deployment_guide.md b/docs/zh/server/diversified_computing/dpu_offload/offload_deployment_guide.md index 89fa04778550585917261167a633660bde6660b8..8363931a67044640282a26bf88b7136d424828ea 100644 --- a/docs/zh/server/diversified_computing/dpu_offload/offload_deployment_guide.md +++ b/docs/zh/server/diversified_computing/dpu_offload/offload_deployment_guide.md @@ -1,10 +1,8 @@ - # 容器管理面无感卸载部署指导 > ![](./public_sys-resources/icon-note.gif)**说明**: > > 本指导涉及对容器管理面组件的少量改动和rexec工具修改,这些修改基于指定版本,其他版本可基于实际执行环境做适配修改。文档中提供的patch仅供验证指导使用,不具备实际商用的条件。 - > ![](./public_sys-resources/icon-note.gif)**说明**: > > 当前共享文件系统之间通信通过网络完成,可通过网络互连的两台物理机器或VM模拟验证。 @@ -21,13 +19,13 @@ ## 相关组件补丁介绍 -#### rexec介绍 +### rexec介绍 rexec是一个用go语言开发的远程执行工具,基于docker/libchan下的[rexec](https://github.com/docker/libchan/tree/master/examples/rexec)示例工具改造而成,实现远程调用远端二进制的功能,为方便使用在rexec中增加了环境变量传递和监控原进程退出等能力。 rexec工具的具体使用方式为在服务器端用`CMD_NET_ADDR=tcp://0.0.0.0:<端口号> rexec_server`的方式拉起rexec服务进程,然后在客户端用`CMD_NET_ADDR=tcp://<服务端ip>:<端口号> rexec [要执行的指令]`的方式启动,便可以调用rexec_server执行需要执行的指令,并等待指令执行结果返回。 -#### dockerd相关改动介绍 +### dockerd相关改动介绍 对dockerd的改动基于18.09版本。 @@ -35,7 +33,7 @@ rexec工具的具体使用方式为在服务器端用`CMD_NET_ADDR=tcp://0.0.0.0 最后,因为在容器管理面的运行环境中,将`/proc`挂在了服务端的proc文件系统,而本地的proc文件系统则挂载在了`/local_proc`,所以,dockerd以及containerd中的对`/proc/self/xxx`或者`/proc/getpid()/xxx`或者相关的文件系统访问的部分,我们统统将`/proc`改为了`/local_proc`。 -#### containerd相关改动介绍 +### containerd相关改动介绍 对于containerd的改动基于containerd-1.2-rc.1版本。 @@ -45,7 +43,7 @@ rexec工具的具体使用方式为在服务器端用`CMD_NET_ADDR=tcp://0.0.0.0 并且,将原来的通过系统调用给contaienr-shim发信号的方式,改为了通过远程调用kill指令的方式向shim发信号,确保了docker杀死容器的行为可以正确的执行。 -#### kubernetes相关改动介绍 +### kubernetes相关改动介绍 kubelet暂不需要功能性改动,可能会遇到容器QoS管理器首次设置失败的错误,该错误不影响后续Pods拉起流程,暂时忽略该报错。 @@ -64,7 +62,7 @@ kubelet暂不需要功能性改动,可能会遇到容器QoS管理器首次设 CMD_NET_ADDR=tcp://<客户端ip>: rexec /usr/bin/dockerd $* ``` -#### 客户端 +### 客户端 需要准备一个rootfs,作为dockerd与containerd的运行环境,通过如下的脚本,将dockerd、containerd所需要的服务端目录挂载到客户端。并且,需要确保在以下脚本中被挂载的远程目录在服务端和客户端都存在。 @@ -166,4 +164,4 @@ SHIM_HOST=<服务端ip> CMD_NET_ADDR=tcp://<服务端ip>: /usr/b > ![](./public_sys-resources/icon-note.gif)**说明**: > -> 本指导所述操作只涉及容器管理面进程卸载,不包含容器网络和数据卷volume等卸载,如有相关需求,需要通过额外的网络或存储卸载能力支持。本指导支持不带网络和存储的容器跨节点拉起。 \ No newline at end of file +> 本指导所述操作只涉及容器管理面进程卸载,不包含容器网络和数据卷volume等卸载,如有相关需求,需要通过额外的网络或存储卸载能力支持。本指导支持不带网络和存储的容器跨节点拉起。 diff --git a/docs/zh/server/installation_upgrade/installation/installation_guide.md b/docs/zh/server/installation_upgrade/installation/installation_guide.md index a4ebc1db4da352cba5e73daa098a38e733d9b283..5e09ccdca5ef700482924caedae0d3a6d61d2dd1 100644 --- a/docs/zh/server/installation_upgrade/installation/installation_guide.md +++ b/docs/zh/server/installation_upgrade/installation/installation_guide.md @@ -204,6 +204,7 @@ **表1** 磁盘分区建议 + | 分区类型 | 逻辑挂载点 | 分区大小 | 说明 | | --- | --- | --- | --- | | 主分区 | / | 20G | 根目录,用于安装操作系统。 | diff --git a/docs/zh/server/installation_upgrade/installation/installation_modes.md b/docs/zh/server/installation_upgrade/installation/installation_modes.md index b5eb9b01028f4b0ab06015c509f10b14dc1e8a14..2e2b93c19fcf1cf82de0165b4d499f542dbbf5a7 100644 --- a/docs/zh/server/installation_upgrade/installation/installation_modes.md +++ b/docs/zh/server/installation_upgrade/installation/installation_modes.md @@ -166,7 +166,6 @@ 各步骤详细的操作请参考《[虚拟化用户指南](../../../../zh/virtualization/virtualization_platform/virtualization/introduction_to_virtualization.md)》。 - ## 通过私有镜像安装 本节介绍如何使用或者制作私有镜像,并介绍相应的操作步骤,指导用户进行安装。 diff --git a/docs/zh/server/installation_upgrade/installation/risc_v_licheepi4a.md b/docs/zh/server/installation_upgrade/installation/risc_v_licheepi4a.md index e7c40bb43f17589641f6efe620ac375eab6408cf..282bffb1a52911fc07d3ee644b3737f86eced6a3 100644 --- a/docs/zh/server/installation_upgrade/installation/risc_v_licheepi4a.md +++ b/docs/zh/server/installation_upgrade/installation/risc_v_licheepi4a.md @@ -40,7 +40,6 @@ ### Windows 下驱动安装 > 注意: -> > 我们提供下载的镜像内并未包含 Windows 侧的驱动程序。你可以从[这里](https://dl.sipeed.com/shareURL/LICHEE/licheepi4a/07_Tools)下载 burn_tools.zip,在压缩包内找到 windows/usb_driver-fullmask 的文件夹,这个文件夹内的文件是 Windows 系统下需要安装的驱动。 Windows 下烧录时,需要先进入高级启动模式,禁用数字签名。才能正常安装下面的驱动。禁用数字签名请按照下面的步骤操作。 diff --git a/docs/zh/server/installation_upgrade/upgrade/openEuler_22.03_lts_upgrade_and_downgrade_guide.md b/docs/zh/server/installation_upgrade/upgrade/openEuler_22.03_lts_upgrade_and_downgrade_guide.md index 2f297e224a50c27cef5c3e4ae775d784361f46be..dcf40152d2b356cf962088e5e6f39b0e69667dd2 100644 --- a/docs/zh/server/installation_upgrade/upgrade/openEuler_22.03_lts_upgrade_and_downgrade_guide.md +++ b/docs/zh/server/installation_upgrade/upgrade/openEuler_22.03_lts_upgrade_and_downgrade_guide.md @@ -1,6 +1,9 @@ -本文档以openEuler-22.03-LTS到openEuler-22.03-LTS-SP1的升降级为例,其他版本同理 +# 升级指南 + +本文档以openEuler-22.03-LTS到openEuler-22.03-LTS-SP1的升降级为例,其他版本同理。 ## **1**. **系统安装** + 获取openEuler-22.03-LTS镜像,参考安装指南,完成openEuler操作系统的安装。 查看当前环境openEuler、kernel版本 @@ -15,9 +18,9 @@ vi /etc/yum.repos.d/openEuler-22.03-LTS-SP1.repo ``` - 输入以下openEuler-22.03-LTS-SP1 repo源信息并保存退出 + 输入以下openEuler-22.03-LTS-SP1 repo源信息并保存退出 -``` +```bash SP1_OS、SP1_everything、SP1_EPOL、SP1_debuginfo、SP1_source、SP1_update ``` @@ -25,11 +28,11 @@ SP1_OS、SP1_everything、SP1_EPOL、SP1_debuginfo、SP1_source、SP1_update ### 2.2 执行升级 -``` +```bash dnf update | tee update_log ``` -``` +```bash 补充说明: 1、安装报错时,通过执行 dnf update --skip-broken -x conflict_pkg1 |tee update_log 规避安装冲突问题,如果有多个包冲突,添加多个-x conflict_pkg1 -x conflict_pkg2 -x conflict_pkg3,待升级完成后,对跳过的软件包单独进行分析、验证、升级; 2、参数释义: @@ -40,7 +43,7 @@ dnf update | tee update_log ### 2.4 重启系统 -``` +```bash reboot ``` @@ -54,13 +57,13 @@ reboot ### 4.1 执行降级 -``` +```bash dnf downgrade | tee downgrade_log ``` ### 4.2 重启系统 -``` +```bash reboot ``` diff --git a/docs/zh/server/maintenance/aops/aops_intelligent_positioning_framework_user_manual.md b/docs/zh/server/maintenance/aops/aops_intelligent_positioning_framework_user_manual.md index f2a12fb6e6c61ddcf7d951b8c66fed98f33fe154..d052e9aacd205fe50a5b0b794ab0bd9e91f28d3b 100644 --- a/docs/zh/server/maintenance/aops/aops_intelligent_positioning_framework_user_manual.md +++ b/docs/zh/server/maintenance/aops/aops_intelligent_positioning_framework_user_manual.md @@ -10,7 +10,7 @@ AOps项目的智能定位策略采用内置网络诊断应用作为模板,生 “应用”作为工作流的模板,描述了检测中各步骤的串联情况,内置各步骤中使用的检测模型的推荐逻辑。用户在生成工作流时,可根据各主机的采集项、场景等信息,定制出工作流的详细信息。 -### 1.1 工作流列表页面: +### 1.1 工作流列表页面 ![工作流](./figures/故障诊断/工作流.jpg) @@ -19,7 +19,7 @@ AOps项目的智能定位策略采用内置网络诊断应用作为模板,生 - 查看当前工作流列表,支持按照主机组、应用和状态进行筛选,并支持分页操作 - 查看当前应用列表 -### 1.2 工作流详情页面: +### 1.2 工作流详情页面 ![工作流详情](./figures/故障诊断/工作流详情.jpg) diff --git a/docs/zh/server/maintenance/aops/community_hotpatch_creation_and_release_process.md b/docs/zh/server/maintenance/aops/community_hotpatch_creation_and_release_process.md index 839da7ad6447dd83840bf8a4118f70120a415b00..d51a70181c598d840b1247f39370ed67bcae2918 100644 --- a/docs/zh/server/maintenance/aops/community_hotpatch_creation_and_release_process.md +++ b/docs/zh/server/maintenance/aops/community_hotpatch_creation_and_release_process.md @@ -1,4 +1,3 @@ - # 社区热补丁制作发布流程 ## 制作内核态/用户态热补丁 @@ -11,10 +10,11 @@ > > 制作用户态热补丁需在src-openEuler仓评论pr,现在支持**src-openEuler/openssl,src-openEuler/glibc,src-openEuler/systemd**。 -##### 1. 在已合入pr下评论制作热补丁 +#### 1. 在已合入pr下评论制作热补丁 - 从src-openeuler仓【支持openssl, glibc, systemd】评论已合入pr制作新版本热补丁。 -``` + +```shell /makehotpatch [软件包版本号] [ACC/SGL] [patch list] [cve/bugfix/feature] [issue id] [os_branch] ``` @@ -24,7 +24,7 @@ - 从openeuler仓【支持kernel】评论已合入pr制作新版本热补丁。 -``` +```shell /makehotpatch [软件包版本号] [ACC/SGL] [cve/bugfix/feature] [issue id] [os_branch] ``` @@ -32,9 +32,7 @@ 评论后,门禁触发hotpatch_meta仓创建热补丁issue以及同步该pr。 - - -##### 2. hotpatch_metadata仓自动创建热补丁issue、同步该pr +#### 2. hotpatch_metadata仓自动创建热补丁issue、同步该pr pr评论区提示启动热补丁制作流程。 @@ -56,7 +54,7 @@ pr评论区提示启动热补丁制作流程。 ![image-20230816110637492](./image/hotpatch-fix-pr.png) -##### 3. 触发制作热补丁 +#### 3. 触发制作热补丁 打开hotpatch_meta仓自动创建的pr,评论区可以查看热补丁制作信息。 @@ -86,9 +84,9 @@ pr评论区提示启动热补丁制作流程。 ### 场景2、从hotpatch_meta仓提pr制作新版本热补丁 -> hotpatch_meta仓地址:https://gitee.com/openeuler/hotpatch_meta +> hotpatch_meta仓地址: -##### 1. 提pr +#### 1. 提pr 在hotpatch_metadata仓提pr。 @@ -101,17 +99,17 @@ pr内容: - patch文件。 - 如果没有相应热补丁元数据hotmetadata_ACC.xml/hotmetadata_SGL.xml文件,则手动创建;否则修改热补丁元数据hotmetadata_ACC.xml/hotmetadata_SGL.xml文件。 -##### 2. 触发制作热补丁 +#### 2. 触发制作热补丁 **若热补丁制作成功,可以对热补丁进行审阅**。 ### 场景3、从hotpatch_metadata仓提pr修改热补丁 -> hotpatch_meta仓地址:https://gitee.com/openeuler/hotpatch_meta +> hotpatch_meta仓地址: > > 从hotpatch_meta仓提pr只能修改还未正式发布的热补丁。 -##### 1. 提pr +#### 1. 提pr 在hotpatch_meta仓提pr。 @@ -127,19 +125,19 @@ pr内容: - patch文件。 - 修改热补丁元数据hotmetadata_ACC.xml/hotmetadata_SGL.xml文件。 -##### 2. 触发制作热补丁 +#### 2. 触发制作热补丁 **若热补丁制作成功,可以对热补丁进行审阅**。 ## 审阅热补丁 -##### 1. 审阅热补丁pr +### 1. 审阅热补丁pr 确认可发布,合入pr。 ![image-20230816112957179](./image/同意合入pr.png) -##### 2. pr合入,回填热补丁issue +### 2. pr合入,回填热补丁issue 自动在热补丁issue页面补充热补丁路径,包含src.rpm/arm架构/x86架构的rpm包,以及对应hotpatch.xml,用于展示热补丁信息。 @@ -156,23 +154,23 @@ hotmetadata_ACC.xml格式示例: ```xml - Managing Hot Patch Metadata - - - - 源码包下载路径(需要reealse正式路径) - x86_64架构debuginfo包下载路径(需要reealse正式路径) - aarch64架构debuginfo包下载路径(需要reealse正式路径) - 本次需要制作热补丁的patch包名1 - 本次需要制作热补丁的patch包名2 - ... - - - - 热补丁issue链接 - - - + Managing Hot Patch Metadata + + + + 源码包下载路径(需要reealse正式路径) + x86_64架构debuginfo包下载路径(需要reealse正式路径) + aarch64架构debuginfo包下载路径(需要reealse正式路径) + 本次需要制作热补丁的patch包名1 + 本次需要制作热补丁的patch包名2 + ... + + + + 热补丁issue链接 + + + ``` @@ -181,23 +179,23 @@ hotmetadata_SGL.xml格式示例: ```xml - Managing Hot Patch Metadata - - - - 源码包下载路径(需要realse正式路径) - x86_64架构debuginfo包下载路径(需要reealse正式路径) - aarch64架构debuginfo包下载路径(需要reealse正式路径) - 本次需要制作热补丁的patch包名1 - 本次需要制作热补丁的patch包名2 - ... - - - - 热补丁issue链接 - - - + Managing Hot Patch Metadata + + + + 源码包下载路径(需要realse正式路径) + x86_64架构debuginfo包下载路径(需要reealse正式路径) + aarch64架构debuginfo包下载路径(需要reealse正式路径) + 本次需要制作热补丁的patch包名1 + 本次需要制作热补丁的patch包名2 + ... + + + + 热补丁issue链接 + + + ``` @@ -205,18 +203,18 @@ hotmetadata_SGL.xml格式示例: ![image-20230817100308392](./image/ACC的hotpatchmetadata文件示例.png) -##### 3. 修改热补丁Issue +### 3. 修改热补丁Issue - 将热补丁issue状态修改为”已完成“。 - 为热补丁issue添加hotpatch标签。 ## 发布热补丁 -##### 1、收集热补丁发布需求 +### 1、收集热补丁发布需求 在release-management仓库每周update需求收集的issue下方,手动评论start-update命令,此时会收集待发布的热补丁和待发布的修复cve的冷补丁。后台会在hotpatch_meta仓库根据hotpatch标签查找已完成的热补丁issue。 -##### 2、生成热补丁安全公告 +### 2、生成热补丁安全公告 社区根据收集到的热补丁issue信息,生成热补丁安全公告xml文件。 @@ -226,7 +224,7 @@ hotmetadata_SGL.xml格式示例: ![image-20230908163914778](./image/image-20230908163914778.png) -##### 3、Majun平台上传文件到openEuler官网,同步生成updateinfo.xml文件 +### 3、Majun平台上传文件到openEuler官网,同步生成updateinfo.xml文件 社区将生成的安全公告上传到openEuler官网,同时基于所收集的热补丁信息生成updateinfo.xml文件。 @@ -262,7 +260,7 @@ updateinfo.xml文件样例: ``` -##### 4、openEuler官网可以查看更新的热补丁信息 +### 4、openEuler官网可以查看更新的热补丁信息 > openEuler官网安全公告: @@ -270,7 +268,7 @@ updateinfo.xml文件样例: ![image-20230908163402743](./image/image-20230908163402743.png) -##### 5、获取热补丁相关文件 +### 5、获取热补丁相关文件 社区将热补丁相关文件同步至openEuler的repo源下,可以在各个分支的hotpatch_update目录下获取相应文件。 > openEuler的repo地址: diff --git a/docs/zh/server/maintenance/aops/configuration_tracing_service_user_manual.md b/docs/zh/server/maintenance/aops/configuration_tracing_service_user_manual.md index 8c860539d2965d1a49feee6bdcb633de20eba0fd..75d6cc50263724998a78b7fb13795fc457aa8ae2 100644 --- a/docs/zh/server/maintenance/aops/configuration_tracing_service_user_manual.md +++ b/docs/zh/server/maintenance/aops/configuration_tracing_service_user_manual.md @@ -60,18 +60,6 @@ step_list: #### 编辑主机清单 -<<<<<<<< HEAD:docs/zh/server/maintenance/aops/configuration-tracing-service-user-manual.md -具体步骤参见其他章节gala-ragdoll模块主机配置 - -#### 编辑变量列表 - -具体步骤参见其他章节gala-ragdoll模块变量配置 - -#### 执行部署任务 - -具体步骤参见其他章节执行部署任务 - -======== 具体步骤参见[部署管理使用手册]章节2.2.2.10章节gala-ragdoll模块主机配置 #### 编辑变量列表 @@ -81,7 +69,6 @@ step_list: #### 执行部署任务 具体步骤参见[部署管理使用手册]章节3执行部署任务 ->>>>>>>> 6b124a04c (文档整改):docs/zh/server/maintenance/aops/configuration_tracing_service_user_manual.md ### 配置文件介绍 diff --git a/docs/zh/server/maintenance/aops/deploying_aops.md b/docs/zh/server/maintenance/aops/deploying_aops.md index af21e55d0bcc90c93748af73e60a3d5277da9e8e..8fcda4b45fd3a1694cc629eef12e0316338bb9ae 100644 --- a/docs/zh/server/maintenance/aops/deploying_aops.md +++ b/docs/zh/server/maintenance/aops/deploying_aops.md @@ -53,6 +53,7 @@ SELINUX=disabled # 更改之后,按下ESC键,键盘中输入 :wq 保存修改的内容 ``` + 注:此SELINUX状态配置在系统重启后生效。 # 三、服务端部署 @@ -211,13 +212,13 @@ systemctl start prometheus - 安装aops-zeus -``` +```bash yum install aops-zeus -y ``` - 修改配置文件 -``` +```bash vim /etc/aops/zeus.ini ``` @@ -233,8 +234,8 @@ wsgi-file=manage.py daemonize=/var/log/aops/uwsgi/zeus.log http-timeout=600 harakiri=600 -processes=2 // 生成指定数目的worker/进程 -gevent=100 // gevent异步核数 +processes=2 // 生成指定数目的worker/进程 +gevent=100 // gevent异步核数 [mysql] ip=192.168.1.1 // 此处ip修改为机器A真实ip @@ -309,7 +310,7 @@ vim /etc/nginx/aops-nginx.conf rewrite ^(.*)$ /index.html last; } } - # 此处修改为aops-zeus部署机器真实IP + # 此处修改为aops-zeus部署机器真实IP location /api/ { proxy_pass http://192.168.1.2:11111/; } @@ -318,7 +319,7 @@ vim /etc/nginx/aops-nginx.conf proxy_pass http://192.168.1.3:11114/; rewrite ^/api/(.*) /$1 break; } - # 此处IP对应aops-apollo的IP地址 + # 此处IP对应aops-apollo的IP地址 location /api/vulnerability { proxy_pass http://192.168.1.3:11116/; rewrite ^/api/(.*) /$1 break; @@ -433,7 +434,7 @@ yum install aops-apollo -y - 修改配置文件 -``` +```bash vim /etc/aops/apollo.ini ``` @@ -447,13 +448,13 @@ host_vault_dir=/opt/aops host_vars=/opt/aops/host_vars [zeus] -ip=192.168.1.2 //此处修改为机器B的真实IP +ip=192.168.1.2 //此处修改为机器B的真实IP port=11111 # hermes info is used to send mail. [hermes] -ip=192.168.1.2 //此处修改为部署aops-hermes的真实IP,以机器B的IP地址为例 -port=80 //此处改为hermes服务实际使用端口 +ip=192.168.1.2 //此处修改为部署aops-hermes的真实IP,以机器B的IP地址为例 +port=80 //此处改为hermes服务实际使用端口 [cve] cve_fix_function=yum @@ -486,6 +487,7 @@ processes=2 gevent=100 ``` + > **mysql数据库设置为密码模式**,请参阅[密码模式下mysql服务配置链接字符串](#Q5、mysql设置为密码模式) - 启动aops-apollo服务 @@ -541,7 +543,7 @@ yum install gala-ragdoll python3-gala-ragdoll -y vim /etc/ragdoll/gala-ragdoll.conf ``` -> **将collect节点collect_address中IP地址修改为机器B的地址,collect_api与collect_port修改为实际接口地址** +> **将collect节点collect_address中IP地址修改为机器B的地址,collect_api与collect_port修改为实际接口地址** ```ini [git] @@ -658,7 +660,7 @@ yum install aops-diana -y - 修改配置文件 - > 机器B与机器C中aops-diana分别扮演不同的角色,通过**配置文件的差异来区分两者扮演角色的不同** + > 机器B与机器C中aops-diana分别扮演不同的角色,通过**配置文件的差异来区分两者扮演角色的不同** ```shell vim /etc/aops/diana.ini @@ -806,7 +808,7 @@ processes=2 threads=2 ``` -> **mysql数据库设置为密码模式**,请参阅[FAQ:密码模式下mysql服务配置链接字符串](#Q5、mysql设置为密码模式) +> **mysql数据库设置为密码模式**,请参阅[FAQ:密码模式下mysql服务配置链接字符串] (#Q5、mysql设置为密码模式) - 启动aops-diana服务 @@ -851,23 +853,23 @@ yum install aops-ceres dnf-hotpatch-plugin -y ## FAQ -#### Q1、最大连接数(MaxStartups) +### Q1、最大连接数(MaxStartups) 批量添加主机接口服务执行过程中会受到aops-zeus安装所在主机sshd服务配置中最大连接数(MaxStartups)的限制,会出现部分主机不能连接的情况,如有大量添加主机的需求,可考虑临时调增该数值。关于该配置项的修改可参考[ssh文档](https://www.man7.org/linux/man-pages/man5/sshd_config.5.html)。 -#### Q2、504网关超时 +### Q2、504网关超时 部分http访问接口执行时间较长,web端可能返回504错误,可向nginx配置中添加proxy_read_timeout配置项,并适当调大该数值,可降低504问题出现概率。 -#### Q3、防火墙 +### Q3、防火墙 若防火墙不方便关闭,请设置放行服务部署过程涉及的所有接口,否则会造成服务不可访问,影响A-Ops的正常使用。 -#### Q4、elasticasearch访问拒绝 +### Q4、elasticasearch访问拒绝 elasticsearch分布式部署多节点时,需调整配置跨域部分,允许各节点访问。 -#### Q5、mysql设置为密码模式 +### Q5、mysql设置为密码模式 - **服务配置mysql链接字符串** @@ -912,7 +914,7 @@ connect = pymysql.connect(host='$mysql_ip', port=$port, database='$aops_database **注意:当服务器不是以root用户登录时,需添加user="root"或mysql允许链接的用户名** -#### Q6、配置update源 +### Q6、配置update源 ```shell echo "[update] @@ -929,7 +931,7 @@ gpgcheck=0" > /etc/yum.repos.d/openEuler-update.repo > 注意: 其中**openEuler-24.03-LTS** 根据部署的系统版本具体调整,或可直接参与openeuler官网中针对repo源配置介绍 -#### Q7、/opt/aops/scripts/deploy目录不存在 +### Q7、/opt/aops/scripts/deploy目录不存在 在执行数据库初始化时,提示不存在`/opt/aops/scripts/deploy`文件目录,执行安装aops-tools工具包 diff --git a/docs/zh/server/maintenance/aops/dnf_command_usage.md b/docs/zh/server/maintenance/aops/dnf_command_usage.md index 6494fbf53ced07bbfffe3332e04dab4579bfbcc1..2db281c1f4fcc865ae2553772dd729ed3ed33785 100644 --- a/docs/zh/server/maintenance/aops/dnf_command_usage.md +++ b/docs/zh/server/maintenance/aops/dnf_command_usage.md @@ -1,4 +1,5 @@ # dnf插件命令使用手册 + 将dnf-hotpatch-plugin安装部署完成后,可使用dnf命令调用A-ops ceres中的冷/热补丁操作,命令包含热补丁扫描(dnf hot-updateinfo),热补丁状态设置及查询(dnf hotpatch ),热补丁应用(dnf hotupgrade),内核升级前kabi检查(dnf upgrade-en)。本文将介绍上述命令的具体使用方法。 >热补丁包括ACC/SGL(accumulate/single)类型 @@ -7,7 +8,9 @@ >- SGL_xxx:单独补丁,xxx为issue id,如果有多个issue id,用多个'_'拼接。目标修复issue id相关问题。 ## 热补丁扫描 + `dnf hot-updateinfo`命令支持扫描热补丁并指定cve查询相关热补丁,命令使用方式如下: + ```shell dnf hot-updateinfo list cves [--available(default) | --installed] [--cve [cve_id]] @@ -21,7 +24,7 @@ Hot-updateinfo command-specific options: cves about newer versions of installed packages (default) --installed - cves about equal and older versions of installed packages + cves about equal and older versions of installed packages ``` - `list cves` @@ -57,6 +60,7 @@ CVE-2022-30594 Important/Sec. kernel-4.19.90-2206.1.0.0153.oe1.x86_64 patc ``` 3、cve不存在时列表为空。 + ```shell [root@localhost ~]# dnf hot-updateinfo list cves --cve CVE-2022-3089 # cve-id level cold-patch hot-patch @@ -77,8 +81,8 @@ Last metadata expiration check: 2:39:04 ago on 2023年12月29日 星期五 07时 ![热补丁状态转换图](./figures/syscare热补丁状态图.png) - ## 热补丁状态查询和切换 + `dnf hotpatch`命令支持查询、切换热补丁的状态,命令使用方式如下: ```shell @@ -99,6 +103,7 @@ Hotpatch command-specific options: deactive hotpatch --accept ACCEPT_NAME accept hotpatch ``` + - 使用`dnf hotpatch`命令查询热补丁状态 - 使用`dnf hotpatch --list`命令查询当前系统中可使用的热补丁状态并展示。 @@ -151,6 +156,7 @@ Last metadata expiration check: 0:16:20 ago on 2023年12月29日 星期五 10时 base-pkg/hotpatch status kernel-4.19.90-2112.8.0.0131.oe1/SGL_CVE_2022_30594-1-1/vmlinux ACTIVED ``` + - 使用`dnf hotpatch --deactive `停用热补丁,可使用`dnf hotpatch --list`查询停用后的状态变化,变化逻辑见上文的热补丁状态转换图。 ```shell @@ -163,6 +169,7 @@ Last metadata expiration check: 0:19:12 ago on 2023年12月29日 星期五 10时 base-pkg/hotpatch status kernel-4.19.90-2112.8.0.0131.oe1/SGL_CVE_2022_30594-1-1/vmlinux DEACTIVED ``` + - 使用`dnf hotpatch --remove `删除热补丁,可使用`dnf hotpatch --list`查询删除后的状态变化,变化逻辑见上文的热补丁状态转换图。 ```shell @@ -175,6 +182,7 @@ Last metadata expiration check: 0:20:23 ago on 2023年12月29日 星期五 10时 base-pkg/hotpatch status kernel-4.19.90-2112.8.0.0131.oe1/SGL_CVE_2022_30594-1-1/vmlinux NOT-APPLIED ``` + - 使用`dnf hotpatch --active `激活热补丁,可使用`dnf hotpatch --list`查询激活后的状态变化,变化逻辑见上文的热补丁状态转换图。 ```shell @@ -187,6 +195,7 @@ Last metadata expiration check: 0:16:20 ago on 2023年12月29日 星期五 10时 base-pkg/hotpatch status kernel-4.19.90-2112.8.0.0131.oe1/SGL_CVE_2022_30594-1-1/vmlinux ACTIVED ``` + - 使用`dnf hotpatch --accept `接收热补丁,可使用`dnf hotpatch --list`查询接收后的状态变化,变化逻辑见上文的热补丁状态转换图。 ```shell @@ -200,9 +209,10 @@ base-pkg/hotpatch status kernel-4.19.90-2112.8.0.0131.oe1/SGL_CVE_2022_30594-1-1/vmlinux ACCEPTED ``` - ## 热补丁应用 + `hotupgrade`命令根据cve id和热补丁名称进行热补丁修复,同时也支持全量修复。命令使用方式如下: + ```shell dnf hotupgrade [--cve [cve_id]] [PACKAGE ...] [--takeover] [-f] @@ -214,11 +224,11 @@ General DNF options: command-specific options: --takeover - kernel cold patch takeover operation + kernel cold patch takeover operation -f - force retain kernel rpm package if kernel kabi check fails + force retain kernel rpm package if kernel kabi check fails PACKAGE - Package to upgrade + Package to upgrade ``` - 使用`dnf hotupgrade PACKAGE`安装目标热补丁。 @@ -288,9 +298,9 @@ command-specific options: Complete! Apply hot patch succeed: kernel-4.19.90-2112.8.0.0131.oe1/SGL_CVE_2022_30594-1-1. ``` - + - 使用`dnf hotupgrade --cve CVE-2022-2021`安装CVE对应的热补丁,对应的CVE不存在。 - + ```shell [root@openEuler ~]# dnf hotupgrade --cve CVE-2022-2021 Last metadata expiration check: 1:37:44 ago on 2023年12月29日 星期五 13时49分39秒. @@ -300,9 +310,9 @@ command-specific options: Nothing to do. Complete! ``` - + - 使用`dnf hotupgrade --cve `指定cve_id安装时,该CVE对应的ACC低版本热补丁已安装时,删除低版本热补丁,安装高版本ACC热补丁包。 - + ```shell [root@openEuler ~]# dnf hotupgrade --cve CVE-2023-1070 Last metadata expiration check: 0:00:48 ago on 2024年01月02日 星期二 11时21分55秒. @@ -315,9 +325,9 @@ command-specific options: Apply hot patch succeed: kernel-5.10.0-153.12.0.92.oe2203sp2/ACC-1-3. [root@openEuler tmp]# ``` - + - 指定cve_id安装时,该CVE对应的最高版本热补丁包已存在 - + ```shell [root@openEuler ~]# dnf hotupgrade --cve CVE-2023-1070 Last metadata expiration check: 1:37:44 ago on 2023年12月29日 星期五 13时49分39秒. @@ -329,10 +339,10 @@ command-specific options: ``` - 使用`dnf hotupgrade`进行热补丁全量修复 - - 热补丁未安装时,使用`dnf hotupgrade`命令安装所有可安装热补丁。 - - - 当部分热补丁已经安装时,使用`dnf hotupgrade`命令进行全量修复,将保留已安装的热补丁,然后安装其他热补丁 - + - 热补丁未安装时,使用`dnf hotupgrade`命令安装所有可安装热补丁。 + + - 当部分热补丁已经安装时,使用`dnf hotupgrade`命令进行全量修复,将保留已安装的热补丁,然后安装其他热补丁 + - 使用`--takeover`进行内核热补丁收编 - 使用`dnf hotupgrade PACKAGE --takeover`安装热补丁,收编相应内核冷补丁;由于目标内核冷补丁kabi检查失败,进行自动卸载;accept热补丁,使热补丁重启后仍旧生效;恢复内核默认引导启动项。 @@ -383,7 +393,6 @@ command-specific options: 3 kvm_intel kvm_lapic_hv_timer_in_use : 0x54981db4 != 0xf58e6f1f ``` - ## 内核升级前kabi检查 `dnf upgrade-en` 命令支持内核冷补丁升级前kabi检查,命令使用方式如下: @@ -403,7 +412,7 @@ General DNF options: Include packages needed to fix the given CVE, in updates Upgrade-en command-specific options: PACKAGE - Package to upgrade + Package to upgrade ``` - 使用`dnf upgrade-en PACKAGE`安装目标冷补丁 @@ -451,7 +460,7 @@ Upgrade-en command-specific options: - 使用`dnf upgrade-en` 进行全量修复 -​ 全量修复如果包含目标kernel的升级,输出根据不同的kabi检查情况与`dnf upgrade-en PACKAGE`命令相同。 +​ 全量修复如果包含目标kernel的升级,输出根据不同的kabi检查情况与`dnf upgrade-en PACKAGE`命令相同。 ## 使用场景说明 @@ -480,6 +489,7 @@ CVE-2022-37966 Important/Sec. samba-client-4.17.2-5.oe2203sp1.x86_64 找到提供热补丁的相应cve,发现CVE-2021-1、CVE-2021-11、CVE-2021-2和CVE-2021-22可用热补丁修复。 在安装补丁前测试功能,基于redis.conf配置文件启动redis服务。 + ```shell [root@openEuler ~]# sudo redis-server ./redis.conf & [1] 285075 @@ -527,6 +537,7 @@ Connection closed by foreign host. ``` 指定修复CVE-2021-1,确认关联到对应的热补丁包,显示安装成功。 + ```shell [root@openEuler ~]# dnf hotupgrade patch-redis-6.2.5-1-ACC-1-1.x86_64 Last metadata expiration check: 0:01:39 ago on 2024年01月02日 星期二 20时16分45秒. @@ -540,6 +551,7 @@ Complete! ``` 使用dnf hotpatch --list确认该热补丁是否安装成功,确认Status为ACTIVED。 + ```shell [root@openEuler ~]# dnf hotpatch --list Last metadata expiration check: 0:04:43 ago on 2024年01月02日 星期二 20时16分45秒. @@ -550,6 +562,7 @@ redis-6.2.5-1/ACC-1-1/redis-server ACTIVED ``` 确认该cve是否已被修复,由于CVE-2021-1所使用的热补丁包patch-redis-6.2.5-1-ACC-1-1.x86_64同样修复CVE-2021-11,CVE-2021-1和CVE-2021-11都不予显示。 + ```shell [root@openEuler ~]# dnf hot-updateinfo list cves Last metadata expiration check: 0:08:48 ago on 2023年03月25日 星期六 11时53分46秒. @@ -580,6 +593,7 @@ Connection closed by foreign host. ``` 使用dnf hotpatch --remove指定热补丁手动卸载。 + ```shell [root@openEuler ~]# dnf hotpatch --remove redis-6.2.5-1 Last metadata expiration check: 0:11:52 ago on 2024年01月02日 星期二 20时16分45秒. @@ -594,6 +608,7 @@ redis-6.2.5-1/ACC-1-1/redis-server NOT-APPLIED ``` 使用热补丁扫描命令查看本机待修复cve,确认CVE-2021-1和CVE-2021-11正常显示。 + ```shell [root@openEuler ~]# dnf hot-updateinfo list cves Last metadata expiration check: 0:00:38 ago on 2023年03月25日 星期六 11时53分46秒. @@ -613,6 +628,7 @@ CVE-2022-37966 Important/Sec. samba-client-4.17.2-5.oe2203sp1.x86_64 - 安装高版本ACC热补丁 指定安装热补丁包patch-redis-6.2.5-1-ACC-1-2.x86_64。 + ```shell [root@openEuler ~]# dnf hotupgrade patch-redis-6.2.5-1-ACC-1-2.x86_64 Last metadata expiration check: 0:36:12 ago on 2024年01月02日 星期二 20时16分45秒. @@ -626,6 +642,7 @@ Complete! ``` 使用热补丁扫描命令查看本机待修复cve,由于patch-redis-6.2.5-1-ACC-1-2.x86_64比patch-redis-6.2.5-1-ACC-1-1.x86_64的热补丁版本高,低版本热补丁对应的CVE-2021-1和CVE-2021-11,以及高版本热补丁对应的CVE-2021-2和CVE-2021-22都被修复。 + ```shell [root@openEuler ~]# dnf hot-updateinfo list cves Last metadata expiration check: 0:00:38 ago on 2023年03月25日 星期六 11时53分46秒. @@ -667,13 +684,16 @@ CVE-2022-37966 Important/Sec. samba-client-4.17.2-5.oe2203sp1.x86_64 ``` + package中的name字段"patch-redis-6.2.5-2-ACC"的组成部分为:patch-源码包名-源码包version-源码包release-热补丁patch名,该热补丁包需要本机安装redis-6.2.5-2源码版本,检查本机redis安装版本。 ```shell [root@openEuler ~]# rpm -qa | grep redis redis-6.2.5-1.x86_64 ``` + 由于本机安装版本不匹配,大于本机安装版本,该热补丁包名不显示,以'-'显示。 + ```shell [root@openEuler ~]# dnf hot-updateinfo list cves Last metadata expiration check: 0:00:38 ago on 2023年03月25日 星期六 11时53分46秒. diff --git a/docs/zh/server/maintenance/aops/quick_deployment_of_aops.md b/docs/zh/server/maintenance/aops/quick_deployment_of_aops.md index 9fde4ac7c50d43b0507424d64dfe155d5ae8be6e..8842d32874d097538d17bbaa4f9cd18579156610 100644 --- a/docs/zh/server/maintenance/aops/quick_deployment_of_aops.md +++ b/docs/zh/server/maintenance/aops/quick_deployment_of_aops.md @@ -97,8 +97,8 @@ cd /etc/aops/ ​ **1. elasticsearch基础服务无法正常启动** - 查看/opt/es文件夹的权限,默认权限需要调整为777,可执行 "chmod -R 777 /opt/es" 。 +查看/opt/es文件夹的权限,默认权限需要调整为777,可执行 "chmod -R 777 /opt/es" 。 ​ **2. prometheus 基础服务无法正常启动** - 查看/etc/prometheus目录下是否存在prometheus.yml配置文件,如果不存在,请添加配置文件。 +查看/etc/prometheus目录下是否存在prometheus.yml配置文件,如果不存在,请添加配置文件。 diff --git a/docs/zh/server/maintenance/gala/using_gala_anteater.md b/docs/zh/server/maintenance/gala/using_gala_anteater.md index 5c2ab807122625e3df176bf25429f62f71ba5fda..405e3674fe33a69de2ca9e2dcf42f22bcf903295 100644 --- a/docs/zh/server/maintenance/gala/using_gala_anteater.md +++ b/docs/zh/server/maintenance/gala/using_gala_anteater.md @@ -109,7 +109,7 @@ Suppression: 执行如下命令启动gala-anteater -``` +```shell systemctl start gala-anteater ``` @@ -217,4 +217,4 @@ gala-anteater如果检测到异常点,会将结果输出至kafka的model_topic | errorMsg | string | 错误信息 | | SeverityText | string | 错误类型,表示"WARN", "ERROR" | | SeverityNumber | int | 错误等级 | -| is_anomaly | bool | 表示是否故障 | \ No newline at end of file +| is_anomaly | bool | 表示是否故障 | diff --git a/docs/zh/server/maintenance/gala/using_gala_spider.md b/docs/zh/server/maintenance/gala/using_gala_spider.md index c8b213e802236dfee5a8c98c2f639f2b74b3f727..d56579e821880e5f353a7376e7e910041f3cf10d 100644 --- a/docs/zh/server/maintenance/gala/using_gala_spider.md +++ b/docs/zh/server/maintenance/gala/using_gala_spider.md @@ -122,7 +122,7 @@ kafka: ### 使用方法 -##### 外部依赖软件部署 +#### 外部依赖软件部署 gala-spider 运行时需要依赖多个外部软件进行交互。因此,在启动 gala-spider 之前,用户需要将gala-spider依赖的软件部署完成。下图为 gala-spider 项目的软件依赖图。 @@ -186,8 +186,8 @@ arangodb 基于 rpm 的部署流程如下: arangodb3 服务器的配置文件路径为 `/etc/arangodb3/arangod.conf` ,需要修改如下的配置信息: - - endpoint:配置 arangodb3 的服务器地址。 - - authentication:访问 arangodb3 服务器是否需要进行身份认证,当前 gala-spider 还不支持身份认证,故此处将authentication设置为 false。 + - endpoint:配置 arangodb3 的服务器地址。 + - authentication:访问 arangodb3 服务器是否需要进行身份认证,当前 gala-spider 还不支持身份认证,故此处将authentication设置为 false。 示例配置如下: @@ -203,7 +203,7 @@ arangodb 基于 rpm 的部署流程如下: # systemctl start arangodb3 ``` -##### gala-spider配置项修改 +#### gala-spider配置项修改 依赖软件启动后,需要修改 gala-spider 配置文件的部分配置项内容。示例如下: @@ -229,7 +229,7 @@ storage: url: "http://localhost:8529" ``` -##### 启动服务 +#### 启动服务 运行 `systemctl start gala-spider` 。查看启动状态可执行 `systemctl status gala-spider` ,输出如下信息说明启动成功。 @@ -245,11 +245,11 @@ storage: └─2263793 /usr/bin/python3 /usr/bin/spider-storage ``` -##### 输出示例 +#### 输出示例 用户可以通过 arangodb 提供的 UI 界面来查询 gala-spider 输出的拓扑图。使用流程如下: -1. 在浏览器输入 arangodb 服务器地址,如:http://localhost:8529 ,进入 arangodb 的 UI 界面。 +1. 在浏览器输入 arangodb 服务器地址,如:,进入 arangodb 的 UI 界面。 2. 界面右上角切换至 `spider` 数据库。 @@ -402,11 +402,11 @@ prometheus: ### 使用方法 -##### 依赖软件部署 +#### 依赖软件部署 gala-inference 的运行依赖和 gala-spider一样,请参见[外部依赖软件部署](#外部依赖软件部署)。此外,gala-inference 还间接依赖 [gala-spider](#gala-spider) 和 [gala-anteater](using_gala_anteater.md) 软件的运行,请提前部署gala-spider和gala-anteater软件。 -##### 配置项修改 +#### 配置项修改 修改 gala-inference 的配置文件中部分配置项。示例如下: @@ -431,7 +431,7 @@ arangodb: url: "http://localhost:8529" ``` -##### 启动服务 +#### 启动服务 直接运行 `systemctl start gala-inference` 即可。可通过执行 `systemctl status gala-inference` 查看启动状态,如下打印表示启动成功。 @@ -447,7 +447,7 @@ arangodb: └─2445875 /usr/bin/python3 /usr/bin/gala-inference ``` -##### 输出示例 +#### 输出示例 当异常检测模块 gala-anteater 检测到 KPI 异常后,会将对应的异常 KPI 事件输出到 kafka 中,gala-inference 会一直监测该异常 KPI 事件的消息,如果收到异常 KPI 事件的消息,就会触发根因定位。根因定位会将定位结果输出到 kafka 中,用户可以在 kafka 服务器中查看根因定位的输出结果,基本步骤如下: diff --git a/docs/zh/server/maintenance/kernel_live_upgrade/installation_and_deployment.md b/docs/zh/server/maintenance/kernel_live_upgrade/installation_and_deployment.md index 7170790448a847877b30d569dd883baa1d7373e0..26a955630831414e1c414f219cb8ff2a77ffe351 100644 --- a/docs/zh/server/maintenance/kernel_live_upgrade/installation_and_deployment.md +++ b/docs/zh/server/maintenance/kernel_live_upgrade/installation_and_deployment.md @@ -6,17 +6,17 @@ ### 硬件要求 -- 当前仅支持arm64架构 +- 当前仅支持arm64架构 ### 软件要求 -- 操作系统:openEuler 24.03 +- 操作系统:openEuler 24.03 ## 环境准备 -- 安装openEuler系统,安装方法参考 《[安装指南](../../installation_upgrade/installation/installation_on_servers.md)》 +- 安装openEuler系统,安装方法参考 《[安装指南](../../installation_upgrade/installation/installation_on_servers.md)》 -- 安装内核热升级工具需要使用root权限 +- 安装内核热升级工具需要使用root权限 ## 安装内核热升级工具 @@ -72,6 +72,7 @@ ### 配置介绍 内核热升级工具的配置文件位于/etc/nvwa,配置文件包括: + - nvwa-restore.yaml 该配置文件用于指导内核热升级工具在内核热升级过程中如何保存和恢复现场,具体配置如下: @@ -79,19 +80,19 @@ + pids pids用于指明nvwa热升级过程中需要保留和恢复的进程,此处的进程通过进程号(pid)进行标识,需要注意的是,nvwa管理的进程在nvwa服务启动后,会被自动恢复。 - + + services - + services用于指明nvwa热升级过程中需要保留和恢复的服务。与pids的区别在于,内核热升级工具可以直接保存和恢复进程的状态,对于服务,内核热升级工具则需要依赖systemd进行相关操作。此处的服务名称,应该使用systemd中使用的服务名称。需要注意的是,对于nvwa管理的服务,是否要在nvwa启动时自动恢复,取决于systemd中有没有使能该服务,且当前支持的服务类型只有notify和oneshot。 - + + restore_net restore_net用于指明是否需要内核热升级工具保存和恢复网络配置,如果网络配置有误,有可能导致恢复后网络不可用,默认关闭。 - + + enable_quick_kexec enable_quick_kexec用于指明是否需要使能quick kexec特性,quick kexec是nvwa社区推出的,加速内核重启过程的一个特性。使用该特性,需要在cmdline中,加入"quickkexec=128M"。128指分配给quick kexec特性的内存大小,该内存将用于在升级过程中加载kernel和initramfs,因此大小需要大于升级过程中涉及到的kernel,initramfs大小之和。该特性默认关闭。 - + + enable_pin_memory enable_pin_memory用于指明是否需要使能pin memory特性,pin memory是nvwa社区推出的,加速进程保存恢复过程的一个特性。pin_memory特性暂不支持多进程应用备份恢复,使用该特性,需要在cmdline中,加入"max_pin_pid_num=10 redirect_space_size=2M pinmemory=200M@0x640000000"。 @@ -99,7 +100,8 @@ 其中,max_pin_pid_num代表支持pin memory恢复的最大进程数目,redirect_space_size代表pin memory过程中重定向物理页所需要的预留内存空间,建议配置为pin memory总预留内存的1/100,pinmemory指明这段内存的起点和大小。从0x640000000开始的200M空间,是pin memory使用的全部内存空间,这段空间不应该被其他程序使用。 - nvwa-restore.yaml的配置示例 -``` + +```yaml pids: - 14109 services: @@ -112,7 +114,7 @@ enable_pin_memory: true - nvwa-server.yaml 该文件包含了内核热升级工具运行过程中,需要使用到的配置信息,具体如下: - + + criu_dir 用于指明内核热升级工具在保存现场过程中,存储产生的信息文件夹路径。需要注意的是,这些信息可能会占用较大的磁盘空间。 @@ -120,22 +122,22 @@ enable_pin_memory: true + criu_exe 用于指明内核热升级工具使用的criu可执行文件路径,除非是对criu进行调测,一般不建议修改。 - + + kexec_exe 用于指明内核热升级工具使用的kexec可执行文件路径,除非是对kexec进行调测,一般不建议修改。 - + + systemd_etc 用于指明覆盖systemd配置过程中,使用到的文件夹路径。该路径由systemd决定,一般不需要修改。 - + + log_dir 存放内核热升级工具产生的log信息,log模块当前未启用。内核热升级工具日志信息的查看,参考其他章节\<使用方法> - nvwa-server.yaml的配置示例 -``` +```yaml criu_dir: /var/nvwa/running/ criu_exe: /usr/sbin/criu kexec_exe: /usr/sbin/kexec diff --git a/docs/zh/server/maintenance/syscare/faqs_and_solutions.md b/docs/zh/server/maintenance/syscare/faqs_and_solutions.md index 5508536daa8908ce2e5d3130ff10dfdb47341a38..899209ac7b943a5da3ef65feeaa81b441135309d 100644 --- a/docs/zh/server/maintenance/syscare/faqs_and_solutions.md +++ b/docs/zh/server/maintenance/syscare/faqs_and_solutions.md @@ -2,15 +2,15 @@ ## 问题1:报错:“alloc upatch module memory failed” - - 原因:触发selinux约束。 - - 解决方法:按照报错建议命令操作,手动添加策略,由于不同情况添加策略不同,无法穷尽枚举,参考该issue: 。 +- 原因:触发selinux约束。 +- 解决方法:按照报错建议命令操作,手动添加策略,由于不同情况添加策略不同,无法穷尽枚举,参考该issue: 。 ## 问题2:报错: “patch file error 2” - - 原因:补丁检测失败。 - - 解决方法:补丁无法正常打入,更换补丁。 +- 原因:补丁检测失败。 +- 解决方法:补丁无法正常打入,更换补丁。 ## 问题3:报错: “build project error 11” - - 原因:源码包编译失败。 - - 解决方法:尝试使用```rpmbuild -ra *.src.rpm```命令测试源码包是否可正常编译并满足其编译依赖。 +- 原因:源码包编译失败。 +- 解决方法:尝试使用```rpmbuild -ra *.src.rpm```命令测试源码包是否可正常编译并满足其编译依赖。 diff --git a/docs/zh/server/maintenance/syscare/syscare_user_guide.md b/docs/zh/server/maintenance/syscare/syscare_user_guide.md index d6d489f21ae60737ef9bbb0d30f6041d187fb70e..aaa3da5576bbaa21fbdc047806f33145df88c90a 100644 --- a/docs/zh/server/maintenance/syscare/syscare_user_guide.md +++ b/docs/zh/server/maintenance/syscare/syscare_user_guide.md @@ -2,7 +2,7 @@ 本文档给出SysCare介绍,并给出基于openEuler的SysCare安装方法以及如何使用SysCare,让用户了解SysCare,并指导用户安装和使用SysCare。 -# 读者对象 +## 读者对象 本文档主要适用于使用openEuler并需要使用热补丁的用户。用户需要具备以下经验和技能: diff --git a/docs/zh/server/maintenance/sysmonitor/sysmonitor_user_guide.md b/docs/zh/server/maintenance/sysmonitor/sysmonitor_user_guide.md index 77225e99775dffadbb0aac6acaca6b4e42366b0b..584c7978a4a970034814fd9cda2fe0d7222b45ac 100644 --- a/docs/zh/server/maintenance/sysmonitor/sysmonitor_user_guide.md +++ b/docs/zh/server/maintenance/sysmonitor/sysmonitor_user_guide.md @@ -56,18 +56,25 @@ sysmonitor 有一个主配置文件(`/etc/sysconfig/sysmonitor`),用于配置 ### 命令参考 - 启动监控服务 + ``` shell systemctl start sysmonitor ``` + - 关闭监控服务 + ``` shell systemctl stop sysmonitor ``` + - 重启监控服务 + ``` shell systemctl restart sysmonitor ``` + - 修改监控项的配置文件后,重载监控服务可使修改后的配置动态生效 + ``` shell systemctl reload sysmonitor ``` @@ -76,9 +83,9 @@ systemctl reload sysmonitor 在默认情况下,为了防止 sysmonitor.log 文件过大,提供了切分转储日志的机制。日志将被转储到磁盘目录下,这样就能够保持一定量的日志。 -配置文件为` /etc/rsyslog.d/sysmonitor.conf`,因为增加了 rsyslog 配置文件,第一次安装 sysmonitor 后,需要重启 rsyslog 服务生效 sysmonitor 日志配置。 +配置文件为`/etc/rsyslog.d/sysmonitor.conf`,因为增加了 rsyslog 配置文件,第一次安装 sysmonitor 后,需要重启 rsyslog 服务生效 sysmonitor 日志配置。 -``` +```sh $template sysmonitorformat,"%TIMESTAMP:::date-rfc3339%|%syslogseverity-text%|%msg%\n" $outchannel sysmonitor, /var/log/sysmonitor.log, 2097152, /usr/libexec/sysmonitor/sysmonitor_log_dump.sh @@ -103,18 +110,22 @@ stop ### 简介 当文件系统出现故障时会导致 IO 操作异常从而引发操作系统一系列问题。通过文件系统故障检测及时发现,以便于系统管理员或用户及时处理故障,修复问题。 + ### 配置文件说明 + 无 ### 异常日志 对于增加了 errors=remount-ro 挂载选项的文件系统,如果监控到 ext3/ext4文件系统故障,sysmonitor.log 中打印异常信息示例如下: -``` + +```sh info|sysmonitor[127]: loop0 filesystem error. Remount filesystem read-only. ``` 其他异常场景下,如果监控到 ext3/ext4 文件系统故障,sysmonitor.log 中打印异常信息示例如下: -``` + +```sh info|sysmonitor[127]: fs_monitor_ext3_4: loop0 filesystem error. flag is 1879113728. ``` @@ -128,13 +139,14 @@ info|sysmonitor[127]: fs_monitor_ext3_4: loop0 filesystem error. flag is 1879113 配置目录为`/etc/sysmonitor/process`, 每个进程或模块一个配置文件。 -``` +```sh USER=root NAME=irqbalance RECOVER_COMMAND=systemctl restart irqbalance MONITOR_COMMAND=systemctl status irqbalance STOP_COMMAND=systemctl stop irqbalance ``` + 各配置项如下: | 配置项 | 配置项说明 | 是否必配 | 默认值 | @@ -172,13 +184,13 @@ STOP_COMMAND=systemctl stop irqbalance 如果监控到进程或模块异常,/var/log/sysmonitor.log 中打印异常信息示例如下: - ``` + ```sh info|sysmonitor[127]: irqbalance is abnormal, check cmd return 1, use "systemctl restart irqbalance" to recover ``` 如果监控到进程或模块恢复正常,/var/log/sysmonitor.log 中打印日志示例如下: - ``` + ```sh info|sysmonitor[127]: irqbalance is recovered ``` @@ -186,13 +198,13 @@ STOP_COMMAND=systemctl stop irqbalance 如果监控到进程或模块异常,/var/log/sysmonitor.log 中打印异常信息示例如下: - ``` + ```sh info|sysmonitor[127]: irqbalance is abnormal, check cmd return 1, recover cmd is null, will not recover ``` 如果监控到进程或模块恢复正常,/var/log/sysmonitor.log 中打印日志示例如下: - ``` + ```sh info|sysmonitor[127]: irqbalance is recovered ``` @@ -206,7 +218,7 @@ STOP_COMMAND=systemctl stop irqbalance 配置文件为 `/etc/sysmonitor/file`。每个监控配置项为一行,监控配置项包含两个内容:监控文件(目录)和监控事件。监控文件(目录)是绝对路径,监控文件(目录)和监控事件中间由一个或多个空格隔开。 -配置文件支持在` /etc/sysmonitor/file.d` 目录下增加文件监控项配置,配置方法与 `/etc/sysmoitor/file` 相同。 +配置文件支持在`/etc/sysmonitor/file.d` 目录下增加文件监控项配置,配置方法与 `/etc/sysmoitor/file` 相同。 - 由于日志长度限制,建议配置的文件和目录绝对路径长度小于 223。如果配置的监控对象绝对路径长度超过223,可能会有日志打印不完整的现象出现。 @@ -214,7 +226,7 @@ STOP_COMMAND=systemctl stop irqbalance - 由于系统路径长度限制,监控的文件或目录绝对路径长度必须小于 4096。 -- 支持监控目录和常规文件,/proc 和 /proc/* /dev和/dev/* /sys和/sys/* 管道文件 socket 文件等均不支持监控。 +- 支持监控目录和常规文件,/proc 和 /proc/* /dev和/dev/* /sys和/sys/* 管道文件 socket 文件等均不支持监控。 - /var/log 和 /var/log/* 均只支持删除事件。 @@ -227,7 +239,8 @@ STOP_COMMAND=systemctl stop irqbalance - 目前暂不支持目录递归监控,只能监控配置文件中的目录,子目录不会监控。 - 监控文件(目录)采用了位图的方式配置要监控的事件,对文件或目录进行监控的事件位图如下所示: -``` + +```sh ------------------------------- | 11~32 | 10 | 9 | 1~8 | ------------------------------- @@ -242,7 +255,7 @@ STOP_COMMAND=systemctl stop irqbalance | 10 | 文件、目录删除事件 | 是 | | 11~32 | 保留 | 否 | -- 修改文件监控的配置文件后,须执行` systemctl reload sysmonitor`,新的配置在最多 60 秒后生效。 +- 修改文件监控的配置文件后,须执行`systemctl reload sysmonitor`,新的配置在最多 60 秒后生效。 - 监控事件需要严格遵守上述规则,如果配置有误,则无法监控;如果配置项中监控事件为空,则默认只监控删除事件,即 0x200。 - 文件或目录删除后,只有当所有打开该文件的进程都停止后才会上报删除事件。 - 监控的文件通过 vi、sed 等操作修改后会在监控日志中打印 File "XXX" may have been changed。 @@ -252,13 +265,13 @@ STOP_COMMAND=systemctl stop irqbalance 配置对 /home 下子目录的增加和删除事件监控,低12 位位图为:001100000000,则可以配置如下: -``` +```sh /home 0x300 ``` 配置对 /etc/ssh/sshd_config 文件的删除事件监控,低12位位图为:001000000000,则可以配置如下: -``` +```sh /etc/sshd/sshd_config 0x200 ``` @@ -266,7 +279,7 @@ STOP_COMMAND=systemctl stop irqbalance 如果监控文件有配置的事件发生,/var/log/sysmonitor.log 中打印日志示例如下: -``` +```sh info|sysmonitor[127]: 1 events queued info|sysmonitor[127]: 1th events handled info|sysmonitor[127]: Subfile "111" under "/home" was added. @@ -282,7 +295,7 @@ info|sysmonitor[127]: Subfile "111" under "/home" was added. 配置文件为 `/etc/sysmonitor/disk`。 -``` +```sh DISK="/var/log" ALARM="90" RESUME="80" DISK="/" ALARM="95" RESUME="85" ``` @@ -302,9 +315,9 @@ DISK="/" ALARM="95" RESUME="85" ### 异常日志 -如果监控到磁盘空间告警,`/var/log/sysmonitor.log `中打印信息示例如下: +如果监控到磁盘空间告警,`/var/log/sysmonitor.log`中打印信息示例如下: -``` +```sh warning|sysmonitor[127]: report disk alarm, /var/log used:90% alarm:90% info|sysmonitor[127]: report disk recovered, /var/log used:4% resume:10% ``` @@ -319,10 +332,11 @@ info|sysmonitor[127]: report disk recovered, /var/log used:4% resume:10% 配置文件为 `/etc/sysmonitor/network`。 -``` +```sh #dev event eth1 UP ``` + 各配置项说明如下表 | 配置项 | 配置项说明 | 是否必配 | 默认值 | | ------ | ------------------------------------------------------------ | -------- | ------------------------------------------------- | @@ -340,7 +354,7 @@ eth1 UP 如果监控到配置的网卡事件,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]: lo: ip[::1] prefixlen[128] is added, comm: (ostnamed)[1046], parent comm: syst emd[1] info|sysmonitor[127]: lo: device is up, comm: (ostnamed)[1046], parent comm: systemd[1] @@ -348,7 +362,7 @@ info|sysmonitor[127]: lo: device is up, comm: (ostnamed)[1046], parent comm: sys 如果监控到路由事件, `/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[881]: Fib4 replace table=255 192.168.122.255/32, comm: daemon-init[1724], parent com m: systemd[1] info|sysmonitor[881]: Fib4 replace table=254 192.168.122.0/24, comm: daemon-init[1724], parent comm: systemd[1] @@ -358,6 +372,7 @@ info|sysmonitor[881]: Fib6 replace fe80::5054:ff:fef6:b73e/128, comm: kworker/1: ``` ## cpu 监控 + ### 简介 监控系统全局或指定域内 cpu 的占用情况,当 cpu 使用率超出用户设置的告警阈值时,执行用户配置的日志收集命令。 @@ -368,7 +383,7 @@ info|sysmonitor[881]: Fib6 replace fe80::5054:ff:fef6:b73e/128, comm: kworker/1: 当监控系统全局 cpu 时,配置文件示例如下: -``` +```sh # cpu usage alarm percent ALARM="90" @@ -387,7 +402,7 @@ REPORT_COMMAND="" 当监控系统指定域 cpu 时,配置文件示例如下: -``` +```sh # monitor period (second) MONITOR_PERIOD="60" @@ -424,7 +439,7 @@ REPORT_COMMAND="" 如果监控到全局 cpu 使用率告警或恢复且配置了日志收集命令,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]: CPU usage alarm: 91.3% info|sysmonitor[127]: cpu monitor: execute REPORT_COMMAND[sysmoniotrcpu] sucessfully info|sysmonitor[127]: CPU usage resume 70.1% @@ -432,7 +447,7 @@ info|sysmonitor[127]: CPU usage resume 70.1% 如果监控到某个域的 cpu 平均使用率告警或恢复且配置了日志收集命令,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]: CPU 1,2,3 usage alarm: 91.3% info|sysmonitor[127]: cpu monitor: execute REPORT_COMMAND[sysmoniotrcpu] sucessfully info|sysmonitor[127]: CPU 1,2,3 usage resume 70.1% @@ -448,7 +463,7 @@ info|sysmonitor[127]: CPU 1,2,3 usage resume 70.1% 配置文件为 `/etc/sysmonitor/memory`。 -``` +```sh # memory usage alarm percent ALARM="90" @@ -473,9 +488,9 @@ PERIOD="60" ### 异常日志 -如果监控到内存告警,sysmonitor 获取 `/proc/meminfo `信息,打印到` /var/log/sysmonitor.log` 中,信息如下: +如果监控到内存告警,sysmonitor 获取 `/proc/meminfo`信息,打印到`/var/log/sysmonitor.log` 中,信息如下: -``` +```sh info|sysmonitor[127]: memory usage alarm: 90% info|sysmonitor[127]:---------------show /proc/meminfo: --------------- info|sysmonitor[127]:MemTotal: 3496388 kB @@ -488,15 +503,15 @@ info|sysmonitor[127]:SwapCached: 4492 kB info|sysmonitor[127]:---------------show_memory_info end. --------------- ``` -sysmonitor 有如下打印信息时,表示 sysmonitor 会调用 "echo m > /proc/sysrq-trigger" 命令导出内存分配的信息(可以在 /var/log/messages 中进行查看)。 +sysmonitor 有如下打印信息时,表示 sysmonitor 会调用 "echo m > /proc/sysrq-trigger" 命令导出内存分配的信息(可以在 /var/log/messages 中进行查看)。 -``` +```sh info|sysmonitor[127]: sysrq show memory ifno in message。 ``` 告警恢复时,打印信息如下: -``` +```sh info|sysmonitor[127]: memory usage resume: 4.6% ``` @@ -510,7 +525,7 @@ info|sysmonitor[127]: memory usage resume: 4.6% 配置文件为 `/etc/sysmonitor/pscnt`。 -``` +```sh # number of processes(include threads) when alarm occur ALARM="1600" @@ -540,7 +555,7 @@ SHOW_TOP_PROC_NUM="10" | RESUME_RATIO | 大于等于0小于100的值,可以为小数。进程使用率恢复阈值,必须必告警阈值小。 | 否 | 80 | | SHOW_TOP_PROC_NUM | 使用线程数量最新 TOP 的进程信息 | 否 | 10 | -- 修改进程数监控的配置文件后,须执行` systemctl reload sysmonitor`,新的配置在一个监控周期后生效。 +- 修改进程数监控的配置文件后,须执行`systemctl reload sysmonitor`,新的配置在一个监控周期后生效。 - ALARM 值应该大于 RESUME 值。 - 进程数告警产生阈值取 ALARM 值与 `/proc/sys/kernel/pid_max` 的 ALARM_RATIO 中的最大值,告警恢复阈值取 RESUME 值与 `/proc/sys/kernel/pid_max` 的 RESUME_RATIO 中的最大值。 - 线程数告警产生阈值取 ALARM 值与 `/proc/sys/kernel/threads-max` 的 ALARM_RATIO 中的最大值,告警恢复阈值取 RESUME 值与 `/proc/sys/kernel/threads-max` 的 RESUME_RATIO 中的最大值。 @@ -548,7 +563,7 @@ SHOW_TOP_PROC_NUM="10" - 线程监控启动时,由 `/etc/sysconfig/sysmonitor` 中 `PSCNT_MONITOR` 项和 `/etc/sysmonitor/pscnt` 中 `SHOW_TOP_PROC_NUM` 项设置。 - `PSCNT_MONITOR` 为 on,且 `SHOW_TOP_PROC_NUM` 设置为合法值时,为启动。 - `PSCNT_MONITOR` 为 on, `SHOW_TOP_PROC_NUM` 为 0时,为关闭。 - - `PSCNT_MONITOR `为 off,为关闭。 + - `PSCNT_MONITOR`为 off,为关闭。 - 进程数量告警时,增加打印系统句柄使用信息和内存信息(/proc/meminfo)。 - 线程数量告警时,会记录线程总数信息,TOP 进程信息,当前环境进程数量信息,系统句柄数信息,内存信息(/proc/meminfo)。 - 监控项监控周期到达前,若系统出现资源不足(如线程数超过系统最大线程数),则监控告警本身将由于资源受限无法正常运行,进而无法进行告警。 @@ -557,7 +572,7 @@ SHOW_TOP_PROC_NUM="10" 如果监控到进程数告警,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]:---------------process count alarm start: --------------- info|sysmonitor[127]: process count alarm:1657 info|sysmonitor[127]: process count alarm, show sys fd count: 2592 @@ -577,13 +592,13 @@ info|sysmonitor[127]:---------------process count alarm end: --------------- 如果监控到进程数恢复告警,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]: process count resume: 1200 ``` 如果监控到线程数告警,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]:---------------threads count alarm start: --------------- info|sysmonitor[127]:threads count alarm: 273 info|sysmonitor[127]:open threads most 10 processes is [top1:pid=1756900,openthreadsnum=13,cmd=/usr/bin/sysmonitor --daemon] @@ -602,7 +617,7 @@ info|sysmonitor[127]:---------------threads count alarm end. --------------- 配置文件为 `/etc/sysmonitor/sys_fd_conf`。 -``` +```sh # system fd usage alarm percent SYS_FD_ALARM="80" # system fd usage alarm resume percent @@ -626,13 +641,13 @@ SYS_FD_PERIOD="600" 如果监控到 fd 总数告警,在监控日志中打印告警。`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]: sys fd count alarm: 259296 ``` 系统句柄使用告警时,会打印前三个使用句柄数最多的进程: -``` +```sh info|sysmonitor[127]:open fd most three processes is:[top1:pid=23233,openfdnum=5000,cmd=/home/openfile] info|sysmonitor[127]:open fd most three processes is:[top2:pid=23267,openfdnum=5000,cmd=/home/openfile] info|sysmonitor[127]:open fd most three processes is:[top3:pid=30144,openfdnum=5000,cmd=/home/openfile] @@ -648,7 +663,7 @@ info|sysmonitor[127]:open fd most three processes is:[top3:pid=30144,openfdnum=5 配置文件为 `/etc/sysmonitor/inode`。 -``` +```sh DISK="/" DISK="/var/log" ``` @@ -670,7 +685,7 @@ DISK="/var/log" 如果监控到磁盘 inode 告警,`/var/log/sysmonitor.log`中打印信息示例如下: -``` +```sh info|sysmonitor[4570]:report disk inode alarm, /var/log used:90% alarm:90% info|sysmonitor[4570]:report disk inode recovered, /var/log used:79% alarm:80% ``` @@ -685,7 +700,7 @@ info|sysmonitor[4570]:report disk inode recovered, /var/log used:79% alarm:80% 配置文件为 `/etc/sysmonitor/iodelay`。 -``` +```sh DELAY_VALUE="500" ``` @@ -697,14 +712,14 @@ DELAY_VALUE="500" 如果监控到本地磁盘 IO 延时过大告警,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]:local disk sda IO delay is too large, I/O delay threshold is 70. info|sysmonitor[127]:disk is sda, io delay data: 71 72 75 87 99 29 78 ...... ``` 如果监控到本地磁盘 IO 延时告警恢复,`/var/log/sysmonitor.log` 中打印信息示例如下: -``` +```sh info|sysmonitor[127]:local disk sda IO delay is normal, I/O delay threshold is 70. info|sysmonitor[127]:disk is sda, io delay data: 11 22 35 8 9 29 38 ...... ``` @@ -719,7 +734,7 @@ info|sysmonitor[127]:disk is sda, io delay data: 11 22 35 8 9 29 38 ...... 配置文件为`/etc/sysmonitor/zombie`。 -``` +```sh # Ceiling zombie process counts of alarm ALARM="500" @@ -740,7 +755,7 @@ PERIOD="600" 如果监控到僵尸进程个数告警,`/var/log/sysmonitor.log`中打印信息如下: -``` +```sh info|sysmonitor[127]: zombie process count alarm: 600 info|sysmonitor[127]: zombie process count resume: 100 ``` @@ -755,7 +770,7 @@ info|sysmonitor[127]: zombie process count resume: 100 配置文件位于`/etc/sysmonitor.d/`路径下,每个进程或模块对应一个配置文件。 -``` +```sh MONITOR_SWITCH="on" TYPE="periodic" EXECSTART="/usr/sbin/iomonitor_daemon" @@ -783,6 +798,6 @@ PERIOD="1800" 如果 daemon 类型监控项异常退出,/var/log/sysmonitor.log 中会有如下记录: -``` +```sh info|sysmonitor[127]: custom daemon monitor: child process[11609] name unetwork_alarm exit code[127],[1] times. ``` diff --git a/docs/zh/server/maintenance/troubleshooting/troubleshooting.md b/docs/zh/server/maintenance/troubleshooting/troubleshooting.md index d58131a79a4cc3314498156ad7d22805c23e1f4c..930ef70180749cb004c12ea4a8f6156b60b0e8ce 100644 --- a/docs/zh/server/maintenance/troubleshooting/troubleshooting.md +++ b/docs/zh/server/maintenance/troubleshooting/troubleshooting.md @@ -1,13 +1,5 @@ # 故障应急处理 -- [故障应急处理](#故障应急处理) - - [触发kdump重启](#触发kdump重启) - - [强制重启](#强制重启) - - [重启网络](#重启网络) - - [修复文件系统](#修复文件系统) - - [手动dropcache](#手动dropcache) - - [救援模式和单用户模式](#救援模式和单用户模式) - ## 触发kdump重启 ```shell diff --git a/docs/zh/server/memory_storage/gmem/installation_and_deployment.md b/docs/zh/server/memory_storage/gmem/installation_and_deployment.md index 671e3e69784deed4691911be3c0e49040c5e3530..b1d9f32044988684cad298811a845434bcd6e27f 100644 --- a/docs/zh/server/memory_storage/gmem/installation_and_deployment.md +++ b/docs/zh/server/memory_storage/gmem/installation_and_deployment.md @@ -20,7 +20,7 @@ [CANN社区版历史版本-昇腾社区 (hiascend.com)](https://www.hiascend.com/software/cann/community-history) - [固件与驱动-昇腾社区 (hiascend.com)](https://www.hiascend.com/zh/hardware/firmware-drivers/community?product=2&model=19&cann=6.0.1.alpha001&driver=1.0.18.alpha) + [固件与驱动-昇腾社区 (hiascend.com)](https://www.hiascend.com/zh/hardware/firmware-drivers/community?product=2&model=19&cann=6.0.1.alpha001&driver=1.0.18.alpha) | 来源 | 软件包 | | ------------------------------------------------------------ | ------------------------------------------------------------ | @@ -92,7 +92,7 @@ | 0 | 0000:81:00.0 | 0 1979 / 15039 0 / 32768 | +======================+===============+====================================================+ ``` - + * 安装gmem-example软件包。 gmem-example会更新host驱动、NPU侧驱动及NPU侧内核。安装完成后重启系统使驱动生效。 @@ -104,7 +104,7 @@ * 安装mindspore。 获取正确的mindspore版本并安装,安装后可通过执行以下命令验证mindspore功能是否正常。 - + ```sh python -c "import mindspore;mindspore.run_check()" MindSpore version: x.x.x diff --git a/docs/zh/server/memory_storage/hsak/development_with_hsak.md b/docs/zh/server/memory_storage/hsak/development_with_hsak.md index fec79e33414e7f92fae2caa26bb048971eac78c3..d517ac9ae5459cce98b23bbca5c38a942a515dfc 100644 --- a/docs/zh/server/memory_storage/hsak/development_with_hsak.md +++ b/docs/zh/server/memory_storage/hsak/development_with_hsak.md @@ -1,10 +1,11 @@ +# 使用说明 -## 使用说明 - -### nvme.conf.in配置文件 +## nvme.conf.in配置文件 HSAK配置文件默认安装在/etc/spdk/nvme.conf.in,开发人员可以根据实际业务需要对配置文件进行修改,配置文件内容如下: + - [Global] + 1. ReactorMask:指定用于轮询IO的核(16进制,不能指定0核,按bit位从低位到高位,分别表示不同CPU核,如:0x1表示0核,0x6表示1、2两个核,以此类推,本字段最大支持34个字符,去掉表示16进制的0x标记,剩余32个计数字符,每个16进制字符最大是F,可表示4个核,所以最多可以支持32*4=128个核)。 2. LogLevel:HSAK日志打印级别(0:error;1:warning;2:notice;3:info;4:debug)。 3. MemSize:HSAK占用的内存(最小值为500MB)。 @@ -13,12 +14,16 @@ HSAK配置文件默认安装在/etc/spdk/nvme.conf.in,开发人员可以根据 6. IoStat:是否使能IO统计开关(Yes\No)。 7. RpcServer:是否启动rpc侦听线程(Yes\No)。 8. NvmeCUSE:是否启动CUSE功能(Yes\No),开启后在/dev/spdk目录下生成nvme字符设备。 + - [Nvme] + 1. TransportID:指定NVMe控制器的PCI地址和名称,使用格式为:TransportID "trtype:PCIe traddr:0000:09:00.0" nvme0。 2. RetryCount:IO失败时的重试次数,0表示不重试,最大255。 3. TimeoutUsec:IO超时时间,0或者不配置该配置项表示不设置超时时间,单位是μs。 4. ActionOnTimeout:IO超时行为(None:仅打印信息;Reset:reset控制器;abort:丢弃超时指令),默认None。 + - [Reactor] + 1. BatchSize:支持批量提交提交IO的个数,默认是8,最大是32。 ### 头文件引用 diff --git a/docs/zh/server/memory_storage/hsak/hsak_c_apis.md b/docs/zh/server/memory_storage/hsak/hsak_c_apis.md index e25b77aa96eca05b0f7082a1edfece571d50b9f6..e2a059eba4031808875fb287b924652b82d5297b 100644 --- a/docs/zh/server/memory_storage/hsak/hsak_c_apis.md +++ b/docs/zh/server/memory_storage/hsak/hsak_c_apis.md @@ -1,108 +1,112 @@ +# C接口 -## C接口 +## 宏定义和枚举 -### 宏定义和枚举 +### bdev_rw.h -#### bdev_rw.h +#### enum libstorage_ns_lba_size + +1. 原型 + + ```sh + enum libstorage_ns_lba_size + { + LIBSTORAGE_NVME_NS_LBA_SIZE_512 = 0x9, + LIBSTORAGE_NVME_NS_LBA_SIZE_4K = 0xc + }; + ``` + +2. 描述 + + 磁盘sector_size(数据)大小。 -##### enum libstorage_ns_lba_size +#### enum libstorage_ns_md_size -1. 原型 +1. 原型 -``` -enum libstorage_ns_lba_size -{ -LIBSTORAGE_NVME_NS_LBA_SIZE_512 = 0x9, -LIBSTORAGE_NVME_NS_LBA_SIZE_4K = 0xc -}; -``` + ```shell + enum libstorage_ns_md_size + { + LIBSTORAGE_METADATA_SIZE_0 = 0, + LIBSTORAGE_METADATA_SIZE_8 = 8, + LIBSTORAGE_METADATA_SIZE_64 = 64 + }; + ``` -2. 描述 +2. 描述 -磁盘sector_size(数据)大小。 + 磁盘meta data(元数据) size大小。 -##### enum libstorage_ns_md_size +3. 备注 -1. 原型 -``` -enum libstorage_ns_md_size -{ -LIBSTORAGE_METADATA_SIZE_0 = 0, -LIBSTORAGE_METADATA_SIZE_8 = 8, -LIBSTORAGE_METADATA_SIZE_64 = 64 -}; -``` -2. 描述 + - ES3000 V3(单端口)支持5种扇区类型的格式化(512+0,512+8,4K+64,4K,4K+8)。 -磁盘meta data(元数据) size大小。 + - ES3000 V3(双端口)支持4种扇区类型的格式化(512+0,512+8,4K+64,4K)。 -3. 备注 + - ES3000 V5 支持5种扇区类型的格式化(512+0,512+8,4K+64,4K,4K+8)。 -- ES3000 V3(单端口)支持5种扇区类型的格式化(512+0,512+8,4K+64,4K,4K+8)。 + - Optane盘支持7种扇区类型的格式化(512+0,512+8,512+16,4K,4K+8,4K+64,4K+128)。 -- ES3000 V3(双端口)支持4种扇区类型的格式化(512+0,512+8,4K+64,4K)。 +#### enum libstorage_ns_pi_type -- ES3000 V5 支持5种扇区类型的格式化(512+0,512+8,4K+64,4K,4K+8)。 +1. 原型 -- Optane盘支持7种扇区类型的格式化(512+0,512+8,512+16,4K,4K+8,4K+64,4K+128)。 + ```shell + enum libstorage_ns_pi_type + { + LIBSTORAGE_FMT_NVM_PROTECTION_DISABLE = 0x0, + LIBSTORAGE_FMT_NVM_PROTECTION_TYPE1 = 0x1, + LIBSTORAGE_FMT_NVM_PROTECTION_TYPE2 = 0x2, + LIBSTORAGE_FMT_NVM_PROTECTION_TYPE3 = 0x3, + }; + ``` +2. 描述 -##### enum libstorage_ns_pi_type + 磁盘支持的保护类型。 -1. 原型 -``` -enum libstorage_ns_pi_type -{ -LIBSTORAGE_FMT_NVM_PROTECTION_DISABLE = 0x0, -LIBSTORAGE_FMT_NVM_PROTECTION_TYPE1 = 0x1, -LIBSTORAGE_FMT_NVM_PROTECTION_TYPE2 = 0x2, -LIBSTORAGE_FMT_NVM_PROTECTION_TYPE3 = 0x3, -}; -``` -2. 描述 +3. 备注 -磁盘支持的保护类型。 + ES3000仅支持保护类型0和保护类型3,Optane盘仅支持保护类型0和保护类型1。 -3. 备注 +#### enum libstorage_crc_and_prchk -ES3000仅支持保护类型0和保护类型3,Optane盘仅支持保护类型0和保护类型1。 -##### enum libstorage_crc_and_prchk +1. 原型 -1. 原型 -``` -enum libstorage_crc_and_prchk -{ -LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK = 0x0, -LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK = 0x1, -LIBSTORAGE_LIB_CRC_AND_DISABLE_PRCHK = 0x2, -LIBSTORAGE_LIB_CRC_AND_ENABLE_PRCHK = 0x3, -#define NVME_NO_REF 0x4 -LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK_NO_REF = LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK | NVME_NO_REF, -LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK_NO_REF = LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK | NVME_NO_REF, -}; -``` -2. 描述 + ```shell + enum libstorage_crc_and_prchk + { + LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK = 0x0, + LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK = 0x1, + LIBSTORAGE_LIB_CRC_AND_DISABLE_PRCHK = 0x2, + LIBSTORAGE_LIB_CRC_AND_ENABLE_PRCHK = 0x3, + #define NVME_NO_REF 0x4 + LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK_NO_REF = LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK | NVME_NO_REF, + LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK_NO_REF = LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK | NVME_NO_REF, + }; + ``` -- LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK:应用层做CRC校验,HSAK不做CRC校验,关闭盘的CRC校验。 +2. 描述 -- LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK:应用层做CRC校验,HSAK不做CRC校验,开启盘的CRC校验。 + - LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK:应用层做CRC校验,HSAK不做CRC校验,关闭盘的CRC校验。 -- LIBSTORAGE_LIB_CRC_AND_DISABLE_PRCHK:应用层不做CRC校验,HSAK做CRC校验,关闭盘的CRC校验。 + - LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK:应用层做CRC校验,HSAK不做CRC校验,开启盘的CRC校验。 -- LIBSTORAGE_LIB_CRC_AND_ENABLE_PRCHK:应用层不做CRC校验,HSAK做CRC校验,开启盘的CRC校验。 + - LIBSTORAGE_LIB_CRC_AND_DISABLE_PRCHK:应用层不做CRC校验,HSAK做CRC校验,关闭盘的CRC校验。 -- LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK_NO_REF:应用层做CRC校验,HSAK不做CRC校验,关闭盘的CRC校验。对于PI TYPE为1的磁盘(Intel optane P4800),关闭盘的REF TAG校验。 + - LIBSTORAGE_LIB_CRC_AND_ENABLE_PRCHK:应用层不做CRC校验,HSAK做CRC校验,开启盘的CRC校验。 -- LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK_NO_REF:应用层做CRC校验,HSAK不做CRC校验,开启盘的CRC校验。对于PI TYPE为1的磁盘(Intel optane P4800),关闭盘的REF TAG校验。 + - LIBSTORAGE_APP_CRC_AND_DISABLE_PRCHK_NO_REF:应用层做CRC校验,HSAK不做CRC校验,关闭盘的CRC校验。对于PI TYPE为1的磁盘(Intel optane P4800),关闭盘的REF TAG校验。 -- Intel optane P4800盘PI TYPE为1,默认会校验元数据区的CRC和REF TAG。 + - LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK_NO_REF:应用层做CRC校验,HSAK不做CRC校验,开启盘的CRC校验。对于PI TYPE为1的磁盘(Intel optane P4800),关闭盘的REF TAG校验。 -- Intel optane P4800盘的512+8格式支持DIF,4096+64格式不支持。 + - Intel optane P4800盘PI TYPE为1,默认会校验元数据区的CRC和REF TAG。 -- ES3000 V3和ES3000 V5盘PI TYPE为3,默认只校验元数据区的CRC。 + - Intel optane P4800盘的512+8格式支持DIF,4096+64格式不支持。 -- ES3000 V3的512+8格式支持DIF,4096+64格式不支持。ES3000 V5的512+8和4096+64格式均支持DIF。 + - ES3000 V3和ES3000 V5盘PI TYPE为3,默认只校验元数据区的CRC。 + - ES3000 V3的512+8格式支持DIF,4096+64格式不支持。ES3000 V5的512+8和4096+64格式均支持DIF。 总结为如下: @@ -206,159 +210,180 @@ LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK_NO_REF = LIBSTORAGE_APP_CRC_AND_ENABLE_PRCHK +#### enum libstorage_print_log_level + +1. 原型 + + ```shell + enum libstorage_print_log_level + { + LIBSTORAGE_PRINT_LOG_ERROR, + LIBSTORAGE_PRINT_LOG_WARN, + LIBSTORAGE_PRINT_LOG_NOTICE, + LIBSTORAGE_PRINT_LOG_INFO, + LIBSTORAGE_PRINT_LOG_DEBUG, + }; + ``` + +2. 描述 + + SPDK日志打印级别:ERROR、WARN、NOTICE、INFO、DEBUG,分别对应配置文件中的0~4。 -##### enum libstorage_print_log_level +#### MAX_BDEV_NAME_LEN -1. 原型 +1. 原型 -``` -enum libstorage_print_log_level -{ -LIBSTORAGE_PRINT_LOG_ERROR, -LIBSTORAGE_PRINT_LOG_WARN, -LIBSTORAGE_PRINT_LOG_NOTICE, -LIBSTORAGE_PRINT_LOG_INFO, -LIBSTORAGE_PRINT_LOG_DEBUG, -}; -``` + ```bash + #define MAX_BDEV_NAME_LEN 24 + ``` -2. 描述 +2. 描述 -SPDK日志打印级别:ERROR、WARN、NOTICE、INFO、DEBUG,分别对应配置文件中的0~4。 + 块设备名最大长度限制。 -##### MAX_BDEV_NAME_LEN +#### MAX_CTRL_NAME_LEN -1. 原型 -``` -#define MAX_BDEV_NAME_LEN 24 -``` -2. 描述 +1. 原型 -块设备名最大长度限制。 + ```bash + #define MAX_CTRL_NAME_LEN 16 + ``` -##### MAX_CTRL_NAME_LEN +2. 描述 -1. 原型 -``` -#define MAX_CTRL_NAME_LEN 16 -``` -2. 描述 + 控制器名最大长度限制。 -控制器名最大长度限制。 +#### LBA_FORMAT_NUM -##### LBA_FORMAT_NUM +1. 原型 -1. 原型 -``` -#define LBA_FORMAT_NUM 16 -``` -2. 描述 + ```bash + #define LBA_FORMAT_NUM 16 + ``` -控制器所支持的LBA格式数目。 +2. 描述 -##### LIBSTORAGE_MAX_DSM_RANGE_DESC_COUNT + 控制器所支持的LBA格式数目。 -1. 原型 +#### LIBSTORAGE_MAX_DSM_RANGE_DESC_COUNT -#define LIBSTORAGE_MAX_DSM_RANGE_DESC_COUNT 256 +1. 原型 -2. 描述 + ```bash + #define LIBSTORAGE_MAX_DSM_RANGE_DESC_COUNT 256 + ``` -数据集管理命令中16字节集的最大数目。 +2. 描述 + + 数据集管理命令中16字节集的最大数目。 #### ublock.h ##### UBLOCK_NVME_UEVENT_SUBSYSTEM_UIO -1. 原型 -``` -#define UBLOCK_NVME_UEVENT_SUBSYSTEM_UIO 1 -``` -2. 描述 +1. 原型 + + ```bash + #define UBLOCK_NVME_UEVENT_SUBSYSTEM_UIO 1 + ``` -用于定义uevent事件所对应的子系统是内核uio,在业务收到uevent事件时,通过该宏定义判断是否为需要处理的内核uio事件。 +2. 描述 -数据结构struct ublock_uevent中成员int subsystem的值取值为UBLOCK_NVME_UEVENT_SUBSYSTEM_UIO,当前仅此一个可选值。 + 用于定义uevent事件所对应的子系统是内核uio,在业务收到uevent事件时,通过该宏定义判断是否为需要处理的内核uio事件。 + + 数据结构struct ublock_uevent中成员int subsystem的值取值为UBLOCK_NVME_UEVENT_SUBSYSTEM_UIO,当前仅此一个可选值。 ##### UBLOCK_TRADDR_MAX_LEN -1. 原型 -``` -#define UBLOCK_TRADDR_MAX_LEN 256 -``` -2. 描述 +1. 原型 + + ```bash + #define UBLOCK_TRADDR_MAX_LEN 256 + ``` -以"域:总线:设备.功能"(%04x:%02x:%02x.%x)格式表示的PCI地址字符串的最大长度,其实实际长度远小于256字节。 +2. 描述 + + 以"域:总线:设备.功能"(%04x:%02x:%02x.%x)格式表示的PCI地址字符串的最大长度,其实实际长度远小于256字节。 ##### UBLOCK_PCI_ADDR_MAX_LEN -1. 原型 -``` -#define UBLOCK_PCI_ADDR_MAX_LEN 256 -``` -2. 描述 +1. 原型 + + ```bash + #define UBLOCK_PCI_ADDR_MAX_LEN 256 + ``` -PCI地址字符串最大长度,实际长度远小于256字节;此处PCI地址格式可能的形式为: +2. 描述 -- 全地址:%x:%x:%x.%x 或 %x.%x.%x.%x。 + PCI地址字符串最大长度,实际长度远小于256字节;此处PCI地址格式可能的形式为: -- 功能值为0:%x:%x:%x。 + - 全地址:%x:%x:%x.%x 或 %x.%x.%x.%x。 -- 域值为0:%x:%x.%x 或 %x.%x.%x。 + - 功能值为0:%x:%x:%x。 -- 域和功能值为0:%x:%x 或 %x.%x。 + - 域值为0:%x:%x.%x 或 %x.%x.%x。 + + - 域和功能值为0:%x:%x 或 %x.%x。 ##### UBLOCK_SMART_INFO_LEN -1. 原型 -``` -#define UBLOCK_SMART_INFO_LEN 512 -``` -2. 描述 +1. 原型 + + ```bash + #define UBLOCK_SMART_INFO_LEN 512 + ``` -获取NVMe盘SMART信息结构体的大小,为512字节。 +2. 描述 + + 获取NVMe盘SMART信息结构体的大小,为512字节。 ##### enum ublock_rpc_server_status -1. 原型 -``` -enum ublock_rpc_server_status { -// start rpc server or not -UBLOCK_RPC_SERVER_DISABLE = 0, -UBLOCK_RPC_SERVER_ENABLE = 1, -}; -``` -2. 描述 +1. 原型 + + ```bash + enum ublock_rpc_server_status { + // start rpc server or not + UBLOCK_RPC_SERVER_DISABLE = 0, + UBLOCK_RPC_SERVER_ENABLE = 1, + }; + ``` + +2. 描述 -用于表示HSAK内部RPC服务状态,启用或关闭。 + 用于表示HSAK内部RPC服务状态,启用或关闭。 ##### enum ublock_nvme_uevent_action -1. 原型 -``` -enum ublock_nvme_uevent_action { -UBLOCK_NVME_UEVENT_ADD = 0, -UBLOCK_NVME_UEVENT_REMOVE = 1, -UBLOCK_NVME_UEVENT_INVALID, -}; -``` -2. 描述 +1. 原型 + + ```bash + enum ublock_nvme_uevent_action { + UBLOCK_NVME_UEVENT_ADD = 0, + UBLOCK_NVME_UEVENT_REMOVE = 1, + UBLOCK_NVME_UEVENT_INVALID, + }; + ``` + +2. 描述 -用于表示uevent热插拔事件是插入硬盘还是移除硬盘。 + 用于表示uevent热插拔事件是插入硬盘还是移除硬盘。 ##### enum ublock_subsystem_type -1. 原型 -``` -enum ublock_subsystem_type { -SUBSYSTEM_UIO = 0, -SUBSYSTEM_NVME = 1, -SUBSYSTEM_TOP -}; -``` -2. 描述 +1. 原型 -指定回调函数类型,用于区分产品注册回调函数时是针对于uio驱动还是针对于内核nvme驱动。 + ```bash + enum ublock_subsystem_type { + SUBSYSTEM_UIO = 0, + SUBSYSTEM_NVME = 1, + SUBSYSTEM_TOP + }; + ``` + +2. 描述 + + 指定回调函数类型,用于区分产品注册回调函数时是针对于uio驱动还是针对于内核nvme驱动。 ### 数据结构 @@ -366,707 +391,737 @@ SUBSYSTEM_TOP ##### struct libstorage_namespace_info -1. 原型 -``` -struct libstorage_namespace_info -{ -char name[MAX_BDEV_NAME_LEN]; -uint64_t size; /** namespace size in bytes */ -uint64_t sectors; /** number of sectors */ -uint32_t sector_size; /** sector size in bytes */ -uint32_t md_size; /** metadata size in bytes */ -uint32_t max_io_xfer_size; /** maximum i/o size in bytes */ -uint16_t id; /** namespace id */ -uint8_t pi_type; /** end-to-end data protection information type */ -uint8_t is_active :1; /** namespace is active or not */ -uint8_t ext_lba :1; /** namespace support extending LBA size or not */ -uint8_t dsm :1; /** namespace supports Dataset Management or not */ -uint8_t pad :3; -uint64_t reserved; -}; -``` -2. 描述 - -该数据结构中包含硬盘namespace相关信息。 - -3. 结构体成员 - -| **成员** | 描述 | -|------------------------------|------------------------------------------------| -| char name[MAX_BDEV_NAME_LEN] | Namespace名字 | -| uint64_t size | 该namespace所分配的硬盘大小,字节为单位 | -| uint64_t sectors | 扇区数 | -| uint32_t sector_size | 每扇区大小,字节为单位 | -| uint32_t md_size | Metadata大小,字节为单位 | -| uint32_t max_io_xfer_size | 最大允许的单次IO操作数据大小,字节为单位 | -| uint16_t id | Namespace ID | -| uint8_t pi_type | 数据保护类型,取值自enum libstorage_ns_pi_type | -| uint8_t is_active :1 | Namespace是否激活 | -| uint8_t ext_lba :1 | Namespace是否支持扩展LBA | -| uint8_t dsm :1 | Namespace是否支持数据集管理 | -| uint8_t pad :3 | 保留字段 | -| uint64_t reserved | 保留字段 | - - - +1. 原型 + + ```bash + struct libstorage_namespace_info + { + char name[MAX_BDEV_NAME_LEN]; + uint64_t size; /** namespace size in bytes */ + uint64_t sectors; /** number of sectors */ + uint32_t sector_size; /** sector size in bytes */ + uint32_t md_size; /** metadata size in bytes */ + uint32_t max_io_xfer_size; /** maximum i/o size in bytes */ + uint16_t id; /** namespace id */ + uint8_t pi_type; /** end-to-end data protection information type */ + uint8_t is_active :1; /** namespace is active or not */ + uint8_t ext_lba :1; /** namespace support extending LBA size or not */ + uint8_t dsm :1; /** namespace supports Dataset Management or not */ + uint8_t pad :3; + uint64_t reserved; + }; + ``` + +2. 描述 + + 该数据结构中包含硬盘namespace相关信息。 + +3. 结构体成员 + + | **成员** | 描述 | + |------------------------------|------------------------------------------------| + | char name[MAX_BDEV_NAME_LEN] | Namespace名字 | + | uint64_t size | 该namespace所分配的硬盘大小,字节为单位 | + | uint64_t sectors | 扇区数 | + | uint32_t sector_size | 每扇区大小,字节为单位 | + | uint32_t md_size | Metadata大小,字节为单位 | + | uint32_t max_io_xfer_size | 最大允许的单次IO操作数据大小,字节为单位 | + | uint16_t id | Namespace ID | + | uint8_t pi_type | 数据保护类型,取值自enum libstorage_ns_pi_type | + | uint8_t is_active :1 | Namespace是否激活 | + | uint8_t ext_lba :1 | Namespace是否支持扩展LBA | + | uint8_t dsm :1 | Namespace是否支持数据集管理 | + | uint8_t pad :3 | 保留字段 | + | uint64_t reserved | 保留字段 | ##### struct libstorage_nvme_ctrlr_info -1. 原型 -``` -struct libstorage_nvme_ctrlr_info -{ -char name[MAX_CTRL_NAME_LEN]; -char address[24]; -struct -{ -uint32_t domain; -uint8_t bus; -uint8_t dev; -uint8_t func; -} pci_addr; -uint64_t totalcap; /* Total NVM Capacity in bytes */ -uint64_t unusecap; /* Unallocated NVM Capacity in bytes */ -int8_t sn[20]; /* Serial number */ -uint8_t fr[8]; /* Firmware revision */ -uint32_t max_num_ns; /* Number of namespaces */ -uint32_t version; -uint16_t num_io_queues; /* num of io queues */ -uint16_t io_queue_size; /* io queue size */ -uint16_t ctrlid; /* Controller id */ -uint16_t pad1; -struct -{ -struct -{ -/** metadata size */ -uint32_t ms : 16; -/** lba data size */ -uint32_t lbads : 8; -uint32_t reserved : 8; -} lbaf[LBA_FORMAT_NUM]; -uint8_t nlbaf; -uint8_t pad2[3]; -uint32_t cur_format : 4; -uint32_t cur_extended : 1; -uint32_t cur_pi : 3; -uint32_t cur_pil : 1; -uint32_t cur_can_share : 1; -uint32_t mc_extented : 1; -uint32_t mc_pointer : 1; -uint32_t pi_type1 : 1; -uint32_t pi_type2 : 1; -uint32_t pi_type3 : 1; -uint32_t md_start : 1; -uint32_t md_end : 1; -uint32_t ns_manage : 1; /* Supports the Namespace Management and Namespace Attachment commands */ -uint32_t directives : 1; /* Controller support Directives or not */ -uint32_t streams : 1; /* Controller support Streams Directives or not */ -uint32_t dsm : 1; /* Controller support Dataset Management or not */ -uint32_t reserved : 11; -} cap_info; -}; -``` -1. 描述 - -该数据结构中包含硬盘控制器相关信息。 - -2. 结构体成员 - - -| **成员** | **描述** | -|----------|----------| -| char name[MAX_CTRL_NAME_LEN] | 控制器名字 | -| char address[24] | PCI地址,字符串形式 | -| struct
{
uint32_t domain;
uint8_t bus;
uint8_t dev;
uint8_t func;
} pci_addr | PCI地址,分段形式 | -| uint64_t totalcap | 控制器的总容量大小(字节为单位)Optane盘基于NVMe 1.0协议,不支持该字段 | -| uint64_t unusecap | 控制器未使用的容量大小(字节为单位)Optane盘基于NVMe 1.0协议,不支持该字段 | -| int8_t sn[20]; | 硬盘序列号。不带'0'的ASCII字符串 | -| uint8_t fr[8]; | 硬盘firmware版本号。不带'0'的ASCII字符串 | -| uint32_t max_num_ns | 最大允许的namespace数 | -| uint32_t version | 控制器支持的NVMe标准协议版本号 | -| uint16_t num_io_queues | 硬盘支持的IO队列数量 | -| uint16_t io_queue_size | IO队列最大深度 | -| uint16_t ctrlid | 控制器ID | -| uint16_t pad1 | 保留字段 | +1. 原型 + + ```bash + struct libstorage_nvme_ctrlr_info + { + char name[MAX_CTRL_NAME_LEN]; + char address[24]; + struct + { + uint32_t domain; + uint8_t bus; + uint8_t dev; + uint8_t func; + } pci_addr; + uint64_t totalcap; /* Total NVM Capacity in bytes */ + uint64_t unusecap; /* Unallocated NVM Capacity in bytes */ + int8_t sn[20]; /* Serial number */ + uint8_t fr[8]; /* Firmware revision */ + uint32_t max_num_ns; /* Number of namespaces */ + uint32_t version; + uint16_t num_io_queues; /* num of io queues */ + uint16_t io_queue_size; /* io queue size */ + uint16_t ctrlid; /* Controller id */ + uint16_t pad1; + struct + { + struct + { + /** metadata size */ + uint32_t ms : 16; + /** lba data size */ + uint32_t lbads : 8; + uint32_t reserved : 8; + } lbaf[LBA_FORMAT_NUM]; + uint8_t nlbaf; + uint8_t pad2[3]; + uint32_t cur_format : 4; + uint32_t cur_extended : 1; + uint32_t cur_pi : 3; + uint32_t cur_pil : 1; + uint32_t cur_can_share : 1; + uint32_t mc_extented : 1; + uint32_t mc_pointer : 1; + uint32_t pi_type1 : 1; + uint32_t pi_type2 : 1; + uint32_t pi_type3 : 1; + uint32_t md_start : 1; + uint32_t md_end : 1; + uint32_t ns_manage : 1; /* Supports the Namespace Management and Namespace Attachment commands */ + uint32_t directives : 1; /* Controller support Directives or not */ + uint32_t streams : 1; /* Controller support Streams Directives or not */ + uint32_t dsm : 1; /* Controller support Dataset Management or not */ + uint32_t reserved : 11; + } cap_info; + }; + ``` + +2. 描述 + + 该数据结构中包含硬盘控制器相关信息。 + +3. 结构体成员 + + | **成员** | **描述** | + |----------|----------| + | char name[MAX_CTRL_NAME_LEN] | 控制器名字 | + | char address[24] | PCI地址,字符串形式 | + | struct
{
uint32_t domain;
uint8_t bus;
uint8_t dev;
uint8_t func;
} pci_addr | PCI地址,分段形式 | + | uint64_t totalcap | 控制器的总容量大小(字节为单位)Optane盘基于NVMe 1.0协议,不支持该字段 | + | uint64_t unusecap | 控制器未使用的容量大小(字节为单位)Optane盘基于NVMe 1.0协议,不支持该字段 | + | int8_t sn[20]; | 硬盘序列号。不带'0'的ASCII字符串 | + | uint8_t fr[8]; | 硬盘firmware版本号。不带'0'的ASCII字符串 | + | uint32_t max_num_ns | 最大允许的namespace数 | + | uint32_t version | 控制器支持的NVMe标准协议版本号 | + | uint16_t num_io_queues | 硬盘支持的IO队列数量 | + | uint16_t io_queue_size | IO队列最大深度 | + | uint16_t ctrlid | 控制器ID | + | uint16_t pad1 | 保留字段 | struct cap_info子结构体成员: -| **成员** | **描述** | -|-----------------------------------|------------------------------------| -| struct
{
uint32_t ms : 16;
uint32_t lbads : 8;
uint32_t reserved : 8;
}lbaf[LBA_FORMAT_NUM] | ms:元数据大小,最小为8字节
lbads:指示LBA大小为2^lbads,lbads不小于9 | -| uint8_t nlbaf | 控制器所支持的LBA格式数 | -| uint8_t pad2[3] | 保留字段 | -| uint32_t cur_format : 4 | 控制器当前的LBA格式 | -| uint32_t cur_extended : 1 | 控制器当前是否支持扩展型LBA | -| uint32_t cur_pi : 3 | 控制器当前的保护类型 | -| uint32_t cur_pil : 1 | 控制器当前的PI(保护信息)位于元数据的first eight bytes或者last eight bytes | -| uint32_t cur_can_share : 1 | namespace是否支持多路径传输 | -| uint32_t mc_extented : 1 | 元数据是否作为数据缓冲区的一部分进行传输 | -| uint32_t mc_pointer : 1 | 元数据是否与数据缓冲区分离 | -| uint32_t pi_type1 : 1 | 控制器是否支持保护类型一 | -| uint32_t pi_type2 : 1 | 控制器是否支持保护类型二 | -| uint32_t pi_type3 : 1 | 控制器是否支持保护类型三 | -| uint32_t md_start : 1 | 控制器是否支持PI(保护信息)位于元数据的first eight bytes | -| uint32_t md_end : 1 | 控制器是否支持PI(保护信息)位于元数据的last eight bytes | -| uint32_t ns_manage : 1 | 控制器是否支持namespace管理 | -| uint32_t directives : 1 | 是否支持Directives命令集 | -| uint32_t streams : 1 | 是否支持Streams Directives | -| uint32_t dsm : 1 | 是否支持Dataset Management命令 | -| uint32_t reserved : 11 | 保留字段 | + | **成员** | **描述** | + |-----------------------------------|------------------------------------| + | struct
{
uint32_t ms : 16;
uint32_t lbads : 8;
uint32_t reserved : 8;
}lbaf[LBA_FORMAT_NUM] | ms:元数据大小,最小为8字节
lbads:指示LBA大小为2^lbads,lbads不小于9 | + | uint8_t nlbaf | 控制器所支持的LBA格式数 | + | uint8_t pad2[3] | 保留字段 | + | uint32_t cur_format : 4 | 控制器当前的LBA格式 | + | uint32_t cur_extended : 1 | 控制器当前是否支持扩展型LBA | + | uint32_t cur_pi : 3 | 控制器当前的保护类型 | + | uint32_t cur_pil : 1 | 控制器当前的PI(保护信息)位于元数据的first eight bytes或者last eight bytes | + | uint32_t cur_can_share : 1 | namespace是否支持多路径传输 | + | uint32_t mc_extented : 1 | 元数据是否作为数据缓冲区的一部分进行传输 | + | uint32_t mc_pointer : 1 | 元数据是否与数据缓冲区分离 | + | uint32_t pi_type1 : 1 | 控制器是否支持保护类型一 | + | uint32_t pi_type2 : 1 | 控制器是否支持保护类型二 | + | uint32_t pi_type3 : 1 | 控制器是否支持保护类型三 | + | uint32_t md_start : 1 | 控制器是否支持PI(保护信息)位于元数据的first eight bytes | + | uint32_t md_end : 1 | 控制器是否支持PI(保护信息)位于元数据的last eight bytes | + | uint32_t ns_manage : 1 | 控制器是否支持namespace管理 | + | uint32_t directives : 1 | 是否支持Directives命令集 | + | uint32_t streams : 1 | 是否支持Streams Directives | + | uint32_t dsm : 1 | 是否支持Dataset Management命令 | + | uint32_t reserved : 11 | 保留字段 | ##### struct libstorage_dsm_range_desc -1. 原型 -``` -struct libstorage_dsm_range_desc -{ -/* RESERVED */ -uint32_t reserved; +1. 原型 + + ```bash + struct libstorage_dsm_range_desc + { + /* RESERVED */ + uint32_t reserved; -/* NUMBER OF LOGICAL BLOCKS */ -uint32_t block_count; + /* NUMBER OF LOGICAL BLOCKS */ + uint32_t block_count; -/* UNMAP LOGICAL BLOCK ADDRESS */uint64_t lba;}; -``` -2. 描述 + /* UNMAP LOGICAL BLOCK ADDRESS */uint64_t lba;}; + ``` -数据管理命令集中单个16字节集的定义。 +2. 描述 -3. 结构体成员 + 数据管理命令集中单个16字节集的定义。 -| **成员** | **描述** | -|----------------------|--------------| -| uint32_t reserved | 保留字段 | -| uint32_t block_count | 单位LBA的数量 | -| uint64_t lba | 起始LBA | +3. 结构体成员 + + | **成员** | **描述** | + |----------------------|--------------| + | uint32_t reserved | 保留字段 | + | uint32_t block_count | 单位LBA的数量 | + | uint64_t lba | 起始LBA | ##### struct libstorage_ctrl_streams_param -1. 原型 -``` -struct libstorage_ctrl_streams_param -{ -/* MAX Streams Limit */ -uint16_t msl; +1. 原型 -/* NVM Subsystem Streams Available */ -uint16_t nssa; + ```bash + struct libstorage_ctrl_streams_param + { + /* MAX Streams Limit */ + uint16_t msl; -/* NVM Subsystem Streams Open */uint16_t nsso; + /* NVM Subsystem Streams Available */ + uint16_t nssa; -uint16_t pad; -}; -``` -2. 描述 + /* NVM Subsystem Streams Open */uint16_t nsso; -NVMe盘支持的Streams属性值。 + uint16_t pad; + }; + ``` -3. 结构体成员 +2. 描述 -| **成员** | **描述** | -|---------------|--------------------------------------| -| uint16_t msl | 硬盘支持的最大Streams资源数 | -| uint16_t nssa | 每个NVM子系统可使用的Streams资源数 | -| uint16_t nsso | 每个NVM子系统已经使用的Streams资源数 | -| uint16_t pad | 保留字段 | + NVMe盘支持的Streams属性值。 +3. 结构体成员 + | **成员** | **描述** | + |---------------|--------------------------------------| + | uint16_t msl | 硬盘支持的最大Streams资源数 | + | uint16_t nssa | 每个NVM子系统可使用的Streams资源数 | + | uint16_t nsso | 每个NVM子系统已经使用的Streams资源数 | + | uint16_t pad | 保留字段 | ##### struct libstorage_bdev_streams_param -1. 原型 -``` -struct libstorage_bdev_streams_param -{ -/* Stream Write Size */ -uint32_t sws; +1. 原型 + + ```bash + struct libstorage_bdev_streams_param + { + /* Stream Write Size */ + uint32_t sws; -/* Stream Granularity Size */ -uint16_t sgs; + /* Stream Granularity Size */ + uint16_t sgs; -/* Namespace Streams Allocated */ -uint16_t nsa; + /* Namespace Streams Allocated */ + uint16_t nsa; -/* Namespace Streams Open */ -uint16_t nso; + /* Namespace Streams Open */ + uint16_t nso; -uint16_t reserved[3]; -}; -``` -2. 描述 + uint16_t reserved[3]; + }; + ``` -Namespace的Streams属性值。 +2. 描述 -3. 结构体成员 + Namespace的Streams属性值。 - |**成员** | **描述** | - |-------------------------|---------------------------------| - |uint32_t sws |性能最优的写粒度,单位:sectors| - |uint16_t sgs |Streams分配的写粒度,单位:sws| - |uint16_t nsa |Namespace可使用的私有Streams资源数| - |uint16_t nso |Namespace已使用的私有Streams资源数| - |uint16_t reserved[3] |保留字段| +3. 结构体成员 + + |**成员** | **描述** | + |-------------------------|---------------------------------| + |uint32_t sws |性能最优的写粒度,单位:sectors| + |uint16_t sgs |Streams分配的写粒度,单位:sws| + |uint16_t nsa |Namespace可使用的私有Streams资源数| + |uint16_t nso |Namespace已使用的私有Streams资源数| + |uint16_t reserved[3] |保留字段| ##### struct libstorage_mgr_info -1. 原型 -``` -struct libstorage_mgr_info -{ -char pci[24]; -char ctrlName[MAX_CTRL_NAME_LEN]; -uint64_t sector_size; -uint64_t cap_size; -uint16_t device_id; -uint16_t subsystem_device_id; -uint16_t vendor_id; -uint16_t subsystem_vendor_id; -uint16_t controller_id; -int8_t serial_number[20]; -int8_t model_number[40]; -uint8_t firmware_revision[8]; -}; -``` -2. 描述 - -磁盘管理信息(与管理面使用的磁盘信息一致)。 - -3. 结构体成员 - - |**成员** | **描述**| -|-------------------------|------------------------------------| - |char pci[24] 磁盘PCI地址字符串| - |char ctrlName[MAX_CTRL_NAME_LEN] |磁盘控制器名字符串| - |uint64_t sector_size |磁盘扇区大小| - |uint64_t cap_size |磁盘容量,单位:字节| - |uint16_t device_id |磁盘设备ID| - |uint16_t subsystem_device_id |磁盘子系统设备ID| - |uint16­_t vendor_id |磁盘厂商ID| - |uint16_t subsystem_vendor_id |磁盘子系统厂商ID| - |uint16_t controller_id |磁盘控制器ID| - |int8_t serial_number[20] |磁盘序列号| - |int8_t model_number[40] |设备型号| - |uint8_t firmware_revision[8] |固件版本号| +1. 原型 + + ```bash + struct libstorage_mgr_info + { + char pci[24]; + char ctrlName[MAX_CTRL_NAME_LEN]; + uint64_t sector_size; + uint64_t cap_size; + uint16_t device_id; + uint16_t subsystem_device_id; + uint16_t vendor_id; + uint16_t subsystem_vendor_id; + uint16_t controller_id; + int8_t serial_number[20]; + int8_t model_number[40]; + uint8_t firmware_revision[8]; + }; + ``` + +2. 描述 + + 磁盘管理信息(与管理面使用的磁盘信息一致)。 + +3. 结构体成员 + + |**成员** | **描述**| + |-------------------------|------------------------------------| + |char pci[24] 磁盘PCI地址字符串| + |char ctrlName[MAX_CTRL_NAME_LEN] |磁盘控制器名字符串| + |uint64_t sector_size |磁盘扇区大小| + |uint64_t cap_size |磁盘容量,单位:字节| + |uint16_t device_id |磁盘设备ID| + |uint16_t subsystem_device_id |磁盘子系统设备ID| + |uint16­_t vendor_id |磁盘厂商ID| + |uint16_t subsystem_vendor_id |磁盘子系统厂商ID| + |uint16_t controller_id |磁盘控制器ID| + |int8_t serial_number[20] |磁盘序列号| + |int8_t model_number[40] |设备型号| + |uint8_t firmware_revision[8] |固件版本号| ##### struct __attribute__((packed)) libstorage_smart_info -1. 原型 -``` -/* same with struct spdk_nvme_health_information_page in nvme_spec.h */ -struct __attribute__((packed)) libstorage_smart_info { -/* details of uint8_t critical_warning - -union spdk_nvme_critical_warning_state { - -uint8_t raw; -* - -struct { - -uint8_t available_spare : 1; - -uint8_t temperature : 1; - -uint8_t device_reliability : 1; - -uint8_t read_only : 1; - -uint8_t volatile_memory_backup : 1; - -uint8_t reserved : 3; - -} bits; - -}; -*/ -uint8_t critical_warning; -uint16_t temperature; -uint8_t available_spare; -uint8_t available_spare_threshold; -uint8_t percentage_used; -uint8_t reserved[26]; - -/* - -Note that the following are 128-bit values, but are - -defined as an array of 2 64-bit values. -*/ -/* Data Units Read is always in 512-byte units. */ -uint64_t data_units_read[2]; -/* Data Units Written is always in 512-byte units. */ -uint64_t data_units_written[2]; -/* For NVM command set, this includes Compare commands. */ -uint64_t host_read_commands[2]; -uint64_t host_write_commands[2]; -/* Controller Busy Time is reported in minutes. */ -uint64_t controller_busy_time[2]; -uint64_t power_cycles[2]; -uint64_t power_on_hours[2]; -uint64_t unsafe_shutdowns[2]; -uint64_t media_errors[2]; -uint64_t num_error_info_log_entries[2]; -/* Controller temperature related. */ -uint32_t warning_temp_time; -uint32_t critical_temp_time; -uint16_t temp_sensor[8]; -uint8_t reserved2[296]; -}; -``` -1. 描述 - -该数据结构定义了硬盘SMART INFO信息内容。 - -2. 结构体成员 - -| **成员** | **描述(具体可以参考NVMe协议)** | -|-----------------------------------|------------------------------------| -| uint8_t critical_warning | 该域表示控制器状态的重要的告警,bit位设置为1表示有效,可以设置
多个bit位有效。重要的告警信息通过异步事件返回给主机端。
Bit0:设置为1时表示冗余空间小于设定的阈值
Bit1:设置为1时表示温度超过或低于一个重要的阈值
Bit2:设置为1时表示由于重要的media错误或者internal error,器件的可靠性已经降低。
Bit3:设置为1时,该介质已经被置为只读模式。
Bit4:设置为1时,表示控制器的易失性器件fail,该域仅在控制器内部存在易失性器件时有效。
Bit 5~7:保留 | -| uint16_t temperature | 表示整个器件的温度,单位为Kelvin。 | -| uint8_t available_spare | 表示可用冗余空间的百分比(0到100%)。 | -| uint8_t available_spare_threshold | 可用冗余空间的阈值,低于该阈值时上报异步事件。 | -| uint8_t percentage_used | 该值表示用户实际使用和厂家设定的器件寿命的百分比,100表示已经达
到厂家预期的寿命,但可能不会失效,可以继续使用。该值允许大于100
,高于254的值都会被置为255。 | -| uint8_t reserved[26] | 保留 | -| uint64_t data_units_read[2] | 该值表示主机端从控制器中读走的512字节数目,其中1表示读走100
0个512字节,该值不包括metadata。当LBA大小不为512
B时,控制器将其转换成512B进行计算。16进制表示。 | -| uint64_t data_units_written[2] | 该值表示主机端写入控制器中的512字节数目,其中1表示写入1000
个512字节,该值不包括metadata。当LBA大小不为512B
时,控制器将其转换成512B进行计算。16进制表示。 | -| uint64_t host_read_commands[2] | 表示下发到控制器的读命令的个数。 | -| uint64_t host_write_commands[2] | 表示下发到控制器的写命令的个数 | -| uint64_t controller_busy_time[2] | 表示控制器处理I/O命令的busy时间,从命令下发SQ到完成命令返回到CQ的整个过程都为busy。该值以分钟为单位。 | -| uint64_t power_cycles[2] | 上下电次数。 | -| uint64_t power_on_hours[2] | power-on时间小时数。 | -| uint64_t unsafe_shutdowns[2] | 异常关机次数,掉电时仍未接收到CC.SHN时该值加1。 | -| uint64_t media_errors[2] | 表示控制器检测到不可恢复的数据完整性错误的次数,
其中包括不可纠的ECC错误,CRC错误,LBA tag不匹配。 | -| uint64_t num_error_info_log_entries[2] | 该域表示控制器生命周期内的错误信息日志的entry数目。 | -| uint32_t warning_temp_time | 温度超过warning告警值的累积时间,单位分钟。 | -| uint32_t critical_temp_time | 温度超过critical告警值的累积时间,单位分钟。 | -| uint16_t temp_sensor[8] | 温度传感器1~8的温度值,单位Kelvin。 | -| uint8_t reserved2[296] | 保留 | +1. 原型 + + ```bash + /* same with struct spdk_nvme_health_information_page in nvme_spec.h */ + struct __attribute__((packed)) libstorage_smart_info { + /* details of uint8_t critical_warning + + union spdk_nvme_critical_warning_state { + + uint8_t raw; + * + + struct { + + uint8_t available_spare : 1; + + uint8_t temperature : 1; + + uint8_t device_reliability : 1; + + uint8_t read_only : 1; + + uint8_t volatile_memory_backup : 1; + + uint8_t reserved : 3; + + } bits; + + }; + */ + uint8_t critical_warning; + uint16_t temperature; + uint8_t available_spare; + uint8_t available_spare_threshold; + uint8_t percentage_used; + uint8_t reserved[26]; + + /* + + Note that the following are 128-bit values, but are + + defined as an array of 2 64-bit values. + */ + /* Data Units Read is always in 512-byte units. */ + uint64_t data_units_read[2]; + /* Data Units Written is always in 512-byte units. */ + uint64_t data_units_written[2]; + /* For NVM command set, this includes Compare commands. */ + uint64_t host_read_commands[2]; + uint64_t host_write_commands[2]; + /* Controller Busy Time is reported in minutes. */ + uint64_t controller_busy_time[2]; + uint64_t power_cycles[2]; + uint64_t power_on_hours[2]; + uint64_t unsafe_shutdowns[2]; + uint64_t media_errors[2]; + uint64_t num_error_info_log_entries[2]; + /* Controller temperature related. */ + uint32_t warning_temp_time; + uint32_t critical_temp_time; + uint16_t temp_sensor[8]; + uint8_t reserved2[296]; + }; + ``` + +2. 描述 + + 该数据结构定义了硬盘SMART INFO信息内容。 + +3. 结构体成员 + + | **成员** | **描述(具体可以参考NVMe协议)** | + |-----------------------------------|------------------------------------| + | uint8_t critical_warning | 该域表示控制器状态的重要的告警,bit位设置为1表示有效,可以设置
多个bit位有效。重要的告警信息通过异步事件返回给主机端。
Bit0:设置为1时表示冗余空间小于设定的阈值
Bit1:设置为1时表示温度超过或低于一个重要的阈值
Bit2:设置为1时表示由于重要的media错误或者internal error,器件的可靠性已经降低。
Bit3:设置为1时,该介质已经被置为只读模式。
Bit4:设置为1时,表示控制器的易失性器件fail,该域仅在控制器内部存在易失性器件时有效。
Bit 5~7:保留 | + | uint16_t temperature | 表示整个器件的温度,单位为Kelvin。 | + | uint8_t available_spare | 表示可用冗余空间的百分比(0到100%)。 | + | uint8_t available_spare_threshold | 可用冗余空间的阈值,低于该阈值时上报异步事件。 | + | uint8_t percentage_used | 该值表示用户实际使用和厂家设定的器件寿命的百分比,100表示已经达
到厂家预期的寿命,但可能不会失效,可以继续使用。该值允许大于100
,高于254的值都会被置为255。 | + | uint8_t reserved[26] | 保留 | + | uint64_t data_units_read[2] | 该值表示主机端从控制器中读走的512字节数目,其中1表示读走100
0个512字节,该值不包括metadata。当LBA大小不为512
B时,控制器将其转换成512B进行计算。16进制表示。 | + | uint64_t data_units_written[2] | 该值表示主机端写入控制器中的512字节数目,其中1表示写入1000
个512字节,该值不包括metadata。当LBA大小不为512B
时,控制器将其转换成512B进行计算。16进制表示。 | + | uint64_t host_read_commands[2] | 表示下发到控制器的读命令的个数。 | + | uint64_t host_write_commands[2] | 表示下发到控制器的写命令的个数 | + | uint64_t controller_busy_time[2] | 表示控制器处理I/O命令的busy时间,从命令下发SQ到完成命令返回到CQ的整个过程都为busy。该值以分钟为单位。 | + | uint64_t power_cycles[2] | 上下电次数。 | + | uint64_t power_on_hours[2] | power-on时间小时数。 | + | uint64_t unsafe_shutdowns[2] | 异常关机次数,掉电时仍未接收到CC.SHN时该值加1。 | + | uint64_t media_errors[2] | 表示控制器检测到不可恢复的数据完整性错误的次数,
其中包括不可纠的ECC错误,CRC错误,LBA tag不匹配。 | + | uint64_t num_error_info_log_entries[2] | 该域表示控制器生命周期内的错误信息日志的entry数目。 | + | uint32_t warning_temp_time | 温度超过warning告警值的累积时间,单位分钟。 | + | uint32_t critical_temp_time | 温度超过critical告警值的累积时间,单位分钟。 | + | uint16_t temp_sensor[8] | 温度传感器1~8的温度值,单位Kelvin。 | + | uint8_t reserved2[296] | 保留 | ##### libstorage_dpdk_contig_mem -1. 原型 -``` -struct libstorage_dpdk_contig_mem { -uint64_t virtAddr; -uint64_t memLen; -uint64_t allocLen; -}; -``` -2. 描述 +1. 原型 + + ```bash + struct libstorage_dpdk_contig_mem { + uint64_t virtAddr; + uint64_t memLen; + uint64_t allocLen; + }; + ``` -DPDK内存初始化之后,通知业务层初始化完成的回调函数参数中描述一段连续虚拟内存的信息。 +2. 描述 -当前HSAK预留了800M内存,其他内存通过该结构体中的allocLen返回给业务层,用于业务层申请内存自行管理。 + DPDK内存初始化之后,通知业务层初始化完成的回调函数参数中描述一段连续虚拟内存的信息。 -HSAK需要预留的总内存是800M左右,每一个内存段上预留的内存是根据环境的NUMA节点数来计算的。在NUMA节点过多时,每个内存段上预留的内存过小,会导致HSAK初始化失败。因此HSAK只支持最多4个NUMA节点的环境。 + 当前HSAK预留了800M内存,其他内存通过该结构体中的allocLen返回给业务层,用于业务层申请内存自行管理。 -3. 结构体成员 + HSAK需要预留的总内存是800M左右,每一个内存段上预留的内存是根据环境的NUMA节点数来计算的。在NUMA节点过多时,每个内存段上预留的内存过小,会导致HSAK初始化失败。因此HSAK只支持最多4个NUMA节点的环境。 -| **成员** | **描述** | -|--------------------|----------------------| - |uint64_t virtAddr |虚拟内存起始地址。| - |uint64_t memLen |虚拟内存长度,单位:字节。| - |uint64_t allocLen |该内存段中可用的内存长度,单位:字节。| +3. 结构体成员 + + | **成员** | **描述** | + |--------------------|----------------------| + |uint64_t virtAddr |虚拟内存起始地址。| + |uint64_t memLen |虚拟内存长度,单位:字节。| + |uint64_t allocLen |该内存段中可用的内存长度,单位:字节。| ##### struct libstorage_dpdk_init_notify_arg -1. 原型 -``` -struct libstorage_dpdk_init_notify_arg { -uint64_t baseAddr; -uint16_t memsegCount; -struct libstorage_dpdk_contig_mem *memseg; -}; -``` -2. 描述 +1. 原型 + + ```bash + struct libstorage_dpdk_init_notify_arg { + uint64_t baseAddr; + uint16_t memsegCount; + struct libstorage_dpdk_contig_mem *memseg; + }; + ``` -用于DPDK内存初始化之后,通知业务层初始化完成的回调函数参数,表示所有虚拟内存段信息。 +2. 描述 -3. 结构体成员 + 用于DPDK内存初始化之后,通知业务层初始化完成的回调函数参数,表示所有虚拟内存段信息。 -| **成员** | **描述**| -|------------------------|-----------------------| - |uint64_t baseAddr |虚拟内存起始地址。| - |uint16_t memsegCount |有效的'memseg'数组成员个数,即连续的虚拟内存段的段数。| - |struct libstorage_dpdk_contig_mem *memseg |指向内存段数组的指针,每个数组元素都是一段连续的虚拟内存,两两元素之间是不连续的。| +3. 结构体成员 + + | **成员** | **描述**| + |------------------------|-----------------------| + |uint64_t baseAddr |虚拟内存起始地址。| + |uint16_t memsegCount |有效的'memseg'数组成员个数,即连续的虚拟内存段的段数。| + |struct libstorage_dpdk_contig_mem *memseg |指向内存段数组的指针,每个数组元素都是一段连续的虚拟内存,两两元素之间是不连续的。| ##### struct libstorage_dpdk_init_notify -1. 原型 -``` -struct libstorage_dpdk_init_notify { -const char *name; -void (*notifyFunc)(const struct libstorage_dpdk_init_notify_arg *arg); -TAILQ_ENTRY(libstorage_dpdk_init_notify) tailq; -}; -``` -2. 描述 +1. 原型 + + ```bash + struct libstorage_dpdk_init_notify { + const char *name; + void (*notifyFunc)(const struct libstorage_dpdk_init_notify_arg *arg); + TAILQ_ENTRY(libstorage_dpdk_init_notify) tailq; + }; + ``` + +2. 描述 -用于DPDK内存初始化之后,通知业务层回调函数注册的结构体。 + 用于DPDK内存初始化之后,通知业务层回调函数注册的结构体。 -3. 结构体成员 +3. 结构体成员 -| **成员** | **描述**| -|-------------------------------|--------------------------| - |const char *name |注册的回调函数的业务层模块名字。| - |void (*notifyFunc)(const struct libstorage_dpdk_init_notify_arg *arg) |DPDK内存初始化之后,通知业务层初始化完成的回调函数参数。| - |TAILQ_ENTRY(libstorage_dpdk_init_notify) tailq |存放回调函数注册的链表。| + | **成员** | **描述**| + |-------------------------------|--------------------------| + |const char *name |注册的回调函数的业务层模块名字。| + |void (*notifyFunc)(const struct libstorage_dpdk_init_notify_arg *arg) |DPDK内存初始化之后,通知业务层初始化完成的回调函数参数。| + |TAILQ_ENTRY(libstorage_dpdk_init_notify) tailq |存放回调函数注册的链表。| #### ublock.h ##### struct ublock_bdev_info -1. 原型 -``` -struct ublock_bdev_info { -uint64_t sector_size; -uint64_t cap_size; // cap_size -uint16_t device_id; -uint16_t subsystem_device_id; // subsystem device id of nvme control -uint16_t vendor_id; -uint16_t subsystem_vendor_id; -uint16_t controller_id; -int8_t serial_number[20]; -int8_t model_number[40]; -int8_t firmware_revision[8]; -}; -``` -2. 描述 - -该数据结构中包含硬盘设备信息。 - -3. 结构体成员 - -| **成员** | **描述**| -|------------------|------------| - |uint64_t sector_size |硬盘扇区大小,比如512字节 | - |uint64_t cap_size |硬盘总容量,字节为单位 | - |uint16_t device_id |设备id号 | - |uint16_t subsystem_device_id |子系统的设备id号 | - |uint16_t vendor_id |设备厂商主id号 | - |uint16_t subsystem_vendor_id |设备厂商子id号 | - |uint16_t controller_id |设备控制器id号 | - |int8_t serial_number[20] |设备序列号 | - |int8_t model_number[40] |设备型号 | - |int8_t firmware_revision[8] |固件版本号 | +1. 原型 + + ```bash + struct ublock_bdev_info { + uint64_t sector_size; + uint64_t cap_size; // cap_size + uint16_t device_id; + uint16_t subsystem_device_id; // subsystem device id of nvme control + uint16_t vendor_id; + uint16_t subsystem_vendor_id; + uint16_t controller_id; + int8_t serial_number[20]; + int8_t model_number[40]; + int8_t firmware_revision[8]; + }; + ``` + +2. 描述 + + 该数据结构中包含硬盘设备信息。 + +3. 结构体成员 + + | **成员** | **描述**| + |------------------|------------| + |uint64_t sector_size |硬盘扇区大小,比如512字节 | + |uint64_t cap_size |硬盘总容量,字节为单位 | + |uint16_t device_id |设备id号 | + |uint16_t subsystem_device_id |子系统的设备id号 | + |uint16_t vendor_id |设备厂商主id号 | + |uint16_t subsystem_vendor_id |设备厂商子id号 | + |uint16_t controller_id |设备控制器id号 | + |int8_t serial_number[20] |设备序列号 | + |int8_t model_number[40] |设备型号 | + |int8_t firmware_revision[8] |固件版本号 | ##### struct ublock_bdev -1. 原型 -``` -struct ublock_bdev { -char pci[UBLOCK_PCI_ADDR_MAX_LEN]; -struct ublock_bdev_info info; -struct spdk_nvme_ctrlr *ctrlr; -TAILQ_ENTRY(ublock_bdev) link; -}; -``` -2. 描述 +1. 原型 + + ```bash + struct ublock_bdev { + char pci[UBLOCK_PCI_ADDR_MAX_LEN]; + struct ublock_bdev_info info; + struct spdk_nvme_ctrlr *ctrlr; + TAILQ_ENTRY(ublock_bdev) link; + }; + ``` + +2. 描述 -该数据结构中包含指定PCI地址的硬盘信息,而结构本身为队列的一个节点。 + 该数据结构中包含指定PCI地址的硬盘信息,而结构本身为队列的一个节点。 -3. 结构体成员 +3. 结构体成员 - |**成员** | **描述** | -|-----------------------------------|----------------------------------------------------------------------------------------------------| - |char pci[UBLOCK_PCI_ADDR_MAX_LEN] | PCI地址 | - |struct ublock_bdev_info info | 硬盘设备信息 | - |struct spdk_nvme_ctrlr *ctrlr | 设备控制器数据结构,该结构体内成员不对外开放,外部业务可通过SPDK开源接口获取相应成员数据。 | - |TAILQ_ENTRY(ublock_bdev) link | 队列前后指针结构体 | + |**成员** | **描述** | + |-----------------------------------|----------------------------------------------------------------------------------------------------| + |char pci[UBLOCK_PCI_ADDR_MAX_LEN] | PCI地址 | + |struct ublock_bdev_info info | 硬盘设备信息 | + |struct spdk_nvme_ctrlr *ctrlr | 设备控制器数据结构,该结构体内成员不对外开放,外部业务可通过SPDK开源接口获取相应成员数据。 | + |TAILQ_ENTRY(ublock_bdev) link | 队列前后指针结构体 | ##### struct ublock_bdev_mgr -1. 原型 -``` -struct ublock_bdev_mgr { -TAILQ_HEAD(, ublock_bdev) bdevs; -}; -``` -2. 描述 +1. 原型 -该数据结构内定义了一个ublock_bdev队列的头结构。 + ```bash + struct ublock_bdev_mgr { + TAILQ_HEAD(, ublock_bdev) bdevs; + }; + ``` -3. 结构体成员 +2. 描述 - |**成员** | **描述** | - |---------------------------------|------------------| - |TAILQ_HEAD(, ublock_bdev) bdevs; | 队列头结构体 | + 该数据结构内定义了一个ublock_bdev队列的头结构。 + +3. 结构体成员 + + |**成员** | **描述** | + |---------------------------------|------------------| + |TAILQ_HEAD(, ublock_bdev) bdevs; | 队列头结构体 | ##### struct __attribute__((packed)) ublock_SMART_info -1. 原型 -``` -struct __attribute__((packed)) ublock_SMART_info { -uint8_t critical_warning; -uint16_t temperature; -uint8_t available_spare; -uint8_t available_spare_threshold; -uint8_t percentage_used; -uint8_t reserved[26]; -/* - -Note that the following are 128-bit values, but are - -defined as an array of 2 64-bit values. -*/ -/* Data Units Read is always in 512-byte units. */ -uint64_t data_units_read[2]; -/* Data Units Written is always in 512-byte units. */ -uint64_t data_units_written[2]; -/* For NVM command set, this includes Compare commands. */ -uint64_t host_read_commands[2]; -uint64_t host_write_commands[2]; -/* Controller Busy Time is reported in minutes. */ -uint64_t controller_busy_time[2]; -uint64_t power_cycles[2]; -uint64_t power_on_hours[2]; -uint64_t unsafe_shutdowns[2]; -uint64_t media_errors[2]; -uint64_t num_error_info_log_entries[2]; -/* Controller temperature related. */ -uint32_t warning_temp_time; -uint32_t critical_temp_time; -uint16_t temp_sensor[8]; -uint8_t reserved2[296]; -}; -``` -2. 描述 - -该数据结构定义了硬盘SMART INFO信息内容。 - -3. 结构体成员 - -| **成员** | **描述(具体可以参考NVMe协议)** | -|-----------------------------------|-----------------------------------| -| uint8_t critical_warning | 该域表示控制器状态的重要的告警,bit位设置为1表示有效,可以设置
多个bit位有效。重要的告警信息通过异步事件返回给主机端。
Bit0:设置为1时表示冗余空间小于设定的阈值
Bit1:设置为1时表示温度超过或低于一个重要的阈值
Bit2:设置为1时表示由于重要的media错误或者internal error,器件的可靠性已经降低。
Bit3:设置为1时,该介质已经被置为只读模式。
Bit4:设置为1时,表示控制器的易失性器件fail,该域仅在控制器内部存在易失性器件时有效。
Bit 5~7:保留 | -| uint16_t temperature | 表示整个器件的温度,单位为Kelvin。 | -| uint8_t available_spare | 表示可用冗余空间的百分比(0到100%)。 | -| uint8_t available_spare_threshold | 可用冗余空间的阈值,低于该阈值时上报异步事件。 | -| uint8_t percentage_used | 该值表示用户实际使用和厂家设定的器件寿命的百分比,100表示已经达
到厂家预期的寿命,但可能不会失效,可以继续使用。该值允许大于100
,高于254的值都会被置为255。 | -| uint8_t reserved[26] | 保留 | -| uint64_t data_units_read[2] | 该值表示主机端从控制器中读走的512字节数目,其中1表示读走100
0个512字节,该值不包括metadata。当LBA大小不为512B
时,控制器将其转换成512B进行计算。16进制表示。 | -| uint64_t data_units_written[2] | 该值表示主机端写入控制器中的512字节数目,其中1表示写入1000
个512字节,该值不包括metadata。当LBA大小不为512B
时,控制器将其转换成512B进行计算。16进制表示。 | -| uint64_t host_read_commands[2] | 表示下发到控制器的读命令的个数。 | -| uint64_t host_write_commands[2] | 表示下发到控制器的写命令的个数 | -| uint64_t controller_busy_time[2] | 表示控制器处理I/O命令的busy时间,从命令下发SQ到完成命令返回到CQ的整个过程都为busy。该值以分钟为单位。| -| uint64_t power_cycles[2] | 上下电次数。 | -| uint64_t power_on_hours[2] | power-on时间小时数。 | -| uint64_t unsafe_shutdowns[2] | 异常关机次数,掉电时仍未接收到CC.SHN时该值加1。 | -| uint64_t media_errors[2] | 表示控制器检测到不可恢复的数据完整性错误的次数,其中包括不可纠的E
CC错误,CRC错误,LBA
tag不匹配。 | -| uint64_t num_error_info_log_entries[2] | 该域表示控制器生命周期内的错误信息日志的entry数目。 | -| uint32_t warning_temp_time | 温度超过warning告警值的累积时间,单位分钟。 | -| uint32_t critical_temp_time | 温度超过critical告警值的累积时间,单位分钟。 | -| uint16_t temp_sensor[8] | 温度传感器1~8的温度值,单位Kelvin。 | -| uint8_t reserved2[296] | 保留 | +1. 原型 + + ```bash + struct __attribute__((packed)) ublock_SMART_info { + uint8_t critical_warning; + uint16_t temperature; + uint8_t available_spare; + uint8_t available_spare_threshold; + uint8_t percentage_used; + uint8_t reserved[26]; + /* + + Note that the following are 128-bit values, but are + + defined as an array of 2 64-bit values. + */ + /* Data Units Read is always in 512-byte units. */ + uint64_t data_units_read[2]; + /* Data Units Written is always in 512-byte units. */ + uint64_t data_units_written[2]; + /* For NVM command set, this includes Compare commands. */ + uint64_t host_read_commands[2]; + uint64_t host_write_commands[2]; + /* Controller Busy Time is reported in minutes. */ + uint64_t controller_busy_time[2]; + uint64_t power_cycles[2]; + uint64_t power_on_hours[2]; + uint64_t unsafe_shutdowns[2]; + uint64_t media_errors[2]; + uint64_t num_error_info_log_entries[2]; + /* Controller temperature related. */ + uint32_t warning_temp_time; + uint32_t critical_temp_time; + uint16_t temp_sensor[8]; + uint8_t reserved2[296]; + }; + ``` + +2. 描述 + + 该数据结构定义了硬盘SMART INFO信息内容。 + +3. 结构体成员 + + | **成员** | **描述(具体可以参考NVMe协议)** | + |-----------------------------------|-----------------------------------| + | uint8_t critical_warning | 该域表示控制器状态的重要的告警,bit位设置为1表示有效,可以设置
多个bit位有效。重要的告警信息通过异步事件返回给主机端。
Bit0:设置为1时表示冗余空间小于设定的阈值
Bit1:设置为1时表示温度超过或低于一个重要的阈值
Bit2:设置为1时表示由于重要的media错误或者internal error,器件的可靠性已经降低。
Bit3:设置为1时,该介质已经被置为只读模式。
Bit4:设置为1时,表示控制器的易失性器件fail,该域仅在控制器内部存在易失性器件时有效。
Bit 5~7:保留 | + | uint16_t temperature | 表示整个器件的温度,单位为Kelvin。 | + | uint8_t available_spare | 表示可用冗余空间的百分比(0到100%)。 | + | uint8_t available_spare_threshold | 可用冗余空间的阈值,低于该阈值时上报异步事件。 | + | uint8_t percentage_used | 该值表示用户实际使用和厂家设定的器件寿命的百分比,100表示已经达
到厂家预期的寿命,但可能不会失效,可以继续使用。该值允许大于100
,高于254的值都会被置为255。 | + | uint8_t reserved[26] | 保留 | + | uint64_t data_units_read[2] | 该值表示主机端从控制器中读走的512字节数目,其中1表示读走100
0个512字节,该值不包括metadata。当LBA大小不为512B
时,控制器将其转换成512B进行计算。16进制表示。 | + | uint64_t data_units_written[2] | 该值表示主机端写入控制器中的512字节数目,其中1表示写入1000
个512字节,该值不包括metadata。当LBA大小不为512B
时,控制器将其转换成512B进行计算。16进制表示。 | + | uint64_t host_read_commands[2] | 表示下发到控制器的读命令的个数。 | + | uint64_t host_write_commands[2] | 表示下发到控制器的写命令的个数 | + | uint64_t controller_busy_time[2] | 表示控制器处理I/O命令的busy时间,从命令下发SQ到完成命令返回到CQ的整个过程都为busy。该值以分钟为单位。| + | uint64_t power_cycles[2] | 上下电次数。 | + | uint64_t power_on_hours[2] | power-on时间小时数。 | + | uint64_t unsafe_shutdowns[2] | 异常关机次数,掉电时仍未接收到CC.SHN时该值加1。 | + | uint64_t media_errors[2] | 表示控制器检测到不可恢复的数据完整性错误的次数,其中包括不可纠的E
CC错误,CRC错误,LBA
tag不匹配。 | + | uint64_t num_error_info_log_entries[2] | 该域表示控制器生命周期内的错误信息日志的entry数目。 | + | uint32_t warning_temp_time | 温度超过warning告警值的累积时间,单位分钟。 | + | uint32_t critical_temp_time | 温度超过critical告警值的累积时间,单位分钟。 | + | uint16_t temp_sensor[8] | 温度传感器1~8的温度值,单位Kelvin。 | + | uint8_t reserved2[296] | 保留 | ##### struct ublock_nvme_error_info -1. 原型 -``` -struct ublock_nvme_error_info { -uint64_t error_count; -uint16_t sqid; -uint16_t cid; -uint16_t status; -uint16_t error_location; -uint64_t lba; -uint32_t nsid; -uint8_t vendor_specific; -uint8_t reserved[35]; -}; -``` -2. 描述 - -该数据结构中包含设备控制器中单条错误信息具体内容,不同控制器可支持的错误条数可能不同。 - -3. 结构体成员 - - |**成员** | **描述(具体可以参考NVMe协议)** | - |------------------------|----------------------------------------------------------------------------------------------------------------------------------------| - |uint64_t error_count | Error序号,累增。 | - |uint16_t sqid | 此字段指示与错误信息关联的命令的提交队列标识符。如果错误无法关联特定命令,则该字段应设置为FFFFh。 | - |uint16_t cid | 此字段指示与错误信息关联的命令标识符。如果错误无法关联特定命令,则该字段应设置为FFFFh。 | - |uint16_t status | 此字段指示已完成命令的"状态字段"。 | - |uint16_t error_location | 此字段指示与错误信息关联的命令参数。 | - |uint64_t lba | 该字段表示遇到错误情况的第一个LBA。 | - |uint32_t nsid | 该字段表示遇到错误情况的namespace。 | - |uint8_t vendor_specific | 如果有其他供应商特定的错误信息可用,则此字段提供与该页面关联的日志页面标识符。 值00h表示没有可用的附加信息。有效值的范围为80h至FFh。 | - |uint8_t reserved[35] | 保留 | +1. 原型 + + ```bash + struct ublock_nvme_error_info { + uint64_t error_count; + uint16_t sqid; + uint16_t cid; + uint16_t status; + uint16_t error_location; + uint64_t lba; + uint32_t nsid; + uint8_t vendor_specific; + uint8_t reserved[35]; + }; + ``` + +2. 描述 + + 该数据结构中包含设备控制器中单条错误信息具体内容,不同控制器可支持的错误条数可能不同。 + +3. 结构体成员 + + |**成员** | **描述(具体可以参考NVMe协议)** | + |------------------------|----------------------------------------------------------------------------------------------------------------------------------------| + |uint64_t error_count | Error序号,累增。 | + |uint16_t sqid | 此字段指示与错误信息关联的命令的提交队列标识符。如果错误无法关联特定命令,则该字段应设置为FFFFh。 | + |uint16_t cid | 此字段指示与错误信息关联的命令标识符。如果错误无法关联特定命令,则该字段应设置为FFFFh。 | + |uint16_t status | 此字段指示已完成命令的"状态字段"。 | + |uint16_t error_location | 此字段指示与错误信息关联的命令参数。 | + |uint64_t lba | 该字段表示遇到错误情况的第一个LBA。 | + |uint32_t nsid | 该字段表示遇到错误情况的namespace。 | + |uint8_t vendor_specific | 如果有其他供应商特定的错误信息可用,则此字段提供与该页面关联的日志页面标识符。 值00h表示没有可用的附加信息。有效值的范围为80h至FFh。 | + |uint8_t reserved[35] | 保留 | ##### struct ublock_uevent -1. 原型 -``` -struct ublock_uevent { -enum ublock_nvme_uevent_action action; -int subsystem; -char traddr[UBLOCK_TRADDR_MAX_LEN + 1]; -}; -``` -2. 描述 +1. 原型 + + ```bash + struct ublock_uevent { + enum ublock_nvme_uevent_action action; + int subsystem; + char traddr[UBLOCK_TRADDR_MAX_LEN + 1]; + }; + ``` + +2. 描述 -该数据结构中包含用于表示uevent事件的相关参数。 + 该数据结构中包含用于表示uevent事件的相关参数。 -3. 结构体成员 +3. 结构体成员 - | **成员** | **描述** | - |----------------------------------------|-------------------------------------------------------------------------------------------------------------------------| - | enum ublock_nvme_uevent_action action | 通过枚举,表示uevent事件类型为插入硬盘,还是移除硬盘。 | - | int subsystem | 表示uevent事件的子系统类型,当前仅支持UBLOCK_NVME_UEVENT_SUBSYSTEM_UIO,如果应用程序收到其他值,则可不处理。 | - | char traddr[UBLOCK_TRADDR_MAX_LEN + 1] | 以"域:总线:设备.功能"(%04x:%02x:%02x.%x)格式表示的PCI地址字符串。 | + | **成员** | **描述** | + |----------------------------------------|-------------------------------------------------------------------------------------------------------------------------| + | enum ublock_nvme_uevent_action action | 通过枚举,表示uevent事件类型为插入硬盘,还是移除硬盘。 | + | int subsystem | 表示uevent事件的子系统类型,当前仅支持UBLOCK_NVME_UEVENT_SUBSYSTEM_UIO,如果应用程序收到其他值,则可不处理。 | + | char traddr[UBLOCK_TRADDR_MAX_LEN + 1] | 以"域:总线:设备.功能"(%04x:%02x:%02x.%x)格式表示的PCI地址字符串。 | ##### struct ublock_hook -1. 原型 -``` -struct ublock_hook -{ -ublock_callback_func ublock_callback; -void *user_data; -}; -``` -2. 描述 +1. 原型 -该数据结构用于注册回调函数。 + ```bash + struct ublock_hook + { + ublock_callback_func ublock_callback; + void *user_data; + }; + ``` -3. 结构体成员 +2. 描述 -| **成员** | **描述** | -|---------------------------------------|---------------------------------------------------------------------------| -| ublock_callback_func ublock_callback | 表示回调时执行的函数,类型为bool func(void *info, void *user_data). | -| void *user_data | 传给回调函数的用户参数 | + 该数据结构用于注册回调函数。 + +3. 结构体成员 + + | **成员** | **描述** | + |---------------------------------------|---------------------------------------------------------------------------| + | ublock_callback_func ublock_callback | 表示回调时执行的函数,类型为bool func(void *info, void *user_data). | + | void *user_data | 传给回调函数的用户参数 | ##### struct ublock_ctrl_iostat_info -1. 原型 -``` -struct ublock_ctrl_iostat_info -{ -uint64_t num_read_ops; -uint64_t num_write_ops; -uint64_t read_latency_ms; -uint64_t write_latency_ms; -uint64_t io_outstanding; -uint64_t num_poll_timeout; -uint64_t io_ticks_ms; -}; -``` -2. 描述 - -该数据结构用于获取控制器的IO统计信息。 - -3. 结构体成员 - -| **成员** | **描述** | -|-----------------------------|---------------------------------------------| -| uint64_t num_read_ops | 获取的该控制器的读IO个数(累加值) | -| uint64_t num_write_ops | 获取的该控制器的写IO个数(累加值) | -| uint64_t read_latency_ms | 获取的该控制器的读时延(累加值,ms) | -| uint64_t write_latency_ms | 获取的该控制器的写时延(累加值,ms) | -| uint64_t io_outstanding | 获取的该控制器的队列深度 | -| uint64_t num_poll_timeout | 获取的该控制器的轮询超时次数(累加值) | -| uint64_t io_ticks_ms | 获取的该控制器的IO处理时延(累加值,ms) | +1. 原型 + + ```bash + struct ublock_ctrl_iostat_info + { + uint64_t num_read_ops; + uint64_t num_write_ops; + uint64_t read_latency_ms; + uint64_t write_latency_ms; + uint64_t io_outstanding; + uint64_t num_poll_timeout; + uint64_t io_ticks_ms; + }; + ``` + +2. 描述 + + 该数据结构用于获取控制器的IO统计信息。 + +3. 结构体成员 + + | **成员** | **描述** | + |-----------------------------|---------------------------------------------| + | uint64_t num_read_ops | 获取的该控制器的读IO个数(累加值) | + | uint64_t num_write_ops | 获取的该控制器的写IO个数(累加值) | + | uint64_t read_latency_ms | 获取的该控制器的读时延(累加值,ms) | + | uint64_t write_latency_ms | 获取的该控制器的写时延(累加值,ms) | + | uint64_t io_outstanding | 获取的该控制器的队列深度 | + | uint64_t num_poll_timeout | 获取的该控制器的轮询超时次数(累加值) | + | uint64_t io_ticks_ms | 获取的该控制器的IO处理时延(累加值,ms) | ### API @@ -1074,1218 +1129,1309 @@ uint64_t io_ticks_ms; ##### libstorage_get_nvme_ctrlr_info -1. 接口原型 +1. 接口原型 -uint32_t libstorage_get_nvme_ctrlr_info(struct libstorage_nvme_ctrlr_info** ppCtrlrInfo); + uint32_t libstorage_get_nvme_ctrlr_info(struct libstorage_nvme_ctrlr_info** ppCtrlrInfo); -2. 接口描述 +2. 接口描述 -获取所有控制器信息。 + 获取所有控制器信息。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|-----------------------------------|-----------------------------------| -| struct libstorage_nvme_ctrlr_info** ppCtrlrInfo| 出参,返回所有获取到的控制器信息。
说明:
使用后务必通过free接口释放内存。 | + | **参数成员** | **描述** | + |-----------------------------------|-----------------------------------| + | struct libstorage_nvme_ctrlr_info** ppCtrlrInfo| 出参,返回所有获取到的控制器信息。
说明:
使用后务必通过free接口释放内存。 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|----------------------------------------------| -| 0 | 控制器信息获取失败,或未获取到任何控制器信息 | -| 大于0 | 获取到的控制器个数 | + | **返回值** | **描述** | + |-------------|----------------------------------------------| + | 0 | 控制器信息获取失败,或未获取到任何控制器信息 | + | 大于0 | 获取到的控制器个数 | ##### libstorage_get_mgr_info_by_esn -1. 接口原型 -``` -int32_t libstorage_get_mgr_info_by_esn(const char *esn, struct libstorage_mgr_info *mgr_info); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_get_mgr_info_by_esn(const char *esn, struct libstorage_mgr_info *mgr_info); + ``` + +2. 接口描述 -数据面获取设备序列号(ESN)对应的NVMe磁盘的管理信息。 + 数据面获取设备序列号(ESN)对应的NVMe磁盘的管理信息。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|---------------------------|----------------------------------------------| -| const char *esn | 被查询设备的ESN号
说明:
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | -| struct libstorage_mgr_info *mgr_info | 出参,返回所有获取到的NVMe磁盘管理信息。 | + | **参数成员** | **描述** | + |---------------------------|----------------------------------------------| + | const char *esn | 被查询设备的ESN号
说明:
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | + | struct libstorage_mgr_info *mgr_info | 出参,返回所有获取到的NVMe磁盘管理信息。 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|------------------------------------------| -| 0 | 查询ESN对应的NVMe磁盘管理信息成功。 | -| -1 | 查询ESN对应的NVMe磁盘管理信息失败。 | -| -2 | 未获取到任何匹配ESN的NVMe磁盘。 | + | **返回值** | **描述** | + |-------------|------------------------------------------| + | 0 | 查询ESN对应的NVMe磁盘管理信息成功。 | + | -1 | 查询ESN对应的NVMe磁盘管理信息失败。 | + | -2 | 未获取到任何匹配ESN的NVMe磁盘。 | ##### libstorage_get_mgr_smart_by_esn -1. 接口原型 -``` -int32_t libstorage_get_mgr_smart_by_esn(const char *esn, uint32_t nsid, struct libstorage_smart_info *mgr_smart_info); -``` -2. 接口描述 +1. 接口原型 -数据面获取设备序列号(ESN)对应的NVMe磁盘的SMART信息。 + ```bash + int32_t libstorage_get_mgr_smart_by_esn(const char *esn, uint32_t nsid, struct libstorage_smart_info *mgr_smart_info); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|-------------------------------|------------------------------------------| -| const char *esn | 被查询设备的ESN号
说明:
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | -| uint32_t nsid | 指定的namespace | -| struct libstorage_mgr_info *mgr_info | 出参,返回所有获取到的NVMe磁盘SMART信息。 | + 数据面获取设备序列号(ESN)对应的NVMe磁盘的SMART信息。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------|---------------------------------------| -| 0 | 查询ESN对应的NVMe磁盘SMART信息成功。 | -| -1 | 查询ESN对应的NVMe磁盘SMART信息失败。 | -| -2 | 未获取到任何匹配ESN的NVMe磁盘。 | + | **参数成员** | **描述** | + |-------------------------------|------------------------------------------| + | const char *esn | 被查询设备的ESN号
说明:
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | + | uint32_t nsid | 指定的namespace | + | struct libstorage_mgr_info *mgr_info | 出参,返回所有获取到的NVMe磁盘SMART信息。 | + +4. 返回值 + + | **返回值** | **描述** | + |-------------|---------------------------------------| + | 0 | 查询ESN对应的NVMe磁盘SMART信息成功。 | + | -1 | 查询ESN对应的NVMe磁盘SMART信息失败。 | + | -2 | 未获取到任何匹配ESN的NVMe磁盘。 | ##### libstorage_get_bdev_ns_info -1. 接口原型 -``` -uint32_t libstorage_get_bdev_ns_info(const char* bdevName, struct libstorage_namespace_info** ppNsInfo); -``` -2. 接口描述 +1. 接口原型 + + ```bash + uint32_t libstorage_get_bdev_ns_info(const char* bdevName, struct libstorage_namespace_info** ppNsInfo); + ``` + +2. 接口描述 -根据设备名称,获取namespace信息。 + 根据设备名称,获取namespace信息。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|-------------------------------|---------------------------------------| -| const char* bdevName | 设备名称 | -| struct libstorage_namespace_info** ppNsInfo | 出参,返回namespace信息。
说明
使用后务必通过free接口释放内存。 | + | **参数成员** | **描述** | + |-------------------------------|---------------------------------------| + | const char* bdevName | 设备名称 | + | struct libstorage_namespace_info** ppNsInfo | 出参,返回namespace信息。
说明
使用后务必通过free接口释放内存。 | -4. 返回值 +4. 返回值 -| **返回值**| **描述** | -|------------|---------------| -| 0 | 获取失败 | -| 1 | 获取成功 | + | **返回值**| **描述** | + |------------|---------------| + | 0 | 获取失败 | + | 1 | 获取成功 | ##### libstorage_get_ctrl_ns_info -1. 接口原型 -``` -uint32_t libstorage_get_ctrl_ns_info(const char* ctrlName, struct libstorage_namespace_info** ppNsInfo); -``` -2. 接口描述 +1. 接口原型 -根据控制器名称,获取所有namespace信息。 + ```bash + uint32_t libstorage_get_ctrl_ns_info(const char* ctrlName, struct libstorage_namespace_info** ppNsInfo); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|-------------------------------|---------------------------------------| -| const char* ctrlName | 控制器名称 | -| struct libstorage_namespace_info** ppNsInfo| 出参,返回所有namespace信息。
说明
使用后务必通过free接口释放内存。 | + 根据控制器名称,获取所有namespace信息。 -4. 返回值 +3. 参数 -| **返回值**| **描述** | -|------------|-------------------------------------------| -| 0 | 获取失败,或未获取到任何namespace信息 | -| 大于0 | 获取到的namespace个数 | + | **参数成员** | **描述** | + |-------------------------------|---------------------------------------| + | const char* ctrlName | 控制器名称 | + | struct libstorage_namespace_info** ppNsInfo| 出参,返回所有namespace信息。
说明
使用后务必通过free接口释放内存。 | + +4. 返回值 + + | **返回值**| **描述** | + |------------|-------------------------------------------| + | 0 | 获取失败,或未获取到任何namespace信息 | + | 大于0 | 获取到的namespace个数 | ##### libstorage_create_namespace -1. 接口原型 -``` -int32_t libstorage_create_namespace(const char* ctrlName, uint64_t ns_size, char** outputName); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_create_namespace(const char* ctrlName, uint64_t ns_size, char** outputName); + ``` -在指定控制器上创建namespace(前提是控制器具有namespace管理能力)。 +2. 接口描述 -Optane盘基于NVMe 1.0协议,不支持namespace管理,因此不支持该接口的使用。 + 在指定控制器上创建namespace(前提是控制器具有namespace管理能力)。 -ES3000 V3和V5默认只支持一个namespace。在控制器上默认会存在一个namespace,如果要创建新的namespace,需要将原有namespace删除。 + Optane盘基于NVMe 1.0协议,不支持namespace管理,因此不支持该接口的使用。 -3. 参数 + ES3000 V3和V5默认只支持一个namespace。在控制器上默认会存在一个namespace,如果要创建新的namespace,需要将原有namespace删除。 -| **参数成员** | **描述** | -|--------------------------|-------------------------------------------| -| const char* ctrlName | 控制器名称 | -| uint64_t ns_size | 要创建的namespace大小(以sertor_size为单位) | -| char** outputName | 出参:创建的namespace名称
说明
使用后务必通过free接口释放内存。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |--------------------------|-------------------------------------------| + | const char* ctrlName | 控制器名称 | + | uint64_t ns_size | 要创建的namespace大小(以sertor_size为单位) | + | char** outputName | 出参:创建的namespace名称
说明
使用后务必通过free接口释放内存。 | -| **返回值** | **描述** | -|-------------|-----------------------------------| -| 小于等于0 | 创建namespace失败 | -| 大于0 | 所创建的namespace编号(从1开始) | +4. 返回值 + + | **返回值** | **描述** | + |-------------|-----------------------------------| + | 小于等于0 | 创建namespace失败 | + | 大于0 | 所创建的namespace编号(从1开始) | ##### libstorage_delete_namespace -1. 接口原型 -``` -int32_t libstorage_delete_namespace(const char* ctrlName, uint32_t ns_id); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_delete_namespace(const char* ctrlName, uint32_t ns_id); + ``` -在指定控制器上删除namespace。Optane盘基于NVMe 1.0协议,不支持namespace管理,因此不支持该接口的使用。 +2. 接口描述 -3. 参数 + 在指定控制器上删除namespace。Optane盘基于NVMe 1.0协议,不支持namespace管理,因此不支持该接口的使用。 -| **参数成员** | **描述** | -|-----------------------|-------------------| -| const char* ctrlName | 控制器名字 | -| uint32_t ns_id | Namespace ID | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |-----------------------|-------------------| + | const char* ctrlName | 控制器名字 | + | uint32_t ns_id | Namespace ID | -| **返回值** | **描述** | -|-------------|-------------------------------------------| -| 0 | 删除成功 | -| 非0 | 删除失败
说明
删除namespace前要求先停止IO相关动作,否则删除失败。 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|-------------------------------------------| + | 0 | 删除成功 | + | 非0 | 删除失败
说明
删除namespace前要求先停止IO相关动作,否则删除失败。 | ##### libstorage_delete_all_namespace -1. 接口原型 -``` -int32_t libstorage_delete_all_namespace(const char* ctrlName); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_delete_all_namespace(const char* ctrlName); + ``` -删除指定控制器上所有namespace。Optane盘基于NVMe 1.0协议,不支持namespace管理,因此不支持该接口的使用。 +2. 接口描述 -3. 参数 + 删除指定控制器上所有namespace。Optane盘基于NVMe 1.0协议,不支持namespace管理,因此不支持该接口的使用。 -| **参数成员** | **描述** | -|------------------------|----------------| -| const char* ctrlName |控制器名称 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |------------------------|----------------| + | const char* ctrlName |控制器名称 | -| **返回值** | **描述** | -|-------------|-------------------------------------------| -| 0 | 删除成功 | -| 非0 | 删除失败
说明
删除namespace前要求先停止IO相关动作,否则删除失败。 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|-------------------------------------------| + | 0 | 删除成功 | + | 非0 | 删除失败
说明
删除namespace前要求先停止IO相关动作,否则删除失败。 | ##### libstorage_nvme_create_ctrlr -1. 接口原型 -``` -int32_t libstorage_nvme_create_ctrlr(const char *pci_addr, const char *ctrlr_name); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_nvme_create_ctrlr(const char *pci_addr, const char *ctrlr_name); + ``` -根据PCI地址创建NVMe控制器。 +2. 接口描述 -3. 参数 + 根据PCI地址创建NVMe控制器。 -| **参数成员** | **描述** | -|--------------------|-------------------| -| char *pci_addr |PCI地址 | -| char *ctrlr_name |控制器名称 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |--------------------|-------------------| + | char *pci_addr |PCI地址 | + | char *ctrlr_name |控制器名称 | -| **返回值** | **描述** | -|-------------|--------------| -| 小于0 | 创建失败 | -| 0 | 创建成功 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|--------------| + | 小于0 | 创建失败 | + | 0 | 创建成功 | ##### libstorage_nvme_delete_ctrlr -1. 接口原型 -``` -int32_t libstorage_nvme_delete_ctrlr(const char *ctrlr_name); -``` -1. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_nvme_delete_ctrlr(const char *ctrlr_name); + ``` -根据控制器名称销毁NVMe控制器。 +2. 接口描述 -2. 参数 + 根据控制器名称销毁NVMe控制器。 -| **参数成员** | **描述** | -|-------------------------|-----------------| -| const char *ctrlr_name | 控制器名称 | +3. 参数 -确保已下发的io已经全部返回后方可调用本接口。 + | **参数成员** | **描述** | + |-------------------------|-----------------| + | const char *ctrlr_name | 控制器名称 | -3. 返回值 + 确保已下发的io已经全部返回后方可调用本接口。 -| **返回值** | **描述** | -|-------------|--------------| -| 小于0 | 销毁失败 | -| 0 | 销毁成功 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|--------------| + | 小于0 | 销毁失败 | + | 0 | 销毁成功 | ##### libstorage_nvme_reload_ctrlr -1. 接口原型 -``` -int32_t libstorage_nvme_reload_ctrlr(const char *cfgfile); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_nvme_reload_ctrlr(const char *cfgfile); + ``` -根据配置文件增删NVMe控制器。 +2. 接口描述 -3. 参数 + 根据配置文件增删NVMe控制器。 -| **参数成员** | **描述** | -|----------------------|-------------------| -| const char *cfgfile | 配置文件路径 | +3. 参数 + | **参数成员** | **描述** | + |----------------------|-------------------| + | const char *cfgfile | 配置文件路径 | -使用本接口删盘时,需要确保已下发的io已经全部返回。 + 使用本接口删盘时,需要确保已下发的io已经全部返回。 -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|-----------------------------------------------------| -| 小于0 | 根据配置文件增删盘失败(可能部分控制器增删成功) | -| 0 | 根据配置文件增删盘成功 | + | **返回值** | **描述** | + |-------------|-----------------------------------------------------| + | 小于0 | 根据配置文件增删盘失败(可能部分控制器增删成功) | + | 0 | 根据配置文件增删盘成功 | -> 使用限制 + > 使用限制 -- 目前最多支持在配置文件中配置36个控制器。 + - 目前最多支持在配置文件中配置36个控制器。 -- 重加载接口会尽可能创建多的控制器,某个控制器创建失败,不会影响其他控制器的创建。 + - 重加载接口会尽可能创建多的控制器,某个控制器创建失败,不会影响其他控制器的创建。 -- 无法保证并发场景下最终的盘初始化情况与最后调用传入的配置文件相符。 + - 无法保证并发场景下最终的盘初始化情况与最后调用传入的配置文件相符。 -- 对正在下发io的盘通过reload删除时,会导致io失败。 + - 对正在下发io的盘通过reload删除时,会导致io失败。 -- 修改配置文件中pci地址对应的控制器名称(e.g.nvme0),调用此接口后无法生效。 + - 修改配置文件中pci地址对应的控制器名称(e.g.nvme0),调用此接口后无法生效。 -- reload仅针对于增删盘的场景有效,配置文件中的其他配置项修改无法重载。 + - reload仅针对于增删盘的场景有效,配置文件中的其他配置项修改无法重载。 ##### libstorage_low_level_format_nvm -1. 接口原型 -``` -int8_t libstorage_low_level_format_nvm(const char* ctrlName, uint8_t lbaf, -enum libstorage_ns_pi_type piType, -bool pil_start, bool ms_extented, uint8_t ses); -``` -2. 接口描述 +1. 接口原型 -低级格式化NVMe盘。 + ```bash + int8_t libstorage_low_level_format_nvm(const char* ctrlName, uint8_t lbaf, + enum libstorage_ns_pi_type piType, + bool pil_start, bool ms_extented, uint8_t ses); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|-------------------------------------|----------------------------------------------------------------------------| -| const char* ctrlName | 控制器名称 | -| uint8_t lbaf | 所要使用的LBA格式 | -| enum libstorage_ns_pi_type piType |所要使用的保护类型 | -| bool pil_start | pi信息位于元数据的first eight bytes(1) or last eight bytes (0) | -| bool ms_extented | 是否要格式化成扩展型 | -| uint8_t ses | 格式化时是否进行安全擦除(当前仅支持设置为0:no-secure earse) | + 低级格式化NVMe盘。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------|-----------------------------| -| 小于0 | 格式化失败 | -| 大于等于0 | 当前格式化成功的LBA格式 | + | **参数成员** | **描述** | + |-------------------------------------|----------------------------------------------------------------------------| + | const char* ctrlName | 控制器名称 | + | uint8_t lbaf | 所要使用的LBA格式 | + | enum libstorage_ns_pi_type piType |所要使用的保护类型 | + | bool pil_start | pi信息位于元数据的first eight bytes(1) or last eight bytes (0) | + | bool ms_extented | 是否要格式化成扩展型 | + | uint8_t ses | 格式化时是否进行安全擦除(当前仅支持设置为0:no-secure earse) | -> 使用限制 +4. 返回值 -- 该低级格式化接口会清除磁盘namespace的数据和元数据,请谨慎使用。 + | **返回值** | **描述** | + |-------------|-----------------------------| + | 小于0 | 格式化失败 | + | 大于等于0 | 当前格式化成功的LBA格式 | -- ES3000盘在格式化时耗时数秒,Intel Optane盘在格式化时需耗时数分钟,在使用该接口时需要等待其执行完成。若强行杀掉格式化进程,会导致格式化失败。 + > 使用限制 -- 在格式化执行之前,需要停止数据面的IO操作。如果当前磁盘正在处理IO请求,格式化操作会概率性出现失败,并且在格式化成功的情况下会存在硬盘丢弃正在处理的IO的可能,所以在格式化前,请保证数据面的IO操作已停止。 + - 该低级格式化接口会清除磁盘namespace的数据和元数据,请谨慎使用。 -- 格式化过程中会reset控制器,导致之前已经初始化的磁盘资源不可用。因此格式化完成之后,需要重启数据面IO进程。 + - ES3000盘在格式化时耗时数秒,Intel Optane盘在格式化时需耗时数分钟,在使用该接口时需要等待其执行完成。若强行杀掉格式化进程,会导致格式化失败。 -- ES3000 V3支持保护类型0和3,支持PI start和PI end,仅支持mc extended。ES3000 V3的512+8格式支持DIF,4096+64格式不支持。 + - 在格式化执行之前,需要停止数据面的IO操作。如果当前磁盘正在处理IO请求,格式化操作会概率性出现失败,并且在格式化成功的情况下会存在硬盘丢弃正在处理的IO的可能,所以在格式化前,请保证数据面的IO操作已停止。 -- ES3000 V5支持保护类型0和3,支持PI start和PI end,支持mc extended和mc pointer。ES3000 V5的512+8和4096+64格式均支持DIF。 + - 格式化过程中会reset控制器,导致之前已经初始化的磁盘资源不可用。因此格式化完成之后,需要重启数据面IO进程。 -- Optane盘支持保护类型0和1,仅支持PI end,仅支持mc extended。Optane的512+8格式支持DIF,4096+64格式不支持。 + - ES3000 V3支持保护类型0和3,支持PI start和PI end,仅支持mc extended。ES3000 V3的512+8格式支持DIF,4096+64格式不支持。 -| **磁盘类型** | **LBA格式** | **磁盘类型** | **LBA格式** | -|----------------------|-----------------|---------------|-------------------| -| Intel Optane P4800 | lbaf0:512+0
lbaf1:512+8
lbaf2:512+16
lbaf3:4096+0
lbaf4:4096+8
lbaf5:4096+64
lbaf6:4096+128 | ES3000 V3、V5 | lbaf0:512+0
lbaf1:512+8
lbaf2:4096+64
lbaf3:4096+0
lbaf4:4096+8 | + - ES3000 V5支持保护类型0和3,支持PI start和PI end,支持mc extended和mc pointer。ES3000 V5的512+8和4096+64格式均支持DIF。 + + - Optane盘支持保护类型0和1,仅支持PI end,仅支持mc extended。Optane的512+8格式支持DIF,4096+64格式不支持。 + + | **磁盘类型** | **LBA格式** | **磁盘类型** | **LBA格式** | + |----------------------|-----------------|---------------|-------------------| + | Intel Optane P4800 | lbaf0:512+0
lbaf1:512+8
lbaf2:512+16
lbaf3:4096+0
lbaf4:4096+8
lbaf5:4096+64
lbaf6:4096+128 | ES3000 V3、V5 | lbaf0:512+0
lbaf1:512+8
lbaf2:4096+64
lbaf3:4096+0
lbaf4:4096+8 | ##### LIBSTORAGE_CALLBACK_FUNC -1. 接口原型 -``` -typedef void (*LIBSTORAGE_CALLBACK_FUNC)(int32_t cb_status, int32_t sct_code, void* cb_arg); -``` -2. 接口描述 +1. 接口原型 + + ```bash + typedef void (*LIBSTORAGE_CALLBACK_FUNC)(int32_t cb_status, int32_t sct_code, void* cb_arg); + ``` + +2. 接口描述 -注册的HSAK io完成回调函数。 + 注册的HSAK io完成回调函数。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|------------------------------------|-----------------------------| -| int32_t cb_status | io 状态码,0为成功,负值为系统错误码,正值为硬盘错误码(不同错误码的
含义见[附录](#附录)) | -| int32_t sct_code | io 状态码类型(0:[GENERIC](#generic);
1:[COMMAND_SPECIFIC](#command_specific);
2:[MEDIA_DATA_INTERGRITY_ERROR](#media_data_intergrity_error)
7:VENDOR_SPECIFIC) | -| void* cb_arg | 回调函数的入参 | + | **参数成员** | **描述** | + |------------------------------------|-----------------------------| + | int32_t cb_status | io 状态码,0为成功,负值为系统错误码,正值为硬盘错误码(不同错误码的
含义见[附录](#附录)) | + | int32_t sct_code | io 状态码类型(0:[GENERIC](#generic);
1:[COMMAND_SPECIFIC](#command_specific);
2:[MEDIA_DATA_INTERGRITY_ERROR](#media_data_intergrity_error)
7:VENDOR_SPECIFIC) | + | void* cb_arg | 回调函数的入参 | -4. 返回值 +4. 返回值 -无。 + 无。 ##### libstorage_deallocate_block -1. 接口原型 -``` -int32_t libstorage_deallocate_block(int32_t fd, struct libstorage_dsm_range_desc *range, uint16_t range_count, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); -``` -2. 接口描述 +1. 接口原型 -告知NVMe盘可释放的块。 + ```bash + int32_t libstorage_deallocate_block(int32_t fd, struct libstorage_dsm_range_desc *range, uint16_t range_count, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|------------------------------------|-----------------------------| -| int32_t fd | 已打开的硬盘文件描述符 | -| struct libstorage_dsm_range_desc *range | NVMe盘可释放的块描述列表
说明
该参数需要使用libstorage_mem_reserve分配
大页内存,分配内存时需要4K对齐,即align设置为4096。
盘的TRIM的范围根据不同的盘进行约束,超过盘侧的最大TRIM范围
可能触发数据异常。 | -| uint16_t range_count | 数组range的成员数 | -| LIBSTORAGE_CALLBACK_FUNC cb | 回调函数 | -| void* cb_arg | 回调函数参数 | + 告知NVMe盘可释放的块。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------|----------------| -| 小于0 | 请求下发失败 | -| 0 | 请求下发成功 | + | **参数成员** | **描述** | + |------------------------------------|-----------------------------| + | int32_t fd | 已打开的硬盘文件描述符 | + | struct libstorage_dsm_range_desc *range | NVMe盘可释放的块描述列表
说明
该参数需要使用libstorage_mem_reserve分配
大页内存,分配内存时需要4K对齐,即align设置为4096。
盘的TRIM的范围根据不同的盘进行约束,超过盘侧的最大TRIM范围
可能触发数据异常。 | + | uint16_t range_count | 数组range的成员数 | + | LIBSTORAGE_CALLBACK_FUNC cb | 回调函数 | + | void* cb_arg | 回调函数参数 | + +4. 返回值 + + | **返回值** | **描述** | + |-------------|----------------| + | 小于0 | 请求下发失败 | + | 0 | 请求下发成功 | ##### libstorage_async_write -1. 接口原型 -``` -int32_t libstorage_async_write(int32_t fd, void *buf, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_async_write(int32_t fd, void *buf, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); + ``` -HSAK下发异步IO写请求的接口(写缓冲区为连续buffer)。 +2. 接口描述 -3. 参数 + HSAK下发异步IO写请求的接口(写缓冲区为连续buffer)。 -| **参数成员** | **描述** | -|------------------------------------|-----------------------------| -| int32_t fd | 块设备的文件描述符 | -| void *buf | IO写数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
注:扩展型LBA要包含元数据内存大小。 | -| size_t nbytes | 单次写IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| off64_t offset | LBA的写偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | -| size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | -| enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | -| LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | -| void* cb_arg | 回调函数的参数 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |------------------------------------|-----------------------------| + | int32_t fd | 块设备的文件描述符 | + | void *buf | IO写数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
注:扩展型LBA要包含元数据内存大小。 | + | size_t nbytes | 单次写IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | off64_t offset | LBA的写偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | + | size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | + | enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | + | LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | + | void* cb_arg | 回调函数的参数 | -| **返回值**| **描述** | -|------------|--------------------| -| 0 | IO写请求提交成功 | -| 非0 | IO写请求提交失败 | +4. 返回值 + + | **返回值**| **描述** | + |------------|--------------------| + | 0 | IO写请求提交成功 | + | 非0 | IO写请求提交失败 | ##### libstorage_async_read -1. 接口原型 -``` -int32_t libstorage_async_read(int32_t fd, void *buf, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_async_read(int32_t fd, void *buf, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); + ``` -HSAK下发异步IO读请求的接口(读缓冲区为连续buffer)。 +2. 接口描述 -3. 参数 + HSAK下发异步IO读请求的接口(读缓冲区为连续buffer)。 -| **参数成员** | **描述** | -|------------------------------------|----------------------------------| -| int32_t fd | 块设备的文件描述符 | -| void *buf | IO读数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
扩展型LBA要包含元数据内存大小。 | -| size_t nbytes | 单次读IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| off64_t offset | LBA的读偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | -| size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | -| enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | -| LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | -| void* cb_arg | 回调函数的参数 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |------------------------------------|----------------------------------| + | int32_t fd | 块设备的文件描述符 | + | void *buf | IO读数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
扩展型LBA要包含元数据内存大小。 | + | size_t nbytes | 单次读IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | off64_t offset | LBA的读偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | + | size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | + | enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | + | LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | + | void* cb_arg | 回调函数的参数 | -| **返回值** | **描述** | -|-------------|------------------| -| 0 | IO读请求提交成功 | -| 非0 | IO读请求提交失败 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|------------------| + | 0 | IO读请求提交成功 | + | 非0 | IO读请求提交失败 | ##### libstorage_async_writev -1. 接口原型 -``` -int32_t libstorage_async_writev(int32_t fd, struct iovec *iov, int iovcnt, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_async_writev(int32_t fd, struct iovec *iov, int iovcnt, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); + ``` -HSAK下发异步IO写请求的接口(写缓冲区为离散buffer)。 +2. 接口描述 -3. 参数 + HSAK下发异步IO写请求的接口(写缓冲区为离散buffer)。 -| **参数成员** | **描述** | -|------------------------------------|----------------------------------| -| int32_t fd | 块设备的文件描述符 | -| struct iovec *iov | IO写数据的缓冲区
说明
扩展型LBA要包含元数据大小。
地址要求四字节对齐,长度不超过4GB。 | -| int iovcnt | IO写数据的缓冲区个数 | -| size_t nbytes | 单次写IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| off64_t offset | LBA的写偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | -| size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | -| enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | -| LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | -| void* cb_arg | 回调函数的参数 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |------------------------------------|----------------------------------| + | int32_t fd | 块设备的文件描述符 | + | struct iovec *iov | IO写数据的缓冲区
说明
扩展型LBA要包含元数据大小。
地址要求四字节对齐,长度不超过4GB。 | + | int iovcnt | IO写数据的缓冲区个数 | + | size_t nbytes | 单次写IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | off64_t offset | LBA的写偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | + | size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | + | enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | + | LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | + | void* cb_arg | 回调函数的参数 | -| **返回值** | **描述** | -|--------------|-------------------| -| 0 | IO写请求提交成功 | -| 非0 | IO写请求提交失败 | +4. 返回值 + + | **返回值** | **描述** | + |--------------|-------------------| + | 0 | IO写请求提交成功 | + | 非0 | IO写请求提交失败 | ##### libstorage_async_readv -1. 接口原型 -``` -int32_t libstorage_async_readv(int32_t fd, struct iovec *iov, int iovcnt, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_async_readv(int32_t fd, struct iovec *iov, int iovcnt, size_t nbytes, off64_t offset, void *md_buf, size_t md_len, enum libstorage_crc_and_prchk dif_flag, LIBSTORAGE_CALLBACK_FUNC cb, void* cb_arg); + ``` -HSAK下发异步IO读请求的接口(读缓冲区为离散buffer)。 +2. 接口描述 -3. 参数 + HSAK下发异步IO读请求的接口(读缓冲区为离散buffer)。 -| **参数成员** | **描述** | -|------------------------------------|----------------------------------| -| int32_t fd | 块设备的文件描述符 | -| struct iovec *iov | IO读数据的缓冲区
说明
扩展型LBA要包含元数据大小。
地址要求四字节对齐,长度不超过4GB。 | -| int iovcnt | IO读数据的缓冲区个数 | -| size_t nbytes | 单次读IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| off64_t offset | LBA的读偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | -| size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | -| enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | -| LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | -| void* cb_arg | 回调函数的参数 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |------------------------------------|----------------------------------| + | int32_t fd | 块设备的文件描述符 | + | struct iovec *iov | IO读数据的缓冲区
说明
扩展型LBA要包含元数据大小。
地址要求四字节对齐,长度不超过4GB。 | + | int iovcnt | IO读数据的缓冲区个数 | + | size_t nbytes | 单次读IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | off64_t offset | LBA的读偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | void *md_buf | 元数据的缓冲区(仅适用于分离型LBA,扩展型LBA设置为NULL即可) | + | size_t md_len | 元数据的缓冲区长度(仅适用于分离型LBA,扩展型LBA设置为0即可) | + | enum libstorage_crc_and_prchk dif_flag | 是否计算DIF、是否开启盘的校验 | + | LIBSTORAGE_CALLBACK_FUNC cb | 注册的回调函数 | + | void* cb_arg | 回调函数的参数 | -| **返回值** | **描述** | -|-------------|----------------------| -| 0 | IO读请求提交成功 | -| 非0 | IO读请求提交失败 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|----------------------| + | 0 | IO读请求提交成功 | + | 非0 | IO读请求提交失败 | ##### libstorage_sync_write -1. 接口原型 -``` -int32_t libstorage_sync_write(int fd, const void *buf, size_t nbytes, off_t offset); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_sync_write(int fd, const void *buf, size_t nbytes, off_t offset); + ``` -HSAK下发同步IO写请求的接口(写缓冲区为连续buffer)。 +2. 接口描述 -3. 参数 + HSAK下发同步IO写请求的接口(写缓冲区为连续buffer)。 -| **参数成员** | **描述** | -|------------------------------------|----------------------------------| -| int32_t fd | 块设备的文件描述符 | -| void *buf | IO写数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
扩展型LBA要包含元数据内存大小。 | -| size_t nbytes | 单次写IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| off64_t offset | LBA的写偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |------------------------------------|----------------------------------| + | int32_t fd | 块设备的文件描述符 | + | void *buf | IO写数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
扩展型LBA要包含元数据内存大小。 | + | size_t nbytes | 单次写IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | off64_t offset | LBA的写偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| **返回值** | **描述** | -|-------------|-----------------------| -| 0 | IO写请求提交成功 | -| 非0 | IO写请求提交失败 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|-----------------------| + | 0 | IO写请求提交成功 | + | 非0 | IO写请求提交失败 | ##### libstorage_sync_read -1. 接口原型 -``` -int32_t libstorage_sync_read(int fd, const void *buf, size_t nbytes, off_t offset); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_sync_read(int fd, const void *buf, size_t nbytes, off_t offset); + ``` -HSAK下发同步IO读请求的接口(读缓冲区为连续buffer)。 +2. 接口描述 -3. 参数 + HSAK下发同步IO读请求的接口(读缓冲区为连续buffer)。 -| **参数成员** | **描述** | -|------------------------------------|----------------------------------| -| int32_t fd | 块设备的文件描述符 | -| void *buf | IO读数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
扩展型LBA要包含元数据内存大小。 | -| size_t nbytes | 单次读IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| off64_t offset | LBA的读偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |------------------------------------|----------------------------------| + | int32_t fd | 块设备的文件描述符 | + | void *buf | IO读数据的缓冲区(四字节对齐,不能跨4K页面边界)
说明
扩展型LBA要包含元数据内存大小。 | + | size_t nbytes | 单次读IO大小(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | + | off64_t offset | LBA的读偏移(单位:字节。sector_size的整数倍)
说明
仅包含数据大小,扩展型LBA也不含元数据大小。 | -| **返回值** | **描述** | -|-------------|-----------------------| -| 0 | IO读请求提交成功 | -| 非0 | IO读请求提交失败 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|-----------------------| + | 0 | IO读请求提交成功 | + | 非0 | IO读请求提交失败 | ##### libstorage_open -1. 接口原型 -``` -int32_t libstorage_open(const char* devfullname); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_open(const char* devfullname); + ``` -打开块设备。 +2. 接口描述 -3. 参数 + 打开块设备。 -| **参数成员** | **描述** | -|--------------------------|---------------------------------| -| const char* devfullname | 块设备名称(格式为nvme0n1) | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |--------------------------|---------------------------------| + | const char* devfullname | 块设备名称(格式为nvme0n1) | -| **返回值** | **描述** | -|-------------|-------------------------------------------------------------------| -| -1 | 打开失败(如设备名不对,或打开的fd数目>NVME盘的可使用通道数目) | -| 大于0 | 块设备的文件描述符 | +4. 返回值 -开启nvme.conf.in中的MultiQ开关以后,同一个线程多次打开同一个设备,会返回不同的fd;否则仍返回同一个fd。该特性只针对NVME设备。 + | **返回值** | **描述** | + |-------------|-------------------------------------------------------------------| + | -1 | 打开失败(如设备名不对,或打开的fd数目>NVME盘的可使用通道数目) | + | 大于0 | 块设备的文件描述符 | + + 开启nvme.conf.in中的MultiQ开关以后,同一个线程多次打开同一个设备,会返回不同的fd;否则仍返回同一个fd。该特性只针对NVME设备。 ##### libstorage_close -1. 接口原型 -``` -int32_t libstorage_close(int32_t fd); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_close(int32_t fd); + ``` -关闭块设备。 +2. 接口描述 -3. 参数 + 关闭块设备。 -| **参数成员** | **描述** | -|--------------|---------------------------| -| int32_t fd |已打开的块设备的文件描述符 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |--------------|---------------------------| + | int32_t fd |已打开的块设备的文件描述符 | -| **返回值**| **描述** | -|------------|--------------------------------| -| -1 | 无效文件描述符 | -| -16 | 文件描述符正忙,需要重试 | -| 0 | 关闭成功 | +4. 返回值 + + | **返回值**| **描述** | + |------------|--------------------------------| + | -1 | 无效文件描述符 | + | -16 | 文件描述符正忙,需要重试 | + | 0 | 关闭成功 | ##### libstorage_mem_reserve -1. 接口原型 -``` -void* libstorage_mem_reserve(size_t size, size_t align); -``` -2. 接口描述 +1. 接口原型 + + ```bash + void* libstorage_mem_reserve(size_t size, size_t align); + ``` + +2. 接口描述 -从DPDK预留的大页内存中分配内存空间。 + 从DPDK预留的大页内存中分配内存空间。 -3. 参数 +3. 参数 -| **参数成员**| **描述** | -|---------------|-------------------------------| -| size_t size | 需要分配的内存的大小 | -| size_t align | 所分配的内存空间按照align对齐 | + | **参数成员**| **描述** | + |---------------|-------------------------------| + | size_t size | 需要分配的内存的大小 | + | size_t align | 所分配的内存空间按照align对齐 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|---------------------------| -| NULL | 分配失败 | -| 非NULL | 所分配内存空间的地址 | + | **返回值** | **描述** | + |-------------|---------------------------| + | NULL | 分配失败 | + | 非NULL | 所分配内存空间的地址 | ##### libstorage_mem_free -1. 接口原型 -``` -void libstorage_mem_free(void* ptr); -``` -2. 接口描述 +1. 接口原型 + + ```bash + void libstorage_mem_free(void* ptr); + ``` + +2. 接口描述 -释放ptr指向的内存空间。 + 释放ptr指向的内存空间。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|---------------|--------------------------| -| void* ptr |所要释放的内存空间的地址 | + | **参数成员** | **描述** | + |---------------|--------------------------| + | void* ptr |所要释放的内存空间的地址 | -4. 返回值 +4. 返回值 -无。 + 无。 ##### libstorage_alloc_io_buf -1. 接口原型 -``` -void* libstorage_alloc_io_buf(size_t nbytes); -``` -2. 接口描述 +1. 接口原型 -从SPDK的buf_small_pool或者buf_large_pool中分配内存。 + ```bash + void* libstorage_alloc_io_buf(size_t nbytes); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|----------------|-----------------------------| -| size_t nbytes | 所需要分配的缓冲区大小 | + 从SPDK的buf_small_pool或者buf_large_pool中分配内存。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------|--------------------------| -| 非NULL | 所分配的缓冲区的首地址 | + | **参数成员** | **描述** | + |----------------|-----------------------------| + | size_t nbytes | 所需要分配的缓冲区大小 | + +4. 返回值 + + | **返回值** | **描述** | + |-------------|--------------------------| + | 非NULL | 所分配的缓冲区的首地址 | ##### libstorage_free_io_buf -1. 接口原型 -``` -int32_t libstorage_free_io_buf(void *buf, size_t nbytes); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_free_io_buf(void *buf, size_t nbytes); + ``` + +2. 接口描述 -释放所分配的内存到SPDK的buf_small_pool或者buf_large_pool中。 + 释放所分配的内存到SPDK的buf_small_pool或者buf_large_pool中。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|----------------|------------------------------| -| void *buf | 所要释放的缓冲区的首地址 | -| size_t nbytes | 所要释放的缓冲区的大小 | + | **参数成员** | **描述** | + |----------------|------------------------------| + | void *buf | 所要释放的缓冲区的首地址 | + | size_t nbytes | 所要释放的缓冲区的大小 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|--------------| -| -1 | 释放失败 | -| 0 | 释放成功 | + | **返回值** | **描述** | + |-------------|--------------| + | -1 | 释放失败 | + | 0 | 释放成功 | ##### libstorage_init_module -1. 接口原型 -``` -int32_t libstorage_init_module(const char* cfgfile); -``` -2. 接口描述 +1. 接口原型 -HSAK模块初始化接口。 + ```bash + int32_t libstorage_init_module(const char* cfgfile); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|----------------------|---------------------| -| const char* cfgfile | HSAK 配置文件名称 | + HSAK模块初始化接口。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------|---------------| -| 非0 | 初始化失败 | -| 0 | 初始化成功 | + | **参数成员** | **描述** | + |----------------------|---------------------| + | const char* cfgfile | HSAK 配置文件名称 | + +4. 返回值 + + | **返回值** | **描述** | + |-------------|---------------| + | 非0 | 初始化失败 | + | 0 | 初始化成功 | ##### libstorage_exit_module -1. 接口原型 -``` -int32_t libstorage_exit_module(void); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t libstorage_exit_module(void); + ``` + +2. 接口描述 -HSAK模块退出接口。 + HSAK模块退出接口。 -3. 参数 +3. 参数 -无。 + 无。 -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|---------------| -| 非0 | 退出清理失败 | -| 0 | 退出清理成功 | + | **返回值** | **描述** | + |-------------|---------------| + | 非0 | 退出清理失败 | + | 0 | 退出清理成功 | ##### LIBSTORAGE_REGISTER_DPDK_INIT_NOTIFY -1. 接口原型 -``` -LIBSTORAGE_REGISTER_DPDK_INIT_NOTIFY(_name, _notify) -``` -2. 接口描述 +1. 接口原型 -业务层注册函数,用于注册DPDK初始化完成时的回调函数。 + ```bash + LIBSTORAGE_REGISTER_DPDK_INIT_NOTIFY(_name, _notify) + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|----------------|---------------------------------------------------------------------------------------------------| -| _name |业务层模块名称。 | -| _notify |业务层注册的回调函数原型:void (*notifyFunc)(const struct libstorage_dpdk_init_notify_arg *arg); | + 业务层注册函数,用于注册DPDK初始化完成时的回调函数。 -4. 返回值 +3. 参数 -无 + | **参数成员** | **描述** | + |----------------|---------------------------------------------------------------------------------------------------| + | _name |业务层模块名称。 | + | _notify |业务层注册的回调函数原型:void (*notifyFunc)(const struct libstorage_dpdk_init_notify_arg *arg); | + +4. 返回值 + + 无 #### ublock.h ##### init_ublock -1. 接口原型 -``` -int init_ublock(const char *name, enum ublock_rpc_server_status flg); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int init_ublock(const char *name, enum ublock_rpc_server_status flg); + ``` + +2. 接口描述 -初始化Ublock功能模块,本接口必须在其他所有Ublock接口之前被调用。如果flag被置为UBLOCK_RPC_SERVER_ENABLE,即ublock作为rpc server,则同一个进程只能初始化一次。 + 初始化Ublock功能模块,本接口必须在其他所有Ublock接口之前被调用。如果flag被置为UBLOCK_RPC_SERVER_ENABLE,即ublock作为rpc server,则同一个进程只能初始化一次。 -在ublock作为rpc server启动时,会同时启动一个server的monitor线程。monitor线程监控到rpc server线程出现异常(如卡死时),会主动调用exit触发进程退出。 + 在ublock作为rpc server启动时,会同时启动一个server的monitor线程。monitor线程监控到rpc server线程出现异常(如卡死时),会主动调用exit触发进程退出。 -此时依赖于产品的脚本再次拉起相关进程。 + 此时依赖于产品的脚本再次拉起相关进程。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|----------------------------------|---------------------------------| -| const char *name | 模块名字,缺省值为"ublock",建议该参数可以传NULL。 | -| enum ublock_rpc_server_status
flg | 是否启用RPC的标记值:UBLOCK_RPC_SERVER_
DISABLE或UBLOCK_RPC_SERVER_ENAB
LE;
在不启用RPC情况下,如果硬盘被业务进程占用,那么Ublock模块
将无法获取该硬盘信息。 | + | **参数成员** | **描述** | + |----------------------------------|---------------------------------| + | const char *name | 模块名字,缺省值为"ublock",建议该参数可以传NULL。 | + | enum ublock_rpc_server_status
flg | 是否启用RPC的标记值:UBLOCK_RPC_SERVER_
DISABLE或UBLOCK_RPC_SERVER_ENAB
LE;
在不启用RPC情况下,如果硬盘被业务进程占用,那么Ublock模块
将无法获取该硬盘信息。 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|----------------------------------|---------------------------------| -| 0 | 初始化成功。 | -| -1 | 初始化失败,可能原因:Ublock模块已经被初始化。 | -| 进程exit | Ublock认为在两种情况下属于无法修复异常,直接调用exit接口
退出进程:
- 需要创建RPC服务,但RPC服务现场创建失败。
- 创建热插拔监控线程,但失败。 | + | **返回值** | **描述** | + |----------------------------------|---------------------------------| + | 0 | 初始化成功。 | + | -1 | 初始化失败,可能原因:Ublock模块已经被初始化。 | + | 进程exit | Ublock认为在两种情况下属于无法修复异常,直接调用exit接口
退出进程:
- 需要创建RPC服务,但RPC服务现场创建失败。
- 创建热插拔监控线程,但失败。 | ##### ublock_init -1. 接口原型 -``` -#define ublock_init(name) init_ublock(name, UBLOCK_RPC_SERVER_ENABLE) -``` -2. 接口描述 +1. 接口原型 -本身是对init_ublock接口的宏定义,可理解为将Ublock初始化为需要RPC服务。 + ```bash + #define ublock_init(name) init_ublock(name, UBLOCK_RPC_SERVER_ENABLE) + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|---------------|----------------------------------------------------| -| name | 模块名字,缺省值为"ublock",建议该参数可以传NULL。 | + 本身是对init_ublock接口的宏定义,可理解为将Ublock初始化为需要RPC服务。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|---------------|----------------------------------------------------| -| 0 | 初始化成功。 | -| -1 | 初始化失败,可能原因:Ublock rpc
server模块已经被初始化。 | -| 进程exit | Ublock认为在两种情况下属于无法修复异常,直接调用exit接口
退出进程:
- 需要创建RPC服务,但RPC服务现场创建失败。
- 创建热插拔监控线程,但失败。 | + | **参数成员** | **描述** | + |---------------|----------------------------------------------------| + | name | 模块名字,缺省值为"ublock",建议该参数可以传NULL。 | + +4. 返回值 + + | **返回值** | **描述** | + |---------------|----------------------------------------------------| + | 0 | 初始化成功。 | + | -1 | 初始化失败,可能原因:Ublock rpc
server模块已经被初始化。 | + | 进程exit | Ublock认为在两种情况下属于无法修复异常,直接调用exit接口
退出进程:
- 需要创建RPC服务,但RPC服务现场创建失败。
- 创建热插拔监控线程,但失败。 | ##### ublock_init_norpc -1. 接口原型 -``` -#define ublock_init_norpc(name) init_ublock(name, UBLOCK_RPC_SERVER_DISABLE) -``` -2. 接口描述 +1. 接口原型 + + ```bash + #define ublock_init_norpc(name) init_ublock(name, UBLOCK_RPC_SERVER_DISABLE) + ``` -本身是对init_ublock接口的宏定义,可理解为将Ublock初始化为无RPC服务。 +2. 接口描述 -3. 参数 + 本身是对init_ublock接口的宏定义,可理解为将Ublock初始化为无RPC服务。 -| **参数成员** | **描述** | -|---------------|------------------------------------------------------| -| name | 模块名字,缺省值为"ublock",建议该参数可以传NULL。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |---------------|------------------------------------------------------| + | name | 模块名字,缺省值为"ublock",建议该参数可以传NULL。 | -| **返回值** | **描述** | -|---------------------------------|-----------------------------| -| 0 | 初始化成功。 | -| -1 | 初始化失败,可能原因:Ublock
client模块已经被初始化。 | -| 进程exit | Ublock认为在两种情况下属于无法修复异常,直接调用exit接口
退出进程:
- 需要创建RPC服务,但RPC服务现场创建失败。
- 创建热插拔监控线程,但失败。 | +4. 返回值 + + | **返回值** | **描述** | + |---------------------------------|-----------------------------| + | 0 | 初始化成功。 | + | -1 | 初始化失败,可能原因:Ublock
client模块已经被初始化。 | + | 进程exit | Ublock认为在两种情况下属于无法修复异常,直接调用exit接口
退出进程:
- 需要创建RPC服务,但RPC服务现场创建失败。
- 创建热插拔监控线程,但失败。 | ##### ublock_fini -1. 接口原型 -``` -void ublock_fini(void); -``` -2. 接口描述 +1. 接口原型 + + ```bash + void ublock_fini(void); + ``` -销毁Ublock功能模块,本接口将销毁Ublock模块以及内部创建的资源,本接口同Ublock初始化接口需要配对使用。 +2. 接口描述 -3. 参数 + 销毁Ublock功能模块,本接口将销毁Ublock模块以及内部创建的资源,本接口同Ublock初始化接口需要配对使用。 -无。 +3. 参数 -4. 返回值 + 无。 -无。 +4. 返回值 + + 无。 ##### ublock_get_bdevs -1. 接口原型 -``` -int ublock_get_bdevs(struct ublock_bdev_mgr* bdev_list); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int ublock_get_bdevs(struct ublock_bdev_mgr* bdev_list); + ``` -业务进程通过调用本接口获取设备列表(环境上所有的NVME设备,包括内核态驱动和用户态驱动),获取的NVMe设备列表中只有PCI地址,不包含具体设备信息,需要获取具体设备信息,请调用接口ublock_get_bdev。 +2. 接口描述 -3. 参数 + 业务进程通过调用本接口获取设备列表(环境上所有的NVME设备,包括内核态驱动和用户态驱动),获取的NVMe设备列表中只有PCI地址,不包含具体设备信息,需要获取具体设备信息,请调用接口ublock_get_bdev。 -| **参数成员** | **描述** | -|-------------------------------------|------------------------------------------------------| -| struct ublock_bdev_mgr* bdev_list |出参,返回设备队列,bdev_list指针需要在外部分配。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |-------------------------------------|------------------------------------------------------| + | struct ublock_bdev_mgr* bdev_list |出参,返回设备队列,bdev_list指针需要在外部分配。 | -| **返回值** | **描述** | -|-------------|-----------------------| -| 0 | 获取设备队列成功。 | -| -2 | 环境中没有NVMe设备。 | -| 其余值 | 获取设备队列失败。 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|-----------------------| + | 0 | 获取设备队列成功。 | + | -2 | 环境中没有NVMe设备。 | + | 其余值 | 获取设备队列失败。 | ##### ublock_free_bdevs -1. 接口原型 -``` -void ublock_free_bdevs(struct ublock_bdev_mgr* bdev_list); -``` -2. 接口描述 +1. 接口原型 + + ```bash + void ublock_free_bdevs(struct ublock_bdev_mgr* bdev_list); + ``` -业务进程通过调用本接口释放设备列表。 +2. 接口描述 -3. 参数 + 业务进程通过调用本接口释放设备列表。 -| **参数成员** | **描述** | -|-------------------------------------|--------------------------------------------------------------| -| struct ublock_bdev_mgr* bdev_list |设备队列头指针,设备队列清空后,bdev_list指针本身不会被释放。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |-------------------------------------|--------------------------------------------------------------| + | struct ublock_bdev_mgr* bdev_list |设备队列头指针,设备队列清空后,bdev_list指针本身不会被释放。 | -无。 +4. 返回值 + + 无。 ##### ublock_get_bdev -1. 接口原型 -``` -int ublock_get_bdev(const char *pci, struct ublock_bdev *bdev); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int ublock_get_bdev(const char *pci, struct ublock_bdev *bdev); + ``` -业务进程通过调用本接口获取具体某个设备的信息,设备信息中:NVMe设备的序列号、型号、fw版本号信息以字符数组形式保存,不是字符串形式(不同硬盘控制器返回形式不同,不保证数组结尾必定含有"0")。 +2. 接口描述 -本接口调用后,对应设备会被Ublock占用,请务必在完成相应业务操作后立即调用ublock_free_bdev释放资源。 + 业务进程通过调用本接口获取具体某个设备的信息,设备信息中:NVMe设备的序列号、型号、fw版本号信息以字符数组形式保存,不是字符串形式(不同硬盘控制器返回形式不同,不保证数组结尾必定含有"0")。 -3. 参数 + 本接口调用后,对应设备会被Ublock占用,请务必在完成相应业务操作后立即调用ublock_free_bdev释放资源。 -| **参数成员** | **描述** | -|---------------------------|--------------------------------------------------| -| const char *pci | 需要获取信息的设备PCI地址 | -| struct ublock_bdev *bdev | 出参,返回设备信息,bdev指针需要在外部分配。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |---------------------------|--------------------------------------------------| + | const char *pci | 需要获取信息的设备PCI地址 | + | struct ublock_bdev *bdev | 出参,返回设备信息,bdev指针需要在外部分配。 | -| **返回值** | **描述** | -|-------------|------------------------------------------------------------| -| 0 | 获取设备信息成功。 | -| -1 | 获取设备信息失败,如参数错误等。 | -| -11(EAGAIN) | 获取设备信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|------------------------------------------------------------| + | 0 | 获取设备信息成功。 | + | -1 | 获取设备信息失败,如参数错误等。 | + | -11(EAGAIN) | 获取设备信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | ##### ublock_get_bdev_by_esn -1. 接口原型 -``` -int ublock_get_bdev_by_esn(const char *esn, struct ublock_bdev *bdev); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int ublock_get_bdev_by_esn(const char *esn, struct ublock_bdev *bdev); + ``` -业务进程通过调用本接口,根据给定的ESN号获取对应设备的信息,设备信息中:NVMe设备的序列号、型号、fw版本号信息以字符数组形式保存,不是字符串形式(不同硬盘控制器返回形式不同,不保证数组结尾必定含有"0")。 +2. 接口描述 -本接口调用后,对应设备会被Ublock占用,请务必在完成相应业务操作后立即调用ublock_free_bdev释放资源。 + 业务进程通过调用本接口,根据给定的ESN号获取对应设备的信息,设备信息中:NVMe设备的序列号、型号、fw版本号信息以字符数组形式保存,不是字符串形式(不同硬盘控制器返回形式不同,不保证数组结尾必定含有"0")。 -3. 参数 + 本接口调用后,对应设备会被Ublock占用,请务必在完成相应业务操作后立即调用ublock_free_bdev释放资源。 -| **参数成员** | **描述** | -|---------------------------|--------------------------------------------------| -| const char *esn | 需要获取信息的设备ESN号。
说明
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | -| struct ublock_bdev *bdev | 出参,返回设备信息,bdev指针需要在外部分配。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |---------------------------|--------------------------------------------------| + | const char *esn | 需要获取信息的设备ESN号。
说明
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | + | struct ublock_bdev *bdev | 出参,返回设备信息,bdev指针需要在外部分配。 | -| **返回值** | **描述** | -|-------------|--------------------------------------------------------------| -| 0 | 获取设备信息成功。 | -| -1 | 获取设备信息失败,如参数错误等 | -| -11(EAGAIN)| 获取设备信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | +4. 返回值 + + | **返回值** | **描述** | + |-------------|--------------------------------------------------------------| + | 0 | 获取设备信息成功。 | + | -1 | 获取设备信息失败,如参数错误等 | + | -11(EAGAIN)| 获取设备信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | ##### ublock_free_bdev -1. 接口原型 -``` -void ublock_free_bdev(struct ublock_bdev *bdev); -``` -2. 接口描述 +1. 接口原型 + + ```bash + void ublock_free_bdev(struct ublock_bdev *bdev); + ``` -业务进程通过调用本接口释放设备资源。 +2. 接口描述 -3. 参数 + 业务进程通过调用本接口释放设备资源。 -| **参数成员** | **描述** | -|----------------------------|-------------------------------------------------------------| -| struct ublock_bdev *bdev | 设备信息指针,该指针内数据清空后,bdev指针本身不会被释放。 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |----------------------------|-------------------------------------------------------------| + | struct ublock_bdev *bdev | 设备信息指针,该指针内数据清空后,bdev指针本身不会被释放。 | -无。 +4. 返回值 + + 无。 ##### TAILQ_FOREACH_SAFE -1. 接口原型 -``` -#define TAILQ_FOREACH_SAFE(var, head, field, tvar) -for ((var) = TAILQ_FIRST((head)); -(var) && ((tvar) = TAILQ_NEXT((var), field), 1); -(var) = (tvar)) -``` -2. 接口描述 +1. 接口原型 + + ```bash + #define TAILQ_FOREACH_SAFE(var, head, field, tvar) + for ((var) = TAILQ_FIRST((head)); + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); + (var) = (tvar)) + ``` -提供安全访问队列每个成员的宏定义。 +2. 接口描述 -3. 参数 + 提供安全访问队列每个成员的宏定义。 -| **参数成员** | **描述** | -|---------------|----------------------------------------------------------------------------------------------------| -| var | 当前操作的队列节点成员 | -| head | 队列头指针,一般情况下是指通过TAILQ_HEAD(xx, xx) obj定义的obj的地址 | -| field | 队列节点中用于保存队列前后指针的结构体名字,一般情况下是指通过TAILQ_ENTRY(xx)name定义的名字name | -| tvar | 下一个队列节点成员 | +3. 参数 -4. 返回值 + | **参数成员** | **描述** | + |---------------|----------------------------------------------------------------------------------------------------| + | var | 当前操作的队列节点成员 | + | head | 队列头指针,一般情况下是指通过TAILQ_HEAD(xx, xx) obj定义的obj的地址 | + | field | 队列节点中用于保存队列前后指针的结构体名字,一般情况下是指通过TAILQ_ENTRY(xx)name定义的名字name | + | tvar | 下一个队列节点成员 | -无。 +4. 返回值 + + 无。 ##### ublock_get_SMART_info -1. 接口原型 -``` -int ublock_get_SMART_info(const char *pci, uint32_t nsid, struct ublock_SMART_info *smart_info); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int ublock_get_SMART_info(const char *pci, uint32_t nsid, struct ublock_SMART_info *smart_info); + ``` + +2. 接口描述 -业务进程通过调用本接口获取指定设备的SMART信息。 + 业务进程通过调用本接口获取指定设备的SMART信息。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|---------------------------------------|----------------------------| -| const char *pci | 设备PCI地址 | -| uint32_t nsid | 指定的namespace | -| struct ublock_SMART_info *smart_info | 出参,返回设备SMART信息 | + | **参数成员** | **描述** | + |---------------------------------------|----------------------------| + | const char *pci | 设备PCI地址 | + | uint32_t nsid | 指定的namespace | + | struct ublock_SMART_info *smart_info | 出参,返回设备SMART信息 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|---------------------------------------------------------------| -| 0 | 获取SMART信息成功。 | -| -1 | 获取SMART信息失败,如参数错误等。 | -| -11(EAGAIN)| 获取SMART信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | + | **返回值** | **描述** | + |-------------|---------------------------------------------------------------| + | 0 | 获取SMART信息成功。 | + | -1 | 获取SMART信息失败,如参数错误等。 | + | -11(EAGAIN)| 获取SMART信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | ##### ublock_get_SMART_info_by_esn -1. 接口原型 -``` -int ublock_get_SMART_info_by_esn(const char *esn, uint32_t nsid, struct ublock_SMART_info *smart_info); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int ublock_get_SMART_info_by_esn(const char *esn, uint32_t nsid, struct ublock_SMART_info *smart_info); + ``` + +2. 接口描述 -业务进程通过调用本接口获取ESN号对应设备的SMART信息。 + 业务进程通过调用本接口获取ESN号对应设备的SMART信息。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|--------------------------|-----------------------------------------------| -| const char *esn | 设备ESN号
说明
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | -| uint32_t nsid | 指定的namespace | -| struct ublock_SMART_info
*smart_info | 出参,返回设备SMART信息 | + | **参数成员** | **描述** | + |--------------------------|-----------------------------------------------| + | const char *esn | 设备ESN号
说明
ESN号是最大有效长度为20的字符串(不包括字符串结束符),但该长
度根据不同硬件厂商可能存在差异,如不足20字符,需要在字符串末尾加
空格补齐。 | + | uint32_t nsid | 指定的namespace | + | struct ublock_SMART_info
*smart_info | 出参,返回设备SMART信息 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|--------------------------------------------------------------| -| 0 | 获取SMART信息成功。 | -| -1 | 获取SMART信息失败,如参数错误等。 | -| -11(EAGAIN) | 获取SMART信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | + | **返回值** | **描述** | + |-------------|--------------------------------------------------------------| + | 0 | 获取SMART信息成功。 | + | -1 | 获取SMART信息失败,如参数错误等。 | + | -11(EAGAIN) | 获取SMART信息失败,如rpc查询失败,需要重试(建议sleep 3s)。 | ##### ublock_get_error_log_info -1. 接口原型 -``` -int ublock_get_error_log_info(const char *pci, uint32_t err_entries, struct ublock_nvme_error_info *errlog_info); -``` -2. 接口描述 +1. 接口原型 -业务进程通过调用本接口获取指定设备的Error log信息。 + ```bash + int ublock_get_error_log_info(const char *pci, uint32_t err_entries, struct ublock_nvme_error_info *errlog_info); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|---------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| -| const char *pci | 设备PCI地址 | -| uint32_t err_entries | 指定希望获取的Error Log条数,最多256条 | -| struct ublock_nvme_error_info *errlog_info | 出参,返回设备Error log信息,errlog_info指针需要调用者申请空间,且确保申请的空间大于或等于err_entries * sizeof (struct ublock_nvme_error_info) | + 业务进程通过调用本接口获取指定设备的Error log信息。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------------------------------|--------------------------------------------------------------| -| 获取到的Error log条数,大于或等于0 | 获取Error log成功。 | -| -1 | 获取Error log失败,如参数错误等。 | -| -11(EAGAIN) | 获取Error log失败,如rpc查询失败,需要重试(建议sleep 3s)。 | + | **参数成员** | **描述** | + |---------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| + | const char *pci | 设备PCI地址 | + | uint32_t err_entries | 指定希望获取的Error Log条数,最多256条 | + | struct ublock_nvme_error_info *errlog_info | 出参,返回设备Error log信息,errlog_info指针需要调用者申请空间,且确保申请的空间大于或等于err_entries * sizeof (struct ublock_nvme_error_info) | + +4. 返回值 + + | **返回值** | **描述** | + |-------------------------------------|--------------------------------------------------------------| + | 获取到的Error log条数,大于或等于0 | 获取Error log成功。 | + | -1 | 获取Error log失败,如参数错误等。 | + | -11(EAGAIN) | 获取Error log失败,如rpc查询失败,需要重试(建议sleep 3s)。 | ##### ublock_get_log_page -1. 接口原型 -``` -int ublock_get_log_page(const char *pci, uint8_t log_page, uint32_t nsid, void *payload, uint32_t payload_size); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int ublock_get_log_page(const char *pci, uint8_t log_page, uint32_t nsid, void *payload, uint32_t payload_size); + ``` + +2. 接口描述 -业务进程通过调用本接口获取指定设备,指定log page的信息。 + 业务进程通过调用本接口获取指定设备,指定log page的信息。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|------------------------|-------------------------------------------------------------------------------------------------------------------------| -| const char *pci | 设备PCI地址 | -| uint8_t log_page | 指定希望获取的log page ID,比如0xC0, 0xCA代表ES3000 V5盘自定义的SMART信息 | -| uint32_t nsid | 指定namespace ID,各个log page对按namespace获取支持情况不一致,如果不支持按namespace获取,调用者需要显示传0xFFFFFFFF | -| void *payload | 出参,存储log page信息,由调用者负责申请内存 | -| uint32_t payload_size | 申请的payload大小,不大于4096 Bytes | + | **参数成员** | **描述** | + |------------------------|-------------------------------------------------------------------------------------------------------------------------| + | const char *pci | 设备PCI地址 | + | uint8_t log_page | 指定希望获取的log page ID,比如0xC0, 0xCA代表ES3000 V5盘自定义的SMART信息 | + | uint32_t nsid | 指定namespace ID,各个log page对按namespace获取支持情况不一致,如果不支持按namespace获取,调用者需要显示传0xFFFFFFFF | + | void *payload | 出参,存储log page信息,由调用者负责申请内存 | + | uint32_t payload_size | 申请的payload大小,不大于4096 Bytes | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|-------------|------------------------------------| -| 0 | 获取log page成功 | -| -1 | 获取Error log失败,如参数错误等 | + | **返回值** | **描述** | + |-------------|------------------------------------| + | 0 | 获取log page成功 | + | -1 | 获取Error log失败,如参数错误等 | ##### ublock_info_get_pci_addr -1. 接口原型 -``` -char *ublock_info_get_pci_addr(const void *info); -``` -2. 接口描述 +1. 接口原型 -业务进程的回调函数中,通过调用本接口获取热插拔设备的PCI地址。 + ```bash + char *ublock_info_get_pci_addr(const void *info); + ``` -info占用的内存以及返回的PCI地址占用得内存不需要业务进程进行释放。 +2. 接口描述 -3. 参数 + 业务进程的回调函数中,通过调用本接口获取热插拔设备的PCI地址。 -| **参数成员** | **描述** | -|-------------------|---------------------------------------------| -| const void *info | 热插拔监控线程传递给回调函数的热插拔事件信息 | + info占用的内存以及返回的PCI地址占用得内存不需要业务进程进行释放。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------|--------------------| -| NULL | 获取失败 | -| 非NULL | 获取的PCI地址 | + | **参数成员** | **描述** | + |-------------------|---------------------------------------------| + | const void *info | 热插拔监控线程传递给回调函数的热插拔事件信息 | + +4. 返回值 + + | **返回值** | **描述** | + |-------------|--------------------| + | NULL | 获取失败 | + | 非NULL | 获取的PCI地址 | ##### ublock_info_get_action -1. 接口原型 -``` -enum ublock_nvme_uevent_action ublock_info_get_action(const void *info); -``` -2. 接口描述 +1. 接口原型 + + ```bash + enum ublock_nvme_uevent_action ublock_info_get_action(const void *info); + ``` + +2. 接口描述 -业务进程的回调函数中,通过调用本接口获取热插拔事件的类型。 + 业务进程的回调函数中,通过调用本接口获取热插拔事件的类型。 -info占用的内存不需要业务进程进行释放。 + info占用的内存不需要业务进程进行释放。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|-------------------|------------------------------------------------| -| const void *info | 热插拔监控线程传递给回调函数的热插拔事件信息 | + | **参数成员** | **描述** | + |-------------------|------------------------------------------------| + | const void *info | 热插拔监控线程传递给回调函数的热插拔事件信息 | -4. 返回值 +4. 返回值 -| **返回值** | **描述** | -|----------------|------------------------------------------------------------------------------| -| 热插拔事件类型| 触发回调函数的事件类型,详见结构体enum ublock_nvme_uevent_action的定义。 | + | **返回值** | **描述** | + |----------------|------------------------------------------------------------------------------| + | 热插拔事件类型| 触发回调函数的事件类型,详见结构体enum ublock_nvme_uevent_action的定义。 | ##### ublock_get_ctrl_iostat -1. 接口原型 -``` -int ublock_get_ctrl_iostat(const char* pci, struct ublock_ctrl_iostat_info *ctrl_iostat); -``` -2. 接口描述 +1. 接口原型 -业务进程通过调用本接口获取控制器的IO统计信息。 + ```bash + int ublock_get_ctrl_iostat(const char* pci, struct ublock_ctrl_iostat_info *ctrl_iostat); + ``` -3. 参数 +2. 接口描述 -| **参数成员** | **描述** | -|-----------------------------------------------|----------------------------------------------------------| -| const char* pci | 需要获取IO统计信息的控制器的PCI地址。 | -| struct ublock_ctrl_iostat_info *ctrl_iostat |出参,返回IO统计信息,ctrl_iostat指针需要在外部分配。 | + 业务进程通过调用本接口获取控制器的IO统计信息。 -4. 返回值 +3. 参数 -| **返回值** | **描述** | -|-------------|-------------------------------------------------| -| 0 | 获取IO统计信息成功。 | -| -1 | 获取IO统计信息失败(无效参数、RPC error)。 | -| -2 | 获取IO统计信息失败(NVMe盘没有被IO进程接管)。 | -| -3 | 获取IO统计信息失败(IO统计开关未打开)。 | + | **参数成员** | **描述** | + |-----------------------------------------------|----------------------------------------------------------| + | const char* pci | 需要获取IO统计信息的控制器的PCI地址。 | + | struct ublock_ctrl_iostat_info *ctrl_iostat |出参,返回IO统计信息,ctrl_iostat指针需要在外部分配。 | + +4. 返回值 + + | **返回值** | **描述** | + |-------------|-------------------------------------------------| + | 0 | 获取IO统计信息成功。 | + | -1 | 获取IO统计信息失败(无效参数、RPC error)。 | + | -2 | 获取IO统计信息失败(NVMe盘没有被IO进程接管)。 | + | -3 | 获取IO统计信息失败(IO统计开关未打开)。 | ##### ublock_nvme_admin_passthru -1. 接口原型 -``` -int32_t ublock_nvme_admin_passthru(const char *pci, void *cmd, void *buf, size_t nbytes); -``` -2. 接口描述 +1. 接口原型 + + ```bash + int32_t ublock_nvme_admin_passthru(const char *pci, void *cmd, void *buf, size_t nbytes); + ``` + +2. 接口描述 -业务进程通过调用该接口透传nvme admin命令给nvme设备。当前仅支持获取identify字段的nvme admin命令。 + 业务进程通过调用该接口透传nvme admin命令给nvme设备。当前仅支持获取identify字段的nvme admin命令。 -3. 参数 +3. 参数 -| **参数成员** | **描述** | -|------------------|----------------------------------------------------------------------------------------------------| -| const char *pci | nvme admin命令目的控制器的PCI地址。 | -| void *cmd | nvme admin命令结构体指针,结构体大小为64字节,内容参考nvme spec。当前仅支持获取identify字段命令。 | -| void *buf | 保存nvme admin命令返回内容,其空间由用户分配,大小为nbytes。 | -| size_t nbytes | 用户buf的大小。identify字段为4096字节,获取identify命令的nbytes为4096。 | + | **参数成员** | **描述** | + |------------------|----------------------------------------------------------------------------------------------------| + | const char *pci | nvme admin命令目的控制器的PCI地址。 | + | void *cmd | nvme admin命令结构体指针,结构体大小为64字节,内容参考nvme spec。当前仅支持获取identify字段命令。 | + | void *buf | 保存nvme admin命令返回内容,其空间由用户分配,大小为nbytes。 | + | size_t nbytes | 用户buf的大小。identify字段为4096字节,获取identify命令的nbytes为4096。 | -4. 返回值 +4. 返回值 -| **返回值**| **描述** | -|------------|--------------------| -| 0 | 用户命令执行成功。 | -| -1 | 用户命令执行失败。 | + | **返回值**| **描述** | + |------------|--------------------| + | 0 | 用户命令执行成功。 | + | -1 | 用户命令执行失败。 | ## 附录 @@ -2333,7 +2479,7 @@ int32_t ublock_nvme_admin_passthru(const char *pci, void *cmd, void *buf, size_t | NVME_SC_RESERVATION_CONFLICT | 0x83 | | NVME_SC_FORMAT_IN_PROGRESS | 0x84 | -### COMMAND_SPECIFIC +### COMMAND_SPECIFIC 特定命令错误码参考 @@ -2376,7 +2522,7 @@ int32_t ublock_nvme_admin_passthru(const char *pci, void *cmd, void *buf, size_t | NVME_SC_INVALID_PROTECTION_INFO | 0x81 | | NVME_SC_ATTEMPTED_WRITE_TO_RO_PAGE | 0x82 | -### MEDIA_DATA_INTERGRITY_ERROR +### MEDIA_DATA_INTERGRITY_ERROR 介质异常错误码参考 diff --git a/docs/zh/server/performance/cpu_optimization/sysboost/getting_to_know_sysBoost.md b/docs/zh/server/performance/cpu_optimization/sysboost/getting_to_know_sysBoost.md index f00583f0758ece1b80b70c3ff64804004c65561c..81fff10694a7c12c96533d95d4b4ab98094acede 100644 --- a/docs/zh/server/performance/cpu_optimization/sysboost/getting_to_know_sysBoost.md +++ b/docs/zh/server/performance/cpu_optimization/sysboost/getting_to_know_sysBoost.md @@ -6,56 +6,56 @@ ## 问题背景 - - 大型APP应用,使用大量的第3方或自研动态库,函数调用产生大量PLT跳转导致IPC指令执行效率下降。 +- 大型APP应用,使用大量的第3方或自研动态库,函数调用产生大量PLT跳转导致IPC指令执行效率下降。 - - 汇编代码体积大内存占用大,导致iTLB miss概率高。热点代码段布局离散,导致iCache miss高,影响CPU流水线执行效率。 +- 汇编代码体积大内存占用大,导致iTLB miss概率高。热点代码段布局离散,导致iCache miss高,影响CPU流水线执行效率。 - - 应用开发者对操作系统与CPU微架构不熟悉,IPC性能调优成本过大。 +- 应用开发者对操作系统与CPU微架构不熟悉,IPC性能调优成本过大。 ## 设计方案 ### 关键技术 - - 动态库拼接:通过ld加载阶段将分散的动态库的代码段数据段拼接聚合,然后使用大页内存提升iTLB命中率。 - - 消除PLT跳转:应用代码调用动态库函数的流程,需要先跳转PLT表,然后跳转真实函数,消除PLT跳转能提升IPC。 +- 动态库拼接:通过ld加载阶段将分散的动态库的代码段数据段拼接聚合,然后使用大页内存提升iTLB命中率。 - - 热点Section在线重排:默认情况下代码段是按动态库粒度排布的,通过在线重排技术可以实现热点代码按Section粒度重排。 +- 消除PLT跳转:应用代码调用动态库函数的流程,需要先跳转PLT表,然后跳转真实函数,消除PLT跳转能提升IPC。 - - exec原生大页:用户态大页机制需要应用修改配置和重编译,exec原生大页机制直接在内核加载ELF文件阶段使用大页内存,对APP透明。 +- 热点Section在线重排:默认情况下代码段是按动态库粒度排布的,通过在线重排技术可以实现热点代码按Section粒度重排。 + +- exec原生大页:用户态大页机制需要应用修改配置和重编译,exec原生大页机制直接在内核加载ELF文件阶段使用大页内存,对APP透明。 + +### 架构 - ### 架构 - **图 1** sysBoost设计总体方案 ![](./figures/架构.png) - ## sysBoost支持的功能特性 - - 支持全静态合并场景:将应用与其依赖的动态库合并为一个二进制,并进行段级别的重排,将多个离散的代码段/数据段合并为一个,提升应用性能。 - - 自动对系统中的二进制进行优化:sysBoost守护进程读取配置文件获取需要优化的二进制以及对应的优化方式,按照用户的要求进行优化,并将优化好的二进制存储在.rto后缀的文件中。 +- 支持全静态合并场景:将应用与其依赖的动态库合并为一个二进制,并进行段级别的重排,将多个离散的代码段/数据段合并为一个,提升应用性能。 - - 二进制代码段/数据段大页预加载:用户态页表映射物理内存时,使用大页(2M)映射可以提升性能,而当前openeuler不支持文件页的大页映射。sysBoost提供大页预加载的功能,在二进制优化完成后立即将其内容以大页形式加载到内核中,在应用启动时将预加载的内容批量映射到用户态页表,减少应用的缺页中断和访存延迟,提升启动速度和运行效率。 +- 自动对系统中的二进制进行优化:sysBoost守护进程读取配置文件获取需要优化的二进制以及对应的优化方式,按照用户的要求进行优化,并将优化好的二进制存储在.rto后缀的文件中。 - - 二进制异常监控:如果sysBoost生成的.rto二进制出现BUG,应用可能会crash。为了避免应用被反复拉起,反复crash等严重后果,防止故障扩散,sysBoost会对加载.rto二进制的进程进行监控。如果发现这样的进程发生了crash,sysBoost会回退优化,将该.rto文件和原应用文件的标记删除;同时也会将配置文件重命名,防止下次sysBoost服务重启后再次进行优化。 +- 二进制代码段/数据段大页预加载:用户态页表映射物理内存时,使用大页(2M)映射可以提升性能,而当前openeuler不支持文件页的大页映射。sysBoost提供大页预加载的功能,在二进制优化完成后立即将其内容以大页形式加载到内核中,在应用启动时将预加载的内容批量映射到用户态页表,减少应用的缺页中断和访存延迟,提升启动速度和运行效率。 + +- 二进制异常监控:如果sysBoost生成的.rto二进制出现BUG,应用可能会crash。为了避免应用被反复拉起,反复crash等严重后果,防止故障扩散,sysBoost会对加载.rto二进制的进程进行监控。如果发现这样的进程发生了crash,sysBoost会回退优化,将该.rto文件和原应用文件的标记删除;同时也会将配置文件重命名,防止下次sysBoost服务重启后再次进行优化。 ## 价值概述 ### 场景一 + 在UnixBench的Bash测试中,通常会执行一些常见的命令和脚本,例如 ls、grep、awk 等。这些命令和脚本通常会调用一些系统库,例如 libc、libpthread 等,这些库文件通常需要动态链接。由于动态链接会增加程序的启动时间和延迟,因此采用二进制合并技术将这些库文件合并到可执行文件中,可以显著提高Bash的性能,从而提高UnixBench的得分。 ### 场景二 -云核等产品组件动态可装配设计, 使用大量动态库,带来了以下问题: - - 动态库机制引入函数间接跳转和代码布局离散问题, 导致CPU执行效率降低。 - - 动态库大量的符号解析过程, 影响程序启动速度。 - - 基于特定业务模型的预先离线编译优化(Profile-Guided Optimization), 无法适应不同业务模型变化。 - -在业务进程现网部署阶段, 通过sysBoost生成大进程可有效解决上述问题: - - 通过自研exec大页机制加载大进程, 使代码段和数据段利用大页内存, 降低TLB miss。 - - 大进程包含所有动态库代码和应用代码,消除函数间接跳转问题。 - - 智能识别业务, 选择合适的热点模型, 重新生成大进程,在线适应业务变化。 - +云核等产品组件动态可装配设计, 使用大量动态库,带来了以下问题: +- 动态库机制引入函数间接跳转和代码布局离散问题, 导致CPU执行效率降低。 +- 动态库大量的符号解析过程, 影响程序启动速度。 +- 基于特定业务模型的预先离线编译优化(Profile-Guided Optimization), 无法适应不同业务模型变化。 +在业务进程现网部署阶段, 通过sysBoost生成大进程可有效解决上述问题: +- 通过自研exec大页机制加载大进程, 使代码段和数据段利用大页内存, 降低TLB miss。 +- 大进程包含所有动态库代码和应用代码,消除函数间接跳转问题。 +- 智能识别业务, 选择合适的热点模型, 重新生成大进程,在线适应业务变化。 diff --git a/docs/zh/server/performance/cpu_optimization/sysboost/installation_and_deployment.md b/docs/zh/server/performance/cpu_optimization/sysboost/installation_and_deployment.md index e50a7b228588afd1eef5ad811f5d84e2405e1190..2f406aec9e1978c13832838812260944441fa753 100644 --- a/docs/zh/server/performance/cpu_optimization/sysboost/installation_and_deployment.md +++ b/docs/zh/server/performance/cpu_optimization/sysboost/installation_and_deployment.md @@ -2,28 +2,28 @@ ## 软硬件要求 - - 硬件:鲲鹏920处理器 +- 硬件:鲲鹏920处理器 - - 软件:操作系统openEuler 23.09 +- 软件:操作系统openEuler 23.09 ## 环境准备 -- 安装openEuler系统。 +- 安装openEuler系统。 -- 安装sysBoost需要使用root权限。 +- 安装sysBoost需要使用root权限。 ## 安装sysBoost 安装sysBoost的操作步骤如下(xxx在以下描述中代表版本号): -1. 挂载openEuler的iso文件 +1. 挂载openEuler的iso文件 ``` # 使用对应的openEuler版本 mount openEuler-xxx-aarch64-dvd.iso /mnt ``` -2. 配置本地yum源 +2. 配置本地yum源 ``` vim /etc/yum.repos.d/local.repo @@ -41,6 +41,7 @@ ``` 3. 安装sysBoost + ``` yum install sysboost -y ``` @@ -53,12 +54,13 @@ rpm -qa | grep native-turbo # native-turbo-xxx ``` - + 5. 安装需要合并的ELF文件所对应的relocation包 ``` yum install bash-relocation-xxx -y yum install ncurses-relocation-xxx -y ``` ->![](./figures/icon-note.gif) **说明:** + +>![](./figures/icon-note.gif) **说明:** > 若当前所需要的可执行ELF文件及其依赖库中已经包含relocation段,则可以跳过步骤5。 diff --git a/docs/zh/server/performance/cpu_optimization/sysboost/sysboost.md b/docs/zh/server/performance/cpu_optimization/sysboost/sysboost.md index aea354a06f0595d7f6e82eb7bb9ca46e3628fbf6..8e4a4d115017583fe4c94ea436c8040e6afd17d5 100644 --- a/docs/zh/server/performance/cpu_optimization/sysboost/sysboost.md +++ b/docs/zh/server/performance/cpu_optimization/sysboost/sysboost.md @@ -2,4 +2,4 @@ 本文档介绍可执行ELF文件在线重排性能优化软件sysBoost的安装部署和使用方法,以指导用户快速了解并使用sysBoost。 -本文档适用于使用openEuler系统并希望了解和使用sysBoost的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备基本的Linux操作系统知识。 \ No newline at end of file +本文档适用于使用openEuler系统并希望了解和使用sysBoost的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备基本的Linux操作系统知识。 diff --git a/docs/zh/server/performance/overall/system_resource/system_resources_and_performance.md b/docs/zh/server/performance/overall/system_resource/system_resources_and_performance.md index 6a05a33b1aba7cb05c9251cb1dde9af9f156289d..03ec3004fd8c354c4552306946402e65839aeaa0 100644 --- a/docs/zh/server/performance/overall/system_resource/system_resources_and_performance.md +++ b/docs/zh/server/performance/overall/system_resource/system_resources_and_performance.md @@ -26,6 +26,7 @@ ``` ![](./images/zh-cn_image_0000001385585749.png) + 在命令的输出信息中,各字段所代表的含义如下: |字段|含义| |--|--| diff --git a/docs/zh/server/performance/system_optimzation/atune/_toc.yaml b/docs/zh/server/performance/system_optimzation/atune/_toc.yaml index cb27dbc373e5bd32b715b26290bb057727e8d7f7..c37b865d4a516d4482c0edf73829c907949d6fb7 100644 --- a/docs/zh/server/performance/system_optimzation/atune/_toc.yaml +++ b/docs/zh/server/performance/system_optimzation/atune/_toc.yaml @@ -6,7 +6,7 @@ sections: href: ./a_tune.md sections: - label: 认识A-Tune - href: ./getting_to_know_a-tune.md + href: ./getting_to_know_a_tune.md - label: 安装与部署 href: ./installation_and_deployment.md - label: 使用方法 diff --git a/docs/zh/server/performance/system_optimzation/atune/a_tune.md b/docs/zh/server/performance/system_optimzation/atune/a_tune.md index cb0c369559000de42481e7f9ad90f7a4380574de..f437a25bcd5ac9c2df2537b870506570d70b7fc7 100644 --- a/docs/zh/server/performance/system_optimzation/atune/a_tune.md +++ b/docs/zh/server/performance/system_optimzation/atune/a_tune.md @@ -2,4 +2,4 @@ 本文档介绍openEuler系统性能自优化软件A-Tune的安装部署和使用方法,以指导用户快速了解并使用A-Tune。 -本文档适用于使用openEuler系统并希望了解和使用A-Tune的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备基本的Linux操作系统知识。 \ No newline at end of file +本文档适用于使用openEuler系统并希望了解和使用A-Tune的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备基本的Linux操作系统知识。 diff --git a/docs/zh/server/performance/system_optimzation/atune/appendix.md b/docs/zh/server/performance/system_optimzation/atune/appendix.md index 80c87bad98827cce03e146ba202bad25b65b32fa..f727df6cf049b4ac41b4ebb0317a4e2c2be4ed29 100644 --- a/docs/zh/server/performance/system_optimzation/atune/appendix.md +++ b/docs/zh/server/performance/system_optimzation/atune/appendix.md @@ -1,11 +1,5 @@ # 附录 - -- [附录](#附录) - - [术语和缩略语](#术语和缩略语) - - - ## 术语和缩略语 **表 1** 术语表 @@ -25,4 +19,3 @@ - diff --git a/docs/zh/server/performance/system_optimzation/atune/getting_to_know_a-tune.md b/docs/zh/server/performance/system_optimzation/atune/getting_to_know_a_tune.md similarity index 98% rename from docs/zh/server/performance/system_optimzation/atune/getting_to_know_a-tune.md rename to docs/zh/server/performance/system_optimzation/atune/getting_to_know_a_tune.md index 3333ea9395ad8e4dc71d67637336e354c404c3f8..2d68b75b0cfcdc65ceb0f56ce6de1bda6a40076a 100644 --- a/docs/zh/server/performance/system_optimzation/atune/getting_to_know_a-tune.md +++ b/docs/zh/server/performance/system_optimzation/atune/getting_to_know_a_tune.md @@ -1,12 +1,5 @@ # 认识A-Tune - -- [认识A-Tune](#认识A-Tune) - - [简介](#简介) - - [架构](#架构) - - [支持特性与业务模型](#支持特性与业务模型) - - ## 简介 操作系统作为衔接应用和硬件的基础软件,如何调整系统和应用配置,充分发挥软硬件能力,从而使业务性能达到最优,对用户至关重要。然而,运行在操作系统上的业务类型成百上千,应用形态千差万别,对资源的要求各不相同。当前硬件和基础软件组成的应用环境涉及高达7000多个配置对象,随着业务复杂度和调优对象的增加,调优所需的时间成本呈指数级增长,导致调优效率急剧下降,调优成为了一项极其复杂的工程,给用户带来巨大挑战。 @@ -25,9 +18,9 @@ A-Tune是一款基于AI开发的系统性能优化引擎,它利用人工智能 A-Tune核心技术架构如下图,主要包括智能决策、系统画像和交互系统三层。 -- 智能决策层:包含感知和决策两个子系统,分别完成对应用的智能感知和对系统的调优决策。 -- 系统画像层:主要包括自动特征工程和两层分类模型,自动特征工程用于业务特征的自动选择,两层分类模型用于业务模型的学习和分类。 -- 交互系统层:用于各类系统资源的监控和配置,调优策略执行在本层进行。 +- 智能决策层:包含感知和决策两个子系统,分别完成对应用的智能感知和对系统的调优决策。 +- 系统画像层:主要包括自动特征工程和两层分类模型,自动特征工程用于业务特征的自动选择,两层分类模型用于业务模型的学习和分类。 +- 交互系统层:用于各类系统资源的监控和配置,调优策略执行在本层进行。 ![](./figures/zh-cn_image_0227497343.png) @@ -72,7 +65,6 @@ A-Tune支持的主要特性、特性成熟度以及使用建议请参见[表1](# - ### 支持业务模型 根据应用的负载特征,A-Tune将业务分为11大类,各类型的负载特征和A-Tune支持的应用请参见[表2](#table2819164611311)。 @@ -517,5 +509,3 @@ A-Tune支持的主要特性、特性成熟度以及使用建议请参见[表1](# - - diff --git a/docs/zh/server/performance/system_optimzation/atune/installation_and_deployment.md b/docs/zh/server/performance/system_optimzation/atune/installation_and_deployment.md index b8540a54b12d848fd2d2f7399afe8dd5a776ab39..4ce722d352bc86df927d1a85dfff91765e540146 100644 --- a/docs/zh/server/performance/system_optimzation/atune/installation_and_deployment.md +++ b/docs/zh/server/performance/system_optimzation/atune/installation_and_deployment.md @@ -34,7 +34,6 @@ A-Tune支持单机模式、分布式模式安装和集群模式安装: 由一台client机器和大于一台server机器组成。 - 三种安装模式的简单图示如下: ![](./figures/zh-cn_image_0231122163.png) @@ -45,7 +44,7 @@ A-Tune支持单机模式、分布式模式安装和集群模式安装: 1. 挂载openEuler的iso文件。 - ``` + ```shell # mount openEuler-{version}-everything-x86_64-dvd.iso /mnt ``` @@ -53,13 +52,13 @@ A-Tune支持单机模式、分布式模式安装和集群模式安装: 2. 配置本地yum源。 - ``` + ```shell # vim /etc/yum.repos.d/local.repo ``` 配置内容如下所示: - ``` + ```shell [local] name=local baseurl=file:///mnt @@ -69,7 +68,7 @@ A-Tune支持单机模式、分布式模式安装和集群模式安装: 3. 将RPM数字签名的GPG公钥导入系统。 - ``` + ```shell # rpm --import /mnt/RPM-GPG-KEY-openEuler ``` @@ -78,20 +77,20 @@ A-Tune支持单机模式、分布式模式安装和集群模式安装: >![](./public_sys-resources/icon-note.gif) **说明:** >本步骤会同时安装服务端和客户端软件包,对于单机部署模式,请跳过**步骤5**。 - ``` + ```shell # yum install atune -y # yum install atune-engine -y ``` 5. 若为分布式部署,请安装A-Tune客户端。 - ``` + ```shell # yum install atune-client -y ``` 6. 验证是否安装成功。命令和回显如下表示安装成功。 - ``` + ```shell # rpm -qa | grep atune atune-client-xxx atune-db-xxx @@ -163,7 +162,7 @@ A-Tune配置文件/etc/atuned/atuned.cnf的配置项说明如下: ### 配置示例 -``` +```shell #################################### server ############################### # atuned config [server] @@ -272,7 +271,7 @@ A-Tune engine配置文件/etc/atuned/engine.cnf的配置项说明如下: ### 配置示例 -``` +```shell #################################### engine ############################### [server] # the tuning optimizer host and port, start by engine.service @@ -297,36 +296,39 @@ A-Tune engine配置文件/etc/atuned/engine.cnf的配置项说明如下: ## 启动A-Tune A-Tune安装完成后,需要配置A-Tune服务,然后启动A-Tune服务。 + - 配置A-Tune服务: 修改atuned.cnf配置文件中网卡和磁盘的信息 > 说明: > > 如果通过'make install'安装了atuned服务,网卡和磁盘已经自动更新为当前机器中的默认设备。如果需要从其他设备收集数据,请按照以下步骤配置 atuned 服务。 - + 通过以下命令可以查找当前需要采集或者执行网卡相关优化时需要指定的网卡,并修改/etc/atuned/atuned.cnf中的network配置选项为对应的指定网卡。 - ``` + + ```shell ip addr ``` + 通过以下命令可以查找当前需要采集或者执行磁盘相关优化时需要指定的磁盘,并修改/etc/atuned/atuned.cnf中的disk配置选项为对应的指定磁盘。 - ``` + + ```shell fdisk -l | grep dev ``` + - 关于证书: 因为A-Tune的引擎和客户端使用了grpc通信协议,所以为了系统安全,需要配置证书。因为信息安全的原因,A-Tune不会提供证书生成方法,请用户自行配置系统证书。 如果不考虑安全问题,可以将/etc/atuned/atuned.cnf中的rest_tls 和 engine_tls配置选项设置为false,并且将/etc/atuned/engine.cnf中的engine_tls配置选项设为false。 如果不配置安全证书导致的一切后果与A-Tune无关。 - - 启动atuned服务: - ``` + ```shell # systemctl start atuned ``` - - 查询atuned服务状态: - ``` + ```shell # systemctl status atuned ``` @@ -340,24 +342,24 @@ A-Tune安装完成后,需要配置A-Tune服务,然后启动A-Tune服务。 - 启动atune-engine服务: - ``` + ```shell # systemctl start atune-engine ``` - - 查询atune-engine服务状态: - ``` + ```shell # systemctl status atune-engine ``` 若回显为如下,则服务启动成功。 ![](./figures/zh-cn_image_0245342444.png) - + ## 分部式部署 ### 分部式部署目的 + 为了实现分布式架构和按需部署的目标,A-Tune支持分部式部署。可以将三个组件分开部署,轻量化组件部署对业务影响小,也避免安装过多依赖软件,减轻系统负担。
部署方式:本文档只介绍常用的一种部署方式:在同一节点部署客户端和服务端,在另一个节点上部署引擎模块。其他的部署方式请咨询A-Tune开发人员。 @@ -366,30 +368,41 @@ A-Tune安装完成后,需要配置A-Tune服务,然后启动A-Tune服务。 ![输入图片说明](figures/picture1.png) ### 配置文件 + 分部式部署需要修改配置文件,将引擎的ip地址和端口号写入配置文件中,别的组件才能访问该ip地址上的引擎组件。 -1. 修改服务端节点上的`/etc/atuned/atuned.cnf`文件: - - 34行的`engine_host`和`engine_port`修改为引擎节点的ip地址和端口号。如上图,应该修改为`engine_host = 192.168.0.1 engine_port = 3838`。 - - 将49行和55行的 rest_tls 和engine_tls 改为false,否则需要申请和配置证书。在测试环境中可以不用配置ssl证书,但是正式的现网环境需要配置证书,否则会有安全隐患。 -2. 修改引擎节点/etc/atuned/engine.cnf文件: - - 17行和18行的`engine_host`和`engine_port`修改为引擎节点的ip地址和端口号。如上图,应该修改为`engine_host = 192.168.0.1 engine_port = 3838`。 - - 第22行的engine_tls的值改成false。 -3. 修改完配置文件后需要重启服务,配置才会生效: - - 服务端节点输入命令:`systemctl restart atuned`。 - - 引擎端节点输入命令:`systemctl restart atune-engine`。 -4. (可选步骤)在`A-Tune/examples/tuning/compress`文件夹下运行tuning命令: - - 请先参考`A-Tune/examples/tuning/compress/README`的指导进行预处理。 - - 执行`atune-adm tuning --project compress --detail compress_client.yaml`。 - - 本步骤的目的是检验分部式部署是否成功。 +1. 修改服务端节点上的`/etc/atuned/atuned.cnf`文件: + + - 34行的`engine_host`和`engine_port`修改为引擎节点的ip地址和端口号。如上图,应该修改为`engine_host = 192.168.0.1 engine_port = 3838`。 + - 将49行和55行的 rest_tls 和engine_tls 改为false,否则需要申请和配置证书。在测试环境中可以不用配置ssl证书,但是正式的现网环境需要配置证书,否则会有安全隐患。 + +2. 修改引擎节点/etc/atuned/engine.cnf文件: + + - 17行和18行的`engine_host`和`engine_port`修改为引擎节点的ip地址和端口号。如上图,应该修改为`engine_host = 192.168.0.1 engine_port = 3838`。 + - 第22行的engine_tls的值改成false。 + +3. 修改完配置文件后需要重启服务,配置才会生效: + + - 服务端节点输入命令:`systemctl restart atuned`。 + - 引擎端节点输入命令:`systemctl restart atune-engine`。 + +4. (可选步骤)在`A-Tune/examples/tuning/compress`文件夹下运行tuning命令: + + - 请先参考`A-Tune/examples/tuning/compress/README`的指导进行预处理。 + - 执行`atune-adm tuning --project compress --detail compress_client.yaml`。 + - 本步骤的目的是检验分部式部署是否成功。 ### 注意事项 -1. 本文档不对认证证书配置方法作详细说明,如有需要也可以将atuned.cnf和engine.cnf中的rest_tls/engine_tls设成false。 -2. 修改完配置文件后需要重启服务,否则修改不会生效。 -3. 注意使用atune服务时不要同时打开代理。 -4. atuned.cnf 文件中的[system]模块的disk和network项需要修改,修改方法见[A-Tune用户指南2.4.1章节](https://gitee.com/gaoruoshu/A-Tune/blob/master/Documentation/UserGuide/A-Tune%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97.md),本文不展开描述。 + +1. 本文档不对认证证书配置方法作详细说明,如有需要也可以将atuned.cnf和engine.cnf中的rest_tls/engine_tls设成false。 +2. 修改完配置文件后需要重启服务,否则修改不会生效。 +3. 注意使用atune服务时不要同时打开代理。 +4. atuned.cnf 文件中的[system]模块的disk和network项需要修改,修改方法见[A-Tune用户指南2.4.1章节](https://gitee.com/gaoruoshu/A-Tune/blob/master/Documentation/UserGuide/A-Tune%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97.md),本文不展开描述。 ### 举例 + #### atuned.cnf + ```bash # ...前略... @@ -401,7 +414,9 @@ engine_port = 3838 # ...后略... ``` + #### engine.cnf + ```bash [server] # the tuning optimizer host and port, start by engine.service @@ -410,9 +425,11 @@ engine_port = 3838 engine_host = 192.168.0.1 engine_port = 3838 ``` + ## 集群部署 ### 集群部署的目的 + 为了支持多节点场景快速调优,A-Tune支持对多个节点里的参数配置同时进行动态调优,避免用户单独多次对每个节点进行调优,从而提升调优效率。
集群部署的方式:分为一个主节点和若干个从节点。在主节点部署客户端和服务端,负责接受命令和引擎交互。其他节点接受主节点的指令,对当前节点的参数进行配置。 @@ -422,21 +439,25 @@ engine_port = 3838 上图中客户端和服务端部署在ip为192.168.0.0的节点上,项目文件存放在该节点上,其他节点不用放置项目文件。
主节点和从节点之间通过tcp协议通信,所以需要修改配置文件。 -### atuned.cnf配置文件修改: -1. protocol 值设置为tcp。 -2. address设置为当前节点的ip地址。 -3. connect设置为所有节点的ip地址,第一个为主节点,其余为从节点ip,中间用逗号隔开。 -4. 在调试时,可以设置rest_tls 和engine_tls 为false。 -5. 所有的主从节点的atuned.cnf都按照上方描述修改。 +### atuned.cnf配置文件修改 + +1. protocol 值设置为tcp。 +2. address设置为当前节点的ip地址。 +3. connect设置为所有节点的ip地址,第一个为主节点,其余为从节点ip,中间用逗号隔开。 +4. 在调试时,可以设置rest_tls 和engine_tls 为false。 +5. 所有的主从节点的atuned.cnf都按照上方描述修改。 ### 注意事项 -1. 将engine.cnf中的`engine_host`和`engine_port`设置为服务端atuned.cnf中`engine_host`和`engine_port`一样的ip和端口号。 -2. 本文档不对认证证书配置方法作详细说明,如有需要也可以将atuned.cnf和engine.cnf中的rest_tls和engine_tls设置为false。 -3. 修改完配置文件后需要重启服务,否则修改不会生效。 -4. 注意使用atune服务时不要同时打开代理。 + +1. 将engine.cnf中的`engine_host`和`engine_port`设置为服务端atuned.cnf中`engine_host`和`engine_port`一样的ip和端口号。 +2. 本文档不对认证证书配置方法作详细说明,如有需要也可以将atuned.cnf和engine.cnf中的rest_tls和engine_tls设置为false。 +3. 修改完配置文件后需要重启服务,否则修改不会生效。 +4. 注意使用atune服务时不要同时打开代理。 ### 举例 + #### atuned.cnf + ```bash # ...前略... @@ -473,6 +494,7 @@ engine_port = 3838 ``` #### engine.cnf + ```bash [server] # the tuning optimizer host and port, start by engine.service @@ -482,4 +504,4 @@ engine_host = 192.168.1.1 engine_port = 3838 ``` -**备注:** engine.cnf参考分部式部署的配置文件。 \ No newline at end of file +**备注:** engine.cnf参考分部式部署的配置文件。 diff --git a/docs/zh/server/performance/system_optimzation/atune/native_turbo.md b/docs/zh/server/performance/system_optimzation/atune/native_turbo.md index 93817638470e1a8548de2292190ae12d52e761e4..af52f6d94e2863ae47389ebfd43a3d4f6f6bf4ad 100644 --- a/docs/zh/server/performance/system_optimzation/atune/native_turbo.md +++ b/docs/zh/server/performance/system_optimzation/atune/native_turbo.md @@ -46,10 +46,9 @@ 2. 使用前需要预留足够的大页,否则程序会执行失败。 如果使用cgroup,请注意hugetlb的限制,如果限制小于所需大页数量,可能导致运行时崩溃。 - + 3. 由于进程页表改为2M,mprotect等系统调用的参数需要按2M对齐,否则会执行失败。 4. 不支持libcareplus热补丁机制。 5. 多个进程间无法共享大页,会消耗多倍内存。 - diff --git a/docs/zh/server/performance/tuning_framework/oeaware/oeaware_user_guide.md b/docs/zh/server/performance/tuning_framework/oeaware/oeaware_user_guide.md index cdb4b3b0e7d219bb39bf6b1239ced3fa70ab7d1f..92b622dcf4fd805ee9033c4c551e11bfbfb705a4 100644 --- a/docs/zh/server/performance/tuning_framework/oeaware/oeaware_user_guide.md +++ b/docs/zh/server/performance/tuning_framework/oeaware/oeaware_user_guide.md @@ -32,13 +32,13 @@ systemctl start oeaware log_path: /var/log/oeAware #日志存储路径 log_level: 1 #日志等级 1:DEBUG 2:NFO 3:WARN 4:ERROR enable_list: #默认使能插件 - - name: libtest.so #只配置插件,使能本插件的所有实例 - - name: libtest1.so #配置插件实例,使能配置的插件实例 - instances: - - instance1 - - instance2 - ... - ... + - name: libtest.so #只配置插件,使能本插件的所有实例 + - name: libtest1.so #配置插件实例,使能配置的插件实例 + instances: + - instance1 + - instance2 + ... + ... plugin_list: #可支持下载的包 - name: test #名称需要唯一,如果重复取第一个配置 description: hello world @@ -58,14 +58,12 @@ systemctl restart oeaware **实例定义**:服务中的调度单位是实例,一个插件中包括多个实例。例如,一个采集插件包括多个采集项,每个采集项是一个实例。 - ### 插件加载 服务会默认加载插件存储路径下的插件。 插件路径:/usr/lib64/oeAware-plugin/ - 另外也可以通过手动加载的方式加载插件。 ```shell @@ -163,8 +161,8 @@ oeawarectl --query-dep= <插件实例> #查询运行实例订阅关系图 oeawarectl -e thread_scenario oeawarectl -Q ``` -![img](./figures/dep.png) +![img](./figures/dep.png) ### 插件实例使能 @@ -179,16 +177,19 @@ oeawarectl -e | --enable <插件实例> 失败返回错误说明。 推荐使能插件列表: + - libsystem_tune.so:stealtask_tune,smc_tune,xcall_tune,seep_tune。 - libub_tune.so:unixbench_tune。 - libtune_numa.so:tune_numa_mem_access。 其他插件主要用来提供数据,可通过sdk获取插件数据。 + #### 关闭插件实例 ```shell oeawarectl -d | --disable <插件实例> ``` + 关闭某个插件实例,会将其订阅的topic实例一起关闭。 失败返回错误说明。 @@ -233,13 +234,17 @@ usage: oeawarectl analysis [options]... -v|--verbose show verbose information. -h|--help show this help message. ``` + 示例 执行以下命令,输出系统分析报告。 + ```sh oeawarectl analysis -t 10 ``` + 结果如下 + ```bash ============================================================================================ Summary Analysis Report @@ -265,12 +270,17 @@ oeawarectl analysis -t 10 ======================================== Solution ======================================== No solution. ``` + 报告分为三部分 - - Suggest:根据系统运行状态,给出调优建议。 - - Network:网络使用情况。 - - Solution:给出具体调优方法。 + +- Suggest:根据系统运行状态,给出调优建议。 +- Network:网络使用情况。 +- Solution:给出具体调优方法。 + ### 帮助 + 通过`--help`查看帮助。 + ```shell usage: oeawarectl [options]... options @@ -290,6 +300,7 @@ usage: oeawarectl [options]... ## 插件开发说明 ### 基础数据结构 + ```c++ typedef struct { char *instanceName; // 实例名称 @@ -340,11 +351,13 @@ protected: } } ``` + 实例开发继承实例基类,实现6个虚函数,并对类的7个属性赋值。 实例采用订阅发布模式,通过Subscribe获取数据,通过Publish接口发布数据。 ### 属性说明 + | 属性 | 类型 | 说明 | | --- | --- | --- | | name | string | 实例名称 | @@ -356,6 +369,7 @@ protected: | period | int | 实例执行周期,单位ms,period为10的倍数 | ### 接口说明 + | 函数名 | 参数 | 返回值 | 说明 | | --- | --- | --- | --- | |Result OpenTopic(const Topic &topic) | topic:打开的主题 | | 打开对应的topic | @@ -364,7 +378,9 @@ protected: | Result Enable(const std::string ¶m = "") | param:预留 | | 使能本实例 | | void Disable() | | | 关闭本实例 | | void Run() | | | 每周期会执行run函数 | + ### 实例示例 + ```C++ #include #include @@ -416,33 +432,44 @@ extern "C" void GetInstance(std::vector> &in interfaces.emplace_back(std::make_shared()); } ``` + ## 内部插件 + ### libpmu.so -| 实例名称 | 架构 | 说明 | topic | +| 实例名称 | 架构 | 说明 | topic | | --- | --- | --- | --- | -| pmu_counting_collector | aarch64 | 采集count相关事件 |cycles,net:netif_rx,L1-dcache-load-misses,L1-dcache-loads,L1-icache-load-misses,L1-icache-loads,branch-load-misses,branch-loads,dTLB-load-misses,dTLB-loads,iTLB-load-misses,iTLB-loads,cache-references,cache-misses,l2d_tlb_refill,l2d_cache_refill,l1d_tlb_refill,l1d_cache_refill,inst_retired,instructions | +| pmu_counting_collector | aarch64 | 采集count相关事件 |cycles,net:netif_rx,L1-dcache-load-misses,L1-dcache-loads,L1-icache-load-misses,L1-icache-loads,branch-load-misses,branch-loads,dTLB-load-misses,dTLB-loads,iTLB-load-misses,iTLB-loads,cache-references,cache-misses,l2d_tlb_refill,l2d_cache_refill,l1d_tlb_refill,l1d_cache_refill,inst_retired,instructions | | pmu_sampling_collector | aarch64 | 采集sample相关事件 | cycles, skb:skb_copy_datagram_iovec,net:napi_gro_receive_entry | | pmu_spe_collector | aarch64 | 采集spe事件 | spe | | pmu_uncore_collector | aarch64 | 采集uncore事件 | uncore | + #### 限制条件 + 采集spe事件需要依赖硬件能力,此插件运行依赖 BIOS 的 SPE,运行前需要将 SPE 打开。 运行perf list | grep arm_spe查看是否已经开启SPE,如果开启,则有如下显示 -``` + +```sh arm_spe_0// [Kernel PMU event] ``` + 如果没有开启,则按下述步骤开启。 检查BIOS配置项 MISC Config --> SPE 的状态, 如果状态为 Disable,则需要更改为 Enable。如果找不到这个选项,可能是BIOS版本过低。 进入系统 vim /etc/grub2-efi.cfg,定位到内核版本对应的开机启动项,在末尾增加“kpti=off”。例如: -``` + +```sh linux /vmlinuz-4.19.90-2003.4.0.0036.oe1.aarch64 root=/dev/mapper/openeuler-root ro rd.lvm.lv=openeuler/root rd.lvm.lv=openeuler/swap video=VGA-1:640x480-32@60me rhgb quiet smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 crashkernel=1024M,high video=efifb:off video=VGA-1:640x480-32@60me kpti=off ``` + 按“ESC”,输入“:wq”,按“Enter”保存并退出。执行reboot命令重启服务器。 + ### libsystem_collector.so + 系统信息采集插件。 + | 实例名称 | 架构 | 说明 | topic | | --- | --- | --- | --- | | thread_collector | aarch64/x86 | 采集系统中的线程信息 | thread_collector | @@ -450,37 +477,53 @@ linux /vmlinuz-4.19.90-2003.4.0.0036.oe1.aarch64 root=/dev/mapper/openeuler-ro | command_collector | aarch64/x86 | 采集sysstat相关数据 | mpstat,iostat,vmstat,sar,pidstat | ### libdocker_collector.so + docker信息采集插件。 + | 实例名称 | 架构 | 说明 | topic | | --- | --- | --- | --- | | docker_collector | aarch64/x86 | 采集docker相关信息 | docker_collector | + ### libthread_scenario.so + 线程感知插件。 + | 实例名称 | 架构 | 说明 | 订阅 | | --- | --- | --- | --- | | thread_scenario | aarch64/x86 | 通过配置文件获取对应线程信息 | thread_collector::thread_collector | + #### 配置文件 + thread_scenario.conf -``` + +```sh redis fstime fsbuffer fsdisk ``` + ### libanalysis_oeaware.so + | 实例名称 | 架构 | 说明 | 订阅 | | --- | --- | --- | --- | | analysis_aware | 分析当前环境的业务特征,并给出优化建议 | aarch64 | pmu_spe_collector::spe, pmu_counting_collector::net:netif_rx, pmu_sampling_collector::cycles, pmu_sampling_collector::skb:skb_copy_datagram_iovec, pmu_sampling_collector::net:napi_gro_receive_entry | + ### libsystem_tune.so + 系统调优插件。 + | 实例名称 | 架构 | 说明 | 订阅 | | --- | --- | --- | --- | | stealtask_tune | aarch64 | 高负载场景下,通过轻量级搜索算法,实现多核间快速负载均衡,最大化cpu资源利用率 | 无 | | smc_tune | aarch64 | 使能smc加速,对使用tcp协议的连接无感加速 | 无 | | xcall_tune | aarch64 | 通过减少系统调用底噪,提升系统性能 | thread_collector::thread_collector | | seep_tune | aarch64 | 使能智能功耗模式,降低系统能耗 | 无 | + #### 配置文件 + xcall.yaml + ``` yaml redis: # 线程名称 - xcall_1: 1 #xcall_1表示xcall优化方式,目前只有xcall_1; 1表示需要优化系统调用号 @@ -489,34 +532,47 @@ mysql: node: - xcall_1: 1 ``` + #### 限制条件 xcall_tune依赖内核特性,需要开启FAST_SYSCALL编译内核,并且增加在cmdline里增加xcall字段。 ### libub_tune.so + unixbench调优插件。 + | 实例名称 | 架构 | 说明 | 订阅 | | --- | --- | --- | --- | | unixbench_tune | aarch64/x86 | 通过减少远端内存访问,优化ub性能 | thread_collector::thread_collector | + ### libdocker_tune.so | 实例名称 | 架构 | 说明 | 订阅 | | --- | --- | --- | --- | | docker_cpu_burst | aarch64 | 在出现突发负载时,CPUBurst可以为容器临时提供额外的CPU资源,缓解CPU限制带来的性能瓶颈 | pmu_counting_collector::cycles,docker_collector::docker_collector | + ## 外部插件 + 外部插件需要通过以下命令安装,例如安装numafast相关插件 -``` + +```sh oeawarectl -i numafast ``` + ### libscenario_numa.so + | 实例名称 | 架构 | 说明 | 订阅 | topic | -| --- | --- | --- | --- | --- | +| --- | --- | --- | --- | --- | | scenario_numa | aarch64 | 感知当前环境跨NUMA访存比例,用于实例或sdk订阅(无法单独使能) | pmu_uncore_collector::uncore | system_score | + ### libtune_numa.so + | 实例名称 | 架构 | 说明 | 订阅 | | --- | --- | --- | --- | | tune_numa_mem_access | aarch64 | 周期性迁移线程和内存,减少跨NUMA内存访问 | scenario_numa::system_score, pmu_spe_collector::spe, pmu_counting_collector::cycles | + ## SDK使用说明 + ```C typedef int(*Callback)(const DataList *); int OeInit(); // 初始化资源,与server建立链接 @@ -525,7 +581,9 @@ int OeUnsubscribe(const CTopic *topic); // 取消订阅topic int OePublish(const DataList *dataList); // 发布数据到server void OeClose(); // 释放资源 ``` + **示例** + ```C #include "oe_client.h" #include "command_data.h" @@ -557,6 +615,7 @@ int main() { OeClose(); } ``` + ## 约束限制 ### 功能约束 diff --git a/docs/zh/server/security/secharden/account_passwords.md b/docs/zh/server/security/secharden/account_passwords.md index 48b072dee5039478c6ee1ec9daea33ae48351921..032fdbf17faea1d7b86f3c8f4db79fdf47151c57 100644 --- a/docs/zh/server/security/secharden/account_passwords.md +++ b/docs/zh/server/security/secharden/account_passwords.md @@ -1,14 +1,5 @@ # 帐户口令 -- [帐户口令](#帐户口令) - - [屏蔽系统帐户](#屏蔽系统帐户) - - [限制使用su命令的帐户](#限制使用su命令的帐户) - - [设置口令复杂度](#设置口令复杂度) - - [设置口令有效期](#设置口令有效期) - - [设置口令的加密算法](#设置口令的加密算法) - - [登录失败超过三次后锁定](#登录失败超过三次后锁定) - - [加固su命令](#加固su命令) - ## 屏蔽系统帐户 ### 说明 diff --git a/docs/zh/server/security/secharden/file_permissions.md b/docs/zh/server/security/secharden/file_permissions.md index f3d10d1d0bdfab92c8a58a815f6da607457e3ac1..62d889fb73050618b7e4eb63e76de8608e625b39 100644 --- a/docs/zh/server/security/secharden/file_permissions.md +++ b/docs/zh/server/security/secharden/file_permissions.md @@ -1,16 +1,5 @@ # 文件权限 -- [文件权限](#文件权限) - - [设置文件的权限和属主](#设置文件的权限和属主) - - [删除无主文件](#删除无主文件) - - [处理空链接文件](#处理空链接文件) - - [设置守护进程的umask值](#设置守护进程的umask值) - - [为全局可写目录添加粘滞位属性](#为全局可写目录添加粘滞位属性) - - [删除非授权文件的全局可写属性](#删除非授权文件的全局可写属性) - - [限制at命令的使用权限](#限制at命令的使用权限) - - [限制cron命令的使用权限](#限制cron命令的使用权限) - - [限制sudo命令的使用权限](#限制sudo命令的使用权限) - ## 设置文件的权限和属主 ### 说明 diff --git a/docs/zh/tools/cloud/cpds/usage_instructions.md b/docs/zh/tools/cloud/cpds/usage_instructions.md index 2bae9bf3242f2427e549e8ee8db1296fc6762db5..3868379765196d0ecb7c9864a8c355d67bea0359 100644 --- a/docs/zh/tools/cloud/cpds/usage_instructions.md +++ b/docs/zh/tools/cloud/cpds/usage_instructions.md @@ -1,30 +1,5 @@ # 使用手册 - - -- [介绍](#介绍) -- [页面及功能说明](#页面及功能说明) - - [页面布局](#页面布局) - - [概览](#概览) - - [监控告警](#监控告警) - - [集群状态](#集群状态) - - [集群状态-概览](#集群状态-概览) - - [集群状态-物理资源监控](#集群状态-物理资源监控) - - [集群状态-容器健康监控](#集群状态-容器健康监控) - - [节点健康](#节点健康) - - [节点健康-概览](#节点健康-概览) - - [节点健康-物理资源监控](#节点健康-物理资源监控) - - [节点健康-容器健康监控](#节点健康-容器健康监控) - - [健康诊断](#健康诊断) - - [诊断结果](#诊断结果) - - [原始数据检索](#原始数据检索) - - [原始数据图表](#原始数据图表) - - [规则管理](#规则管理) - - [查看规则](#查看规则) - - [添加规则](#添加规则) - - - ## 介绍 CPDS(Container Problem Detect System)容器故障检测系统,是由北京凝思软件股份有限公司设计并开发的容器集群故障检测系统,该软件系统实现了对容器 TOP 故障、亚健康检测的监测与识别。 diff --git a/docs/zh/tools/devops/pkgship/pkgship.md b/docs/zh/tools/devops/pkgship/pkgship.md index 54e8c5019c6d98f275252e89fa73adea211ba864..43120ee9a43cdc99cd2b95ebaabc79e595cb081e 100644 --- a/docs/zh/tools/devops/pkgship/pkgship.md +++ b/docs/zh/tools/devops/pkgship/pkgship.md @@ -1,21 +1,5 @@ # pkgship - - -- [pkgship](#pkgship) - - [介绍](#介绍) - - [架构](#架构) - - [软件下载](#软件下载) - - [运行环境](#运行环境) - - [安装工具](#安装工具) - - [配置参数](#配置参数) - - [服务启动和停止](#服务启动和停止) - - [工具使用](#工具使用) - - [日志查看和转储](#日志查看和转储) - - [扩展工具pkgship-panel](#扩展工具pkgship-panel) - - - ## 介绍 pkgship是一款管理OS软件包依赖关系,提供依赖和被依赖关系完整图谱的查询工具,pkgship提供软件包依赖查询、生命周期管理等功能。 diff --git a/docs/zh/virtualization/virtualization_platform/virtualization/libcareplus.md b/docs/zh/virtualization/virtualization_platform/virtualization/libcareplus.md index d09814f7b43e9ff86243fac2435deea6f1288796..5bf02261ac8aa1319c9200c0062a37d843dc8465 100644 --- a/docs/zh/virtualization/virtualization_platform/virtualization/libcareplus.md +++ b/docs/zh/virtualization/virtualization_platform/virtualization/libcareplus.md @@ -1,13 +1,5 @@ # LibcarePlus -- [概述](#概述) -- [软硬件要求](#软硬件要求) -- [注意事项和约束](#注意事项和约束) -- [安装 LibcarePlus](#安装-libcareplus) -- [制作 LibcarePlus 热补丁](#制作-libcareplus-热补丁) -- [应用 LibcarePlus 热补丁](#应用-libcareplus-热补丁) -- [使用 LibcarePlus 工具制作 qemu 热补丁](#使用-libcareplus-工具制作-qemu-热补丁) - ## 概述 LibcarePlus 是一个用户态进程热补丁框架,可以在不重启进程的情况下对 Linux 系统上运行的目标进程进行热补丁操作。热补丁可以应用于 CVE 漏洞修复,也可以应用于不中断应用服务的紧急 bug 修复。 diff --git a/docs/zh/virtualization/virtualization_platform/virtualization/skylark.md b/docs/zh/virtualization/virtualization_platform/virtualization/skylark.md index 1c43b98fdfd5ff273f83efeb276bd8adb8f316dc..9fc23fd73870ac56102059a40ecb04c1860bb1ed 100644 --- a/docs/zh/virtualization/virtualization_platform/virtualization/skylark.md +++ b/docs/zh/virtualization/virtualization_platform/virtualization/skylark.md @@ -1,7 +1,5 @@ # Skylark - - ## Skylark概述 ### 问题背景 diff --git a/docs/zh/virtualization/virtualization_platform/virtualization/virtualization_installation.md b/docs/zh/virtualization/virtualization_platform/virtualization/virtualization_installation.md index 94b10e321374669425ae77816e611c9168966338..72a1f67edc0deaa4f6d9a34aaf7e5c237a8600f1 100644 --- a/docs/zh/virtualization/virtualization_platform/virtualization/virtualization_installation.md +++ b/docs/zh/virtualization/virtualization_platform/virtualization/virtualization_installation.md @@ -2,16 +2,6 @@ 本章介绍在openEuler中安装虚拟化组件的方法。 - - -- [安装虚拟化组件](#安装虚拟化组件) - - [最低硬件要求](#最低硬件要求) - - [安装虚拟化核心组件](#安装虚拟化核心组件) - - [安装方法](#安装方法) - - [验证安装是否成功](#验证安装是否成功) - - - ## 最低硬件要求 在openEuler系统中安装虚拟化组件,最低硬件要求: diff --git a/docs/zh/virtualization/virtualization_platform/virtualization/vmtop.md b/docs/zh/virtualization/virtualization_platform/virtualization/vmtop.md index 7321de221b7299ff910d4e68c434c9655aaac589..4a6a1bfc6eb0e306b560a54fef0898e0ca2a8f2f 100644 --- a/docs/zh/virtualization/virtualization_platform/virtualization/vmtop.md +++ b/docs/zh/virtualization/virtualization_platform/virtualization/vmtop.md @@ -1,7 +1,5 @@ # 工具使用指南 -- [vmtop使用指南](#vmtop使用指南) - ## vmtop使用指南 ### 概述