diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index 8f46dd2575db36faa55d4973525cef17b4f17a72..0000000000000000000000000000000000000000
--- a/.npmrc
+++ /dev/null
@@ -1,2 +0,0 @@
-registry=https://registry.npmmirror.com/
-
diff --git a/.prettierrc.json b/.prettierrc.json
deleted file mode 100644
index 66d4c0d9d803a7017653eef72220ccacc9355a19..0000000000000000000000000000000000000000
--- a/.prettierrc.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "$schema": "https://json.schemastore.org/prettierrc",
- "semi": true,
- "tabWidth": 2,
- "singleQuote": true,
- "printWidth": 160,
- "trailingComma": "es5"
-}
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 28805957ad278366fae711acaf3998c30cce12d2..0000000000000000000000000000000000000000
--- a/Dockerfile
+++ /dev/null
@@ -1,102 +0,0 @@
-FROM node:18.14.1 as Builder
-
-RUN mkdir -p /home/openeuler/docs
-WORKDIR /home/openeuler/docs
-COPY . /home/openeuler/docs
-
-RUN npm install pnpm -g
-RUN pnpm install
-RUN pnpm build
-
-FROM swr.cn-north-4.myhuaweicloud.com/opensourceway/openeuler/nginx:1.24.0-22.03-lts-sp1 as NginxBuilder
-
-FROM openeuler/openeuler:22.03
-
-ENV NGINX_CONFIG_FILE /etc/nginx/nginx.conf
-ENV NGINX_CONFIG_PATH /etc/nginx/
-ENV NGINX_PID /var/run/nginx.pid
-ENV NGINX_USER nginx
-ENV NGINX_GROUP nginx
-ENV NGINX_BIN /usr/share/nginx/sbin/
-ENV NGINX_HOME /usr/share/nginx/
-ENV NGINX_EXE_FILE /usr/share/nginx/sbin/nginx
-ENV DST_PATH /etc/nginx/cert
-
-COPY --from=NginxBuilder /usr/share/nginx /usr/share/nginx
-COPY --from=NginxBuilder /usr/share/nginx/sbin/nginx /usr/share/nginx/sbin/nginx
-COPY --from=NginxBuilder /etc/nginx/modules /etc/nginx/modules
-COPY --from=NginxBuilder /etc/nginx/geoip /etc/nginx/geoip
-COPY --from=NginxBuilder /etc/nginx/mime.types /etc/nginx/mime.types
-
-COPY --from=Builder /home/openeuler/docs/docs/.vitepress/dist /usr/share/nginx/www/
-
-RUN sed -i "s|repo.openeuler.org|mirrors.nju.edu.cn/openeuler|g" /etc/yum.repos.d/openEuler.repo \
- && sed -i '/metalink/d' /etc/yum.repos.d/openEuler.repo \
- && sed -i '/metadata_expire/d' /etc/yum.repos.d/openEuler.repo \
- && yum update -y \
- && yum install -y findutils passwd shadow \
- && find /usr/share/nginx/www -type d -print0| xargs -0 chmod 500 \
- && find /usr/share/nginx/www -type f -print0| xargs -0 chmod 400
-
-COPY ./deploy/nginx/nginx.conf /etc/nginx/nginx.conf
-
-RUN touch /var/run/nginx.pid \
- && groupadd -g 1000 nginx \
- && useradd -u 1000 -g nginx -s /sbin/nologin nginx \
- && chown -R nginx:nginx /usr/share/nginx \
- && find /usr/share/nginx -type d -print0 | xargs -0 chmod 500 \
- && chmod 500 /usr/share/nginx/sbin/nginx \
- && mkdir -p /var/log/nginx \
- && chown -R nginx:nginx /var/log/nginx \
- && chmod -R 640 /var/log/nginx \
- && mkdir -p /var/lib/nginx/tmp/client_body \
- && chown -R nginx:nginx /var/lib/nginx/tmp/client_body \
- && mkdir -p /var/lib/nginx/tmp/fastcgi \
- && chown -R nginx:nginx /var/lib/nginx/tmp/fastcgi \
- && mkdir -p /var/lib/nginx/tmp/proxy \
- && chown -R nginx:nginx /var/lib/nginx/tmp/proxy \
- && mkdir -p /var/lib/nginx/tmp/scgi \
- && chown -R nginx:nginx /var/lib/nginx/tmp/scgi \
- && mkdir -p /var/lib/nginx/tmp/uwsgi \
- && chown -R nginx:nginx /var/lib/nginx/tmp/uwsgi \
- && chmod -R 500 /var/lib/nginx/ \
- && chown -R nginx:nginx /var/lib/nginx/ \
- && chown -R nginx:nginx /var/run/nginx.pid \
- && chmod 640 /var/run/nginx.pid \
- && chown -R nginx:nginx /etc/nginx \
- && chmod 550 /etc/nginx \
- && chmod 550 /etc/nginx/geoip/ \
- && chmod 440 /etc/nginx/geoip/* \
- && chmod 550 /etc/nginx/modules \
- && chmod 440 /etc/nginx/modules/* \
- && chmod 440 /etc/nginx/nginx.conf \
- && chmod 440 /etc/nginx/mime.types \
- && rm -rf /usr/share/nginx/html/ \
- && rm -rf /usr/share/nginx/logs/ \
- && echo "umask 0027" >> /etc/bashrc \
- && echo "set +o history" >> /etc/bashrc \
- && sed -i "s|HISTSIZE=1000|HISTSIZE=0|" /etc/profile \
- && sed -i "s|PASS_MAX_DAYS[ \t]*99999|PASS_MAX_DAYS 30|" /etc/login.defs \
- && passwd -l $NGINX_USER \
- && yum clean all \
- && usermod -s /sbin/nologin sync \
- && usermod -s /sbin/nologin shutdown \
- && usermod -s /sbin/nologin halt \
- && echo "export TMOUT=1800 readonly TMOUT" >> /etc/profile \
- && rm -rf /usr/bin/gdb* \
- && rm -rf /usr/share/gdb \
- && rm -rf /usr/share/gcc-10.3.1 \
- && yum remove gdb-gdbserver findutils passwd shadow -y
-
-COPY ./deploy/monitor.sh ./deploy/entrypoint.sh /etc/nginx
-RUN chmod 500 /etc/nginx/monitor.sh \
- && chmod 500 /etc/nginx/entrypoint.sh \
- && chown nginx:nginx /etc/nginx/monitor.sh \
- && chown nginx:nginx /etc/nginx/entrypoint.sh
-
-EXPOSE 8080
-
-USER nginx
-
-ENTRYPOINT ["/etc/nginx/entrypoint.sh"]
-
diff --git a/deploy/entrypoint.sh b/deploy/entrypoint.sh
deleted file mode 100644
index d72cb306899d5bffd224ba119f20584b3ddcada1..0000000000000000000000000000000000000000
--- a/deploy/entrypoint.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-bash /etc/nginx/monitor.sh $DET_URL $DST_PATH &
-/usr/share/nginx/sbin/nginx -g 'daemon off;'
\ No newline at end of file
diff --git a/deploy/monitor.sh b/deploy/monitor.sh
deleted file mode 100644
index 1597f12a3bc3aad4c15928870252e9ca41420ca4..0000000000000000000000000000000000000000
--- a/deploy/monitor.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-# this script is for website monitoring,
-# when website is up, delete all cert file.
-
-HOST=$1
-DST_PATH=$2
-
-delete_file() {
- if [ -d $DST_PATH ]; then
- echo "found $DST_PATH" > /dev/stdout
- rm -rf $DST_PATH/*
- else
- echo "$DST_PATH not found" > /dev/stdout
- fi
-}
-
-while true;
-do
- sleep 20
- RET=$(curl -sIL -w "%{http_code}\n" -o /dev/null $HOST)
- if [ $RET == "200" ]; then
- echo "website is up!!!" > /dev/stdout
- delete_file
- if [ $? -eq 0 ]; then
- echo "successful delete file, exit" > /dev/stdout
- break
- else
- echo "failed to delete file" > /dev/stdout
- fi
- else
- echo "waiting for website up, http_status: $RET" > /dev/stdout
- fi
-done
\ No newline at end of file
diff --git a/deploy/nginx/nginx-pro.conf b/deploy/nginx/nginx-pro.conf
deleted file mode 100644
index b5c753620b49ffea31274f77f6ceb7720adeb02f..0000000000000000000000000000000000000000
--- a/deploy/nginx/nginx-pro.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-location ^~ /api-id/ {
- proxy_set_header X-Forwarded-For $http_x_real_ip;
- add_header X-XSS-Protection "1; mode=block";
- add_header X-Frame-Options DENY;
- add_header X-Content-Type-Options nosniff;
- add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
- add_header Content-Security-Policy "script-src 'self'; object-src 'none'; frame-src 'none'";
- add_header Cache-Control "no-cache,no-store,must-revalidate";
- add_header Pragma no-cache;
- add_header Expires 0;
-
- proxy_pass https://omapi.osinfra.cn/;
-}
diff --git a/deploy/nginx/nginx-test.conf b/deploy/nginx/nginx-test.conf
deleted file mode 100644
index 8a0642308f2063fe7c78c1d76ba4c584207710ef..0000000000000000000000000000000000000000
--- a/deploy/nginx/nginx-test.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-location ^~ /api-search/ {
- add_header X-XSS-Protection "1; mode=block";
- add_header X-Frame-Options DENY;
- add_header X-Content-Type-Options nosniff;
- add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
- add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval' ; object-src 'none'; frame-src 'none'";
- add_header Cache-Control "no-cache,no-store,must-revalidate";
- add_header Pragma no-cache;
- add_header Expires 0;
-
- proxy_set_header X-Forwarded-For $http_x_real_ip;
- proxy_http_version 1.1;
- proxy_set_header Connection "";
- proxy_ssl_protocols TLSv1.2 TLSv1.3;
- proxy_pass https://doc-search.test.osinfra.cn/;
-}
-
-location ^~ /api-id/ {
- proxy_set_header X-Forwarded-For $http_x_real_ip;
- add_header X-XSS-Protection "1; mode=block";
- add_header X-Frame-Options DENY;
- add_header X-Content-Type-Options nosniff;
- add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
- add_header Content-Security-Policy "script-src 'self'; object-src 'none'; frame-src 'none'";
- add_header Cache-Control "no-cache,no-store,must-revalidate";
- add_header Pragma no-cache;
- add_header Expires 0;
-
- proxy_pass https://omapi.test.osinfra.cn/;
-}
diff --git a/deploy/nginx/nginx.conf b/deploy/nginx/nginx.conf
deleted file mode 100644
index 224f56ff7a813d926ed1526bf86506586202d99a..0000000000000000000000000000000000000000
--- a/deploy/nginx/nginx.conf
+++ /dev/null
@@ -1,145 +0,0 @@
-user $NGINX_USER;
-
-error_log /dev/stdout info;
-
-pid /var/run/nginx.pid;
-
-worker_processes 2;
-worker_rlimit_nofile 4096;
-events {
- use epoll;
- worker_connections 1024;
-}
-
-http {
- include /etc/nginx/mime.types;
-
- log_format main '[$time_local] remote_addr: $http_x_real_ip, request: "$request", '
- 'status: $status, body_bytes_sent: $body_bytes_sent, http_referer: "$http_referer", '
- 'http_user_agent: "$http_user_agent"';
-
- access_log /dev/stdout main;
-
- server_tokens off;
-
- autoindex off;
-
- port_in_redirect off;
- absolute_redirect off;
-
- client_header_buffer_size 1k;
- large_client_header_buffers 4 8k;
- client_body_buffer_size 1K;
- client_max_body_size 1k;
-
- client_header_timeout 8;
- client_body_timeout 8;
- client_body_in_file_only off;
-
- keepalive_timeout 5 5;
- send_timeout 8;
-
- proxy_hide_header X-Powered-By;
- proxy_request_buffering off;
-
- limit_conn_zone $binary_remote_addr zone=limitperip:10m;
- limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=1000r/s;
-
- gzip on;
- gzip_min_length 1k;
- gzip_buffers 4 16k;
- gzip_comp_level 5;
- gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript application/x-httpd-php application/json;
- gzip_vary on;
-
- server {
- listen 8080 ssl default_server;
- server_name openeuler-docs.test.osinfra.cn;
- charset utf-8;
-
- add_header X-XSS-Protection "1; mode=block";
- add_header X-Frame-Options DENY;
- add_header X-Content-Type-Options nosniff;
- add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
- add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://hm.baidu.com/; object-src 'none'; frame-src 'none'";
- add_header Cache-Control "no-cache,no-store,must-revalidate";
- add_header Pragma no-cache;
- add_header Expires 0;
-
- limit_conn limitperip 10;
- ssl_session_tickets off;
- ssl_session_timeout 5m;
- ssl_session_cache shared:SSL:10m;
-
- ssl_certificate "cert/server.crt";
- ssl_certificate_key "cert/server.key";
- ssl_password_file "cert/abc.txt";
- ssl_dhparam "cert/dhparam.pem";
- ssl_ecdh_curve auto;
- ssl_protocols TLSv1.2;
- ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384";
- ssl_prefer_server_ciphers on;
- ssl_stapling on;
- ssl_stapling_verify on;
- resolver 8.8.8.8 8.8.4.4 valid=60s;
- resolver_timeout 5s;
-
- if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE)$) {
- return 444;
- }
-
- location ~ /\. {
- deny all;
- return 404;
- }
-
- location / {
- limit_req zone=ratelimit burst=5 nodelay;
- proxy_set_header X-Forwarded-For $http_x_real_ip;
- proxy_set_header Host $host;
- root /usr/share/nginx/www;
- index index.html;
- }
-
- include ./confd/nginx*.conf;
-
- error_page 401 402 403 405 406 407 413 414 /error.html;
- error_page 500 501 502 503 504 505 /error.html;
- error_page 404 /404.html;
-
- location = /error.html {
- root /usr/share/nginx/www;
- }
-
- location = / {
- return 301 /index.html;
- }
-
- location = /zh/ {
- return 301 /zh/index.html;
- }
-
- # location ^~ /zh/docs/22.03/ {
- # proxy_set_header X-Forwarded-For $http_x_real_ip;
- # proxy_http_version 1.1;
- # proxy_set_header Connection "";
- # proxy_ssl_protocols TLSv1.3;
- # proxy_ssl_verify off;
- # # 转发后移除前缀
- # rewrite ^/zh/docs/22.03(/.*)$ $1 break;
- # proxy_pass http://openeuler-docs-website-stable-2203.openeuler-website-docs:8080;
- # }
-
- # location ^~ /zh/docs/23.03/ {
- # proxy_set_header X-Forwarded-For $http_x_real_ip;
- # proxy_http_version 1.1;
- # proxy_set_header Connection "";
- # proxy_ssl_protocols TLSv1.3;
- # proxy_ssl_verify off;
- # # 转发后移除前缀
- # rewrite ^/zh/docs/23.03(/.*)$ $1 break;
- # proxy_pass http://openeuler-docs-website-stable-2303.openeuler-website-docs:8080;
- # }
-
- }
-}
\ No newline at end of file
diff --git a/docs/.env.development b/docs/.env.development
deleted file mode 100644
index 90d523f5a262f7ab1e448529cfa232203e802c39..0000000000000000000000000000000000000000
--- a/docs/.env.development
+++ /dev/null
@@ -1,3 +0,0 @@
-VITE_XSRF_COOKIE_NAME = '_U_T_'
-VITE_XSRF_HEADER_NAME = 'Token'
-VITE_COOKIE_DOMAIN = localhost
\ No newline at end of file
diff --git a/docs/.env.production b/docs/.env.production
deleted file mode 100644
index 0ab488715f550891fd34930c56de8acb4102c684..0000000000000000000000000000000000000000
--- a/docs/.env.production
+++ /dev/null
@@ -1,5 +0,0 @@
-VITE_LOGIN_URL = https://id.openeuler.org
-VITE_XSRF_COOKIE_NAME = '_U_T_'
-VITE_XSRF_HEADER_NAME = 'Token'
-VITE_COOKIE_DOMAIN = .openeuler.org
-VITE_MESSAGE_CENTER_URL = https://message-center.openeuler.org
diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts
deleted file mode 100644
index a4317ff5d63a052e1e6ddf1f28581109d9bc8029..0000000000000000000000000000000000000000
--- a/docs/.vitepress/config.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import hljs from 'highlight.js';
-
-export default {
- base: '/',
- cleanUrls: false,
- ignoreDeadLinks: true,
- title: '文档 | openEuler',
- srcExclude: ['**/_menu.md'],
- head: [
- [
- 'link',
- {
- rel: 'icon',
- href: '/favicon.ico?v=2',
- },
- ],
- [
- 'meta',
- {
- name: 'viewport',
- content: 'width=device-width,initial-scale=1,user-scalable=no',
- },
- ],
- [
- 'script',
- {
- src: '/check-dark-mode-v2.js',
- },
- ],
- ],
- appearance: false, // enable dynamic scripts for dark mode
- titleTemplate: true,
- locales: {
- root: {
- lang: 'zh',
- title: '文档 | openEuler',
- description: 'openEuler 文档',
- },
- zh: {
- label: '简体中文',
- lang: 'zh',
- title: '文档 | openEuler',
- description: 'openEuler 文档',
- },
- en: {
- label: 'English',
- lang: 'en',
- title: 'Docs | openEuler',
- description: 'openEuler docs',
- },
- },
- markdown: {
- math: true,
- plantuml: true,
- highlight: (code: string, lang: string) => {
- try {
- return `
${
- lang && hljs.getLanguage(lang)
- ? hljs.highlight(code, {
- language: lang === 'shell' ? 'bash' : lang,
- }).value
- : hljs.highlightAuto(code).value
- }
`;
- } catch {
- return `${code}
`;
- }
- },
- config: (md) => {
- md.renderer.rules.code_inline = (tokens, idx) => {
- const content = tokens[idx].content;
- // 转义
- const escapedContent = md.utils.escapeHtml(content);
- // 处理双花括号
- return `${escapedContent}
`;
- };
-
- // 替换 {{ }} 内容
- md.renderer.rules.text = (tokens, idx) => {
- const content = tokens[idx].content;
- const escapedContent = md.utils.escapeHtml(content);
- if (/{{(.*?)}}/g.test(content)) {
- return `${escapedContent} `;
- }
- return escapedContent;
- };
- },
- },
-};
diff --git a/docs/.vitepress/public/check-dark-mode-v2.js b/docs/.vitepress/public/check-dark-mode-v2.js
deleted file mode 100644
index 81dad744f19debdc73dfcae3c8ec3b8b69eddc35..0000000000000000000000000000000000000000
--- a/docs/.vitepress/public/check-dark-mode-v2.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function getCookie(key) {
- const name = `${encodeURIComponent(key)}=`;
- const decodedCookies = decodeURIComponent(document.cookie);
- const cookies = decodedCookies.split('; ');
- for (let cookie of cookies) {
- if (cookie.startsWith(name)) {
- return cookie.substring(name.length);
- }
- }
-
- return null;
-}
-
-const e = getCookie('openEuler-theme-appearance') || 'auto';
-const a = window.matchMedia('(prefers-color-scheme: dark)').matches;
-if (!e || e === 'auto' ? a : e === 'dark') {
- document.documentElement.classList.add('dark');
- document.documentElement.setAttribute('data-o-theme', 'dark');
-}
diff --git a/docs/.vitepress/public/error.html b/docs/.vitepress/public/error.html
deleted file mode 100644
index 7dacb97273f024007ceecac80ab8e33925e51fe2..0000000000000000000000000000000000000000
--- a/docs/.vitepress/public/error.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
Error
-
-
-
diff --git a/docs/.vitepress/public/favicon.ico b/docs/.vitepress/public/favicon.ico
deleted file mode 100644
index ba6134a0ab94b8dd83d098e059d3c4dd93dd1041..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/public/favicon.ico and /dev/null differ
diff --git a/docs/.vitepress/src/@types/type-doc-menu.ts b/docs/.vitepress/src/@types/type-doc-menu.ts
deleted file mode 100644
index 86a39eb82b6107f4a5853963f987dd7d6175b818..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/@types/type-doc-menu.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-export interface DocMenuT {
- id: string;
- label: string;
- href?: string;
- description?: string;
- type: string;
- ismanual?: string;
- children?: Array;
-}
diff --git a/docs/.vitepress/src/@types/type-docs.ts b/docs/.vitepress/src/@types/type-docs.ts
deleted file mode 100644
index 21451f578197ba540e0a55f430347a2c988bf1d6..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/@types/type-docs.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-// 文档捉虫参数类型
-export interface DocsBugParamsT {
- bugDocFragment: string; // bug文档片段
- existProblem: []; // 问题类型
- problemDetail: string; // 问题类型原因
- comprehensiveSatisfication: string; // 文档满意度
- email: string; // 邮箱
- link: string; // 当前url
-}
diff --git a/docs/.vitepress/src/@types/type-locale.ts b/docs/.vitepress/src/@types/type-locale.ts
deleted file mode 100644
index b166a3d425d02a1cbcceff3efc38215bc20413df..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/@types/type-locale.ts
+++ /dev/null
@@ -1 +0,0 @@
-export type LocaleT = 'zh' | 'en';
diff --git a/docs/.vitepress/src/@types/type-search.ts b/docs/.vitepress/src/@types/type-search.ts
deleted file mode 100644
index 0d7f315f0f0adb6d7cbdefd1ee3de8cb590244af..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/@types/type-search.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import type { DocMenuNodeT } from '@/utils/tree';
-
-export interface SearchRecommendT {
- key: string;
- count: number;
-}
-
-// 文档搜索参数
-export interface SearchDocQueryT {
- keyword: string;
- lang: string;
- page: number;
- version: string;
- path: string;
-}
-
-// 文档搜索结果
-export interface SearchDocItemT {
- articleName: string;
- lang: string;
- path: string;
- score: number;
- textContent: string;
- title: string;
- type: string;
- version: string;
- sourceData: DocMenuNodeT[];
-}
diff --git a/docs/.vitepress/src/@types/type-user.ts b/docs/.vitepress/src/@types/type-user.ts
deleted file mode 100644
index 190529e137399b01ebd44c539473263b6e07048e..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/@types/type-user.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-export interface Identity {
- login_name: string;
- userIdInIdp: string;
- identity: string; // 第三方平台类型,gitee/github
- user_name: string;
- accessToken: string;
-}
-
-// 用户账号数据类型
-export interface UserInfoT {
- photo: string; // 头像
- username: string; // 用户名
- email: string; // 邮箱
- phoneCountryCode: string; // 区号
- phone: string; // 手机号
- identities: Identity[]; // 绑定的第三方平台账号
- recipientId?: number; // 接收人id
-}
diff --git a/docs/.vitepress/src/App.vue b/docs/.vitepress/src/App.vue
deleted file mode 100644
index f6046c50e575bb3feb8fbf58a37b1966029884e8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/App.vue
+++ /dev/null
@@ -1,154 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/NotFound.vue b/docs/.vitepress/src/NotFound.vue
deleted file mode 100644
index 353acfed55d919918dcdc5903bbb90fe9a868d9a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/NotFound.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ t('common.empty') }}
-
- {{ t('common.returnHome') }}
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/api/api-docs.ts b/docs/.vitepress/src/api/api-docs.ts
deleted file mode 100644
index 81c8cd37c7576824df368423611decaba61cfb1b..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/api/api-docs.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { request } from '@/shared/axios';
-
-import type { DocsBugParamsT } from '@/@types/type-docs';
-
-/**
- * 文档捉虫
- * @param {string} lang 语言
- * @param { DocsBugParamsT } params 文档捉虫参数类型
- */
-export function submitBug(lang: string, params: DocsBugParamsT) {
- const url = `/api-dsapi/query/add/bugquestionnaire?community=openeuler&lang=${lang}`;
- return request.post(url, params).then((res) => {
- return res.data;
- });
-}
diff --git a/docs/.vitepress/src/api/api-search.ts b/docs/.vitepress/src/api/api-search.ts
deleted file mode 100644
index 905cc4b5d2e7337e80e004a3ceec8d5b9cbb1125..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/api/api-search.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { request } from '@/shared/axios';
-import type { AxiosResponse } from '@/shared/axios';
-
-import type { SearchRecommendT, SearchDocQueryT } from '@/@types/type-search';
-
-/**
- * 获取热门搜索数据
- * @param {String} params 语言
- * @returns {Object}
- */
-export function getPop(params: string): Promise<{
- msg: string;
- obj: string[];
- status: number;
-}> {
- const url = `/api-search/search/pop?${params}`;
- return request
- .post(
- url,
- // TODO: 取消手动添加请求头
- {},
- {
- headers: {
- 'Content-Type': 'application/json;charset=UTF-8',
- },
- }
- )
- .then((res: AxiosResponse) => res.data);
-}
-
-/**
- * 关联搜索
- * @param {Object} params 申请表格数据
- * @return {Object}
- */
-export function getSearchRecommend(params: { query: string }): Promise<{
- status: number;
- obj: {
- word: SearchRecommendT[];
- };
- msg: string;
-}> {
- const url = `/api-search/search/word?query=${params.query}`;
- return request.post(url, params).then((res: AxiosResponse) => res.data);
-}
-
-/**
- * 获取文档搜索结果
- * @param {SearchDocQueryT} params 搜索参数对象
- * @returns {Promise} 搜索结果
- */
-export function getSearchDocs(params: SearchDocQueryT) {
- const url = '/api-search/search/sort/docs';
- return request.post(url, params).then((res: AxiosResponse) => res.data);
-}
diff --git a/docs/.vitepress/src/api/api-user.ts b/docs/.vitepress/src/api/api-user.ts
deleted file mode 100644
index ca328fc2347c1c695be2f2de26b97a3f3d222026..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/api/api-user.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import type { UserInfoT } from '@/@types/type-user';
-import { request } from '@/shared/axios';
-
-interface UserPermissionResponseT {
- msg: string;
- code: number;
- data: UserInfoT;
-}
-
-/**
- * 获取用户信息
- * @param community community字段,默认openeuler
- * @returns {Promise} 用户信息
- */
-export function queryUserInfo() {
- const url = '/api-id/oneid/personal/center/user?community=openeuler';
- return request.get(url).then((res) => res.data.data);
-}
diff --git a/docs/.vitepress/src/assets/category/common/404-dark.png b/docs/.vitepress/src/assets/category/common/404-dark.png
deleted file mode 100644
index 43c80e1785f6d378f91123da426643f4adebd906..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/common/404-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/common/404.png b/docs/.vitepress/src/assets/category/common/404.png
deleted file mode 100644
index 9649a1b3b9e05a9f3c3d4dd9e3d452ee4114e6f7..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/common/404.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/common/menu-switch-bar.png b/docs/.vitepress/src/assets/category/common/menu-switch-bar.png
deleted file mode 100644
index 1e5c278279f7842abccf572b7248a0ebfe40a8bd..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/common/menu-switch-bar.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/float/bug-bg-hover.png b/docs/.vitepress/src/assets/category/float/bug-bg-hover.png
deleted file mode 100644
index e8d115425299e0996b5dbc637028d38e4c6bc079..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/float/bug-bg-hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/float/bug-bg.png b/docs/.vitepress/src/assets/category/float/bug-bg.png
deleted file mode 100644
index 2ba900e87f7674406ad1f6c0226201adce746d9e..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/float/bug-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/atom-logo.png b/docs/.vitepress/src/assets/category/footer/atom-logo.png
deleted file mode 100644
index 25020b8000b592158a67aaf2bd037aca456e6c38..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/atom-logo.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/atom-logo.svg b/docs/.vitepress/src/assets/category/footer/atom-logo.svg
deleted file mode 100644
index 0cce03d0379659ecc5f3ec9113f747633ec0f287..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/footer/atom-logo.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
- 开放原子开源基金会
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/category/footer/bilibili.png b/docs/.vitepress/src/assets/category/footer/bilibili.png
deleted file mode 100644
index 67564c13dddf56675372f9afe99d74912fa5bd03..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/bilibili.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/bilibili_hover.png b/docs/.vitepress/src/assets/category/footer/bilibili_hover.png
deleted file mode 100644
index 20220194f36f19869379bc0f2b0959d6c0e6cfb0..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/bilibili_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/code-xzs.png b/docs/.vitepress/src/assets/category/footer/code-xzs.png
deleted file mode 100644
index 59d055ddde86c889778e185e8408b00c177be395..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/code-xzs.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/code-zgz-2.png b/docs/.vitepress/src/assets/category/footer/code-zgz-2.png
deleted file mode 100644
index aa2dd38c71886d16d71600823cac0249e61bef84..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/code-zgz-2.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/code-zgz.jpg b/docs/.vitepress/src/assets/category/footer/code-zgz.jpg
deleted file mode 100644
index ba027341b3cdd608e12491ee13715ab8011200e3..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/code-zgz.jpg and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/code-zgz.png b/docs/.vitepress/src/assets/category/footer/code-zgz.png
deleted file mode 100644
index aa2dd38c71886d16d71600823cac0249e61bef84..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/code-zgz.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/csdn.png b/docs/.vitepress/src/assets/category/footer/csdn.png
deleted file mode 100644
index 86de6f91345e5e74b0cfdca4baecdb9dc4fca77b..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/csdn.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/csdn_hover.png b/docs/.vitepress/src/assets/category/footer/csdn_hover.png
deleted file mode 100644
index aafd561b925f62a5ad024557765dff039b465c1f..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/csdn_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/footer-bg-mo.png b/docs/.vitepress/src/assets/category/footer/footer-bg-mo.png
deleted file mode 100644
index 972a780e9762ddcf688c24e6a4a0c238b21cf787..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/footer-bg-mo.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/footer-bg.png b/docs/.vitepress/src/assets/category/footer/footer-bg.png
deleted file mode 100644
index 4896c76cce60fa88a97e879319da6a54b6c42267..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/footer-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/footer-bg1.png b/docs/.vitepress/src/assets/category/footer/footer-bg1.png
deleted file mode 100644
index 3c5ab6b54ecdfaa4a1e7d2152d2c59b1b7e9063d..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/footer-bg1.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/footer-logo1.png b/docs/.vitepress/src/assets/category/footer/footer-logo1.png
deleted file mode 100644
index 80f97536b255acb11f11412c2ee3b3a836e21a43..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/footer-logo1.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/footer-logo2.png b/docs/.vitepress/src/assets/category/footer/footer-logo2.png
deleted file mode 100644
index 723cc97315cde70c4aebae844d92be9d0b1b834f..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/footer-logo2.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/img-gzh.png b/docs/.vitepress/src/assets/category/footer/img-gzh.png
deleted file mode 100644
index afc3f345e603e73aa297c656ee2e15b085945b18..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/img-gzh.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/img-xzs.png b/docs/.vitepress/src/assets/category/footer/img-xzs.png
deleted file mode 100644
index de17acbd32440e608d227645a2d9b4425cb0bda8..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/img-xzs.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/infoq.png b/docs/.vitepress/src/assets/category/footer/infoq.png
deleted file mode 100644
index ec5facd385627659b8f38e9cb0438fc5e0c72a08..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/infoq.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/juejin.png b/docs/.vitepress/src/assets/category/footer/juejin.png
deleted file mode 100644
index 9a6e4077a16d68b3c4652bd2f8d403313cfc0766..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/juejin.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/juejin_hover.png b/docs/.vitepress/src/assets/category/footer/juejin_hover.png
deleted file mode 100644
index 862d71f5f42dbea37ac5c78b2103840717f15401..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/juejin_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/linkdin.png b/docs/.vitepress/src/assets/category/footer/linkdin.png
deleted file mode 100644
index 0968f473516e7777494fdb34330796b85ea3a0f4..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/linkdin.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/linkdin_hover.png b/docs/.vitepress/src/assets/category/footer/linkdin_hover.png
deleted file mode 100644
index 4b29a86c1a3b8f41bb171f7f8e51564c8c0b8016..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/linkdin_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/oschina.png b/docs/.vitepress/src/assets/category/footer/oschina.png
deleted file mode 100644
index 47804ca220039e4d5a540981ecc31819ecb9a990..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/oschina.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/oschina_hover.png b/docs/.vitepress/src/assets/category/footer/oschina_hover.png
deleted file mode 100644
index add919f03d2626328dbf8d70daea7bceea8dac1d..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/oschina_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/reddit-square.png b/docs/.vitepress/src/assets/category/footer/reddit-square.png
deleted file mode 100644
index 6e88e30532053bdba3048da08d31ac0c174bbf91..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/reddit-square.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/reddit-square_hover.png b/docs/.vitepress/src/assets/category/footer/reddit-square_hover.png
deleted file mode 100644
index fc9624a40d53572da544e544205f57bbe32af401..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/reddit-square_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-chat.svg b/docs/.vitepress/src/assets/category/footer/svg-icons/icon-chat.svg
deleted file mode 100644
index b4ca3738785b1d4cec20424310917664a7383b0c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-chat.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_dark.svg b/docs/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_dark.svg
deleted file mode 100644
index cd0a77287b9ee0c5176f1378780efe4570b8f39f..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_dark.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_light.svg b/docs/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_light.svg
deleted file mode 100644
index 3374a009b0d71eda341b57ee2c408dc643215526..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-quickissue_light.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-smile.svg b/docs/.vitepress/src/assets/category/footer/svg-icons/icon-smile.svg
deleted file mode 100644
index f5ecc9acde935861025708ce60055ffb69a53dc7..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/footer/svg-icons/icon-smile.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/category/footer/toutiao.png b/docs/.vitepress/src/assets/category/footer/toutiao.png
deleted file mode 100644
index 67a2e929bc26cccb97dabd567fbc8b8775dd792e..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/toutiao.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/toutiao_hover.png b/docs/.vitepress/src/assets/category/footer/toutiao_hover.png
deleted file mode 100644
index 3a5379ab6531fc1f7b2fa36d87766de7695b9a87..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/toutiao_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/x.png b/docs/.vitepress/src/assets/category/footer/x.png
deleted file mode 100644
index d7985af63ca3004d74aeab0cacfae7c91102ce15..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/x.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/x_hover.png b/docs/.vitepress/src/assets/category/footer/x_hover.png
deleted file mode 100644
index 05cbf9f8cda7b4bee88a9c6375b01d1bb48d895d..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/x_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/youtube.png b/docs/.vitepress/src/assets/category/footer/youtube.png
deleted file mode 100644
index f43e105129f8da83aebfc1de3da4a373c7c0cc6a..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/youtube.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/footer/youtube_hover.png b/docs/.vitepress/src/assets/category/footer/youtube_hover.png
deleted file mode 100644
index 730a7157ee651431567f580c7ed0312111bdb643..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/footer/youtube_hover.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/header/annual-report-2024.jpg b/docs/.vitepress/src/assets/category/header/annual-report-2024.jpg
deleted file mode 100644
index 9d07341f232ef435c7be48727789d60ee33d82e5..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/header/annual-report-2024.jpg and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/header/logo.svg b/docs/.vitepress/src/assets/category/header/logo.svg
deleted file mode 100644
index af74e72eb8319ea4b92aa1467da4ce15766ba0e2..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/header/logo.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/category/header/logo_dark.svg b/docs/.vitepress/src/assets/category/header/logo_dark.svg
deleted file mode 100644
index e27f683229d272a1043b2dc4653d0cd1f9e1f4c9..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/header/logo_dark.svg
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/category/header/nav_background_left.png b/docs/.vitepress/src/assets/category/header/nav_background_left.png
deleted file mode 100644
index f7f8a934fc441ab6c1c50f62479e303404d38a0f..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/header/nav_background_left.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/header/nav_background_right.png b/docs/.vitepress/src/assets/category/header/nav_background_right.png
deleted file mode 100644
index 97ec1491e5a6a050343c357f5decd0d9a3d5a2bf..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/header/nav_background_right.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/header/report.png b/docs/.vitepress/src/assets/category/header/report.png
deleted file mode 100644
index 454118b9c36d41ca2f1b8aa9e0ba35417ce71e4d..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/header/report.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/header/sig.png b/docs/.vitepress/src/assets/category/header/sig.png
deleted file mode 100644
index deb54d4b8c051cddb5ec49a20d17f1015203fdc8..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/header/sig.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/header/summit.png b/docs/.vitepress/src/assets/category/header/summit.png
deleted file mode 100644
index d1a83a0befab7e92155527827b2996445fe63643..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/header/summit.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/cloud-bg.png b/docs/.vitepress/src/assets/category/home/cloud-bg.png
deleted file mode 100644
index 9a9589f9c55249f92c69eac54a61d26c15822a91..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/cloud-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/edge-computing-bg.png b/docs/.vitepress/src/assets/category/home/edge-computing-bg.png
deleted file mode 100644
index b1a708eacda8b68eea5ed25c505c28b60a4d3ba1..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/edge-computing-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/embedded-bg.png b/docs/.vitepress/src/assets/category/home/embedded-bg.png
deleted file mode 100644
index 646afee988b57bcb1f064952d6352ec4efb73644..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/embedded-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/home-banner-dark.png b/docs/.vitepress/src/assets/category/home/home-banner-dark.png
deleted file mode 100644
index a5577c7cfa1b23ff9f4105e527397f7dbb37fae1..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/home-banner-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/home-banner.png b/docs/.vitepress/src/assets/category/home/home-banner.png
deleted file mode 100644
index 38e493a283ab67573b824ef9df52729f4a8d33d6..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/home-banner.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/install-guide-bg-dark.png b/docs/.vitepress/src/assets/category/home/install-guide-bg-dark.png
deleted file mode 100644
index 3ed275d32e81e46123470c4817061362f8946c0a..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/install-guide-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/install-guide-bg.png b/docs/.vitepress/src/assets/category/home/install-guide-bg.png
deleted file mode 100644
index 2c11b03480c35eb2ec9ed209f6fe5e46a5d0f7ec..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/install-guide-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/install-guide-mo-bg.png b/docs/.vitepress/src/assets/category/home/install-guide-mo-bg.png
deleted file mode 100644
index ff42e30277ab93c7434d15e002494b59fc9ab97e..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/install-guide-mo-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/install-mo-bg-dark.png b/docs/.vitepress/src/assets/category/home/install-mo-bg-dark.png
deleted file mode 100644
index 979f2a920d9b0dafd5895250c6c845eebac7e404..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/install-mo-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/qa-bg-dark.png b/docs/.vitepress/src/assets/category/home/qa-bg-dark.png
deleted file mode 100644
index a3285bf61dcf2e05909b4f4ed313c09257c86f34..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/qa-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/qa-bg.png b/docs/.vitepress/src/assets/category/home/qa-bg.png
deleted file mode 100644
index 349fa94d0ea4235c40c7353bae2528be6429ef30..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/qa-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/qa-mo-bg-dark.png b/docs/.vitepress/src/assets/category/home/qa-mo-bg-dark.png
deleted file mode 100644
index f6a64344682fd16a5161f43f55cfa870470afaa7..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/qa-mo-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/qa-mo-bg.png b/docs/.vitepress/src/assets/category/home/qa-mo-bg.png
deleted file mode 100644
index 3a7b87d4f14f284505f42047817ff3227162e8dd..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/qa-mo-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/server-bg.png b/docs/.vitepress/src/assets/category/home/server-bg.png
deleted file mode 100644
index 7a92ccfeaa7f6d875706816176e97fa883f08e0e..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/server-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/started-bg-dark.png b/docs/.vitepress/src/assets/category/home/started-bg-dark.png
deleted file mode 100644
index 737cab03621ae3b05d075827ccd107b7dc6f5b94..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/started-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/started-bg.png b/docs/.vitepress/src/assets/category/home/started-bg.png
deleted file mode 100644
index b9959f7da41b0d60b28ca9983a9dd19dc8965a36..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/started-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/started-mo-bg-dark.png b/docs/.vitepress/src/assets/category/home/started-mo-bg-dark.png
deleted file mode 100644
index 3edeabb509dc11b86898dde7ed99ab07db74328b..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/started-mo-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/started-mo-bg.png b/docs/.vitepress/src/assets/category/home/started-mo-bg.png
deleted file mode 100644
index 11dbc204a278b79037fb5c481d697e8c2fd49a6c..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/started-mo-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/svg-icons/cloud.svg b/docs/.vitepress/src/assets/category/home/svg-icons/cloud.svg
deleted file mode 100644
index 9a33cfc1f672081d824a19bd0c2fbee08674fd72..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/home/svg-icons/cloud.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/home/svg-icons/edge-computing.svg b/docs/.vitepress/src/assets/category/home/svg-icons/edge-computing.svg
deleted file mode 100644
index dc314594239dd5a812ea8b059576341d337c28da..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/home/svg-icons/edge-computing.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/home/svg-icons/embedded.svg b/docs/.vitepress/src/assets/category/home/svg-icons/embedded.svg
deleted file mode 100644
index 3e50be90cd181a5a30b8c34454f8db79dc1ce39c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/home/svg-icons/embedded.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/home/svg-icons/server.svg b/docs/.vitepress/src/assets/category/home/svg-icons/server.svg
deleted file mode 100644
index 87433c4c25b20ee953c1a71027bd389665977a80..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/home/svg-icons/server.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/home/svg-icons/virtualization.svg b/docs/.vitepress/src/assets/category/home/svg-icons/virtualization.svg
deleted file mode 100644
index b994926478f883206645ad3371f6d92b48d5d1a2..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/category/home/svg-icons/virtualization.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/docs/.vitepress/src/assets/category/home/virtualization-bg.png b/docs/.vitepress/src/assets/category/home/virtualization-bg.png
deleted file mode 100644
index e5fb2c233ec151e41ffae3256fdf2e4db4b8ac55..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/virtualization-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/x2-bg-dark.png b/docs/.vitepress/src/assets/category/home/x2-bg-dark.png
deleted file mode 100644
index 553d0c58ab372b61f0146e9e9635990656ff35d2..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/x2-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/x2-bg.png b/docs/.vitepress/src/assets/category/home/x2-bg.png
deleted file mode 100644
index 9121ff486e4a0dce1c3a8a174a060f75f752c83e..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/x2-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/x2-mo-bg-dark.png b/docs/.vitepress/src/assets/category/home/x2-mo-bg-dark.png
deleted file mode 100644
index 4389369086d138a57e0f40a20c91aae3bb4d359f..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/x2-mo-bg-dark.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/category/home/x2-mo-bg.png b/docs/.vitepress/src/assets/category/home/x2-mo-bg.png
deleted file mode 100644
index 4c06aec0fc08d3d94deb617592fa32963e9a0f2d..0000000000000000000000000000000000000000
Binary files a/docs/.vitepress/src/assets/category/home/x2-mo-bg.png and /dev/null differ
diff --git a/docs/.vitepress/src/assets/style/base.scss b/docs/.vitepress/src/assets/style/base.scss
deleted file mode 100644
index ff70ca7170369270714bbc66b46c36a1c28650da..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/base.scss
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * base
- */
-html,
-body {
- margin: 0;
- padding: 0;
- -webkit-text-size-adjust: none;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
- scroll-behavior: smooth;
- box-sizing: border-box;
- font-family: 'PingFang SC', 'Microsoft YaHei', 'Helvetica', 'Arial', sans-serif;
- height: 100%;
- background: var(--o-color-fill2);
- @include text1;
- @include scrollbar;
-}
-
-*,
-:after,
-:before {
- box-sizing: inherit;
- margin: 0;
- padding: 0;
-}
-
-img {
- vertical-align: top;
-}
-
-[tabindex] {
- outline: none;
-}
-
-a {
- cursor: pointer;
- color: var(--o-color-link1);
- text-decoration: none;
- &:hover {
- @include respond-to('>phone') {
- color: var(--o-color-link2);
- }
- }
- &:active {
- @include respond-to('>phone') {
- color: var(--o-color-link3);
- }
- }
-}
-
-blockquote,
-figure,
-form,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p {
- margin: 0;
-}
-dd,
-dl,
-li,
-ol,
-ul {
- margin: 0;
- padding: 0;
-}
-
-ol,
-ul {
- list-style: none outside none;
-}
-
-button,
-input,
-optgroup,
-section,
-textarea {
- font-family: inherit;
- font-size: 100%;
- line-height: 1.15;
- margin: 0;
- @include scrollbar;
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/index.scss b/docs/.vitepress/src/assets/style/element-plus/index.scss
deleted file mode 100644
index 71118eb6ad131f274505be51851256ace728c3cc..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/index.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-@use './input.scss' as *;
-@use './pagination.scss' as *;
-@use './popper.scss' as *;
-@use './select.scss' as *;
-@use './table.scss' as *;
-@use './scrollbar.scss' as *;
-@use './slider.scss' as *;
diff --git a/docs/.vitepress/src/assets/style/element-plus/input.scss b/docs/.vitepress/src/assets/style/element-plus/input.scss
deleted file mode 100644
index 924139752653de437385c5d70b7698206c4d853e..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/input.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-.el-input {
- --el-input-text-color: var(--o-color-info2);
- .el-input__wrapper {
- box-shadow: none !important;
- border: 1px solid var(--o-color-control1);
-
- &:hover {
- border-color: var(--o-color-control2);
- }
- &.is-focus {
- box-shadow: none !important;
- border-color: var(--o-color-primary3) !important;
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/pagination.scss b/docs/.vitepress/src/assets/style/element-plus/pagination.scss
deleted file mode 100644
index a7439bf75e13309f3f9fd5c492b5173d8f55d71b..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/pagination.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-.el-pagination {
- --el-pagination-border-radius: 4px;
- --el-pagination-button-bg-color: var(--o-color-fill2);
- --el-disabled-bg-color: var(--o-color-fill2);
- --el-pagination-button-color: var(--o-color-info1);
- .el-pagination__total {
- color: var(--o-color-info2);
- }
- .el-pager {
- li {
- --el-pagination-button-color: var(--o-color-info1);
- &:hover {
- background-color: var(--o-color-primary2);
- color: var(--o-color-white);
- }
- }
- }
- .el-pagination__jump {
- color: var(--o-color-info2);
- }
- .btn-prev,
- .btn-next {
- border: 1px solid var(--o-color-control1);
- &:hover {
- border-color: var(--o-color-control2);
- }
- .el-icon {
- font-size: 18px;
- }
- &:disabled {
- border-color: var(--o-color-control1-light);
- }
- &:focus {
- border-color: var(--o-color-primary3) !important;
- }
- }
-}
-.el-input__wrapper {
- box-shadow: none !important;
- border: 1px solid var(--o-color-control1);
- background-color: var(--o-color-fill2);
- --el-disabled-bg-color: var(--o-color-fill2);
- --el-pagination-button-color: var(--o-color-info1);
- &:hover {
- border-color: var(--o-color-control2);
- }
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/popper.scss b/docs/.vitepress/src/assets/style/element-plus/popper.scss
deleted file mode 100644
index bdbe23c956b26bee822ab2a3119c59fcb1772538..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/popper.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-.el-popper {
- --el-bg-color-overlay: var(--o-color-fill2);
- --el-border-color-light: var(--o-color-control1);
- margin: -7px 0 0;
- .el-popper__arrow {
- display: none;
- }
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/scrollbar.scss b/docs/.vitepress/src/assets/style/element-plus/scrollbar.scss
deleted file mode 100644
index e4f6528641637fc77379c8f057fb15878e3721b1..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/scrollbar.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-div.el-scrollbar {
- --el-scrollbar-bg-color: var(--o-color-control1);
- --el-scrollbar-hover-bg-color: var(--o-color-control2);
- --el-scrollbar-opacity: 1;
- --el-scrollbar-hover-opacity: 1;
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/select.scss b/docs/.vitepress/src/assets/style/element-plus/select.scss
deleted file mode 100644
index ecfe124ce0524303545059e5987a68224eaeee98..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/select.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-.el-select {
- .el-input {
- &.is-focus {
- .el-input__wrapper {
- box-shadow: none !important;
- }
- }
- }
-}
-
-.el-select-dropdown {
- .el-select-dropdown__item {
- color: var(--o-color-info2);
- &:hover,
- &.hover {
- background-color: var(--o-color-control2-light) !important;
- }
- &.selected {
- background-color: var(--o-color-control3-light) !important;
- color: var(--o-color-info1);
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/slider.scss b/docs/.vitepress/src/assets/style/element-plus/slider.scss
deleted file mode 100644
index b696a1536aad10c055a528524f4993e798aad34f..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/slider.scss
+++ /dev/null
@@ -1,98 +0,0 @@
-@use '@/assets/style/mixin/screen.scss' as *;
-@use '@/assets/style/mixin/font.scss' as *;
-
-.el-slider {
- --el-slider-height: 8px;
- --el-slider-border-radius: 8px;
- --el-slider-button-wrapper-offset: -13px;
- --el-slider-runway-bg-color: var(--o-color-fill1);
-
- height: 8px;
- padding-left: 4px;
- @include respond-to('<=pad_v') {
- --el-slider-height: 12px;
- --el-slider-border-radius: 12px;
-
- padding: 0 4px;
- height: 12px;
- }
-
- .el-slider__bar {
- --el-slider-height: 10px;
-
- background: linear-gradient(90deg, #07caff 0%, #5882ff 100%);
- top: -1px;
- left: -4px !important;
- @include respond-to('<=pad_v') {
- --el-slider-height: 16px;
-
- top: -2px;
- }
- }
-
- .el-slider__button-wrapper + div {
- transform: translateY(2px);
- position: relative;
- z-index: 2;
- @include respond-to('<=pad_v') {
- transform: translateY(5px);
- }
-
- & + div {
- transform: translateY(3px);
- @include respond-to('<=pad_v') {
- transform: translateY(4px);
- }
-
- & > .el-slider__stop:nth-of-type(1) {
- transform: translateX(2px);
- }
- }
- }
-
- .el-slider__marks-text {
- opacity: 0;
- margin-top: 0;
- @include respond-to('<=pad_v') {
- opacity: 1;
- top: -48px;
- color: var(--o-color-info1);
- @include text2;
- }
- }
-
- .el-slider__stop {
- width: 2px;
- height: 2px;
- background-color: var(--o-color-info3);
- @include respond-to('<=pad_v') {
- width: 3px;
- height: 3px;
- }
- }
-
- .el-slider__marks-stop {
- background-color: var(--o-color-fill2);
-
- &:last-child {
- transform: translate(-6px, -1px);
- background-color: var(--o-color-info3);
- }
- }
-
- .el-slider__button {
- position: relative;
- box-shadow: var(--o-shadow-1);
- width: 20px;
- height: 20px;
- border: 6px solid var(--o-color-fill2);
- background-color: var(--o-color-link1);
-
- &::after {
- content: '';
- display: inline-block;
- height: 100%;
- vertical-align: middle;
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/table.scss b/docs/.vitepress/src/assets/style/element-plus/table.scss
deleted file mode 100644
index f47cb45cddd0ad6c4c7b322e233bc0fb5c0d9d73..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/table.scss
+++ /dev/null
@@ -1,119 +0,0 @@
-@use '../mixin/font.scss' as *;
-#app .el-table {
- --el-table-header-bg-color: var(--o-color-control3-light);
- --el-table-border-color: var(--o-color-control4);
- --el-table-tr-bg-color: var(--o-color-fill2);
- --el-table-expanded-cell-bg-color: var(--o-color-fill2);
- --el-table-bg-color: var(--o-color-fill2);
- --el-table-row-hover-bg-color: var(--o-color-control2-light);
- border-radius: 4px;
- --el-table-border: 1px solid var(--o-color-control4);
- border-spacing: 0;
- color: var(--o-color-info1);
- @include text1;
- &.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell,
- &.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell {
- border-right: 1px solid transparent !important;
- }
-
- .el-table__row {
- &.hover-row {
- .el-table-fixed-column--left,
- .el-table-fixed-column--right {
- background: var(--el-table-row-hover-bg-color);
- }
- }
- }
- .el-table__cell {
- padding: 12px 0;
- transition: none;
- .cell {
- padding: 0 20px;
- }
- &.el-table-fixed-column--left,
- &.el-table-fixed-column--right {
- background: var(--el-table-tr-bg-color);
- }
- }
-
- thead {
- tr {
- &:first-child {
- th {
- &.el-table__cell {
- &:first-child {
- border-radius: 4px 0 0 0;
- }
- &:last-child {
- border-radius: 0 4px 0 0;
- }
- }
- }
- }
- }
- th {
- font-weight: 500;
- color: var(--o-color-info1);
- border-bottom: 0 none;
- @include text1;
- &.el-table__cell {
- background: var(--el-table-header-bg-color);
-
- &.el-table-fixed-column--left,
- &.el-table-fixed-column--right {
- background: var(--el-table-header-bg-color);
- }
- }
- }
- }
- &.el-table--border {
- &::after,
- &::before {
- display: none;
- }
- }
- tr:last-child {
- td {
- border-bottom: 0;
- &:first-child {
- border-radius: 0 0 0 4px;
- }
- &:last-child {
- border-radius: 0 0 4px 0;
- }
- }
- }
-
- td,
- th:not([rowspan='1']) {
- &:first-child {
- .cell {
- padding-left: 32px !important;
- }
- }
- &:last-child {
- .cell {
- padding-right: 32px !important;
- }
- }
- }
-
- .el-table__expand-icon {
- display: flex;
- align-items: center;
- > .el-icon {
- font-size: 16px;
- color: var(--o-color-info1);
- }
- }
- .el-table__placeholder {
- display: none;
- }
- .el-scrollbar__wrap {
- padding: 1px 0;
- }
-
- .el-table__empty-block {
- min-height: 250px;
- }
-}
diff --git a/docs/.vitepress/src/assets/style/element-plus/var.scss b/docs/.vitepress/src/assets/style/element-plus/var.scss
deleted file mode 100644
index 6c9b005a8646460a407644e0abb70e4f86d3dfa3..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/element-plus/var.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-@forward 'element-plus/theme-chalk/src/common/var.scss' with (
- $colors: (
- 'primary': (
- 'base': #002fa7,
- ),
- 'success': (
- 'base': #82c04d,
- ),
- 'warning': (
- 'base': #f0934b,
- ),
- 'danger': (
- 'base': #f3524d,
- ),
- 'error': (
- 'base': #f3524d,
- ),
- )
-);
diff --git a/docs/.vitepress/src/assets/style/global.scss b/docs/.vitepress/src/assets/style/global.scss
deleted file mode 100644
index a30bb9d5431bf5aa51f7a9fa20cfb7e3f58aa2c8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/global.scss
+++ /dev/null
@@ -1,94 +0,0 @@
-html {
- --layout-pkg-radius: 4px;
-}
-:root {
- --o-radius_control-xs: 4px;
- --o-radius_control-s: 4px;
- --o-radius_control-m: 4px;
- --o-radius_control-l: 4px;
-
- --el-box-shadow-light: var(--o-shadow-2);
- --el-color-primary: var(--o-color-primary1) !important;
-}
-
-// tag
-.tags-box {
- display: flex;
- margin: 12px 0 0;
- :deep(.o-tag-icon) {
- width: 16px;
- height: 16px;
- }
- > a + a {
- margin-left: 8px;
- }
- .o-tag {
- cursor: pointer;
- --tag-padding: 2px 4px;
- --tag-bd-color: var(--o-color-control1-light);
- &.image-icon .o-icon {
- color: #007af0;
- }
- &.epkg-icon .o-icon {
- color: #e00070;
- }
- &.rpm-icon .o-icon {
- color: #00a7b3;
- }
- &:hover {
- --tag-bg-color: var(--o-color-control2-light);
- }
- .o-tag-icon {
- height: 16px;
- }
- svg {
- width: 16px;
- height: 16px;
- color: currentColor;
- }
- }
- .o-tag + .o-tag {
- margin-left: 8px;
- }
-}
-
-.o-icon {
- svg {
- fill: currentColor;
- }
-}
-
-.o-tab-nav-active {
- font-weight: 500;
-}
-
-.o-card-pkg {
- .desc {
- margin-top: 8px;
- color: var(--o-color-info2);
- overflow: hidden;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- position: relative;
- word-break: break-all;
- height: 48px;
- --linear-gradient: var(--o-mixedgray-1);
- &.dark {
- --linear-gradient: var(--o-mixedgray-4);
- }
- @include text1;
- &::after {
- background-image: linear-gradient(90deg, rgba(var(--linear-gradient), 0), rgba(var(--linear-gradient), 0.8) 59%, var(--o-color-control-light) 100%);
- bottom: 0;
- content: '';
- height: 24px;
- pointer-events: none;
- position: absolute;
- right: 0;
- width: 4em;
- }
- span {
- color: var(--o-color-primary1);
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/highlight/atom-one-dark.scss b/docs/.vitepress/src/assets/style/highlight/atom-one-dark.scss
deleted file mode 100644
index 5add95da36e531a9646b27e933ad7c63c429d4f4..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/highlight/atom-one-dark.scss
+++ /dev/null
@@ -1,105 +0,0 @@
-[class='dark'] {
- pre code.hljs {
- display: block;
- overflow-x: auto;
- padding: 1em;
- }
-
- code.hljs {
- padding: 3px 5px;
- }
-
- /*
-
-Atom One Dark by Daniel Gamage
-Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax
-
-base: #282c34
-mono-1: #abb2bf
-mono-2: #818896
-mono-3: #5c6370
-hue-1: #56b6c2
-hue-2: #61aeee
-hue-3: #c678dd
-hue-4: #98c379
-hue-5: #e06c75
-hue-5-2: #be5046
-hue-6: #d19a66
-hue-6-2: #e6c07b
-
-*/
- .hljs {
- color: #abb2bf;
- background: #2b2b2f;
- }
-
- .hljs-comment,
- .hljs-quote {
- color: #5c6370;
- font-style: italic;
- }
-
- .hljs-doctag,
- .hljs-keyword,
- .hljs-formula {
- color: #c678dd;
- }
-
- .hljs-section,
- .hljs-name,
- .hljs-selector-tag,
- .hljs-deletion,
- .hljs-subst {
- color: #e06c75;
- }
-
- .hljs-literal {
- color: #56b6c2;
- }
-
- .hljs-string,
- .hljs-regexp,
- .hljs-addition,
- .hljs-attribute,
- .hljs-meta .hljs-string {
- color: #98c379;
- }
-
- .hljs-attr,
- .hljs-variable,
- .hljs-template-variable,
- .hljs-type,
- .hljs-selector-class,
- .hljs-selector-attr,
- .hljs-selector-pseudo,
- .hljs-number {
- color: #d19a66;
- }
-
- .hljs-symbol,
- .hljs-bullet,
- .hljs-link,
- .hljs-meta,
- .hljs-selector-id,
- .hljs-title {
- color: #61aeee;
- }
-
- .hljs-built_in,
- .hljs-title.class_,
- .hljs-class .hljs-title {
- color: #e6c07b;
- }
-
- .hljs-emphasis {
- font-style: italic;
- }
-
- .hljs-strong {
- font-weight: bold;
- }
-
- .hljs-link {
- text-decoration: underline;
- }
-}
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/style/highlight/atom-one-light.scss b/docs/.vitepress/src/assets/style/highlight/atom-one-light.scss
deleted file mode 100644
index a9c5c2bba06e2a7c59a848dbc507f1a69d6149e3..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/highlight/atom-one-light.scss
+++ /dev/null
@@ -1,103 +0,0 @@
-pre code.hljs {
- display: block;
- overflow-x: auto;
- padding: 1em;
-}
-
-code.hljs {
- padding: 3px 5px;
-}
-
-/*
-
-Atom One Light by Daniel Gamage
-Original One Light Syntax theme from https://github.com/atom/one-light-syntax
-
-base: #fafafa
-mono-1: #383a42
-mono-2: #686b77
-mono-3: #a0a1a7
-hue-1: #0184bb
-hue-2: #4078f2
-hue-3: #a626a4
-hue-4: #50a14f
-hue-5: #e45649
-hue-5-2: #c91243
-hue-6: #986801
-hue-6-2: #c18401
-
-*/
-.hljs {
- color: #383a42;
- background: #f3f3f5;
-}
-
-.hljs-comment,
-.hljs-quote {
- color: #a0a1a7;
- font-style: italic;
-}
-
-.hljs-doctag,
-.hljs-keyword,
-.hljs-formula {
- color: #a626a4;
-}
-
-.hljs-section,
-.hljs-name,
-.hljs-selector-tag,
-.hljs-deletion,
-.hljs-subst {
- color: #e45649;
-}
-
-.hljs-literal {
- color: #0184bb;
-}
-
-.hljs-string,
-.hljs-regexp,
-.hljs-addition,
-.hljs-attribute,
-.hljs-meta .hljs-string {
- color: #50a14f;
-}
-
-.hljs-attr,
-.hljs-variable,
-.hljs-template-variable,
-.hljs-type,
-.hljs-selector-class,
-.hljs-selector-attr,
-.hljs-selector-pseudo,
-.hljs-number {
- color: #986801;
-}
-
-.hljs-symbol,
-.hljs-bullet,
-.hljs-link,
-.hljs-meta,
-.hljs-selector-id,
-.hljs-title {
- color: #4078f2;
-}
-
-.hljs-built_in,
-.hljs-title.class_,
-.hljs-class .hljs-title {
- color: #c18401;
-}
-
-.hljs-emphasis {
- font-style: italic;
-}
-
-.hljs-strong {
- font-weight: bold;
-}
-
-.hljs-link {
- text-decoration: underline;
-}
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/style/highlight/index.scss b/docs/.vitepress/src/assets/style/highlight/index.scss
deleted file mode 100644
index ebc41ab6a58bc1ed468d33e69c1376d3ca2a2acb..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/highlight/index.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import './atom-one-light.scss';
-@import './atom-one-dark.scss';
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/style/markdown.scss b/docs/.vitepress/src/assets/style/markdown.scss
deleted file mode 100644
index 6e3db473fc8043edf817a0bc04bf223b98fbf2c7..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/markdown.scss
+++ /dev/null
@@ -1,326 +0,0 @@
-@use 'github-markdown-css/github-markdown-light.css' as *;
-@use './highlight/index.scss' as *;
-@use './mixin/common.scss' as *;
-
-.markdown-body {
- --o-gap-1: 4px;
- --o-gap-2: 8px;
- --o-gap-3: 12px;
- --o-gap-4: 16px;
- --o-gap-5: 24px;
- --o-gap-6: 32px;
- --o-gap-7: 40px;
-
- @include respond-to('<=laptop') {
- --o-gap-1: 4px;
- --o-gap-2: 8px;
- --o-gap-3: 8px;
- --o-gap-4: 12px;
- --o-gap-5: 16px;
- --o-gap-6: 24px;
- --o-gap-7: 24px;
- }
-
- @include respond-to('<=pad') {
- --o-gap-1: 4px;
- --o-gap-2: 8px;
- --o-gap-3: 8px;
- --o-gap-4: 8px;
- --o-gap-5: 12px;
- --o-gap-6: 16px;
- --o-gap-7: 16px;
- }
-
- @include respond-to('<=pad_v') {
- --o-gap-1: 4px;
- --o-gap-2: 8px;
- --o-gap-3: 8px;
- --o-gap-4: 8px;
- --o-gap-5: 12px;
- --o-gap-6: 16px;
- --o-gap-7: 16px;
- }
-
- @include respond-to('<=phone') {
- --o-gap-1: 4px;
- --o-gap-2: 8px;
- --o-gap-3: 12px;
- --o-gap-4: 16px;
- --o-gap-5: 24px;
- --o-gap-6: 28px;
- --o-gap-7: 12px;
- }
-}
-
-.markdown-body {
- background: var(--o-color-fill2);
- color: var(--o-color-info2);
- font-family: inherit;
- min-height: auto;
- @include text1;
-
- & > div *:first-child {
- margin-top: 0 !important;
- }
-
- div[class*='language-'] {
- position: relative;
- margin-top: var(--o-gap-2);
- }
-
- p {
- margin-top: 0 !important;
- margin-bottom: var(--o-gap-2);
- }
-
- ol {
- list-style-type: decimal !important;
- }
-
- ul {
- list-style-type: disc;
- }
-
- ol,
- ul {
- padding-left: var(--o-gap-5);
- margin-top: var(--o-gap-2);
- }
-
- li + li {
- margin-top: 0;
- }
-
- li li {
- &:first-child {
- margin-top: 8px !important;
- }
- &:last-child {
- margin-bottom: 8px;
- }
- }
-
- h1,
- h2,
- h3,
- h4,
- h5,
- h6 {
- word-break: break-all;
- color: var(--o-color-info1);
- padding: 0;
- border: none;
- font-weight: 500;
- }
-
- h1 {
- @include h2;
- margin-top: calc(var(--o-gap-6));
- margin-bottom: var(--o-gap-6);
- }
-
- h2 {
- @include h4;
- margin-top: calc(var(--o-gap-6));
- margin-bottom: var(--o-gap-3);
- }
-
- h3 {
- @include text2;
- margin-top: var(--o-gap-3);
- margin-bottom: var(--o-gap-3);
- }
-
- h4 {
- @include text1;
- margin-top: var(--o-gap-3);
- margin-bottom: var(--o-gap-3);
- }
-
- hr {
- height: 1px;
- background-color: var(--o-color-control4);
- }
-
- a {
- color: var(--o-color-link1);
-
- @include hover {
- color: var(--o-color-link2);
- }
- }
-
- img {
- border-radius: var(--o-radius-m);
- padding: var(--o-gap-2);
- margin: 0 auto;
- background-color: var(--o-color-fill2);
- margin-left: -8px;
- }
-
- code {
- border-radius: var(--layout-pkg-radius);
- background-color: var(--o-color-control2-light);
- margin: 0 4px;
- }
- p code:first-child {
- margin-left: 0;
- }
-
- blockquote {
- color: var(--o-color-info2);
- padding: 12px 16px;
- margin: var(--o-gap-3) 0;
- border-left: 0;
- background-color: var(--o-color-control2-light);
- border-radius: var(--layout-pkg-radius);
- li {
- margin-top: var(--o-gap-2);
- }
- img {
- padding: 0;
- margin-left: 0;
- background-color: transparent;
- }
- }
-
- pre {
- position: relative;
- border-radius: var(--layout-pkg-radius);
- background-color: var(--o-color-control2-light);
- padding: 0;
- overflow: hidden;
- margin-bottom: var(--o-gap-2);
-
- code {
- display: block;
- overflow-x: auto;
- padding: 16px 36px 16px 16px;
- margin: 0;
- @include scrollbar;
- }
- }
-
- table {
- --table-padding: var(--o-gap-3) var(--o-gap-6);
- --table-radius: var(--layout-pkg-radius);
- border-spacing: 0;
- border-radius: var(--table-radius);
-
- @include respond-to('<=laptop') {
- --table-head-cell-padding: 8px 16px;
- }
-
- @include respond-to('<=pad') {
- --table-head-cell-padding: 9px 12px;
- }
-
- @include respond-to('<=phone') {
- --table-head-cell-padding: 7px 12px;
- }
-
- th {
- background-color: var(--o-color-control3-light);
- text-align: left;
- border-color: var(--o-color-control3-light) !important;
- }
-
- th,
- td {
- box-sizing: border-box;
- padding: var(--table-padding);
- color: var(--o-color-info1);
- border-color: var(--o-color-control4);
- @include text1;
- }
- tr {
- background: var(--o-color-fill2) !important;
- border: 0 !important;
- }
-
- td {
- padding: var(--o-gap-4) var(--o-gap-6);
- box-sizing: border-box;
- }
- * {
- margin-bottom: 0;
- }
- * + * {
- margin-top: var(--o-gap-2);
- }
-
- li {
- &:first-child {
- margin-top: 0 !important;
- }
- &:last-child {
- margin-bottom: 0;
- }
- }
- }
-
- .lang {
- display: none;
- }
-
- .vp-adaptive-theme {
- @include hover {
- .copy {
- opacity: 1;
- }
- }
- @include respond-to('phone') {
- .copy {
- opacity: 1;
- width: 16px;
- height: 16px;
- background-size: 14px;
- }
- }
- }
-
- .copy {
- cursor: pointer;
- position: absolute;
- top: var(--o-gap-4);
- right: var(--o-gap-4);
- z-index: 3;
- border-radius: 4px;
- width: 24px;
- height: 24px;
- background-image: url('@/assets/svg-icons/icon-copy.svg');
- background-position: 50%;
- background-size: 20px;
- background-repeat: no-repeat;
- border: none;
- opacity: 0;
- transition: all var(--o-duration-m1) var(--o-easing-standard-in);
- @include respond-to('phone') {
- top: 4px;
- }
- }
-
- pre.mermaid {
- background-color: transparent;
- }
-
- div.mermaid {
- svg[aria-roledescription="error"] {
- display: none;
- }
- }
-
- .vp-code {
- &.shiki {
- span {
- color: var(--shiki-light, inherit);
- }
- }
- }
-}
-
-@include in-dark {
- .markdown-body img {
- @include img-in-dark;
- }
-}
diff --git a/docs/.vitepress/src/assets/style/mixin/common.scss b/docs/.vitepress/src/assets/style/mixin/common.scss
deleted file mode 100644
index b3435e070ca02f05f75124c5111962db6bb9a4f9..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/mixin/common.scss
+++ /dev/null
@@ -1,65 +0,0 @@
-@use '@/assets/style/mixin/screen.scss' as *;
-
-@mixin in-dark {
- [data-o-theme='dark'] {
- @content;
- }
-}
-
-@mixin text-truncate($line-clamp: 1) {
- overflow: hidden;
- text-overflow: ellipsis;
- word-break: break-all;
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: $line-clamp;
-}
-
-@mixin img-in-dark {
- filter: brightness(80%) grayscale(20%) contrast(1.2);
-}
-
-@mixin scrollbar {
- &::-webkit-scrollbar-track {
- border-radius: 4px;
- background-color: var(--o-color-fill1);
- }
-
- &::-webkit-scrollbar {
- width: 4px;
- height: 4px;
- background-color: var(--o-color-fill1);
- }
-
- &::-webkit-scrollbar-thumb {
- border-radius: 4px;
- background: var(--o-color-control1);
- }
-}
-
-.hover-icon-rotate {
- .o-icon {
- transition: all var(--o-duration-m1) var(--o-easing-standard-in);
- }
-
- @include hover {
- .o-icon {
- transform: rotate(-180deg);
- }
- }
-}
-
-@mixin x-svg-hover() {
- & {
- overflow: hidden;
- }
-
- svg {
- transition: all var(--o-duration-m1) var(--o-easing-standard-in);
- }
- @include hover {
- svg {
- transform: rotate(180deg);
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/mixin/font.scss b/docs/.vitepress/src/assets/style/mixin/font.scss
deleted file mode 100644
index 66734578a873d0cc06f34bfcea073278905585e3..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/mixin/font.scss
+++ /dev/null
@@ -1,270 +0,0 @@
-@use '@/assets/style/mixin/screen.scss' as *;
-
-// 一级数据展示
-@mixin display1 {
- font-size: 56px;
- line-height: 80px;
- @include respond-to('laptop') {
- font-size: 48px;
- line-height: 64px;
- }
- @include respond-to('pad_h') {
- font-size: 40px;
- line-height: 56px;
- }
- @include respond-to('pad_v') {
- font-size: 40px;
- line-height: 56px;
- }
- @include respond-to('phone') {
- font-size: 22px;
- line-height: 30px;
- }
-}
-
-// 二级数据展示
-@mixin display2 {
- font-size: 48px;
- line-height: 64px;
- @include respond-to('laptop') {
- font-size: 40px;
- line-height: 56px;
- }
- @include respond-to('pad_h') {
- font-size: 32px;
- line-height: 44px;
- }
- @include respond-to('pad_v') {
- font-size: 32px;
- line-height: 44px;
- }
- @include respond-to('phone') {
- font-size: 20px;
- line-height: 28px;
- }
-}
-
-// 三级数据展示
-@mixin display3 {
- font-size: 40px;
- line-height: 56px;
- @include respond-to('laptop') {
- font-size: 32px;
- line-height: 44px;
- }
- @include respond-to('pad_h') {
- font-size: 24px;
- line-height: 32px;
- }
- @include respond-to('pad_v') {
- font-size: 22px;
- line-height: 30px;
- }
- @include respond-to('phone') {
- font-size: 18px;
- line-height: 26px;
- }
-}
-
-// 一级标题
-@mixin h1 {
- font-size: 32px;
- line-height: 44px;
- @include respond-to('laptop') {
- font-size: 20px;
- line-height: 28px;
- }
- @include respond-to('pad_h') {
- font-size: 20px;
- line-height: 28px;
- }
- @include respond-to('pad_v') {
- font-size: 18px;
- line-height: 26px;
- }
- @include respond-to('phone') {
- font-size: 16px;
- line-height: 24px;
- }
-}
-
-// 二级标题
-@mixin h2 {
- font-size: 24px;
- line-height: 32px;
- @include respond-to('laptop') {
- font-size: 20px;
- line-height: 28px;
- }
- @include respond-to('pad_h') {
- font-size: 18px;
- line-height: 26px;
- }
- @include respond-to('pad_v') {
- font-size: 18px;
- line-height: 26px;
- }
- @include respond-to('phone') {
- font-size: 16px;
- line-height: 24px;
- }
-}
-
-// 三级标题
-@mixin h3 {
- font-size: 22px;
- line-height: 30px;
- @include respond-to('laptop') {
- font-size: 18px;
- line-height: 26px;
- }
- @include respond-to('pad_h') {
- font-size: 16px;
- line-height: 24px;
- }
- @include respond-to('pad_v') {
- font-size: 16px;
- line-height: 24px;
- }
- @include respond-to('phone') {
- font-size: 16px;
- line-height: 24px;
- }
-}
-
-// 四级标题
-@mixin h4 {
- font-size: 20px;
- line-height: 28px;
- @include respond-to('laptop') {
- font-size: 18px;
- line-height: 26px;
- }
- @include respond-to('pad_h') {
- font-size: 16px;
- line-height: 24px;
- }
- @include respond-to('pad_v') {
- font-size: 16px;
- line-height: 24px;
- }
- @include respond-to('phone') {
- font-size: 14px;
- line-height: 22px;
- }
-}
-
-// 常规正文
-@mixin text1 {
- font-size: 16px;
- line-height: 24px;
- @include respond-to('laptop') {
- font-size: 14px;
- line-height: 22px;
- }
- @include respond-to('pad_h') {
- font-size: 14px;
- line-height: 22px;
- }
- @include respond-to('pad_v') {
- font-size: 14px;
- line-height: 22px;
- }
- @include respond-to('phone') {
- font-size: 12px;
- line-height: 18px;
- }
-}
-
-// 大号正文
-@mixin text2 {
- font-size: 18px;
- line-height: 26px;
- @include respond-to('laptop') {
- font-size: 16px;
- line-height: 24px;
- }
- @include respond-to('pad_h') {
- font-size: 14px;
- line-height: 22px;
- }
- @include respond-to('pad_v') {
- font-size: 14px;
- line-height: 22px;
- }
- @include respond-to('phone') {
- font-size: 14px;
- line-height: 22px;
- }
-}
-
-// 提示文本1
-@mixin tip1 {
- font-size: 14px;
- line-height: 22px;
- @include respond-to('laptop') {
- font-size: 12px;
- line-height: 18px;
- }
- @include respond-to('pad_h') {
- font-size: 12px;
- line-height: 18px;
- }
- @include respond-to('pad_v') {
- font-size: 12px;
- line-height: 18px;
- }
- @include respond-to('phone') {
- font-size: 10px;
- line-height: 16px;
- }
-}
-
-// 提示文本2
-@mixin tip2 {
- font-size: 12px;
- line-height: 18px;
- @include respond-to('laptop') {
- font-size: 12px;
- line-height: 18px;
- }
- @include respond-to('pad_h') {
- font-size: 12px;
- line-height: 18px;
- }
- @include respond-to('pad_v') {
- font-size: 12px;
- line-height: 18px;
- }
- @include respond-to('phone') {
- font-size: 10px;
- line-height: 16px;
- }
-}
-
-// 提示文本1
-@mixin tip1-response-max-height {
- font-size: 14px;
- line-height: 22px;
- max-height: 44px;
- @include respond-to('laptop') {
- font-size: 12px;
- line-height: 18px;
- max-height: 36px;
- }
- @include respond-to('pad_h') {
- font-size: 12px;
- line-height: 18px;
- max-height: 36px;
- }
- @include respond-to('pad_v') {
- font-size: 12px;
- line-height: 18px;
- max-height: 36px;
- }
- @include respond-to('phone') {
- font-size: 10px;
- line-height: 16px;
- max-height: 32px;
- }
-}
diff --git a/docs/.vitepress/src/assets/style/mixin/screen.scss b/docs/.vitepress/src/assets/style/mixin/screen.scss
deleted file mode 100644
index 4ae3eddaa5eac6bdad0251f31e87f70f5f6d76ac..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/mixin/screen.scss
+++ /dev/null
@@ -1,73 +0,0 @@
-// 断点定义
-$breakpoints: (
- // phone
- 'phone': (0, 600px),
- '>phone': 601px,
- // pad
- 'pad': (601px, 1200px),
- '<=pad': (0, 1200px),
- '>pad': 1201px,
- // pad-v
- 'pad_v': (601px, 840px),
- '<=pad_v': (0, 840px),
- '>pad_v': 841px,
- // pad-h
- 'pad_h': (841px, 1200px),
- // laptop
- 'laptop': (1201px, 1440px),
- '<=laptop': (0, 1440px),
- '>laptop': 1441px,
- 'pad-laptop': (601px, 1440px),
- 'pad_v-laptop': (841px, 1440px)
-);
-
-@mixin respond-to($breakname) {
- $bp: map-get($breakpoints, $breakname);
- @if type-of($bp) == 'list' {
- $min: nth($bp, 1);
- $max: nth($bp, 2);
- @if $min == 0 {
- @media (max-width: $max) {
- @content;
- }
- } @else {
- @media (min-width: $min) and (max-width: $max) {
- @content;
- }
- }
- } @else {
- @media (min-width: $bp) {
- @content;
- }
- }
-}
-
-@mixin hoverable($hover: hover) {
- @media (hover: $hover) {
- @content;
- }
-}
-
-@mixin hover() {
- @media (hover: hover) {
- &:hover {
- @content;
- }
- }
-}
-
-@mixin me-hover() {
- @content;
- @media (hover: hover) {
- &:hover {
- @content;
- }
- }
-}
-
-@mixin x-hover() {
- transition: all var(--o-duration-m1) var(--o-easing-standard-in);
- @include hover {
- transform: rotate(180deg);
- }
-}
diff --git a/docs/.vitepress/src/assets/style/theme/anchor.scss b/docs/.vitepress/src/assets/style/theme/anchor.scss
deleted file mode 100644
index bcd353e9d739c037473e8f4ffd6c03d4a81cc1ff..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/anchor.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-.o-anchor {
- --anchor-indicator-height: 100%;
- .o-anchor-item-link {
- &:hover {
- --anchor-item-link-bg-color-hover: none;
- }
- &.is-active {
- --anchor-item-link-bg-color-active: none;
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/theme/button.scss b/docs/.vitepress/src/assets/style/theme/button.scss
deleted file mode 100644
index 51ea368e52a1f0acaab6fe2f355923a29c43bc8c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/button.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.o-btn {
- --btn-radius: var(--btn-height);
-}
diff --git a/docs/.vitepress/src/assets/style/theme/card.scss b/docs/.vitepress/src/assets/style/theme/card.scss
deleted file mode 100644
index 6dc7d27bbb6a5ad57ad5f94856198077c22692e1..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/card.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-@use '../mixin/common.scss' as *;
-.o-card {
- --card-cover-radius: var(--o-radius-xs);
- --card-radius: var(--o-radius-xs);
-}
-.o-card-cover-h {
- --card-cover-padding: 0;
-}
-a.o-card:hover .o-card-title {
- color: var(--o-color-primary1);
-}
-
-@include in-dark {
- .o-figure img {
- @include img-in-dark;
- }
-}
diff --git a/docs/.vitepress/src/assets/style/theme/dark.token.css b/docs/.vitepress/src/assets/style/theme/dark.token.css
deleted file mode 100644
index 61682e6302cca48e0a5bc7623319c735cfcc6f12..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/dark.token.css
+++ /dev/null
@@ -1,2194 +0,0 @@
-/* theme: opendesign.dark */
-[data-o-theme="dark"] {
- /**
- * @name
- * @type palette
- * @group white
- * @description
- */
- --o-white: 255, 255, 255;
- /**
- * @name
- * @type palette
- * @group black
- * @description
- */
- --o-black: 0, 0, 0;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-1: 14, 26, 69;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-2: 18, 34, 87;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-3: 29, 51, 119;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-4: 42, 72, 158;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-5: 51, 91, 196;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-6: 67, 116, 242;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-7: 104, 142, 237 ;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-8: 140, 171, 234;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-9: 176, 199, 241;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-10: 215, 227, 248;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-1: 81, 46, 9;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-2: 121, 75, 15;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-3: 161, 107, 22;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-4: 202, 143, 30;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-5: 242, 183, 38;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-6: 245, 202, 80;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-7: 247, 219, 122;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-8: 250, 234, 166;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-9: 252, 246, 210;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-10: 254, 251, 237;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-1: 77, 24, 0;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-2: 120, 42, 1;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-3: 163, 68, 8;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-4: 207, 97, 19;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-5: 250, 130, 33;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-6: 251, 143, 43;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-7: 252, 174, 91;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-8: 253, 202, 139;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-9: 254, 227, 188;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-10: 255, 248, 237;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-1: 77, 0, 17;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-2: 115, 3, 24;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-3: 153, 9, 31;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-4: 192, 17, 37;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-5: 230, 28, 43;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-6: 235, 35, 45;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-7: 240, 82, 85;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-8: 245, 132, 130;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-9: 250, 183, 180;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-10: 255, 234, 232;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-1: 0, 77, 42;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-2: 2, 102, 53;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-3: 10, 127, 66;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-4: 22, 152, 80;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-5: 36, 177, 95;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-6: 51, 193, 104;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-7: 90, 208, 131;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-8: 135, 224, 163;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-9: 185, 239, 200;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-10: 240, 255, 244;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-1: 77, 30, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-2: 116, 51, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-3: 154, 76, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-4: 193, 105, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-5: 231, 137, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-6: 236, 165, 47;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-7: 241, 191, 96;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-8: 245, 215, 147;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-9: 250, 237, 200;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-10: 253, 247, 232;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-1: 53, 70, 0;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-2: 82, 105, 0;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-3: 112, 141, 1;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-4: 143, 176, 2;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-5: 175, 211, 5;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-6: 184, 220, 48;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-7: 196, 229, 95;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-8: 212, 237, 145;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-9: 231, 246, 198;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-10: 244, 251, 231;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-1: 33, 60, 7;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-2: 51, 90, 11;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-3: 70, 119, 16;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-4: 91, 149, 21;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-5: 112, 179, 27;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-6: 184, 220, 48;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-7: 166, 209, 103;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-8: 195, 225, 148;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-9: 225, 240, 199;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-10: 242, 247, 231;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-1: 0, 60, 48;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-2: 0, 90, 71;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-3: 0, 119, 93;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-4: 0, 149, 113;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-5: 0, 179, 133;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-6: 39, 194, 152;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-7: 84, 209, 173;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-8: 135, 225, 197;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-9: 192, 240, 224;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-10: 228, 247, 241;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-1: 0, 52, 60;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-2: 0, 79, 90;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-3: 0, 107, 119;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-4: 0, 137, 149;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-5: 39, 186, 194;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-6: 84, 205, 209;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-7: 92, 208, 212;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-8: 135, 223, 225;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-9: 192, 240, 240;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-10: 228, 247, 247;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-1: 0, 47, 76;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-2: 0, 72, 115;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-3: 0, 99, 153;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-4: 0, 127, 191;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-5: 0, 156, 229;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-6: 47, 178, 234;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-7: 96, 198, 239;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-8: 147, 218, 245;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-9: 200, 237, 250;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-10: 232, 247, 252;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-1: 0, 43, 97;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-2: 0, 61, 133;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-3: 0, 80, 169;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-4: 0, 100, 204;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-5: 0, 122, 240;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-6: 49, 151, 243;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-7: 98, 178, 246;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-8: 149, 205, 249;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-9: 202, 231, 252;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-10: 233, 245, 254;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-1: 0, 0, 0;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-2: 18, 18, 20;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-3: 26, 26, 28;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-4: 36, 36, 39;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-5: 43, 43, 47;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-6: 53, 53, 57;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-7: 63, 63, 67;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-8: 85, 85, 88;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-9: 118, 118, 122;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-10: 156, 156, 159;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-11: 181, 181, 185;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-12: 208, 208, 210;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-13: 235, 235, 238;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-14: 255,255, 255;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-1: 5, 19, 101;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-2: 10, 28, 118;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-3: 16, 38, 138;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-4: 23, 50, 159;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-5: 31, 63, 179;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-6: 66, 96, 194;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-7: 106, 131, 209;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-8: 150, 170, 225;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-9: 209, 218, 241;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-10: 232, 236, 247;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-1: 34, 0, 109;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-2: 39, 2, 130;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-3: 46, 7, 150;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-4: 53, 13, 171;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-5: 61, 20, 191;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-6: 97, 62, 201;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-7: 150, 130, 223;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-8: 182, 169, 233;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-9: 217, 210, 244;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-10: 240, 237, 250;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-1: 60, 0, 97;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-2: 77, 0, 118;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-3: 95, 0, 138;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-4: 114, 0, 159;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-5: 135, 2, 179;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-6: 161, 41, 194;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-7: 187, 85, 209;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-8: 211, 136, 225;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-9: 234, 192, 240;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-10: 245, 228, 247;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-1: 81, 0, 51;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-2: 117, 0, 70;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-3: 153, 0, 86;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-4: 188, 0, 100;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-5: 224, 0, 112;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-6: 230, 46, 132;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-7: 236, 95, 156;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-8: 243, 146, 184;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-9: 249, 199, 217;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-10: 252, 232, 239;
- /**
- * @name
- * @type color
- * @group base
- * @description
- */
- --o-color-white: rgb(var(--o-white));
- /**
- * @name
- * @type color
- * @group base
- * @description
- */
- --o-color-black: rgb(var(--o-black));
- /**
- * @name
- * @type color
- * @group primary
- * @description 常规
- */
- --o-color-primary1: rgb(var(--o-kleinblue-6));
- /**
- * @name
- * @type color
- * @group primary
- * @description 悬浮
- */
- --o-color-primary2: rgb(var(--o-kleinblue-5));
- /**
- * @name
- * @type color
- * @group primary
- * @description 激活
- */
- --o-color-primary3: rgb(var(--o-kleinblue-7));
- /**
- * @name
- * @type color
- * @group primary
- * @description 禁用
- */
- --o-color-primary4: rgb(var(--o-kleinblue-4));
- /**
- * @name
- * @type color
- * @group primary
- * @description 常规-浅
- */
- --o-color-primary1-light: rgb(var(--o-kleinblue-2));
- /**
- * @name
- * @type color
- * @group primary
- * @description 悬浮-浅
- */
- --o-color-primary2-light: rgb(var(--o-kleinblue-3));
- /**
- * @name
- * @type color
- * @group primary
- * @description 激活-浅
- */
- --o-color-primary3-light: rgb(var(--o-kleinblue-4));
- /**
- * @name
- * @type color
- * @group primary
- * @description 禁用-浅
- */
- --o-color-primary4-light: rgb(var(--o-kleinblue-1));
- /**
- * @name
- * @type color
- * @group success
- * @description 常规
- */
- --o-color-success1: rgb(var(--o-green-6));
- /**
- * @name
- * @type color
- * @group success
- * @description 悬浮
- */
- --o-color-success2: rgb(var(--o-green-4));
- /**
- * @name
- * @type color
- * @group success
- * @description 激活
- */
- --o-color-success3: rgb(var(--o-green-7));
- /**
- * @name
- * @type color
- * @group success
- * @description 禁用
- */
- --o-color-success4: rgb(var(--o-green-3));
- /**
- * @name
- * @type color
- * @group success
- * @description 常规-浅
- */
- --o-color-success1-light: rgb(var(--o-green-2));
- /**
- * @name
- * @type color
- * @group success
- * @description 悬浮-浅
- */
- --o-color-success2-light: rgb(var(--o-green-3));
- /**
- * @name
- * @type color
- * @group success
- * @description 激活-浅
- */
- --o-color-success3-light: rgb(var(--o-green-4));
- /**
- * @name
- * @type color
- * @group success
- * @description 禁用-浅
- */
- --o-color-success4-light: rgb(var(--o-green-1));
- /**
- * @name
- * @type color
- * @group warning
- * @description 常规
- */
- --o-color-warning1: rgb(var(--o-orange-6));
- /**
- * @name
- * @type color
- * @group warning
- * @description 悬浮
- */
- --o-color-warning2: rgb(var(--o-orange-4));
- /**
- * @name
- * @type color
- * @group warning
- * @description 激活
- */
- --o-color-warning3: rgb(var(--o-orange-7));
- /**
- * @name
- * @type color
- * @group warning
- * @description 禁用
- */
- --o-color-warning4: rgb(var(--o-orange-3));
- /**
- * @name
- * @type color
- * @group warning
- * @description 常规-浅
- */
- --o-color-warning1-light: rgb(var(--o-orange-2));
- /**
- * @name
- * @type color
- * @group warning
- * @description 悬浮-浅
- */
- --o-color-warning2-light: rgb(var(--o-orange-3));
- /**
- * @name
- * @type color
- * @group warning
- * @description 激活-浅
- */
- --o-color-warning3-light: rgb(var(--o-orange-4));
- /**
- * @name
- * @type color
- * @group warning
- * @description 禁用-浅
- */
- --o-color-warning4-light: rgb(var(--o-orange-1));
- /**
- * @name
- * @type color
- * @group danger
- * @description 常规
- */
- --o-color-danger1: rgb(var(--o-red-6));
- /**
- * @name
- * @type color
- * @group danger
- * @description 悬浮
- */
- --o-color-danger2: rgb(var(--o-red-4));
- /**
- * @name
- * @type color
- * @group danger
- * @description 激活
- */
- --o-color-danger3: rgb(var(--o-red-7));
- /**
- * @name
- * @type color
- * @group danger
- * @description 禁用
- */
- --o-color-danger4: rgb(var(--o-red-3));
- /**
- * @name
- * @type color
- * @group danger
- * @description 常规-浅
- */
- --o-color-danger1-light: rgb(var(--o-red-2));
- /**
- * @name
- * @type color
- * @group danger
- * @description 悬浮-浅
- */
- --o-color-danger2-light: rgb(var(--o-red-3));
- /**
- * @name
- * @type color
- * @group danger
- * @description 激活-浅
- */
- --o-color-danger3-light: rgb(var(--o-red-4));
- /**
- * @name
- * @type color
- * @group danger
- * @description 禁用-浅
- */
- --o-color-danger4-light: rgb(var(--o-red-1));
- /**
- * @name
- * @type color
- * @group fill
- * @description 一级填充:页面背景
- */
- --o-color-fill1: rgb(var(--o-mixedgray-3));
- /**
- * @name
- * @type color
- * @group fill
- * @description 二级填充:区块/卡片
- */
- --o-color-fill2: rgb(var(--o-mixedgray-4));
- /**
- * @name
- * @type color
- * @group fill
- * @description 三级填充:卡片
- */
- --o-color-fill3: rgb(var(--o-mixedgray-5));
- /**
- * @name
- * @type color
- * @group control
- * @description 常规,常用于边框
- */
- --o-color-control1: rgba(var(--o-mixedgray-14), 0.25);
- /**
- * @name
- * @type color
- * @group control
- * @description 悬浮,常用于边框
- */
- --o-color-control2: rgba(var(--o-mixedgray-14), 0.6);
- /**
- * @name
- * @type color
- * @group control
- * @description 激活,常用于边框
- */
- --o-color-control3: rgba(var(--o-mixedgray-14), 0.8);
- /**
- * @name
- * @type color
- * @group control
- * @description 禁用,常用于边框
- */
- --o-color-control4: rgba(var(--o-mixedgray-14), 0.15);
- /**
- * @name
- * @type color
- * @group control
- * @description 常规-浅,常用于背景
- */
- --o-color-control1-light: rgb(var(--o-mixedgray-7), 1.0);
- /**
- * @name
- * @type color
- * @group control
- * @description 悬浮-浅,常用于背景
- */
- --o-color-control2-light: rgb(var(--o-mixedgray-5), 1);
- /**
- * @name
- * @type color
- * @group control
- * @description 激活-浅,常用于背景
- */
- --o-color-control3-light: rgb(var(--o-mixedgray-6), 1);
- /**
- * @name
- * @type color
- * @group control
- * @description 禁用-浅,常用于背景
- */
- --o-color-control4-light: rgb(var(--o-mixedgray-5), 1);
- /**
- * @name
- * @type color
- * @group control
- * @description 很浅,常用于表格背景色
- */
- --o-color-control-light: rgb(var(--o-mixedgray-4), 1.0);
- /**
- * @name
- * @type color
- * @group info
- * @description 一级/强调/标题
- */
- --o-color-info1: rgba(var(--o-mixedgray-14), 1.0);
- /**
- * @name
- * @type color
- * @group info
- * @description 二级/次强调/正文
- */
- --o-color-info2: rgba(var(--o-mixedgray-14), 0.8);
- /**
- * @name
- * @type color
- * @group info
- * @description 三级/辅助信息
- */
- --o-color-info3: rgba(var(--o-mixedgray-14), 0.6);
- /**
- * @name
- * @type color
- * @group info
- * @description 置灰/禁用
- */
- --o-color-info4: rgba(var(--o-mixedgray-14), 0.4);
- /**
- * @name
- * @type color
- * @group info
- * @description 一级/次强调/正文反色
- */
- --o-color-info1-inverse: rgba(var(--o-mixedgray-1), 1.0);
- /**
- * @name
- * @type color
- * @group info
- * @description 二级/辅助信息反色
- */
- --o-color-info2-inverse: rgba(var(--o-mixedgray-1), 0.8);
- /**
- * @name
- * @type color
- * @group info
- * @description 三级/辅助信息反色
- */
- --o-color-info3-inverse: rgba(var(--o-mixedgray-1), 0.6);
- /**
- * @name
- * @type color
- * @group info
- * @description 置灰/禁用反色
- */
- --o-color-info4-inverse: rgba(var(--o-mixedgray-1), 0.4);
- /**
- * @name
- * @type color
- * @group mask
- * @description 全局遮罩
- */
- --o-color-mask1: rgba(var(--o-mixedgray-1), 0.4);
- /**
- * @name
- * @type color
- * @group mask
- * @description 局部遮罩
- */
- --o-color-mask2: rgba(var(--o-mixedgray-4), 0.2);
- /**
- * @name
- * @type color
- * @group link
- * @description 常规
- */
- --o-color-link1: rgba(var(--o-kleinblue-6));
- /**
- * @name
- * @type color
- * @group link
- * @description 悬浮
- */
- --o-color-link2: rgba(var(--o-kleinblue-5));
- /**
- * @name
- * @type color
- * @group link
- * @description 激活
- */
- --o-color-link3: rgba(var(--o-kleinblue-7));
- /**
- * @name
- * @type color
- * @group link
- * @description 禁用
- */
- --o-color-link4: rgba(var(--o-kleinblue-4));
- /**
- * @name 阴影1
- * @type shadow
- * @group shadow
- * @description 用于卡片、小弹窗、楼层阴影
- */
- --o-shadow-1: 0 3px 8px rgba(var(--o-mixedgray-1), 0.08);
- /**
- * @name 阴影2
- * @type shadow
- * @group shadow
- * @description 用于卡片悬浮阴影
- */
- --o-shadow-2: 0 2px 24px rgba(var(--o-mixedgray-1), 0.15);
- /**
- * @name 阴影3
- * @type shadow
- * @group shadow
- * @description 用于提示阴影
- */
- --o-shadow-3: 0 8px 40px rgba(var(--o-mixedgray-1), 0.1);
- /**
- * @name 间距1
- * @type gap
- * @group gap
- * @description 用于组件之间的间距1
- */
- --o-gap-1: 4px;
- /**
- * @name 间距2
- * @type gap
- * @group gap
- * @description 用于组件之间的间距2
- */
- --o-gap-2: 8px;
- /**
- * @name 间距3
- * @type gap
- * @group gap
- * @description 用于组件之间的间距3
- */
- --o-gap-3: 12px;
- /**
- * @name 间距4
- * @type gap
- * @group gap
- * @description 用于组件之间的间距4
- */
- --o-gap-4: 16px;
- /**
- * @name 间距5
- * @type gap
- * @group gap
- * @description 用于组件之间的间距5
- */
- --o-gap-5: 24px;
- /**
- * @name 间距6
- * @type gap
- * @group gap
- * @description 用于组件之间的间距6
- */
- --o-gap-6: 32px;
- /**
- * @name 间距7
- * @type gap
- * @group gap
- * @description 用于组件之间的间距7
- */
- --o-gap-7: 40px;
- /**
- * @name 间距8
- * @type gap
- * @group gap
- * @description 用于组件之间的间距8
- */
- --o-gap-8: 48px;
- /**
- * @name 间距9
- * @type gap
- * @group gap
- * @description 用于组件之间的间距9
- */
- --o-gap-9: 64px;
- /**
- * @name 间距10
- * @type gap
- * @group gap
- * @description 用于组件之间的间距10
- */
- --o-gap-10: 72px;
- /**
- * @name 超小尺寸
- * @type size
- * @group control_size
- * @description 超小尺寸
- */
- --o-control_size-2xs: 14px;
- /**
- * @name 小尺寸
- * @type size
- * @group control_size
- * @description 小尺寸
- */
- --o-control_size-xs: 16px;
- /**
- * @name 小尺寸
- * @type size
- * @group control_size
- * @description 小尺寸
- */
- --o-control_size-s: 24px;
- /**
- * @name 中尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-m: 32px;
- /**
- * @name 大尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-l: 40px;
- /**
- * @name 大尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-xl: 48px;
- /**
- * @name 大尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-2xl: 56px;
- /**
- * @name 超小尺寸图标
- * @type size
- * @group icon_size
- * @description 超小尺寸图标
- */
- --o-icon_size-xs: 16px;
- /**
- * @name 小尺寸图标
- * @type size
- * @group icon_size
- * @description 小尺寸图标
- */
- --o-icon_size-s: 20px;
- /**
- * @name 中尺寸图标
- * @type size
- * @group icon_size
- * @description 中尺寸图标
- */
- --o-icon_size-m: 24px;
- /**
- * @name 大尺寸图标
- * @type size
- * @group icon_size
- * @description 大尺寸图标
- */
- --o-icon_size-l: 32px;
- /**
- * @name 超大尺寸图标
- * @type size
- * @group icon_size
- * @description 超大尺寸图标
- */
- --o-icon_size-xl: 40px;
- /**
- * @name 2xl尺寸图标
- * @type size
- * @group icon_size
- * @description 2xl尺寸图标
- */
- --o-icon_size-2xl: 48px;
- /**
- * @name 3xl尺寸图标
- * @type size
- * @group icon_size
- * @description 3xl尺寸图标
- */
- --o-icon_size-3xl: 56px;
- /**
- * @name 4xl尺寸图标
- * @type size
- * @group icon_size
- * @description 4xl尺寸图标
- */
- --o-icon_size-4xl: 64px;
- /**
- * @name 超小尺寸图标
- * @type size
- * @group icon_size_control
- * @description 超小尺寸控件图标(组件使用)
- */
- --o-icon_size_control-xs: 16px;
- /**
- * @name 小尺寸图标
- * @type size
- * @group icon_size_control
- * @description 小尺寸控件图标(组件使用)
- */
- --o-icon_size_control-s: 20px;
- /**
- * @name 中尺寸图标
- * @type size
- * @group icon_size_control
- * @description 中尺寸控件图标(组件使用)
- */
- --o-icon_size_control-m: 24px;
- /**
- * @name 大尺寸图标
- * @type size
- * @group icon_size_control
- * @description 大尺寸控件图标(组件使用)
- */
- --o-icon_size_control-l: 32px;
- /**
- * @name 超大尺寸图标
- * @type size
- * @group icon_size_control
- * @description 超大尺寸控件图标(组件使用)
- */
- --o-icon_size_control-xl: 40px;
- /**
- * @name 一级数据展示
- * @type font
- * @group font_size
- * @description 一级数据展示
- */
- --o-font_size-display1: 56px;
- /**
- * @name 二级数据展示
- * @type font
- * @group font_size
- * @description 二级数据展示
- */
- --o-font_size-display2: 48px;
- /**
- * @name 三级数据展示
- * @type font
- * @group font_size
- * @description 三级数据展示
- */
- --o-font_size-display3: 40px;
- /**
- * @name 一级标题
- * @type font
- * @group font_size
- * @description 一级标题
- */
- --o-font_size-h1: 32px;
- /**
- * @name 二级标题
- * @type font
- * @group font_size
- * @description 二级标题
- */
- --o-font_size-h2: 24px;
- /**
- * @name 三级标题
- * @type font
- * @group font_size
- * @description 三级标题
- */
- --o-font_size-h3: 22px;
- /**
- * @name 四级标题
- * @type font
- * @group font_size
- * @description 四级标题
- */
- --o-font_size-h4: 20px;
- /**
- * @name 常规正文
- * @type font
- * @group font_size
- * @description 常规正文
- */
- --o-font_size-text1: 16px;
- /**
- * @name 大号正文
- * @type font
- * @group font_size
- * @description 大号正文
- */
- --o-font_size-text2: 18px;
- /**
- * @name 提示文本1
- * @type font
- * @group font_size
- * @description 提示文本1
- */
- --o-font_size-tip1: 14px;
- /**
- * @name 提示文本2
- * @type font
- * @group font_size
- * @description 提示文本2
- */
- --o-font_size-tip2: 12px;
- /**
- * @name 一级数据展示
- * @type font
- * @group line_height
- * @description 一级数据展示
- */
- --o-line_height-display1: 80px;
- /**
- * @name 二级数据展示
- * @type font
- * @group line_height
- * @description 二级数据展示
- */
- --o-line_height-display2: 64px;
- /**
- * @name 三级数据展示
- * @type font
- * @group line_height
- * @description 三级数据展示
- */
- --o-line_height-display3: 56px;
- /**
- * @name 一级标题
- * @type font
- * @group line_height
- * @description 一级标题
- */
- --o-line_height-h1: 44px;
- /**
- * @name 二级标题
- * @type font
- * @group line_height
- * @description 二级标题
- */
- --o-line_height-h2: 32px;
- /**
- * @name 三级标题
- * @type font
- * @group line_height
- * @description 三级标题
- */
- --o-line_height-h3: 30px;
- /**
- * @name 四级标题
- * @type font
- * @group line_height
- * @description 四级标题
- */
- --o-line_height-h4: 28px;
- /**
- * @name 正文
- * @type font
- * @group line_height
- * @description 正文
- */
- --o-line_height-text1: 24px;
- /**
- * @name 正文-大
- * @type font
- * @group line_height
- * @description 正文-大
- */
- --o-line_height-text2: 26x;
- /**
- * @name 提示文本1
- * @type font
- * @group line_height
- * @description 提示文本1
- */
- --o-line_height-tip1: 22px;
- /**
- * @name 提示文本2
- * @type font
- * @group line_height
- * @description 提示文本2
- */
- --o-line_height-tip2: 18px;
- /**
- * @name 超小尺寸圆角
- * @type size
- * @group radius
- * @description 超小尺寸圆角
- */
- --o-radius-xs: 4px;
- /**
- * @name 小尺寸圆角
- * @type size
- * @group radius
- * @description 小尺寸圆角
- */
- --o-radius-s: 8px;
- /**
- * @name 中尺寸圆角
- * @type size
- * @group radius
- * @description 中尺寸圆角
- */
- --o-radius-m: 12px;
- /**
- * @name 大尺寸圆角
- * @type size
- * @group radius
- * @description 大尺寸圆角
- */
- --o-radius-l: 16px;
- /**
- * @name 大尺寸圆角
- * @type size
- * @group radius
- * @description 大尺寸圆角,一般用于卡片
- */
- --o-radius-xl: 24px;
- /**
- * @name 超小尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 超小尺寸控件圆角(组件使用)
- */
- --o-radius_control-xs: 4px;
- /**
- * @name 小尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 小尺寸控件圆角(组件使用)
- */
- --o-radius_control-s: 8px;
- /**
- * @name 中尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 中尺寸控件圆角(组件使用)
- */
- --o-radius_control-m: 12px;
- /**
- * @name 大尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 大尺寸控件圆角(组件使用)
- */
- --o-radius_control-l: 16px;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于退出屏幕的动画
- */
- --o-duration-s: 200ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为standard-in时进入屏幕的动画
- */
- --o-duration-m1: 250ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为standard时开始、结束的动画
- */
- --o-duration-m2: 300ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为emphasized-in时进入屏幕的动画
- */
- --o-duration-m3: 400ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为emphasized时开始、结束的动画
- */
- --o-duration-l: 500ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为emphasized时,轮播切换动画
- */
- --o-duration-xl: 1000ms;
- /**
- * @name 线性动画曲线
- * @type animation
- * @group easing
- * @description 线性曲线
- */
- --o-easing-linear: cubic-bezier(0, 0, 1, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于组件
- */
- --o-easing-standard: cubic-bezier(0.2, 0, 0, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于组件
- */
- --o-easing-standard-in: cubic-bezier(0, 0, 0, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于组件
- */
- --o-easing-standard-out: cubic-bezier(0.3, 0, 1, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于大卡片、场景切换
- */
- --o-easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于大卡片、场景切换
- */
- --o-easing-emphasized-in: cubic-bezier(0.3, 0, 0.8, 0.15);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于大卡片、场景切换
- */
- --o-easing-emphasized-out: cubic-bezier(0.05, 0.7, 0.1, 1);
-}
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/style/theme/default-light.token.css b/docs/.vitepress/src/assets/style/theme/default-light.token.css
deleted file mode 100644
index b2572c848e85fc594d5feb6b2e55033ad6fba36f..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/default-light.token.css
+++ /dev/null
@@ -1,2194 +0,0 @@
-/* theme: opendesign.light */
-:root,[data-o-theme="light"] {
- /**
- * @name
- * @type palette
- * @group white
- * @description
- */
- --o-white: 255, 255, 255;
- /**
- * @name
- * @type palette
- * @group black
- * @description
- */
- --o-black: 0, 0, 0;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-1: 235, 241, 246;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-2: 206, 219, 245;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-3: 132, 161, 220;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-4: 81, 119, 202;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-5: 37, 81, 185;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-6: 0, 47, 167;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-7: 0, 39, 147;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-8: 0, 31, 126;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-9: 0, 24, 126;
- /**
- * @name
- * @type palette
- * @group kleinblue
- * @description
- */
- --o-kleinblue-10: 0, 18, 85;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-1: 254, 252, 233;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-2: 252, 248, 202;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-3: 249, 237, 149;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-4: 246, 224, 98;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-5: 243, 207, 49;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-6: 240, 188, 6;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-7: 200, 147, 0;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-8: 160, 109, 0;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-9: 120, 76, 0;
- /**
- * @name
- * @type palette
- * @group yellow
- * @description
- */
- --o-yellow-10: 80, 47, 0;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-1: 255, 246, 232;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-2: 254, 226, 186;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-3: 253, 202, 140;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-4: 252, 176, 95;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-5: 251, 147, 50;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-6: 250, 115, 5;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-7: 207, 88, 3;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-8: 163, 64, 2;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-9: 120, 42, 1;
- /**
- * @name
- * @type palette
- * @group orange
- * @description
- */
- --o-orange-10: 77, 24, 0;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-1: 255, 234, 232;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-2: 250, 185, 182;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-3: 245, 136, 134;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-4: 240, 87, 90;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-5: 235, 43, 52;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-6: 230, 0, 18;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-7: 192, 0, 22;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-8: 153, 0, 23;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-9: 115, 0, 21;
- /**
- * @name
- * @type palette
- * @group red
- * @description
- */
- --o-red-10: 77, 0, 17;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-1: 232, 255, 238;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-2: 177, 239, 195;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-3: 128, 224, 158;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-4: 84, 208, 127;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-5: 45, 193, 101;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-6: 11, 177, 81;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-7: 7, 152, 72;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-8: 4, 127, 63;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-9: 2, 102, 53;
- /**
- * @name
- * @type palette
- * @group green
- * @description
- */
- --o-green-10: 0, 77, 42;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-1: 253, 247, 232;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-2: 250, 237, 200;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-3: 245, 215, 147;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-4: 241, 191, 96;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-5: 236, 165, 47;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-6: 231, 137, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-7: 193, 105, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-8: 154, 76, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-9: 116, 51, 0;
- /**
- * @name
- * @type palette
- * @group amber
- * @description
- */
- --o-amber-10: 77, 30, 0;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-1: 243, 250, 230;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-2: 229, 244, 195;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-3: 208, 233, 140;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-4: 191, 223, 89;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-5: 177, 212, 42;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-6: 167, 201, 0;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-7: 136, 168, 0;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-8: 107, 134, 0;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-9: 78, 101, 0;
- /**
- * @name
- * @type palette
- * @group lime
- * @description
- */
- --o-lime-10: 51, 67, 0;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-1: 242, 247, 231;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-2: 225, 240, 199;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-3: 195, 225, 148;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-4: 166, 209, 103;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-5: 138, 194, 62;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-6: 112, 179, 27;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-7: 91, 149, 21;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-8: 70, 119, 16;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-9: 51, 90, 11;
- /**
- * @name
- * @type palette
- * @group light-green
- * @description
- */
- --o-light-green-10: 33, 60, 7;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-1: 228, 247, 241;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-2: 192, 240, 224;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-3: 135, 225, 197;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-4: 84, 209, 173;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-5: 39, 194, 152;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-6: 0, 179, 133;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-7: 0, 149, 113;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-8: 0, 119, 93;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-9: 0, 90, 71;
- /**
- * @name
- * @type palette
- * @group teal
- * @description
- */
- --o-teal-10: 0, 60, 48;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-1: 228, 247, 247;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-2: 192, 240, 240;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-3: 135, 223, 225;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-4: 84, 205, 209;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-5: 39, 186, 194;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-6: 0, 167, 179;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-7: 0, 137, 149;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-8: 0, 107, 119;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-9: 0, 79, 90;
- /**
- * @name
- * @type palette
- * @group cyan
- * @description
- */
- --o-cyan-10: 0, 52, 60;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-1: 232, 247, 252;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-2: 200, 237, 250;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-3: 147, 218, 245;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-4: 96, 198, 239;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-5: 47, 178, 234;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-6: 0, 156, 229;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-7: 0, 127, 191;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-8: 0, 99, 153;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-9: 0, 72, 115;
- /**
- * @name
- * @type palette
- * @group light-blue
- * @description
- */
- --o-light-blue-10: 0, 47, 76;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-1: 233, 245, 254;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-2: 202, 231, 252;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-3: 149, 205, 249;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-4: 98, 178, 246;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-5: 49, 151, 243;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-6: 0, 122, 240;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-7: 0, 100, 204;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-8: 0, 80, 169;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-9: 0, 61, 133;
- /**
- * @name
- * @type palette
- * @group blue
- * @description
- */
- --o-blue-10: 0, 43, 97;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-1: 255, 255, 255;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-2: 243, 243, 245;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-3: 237, 237, 240;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-4: 232, 232, 235;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-5: 222, 222, 227;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-6: 212, 212, 217;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-7: 186, 186, 191;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-8: 149, 149, 157;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-9: 111, 111, 117;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-10: 85 , 85, 92;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-11: 61, 61, 66;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-12: 37, 37, 41;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-13: 21, 21, 23;
- /**
- * @name
- * @type palette
- * @group mixedgray
- * @description
- */
- --o-mixedgray-14: 0, 0, 0;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-1: 232, 236, 247;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-2: 200, 211, 240;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-3: 150, 170, 225;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-4: 106, 131, 209;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-5: 66, 96, 194;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-6: 31, 63, 179;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-7: 23, 50, 159;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-8: 16, 38, 138;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-9: 10, 28, 118;
- /**
- * @name
- * @type palette
- * @group indigo
- * @description
- */
- --o-indigo-10: 5, 19, 101;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-1: 234, 231, 249;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-2: 206, 199, 242;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-3: 163, 147, 229;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-4: 124, 100, 217;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-5: 90, 58, 204;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-6: 61, 20, 191;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-7: 53, 13, 171;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-8: 46, 7, 150;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-9: 39, 2, 130;
- /**
- * @name
- * @type palette
- * @group violet
- * @description
- */
- --o-violet-10: 34, 0, 109;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-1: 245, 228, 247;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-2: 234, 192, 240;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-3: 211, 136, 225;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-4: 187, 85, 209;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-5: 161, 41, 194;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-6: 135, 2, 179;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-7: 114, 0, 159;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-8: 95, 0, 138;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-9: 77, 0, 118;
- /**
- * @name
- * @type palette
- * @group purple
- * @description
- */
- --o-purple-10: 60, 0, 97;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-1: 252, 232, 239;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-2: 249, 199, 217;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-3: 243, 146, 184;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-4: 236, 95, 156;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-5: 230, 46, 132;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-6: 224, 0, 112;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-7: 188, 0, 100;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-8: 153, 0, 86;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-9: 117, 0, 70;
- /**
- * @name
- * @type palette
- * @group pink
- * @description
- */
- --o-pink-10: 81, 0, 51;
- /**
- * @name
- * @type color
- * @group base
- * @description
- */
- --o-color-white: rgb(var(--o-white));
- /**
- * @name
- * @type color
- * @group base
- * @description
- */
- --o-color-black: rgb(var(--o-black));
- /**
- * @name
- * @type color
- * @group primary
- * @description 常规
- */
- --o-color-primary1: rgb(var(--o-kleinblue-6));
- /**
- * @name
- * @type color
- * @group primary
- * @description 悬浮
- */
- --o-color-primary2: rgb(var(--o-kleinblue-4));
- /**
- * @name
- * @type color
- * @group primary
- * @description 激活
- */
- --o-color-primary3: rgb(var(--o-kleinblue-7));
- /**
- * @name
- * @type color
- * @group primary
- * @description 禁用
- */
- --o-color-primary4: rgb(var(--o-kleinblue-3));
- /**
- * @name
- * @type color
- * @group primary
- * @description 常规-浅
- */
- --o-color-primary1-light: rgb(var(--o-kleinblue-2));
- /**
- * @name
- * @type color
- * @group primary
- * @description 悬浮-浅
- */
- --o-color-primary2-light: rgb(var(--o-kleinblue-3));
- /**
- * @name
- * @type color
- * @group primary
- * @description 激活-浅
- */
- --o-color-primary3-light: rgb(var(--o-kleinblue-4));
- /**
- * @name
- * @type color
- * @group primary
- * @description 禁用-浅
- */
- --o-color-primary4-light: rgb(var(--o-kleinblue-1));
- /**
- * @name
- * @type color
- * @group success
- * @description 常规
- */
- --o-color-success1: rgb(var(--o-green-6));
- /**
- * @name
- * @type color
- * @group success
- * @description 悬浮
- */
- --o-color-success2: rgb(var(--o-green-4));
- /**
- * @name
- * @type color
- * @group success
- * @description 激活
- */
- --o-color-success3: rgb(var(--o-green-7));
- /**
- * @name
- * @type color
- * @group success
- * @description 禁用
- */
- --o-color-success4: rgb(var(--o-green-3));
- /**
- * @name
- * @type color
- * @group success
- * @description 常规-浅
- */
- --o-color-success1-light: rgb(var(--o-green-2));
- /**
- * @name
- * @type color
- * @group success
- * @description 悬浮-浅
- */
- --o-color-success2-light: rgb(var(--o-green-3));
- /**
- * @name
- * @type color
- * @group success
- * @description 激活-浅
- */
- --o-color-success3-light: rgb(var(--o-green-4));
- /**
- * @name
- * @type color
- * @group success
- * @description 禁用-浅
- */
- --o-color-success4-light: rgb(var(--o-green-1));
- /**
- * @name
- * @type color
- * @group warning
- * @description 常规
- */
- --o-color-warning1: rgb(var(--o-orange-6));
- /**
- * @name
- * @type color
- * @group warning
- * @description 悬浮
- */
- --o-color-warning2: rgb(var(--o-orange-4));
- /**
- * @name
- * @type color
- * @group warning
- * @description 激活
- */
- --o-color-warning3: rgb(var(--o-orange-7));
- /**
- * @name
- * @type color
- * @group warning
- * @description 禁用
- */
- --o-color-warning4: rgb(var(--o-orange-3));
- /**
- * @name
- * @type color
- * @group warning
- * @description 常规-浅
- */
- --o-color-warning1-light: rgb(var(--o-orange-2));
- /**
- * @name
- * @type color
- * @group warning
- * @description 悬浮-浅
- */
- --o-color-warning2-light: rgb(var(--o-orange-3));
- /**
- * @name
- * @type color
- * @group warning
- * @description 激活-浅
- */
- --o-color-warning3-light: rgb(var(--o-orange-4));
- /**
- * @name
- * @type color
- * @group warning
- * @description 禁用-浅
- */
- --o-color-warning4-light: rgb(var(--o-orange-1));
- /**
- * @name
- * @type color
- * @group danger
- * @description 常规
- */
- --o-color-danger1: rgb(var(--o-red-6));
- /**
- * @name
- * @type color
- * @group danger
- * @description 悬浮
- */
- --o-color-danger2: rgb(var(--o-red-4));
- /**
- * @name
- * @type color
- * @group danger
- * @description 激活
- */
- --o-color-danger3: rgb(var(--o-red-7));
- /**
- * @name
- * @type color
- * @group danger
- * @description 禁用
- */
- --o-color-danger4: rgb(var(--o-red-3));
- /**
- * @name
- * @type color
- * @group danger
- * @description 常规-浅
- */
- --o-color-danger1-light: rgb(var(--o-red-2));
- /**
- * @name
- * @type color
- * @group danger
- * @description 悬浮-浅
- */
- --o-color-danger2-light: rgb(var(--o-red-3));
- /**
- * @name
- * @type color
- * @group danger
- * @description 激活-浅
- */
- --o-color-danger3-light: rgb(var(--o-red-4));
- /**
- * @name
- * @type color
- * @group danger
- * @description 禁用-浅
- */
- --o-color-danger4-light: rgb(var(--o-red-1));
- /**
- * @name
- * @type color
- * @group fill
- * @description 一级填充:页面背景
- */
- --o-color-fill1: rgb(var(--o-mixedgray-2));
- /**
- * @name
- * @type color
- * @group fill
- * @description 二级填充:区块/卡片
- */
- --o-color-fill2: rgb(var(--o-mixedgray-1));
- /**
- * @name
- * @type color
- * @group fill
- * @description 三级填充:卡片
- */
- --o-color-fill3: rgb(var(--o-mixedgray-3));
- /**
- * @name
- * @type color
- * @group control
- * @description 常规,常用于边框
- */
- --o-color-control1: rgba(var(--o-mixedgray-14), 0.25);
- /**
- * @name
- * @type color
- * @group control
- * @description 悬浮,常用于边框
- */
- --o-color-control2: rgba(var(--o-mixedgray-14), 0.6);
- /**
- * @name
- * @type color
- * @group control
- * @description 激活,常用于边框
- */
- --o-color-control3: rgba(var(--o-mixedgray-14), 0.8);
- /**
- * @name
- * @type color
- * @group control
- * @description 禁用,常用于边框
- */
- --o-color-control4: rgba(var(--o-mixedgray-14), 0.1);
- /**
- * @name
- * @type color
- * @group control
- * @description 常规-浅,常用于背景
- */
- --o-color-control1-light: rgb(var(--o-mixedgray-5), 1.0);
- /**
- * @name
- * @type color
- * @group control
- * @description 悬浮-浅,常用于背景
- */
- --o-color-control2-light: rgba(var(--o-kleinblue-1), 1);
- /**
- * @name
- * @type color
- * @group control
- * @description 激活-浅,常用于背景
- */
- --o-color-control3-light: rgba(var(--o-kleinblue-2), 1);
- /**
- * @name
- * @type color
- * @group control
- * @description 禁用-浅,常用于背景
- */
- --o-color-control4-light: rgb(var(--o-mixedgray-3), 1);
- /**
- * @name
- * @type color
- * @group control
- * @description 很浅,常用于表格背景色
- */
- --o-color-control-light: rgb(var(--o-mixedgray-1), 1.0);
- /**
- * @name
- * @type color
- * @group info
- * @description 一级/强调/标题
- */
- --o-color-info1: rgba(var(--o-mixedgray-14), 1.0);
- /**
- * @name
- * @type color
- * @group info
- * @description 二级/次强调/正文
- */
- --o-color-info2: rgba(var(--o-mixedgray-14), 0.8);
- /**
- * @name
- * @type color
- * @group info
- * @description 三级/辅助信息
- */
- --o-color-info3: rgba(var(--o-mixedgray-14), 0.6);
- /**
- * @name
- * @type color
- * @group info
- * @description 置灰/禁用
- */
- --o-color-info4: rgba(var(--o-mixedgray-14), 0.4);
- /**
- * @name
- * @type color
- * @group info
- * @description 一级/次强调/正文反色
- */
- --o-color-info1-inverse: rgba(var(--o-mixedgray-1), 1.0);
- /**
- * @name
- * @type color
- * @group info
- * @description 二级/辅助信息反色
- */
- --o-color-info2-inverse: rgba(var(--o-mixedgray-1), 0.8);
- /**
- * @name
- * @type color
- * @group info
- * @description 三级/辅助信息反色
- */
- --o-color-info3-inverse: rgba(var(--o-mixedgray-1), 0.6);
- /**
- * @name
- * @type color
- * @group info
- * @description 置灰/禁用反色
- */
- --o-color-info4-inverse: rgba(var(--o-mixedgray-1), 0.4);
- /**
- * @name
- * @type color
- * @group mask
- * @description 全局遮罩
- */
- --o-color-mask1: rgba(var(--o-mixedgray-14), 0.4);
- /**
- * @name
- * @type color
- * @group mask
- * @description 局部遮罩
- */
- --o-color-mask2: rgba(var(--o-mixedgray-1), 0.2);
- /**
- * @name
- * @type color
- * @group link
- * @description 常规
- */
- --o-color-link1: rgba(var(--o-kleinblue-6));
- /**
- * @name
- * @type color
- * @group link
- * @description 悬浮
- */
- --o-color-link2: rgba(var(--o-kleinblue-4));
- /**
- * @name
- * @type color
- * @group link
- * @description 激活
- */
- --o-color-link3: rgba(var(--o-kleinblue-7));
- /**
- * @name
- * @type color
- * @group link
- * @description 禁用
- */
- --o-color-link4: rgba(var(--o-kleinblue-3));
- /**
- * @name 阴影1
- * @type shadow
- * @group shadow
- * @description 用于卡片、小弹窗、楼层阴影
- */
- --o-shadow-1: 0 3px 8px rgba(var(--o-mixedgray-9), 0.08);
- /**
- * @name 阴影2
- * @type shadow
- * @group shadow
- * @description 用于卡片悬浮阴影
- */
- --o-shadow-2: 0 2px 24px rgba(var(--o-mixedgray-9), 0.15);
- /**
- * @name 阴影3
- * @type shadow
- * @group shadow
- * @description 用于提示阴影
- */
- --o-shadow-3: 0 8px 40px rgba(var(--o-mixedgray-9), 0.1);
- /**
- * @name 间距1
- * @type gap
- * @group gap
- * @description 用于组件之间的间距1
- */
- --o-gap-1: 4px;
- /**
- * @name 间距2
- * @type gap
- * @group gap
- * @description 用于组件之间的间距2
- */
- --o-gap-2: 8px;
- /**
- * @name 间距3
- * @type gap
- * @group gap
- * @description 用于组件之间的间距3
- */
- --o-gap-3: 12px;
- /**
- * @name 间距4
- * @type gap
- * @group gap
- * @description 用于组件之间的间距4
- */
- --o-gap-4: 16px;
- /**
- * @name 间距5
- * @type gap
- * @group gap
- * @description 用于组件之间的间距5
- */
- --o-gap-5: 24px;
- /**
- * @name 间距6
- * @type gap
- * @group gap
- * @description 用于组件之间的间距6
- */
- --o-gap-6: 32px;
- /**
- * @name 间距7
- * @type gap
- * @group gap
- * @description 用于组件之间的间距7
- */
- --o-gap-7: 40px;
- /**
- * @name 间距8
- * @type gap
- * @group gap
- * @description 用于组件之间的间距8
- */
- --o-gap-8: 48px;
- /**
- * @name 间距9
- * @type gap
- * @group gap
- * @description 用于组件之间的间距9
- */
- --o-gap-9: 64px;
- /**
- * @name 间距10
- * @type gap
- * @group gap
- * @description 用于组件之间的间距10
- */
- --o-gap-10: 72px;
- /**
- * @name 超小尺寸
- * @type size
- * @group control_size
- * @description 超小尺寸
- */
- --o-control_size-2xs: 14px;
- /**
- * @name 小尺寸
- * @type size
- * @group control_size
- * @description 小尺寸
- */
- --o-control_size-xs: 16px;
- /**
- * @name 小尺寸
- * @type size
- * @group control_size
- * @description 小尺寸
- */
- --o-control_size-s: 24px;
- /**
- * @name 中尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-m: 32px;
- /**
- * @name 大尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-l: 40px;
- /**
- * @name 大尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-xl: 48px;
- /**
- * @name 大尺寸
- * @type size
- * @group control_size
- * @description 尺寸
- */
- --o-control_size-2xl: 56px;
- /**
- * @name 超小尺寸图标
- * @type size
- * @group icon_size
- * @description 超小尺寸图标
- */
- --o-icon_size-xs: 16px;
- /**
- * @name 小尺寸图标
- * @type size
- * @group icon_size
- * @description 小尺寸图标
- */
- --o-icon_size-s: 20px;
- /**
- * @name 中尺寸图标
- * @type size
- * @group icon_size
- * @description 中尺寸图标
- */
- --o-icon_size-m: 24px;
- /**
- * @name 大尺寸图标
- * @type size
- * @group icon_size
- * @description 大尺寸图标
- */
- --o-icon_size-l: 32px;
- /**
- * @name 超大尺寸图标
- * @type size
- * @group icon_size
- * @description 超大尺寸图标
- */
- --o-icon_size-xl: 40px;
- /**
- * @name 2xl尺寸图标
- * @type size
- * @group icon_size
- * @description 2xl尺寸图标
- */
- --o-icon_size-2xl: 48px;
- /**
- * @name 3xl尺寸图标
- * @type size
- * @group icon_size
- * @description 3xl尺寸图标
- */
- --o-icon_size-3xl: 56px;
- /**
- * @name 4xl尺寸图标
- * @type size
- * @group icon_size
- * @description 4xl尺寸图标
- */
- --o-icon_size-4xl: 64px;
- /**
- * @name 超小尺寸图标
- * @type size
- * @group icon_size_control
- * @description 超小尺寸控件图标(组件使用)
- */
- --o-icon_size_control-xs: 16px;
- /**
- * @name 小尺寸图标
- * @type size
- * @group icon_size_control
- * @description 小尺寸控件图标(组件使用)
- */
- --o-icon_size_control-s: 20px;
- /**
- * @name 中尺寸图标
- * @type size
- * @group icon_size_control
- * @description 中尺寸控件图标(组件使用)
- */
- --o-icon_size_control-m: 24px;
- /**
- * @name 大尺寸图标
- * @type size
- * @group icon_size_control
- * @description 大尺寸控件图标(组件使用)
- */
- --o-icon_size_control-l: 32px;
- /**
- * @name 超大尺寸图标
- * @type size
- * @group icon_size_control
- * @description 超大尺寸控件图标(组件使用)
- */
- --o-icon_size_control-xl: 40px;
- /**
- * @name 一级数据展示
- * @type font
- * @group font_size
- * @description 一级数据展示
- */
- --o-font_size-display1: 56px;
- /**
- * @name 二级数据展示
- * @type font
- * @group font_size
- * @description 二级数据展示
- */
- --o-font_size-display2: 48px;
- /**
- * @name 三级数据展示
- * @type font
- * @group font_size
- * @description 三级数据展示
- */
- --o-font_size-display3: 40px;
- /**
- * @name 一级标题
- * @type font
- * @group font_size
- * @description 一级标题
- */
- --o-font_size-h1: 32px;
- /**
- * @name 二级标题
- * @type font
- * @group font_size
- * @description 二级标题
- */
- --o-font_size-h2: 24px;
- /**
- * @name 三级标题
- * @type font
- * @group font_size
- * @description 三级标题
- */
- --o-font_size-h3: 22px;
- /**
- * @name 四级标题
- * @type font
- * @group font_size
- * @description 四级标题
- */
- --o-font_size-h4: 20px;
- /**
- * @name 常规正文
- * @type font
- * @group font_size
- * @description 常规正文
- */
- --o-font_size-text1: 16px;
- /**
- * @name 大号正文
- * @type font
- * @group font_size
- * @description 大号正文
- */
- --o-font_size-text2: 18px;
- /**
- * @name 提示文本1
- * @type font
- * @group font_size
- * @description 提示文本1
- */
- --o-font_size-tip1: 14px;
- /**
- * @name 提示文本2
- * @type font
- * @group font_size
- * @description 提示文本2
- */
- --o-font_size-tip2: 12px;
- /**
- * @name 一级数据展示
- * @type font
- * @group line_height
- * @description 一级数据展示
- */
- --o-line_height-display1: 80px;
- /**
- * @name 二级数据展示
- * @type font
- * @group line_height
- * @description 二级数据展示
- */
- --o-line_height-display2: 64px;
- /**
- * @name 三级数据展示
- * @type font
- * @group line_height
- * @description 三级数据展示
- */
- --o-line_height-display3: 56px;
- /**
- * @name 一级标题
- * @type font
- * @group line_height
- * @description 一级标题
- */
- --o-line_height-h1: 44px;
- /**
- * @name 二级标题
- * @type font
- * @group line_height
- * @description 二级标题
- */
- --o-line_height-h2: 32px;
- /**
- * @name 三级标题
- * @type font
- * @group line_height
- * @description 三级标题
- */
- --o-line_height-h3: 30px;
- /**
- * @name 四级标题
- * @type font
- * @group line_height
- * @description 四级标题
- */
- --o-line_height-h4: 28px;
- /**
- * @name 正文
- * @type font
- * @group line_height
- * @description 正文
- */
- --o-line_height-text1: 24px;
- /**
- * @name 正文-大
- * @type font
- * @group line_height
- * @description 正文-大
- */
- --o-line_height-text2: 26px;
- /**
- * @name 提示文本1
- * @type font
- * @group line_height
- * @description 提示文本1
- */
- --o-line_height-tip1: 22px;
- /**
- * @name 提示文本2
- * @type font
- * @group line_height
- * @description 提示文本2
- */
- --o-line_height-tip2: 18px;
- /**
- * @name 超小尺寸圆角
- * @type size
- * @group radius
- * @description 超小尺寸圆角
- */
- --o-radius-xs: 4px;
- /**
- * @name 小尺寸圆角
- * @type size
- * @group radius
- * @description 小尺寸圆角
- */
- --o-radius-s: 8px;
- /**
- * @name 中尺寸圆角
- * @type size
- * @group radius
- * @description 中尺寸圆角
- */
- --o-radius-m: 12px;
- /**
- * @name 大尺寸圆角
- * @type size
- * @group radius
- * @description 大尺寸圆角
- */
- --o-radius-l: 16px;
- /**
- * @name 大尺寸圆角
- * @type size
- * @group radius
- * @description 大尺寸圆角,一般用于卡片
- */
- --o-radius-xl: 24px;
- /**
- * @name 超小尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 超小尺寸控件圆角(组件使用)
- */
- --o-radius_control-xs: 4px;
- /**
- * @name 小尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 小尺寸控件圆角(组件使用)
- */
- --o-radius_control-s: 8px;
- /**
- * @name 中尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 中尺寸控件圆角(组件使用)
- */
- --o-radius_control-m: 12px;
- /**
- * @name 大尺寸控件圆角
- * @type size
- * @group radius_control
- * @description 大尺寸控件圆角(组件使用)
- */
- --o-radius_control-l: 16px;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于退出屏幕的动画
- */
- --o-duration-s: 200ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为standard-in时进入屏幕的动画
- */
- --o-duration-m1: 250ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为standard时开始、结束的动画
- */
- --o-duration-m2: 300ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为emphasized-in时进入屏幕的动画
- */
- --o-duration-m3: 400ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为emphasized时开始、结束的动画
- */
- --o-duration-l: 500ms;
- /**
- * @name 持续时间
- * @type animation
- * @group duration
- * @description 用于当曲线为emphasized时,轮播切换动画
- */
- --o-duration-xl: 1000ms;
- /**
- * @name 线性动画曲线
- * @type animation
- * @group easing
- * @description 线性曲线
- */
- --o-easing-linear: cubic-bezier(0, 0, 1, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于组件
- */
- --o-easing-standard: cubic-bezier(0.2, 0, 0, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于组件
- */
- --o-easing-standard-in: cubic-bezier(0, 0, 0, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于组件
- */
- --o-easing-standard-out: cubic-bezier(0.3, 0, 1, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于大卡片、场景切换
- */
- --o-easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于大卡片、场景切换
- */
- --o-easing-emphasized-in: cubic-bezier(0.3, 0, 0.8, 0.15);
- /**
- * @name 动画曲线
- * @type animation
- * @group easing
- * @description 用于大卡片、场景切换
- */
- --o-easing-emphasized-out: cubic-bezier(0.05, 0.7, 0.1, 1);
-}
\ No newline at end of file
diff --git a/docs/.vitepress/src/assets/style/theme/dialog.scss b/docs/.vitepress/src/assets/style/theme/dialog.scss
deleted file mode 100644
index 581c57a9bd991639149ba0c28257a38da910fb6d..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/dialog.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-@use '../mixin/screen.scss' as *;
-@use '../mixin/font.scss' as *;
-// 屏蔽loading 遮罩
-.o-layer {
- .o-dlg-header {
- color: var(--o-color-info1);
- }
- &.o-loading {
- --loading-mask-icon-color: var(--o-color-info1);
- --layer-align: top;
- --layer-origin: top;
- --loading-mask-color: var(--o-color-info1);
- --layer-mask: var(--o-color-info4-inverse);
- transition: none;
- padding-top: 23%;
- .o-loading-main {
- flex-direction: column;
- justify-content: flex-start;
- @include text1;
- .o-loading-icon {
- font-size: 24px;
- margin-bottom: 12px;
- }
- .o-rotating {
- width: 24px;
- height: 24px;
- margin-bottom: 12px;
- }
- }
- }
-}
-
-.o-dialog {
- --dlg-radius: var(--layout-pkg-radius);
-}
diff --git a/docs/.vitepress/src/assets/style/theme/dropdown.scss b/docs/.vitepress/src/assets/style/theme/dropdown.scss
deleted file mode 100644
index 067a83b162e997ea13741446cbedde87576b395c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/dropdown.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.o-dropdown-list {
- --dropdown-list-radius: 4px;
-}
diff --git a/docs/.vitepress/src/assets/style/theme/index.scss b/docs/.vitepress/src/assets/style/theme/index.scss
deleted file mode 100644
index b0555a333f55396f41af3e40df654e543b38acfa..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/index.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-@use './anchor.scss' as *;
-@use './button.scss' as *;
-@use './card.scss' as *;
-@use './dialog.scss' as *;
-@use './dropdown.scss' as *;
-@use './input.scss' as *;
-@use './message.scss' as *;
-@use './select.scss' as *;
-@use './table.scss' as *;
-@use './tag.scss' as *;
-@use './popup.scss' as *;
-@use './tab.scss' as *;
-@use './rate.scss' as *;
-@use './result.scss' as *;
-@use './textarea.scss' as *;
diff --git a/docs/.vitepress/src/assets/style/theme/input.scss b/docs/.vitepress/src/assets/style/theme/input.scss
deleted file mode 100644
index eadcc6d22b6e77ec9f15fd4cd3b6f2534a2113ee..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/input.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.o-input-clear {
- font-size: 20px;
-}
diff --git a/docs/.vitepress/src/assets/style/theme/message.scss b/docs/.vitepress/src/assets/style/theme/message.scss
deleted file mode 100644
index fe6ba2c2c65b116009e2a8b9a63317cdf6447e20..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/message.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-.o-message-list {
- z-index: 1008;
- --app-header-height: 64px;
- --app-footer-height: 300px;
-
- --message-list-top-offset: calc(var(--app-header-height) + 32px);
- --message-list-bottom-offset: calc(var(--app-footer-height) + 32px);
-}
diff --git a/docs/.vitepress/src/assets/style/theme/popup.scss b/docs/.vitepress/src/assets/style/theme/popup.scss
deleted file mode 100644
index 0bc392e4fe2150e2da9f63c95a3f1258c782d7b3..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/popup.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-.o-popup {
- --popup-shadow: var(--o-shadow-2);
- --popup-bd: 1px solid var(--o-color-control4);
- .o-popup-body {
- border-radius: var(--popup-radius);
- }
- .global-feedback-popup {
- border: none;
-
- textarea::placeholder {
- color: var(--o-color-info4);
- }
- }
- .o-popup-anchor {
- z-index: 2;
- }
-}
diff --git a/docs/.vitepress/src/assets/style/theme/rate.scss b/docs/.vitepress/src/assets/style/theme/rate.scss
deleted file mode 100644
index 30ee6f61c561a557eeb931a07d1e38f26eb8aacf..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/rate.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-.o-rate {
- --rate-color: var(--o-color-info4);
- --rate-size: 24px;
-}
diff --git a/docs/.vitepress/src/assets/style/theme/result.scss b/docs/.vitepress/src/assets/style/theme/result.scss
deleted file mode 100644
index 274b722f7c7e9749bb99ee3eaac49b3c8bad83c8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/result.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.o-result-content {
- color: var(--o-color-info1);
-}
diff --git a/docs/.vitepress/src/assets/style/theme/select.scss b/docs/.vitepress/src/assets/style/theme/select.scss
deleted file mode 100644
index 698f1d06d21c16c2258963ba6a1724abbb2c58ba..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/select.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-.o-select {
- --select-icon-size: 20px;
- --select-radius: 4px;
-}
diff --git a/docs/.vitepress/src/assets/style/theme/tab.scss b/docs/.vitepress/src/assets/style/theme/tab.scss
deleted file mode 100644
index bb1ff81127793dc60ba4ef4b370c16b1a3677f70..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/tab.scss
+++ /dev/null
@@ -1,79 +0,0 @@
-.field-tabs {
- > .o-tab-head > .o-tab-navs {
- max-width: var(--layout-content-max-width);
- padding-left: var(--layout-content-padding);
- padding-right: var(--layout-content-padding);
- margin: 0 auto;
- }
-}
-.o-tab {
- --tab-nav-divider: 1px solid var(--o-color-control4);
-}
-.domain-tabs {
- &.min {
- > .o-tab-head {
- .o-tab-nav-anchor {
- display: none;
- }
-
- .o-tab-nav-active {
- color: var(--o-color-info1);
- cursor: default;
- }
- }
- }
- .o-tab-head {
- display: block !important;
- }
- .o-tab-navs {
- --tab-nav-justify: left;
- margin-bottom: 24px;
- }
- .o-table {
- word-break: break-word;
- --table-edge-padding: 24px;
- .arch,
- .appVer {
- width: 250px;
- }
- tbody tr:hover {
- background: none;
- }
- }
-
- // 应用镜像样式
- &.tabs-switch {
- .o-tab-nav-list {
- background: var(--o-color-fill1);
- border-radius: 8px;
- height: 40px;
- padding: 4px;
- .o-tab-nav {
- margin: 0 !important;
- position: relative;
- padding: 2px 12px;
- z-index: 3;
- }
- }
- .o-tab-nav-anchor {
- top: 0;
- padding: 4px 0;
- .o-tab-nav-anchor-line {
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1);
- border-radius: 4px;
- height: 100%;
- background: var(--o-color-fill2);
- }
- }
- }
- &.tabs-one {
- .o-tab-nav-active {
- color: var(--o-color-info1);
- cursor: default;
- padding: 0;
- }
- .o-tab-nav-anchor {
- display: none;
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/theme/table.scss b/docs/.vitepress/src/assets/style/theme/table.scss
deleted file mode 100644
index 54aa764a3250753c7fc7758d239340366ec75756..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/table.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-@use '../mixin/font.scss' as *;
-.o-table {
- --table-edge-padding: 24px;
- --table-cell-padding: 16px 10px;
- --table-head-cell-padding: 12px 10px;
- --table-head-bg: var(--o-color-control3-light);
- --table-color: var(--o-color-info1);
-
- --table-loading-mask: var(--o-color-info4-inverse);
- .o-table-loading-wrap {
- z-index: 99;
- flex-direction: column;
- .o-icon-loading {
- font-size: 24px;
- }
- .o-table-loading-label {
- margin: 12px 0 0;
- @include text1;
- }
- }
-
- th {
- font-weight: 500;
- border-right: 0;
- }
- &.table-version {
- --table-head-bg: var(--o-color-primary1);
- th {
- color: #fff;
- }
- }
- td {
- word-break: break-word;
- }
- &.o-table-small {
- --table-cell-height: auto;
- --table-edge-padding: 24px;
- --table-cell-padding: 8px;
- --table-head-cell-padding: 8px;
- td,
- th {
- @include tip1;
- }
- }
-}
diff --git a/docs/.vitepress/src/assets/style/theme/tag.scss b/docs/.vitepress/src/assets/style/theme/tag.scss
deleted file mode 100644
index 6903316a6aca63eef47ac9c2246558baaec90e24..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/tag.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-.o-tag {
- border-radius: var(--layout-pkg-radius);
- &.o-tag-small {
- --tag-padding: 0 4px;
- }
-}
diff --git a/docs/.vitepress/src/assets/style/theme/textarea.scss b/docs/.vitepress/src/assets/style/theme/textarea.scss
deleted file mode 100644
index d63fe2132cb3192311a8545768abff5e67758169..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/style/theme/textarea.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-@use '../mixin/screen.scss' as *;
-
-.o-textarea {
- height: 126px;
-
- @include respond-to('<=pad') {
- height: 116px;
- }
-}
-
-.o_textarea-textarea {
- &::-webkit-input-placeholder {
- color: var(--o-color-info4);
- }
-}
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-arrow-right.svg b/docs/.vitepress/src/assets/svg-icons/icon-arrow-right.svg
deleted file mode 100644
index 54eec72baadf9c4b6e41c383480dff0f5011aa7b..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-arrow-right.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-chevron-down.svg b/docs/.vitepress/src/assets/svg-icons/icon-chevron-down.svg
deleted file mode 100644
index e33699d7e07f5062ccac143e5d48eda8cf6f53f5..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-chevron-down.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-chevron-right.svg b/docs/.vitepress/src/assets/svg-icons/icon-chevron-right.svg
deleted file mode 100644
index 646c5058cb39e204b88c447d0d19e9e17efc7e5b..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-chevron-right.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-close.svg b/docs/.vitepress/src/assets/svg-icons/icon-close.svg
deleted file mode 100644
index 279157ed3b9bf28765043a3e41632117f2e72c07..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-close.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-copy.svg b/docs/.vitepress/src/assets/svg-icons/icon-copy.svg
deleted file mode 100644
index e95788f2d35b2e6613735d47f45017da800fca16..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-copy.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-delete.svg b/docs/.vitepress/src/assets/svg-icons/icon-delete.svg
deleted file mode 100644
index 0d1256832ad6eed15d682bd9b6e0b83781b1bee8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-delete.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-expand.svg b/docs/.vitepress/src/assets/svg-icons/icon-expand.svg
deleted file mode 100644
index 56ddb7b1d14949873c28c665b311d6c5679785e9..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-expand.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-header-back.svg b/docs/.vitepress/src/assets/svg-icons/icon-header-back.svg
deleted file mode 100644
index b64d9a7c6281ad4ea812246d15ff157044ea62ca..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-header-back.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-header-delete.svg b/docs/.vitepress/src/assets/svg-icons/icon-header-delete.svg
deleted file mode 100644
index 4e1f96a83b92b50b7e1ca3d941051ee93899a180..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-header-delete.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-header-menu.svg b/docs/.vitepress/src/assets/svg-icons/icon-header-menu.svg
deleted file mode 100644
index edf857821413e2003a811cd4793535838f7af2eb..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-header-menu.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-header-moon.svg b/docs/.vitepress/src/assets/svg-icons/icon-header-moon.svg
deleted file mode 100644
index 0ea8cc4417ed9603faa682be7ed03209e61d0e56..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-header-moon.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-header-next.svg b/docs/.vitepress/src/assets/svg-icons/icon-header-next.svg
deleted file mode 100644
index e93dbc59e41400afc986e6bf3de7a1680d27f17a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-header-next.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-header-person.svg b/docs/.vitepress/src/assets/svg-icons/icon-header-person.svg
deleted file mode 100644
index ea47e9ca566d23715ca537cb32ba7586f7914c38..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-header-person.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-header-search.svg b/docs/.vitepress/src/assets/svg-icons/icon-header-search.svg
deleted file mode 100644
index 032308b5e70b9fd3f0ac04a52be937947c9f9c3d..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-header-search.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-out-link.svg b/docs/.vitepress/src/assets/svg-icons/icon-out-link.svg
deleted file mode 100644
index 08056a9dbfe83996088862ca8542c9b0684a8a6e..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-out-link.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-search.svg b/docs/.vitepress/src/assets/svg-icons/icon-search.svg
deleted file mode 100644
index 70235a3b938b0fcc293866752cf3d8f96952e2ce..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-search.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-sun-outline.svg b/docs/.vitepress/src/assets/svg-icons/icon-sun-outline.svg
deleted file mode 100644
index 5bfc68965118ffe7ce1238cca5bf833240cea82d..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-sun-outline.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-tips.svg b/docs/.vitepress/src/assets/svg-icons/icon-tips.svg
deleted file mode 100644
index 5eaa71136ecc61c03f7aadb204e3c7dbf38f268a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-tips.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/.vitepress/src/assets/svg-icons/icon-top.svg b/docs/.vitepress/src/assets/svg-icons/icon-top.svg
deleted file mode 100644
index c571f630a2260ffb113b2de326a2c1603b0300f1..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/assets/svg-icons/icon-top.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
diff --git a/docs/.vitepress/src/components/AppFooter.vue b/docs/.vitepress/src/components/AppFooter.vue
deleted file mode 100644
index 3c76608dc346fce4abe9cae235620c94be3aba5b..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/AppFooter.vue
+++ /dev/null
@@ -1,518 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/ContentWrapper.vue b/docs/.vitepress/src/components/ContentWrapper.vue
deleted file mode 100644
index 02839616a4ec0ef0ad70f08c9aa7ade0e78ca815..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/ContentWrapper.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/CookieNotice.vue b/docs/.vitepress/src/components/CookieNotice.vue
deleted file mode 100644
index 6b4947e7c3c016a9b2bb401a643415201b1450a6..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/CookieNotice.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/DocBreadCrumb.vue b/docs/.vitepress/src/components/DocBreadCrumb.vue
deleted file mode 100644
index 05ee2d9fae2b2a3c217cc1d715ad669b0fbaa2c9..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/DocBreadCrumb.vue
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
-
-
- 文档中心
-
- {{ moduleNode.title }}
- {{ moduleNode.title }}
-
- {{ searchStore.isSearching ? '搜索结果' : currentTitle }}
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/DocBugDialog.vue b/docs/.vitepress/src/components/DocBugDialog.vue
deleted file mode 100644
index 9a9076c5b5c2a01577b6b4b22e577eac095d76eb..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/DocBugDialog.vue
+++ /dev/null
@@ -1,275 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
提交类型
-
-
-
-
- {{ option.label }}
-
-
-
-
-
-
-
问题类型
-
-
-
-
- {{ option.label }}
-
-
-
-
-
-
-
-
-
- 我们可能针对您提出的问题,向您发送邮件反馈方案。如有获奖信息,也会通过此方式通知您
-
-
-
- 您理解并同意,您填写并提交的内容,即视为您已充分阅读并同意openEuler的
- 《隐私政策》
-
-
-
- 提交
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/DocFooter.vue b/docs/.vitepress/src/components/DocFooter.vue
deleted file mode 100644
index 18ab94c181832b408af7d2f57728f6bc9b182e15..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/DocFooter.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/DocMenu.vue b/docs/.vitepress/src/components/DocMenu.vue
deleted file mode 100644
index 5cf84149b3ca1241c418f4bd4d875b8b22f63d7a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/DocMenu.vue
+++ /dev/null
@@ -1,285 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/DocSearch.vue b/docs/.vitepress/src/components/DocSearch.vue
deleted file mode 100644
index 8c2435c44c71cdedd461ec45cb461897a701ad7a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/DocSearch.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/FloatingButton.vue b/docs/.vitepress/src/components/FloatingButton.vue
deleted file mode 100644
index b63a5c42abb50826b800953912474b5d8391ce8c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/FloatingButton.vue
+++ /dev/null
@@ -1,615 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
评分
-
-
-
-
-
-
-
-
文档获取效率
-
-
{{ efficiencyScore / 10 }}
-
-
-
-
-
-
-
-
文档正确性
-
-
{{ correctnessScore / 10 }}
-
-
-
-
-
-
-
-
文档完整性
-
-
{{ integrityScore / 10 }}
-
-
-
-
-
-
-
-
文档易理解
-
-
{{ understandScore / 10 }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.text }}
- {{ item.text2 }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ item.textMb }}
-
-
-
-
-
-
-
-
-
-
-
- 取消
-
- 确定
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/ResultEmpty.vue b/docs/.vitepress/src/components/ResultEmpty.vue
deleted file mode 100644
index 64619c7e46122c98153081383268b760ffbdfaf3..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/ResultEmpty.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/feedback/FeedbackSlider.vue b/docs/.vitepress/src/components/feedback/FeedbackSlider.vue
deleted file mode 100644
index def8fd96a5547cc4381f46c2cbd054023e23ac2a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/feedback/FeedbackSlider.vue
+++ /dev/null
@@ -1,275 +0,0 @@
-
-
-
-
-
-
- {{ t('feedback.title1') }}{{ t('feedback.title2') }} {{ t('feedback.title3') }}
-
-
-
-
- {{ scoreTip }}
-
-
-
-
-
-
- {{ infoData.grade1 }}
- {{ infoData.grade2 }}
-
-
-
-
-
- {{ infoData.more1 }}
-
-
-
- {{ infoData.submit }}
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/AppHeader.vue b/docs/.vitepress/src/components/header/AppHeader.vue
deleted file mode 100644
index 202bf9dac55c7451803e6804042ddfcd5fff9573..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/AppHeader.vue
+++ /dev/null
@@ -1,168 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/HeaderCode.vue b/docs/.vitepress/src/components/header/HeaderCode.vue
deleted file mode 100644
index aab00237f1c1e646c7b1daf863a8d4ece5d0b557..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/HeaderCode.vue
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/HeaderLanguage.vue b/docs/.vitepress/src/components/header/HeaderLanguage.vue
deleted file mode 100644
index 0ec8e9b350045d33cf818bd3e637a8f483545934..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/HeaderLanguage.vue
+++ /dev/null
@@ -1,192 +0,0 @@
-
-
-
-
-
-
- {{ getLang(lang) }}
-
-
-
-
-
- {{ getLang(item.id) }}
-
-
-
-
-
-
- {{
- getLang(item.id)
- }}
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/HeaderLogin.vue b/docs/.vitepress/src/components/header/HeaderLogin.vue
deleted file mode 100644
index d83735038a644e56b9a6391ea92b9286dda3f965..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/HeaderLogin.vue
+++ /dev/null
@@ -1,79 +0,0 @@
-
-
-
-
-
-
-
- {{ username }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/HeaderNav.vue b/docs/.vitepress/src/components/header/HeaderNav.vue
deleted file mode 100644
index 61ddad5637c8ce0976200ce49a29345e53f35694..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/HeaderNav.vue
+++ /dev/null
@@ -1,621 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/HeaderNavMoblie.vue b/docs/.vitepress/src/components/header/HeaderNavMoblie.vue
deleted file mode 100644
index 7d430f4fdb8a92eee3d5c8e77dd773a7fd2d60f8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/HeaderNavMoblie.vue
+++ /dev/null
@@ -1,302 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/HeaderSearch.vue b/docs/.vitepress/src/components/header/HeaderSearch.vue
deleted file mode 100644
index d209a8ad9ef8da4023293dd751358490f6e49d7f..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/HeaderSearch.vue
+++ /dev/null
@@ -1,557 +0,0 @@
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/HeaderTheme.vue b/docs/.vitepress/src/components/header/HeaderTheme.vue
deleted file mode 100644
index 6b6a2a4bad31f89060a097e83dcea6543a65703c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/HeaderTheme.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/NavContent.vue b/docs/.vitepress/src/components/header/NavContent.vue
deleted file mode 100644
index f61b2b3cc18e4e706367df0f071fcf3303f9c279..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/NavContent.vue
+++ /dev/null
@@ -1,232 +0,0 @@
-
-
-
-
-
-
- {{ subItem.NAME }}
-
-
-
- {{ subItem.TAG }}
-
-
-
{{ subItem.DESCRIPTION }}
-
-
-
- {{ system.NAME }}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ subItem.NAME }}
-
-
-
- {{ subItem.TAG }}
-
-
-
-
- {{ subItem.DESCRIPTION }}
-
-
-
-
- {{ system.NAME }}
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/header/NavLink.vue b/docs/.vitepress/src/components/header/NavLink.vue
deleted file mode 100644
index 1cbb6c495ff16aaf915b227077256ace4e27feb1..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/header/NavLink.vue
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/hooks/useClickOutside.ts b/docs/.vitepress/src/components/hooks/useClickOutside.ts
deleted file mode 100644
index dbee26388b24cd8d515b3d7c61f06c847b2d55f8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/hooks/useClickOutside.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { ref, onMounted, onUnmounted, type Ref } from 'vue';
-const useClickOutside = (elementRef: Ref) => {
- const isClickOutside = ref(false);
- const onClick = (e: MouseEvent) => {
- if (elementRef.value) {
- isClickOutside.value = !elementRef.value.contains(e.target as HTMLElement);
- }
- };
- onMounted(() => {
- window.addEventListener('click', onClick);
- });
- onUnmounted(() => {
- window.removeEventListener('click', onClick);
- });
- return isClickOutside;
-};
-
-export default useClickOutside;
diff --git a/docs/.vitepress/src/components/menu/RecursionMenu.vue b/docs/.vitepress/src/components/menu/RecursionMenu.vue
deleted file mode 100644
index 44b2b52de891c6ee44883cc308461533f7c90b92..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/menu/RecursionMenu.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/components/menu/RecursionMenuItem.vue b/docs/.vitepress/src/components/menu/RecursionMenuItem.vue
deleted file mode 100644
index 4867b99f92967abd6d2d3f0f91191ff8253aa586..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/components/menu/RecursionMenuItem.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/composables/useDebounceSearch.ts b/docs/.vitepress/src/composables/useDebounceSearch.ts
deleted file mode 100644
index 122a315a788dd72fea1f44ab8ebda2c73fb4fd68..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/composables/useDebounceSearch.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { useDebounceFn } from '@vueuse/core';
-
-type FunctionArgs = (...args: Args) => Return;
-
-export const useDebounceSearch = (fn: T, delay = 300) => {
- return useDebounceFn(fn, delay);
-};
diff --git a/docs/.vitepress/src/composables/useLocale.ts b/docs/.vitepress/src/composables/useLocale.ts
deleted file mode 100644
index 90ee3a9093a3e66b202f2aefb04c6f6d1c2aac9c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/composables/useLocale.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-import { computed, onMounted } from 'vue';
-import { useData } from 'vitepress/client';
-import { isClient, isUndefined } from '@opensig/opendesign';
-
-import type { LocaleT } from '@/@types/type-locale';
-
-import i18n from '@/i18n';
-interface LocaleItemDeatilT {
- [key: string]: string;
-}
-interface LocaleItemT {
- [key: string]: LocaleItemDeatilT;
-}
-export const useLocale = () => {
- const { lang } = useData();
-
- const locale = computed(() => {
- if (lang.value === 'zh' || lang.value === 'en') {
- return lang.value === 'zh' ? 'zh' : 'en';
- } else {
- if (isClient) {
- const { pathname } = window.location;
- if (pathname.startsWith('/zh/')) {
- return 'zh';
- } else if (pathname.startsWith('/en/')) {
- return 'en';
- } else {
- if (localStorage.getItem('locale')) {
- return localStorage.getItem('locale') === 'zh' ? 'zh' : 'en';
- } else {
- return navigator.language.toLowerCase().startsWith('zh') ? 'zh' : 'en';
- }
- }
- }
-
- return 'zh';
- }
- });
-
- const isZh = computed(() => locale.value === 'zh');
- const isEn = computed(() => locale.value === 'en');
-
- // 语言切换
- const changeLocale = (lang?: LocaleT) => {
- if (locale.value === lang) {
- return;
- }
-
- const language = isUndefined(lang) ? (isZh.value ? 'en' : 'zh') : lang;
- if (isClient) {
- const { pathname } = window.location;
- const newPathName = pathname.replace(`/${locale.value}/`, `/${language}/`);
- localStorage.setItem('locale', language);
- window.location.pathname = newPathName;
- }
- };
-
- const t = (val: string, replacements?: string | string[] | number[]) => {
- const [category, key] = val.split('.');
- const info: LocaleItemT = i18n.global.messages.value[locale.value];
- if (info) {
- const item = info[category];
- if (item) {
- let value = item[key];
- if (replacements) {
- if (Array.isArray(replacements)) {
- replacements.forEach((replacement, index) => {
- value = value?.replace(`{${index}}`, String(replacement));
- });
- } else {
- value = value?.replace(`{0}`, replacements);
- }
- }
- return value;
- }
- }
- };
-
- const $t = t;
-
- onMounted(() => {
- if (locale.value) {
- localStorage.setItem('locale', locale.value);
- }
- });
-
- return {
- $t,
- t,
- locale,
- isZh,
- isEn,
- changeLocale,
- };
-};
diff --git a/docs/.vitepress/src/composables/useRoute.ts b/docs/.vitepress/src/composables/useRoute.ts
deleted file mode 100644
index fb5879ff912fecbe9705d402db331a29c6699e5a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/composables/useRoute.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { computed, onMounted, onUnmounted, readonly, ref } from 'vue';
-import { useRouter } from 'vitepress';
-import { isClient } from '@opensig/opendesign';
-
-export const useRoute = () => {
- const router = useRouter();
- const href = ref(isClient ? window.location.href : '');
- const hash = ref(isClient ? window.location.hash : '');
-
- const pathname = computed(() => router.route.path);
- const url = computed(() => {
- return isClient ? href.value.replace(window.location.origin, '') : '';
- });
-
- const hashchange = () => {
- href.value = window.location.href || '';
- hash.value = window.location.hash || '';
- };
-
- onMounted(() => {
- window.addEventListener('hashchange', hashchange);
- })
-
- onUnmounted(() => {
- window.removeEventListener('hashchange', hashchange);
- })
-
-
- router.onAfterRouteChanged = () => {
- hash.value = window.location.hash || '';
- href.value = window.location.href || '';
- };
-
- return {
- href: readonly(href),
- hash: readonly(hash),
- pathname,
- url,
- };
-}
diff --git a/docs/.vitepress/src/composables/useScreen.ts b/docs/.vitepress/src/composables/useScreen.ts
deleted file mode 100644
index ac5deec9acdc06b81de2479c56a38eb82459fefd..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/composables/useScreen.ts
+++ /dev/null
@@ -1,150 +0,0 @@
-import { ref, reactive, computed, onMounted, onUnmounted, nextTick } from 'vue';
-
-export enum Size {
- Phone = 'phone',
- PadV = 'pad_v',
- PadH = 'pad_h',
- Laptop = 'laptop',
-}
-
-export type ScreenSizeT = typeof Size.Phone | Size.PadV | Size.PadH | Size.Laptop;
-
-export const ScreenConfig = {
- [Size.Phone]: 600,
- [Size.PadV]: 840,
- [Size.PadH]: 1200,
- [Size.Laptop]: 1440,
-};
-
-/**
- * lt: less than, 小于 <
- * le: less than or equal to, 小于等于 <=
- * eq: equal to, 等于 =
- * ne: never equal to, 不等于 !=
- * ge: greater than or equal to, 大于等于 >=
- * gt: greater than, 大于 >
- */
-export type CompareT = 'lt' | 'le' | 'eq' | 'ne' | 'ge' | 'gt';
-
-const CompareHandler = {
- lt: (a: number, b: number) => a < b,
- le: (a: number, b: number) => a <= b,
- eq: (a: number, b: number) => a === b,
- ne: (a: number, b: number) => a !== b,
- ge: (a: number, b: number) => a >= b,
- gt: (a: number, b: number) => a > b,
-};
-
-export const useScreen = () => {
- const screenSize = reactive({
- width: 1440,
- height: 0,
- });
-
- const current = ref(Size.Laptop);
-
- const getSize = (width?: number) => {
- if (typeof width === 'undefined') {
- width = screenSize.width;
- }
- if (width < ScreenConfig[Size.Phone]) {
- return Size.Phone;
- } else if (width < ScreenConfig[Size.PadV]) {
- return Size.PadV;
- } else if (width < ScreenConfig[Size.PadH]) {
- return Size.PadH;
- } else {
- return Size.Laptop;
- }
- };
-
- const compare = (type: CompareT = 'eq', size: ScreenSizeT) => {
- const w1 = screenSize.width;
- const w2 = ScreenConfig[size];
- const handler = CompareHandler[type];
- return handler(w1, w2);
- };
-
- /**
- * phone
- */
- const isPhone = computed(() => compare('le', Size.Phone)); // [0, 600]
- const gtPhone = computed(() => compare('gt', Size.Phone)); // [601, -]
-
- /**
- * pad
- */
- const isPad = computed(() => compare('gt', Size.Phone) && compare('le', Size.PadH)); // [601, 1200]
- const lePad = computed(() => compare('le', Size.PadH)); // [0, 1200]
- const gtPad = computed(() => compare('gt', Size.PadH)); // [1201, -]
-
- /**
- * pad_v
- */
- const isPadV = computed(() => compare('gt', Size.Phone) && compare('le', Size.PadV)); // [601, 840]
- const lePadV = computed(() => compare('le', Size.PadV)); // [0, 840]
- const gtPadV = computed(() => compare('gt', Size.PadV)); // [841, -]
-
- /**
- * pad_h
- */
- const isPadH = computed(() => compare('gt', Size.PadV) && compare('le', Size.PadH)); // [841, 1200]
-
- /**
- * laptop
- */
- const isLaptop = computed(() => compare('gt', Size.PadH) && compare('le', Size.Laptop)); // [1201, 1440]
- const leLaptop = computed(() => compare('le', Size.Laptop)); // [0, 1440]
- const gtLaptop = computed(() => compare('gt', Size.Laptop)); // [1441, -]
- const isPadToLaptop = computed(() => compare('gt', Size.Phone) && compare('le', Size.Laptop)); // [601, 1440]
- const isPadVToLaptop = computed(() => compare('gt', Size.PadV) && compare('le', Size.Laptop)); // [841, 1440]
-
- const onWindowResize = () => {
- const { innerWidth, innerHeight } = window;
- screenSize.width = innerWidth;
- screenSize.height = innerHeight;
- current.value = getSize();
- };
-
- onMounted(() => {
- if (typeof window !== 'undefined') {
- window.addEventListener('resize', onWindowResize);
- onWindowResize();
- nextTick(() => onWindowResize());
- }
- });
-
- onUnmounted(() => {
- if (typeof window !== 'undefined') {
- window.removeEventListener('resize', onWindowResize);
- }
- });
-
- return {
- // 获取屏幕宽度分级
- getSize,
- // 当前屏幕分级
- current,
- // 当前屏幕宽度
- size: screenSize,
-
- isPhone, // [0, 600]
- gtPhone, // [601, -]
-
- isPad, // [601, 1200]
- lePad, // [0, 1200]
- gtPad, // [1201, -]
-
- isPadV, // [601, 840]
- lePadV, // [0, 840]
- gtPadV, // [841, -]
-
- isPadH, // [841, 1200]
-
- isLaptop, // [1201, 1440]
- leLaptop, // [0, 1440]
- gtLaptop, // [1441, -]
- isPadToLaptop, // [601, 1440]
- isPadVToLaptop, // [841, 1440]
- };
-};
diff --git a/docs/.vitepress/src/composables/useSelect.ts b/docs/.vitepress/src/composables/useSelect.ts
deleted file mode 100644
index 163168d9b53ba041f5f491bc6b5f61ad114b675d..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/composables/useSelect.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-import { computed, onMounted, onUnmounted, ref } from 'vue';
-import { inBrowser } from 'vitepress';
-
-const useSelect = (selector: string) => {
- const start = ref([0, 0]); // 鼠标开始位置
- const end = ref([0, 0]); // 鼠标结束位置
- const visible = ref(false); // 是否展示菜单
- const selectionText = ref(); // 选中的内容
-
- const x = computed(() => (start.value[0] + end.value[0]) / 2);
- const y = computed(() => {
- if (scrollY.value) {
- return scrollY.value;
- }
- return Math.min(start.value[1], end.value[1]) - 12;
- });
-
- const mouseDown = (e: MouseEvent) => {
- start.value = [e.x, e.y];
- visible.value = false;
- };
- const mouseUp = (e: MouseEvent) => {
- end.value = [e.x, e.y];
- selectionText.value = window.getSelection()?.toString();
- visible.value = !!selectionText.value?.length && (start.value[0] !== end.value[0] || start.value[1] !== end.value[1]);
- scrollY.value = 0;
- };
-
- const scrollTop = ref(0); // 当前已滚动距离
- const scrollY = ref(0); // 滚动时popover的位置
-
- const scroll = ({ target }: { target: HTMLElement } & any) => {
- if (visible.value) {
- scrollY.value = y.value - target.scrollTop + scrollTop.value;
- }
- scrollTop.value = target.scrollTop;
- };
-
- const addEventListener = () => {
- const ele = document.querySelector(selector) as HTMLElement;
- if (ele) {
- ele.addEventListener('mousedown', mouseDown);
- ele.addEventListener('mouseup', mouseUp);
- const scrollWrapper = document.querySelector('#app > .o-scroller > .o-scroller-container') as HTMLElement;
- if (scrollWrapper) {
- scrollWrapper.addEventListener('scroll', scroll);
- }
- } else {
- requestIdleCallback(addEventListener);
- }
- };
-
- onMounted(() => {
- if (!inBrowser) return;
- addEventListener();
- });
-
- onUnmounted(() => {
- if (!inBrowser) return;
- const ele = document.querySelector(selector) as HTMLElement;
- if (!ele) return;
- ele?.removeEventListener('mousedown', mouseDown);
- ele?.removeEventListener('mouseup', mouseUp);
- const scrollWrapper = document.querySelector('#app > .o-scroller > .o-scroller-container');
- if (scrollWrapper) {
- scrollWrapper.removeEventListener('scroll', scroll);
- }
- });
-
- return {
- x,
- y,
- visible,
- selectionText,
- };
-};
-
-export default useSelect;
diff --git a/docs/.vitepress/src/composables/useVisibleHeight.ts b/docs/.vitepress/src/composables/useVisibleHeight.ts
deleted file mode 100644
index 0fa31e803f461d299c2331baf2463b6a4885ce21..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/composables/useVisibleHeight.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import { isClient } from "@opensig/opendesign";
-import { onMounted, onUnmounted, readonly, ref } from "vue";
-
-export const useVisibleHeight = (parentSelector: string, childSelector: string) => {
- const height = ref(0);
- let observer: IntersectionObserver | null;
-
- if (isClient) {
- observer = new IntersectionObserver(
- (entries) => {
- entries.forEach((entry) => {
- if (entry.isIntersecting) {
- const parent = document.querySelector(parentSelector);
- const child = document.querySelector(childSelector);
- if (parent && child) {
- const parentRect = parent.getBoundingClientRect();
- const childRect = child.getBoundingClientRect();
- const visibleTop = Math.max(0, childRect.top - parentRect.top);
- const visibleBottom = Math.min(parentRect.bottom, childRect.bottom) - parentRect.top;
- const visibleHeight = visibleBottom - visibleTop;
- height.value = visibleHeight > 0 ? visibleHeight : 0;
- }
- } else {
- height.value = 0;
- }
- });
- },
- {
- threshold: Array.from({ length: 90 }, (_, i) => (i + 10) / 100),
- }
- );
- }
-
- onMounted(() => {
- const footer = document.querySelector('.ly-footer');
- if (footer) {
- observer?.observe(footer);
- }
- });
-
- onUnmounted(() => {
- const footer = document.querySelector('.ly-footer');
- if (footer) {
- observer?.unobserve(footer);
- }
-
- observer = null;
- });
-
- return readonly(height);
-};
\ No newline at end of file
diff --git a/docs/.vitepress/src/config/footer.ts b/docs/.vitepress/src/config/footer.ts
deleted file mode 100644
index 7951bed4e9a119e9127c7596f1e90d70905cbabb..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/config/footer.ts
+++ /dev/null
@@ -1,463 +0,0 @@
-// 中文媒体链接
-import LogoBilibili from '@/assets/category/footer/bilibili.png';
-import LogoToutiao from '@/assets/category/footer/toutiao.png';
-import LogoJuejin from '@/assets/category/footer/juejin.png';
-import LogoOschina from '@/assets/category/footer/oschina.png';
-import LogoCsdn from '@/assets/category/footer/csdn.png';
-
-// 英文媒体链接
-import LogoRedditSquare from '@/assets/category/footer/reddit-square.png';
-import LogoLinkedin from '@/assets/category/footer/linkdin.png';
-import LogoYoutube from '@/assets/category/footer/youtube.png';
-import LogoTwitter from '@/assets/category/footer/x.png';
-
-// 中文媒体链接
-import LogoBilibiliHover from '@/assets/category/footer/bilibili_hover.png';
-import LogoToutiaoHover from '@/assets/category/footer/toutiao_hover.png';
-import LogoJuejinHover from '@/assets/category/footer/juejin_hover.png';
-import LogoOschinaHover from '@/assets/category/footer/oschina_hover.png';
-import LogoCsdnHover from '@/assets/category/footer/csdn_hover.png';
-
-// 英文媒体链接
-import LogoRedditSquareHover from '@/assets/category/footer/reddit-square_hover.png';
-import LogoLinkedinHover from '@/assets/category/footer/linkdin_hover.png';
-import LogoYoutubeHover from '@/assets/category/footer/youtube_hover.png';
-import LogoTwitterHover from '@/assets/category/footer/x_hover.png';
-
-// 媒体链接
-export const linksData = {
- zh: [
- {
- path: 'https://my.oschina.net/openeuler',
- logo: {
- normal: LogoOschina,
- hover: LogoOschinaHover,
- },
- id: 'oschina',
- height: 14,
- },
- {
- path: 'https://blog.csdn.net/openEuler_?spm=1000.2115.3001.5343',
- logo: {
- normal: LogoCsdn,
- hover: LogoCsdnHover,
- },
- id: 'csdn',
- height: 11,
- },
- {
- path: 'https://juejin.cn/user/3183782863845454',
- logo: {
- normal: LogoJuejin,
- hover: LogoJuejinHover,
- },
- id: 'juejin',
- height: 11,
- },
- {
- path: 'https://space.bilibili.com/527064077/channel/series',
- logo: {
- normal: LogoBilibili,
- hover: LogoBilibiliHover,
- },
- id: 'bilibili',
- height: 13,
- },
- {
- path: 'https://www.toutiao.com/c/user/token/MS4wLjABAAAAZivzVkJzMyQ44GzmX1i_ON0bgxL3E8ybHC-P9HMqZiqUgpYVnjCjynDt-SebKN7r',
- logo: {
- normal: LogoToutiao,
- hover: LogoToutiaoHover,
- },
- id: 'toutiao',
- height: 13,
- },
- ],
- en: [
- {
- path: 'https://www.linkedin.com/company/openeuler',
- logo: {
- normal: LogoLinkedin,
- hover: LogoLinkedinHover,
- },
- id: 'linkedin',
- height: 16,
- },
- {
- path: 'https://x.com/openEuler',
- logo: {
- normal: LogoTwitter,
- hover: LogoTwitterHover,
- },
- id: 'twitter',
- height: 16,
- },
- {
- path: 'https://www.youtube.com/channel/UCPzSqXqCgmJmdIicbY7GAeA',
- logo: {
- normal: LogoYoutube,
- hover: LogoYoutubeHover,
- },
- id: 'youtube',
- height: 12,
- },
- {
- path: 'https://www.reddit.com/r/openEuler/',
- logo: {
- normal: LogoRedditSquare,
- hover: LogoRedditSquareHover,
- },
- id: 'reddit-square',
- height: 16,
- },
- ],
-};
-// 隐私链接
-export const linksData2 = {
- zh: [
- {
- NAME: '品牌',
- URL: 'https://www.openeuler.org/zh/other/brand/',
- },
- {
- NAME: '隐私政策',
- URL: 'https://www.openeuler.org/zh/other/privacy/',
- },
- {
- NAME: '法律声明',
- URL: 'https://www.openeuler.org/zh/other/legal/',
- },
- {
- NAME: '关于cookies',
- URL: 'https://www.openeuler.org/zh/other/cookies/',
- },
- ],
- en: [
- {
- NAME: 'Trademark',
- URL: 'https://www.openeuler.org/en/other/brand/',
- },
- {
- NAME: 'Privacy Policy',
- URL: 'https://www.openeuler.org/en/other/privacy/',
- },
- {
- NAME: 'Legal Notice',
- URL: 'https://www.openeuler.org/en/other/legal/',
- },
- {
- NAME: 'About Cookies',
- URL: 'https://www.openeuler.org/en/other/cookies/',
- },
- ],
-};
-// 底部导航数据
-export const quickNav = {
- zh: [
- {
- title: '关于openEuler',
- list: [
- {
- title: '成员单位',
- link: '/zh/community/member/',
- },
- {
- title: '组织架构',
- link: '/zh/community/organization/',
- },
- {
- title: '社区章程',
- link: '/zh/community/charter/',
- },
- {
- title: '贡献看板',
- link: 'https://datastat.openeuler.org/zh/overview',
- },
- {
- title: '社区介绍',
- link: '/whitepaper/openEuler%20%E5%BC%80%E6%BA%90%E7%A4%BE%E5%8C%BA%E4%BB%8B%E7%BB%8D.pdf',
- },
- ],
- },
- {
- title: '新闻与资讯',
- list: [
- {
- title: '新闻',
- link: '/zh/interaction/news-list/',
- },
- {
- title: '博客',
- link: '/zh/interaction/blog-list/',
- },
- {
- title: '白皮书',
- link: '/zh/showcase/technical-white-paper/',
- },
- ],
- },
- {
- title: '获取与下载',
- list: [
- {
- title: '获取openEuler操作系统',
- link: '/zh/download/#get-openeuler',
- },
- {
- title: '最新社区发行版',
- link: '/zh/download/',
- },
- {
- title: '商业发行版',
- link: '/zh/download/commercial-release/',
- },
- {
- title: '软件中心',
- link: 'https://easysoftware.openeuler.org/zh',
- },
- ],
- },
- {
- title: '支持与服务',
- list: [
- {
- title: '文档',
- link: 'https://docs.openeuler.org/zh/',
- },
- {
- title: 'FAQ',
- link: 'https://www.openeuler.org/zh/faq/',
- },
- {
- title: '联系我们',
- link: '/zh/contact-us/',
- },
- // {
- // title: '反馈问题',
- // link: '',
- // },
- ],
- },
- {
- title: '互动与交流',
- list: [
- {
- title: '邮件列表',
- link: '/zh/community/mailing-list/',
- },
- {
- title: '活动',
- link: '/zh/interaction/event-list/',
- },
- {
- title: '论坛',
- link: 'https://forum.openeuler.org/',
- },
- ],
- },
- {
- title: '贡献与成长',
- list: [
- {
- title: 'SIG中心',
- link: '/zh/sig/sig-list/',
- },
- {
- title: '贡献攻略',
- link: '/zh/community/contribution/',
- },
- {
- title: '课程中心',
- link: '/zh/learn/mooc/',
- },
- ],
- },
- ],
- en: [
- {
- title: 'About openEuler',
- list: [
- {
- title: 'Members',
- link: '/en/community/member/',
- },
- {
- title: 'Governance',
- link: '/en/community/organization/',
- },
- {
- title: 'Code of Conduct',
- link: '/en/community/charter/',
- },
- {
- title: 'Statistics',
- link: 'https://datastat.openeuler.org/en/overview',
- },
- ],
- },
- {
- title: 'News & Blogs',
- list: [
- {
- title: 'News',
- link: '/en/interaction/news-list/',
- },
- {
- title: 'Blogs',
- link: '/en/interaction/blog-list/',
- },
- {
- title: 'White Papers',
- link: '/en/showcase/technical-white-paper/',
- },
- ],
- },
- {
- title: 'Access',
- list: [
- {
- title: 'openEuler Is Everywhere',
- link: '/en/download/#get-openeuler',
- },
- {
- title: 'Latest Community Releases',
- link: '/en/download/',
- },
- {
- title: 'Commercial Releases',
- link: '/en/download/commercial-release/',
- },
- // {
- // title: '软件中心',
- // link: 'https://easysoftware.openeuler.org/en',
- // },
- ],
- },
- {
- title: 'Services & Resources',
- list: [
- {
- title: 'Documentation',
- link: 'https://docs.openeuler.org/en/',
- },
- {
- title: 'FAQ',
- link: 'https://www.openeuler.org/en/faq/',
- },
- {
- title: 'Contact Us',
- link: '/en/contact-us/',
- },
- // {
- // title: '反馈问题',
- // link: '',
- // },
- ],
- },
- {
- title: 'Communicate',
- list: [
- {
- title: 'Mailing Lists',
- link: '/en/community/mailing-list/',
- },
- {
- title: 'Activities',
- link: '/en/interaction/event-list/',
- },
- {
- title: 'Forum',
- link: 'https://forum.openeuler.org/',
- },
- ],
- },
- {
- title: 'Contribute',
- list: [
- {
- title: 'SIGs',
- link: '/en/sig/sig-list/',
- },
- {
- title: 'Contribution Guide',
- link: '/en/community/contribution/',
- },
- {
- title: 'Training',
- link: '/zh/learn/mooc/',
- },
- ],
- },
- ],
-};
-
-export const friendshipLinks = {
- zh: [
- {
- link: 'http://www.mulanos.cn/',
- title: '木兰开源社区',
- },
- {
- link: 'https://www.hikunpeng.com/zh/',
- title: '鲲鹏社区',
- },
- {
- link: 'http://ic-openlabs.huawei.com/chat/#/',
- title: '鲲鹏小智',
- },
- {
- link: 'https://pcl.ac.cn/',
- title: '鹏城实验室',
- },
- {
- link: 'https://www.infoq.cn/?utm_source=openeuler&utm_medium=youlian',
- title: 'infoQ',
- },
- {
- link: 'https://kaiyuanshe.cn/',
- title: '开源社',
- },
- {
- link: 'http://www.vulab.com.cn/',
- title: '中科微澜',
- },
- {
- link: 'https://www.authing.cn/',
- title: 'Authing',
- },
- {
- link: 'https://www.opengauss.org/zh/',
- title: 'openGauss',
- },
- {
- link: 'https://www.mindspore.cn/',
- title: '昇思MindSpore',
- },
- {
- link: 'http://www.ebaina.com/',
- title: 'Ebaina',
- },
- ],
- en: [
- {
- link: 'https://www.infoq.cn/?utm_source=openeuler&utm_medium=youlian',
- title: 'infoQ',
- },
- {
- link: 'https://www.authing.cn/',
- title: 'Authing',
- },
- {
- link: 'https://www.opengauss.org/en/',
- title: 'openGauss',
- },
- {
- link: 'https://www.mindspore.cn/',
- title: 'MindSpore',
- },
- {
- link: 'http://www.ebaina.com/',
- title: 'Ebaina',
- },
- ],
-};
diff --git a/docs/.vitepress/src/config/home.ts b/docs/.vitepress/src/config/home.ts
deleted file mode 100644
index f93f043f4b0aa3e9e6a285db21e60d2d6719df16..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/config/home.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import BgStarted from '@/assets/category/home/started-bg.png';
-import BgStartedMo from '@/assets/category/home/started-mo-bg.png';
-import BgInstallGuide from '@/assets/category/home/install-guide-bg.png';
-import BgInstallGuideMo from '@/assets/category/home/started-mo-bg.png';
-import BgX2 from '@/assets/category/home/x2-bg.png';
-import BgX2Mo from '@/assets/category/home/x2-mo-bg.png';
-import BgQa from '@/assets/category/home/qa-bg.png';
-import BgQaMo from '@/assets/category/home/qa-mo-bg.png';
-
-import BgStartedDark from '@/assets/category/home/started-bg-dark.png';
-import BgStartedMoDark from '@/assets/category/home/started-mo-bg-dark.png';
-import BgInstallGuideDark from '@/assets/category/home/install-guide-bg-dark.png';
-import BgInstallGuideMoDark from '@/assets/category/home/install-mo-bg-dark.png';
-import BgX2Dark from '@/assets/category/home/x2-bg-dark.png';
-import BgX2MoDark from '@/assets/category/home/x2-mo-bg-dark.png';
-import BgQaDark from '@/assets/category/home/qa-bg-dark.png';
-import BgQaMoDark from '@/assets/category/home/qa-mo-bg-dark.png';
-
-import IconServer from '~icons/home/server.svg';
-import BgServer from '@/assets/category/home/server-bg.png';
-import IconVirtualization from '~icons/home/virtualization.svg';
-import BgVirtualization from '@/assets/category/home/virtualization-bg.png';
-import IconCloud from '~icons/home/cloud.svg';
-import BgCloud from '@/assets/category/home/cloud-bg.png';
-import IconEdgeComputing from '~icons/home/edge-computing.svg';
-import BgEdgeComputing from '@/assets/category/home/edge-computing-bg.png';
-import IconEmbedded from '~icons/home/embedded.svg';
-import BgEmbedded from '@/assets/category/home/embedded-bg.png';
-
-// 卡片
-export const cardList = [
- {
- background: {
- light: BgStarted,
- dark: BgStartedDark,
- },
- backgroundMo: {
- light: BgStartedMo,
- dark: BgStartedMoDark,
- },
- title: '新手入门',
- desc: '10分钟玩转社区,快速构建与成长',
- href: '/zh/Server/Quickstart/Quickstart/quick-start.html',
- },
- {
- background: {
- light: BgInstallGuide,
- dark: BgInstallGuideDark,
- },
- backgroundMo: {
- light: BgInstallGuideMo,
- dark: BgInstallGuideMoDark,
- },
- title: '安装指南',
- desc: '指导用户顺利完成 openEuler 操作系统安装',
- href: '/zh/Server/InstallationUpgrade/Installation/installation.html',
- },
- {
- background: {
- light: BgQa,
- dark: BgQaDark,
- },
- backgroundMo: {
- light: BgQaMo,
- dark: BgQaMoDark,
- },
- title: '常见问题',
- desc: '常见问题解决方法',
- href: 'https://www.openeuler.org/zh/faq/',
- },
- {
- background: {
- light: BgX2,
- dark: BgX2Dark,
- },
- backgroundMo: {
- light: BgX2Mo,
- dark: BgX2MoDark,
- },
- title: '贡献指南',
- desc: '参与文档贡献的方式',
- href: '/zh/Contribute/contribution_process.html',
- },
-];
-
-// 业务场景
-export const businessScenarioList = [
- {
- icon: IconServer,
- background: BgServer,
- title: '服务器',
- desc: '提供服务器场景的安装升级、管理运维、性能调优、应用开发等操作指南。',
- href: '/zh/Server.html',
- },
- {
- icon: IconVirtualization,
- background: BgVirtualization,
- title: '虚拟化',
- desc: '提供虚拟化场景(云计算)的用户指南,帮助用户了解虚拟化,以及安装和使用虚拟化。',
- href: '/zh/Virtualization.html',
- },
- {
- icon: IconCloud,
- background: BgCloud,
- title: '云原生',
- desc: '提供云原生场景(云计算)的用户指南,帮助用户安装和使用容器,部署集群等。',
- href: '/zh/Cloud.html',
- },
- {
- icon: IconEdgeComputing,
- background: BgEdgeComputing,
- title: '边缘计算',
- desc: '提供KubeEdge、K3S的安装和使用介绍。',
- href: '/zh/EdgeComputing.html',
- },
- {
- icon: IconEmbedded,
- background: BgEmbedded,
- title: '嵌入式',
- desc: '提供嵌入式场景的镜像构建、应用开发、系统管理等操作指南。',
- href: '/zh/Embedded.html',
- },
-];
-
-export const toolList = [
- {
- title: '社区工具',
- desc: '提供镜像构建、编译、测试、性能优化、迁移、发布、软件包构建、虚拟化工具使用指南,如isocut、imageTailor、A-Tune、oeA…',
- href: '/zh/Tools/CommunityTools.html',
- },
- {
- title: 'DevOps(社区服务)',
- desc: '提供社区服务使用指南,包括patch-tracking、pkgship、EulerMaker、EulerDev…',
- href: '/zh/Tools/DevOps.html',
- },
- {
- title: 'AI',
- desc: '提供EulerCopilot智能问答使用指南、AI大模型服务镜像使用指南。',
- href: '/zh/Tools/AI.html',
- },
- {
- title: '图形桌面使用',
- desc: '提供桌面环境的安装和使用指南,包括UKUI、DDE、XFCE、Gnome、Kiran、I3',
- href: '/zh/Tools/desktop.html',
- },
- {
- title: '云原生',
- desc: '提供虚拟户场景下常用工具用户指南,包含虚拟机数据收集和分析工具vmtop,qemu热补丁框架工具LibcarePlus',
- href: '/zh/Tools/Cloud.html',
- },
- {
- title: '系统运维',
- desc: '提供服务器运维常用工具使用指南,包含智能运维框架Aops,异常监控服务sysmonitor',
- href: '/zh/Tools/Maintenance.html',
- },
- {
- title: '安全',
- desc: '提供服务器安全配置常用工具使用指南,包含机密计算统一开发框架secGear、OS内构入侵检测系统secDetector、安全防护系统safeg…',
- href: '/zh/Tools/Security.html',
- },
-];
diff --git a/docs/.vitepress/src/config/menu.ts b/docs/.vitepress/src/config/menu.ts
deleted file mode 100644
index db934668086aed3903ed05adf5ae651d884a84b0..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/config/menu.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-// @ts-ignore
-import MENU from '/menu/menu.json?url&raw';
-
-export const MENU_CONFIG = JSON.parse(MENU);
diff --git a/docs/.vitepress/src/config/version.ts b/docs/.vitepress/src/config/version.ts
deleted file mode 100644
index fbb1cee9b7d90fa1d088753291f72606fa3342f7..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/config/version.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export const versions = [
- { version: '25.03' },
- { version: '24.03 LTS SP1', href: 'https://docs.openeuler.org/zh/docs/24.03_LTS_SP1/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '22.03 LTS SP4', href: 'https://docs.openeuler.org/zh/docs/22.03_LTS_SP4/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '24.03 LTS', href: 'https://docs.openeuler.org/zh/docs/24.03_LTS/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '22.03 LTS SP3', href: 'https://docs.openeuler.org/zh/docs/22.03_LTS_SP3/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '20.03 LTS SP4', href: 'https://docs.openeuler.org/zh/docs/20.03_LTS_SP4/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '22.03 LTS SP1', href: 'https://docs.openeuler.org/zh/docs/22.03_LTS_SP1/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '24.09', href: 'https://docs.openeuler.org/zh/docs/24.09/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '23.09', href: 'https://docs.openeuler.org/zh/docs/23.09/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '22.03 LTS SP2', href: 'https://docs.openeuler.org/zh/docs/22.03_LTS_SP2/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '23.03', href: 'https://docs.openeuler.org/zh/docs/23.03/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '22.09', href: 'https://docs.openeuler.org/zh/docs/22.09/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '22.03 LTS', href: 'https://docs.openeuler.org/zh/docs/22.03_LTS/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '20.03 LTS SP3', href: 'https://docs.openeuler.org/zh/docs/20.03_LTS_SP3/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '21.09', href: 'https://docs.openeuler.org/zh/docs/21.09/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '20.03 LTS SP2', href: 'https://docs.openeuler.org/zh/docs/20.03_LTS_SP2/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '21.03', href: 'https://docs.openeuler.org/zh/docs/21.03/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '20.03 LTS SP1', href: 'https://docs.openeuler.org/zh/docs/20.03_LTS_SP1/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '20.09', href: 'https://docs.openeuler.org/zh/docs/20.09/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
- { version: '20.03 LTS', href: 'https://docs.openeuler.org/zh/docs/20.03_LTS/docs/Releasenotes/%E6%B3%95%E5%BE%8B%E5%A3%B0%E6%98%8E.html' },
-];
diff --git a/docs/.vitepress/src/directives/highlight.ts b/docs/.vitepress/src/directives/highlight.ts
deleted file mode 100644
index 174322c585f25c8c5149fed882cceb18e83a61ed..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/directives/highlight.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import hljs from 'highlight.js';
-
-export default {
- mounted(el: HTMLElement, binding: { value: boolean }) {
- if (binding.value) {
- hljs.configure({
- ignoreUnescapedHTML: true,
- });
- const blocks: NodeList = el.querySelectorAll('pre code');
- blocks.forEach((block) => {
- hljs.highlightElement(block as HTMLElement);
- });
- }
- },
-};
diff --git a/docs/.vitepress/src/directives/index.ts b/docs/.vitepress/src/directives/index.ts
deleted file mode 100644
index e73e54a55ae6ce33becb29e462b2b36e9cec3b7c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/directives/index.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type { Directive } from 'vue';
-import vHighlight from './highlight';
-
-const directives: { [key: string]: Directive } = {
- highlight: vHighlight,
-};
-
-export default directives;
diff --git a/docs/.vitepress/src/i18n/common/common-en.ts b/docs/.vitepress/src/i18n/common/common-en.ts
deleted file mode 100644
index e038e68466b0bc5b53ebaf4dd278380fbf70d1f4..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/common/common-en.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export default {
- returnHome: 'Back to Homepage',
- empty: 'No data available',
-};
diff --git a/docs/.vitepress/src/i18n/common/common-zh.ts b/docs/.vitepress/src/i18n/common/common-zh.ts
deleted file mode 100644
index c52b495bc8289d2ccd795bdf2e99f2064fd6c23a..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/common/common-zh.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export default {
- returnHome: '返回首页',
- empty: '暂无数据',
-};
diff --git a/docs/.vitepress/src/i18n/common/index.ts b/docs/.vitepress/src/i18n/common/index.ts
deleted file mode 100644
index 5e71d72c1d9ad7ef20febc50832f46fe39e82f91..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/common/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import zh from './common-zh';
-import en from './common-en';
-
-export default {
- zh,
- en,
-};
diff --git a/docs/.vitepress/src/i18n/docs/docs-en.ts b/docs/.vitepress/src/i18n/docs/docs-en.ts
deleted file mode 100644
index 28b9e8db9c1a42691b6d683d420f497fcad2a14c..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/docs/docs-en.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export default {
- inputTip: 'Enter a keyword.',
- origin: 'Source',
- noResultText: 'No result is found. Try other keywords.',
- find: 'find',
- result: 'result',
- searchResult: 'Search Result',
- copySuccess: 'Copied successfully.',
- document: 'Document',
- anchorTip: 'Content on This Page',
- innerInputTip: 'Search in this document.',
- version: 'Document Issue:',
-};
diff --git a/docs/.vitepress/src/i18n/docs/docs-zh.ts b/docs/.vitepress/src/i18n/docs/docs-zh.ts
deleted file mode 100644
index a499bec44d7b3d1f56c3f8d7fff42d45442ea6eb..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/docs/docs-zh.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export default {
- inputTip: '请输入您要查询的文档内容/关键词',
- origin: '来自',
- noResultText: '未找到相关内容,请尝试其他搜索词',
- find: '找到',
- result: '个结果',
- searchResult: '搜索结果',
- copySuccess: '复制成功',
- document: '文档',
- anchorTip: '本页内容',
- innerInputTip: '在本产品文档内搜索',
- version: '文档版本:',
-};
diff --git a/docs/.vitepress/src/i18n/docs/index.ts b/docs/.vitepress/src/i18n/docs/index.ts
deleted file mode 100644
index 240e99ca1c15332d1e1003846fe1da373f14325e..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/docs/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import zh from './docs-zh';
-import en from './docs-en';
-
-export default {
- zh,
- en,
-};
diff --git a/docs/.vitepress/src/i18n/feedback/feedback-en.ts b/docs/.vitepress/src/i18n/feedback/feedback-en.ts
deleted file mode 100644
index b89c092f17baab3991be2a47bbc294be0ef2b197..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/feedback/feedback-en.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-export default {
- title1: 'Are you satisfied with',
- title2: ' openEuler Docs',
- title3: '',
- grade1: '0: Unsatisfied',
- grade2: '10: Very satisfied',
- placeholder1: 'Please tell us why you are not satisfied with openEuler Docs.',
- placeholder2: 'What improvements would you like to see with openEuler Docs?',
- placeholder3: 'Please tell us what you like about openEuler Docs.',
- more1: 'Thanks for your feedback.',
- submit: 'OK',
- cancel: 'Cancel',
- recommendTip1: 'Please tell us why you are not satisfied with openEuler Docs.',
- recommendTip2: 'What improvements would you like to see with openEuler Docs?',
- recommendTip3: 'Please tell us why you recommend openEuler Docs.',
- submitBusy: 'Too many submissions. Try again later.',
- feedbackFailed: 'Feedback failed.',
- issueBack: 'Report an Issue',
- issueBackDecs: 'Quickly get support from the technical team.',
-};
diff --git a/docs/.vitepress/src/i18n/feedback/feedback-zh.ts b/docs/.vitepress/src/i18n/feedback/feedback-zh.ts
deleted file mode 100644
index cbd7ab980fab544f922391a7762765b78ff8a0b8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/feedback/feedback-zh.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-export default {
- title1: '您对',
- title2: ' openEuler文档 ',
- title3: '的整体满意度如何?',
- grade1: '0-不满意',
- grade2: '10-非常满意',
- placeholder1: '请输入您不太满意的原因',
- placeholder2: '改进哪些方面会让您更满意?',
- placeholder3: '请输入您满意的原因',
- more1: '感谢您的反馈',
- submit: '确定',
- cancel: '取消',
- recommendTip1: '请输入您不太推荐的原因',
- recommendTip2: '改进哪些方面会让您更愿意推荐?',
- recommendTip3: '请输入您推荐的原因',
- submitBusy: '您的提交过于频繁,请稍后再试',
- feedbackFailed: '反馈失败',
- issueBack: '问题反馈',
- issueBackDecs: '获得技术团队的快速支持',
-};
diff --git a/docs/.vitepress/src/i18n/feedback/index.ts b/docs/.vitepress/src/i18n/feedback/index.ts
deleted file mode 100644
index 74a8767a27d3d815cf4a1569c2cadee832777e08..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/feedback/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import en from './feedback-en';
-import zh from './feedback-zh';
-
-export default {
- en,
- zh,
-};
diff --git a/docs/.vitepress/src/i18n/footer/footer-en.ts b/docs/.vitepress/src/i18n/footer/footer-en.ts
deleted file mode 100644
index f838f3a6d899fdc3567e34ee9c9b4d064f7fa4f3..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/footer/footer-en.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export default {
- atomText: 'openEuler is an open source project incubated and operated by the OpenAtom Foundation.',
- mail: 'contact@openeuler.io',
- copyRight: 'Copyright © {0} openEuler. All rights reserved.',
- license_1: 'Licensed under',
- license_2: 'the MulanPSL2',
- qrCode: 'WeChat Subscription',
- qrAssistant: 'WeChat Assistant',
- friendshipLink: 'Related Links',
-};
diff --git a/docs/.vitepress/src/i18n/footer/footer-zh.ts b/docs/.vitepress/src/i18n/footer/footer-zh.ts
deleted file mode 100644
index 669bbd04b613d5441cc1bea70c9e68cab76474e7..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/footer/footer-zh.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export default {
- atomText: 'openEuler 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目',
- mail: 'contact@openeuler.io',
- copyRight: '版权所有 © {0} openEuler 保留一切权利',
- license_1: '遵循',
- license_2: '木兰宽松许可证第2版(MulanPSL2)',
- qrCode: 'openEuler公众号',
- qrAssistant: 'openEuler小助手',
- friendshipLink: '友情链接',
-};
diff --git a/docs/.vitepress/src/i18n/footer/index.ts b/docs/.vitepress/src/i18n/footer/index.ts
deleted file mode 100644
index 950a6f9651894b5097ebb0cd32357659e3547a55..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/footer/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import zh from './footer-zh';
-import en from './footer-en';
-
-export default {
- zh,
- en,
-};
\ No newline at end of file
diff --git a/docs/.vitepress/src/i18n/header/header-en.ts b/docs/.vitepress/src/i18n/header/header-en.ts
deleted file mode 100644
index cb0d4f095b8b742f5bd4bdba6210282b40970fb2..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/header/header-en.ts
+++ /dev/null
@@ -1,609 +0,0 @@
-import { markRaw } from 'vue';
-
-import Summit from '@/assets/category/header/summit.png';
-import IconOutLink from '~icons/app/icon-out-link.svg';
-import IconArrowRight from '~icons/app/icon-header-next.svg';
-
-const TAG_TYPE = {
- HOT: 'HOT',
- NEW: 'NEW',
-};
-
-const OutLink = markRaw(IconOutLink);
-const ArrowRight = markRaw(IconArrowRight);
-
-export default {
- NAV_ROUTER: [
- {
- NAME: 'Download',
- ID: 'download',
- CHILDREN: [
- {
- NAME: 'Community Releases',
- CHILDREN: [
- {
- NAME: 'openEuler 24.03 LTS SP1',
- DESCRIPTION:
- 'openEuler 24.03 LTS SP1, an enhanced version of the 24.03 LTS release based on the 6.6 kernel, is designed for server, cloud, edge computing, and embedded deployments, offering new features and functionality for developers and users across diverse domains.',
- TAG: TAG_TYPE.NEW,
- URL: '/download/#openEuler 24.03 LTS SP1',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: 'Server',
- URL: '/download/?scenario=ISO#openEuler 24.03 LTS SP1',
- },
- {
- NAME: 'Edge Cloud',
- URL: '/download/?scenario=edge_img#openEuler 24.03 LTS SP1',
- },
- {
- NAME: 'Cloud Computing',
- URL: '/download/?scenario=virtual_machine_img#openEuler 24.03 LTS SP1',
- },
- {
- NAME: 'Embedded',
- URL: '/download/?scenario=embedded_img#openEuler 24.03 LTS SP1',
- },
- {
- NAME: 'DevStation',
- URL: '/download/?scenario=DevStation#openEuler 24.03 LTS SP1',
- },
- ],
- },
- {
- NAME: 'openEuler 24.09',
- DESCRIPTION: 'The latest innovation version built on Linux kernel 6.6, with new features and faster updates.',
- TAG: null,
- URL: '/download/#openEuler 24.09',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: 'Server',
- URL: '/download/?scenario=ISO#openEuler 24.09',
- },
- {
- NAME: 'Edge Cloud',
- URL: '/download/?scenario=edge_img#openEuler 24.09',
- },
- {
- NAME: 'Cloud Computing',
- URL: '/download/?scenario=virtual_machine_img#openEuler 24.09',
- },
- {
- NAME: 'Embedded',
- URL: '/download/?scenario=embedded_img#openEuler 24.09',
- },
- {
- NAME: 'DevStation',
- URL: '/download/?scenario=DevStation#openEuler 24.09',
- },
- ],
- },
- {
- NAME: 'openEuler 22.03 LTS SP4',
- DESCRIPTION: 'A patch version of openEuler 22.03 LTS. Both versions share the same lifecycle.',
- TAG: null,
- URL: '/download/#openEuler 22.03 LTS SP4',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: 'Server',
- URL: '/download/?scenario=ISO#openEuler 22.03 LTS SP4',
- },
- {
- NAME: 'Edge Cloud',
- URL: '/download/?scenario=edge_img#openEuler 22.03 LTS SP4',
- },
- {
- NAME: 'Cloud Computing',
- URL: '/download/?scenario=virtual_machine_img#openEuler 22.03 LTS SP4',
- },
- {
- NAME: 'Embedded',
- URL: '/download/?scenario=embedded_img#openEuler 22.03 LTS SP4',
- },
- ],
- },
- ],
- SHORTCUT: [
- {
- NAME: 'Technical White Papers',
- URL: '/showcase/technical-white-paper/',
- },
- {
- NAME: 'openEuler 24.03 LTS SP1 Installation Guide',
- URL: 'https://docs.openeuler.org/en/docs/24.03_LTS_SP1/docs/Installation/Installation.html',
- },
- {
- NAME: 'openEuler 24.09 Installation Guide',
- URL: 'https://docs.openeuler.org/en/docs/24.09/docs/Installation/Installation.html',
- },
- {
- NAME: 'openEuler Lifecycle',
- URL: '/other/lifecycle/',
- },
- {
- NAME: 'Historical Releases',
- URL: '/download/archive/',
- },
- ],
- EXTRAS: [
- {
- NAME: 'Get openEuler',
- URL: '/download/#get-openeuler',
- ICON: ArrowRight,
- CHILDREN: [
- {
- NAME: 'Cloud Images',
- DESCRIPTION: 'openEuler has released official images on mainstream public cloud platforms',
- URL: '/download/#cloud',
- },
- {
- NAME: 'Container Images',
- DESCRIPTION: 'openEuler provides official container images',
- URL: '/download/#container',
- },
- {
- NAME: 'Windows',
- DESCRIPTION: 'Running openEuler on Windows',
- URL: '/download/#windows',
- },
- {
- NAME: 'MacOS',
- DESCRIPTION: 'Running openEuler on MacOS',
- URL: '/download/#macos',
- },
- {
- NAME: 'Virtualization',
- DESCRIPTION: 'Running openEuler on VMs',
- URL: '/download/#virtualization',
- },
- {
- NAME: 'Raspberry Pi',
- DESCRIPTION: 'Installing openEuler on Raspberry Pi',
- URL: '/download/#raspberrypi',
- },
- ],
- },
- ],
- },
- {
- NAME: 'Other Releases',
- CHILDREN: [
- {
- NAME: 'Commercial Releases',
- DESCRIPTION: 'Commercial releases for x86, Arm, and RISC-V.',
- URL: '/download/commercial-release/',
- },
- ],
- SHORTCUT: [],
- },
- {
- NAME: 'Install',
- CHILDREN: [
- {
- NAME: 'Mirrors',
- DESCRIPTION: 'All mirrors of openEuler.',
- URL: '/mirror/list/',
- },
- {
- NAME: 'Repo',
- DESCRIPTION: "Repo of openEuler's community releases.",
- URL: 'https://repo.openeuler.openatom.cn/',
- },
- ],
- SHORTCUT: [],
- },
- ],
- },
- {
- NAME: 'Learn',
- ID: 'learn',
- CHILDREN: [
- {
- NAME: 'Documentation',
- ICON: ArrowRight,
- URL: 'https://docs.openeuler.org/en/',
- CHILDREN: [
- {
- NAME: 'Trending Docs',
- DESCRIPTION: 'The most viewed documents.',
- TAG: TAG_TYPE.HOT,
- URL: 'https://docs.openeuler.org/en/#hot',
- },
- {
- NAME: 'Create Apps',
- DESCRIPTION: 'Guides for application development on openEuler.',
- URL: 'https://docs.openeuler.org/en/docs/24.03_LTS/docs/ApplicationDev/application-development.html',
- },
- {
- NAME: 'Getting Started',
- DESCRIPTION: 'Documentation guides to help you get started with openEuler.',
- URL: 'https://docs.openeuler.org/en/#process',
- },
- {
- NAME: 'Tools',
- DESCRIPTION: 'Resources for using and accessing commonly used tools.',
- TAG: TAG_TYPE.HOT,
- URL: 'https://docs.openeuler.org/en/#tool',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'openEuler 24.03 LTS Documentation',
- URL: 'https://docs.openeuler.org/en/docs/24.03_LTS/docs/Releasenotes/terms-of-use.html',
- },
- {
- NAME: 'Installation and Upgrade',
- URL: 'https://docs.openeuler.org/en/docs/24.03_LTS/docs/Installation/Installation.html',
- },
- ],
- },
- {
- NAME: 'Training',
- ICON: ArrowRight,
- URL: '/learn/mooc/',
- CHILDREN: [
- {
- NAME: 'Tutorials',
- DESCRIPTION: 'Mini video courses presented by openEuler.',
- URL: 'https://www.youtube.com/playlist?list=PLtDfk9jvMAziPyVaA-DOkXx0GgIUjXc0_',
- ICON: OutLink,
- },
- ],
- SHORTCUT: [],
- },
- {
- NAME: 'Migration',
- CHILDREN: [
- {
- NAME: 'Migrate to openEuler',
- DESCRIPTION: 'Guides for migrating to openEuler.',
- URL: '/migration/',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'Get x2openEuler',
- URL: '/migration/download/',
- },
- {
- NAME: 'Migration Practices',
- URL: '/migration/user-cases/',
- },
- ],
- },
- {
- NAME: 'Tech Highlights',
- CHILDREN: [
- {
- NAME: 'Success Stories',
- DESCRIPTION: 'Explore how openEuler is used across various industries.',
- URL: '/showcase/',
- },
- {
- NAME: 'White Papers',
- DESCRIPTION: 'Insights into the tech details and applications of each release.',
- URL: '/showcase/technical-white-paper/',
- },
- ],
- SHORTCUT: [],
- },
- ],
- },
- {
- NAME: 'Develop',
- ID: 'development',
- CHILDREN: [
- {
- NAME: 'Build',
- CHILDREN: [
- {
- NAME: 'EulerMaker',
- DESCRIPTION: 'An open, unified build service for streamlined development.',
- URL: 'https://eulermaker.compass-ci.openeuler.openatom.cn/',
- ANALYTICSNAME: 'eulermaker',
- },
- {
- NAME: 'openEuler User Repo',
- DESCRIPTION: 'An easy-to-use package hosting and distribution platform.',
- URL: 'https://eur.openeuler.openatom.cn/coprs/',
- },
- {
- NAME: 'Submit Package',
- DESCRIPTION: 'Contribute software packages efficiently to the community.',
- URL: 'https://software-pkg.openeuler.org/en/package',
- },
- ],
- },
- {
- NAME: 'Release',
- CHILDREN: [
- {
- NAME: 'OEPKGS',
- DESCRIPTION: 'A third-party extension repository for openEuler.',
- URL: 'https://oepkgs.net/en-CN',
- ICON: OutLink,
- },
- ],
- },
- {
- NAME: 'Analyze',
- CHILDREN: [
- {
- NAME: 'Pkgship',
- DESCRIPTION: 'A tool to query OS package information and dependencies with ease.',
- URL: 'https://pkgmanage.openeuler.org/',
- ANALYTICSNAME: 'pkgship',
- },
- ],
- },
- {
- NAME: 'Submit Issue',
- CHILDREN: [
- {
- NAME: 'QuickIssue',
- DESCRIPTION: 'Submit and track community issues quickly and easily.',
- URL: 'https://quickissue.openeuler.org/en/issues/',
- },
- ],
- },
- ],
- },
- {
- NAME: 'Support',
- ID: 'approve',
- CHILDREN: [
- {
- NAME: 'Compatibility',
- CHILDREN: [
- {
- NAME: 'Compatibility List',
- DESCRIPTION: 'Check hardware and software compatibility with openEuler.',
- URL: '/compatibility/',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'Overall Introduction to the openEuler Hardware Compatibility Test',
- URL: '/compatibility/hardware/',
- },
- ],
- },
- {
- NAME: 'Services & Resources',
- CHILDREN: [
- {
- NAME: 'x2openEuler',
- DESCRIPTION: 'A user-friendly tool to seamlessly migrate your OS to openEuler.',
- URL: 'https://docs.openeuler.org/en/docs/20.03_LTS_SP1/docs/x2openEuler/Introduction.html',
- },
- {
- NAME: 'Security Center',
- DESCRIPTION: 'Track the latest vulnerabilities, security advisories, and more.',
- URL: '',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: 'Security Center',
- URL: '/security/security-bulletins/',
- },
- {
- NAME: 'Bug Center',
- URL: '/security/bug-bulletins/',
- },
- ],
- },
- {
- NAME: 'FAQs',
- DESCRIPTION: 'Find the answers to common questions about openEuler.',
- URL: '/faq/',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'QuickIssue ',
- URL: 'https://quickissue.openeuler.org/en/issues/',
- },
- ],
- },
- ],
- },
- {
- NAME: 'Community',
- ID: 'community',
- CHILDREN: [
- {
- NAME: 'About',
- CHILDREN: [
- {
- NAME: 'Governance',
- DESCRIPTION: 'Members of openEuler committees.',
- URL: '/community/organization/',
- },
- {
- NAME: 'Code of Conduct',
- DESCRIPTION: "openEuler's code of conduct.",
- URL: '/community/conduct/',
- },
- {
- NAME: 'Members',
- DESCRIPTION: 'Companies and organizations contributing to openEuler.',
- URL: '/community/member/',
- },
- {
- NAME: 'Statistics',
- DESCRIPTION: 'Find stats and see how the openEuler community thrives.',
- URL: 'https://datastat.openeuler.org/en/overview',
- },
- ],
- SHORTCUT: [],
- },
- {
- NAME: 'Contribute',
- CHILDREN: [
- {
- NAME: 'SIGs',
- DESCRIPTION: 'Explore diverse SIGs.',
- URL: '/sig/sig-list/',
- },
- {
- NAME: 'Contribution Guide',
- DESCRIPTION: 'See how to get involved and make an impact in our community.',
- URL: '/community/contribution/',
- },
- {
- NAME: 'CLA',
- DESCRIPTION: 'Sign the CLA to protect your work—multiple options available!',
- URL: 'https://clasign.osinfra.cn/sign/gitee_openeuler-1611298811283968340',
- ICON: OutLink,
- },
- ],
- SHORTCUT: [],
- },
- {
- NAME: 'Projects',
- CHILDREN: [
- {
- NAME: 'A-Tune',
- DESCRIPTION: 'An AI-powered intelligent tuning engine.',
- URL: '/other/projects/atune/',
- },
- {
- NAME: 'iSula',
- DESCRIPTION: 'A container solution.',
- URL: '/other/projects/isula/',
- },
- {
- NAME: 'StratoVirt',
- DESCRIPTION: 'An enterprise-grade virtual machine monitor for cloud data centers.',
- URL: '/other/projects/stratovirt/',
- },
- {
- NAME: 'BiSheng JDK',
- DESCRIPTION: 'A high-performance Java Virtual Machine.',
- URL: '/other/projects/bishengjdk/',
- },
- {
- NAME: 'secGear',
- DESCRIPTION: 'A confidential computing framework for building secure applications.',
- URL: '/other/projects/secgear/',
- },
- ],
- SHORTCUT: [],
- },
- {
- NAME: 'Engage with Us',
- CHILDREN: [
- {
- NAME: 'Forum',
- DESCRIPTION: 'Share knowledge, ask anything, and solve together.',
- URL: 'https://forum.openeuler.org/?locale=en',
- },
- {
- NAME: 'Mailing Lists',
- DESCRIPTION: 'Discuss openEuler tech and progress on our mailing lists.',
- URL: '/community/mailing-list/',
- },
- {
- NAME: 'Contact Us',
- DESCRIPTION: '',
- URL: '/contact-us/',
- TAG: TAG_TYPE.NEW,
- },
- ],
- SHORTCUT: [],
- },
- ],
- },
-
- {
- NAME: 'Stay Updated',
- ID: 'update',
- CHILDREN: [
- {
- NAME: 'Activities',
- CHILDREN: [
- {
- NAME: 'Community Calendar',
- DESCRIPTION: "Stay informed with openEuler's key events, conferences, and releases.",
- URL: '/interaction/event-list/',
- },
- {
- NAME: 'Events',
- DESCRIPTION: 'Meet openEuler and connect with the community at every key event.',
- URL: '/interaction/summit-list/summit2024/',
- },
- {
- NAME: 'Call for X Program',
- DESCRIPTION: 'Become openEuler Valuable Professionals or contribute tech tutorials!',
- URL: '/community/program/',
- },
- ],
- WITH_PICTURE: true,
- SHORTCUT: [
- {
- NAME: 'Operating System Confenrence & openEuler Summit 2024',
- PICTURE: Summit,
- DESCRIPTION:
- 'Operating systems form the backbone of digital and intelligent industry transformation. openEuler, an open source operating system born in China for digital infrastructure, has emerged as a key player in the global open source landscape. Over the past five years, its market presence was steadily increasing. And openEuler has been continuously driving innovations in OS for AI and AI for OS, accelerating digital transformation, and fostering a thriving ecosystem though industry-wide collaboration.',
- REMARK: 'November 15-16, 2024 | Beijing',
- TYPE: 'PICTURE',
- URL: '/interaction/summit-list/summit2024/',
- },
- ],
- },
- {
- NAME: 'News & Blogs',
- CHILDREN: [
- {
- NAME: 'News',
- DESCRIPTION: 'Follow the latest developments, releases, and community updates.',
- URL: '/interaction/news-list/',
- },
- {
- NAME: 'Blogs',
- DESCRIPTION: 'Gain in-depth knowledge and fresh perspectives on openEuler.',
- URL: '/interaction/blog-list/',
- },
- {
- NAME: 'Monthly Bulletins',
- DESCRIPTION: "What's new in the openEuler community.",
- URL: '/monthly-bulletins/',
- },
- ],
- SHORTCUT: [],
- },
- ],
- },
- ],
- USER_CENTER: 'User Center',
- MESSAGE_CENTER: 'Message Center',
- LOGOUT: 'Logout',
- CODE: 'Code',
- QUICKLINK: 'Quick Link',
- SEARCH: {
- BROWSEHISTORY: 'History',
- CLEAN: 'Clean up',
- TOPSEARCH: 'Top search',
- CHANGE: 'Change',
- PLEACHOLDER: 'Please enter...',
- PLEACHOLDER_EXTEND: 'Please enter the content',
- TEXT: 'Search',
- },
- SOURCE_CODE: [
- {
- NAME: 'Code Sources',
- PATH: 'https://gitee.com/openeuler',
- },
- {
- NAME: 'Package Sources',
- PATH: 'https://gitee.com/src-openeuler',
- },
- {
- NAME: 'GitHub Mirror',
- PATH: 'https://github.com/openeuler-mirror',
- },
- ],
-};
diff --git a/docs/.vitepress/src/i18n/header/header-zh.ts b/docs/.vitepress/src/i18n/header/header-zh.ts
deleted file mode 100644
index d8c0cdf9a1b655f619db193d5add68c3bcacff65..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/header/header-zh.ts
+++ /dev/null
@@ -1,824 +0,0 @@
-import { markRaw } from 'vue';
-
-import Summit from '@/assets/category/header/summit.png';
-import Sig from '@/assets/category/header/sig.png';
-import Report from '@/assets/category/header/report.png';
-import annualReport2024 from '@/assets/category/header/annual-report-2024.jpg';
-
-import IconOutLink from '~icons/app/icon-out-link.svg';
-import IconArrowRight from '~icons/app/icon-header-next.svg';
-
-const TAG_TYPE = {
- HOT: 'HOT',
- NEW: 'NEW',
-};
-
-const OutLink = markRaw(IconOutLink);
-const ArrowRight = markRaw(IconArrowRight);
-
-export default {
- NAV_ROUTER: [
- {
- NAME: '下载',
- ID: 'download',
- CHILDREN: [
- {
- NAME: '社区发行版',
- CHILDREN: [
- {
- NAME: 'openEuler 24.03 LTS SP1',
- DESCRIPTION:
- 'openEuler 24.03 LTS SP1 是基于6.6内核的24.03 LTS版本增强扩展版本,面向服务器、云、边缘计算和嵌入式场景,持续提供更多新特性和功能扩展,给开发者和用户带来全新的体验,服务更多的领域和更多的用户。',
- TAG: TAG_TYPE.NEW,
- URL: '/download/#openEuler 24.03 LTS SP1',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: '服务器',
- URL: '/download/?scenario=ISO#openEuler 24.03 LTS SP1',
- },
- {
- NAME: '边缘计算',
- URL: '/download/?scenario=edge_img#openEuler 24.03 LTS SP1',
- },
- {
- NAME: '云计算',
- URL: '/download/?scenario=virtual_machine_img#openEuler 24.03 LTS SP1',
- },
- {
- NAME: '嵌入式',
- URL: '/download/?scenario=embedded_img#openEuler 24.03 LTS SP1',
- },
- {
- NAME: 'DevStation',
- URL: '/download/?scenario=DevStation#openEuler 24.03 LTS SP1',
- },
- ],
- },
- {
- NAME: 'openEuler 24.09',
- DESCRIPTION: 'openEuler 24.09 是基于Linux 6.6内核的创新版本,面向服务器、云、边缘计算和嵌入式场景,提供更多新特性和功能',
- TAG: null,
- URL: '/download/#openEuler 24.09',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: '服务器',
- URL: '/download/?scenario=ISO#openEuler 24.09',
- },
- {
- NAME: '边缘计算',
- URL: '/download/?scenario=edge_img#openEuler 24.09',
- },
- {
- NAME: '云计算',
- URL: '/download/?scenario=virtual_machine_img#openEuler 24.09',
- },
- {
- NAME: '嵌入式',
- URL: '/download/?scenario=embedded_img#openEuler 24.09',
- },
- {
- NAME: 'DevStation',
- URL: '/download/?scenario=DevStation#openEuler 24.09',
- },
- ],
- },
- {
- NAME: 'openEuler 22.03 LTS SP4',
- DESCRIPTION: 'openEuler 22.03 LTS SP4 是openEuler 22.03 LTS的补丁版本,生命周期与LTS版本相同',
- TAG: null,
- URL: '/download/#openEuler 22.03 LTS SP4',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: '服务器',
- URL: '/download/?scenario=ISO#openEuler 22.03 LTS SP4',
- },
- {
- NAME: '边缘计算',
- URL: '/download/?scenario=edge_img#openEuler 22.03 LTS SP4',
- },
- {
- NAME: '云计算',
- URL: '/download/?scenario=virtual_machine_img#openEuler 22.03 LTS SP4',
- },
- {
- NAME: '嵌入式',
- URL: '/download/?scenario=embedded_img#openEuler 22.03 LTS SP4',
- },
- ],
- },
- ],
- SHORTCUT: [
- {
- NAME: '技术白皮书',
- URL: '/showcase/technical-white-paper/',
- },
- {
- NAME: '24.03 LTS SP1安装指南',
- URL: 'https://docs.openeuler.org/zh/docs/24.03_LTS_SP1/docs/Installation/installation.html',
- },
- {
- NAME: '24.09安装指南',
- URL: 'https://docs.openeuler.org/zh/docs/24.09/docs/Installation/installation.html',
- },
- {
- NAME: '版本生命周期',
- URL: '/other/lifecycle/',
- },
- {
- NAME: '查询所有版本',
- URL: '/download?archive=true',
- },
- ],
- EXTRAS: [
- {
- NAME: '其他获取方式',
- URL: '/download/#get-openeuler',
- ICON: ArrowRight,
- CHILDREN: [
- {
- NAME: '公有云',
- DESCRIPTION: 'openEuler官方镜像在以下主流平台正式发布',
- URL: '/download/#cloud',
- },
- {
- NAME: '容器镜像',
- DESCRIPTION: 'openEuler提供官方容器镜像',
- URL: '/download/#container',
- },
- {
- NAME: 'Windows',
- DESCRIPTION: '在Windows上运行openEuler',
- URL: '/download/#windows',
- },
- {
- NAME: 'MacOS',
- DESCRIPTION: '在MacOS上运行openEuler',
- URL: '/download/#macos',
- },
- {
- NAME: '虚拟化',
- DESCRIPTION: '在虚拟机上运行openEuler',
- URL: '/download/#virtualization',
- },
- {
- NAME: '树莓派',
- DESCRIPTION: '在树莓派上安装openEuler',
- URL: '/download/#raspberrypi',
- },
- ],
- },
- ],
- },
- {
- NAME: '其他版本',
- CHILDREN: [
- {
- NAME: '商业发行版',
- DESCRIPTION: '基于openEuler发布的商业发行版。x86、AArch、LoongArch、sw 、RISC-V',
- URL: '/download/commercial-release/',
- },
- ],
- SHORTCUT: [],
- },
- {
- NAME: '下载资源',
- CHILDREN: [
- {
- NAME: '软件中心',
- DESCRIPTION: '简易便捷地查询openEuler社区软件包',
- TAG: TAG_TYPE.NEW,
- URL: 'https://easysoftware.openeuler.org/zh',
- },
- {
- NAME: '镜像仓列表',
- DESCRIPTION: '查询openEuler所有镜像站点,欢迎新站点的加入',
- URL: '/mirror/list/',
- },
- {
- NAME: 'Repo源',
- DESCRIPTION: '提供openEuler社区版本的repo文件',
- URL: 'https://repo.openeuler.openatom.cn/',
- },
- ],
- SHORTCUT: [],
- },
- ],
- },
- {
- NAME: '学习',
- ID: 'learn',
- CHILDREN: [
- {
- NAME: '文档中心',
- ICON: ArrowRight,
- URL: 'https://docs.openeuler.org/zh/',
- CHILDREN: [
- {
- NAME: '热门文档',
- DESCRIPTION: '当下最受关注的各类文档',
- TAG: TAG_TYPE.HOT,
- URL: 'https://docs.openeuler.org/zh/#hot',
- },
- {
- NAME: '开发教程',
- DESCRIPTION: '基于openEuler进行应用程序开发的指南文档',
- URL: 'https://docs.openeuler.org/zh/docs/24.03_LTS/docs/ApplicationDev/application-development.html',
- },
- {
- NAME: '流程规范',
- DESCRIPTION: '社区文档贡献的具体流程与规范要求',
- URL: 'https://docs.openeuler.org/zh/#process',
- },
- {
- NAME: '工具查询',
- DESCRIPTION: '常用工具的使用指南',
- TAG: TAG_TYPE.HOT,
- URL: 'https://docs.openeuler.org/zh/#tool',
- },
- ],
- SHORTCUT: [
- {
- NAME: '24.03LTS文档',
- URL: 'https://docs.openeuler.org/zh/docs/24.03_LTS/docs/Releasenotes/法律声明.html',
- },
- {
- NAME: '安装升级',
- URL: 'https://docs.openeuler.org/zh/docs/24.03_LTS/docs/Installation/installation.html',
- },
- {
- NAME: '文档撰写指南',
- ICON: OutLink,
- URL: 'https://gitee.com/openeuler/docs/blob/master/contribute/写作规范.md',
- },
- ],
- },
- {
- NAME: '课程中心',
- ICON: ArrowRight,
- URL: '/learn/mooc/',
- CHILDREN: [
- {
- NAME: 'HCIA-openEuler 认证培训课程',
- DESCRIPTION: '学习HCIA-openEuler华为认证openEuler工程师在线课程',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: '开始学习',
- URL: '/learn/mooc/detail/',
- },
- {
- NAME: '报名考试',
- URL: 'https://e.huawei.com/cn/talent/#/cert/product-details?certifiedProductId=383&authenticationLevel=CTYPE_CARE_HCIA&technicalField=PSC&version=1.0',
- ICON: OutLink,
- },
- ],
- },
- {
- NAME: 'openEuler精品课程',
- DESCRIPTION: 'openEuler从入门到实践系列课程',
- URL: 'https://c0605e03bb6b40dca9cd34ab5b3fb1f8.shixizhi.huawei.com/portal/1643780836745113602?pageId=1644269448177651714&activeIndex=-1&sxz-lang=zh_CN',
- ICON: OutLink,
- },
- {
- NAME: 'openEuler安全知识培训',
- DESCRIPTION: 'openEuler基础安全意识与能力培训',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: '开始学习',
- URL: 'https://space.bilibili.com/527064077/channel/collectiondetail?sid=2726214',
- ICON: OutLink,
- },
- {
- NAME: '报名考试',
- URL: '/blog/openeuler/20240428-security.html',
- },
- ],
- },
- {
- NAME: 'Tutorials',
- DESCRIPTION: 'openEuler官方出品的迷你视频课程',
- URL: 'https://space.bilibili.com/527064077/channel/collectiondetail?sid=1229363',
- ICON: OutLink,
- },
- {
- NAME: 'openEuler直播',
- DESCRIPTION: '众多大咖精彩课程直播',
- URL: '/interaction/live-list/',
- },
- ],
- SHORTCUT: [
- {
- NAME: '从入门到精通-openEuler操作系统迁移专题',
- URL: 'https://c0605e03bb6b40dca9cd34ab5b3fb1f8.shixizhi.huawei.com/community/community.htm?communityId=1748285175854272513&schoolId=1643780836745113602&activeIndex=-1&subIndex=undefined&subIndex=undefined&sxz-lang=zh_CN',
- },
- ],
- },
- {
- NAME: '迁移与运维',
- CHILDREN: [
- {
- NAME: '迁移专区',
- DESCRIPTION: '助力企业进行操作系统迁移的指南文档',
- URL: '/migration/',
- },
- {
- NAME: '运维专区',
- DESCRIPTION: 'openEuler运维全集和工具',
- URL: '/om/',
- },
- ],
- SHORTCUT: [
- {
- NAME: '迁移工具x2openEuler',
- URL: '/migration/download/',
- },
- {
- NAME: '迁移实践',
- URL: '/migration/user-cases/',
- },
- ],
- },
- {
- NAME: '技术展示',
- CHILDREN: [
- {
- NAME: '用户案例',
- DESCRIPTION: '了解openEuler在各行业的最佳案例',
- URL: '/showcase/',
- },
- {
- NAME: '白皮书',
- DESCRIPTION: '了解openEuler各版本的技术详情及在行业的生态现状、业务场景的应用',
- URL: '/showcase/technical-white-paper/',
- },
- {
- NAME: '市场研究报告',
- DESCRIPTION: '了解openEuler在行业的市场研究情况',
- URL: '/showcase/market-report/',
- },
- ],
- SHORTCUT: [],
- },
- ],
- },
- {
- NAME: '开发',
- ID: 'development',
- CHILDREN: [
- {
- NAME: '构建',
- CHILDREN: [
- {
- NAME: 'EulerMaker',
- DESCRIPTION: '开放式统一构建服务',
- URL: 'https://eulermaker.compass-ci.openeuler.openatom.cn/',
- ANALYTICSNAME: 'eulermaker',
- },
- {
- NAME: '用户软件仓(EUR)',
- DESCRIPTION: '开发者易用的软件包托管分发平台',
- URL: 'https://eur.openeuler.openatom.cn/coprs/',
- },
- {
- NAME: '软件包贡献',
- DESCRIPTION: '简单高效地贡献软件包',
- URL: 'https://software-pkg.openeuler.org/zh/package',
- },
- {
- NAME: 'License工具门户',
- DESCRIPTION: '帮助快速检测License权利、义务、限制',
- URL: 'https://compliance.openeuler.org/',
- ICON: OutLink,
- ANALYTICSNAME: 'license',
- },
- ],
- },
- {
- NAME: '发布',
- CHILDREN: [
- {
- NAME: 'EulerPublisher',
- DESCRIPTION: 'openEuler云原生发布工具',
- URL: 'https://gitee.com/openeuler/eulerpublisher',
- ICON: OutLink,
- },
- {
- NAME: 'EulerLauncher',
- DESCRIPTION: '跨平台openEuler虚拟机管理工具',
- URL: 'https://gitee.com/openeuler/eulerlauncher',
- ICON: OutLink,
- },
- {
- NAME: 'OEPKGS',
- DESCRIPTION: 'OEPKGS软件托管平台',
- URL: 'https://oepkgs.net/zh-CN',
- ICON: OutLink,
- },
- ],
- },
- {
- NAME: '分析',
- CHILDREN: [
- {
- NAME: 'oecp',
- DESCRIPTION: '操作系统差异比较分析工具',
- URL: 'https://gitee.com/openeuler/oecp',
- ICON: OutLink,
- },
- {
- NAME: 'Pkgship',
- DESCRIPTION: '管理操作系统软件包信息和依赖项的查询工具',
- URL: 'https://pkgmanage.openeuler.org/',
- ANALYTICSNAME: 'pkgship',
- },
- ],
- },
- {
- NAME: '问题反馈',
- CHILDREN: [
- {
- NAME: 'QuickIssue',
- DESCRIPTION: '简易快捷地查询、提交社区Issues',
- URL: 'https://quickissue.openeuler.org/zh/issues/',
- },
- ],
- },
- ],
- },
- {
- NAME: '支持',
- ID: 'approve',
- CHILDREN: [
- {
- NAME: '兼容性专区',
- CHILDREN: [
- {
- NAME: '兼容性列表',
- DESCRIPTION: '查看openEuler兼容性列表',
- URL: '/compatibility/',
- },
- {
- NAME: '兼容性技术测评',
- DESCRIPTION: '帮助企业快速申请兼容性技术测评',
- URL: 'https://certification.openeuler.org/#/',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'openEuler 硬件兼容性测试整体介绍',
- URL: '/compatibility/hardware/',
- },
- ],
- },
- {
- NAME: '支持与服务',
- CHILDREN: [
- {
- NAME: 'x2openEuler',
- DESCRIPTION: '将原有业务迁移到openEuler的工具套件',
- URL: 'https://docs.openeuler.org/zh/docs/20.03_LTS_SP1/docs/x2openEuler/Introduction.html',
- },
- {
- NAME: 'OSV技术测评',
- DESCRIPTION: '查看OSV技术测评结果',
- URL: '/approve/',
- },
- {
- NAME: '社区公告',
- DESCRIPTION: '查看漏洞管理、安全公告等安全问题',
- URL: '',
- MOBILE_SHOW_CHILD: true,
- CHILDREN: [
- {
- NAME: '安全中心',
- URL: '/security/security-bulletins/',
- },
- {
- NAME: '缺陷中心',
- URL: '/security/bug-bulletins/',
- },
- ],
- },
- {
- NAME: 'FAQ常见问题',
- DESCRIPTION: '查看openEuler常见问题',
- URL: '/faq/',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'OSV技术测评整体介绍',
- URL: '/approve/approve-step/',
- },
- {
- NAME: 'QuickIssue ',
- URL: 'https://quickissue.openeuler.org/zh/issues/',
- },
- ],
- },
- ],
- },
- {
- NAME: '社区',
- ID: 'community',
- CHILDREN: [
- {
- NAME: '关于社区',
- CHILDREN: [
- {
- NAME: '组织架构',
- DESCRIPTION: '了解openEuler的委员会成员',
- URL: '/community/organization/',
- },
- {
- NAME: '社区章程',
- DESCRIPTION: '了解openEuler的章程、条例、行为准则、License策略',
- URL: '/community/charter/',
- },
- {
- NAME: '成员单位',
- DESCRIPTION: '了解openEuler的捐赠单位',
- URL: '/community/member/',
- },
- {
- NAME: '社区荣誉',
- DESCRIPTION: '了解openEuler的荣誉奖项',
- URL: '/community/honor/',
- },
- {
- NAME: 'oEEP',
- DESCRIPTION: '查看openEuler社区的演进提案',
- URL: '/oEEP/?name=oEEP-0000 oEEP 索引',
- },
- {
- NAME: '城市用户组',
- DESCRIPTION: '区域用户交流圈',
- URL: '/community/user-group/',
- },
- {
- NAME: '贡献看板',
- DESCRIPTION: '查看openEuler社区数据',
- URL: 'https://datastat.openeuler.org/zh/overview',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'openEuler社区介绍PDF',
- URL: 'https://www.openeuler.org/whitepaper/openEuler %E5%BC%80%E6%BA%90%E7%A4%BE%E5%8C%BA%E4%BB%8B%E7%BB%8D.pdf',
- },
- ],
- },
- {
- NAME: '贡献与成长',
- HASGROUP: true,
- CHILDREN: [
- {
- NAME: '开发者贡献',
- CHILDREN: [
- {
- NAME: 'SIG中心',
- DESCRIPTION: '查询openEuler社区SIG组(Special Interest Group)',
- URL: '/sig/sig-list/',
- },
- {
- NAME: '贡献攻略',
- DESCRIPTION: '参与社区贡献的方式',
- URL: '/community/contribution/',
- },
- {
- NAME: 'CLA签署',
- DESCRIPTION: '参与贡献前,需签署贡献者许可协议(CLA)\n个人CLA、企业CLA、员工CLA',
- URL: 'https://clasign.osinfra.cn/sign/gitee_openeuler-1611298811283968340',
- ICON: OutLink,
- },
- ],
- },
- {
- NAME: '开发者成长',
- CHILDREN: [
- {
- NAME: '高校',
- DESCRIPTION: '了解高校技术小组与实习赛事资讯',
- URL: '/universities/',
- },
- {
- NAME: '人才培养',
- DESCRIPTION: '旨在帮助企业快速培养openEuler专业生态人才',
- URL: '/talent-assessment/',
- },
- {
- NAME: '开源实习',
- DESCRIPTION: '旨在帮助在校学生在项目实践中提升能力,成为优秀的开源人才',
- URL: '/internship/',
- },
- ],
- },
- ],
- SHORTCUT: [
- {
- NAME: '企业签署CLA流程',
- URL: '/blog/2022-11-25-cla/CLA%E7%AD%BE%E7%BD%B2%E6%B5%81%E7%A8%8B.html',
- },
- {
- NAME: 'CLA-FAQ',
- ICON: OutLink,
- URL: 'https://gitee.com/openeuler/infrastructure/blob/master/docs/cla-guide/faq/faq.md',
- },
- {
- NAME: '开发者日历',
- URL: '/meeting/#calendar',
- },
- {
- NAME: '活动与大赛',
- URL: '/universities/#%E6%B4%BB%E5%8A%A8%E4%B8%8E%E5%A4%A7%E8%B5%9B',
- },
- {
- NAME: '高校技术小组',
- URL: '/universities/#%E9%AB%98%E6%A0%A1%E6%8A%80%E6%9C%AF%E5%B0%8F%E7%BB%84',
- },
- ],
- },
- {
- NAME: '项目',
- CHILDREN: [
- {
- NAME: 'A-Tune',
- DESCRIPTION: '一款基于AI开发的智能优化引擎',
- URL: '/other/projects/atune/',
- },
- {
- NAME: 'iSula',
- DESCRIPTION: '容器技术方案',
- URL: '/other/projects/isula/',
- },
- {
- NAME: 'StratoVirt',
- DESCRIPTION: '面向云数据中心的企业级虚拟化VMM',
- URL: '/other/projects/stratovirt/',
- },
- {
- NAME: 'BiSheng JDK',
- DESCRIPTION: '一款高性能Java虚拟机',
- URL: '/other/projects/bishengjdk/',
- },
- {
- NAME: 'secGear',
- DESCRIPTION: '供开发者开发安全应用的机密计算框架',
- URL: '/other/projects/secgear/',
- },
- {
- NAME: 'NestOS',
- DESCRIPTION: '基于欧拉开源操作系统的云底座操作系统',
- URL: '/nestos',
- },
- ],
- SHORTCUT: [],
- },
- {
- NAME: '社区交流',
- CHILDREN: [
- {
- NAME: '论坛',
- DESCRIPTION: '与开发者讨论openEuler',
- URL: 'https://forum.openeuler.org/?locale=zh_CN',
- },
- {
- NAME: '邮件列表',
- DESCRIPTION: '订阅邮件列表,与SIG成员讨论openEuler的技术与进展',
- URL: '/community/mailing-list/',
- },
- {
- NAME: '线上会议',
- DESCRIPTION: '查询并参与SIG组例会',
- URL: '/meeting/',
- },
- {
- NAME: '联系我们',
- DESCRIPTION: '',
- URL: '/contact-us/',
- TAG: TAG_TYPE.NEW,
- },
- ],
- SHORTCUT: [],
- },
- ],
- },
-
- {
- NAME: '动态',
- ID: 'update',
- CHILDREN: [
- {
- NAME: '社区活动',
- WITH_PICTURE: true,
- CHILDREN: [
- {
- NAME: '活动日历',
- DESCRIPTION: '了解openEuler社区全年活动',
- URL: '/interaction/event-list/',
- },
- {
- NAME: '峰会',
- DESCRIPTION: '查看openEuler年度大会详情',
- URL: '/interaction/summit-list/summit2024/',
- },
- {
- NAME: 'openEuler Call for X计划',
- DESCRIPTION: '共享openEuler Call for X计划多元化资源',
- URL: '/community/program/',
- },
- ],
- SHORTCUT: [
- {
- NAME: '操作系统大会 & openEuler Summit 2024',
- PICTURE: Summit,
- DESCRIPTION:
- '操作系统是产业数字化、智能化发展的坚实底座。openEuler作为数智基础设施的开源操作系统,开源5年,产业共建、生态繁荣;openEuler系市场份额屡攀新高;技术不断创新,使能AI,加速OS智能化,让数智无所不能;源于中国,贡献全球,已成长为企业级全球开源操作系统社区的重要一员。',
- REMARK: '时间:2024/11/15 - 2024/11/16 | 北京',
- TYPE: 'PICTURE',
- URL: '/interaction/summit-list/summit2024/',
- },
- {
- NAME: 'openEuler SIG Gathering 2024',
- PICTURE: Sig,
- DESCRIPTION:
- 'openEuler SIG Gathering 2024将于7月26日在北京香格里拉饭店举行。本次活动面向社区108个SIG组,诚邀社区开发者齐聚现场,通过全天线下会议,聚焦openEuler 24.03 LTS 版本后续重要规划和各SIG2024年下半年重要技术方案以及开发计划。',
- REMARK: '时间:2024/07/26 | 北京',
- TYPE: 'PICTURE',
- URL: '/interaction/summit-list/sig-gathering-2024/',
- },
- ],
- },
- {
- NAME: '资讯',
- WITH_PICTURE: true,
- CHILDREN: [
- {
- NAME: '新闻',
- DESCRIPTION: '查看openEuler社区动态',
- URL: '/interaction/news-list/',
- },
- {
- NAME: '博客',
- DESCRIPTION: '查看openEuler技术文章分享',
- URL: '/interaction/blog-list/',
- },
- {
- NAME: '月刊与年报',
- DESCRIPTION: '查看openEuler社区运作报告',
- URL: '/monthly-bulletins/',
- },
- ],
- SHORTCUT: [
- {
- NAME: 'openEuler 2024 社区年报',
- PICTURE: annualReport2024,
- REMARK: '发布时间:2025/01/24',
- TYPE: 'PICTURE',
- URL: '/annual-report/openEuler-annual-report-2024/',
- },
- {
- NAME: 'openEuler 2023 社区年报',
- PICTURE: Report,
- REMARK: '发布时间:2024/01/01',
- TYPE: 'PICTURE',
- URL: '/news/openEuler/20240223-nianbao/Untitled-1.html',
- },
- ],
- },
- ],
- },
- ],
- USER_CENTER: '个人中心',
- MESSAGE_CENTER: '消息中心',
- LOGOUT: '退出登录',
- CODE: '源码',
- QUICKLINK: '快捷链接',
- SEARCH: {
- BROWSEHISTORY: '历史记录',
- CLEAN: '清除',
- TOPSEARCH: '热门搜索',
- CHANGE: '换一批',
- PLEACHOLDER: '搜索',
- PLEACHOLDER_EXTEND: '请输入搜索内容',
- TEXT: '搜索',
- },
- SOURCE_CODE: [
- {
- NAME: '代码仓',
- PATH: 'https://gitee.com/openeuler',
- },
- {
- NAME: '软件包仓',
- PATH: 'https://gitee.com/src-openeuler',
- },
- {
- NAME: 'Github镜像仓',
- PATH: 'https://github.com/openeuler-mirror',
- },
- ],
-};
diff --git a/docs/.vitepress/src/i18n/header/index.ts b/docs/.vitepress/src/i18n/header/index.ts
deleted file mode 100644
index dcc252ae9413d884d3dfeed7ef567f26ef577697..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/header/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import zh from './header-zh';
-import en from './header-en';
-
-export default {
- zh,
- en,
-};
\ No newline at end of file
diff --git a/docs/.vitepress/src/i18n/index.ts b/docs/.vitepress/src/i18n/index.ts
deleted file mode 100644
index 9de344f0856958bd519a747bb848f9152bd58830..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/i18n/index.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { createI18n } from 'vue-i18n';
-import { getCurrentLocale } from '@/utils/locale';
-
-// 公共
-import common from './common';
-import header from './header';
-import footer from './footer';
-
-import docs from './docs';
-import feedback from './feedback';
-
-const messages = {
- zh: {
- // 公共
- common: common.zh,
- header: header.zh,
- footer: footer.zh,
- docs: docs.zh,
- feedback: feedback.zh,
- },
- en: {
- // 公共
- common: common.en,
- header: header.en,
- footer: footer.en,
- docs: docs.en,
- feedback: feedback.en,
- },
-};
-
-const locale = getCurrentLocale();
-const i18n = createI18n({
- globalInjection: true,
- locale,
- legacy: false,
- fallbackLocale: 'zh',
- messages,
-});
-
-export default i18n;
diff --git a/docs/.vitepress/src/layouts/LayoutDoc.vue b/docs/.vitepress/src/layouts/LayoutDoc.vue
deleted file mode 100644
index 8e62a7f99bad616d955c0aa2b8326e755be52728..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/layouts/LayoutDoc.vue
+++ /dev/null
@@ -1,820 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 文档捉虫
-
-
-
-
-
-
-
-
-
-
-
-
版本
-
-
-
-
- {{ option.version }}
-
-
-
-
-
- 重置
-
- 确定
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/shared/axios/handleError.ts b/docs/.vitepress/src/shared/axios/handleError.ts
deleted file mode 100644
index 3a08d25130667367ba1c77808c055c9f0eadf553..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/shared/axios/handleError.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import type { AxiosError } from 'axios';
-
-export default (err: AxiosError) => {
- const { response } = err;
-
- if (response) {
- if (!response.status) {
- err.code = '';
- err.message = '有response但没有response.status的情况';
- }
-
- const data = response.data as { code: string; data: any; msg: string };
-
- switch (response && response.status) {
- case 200:
- err.message = '错误响应也会有状态码为200的情况';
- break;
- case 400:
- err.code = data.code ?? String(response.status);
- err.message = '请求错误(400)';
- break;
- case 401:
- err.message = '未授权,请重新登录(401)';
- break;
- case 403:
- err.message = '拒绝访问(403)';
- break;
- case 404:
- err.message = '请求出错(404)';
- break;
- case 408:
- err.message = '请求超时(408)';
- break;
- case 418:
- err.message = '服务正在维护升级(418)';
- break;
- case 500:
- err.message = '服务器错误(500)';
- break;
- case 501:
- err.message = '服务未实现(501)';
- break;
- case 502:
- err.message = '网络错误(502)';
- break;
- case 503:
- err.message = '服务不可用(503)';
- break;
- case 504:
- err.message = '网络超时(504)';
- break;
- case 505:
- err.message = 'HTTP版本不受支持(505)';
- break;
- default:
- err.message = `连接出错,状态码:(${response.status})!`;
- }
- }
-
- return err;
-};
diff --git a/docs/.vitepress/src/shared/axios/handleResponse.ts b/docs/.vitepress/src/shared/axios/handleResponse.ts
deleted file mode 100644
index c24d7db3efbb802d27e04945b80c51e285618e4f..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/shared/axios/handleResponse.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import type { AxiosResponse } from 'axios';
-
-export default (response: AxiosResponse) => {
- return response;
-};
diff --git a/docs/.vitepress/src/shared/axios/index.ts b/docs/.vitepress/src/shared/axios/index.ts
deleted file mode 100644
index 547d7ebdd580656b91915c777f469cd4f8f1200d..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/shared/axios/index.ts
+++ /dev/null
@@ -1,224 +0,0 @@
-import type { Ref } from 'vue';
-
-import axios from 'axios';
-import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosRequestHeaders, AxiosResponse, AxiosStatic, Canceler } from 'axios';
-
-import handleResponse from './handleResponse';
-import handleError from './handleError';
-import setConfig from './setConfig';
-
-import { isBoolean, useLoading, useMessage, isNull, isUndefined } from '@opensig/opendesign';
-import type { LoadingPropsT } from '@opensig/opendesign/lib/loading/types';
-import { LOGIN_STATUS, clearUserAuth } from '@/shared/login';
-import { useLoginStore } from '@/stores/user';
-
-interface RequestConfig extends AxiosRequestConfig {
- data?: D;
- showLoading?: boolean | { opt?: Partial; wrap: Ref | HTMLElement | string }; // 加载时是否出现Loading框,默认为false
- showError?: boolean; // 请求报错是否出现错误提示,默认为true
- ignoreError?: number; // 忽略某个状态码错误提示
- ignoreDuplicates?: boolean; // false: 取消重复请求; true: 允许重复请求
- global?: boolean; // 是否为全局请求,全局请求在清除请求池时,不清除
-}
-
-interface RequestInstance extends AxiosInstance {
- removeRequestInterceptor(): void;
- removeResponseInterceptor(): void;
- clearPendingPool(whiteList: Array): Array | null;
- getUri(config?: RequestConfig): string;
- request, D = any>(config: RequestConfig): Promise;
- get, D = any>(url: string, config?: RequestConfig): Promise;
- delete, D = any>(url: string, config?: RequestConfig): Promise;
- head, D = any>(url: string, config?: RequestConfig): Promise;
- options, D = any>(url: string, config?: RequestConfig): Promise;
- post, D = any>(url: string, data?: D, config?: RequestConfig): Promise;
- put, D = any>(url: string, data?: D, config?: RequestConfig): Promise;
- patch, D = any>(url: string, data?: D, config?: RequestConfig): Promise;
-}
-
-interface InternalRequestConfig extends RequestConfig {
- headers: AxiosRequestHeaders;
-}
-
-let loadingInstance: { toggle(show?: boolean): void } | null = null;
-let loadingCount = 0;
-
-/**
- * request是基于axios创建的实例,实例只有常见的数据请求方法,没有axios.isCancel/ axios.CancelToken等方法,
- * 也就是没有**取消请求**和**批量请求**的方法。
- * 所以如果需要在实例中调用取消某个请求的方法(例如取消上传),请用intactRequest。
- */
-const intactRequest: AxiosStatic = setConfig(axios);
-const request: RequestInstance = intactRequest.create() as RequestInstance;
-
-// 请求中的api
-const pendingPool: Map = new Map();
-
-const getLoadingInstance = (showLoading: boolean | { opt?: Partial; wrap: Ref | HTMLElement | string }) => {
- if (isBoolean(showLoading)) {
- return useLoading();
- } else {
- const { opt, wrap = 'body' } = showLoading;
- if (opt) {
- return useLoading(opt, wrap);
- } else {
- return useLoading();
- }
- }
-};
-
-/**
- * 请求拦截
- */
-const requestInterceptorId = request.interceptors.request.use(
- (config: InternalRequestConfig) => {
- const { showLoading } = config;
-
- if (loadingCount === 0 && config.showLoading) {
- if (showLoading) {
- loadingInstance = getLoadingInstance(showLoading);
-
- loadingInstance.toggle(true);
- loadingCount++;
- }
- }
- // 存储请求信息
- // 定义取消请求
- if (!config.ignoreDuplicates) {
- config.cancelToken = new axios.CancelToken((cancelFn) => {
- if (!config?.url) {
- return;
- }
-
- // 如果已请求,则取消重复请求
- if (!pendingPool.has(config.url)) {
- // 存储到请求池
- pendingPool.set(config.url, {
- method: config.method,
- cancelFn,
- global: config.global,
- });
- }
- });
- }
- if (config.params) {
- Object.keys(config?.params).forEach((key) => {
- if (config.params[key] === '' || isNull(config.params[key]) || isUndefined(config.params[key])) {
- delete config.params[key];
- }
- });
- }
- return config;
- },
- (err: AxiosError) => {
- Promise.reject(err);
- }
-);
-
-/**
- * 响应拦截
- */
-const responseInterceptorId = request.interceptors.response.use(
- (response: AxiosResponse) => {
- if (loadingInstance) {
- loadingCount--;
- }
- if (loadingCount === 0 && loadingInstance) {
- loadingInstance.toggle(false);
- loadingInstance = null;
- }
- const { config } = response;
-
- // 请求完成,移除请求池
- if (config.url) {
- pendingPool.delete(config.url);
- }
-
- return Promise.resolve(handleResponse(response));
- },
- (err: AxiosError) => {
- if (loadingInstance) {
- loadingInstance.toggle(false);
- loadingCount = 0;
- }
-
- const config = err.config as InternalRequestConfig;
-
- // 非取消请求发生异常,同样将请求移除请求池
- if (!axios.isCancel(err) && config?.url) {
- pendingPool.delete(config.url);
- }
-
- if (err.response) {
- if (err.stack && err.stack.includes('timeout')) {
- err.message = '请求超时!';
- }
- err = handleError(err);
- }
- // 没有response(没有状态码)的情况
- else {
- // 被取消的请求
- if (axios.isCancel(err)) {
- throw new axios.Cancel(err.message || `请求'${config?.url}'被取消`);
- }
- }
-
- if (config && config.showError !== false && config.ignoreError !== err.response?.status) {
- const msg = useMessage();
- msg.show({
- content: err.message,
- status: 'danger',
- });
- }
-
- if (err.response?.status === 401) {
- clearUserAuth();
- useLoginStore().setLoginStatus(LOGIN_STATUS.FAILED);
- }
-
- return Promise.reject(err);
- }
-);
-// 移除全局的请求拦截器
-function removeRequestInterceptor() {
- request.interceptors.request.eject(requestInterceptorId);
-}
-
-// 移除全局的响应拦截器
-function removeResponseInterceptor() {
- request.interceptors.response.eject(responseInterceptorId);
-}
-
-/**
- * 清除所有pending状态的请求
- * @param {Array} whiteList 白名单,里面的请求不会被取消
- * 返回值 被取消了的api请求
- * 可以在路由变化时取消当前所有非全局的pending状态的请求
- */
-function clearPendingPool(whiteList: Array = []) {
- if (!pendingPool.size) {
- return null;
- }
-
- const pendingUrlList: Array = Array.from(pendingPool.keys()).filter((url: string) => !whiteList.includes(url));
- if (!pendingUrlList.length) {
- return null;
- }
-
- pendingUrlList.forEach((pendingUrl) => {
- // 清除掉所有非全局的pending状态下的请求
- if (!pendingPool.get(pendingUrl)?.global) {
- pendingPool.get(pendingUrl)?.cancelFn();
- pendingPool.delete(pendingUrl);
- }
- });
-
- return pendingUrlList;
-}
-
-request.removeRequestInterceptor = removeRequestInterceptor;
-request.removeResponseInterceptor = removeResponseInterceptor;
-request.clearPendingPool = clearPendingPool;
-
-export { intactRequest, request };
-export type { AxiosResponse, RequestConfig, RequestInstance };
diff --git a/docs/.vitepress/src/shared/axios/setConfig.ts b/docs/.vitepress/src/shared/axios/setConfig.ts
deleted file mode 100644
index 18ca43ffea683ae87e34b4da57a59dab2d71e979..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/shared/axios/setConfig.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { AxiosStatic } from 'axios';
-const XSRF_COOKIE_NAME = import.meta.env.VITE_XSRF_COOKIE_NAME;
-const XSRF_HEADER_NAME = import.meta.env.VITE_XSRF_HEADER_NAME;
-
-/**
- * @param {axios} axios实例
- * @param {config} 自定义配置对象,可覆盖掉默认的自定义配置
- */
-export default (axios: AxiosStatic, config = {}) => {
- const defaultConfig = {
- timeout: 20000,
- headers: {
- 'Content-Type': 'application/json;charset=UTF-8',
- },
- xsrfCookieName: XSRF_COOKIE_NAME,
- xsrfHeaderName: XSRF_HEADER_NAME,
- };
- Object.assign(axios.defaults, defaultConfig, config);
- return axios;
-};
diff --git a/docs/.vitepress/src/shared/cookie.ts b/docs/.vitepress/src/shared/cookie.ts
deleted file mode 100644
index 88c138c191a1c079aec667288c170a330614efdc..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/shared/cookie.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import Cookies from 'js-cookie';
-
-/**
- * 获取指定key的cookie值
- * @param key
- * @returns
- */
-export const getCustomCookie = (key: string) => {
- return Cookies.get(key);
-};
-
-/**
- * 设置cookie
- * @param key cookie的key
- * @param value cookie的值
- * @param day cookie的过期时间 默认180天
- * @param domain domain地址
- */
-export const setCustomCookie = (key: string, value: string, day = 180, domain: string = location.hostname) => {
- Cookies.set(key, value, { expires: day, path: '/', domain: domain });
-};
-
-/**
- * 删除cookie
- * @param key cookie的key
- * @param domain domain地址
- */
-export const removeCustomCookie = (key: string, domain: string = location.hostname) => {
- Cookies.remove(key, { path: '/', domain: domain });
-};
diff --git a/docs/.vitepress/src/shared/login.ts b/docs/.vitepress/src/shared/login.ts
deleted file mode 100644
index 07c04a448da022f68abc04b8c20d17503123e045..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/shared/login.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import Cookies from 'js-cookie';
-import { useLangStore } from '@/stores/common';
-import { useLoginStore, useUserInfoStore } from '@/stores/user';
-import { queryUserInfo } from '@/api/api-user';
-
-const LOGIN_URL = import.meta.env.VITE_LOGIN_URL;
-const XSRF_COOKIE_NAME = import.meta.env.VITE_XSRF_COOKIE_NAME;
-
-// 登录状态
-export enum LOGIN_STATUS {
- FAILED = -1, // 登录失败
- NOT = 0, // 未登录
- DOING = 1, // 登录中
- DONE = 2, // 登录成功
-}
-export type LoginStatusT = typeof LOGIN_STATUS.FAILED | LOGIN_STATUS.NOT | LOGIN_STATUS.DOING | LOGIN_STATUS.DONE;
-
-export const LOGIN_KEYS = {
- CSRF_TOKEN: XSRF_COOKIE_NAME,
- USER_INFO: '_U_I_',
-};
-
-/**
- * 从cookie中获取csrfToken
- * @returns csrfToken
- */
-export const getCsrfToken = () => Cookies.get(LOGIN_KEYS.CSRF_TOKEN) || '';
-
-// 退出登录
-export function logout() {
- location.href = `${LOGIN_URL}/logout?redirect_uri=${encodeURIComponent(window?.location?.origin)}`;
-}
-
-/**
- * 跳转登录页
- */
-export function doLogin() {
- location.href = `${LOGIN_URL}/login?redirect_uri=${encodeURIComponent(location.href)}&lang=${useLangStore().lang}`;
-}
-
-// 清除用户认证凭据
-export function clearUserAuth() {
- // 清除内存中用户信息
- useUserInfoStore().$reset();
- // 清除cookie
- if (import.meta.env.DEV) {
- Cookies.remove(LOGIN_KEYS.CSRF_TOKEN);
- } else {
- Cookies.remove(LOGIN_KEYS.CSRF_TOKEN, { domain: import.meta.env.VITE_COOKIE_DOMAIN, path: '/', secure: true });
- }
-}
-
-/**
- * 尝试登录
- * @returns 登录结果
- */
-export async function tryLogin() {
- const userInfoStore = useUserInfoStore();
- const loginStore = useLoginStore();
- const csrfToken = getCsrfToken();
- if (!csrfToken) {
- userInfoStore.$reset();
- loginStore.setLoginStatus(LOGIN_STATUS.NOT);
- return;
- }
-
- try {
- loginStore.setLoginStatus(LOGIN_STATUS.DOING);
- userInfoStore.$patch(await queryUserInfo());
- loginStore.setLoginStatus(LOGIN_STATUS.DONE);
- } catch (error) {
- loginStore.setLoginStatus(LOGIN_STATUS.FAILED);
-
-
- }
-}
diff --git a/docs/.vitepress/src/stores/common.ts b/docs/.vitepress/src/stores/common.ts
deleted file mode 100644
index 75ec55b66ab5ae73d10ce1b703b3330f0a742f91..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/stores/common.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import { defineStore } from 'pinia';
-
-// 语言
-export const useLangStore = defineStore('lang', {
- state: () => {
- return {
- lang: '',
- };
- },
- actions: {
- setLangStore(val: string) {
- this.lang = val;
- },
- },
-});
-
-/**
- * 页面状态
- */
-export const useViewStore = defineStore('view', {
- state: () => {
- return {
- notFoundPage: false,
- noPermission: false,
- };
- },
- actions: {
- showNotFound() {
- this.notFoundPage = true;
- },
- },
-});
-
-export const useAppearance = defineStore('appearance', {
- state: () => ({
- theme: 'light',
- iconMenuShow: true,
- }),
-});
-
-export const usePrevPage = defineStore('prevPage', {
- state: () => ({
- prevPageUrl: '',
- }),
-});
-
-/**
- * 搜索状态
- */
-export const useSearchingStore = defineStore('isSearching', {
- state: () => {
- return {
- isSearching: false,
- keyword: '',
- isLoading: false,
- currentPage: 1,
- version: '', // 文档当前版本
- };
- },
- actions: {
- setIsSearching(value: boolean) {
- this.isSearching = value;
- },
- setKeyword(value: string) {
- this.keyword = value;
- },
- setIsLoading(value: boolean) {
- this.isLoading = value;
- },
- setCurrentPage(value: number) {
- this.currentPage = value;
- },
- },
-});
diff --git a/docs/.vitepress/src/stores/download.ts b/docs/.vitepress/src/stores/download.ts
deleted file mode 100644
index 5e3556d187aabd5301b8b7bfe18847e47d6766e9..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/stores/download.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { defineStore } from 'pinia';
-
-/**
- * vitepress 无法监听 History.replaceState和pushState,使用 pinia 监听 scenario变化
- */
-export const useDownload = defineStore('download', {
- state: () => ({
- scenario: '',
- version: '',
- }),
- actions: {
- setScenario(val: string) {
- this.scenario = val;
- },
- setVersion(val: string) {
- this.version = val;
- },
- },
-});
diff --git a/docs/.vitepress/src/stores/menu.ts b/docs/.vitepress/src/stores/menu.ts
deleted file mode 100644
index c8b3ec9371544932db61a72b4e6bf405fccf5ac8..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/stores/menu.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import { computed, onMounted, ref, watch } from 'vue';
-import { defineStore } from 'pinia';
-import { MENU_CONFIG } from '@/config/menu';
-import { DocMenuTree, type DocMenuNodeT } from '@/utils/tree';
-import { useRoute } from '@/composables/useRoute';
-
-export const useMenuStore = defineStore('menu', () => {
- const rootTree = new DocMenuTree(MENU_CONFIG);
- const allNodes = rootTree.root.children;
- const { url } = useRoute();
-
- // -------------------- 当前菜单节点 --------------------
- const currentNode = computed(() => {
- const href = url.value.split('#')[0];
- const node = rootTree.getNodeByHref(rootTree.root, decodeURIComponent(url.value));
- const anchorNode = rootTree.getNodeByHref(rootTree.root, decodeURIComponent(href));
- return node || anchorNode;
- });
-
- // -------------------- 当前菜单节点的所有前驱节点 --------------------
- const prevNodes = computed(() => {
- return currentNode.value ? rootTree.getPrevNodes(currentNode.value, 1) : [];
- });
-
- // -------------------- 当前菜单节点的手册节点 --------------------
- const bookNode = computed(() => {
- if (!currentNode.value) {
- return null;
- }
-
- let node: DocMenuNodeT | null = currentNode.value;
- while (node && !node.ismanual) {
- node = node.parent;
- }
-
- return node;
- });
-
- const bookNodes = computed(() => (bookNode.value ? [bookNode.value] : []));
-
- // -------------------- 菜单绑定值 --------------------
- const menuValue = ref('');
- const menuExpanded = ref([]);
-
- const updateExpanded = () => {
- if (!currentNode.value || currentNode.value?.depth < 3) {
- menuExpanded.value = [];
- return;
- }
-
- const arr = prevNodes.value;
- if (currentNode.value.children?.length > 0) {
- arr.push(currentNode.value);
- }
-
- menuExpanded.value = arr.map((item) => item.id);
- };
-
- onMounted(() => {
- menuValue.value = currentNode.value?.id || '';
- updateExpanded();
- });
-
- watch(currentNode, () => {
- menuValue.value = currentNode.value?.id || '';
- updateExpanded();
- });
-
- return {
- menuValue, // 绑定菜单值
- menuExpanded, // 展开值
- rootTree, // 根节点
- allNodes, // 所有节点
- bookNode, // 手册节点
- bookNodes, // 手册节点数组
- currentNode, // 当前节点
- prevNodes, // 当前节点的所有前驱节点
- };
-});
diff --git a/docs/.vitepress/src/stores/user.ts b/docs/.vitepress/src/stores/user.ts
deleted file mode 100644
index d8cb3996c81c8fe8a68553697409b24064ac6217..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/stores/user.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import type { Identity } from '@/@types/type-user';
-import { LOGIN_STATUS, type LoginStatusT } from '@/shared/login';
-import { defineStore } from 'pinia';
-
-/**
- * 用户基本信息
- */
-export const useUserInfoStore = defineStore('userInfo', {
- state: () => {
- return {
- identities: [] as Identity[],
- photo: '' as string,
- username: '' as string,
- upstreamPermission: null as boolean | null,
- // 协作平台admin权限
- platformAdminPermission: null as boolean | null,
- // 协作平台maintainer权限
- platformMaintainerPermission: null as boolean | null,
- };
- },
- getters: {
- // 获取giteeID
- getGiteeId(status): string {
- const id = status.identities.find((id) => id.identity === 'gitee');
- return id ? id.login_name : '';
- },
- },
-});
-
-/**
- * 登录状态
- */
-export const useLoginStore = defineStore('login', {
- state: () => {
- return {
- loginStatus: LOGIN_STATUS.NOT,
- };
- },
- actions: {
- setLoginStatus(status: LoginStatusT) {
- this.loginStatus = status;
- },
- },
- getters: {
- // 登录失败
- isLoginFailed(): boolean {
- return this.loginStatus === LOGIN_STATUS.FAILED;
- },
- // 未登录
- isLoginNot(): boolean {
- return this.loginStatus === LOGIN_STATUS.NOT;
- },
- // 登录中
- isLoggingIn(): boolean {
- return this.loginStatus === LOGIN_STATUS.DOING;
- },
- // 登录成功
- isLogined(): boolean {
- return this.loginStatus === LOGIN_STATUS.DONE;
- },
- },
-});
diff --git a/docs/.vitepress/src/utils/common.ts b/docs/.vitepress/src/utils/common.ts
deleted file mode 100644
index 8924c5dbee7af65dd37d1b7c7bfa41c6613d46cd..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/utils/common.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { isClient } from '@opensig/opendesign';
-
-/**
- * safe window open
- */
-export const windowOpen = (url?: string | URL | undefined, target?: string | undefined, features?: string | undefined) => {
- const opener = window.open(url, target, features);
- opener && (opener.opener = null);
-};
-
-/**
- * 时间戳转 xxxx/xx/xx 格式时间
- * @param {number} timestamp 待转换时间戳
- * @returns {string} 返回格式化时间,如 2024/01/01
- */
-export const changeTimeStamp = (timestamp: number) => {
- const date = new Date(timestamp * 1000);
-
- const year = date.getFullYear();
- const month = ('0' + (date.getMonth() + 1)).slice(-2);
- const day = ('0' + date.getDate()).slice(-2);
-
- return `${year}/${month}/${day}`;
-};
-
-/**
- * URL参数转对象
- * @param {string} url 地址
- * @returns {(string|undefined)} 转换成功返回参数对象,失败返回 undefined
- */
-export function getUrlParams(url: string) {
- const arrObj = url.split('?');
- if (arrObj.length > 1) {
- const arrPara = arrObj[1].split('&');
- const list = {} as any;
- for (let i = 0; i < arrPara.length; i++) {
- const item = arrPara[i].split('=');
- const key = item[0];
- const value = item[1];
- list[key] = value;
- }
- return list;
- }
-}
-
-/**
- * 滚动至顶部
- * @param {number} top 滑动到的顶部
- * @param {boolean} smooth 是否平滑滑动
- */
-export const scrollToTop = (top: number = 0, smooth: boolean = true) => {
- if (isClient) {
- const dom = document.querySelector('#app > .o-scroller > .o-scroller-container');
- dom?.scrollTo({
- top,
- behavior: smooth ? 'smooth' : 'instant',
- });
- }
-};
-
-/**
- * 获取url搜索参数
- * @param {string} url 完整 url
- * @returns {Object} url 中的搜索参数
- */
-export function getSearchUrlParams(url: string) {
- const search = new URL(url).search;
- const params = new URLSearchParams(search);
- return params;
-}
-
-/**
- * 判断 key 是否存在于目标对象上
- * @param {(string|number|symbol)} key 待判断 key
- * @param {object} obj 目标对象
- * @returns {boolean} 存在返回 true,不存在返回 false
- */
-export const isValidKey = (key: string | number | symbol, obj: object): key is keyof typeof obj => {
- return Object.prototype.hasOwnProperty.call(obj, key);
-};
-
-/**
- * 获取指定时区偏移量的年份
- * @param {number} offset - 时区偏移量(单位:小时)。例如,UTC+8 时区,传入 8。
- * @returns {number} - 指定时区偏移量对应的年份
- */
-export function getYearByOffset(offset = 8) {
- // 获取当前时间的 UTC 时间
- const now = new Date();
- const utcTime = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
-
- // 设置偏移
- utcTime.setHours(utcTime.getHours() + offset);
-
- return utcTime.getFullYear();
-}
diff --git a/docs/.vitepress/src/utils/cookie.ts b/docs/.vitepress/src/utils/cookie.ts
deleted file mode 100644
index 88c138c191a1c079aec667288c170a330614efdc..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/utils/cookie.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import Cookies from 'js-cookie';
-
-/**
- * 获取指定key的cookie值
- * @param key
- * @returns
- */
-export const getCustomCookie = (key: string) => {
- return Cookies.get(key);
-};
-
-/**
- * 设置cookie
- * @param key cookie的key
- * @param value cookie的值
- * @param day cookie的过期时间 默认180天
- * @param domain domain地址
- */
-export const setCustomCookie = (key: string, value: string, day = 180, domain: string = location.hostname) => {
- Cookies.set(key, value, { expires: day, path: '/', domain: domain });
-};
-
-/**
- * 删除cookie
- * @param key cookie的key
- * @param domain domain地址
- */
-export const removeCustomCookie = (key: string, domain: string = location.hostname) => {
- Cookies.remove(key, { path: '/', domain: domain });
-};
diff --git a/docs/.vitepress/src/utils/element.ts b/docs/.vitepress/src/utils/element.ts
deleted file mode 100644
index 08bb56f8030767a9b9101c276adc9021215a2bb7..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/utils/element.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { isWindow, type AnchorContainerT } from "@opensig/opendesign";
-
-export const getOffsetTop = (el: HTMLElement, container: AnchorContainerT) => {
- const { top } = el.getBoundingClientRect();
- if (isWindow(container)) {
- return top - document.documentElement.clientTop;
- }
-
- return top - container.getBoundingClientRect().top;
-};
diff --git a/docs/.vitepress/src/utils/locale.ts b/docs/.vitepress/src/utils/locale.ts
deleted file mode 100644
index d006e8da9a40a47f4158dce3d0f10dbc458875c2..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/utils/locale.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { isClient } from '@opensig/opendesign';
-
-/**
- * 获取当前的语言环境,目前只支持 zh 和 en
- * @returns {string} 若当前是 zh 环境则返回 zh,否则返回 en
- */
-export function getCurrentLocale() {
- if (isClient) {
- const { pathname } = window.location;
- if (pathname.startsWith('/zh/')) {
- return 'zh';
- } else if (pathname.startsWith('/en/')) {
- return 'en';
- } else {
- if (localStorage.getItem('locale')) {
- return localStorage.getItem('locale') === 'zh' ? 'zh' : 'en';
- } else {
- return navigator.language.toLowerCase().startsWith('zh') ? 'zh' : 'en';
- }
- }
- }
-
- return 'zh';
-}
diff --git a/docs/.vitepress/src/utils/tree.ts b/docs/.vitepress/src/utils/tree.ts
deleted file mode 100644
index 41de70955876890d9b055b4d056da81cedecc634..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/utils/tree.ts
+++ /dev/null
@@ -1,174 +0,0 @@
-import type { DocMenuT } from '../@types/type-doc-menu';
-
-export interface DocMenuNodeT {
- id: string;
- label: string;
- depth: number;
- href?: string;
- parent: DocMenuNodeT | null;
- description: string | null;
- type: string;
- ismanual: boolean;
- children: Array;
-}
-
-export class DocMenuTree {
- root: DocMenuNodeT;
- constructor(data: Array, base: string = '/') {
- this.root = {
- id: '',
- label: '',
- depth: 0,
- href: base,
- description: null,
- parent: null,
- type: 'root',
- ismanual: false,
- children: [],
- };
-
- this.buildTree(this.root, data);
- }
-
- /**
- * 迭代构造树
- * @param {DocMenuNodeT} parent 父节点
- * @param {Array} data 数据
- */
- buildTree(parent: DocMenuNodeT, data: Array) {
- for (let i = 0, len = data.length; i < len; i++) {
- const curDepth = parent.depth + 1;
- const info = data[i];
- const node: DocMenuNodeT = {
- id: info.id,
- label: info.label,
- depth: curDepth,
- href: info.href,
- parent,
- description: info.description || null,
- type: info.type || '',
- ismanual: info.ismanual === 'Y',
- children: [],
- };
-
- parent.children.push(node);
-
- if (info.children && info.children.length) {
- this.buildTree(node, info.children);
- }
- }
- }
-
- /**
- * BFS 广度优先查找节点
- * @param {DocMenuNodeT} node 父节点
- * @param {string} val id值
- * @returns {(DocMenuNodeT|undefined)} 查找到节点则返回该节点,未找到返回undefined
- */
- getNode(node: DocMenuNodeT, val: string): DocMenuNodeT | undefined {
- if (node.href === val) {
- return node;
- }
-
- const children: Array = node.children;
- for (let i = 0, len = children.length; i < len; i++) {
- const rlt = this.getNode(children[i], val);
- if (rlt) {
- return rlt;
- }
- }
- }
-
- /**
- * BFS 广度优先查找节点
- * @param {DocMenuNodeT} node 父节点
- * @param {string} val href值
- * @returns {(DocMenuNodeT|undefined)} 查找到节点则返回该节点,未找到返回undefined
- */
- getNodeByHref(node: DocMenuNodeT, val: string): DocMenuNodeT | undefined {
- if (node.href === val) {
- return node;
- }
-
- const children: Array = node.children;
- for (let i = 0, len = children.length; i < len; i++) {
- const rlt = this.getNodeByHref(children[i], val);
- if (rlt) {
- return rlt;
- }
- }
- }
-
- /**
- * BFS 广度优先查找节点
- * @param {DocMenuNodeT} node 父节点
- * @param {string} val label
- * @returns {(DocMenuNodeT|undefined)} 查找到节点则返回该节点,未找到返回undefined
- */
- getNodeByLabel(node: DocMenuNodeT, val: string): DocMenuNodeT | undefined {
- if (node.label === val) {
- return node;
- }
-
- const children: Array = node.children;
- for (let i = 0, len = children.length; i < len; i++) {
- const rlt = this.getNodeByLabel(children[i], val);
- if (rlt) {
- return rlt;
- }
- }
- }
-
- /**
- * 获取菜单首条点击节点
- * @param {DocMenuNodeT} node 父节点
- * @returns {string} 返回节点id
- */
- getFirstHrefNode(node: DocMenuNodeT) {
- return node.children[0].children[0].id;
- }
-
- /**
- * 获取节点-指定深度的前驱节点
- * @param {DocMenuNodeT} node 节点
- * @param {number} targetDepth 目标深度
- * @returns {DocMenuNodeT} 返回前驱节点
- */
- getPrevNode(node: DocMenuNodeT, targetDepth = 0) {
- if (targetDepth < 0 || node.depth < targetDepth) {
- return undefined;
- }
-
- let prev = node.parent;
- while (prev) {
- if (prev.depth === targetDepth) {
- return prev;
- }
-
- prev = prev.parent;
- }
-
- return undefined;
- }
-
- /**
- * 获取前驱节点(不包含目标节点)
- * @param {DocMenuNodeT} node 节点
- * @param {number} stopDepth 停止深度,到达此深度后不再往上收集。默认为0,即根节点。
- * @returns {DocMenuNodeT[]} 返回前驱节点
- */
- getPrevNodes(node: DocMenuNodeT, stopDepth = 0) {
- if (!node || stopDepth < 0 || node.depth <= stopDepth) {
- return [];
- }
-
- const nodes = [];
- let prev = node.parent;
- while (prev && prev.depth >= stopDepth) {
- nodes.push(prev);
- prev = prev.parent;
- }
-
- return nodes;
- }
-}
diff --git a/docs/.vitepress/src/views/docsNode/TheDocsNode.vue b/docs/.vitepress/src/views/docsNode/TheDocsNode.vue
deleted file mode 100644
index 924b4fe623ef358d411960d57636ab83d1d125ed..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/views/docsNode/TheDocsNode.vue
+++ /dev/null
@@ -1,232 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/views/home/TheHome.vue b/docs/.vitepress/src/views/home/TheHome.vue
deleted file mode 100644
index 41f660649f1cfbee96d7c6e23f59f02b9317e8a6..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/views/home/TheHome.vue
+++ /dev/null
@@ -1,361 +0,0 @@
-
-
-
-
-
-
- 文档中心
-
-
-
-
-
-
-
-
热门搜索:
-
-
- {{ item }}
-
-
-
-
-
-
-
-
-
-
-
- {{ item.title }}
- {{ item.desc }}
-
-
-
-
-
-
-
- 业务场景
-
-
-
-
-
-
-
- {{ item.title }}
-
-
-
-
-
-
-
-
- 工具
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/src/views/search/TheSearchResult.vue b/docs/.vitepress/src/views/search/TheSearchResult.vue
deleted file mode 100644
index 60046ab1eec6830a48a3ab305acadbbf716eee9e..0000000000000000000000000000000000000000
--- a/docs/.vitepress/src/views/search/TheSearchResult.vue
+++ /dev/null
@@ -1,319 +0,0 @@
-
-
-
-
-
-
-
{{ t('docs.searchResult') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts
deleted file mode 100644
index 10dfc89a8d1fc04f7e658bc01d6c95697deb1553..0000000000000000000000000000000000000000
--- a/docs/.vitepress/theme/index.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import type { App } from 'vue';
-import { createPinia } from 'pinia';
-
-import Layout from '@/App.vue';
-import NotFound from '@/NotFound.vue';
-import directives from '@/directives';
-
-import '@/assets/style/base.scss';
-import 'element-plus/theme-chalk/src/index.scss';
-import '@opensig/opendesign/es/index.scss';
-import '@/assets/style/theme/default-light.token.css';
-import '@/assets/style/theme/dark.token.css';
-import '@/assets/style/markdown.scss';
-import '@/assets/style/theme/index.scss';
-import '@/assets/style/global.scss';
-import '@/assets/style/element-plus/index.scss';
-
-import VueDOMPurifyHTML from 'vue-dompurify-html';
-
-export default {
- Layout,
- NotFound,
- enhanceApp({ app }: { app: App }) {
- app.use(createPinia());
- app.use(VueDOMPurifyHTML, {
- default: {
- ADD_ATTR: ['target'],
- },
- });
- // 指令
- Object.keys(directives).forEach((directive) => {
- app.directive(directive, directives[directive]);
- });
- },
-};
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/_menu.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..eda32737716359ee334353f9a2ccaf701e458227
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/_menu.md
@@ -0,0 +1,38 @@
+---
+label: 'Kubernetes集群部署指南'
+ismanual: 'Y'
+description: '在openEuler环境,为搭建稳定高效Kubernetes集群提供基本的操作指引'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '准备虚拟机'
+ href: './preparing-VMs.md'
+ - label: '手动部署集群'
+ href: './deploying-a-Kubernetes-cluster-manually.md'
+ children:
+ - label: '安装Kubernetes软件包'
+ href: './installing-the-Kubernetes-software-package.md'
+ - label: '准备证书'
+ href: './preparing-certificates.md'
+ - label: '安装etcd'
+ href: './installing-etcd.md'
+ - label: '部署控制面组件'
+ href: './deploying-control-plane-components.md'
+ - label: '部署Node节点组件'
+ href: './deploying-a-node-component.md'
+ - label: '自动部署集群'
+ href: './eggo-automatic-deployment.md'
+ children:
+ - label: '工具介绍'
+ href: './eggo-tool-introduction.md'
+ - label: '部署集群'
+ href: './eggo-deploying-a-cluster.md'
+ - label: '拆除集群'
+ href: './eggo-dismantling-a-cluster.md'
+ - label: '运行测试pod'
+ href: './running-the-test-pod.md'
+ - label: '基于containerd部署集群'
+ href: './kubernetes-containerd.md'
+ - label: '常见问题与解决方法'
+ href: './kubernetes-faqs.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-a-Kubernetes-cluster-manually.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-a-Kubernetes-cluster-manually.md
new file mode 100644
index 0000000000000000000000000000000000000000..833e149dd1b395a4b288e728abec78fd67cfc1a5
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-a-Kubernetes-cluster-manually.md
@@ -0,0 +1,18 @@
+# 手动部署集群
+
+**声明:手动部署方式仅适用于实验和学习环境,不适用于商用环境。**
+
+本章介绍手动部署 Kubernetes 集群的方法。
+
+## 环境说明
+
+通过上述虚拟机安装部署,获得如下虚拟机列表:
+
+| HostName | MAC | IPv4 |
+| ---------- | ----------------- | ------------------ |
+| k8smaster0 | 52:54:00:00:00:80 | 192.168.122.154/24 |
+| k8smaster1 | 52:54:00:00:00:81 | 192.168.122.155/24 |
+| k8smaster2 | 52:54:00:00:00:82 | 192.168.122.156/24 |
+| k8snode1 | 52:54:00:00:00:83 | 192.168.122.157/24 |
+| k8snode2 | 52:54:00:00:00:84 | 192.168.122.158/24 |
+| k8snode3 | 52:54:00:00:00:85 | 192.168.122.159/24 |
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-a-node-component.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-a-node-component.md
new file mode 100644
index 0000000000000000000000000000000000000000..d169481ede4bd98adadfc304128fc818f1c89e18
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-a-node-component.md
@@ -0,0 +1,381 @@
+# 部署 Node 节点组件
+
+本章节仅以`k8snode1`节点为例。
+
+## 环境准备
+
+```bash
+# 内网需要配置代理
+$ dnf install -y docker iSulad conntrack-tools socat containernetworking-plugins
+$ swapoff -a
+$ mkdir -p /etc/kubernetes/pki/
+$ mkdir -p /etc/cni/net.d
+$ mkdir -p /opt/cni
+# 删除默认kubeconfig
+$ rm /etc/kubernetes/kubelet.kubeconfig
+
+## 使用isulad作为运行时 ########
+# 配置iSulad
+cat /etc/isulad/daemon.json
+{
+ "registry-mirrors": [
+ "docker.io"
+ ],
+ "insecure-registries": [
+ "k8s.gcr.io",
+ "quay.io"
+ ],
+ "pod-sandbox-image": "k8s.gcr.io/pause:3.2",# pause类型
+ "network-plugin": "cni", # 置空表示禁用cni网络插件则下面两个路径失效, 安装插件后重启isulad即可
+ "cni-bin-dir": "/usr/libexec/cni/",
+ "cni-conf-dir": "/etc/cni/net.d",
+}
+
+# 在iSulad环境变量中添加代理,下载镜像
+cat /usr/lib/systemd/system/isulad.service
+[Service]
+Type=notify
+Environment="HTTP_PROXY=http://name:password@proxy:8080"
+Environment="HTTPS_PROXY=http://name:password@proxy:8080"
+
+# 重启iSulad并设置为开机自启
+systemctl daemon-reload
+systemctl restart isulad
+
+
+
+
+## 如果使用docker作为运行时 ########
+$ dnf install -y docker
+# 如果需要代理的环境,可以给docker配置代理,新增配置文件http-proxy.conf,并编写如下内容,替换name,password和proxy-addr为实际的配置。
+$ cat /etc/systemd/system/docker.service.d/http-proxy.conf
+[Service]
+Environment="HTTP_PROXY=http://name:password@proxy-addr:8080"
+$ systemctl daemon-reload
+$ systemctl restart docker
+```
+
+## 创建 kubeconfig 配置文件
+
+对各节点依次如下操作创建配置文件:
+
+```bash
+$ kubectl config set-cluster openeuler-k8s \
+ --certificate-authority=/etc/kubernetes/pki/ca.pem \
+ --embed-certs=true \
+ --server=https://192.168.122.154:6443 \
+ --kubeconfig=k8snode1.kubeconfig
+
+$ kubectl config set-credentials system:node:k8snode1 \
+ --client-certificate=/etc/kubernetes/pki/k8snode1.pem \
+ --client-key=/etc/kubernetes/pki/k8snode1-key.pem \
+ --embed-certs=true \
+ --kubeconfig=k8snode1.kubeconfig
+
+$ kubectl config set-context default \
+ --cluster=openeuler-k8s \
+ --user=system:node:k8snode1 \
+ --kubeconfig=k8snode1.kubeconfig
+
+$ kubectl config use-context default --kubeconfig=k8snode1.kubeconfig
+```
+
+**注:修改k8snode1为对应节点名**
+
+## 拷贝证书
+
+和控制面一样,所有证书、密钥和相关配置都放到`/etc/kubernetes/pki/`目录。
+
+```bash
+$ ls /etc/kubernetes/pki/
+ca.pem k8snode1.kubeconfig kubelet_config.yaml kube-proxy-key.pem kube-proxy.pem
+k8snode1-key.pem k8snode1.pem kube_proxy_config.yaml kube-proxy.kubeconfig
+```
+
+## CNI 网络配置
+
+先通过 containernetworking-plugins 作为 kubelet 使用的 cni 插件,后续可以引入 calico,flannel 等插件,增强集群的网络能力。
+
+```bash
+# 桥网络配置
+$ cat /etc/cni/net.d/10-bridge.conf
+{
+ "cniVersion": "0.3.1",
+ "name": "bridge",
+ "type": "bridge",
+ "bridge": "cnio0",
+ "isGateway": true,
+ "ipMasq": true,
+ "ipam": {
+ "type": "host-local",
+ "subnet": "10.244.0.0/16",
+ "gateway": "10.244.0.1"
+ },
+ "dns": {
+ "nameservers": [
+ "10.244.0.1"
+ ]
+ }
+}
+
+# 回环网络配置
+$ cat /etc/cni/net.d/99-loopback.conf
+{
+ "cniVersion": "0.3.1",
+ "name": "lo",
+ "type": "loopback"
+}
+```
+
+## 部署 kubelet 服务
+
+### kubelet 依赖的配置文件
+
+```bash
+$ cat /etc/kubernetes/pki/kubelet_config.yaml
+kind: KubeletConfiguration
+apiVersion: kubelet.config.k8s.io/v1beta1
+authentication:
+ anonymous:
+ enabled: false
+ webhook:
+ enabled: true
+ x509:
+ clientCAFile: /etc/kubernetes/pki/ca.pem
+authorization:
+ mode: Webhook
+clusterDNS:
+- 10.32.0.10
+clusterDomain: cluster.local
+runtimeRequestTimeout: "15m"
+tlsCertFile: "/etc/kubernetes/pki/k8snode1.pem"
+tlsPrivateKeyFile: "/etc/kubernetes/pki/k8snode1-key.pem"
+```
+
+**注意:clusterDNS 的地址为:10.32.0.10,必须和之前设置的 service-cluster-ip-range 一致**
+
+### 编写 systemd 配置文件
+
+```bash
+$ cat /usr/lib/systemd/system/kubelet.service
+[Unit]
+Description=kubelet: The Kubernetes Node Agent
+Documentation=https://kubernetes.io/docs/
+Wants=network-online.target
+After=network-online.target
+
+[Service]
+ExecStart=/usr/bin/kubelet \
+ --config=/etc/kubernetes/pki/kubelet_config.yaml \
+ --network-plugin=cni \
+ --pod-infra-container-image=k8s.gcr.io/pause:3.2 \
+ --kubeconfig=/etc/kubernetes/pki/k8snode1.kubeconfig \
+ --register-node=true \
+ --hostname-override=k8snode1 \
+ --cni-bin-dir="/usr/libexec/cni/" \
+ --v=2
+
+Restart=always
+StartLimitInterval=0
+RestartSec=10
+
+[Install]
+WantedBy=multi-user.target
+```
+
+**注意:如果使用isulad作为runtime,需要增加如下配置**
+
+```bash
+--container-runtime=remote \
+--container-runtime-endpoint=unix:///var/run/isulad.sock \
+```
+
+## 部署 kube-proxy
+
+### kube-proxy 依赖的配置文件
+
+```bash
+cat /etc/kubernetes/pki/kube_proxy_config.yaml
+kind: KubeProxyConfiguration
+apiVersion: kubeproxy.config.k8s.io/v1alpha1
+clientConnection:
+ kubeconfig: /etc/kubernetes/pki/kube-proxy.kubeconfig
+clusterCIDR: 10.244.0.0/16
+mode: "iptables"
+```
+
+### 编写 systemd 配置文件
+
+```bash
+$ cat /usr/lib/systemd/system/kube-proxy.service
+[Unit]
+Description=Kubernetes Kube-Proxy Server
+Documentation=https://kubernetes.io/docs/reference/generated/kube-proxy/
+After=network.target
+
+[Service]
+EnvironmentFile=-/etc/kubernetes/config
+EnvironmentFile=-/etc/kubernetes/proxy
+ExecStart=/usr/bin/kube-proxy \
+ $KUBE_LOGTOSTDERR \
+ $KUBE_LOG_LEVEL \
+ --config=/etc/kubernetes/pki/kube_proxy_config.yaml \
+ --hostname-override=k8snode1 \
+ $KUBE_PROXY_ARGS
+Restart=on-failure
+LimitNOFILE=65536
+
+[Install]
+WantedBy=multi-user.target
+```
+
+## 启动组件服务
+
+```bash
+$ systemctl enable kubelet kube-proxy
+$ systemctl start kubelet kube-proxy
+```
+
+其他节点依次部署即可。
+
+## 验证集群状态
+
+等待几分钟,使用如下命令查看node状态:
+
+```bash
+$ kubectl get nodes --kubeconfig /etc/kubernetes/pki/admin.kubeconfig
+NAME STATUS ROLES AGE VERSION
+k8snode1 Ready 17h v1.20.2
+k8snode2 Ready 19m v1.20.2
+k8snode3 Ready 12m v1.20.2
+```
+
+## 部署 coredns
+
+coredns可以部署到node节点或者master节点,本文这里部署到节点`k8snode1`。
+
+### 编写 coredns 配置文件
+
+```bash
+$ cat /etc/kubernetes/pki/dns/Corefile
+.:53 {
+ errors
+ health {
+ lameduck 5s
+ }
+ ready
+ kubernetes cluster.local in-addr.arpa ip6.arpa {
+ pods insecure
+ endpoint https://192.168.122.154:6443
+ tls /etc/kubernetes/pki/ca.pem /etc/kubernetes/pki/admin-key.pem /etc/kubernetes/pki/admin.pem
+ kubeconfig /etc/kubernetes/pki/admin.kubeconfig default
+ fallthrough in-addr.arpa ip6.arpa
+ }
+ prometheus :9153
+ forward . /etc/resolv.conf {
+ max_concurrent 1000
+ }
+ cache 30
+ loop
+ reload
+ loadbalance
+}
+```
+
+说明:
+
+- 监听53端口;
+- 设置kubernetes插件配置:证书、kube api的URL;
+
+### 准备 systemd 的 service 文件
+
+```bash
+cat /usr/lib/systemd/system/coredns.service
+[Unit]
+Description=Kubernetes Core DNS server
+Documentation=https://github.com/coredns/coredns
+After=network.target
+
+[Service]
+ExecStart=bash -c "KUBE_DNS_SERVICE_HOST=10.32.0.10 coredns -conf /etc/kubernetes/pki/dns/Corefile"
+
+Restart=on-failure
+LimitNOFILE=65536
+
+[Install]
+WantedBy=multi-user.target
+```
+
+### 启动服务
+
+```bash
+$ systemctl enable coredns
+$ systemctl start coredns
+```
+
+### 创建 coredns 的 Service 对象
+
+```bash
+$ cat coredns_server.yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: kube-dns
+ namespace: kube-system
+ annotations:
+ prometheus.io/port: "9153"
+ prometheus.io/scrape: "true"
+ labels:
+ k8s-app: kube-dns
+ kubernetes.io/cluster-service: "true"
+ kubernetes.io/name: "CoreDNS"
+spec:
+ clusterIP: 10.32.0.10
+ ports:
+ - name: dns
+ port: 53
+ protocol: UDP
+ - name: dns-tcp
+ port: 53
+ protocol: TCP
+ - name: metrics
+ port: 9153
+ protocol: TCP
+```
+
+### 创建 coredns 的 endpoint 对象
+
+```bash
+$ cat coredns_ep.yaml
+apiVersion: v1
+kind: Endpoints
+metadata:
+ name: kube-dns
+ namespace: kube-system
+subsets:
+ - addresses:
+ - ip: 192.168.122.157
+ ports:
+ - name: dns-tcp
+ port: 53
+ protocol: TCP
+ - name: dns
+ port: 53
+ protocol: UDP
+ - name: metrics
+ port: 9153
+ protocol: TCP
+```
+
+### 确认 coredns 服务
+
+```bash
+# 查看service对象
+$ kubectl get service -n kube-system kube-dns
+NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+kube-dns ClusterIP 10.32.0.10 53/UDP,53/TCP,9153/TCP 51m
+# 查看endpoint对象
+$ kubectl get endpoints -n kube-system kube-dns
+NAME ENDPOINTS AGE
+kube-dns 192.168.122.157:53,192.168.122.157:53,192.168.122.157:9153 52m
+```
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-control-plane-components.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-control-plane-components.md
new file mode 100644
index 0000000000000000000000000000000000000000..0ace9d653603bbcad4d8ad31aa1146969ed10aa1
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/deploying-control-plane-components.md
@@ -0,0 +1,357 @@
+# 部署控制面组件
+
+## 准备所有组件的 kubeconfig
+
+### kube-proxy
+
+```bash
+$ kubectl config set-cluster openeuler-k8s --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://192.168.122.154:6443 --kubeconfig=kube-proxy.kubeconfig
+$ kubectl config set-credentials system:kube-proxy --client-certificate=/etc/kubernetes/pki/kube-proxy.pem --client-key=/etc/kubernetes/pki/kube-proxy-key.pem --embed-certs=true --kubeconfig=kube-proxy.kubeconfig
+$ kubectl config set-context default --cluster=openeuler-k8s --user=system:kube-proxy --kubeconfig=kube-proxy.kubeconfig
+$ kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
+```
+
+### kube-controller-manager
+
+```bash
+$ kubectl config set-cluster openeuler-k8s --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:6443 --kubeconfig=kube-controller-manager.kubeconfig
+$ kubectl config set-credentials system:kube-controller-manager --client-certificate=/etc/kubernetes/pki/kube-controller-manager.pem --client-key=/etc/kubernetes/pki/kube-controller-manager-key.pem --embed-certs=true --kubeconfig=kube-controller-manager.kubeconfig
+$ kubectl config set-context default --cluster=openeuler-k8s --user=system:kube-controller-manager --kubeconfig=kube-controller-manager.kubeconfig
+$ kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig
+```
+
+### kube-scheduler
+
+```bash
+$ kubectl config set-cluster openeuler-k8s --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:6443 --kubeconfig=kube-scheduler.kubeconfig
+$ kubectl config set-credentials system:kube-scheduler --client-certificate=/etc/kubernetes/pki/kube-scheduler.pem --client-key=/etc/kubernetes/pki/kube-scheduler-key.pem --embed-certs=true --kubeconfig=kube-scheduler.kubeconfig
+$ kubectl config set-context default --cluster=openeuler-k8s --user=system:kube-scheduler --kubeconfig=kube-scheduler.kubeconfig
+$ kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig
+```
+
+### admin
+
+```bash
+$ kubectl config set-cluster openeuler-k8s --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:6443 --kubeconfig=admin.kubeconfig
+$ kubectl config set-credentials admin --client-certificate=/etc/kubernetes/pki/admin.pem --client-key=/etc/kubernetes/pki/admin-key.pem --embed-certs=true --kubeconfig=admin.kubeconfig
+$ kubectl config set-context default --cluster=openeuler-k8s --user=admin --kubeconfig=admin.kubeconfig
+$ kubectl config use-context default --kubeconfig=admin.kubeconfig
+```
+
+### 获得相关 kubeconfig 配置文件
+
+```bash
+admin.kubeconfig kube-proxy.kubeconfig kube-controller-manager.kubeconfig kube-scheduler.kubeconfig
+```
+
+## 生成密钥提供者的配置
+
+api-server 启动时需要提供一个密钥对`--encryption-provider-config=/etc/kubernetes/pki/encryption-config.yaml`,本文通过 urandom 生成一个:
+
+```bash
+$ cat generate.bash
+#!/bin/bash
+
+ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
+
+cat > encryption-config.yaml < **说明**
+>
+> - 删除集群会删除整个集群的数据,且无法恢复,请谨慎操作。
+> - 当前,拆除集群不会清理容器和容器镜像,但若部署 Kubernetes 集群时,配置了需要安装容器引擎,则会清除容器引擎,这可能导致容器运行异常。
+> - 拆除集群过程中可能会打印一些错误信息,一般是由于清理过程中操作集群时反馈了错误的结果导致,集群仍然能够正常拆除
+>
+
+可以使用命令行方式删除整个集群。例如,删除 k8s-cluster 集群的参考命令如下:
+
+```shell
+$ eggo -d cleanup --id k8s-cluster
+```
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/eggo-tool-introduction.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/eggo-tool-introduction.md
new file mode 100644
index 0000000000000000000000000000000000000000..0f73d2921d9c69282856fe84e96e4b2636b69208
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/eggo-tool-introduction.md
@@ -0,0 +1,431 @@
+# 工具介绍
+
+本章介绍自动化部署工具的相关内容,建议用户在部署前阅读。
+
+## 部署方式
+
+openEuler 提供的 Kubernetes 集群自动化部署工具使用命令行方式进行集群的一键部署。它提供了如下几种部署方式:
+
+- 离线部署:本地准备好所有需要用到的 RPM 软件包、二进制文件、插件、容器镜像,并将它们按照一定的格式打包成一个 tar.gz 文件,然后完成对应 YAML 配置文件的编写,即可执行命令实现一键部署。当虚拟机无法访问外部网络时,可以采用该部署方式。
+- 在线部署:只需要完成对应 YAML 配置文件的编写,所需的RPM 软件包、二进制文件、插件、容器镜像,都在安装部署阶段连接互联网自动下载。该方式需要虚拟机能够访问软件源、集群依赖的镜像仓库,例如 Docker Hub。
+
+## 配置介绍
+
+使用工具自动化部署 Kubernetes 集群时,使用 YAML 配置文件描述集群部署的信息,此处介绍各配置项含义以及配置示例。
+
+### 配置项介绍
+
+- cluster-id:集群名称,请遵循 DNS 域名的命名规范。例如 k8s-cluster
+
+- username:需要部署 k8s 集群的机器的 ssh 登录用户名,所有机器都需要使用同一个用户名。
+
+- private-key-path:ssh 免密登录的密钥存储文件的路径。private-key-path 和 password 只需要配置其中一项,如果两者都进行了配置,优先使用 private-key-path
+
+- masters:master 节点列表,建议每个 master 节点同时作为 worker 节点。每个 master 节点包含如下配置子项,多个 master 节点配置多组子项内容:
+ - name:master 节点名称,为 k8s 集群看到的该节点名称
+ - ip:master 节点的 IP 地址
+ - port:ssh 登录该节点的端口,默认为 22
+ - arch:master 节点的 CPU 架构,例如 x86_64 取值为 amd64
+
+- workers:worker 节点列表。每个 worker 节点包含如下配置子项,多个 worker 节点配置多个子项内容:
+ - name:worker 节点名称,为 k8s 集群看到的该节点名称
+ - ip:worker 节点的 IP 地址
+ - port:ssh 登录该节点的端口,默认为 22
+ - arch:worker 节点的 CPU 架构,例如 x86_64 取值为 amd64
+
+- etcds:etcd 节点的列表。如果该项为空,则会为每个 master 节点部署一个 etcd,否则只会部署配置的 etcd 节点。每个 etcd 节点包含如下配置子项,多个 etcd 节点配置多组子项内容:
+ - name:etcd 节点的名称,为 k8s 集群看到的该节点的名称
+ - ip:etcd 节点的 IP 地址
+ - port:ssh 登录的端口
+ - arch:etcd 节点的 CPU 架构,例如 x86_64 取值为 amd64
+
+- loadbalance:loadbalance 节点列表。每个 loadbalance 节点包含如下配置子项,多个 loadbalance 节点配置多组子项内容:
+ - name:loadbalance 节点的名称,为 k8s 集群看到的该节点的名称
+ - ip:loadbalance 节点的 IP 地址
+ - port:ssh 登录的端口
+ - arch:loadbalance 节点的 CPU 架构,例如 x86_64 取值为 amd64
+ - bind-port:负载均衡服务的侦听端口
+
+- external-ca:是否使用外部 CA 证书,使用则配置为 true,反之,配置为 false
+
+- external-ca-path:外部 CA 证书文件的路径 。仅 external-ca 为 true 时有效
+
+- service:k8s 创建的 service 信息。service 配置包含如下配置子项:
+ - cidr:k8s 创建的 service 的 IP 地址网段
+ - dnsaddr:k8s 创建的 service 的 DNS 地址
+ - gateway:k8s创建的 service 的网关地址
+ - dns:k8s 创建的 coredns 的配置。dns 配置包含如下配置子项:
+ - corednstype:k8s 创建的 coredns 的部署类型,支持 pod 和 binary
+ - imageversion:pod 部署类型的 coredns 镜像版本
+ - replicas:pod 部署类型的 coredns 副本数量
+
+- network:k8s 集群网络配置。network 配置包含如下配置子项:
+ - podcidr:k8s 集群网络的 IP 地址网段
+ - plugin:k8s 集群部署的网络插件
+ - plugin-args:k8s 集群网络的网络插件的配置文件路径。例如 : {"NetworkYamlPath": "/etc/kubernetes/addons/calico.yaml"}
+
+- apiserver-endpoint:进群外部可访问的 APISERVER 服务的地址或域名,如果配置了 loadbalances 则填loadbalance 地址,否则填写第 1 个 master 节点地址。
+
+- apiserver-cert-sans:apiserver 相关证书中需要额外配置的 IP 和域名。它包含如下子配置项
+ - dnsnames:apiserver 相关证书中需要额外配置的域名数组列表。
+ - ips:apiserver 相关证书中需要额外配置的 IP 地址数组列表。
+
+- apiserver-timeout:apiserver 响应超时时间
+
+- etcd-token:etcd 集群名称
+
+- dns-vip:dns 的虚拟 IP 地址
+
+- dns-domain:DNS 域名后缀
+
+- pause-image:pause 容器的完整镜像名称
+
+- network-plugin:网络插件类型。仅支持配置 cni ,配置为空时使用 k8s 默认网络。
+
+- cni-bin-dir:网络插件地址,多个地址使用 "," 分隔,例如:/usr/libexec/cni,/opt/cni/bin
+
+- runtime:指定容器运行时类型,目前支持 docker 和 iSulad
+
+- runtime-endpoint:容器运行时 endpoint,当 runtime 为 docker 时,可以不指定
+
+- registry-mirrors:下载容器镜像时,使用的镜像仓库的 mirror 站点地址
+
+- insecure-registries:下载容器镜像时,使用 http 协议下载镜像的镜像仓库地址
+
+- config-extra-args:各个组件(例如 kube-apiserver、etcd)服务启动配置的额外参数。它包含如下子配置项:
+ - name:组件名称,支持 etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、kubelet
+
+ - extra-args:组件的拓展参数,格式为 key: value 格式,注意 key 对应的组件参数前需要加上 "-" 或者 "--" 。
+
+ - open-ports:配置需要额外打开的端口,k8s 自身所需端口不需要进行配置,k8s 以外的插件端口需要进行额外配置。
+ - worker | master | etcd | loadbalance:指定打开端口的节点类型,每项配置包含一个多或者多个 port 和 protocol 子配置项。
+ - port:端口地址
+ - protocol:端口类型,可选值为 tcp 或者 udp
+
+ - install:配置各种类型节点上需要安装的安装包或者二进制文件的详细信息,注意将对应文件放到在 tar.gz 安装包中。以下为全量配置说明,具体配置请根据实际情况选择。
+ - package-source:配置安装包的详细信息
+ - type:安装包的压缩类型,目前只支持 tar.gz 类型的安装包
+ - dstpath:安装包在对端机器上的路径,必须是可用的绝对路径
+ - srcpath:不同架构安装包的存放路径,架构必须与机器架构相对应,必须是可用的绝对路径
+ - arm64:arm64 架构安装包的路径,配置的机器中存在 arm64 机器场景下需要配置
+ - amd64:amd64 类型安装包的路径,配置的机器中存在 x86_64 机器场景下需要配置
+
+ > **说明**:
+ >
+ > install 配置中 etcd、kubernetes-master、kubernetes-worker、network、loadbalance、container、image、dns 中的子配置项相同,都是 name、type、dst,schedule、TimeOut 。其中 dst,schedule、TimeOut 为可选项,用户根据安装的文件决定是否配置。下述仅以 etcd 和 kubernetes-master 节点的配置为例说明。
+
+ - etcd:etcd 类型节点需要安装的包或二进制文件列表。
+ - name:需要安装的软件包或二进制文件的名称,如果是安装包则只写名称,不填写具体的版本号,安装时会使用 `$name*` 识别,例如 etcd 。如果为多个软件包,各名称使用 ,分隔。
+ - type:配置项类型,可选值为 pkg、repo、bin、file、dir、image、yaml、shell 。如果配置为 repo ,请在对应节点上配置 repo 源。
+ - dst:目的文件夹路径,type 为 bin、file、dir 类型时需要配置。表示将文件/文件夹放到节点的哪个目录下,为了防止用户误配置路径,导致 cleanup 时删除重要文件,此配置必须配置为白名单中的路径。详见 “白名单说明” 。
+ - kubernetes-master:k8s master 类型节点需要安装的包或二进制文件列表
+ - kubernetes-worker:k8s worker 类型节点需要安装的包或二进制文件列表
+ - network:网络需要安装的包或二进制文件列表
+ - loadbalance:loadbalance 类型节点需要安装的包或二进制文件列表
+ - container:容器需要安装的包或二进制文件列表
+ - image:容器镜像 tar 包
+ - dns:k8s coredns 安装包。如果 corednstype 配置为 pod,此处无需配置
+ - addition:额外的安装包或二进制文件列表
+ - master:以下配置会安装在所有 master 节点
+ - name:需要安装的软件包或二进制文件的名称
+ - type:配置项类型,可选值为 pkg、repo、bin、file、dir、image、yaml、shell 。如果配置为 repo ,请在对应节点上配置 repo 源
+ - schedule:仅在 type 为 shell 时有效,代表用户想要执行脚本的时机,支持 prejoin(节点加入前)、postjoin(节点加入后)、precleanup(节点退出前)、postcleanup(节点退出后)。
+ - TimeOut:脚本执行超时时间,超时时该进程被强制终止运行。未配置默认为 30s
+ - worker:配置会安装在所有 worker 节点,具体配置格式和 addition 下的 master 相同
+
+### 白名单介绍
+
+install 配置中 dst 项的值必须符合白名单规则,配置为白名单对应路径及其子目录。当前白名单如下:
+
+- /usr/bin
+- /usr/local/bin
+- /opt/cni/bin
+- /usr/libexec/cni
+- /etc/kubernetes
+- /usr/lib/systemd/system
+- /etc/systemd/system
+- /tmp
+
+### 配置示例
+
+此处给出一个 YAML 文件配置示例。从示例可知,同一台机器,可以部署多个类型的节点,但是不同节点的配置必须一致,例如 test0 机器部署了 master 和 worker 类型。
+
+```yaml
+cluster-id: k8s-cluster
+username: root
+private-key-path: /root/.ssh/private.key
+masters:
+- name: test0
+ ip: 192.168.0.1
+ port: 22
+ arch: arm64
+workers:
+- name: test0
+ ip: 192.168.0.1
+ port: 22
+ arch: arm64
+- name: test1
+ ip: 192.168.0.3
+ port: 22
+ arch: arm64
+etcds:
+- name: etcd-0
+ ip: 192.168.0.4
+ port: 22
+ arch: amd64
+loadbalance:
+ name: k8s-loadbalance
+ ip: 192.168.0.5
+ port: 22
+ arch: amd64
+ bind-port: 8443
+external-ca: false
+external-ca-path: /opt/externalca
+service:
+ cidr: 10.32.0.0/16
+ dnsaddr: 10.32.0.10
+ gateway: 10.32.0.1
+ dns:
+ corednstype: pod
+ imageversion: 1.8.4
+ replicas: 2
+network:
+ podcidr: 10.244.0.0/16
+ plugin: calico
+ plugin-args: {"NetworkYamlPath": "/etc/kubernetes/addons/calico.yaml"}
+apiserver-endpoint: 192.168.122.222:6443
+apiserver-cert-sans:
+ dnsnames: []
+ ips: []
+apiserver-timeout: 120s
+etcd-external: false
+etcd-token: etcd-cluster
+dns-vip: 10.32.0.10
+dns-domain: cluster.local
+pause-image: k8s.gcr.io/pause:3.2
+network-plugin: cni
+cni-bin-dir: /usr/libexec/cni,/opt/cni/bin
+runtime: docker
+runtime-endpoint: unix:///var/run/docker.sock
+registry-mirrors: []
+insecure-registries: []
+config-extra-args:
+ - name: kubelet
+ extra-args:
+ "--cgroup-driver": systemd
+open-ports:
+ worker:
+ - port: 111
+ protocol: tcp
+ - port: 179
+ protocol: tcp
+install:
+ package-source:
+ type: tar.gz
+ dstpath: ""
+ srcpath:
+ arm64: /root/rpms/packages-arm64.tar.gz
+ amd64: /root/rpms/packages-x86.tar.gz
+ etcd:
+ - name: etcd
+ type: pkg
+ dst: ""
+ kubernetes-master:
+ - name: kubernetes-client,kubernetes-master
+ type: pkg
+ kubernetes-worker:
+ - name: docker-engine,kubernetes-client,kubernetes-node,kubernetes-kubelet
+ type: pkg
+ dst: ""
+ - name: conntrack-tools,socat
+ type: pkg
+ dst: ""
+ network:
+ - name: containernetworking-plugins
+ type: pkg
+ dst: ""
+ loadbalance:
+ - name: gd,gperftools-libs,libunwind,libwebp,libxslt
+ type: pkg
+ dst: ""
+ - name: nginx,nginx-all-modules,nginx-filesystem,nginx-mod-http-image-filter,nginx-mod-http-perl,nginx-mod-http-xslt-filter,nginx-mod-mail,nginx-mod-stream
+ type: pkg
+ dst: ""
+ container:
+ - name: emacs-filesystem,gflags,gpm-libs,re2,rsync,vim-filesystem,vim-common,vim-enhanced,zlib-devel
+ type: pkg
+ dst: ""
+ - name: libwebsockets,protobuf,protobuf-devel,grpc,libcgroup
+ type: pkg
+ dst: ""
+ - name: yajl,lxc,lxc-libs,lcr,clibcni,iSulad
+ type: pkg
+ dst: ""
+ image:
+ - name: pause.tar
+ type: image
+ dst: ""
+ dns:
+ - name: coredns
+ type: pkg
+ dst: ""
+ addition:
+ master:
+ - name: prejoin.sh
+ type: shell
+ schedule: "prejoin"
+ TimeOut: "30s"
+ - name: calico.yaml
+ type: yaml
+ dst: ""
+ worker:
+ - name: docker.service
+ type: file
+ dst: /usr/lib/systemd/system/
+ - name: postjoin.sh
+ type: shell
+ schedule: "postjoin"
+```
+
+### 安装包结构
+
+如果是离线部署,需要准备 Kubernetes 以及相关的离线安装包,并遵循特定目录结构存放离线安装包。需要遵循的目录结构如下:
+
+```shell
+package
+├── bin
+├── dir
+├── file
+├── image
+├── pkg
+└── packages_notes.md
+```
+
+上述各目录的含义如下:
+
+- 离线部署包的目录结构与集群配置 config 中的 package 的类型对应,package 类型有 pkg、repo、bin、file、dir、image、yaml、shell 八种。
+
+- bin 目录存放二进制文件,对应 package 类型 bin 。
+
+- dir 目录存放需要拷贝到目标机器的目录,需要配置 dst 目的地路径,对应 package 类型 dir 。
+
+- file 目录存放 file、yaml、shell 三种类型的文件。其中 file 类型代表需要拷贝到目标机器的文件,同时需要配置 dst 目的地路径;yaml 类型代表用户自定义的 YAML 文件,会在集群部署完成后 apply 该 YAML 文件;shell 类型代表用户想要执行的脚本,同时需要配置 schedule 执行时机,执行时机包括 prejoin(节点加入前)、postjoin(节点加入后)、precleanup(节点退出前)、postcleanup(节点退出后)四个阶段。
+
+- image 目录存放需要导入的容器镜像。这些容器镜像必须兼容 docker 的 tar 包格式(例如由 docker 或 isula-build 导出镜像)。
+
+- pkg 目录下存放需要安装的 rpm/deb 包,对应 package 类型 pkg 。建议使用二进制文件,便于跨发行版本的部署。
+
+### 命令参考
+
+openEuler 提供的集群部署工具,使用命令行 eggo 进行集群部署。
+
+#### 部署 k8s 集群
+
+通过指定的 YAML 配置部署 k8s 集群:
+
+**eggo deploy** [ **-d** ] **-f** *deploy.yaml*
+
+| 参数 | 是否必选 | 参数含义 |
+| ------------- | -------- | --------------------------------- |
+| --debug \| -d | 否 | 打印调试信息 |
+| --file \| -f | 是 | 指定部署 k8s 集群的 YAML 文件路径 |
+
+#### 加入单节点
+
+将指定的单节点加入到 k8s 集群中:
+
+**eggo** **join** [ **-d** ] **--id** *k8s-cluster* [ **--type** *master,worker* ] **--arch** *arm64* **--port** *22* [ **--name** *master1*] *IP*
+
+| 参数 | 是否必选 | 参数含义 |
+| ------------- | -------- | ------------------------------------------------------------ |
+| --debug \| -d | 否 | 打印调试信息 |
+| --id | 是 | 指定将要加入 k8s 集群名称 |
+| --type \| -t | 否 | 指定加入节点的类型,支持 master、worker 。多个类型使用 “,” 隔开,默认值为 worker 。 |
+| --arch \| -a | 是 | 指定加入节点的 CPU 架构 |
+| --port \| -p | 是 | 指定 ssh 登录所加入节点的端口号 |
+| --name \| -n | 否 | 指定加入节点的名称 |
+| *IP* | 是 | 加入节点的实际 IP 地址 |
+
+#### 加入多节点
+
+将指定的多个节点加入到 k8s 集群:
+
+**eggo** **join** [ **-d** ] **--id** *k8s-cluster* **-f** *nodes.yaml*
+
+| 参数 | 是否必选 | 参数含义 |
+| ------------- | -------- | -------------------------------- |
+| --debug \| -d | 否 | 打印调试信息 |
+| --id | 是 | 指定将要加入 k8s 集群名称 |
+| --file \| -f | 是 | 指定加入节点的 YAML 配置文件路径 |
+
+#### 删除节点
+
+删除 k8s 集群中的一个或者多个节点:
+
+**eggo delete** [ **-d** ] **--id** *k8s-cluster* *node* [*node...*]
+
+| 参数 | 是否必选 | 参数含义 |
+| ------------- | -------- | -------------------------------------------- |
+| --debug \| -d | 否 | 打印调试信息 |
+| --id | 是 | 指定将要删除的节点所在的集群名称 |
+| *node* | 是 | 要删除的单个或多个节点的 IP 地址或者节点名称 |
+
+#### 删除集群
+
+删除整个 k8s 集群:
+
+**eggo cleanup** [ **-d** ] **--id** *k8s-cluster* [ **-f** *deploy.yaml* ]
+
+| 参数 | 是否必选 | 参数含义 |
+| ------------- | -------- | ------------------------------------------------------------ |
+| --debug \| -d | 否 | 打印调试信息 |
+| --id | 是 | 指定将要清除的 k8s 集群名称 |
+| --file \| -f | 否 | 指定清除 k8s 集群的 YAML 文件路径。不指定时,默认使用部署集群时缓存的集群配置。正常情况下,建议不配置该选项,仅异常情况下配置。 |
+
+> **说明**
+>
+> - 建议使用部署集群时缓存的集群配置删除集群,即正常情况下,不建议配置 --file | -f 参数。当异常导致缓存配置破坏或者丢失时,才配置该参数。
+
+#### 查询集群
+
+查询当前所有通过 eggo 部署的 k8s 集群:
+
+**eggo list** [ **-d** ]
+
+| 参数 | 是否必选 | 参数含义 |
+| ------------- | -------- | ------------ |
+| --debug \| -d | 否 | 打印调试信息 |
+
+#### 生成集群配置文件
+
+快速生成部署 k8s 集群所需的 YAML 配置文件:
+
+**eggo template** **-d** **-f** *template.yaml* **-n** *k8s-cluster* **-u** *username* **-p** *password* **--etcd** [*192.168.0.1,192.168.0.2*] **--masters** [*192.168.0.1,192.168.0.2*] **--workers** *192.168.0.3* **--loadbalance** *192.168.0.4*
+
+| 参数 | 是否必选 | 参数含义 |
+| ------------------- | -------- | ------------------------------- |
+| --debug \| -d | 否 | 打印调试信息 |
+| --file \| -f | 否 | 指定生成的 YAML 文件的路径 |
+| --name \| -n | 否 | 指定 k8s 集群的名称 |
+| --username \| -u | 否 | 指定 ssh 登录所配置节点的用户名 |
+| --password \| -p | 否 | 指定 ssh 登录所配置节点的密码 |
+| --etcd | 否 | 指定 etcd 节点的 IP 列表 |
+| --masters | 否 | 指定 master 节点的 IP 列表 |
+| --workers | 否 | 指定 worker 节点的 IP 列表 |
+| --loadbalance \| -l | 否 | 指定 loadbalance 节点的 IP |
+
+#### 查询帮助信息
+
+查询 eggo 命令的帮助信息:
+
+ **eggo help**
+
+#### 查询子命令帮助信息
+
+查询 eggo 子命令的帮助信息:
+
+**eggo deploy | join | delete | cleanup | list | template -h**
+
+| 参数 | 是否必选 | 参数含义 |
+| ----------- | -------- | ------------ |
+| --help\| -h | 是 | 打印帮助信息 |
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/advertiseAddress.png b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/advertiseAddress.png
new file mode 100644
index 0000000000000000000000000000000000000000..b36e5c4664f2d2e5faaa23128fd4711c11e30179
Binary files /dev/null and b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/advertiseAddress.png differ
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/arch.png b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..93c5b4cb56b6d165dc5a5cf7aa76a007c362ef55
Binary files /dev/null and b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/arch.png differ
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/flannelConfig.png b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/flannelConfig.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc9e7c665edd02fad16d3e6f4970e3125efcbef8
Binary files /dev/null and b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/flannelConfig.png differ
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/name.png b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/name.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd6ddfdc3476780e8c896bfd5095025507f62fa8
Binary files /dev/null and b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/name.png differ
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/podSubnet.png b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/podSubnet.png
new file mode 100644
index 0000000000000000000000000000000000000000..b368f77dd7dfd7722dcf7751b3e37ec28755e42d
Binary files /dev/null and b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/figures/podSubnet.png differ
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/installing-etcd.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/installing-etcd.md
new file mode 100644
index 0000000000000000000000000000000000000000..375f9b87072bf03a867d006658ecd4be6e84ceca
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/installing-etcd.md
@@ -0,0 +1,88 @@
+# 安装 etcd
+
+## 准备环境
+
+使能 etcd 使用的端口:
+
+```bash
+firewall-cmd --zone=public --add-port=2379/tcp
+firewall-cmd --zone=public --add-port=2380/tcp
+```
+
+## 安装 etcd 二进制
+
+当前是通过 rpm 包安装
+
+```bash
+rpm -ivh etcd*.rpm
+```
+
+准备目录
+
+```bash
+mkdir -p /etc/etcd /var/lib/etcd
+cp ca.pem /etc/etcd/
+cp kubernetes-key.pem /etc/etcd/
+cp kubernetes.pem /etc/etcd/
+# 关闭selinux
+setenforce 0
+# 禁用/etc/etcd/etcd.conf文件的默认配置
+# 注释掉即可,例如:ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
+```
+
+## 编写 etcd.service 文件
+
+以 `k8smaster0`机器为例:
+
+```bash
+$ cat /usr/lib/systemd/system/etcd.service
+[Unit]
+Description=Etcd Server
+After=network.target
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=notify
+WorkingDirectory=/var/lib/etcd/
+EnvironmentFile=-/etc/etcd/etcd.conf
+# set GOMAXPROCS to number of processors
+ExecStart=/bin/bash -c "ETCD_UNSUPPORTED_ARCH=arm64 /usr/bin/etcd --name=k8smaster0 --cert-file=/etc/etcd/kubernetes.pem --key-file=/etc/etcd/kubernetes-key.pem --peer-cert-file=/etc/etcd/kubernetes.pem --peer-key-file=/etc/etcd/kubernetes-key.pem --trusted-ca-file=/etc/etcd/ca.pem --peer-trusted-ca-file=/etc/etcd/ca.pem --peer-client-cert-auth --client-cert-auth --initial-advertise-peer-urls https://192.168.122.154:2380 --listen-peer-urls https://192.168.122.154:2380 --listen-client-urls https://192.168.122.154:2379,https://127.0.0.1:2379 --advertise-client-urls https://192.168.122.154:2379 --initial-cluster-token etcd-cluster-0 --initial-cluster k8smaster0=https://192.168.122.154:2380,k8smaster1=https://192.168.122.155:2380,k8smaster2=https://192.168.122.156:2380 --initial-cluster-state new --data-dir /var/lib/etcd"
+
+Restart=always
+RestartSec=10s
+LimitNOFILE=65536
+
+[Install]
+WantedBy=multi-user.target
+```
+
+**注意:**
+
+- arm64上面需要增加启动设置`ETCD_UNSUPPORTED_ARCH=arm64`;
+- 由于本文把etcd和k8s control部署在相同机器,所以使用了`kubernetes.pem`和`kubernetes-key.pem`证书来启动;
+- ca证书,在整个部署流程里面使用了一个,etcd可以生成自己的ca,然后用自己的ca签名其他证书,但是需要在apiserver访问etcd的client用该ca签名的证书;
+- `initial-cluster`需要把所有部署etcd的配置加上;
+- 为了提高etcd的存储效率,可以使用ssd硬盘的目录,作为`data-dir`;
+
+启动服务
+
+```bash
+$ systemctl enable etcd
+$ systemctl start etcd
+```
+
+然后,依次部署其他机器即可。
+
+## 验证基本功能
+
+```bash
+$ ETCDCTL_API=3 etcdctl -w table endpoint status --endpoints=https://192.168.122.155:2379,https://192.168.122.156:2379,https://192.168.122.154:2379 --cacert=/etc/etcd/ca.pem --cert=/etc/etcd/kubernetes.pem --key=/etc/etcd/kubernetes-key.pem
++------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
+| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFTAPPLIED INDEX | ERRORS |
++------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
+| https://192.168.122.155:2379 | b50ec873e253ebaa | 3.4.14 | 262 kB | false | false | 819 | 21 | 21 | |
+| https://192.168.122.156:2379 | e2b0d126774c6d02 | 3.4.14 | 262 kB | true | false | 819 | 21 | 21 | |
+| https://192.168.122.154:2379 | f93b3808e944c379 | 3.4.14 | 328 kB | false | false | 819 | 21 | 21 | |
++------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
+```
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/installing-the-Kubernetes-software-package.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/installing-the-Kubernetes-software-package.md
new file mode 100644
index 0000000000000000000000000000000000000000..924795f889b5bf8747baed8d21904f1dda27aba9
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/installing-the-Kubernetes-software-package.md
@@ -0,0 +1,11 @@
+# 安装 Kubernetes 软件包
+
+```bash
+dnf install -y docker conntrack-tools socat
+```
+
+配置EPOL源之后,可以直接通过 dnf 安装 K8S
+
+```bash
+dnf install kubernetes
+```
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/kubernetes-containerd.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/kubernetes-containerd.md
new file mode 100644
index 0000000000000000000000000000000000000000..ac603e15c59002ed7aa301f65fc7bd8f0c004735
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/kubernetes-containerd.md
@@ -0,0 +1,306 @@
+# Kubernetes集群部署指南 - containerd
+
+Kubernetes自1.21版本开始不再支持Kubernetes+docker部署Kubernetes集群,本文介绍以containerd作为容器运行时快速搭建Kubernetes集群。若需要对集群进行个性化配置,请查阅[官方文档](https://kubernetes.io/zh-cn/docs/home/) 。
+
+## 软件包安装
+
+### 1. 安装必要软件包
+
+```bash
+$ yum install -y containerd
+$ yum install -y kubernetes*
+$ yum install -y cri-tools
+```
+
+> **说明**
+>
+> - 如果系统中已经安装了Docker,请确保在安装containerd之前卸载Docker,否则可能会引发冲突。
+
+要求使用1.6.22-15或更高版本的containerd,如果下载的版本过低请运行以下命令升级成1.6.22-15版本,或自行升级。
+
+```bash
+$ wget --no-check-certificate https://repo.openeuler.org/openEuler-24.03-LTS/update/x86_64/Packages/containerd-1.6.22-15.oe2403.x86_64.rpm
+$ rpm -Uvh containerd-1.6.22-15.oe2403.x86_64.rpm
+```
+
+本教程中通过yum下载的软件包版本如下所示:
+
+```bash
+1. containerd
+ -架构:x86_64
+ -版本:1.6.22-15
+2. kubernetes - client/help/kubeadm/kubelet/master/node
+ -架构:x86_64
+ -版本:1.29.1-4
+3. cri-tools
+ -架构:X86_64
+ -版本:1.29.0-3
+```
+
+### 2. 下载cni组件
+
+```bash
+$ mkdir -p /opt/cni/bin
+$ cd /opt/cni/bin
+$ wget --no-check-certificate https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz
+$ tar -xzvf ./cni-plugins-linux-amd64-v1.5.1.tgz -C .
+```
+
+> **说明**
+>
+> - 这里提供的是AMD64架构版本的下载链接,请根据系统架构选择合适的版本,其他版本可从[github仓库](https://github.com/containernetworking/plugins/releases/)获取。
+
+### 3. 下载CNI插件(Flannel)
+
+```bash
+$ wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml --no-check-certificate
+```
+
+## 环境配置
+
+本节对Kubernetes运行时所需的操作系统环境进行配置。
+
+### 1. 设置主机名
+
+```bash
+$ hostnamectl set-hostname nodeName
+```
+
+### 2. 配置防火墙
+
+**方法一:**
+
+配置防火墙规则以开放etcd和API Server的端口,确保控制平面和工作节点之间的正常通信。
+开放etcd的端口:
+
+```bash
+$ firewall-cmd --zone=public --add-port=2379/tcp --permanent
+$ firewall-cmd --zone=public --add-port=2380/tcp --permanent
+```
+
+开放API Server的端口:
+
+```bash
+$ firewall-cmd --zone=public --add-port=6443/tcp --permanent
+```
+
+使防火墙规则生效:
+
+```bash
+$ firewall-cmd --reload
+```
+
+> **说明**
+>
+> - 防火墙配置可能会导致某些容器镜像无法正常使用。为了确保其顺利运行,需要根据所使用的镜像开放相应的端口。
+
+**方法二:**
+
+使用以下命令禁用防火墙:
+
+```bash
+$ systemctl stop firewalld
+$ systemctl disable firewalld
+```
+
+### 3. 禁用SELinux
+
+SELinux的安全策略可能会阻止容器内的某些操作,比如写入特定目录、访问网络资源、或执行具有特权的操作。这会导致 CoreDNS 等关键服务无法正常运行,并表现为CrashLoopBackOff或 Error状态。可以使用以下命令来禁用SELinux:
+
+```bash
+$ setenforce 0
+$ sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
+```
+
+### 4. 禁用swap
+
+Kubernetes的资源调度器根据节点的可用内存和CPU资源来决定将哪些Pod分配到哪些节点上。如果节点上启用了swap,实际可用的物理内存和逻辑上可用的内存可能不一致,这会影响调度器的决策,导致某些节点出现过载,或者在某些情况下调度错误。因此需要禁用swap:
+
+```bash
+$ swapoff -a
+$ sed -ri 's/.*swap.*/#&/' /etc/fstab
+```
+
+### 5. 网络配置
+
+启用桥接网络上的IPv6和IPv4流量通过iptables进行过滤,并启动IP转发,运行内核转发IPv4包,确保跨界点的Pod间通信:
+
+```bash
+$ cat > /etc/sysctl.d/k8s.conf << EOF
+net.bridge.bridge-nf-call-ip6tables = 1
+net.bridge.bridge-nf-call-iptables = 1
+net.ipv4.ip_forward = 1
+vm.swappiness=0
+EOF
+$ modprobe br_netfilter
+$ sysctl -p /etc/sysctl.d/k8s.conf
+```
+
+## 配置containerd
+
+本节对containerd进行配置,包括设置pause_image、cgroup驱动、关闭"registry.k8s.io"镜像源证书验证、配置代理。
+
+首先,生成containerd的默认配置文件并将其输出到containerd_conf指定的文件:
+
+```bash
+$ containerd_conf="/etc/containerd/config.toml"
+$ mkdir -p /etc/containerd
+$ containerd config default > "${containerd_conf}"
+```
+
+配置pause_image:
+
+```bash
+$ pause_img=$(kubeadm config images list | grep pause | tail -1)
+$ sed -i "/sandbox_image/s#\".*\"#\"${pause_img}\"#" "${containerd_conf}"
+```
+
+将cgroup驱动指定为systemd:
+
+```bash
+$ sed -i "/SystemdCgroup/s/=.*/= true/" "${containerd_conf}"
+```
+
+关闭"registry.k8s.io"镜像源证书验证:
+
+```bash
+$ sed -i '/plugins."io.containerd.grpc.v1.cri".registry.configs/a\[plugins."io.containerd.grpc.v1.cri".registry.configs."registry.k8s.io".tls]\n insecure_skip_verify = true' /etc/containerd/config.toml
+```
+
+配置代理(将HTTP_PROXY、HTTPS_PROXY、NO_PROXY中的"***"替换为自己的代理信息):
+
+```bash
+$ server_path="/etc/systemd/system/containerd.service.d"
+$ mkdir -p "${server_path}"
+$ cat > "${server_path}"/http-proxy.conf << EOF
+[Service]
+Environment="HTTP_PROXY=***"
+Environment="HTTPS_PROXY=***"
+Environment="NO_PROXY=***"
+EOF
+```
+
+重启containerd,使得以上配置生效:
+
+```bash
+$ systemctl daemon-reload
+$ systemctl restart containerd
+```
+
+## 配置crictl使用containerd作为容器运行时
+
+```bash
+$ crictl config runtime-endpoint unix:///run/containerd/containerd.sock
+$ crictl config image-endpoint unix:///run/containerd/containerd.sock
+```
+
+## 配置kubelet使用systemd作为cgroup驱动
+
+```bash
+$ systemctl enable kubelet.service
+$ echo 'KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"' >> /etc/sysconfig/kubelet
+$ systemctl restart kubelet
+```
+
+## 使用Kubeadm创建集群(仅控制平面需要)
+
+### 1. 配置集群信息
+
+```bash
+$ kubeadm config print init-defaults --component-configs KubeletConfiguration >> kubeletConfig.yaml
+$ vim kubeletConfig.yaml
+```
+
+在kubeletConfig.yaml文件中,配置节点名称、广播地址(advertiseAddress)以及Pod网络的CIDR。
+
+**修改name为主机名,与环境配置[第一步](#1-设置主机名)一致:**
+
+
+
+**将advertiseAddress修改为控制平面的ip地址:**
+
+
+
+**在Networking中添加podSubnet指定CIDR范围:**
+
+
+
+### 2. 部署集群
+
+这里使用kubeadm部署集群,许多配置是默认生成的(如认证证书),如需修改请查阅[官方文档](https://kubernetes.io/zh-cn/docs/home/ )。
+
+**关闭代理(如有):**
+
+```bash
+$ unset http_proxy https_proxy
+```
+
+使用kubeadm init部署集群:
+
+```bash
+$ kubeadm init --config kubeletConfig.yaml
+```
+
+指定kubectl使用的配置文件:
+
+```bash
+$ mkdir -p "$HOME"/.kube
+$ cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
+$ chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
+$ export KUBECONFIG=/etc/kubernetes/admin.conf
+```
+
+### 3. 部署cni插件(flannel)
+
+本教程中使用flannel作为cni插件,以下介绍flannel下载和部署。
+以下使用的flannel从registry-1.docker.io镜像源下载,为避免证书验证失败的问题,请在containerd配置文件(/etc/containerd/config.toml)中配置该镜像源跳过证书验证。
+
+
+
+使用kubectl apply部署最开始在软件包安装中下载的kube-flannel.yml。
+
+```bash
+$ kubectl apply -f kube-flannel.yml
+```
+
+> **说明**
+>
+> 控制平面可能会有污点的问题,导致kubectl get nodes中节点状态无法变成ready,请查阅[官方文档](https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/taint-and-toleration/)去除污点。
+>
+## 加入集群(仅工作节点需要)
+
+**关闭代理(如有):**
+
+```bash
+$ unset http_proxy https_proxy
+```
+
+工作节点安装配置完环境后可以通过以下命令加入集群。
+
+```bash
+$ kubeadm join : --token --discovery-token-ca-cert-hash sha256:
+```
+
+这个命令会在控制平面库kubeadm init结束后生成,也可以在控制平面按照以下命令获取:
+
+```bash
+$ kubeadm token create #生成token
+$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
+ openssl dgst -sha256 -hex | sed 's/^.* //' #获取hash
+```
+
+加入后可以在控制平面通过以下命令查看工作节点的状态:
+
+```bash
+$ kubectl get nodes
+```
+
+如果节点状态显示为not ready,可能是因为Flannel插件未成功部署。在这种情况下,请运行本地生成的Flannel可执行文件来完成部署。
+
+**在工作节点运行kubectl命令(可选):**
+
+如果需要在工作节点上运行kubectl命令,需要将控制面板的配置文件/etc/kubernetes/admin.conf复制到同样的目录,然后运行以下命令进行配置:
+
+```bash
+$ export KUBECONFIG=/etc/kubernetes/admin.conf
+```
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/kubernetes-faqs.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/kubernetes-faqs.md
new file mode 100644
index 0000000000000000000000000000000000000000..29cff9ae8ac902643a86b2cf3e5437509af2c3e1
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/kubernetes-faqs.md
@@ -0,0 +1,13 @@
+# 常见问题与解决方法
+
+## **问题1:Kubernetes + docker为什么无法部署**
+
+原因:Kubernetes自1.21版本开始不再支持Kubernetes + docker部署Kubernetes集群。
+
+解决方法:改为使用cri-dockerd+docker部署集群,也可以使用containerd或者iSulad部署集群。
+
+## **问题2:openEuler无法通过yum直接安装Kubernetes相关的rpm包**
+
+原因:Kubernetes相关的rpm包需要配置yum的repo源有关EPOL的部分。
+
+解决方法:[参考链接](https://forum.openeuler.org/t/topic/768)中repo源,重新配置环境中的EPOL源。
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/overview.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..c0af759cb21ee5fdae603a3d1e014f82addb4f7b
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/overview.md
@@ -0,0 +1,12 @@
+# Kubernetes 集群部署指南
+
+本文档介绍在 openEuler 操作系统上,通过二进制部署 K8S 集群的一个参考方法。
+
+说明:本文所有操作均使用 `root`权限执行。
+
+## 集群状态
+
+本文所使用的集群状态如下:
+
+- 集群结构:6 个 `openEuler 21.09`系统的虚拟机,3 个 master 和 3 个 node 节点
+- 物理机:`openEuler 21.09`的 `x86/ARM`服务器
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/preparing-VMs.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/preparing-VMs.md
new file mode 100644
index 0000000000000000000000000000000000000000..534c7f6342b39dc512168affbd1746fcfb4ab48b
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/preparing-VMs.md
@@ -0,0 +1,150 @@
+# 准备虚拟机
+
+本章介绍使用 virt manager 安装虚拟机的方法,如果您已经准备好虚拟机,可以跳过本章节。
+
+## 安装依赖工具
+
+安装虚拟机,会依赖相关工具,安装依赖并使能 libvirtd 服务的参考命令如下(如果需要代理,请先配置代理):
+
+```bash
+$ dnf install virt-install virt-manager libvirt-daemon-qemu edk2-aarch64.noarch virt-viewer
+$ systemctl start libvirtd
+$ systemctl enable libvirtd
+```
+
+## 准备虚拟机磁盘文件
+
+```bash
+$ dnf install -y qemu-img
+$ virsh pool-define-as vmPool --type dir --target /mnt/vm/images/
+$ virsh pool-build vmPool
+$ virsh pool-start vmPool
+$ virsh pool-autostart vmPool
+$ virsh vol-create-as --pool vmPool --name master0.img --capacity 200G --allocation 1G --format qcow2
+$ virsh vol-create-as --pool vmPool --name master1.img --capacity 200G --allocation 1G --format qcow2
+$ virsh vol-create-as --pool vmPool --name master2.img --capacity 200G --allocation 1G --format qcow2
+$ virsh vol-create-as --pool vmPool --name node1.img --capacity 300G --allocation 1G --format qcow2
+$ virsh vol-create-as --pool vmPool --name node2.img --capacity 300G --allocation 1G --format qcow2
+$ virsh vol-create-as --pool vmPool --name node3.img --capacity 300G --allocation 1G --format qcow2
+```
+
+## 打开 VNC 防火墙端口
+
+**方法一**
+
+1. 查询端口
+
+ ```shell
+ $ netstat -lntup | grep qemu-kvm
+ ```
+
+2. 打开 VNC 的防火墙端口。假设端口从 5900 开始,参考命令如下:
+
+ ```shell
+ $ firewall-cmd --zone=public --add-port=5900/tcp
+ $ firewall-cmd --zone=public --add-port=5901/tcp
+ $ firewall-cmd --zone=public --add-port=5902/tcp
+ $ firewall-cmd --zone=public --add-port=5903/tcp
+ $ firewall-cmd --zone=public --add-port=5904/tcp
+ $ firewall-cmd --zone=public --add-port=5905/tcp
+ ```
+
+**方法二**
+
+直接关闭防火墙
+
+```shell
+$ systemctl stop firewalld
+```
+
+## 准备虚拟机配置文件
+
+创建虚拟机需要虚拟机配置文件。假设配置文件为 master.xml ,以虚拟机 hostname 为 k8smaster0 的节点为例,参考配置如下:
+
+```bash
+ cat master.xml
+
+
+ k8smaster0
+ 8
+ 8
+
+ hvm
+ /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw
+ /var/lib/libvirt/qemu/nvram/k8smaster0.fd
+
+
+
+
+
+
+
+
+ 1
+
+ destroy
+ restart
+ restart
+
+ /usr/libexec/qemu-kvm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+由于虚拟机相关配置必须唯一,新增虚拟机需要适配修改如下内容,保证虚拟机的唯一性:
+
+- name:虚拟机 hostname,建议尽量小写。例中为 `k8smaster0`
+- nvram:nvram的句柄文件路径,需要全局唯一。例中为 `/var/lib/libvirt/qemu/nvram/k8smaster0.fd`
+- disk 的 source file:虚拟机磁盘文件路径。例中为 `/mnt/vm/images/master0.img`
+- interface 的 mac address:interface 的 mac 地址。例中为 `52:54:00:00:00:80`
+
+## 安装虚拟机
+
+1. 创建并启动虚拟机
+
+ ```shell
+ $ virsh define master.xml
+ $ virsh start k8smaster0
+ ```
+
+2. 获取虚拟机的 VNC 端口号
+
+ ```shell
+ $ virsh vncdisplay k8smaster0
+ ```
+
+3. 使用虚拟机连接工具,例如 VNC Viewer 远程连接虚拟机,并根据提示依次选择配置,完成系统安装
+
+4. 设置虚拟机 hostname,例如设置为 k8smaster0
+
+ ```shell
+ $ hostnamectl set-hostname k8smaster0
+ ```
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/preparing-certificates.md b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/preparing-certificates.md
new file mode 100644
index 0000000000000000000000000000000000000000..0ae3428c21353ba3326b44b41d18b3706d4b73a8
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/Kubernetes/preparing-certificates.md
@@ -0,0 +1,438 @@
+# 准备证书
+
+**声明:本文使用的证书为自签名,不能用于商用环境**
+
+部署集群前,需要生成集群各组件之间通信所需的证书。本文使用开源 CFSSL 作为验证部署工具,以便用户了解证书的配置和集群组件之间证书的关联关系。用户可以根据实际情况选择合适的工具,例如 OpenSSL 。
+
+## 配置go环境
+
+1. 下载go
+
+ ```bash
+ wget https://go.dev/dl/go1.22.3.linux-amd64.tar.gz
+ ```
+
+2. 移除旧版本并安装
+
+ ```bash
+ $ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz
+ ```
+
+3. 添加环境变量
+
+ ```bash
+ export PATH=$PATH:/usr/local/go/bin
+ ```
+
+4. 检查是否安装成功
+
+ ```bash
+ go version
+ ```
+
+## 编译安装 CFSSL
+
+编译安装 CFSSL 的参考命令如下(需要互联网下载权限,需要配置代理的请先完成配置,需要配置 go语言环境):
+
+```bash
+$ wget --no-check-certificate https://github.com/cloudflare/cfssl/archive/v1.5.0.tar.gz
+$ tar -zxf v1.5.0.tar.gz
+$ cd cfssl-1.5.0/
+$ make -j6
+# cp bin/* /usr/local/bin/
+```
+
+## 生成根证书
+
+编写 CA 配置文件,例如 ca-config.json:
+
+```bash
+$ cat ca-config.json | jq
+{
+ "signing": {
+ "default": {
+ "expiry": "8760h"
+ },
+ "profiles": {
+ "kubernetes": {
+ "usages": [
+ "signing",
+ "key encipherment",
+ "server auth",
+ "client auth"
+ ],
+ "expiry": "8760h"
+ }
+ }
+ }
+}
+```
+
+编写 CA CSR 文件,例如 ca-csr.json:
+
+```bash
+$ cat ca-csr.json | jq
+{
+ "CN": "Kubernetes",
+ "key": {
+ "algo": "rsa",
+ "size": 2048
+ },
+ "names": [
+ {
+ "C": "CN",
+ "L": "HangZhou",
+ "O": "openEuler",
+ "OU": "WWW",
+ "ST": "BinJiang"
+ }
+ ]
+}
+```
+
+生成 CA 证书和密钥:
+
+```bash
+$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
+```
+
+得到如下证书:
+
+```bash
+ca.csr ca-key.pem ca.pem
+```
+
+## 生成 admin 帐户证书
+
+admin 是 K8S 用于系统管理的一个帐户,编写 admin 帐户的 CSR 配置,例如 admin-csr.json:
+
+```bash
+cat admin-csr.json | jq
+{
+ "CN": "admin",
+ "key": {
+ "algo": "rsa",
+ "size": 2048
+ },
+ "names": [
+ {
+ "C": "CN",
+ "L": "HangZhou",
+ "O": "system:masters",
+ "OU": "Containerum",
+ "ST": "BinJiang"
+ }
+ ]
+}
+```
+
+生成证书:
+
+```bash
+$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
+```
+
+结果如下:
+
+```bash
+admin.csr admin-key.pem admin.pem
+```
+
+## 生成 service-account 帐户证书
+
+编写 service-account 帐户的 CSR 配置文件,例如 service-account-csr.json:
+
+```bash
+cat service-account-csr.json | jq
+{
+ "CN": "service-accounts",
+ "key": {
+ "algo": "rsa",
+ "size": 2048
+ },
+ "names": [
+ {
+ "C": "CN",
+ "L": "HangZhou",
+ "O": "Kubernetes",
+ "OU": "openEuler k8s install",
+ "ST": "BinJiang"
+ }
+ ]
+}
+```
+
+生成证书:
+
+```bash
+$ cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes service-account-csr.json | cfssljson -bare service-account
+```
+
+结果如下:
+
+```bash
+service-account.csr service-account-key.pem service-account.pem
+```
+
+## 生成 kube-controller-manager 组件证书
+
+编写 kube-controller-manager 的 CSR 配置:
+
+```bash
+{
+ "CN": "system:kube-controller-manager",
+ "key": {
+ "algo": "rsa",
+ "size": 2048
+ },
+ "names": [
+ {
+ "C": "CN",
+ "L": "HangZhou",
+ "O": "system:kube-controller-manager",
+ "OU": "openEuler k8s kcm",
+ "ST": "BinJiang"
+ }
+ ]
+}
+```
+
+生成证书:
+
+```bash
+$ cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
+```
+
+结果如下:
+
+```bash
+kube-controller-manager.csr kube-controller-manager-key.pem kube-controller-manager.pem
+```
+
+## 生成 kube-proxy 证书
+
+编写 kube-proxy 的 CSR 配置:
+
+```bash
+{
+ "CN": "system:kube-proxy",
+ "key": {
+ "algo": "rsa",
+ "size": 2048
+ },
+ "names": [
+ {
+ "C": "CN",
+ "L": "HangZhou",
+ "O": "system:node-proxier",
+ "OU": "openEuler k8s kube proxy",
+ "ST": "BinJiang"
+ }
+ ]
+}
+```
+
+生成证书:
+
+```bash
+$ cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
+```
+
+结果如下:
+
+```bash
+kube-proxy.csr kube-proxy-key.pem kube-proxy.pem
+```
+
+## 生成 kube-scheduler 证书
+
+编写 kube-scheduler 的 CSR 配置:
+
+```bash
+{
+ "CN": "system:kube-scheduler",
+ "key": {
+ "algo": "rsa",
+ "size": 2048
+ },
+ "names": [
+ {
+ "C": "CN",
+ "L": "HangZhou",
+ "O": "system:kube-scheduler",
+ "OU": "openEuler k8s kube scheduler",
+ "ST": "BinJiang"
+ }
+ ]
+}
+```
+
+生成证书:
+
+```bash
+$ cfssl gencert -ca=../ca/ca.pem -ca-key=../ca/ca-key.pem -config=../ca/ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
+```
+
+结果如下:
+
+```bash
+kube-scheduler.csr kube-scheduler-key.pem kube-scheduler.pem
+```
+
+## 生成 kubelet 证书
+
+由于证书涉及到 kubelet 所在机器的 hostname 和 IP 地址信息,因此每个 node 节点配置不尽相同,所以编写脚本完成,生成脚本如下:
+
+```bash
+$ cat node_csr_gen.bash
+
+#!/bin/bash
+
+nodes=(k8snode1 k8snode2 k8snode3)
+IPs=("192.168.122.157" "192.168.122.158" "192.168.122.159")
+
+for i in "${!nodes[@]}"; do
+
+cat > "${nodes[$i]}-csr.json" <  **说明:**
+> gitlab相关的yaml文件可从官网获得。
+
+以下为yaml文件的示例参考,请根据实际情况进行修改。
+
+gitlab-redis.yaml:
+
+```bash
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: redis
+ namespace: default
+ labels:
+ name: redis
+spec:
+ selector:
+ matchLabels:
+ name: redis
+ template:
+ metadata:
+ name: redis
+ labels:
+ name: redis
+ spec:
+ containers:
+ - name: redis
+ image: 10.35.111.11:5000/redis:latest
+ imagePullPolicy: IfNotPresent
+ ports:
+ - name: redis
+ containerPort: 6379
+ volumeMounts:
+ - mountPath: /var/lib/redis
+ name: data
+ livenessProbe:
+ exec:
+ command:
+ - redis-cli
+ - ping
+ initialDelaySeconds: 30
+ timeoutSeconds: 5
+ readinessProbe:
+ exec:
+ command:
+ - redis-cli
+ - ping
+ initialDelaySeconds: 5
+ timeoutSeconds: 1
+ volumes:
+ - name: data
+ emptyDir: {}
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: redis
+ namespace: default
+ labels:
+ name: redis
+spec:
+ ports:
+ - name: redis
+ port: 6379
+ targetPort: redis
+ selector:
+ name: redis
+
+```
+
+gitlab-postgresql.yaml:
+
+```bash
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgresql
+ namespace: default
+ labels:
+ name: postgresql
+spec:
+ selector:
+ matchLabels:
+ name: postgresql
+ template:
+ metadata:
+ name: postgresql
+ labels:
+ name: postgresql
+ spec:
+ containers:
+ - name: postgresql
+ image: 10.35.111.11:5000/postgres:13.6
+ imagePullPolicy: IfNotPresent
+ env:
+ - name: POSTGRES_HOST_AUTH_METHOD
+ value: trust
+ - name: DB_USER
+ value: gitlab
+ - name: DB_PASS
+ value: passw0rd
+ - name: DB_NAME
+ value: gitlab_production
+ - name: DB_EXTENSION
+ value: pg_trgm
+ ports:
+ - name: postgres
+ containerPort: 5432
+ volumeMounts:
+ - mountPath: /var/lib/postgresql
+ name: data
+ livenessProbe:
+ exec:
+ command:
+ - pg_isready
+ - -h
+ - localhost
+ - -U
+ - postgres
+ initialDelaySeconds: 30
+ timeoutSeconds: 5
+ readinessProbe:
+ exec:
+ command:
+ - pg_isready
+ - -h
+ - localhost
+ - -U
+ - postgres
+ initialDelaySeconds: 5
+ timeoutSeconds: 1
+ volumes:
+ - name: data
+ emptyDir: {}
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgresql
+ namespace: default
+ labels:
+ name: postgresql
+spec:
+ ports:
+ - name: postgres
+ port: 5432
+ targetPort: postgres
+ selector:
+ name: postgresql
+
+```
+
+gitlab.yaml:
+
+```bash
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: gitlab
+ namespace: default
+ labels:
+ name: gitlab
+spec:
+ selector:
+ matchLabels:
+ name: gitlab
+ template:
+ metadata:
+ name: gitlab
+ labels:
+ name: gitlab
+ spec:
+ containers:
+ - name: gitlab
+ image: 10.35.111.11:5000/yrzr/gitlab-ce-arm64v8:14.3.2-ce.0
+ imagePullPolicy: IfNotPresent
+ env:
+ - name: TZ
+ value: Asia/Shanghai
+ - name: GITLAB_TIMEZONE
+ value: Beijing
+ - name: GITLAB_SECRETS_DB_KEY_BASE
+ value: long-and-random-alpha-numeric-string
+ - name: GITLAB_SECRETS_SECRET_KEY_BASE
+ value: long-and-random-alpha-numeric-string
+ - name: GITLAB_SECRETS_OTP_KEY_BASE
+ value: long-and-random-alpha-numeric-string
+ - name: GITLAB_ROOT_PASSWORD
+ value: admin321
+ - name: GITLAB_ROOT_EMAIL
+ value: 517554016@qq.com
+ - name: GITLAB_HOST
+ value: git.qikqiak.com
+ - name: GITLAB_PORT
+ value: "80"
+ - name: GITLAB_SSH_PORT
+ value: "22"
+ - name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
+ value: "true"
+ - name: GITLAB_NOTIFY_PUSHER
+ value: "false"
+ - name: GITLAB_BACKUP_SCHEDULE
+ value: daily
+ - name: GITLAB_BACKUP_TIME
+ value: 01:00
+ - name: DB_TYPE
+ value: postgres
+ - name: DB_HOST
+ value: postgresql
+ - name: DB_PORT
+ value: "5432"
+ - name: DB_USER
+ value: gitlab
+ - name: DB_PASS
+ value: passw0rd
+ - name: DB_NAME
+ value: gitlab_production
+ - name: REDIS_HOST
+ value: redis
+ - name: REDIS_PORT
+ value: "6379"
+ ports:
+ - name: http
+ containerPort: 80
+ - name: ssh
+ containerPort: 22
+ volumeMounts:
+ - mountPath: /home/git/data
+ name: data
+ livenessProbe:
+ httpGet:
+ path: /
+ port: 80
+ initialDelaySeconds: 180
+ timeoutSeconds: 5
+ readinessProbe:
+ httpGet:
+ path: /
+ port: 80
+ initialDelaySeconds: 5
+ timeoutSeconds: 1
+ volumes:
+ - name: data
+ emptyDir: {}
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: gitlab
+ namespace: default
+ labels:
+ name: gitlab
+spec:
+ ports:
+ - name: http
+ port: 80
+ targetPort: http
+ nodePort: 30852
+ - name: ssh
+ port: 22
+ nodePort: 32353
+ targetPort: ssh
+ selector:
+ name: gitlab
+ type: NodePort
+```
+
+启动相应的容器:
+
+```bash
+# kubectl apply -f gitlab-redis.yaml
+# kubectl apply -f gitlab-postgresql.yaml
+# kubectl apply -f gitlab.yaml
+```
+
+可通过命令查看gitlab pod是否搭建完成:
+
+```bash
+# kubectl get pod -A -owide
+```
+
+## 登录gitlab
+
+查看是否可以登录gitlab网页,网址为ip地址加设定的端口。
+
+
+用户名为root,默认密码需进入容器后查看密码文件。
+
+```bash
+# kubectl exec -it gitlab-lab -n default /bin/sh
+# cat /etc/gitlab/initial_root_password
+```
+
+
+
+- 登录后界面如图:
+
+
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/gitlab-runner-deploy.md b/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/gitlab-runner-deploy.md
new file mode 100644
index 0000000000000000000000000000000000000000..3e8e0a09fe495b21d89ca3e734bf1d34d71a4c0f
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/gitlab-runner-deploy.md
@@ -0,0 +1,195 @@
+# gitlab runner部署及测试
+
+## 镜像/软件信息
+
+安装过程中需要用到的镜像名称如下表,版本号为示例安装时用到的版本,仅供参考。
+
+| 镜像 | 版本 |
+|------------------------------------|----------|
+| gitlab/gitlab-runner | alpine-v14.4.0 |
+| gitlab/gitlab-runner-helper | x86_64-54944146 |
+
+如果在无外网环境中搭建,可以从下方链接提前下载对应的镜像。镜像下载地址:dockerhub官网
+
+## 使用gitlab-runner.yaml启动runner容器
+
+配置gitlab-runner.yaml文件,修改文件中的镜像名,以下为yaml文件的示例参考,请根据实际搭建进行修改。
+
+```bash
+vim gitlab-runner.yaml
+```
+
+```conf
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: gitlab-runner
+ namespace: default
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ name: gitlab-runner
+ template:
+ metadata:
+ labels:
+ name: gitlab-runner
+ spec:
+ containers:
+ - args:
+ - run
+ image: gitlab/gitlab-runner:alpine-v14.4.0
+ imagePullPolicy: IfNotPresent
+ name: gitlab-runner
+ volumeMounts:
+ - mountPath: /etc/gitlab-runner
+ name: config
+ readOnly: false
+ - mountPath: /etc/ssl/certs
+ name: cacerts
+ readOnly: true
+ restartPolicy: Always
+ volumes:
+ - hostPath:
+ path: /etc/gitlab-runner
+ name: config
+ - hostPath:
+ path: /etc/ssl/key
+ name: cacerts
+
+```
+
+启动容器:
+
+```bash
+# kubectl apply -f gitlab-runner.yaml
+# kubectl get pod -A -o wide
+```
+
+
+
+## 登录gitlab容器网页-用户证书认证
+
+1. 新建项目。
+
+ 
+
+2. 创建空白项目。
+
+ 
+
+3. 自定义项目名称。
+
+ 
+
+4. 设置--CI/CD--Runner--展开。
+
+ 
+
+5. 记录注册Runner的地址和令牌。
+
+ 
+
+6. 导入证书文件。
+
+ 在master节点上查看并生成证书文件,共三个文件admin.crt、admin.key、ca.crt。
+
+ - 查看证书信息
+
+ ```bash
+ # cat /etc/kubernetes/admin.conf
+ ```
+
+ 
+
+ - 加密生成admin.crt
+
+ ```bash
+ # echo “${client-certificate-data}” | base64 -d > admin.crt
+ ```
+
+ - 加密生成admin.key
+
+ ```bash
+ # echo “${client-key-data}” | base64 -d > admin.key
+ ```
+
+ - 在manager节点上获取ca的证书
+
+ ```bash
+ # cp /etc/kubernetes/pki/ca.crt ./
+ ```
+
+7. 在runner运行的节点处将三个证书文件导入gitlab-runner容器。
+
+ >  **说明:**
+ >
+ > 导入容器需查看gitlab-runner运行在哪个节点上,将三个证书文件拷贝至该节点,然后使用isula cp命令导入。
+
+ ```bash
+ # isula cp admin.crt [容器id]:存放位置
+ # isula cp admin.key [容器id]:存放位置
+ # isula cp ca.crt [容器id]:存放位置
+ ```
+
+ 注:isula cp 命令只能一次拷贝一个文件
+
+ 
+
+## 注册gitlab-runner
+
+进入到runner的容器内进行注册;目前采用交互式注册,注册信息在gitlab上获得,当前配置的 runner服务于项目组,此信息的界面在gitlab-\>项目组(group)-\>设置-\>CI/CD-\>runner中查看。
+
+
+
+
+
+将准备好的gitlab-runner-helper镜像提前上传至私有镜像仓,进入gitlab-runner容器中,修改配置文件。
+
+```bash
+# cd /etc/gitlab-runner
+# mkdir kubessl
+# cp /home/admin.crt /etc/gitlab-runner/kubessl
+# cp /home/ca.crt /etc/gitlab-runner/kubessl
+# cp /home/admin.key /etc/gitlab-runner/kubessl
+# vim /etc/gitlab-runner/config.toml
+```
+
+
+
+## 在manager节点进行如下操作添加gitlab容器的dns记录
+
+1. 查看gitlab容器的ip地址。
+
+ ```bash
+ # kubectl get pods –Aowide
+ ```
+
+2. 添加gitlabip地址到k8s dns配置文件。
+
+ ```bash
+ # kubectl edit configmaps coredns -n kube-system
+ ```
+
+ 
+
+3. 重启coredns服务。
+
+ ```bash
+ # kubectl scale deployment coredns -n kube-system --replicas=0
+ # kubectl scale deployment coredns -n kube-system --replicas=2
+ ```
+
+## gitlab运行测试
+
+返回gitlab的web界面,选择CI/CD--编辑器--创建CI/CD流水线。
+
+
+
+- 编译yaml文件如下:
+
+
+
+- 流水线-查看状态。
+
+
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/iSulad+k8s-environment-deploy.md b/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/iSulad+k8s-environment-deploy.md
new file mode 100644
index 0000000000000000000000000000000000000000..2e6a63dc41cb14cb00260623bd7aea7ed6841fcc
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/iSulad+k8s-environment-deploy.md
@@ -0,0 +1,390 @@
+# iSulad+k8s环境部署
+
+## 准备集群服务器
+
+需准备至少3台openEuler机器,建议在openEuler-22.03及以上版本运行。下表为示例搭建机器信息,仅供参考。
+
+| 主机名 | IP | 系统版本 | 角色 | 组件 |
+|-------|-------------|------------------------|----------|-----------|
+| lab1 | 197.xxx.xxx.xxx | openEuler 22.03 LTS SP4 | 控制节点 | iSulad/k8s |
+| lab2 | 197.xxx.xxx.xxx | openEuler 22.03 LTS SP4 | 工作节点1 | iSulad/k8s |
+| lab3 | 197.xxx.xxx.xxx | openEuler 22.03 LTS SP4 | 工作节点2 | iSulad/k8s |
+
+## 镜像/软件信息
+
+安装过程中需要用到的软件及镜像名称如下表,版本号为示例安装时用到的版本,仅供参考。
+
+| 软件 | 版本 |
+|------------------------------------|----------|
+| iSulad | 2.0.17-2 |
+| kubernetes-client | 1.20.2-9 |
+| kubernetes-kubeadm | 1.20.2-9 |
+| kubernetes-kubelet | 1.20.2-9 |
+
+| 镜像 | 版本 |
+|------------------------------------|----------|
+| k8s.gcr.io/kube-proxy | v1.20.2 |
+| k8s.gcr.io/kube-apiserver | v1.20.2 |
+| k8s.gcr.io/kube-controller-manager | v1.20.2 |
+| k8s.gcr.io/kube-scheduler | v1.20.2 |
+| k8s.gcr.io/etcd | 3.4.13-0 |
+| k8s.gcr.io/coredns | 1.7.0 |
+| k8s.gcr.io/pause | 3.2 |
+| calico/node | v3.14.2 |
+| calico/pod2daemon-flexvol | v3.14.2 |
+| calico/cni | v3.14.2 |
+| calico/kube-controllers | v3.14.2 |
+
+如果在无外网环境中搭建,可以从以下链接提前下载对应的软件包、相关依赖软件包及镜像:
+
+1. 软件包下载地址:[https://repo.openeuler.org/openEuler-22.03-LTS-SP4/](https://repo.openeuler.org/openEuler-22.03-LTS-SP4/)
+2. 镜像下载地址:[https://developer.aliyun.com/mirror/](https://developer.aliyun.com/mirror/)
+
+## 修改host文件
+
+1. 修改主机名,以其中一台机器为例。
+
+ ```shell
+ # hostnamectl set-hostname lab1
+ # sudo -i
+ ```
+
+2. 配置主机名解析,编辑三台服务器的/etc/hosts文件。
+
+ ```shell
+ # vim /etc/hosts
+ ```
+
+3. 在hosts文件中添加以下内容(IP+主机名)。
+
+ ```text
+ 197.xxx.xxx.xxx lab1
+ 197.xxx.xxx.xxx lab2
+ 197.xxx.xxx.xxx lab3
+ ```
+
+## 环境准备
+
+1. 关闭防火墙。
+
+ ```shell
+ # systemctl stop firewalld
+ # systemctl disable firewalld
+ ```
+
+2. 禁用selinux。
+
+ ```shell
+ # setenforce 0
+ ```
+
+3. 关闭系统swap。
+
+ ```shell
+ # swapoff -a
+ # sed -ri 's/.*swap.*/#&/' /etc/fstab
+ ```
+
+4. 网络配置,开启相应的转发机制。
+
+ ```shell
+ # cat > /etc/sysctl.d/kubernetes.conf <  **说明:**
+ >
+ > 以下所下载的镜像版本均为示例,具体版本号以上条命令返回结果为准,下同。
+
+ ```shell
+ # isula pull k8smx/kube-apiserver:v1.20.15
+ # isula pull k8smx/kube-controller-manager:v1.20.15
+ # isula pull k8smx/kube-scheduler:v1.20.15
+ # isula pull k8smx/kube-proxy:v1.20.15
+ # isula pull k8smx/pause:3.2
+ # isula pull k8smx/coredns:1.7.0
+ # isula pull k8smx/etcd:3.4.13-0
+ ```
+
+3. 修改已下载的镜像标签。
+
+ ```shell
+ # isula tag k8smx/kube-apiserver:v1.20.15 k8s.gcr.io/kube-apiserver:v1.20.15
+ # isula tag k8smx/kube-controller-manager:v1.20.15 k8s.gcr.io/kube-controller-manager:v1.20.15
+ # isula tag k8smx/kube-scheduler:v1.20.15 k8s.gcr.io/kube-scheduler:v1.20.15
+ # isula tag k8smx/kube-proxy:v1.20.15 k8s.gcr.io/kube-proxy:v1.20.15
+ # isula tag k8smx/pause:3.2 k8s.gcr.io/pause:3.2
+ # isula tag k8smx/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0
+ # isula tag k8smx/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
+ ```
+
+4. 删除旧镜像。
+
+ ```shell
+ # isula rmi k8smx/kube-apiserver:v1.20.15
+ # isula rmi k8smx/kube-controller-manager:v1.20.15
+ # isula rmi k8smx/kube-scheduler:v1.20.15
+ # isula rmi k8smx/kube-proxy:v1.20.15
+ # isula rmi k8smx/pause:3.2
+ # isula rmi k8smx/coredns:1.7.0
+ # isula rmi k8smx/etcd:3.4.13-0
+ ```
+
+5. 查看已拉取的镜像。
+
+ ```shell
+ # isula images
+ ```
+
+## 安装crictl工具
+
+```shell
+# yum install -y cri-tools
+```
+
+## 初始化master节点
+
+执行如下命令初始化master节点:
+
+```shell
+# kubeadm init --kubernetes-version v1.20.2 --cri-socket=/var/run/isulad.sock --pod-network-cidr=[指定pod分配IP段]
+
+//以上参数的解释
+kubernetes-version 为当前安装的版本
+cri-socket 指定引擎为isulad
+pod-network-cidr 指定pod分配的ip段
+```
+
+根据系统提示输入如下命令:
+
+```shell
+# mkdir -p $HOME/.kube
+# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+# sudo chown $(id -u):$(id -g) $HOME/.kube/config
+```
+
+初始化成功后,复制最后两行内容,在node节点上执行刚刚复制的命令,将节点加入master集群,如未记录上述命令可通过如下命令生成:
+
+```shell
+# kubeadm token create --print-join-command
+```
+
+## node节点添加进集群
+
+粘贴master上初始化生成的kubeadm join ...命令,并在discovery前添加--cri-socket=/var/run/isulad.sock,执行如下命令:
+
+```shell
+# kubeadm join [IP地址] --token bgyis4.euwkjqb7jwuenwvs --cri-socket=/var/run/isulad.sock --discovery-token-ca-cert-hash sha256:3792f02e136042e2091b245ac71c1b9cdcb97990311f9300e91e1c339e1dfcf6
+```
+
+## 安装calico网络插件
+
+1. 拉取calico镜像。
+
+ 需要在master节点配置calico网络插件,同时需要在每个节点中提前拉取需要版本的镜像。
+
+ ```shell
+ isula pull calico/node:v3.14.2
+ isula pull calico/cni:v3.14.2
+ isula pull calico/kube-controllers:v3.14.2
+ isula pull calico/pod2daemon-flexvol:v3.14.2
+ ```
+
+2. 在master节点上获取配置文件。
+
+ ```shell
+ wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
+ ```
+
+3. 修改后创建pod。
+
+ ```shell
+ # kubectl apply -f calico.yaml
+ ```
+
+ - 如需删除使用如下命令:
+
+ ```shell
+ # kubectl delete -f calico.yaml
+ ```
+
+4. 查看pod信息。
+
+ ```shell
+ # kubectl get pod -A -o wide
+ ```
+
+## 查看master节点node信息
+
+使用如下命令可查看节点的详细信息:
+
+```shell
+# kubectl get nodes -o wide
+```
+
+若需要重置node节点,可使用如下命令:
+
+```shell
+# kubeadm reset
+```
diff --git a/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/overview.md b/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..cf530d4d57bffb09b457fe3ccfdacbee33b82347
--- /dev/null
+++ b/docs/en/25.03/Cloud/ClusterDeployment/iSulad+k8s/overview.md
@@ -0,0 +1,23 @@
+# iSulad+k8s集群部署指南
+
+本文档介绍在 openEuler 操作系统上,通过 kubeadm 部署 K8S 集群,搭建 K8S+iSulad 的环境,并在该环境上部署 gitlab-runner,指导部署欧拉原生开发环境集群。
+
+本文档主要包括以下两个场景内容:
+
+场景一: 基于 gitlab-ci 从 “0” 开始构建欧拉原生开发CICD部署指导。
+场景二: 欧拉原生开发执行机集群被 gitlab-ci 纳管指导。
+
+场景一中需要额外部署gitlab,步骤操作顺序为:
+
+1. K8s+iSulad 环境部署。
+2. gitlab 部署。
+3. gitlab runner 部署和测试。
+
+场景二中已有 gitlab-ci 平台,无需额外部署,步骤操作顺序为:
+
+1. K8s+iSulad 环境部署。
+2. gitlab runner 部署和测试。
+
+>  **说明:**
+>
+> 本文档所有操作均使用root权限执行。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/_menu.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..1e1c79b83d470f150486847e3c64de53fc34a721
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/_menu.md
@@ -0,0 +1,27 @@
+---
+label: 'Docker容器'
+ismanual: 'Y'
+description: 'Docker是一个开源的容器引擎项目,用以实现应用的快速打包、部署和交付'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '安装配置'
+ href: './installation-and-configuration-3.md'
+ - label: '容器管理'
+ href: './container-management-1.md'
+ - label: '镜像管理'
+ href: './image-management-1.md'
+ - label: '命令行参考'
+ href: './command-reference.md'
+ children:
+ - label: '容器引擎'
+ href: './container-engine.md'
+ - label: '容器管理'
+ href: './container-management-2.md'
+ - label: '镜像管理'
+ href: './image-management-2.md'
+ - label: '统计信息'
+ href: './statistics.md'
+ - label: 'Docker常见问题与解决方法'
+ href: './docker-faqs.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/command-reference.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/command-reference.md
new file mode 100644
index 0000000000000000000000000000000000000000..35483fad78e18adb17749e55558fa74c0759769c
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/command-reference.md
@@ -0,0 +1,3 @@
+# 命令行参考
+
+本章介绍 Docker 容器相关的命令行。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-engine.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-engine.md
new file mode 100644
index 0000000000000000000000000000000000000000..f8d6b20b702295dfdea39b1750c6fab5bb38a9f3
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-engine.md
@@ -0,0 +1,302 @@
+# 容器引擎
+
+Docker daemon是一个常驻后台的系统进程,docker 子命令执行前先要启动docker daemon。
+
+如果是通过rpm包或者系统包管理工具安装的,就可以使用systemctl start docker来启动docker daemon。
+
+docker命令支持多个参数选项,对于参数选项有以下约定:
+
+1. 单个字符的选项可以合并在一起,如:
+
+ ```bash
+ docker run -t -i busybox /bin/sh
+ ```
+
+ 可以写成
+
+ ```bash
+ docker run -ti busybox /bin/sh
+ ```
+
+2. 在命令帮助中看到的如\--icc=true之类的bool命令选项,如果没有使用这个选项,则这个标志位的值就是在命令帮助中看到的缺省值,如果使用了这个选项则这个标志位的值就是命令帮助中看的值的相反值,如果启动docker daemon没有加上使用\--icc选项,则默认设置了\--icc=true,如果使用了\--icc选项则表示是\--icc=false。
+3. 在命令帮助中看到的\--attach=\[\]之类的选项,表示这类的选项可以多次设置,如:
+
+ ```bash
+ docker run --attach=stdin --attach=stdout -i -t busybox /bin/sh
+ ```
+
+4. 在命令帮助中看到的-a, \--attach=\[\]之类的选项,表示这种选项既可以用-a value指定也可以用\--attach=value指定。如:
+
+ ```bash
+ docker run -a stdin --attach=stdout -i -t busybox /bin/sh
+ ```
+
+5. \--name=””之类的选项需要的是一个字符串,只能指定一次,-c=0之类的选项需要的是一个整数,只能指定一次。
+
+**表 1** docker daemon启动时指定参数详解
+
+
+ 参数名称
+
+ 说明
+
+
+
+ --api-cors-header
+
+ 开放远程API调用的 CORS 头信息 。这个接口开关对想进行二次开发的上层应用提供了支持。为remote API设置CORS头信息。
+
+
+ --authorization-plugin=[]
+
+ 指定认证插件。
+
+
+ -b, --bridge=""
+
+ 挂载已经存在的网桥设备到 Docker 容器里。注意,使用 none 可以停用容器里的网络。
+
+
+ --bip=""
+
+ 使用 CIDR 地址来设定自动创建的网桥的 IP。注意,此参数和 -b 不能一起使用。
+
+
+ --cgroup-parent
+
+ 为所有容器设定cgroup父目录。
+
+
+ --config-file=/etc/docker/daemon.json
+
+ 启动docker daemon的配置文件。
+
+
+ --containerd
+
+ 指定containerd的socket路径。
+
+
+ -D, --debug=false
+
+ 开启Debug模式。
+
+
+ --default-gateway
+
+ 容器IPv4地址的默认网关。
+
+
+ --default-gateway-v6
+
+ 容器IPv6地址的默认网关。
+
+
+ --default-ulimit=[]
+
+ 容器的默认ulimit值。
+
+
+ --disable-legacy-registry
+
+ 不允许使用原版registry。
+
+
+ --dns=[]
+
+ 强制容器使用DNS服务器。
+ 例如: --dns 8.8.x.x
+
+
+ --dns-opt=[]
+
+ 指定使用DNS的选项。
+
+
+ --dns-search=[]
+
+ 强制容器使用指定的DNS搜索域名。
+ 例如: --dns-search example.com
+
+
+ --exec-opt=[]
+
+ 设置运行时执行选项。
+ 例如支持native.umask选项:
+ # 启动的容器umask值为0022 --exec-opt native.umask=normal # 启动的容器umask值为0027(缺省值)--exec-opt native.umask=secure
+ 注意如果docker create/run也配置了native.umask参数则以docker create/run中的配置为准。
+
+
+ --exec-root=/var/run/docker
+
+ 指定执行状态文件存放的根目录。
+
+
+ --fixed-cidr=""
+
+ 设定子网固定IP(ex: 10.20.0.0/16),这个子网IP必须属于网桥内的。
+
+
+ --fixed-cidr-v6
+
+ 同上,使用与IPv6。
+
+
+ -G, --group="docker"
+
+ 在后台运行模式下,赋予指定的Group到相应的unix socket上。注意,当此参数 --group 赋予空字符串时,将去除组信息。
+
+
+ -g, --graph="/var/lib/docker"
+
+ 配置Docker运行时根目录。
+
+
+ -H, --host=[]
+
+ 在后台模式下指定socket绑定,可以绑定一个或多个 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:
+ $ dockerd -H tcp://0.0.0.0:2375
+ 或者
+ $ export DOCKER_HOST="tcp://0.0.0.0:2375"
+
+
+ --insecure-registry=[]
+
+ 指定非安全连接的仓库,docker默认所有的连接都是TLS证书来保证安全的,如果仓库不支持https连接或者证书是docker daemon不清楚的证书颁发机构颁发的,则启动daemon的时候要指定如--insecure-registry=192.168.1.110:5000,使用私有仓库都要指定。
+
+
+ --image-layer-check=true
+
+ 开启镜像层完整性检查功能,设置为true;关闭该功能,设置为false。如果没有该参数,默认为关闭。
+ docker启动时会检查镜像层的完整性,如果镜像层被破坏,则相关的镜像不可用。docker进行镜像完整性校验时,无法校验内容为空的文件和目录,以及链接文件。因此若镜像因掉电导致上述类型文件丢失,docker的镜像数据完整性校验可能无法识别。docker版本变更时需要检查是否支持该参数,如果不支持,需要从配置文件中删除。
+
+
+ --icc=true
+
+ 启用容器间的通信。
+
+
+ --ip="0.0.0.0"
+
+ 容器绑定端口时使用的默认IP地址。
+
+
+ --ip-forward=true
+
+ 启动容器的 net.ipv4.ip_forward。
+
+
+ --ip-masq=true
+
+ 使能IP伪装。
+
+
+ --iptables=true
+
+ 启动Docker容器自定义的iptable规则。
+
+
+ -l, --log-level=info
+
+ 设置日志级别。
+
+
+ --label=[]
+
+ 设置daemon标签,以key=value形式设置。
+
+
+ --log-driver=json-file
+
+ 设置容器日志的默认日志驱动。
+
+
+ --log-opt=map[]
+
+ 设置日志驱动参数。
+
+
+ --mtu=0
+
+ 设置容器网络的MTU值,如果没有这个参数,选用默认 route MTU,如果没有默认route,就设置成常量值 1500。
+
+
+ -p, --pidfile="/var/run/docker.pid"
+
+ 后台进程PID文件路径。
+
+
+ --raw-logs
+
+ 带有全部时间戳并不带ANSI颜色方案的日志。
+
+
+ --registry-mirror=[]
+
+ 指定dockerd优先使用的镜像仓库。
+
+
+ -s, --storage-driver=""
+
+ 强制容器运行时使用指定的存储驱动
+
+
+ --selinux-enabled=false
+
+ 启用selinux支持,3.10.0-862.14及以上内核版本不支持--selinux-enabled=true。
+
+
+ --storage-opt=[]
+
+ 配置存储驱动的参数,存储驱动为devicemapper的时候有效(e.g. dockerd --storage-opt dm.blocksize=512K)。
+
+
+ --tls=false
+
+ 启动TLS认证开关。
+
+
+ --tlscacert="/root/.docker/ca.pem"
+
+ 通过CA认证过的certificate文件路径。
+
+
+ --tlscert="/root/.docker/cert.pem"
+
+ TLS的certificate文件路径。
+
+
+ --tlskey="/root/.docker/key.pem"
+
+ TLS的key文件路径。
+
+
+ --tlsverify=false
+
+ 使用TLS并做后台进程与客户端通讯的验证。
+
+
+ --insecure-skip-verify-enforce
+
+ 是否强制跳过证书的主机名/域名验证,默认为false(不跳过)。
+
+
+ --use-decrypted-key=true
+
+ 指定使用解密私钥。
+
+
+ --userland-proxy=true
+
+ 容器LO设备使用userland proxy。
+
+
+ --userns-remap
+
+ 容器内使用user命名空间的用户映射表。
+
+
+
+
+
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-management-1.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-management-1.md
new file mode 100644
index 0000000000000000000000000000000000000000..ac4c9f3cd18d9d0b6aacee21602af946e56202bd
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-management-1.md
@@ -0,0 +1,706 @@
+# 容器管理
+
+- [容器管理](#容器管理)
+ - [创建容器](#创建容器)
+ - [创建容器使用hook-spec](#创建容器使用hook-spec)
+ - [创建容器配置健康检查](#创建容器配置健康检查)
+ - [停止与删除容器](#停止与删除容器)
+ - [容器信息查询](#容器信息查询)
+ - [修改操作](#修改操作)
+
+## 创建容器
+
+### 下载镜像
+
+运行docker命令需要root权限,当你使用普通用户登录时,需要用sudo权限执行docker命令。
+
+```bash
+[root@localhost ~]# docker pull busybox
+```
+
+该命令行将在docker官方的镜像库中下载busybox:latest(命令行中没指定TAG,所以使用默认的TAG名latest),镜像在下载过程中将检测所依赖的层本地是否存在,如果存在就跳过。从私有镜像库下载镜像时,请带上registry描述,例如:假如建立了一个私有镜像库,地址为192.168.1.110:5000,里面有一些常用镜像。使用下面命令行从私有镜像库中下载镜像。
+
+```bash
+[root@localhost ~]# docker pull 192.168.1.110:5000/busybox
+```
+
+从私有镜像库中下载下来的image名字带有镜像库地址的信息名字比较长,可以用docker tag命令生成一个名字简单点的image。
+
+```bash
+[root@localhost ~]# docker tag 192.168.1.110:5000/busybox busybox
+```
+
+可以通过docker images命令查看本地镜像列表。
+
+### 运行一个简单的应用
+
+```bash
+[root@localhost ~]# docker run busybox /bin/echo "Hello world"
+Hello world
+```
+
+该命令行使用busybox:latest(命令行中没有指定tag,所以使用默认的tag名latest)镜像创建了一个容器,在容器内执行了echo "Hello world"。使用下面命令行可以查看刚才创建的这个容器。
+
+```bash
+[root@localhost ~]# docker ps -l
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+d8c0a3315bc0 busybox "/bin/echo 'Hello wo…" 5 seconds ago Exited (0) 3 seconds ago practical_franklin
+```
+
+### 创建一个交互式的容器
+
+```bash
+[root@localhost ~]# docker run -it busybox /bin/bash
+root@bf22919af2cf:/# ls
+bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
+root@bf22919af2cf:/# pwd
+/
+```
+
+-ti选项分配一个伪终端给容器并可以使用STDIN进行交互,可以看到这时可以在容器内执行一些命令。这时的容器看起来完全是一个独立的linux虚拟机。使用exit命令退出容器。
+
+### 后台运行容器
+
+执行下面命令行,-d指示这个容器在后台运行,\--name=container1 指定容器的名字为container1。
+
+```bash
+[root@localhost ~]# docker run -d --name=container1 busybox /bin/sh -c "while true;do echo hello world;sleep 1;done"
+7804d3e16d69b41aac5f9bf20d5f263e2da081b1de50044105b1e3f536b6db1c
+```
+
+命令行的执行结果是返回了这个容器的ID,没有返回命令的执行结果hello world,此时容器在后台运行,可以用docker ps命令查看正在运行的容器:
+
+```bash
+[root@localhost ~]# docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+7804d3e16d69 busybox "/bin/sh -c 'while tr" 11 seconds ago Up 10 seconds container1
+```
+
+用docker logs查看容器运行的输出:
+
+```bash
+[root@localhost ~]# docker logs container1
+hello world
+hello world
+hello world
+...
+```
+
+### 容器网络连接
+
+默认情况下,容器可以访问外部网络,而外部网络访问容器时需要通过端口映射,下面以在docker中运行私有镜像库服务registry为例。下面的命令行中-P使registry镜像中开放的端口暴露给主机。
+
+```bash
+[root@localhost ~]# docker run --name=container_registry -d -P registry
+cb883f6216c2b08a8c439b3957fb396c847a99079448ca741cc90724de4e4731
+```
+
+container\_registry这个容器已经启动了,但是并不知道容器中的服务映射到主机的哪个端口,通过docker port查看端口映射。
+
+```bash
+[root@localhost ~]# docker port container_registry
+5000/tcp -> 0.0.0.0:49155
+```
+
+从输出可以看出,容器内的5000端口映射到了主机的49155端口。通过主机IP:49155就可以访问registry服务了,在浏览器中输入就可以返回registry的版本信息。
+
+在运行registry镜像的时候还可以直接指定端口映射如:
+
+```bash
+docker run --name=container_registry -d -p 5000:5000 registry
+```
+
+通过-p 5000:5000指定容器的5000端口映射到主机的5000端口。
+
+### 注意事项
+
+- **启动容器不能单独加-a stdin**
+
+ 启动容器时,不能单独加-a stdin,必须要同时加上-a stdout或者-a stderr,否则会导致终端即使在容器退出后也会卡住。
+
+- **避免使用已有容器的长id、短id作为新容器的name**
+
+ 创建容器时,避免使用已有容器A的长id或短id作为新容器B的name。若使用容器A的长id作为容器B的name,当使用容器B的name作为指定容器进行操作时,docker匹配到的是容器A。若使用容器A的短id作为容器B的name,当使用容器A的短id作为指定容器进行相关操作时,docker匹配到的是容器B。这是因为,docker在匹配容器时,先精确匹配所有容器的长id。若未匹配成功,再根据container\_name进行精确匹配;若还未匹配成功,直接对容器id进行模糊匹配。
+
+- **使用sh/bash等依赖标准输入输出的容器应该使用\`-ti\`参数,避免出现异常**
+
+ 正常情况:不用\`-ti\`参数启动sh/bash等进程容器,容器会马上退出。
+
+ 出现这种问题的原因在于,docker会先创建一个匹配用于容器内业务的stdin,在不设置-ti等交互式参数时,docker会在容器启动后关闭该pipe,而业务容器进程sh/bash在检测到stdin被关闭后会直接退出。
+
+ 异常情况:如果在上述过程中的特定阶段(关闭该pipe之前)强制杀死docker daemon,会导致该pipe的daemon端没有被及时关闭,这样即使不带\`-ti\`的sh/bash进程也不会退出,导致异常场景,这种容器就需要手动清理。
+
+ Daemon重启后会接管原有的容器stream,而不带\`-ti\`参数的容器可能就无法处理(因为正常情况下这些容器不存在stream需要接管);真实业务下几乎不存在这种使用方式\(不带 \`-ti\`的sh/bash没有任何作用\),为了避免这类问题发生,限制交互类容器应该使用 \`-ti\`参数。
+
+- **容器存储卷**
+
+ 启动容器时如果通过\`-v\`参数将主机上的文件挂载到容器中,在主机或容器中使用vi或sed命令修改文件可能会使文件inode发生改变,从而导致主机和容器内的文件不同步。容器中挂载文件时应该尽量避免使用这种文件挂载的方式(或不与vi和sed同时使用),也可以通过挂载文件上层目录来避免该问题。在docker挂载卷时“nocopy”选项可以避免将容器内挂载点目录下原有的文件拷贝到主机源目录下,但是这个选项只能在挂载匿名卷时使用,不能在bind mount的场景下使用。
+
+- **避免使用可能会对host造成影响的选项**
+
+ \--privileged 选项会让容器获得所有权限,容器可以做挂载操作和修改/proc、/sys等目录,可能会对host造成影响,普通容器需要避免使用该选项。
+
+ 共享host的namespace,比如\--pid host/\--ipc host/\--net host等选项可以让容器跟host共享命名空间,同样会导致容器影响host的结果,需要避免使用。
+
+- **kernel memory cgroup不稳定,禁止使用**
+
+ kernel memory cgroup在小于4.0版本的Linux内核上仍属于实验阶段,运行起来不稳定,虽然Docker的Warning说是小于4.0就可以,但是我们评估认为,kmemcg在高版本内核仍然不稳定,所以不管是低版本还是高版本,均禁止使用。
+
+ 当docker run \--kernel-memory时,会产生如下告警:
+
+ ```text
+ WARNING: You specified a kernel memory limit on a kernel older than 4.0. Kernel memory limits are experimental on older kernels, it won't work as expected as expected and can cause your system to be unstable.
+ ```
+
+- **blkio-weight参数在支持blkio精确控制的内核下不可用**
+
+ \--blkio-weight-device 可以实现容器内更为精确的blkio控制,该控制需要指定磁盘设备,可以通过docker \--blkio-weight-device参数实现。同时在这种内核下docker不再提供\--blkio-weight方式限制容器blkio,使用该参数创建容器将会报错:
+
+ ```text
+ docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:398: container init caused \"process_linux.go:369: setting cgroup config for ready process caused \\\"blkio.weight not supported, use weight_device instead\\\"\""
+ ```
+
+- **使用\--blkio-weight-device需要磁盘支持CFQ调度策略**
+
+ \--blkio-weight-device参数需要磁盘工作于完全公平队列调度(CFQ:Completely Fair Queuing)的策略时才能工作。
+
+ 通过查看磁盘scheduler文件(‘/sys/block/\<磁盘>/queue/scheduler’)可以获知磁盘支持的策略以及当前所采用的策略,如查看sda:
+
+ ```bash
+ # cat /sys/block/sda/queue/scheduler noop [deadline] cfq
+ ```
+
+ 当前sda支持三种调度策略:noop, deadline, cfq,并且正在使用deadline策略。通过echo修改策略为cfq:
+
+ ```bash
+ # echo cfq > /sys/block/sda/queue/scheduler
+ ```
+
+- **容器基础镜像中systemd使用限制**
+
+ 通过基础镜像创建的容器在使用过程中,容器基础镜像中的systemd仅用于系统容器,普通容器不支持使用。
+
+### 并发性能
+
+- docker内部的消息缓冲有一个上限,超过这个上限就会将消息丢弃,因此在并发执行命令时建议不要超过1000条命令,否则有可能会造成docker内部消息丢失,从而造成容器无法启动等严重问题。
+- 并发创建容器并对容器执行restart时会偶现“oci runtime error: container init still running”报错,这是因为containerd对事件等待队列进行了性能优化,容器stop过程中执行runc delete,尝试在1s内kill掉容器的init进程,如果1s内init进程还没有被kill掉的话runc会返回该错误。由于containerd的GC(垃圾回收机制)每隔10s会回收之前runc delete的残留资源, 所以并不影响下次对容器的操作,一般出现上述报错的话等待4\~5s之后再次启动容器即可。
+
+### 安全特性解读
+
+1. docker默认的权能配置分析
+
+ 原生的docker默认配置如下,默认进程携带的Cap如下:
+
+ ```conf
+ "CAP_CHOWN",
+ "CAP_DAC_OVERRIDE",
+ "CAP_FSETID",
+ "CAP_FOWNER",
+ "CAP_MKNOD",
+ "CAP_NET_RAW",
+ "CAP_SETGID",
+ "CAP_SETUID",
+ "CAP_SETFCAP",
+ "CAP_SETPCAP",
+ "CAP_NET_BIND_SERVICE",
+ "CAP_SYS_CHROOT",
+ "CAP_KILL",
+ "CAP_AUDIT_WRITE",
+ ```
+
+ 默认的seccomp配置是白名单,不在白名单的syscall默认会返回SCMP\_ACT\_ERRNO,根据给docker不同的Cap开放不同的系统调用,不在上面的权限,默认docker都不会给到容器。
+
+2. CAP\_SYS\_MODULE
+
+ CAP\_SYS\_MODULE这个Cap是让容器可以插入或移除ko,增加该Cap可以让容器逃逸,甚至破坏内核。因为容器最大的隔离是Namespace,在ko中只要把他的Namespace指向init\_nsproxy即可。
+
+3. CAP\_SYS\_ADMIN
+
+ sys\_admin权限给容器带来的能力有:
+
+ - 文件系统(mount,umount,quotactl)
+ - namespace设置相关的(setns,unshare,clone new namespace)
+ - driver ioctl
+ - 对pci的控制,pciconfig\_read, pciconfig\_write, pciconfig\_iobase
+ - sethostname
+
+4. CAP\_NET\_ADMIN
+
+ 容器中有访问网络接口的和sniff网络流量的权限,容器可以获取到所有容器包括host的网络流量,对网络隔离破坏极大。
+
+5. CAP\_DAC\_READ\_SEARCH
+
+ 该权限开放了open\_by\_handle\_at和name\_to\_handle\_at两个系统调用,如果host上没有selinux保护,容器中可通过暴力搜索file\_handle结构的inode号,进而可以打开host上的任意文件,影响文件系统的隔离性。
+
+6. CAP\_SYS\_RAWIO
+
+ 容器中可对host写入io端口,可造成host内核崩溃。
+
+7. CAP\_SYS\_PTRACE
+
+ 容器中有ptrace权限,可对容器的进程进行ptrace调试。现runc已经修补该漏洞,但有些工具比如nsenter和docker-enter并没有改保护,容器中可对这些工具执行的进程进行调试,获取这些工具带入的资源信息(Namespace、fd等),另外, ptrace可以绕过seccomp,极大增加内核攻击面。
+
+8. Docker Cap接口 \--cap-add all
+
+ --cap-add all表示赋予容器所有的权能,包括本节提到的比较危险的权能,使得容器可以逃逸。
+
+9. 不要禁用docker的seccomp特性
+
+ 默认的docker有一个seccomp的配置,配置中使用的是白名单,不在配置的sys\_call会被seccomp禁掉,使用接口--security-opt 'seccomp:unconfined'可以禁止使用seccomp特性。如果禁用seccomp或使用自定义seccomp配置但过滤名单不全,都会增加容器对内核的攻击面。
+
+10. 不要配置/sys和/proc目录可写
+
+ /sys和/proc目录包含了linux维护内核参数、设备管理的接口,容器中配置该目录可写可能会导致容器逃逸。
+
+11. Docker开放Cap \--CAP\_AUDIT\_CONTROL
+
+ 容器可以通过控制系统audit系统,并且通过AUDIT\_TTY\_GET/AUDIT\_TTY\_SET等命令可以获取审计系统中记录的tty执行输入记录,包括root密码。
+
+12. CAP\_BLOCK\_SUSPEND和CAP\_WAKE\_ALARM
+
+ 容器可拥有阻塞系统挂起\(epoll\)的能力。
+
+13. CAP\_IPC\_LOCK
+
+ 容器拥有该权限后,可以突破ulimit中的max locked memory限制,任意mlock超大内存块,造成一定意义的DoS攻击。
+
+14. CAP\_SYS\_LOG
+
+ 容器拥有该权限后,可以dmesg读取系统内核日志,突破内核kaslr防护。
+
+15. CAP\_SYS\_NICE
+
+ 容器拥有该权限后,可以改变进程的调度策略和优先级,造成一定意义的DoS攻击。
+
+16. CAP\_SYS\_RESOURCE
+
+ 容器可以绕过对其的一些资源限制,比如磁盘空间资源限制、keymaps数量限制、pipe-size-max限制等,造成一定意义的DoS攻击。
+
+17. CAP\_SYS\_TIME
+
+ 容器可以改变host上的时间。
+
+18. Docker默认Cap风险分析
+
+ Docker默认的Cap,包含了CAP\_SETUID和CAP\_FSETID,如host和容器共享目录,容器可对共享目录的二进制文件进行+s设置,host上的普通用户可使用其进行提权CAP\_AUDIT\_WRITE,容器可以对host写入,容器可以对host写入日志,host需配置日志防爆措施。
+
+19. Docker和host共享namespace参数,比如 \--pid,\--ipc, \--uts
+
+ 该参数为容器和host共享namespace空间,容器和host的namespace隔离没有了,容器可对host进行攻击。比如,使用\--pid 和host共享pid namespace,容器中可以看到host上的进程pid号,可以随意杀死host的进程。
+
+20. \--device 把host的敏感目录或者设备,映射到容器中
+
+ Docker管理面有接口可以把host上的目录或者设备映射到容器中,比如\--device,-v等参数,不要把host上的敏感目录或者设备映射到容器中。
+
+## 创建容器使用hook-spec
+
+### 原理及使用场景
+
+docker支持hook的扩展特性,hook应用与底层runc的执行过程中,遵循OCI标准:[https://github.com/opencontainers/runtime-spec/blob/main/config.md\#hooks](#https://github.com/opencontainers/runtime-spec/blob/main/config.md#hooks) 。
+
+hook主要有三种类型:prestart,poststart,poststop。分别作用于容器内用户应用程序启动之前,容器应用程序启动之后,容器应用程序停止之后。
+
+### 接口参考
+
+当前为docker run和create命令增加了参数“--hook-spec”,后面接spec文件的绝对路径,可以指定容器启动时的需要添加的hook,这些hook会自动附加在docker自己动态创建的hook后面(当前docker只有一个libnetwork的prestart hook),随容器的启动/销毁过程执行用户指定的程序。
+
+spec的结构体定义为:
+
+```conf
+// Hook specifies a command that is run at a particular event in the lifecycle of a container
+type Hook struct{
+ Path string `json:"path"`
+ Args []string `json:"args,omitempty"`
+ Env []string `json:"env,omitempty"`
+ Timeout *int `json:"timeout,omitempty"`
+}
+// Hooks for container setup and teardown
+type Hooks struct{
+ // Prestart is a list of hooks to be run before the container process is executed.
+ // On Linux, they are run after the container namespaces are created.
+ Prestart []Hook `json:"prestart,omitempty"`
+ // Poststart is a list of hooks to be run after the container process is started.
+ Poststart []Hook `json:"poststart,omitempty"`
+ // Poststop is a list of hooks to be run after the container process exits.
+ Poststop []Hook `json:"poststop,omitempty"`
+}
+```
+
+- Spec文件的path、args、env 都是必填信息;
+- Timeout选填\(建议配置\),参数类型为int,不接受浮点数,范围为\[1, 120\]。
+- Spec内容应该是json格式的,格式不对会报错,示例参考前面。
+- 使用的时候既可以\`docker run \--hook-spec /tmp/hookspec.json xxx\`, 也可以 \`docker create \--hook-spec /tmp/hookspec.json xxx && docker start xxx\`。
+
+### 为容器定制特有的hook
+
+以启动过程中添加一个网卡的过程来说明。下面是相应的hook spec文件内容:
+
+```conf
+{
+ "prestart": [
+ {
+ "path": "/var/lib/docker/hooks/network-hook",
+ "args": ["network-hook", "tap0", "myTap"],
+ "env": [],
+ "timeout": 5
+ }
+ ],
+ "poststart":[],
+ "poststop":[]
+}
+```
+
+指定prestart hook增加一个网络hook的执行。路径是/var/lib/docker/hooks/network-hook,args代表程序的参数,第一个参数一般是程序名字,第二个是程序接受的参数。对于network-hook这个hook程序,需要两个参数,第一个是主机上的网卡名字,第二个是在容器内的网卡重命名。
+
+- 注意事项
+ 1. hook path必须为docker的graph目录(\--graph)下的hooks文件夹下,默认一般为 /var/lib/docker/hooks,可以通过docker info命令查看root路径。
+
+ ```bash
+ [root@localhost ~]# docker info
+ ...
+ Docker Root Dir: /var/lib/docker
+ ...
+ ```
+
+ 这个路径可能会跟随用户手动配置,以及user namespace的使用(daemon --userns-remap)而变化。 path进行软链接解析后,必须以Docker Root Dir/hooks开头(如本例中使用 /var/lib/docker/hooks开头),否则会直接报错。
+
+ 2. hooks path必须指定绝对路径,因为这个是由daemon处理,相对路径对daemon无意义。同时绝对路径也更满足安全要求。
+ 3. hook程序打印到stderr的输出会打印给客户端并对容器的声明周期产生影响(比如启动失败),而输出到stdout的打印信息会被直接忽略。
+ 4. 严禁在hook里反向调用docker的指令。
+ 5. 配置的hook执行文件必须要有可执行权限,否则hook执行会报错。
+ 6. 使用hook时,执行时间应尽量短。如果hook中的prestart时间过长(超过2分钟),则会导致容器启动超时失败,如果hook中的poststop时间过长(超过2分钟),也会导致容器异常。
+
+ 目前已知的异常如下:执行docker stop命令停止容器时,2分钟超时执行清理时,由于hook还没执行结束,因此会等待hook执行结束(该过程持有锁),从而导致和该容器相关的操作都会卡住,需要等到hook执行结束才能恢复。另外,由于docker stop命令的2分钟超时处理是异步的过程,因此即使docker stop命令返回了成功,容器的状态也依然是up状态,需要等到hook执行完后状态才会修改为exited。
+
+- 使用建议
+ 1. 建议配置hook的Timeout超时时间阈值,超时时间最好在5s以内。
+ 2. 建议不要配置过多hook,每个容器建议prestart、poststart、poststop这三个hook都只配置一个,过多hook会导致启动时间长。
+ 3. 建议用户识别多个hook之间的依赖关系,如果存在依赖关系,在组合hook配置文件时要根据依赖关系灵活调整顺序,hook的执行顺序是按照配置的spec文件上的先后顺序。
+
+### 多个hook-spec
+
+当有多个hook配置文件,要运行多个hook时,用户必须自己手工将多个hook配置文件组合成一个配置文件,使用\--hook-spec参数指定此合并后的配置文件,方可生效所有的hook;如果配置多个\--hook-spec参数,则只有最后一个生效。
+
+配置举例:
+
+hook1.json内容如下:
+
+```bash
+# cat /var/lib/docker/hooks/hookspec.json
+{
+ "prestart": [
+ {
+ "path": "/var/lib/docker/hooks/lxcfs-hook",
+ "args": ["lxcfs-hook", "--log", "/var/log/lxcfs-hook.log"],
+ "env": []
+ }
+ ],
+ "poststart":[],
+ "poststop":[]
+}
+```
+
+hook2.json内容如下:
+
+```bash
+# cat /etc/isulad-tools/hookspec.json
+{
+ "prestart": [
+ {
+ "path": "/docker-root/hooks/docker-hooks",
+ "args": ["docker-hooks", "--state", "prestart"],
+ "env": []
+ }
+ ],
+ "poststart":[],
+ "poststop":[
+ {
+ "path": "/docker-root/hooks/docker-hooks",
+ "args": ["docker-hooks", "--state", "poststop"],
+ "env": []
+ }
+ ]
+}
+```
+
+手工合并后的json内容如下:
+
+```conf
+{
+ "prestart":[
+ {
+ "path": "/var/lib/docker/hooks/lxcfs-hook",
+ "args": ["lxcfs-hook", "--log", "/var/log/lxcfs-hook.log"],
+ "env": []
+ },
+ {
+ "path": "/docker-root/hooks/docker-hooks",
+ "args": ["docker-hooks", "--state", "prestart"],
+ "env": []
+ }
+ ],
+ "poststart":[],
+ "poststop":[
+ {
+ "path": "/docker-root/hooks/docker-hooks",
+ "args": ["docker-hooks", "--state", "poststop"],
+ "env": []
+ }
+ ]
+}
+```
+
+需要注意的是,docker daemon会按照数组顺序依次读取hook配置文件中prestart等action中的hook二进制,进行执行动作。用户需要识别多个hook之间的依赖关系,如果有依赖关系,在组合hook配置文件时要根据依赖关系灵活调整顺序。
+
+### 为所有容器定制默认的hook
+
+Docker daemon同样可以接收--hook-spec的参数,--hook-spec的语义与docker create/run的--hook-spec参数相同,这里不再复述。也可以在/etc/docker/daemon.json里添加hook配置:
+
+```conf
+{
+ "hook-spec": "/tmp/hookspec.json"
+}
+```
+
+容器在运行时,会首先执行daemon定义的--hook-spec中指定的hooks,然后再执行每个容器单独定制的hooks。
+
+## 创建容器配置健康检查
+
+Docker提供了用户定义的对容器进行健康检查的功能。在Dockerfile中配置HEALTHCHECK CMD选项,或在容器创建时配置\--health-cmd选项,在容器内部周期性地执行命令,通过命令的返回值来监测容器的健康状态。
+
+### 配置方法
+
+- 在Dockerfile中添加配置,如:
+
+ ```conf
+ HEALTHCHECK --interval=5m --timeout=3s --health-exit-on-unhealthy=true \
+ CMD curl -f http://localhost/ || exit 1
+ ```
+
+ 可配置的选项:
+
+ 1. --interval=DURATION,默认 30s,相邻两次命令执行的间隔时间。另外,容器启动后,经过interval时间进行第一次检查。
+ 2. --timeout=DURATION,默认 30s,单次检查命令执行的时间上限,超时则任务命令执行失败。
+ 3. --start-period=DURATION,默认 0s,容器初始化时间。初始化期间也会执行健康检查,健康检查失败不会计入最大重试次数。但是,如果在初始化期间运行状况检查成功,则认为容器已启动。之后所有连续的检查失败都将计入最大重试次数。
+ 4. --retries=N,默认 3,健康检查失败最大的重试次数。
+ 5. --health-exit-on-unhealthy=BOOLEAN,默认false,检测到容器非健康时是否杀死容器
+ 6. CMD,必选,在容器内执行的命令。返回值为0表示成功,非0表示失败。
+
+ 在配置了HEALTHCHECK后创建镜像,HEALTHCHECK相关配置会被写入镜像的配置中。通过docker inspect可以看到。如:
+
+ ```conf
+ "Healthcheck": {
+ "Test": [
+ "CMD-SHELL",
+ "/test.sh"
+ ]
+ },
+ ```
+
+- 在容器创建时的配置:
+
+ ```bash
+ docker run -itd --health-cmd "curl -f http://localhost/ || exit 1" --health-interval 5m --health-timeout 3s --health-exit-on-unhealthy centos bash
+ ```
+
+ 可配置的选项:
+
+ 1. \--health-cmd,必选,在容器内执行的命令。返回值为0表示成功,非0表示失败。
+ 2. \--health-interval,默认 30s,最大为int64上限(纳秒)相邻两次命令执行的间隔时间。
+ 3. \--health-timeout,默认 30s,最大为int64上限(纳秒),单次检查命令执行的时间上限,超时则任务命令执行失败。
+ 4. \--health-start-period,默认 0s,最大为int64上限(纳秒),容器初始化时间。
+ 5. \--health-retries,默认 3,最大为int32上限,健康检查失败最大的重试次数。
+ 6. \--health-exit-on-unhealthy,默认false,检测到容器非健康时是否杀死容器。
+
+ 容器启动后,HEALTHCHECK相关配置会被写入容器的配置中。通过docker inspect可以看到。如:
+
+ ```conf
+ "Healthcheck": {
+ "Test": [
+ "CMD-SHELL",
+ "/test.sh"
+ ]
+ },
+ ```
+
+### 检查规则
+
+1. 容器启动后,容器状态中显示health:starting。
+2. 经过start-period时间后开始,以interval为间隔周期性在容器中执行CMD。即:当一次命令执行完毕后,经过interval时间,执行下一次命令。
+3. 若CMD命令在timeout限制的时间内执行完毕,并且返回值为0,则视为一次检查成功,否则视为一次检查失败。检查成功后,容器状态变为health:healthy。
+4. 若CMD命令连续retries次检查失败,则容器状态变为health:unhealthy。失败后容器也会继续进行健康检查。
+5. 容器状态为health:unhealthy时,任意一次检查成功会使得容器状态变为health:healthy。
+6. 设置--health-exit-on-unhealthy的情况下,如果容器因为非被杀死退出(退出返回值137)后,健康检查只有容器在重新启动后才会继续生效。
+7. CMD执行完毕或超时时,docker daemon会将这次检查的起始时间、返回值和标准输出记录到容器的配置文件中。最多记录最新的5条数据。此外,容器的配置文件中还存储着健康检查的相关参数。
+
+通过docker ps可以看到容器状态。
+
+```bash
+[root@bac shm]# docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+7de2228674a2 testimg "bash" About an hour ago Up About an hour (unhealthy) cocky_davinci
+```
+
+运行中的容器的健康检查状态也会被写入容器配置中。通过docker inspect可以看到。
+
+```conf
+"Health": {
+ "Status": "healthy",
+ "FailingStreak": 0,
+ "Log": [
+ {
+ "Start": "2018-03-07T07:44:15.481414707-05:00",
+ "End": "2018-03-07T07:44:15.556908311-05:00",
+ "ExitCode": 0,
+ "Output": ""
+ },
+ {
+ "Start": "2018-03-07T07:44:18.557297462-05:00",
+ "End": "2018-03-07T07:44:18.63035891-05:00",
+ "ExitCode": 0,
+ "Output": ""
+ },
+ ......
+}
+```
+
+>  **说明:**
+>
+> - 容器内健康检查的状态信息最多保存5条。会保存最后得到的5条记录。
+> - 容器内健康检查相关配置同时最多只能有一条生效。Dockerfile中配置的靠后的条目会覆盖靠前的;容器创建时的配置会覆盖镜像中的。
+> - 在Dockerfile中可以通过 HEALTHCHECK NONE来取消引用的镜像中的健康检查配置。在容器运行时可以通过配置--no-healthcheck来取消镜像中的健康检查配置。不允许在启动时同时配置健康检查相关选项与--no-healthcheck选项。
+> - 带有健康检查配置的容器启动后,若docker daemon退出,则健康检查不会执行,一直等待。docker daemon再次启动后,容器健康状态会变为starting。之后检查规则同上。
+> - 构建容器镜像时若健康检查相关参数配置为空,则按照缺省值处理。
+> - 容器启动时若健康检查相关参数配置为0,则按照缺省值处理。
+
+## 停止与删除容器
+
+用docker stop停止名为container1的容器:
+
+```bash
+[root@localhost ~]# docker stop container1
+```
+
+也可以用docker kill来杀死容器达到停止容器的目的:
+
+```bash
+[root@localhost ~]# docker kill container1
+```
+
+当容器停止之后,可以使用docker rm删除容器:
+
+```bash
+[root@localhost ~]# docker rm container1
+```
+
+当然,使用docker rm -f 强制删除容器也是可以的:
+
+```bash
+[root@localhost ~]# docker rm -f container1
+```
+
+### 注意事项
+
+- 禁止使用docker rm -f XXX 删除容器。如果使用强制删除,docker rm会忽略过程中的错误,可能导致容器相关元数据残留。如果使用普通删除,如果删除过程出错,则会删除失败,不会导致元数据残留。
+- 避免使用docker kill命令。docker kill命令发送相关信号给容器内业务进程,依赖于容器内业务进程对信号的处理策略,可能导致业务进程的信号处理行为与指令的预期不符合的情况。
+- docker stop处于restarting状态的容器可能容器不会马上停止。如果一个容器使用了重启规则,当容器处于restarting状态时,docker stop这个容器时有很低的概率会立即返回,容器仍然会在重启规则的作用下再次启动。
+- 不能用docker restart重启加了--rm参数的容器。加了--rm参数的容器在退出时,容器会主动删除,如果重启一个加了--rm的参数的容器, 可能会导致一些异常情况,比如启动容器时,同时加了--rm与-ti参数,对容器执行restart操作,可能会概率性卡住无法退出。
+
+### docker stop/restart 指定t参数且t<0时,请确保自己容器的应用会处理stop信号
+
+Stop的原理:(Restart会调用Stop流程)
+
+1. Stop会首先给容器发送Stop 信号(15)
+2. 然后等待一定的时间(这个时间就是用户输入的 t)
+3. 过了一定时间,如果容器还活着,那么就发送kill信号(9)使容器强制退出
+
+输入参数t(单位s)的含义:
+
+- t<0 : 表示死等,不管多久都等待程序优雅退出,既然用户这么输入了,表示对自己的应用比较放心,认为自己的程序有合理的stop信号的处理机制
+- t=0 : 表示不等,立即发送kill -9 到容器
+- t\>0 : 表示等一定的时间,如果容器还未退出,就发送kill -9 到容器
+
+所以如果用户使用t<0 \(比如t=-1\),请确保自己容器的应用会正确处理signal 15,如果容器忽略了该信号,会导致docker stop一直卡住。
+
+### 如果容器处于Dead状态,可能底层文件系统处于busy状态,需要手动删除
+
+Docker在执行容器删除时,先停止容器的相关进程,之后将容器状态更改为Dead,最后执行容器rootfs的删除操作。当文件系统或者device mapper处于忙碌状态时,最后一步rootfs的删除会失败。docker ps -a查看会发现容器处于Dead状态。Dead状态的容器不能再次启动,需要等待文件系统不繁忙时,手动再次执行docker rm进行删除。
+
+### 共享pid namespace容器,子容器处于pause状态会使得父容器stop卡住,并影响docker run命令执行
+
+使用--pid参数创建共享pid namespace的父子容器,在执行docker stop父容器时,如果子容器中有进程无法退出(比如处于D状态、pause状态),会产生父容器docker stop命令等待的情况,需要手动恢复这些进程,才能正常执行命令。
+
+遇到该问题的时候,请对pause状态的容器使用docker inspect 命令查询 PidMode对应的父容器是否为需要docker stop的容器。如果是该容器,请使用docker unpause将子容器解除pause状态,指令即可继续执行。
+
+一般来说,导致该类问题的可能原因是容器对应的pid namespace由于进程残留导致无法被销毁。如果上述方法无法解决问题,可以通过借助linux工具,获取容器内残留进程,确定pid namespace中进程无法退出的原因,解决后容器就可以退出:
+
+- 获取容器pid namespace id
+
+ ```bash
+ docker inspect --format={{.State.Pid}} CONTAINERID | awk '{print "/proc/"$1"/ns/pid"}' |xargs readlink
+ ```
+
+- 获取该namespace下的线程
+
+ ```bash
+ ls -l /proc/*/task/*/ns/pid |grep -F PIDNAMESPACE_ID |awk '{print $9}' |awk -F \/ '{print $5}'
+ ```
+
+## 容器信息查询
+
+在任何情况下,容器的状态都不应该以docker命令执行是否成功返回为判断标准。如想查看容器状态,建议使用:
+
+```bash
+docker inspect
+```
+
+## 修改操作
+
+### docker exec进入容器启动多个进程的注意事项
+
+docker exec进入容器执行的第一个命令为 bash 命令时,当退出 exec 时,要保证在这次exec启动的进程都退出了,再执行exit退出,否则会导致exit退出时终端卡住的情况。如果要在exit退出时,exec中启动的进程仍然在后台保持运行,要在启动进程时加上nohup。
+
+### docker rename和docker stats \的使用冲突
+
+如果使用`docker stats ` 实时监控容器,当使用docker rename重命名容器之后,docker stats中显示的名字将还是原来的名字,不是rename后的名字。
+
+### docker rename操作restarting状态的容器可能会失败
+
+对一个处于restarting状态的容器执行rename操作的时候,docker会同步修改容器网络的相关配置。由于restarting状态的容器可能还未真正启动起来,网络是不存在的,导致rename操作报错sandbox不存在。建议rename只操作非restarting的稳定状态的容器。
+
+### docker cp
+
+1. 使用docker cp向容器中拷贝文件时,docker ps以及所有对这个容器的操作都将等待docker cp结束之后才能进行。
+2. 容器以非root用户运行,当使用docker cp命令复制主机上的一个非root权限的文件到容器时,文件在容器中的权限角色会变成root。docker cp与cp命令不同,docker cp会修改复制到容器中文件的uid和gid为root。
+
+### docker login
+
+执行docker login后,会将user/passwd经 aes(256位)加密后保存在/root/.docker/config.json,同时生成 _root_.docker/aeskey\(权限0600\),用来解密/root/.docker/config.json中的 user/passwd。目前不能定时更新aeskey,只能由用户手动删除aeskey来更新。aeskey更新后,不管是否重启过docker daemon,都需要重新login,才可以push。例如:
+
+```bash
+root@hello:~/workspace/dockerfile# docker login
+Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
+Username: example Password:
+Login Succeeded
+root@hello:~/workspace/dockerfile# docker push example/empty
+The push refers to a repository [docker.io/example/empty]
+547b6288eb33: Layer already exists
+latest: digest: sha256:99d4fb4ce6c6f850f3b39f54f8eca0bbd9e92bd326761a61f106a10454b8900b size: 524
+root@hello:~/workspace/dockerfile# rm /root/.docker/aeskey
+root@hello:~/workspace/dockerfile# docker push example/empty
+WARNING: Error loading config file:/root/.docker/config.json - illegal base64 data at input byte 0
+The push refers to a repository [docker.io/example/empty]
+547b6288eb33: Layer already exists
+errors:
+denied: requested access to the resource is denied
+unauthorized: authentication required
+root@hello:~/workspace/dockerfile# docker login
+Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
+Username: example
+Password:
+Login Succeeded
+root@hello:~/workspace/dockerfile# docker push example/empty
+The push refers to a repository [docker.io/example/empty]
+547b6288eb33: Layer already exists
+latest: digest: sha256:99d4fb4ce6c6f850f3b39f54f8eca0bbd9e92bd326761a61f106a10454b8900b size: 524
+```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-management-2.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-management-2.md
new file mode 100644
index 0000000000000000000000000000000000000000..2ef70b25fe1e0e6ef47e8eac46a4cb27cc16b6e8
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/container-management-2.md
@@ -0,0 +1,1308 @@
+# 容器管理
+
+- [容器管理](#容器管理)
+ - [总体说明](#总体说明)
+ - [attach](#attach)
+ - [commit](#commit)
+ - [cp](#cp)
+ - [create](#create)
+ - [diff](#diff)
+ - [exec](#exec)
+ - [export](#export)
+ - [inspect](#inspect)
+ - [logs](#logs)
+ - [pause/unpause](#pause-unpause)
+ - [port](#port)
+ - [ps](#ps)
+ - [rename](#rename)
+ - [restart](#restart)
+ - [rm](#rm)
+ - [run](#run)
+ - [start](#start)
+ - [stats](#stats)
+ - [stop](#stop)
+ - [top](#top)
+ - [update](#update)
+ - [wait](#wait)
+
+# 总体说明
+
+当前docker支持的子命令,按照功能划分为以下几组:
+
+
+ 功能划分
+
+ 命令
+
+ 命令功能
+
+
+
+ 主机环境相关
+
+ version
+
+ 查看docker版本信息
+
+
+ info
+
+ 查看docker系统和主机环境信息
+
+
+ 容器相关
+
+ 容器生命周期管理
+
+ create
+
+ 由image创建一个容器
+
+
+ run
+
+ 由image创建一个容器并运行
+
+
+ start
+
+ 开始一个已停止运行的容器
+
+
+ stop
+
+ 停止一个运行中的容器
+
+
+ restart
+
+ 重启一个容器
+
+
+ wait
+
+ 等待一个容器停止,并打印出退出码
+
+
+ rm
+
+ 删除一个容器
+
+
+ 容器内进程管理
+
+ pause
+
+ 暂停一个容器内的所有进程
+
+
+ unpause
+
+ 恢复一个容器内被暂停的所用进程
+
+
+ top
+
+ 查看容器内的进程
+
+
+ exec
+
+ 在容器内执行进程
+
+
+ 容器检视工具
+
+ ps
+
+ 查看运行中的容器(不加任何选项)
+
+
+ logs
+
+ 显示一个容器的日志信息
+
+
+ attach
+
+ 连接到一个容器的标准输入输出
+
+
+ inspect
+
+ 返回容器的底层信息
+
+
+ port
+
+ 列出容器与主机的端口映射
+
+
+ diff
+
+ 返回容器相对于镜像中的rootfs所作的改动
+
+
+ cp
+
+ 容器与主机之间复制文件
+
+
+ export
+
+ 将一个容器中的文件系统导出为一个tar包
+
+
+ stats
+
+ 实时查看容器的资源占用情况
+
+
+ images相关
+
+ 生成一个新image
+
+ build
+
+ 通过一个Dockerfile构建一个image
+
+
+ commit
+
+ 基于容器的rootfs创建一个新的image
+
+
+ import
+
+ 将tar包中的内容作为文件系统创建一个image
+
+
+ load
+
+ 从一个tar包中加载一个image
+
+
+ 与image仓库有关
+
+ login
+
+ 登录一个registry
+
+
+ logout
+
+ 登出一个registry
+
+
+ pull
+
+ 从registry中拉取一个image
+
+
+ push
+
+ 将一个image推送到registry中
+
+
+ search
+
+ 在registry中搜寻image
+
+
+ 与image管理有关
+
+ images
+
+ 显示系统中的image
+
+
+ history
+
+ 显示一个image的变化历史
+
+
+ rmi
+
+ 删除image
+
+
+ tag
+
+ 给image打标签
+
+
+ save
+
+ 将一个image保存到一个tar包中
+
+
+ 其他
+
+ events
+
+ 从docker daemon中获取实时事件
+
+
+ rename
+
+ 重命名容器
+
+
+
+
+
+其中有些子命令还有一些参数选项如docker run,通过docker COMMAND --help可以查看相应COMMAND命令的帮助,命令选项参考上文的命令选项约定。下面详细介绍每个命令的使用。
+
+## attach
+
+用法:**docker attach \[OPTIONS\] CONTAINER**
+
+功能:附加到一个运行着的容器
+
+选项:
+
+\--no-stdin=false 不附加STDIN
+
+\--sig-proxy=true 代理所有到容器内部的信号,不代理SIGCHLD, SIGKILL, SIGSTOP
+
+示例:
+
+```shell
+$ sudo docker attach attach_test
+root@2988b8658669:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
+```
+
+## commit
+
+用法:**docker commit \[OPTIONS\] CONTAINER \[REPOSITORY\[:TAG\]\]**
+
+功能:由一个容器创建一个新的image
+
+选项:
+
+-a, \--author="" 指定作者
+
+-m, \--message="" 提交的信息
+
+-p, \--pause=true 在提交过程中暂停容器
+
+示例:
+
+运行一个容器,然后将这个容器提交成一个新的image
+
+```shell
+$ sudo docker commit test busybox:test
+sha256:be4672959e8bd8a4291fbdd9e99be932912fe80b062fba3c9b16ee83720c33e1
+
+$ sudo docker images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox latest e02e811dd08f 2 years ago 1.09MB
+```
+
+## cp
+
+用法:docker cp \[OPTIONS\] CONTAINER:SRC\_PATH DEST\_PATH|-
+
+docker cp \[OPTIONS\] SRC\_PATH|- CONTAINER:DEST\_PATH
+
+功能:从指定的容器内的一个路径复制文件或文件夹到主机的指定路径中,或者把主机的文件或者文件夹拷贝到容器内。
+
+注意:docker cp不支持容器内/proc,/sys,/dev,/tmp等虚拟文件系统以及用户在容器内自行挂载的文件系统内的文件拷贝。
+
+选项:
+
+-a, \--archive 将拷贝到容器的文件属主设置为容器运行用户(\--user)
+
+-L, \--follow-link 解析并跟踪文件的符号链接
+
+示例:
+
+复制registry容器中/test目录到主机的/home/aaa目录中
+
+```shell
+$ sudo docker cp registry:/test /home/aaa
+```
+
+## create
+
+用法:**docker create \[OPTIONS\] IMAGE \[COMMAND\] \[ARG...\]**
+
+功能:使用image创建一个新的容器,并将返回一个容器的ID,创建之后的容器用docker start命令启动,OPTIONS用于创建容器时对容器进行配置,有些选项将覆盖image中对容器的配置,COMMAND指定容器启动时执行的命令。
+
+选项:
+
+**表 2** 参数说明
+
+
+ 参数
+
+ 参数含义
+
+
+
+ -a --attach=[]
+
+ 使控制台Attach到容器内进程的STDIN,STDOUT,STDERR
+
+
+ --name=""
+
+ 指定容器的名字
+
+
+ --add-host=[host:ip]
+
+ 在容器内的/etc/hosts中添加一个hostname到IP地址的映射
+ e.g. --add-host=test:10.10.10.10
+
+
+ --annotation
+
+ 设置容器的annotations。例如支持native.umask选项:
+ --annotation native.umask=normal 启动的容器umask值为0022
+--annotation native.umask=secure # 启动的容器umask值为0027
+ 注意如果没有配置该参数,则使用dockerd中的umask配置。
+
+
+ --blkio-weight
+
+ blockio的相对权重,从10到1000
+
+
+ --blkio-weight-device=[]
+
+ blockio权重(设置相对权重)
+
+
+ -c, --cpu-shares=0
+
+ 容器获得主机CPU的相对权重,通过设置这个选项获得更高的优先级,默认所有的容器都是获得相同的CPU优先权。
+
+
+ --cap-add=[]
+
+ 添加Linux权能
+
+
+ --cap-drop=[]
+
+ 清除Linux权能
+
+
+ --cgroup-parent
+
+ 为容器设置cgroup父目录
+
+
+ --cidfile=""
+
+ 将容器的ID写到指定的文件中
+ e.g. --cidfile=/home/cidfile-test 将该容器的ID写入到/home/cidfile-test中
+
+
+ --cpu-period
+
+ 设置CFS(完全公平调度策略)进程的CPU周期。
+ 缺省值为100ms;一般--cpu-period参数和--cpu-quota是配合使用的,比如--cpu-period=50000 --cpu-quota=25000,意味着如果有1个CPU,该容器可以每50ms获取到50%的CPU。
+ 使用--cpus=0.5也可达到同样的效果
+
+
+ --cpu-quota
+
+ 设置CFS(完全公平调度策略)进程的CPU配额,默认为0,即没有限制
+
+
+ --cpuset-cpus
+
+ 设置容器中进程允许运行的CPU (0-3, 0,1)。默认没有限制
+
+
+ --cpuset-mems
+
+ 设置容器中进程运行的内存节点 (0-3, 0,1),只对NUMA系统起作用
+
+
+ --device=[]
+
+ 将主机的设备添加到容器中 (e.g. --device=/dev/sdc:/dev/xvdc:rwm)
+
+
+ --dns=[]
+
+ 强制容器使用指定的dns服务器(e.g. 创建容器时指定--dns=114.114.xxx.xxx,将在容器的/etc/resolv.conf中写入nameserver 114.114.xxx.xxx并将覆盖原来的内容)
+
+
+ --dns-opt=[]
+
+ 设置DNS选项
+
+
+ --dns-search=[]
+
+ 强制容器使用指定的dns搜索域名
+
+
+ -e, --env=[]
+
+ 设置容器的环境变量
+ --env=[KERNEL_MODULES=]:
+ 在容器中插入指定模块。目前仅支持Host主机上有的模块,且容器删除后Host主机上模块仍然驻留,且容器需要同时指定--hook-spec选项。以下都是参数的合法格式:
+ KERNEL_MODULERS=
+ KERNEL_MODULERS=a
+ KERNEL_MODULERS=a,b
+ KERNEL_MODULERS=a,b,
+
+
+ --entrypoint=""
+
+ 覆盖image中原有的entrypoint,entrypoint设置容器启动时执行的命令
+
+
+ --env-file=[]
+
+ 从一个文件中读取环境变量,多个环境变量在文件中按行分割(e.g. --env-file=/home/test/env,其中env文件中存放了多个环境变量)
+
+
+ --expose=[]
+
+ 开放一个容器内部的端口,使用下文介绍的-P选项将会使开放的端口映射到主机的一个端口。
+
+
+ --group-add=[]
+
+ 指定容器添加到额外的组
+
+
+ -h, --hostname=""
+
+ 设置容器主机名
+
+
+ --health-cmd
+
+ 设置容器健康检查执行的命令
+
+
+ --health-interval
+
+ 相邻两次命令执行的间隔时间,默认 30s
+
+
+ --health-timeout
+
+ 单次检查命令执行的时间上限,超时则任务命令执行失败,默认30s
+
+
+ --health-start-period
+
+ 容器启动距离第一次执行健康检查开始的时间,默认0s
+
+
+ --health-retries
+
+ 健康检查失败最大的重试次数,默认3
+
+
+ --health-exit-on-unhealthy
+
+ 容器被检查为非健康后停止容器,默认false
+
+
+ --host-channel=[]
+
+ 设置一个通道供容器内进程与主机进行通信,格式:<host path>:<container path>:<rw/ro>:<size limit>
+
+
+ -i, --interactive=false
+
+ 设置STDIN打开即使没有attached
+
+
+ --ip
+
+ 设置容器的IPv4地址
+
+
+ --ip6
+
+ 设置容器的IPv6地址
+
+
+ --ipc
+
+ 指定容器的ipc命名空间
+
+
+ --isolation
+
+ 指定容器隔离策略
+
+
+ -l, --label=[]
+
+ 设置容器的标签
+
+
+ --label-file=[]
+
+ 从文件中获取标签
+
+
+ --link=[]
+
+ 链接到其他容器,这个选项将在容器中添加一些被链接容器IP地址和端口的环境变量及在/etc/hosts中添加一条映射(e.g. --link=name:alias)
+
+
+ --log-driver
+
+ 设置容器的日志驱动
+
+
+ --log-opt=[]
+
+ 设置日志驱动选项
+
+
+ -m, --memory=""
+
+ 设置容器的内存限制,格式<number><optional unit>, 其中 unit = b, k, m or g。该参数最小值为4m。
+
+
+ --mac-address
+
+ 设置容器的mac地址 (e.g. 92:d0:c6:0a:xx:xx)
+
+
+ --memory-reservation
+
+ 设置容器内存限制,默认与--memory一致。可认为--memory是硬限制,--memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和--memory一起使用,数值小于--memory的预设值。
+
+
+ --memory-swap
+
+ 设置普通内存和交换分区的使用总量,-1为不做限制。如果不设置,则为--memory值的2倍,即SWAP可再使用与--memory相同的内存量。
+
+
+ --memory-swappiness=-1
+
+ 设置容器使用交换内存的时机,以剩余内存百分比为度量(0-100)
+
+
+ --net="bridge"
+
+ 设置容器的网络模式,当前1.3.0版本的docker有四个模式:bridge、host、none、container:<name|id>。默认使用的是bridge。
+bridge:使用桥接模式在docker daemon启动时使用的网桥上创建一个网络栈。 host:在容器内使用主机的网络栈 none:不使用网络 container:<name|id>:重复利用另外一个容器的网络栈
+
+
+ --no-healthcheck
+
+ 设置容器不使用健康检查
+
+
+ --oom-kill-disable
+
+ 禁用OOM killer,建议如果不设置-m参数,也不要设置此参数。
+
+
+ --oom-score-adj
+
+ 调整容器的oom规则(-1000到1000)
+
+
+ -P, --publish-all=false
+
+ 将容器开放的所有端口一一映射到主机的端口,通过主机的端口可以访问容器内部,通过下文介绍的docker port命令可以查看具体容器端口和主机端口具体的映射关系。
+
+
+ -p, --publish=[]
+
+ 将容器内的一个端口映射到主机的一个端口,format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort,如果没有指定IP代表侦听主机所有网卡的访问,如果没有指定hostPort,表示自动分配主机的端口。
+
+
+ --pid
+
+ 设置容器的PID命名空间
+
+
+ --privileged=false
+
+ 给予容器额外的权限,当使用了--privileged选项,容器将可以访问主机的所有设备。
+
+
+ --restart=""
+
+ 设置容器退出时候的重启规则,当前1.3.1版本支持3个规则:
+no:当容器停止时,不重启。 on-failure:当容器退出码为非0时重启容器,这个规则可以附加最大重启次数,如on-failure:5,最多重启5次。 always:无论退出码是什么都退出。
+
+
+ --read-only
+
+ 将容器的根文件系统以只读的形式挂载
+
+
+ --security-opt=[]
+
+ 容器安全规则
+
+
+ --shm-size
+
+ /dev/shm设备的大小,缺省值是64M
+
+
+ --stop-signal=SIGTERM
+
+ 容器停止信号,默认为SIGTERM
+
+
+ -t, --tty=false
+
+ 分配一个伪终端
+
+
+ --tmpfs=[]
+
+ 挂载tmpfs目录
+
+
+ -u, --user=""
+
+ 指定用户名或者用户ID
+
+
+ --ulimit=[]
+
+ ulimit选项
+
+
+ --userns
+
+ 指定容器的user命名空间
+
+
+ -v, --volume=[]
+
+ 将主机的一个目录挂载到容器内部,或者在容器中创建一个新卷(e.g. -v /home/test:/home将主机的/home/test目录挂载到容器的/home目录下,-v /tmp 在容器中的根目录下创建tmp文件夹,该文件夹可以被其他容器用--volumes-from选项共享 )。不支持将主机目录挂载到容器/proc子目录,否则启动容器会报错。
+
+
+ --volume-driver
+
+ 设置容器的数据卷驱动,可选。
+
+
+ --volumes-from=[]
+
+ 将另外一个容器的卷挂载到本容器中,实现卷的共享(e.g. -volumes-from container_name将container_name中的卷挂载到这个容器中 )。-v和--volumes-from=[]是两个非常重要的选项用于数据的备份和热迁移。
+
+
+ -w, --workdir=""
+
+ 指定容器的工作目录,进入容器时的目录
+
+
+
+
+
+示例:
+
+创建了一个名为busybox的容器,创建之后的容器用docker start命令启动。
+
+```shell
+$ sudo docker create -ti --name=busybox busybox /bin/bash
+```
+
+## diff
+
+用法:**docker diff CONTAINER**
+
+功能:检视容器的差异,相比于容器刚创建时做了哪些改变
+
+选项:无
+
+示例:
+
+```shell
+$ sudo docker diff registry
+C /root
+A /root/.bash_history
+A /test
+```
+
+## exec
+
+### 接口原型
+
+```shell
+rpc Exec(ExecRequest) returns (ExecResponse) {}
+```
+
+### 接口描述
+
+在容器中执行命令,采用的gRPC通讯方式从CRI服务端获取url,再通过获得的url与websocket服务端建立长连接,实现与容器的交互。
+
+### 注意事项
+
+执行一条单独的命令,也能打开终端与容器交互。stdin/stdout/stderr之一必须是真的。如果tty为真,stderr必须是假的。 不支持多路复用,在这种情况下,stdout和stderr的输出将合并为单流。
+
+### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器ID
+
+
+ repeated string cmd
+
+ 待执行的命令
+
+
+ bool tty
+
+ 是否在TTY中执行命令
+
+
+ bool stdin
+
+ 是否流式标准输入
+
+
+ bool stdout
+
+ 是否流式标准输出
+
+
+ bool stderr
+
+ 是否流式输出标准错误
+
+
+
+
+
+### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ string url
+
+ exec流服务器的完全限定URL
+
+
+
+
+
+## export
+
+用法:**docker export CONTAINER**
+
+功能:将一个容器的文件系统内容以tar包导出到STDOUT
+
+选项:无
+
+示例:
+
+将名为busybox的容器的内容导出到busybox.tar包中:
+
+```shell
+$ sudo docker export busybox > busybox.tar
+$ ls
+busybox.tar
+```
+
+## inspect
+
+用法:**docker inspect \[OPTIONS\] CONTAINER|IMAGE \[CONTAINER|IMAGE...\]**
+
+功能:返回一个容器或者镜像的底层信息
+
+选项:
+
+-f, \--format="" 按照给定的格式输出信息
+
+-s, \--size 若查询类型为容器,显示该容器的总体文件大小
+
+\--type 返回指定类型的JSON格式
+
+-t, \--time=120 超时时间的秒数,若在该时间内docker inspect未执行成功,则停止等待并立即报错。默认为120秒。
+
+示例:
+
+1. 返回一个容器的信息
+
+ ```shell
+ $ sudo docker inspect busybox_test
+ [
+ {
+ "Id": "9fbb8649d5a8b6ae106bb0ac7686c40b3cbd67ec2fd1ab03e0c419a70d755577",
+ "Created": "2019-08-28T07:43:51.27745746Z",
+ "Path": "bash",
+ "Args": [],
+ "State": {
+ "Status": "running",
+ "Running": true,
+ "Paused": false,
+ "Restarting": false,
+ "OOMKilled": false,
+ "Dead": false,
+ "Pid": 64177,
+ "ExitCode": 0,
+ "Error": "",
+ "StartedAt": "2019-08-28T07:43:53.021226383Z",
+ "FinishedAt": "0001-01-01T00:00:00Z"
+ },
+ ......
+ ```
+
+2. 按照给定格式返回一个容器的指定信息,下面的例子返回busybox\_test容器IP地址
+
+ ```shell
+ $ sudo docker inspect -f {{.NetworkSettings.IPAddress}} busybox_test
+ 172.17.0.91
+ ```
+
+## logs
+
+用法:**docker logs \[OPTIONS\] CONTAINER**
+
+功能:抓取容器内的日志信息,容器可以是运行状态的也可以是停止状态的
+
+选项:
+
+-f, \--follow=false 实时打印日志信息
+
+-t, \--timestamps=false 显示日志的时间戳
+
+\--since 显示指定时间之后的日志
+
+\--tail="all" 设置显示的行数,默认显示所有
+
+示例:
+
+1. 查看jaegertracing容器的日志信息,该容器上跑了一个jaegertracing服务
+
+ ```shell
+ $ sudo docker logs jaegertracing
+ {"level":"info","ts":1566979103.3696961,"caller":"healthcheck/handler.go:99","msg":"Health Check server started","http-port":14269,"status":"unavailable"}
+ {"level":"info","ts":1566979103.3820567,"caller":"memory/factory.go:55","msg":"Memory storage configuration","configuration":{"MaxTraces":0}}
+ {"level":"info","ts":1566979103.390773,"caller":"tchannel/builder.go:94","msg":"Enabling service discovery","service":"jaeger-collector"}
+ {"level":"info","ts":1566979103.3908608,"caller":"peerlistmgr/peer_list_mgr.go:111","msg":"Registering active peer","peer":"127.0.0.1:14267"}
+ {"level":"info","ts":1566979103.3922884,"caller":"all-in-one/main.go:186","msg":"Starting agent"}
+ {"level":"info","ts":1566979103.4047635,"caller":"all-in-one/main.go:226","msg":"Starting jaeger-collector TChannel server","port":14267}
+ {"level":"info","ts":1566979103.404901,"caller":"all-in-one/main.go:236","msg":"Starting jaeger-collector HTTP server","http-port":14268}
+ {"level":"info","ts":1566979103.4577134,"caller":"all-in-one/main.go:256","msg":"Listening for Zipkin HTTP traffic","zipkin.http-port":9411}
+ ```
+
+2. 加上-f选项,实时打印jaegertracing容器的日志信息
+
+ ```shell
+ $ sudo docker logs -f jaegertracing
+ {"level":"info","ts":1566979103.3696961,"caller":"healthcheck/handler.go:99","msg":"Health Check server started","http-port":14269,"status":"unavailable"}
+ {"level":"info","ts":1566979103.3820567,"caller":"memory/factory.go:55","msg":"Memory storage configuration","configuration":{"MaxTraces":0}}
+ {"level":"info","ts":1566979103.390773,"caller":"tchannel/builder.go:94","msg":"Enabling service discovery","service":"jaeger-collector"}
+ {"level":"info","ts":1566979103.3908608,"caller":"peerlistmgr/peer_list_mgr.go:111","msg":"Registering active peer","peer":"127.0.0.1:14267"}
+ {"level":"info","ts":1566979103.3922884,"caller":"all-in-one/main.go:186","msg":"Starting agent"}
+ ```
+
+## pause-unpause
+
+用法:**docker pause CONTAINER**
+
+**docker unpause CONTAINER**
+
+功能:这两个命令是配对使用的,docker pause暂停容器内的所有进程,docker unpause恢复暂停的进程
+
+选项:无
+
+示例:
+
+本示例将演示一个跑了docker registry(docker镜像服务)服务的容器,当使用docker pause 命令暂停这个容器的进程后,使用curl命令访问该registry服务将阻塞,使用docker unpause命令将恢复registry服务,可以用curl命令访问。
+
+1. 启动一个registry容器
+
+ ```shell
+ $ sudo docker run -d --name pause_test -p 5000:5000 registry
+ ```
+
+ 此时可以用curl命令访问这个服务,请求状态码会返回200 OK。
+
+ ```shell
+ $ sudo curl -v 127.0.0.1:5000
+ ```
+
+2. 暂停这个容器内的进程
+
+ ```shell
+ $ sudo docker pause pause_test
+ ```
+
+ 此时用curl命令访问这个服务将阻塞,等待服务开启。
+
+3. 恢复运行这个容器内的进程
+
+ ```shell
+ $ sudo docker unpause pause_test
+ ```
+
+ 此时步骤2中的curl访问将恢复运行,请求状态码返回200 OK。
+
+## port
+
+用法:**docker port CONTAINER \[PRIVATE\_PORT\[/PROTO\]\]**
+
+功能:列出容器的端口映射,或者查找指定端口在主机的哪个端口
+
+选项:无
+
+示例:
+
+1. 列出容器所有的端口映射
+
+ ```shell
+ $ sudo docker port registry
+ 5000/tcp -> 0.0.0.0.:5000
+ ```
+
+2. 查找容器指定端口的映射
+
+ ```shell
+ $ sudo docker port registry 5000
+ 0.0.0.0.:5000
+ ```
+
+## ps
+
+用法:**docker ps \[OPTIONS\]**
+
+功能:根据不同的选项列出不同状态的容器,在不加任何选项的情况下,将列出正在运行的容器
+
+选项:
+
+-a, \--all=false 显示所用的容器
+
+-f, \--filter=\[\] 筛选值,可用的筛选值有:exited=容器的退出码status=\(restarting|running|paused|exited\)容器的状态码(e.g. -f status=running,列出正在运行的容器)
+
+-l, \--latest=false 列出最近创建的一个容器
+
+-n=-1 列出最近n次创建的容器
+
+\--no-trunc=false 将64位的容器ID全部显示出来,默认显示12位容器的ID
+
+-q, \--quiet=false 显示容器的ID
+
+-s, \--size=false 显示容器的大小
+
+示例:
+
+1. 列出正在运行的容器
+
+ ```shell
+ $ sudo docker ps
+ ```
+
+2. 列出所有的容器
+
+ ```shell
+ $ sudo docker ps -a
+ ```
+
+## rename
+
+用法:**docker rename OLD\_NAME NEW\_NAME**
+
+功能:重命名容器
+
+示例:
+
+示例中,用docker run创建并启动一个容器,使用docker rename对容器重命名,并查看容器名是否改变。
+
+```shell
+$ sudo docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+b15976967abb busybox:latest "bash" 3 seconds ago Up 2 seconds festive_morse
+$ sudo docker rename pedantic_euler new_name
+$ sudo docker ps
+CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
+b15976967abb busybox:latest "bash" 34 seconds ago Up 33 seconds new_name
+```
+
+## restart
+
+用法:**docker restart \[OPTIONS\] CONTAINER \[CONTAINER...\]**
+
+功能:重启一个运行中的容器
+
+选项:
+
+-t, \--time=10 在杀掉容器之前等待容器停止的秒数,如果容器已停止,就重启。默认为10秒。
+
+示例:
+
+```shell
+$ sudo docker restart busybox
+```
+
+>  **说明:**
+>
+> 容器在restart过程中,如果容器内存在D状态或Z状态的进程,可能会导致容器重启失败,这需要进一步分析导致容器内进程D状态或Z状态的原因,待容器内进程D状态或Z状态解除后,再进行容器restart操作。
+
+## rm
+
+用法:**docker rm \[OPTIONS\] CONTAINER \[CONTAINER...\]**
+
+功能:删除一个或多个容器
+
+选项:
+
+-f, \--force=false 强制删除运行中的容器
+
+-l, \--link=false 删除指定的链接,而不是底层容器
+
+-v, \--volumes=false 删除与容器关联的卷
+
+示例:
+
+1. 删除一个停止运行的容器
+
+ ```shell
+ $ sudo docker rm test
+ ```
+
+2. 删除一个正在运行的容器
+
+ ```shell
+ $ sudo docker rm -f rm_test
+ ```
+
+## run
+
+用法:**docker run \[OPTIONS\] IMAGE \[COMMAND\] \[ARG...\]**
+
+功能:该命令将由指定的image(如果指定的IMAGE不存在,则从官方镜像库中下载一个镜像)创建一个容器,并启动这个容器,并在容器中执行指定的命令。该命令集成了docker create命令、docker start命令、docker exec命令。
+
+选项:(该命令的选项与docker create命令的选项一样,请参考docker create命令选项,仅仅多了以下两个选项)
+
+\--rm=false 设置容器退出时自动删除容器
+
+-v 挂载本地目录或匿名卷到容器内。注意:当将本地目录以带有selinux的安全标签的方式挂载到容器内的同时,尽量不要同时做该本地目录的增删操作,否则该安全标签可能不生效
+
+\--sig-proxy=true 发往进程信号的代理,SIGCHLD, SIGSTOP, SIGKILL不使用代理
+
+示例:
+
+使用busybox镜像运行一个容器,在容器启动后执行/bin/sh
+
+```shell
+$ sudo docker run -ti busybox /bin/sh
+```
+
+## start
+
+用法:**docker start \[OPTIONS\] CONTAINER \[CONTAINER...\]**
+
+功能:启动一个或多个未运行容器
+
+选项:
+
+-a, \--attach=false 容器的标准输出和错误输出附加到host的STDOUT和STDERR上
+
+-i, \--interactive=false 容器的标准输入附加到host的STDIN上
+
+示例:
+
+启动一个名为busybox的容器,添加-i -a选项附加标准输入输出,容器启动后直接进入容器内部,输入exit可以退出容器。
+
+如果启动容器时不加-i -a选项,容器将在后台启动。
+
+```shell
+$ sudo docker start -i -a busybox
+```
+
+## stats
+
+用法:**docker stats \[OPTIONS\] \[CONTAINER...\]**
+
+功能:持续监控并显示指定容器(若不指定,则默认全部容器)的资源占用情况
+
+选项:
+
+-a, \--all 显示所有容器(默认仅显示运行状态的容器)
+
+\--no-stream 只显示第一次的结果,不持续监控
+
+示例:
+
+示例中,用docker run创建并启动一个容器,docker stats将输出容器的资源占用情况。
+
+```shell
+$ sudo docker stats
+CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
+2e242bcdd682 jaeger 0.00% 77.08MiB / 125.8GiB 0.06% 42B / 1.23kB 97.9MB / 0B 38
+02a06be42b2c relaxed_chandrasekhar 0.01% 8.609MiB / 125.8GiB 0.01% 0B / 0B 0B / 0B 10
+deb9e49fdef1 hardcore_montalcini 0.01% 12.79MiB / 125.8GiB 0.01% 0B / 0B 0B / 0B 9
+```
+
+## stop
+
+用法:**docker stop \[OPTIONS\] CONTAINER \[CONTAINER...\]**
+
+功能:通过向容器发送一个SIGTERM信号并在一定的时间后发送一个SIGKILL信号停止容器
+
+选项:
+
+-t, \--time=10 在杀掉容器之前等待容器退出的秒数,默认为10S
+
+示例:
+
+```shell
+$ sudo docker stop -t=15 busybox
+```
+
+## top
+
+用法:**docker top CONTAINER \[ps OPTIONS\]**
+
+功能:显示一个容器内运行的进程
+
+选项:无
+
+示例:
+
+先运行了一个名为top\_test的容器,并在其中执行了top指令
+
+```shell
+$ sudo docker top top_test
+UID PID PPID C STIME TTY TIME CMD
+root 70045 70028 0 15:52 pts/0 00:00:00 bash
+```
+
+显示的PID是容器内的进程在主机中的PID号。
+
+## update
+
+用法:**docker update \[OPTIONS\] CONTAINER \[CONTAINER...\]**
+
+功能:热变更一个或多个容器配置。
+
+选项:
+
+**表 3** 参数说明
+
+
+ 参数
+
+ 参数含义
+
+
+
+ --accel=[]
+
+ 设置容器加速器,可设置一个或多个
+
+
+ --blkio-weight
+
+ 设置容器blockio的相对权重,从10到1000
+
+
+ --cpu-shares
+
+ 设置容器获得主机CPU的相对权重,通过设置这个选项获得更高的优先级,默认所有的容器都是获得相同的CPU优先权。
+
+
+ --cpu-period
+
+ 设置CFS(完全公平调度策略)进程的CPU周期。
+ 缺省值为100ms;一般--cpu-period参数和--cpu-quota是配合使用的,比如--cpu-period=50000 --cpu-quota=25000,意味着如果有1个CPU,该容器可以每50ms获取到50%的CPU。
+
+
+ --cpu-quota
+
+ 设置CFS(完全公平调度策略)进程的CPU配额,默认为0,即没有限制
+
+
+ --cpuset-cpus
+
+ 设置容器中进程允许运行的CPU (0-3, 0,1)。默认没有限制
+
+
+ --cpuset-mems
+
+ 设置容器中进程运行运行的内存内存节点 (0-3, 0,1),只对NUMA系统起作用
+
+
+ --kernel-memory=""
+
+ 设置容器的kernerl内存限制,格式<number><optional unit>, 其中 unit = b, k, m or g
+
+
+ -m, --memory=""
+
+ 设置容器的内存限制,格式<number><optional unit>, 其中 unit = b, k, m or g。该参数最小值为4m。
+
+
+ --memory-reservation
+
+ 设置容器内存限制,默认与--memory一致。可认为--memory是硬限制,--memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和--memory一起使用,数值小于--memory的预设值。
+
+
+ --memory-swap
+
+ 设置普通内存和交换分区的使用总量,-1为不做限制。如果不设置,则为--memory值的2倍,即SWAP可再使用与--memory相同的内存量。
+
+
+ --restart=""
+
+ 设置容器退出时候的重启规则,当前1.3.1版本支持3个规则:
+no:当容器停止时,不重启。 on-failure:当容器退出码为非0时重启容器,这个规则可以附加最大重启次数,如on-failure:5,最多重启5次。 always:无论退出码是什么都退出。
+
+
+ --help
+
+ 打印help信息
+
+
+
+
+
+示例:
+
+变更一个容器名为busybox的cpu和mem配置,包括容器获得主机CPU的相对权重值为512,容器中进程允许运行的CPU核心为0,1,2,3,容器运行内存限制为512m。
+
+```shell
+$ sudo docker update --cpu-shares 512 --cpuset-cpus=0,3 --memory 512m ubuntu
+```
+
+## wait
+
+用法:**docker wait CONTAINER \[CONTAINER...\]**
+
+功能:等待一个容器停止,并打印出容器的退出码
+
+选项:无
+
+示例:
+
+先开启一个名为busybox的容器
+
+```shell
+$ sudo docker start -i -a busybox
+```
+
+执行docker wait
+
+```shell
+$ sudo docker wait busybox
+0
+```
+
+将阻塞等待busybox容器的退出,退出busybox容器后将看到打印退出码“0”。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/docker-faqs.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/docker-faqs.md
new file mode 100644
index 0000000000000000000000000000000000000000..9d7aec5ac4aced1046df0f36127fb6f7ed14317b
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/docker-faqs.md
@@ -0,0 +1,6 @@
+# Docker常见问题与解决方法
+
+## **问题1:docker v18.09.9拉起的容器挂载点相比docker v19.03.0及以后的版本多一个**
+
+原因:18.09版本的docker,默认ipcmode为shareable,该配置会多挂载一个shmpath挂载点。
+解决方法:结合实际情况修改docker配置文件中的ipcmode选项为private,或者使用新版本的docker。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/image-management-1.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/image-management-1.md
new file mode 100644
index 0000000000000000000000000000000000000000..9ed41a02793f861279b4473a076d603e71a8791f
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/image-management-1.md
@@ -0,0 +1,62 @@
+# 镜像管理
+
+- [镜像管理](#镜像管理)
+ - [创建镜像](#创建镜像)
+ - [查看镜像](#查看镜像)
+ - [删除镜像](#删除镜像)
+
+## 创建镜像
+
+docker pull、docker build、docker commit、docker import、docker load都可以创建一个新的镜像,关于这些命令的使用详见命令行参考镜像管理。
+
+### 注意事项
+
+1. 避免并发docker load和docker rmi操作。 如果同时满足如下两个条件,可能导致并发性问题:
+
+ - 某个镜像存在于系统中。
+ - 同时对该镜像进行docker rmi和docker load操作。
+
+ 所以使用时应该避免这种场景(注:所有的镜像创建操作如tag,build,load和rmi并发都有可能会导致类似的错误,应该尽量避免这类操作与rmi的并发)。
+
+2. 如果Docker操作镜像时系统掉电,可能导致镜像损坏,需要手动恢复。
+
+ 由于Docker在操作镜像(pull/load/rmi/build/combine/commit/import等)时,镜像数据的操作是异步的、镜像元数据是同步的。所以如果在镜像数据未全部刷到磁盘时掉电,可能导致镜像数据和元数据不一致。对用户的表现是镜像可以看到\(有可能是none 镜像\),但是无法启动容器,或者启动后的容器有异常。这种情况下应该先使用docker rmi删除该镜像,然后重新进行之前的操作,系统可以恢复。
+
+3. 生产环境节点应避免存留超大数量镜像,请及时清理不使用的镜像。
+
+ 镜像数目过多会导致docker image等命令执行过慢,从而导致docker build/docker commit等相关命令执行失败,并可能导致内存堆积。在生产环境中,请及时清理不再使用的镜像和中间过程镜像。
+
+4. 使用\--no-parent参数build镜像时,如果有多个build操作同时进行,并且Dockerfile里 FROM的镜像相同,则可能会残留镜像,分为以下两种情况:
+ - FROM的镜像不是完整镜像,则有可能会残留FROM的镜像运行时生成的镜像。残留的镜像名类似base\_v1.0.0-app\_v2.0.0,或者残留镜像。
+ - 如果Dockerfile里的前几条指令相同,则有可能会残留镜像。
+
+### 可能会产生none镜像场景
+
+1. none镜像是指没有tag的最顶层镜像,比如ubuntu的imageID,只有一个tag是ubuntu,如果这个tag没了,但是imageID还在,那么这个imageID就变成了none镜像。
+2. Save镜像的过程中因为要把镜像的数据导出来,所以对image进行保护,但是如果这个时候来一个删除操作,可能会untag成功,删除镜像ID失败,造成该镜像变成none镜像。
+3. 执行docker pull时掉电,或者系统panic,可能出现none镜像,为保证镜像完整性,此时可通过docker rmi 删除镜像后重新拉取。
+4. 执行docker save保存镜像时,如果指定的名字为镜像ID,则load后的镜像也没有tag,其镜像名为none。
+
+### build镜像的同时删除该镜像,有极低概率导致镜像build失败
+
+目前的build镜像的过程是通过引用计数来保护的,当build完一个镜像后,紧接着就给该镜像的引用计数加1(holdon操作),一旦holdon操作成功,该镜像就不会被删除了,但是在holdon之前,有极低的概率,还是可以删除成功,导致build镜像失败。
+
+## 查看镜像
+
+查看本地镜像列表:
+
+```bash
+docker images
+```
+
+## 删除镜像
+
+删除镜像(image处为具体镜像名):
+
+```bash
+docker rmi image
+```
+
+### 注意事项
+
+禁止使用docker rmi -f XXX删除镜像。如果使用强制删除,docker rmi会忽略过程中的错误,可能导致容器或者镜像元数据残留。如果使用普通删除,如果删除过程出错,则会删除失败,不会导致元数据残留。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/image-management-2.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/image-management-2.md
new file mode 100644
index 0000000000000000000000000000000000000000..5acdc9ae41dd904553cd3486734b2669c8e8250a
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/image-management-2.md
@@ -0,0 +1,465 @@
+# 镜像管理
+
+- [镜像管理](#镜像管理)
+ - [build](#build)
+ - [history](#history)
+ - [images](#images)
+ - [import](#import)
+ - [load](#load)
+ - [login](#login)
+ - [logout](#logout)
+ - [pull](#pull)
+ - [push](#push)
+ - [rmi](#rmi)
+ - [save](#save)
+ - [search](#search)
+ - [tag](#tag)
+
+## build
+
+用法:**docker build \[OPTIONS\] PATH | URL | -**
+
+功能:使用指定路径中的Dockerfile生成构建一个新的image
+
+选项:常用选项参数如下,更多选项可以查看docker help build
+
+**表 4** 参数说明
+
+
+ 参数
+
+ 参数含义
+
+
+
+ --force-rm=false
+
+ 即使没有构建成功也删除构建过程中生成的容器
+
+
+ --no-cache=false
+
+ 构建image的过程中不使用缓存
+
+
+ -q, --quiet=false
+
+ 禁止构建过程中产生的冗余信息
+
+
+ --rm=true
+
+ 构建成功后删除过程中生成的容器
+
+
+ -t, --tag=""
+
+ 指定构建生成的image的tag名
+
+
+ --build-arg=[]
+
+ 设置构建参数
+
+
+ --label=[]
+
+ 镜像相关参数设置,各参数意义与create类似
+
+
+ --isolation
+
+ 指定容器的隔离方法
+
+
+ --pull
+
+ 构建时总是尝试获取最新版本镜像
+
+
+
+
+
+Dockerfile介绍:
+
+Dockerfile是一个镜像的表示,可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器,所有的 Dockerfile 命令格式都是:**INSTRUCTION arguments**
+
+**FROM命令**
+
+格式:FROM 或 FROM :
+
+功能:该命令指定基本镜像,是所有Dockerfile文件的第一个命令,如果没有指定基本镜像的tag,使用默认tag名latest。
+
+**RUN命令**
+
+格式:RUN \(the command is run in a shell - \`/bin/sh -c\`\) 或者
+
+RUN \["executable", "param1", "param2" ... \] \(exec form\)
+
+功能:RUN命令会在上面FROM指定的镜像里执行指定的任何命令,然后提交\(commit\)结果,提交的镜像会在后面继续用到。RUN命令等价于:
+
+docker run image command
+
+docker commit container\_id
+
+**注释**
+
+使用\#注释
+
+**MAINTAINER命令**
+
+格式:MAINTAINER
+
+功能:命令用来指定维护者的姓名和联系方式
+
+**ENTRYPOINT命令**
+
+格式:ENTRYPOINT cmd param1 param2 ... 或者ENTRYPOINT \["cmd", "param1", "param2"...\]
+
+功能:设置在容器启动时执行命令
+
+**USER命令**
+
+格式:USER name
+
+功能:指定 memcached 的运行用户
+
+**EXPOSE命令**
+
+格式:EXPOSE \[...\]
+
+功能:开放镜像的一个或多个端口
+
+**ENV命令**
+
+格式:ENV
+
+功能:设置环境变量,设置了后,后续的RUN命令都可以使用
+
+**ADD命令**
+
+格式:ADD
+
+功能:从src复制文件到container的dest路径, 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url, 是container中的绝对路径
+
+**VOLUME命令**
+
+格式:VOLUME \[""\]
+
+功能:创建一个挂载点用于共享目录
+
+**WORKDIR命令**
+
+格式:workdir
+
+功能:配置RUN, CMD, ENTRYPOINT 命令设置当前工作路径可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令
+
+**CMD命令**
+
+格式:CMD \["executable","param1","param2"\] \(like an exec, preferred form\)
+
+CMD \["param1","param2"\] \(as default parameters to ENTRYPOINT\)
+
+CMD command param1 param2 \(as a shell\)
+
+功能:一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效
+
+**ONBUILD命令**
+
+格式:ONBUILD \[其他指令\]
+
+功能:后面跟其他指令,比如 RUN、COPY 等,这些指令,在当前镜像构建时并不会被执行,只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
+
+下面是Dockerfile的一个完整例子,该Dockerfile将构建一个安装了sshd服务的image
+
+```bash
+FROM busybox
+ENV http_proxy http://192.168.0.226:3128
+ENV https_proxy https://192.168.0.226:3128
+RUN apt-get update && apt-get install -y openssh-server
+RUN mkdir -p /var/run/sshd
+EXPOSE 22
+ENTRYPOINT /usr/sbin/sshd -D
+```
+
+示例:
+
+1. 以上文的Dockerfile构建一个image
+
+ ```bash
+ $ sudo docker build -t busybox:latest
+ ```
+
+2. 通过以下命令可以看到这个生成的image:
+
+ ```bash
+ docker images | grep busybox
+ ```
+
+## history
+
+用法:**docker history \[OPTIONS\] IMAGE**
+
+功能:显示一个image的变化历史
+
+选项:
+
+-H, \--human=true
+
+\--no-trunc=false 不对输出进行删减
+
+-q, \--quiet=false 只显示ID
+
+示例:
+
+```bash
+$ sudo docker history busybox:test
+IMAGE CREATED CREATED BY SIZE COMMENT
+be4672959e8b 15 minutes ago bash 23B
+21970dfada48 4 weeks ago 128MB Imported from -
+```
+
+## images
+
+用法:**docker images \[OPTIONS\] \[NAME\]**
+
+功能:列出存在的image,不加选项时不显示中间的image
+
+选项:
+
+-a, \--all=false 显示所有的镜像,
+
+-f, \--filter=\[\] 指定一个过滤值\(i.e. 'dangling=true'\)
+
+\--no-trunc=false 不对输出进行删减
+
+-q, \--quiet=false 只显示ID
+
+示例:
+
+```bash
+$ sudo docker images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox latest e02e811dd08f 2 years ago 1.09MB
+```
+
+## import
+
+用法:**docker import URL|- \[REPOSITORY\[:TAG\]\]**
+
+功能:把包含了一个rootfs的tar包导入为镜像。与docker export相对应。
+
+选项:无
+
+示例:
+
+从上文介绍的docker export命令时导出的busybox.tar用docker import命令生成一个新的image
+
+```bash
+$ sudo docker import busybox.tar busybox:test
+sha256:a79d8ae1240388fd3f6c49697733c8bac4d87283920defc51fb0fe4469e30a4f
+$ sudo docker images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox test a79d8ae12403 2 seconds ago 1.3MB
+```
+
+## load
+
+用法:**docker load \[OPTIONS\]**
+
+功能:把docker save出来的tar包重新加载一个镜像。与docker save相对应。
+
+选项:
+
+-i, \--input=""
+
+示例:
+
+```bash
+$ sudo docker load -i busybox.tar
+Loaded image ID: sha256:e02e811dd08fd49e7f6032625495118e63f597eb150403d02e3238af1df240ba
+$ sudo docker images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox latest e02e811dd08f 2 years ago 1.09MB
+```
+
+## login
+
+用法:**docker login \[OPTIONS\] \[SERVER\]**
+
+功能:登录到一个镜像服务库,没有指定server时,默认登录到
+
+选项:
+
+-e, \--email="" Email
+
+-p, \--password="" 密码
+
+-u, \--username="" 用户名
+
+示例:
+
+```bash
+$ sudo docker login
+```
+
+## logout
+
+用法:**docker logout \[SERVER\]**
+
+功能:从一个镜像服务器中登出,没有指定server时,默认登出
+
+选项:无
+
+示例:
+
+```bash
+$ sudo docker logout
+```
+
+## pull
+
+用法:**docker pull \[OPTIONS\] NAME\[:TAG\]**
+
+功能:从一个镜像库(官方的或私有的)中拉取一个镜像
+
+选项:
+
+-a, \--all-tags=false 下载一个镜像仓库的所有镜像(一个镜像仓库可以被打多个标签,比如一个busybox镜像库,可能有多个标签如busybox:14.04,busybox:13.10,busybox:latest等,使用-a选项后,将所有标签的busybox镜像拉取下来)
+
+示例:
+
+1. 从官方镜像库中拉取nginx镜像
+
+ ```bash
+ $ sudo docker pull nginx
+ Using default tag: latest
+ latest: Pulling from official/nginx
+ 94ed0c431eb5: Pull complete
+ 9406c100a1c3: Pull complete
+ aa74daafd50c: Pull complete
+ Digest: sha256:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3
+ Status: Downloaded newer image for nginx:latest
+ ```
+
+ 拉取镜像时会检测所依赖的层是否存在,如果存在就用本地的层。
+
+2. 从私有镜像库中拉取镜像
+
+ 从私有镜像库中拉取Fedora镜像,比如所使用的私有镜像库的地址是192.168.1.110:5000:
+
+ ```bash
+ $ sudo docker pull 192.168.1.110:5000/fedora
+ ```
+
+## push
+
+用法:**docker push NAME\[:TAG\]**
+
+功能:将一个image推送到镜像库中
+
+选项:无
+
+示例:
+
+1. 将一个image推送到私有镜像库192.168.1.110:5000中
+2. 将要推送的镜像打标签(docker tag命令将在下文介绍),本例中要推送的镜像为busybox:sshd
+
+ ```bash
+ $ sudo docker tag ubuntu:sshd 192.168.1.110:5000/busybox:sshd
+ ```
+
+3. 将打好标签的镜像推送到私有镜像库中
+
+ ```bash
+ $ sudo docker push 192.168.1.110:5000/busybox:sshd
+ ```
+
+ 推送的时候会自动检测所依赖的层在镜像库中是否已存在,如果以存在,跳过该层。
+
+## rmi
+
+用法:**docker rmi \[OPTIONS\] IMAGE \[IMAGE...\]**
+
+功能:删除一个或多个镜像,如果一个镜像在镜像库中有多个标签,删除镜像的时候只是进行untag操作,当删除的是只有一个标签的镜像时,将依次删除所依赖的层。
+
+选项:
+
+-f, \--force=false 强制删除image
+
+\--no-prune=false 不删除没有标签的父镜像
+
+示例:
+
+```bash
+$ sudo docker rmi 192.168.1.110:5000/busybox:sshd
+```
+
+## save
+
+用法:**docker save \[OPTIONS\] IMAGE \[IMAGE...\]**
+
+功能:保存一个image到一个tar包,输出默认是到STDOUT
+
+选项:
+
+-o, \--output="" 输出到文件中而不是STDOUT
+
+示例:
+
+```bash
+$ sudo docker save -o nginx.tar nginx:latest
+$ ls
+nginx.tar
+```
+
+## search
+
+用法:**docker search \[OPTIONS\] TERM**
+
+功能:在镜像库中查找特定的镜像
+
+选项:
+
+\--automated=false 显示自动构建的image
+
+\--no-trunc=false 不对输出进行删减
+
+-s, \--stars=0 只显示特定星级以上的image
+
+示例:
+
+1. 在官方镜像库中搜寻nginx
+
+ ```bash
+ $ sudo docker search nginx
+ NAME DESCRIPTION STARS OFFICIAL AUTOMATED
+ nginx Official build of Nginx. 11873 [OK]
+ jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1645 [OK]
+ richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 739 [OK]
+ linuxserver/nginx An Nginx container, brought to you by LinuxS… 74
+ bitnami/nginx Bitnami nginx Docker Image 70 [OK]
+ tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 51 [OK]
+ ```
+
+2. 在私有镜像库中搜寻busybox,在私有镜像库中搜寻时要加上私有镜像库的地址
+
+ ```bash
+ $ sudo docker search 192.168.1.110:5000/busybox
+ ```
+
+## tag
+
+用法:**docker tag \[OPTIONS\] IMAGE\[:TAG\] \[REGISTRYHOST/\]\[USERNAME/\]NAME\[:TAG\]**
+
+功能:将一个镜像打标签到一个库中
+
+选项:
+
+-f, \--force=false 如果存在相同的tag名将强制替换原来的image
+
+示例:
+
+```bash
+$ sudo docker tag busybox:latest busybox:test
+```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/installation-and-configuration-3.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/installation-and-configuration-3.md
new file mode 100644
index 0000000000000000000000000000000000000000..cfd8332516454b3139b1c2623c339264954f66a9
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/installation-and-configuration-3.md
@@ -0,0 +1,405 @@
+# 安装配置
+
+本章节主要介绍和开源容器Docker安装相关的重要配置。
+
+## 注意事项
+
+- Docker容器的安装需要使用root权限。
+- docker-engine rpm包与containerd rpm包、runc rpm包、podman rpm包不能同时安装。因为docker-engine rpm包中已经包含Docker运行所需的所有组件,其中包括containerd、runc、docker二进制,且containerd、runc和podman rpm包也分别提供了对应的二进制,所以重复安装时会出现软件包冲突。
+
+## 基本安装配置
+
+### 配置daemon参数
+
+可以通过在/etc/docker/daemon.json文件中添加配置项自定义配置参数,相关配置项以及如何使用可以通过dockerd --help查看。配置示例如下:
+
+```sh
+cat /etc/docker/daemon.json
+{
+ "debug": true,
+ "storage-driver": "overlay2",
+ "storage-opts": ["overlay2.override_kernel_check=true"]
+}
+```
+
+### daemon运行目录配置
+
+用户需要明白重新指定各种运行目录和文件(包括--graph、--exec-root等),可能会存在目录冲突,或文件属性变换,对应用的正常使用造成影响。
+
+>  **须知:**
+>
+> 用户指定的目录或文件应为docker专用,避免冲突导致的文件属性变化带来安全问题。
+
+- 以--graph为例,当我们使用/new/path/作为daemon新的Root Dir时,如果/new/path/下已经存在文件,且目录或文件名与docker需要使用的目录或文件名冲突(例如: containers、hooks、tmp等目录)时,docker可能会更新原有目录或文件的属性,包括属主、权限等为自己的属主和权限。
+
+>  **须知:**
+>
+> 从docker-17.05开始,--graph参数被标记为Deprecated,用新的参数--data-root替代。
+
+### daemon自带网络配置
+
+- Docker daemon使用--bip参数指定docker0网桥的网段之后,如果在下一次重启的时候去掉--bip参数,docker0网桥会沿用上一次的--bip配置,即使重启之前已经删除docker0网桥。原因是docker会保存网络配置并在下一次重启的时候默认恢复上一次配置。
+- Docker network create 并发创建网络的时候,可以创建具有相同名字的两个网络。原因是docker network是通过id来区分的,name只是个便于识别的别名而已,不保证唯一性。
+- Docker在桥接bridge网络模式下,Docker容器是通过宿主机上的NAT模式,建立与宿主机之外世界的通信。Docker Daemon在启动一个容器时,每在宿主机上映射一个端口都会启动一个docker-proxy进程来实现访问代理。建议用户在使用这种userland-proxy时,只映射必须的端口,减少docker-proxy进行端口映射所消耗的资源。
+
+### daemon-umask配置
+
+容器主进程和exec进程的默认umask为0022,为了满足安全性需求,避免容器受到攻击,修改runc的实现,将默认umask修改为0027。修改后others群组将无法访问新建文件或目录。
+
+docker启动容器时的默认umask值为0027,可以在dockerd启动时,使用--exec-opt native.umask=normal参数将容器启动时的umask修改为0022。
+
+>  **须知:**
+>
+> 如果docker create/run也配置了native.umask参数,则以docker create/run中的配置为准。
+
+详细的配置见[docker create](./容器管理-4.md#create)和[docker run](./容器管理-4.md#run)章节的参数说明。
+
+### daemon启动时间
+
+Docker服务由systemd管理,systemd对各个服务的启动时间有限制,如果指定时间内docker服务未能成功启动,则可能由以下原因导致:
+
+- 如果使用devicemapper且为第一次启动,docker daemon需要对该设备做文件系统初始化操作,而该操作会进行大量磁盘IO操作,在磁盘性能不佳或存在大量IO竞争时,很可能会导致docker daemon启动超时。devicemapper设备只需要初始化一次,后续docker daemon启动时不再需要重复初始化。
+- 如果当前系统资源占用太高,导致系统卡顿,系统所有的操作都会变慢,也可能会出现docker服务启动超时的情况。
+- daemon重启过程中,需要遍历并读取docker工作目录下每一个容器的配置文件、容器init层和可写层的配置,如果当前系统存在过多容器(包含created和exited的容器),并且磁盘读写性能受限,也会出现daemon遍历文件过久导致docker服务启动超时的情况。
+
+出现服务启动超时情况,建议对以下两种情况进行排查调整:
+
+- 容器编排层定期清理不需要的容器,尤其是exited的容器。
+- 结合解决方案的性能要求场景,调整编排层的清理周期和docker服务的启动时间。
+
+### 关联组件journald
+
+重启systemd-journald后需要重启docker daemon。journald通过pipe获取docker daemon的日志,如果journald服务重启,会导致该pipe被关闭,docker的日志写入操作便会触发SIGPIPE信号,该错误信号会导致docker daemon crash。由于忽略该信号影响严重,可能导致后续docker daemon的日志无法记录,因此建议用户在重启journald服务或者journald 异常后主动去重启docker daemon,保证docker日志能够被正常记录,避免daemon crash导致的状态异常。
+
+### 关联组件firewalld
+
+需要在重启或拉起firewalld之后重启docker服务,保证docker服务在firewalld之后启动。
+
+- firewalld服务启动会清空当前系统的iptables规则,所以在启动docker daemon过程中,重启firewalld可能会导致docker服务插入iptables规则失败,从而导致docker服务启动失败。
+- docker服务启动后重启firewalld服务,或者状态发生了变化(从启动到停止,或者从停止到启动),会导致docker的iptables规则被删除,创建带端口映射的容器失败。
+
+### 关联组件iptables
+
+docker使用--icc=false选项时,可以限制容器之间互通,但若os自带某些规则,可以造成限制容器之间互通失效,例如:
+
+```text
+Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
+...
+0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
+...
+0 0 DROP all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
+...
+```
+
+在Chain FORWARD中,DROP上面多出了一条ACCEPT icmp的规则,造成加了--icc=false后,容器之间也能ping通,但容器之间如果使用udp/tcp协议,对端仍然是不可达的。
+
+因此,在容器os中使用docker,如果需要使用--icc=false选项时,建议先在host上清理一下iptables相关的规则。
+
+### 关联组件audit
+
+docker支持配置audit,但不是强制的。例如:
+
+```text
+-w /var/lib/docker -k docker
+-w /etc/docker -k docker
+-w /usr/lib/systemd/system/docker.service -k docker
+-w /usr/lib/systemd/system/docker.socket -k docker
+-w /etc/sysconfig/docker -k docker
+-w /usr/bin/docker-containerd -k docker
+-w /usr/bin/docker-runc -k docker
+-w /etc/docker/daemon.json -k docker
+```
+
+配置docker的audit,好处在于可以记录更多信息便于审计,但从安全角度来看,它对防攻击并没有实质性的作用。另一方面,audit配置会导致严重的效率问题,可能导致系统卡顿,生产环境中请谨慎使用。
+
+下面以“-w /var/lib/docker -k docker”为例,演示docker audit的配置:
+
+```sh
+[root@localhost signal]# cat /etc/audit/rules.d/audit.rules | grep docker -w /var/lib/docker/ -k docker
+[root@localhost signal]# auditctl -R /etc/audit/rules.d/audit.rules | grep docker
+[root@localhost signal]# auditctl -l | grep docker -w /var/lib/docker/ -p rwxa -k docker
+```
+
+>  **说明:**
+>
+> -p \[r|w|x|a\] 和-w一起使用,观察用户对这个目录的读、写、执行或者属性变化(如时间戳变化)。这样的话,在/var/lib/docker目录下的任何文件、目录操作,都会打印日志到audit.log中,从而会有太多的日志往audit.log中记录,会严重地影响auditd, 比如内存、cpu占用等,进而影响os的运行。例如:每次执行"ls /var/lib/docker/containers"都会有类似如下日志记录到/var/log/audit/audit.log中。
+
+```text
+type=SYSCALL msg=audit(1517656451.457:8097): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=1b955b0 a2=90800 a3=0 items=1 ppid=17821 pid=1925 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts6 ses=4 comm="ls" exe="/usr/bin/ls" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="docker"type=CWD msg=audit(1517656451.457:8097): cwd="/root"type=PATH msg=audit(1517656451.457:8097): item=0 name="/var/lib/docker/containers" inode=1049112 dev=fd:00 mode=040700 ouid=0 ogid=0 rdev=00:00 obj=unconfined_u:object_r:container_var_lib_t:s0 objtype=NORMAL
+```
+
+### 安全配置seccomp
+
+在做容器网络性能测试时发现,Docker相对于原生内核namespace性能有所下降,经分析开启seccomp后,系统调用(如:sendto)不会通过system\_call\_fastpath进行,而是调用tracesys,这会带来性能大幅下降。因此,建议在有高性能要求的业务的容器场景下关闭seccomp,示例如下:
+
+```sh
+docker run -itd --security-opt seccomp=unconfined busybox:latest
+```
+
+### 禁止修改docker-daemon的私有目录
+
+不允许对Docker用的根目录(默认/var/lib/docker)和运行时目录(默认/run/docker)以及其文件作任何修改,包括在该目录下删除文件,添加文件,对目录或者文件做软/硬链接,修改文件的属性/权限,修改文件的内容等,如果确实需要做修改,后果自负。
+
+### 普通用户大量部署容器场景下的配置注意事项
+
+普通用户在OS主机上能创建的进程数的上限,例如:可以在系统中创建配置文件“/etc/security/limits.d/20-nproc.conf”限制;类似的,普通用户在容器里也能创建的进程数的上限,由容器镜像中“/etc/security/limits.d/20-nproc.conf”文件对应的值决定,如下所示:
+
+```sh
+cat /etc/security/limits.conf
+* soft nproc 4096
+```
+
+当普通用户大量部署容器,导致容器内进程过多资源不够出现报错时,需要把容器镜像“/etc/security/limits.d/20-nproc.conf”文件中如上所示的4096配置值加大。
+
+可配置的最大值请参考内核的最大能力,如下:
+
+```sh
+[root@localhost ~]# sysctl -a | grep pid_max
+kernel.pid_max = 32768
+```
+
+## 存储驱动配置
+
+本发行版docker支持overlay2和devicemapper两种存储驱动。由于overlay2较devicemapper而言,拥有更好的性能,建议用户在生产环境中优先考虑。
+
+### 配置overlay2存储驱动
+
+#### 配置方法
+
+docker默认为使用overlay2存储驱动,也可以通过如下两种方式显式指定。
+
+- 编辑/etc/docker/daemon.json,通过storage-driver字段显式指定。
+
+ ```sh
+ cat /etc/docker/daemon.json
+ {
+ "storage-driver": "overlay2"
+ }
+ ```
+
+- 编辑/etc/sysconfig/docker-storage,通过docker daemon启动参数显式指定。
+
+ ```sh
+ cat /etc/sysconfig/docker-storage
+ DOCKER_STORAGE_OPTIONS="--storage-driver=overlay2"
+ ```
+
+#### 注意事项
+
+- 部分容器生命周期管理的操作会报找不到相应的rootfs或者相关的可执行文件。
+- 如果容器的健康检查配置的是执行容器内的可执行文件,也会报错,导致容器的健康检查失败。
+
+- 如果将overlay2作为graphdriver,在容器中第一次修改镜像中的文件时,若该文件的大小大于系统剩余的空间,修改将会失败。因为即使修改很小,也要把这个文件完整的拷贝到上层,剩余空间不足导致失败。
+- overlay2文件系统相比普通文件系统天然存在一些行为差异,归纳如下:
+ - 内核版本
+
+ overlay2只兼容原生4.0以上内核,建议配合使用ext4文件系统。
+
+ - Copy-UP性能问题
+
+ 修改lower层文件会触发文件复制到upper层,其中数据块复制和fsync比较耗时。
+
+ - rename目录问题
+ - 只有源路径和目标路径都在merged层时,才允许rename系统调用,否则rename系统调用会报错-EXDEV。
+ - 内核4.10引入了redirect dir特性来修复rename问题,对应内核选项为CONFIG\_OVERLAY\_FS\_REDIRECT\_DIR。
+
+ 在使用overlay2场景下,对文件系统目录进行重命名时,如果系统配置文件/sys/module/overlay/parameters/redirect\_dir中配置的特性开关为关闭状态,则会导致使用失败;如果用户要使用相关特性,需要用户手动设置/sys/module/overlay/parameters/redirect\_dir为“Y”。
+
+ - Hard link break问题
+ - 当lower层目录中有多个硬链接,在merged层写入数据会触发Copy-UP,导致硬链接断开。
+ - 内核4.13引入了index feature来修复这个问题,对应内核选项为 CONFIG\_OVERLAY\_FS\_INDEX。注意这个选项没有前向兼容性,不支持热升级。
+
+ - st\_dev和st\_ino变化
+
+ 触发Copy-UP之后,用户只能看到merged层中的新文件,inode会变化。虽然attr和xattr可以复制,但st\_dev和st\_ino具有唯一性,不可复制。这会导致stat和ls查看 到相应的变化。
+
+ - fd变化
+
+ Copy-UP之前,以只读模式打开文件得到描述符fd1,Copy-UP之后,打开同名文件得到文件描述符fd2, 二者实际指向不同的文件。向fd2写入的数据不会在fd1中体现。
+
+#### 异常场景
+
+容器使用配置了overlay2存储驱动的过程中,可能出现挂载点被覆盖的异常情况。例如
+
+#### 异常场景-挂载点被覆盖
+
+挂载关系:在问题容器的挂载点的下面,存在一个/var/lib/docker/overlay2的挂载点:
+
+```sh
+[root@localhost ~]# mount -l | grep overlay
+overlay on /var/lib/docker/overlay2/844fd3bca8e616572935808061f009d106a8748dfd29a0a4025645457fa21785/merged type overlay (rw,relatime,seclabel,lowerdir=/var/lib/docker/overlay2/l/JL5PZQLNDCIBU3ZOG3LPPDBHIJ:/var/lib/docker/overlay2/l/ELRPYU4JJG4FDPRLZJCZZE4UO6,upperdir=/var/lib/docker/overlay2/844fd3bca8e616572935808061f009d106a8748dfd29a0a4025645457fa21785/diff,workdir=/var/lib/docker/overlay2/844fd3bca8e616572935808061f009d106a8748dfd29a0a4025645457fa21785/work)
+/dev/mapper/dm-root on /var/lib/docker/overlay2 type ext4 (rw,relatime,seclabel,data=ordered)
+```
+
+执行部分docker命令会遇到错误,比如:
+
+```sh
+[root@localhost ~]# docker rm 1348136d32
+docker rm: Error response from daemon: driver "overlay2" failed to remove root filesystem for 1348136d32: error while removing /var/lib/docker/overlay2/844fd3bca8e616572935808061f009d106a8748dfd29a0a4025645457fa21785: invalid argument
+```
+
+此时,在主机侧可以发现对应容器的rootfs找不到,但这并不意味着rootfs丢失,只是被/var/lib/docker/overlay2挂载点覆盖,业务仍然可以正常运行,不受影响。修复方案可以参考如下:
+
+- 修复方案一
+ 1. 确定当前docker所使用graphdriver:
+
+ ```sh
+ docker info | grep "Storage Driver"
+ ```
+
+ 2. 查询当前的挂载点:
+
+ ```text
+ Devicemapper: mount -l | grep devicemapper
+ Overlay2: mount -l | grep overlay2
+ ```
+
+ 输出格式为: A on B type C \(D\)
+
+ 其中,A:块设备名称或overlay,B:挂载点,C:文件系统类型,D:挂载属性。
+
+ 3. 从下往上逐一umount这些挂载点B。
+ 4. 然后全部docker restart这些容器,或者删除所有容器。
+ 5. 重启docker。
+
+ ```sh
+ systemctl restart docker
+ ```
+
+- 修复方案二
+ 1. 业务迁移
+ 2. 节点重启
+
+### 配置devicemapper存储驱动
+
+用户如果需要使用devicemapper存储驱动,可以通过如下两种方式显式指定。
+
+- 编辑/etc/docker/daemon.json,通过storage-driver字段显式指定。
+
+ ```sh
+ cat /etc/docker/daemon.json
+ {
+ "storage-driver": "devicemapper"
+ }
+ ```
+
+- 编辑/etc/sysconfig/docker-storage,通过docker daemon启动参数显式指定。
+
+ ```sh
+ cat /etc/sysconfig/docker-storage
+ DOCKER_STORAGE_OPTIONS="--storage-driver=devicemapper"
+ ```
+
+#### 注意事项
+
+- 使用devicemapper必须使用devicemapper+direct-lvm的方式,配置的方法可以参考
+- 配置devicemapper时,如果系统上没有足够的空间给thinpool做自动扩容,请禁止自动扩容功能。
+- 禁止把/etc/lvm/profile/docker-thinpool.profile中如下两个值都改成100。
+
+ ```text
+ activation {
+ thin_pool_autoextend_threshold=80
+ thin_pool_autoextend_percent=20
+ }
+ ```
+
+- 使用devicemapper时推荐加上--storage-opt dm.use\_deferred\_deletion=true --storage-opt dm.use\_deferred\_removal=true。
+- 使用devicemapper时,容器文件系统推荐使用ext4,需要在docker daemon的配置参数中加 上--storage-opt dm.fs=ext4。
+- 当graphdriver为devicemapper时,如果metadata文件损坏且不可恢复,需要人工介入恢复。禁止直接操作或篡改daemon存储devicemapper的元数据。
+- 使用devicemapper lvm时,异常掉电导致的devicemapper thinpool损坏,无法保证thinpool损坏后可以修复,也不能保证数据的完整性,需重建thinpool。
+
+docker daemon开启了user namespace特性,切换devicemapper存储池时的**注意事项**
+
+- 一般启动容器时,deviceset-metadata文件为:/var/lib/docker/devicemapper/metadata/deviceset-metadata。
+- 使用了user namespace场景下,deviceset-metadata文件使用的是:/var/lib/docker/\{userNSUID.GID\}/devicemapper/metadata/deviceset-metadata。
+- 使用devicemapper存储驱动,容器在user namespace场景和普通场景之间切换时,需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空;针对thinpool扩容或者重建的场景下,也同样的需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空,否则docker服务会重启失败。
+
+## 强制退出docker相关后台进程的影响
+
+### 信号量残留
+
+使用devicemapper作为graphdriver时,强制退出强制退出可能导致信号量残留。docker在操作dm的过程中会创建信号量,如果在释放信号量前,daemon被强制退出,可能导致该信号量无法释放,一次强制退出最多泄露一个信号量,泄露概率低。而linux系统有信号量上限限制,当信号量泄露次数达到上限值时将无法创建新的信号量,进而导致docker daemon启动失败。排查方法如下:
+
+1. 首先查看系统上残留的信号量
+
+ ```sh
+ $ ipcs
+ ------ Message Queues --------
+ key msqid owner perms used-bytes messages
+ ------ Shared Memory Segments --------
+ key shmid owner perms bytes nattch status
+ ------ Semaphore Arrays --------
+ key semid owner perms nsems
+ 0x0d4d3358 238977024 root 600 1
+ 0x0d4d0ec9 270172161 root 600 1
+ 0x0d4dc02e 281640962 root 600 1
+ ```
+
+2. 接着用dmsetup查看devicemapper创建的信号量,该信号量集合是上一步中查看到的系统信号量的子集
+
+ ```sh
+ dmsetup udevcookies
+ ```
+
+3. 最后查看内核信号量设置上限,第四个值就是当前系统的信号量使用上限
+
+ ```sh
+ # cat /proc/sys/kernel/sem
+ 250 32000 32 128
+ ```
+
+ 如果步骤1中残留的信号量数量与步骤3中看到的信号量上限相等,则是达到上限,此时docker daemon无法正常启动。可以使用下述命令增加信号量使用上限值来让docker恢复启动
+
+ ```sh
+ echo 250 32000 32 1024 > /proc/sys/kernel/sem
+ ```
+
+ 也可以手动清理devicemapper残留的信号量(下面是清理一分钟以前申请的dm相关信号量)
+
+ ```sh
+ # dmsetup udevcomplete_all 1
+ This operation will destroy all semaphores older than 1 minutes with keys that have a prefix 3405 (0xd4d).
+ Do you really want to continue? [y/n]: y
+ 0 semaphores with keys prefixed by 3405 (0xd4d) destroyed. 0 skipped.
+ ```
+
+### 网卡残留
+
+使用bridge模式启动容器的过程中,强制退出daemon可能导致网卡残留。使用bridge网络模式,当docker创建容器时,会先在host上创建一对veth,然后再把该网卡信息存到数据库中,如果在创建完成,存到docker的数据库之前,daemon被强制退出,那么该网卡无法被docker关联,下次启动也无法删除(docker本身会清理自己数据库中不用的网卡),从而造成网卡残留。
+
+### 重启容器失败
+
+容器hook耗时较长,且启动阶段遇到containerd被强制退出,再次执行容器start操作可能失败。容器启动阶段遇到containerd被强制退出,docker start操作直接返回错误;containerd被重新拉起后,上次启动可能仍处于runc create执行阶段(执行用户自定义hook,可能耗时较长),此时再次下发docker start命令启动该容器,可能提示以下错误:
+
+```text
+Error response from daemon: oci runtime error: container with id exists: xxxxxx
+```
+
+该错误是由runc create一个已经存在(创建中)的容器导致,等第一次start对应的runc操作结束后再次执行docker start便可以成功。
+
+由于hook的执行不受docker控制,这种场景下尝试回收该容器有可能导致containerd进程启动卡死(执行未知hook程序),且问题的风险可控(短期影响当前容器的创建):
+
+- 问题出现后等待第一次操作结束可以再次成功启动该容器。
+- 一般是在容器启动失败后创建新的容器,不复用已经失败的容器。
+
+综上,该问题暂时作为场景约束。
+
+### 服务无法正常重启
+
+短时间内频繁重启docker服务导致该服务无法正常重启。docker系统服务由systemd负责监控,如果docker服务在10s内重启次数超过5次,systemd服务就会监控到该异常行为,因此会禁止docker服务启动。只有等到下一个10s周期开始后,docker服务才能响应重启命令正常重启。
+
+## 系统掉电影响
+
+主机意外掉电或系统panic等场景下,由于docker daemon的状态无法及时刷新到磁盘,导致重启后docker daemon状态不正常,可能出现的问题有(包括但不限于):
+
+- 掉电前创建的容器,重启后docker ps -a看不到,该问题是因为该容器的状态文件没有刷新到磁盘,从而导致重启后daemon无法获取到该容器的状态(镜像、卷、网络等也可能会有类似问题)。
+- 掉电前某个文件正处于写入状态,尚未完全写入,重启后daemon重新加载该文件发现文件格式不正常或内容不完整,导致重启加载出错。
+- 针对掉电时会破坏docker DB的情况,在重启节点时会清理data-root下面的db文件。因此重启前创建的如下信息在重启后会被删除:
+ - network,用docker network创建的资源会在重启后清除。
+ - volume,用 docker volume创建的资源会在重启后删除。
+ - 构建缓存,构建缓存信息会在重启后删除。
+ - containerd保存的元数据,由于启动容器会重建containerd元数据,重启节点会清理containerd中保存的元数据。
+
+ >  **说明:**
+ >
+ > 用户若选择采用手动清理恢复环境的方式,可通过配置环境变量“DISABLE\_CRASH\_FILES\_DELETE=true”屏蔽daemon掉电重启时db文件清理功能。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/overview.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..546243d3a4cc7ed9aa958eff7bc7f78fc70e72a3
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/overview.md
@@ -0,0 +1,7 @@
+# Docker容器
+
+Docker是一个开源的Linux容器引擎项目, 用以实现应用的快速打包、部署和交付。Docker的英文本意是码头工人,码头工人的工作就是将商品打包到container\(集装箱\)并且搬运container、装载container。 对应到Linux中,Docker就是将app打包到container,通过container实现app在各种平台上的部署、运行。Docker通过Linux Container技术将app变成一个标准化的、可移植的、自管理的组件,从而实现应用的“一次构建,到处运行”。Docker技术特点就是:应用快速发布、部署简单、管理方便,应用密度更高。
+
+>  **说明:**
+>
+> Docker容器的安装和使用需要root权限。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-caution.gif b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-danger.gif b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-note.gif b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-notice.gif b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-tip.gif b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-warning.gif b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/statistics.md b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/statistics.md
new file mode 100644
index 0000000000000000000000000000000000000000..d688f5d71f965a0b05ab2225f0845525c4c277e2
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/DockerEngine/statistics.md
@@ -0,0 +1,97 @@
+# 统计信息
+
+## events
+
+用法:**docker events \[OPTIONS\]**
+
+功能:从docker daemon中获取实时事件
+
+选项:
+
+\--since="" 显示指定时间戳之后的事件
+
+\--until="" 显示直到指定时间戳的事件
+
+示例:
+
+该示例中,执行docker events后,用docker run创建并启动一个容器,docker events将输出create事件和start事件。
+
+```sh
+$ sudo docker events
+2019-08-28T16:23:09.338838795+08:00 container create 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (image=busybox:latest, name=eager_wu)
+2019-08-28T16:23:09.339909205+08:00 container attach 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (image=busybox:latest, name=eager_wu)
+2019-08-28T16:23:09.397717518+08:00 network connect e2e20f52662f1ee2b01545da3b02e5ec7ff9c85adf688dce89a9eb73661dedaa (container=53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e, name=bridge, type=bridge)
+2019-08-28T16:23:09.922224724+08:00 container start 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (image=busybox:latest, name=eager_wu)
+2019-08-28T16:23:09.924121158+08:00 container resize 53450588a20800d8231aa1dc4439a734e16955387efb5f259c47737dba9e2b5e (height=48, image=busybox:latest, name=eager_wu, width=210)
+```
+
+## info
+
+用法:**docker info**
+
+功能:显示docker系统级的相关信息,包括系统中的Container数量、Image数量、Image的存储驱动、容器的执行驱动、内核版本、主机操作系统版本等信息。
+
+选项:无
+
+示例:
+
+```sh
+$ sudo docker info
+Containers: 4
+ Running: 3
+ Paused: 0
+ Stopped: 1
+Images: 45
+Server Version: 18.09.0
+Storage Driver: devicemapper
+ Pool Name: docker-thinpool
+ Pool Blocksize: 524.3kB
+ Base Device Size: 10.74GB
+ Backing Filesystem: ext4
+ Udev Sync Supported: true
+ Data Space Used: 11GB
+ Data Space Total: 51GB
+ Data Space Available: 39.99GB
+ Metadata Space Used: 5.083MB
+ Metadata Space Total: 532.7MB
+ Metadata Space Available: 527.6MB
+ Thin Pool Minimum Free Space: 5.1GB
+ Deferred Removal Enabled: true
+ Deferred Deletion Enabled: true
+ Deferred Deleted Device Count: 0
+......
+```
+
+## version
+
+用法:**docker version**
+
+功能:显示docker的版本信息,包括Client版本、Server版本、Go版本、OS/Arch等信息
+
+选项:无
+
+示例:
+
+```sh
+$ sudo docker version
+Client:
+ Version: 18.09.0
+ EulerVersion: 18.09.0.48
+ API version: 1.39
+ Go version: go1.11
+ Git commit: cbf6283
+ Built: Mon Apr 1 00:00:00 2019
+ OS/Arch: linux/arm64
+ Experimental: false
+
+Server:
+ Engine:
+ Version: 18.09.0
+ EulerVersion: 18.09.0.48
+ API version: 1.39 (minimum version 1.12)
+ Go version: go1.11
+ Git commit: cbf6283
+ Built: Mon Apr 1 00:00:00 2019
+ OS/Arch: linux/arm64
+ Experimental: false
+```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/_menu.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..557ee68b66358561d792d7403ef4b16be11347b7
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/_menu.md
@@ -0,0 +1,56 @@
+---
+label: 'iSula容器引擎'
+ismanual: 'Y'
+description: '在iSula是使用C/C++实现的容器引起,具有轻、灵、巧、快的特点'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '安装、升级与卸载'
+ href: './installation-upgrade-Uninstallation.md'
+ children:
+ - label: '安装与配置'
+ href: './installation-configuration.md'
+ - label: '升级'
+ href: './upgrade-methods.md'
+ - label: '卸载'
+ href: './uninstallation.md'
+ - label: '使用指南'
+ href: './application-scenarios.md'
+ children:
+ - label: '容器管理'
+ href: './container-management.md'
+ - label: '支持CNI网络'
+ href: './interconnection-with-the-cni-network.md'
+ - label: '容器资源管理'
+ href: './container-resource-management.md'
+ - label: '特权容器'
+ href: './privileged-container.md'
+ - label: 'CRI-v1alpha2接口'
+ href: './cri.md'
+ - label: 'CRI-v1接口'
+ href: './cri-2.md'
+ - label: '镜像管理'
+ href: './image-management.md'
+ - label: '容器健康状态检查'
+ href: './checking-the-container-health-status.md'
+ - label: '查询信息'
+ href: './querying-information.md'
+ - label: '安全特性'
+ href: './security-features.md'
+ - label: '支持OCI hooks'
+ href: './supporting-oci-hooks.md'
+ - label: '本地卷管理'
+ href: './local-volume-management.md'
+ - label: 'iSulad shim v2 对接 StratoVirt'
+ href: './interconnecting-isula-shim-v2-with-stratovirt.md'
+ - label: 'iSulad支持cgroup v2'
+ href: './isulad-support-cgroup-v2.md'
+ - label: 'iSulad支持CDI'
+ href: './isulad-support-cdi.md'
+ - label: 'iSulad支持NRI'
+ href: './isulad-support-nri.md'
+ - label: '常见问题与解决方法'
+ href: './isula-faqs.md'
+ - label: '附录'
+ href: './appendix.md'
+---
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/appendix.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/appendix.md
new file mode 100644
index 0000000000000000000000000000000000000000..8347bcb6b6cdfe60e6b86d7891a937caa3d2450b
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/appendix.md
@@ -0,0 +1,885 @@
+# 附录
+
+- [附录](#附录.md)
+ - [命令行参数说明](#命令行参数说明)
+ - [CNI配置参数](#cni配置参数)
+
+## 命令行参数说明
+
+**表 1** login命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ login
+
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -p, --password
+
+ 登录镜像仓库的密码
+
+
+ --password-stdin
+
+ 从标准输入获取仓库的密码
+
+
+ -u, --username
+
+ 登录镜像仓库的用户名
+
+
+
+
+
+
+
+**表 2** logout命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ logout
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+
+
+**表 3** pull命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ pull
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+
+
+**表 4** rmi命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ rmi
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ -f, --force
+
+ 强制移除镜像
+
+
+
+
+
+
+
+**表 5** load命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ load
+
+ -H, --host (仅 isula支持)
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ -i, --input
+
+ 指定从哪里导入镜像。如果是docker类型,则为镜像压缩包路径,如果是embedded类型,则为镜像manifest路径。
+
+
+ --tag
+
+ 不使用默认的镜像名称,而是使用TAG指定的名称,type为docker类型时支持该参数
+
+
+
+
+
+
+
+**表 6** images命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ images
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ -f, --filter
+
+ 过滤出指定镜像信息
+
+
+ -q, --quit
+
+ 只显示镜像名字
+
+
+
+
+
+
+
+**表 7** inspect命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+
+ inspect
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ -f, --format
+
+ 使用模板格式化输出
+
+
+ -t, --time
+
+ 超时时间的秒数,若在该时间内inspect查询容器信息未执行成功,则停止等待并立即报错,默认为120秒,当配置小于等于0的值,表示不启用timeout机制inspect查询容器信息会一直等待,直到获取容器信息成功后返回。
+
+
+
+
+
+**表 8** tag命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ tag
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+
+
+
+
+
+**表 9** import命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ import
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+
+
+
+
+
+**表 10** export命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ export
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ -o, --output
+
+ 导出到指定文件
+
+
+
+
+
+
+
+## CNI配置参数
+
+**表 1** CNI单网络配置参数
+
+
+ 参数
+
+ 类型
+
+ 是否可选
+
+ 说明
+
+
+
+ cniVersion
+
+ string
+
+ 必选
+
+ CNI版本号,当前只支持0.3.0,0.3.1。
+
+
+ name
+
+ string
+
+ 必选
+
+ 网络名称,由用户自定义,需保证唯一。
+
+
+ type
+
+ string
+
+ 必选
+
+ 网络类型。目前支持的网络类型:
+ underlay_ipvlan
+ overlay_l2
+ underlay_l2
+ vpc-router
+ dpdk-direct
+ phy-direct
+
+
+ ipMasq
+
+ bool
+
+ 可选
+
+ 设置IP masquerade
+
+
+ ipam
+
+ 结构体
+
+ 可选
+
+ 详细定义参考IPAM参数定义
+
+
+ ipam.type
+
+ string
+
+ 可选
+
+ IPAM类型,目前支持的类型:
+ (1)underlay_l2、overlay_l2、vpc-router组网缺省值distributed_l2,且只支持distributed_l2。
+ (2)underlay_ipvlan组网,默认distributed_l2。 CCN场景只支持null、fixed;CCE和FST 5G core场景只支持null、distributed_l2。
+ (3)phy-direct、dpdk-direct组网,默认l2,可选null、distributed_l2。 FST 5G core场景只支持null、distributed_l2。
+ 说明:
+ 超出选择范围(比如host-local),Canal会自动设置为默认,不会返回错误。
+ null:不使用canal管理ip。
+ fixed:固定ip,CCN场景使用。
+ l2:目前没有场景使用。
+ distributed_l2:使用分布式小子网管理ip。
+
+
+ ipam.subnet
+
+ string
+
+ 可选
+
+ 子网信息。Canal支持的subnet mask范围为[8,29],并且要求IP地址不能为Multicast地址(如224.0.0.0/4),保留地址(240.0.0.0/4),本地link地址(169.254.0.0/16)以及本地loop地址(127.0.0.0/8)。
+
+
+ ipam.gateway
+
+ string
+
+ 可选
+
+ 网关IP
+
+
+ ipam.range-start
+
+ string
+
+ 可选
+
+ 可用的起始IP地址
+
+
+ ipam.range-end
+
+ string
+
+ 可选
+
+ 可用的结束IP地址
+
+
+ ipam.routes
+
+ 结构体
+
+ 可选
+
+ subnet列表,每个元素都是一个route字典。参考route定义.
+
+
+ ipam.routes.dst
+
+ string
+
+ 可选
+
+ 表示目的网络
+
+
+ ipam.routes.gw
+
+ string
+
+ 可选
+
+ 表示网关地址
+
+
+ dns
+
+ 结构体
+
+ 可选
+
+ 包含一些DNS的特殊值。
+
+
+ dns.nameservers
+
+ []string
+
+ 可选
+
+ nameservers
+
+
+ dns.domain
+
+ string
+
+ 可选
+
+ domain
+
+
+ dns.search
+
+ []string
+
+ 可选
+
+ search
+
+
+ dns.options
+
+ []string
+
+ 可选
+
+ 选项
+
+
+ multi_entry
+
+ int
+
+ 可选
+
+ 表示一个vnic需要的ip数量,范围0~16。对于物理直通,单个网卡最多可申请128个IP。
+
+
+ backup_mode
+
+ bool
+
+ 可选
+
+ 表示主备模式,仅用于phy-direct和dpdk-direct组网。
+
+
+ vlanID
+
+ int
+
+ 可选
+
+ 0~4095,允许PaaS直接指定。
+
+
+ vlan_inside
+
+ bool
+
+ 可选
+
+ true表示vlan功能由Node内部实现,false表示vlan在外部实现。
+
+
+ vxlanID
+
+ int
+
+ 可选
+
+ 0~16777215,允许PaaS直接指定。
+
+
+ vxlan_inside
+
+ bool
+
+ 可选
+
+ true表示vlan功能由Node内部实现,false表示vlan在外部实现。
+
+
+ action
+
+ string
+
+ 可选
+
+ 该参数只能和特殊containerID “000000000000”一起使用。
+ Create表示创建网络。
+ Delete表示删除网络。
+
+
+ args
+
+ map[string]interface{}
+
+ 可选
+
+ 主要描述键值对类型。表2
+
+
+ runtimeConfig
+
+ 结构体
+
+ 可选
+
+ 无
+
+
+ capabilities
+
+ 结构体
+
+ 可选
+
+ 无
+
+
+
+
+
+
+
+**表 2** CNI args参数表
+
+
+ 参数
+
+ 类型
+
+ 是否可选
+
+ 说明
+
+
+
+ K8S_POD_NAME
+
+ string
+
+ 可选
+
+ 申请固定IP(runtimeConfig.ican_caps.fixed_ip为true)时需要设置K8S_POD_NAME
+
+
+ K8S_POD_NAMESPACE
+
+ string
+
+ 可选
+
+ 申请固定IP(runtimeConfig.ican_caps.fixed_ip为true)时需要设置K8S_POD_NAMESPACE
+
+
+ SECURE_CONTAINER
+
+ string
+
+ 可选
+
+ 安全容器标志
+
+
+ multi_port
+
+ int
+
+ 可选
+
+ 缺省值为1,取值范围1-8。只支持phy-direct和dpdk-direct两种类型网络,指定直通网卡数量
+
+
+ phy-direct
+
+ string
+
+ 可选
+
+ 用于在创建硬直通容器网络时指定接入的网卡
+
+
+ dpdk-direct
+
+ string
+
+ 可选
+
+ 用于在创建dpdk直通容器网络时指定接入的网卡
+
+
+ tenant_id
+
+ string
+
+ 可选
+
+ 租户的ID。
+ 只支持vpc-router类型网络。
+
+
+ vpc_id
+
+ string
+
+ 可选
+
+ VPC的ID。
+ 只支持vpc-router类型网络。
+
+
+ secret_name
+
+ string
+
+ 可选
+
+ 表示k8s apiserver中保存有ak sk的对象名。
+ 只支持vpc-router类型网络
+ 参考配置VPC-Router逻辑网络
+
+
+ IP
+
+ string
+
+ 可选
+
+ 用户指定ip地址,格式“192.168.0.10”
+
+
+ K8S_POD_NETWORK_ARGS
+
+ string
+
+ 可选
+
+ 指定ip地址,格式“192.168.0.10”。若args中IP和K8S_POD_NETWORK_ARGS都不为空,以K8S_POD_NETWORK_ARGS为准。
+
+
+ INSTANCE_NAME
+
+ string
+
+ 可选
+
+ INSTANCE ID。
+ 参考支持容器固定IP
+
+
+ dist_gateway_disable
+
+ bool
+
+ 可选
+
+ true表示不创建gateway,false表示创建gateway。
+
+
+ phynet
+
+ string或[]string
+
+ 可选
+
+ 所需加入的物理平面信息,为预先定义好的物理网络名称,与SNC体系中的呼应,输入两个平面名时,支持主备平面。例如:"phy_net1" 或 ["phy_net2","phy_net3"]
+
+
+ endpoint_policies
+
+ struct
+
+ 可选
+
+ "endpoint_policies": [
+ {
+ "Type": "",
+ "ExceptionList": [
+ ""
+ ],
+ "NeedEncap": true,
+ "DestinationPrefix": ""
+ }
+ ]
+
+
+ port_map
+
+ struct
+
+ 可选
+
+ NAT类型网络中,支持容器端口发布至主机端口。
+ "port_map": [
+ {
+ "local_port": number,
+ "host_port": number,
+ "protocol": [string…]
+ }...
+ ]
+
+
+
+
+
+
+
+**表 3** CNI多网络配置参数
+
+
+ 参数
+
+ 类型
+
+ 是否可选
+
+ 说明
+
+
+
+ cniVersion
+
+ string
+
+ 必选
+
+ CNI版本号,当前只支持0.3.0,0.3.1。
+
+
+ name
+
+ string
+
+ 必选
+
+ 网络名称,由用户自定义,需保证唯一。
+
+
+ plugins
+
+ struct
+
+ 必选
+
+ 具体配置请参见表1 CNI单网络配置参数 。
+
+
+
+
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/application-scenarios.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/application-scenarios.md
new file mode 100644
index 0000000000000000000000000000000000000000..8a9147aa3754ec51b829cc39be0d568921c3c9bb
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/application-scenarios.md
@@ -0,0 +1,5 @@
+# 使用指南
+
+本章介绍iSula容器引擎的使用方法。
+> **说明:**
+>iSulad的所有使用操作均需要使用root权限。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/checking-the-container-health-status.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/checking-the-container-health-status.md
new file mode 100644
index 0000000000000000000000000000000000000000..4901650f20be00808efa0e3b27762bd86ddf75d9
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/checking-the-container-health-status.md
@@ -0,0 +1,67 @@
+# 容器健康状态检查
+
+- [容器健康状态检查](#容器健康状态检查)
+ - [场景说明](#场景说明)
+ - [配置方法](#配置方法)
+ - [检查规则](#检查规则)
+ - [使用限制](#使用限制)
+
+## 场景说明
+
+在实际的生产环境中,开发者提供的应用程序或者平台提供的服务难免存在bug,因此,一套管理系统对运行的应用程序进行周期性的健康检查和修复就是不可或缺的。容器健康检查机制便添加了用户定义的对容器进行健康检查的功能。在容器创建时配置\--health-cmd选项,在容器内部周期性地执行命令,通过命令的返回值来监测容器的健康状态。
+
+## 配置方法
+
+在容器启动时的配置:
+
+```bash
+isula run -itd --health-cmd "echo iSulad >> /tmp/health_check_file || exit 1" --health-interval 5m --health-timeout 3s --health-exit-on-unhealthy busybox bash
+```
+
+可配置的选项:
+
+- \--health-cmd,必选,在容器内执行的命令。返回值为0表示成功,非0表示失败。
+- \--health-interval,默认 30s,最大为int64上限(纳秒),自定义配置最小值1s,相邻两次命令执行的间隔时间(注:入参0s时视为default)。
+- \--health-timeout,默认 30s,最大为int64上限(纳秒),自定义配置最小值1s,单次检查命令执行的时间上限,超时则任务命令执行失败(注:入参0s时视为default)。
+- \--health-start-period,默认 0s,最大为int64上限(纳秒),自定义配置最小值1s,容器初始化时间。
+- \--health-retries,默认 3,最大为int32上限,健康检查失败最大的重试次数。
+- \--health-exit-on-unhealthy,默认false,检测到容器非健康时是否杀死容器。
+
+## 检查规则
+
+1. 容器启动后,容器状态中显示health:starting。
+2. 经过start-period时间后开始,以interval为间隔周期性在容器中执行CMD。即:当一次命令执行完毕后,经过interval时间,执行下一次命令。
+3. 若CMD命令在timeout限制的时间内执行完毕,并且返回值为0,则视为一次检查成功。否则视为一次检查失败。检查成功后,容器状态变为health:healthy。
+4. 若CMD命令连续retries次检查失败,则容器状态变为health:unhealthy。失败后容器也会继续进行健康检查。
+5. 容器状态为health:unhealthy时,任意一次检查成功会使得容器状态变为health:healthy。
+6. 设置\--exit-on-unhealthy的情况下,如果容器因为非被杀死退出(退出返回值137)后,健康检查只有容器在重新启动后才会继续生效。
+7. CMD执行完毕或超时时,iSulad daemon会将这次检查的起始时间、返回值和标准输出记录到容器的配置文件中。最多记录5条。此外,容器的配置文件中还存储着健康检查的相关参数。
+8. 运行中的容器的健康检查状态也会被写入容器配置中。通过isula inspect可以看到。
+
+```conf
+"Health": {
+ "Status": "healthy",
+ "FailingStreak": 0,
+ "Log": [
+ {
+ "Start": "2018-03-07T07:44:15.481414707-05:00",
+ "End": "2018-03-07T07:44:15.556908311-05:00",
+ "ExitCode": 0,
+ "Output": ""
+ },
+ {
+ "Start": "2018-03-07T07:44:18.557297462-05:00",
+ "End": "2018-03-07T07:44:18.63035891-05:00",
+ "ExitCode": 0,
+ "Output": ""
+ },
+ ......
+}
+```
+
+## 使用限制
+
+- 容器内健康检查的状态信息最多保存5条。会保存最后得到的5条记录。
+- 容器启动时若健康检查相关参数配置为0,则按照缺省值处理。
+- 带有健康检查配置的容器启动后,若iSulad daemon退出,则健康检查不会执行。iSulad daemon再次启动后,正在运行且带有健康检查配置的容器其健康状态会变为starting。之后检查规则同上。
+- 如果健康检查从第一次开始便一直失败,其状态保持与之前一致(starting),直到达到指定失败次数(--health-retries)后变为unhealthy,或者检查成功后变为healthy。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/container-management.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/container-management.md
new file mode 100644
index 0000000000000000000000000000000000000000..fc891ee4a8ccb45f32fad97630dfadb1b2601338
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/container-management.md
@@ -0,0 +1,2476 @@
+# 容器管理
+
+## 创建容器
+
+### 描述
+
+isula create 命令用于创建一个新的容器。容器引擎会使用指定的容器镜像创建容器读写层,或者使用指定的本地rootfs作为容器的运行环境。创建完成后,会将容器的ID输出到标准输出,后续可以使用isula start 命令启动该容器。新创建的容器状态为**inited**状态。
+
+### 用法
+
+```bash
+isula create [OPTIONS] IMAGE [COMMAND] [ARG...]
+```
+
+### 参数
+
+create命令支持参数参考下表。
+
+**表 1** create命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ create
+
+
+ --add-host
+
+ 添加自定义主机到IP的映射(host:ip)
+
+
+ --annotation
+
+ 设置容器的annotations。例如支持native.umask选项:
+ --annotation native.umask=normal # 启动的容器umask值为0022
+--annotation native.umask=secure # 启动的容器umask值为0027
+ 注意如果没有配置该参数,则使用isulad中的umask配置。
+
+
+ --blkio-weight
+
+ Block IO(相对权重),在10和1000之间,或0禁用(默认为0)
+
+
+ --blkio-weight-device
+
+ Block IO权重(相对设备权重),格式为:DEVICE_NAME: weight,权重值在10到1000之间,或0表示禁用(默认0)
+
+
+ --cap-add
+
+ 添加Linux权限功能
+
+
+ --cap-drop
+
+ 删除Linux 权限功能
+
+
+ --cgroup-parent
+
+ 指定容器cgroup父路径
+
+
+ --cpu-period
+
+ 限制CPU CFS(完全公平调度器)的期限
+
+
+ --cpu-quota
+
+ 限制CPU CFS(完全公平调度器)的配额
+
+
+ --cpu-rt-period
+
+ 限制CPU实时周期(以微秒为单位)
+
+
+ --cpu-rt-runtime
+
+ 限制CPU实时运行时间(以微秒为单位)
+
+
+ --cpu-shares
+
+ CPU份额(相对权重)
+
+
+ --cpus
+
+ CPU数量
+
+
+ --cpuset-cpus
+
+ 允许执行的CPU(e.g. 0-3,0,1)
+
+
+ --cpuset-mems
+
+ 允许执行的内存(0-3,0,1)
+
+
+ --device
+
+ 为容器添加一个主机设备
+
+
+ --device-cgroup-rule
+
+ 向cgroup允许的设备列表中添加一条规则
+
+
+ --device-read-bps
+
+ 从设备限制读取速率(每秒字节数)
+
+
+ --device-read-iops
+
+ 从设备限制读取速率(每秒IO)
+
+
+ --device-write-bps
+
+ 限制设备的写入速率(每秒字节数)
+
+
+ --device-write-iops
+
+ 限制写入到设备的速率(IO每秒)
+
+
+ --dns
+
+ 添加DNS服务器
+
+
+ --dns-opt
+
+ 添加DNS选项
+
+
+ --dns-search
+
+ 设定容器的搜索域
+
+
+ --entrypoint
+
+ 启动容器时要运行的入口点
+
+
+ -e, --env
+
+ 设置环境变量
+
+
+ --env-file
+
+ 通过文件配置环境变量
+
+
+ --env-target-file
+
+ 将环境变量导出到rootfs中的目标文件路径
+
+
+ --external-rootfs=PATH
+
+ 指定一个不由iSulad管理的rootfs(可以为文件夹或块设备)给容器
+
+
+ --files-limit
+
+ 调整容器内能够打开的文件句柄数(-1表示不限制)
+
+
+ --group-add=[]
+
+ 指定额外的用户组添加到容器
+
+
+ --help
+
+ 打印帮助信息
+
+
+ --health-cmd
+
+ 在容器内执行的命令
+
+
+ --health-exit-on-unhealthy
+
+ 检测到容器非健康时是否杀死容器
+
+
+ --health-interval
+
+ 相邻两次命令执行的间隔时间
+
+
+ --health-retries
+
+ 健康检查失败最大的重试次数
+
+
+ --health-start-period
+
+ 容器初始化时间
+
+
+ --health-timeout
+
+ 单次检查命令执行的时间上限
+
+
+ --hook-spec
+
+ 钩子配置文件
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --host-channel
+
+ 在主机和容器之间创建共享内存
+
+
+ -h, --hostname
+
+ 容器主机名称
+
+
+ --hugetlb-limit=[]
+
+ 大页文件限制,例如:--hugetlb-limit 2MB:32MB
+
+
+ -i, --interactive
+
+ 即使没有连接到容器的标准输入,也要保持容器的标准输入打开
+
+
+ --ipc
+
+ IPC命名空间使用
+
+
+ --kernel-memory
+
+ 内核内存限制
+
+
+ -l,--label
+
+ 为容器设置标签
+
+
+ --lablel-file
+
+ 通过文件设置容器标签
+
+
+ --log-driver
+
+ 记录容器的驱动程序
+
+
+ --log-opt=[]
+
+ 日志驱动程序选项,默认禁用记录容器串口日志功能,可以通过"--log-opt disable-log=false"来开启。
+
+
+ -m, --memory
+
+ 内存限制
+
+
+ --memory-reservation
+
+ 设置容器内存限制,默认与--memory一致。可认为--memory是硬限制,--memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和--memory一起使用,数值小于--memory的预设值,最小设置为4MB。
+
+
+ --memory-swap
+
+ 正整数,内存 + 交换空间,-1 表示不限制
+
+
+ --memory-swappiness
+
+ 正整数,swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间,缺省值为-1,表示使用系统缺省值。
+
+
+ --mount
+
+ 挂载主机目录/卷/文件系统到容器中
+
+
+ --name=NAME
+
+ 容器名
+
+
+ --net=none
+
+ 容器连接到网络
+
+
+ --no-healthcheck
+
+ 禁用健康检查配置
+
+
+ --ns-change-opt
+
+ 系统容器的命名空间内核参数选项
+
+
+ --oom-kill-disable
+
+ 禁用OOM
+
+
+ --oom-score-adj
+
+ 调整主机的OOM偏好设置(-1000至1000)
+
+
+ --pid
+
+ 要使用的PID命名空间
+
+
+ --pids-limit
+
+ 调整容器内能够执行的进程数(-1表示不限制)
+
+
+ --privileged
+
+ 给予容器扩展的特权
+
+
+ --pull
+
+ 运行前拉取镜像
+
+
+ -R, --runtime
+
+ 容器运行时,参数支持"lcr",忽略大小写,因此"LCR"和"lcr"是等价的
+
+
+ --read-only
+
+ 设置容器的根文件系统为只读
+
+
+ --restart
+
+ 当容器退出时重启策略
+ 系统容器支持--restart on-reboot
+
+
+ --security-opt
+
+ 安全选项
+
+
+ --shm-size
+
+ /dev/shm的大小,缺省值为64MB
+
+
+ --stop-signal
+
+ 信号停止容器,默认情况下为SIGTERM
+
+
+ --storage-opt
+
+ 配置容器的存储驱动选项
+
+
+ --sysctl
+
+ 设置sysctl选项
+
+
+ --system-container
+
+ 启动系统容器
+
+
+ --tmpfs
+
+ 挂载tmpfs目录
+
+
+ -t, --tty
+
+ 分配伪终端
+
+
+ --ulimit
+
+ 为容器设置ulimit限制
+
+
+ -u, --user
+
+ 用户名或UID,格式[<name|uid>][:<group|gid>]
+
+
+ --user-remap
+
+ 映射用户到容器(用于系统容器)
+
+
+ --userns
+
+ 启用'user-remap'选项时,为容器设置用户命令空间
+
+
+ --uts
+
+ 设置PID namespace
+
+
+ -v, --volume=[]
+
+ 挂载一个卷
+
+
+ --volumes-from=[]
+
+ 使用指定的容器的挂载配置
+
+
+ --workdir
+
+ 设置容器内的工作目录
+
+
+
+
+
+### 约束限制
+
+- 使用--user或--group-add参数,在容器启动阶段校验user或group时,容器如果使用的是OCI镜像,是从镜像的真实rootfs的etc/passwd和etc/group文件中校验,如果使用的是rootfs文件夹或块设备作为容器的rootfs,则校验的是host中的etc/passwd和etc/group文件;查找时使用的rootfs会忽略-v 和--mount等挂载参数,意味着使用这些参数尝试覆盖etc/passwd和etc/group两个文件时,在查找阶段不生效,只在容器真正启动时生效。生成的配置保存在"iSulad根目录/engine/容器ID/start\_generate\_config.json",文件格式如下:
+
+ ```conf
+ {
+ "uid": 0,
+ "gid": 8,
+ "additionalGids": [
+ 1234,
+ 8
+ ]
+ }
+ ```
+
+### 示例
+
+创建一个新容器
+
+```bash
+# isula create busybox
+fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+# isula ps -a
+STATUS PID IMAGE COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME ID NAMES
+inited - busybox "sh" 0 0 - - lcr fd7376591a9c fd7376591a9c4521...
+```
+
+## 启动容器
+
+### 描述
+
+isula start命令用于启动一个或多个容器。
+
+### 用法
+
+```bash
+isula start [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+start命令支持参数参考下表。
+
+**表 1** start命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ start
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -a, --attach
+
+ 连接到容器的STDOUT和STDERR
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+### 示例
+
+启动一个新容器
+
+```bash
+# isula start fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+```
+
+## 运行容器
+
+### 描述
+
+isula run命令命令用于创建一个新的容器。会使用指定的容器镜像创建容器读写层,并且为运行指定的命令做好准备。创建完成后,使用指定的命令启动该容器。run命令相当于create然后start容器。
+
+### 用法
+
+```bash
+isula run [OPTIONS] ROOTFS|IMAGE [COMMAND] [ARG...]
+```
+
+### 参数
+
+run命令支持参数参考下表。
+
+**表 1** run命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ run
+
+ --annotation
+
+ 设置容器的annotations。例如支持native.umask选项:
+ --annotation native.umask=normal # 启动的容器umask值为0022
+--annotation native.umask=secure # 启动的容器umask值为0027
+ 注意如果没有配置该参数,则使用isulad中的umask配置。
+
+
+ --add-host
+
+ 添加自定义主机到IP的映射(host:ip)
+
+
+ --blkio-weight
+
+ Block IO(相对权重),在10和1000之间,或0禁用(默认为0)
+
+
+ --blkio-weight-device
+
+ Block IO权重(相对设备权重),格式为:DEVICE_NAME: weight,权重值在10到1000之间,或0表示禁用(默认0)
+
+
+ --cap-add
+
+ 添加Linux功能
+
+
+ --cap-drop
+
+ 删除Linux功能
+
+
+ --cgroup-parent
+
+ 指定容器cgroup父路径
+
+
+ --cpu-period
+
+ 限制CPU CFS(完全公平调度器)的期限
+
+
+ --cpu-quota
+
+ 限制CPU CFS(完全公平调度器)的配额
+
+
+ --cpu-rt-period
+
+ 限制CPU实时周期(以微秒为单位)
+
+
+ --cpu-rt-runtime
+
+ 限制CPU实时运行时间(以微秒为单位)
+
+
+ --cpu-shares
+
+ CPU份额(相对权重)
+
+
+ --cpus
+
+ CPU数量
+
+
+ --cpuset-cpus
+
+ 允许执行的CPU(e.g. 0-3,0,1)
+
+
+ --cpuset-mems
+
+ 允许执行的内存(0-3,0,1)
+
+
+ -d, --detach
+
+ 后台运行容器并打印容器ID
+
+
+ --device=[]
+
+ 为容器添加一个主机设备
+
+
+ --device-cgroup-rule
+
+ 向cgroup允许的设备列表中添加一条规则
+
+
+ --device-read-bps
+
+ 从设备限制读取速率(每秒字节数)
+
+
+ --device-read-iops
+
+ 从设备限制读取速率(每秒IO)
+
+
+ --device-write-bps
+
+ 限制设备的写入速率(每秒字节数)
+
+
+ --device-write-iops
+
+ 限制写入到设备的速率(IO每秒)
+
+
+ --dns
+
+ 添加DNS服务器
+
+
+ --dns-opt
+
+ 添加DNS选项
+
+
+ --dns-search
+
+ 设定容器的搜索域
+
+
+ --entrypoint
+
+ 启动容器时要运行的入口点
+
+
+ -e, --env
+
+ 设置环境变量
+
+
+ --env-file
+
+ 通过文件配置环境变量
+
+
+ --env-target-file
+
+ 将环境变量导出到rootfs中的目标文件路径
+
+
+ --external-rootfs=PATH
+
+ 指定一个不由iSulad管理的rootfs(可以为文件夹或块设备)给容器
+
+
+ --files-limit
+
+ 调整容器内能够打开的文件句柄数(-1表示不限制)
+
+
+ --group-add=[]
+
+ 指定额外的用户组添加到容器
+
+
+ --help
+
+ 打印帮助信息
+
+
+ --health-cmd
+
+ 在容器内执行的命令
+
+
+ --health-exit-on-unhealthy
+
+ 检测到容器非健康时是否杀死容器
+
+
+ --health-interval
+
+ 相邻两次命令执行的间隔时间
+
+
+ --health-retries
+
+ 健康检查失败最大的重试次数
+
+
+ --health-start-period
+
+ 容器初始化时间
+
+
+ --health-timeout
+
+ 单次检查命令执行的时间上限
+
+
+ --hook-spec
+
+ 钩子配置文件
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ --host-channel
+
+ 在主机和容器之间创建共享内存
+
+
+ -h, --hostname
+
+ 容器主机名称
+
+
+ --hugetlb-limit=[]
+
+ 大页文件限制,例如:--hugetlb-limit 2MB:32MB
+
+
+ -i, --interactive
+
+ 即使没有连接到容器的标准输入,也要保持容器的标准输入打开
+
+
+ --ipc
+
+ IPC命名空间使用
+
+
+ --kernel-memory
+
+ 内核内存限制
+
+
+ -l,--label
+
+ 为容器设置标签
+
+
+ --lablel-file
+
+ 通过文件设置容器标签
+
+
+ --log-driver
+
+ 设置日志驱动,支持syslog和json-file。
+
+
+ --log-opt=[]
+
+ 日志驱动程序选项,默认禁用记录容器串口日志功能,可以通过"--log-opt disable-log=false"来开启。
+
+
+ -m, --memory
+
+ 内存限制
+
+
+ --memory-reservation
+
+ 设置容器内存限制,默认与--memory一致。可认为--memory是硬限制,--memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和--memory一起使用,数值小于--memory的预设值,最小设置为4MB。
+
+
+ --memory-swap
+
+ 正整数,内存 + 交换空间,-1 表示不限制
+
+
+ --memory-swappiness
+
+ 正整数,swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间,缺省值为-1,表示使用系统缺省值。
+
+
+ --mount
+
+ 挂载主机目录到容器中
+
+
+ --name=NAME
+
+ 容器名
+
+
+ --net=none
+
+ 容器连接到网络
+
+
+ --no-healthcheck
+
+ 禁用健康检查配置
+
+
+ --ns-change-opt
+
+ 系统容器的命名空间内核参数选项
+
+
+ --oom-kill-disable
+
+ 禁用OOM
+
+
+ --oom-score-adj
+
+ 调整主机的OOM偏好设置(-1000至1000)
+
+
+ --pid
+
+ 要使用的PID命名空间
+
+
+ --pids-limit
+
+ 调整容器内能够执行的进程数(-1表示不限制)
+
+
+ --privileged
+
+ 给予容器扩展的特权
+
+
+ --pull
+
+ 运行前拉取镜像
+
+
+ -R, --runtime
+
+ 容器运行时,参数支持"lcr",忽略大小写,因此"LCR"和"lcr"是等价的
+
+
+ --read-only
+
+ 设置容器的根文件系统为只读
+
+
+ --restart
+
+ 当容器退出时重启策略
+ 系统容器支持--restart on-reboot
+
+
+ --rm
+
+ 当容器退出时自动清理容器
+
+
+ --security-opt
+
+ 安全选项
+
+
+ --shm-size
+
+ /dev/shm的大小,缺省值为64MB
+
+
+ --stop-signal
+
+ 信号停止容器,默认情况下为SIGTERM
+
+
+ --storage-opt
+
+ 配置容器的存储驱动选项
+
+
+ --sysctl
+
+ 设置sysctl选项
+
+
+ --system-container
+
+ 启动系统容器
+
+
+ --tmpfs
+
+ 挂载tmpfs目录
+
+
+ -t, --tty
+
+ 分配伪终端
+
+
+ --ulimit
+
+ 为容器设置ulimit限制
+
+
+ -u, --user
+
+ 用户名或UID,格式[<name|uid>][:<group|gid>]
+
+
+ --user-remap
+
+ 映射用户到容器(用于系统容器)
+
+
+ --userns
+
+ 启用'user-remap'选项时,为容器设置用户命令空间
+
+
+ --uts
+
+ 设置PID namespace
+
+
+ -v, --volume=[]
+
+ 挂载一个卷
+
+
+ --volumes-from=[]
+
+ 使用指定的容器的挂载配置
+
+
+ --workdir
+
+ 设置容器内的工作目录
+
+
+
+
+
+### 约束限制
+
+- 容器父进程进程退出时,则对应的容器也自动退出。
+- 创建普通容器时父进程不能为init,因为普通容器的权限不够,导致容器可以创建成功,但是attach进去的时候会卡住。
+- 运行容器时,不指定--net,默认hostname为**localhost**。
+- 使用--files-limit参数传入一个很小的值,如1时,启动容器时,iSulad创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时容器进程已经打开超过1个句柄,因而写入报错导致启动失败启动容器会失败。
+- --mount参数和--volume参数同时存在时,如果目的路径有冲突,则--mount会在--volume之后挂载\(即将--volume中的挂载点覆盖掉\)。
+
+ 备注:轻量级容器的参数中type支持bind或squashfs,当type=squashfs时,src是镜像的路径;原生docker的参数type支持bind、volume、tmpfs。
+
+- restart重启策略不支持unless-stopped。
+- 以下三种情况与docker 返回值不一致,docker返回127,轻量级容器返回125
+
+ --device参数指定主机设备为不存在的设备
+
+ --hook-spec参数指定不存在的hook json文件
+
+ --entrypoint 参数指定不存在的入口参数
+
+- 使用--volume参数时,由于容器启动时会对/dev/ptmx设备进行删除重建,因此请勿将/dev目录挂载至容器/dev目录,应使用--device对/dev下的设备在容器中进行挂载
+- 使用-it参数时,由于容器启动时会对/dev/ptmx设备进行删除重建,因此请勿将/dev目录挂载至容器/dev目录,应使用--device对/dev下的设备再容器中进行挂载。
+- 禁止使用echo的方式向run命令的stdin输入数据,会导致客户端卡死。应该直接将echo的值作为命令行参数传给容器
+
+ ```bash
+ # echo ls | isula run -i busybox /bin/sh
+
+
+ ^C
+ #
+ ```
+
+ 上述命令出现客户端卡死现象,这是由于上述命令相当于往stdin输入ls,随后EOF被读取,客户端不再发送数据,等待服务端退出,但是服务端无法区分客户端是否需要继续发送数据,因而服务端卡在read数据上,最终导致双方均卡死。
+
+ 正确的执行方式为:
+
+ ```bash
+ # isula run -i busybox ls
+ bin
+ dev
+ etc
+ home
+ proc
+ root
+ sys
+ tmp
+ usr
+ var
+ #
+ ```
+
+- 使用host的根目录(/)作为容器的文件系统,那么在挂载路径时,如果有如下情况
+
+ **表 2** 挂载情况
+
+
+ Host 路径(source)
+
+ 容器路径(dest )
+
+
+
+ /home/test1
+
+ /mnt/
+
+
+ /home/test2
+
+ /mnt/abc
+
+
+
+
+
+ >  **须知:**
+ >
+ > 第一种情况,先挂载/home/test1,然后挂载/home/test2,这种情况会导致/home/test1的内容覆盖掉原来/mnt下面的内容,这样可能导致/mnt下面不存在abc目录,这样会导致挂载/home/test2到/mnt/abc失败。
+ > 第二种情况,先挂载/home/test2,然后挂载/home/test1。这种情况,第二次的挂载会把/mnt的内容替换为/home/test1的内容,这样第一次挂载的/home/test2到/mnt/abc的内容就看不到了。
+ > 因此,不支持第一种使用方式;第二种使用用户需要了解这种数据无法访问的风险
+
+- 请谨慎配置/sys和/proc目录可写。/sys和/proc目录包含了linux维护内核参数、设备管理的接口,容器中配置该目录可写可能会导致容器逃逸。
+- 请谨慎配置容器与host共享namespace。比如—pid,--ipc, --uts,--net配置该参数为容器和host共享namespace空间,容器和host的namespace隔离没有了,在容器中可对host进行攻击。比如,使用—pid 和host共享pid namespace,容器中可以看到host上的进程pid号,可以随意杀死host的进程。
+- 请谨慎配置使用--device、-v 等可以挂载主机资源的参数,请勿将host的敏感目录或者设备,映射到容器中,以防止敏感信息泄漏。
+- 请谨慎使用--privileged选项启动容器,--privileged选项会导致容器权限过大,影响宿主机配置。
+
+ >  **须知:**
+ >
+ > 高并发场景(并发启动200容器)下,glibc的内存管理机制会导致内存空洞以及虚拟内存较大(例如10GB)的问题。该问题是高并发场景下glibc内存管理机制的限制,而不是内存泄露,不会导致内存消耗无限增大。可以通过设置MALLOC\_ARENA\_MAX环境变量来减少虚拟内存的问题,而且可以增大减少物理内存的概率。但是这个环境变量会导致iSulad的并发性能下降,需要用户根据实际情况做配置。
+ >
+ > 参考实践情况,平衡性能和内存,可以设置MALLOC_ARENA_MAX为4。(在arm64服务器上面对iSulad的性能影响在10%以内)
+ > 配置方法:
+ > 1. 手动启动iSulad的场景,可以直接export MALLOC_ARENA_MAX=4,然后再启动iSulad即可。
+ > 2. systemd管理iSulad的场景,可以修改/etc/sysconfig/iSulad,增加一条MALLOC_ARENA_MAX=4即可。
+
+### 示例
+
+运行一个新容器
+
+```bash
+# isula run -itd busybox
+9c2c13b6c35f132f49fb7ffad24f9e673a07b7fe9918f97c0591f0d7014c713b
+```
+
+## 停止容器
+
+### 描述
+
+isula stop命令用于停止一个或多个运行中的容器。首先向容器中的首进程会发送**SIGTERM**信号,在指定时间(默认为10s)内容器未停止时,会发送**SIGKILL**。
+
+### 用法
+
+```bash
+isula stop [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+stop命令支持参数参考下表。
+
+**表 1** stop命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ stop
+
+ -f, --force
+
+ 强制停止正在运行的容器
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -t, --time
+
+ 先优雅停止,超过这个时间,则强行终止
+
+
+
+
+
+### 约束限制
+
+- 指定t参数且t<0时,请确保自己容器的应用会处理stop信号。
+
+ Stop的原理:Stop会首先给容器发送Stop 信号(SIGTERM),然后等待一定的时间(这个时间就是用户输入的 t),过了指定时间如果容器还仍处于运行状态,那么就发送kill信号(SIGKILL)使容器强制退出。
+
+- 输入参数t的含义:
+
+ t<0 : 表示一直等待,不管多久都等待程序优雅退出,既然用户这么输入了,表示对自己的应用比较放心,认为自己的程序有 合理的stop信号的处理机制。
+
+ t=0 : 表示不等,立即发送kill -9 到容器。
+
+ t\>0 : 表示等一定的时间,如果容器还未退出,就发送kill -9 到容器。
+
+ 所以如果用户使用t<0 (比如t=-1),请确保自己容器的应用会正确处理SIGTERM. 如果容器忽略了该信号,会导致isula stop一直卡住。
+
+### 示例
+
+停止一个容器
+
+```bash
+# isula stop fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+```
+
+## 强制停止容器
+
+### 描述
+
+isula kill命令用于强制停止一个或多个运行中的容器。
+
+### 用法
+
+```bash
+isula kill [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+kill命令支持参数参考下表。
+
+**表 1** kill命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ kill
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -s, --signal
+
+ 发送给容器的信号
+
+
+
+
+
+### 示例
+
+杀掉一个容器
+
+```bash
+# isula kill fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+```
+
+## 删除容器
+
+### 描述
+
+isula rm命令用于删除一个或多个容器。
+
+### 用法
+
+```bash
+isula rm [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+rm命令支持参数参考下表。
+
+**表 1** rm命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ rm
+
+ -f, --force
+
+ 强制移除正在运行的容器
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -v, --volume
+
+ 移除挂载在容器上的卷(备注:目前iSulad尚不使用此功能)
+
+
+
+
+
+### 约束限制
+
+- 在IO正常情况,空环境(只有1个容器)删除一个running容器的时间为T1,200个容器的环境(容器无大量IO操作,host IO正常)删除一个running容器所需时间为T2。T2的规格为:T2 = max \{ T1 \* 3, 5 \} 秒钟。
+
+### 示例
+
+删除一个停止状态的容器
+
+```bash
+# isula rm fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+```
+
+## 接入容器
+
+### 描述
+
+isula attach命令用于将当前终端的标准输入、标准输出和标准错误连接到正在运行的容器。
+
+### 用法
+
+```bash
+isula attach [OPTIONS] CONTAINER
+```
+
+### 参数
+
+attach命令支持参数参考下表。
+
+**表 1** attach命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+
+ attach
+
+ --help
+
+ 打印帮助信息
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启debug模式
+
+
+
+
+
+### 约束限制
+
+- 原生docker attach容器会直接进入容器,而isulad attach容器后需要敲一个回车才进入。
+
+### 示例
+
+接入一个运行状态的容器
+
+```bash
+# isula attach fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
+/ #
+/ #
+```
+
+## 重命名容器
+
+### 描述
+
+isula rename命令用于重命名容器。
+
+### 用法
+
+```bash
+isula rename [OPTIONS] OLD_NAME NEW_NAME
+```
+
+### 参数
+
+rename命令支持参数参考下表。
+
+**表 1** rename 命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+
+ rename
+
+ --help
+
+ 打印帮助信息
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启debug模式
+
+
+
+
+
+### 示例
+
+重命名一个容器
+
+```bash
+# isula rename my_container my_new_container
+```
+
+## 在容器中执行新命令
+
+### 描述
+
+isula exec命令用于正在运行的容器中运行一个新命令。新执行的命令将在容器的默认目录中运行。如果基础镜像指定了自定义目录,则将使用该目录。
+
+### 用法
+
+```bash
+isula exec [OPTIONS] CONTAINER COMMAND [ARG...]
+```
+
+### 参数
+
+exec命令支持参数参考下表。
+
+**表 1** exec命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ exec
+
+
+ -d, --detach
+
+ 后台运行命令
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ -e, --env
+
+ 设置环境变量(备注:目前iSulad尚不使用此功能)
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -i, --interactive
+
+ 没有连接,也要保持标准输入打开(备注:目前iSulad尚不使用此功能)
+
+
+ -t, --tty
+
+ 分配伪终端(备注:目前iSulad尚不使用此功能)
+
+
+ -u, --user
+
+ 指定用户登录容器执行命令
+
+
+ --workdir
+
+ 指定执行命令的工作目录,该功能只有runtime为lcr时才支持
+
+
+
+
+
+### 约束限制
+
+- isula exec 不指定任何参数时,会默认使用-it参数, 表示分配一个伪终端,以交互式的方式进入容器
+- 当使用isula exec 执行脚本,在脚本中执行后台进程时,需使用nohup标志忽略SIGHUP信号。
+
+ 使用isula exec运行脚本,在脚本中运行后台进程需使用nohup标志。否则内核会在exec执行的进程(session首进程)退出时,向后台执行的进程发送SIGHUP信号,导致后台进程退出,出现僵尸进程。
+
+- isula exec 进入容器进程后,不能执行后台程序,否则会出现卡死现象。
+
+ isula exec执行后台进程的方式如下:
+
+ 1. 使用isula exec进入容器终端,isula exec container\_name bash
+ 2. 进入容器后,执行 script &
+ 3. 执行exit,导致终端卡死
+
+ isula exec 进入容器后,执行后台程序卡住的原因为isula exec进入容器运行后台while1程序,当bash退出时,while1程序并不会退出,变为孤儿进程由1号
+ 进程接管,while1程序是由容器的初始bash进程fork &exec执行的,while1进程复制了bash进程的文件句柄,导致bash退出时,句柄并未完全关闭,导致
+ console进程收不到句柄关闭事件,epoll_wait卡住,进程不退出。
+
+- isula exec 不能用后台方式执行,否则可能会出现卡死现象。
+
+ isula exec后台执行的方式如下:
+
+ 使用**isula exec 脚本 &**的方式后台执行exec,如:isula exec container\_name script & ,isula exec 后台执行,执行的脚本中不断cat某一文件,正常时在当前终端有输出,如果在当前终端执行回车操作,客户端会因读IO失败而退出读stdout的动作,使终端不再输出,服务端由于进程仍然在cat文件,会继续往fifo的buffer里写入数据,当缓存写满时,容器内进程会卡死在write动作上。
+
+- 轻量级容器使用exec执行带有管道操作的命令时,建议使用/bin/bash -c 方式执行该命令。
+
+ 典型应用场景:
+
+ 使用isula exec container\_name -it ls /test | grep "xx" | wc -l,用于统计test目录下xx的文件个数,因exec执行的为"ls /test",其输出通过管道进行grep、wc 处理。exec执行的为"ls /test"的输出会换行,再针对该输出进行处理时,结果有误。
+
+ 原因:使用exec 执行ls /test,输出带有换行,针对该输出进行“| grep "xx" | wc -l“,处理结果为2(两行)
+
+ ```bash
+ # isula exec -it container ls /test
+ xx xx10 xx12 xx14 xx3 xx5 xx7 xx9
+ xx1 xx11 xx13 xx2 xx4 xx6 xx8
+ #
+ ```
+
+ 建议处理方式:使用run/exec执行带有管道操作的命令时,使用/bin/bash -c 执行命令,在容器中执行管道操作。
+
+ ```bash
+ # isula exec -it container /bin/sh -c "ls /test | grep "xx" | wc -l"
+ 15
+ #
+ ```
+
+- 禁止使用echo的方式向exec命令的stdin输入数据,会导致客户端卡死。应该直接将echo的值作为命令行参数传给容器
+
+ ```bash
+ # echo ls | isula exec 38 /bin/sh
+
+
+ ^C
+ #
+ ```
+
+ 上述命令可能出现客户端卡死现象,这是由于上述命令相当于往stdin输入ls,随后EOF被读取,客户端不再发送数据,等待服务端退出,但是服务端无法区分客户端是否需要继续发送数据,因而服务端卡在read数据上,最终导致双方均卡死。
+
+ 正确的执行方式为:
+
+ ```bash
+ # isula exec 38 ls
+ bin dev etc home proc root sys tmp usr var
+ ```
+
+### 示例
+
+在运行中的容器中,执行echo命令
+
+```bash
+# isula exec c75284634bee echo "hello,world"
+hello,world
+```
+
+## 查询单个容器信息
+
+### 描述
+
+isula inspect提供了容器的详细信息。
+
+### 用法
+
+```bash
+isula inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
+```
+
+### 参数
+
+inspect命令支持参数参考下表。
+
+**表 1** inspect命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ inspect
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -f, --format
+
+ 使用模板格式化输出
+
+
+ -t, --time
+
+ 超时时间的秒数,若在该时间内inspect查询容器信息未执行成功,则停止等待并立即报错,默认为120秒,当配置小于等于0的值,表示不启用timeout机制inspect查询容器信息会一直等待,直到获取容器信息成功后返回。
+
+
+
+
+
+### 示例
+
+查询容器信息
+
+```bash
+# isula inspect -f '{{.State.Status} {{.State.Running}}}' c75284634bee
+running
+true
+
+
+# isula inspect c75284634bee
+[
+ {
+ "Id": "c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a",
+ "Created": "2019-08-01T22:48:13.993304927-04:00",
+ "Path": "sh",
+ "Args": [],
+ "State": {
+ "Status": "running",
+ "Running": true,
+ "Paused": false,
+ "Restarting": false,
+ "Pid": 21164,
+ "ExitCode": 0,
+ "Error": "",
+ "StartedAt": "2019-08-02T06:09:25.535049168-04:00",
+ "FinishedAt": "2019-08-02T04:28:09.479766839-04:00",
+ "Health": {
+ "Status": "",
+ "FailingStreak": 0,
+ "Log": []
+ }
+ },
+ "Image": "busybox",
+ "ResolvConfPath": "",
+ "HostnamePath": "",
+ "HostsPath": "",
+ "LogPath": "none",
+ "Name": "c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a",
+ "RestartCount": 0,
+ "HostConfig": {
+ "Binds": [],
+ "NetworkMode": "",
+ "GroupAdd": [],
+ "IpcMode": "",
+ "PidMode": "",
+ "Privileged": false,
+ "SystemContainer": false,
+ "NsChangeFiles": [],
+ "UserRemap": "",
+ "ShmSize": 67108864,
+ "AutoRemove": false,
+ "AutoRemoveBak": false,
+ "ReadonlyRootfs": false,
+ "UTSMode": "",
+ "UsernsMode": "",
+ "Sysctls": {},
+ "Runtime": "lcr",
+ "RestartPolicy": {
+ "Name": "no",
+ "MaximumRetryCount": 0
+ },
+ "CapAdd": [],
+ "CapDrop": [],
+ "Dns": [],
+ "DnsOptions": [],
+ "DnsSearch": [],
+ "ExtraHosts": [],
+ "HookSpec": "",
+ "CPUShares": 0,
+ "Memory": 0,
+ "OomScoreAdj": 0,
+ "BlkioWeight": 0,
+ "BlkioWeightDevice": [],
+ "CPUPeriod": 0,
+ "CPUQuota": 0,
+ "CPURealtimePeriod": 0,
+ "CPURealtimeRuntime": 0,
+ "CpusetCpus": "",
+ "CpusetMems": "",
+ "SecurityOpt": [],
+ "StorageOpt": {},
+ "KernelMemory": 0,
+ "MemoryReservation": 0,
+ "MemorySwap": 0,
+ "OomKillDisable": false,
+ "PidsLimit": 0,
+ "FilesLimit": 0,
+ "Ulimits": [],
+ "Hugetlbs": [],
+ "HostChannel": {
+ "PathOnHost": "",
+ "PathInContainer": "",
+ "Permissions": "",
+ "Size": 0
+ },
+ "EnvTargetFile": "",
+ "ExternalRootfs": ""
+ },
+ "Mounts": [],
+ "Config": {
+ "Hostname": "localhost",
+ "User": "",
+ "Env": [
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
+ "TERM=xterm",
+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ ],
+ "Tty": true,
+ "Cmd": [
+ "sh"
+ ],
+ "Entrypoint": [],
+ "Labels": {},
+ "Annotations": {
+ "log.console.file": "none",
+ "log.console.filerotate": "7",
+ "log.console.filesize": "1MB",
+ "rootfs.mount": "/var/lib/isulad/mnt/rootfs",
+ "native.umask": "secure"
+ },
+ "HealthCheck": {
+ "Test": [],
+ "Interval": 0,
+ "Timeout": 0,
+ "StartPeriod": 0,
+ "Retries": 0,
+ "ExitOnUnhealthy": false
+ }
+ },
+ "NetworkSettings": {
+ "IPAddress": ""
+ }
+ }
+]
+```
+
+## 查询所有容器信息
+
+### 描述
+
+isula ps 用于查询所有容器的信息。
+
+### 用法
+
+```bash
+isula ps [OPTIONS]
+```
+
+### 参数
+
+ps命令支持参数参考下表。
+
+**表 1** ps命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ ps
+
+
+
+
+
+ -a, --all
+
+ 显示所有的容器
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -q, --quiet
+
+ 只显示容器名字
+
+
+ -f, --filter
+
+ 增加筛选过滤条件
+
+
+ --format
+
+ 按照模板声明的方式输出数据
+
+
+ --no-trunc
+
+ 不对容器ID进行截断打印
+
+
+
+
+
+### 示例
+
+查询所有容器信息
+
+```bash
+# isula ps -a
+
+ID IMAGE STATUS PID COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME NAMES
+e84660aa059c rnd-dockerhub.huawei.com/official/busybox running 304765 "sh" 0 0 13 minutes ago - lcr e84660aa059cafb0a77a4002e65cc9186949132b8e57b7f4d76aa22f28fde016
+# isula ps -a --format "table {{.ID}} {{.Image}}" --no-trunc
+ID IMAGE
+e84660aa059cafb0a77a4002e65cc9186949132b8e57b7f4d76aa22f28fde016 rnd-dockerhub.huawei.com/official/busybox
+
+```
+
+## 重启容器
+
+### 描述
+
+isula restart 用于重启一个或者多个容器。
+
+### 用法
+
+```bash
+isula restart [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+restart命令支持参数参考下表。
+
+**表 1** restart 命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ restart
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -t, --time
+
+ 先优雅停止,超过这个时间,则强行终止
+
+
+
+
+
+### 约束限制
+
+- 指定t参数且t<0时,请确保自己容器的应用会处理stop信号。
+
+ restart会首先调用stop停止容器。stop会首先给容器发送stop信号(SIGTERM),然后等待一定的时间(这个时间就是用户输入的 t),过了一定时间如果容器仍处于运行状态,那么就发送kill信号(SIGKILL)使容器强制退出。
+
+- 输入参数t的含义:
+
+ t<0 : 表示一直等待,不管多久都等待程序优雅退出,既然用户这么输入了,表示对自己的应用比较放心,认为自己的程序有合理的stop信号的处理机制。
+
+ t=0 : 表示不等,立即发送kill -9 到容器。
+
+ t\>0 : 表示等一定的时间,如果容器还未退出,就发送kill -9 到容器。
+
+ 所以如果用户使用t<0(比如t=-1),请确保自己容器的应用会正确处理SIGTERM. 如果容器忽略了该信号,会导致isula restart一直卡住。
+
+### 示例
+
+重启单个容器
+
+```bash
+# isula restart c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a
+ c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a
+```
+
+## 等待容器退出
+
+### 描述
+
+isula wait用于等待一个或者多个容器退出。仅支持runtime类型为lcr的容器。
+
+### 用法
+
+```bash
+isula wait [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+wait命令支持参数参考下表。
+
+**表 1** wait命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ wait
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+### 示例
+
+等待单个容器退出
+
+```bash
+# isula wait c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a
+ 137
+```
+
+## 查看容器中进程信息
+
+### 描述
+
+isula top用于查看容器中的进程信息。
+
+### 用法
+
+```bash
+isula top [OPTIONS] container [ps options]
+```
+
+### 参数
+
+top命令支持参数参考下表。
+
+**表 1** top命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ top
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+### 示例
+
+查询容器中进程信息
+
+```bash
+# isula top 21fac8bb9ea8e0be4313c8acea765c8b4798b7d06e043bbab99fc20efa72629c
+UID PID PPID C STIME TTY TIME CMD
+root 22166 22163 0 23:04 pts/1 00:00:00 sh
+```
+
+## 查看容器使用的资源
+
+### 描述
+
+isula stats用于实时显示资源使用的统计信息。
+
+### 用法
+
+```bash
+isula stats [OPTIONS] [CONTAINER...]
+```
+
+### 参数
+
+stats命令支持参数参考下表。
+
+**表 1** stats命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ stats
+
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -a, --all
+
+ 显示所有容器(默认只显示运行中的容器)
+
+
+ --no-stream
+
+ 非流式方式的stats,只打印第一次结果
+
+
+ --original
+
+ 显示容器的原始数据信息,不进行统计计算
+
+
+
+
+
+### 示例
+
+显示资源使用的统计信息
+
+```bash
+# isula stats --no-stream 21fac8bb9ea8e0be4313c8acea765c8b4798b7d06e043bbab99fc20efa72629c CONTAINER CPU % MEM USAGE / LIMIT MEM % BLOCK I / O PIDS
+21fac8bb9ea8 0.00 56.00 KiB / 7.45 GiB 0.00 0.00 B / 0.00 B 1
+```
+
+## 获取容器日志
+
+### 描述
+
+isula logs用于获取容器的日志。
+
+### 用法
+
+```bash
+isula logs [OPTIONS] [CONTAINER...]
+```
+
+### 参数
+
+logs命令支持参数参考下表。
+
+**表 1** logs命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ logs
+
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -f, --follow
+
+ 跟踪日志输出
+
+
+ --tail
+
+ 显示日志行数
+
+
+ -t, --timestamps
+
+ 显示时间戳
+
+
+
+
+
+### 约束限制
+
+- 容器串口logs日志记录功能,默认为开启状态,需要关闭可以通过 isula create --log-opt disable-log=true 或 isula run --log-opt disable-log=true 关闭。
+
+### 示例
+
+获取容器日志
+
+```bash
+# isula logs 6a144695f5dae81e22700a8a78fac28b19f8bf40e8827568b3329c7d4f742406
+hello, world
+hello, world
+hello, world
+```
+
+## 容器与主机之间数据拷贝
+
+### 描述
+
+isula cp 用于容器与主机之间的数据拷贝,仅支持runtime类型为lcr的容器。
+
+### 用法
+
+```bash
+isula cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
+isula cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
+```
+
+### 参数
+
+cp命令支持参数参考下表。
+
+**表 1** cp命令参数列表
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ cp
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+### 约束限制
+
+- iSulad在执行拷贝时,不会挂载/etc/hostname, /etc/resolv.conf,/etc/hosts三个文件,也不会对--volume和--mount参数传入的参数挂载到host,所以对这些文件的拷贝使用的是镜像中的原始文件,而不是真实容器中的文件。
+
+ ```bash
+ # isula cp b330e9be717a:/etc/hostname /tmp/hostname
+ # cat /tmp/hostname
+ #
+ ```
+
+- iSulad在解压文件时,不会对文件系统中即将被覆盖的文件或文件夹做类型判断,而是直接覆盖,所以在拷贝时,如果源为文件夹,同名的文件会被强制覆盖为文件夹;如果源为文件,同名的文件夹会被强制覆盖为文件。
+
+ ```bash
+ # rm -rf /tmp/test_file_to_dir && mkdir /tmp/test_file_to_dir
+ # isula exec b330e9be717a /bin/sh -c "rm -rf /tmp/test_file_to_dir && touch /tmp/test_file_to_dir"
+ # isula cp b330e9be717a:/tmp/test_file_to_dir /tmp
+ # ls -al /tmp | grep test_file_to_dir
+ -rw-r----- 1 root root 0 Apr 26 09:59 test_file_to_dir
+ ```
+
+- cp命令仅供维护定位时使用,应避免在生产环境上线使用cp命令。
+
+### 示例
+
+将主机/test/host目录拷贝到容器21fac8bb9ea8的/test目录下。
+
+```bash
+isula cp /test/host 21fac8bb9ea8:/test
+```
+
+将容器21fac8bb9ea8的/www目录拷贝到主机的/tmp目录中。
+
+```bash
+isula cp 21fac8bb9ea8:/www /tmp/
+```
+
+## 暂停容器中所有的进程
+
+### 描述
+
+isula pause用于暂停一个或者多个容器中的所有进程。
+
+### 用法
+
+```bash
+isula pause [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ pause
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+### 约束限制
+
+- 只有状态为running的容器可以被执行pause操作
+- 当容器被pause后,无法执行其他生命周期管理操作(如restart/exec/attach/kill/stop/rm等)
+- 当带有健康检查配置的容器被pause后,容器状态最终变为unhealthy状态
+
+### 示例
+
+暂停一个正在运行的容器,命令示例如下:
+
+```bash
+# isula pause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
+ 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
+```
+
+## 恢复容器容器中的所有进程
+
+### 描述
+
+isula unpause用于恢复一个或者多个容器中的所有进程, 为isula pause的逆过程。
+
+### 用法
+
+```bash
+isula unpause [OPTIONS] CONTAINER [CONTAINER...]
+```
+
+### 参数
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ pause
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+
+
+
+### 约束限制
+
+- 只有状态为paused的容器可以被执行unpause操作
+
+### 示例
+
+恢复一个被暂停的容器,命令示例如下:
+
+```bash
+# isula unpause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
+ 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
+```
+
+## 从服务端实时获取事件消息
+
+### 描述
+
+isula events用于从服务端获取实时事件。
+
+### 用法
+
+```bash
+isula events [OPTIONS]
+```
+
+### 参数
+
+
+ 命令
+
+ 参数
+
+ 说明
+
+
+ events
+
+ -H, --host
+
+ 指定要连接的iSulad socket文件路径
+
+
+ -D, --debug
+
+ 开启调试模式
+
+
+ --help
+
+ 打印帮助信息
+
+
+ -n, --name
+
+ 获取指定容器的事件消息
+
+
+ -S, --since
+
+ 获取指定时间以来的事件消息
+
+
+ -U, --until
+
+ 获取到指定时间点位置的事件
+
+
+
+
+
+### 约束限制
+
+- 支持容器相关事件为:create、start、restart、stop、exec_create、exec_die、attach、kill、top、rename、archive-path、extract-to-dir、update、pause、unpause、export、resize。
+- 支持镜像相关事件为:load、remove、pull、login、logout。
+
+### 示例
+
+从服务端实时获取事件消息,命令示例如下:
+
+```bash
+# isula events
+```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/container-resource-management.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/container-resource-management.md
new file mode 100644
index 0000000000000000000000000000000000000000..036b686a1d13aa184db140de3b209f52e3555781
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/container-resource-management.md
@@ -0,0 +1,744 @@
+# 容器资源管理
+
+## 描述
+
+可以通过namespace和cgroup等功能实现对容器的资源管理。isula支持使用cgroup v1和cgroup v2实现对资源的限制,其中
+cgroup v2属于实验特性,不支持商用。当系统配置为只支持cgroup v2并将cgroup v2挂载到/sys/fs/cgroup目录时,isula使用
+cgroup v2来进行资源管理。无论是cgroup v1还是使用cgroup v2对容器资源进行管理,isula提供给用户实现资源限制的接口是
+一致的。
+
+## 资源共享
+
+### 描述
+
+容器间或者容器与host之间可以共享namespace信息,包括pid, net, ipc, uts。
+
+>  **说明:**
+>
+> 当使用与主机共享namespace信息时,即缺少了对应的namespace隔离机制,在容器中可以查询、操作主机上的信息,存在安全
+隐患。比如使用--pid=host共享主机pid namespace时,即可以看到主机上其他进程信息,造成信息泄露,甚至直接kill杀死主机
+进程。请在确保安全的场景下,谨慎使用共享主机host namespace功能。
+
+### 用法
+
+isula create/run时使用namespace相关的参数共享资源,具体参数见下方参数列表。
+
+### 参数
+
+create/run时可以指定下列参数。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --pid
+
+ 指定要共享的pid namespace
+
+ [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace
+
+ 否
+
+
+ --net
+
+ 指定要共享的net namespace
+
+ [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace
+
+ 否
+
+
+ --ipc
+
+ 指定要共享的ipc namespace
+
+ [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace
+
+ 否
+
+
+ --uts
+
+ 指定要共享的uts namespace
+
+ [none, host, container:<containerID>],none表示不共享,host表示与host共用namespace,container:<containerID>表示与容器containerID共享同一个namespace
+
+ 否
+
+
+
+
+
+### 示例
+
+如果两个容器需要共享同一个pid namespace,在运行容器时,直接加上--pid container: 即可,如:
+
+```bash
+isula run -tid --name test_pid busybox sh
+isula run -tid --name test --pid container:test_pid busybox sh
+```
+
+## 限制运行时的CPU资源
+
+### 描述
+
+可以通过参数限制容器的各项cpu资源值。
+
+### 用法
+
+isula create/run时使用cpu相关的参数限制容器的各项cpu资源值,具体参数及取值见下方参数列表。
+
+### 参数
+
+create/run时可以指定下列参数。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --cpu-period
+
+ 限制容器中cpu cfs(完全公平调度)周期
+
+ 64位整数(int64)
+
+ 否
+
+
+ --cpu-quota
+
+ 限制容器中cpu cfs(完全公平调度) 的配额
+
+ 64位整数(int64)
+
+ 否
+
+
+ --cpu-shares
+
+ 限制容器中cpu相对权重
+
+ 64位整数(int64)
+
+ 否
+
+
+ --cpu-rt-period
+
+ 限制容器中cpu实时周期(以微秒为单位)
+
+ 64位整数(int64)
+
+ 否
+
+
+ --cpu-rt-runtime
+
+ 限制容器中cpu实时运行时间(以微秒为单位)
+
+ 64位整数(int64)
+
+ 否
+
+
+ --cpuset-cpus
+
+ 限制容器中使用cpu节点
+
+ 字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1.
+
+ 否
+
+
+ --cpuset-mems
+
+ 限制容器中cpuset使用的mem节点
+
+ 字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1.
+
+ 否
+
+
+
+
+
+### 示例
+
+如果需要限制容器只是用特定的cpu,在运行容器时,直接加上--cpuset-cpus number 即可,如:
+
+```bash
+isula run -tid --cpuset-cpus 0,2-3 busybox sh
+```
+
+>  **说明:**
+>
+> 是否设置成功,请参见“查询单个容器信息”章节。
+
+## 限制运行时的内存
+
+### 描述
+
+可以通过参数限制容器的各项内存值上限。
+
+### 用法
+
+isula create/run时使用内存相关的参数限制容器的各项内存使用上限,具体参数及取值见下方参数列表。
+
+### 参数
+
+create/run时可以指定下列参数。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --memory
+
+ 限制容器中内存使用上限
+
+ 64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.
+
+ 否
+
+
+ --memory-reservation
+
+ 限制容器中内存的软上限
+
+ 64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.
+
+ 否
+
+
+ --memory-swap
+
+ 限制容器中交换内存的上限
+
+ 64位整数(int64)。值为-1或非负数,-1表示不限制,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.
+
+ 否
+
+
+ --kernel-memory
+
+ 限制容器中内核内存的上限
+
+ 64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.
+
+ 否
+
+
+
+
+
+### 示例
+
+如果需要限制容器内内存的上限,在运行容器时,直接加上`--memory []`即可,如:
+
+```bash
+isula run -tid --memory 1G busybox sh
+```
+
+## 限制运行时的IO资源
+
+### 描述
+
+可以通过参数限制容器中设备读写速度。
+
+### 用法
+
+isula create/run时使用--device-read-bps/--device-write-bps :\[\]来限制容器中设备的读写速度。
+
+### 参数
+
+create/run时指定--device-read/write-bps参数。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --device-read-bps/--device-write-bps
+
+ 限制容器中设备的读速度/写速度
+
+ 64位整数(int64)。值为正整数,可以为0,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB.
+
+ 否
+
+
+
+
+
+### 示例
+
+如果需要限制容器内设备的读写速度,在运行容器时,直接加上--device-write-bps/--device-read-bps :\[\]即可,例如,限制容器busybox内设备/dev/sda的读速度为 1MB 每秒,则命令如下:
+
+```bash
+isula run -tid --device-write /dev/sda:1mb busybox sh
+```
+
+限制写速度的命令如下:
+
+```bash
+isula run -tid read-bps /dev/sda:1mb busybox sh
+```
+
+## 限制容器rootfs存储空间
+
+### 描述
+
+在ext4上使用overlay2时,可以设置单个容器的文件系统限额,比如设置A容器的限额为5G,B容器为10G。
+
+该特性通过ext4文件系统的project quota功能来实现,在内核支持的前提下,通过系统调用SYS\_IOCTL设置某个目录的project ID,再通过系统调用SYS\_QUOTACTL设置相应的project ID的hard limit和solft limit值达到限额的目的。
+
+### 用法
+
+1. 环境准备
+
+ 文件系统支持Project ID和Project Quota属性,4.19版本内核已经支持,外围包e2fsprogs版本不低于1.43.4-2。
+
+2. 在容器挂载overlayfs之前,需要对不同容器的upper目录和work目录设置不同的project id,同时设置继承选项,在容器挂载overlayfs之后不允许再修改project id和继承属性。
+3. 配额的设置需要在容器外以特权用户进行。
+4. daemon中增加如下配置
+
+ ```shell
+ -s overlay2 --storage-opt overlay2.override_kernel_check=true
+ ```
+
+5. daemon支持以下选项,用于为容器设置默认的限制,
+
+ --storage-opt overlay2.basesize=128M 指定默认限制的大小,若isula run时也指定 了--storage-opt size选项,则以run时指定来生效,若daemon跟isula run时都不指定大小,则表示不限制。
+
+6. 需要开启文件系统Project ID和Project Quota属性。
+ - 新格式化文件系统并mount
+
+ ```shell
+ # mkfs.ext4 -O quota,project /dev/sdb
+ # mount -o prjquota /dev/sdb /var/lib/isulad
+ ```
+
+### 参数
+
+create/run时指定--storage-opt参数。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --storage-opt size=${rootfsSize}
+
+ 限制容器rootfs存储空间。
+
+ rootfsSize解析出的大小为int64范围内以字节表示的正数,默认单位为B,也可指定为([kKmMgGtTpP])?[iI]?[bB]?$。(device mapper场景下最小取值为10G)
+
+ 否
+
+
+
+
+
+### 示例
+
+在isula run/create命令行上通过已有参数“--storage-opt size=”来设置限额。其中value是一个正数,单位可以是`[kKmMgGtTpP]?[iI]?[bB]?`,在不带单位的时候默认单位是字节。
+
+```bash
+# isula run -ti --storage-opt size=10M busybox
+/ # df -h
+Filesystem Size Used Available Use% Mounted on
+overlay 10.0M 48.0K 10.0M 0% /
+none 64.0M 0 64.0M 0% /dev
+none 10.0M 0 10.0M 0% /sys/fs/cgroup
+tmpfs 64.0M 0 64.0M 0% /dev
+shm 64.0M 0 64.0M 0% /dev/shm
+/dev/mapper/vg--data-ext41
+ 9.8G 51.5M 9.2G 1% /etc/hostname
+/dev/mapper/vg--data-ext41
+ 9.8G 51.5M 9.2G 1% /etc/resolv.conf
+/dev/mapper/vg--data-ext41
+ 9.8G 51.5M 9.2G 1% /etc/hosts
+tmpfs 3.9G 0 3.9G 0% /proc/acpi
+tmpfs 64.0M 0 64.0M 0% /proc/kcore
+tmpfs 64.0M 0 64.0M 0% /proc/keys
+tmpfs 64.0M 0 64.0M 0% /proc/timer_list
+tmpfs 64.0M 0 64.0M 0% /proc/sched_debug
+tmpfs 3.9G 0 3.9G 0% /proc/scsi
+tmpfs 64.0M 0 64.0M 0% /proc/fdthreshold
+tmpfs 64.0M 0 64.0M 0% /proc/fdenable
+tmpfs 3.9G 0 3.9G 0% /sys/firmware
+/ #
+/ # dd if=/dev/zero of=/home/img bs=1M count=12 && sync
+dm-4: write failed, project block limit reached.
+10+0 records in
+9+0 records out
+10432512 bytes (9.9MB) copied, 0.011782 seconds, 844.4MB/s
+/ # df -h | grep overlay
+overlay 10.0M 10.0M 0 100% /
+/ #
+```
+
+### 约束
+
+1. 限额只针对rw层。
+
+ overlay2的限额是针对容器的rw层的,镜像的大小不计算在内。
+
+2. 内核支持并使能。
+
+ 内核必须支持ext4的project quota功能,并在mkfs的时候要加上-O quota,project,挂载的时候要加上-o prjquota。任何一个不满足,在使用--storage-opt size=时都将报错。
+
+ ```bash
+ # isula run -it --storage-opt size=10Mb busybox df -h
+ Error response from daemon: Failed to prepare rootfs with error: time="2019-04-09T05:13:52-04:00" level=fatal msg="error creating read-
+ write layer with ID "a4c0e55e82c55e4ee4b0f4ee07f80cc2261cf31b2c2dfd628fa1fb00db97270f": --storage-opt is supported only for overlay over
+ xfs or ext4 with 'pquota' mount option"
+ ```
+
+3. 限制额度的说明。
+ 1. 限制的额度大于isulad的root所在分区的size时,在容器内用df看到的文件系统的额度是isulad的root所在分区的size,而不是设置的限额。
+ 2. --storage-opt size=0代表不限制,且设置值不能小于4096。size的精度为1个字节,如果指定精度含小数个字节,小数部分被忽略,如指定size=0.1实际等同于size=0不限制。(受计算机存储浮点数精度的限制,即0.999999999999999999999999999与1是等价的,具体的9的个数不同计算机可能存在差异,故设置4095.999999999999999999999999999与4096等价,其他情况类似),注意isula inspect显示原始命令行指定形式,如果含小数字节,需自行忽略小数部分。
+ 3. 限制的额度过小时,比如--storage-opt size=4k,可能会导致容器无法启动,因为启动容器本身需要创建一些文件。
+ 4. 上一次启动isulad时,isulad的root所在分区挂载时加了-o prjquota选项,这次启动时不加,那么上一次启动中创建的带quota的容器的设置值不生效。
+ 5. daemon端配额--storage-opt overlay2.basesize,其取值范围与--storage-opt size相同。
+
+4. 指定storage-opt为4k时,轻量级容器启动与docker有差异
+
+ 使用选项 storage-opt size=4k 和镜像 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest 运行容器。
+
+ docker启动失败。
+
+ ```bash
+ # docker run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest
+ docker: Error response from daemon: symlink /proc/mounts /var/lib/docker/overlay2/e6e12701db1a488636c881b44109a807e187b8db51a50015db34a131294fcf70-init/merged/etc/mtab: disk quota exceeded.
+ See 'docker run --help'.
+ ```
+
+ 轻量级容器不报错,正常启动
+
+ ```bash
+ # isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest
+ 636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728
+ # isula ps
+ STATUS PID IMAGE COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME ID NAMES
+ running 17609 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest /bin/bash 0 0 2 seconds ago - lcr 636480b1fc2c 636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728
+ ```
+
+ 在启动容器的过程中,如果需要在容器的rootfs路径下创建文件,若镜像本身占用的大小超过4k,且此时的quota设置为4k,则创建文件必定失败。
+
+ docker在启动容器的过程中,会比isulad创建更多的挂载点,用于挂载host上的某些路径到容器中,如/proc/mounts, /dev/shm等,如果镜像内本身不存在这些文件,则会创建,根据上述原因该操作会导致文件创建失败,因而容器启动失败。
+
+ 轻量级容器在启动容器过程中,使用默认配置时,挂载点较少,如/proc,或/sys等路径不存在时,才会创建。用例中的镜像rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest本身含有/proc, /sys等,因此整个启动容器的过程中,都不会有新文件或路径生成,故轻量级容器启动过程不会报错。为验证这一过程,当把镜像替换为rnd-dockerhub.huawei.com/official/busybox-aarch64:latest时,由于该镜像内无/proc存在,轻量级容器启动一样会报错。
+
+ ```bash
+ # isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/busybox-aarch64:latest
+ 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4
+ Error response from daemon: Start container error: runtime error: 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4:tools/lxc_start.c:main:404 starting container process caused "Failed to setup lxc,
+ please check the config file."
+ ```
+
+5. 其他说明。
+
+ 使用限额功能的isulad切换数据盘时,需要保证被切换的数据盘使用\`prjquota\`选项挂载,且/var/lib/isulad/storage/overlay2目录的挂载方式与/var/lib/isulad相同。
+
+ >  **说明:**
+ >
+ > 切换数据盘时需要保证/var/lib/isulad/storage/overlay2的挂载点被卸载。
+
+## 限制容器内文件句柄数
+
+### 描述
+
+可以通过参数限制容器中可以打开的文件句柄数。
+
+### 用法
+
+isula create/run时使用--files-limit来限制容器中可以打开的文件句柄数。
+
+### 参数
+
+create/run时指定--files-limit参数。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --files-limit
+
+ 限制容器中可以打开的文件句柄数。
+
+ 64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。
+ 由于创建容器的过程中会临时打开一些句柄,所以此值不能设置的太小,不然容器可能不受files limit的限制(如果设置的数小于当前已经打开的句柄数,会导致cgroup文件写不进去),建议大于30。
+
+ 否
+
+
+
+
+
+### 示例
+
+在运行容器时,直接加上--files-limit n 即可,如:
+
+```bash
+isula run -ti --files-limit 1024 busybox bash
+```
+
+### 约束
+
+1. 使用--files-limit参数传入一个很小的值,如1,可能导致容器启动失败。
+
+ ```bash
+ # isula run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
+ 004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
+ Error response from daemon: Start container error: Container is not running:004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
+ ```
+
+ 而docker会启动成功,其files.limit cgroup值为max。
+
+ ```bash
+ # docker run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
+ ef9694bf4d8e803a1c7de5c17f5d829db409e41a530a245edc2e5367708dbbab
+ # docker exec -it ef96 cat /sys/fs/cgroup/files/files.limit
+ max
+ ```
+
+ 根因是lxc和runc启动过程的原理不一样,lxc创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时该进程已经打开超过1个句柄,因而写入报错导致启动失败。runc创建cgroup子组后先将容器进程的PID写入该子组的cgroup.procs文件,再设置files.limit值,此时由于该子组内的进程已经打开超过1个句柄,因而写入files.limit不会生效,内核也不会报错,容器启动成功。
+
+## 限制容器内可以创建的进程/线程数
+
+### 描述
+
+可以通过参数限制容器中能够创建的进程/线程数。
+
+### 用法
+
+在容器create/run时,使用参数--pids-limit来限制容器中可以创建的进程/线程数。
+
+### 参数
+
+create/run时指定--pids-limit参数。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --pids-limit
+
+ 限制容器中可以打开的文件句柄数。
+
+ 64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。
+
+ 否
+
+
+
+
+
+### 示例
+
+在运行容器时,直接加上--pids-limit n 即可,如:
+
+```bash
+isula run -ti --pids-limit 1024 busybox bash
+```
+
+### 约束
+
+由于创建容器的过程中会临时创建一些进程,所以此值不能设置的太小,不然容器可能起不来,建议大于10。
+
+## 配置容器内的ulimit值
+
+### 描述
+
+可以通过参数控制执行程序的资源。
+
+### 用法
+
+在容器create/run时配置--ulimit参数,或通过daemon端配置,控制容器中执行程序的资源。
+
+### 参数
+
+通过两种方法配置ulimit
+
+1. isula create/run时使用--ulimit =\[:\]来控制shell执行程序的资源。
+
+
+ 参数项
+
+ 参数说明
+
+ 取值范围
+
+ 是否必选
+
+
+
+ --ulimit
+
+ 限制shell执行程序的资源
+
+ soft/hard是64位整数(int64)。soft取值 <= hard取值,如果仅仅指定了soft的取值,则hard=soft。对于某些类型的资源并不支持负数,详见下表
+
+ 否
+
+
+
+
+
+2. 通过daemon端参数或配置文件
+
+ 详见"(命令行参数说明"与"部署方式"的--default-ulimits相关选项。
+
+ --ulimit可以对以下类型的资源进行限制。
+
+
+ 类型
+
+ 说明
+
+ 取值范围
+
+
+
+ core
+
+ limits the core file size (KB)
+
+ 64位整数(INT64),无单位。可以为0、负、其中-1表示UNLIMITED,即不做限制,其余的负数会被强制转换为一个大的正整数。
+
+
+ cpu
+
+ max CPU time (MIN)
+
+
+ data
+
+ max data size (KB)
+
+
+ fsize
+
+ maximum filesize (KB)
+
+
+ locks
+
+ max number of file locks the user can hold
+
+
+ memlock
+
+ max locked-in-memory address space (KB)
+
+
+ msgqueue
+
+ max memory used by POSIX message queues (bytes)
+
+
+ nice
+
+ nice priority
+
+
+ nproc
+
+ max number of processes
+
+
+ rss
+
+ max resident set size (KB)
+
+
+ rtprio
+
+ max realtime priority
+
+
+ rttime
+
+ realtime timeout
+
+
+ sigpending
+
+ max number of pending signals
+
+
+ stack
+
+ max stack size (KB)
+
+
+ nofile
+
+ max number of open file descriptors
+
+ 64位整数(int64),无单位。不可以为负,负数被强转为大数,设置时会出现Operation not permitted
+
+
+
+
+
+### 示例
+
+在容器的创建或者运行时,加上`--ulimit =[:]`即可,如:
+
+```bash
+isula create/run -tid --ulimit nofile=1024:2048 busybox sh
+```
+
+### 约束
+
+不能在daemon.json和/etc/sysconfig/iSulad文件(或isulad命令行)中同时配置ulimit限制,否则isulad启动会报错。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/cri-2.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/cri-2.md
new file mode 100644
index 0000000000000000000000000000000000000000..52f1df63d11dc6a8746d4308016b6f9b05316146
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/cri-2.md
@@ -0,0 +1,310 @@
+# CRI V1接口支持
+
+## 概述
+
+CRI(Container Runtime Interface, 容器运行时接口)是kublet与容器引擎通信使用的主要协议。
+在K8S 1.25及之前,K8S存在CRI v1alpha2 和 CRI V1两种版本的CRI接口,但从1.26开始,K8S仅提供对于CRI V1的支持。
+
+iSulad同时提供对[CRI v1alpha2](./cri.md)和CRI v1的支持,
+对于CRI v1,iSulad支持[CRI v1alpha2](./cri.md)所述功能,
+并提供对CRI V1中所定义新接口和字段的支持。
+
+目前iSulad支持的CRI V1版本为1.29,对应官网描述API如下:
+
+[https://github.com/kubernetes/cri-api/blob/kubernetes-1.29.0/pkg/apis/runtime/v1/api.proto](https://github.com/kubernetes/cri-api/blob/kubernetes-1.29.0/pkg/apis/runtime/v1/api.proto)
+
+iSulad使用的API描述文件,与官方API略有出入,以本文档描述的接口为准。
+
+## 新增字段描述
+
+- **CgroupDriver**
+
+ cgroup驱动的enum值列表
+
+
+ 参数成员
+
+ 描述
+
+
+
+ SYSTEMD = 0
+
+ systemd cgroup驱动
+
+
+ CGROUPFS = 1
+
+ cgroupfs驱动
+
+
+
+
+
+- **LinuxRuntimeConfiguration**
+
+ 容器引擎所使用的cgroup驱动
+
+
+ 参数成员
+
+ 描述
+
+
+
+ CgroupDriver cgroup_driver
+
+ 容器引擎所使用的cgroup驱动枚举值
+
+
+
+
+
+- **ContainerEventType**
+
+ 容器事件类型枚举值
+
+
+ 参数成员
+
+ 描述
+
+
+
+ CONTAINER_CREATED_EVENT = 0
+
+ 容器创建类型
+
+
+ CONTAINER_STARTED_EVENT = 1
+
+ 容器启动类型
+
+
+ CONTAINER_STOPPED_EVENT = 1
+
+ 容器停止类型
+
+
+ CONTAINER_DELETED_EVENT = 1
+
+ 容器删除类型
+
+
+
+
+
+- **SwapUsage**
+
+ 虚拟内存使用情况
+
+
+ 参数成员
+
+ 描述
+
+
+
+ int64 timestamp
+
+ 时间戳信息
+
+
+ UInt64Value swap_available_bytes
+
+ 可使用虚拟内存字节数
+
+
+ UInt64Value swap_usage_bytes
+
+ 已使用虚拟内存字节数
+
+
+
+
+
+## 新增接口描述
+
+### RuntimeConfig
+
+#### 接口原型
+
+```text
+rpc RuntimeConfig(RuntimeConfigRequest) returns (RuntimeConfigResponse) {}
+```
+
+#### 接口描述
+
+获取cgroup驱动配置 cgroupfs 或 systemd-cgroup
+
+#### 参数 RuntimeConfigRequest
+
+无字段
+
+#### 返回值 RuntimeConfigResponse
+
+
+ 返回值
+
+ 描述
+
+
+ LinuxRuntimeConfiguration linux
+
+ 描述cgroupfs或者systemd-cgroup的CgroupDriver枚举值
+
+
+
+
+
+### GetContainerEvents
+
+#### 接口原型
+
+```text
+rpc GetContainerEvents(GetEventsRequest) returns (stream ContainerEventResponse) {}
+```
+
+#### 接口描述
+
+获取Pod生命周期事件流
+
+#### 参数 GetEventsRequest
+
+无字段
+
+#### 返回值 ContainerEventResponse
+
+
+ 返回值
+
+ 描述
+
+
+ string container_id
+
+ 容器id
+
+
+ ContainerEventType container_event_type
+
+ 容器事件类型
+
+
+ int64 created_at
+
+ 容器事件产生时间
+
+
+ PodSandboxStatus pod_sandbox_status
+
+ 容器所属Pod的status信息
+
+
+ repeated ContainerStatus containers_statuses
+
+ 容器所属Pod内所有容器的status信息
+
+
+
+
+
+## 变更描述
+
+### CRI V1.29更新变更描述
+
+#### [获取cgroup驱动配置](https://github.com/kubernetes/kubernetes/pull/118770)
+
+`RuntimeConfig` 获取cgroup驱动配置 cgroupfs 或 systemd-cgroup
+
+#### [GetContainerEvents支持pod生命周期事件](https://github.com/kubernetes/kubernetes/pull/111384)
+
+`GetContainerEents`,提供对pod生命周期相关事件流
+
+`PodSandboxStatus`有相应调整,增加ContainerStatuses提供沙箱内容器status信息
+
+#### [ContainerStats虚拟内存信息](https://github.com/kubernetes/kubernetes/pull/118865)
+
+`ContainerStats`新增虚拟内存使用情况信息: `SwapUsage`
+
+#### [ContainerStatus reason字段OOMKilled设置](https://github.com/kubernetes/kubernetes/pull/112977)
+
+ContainerStatus中reason字段在cgroup out-of-memory时应该设置为OOMKilled
+
+#### [PodSecurityContext.SupplementalGroups描述修改](https://github.com/kubernetes/kubernetes/pull/113047)
+
+描述修改,优化`PodSecurityContext.SupplementalGroups`的注释,明确容器镜像定义的主UID不在该列表下的行为
+
+#### [ExecSync输出限制](https://github.com/kubernetes/kubernetes/pull/110435)
+
+ExecSync返回值输出小于16MB
+
+## 使用手册
+
+### 配置iSulad支持CRI V1
+
+该需求需要iSulad对K8S新版本CRI接口1.29提供支持,
+
+对于1.25及之前的CRI接口,V1alpha2和V1功能保持一致,1.26及之后新增的特性仅在CRI V1中提供支持。
+此次升级的功能和特性仅在CRI V1中提供支持,因此新增特性均需要按照以下配置使能CRI V1。
+
+CRI V1使能:
+
+iSulad daemon.json中enable-cri-v1设置为true,重启iSulad
+
+```json
+{
+ "group": "isula",
+ "default-runtime": "runc",
+ ...
+ "enable-cri-v1": true
+}
+```
+
+若通过源码进行编译安装iSulad需开启ENABLE_CRI_API_V1编译选项
+
+```bash
+cmake ../ -D ENABLE_CRI_API_V1=ON
+```
+
+### RuntimeConfig获取cgroup驱动配置
+
+#### systemd-cgroup配置
+
+iSulad同时提供对systemd和cgroupfs两种cgroup驱动支持,
+默认使用cgroupfs作为cgroup驱动,可以通过配置iSulad容器引擎提供对systemd cgroup驱动支持。
+iSulad仅提供底层运行时为runc时systemd-cgroup的支持。通过修改iSulad配置文件daemon.json,
+设置systemd-cgroup为true,重启iSulad,则使用systemd cgroup驱动。
+
+```json
+{
+ "group": "isula",
+ "default-runtime": "runc",
+ ...
+ "enable-cri-v1": true,
+ "systemd-cgroup": true
+}
+```
+
+### GetContainerEvents Pod 生命周期事件生成
+
+#### Pod Events配置
+
+修改iSulad配置文件daemon.json,
+设置enable-pod-events为true,重启iSulad。
+
+```json
+{
+ "group": "isula",
+ "default-runtime": "runc",
+ ...
+ "enable-cri-v1": true,
+ "enable-pod-events": true
+}
+```
+
+## 使用限制
+
+1. 以上新增特性,iSulad仅提供容器运行时设置为runc时的支持。
+2. 由于cgroup oom会同时触发容器cgroup路径删除,若iSulad对oom事件处理发生在cgroup路径删除之后,iSulad则无法成功捕捉容器oom事件,可能导致ContainerStatus中reason字段设置不正确。
+3. iSulad不支持交叉使用不同的cgroup驱动管理容器,启动容器后iSulad的cgroup驱动配置不应该发生变化。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/cri.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/cri.md
new file mode 100644
index 0000000000000000000000000000000000000000..387c24a6d4fcef558f1626f8dbd666bbf9e75deb
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/cri.md
@@ -0,0 +1,1977 @@
+# CRI V1alpha2 接口
+
+## 描述
+
+CRI API 接口是由kubernetes 推出的容器运行时接口,CRI定义了容器和镜像的服务接口。ISulad使用CRI接口,实现和kubernetes 的对接。
+
+因为容器运行时与镜像的生命周期是彼此隔离的,因此需要定义两个服务。该接口使用[Protocol Buffer](https://developers.google.com/protocol-buffers/)定义,基于[gRPC](https://grpc.io/)。
+
+当前iSulad使用默认CRI版本为v1alpha2版本,官方API描述文件如下:
+
+[https://github.com/kubernetes/kubernetes/blob/release-1.14/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto](https://github.com/kubernetes/kubernetes/blob/release-1.14/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto),
+
+ISulad使用的为pass使用的1.14版本API描述文件,与官方API略有出入,以本文档描述的接口为准。
+
+>  **说明:**
+>
+> CRI接口websocket流式服务,服务端侦听地址为127.0.0.1,端口为10350,端口可通过命令行--websocket-server-listening-port参数接口或者daemon.json配置文件进行配置。
+
+## 接口
+
+各接口中可能用到的参数清单如下,部分参数暂不支持配置,已在配置中标出。
+
+### 接口参数列表
+
+- **DNSConfig**
+
+ 配置sandbox的DNS服务器和搜索域
+
+ | 参数成员 | 描述 |
+ |--------------------------|------------------------------------------------------------|
+ | repeated string servers | 集群的DNS服务器列表 |
+ | repeated string searches | 集群的DNS搜索域列表 |
+ | repeated string options | DNS可选项列表,参考 |
+
+- **Protocol**
+
+ 协议的enum值列表
+
+
+ 参数成员
+
+ 描述
+
+
+
+ TCP = 0
+
+ TCP协议
+
+
+ UDP = 1
+
+ UDP协议
+
+
+
+
+
+- **PortMapping**
+
+ 指定sandbox的端口映射配置
+
+ | **参数成员** | **描述** |
+ |----------------------|--------------------|
+ | Protocol protocol | 端口映射使用的协议 |
+ | int32 container_port | 容器内的端口号 |
+ | int32 host_port | 主机上的端口号 |
+ | string host_ip | 主机IP地址 |
+
+- **MountPropagation**
+
+ 挂载传播属性的enum列表
+
+
+ 参数成员
+
+ 描述
+
+
+
+ PROPAGATION_PRIVATE = 0
+
+ 无挂载传播属性,即linux中的private
+
+
+ PROPAGATION_HOST_TO_CONTAINER = 1
+
+ 挂载属性能从host传播到容器中,即linux中的rslave
+
+
+ PROPAGATION_BIDIRECTIONAL = 2
+
+ 挂载属性能在host和容器中双向传播,即linux中的rshared
+
+
+
+
+
+- **Mount**
+
+ Mount指定host上的一个挂载卷挂载到容器中(只支持文件和文件夹\)
+
+ | **参数成员** | **描述** |
+ |------------------------------|---------------------------------------------------------------------------------|
+ | string container_path | 容器中的路径 |
+ | string host_path | 主机上的路径 |
+ | bool readonly | 是否配置在容器中是只读的, 缺省值: false |
+ | bool selinux_relabel | 是否设置SELinux标签(不支持配置) |
+ | MountPropagation propagation | 挂载传播属性配置(取值**0/1/2**,分别对应**private/rslave/rshared**传播属性) **缺省值:0** |
+
+- **NamespaceOption**
+
+
+ 参数成员
+
+ 描述
+
+
+
+ bool host_network
+
+ 是否使用host的网络命名空间
+
+
+ bool host_pid
+
+ 是否使用host的PID命名空间
+
+
+ bool host_ipc
+
+ 是否使用host的IPC命名空间
+
+
+
+
+
+- **Capability**
+
+ 包含待添加与待删除的权能信息
+
+
+ 参数成员
+
+ 描述
+
+
+
+ repeated string add_capabilities
+
+ 待新增的权能
+
+
+ repeated string drop_capabilities
+
+ 待删除的权能
+
+
+
+
+
+- **Int64Value**
+
+ int64类型的封装
+
+
+ 参数成员
+
+ 描述
+
+
+
+ int64 value
+
+ 实际的int64值
+
+
+
+
+
+- **UInt64Value**
+
+ uint64类型的封装
+
+
+ 参数成员
+
+ 描述
+
+
+
+ uint64 value
+
+ 实际的uint64值
+
+
+
+
+
+- **LinuxSandboxSecurityContext**
+
+ 配置sandbox的linux安全选项。
+
+ 注意,这些安全选项不会应用到sandbox中的容器中,也可能不适用于没有任何running进程的sandbox。
+
+ | **参数成员** | **描述** |
+ |------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | NamespaceOption namespace_options | 配置sandbox的命名空间选项 |
+ | SELinuxOption selinux_options | 配置SELinux选项(不支持) |
+ | Int64Value run_as_user | 配置sandbox中进程的uid |
+ | bool readonly_rootfs | 配置sandbox的根文件系统是否只读 |
+ | repeated int64 supplemental_groups | 配置除主GID之外的sandbox的1号进程用户组信息 |
+ | bool privileged | 配置sandbox是否为特权容器 |
+ | string seccomp_profile_path | seccomp配置文件路径,有效值为: // unconfined: 不配置seccomp // localhost/\<配置文件的全路径>: 安装在系统上的配置文件路径 // \<配置文件的全路径>: 配置文件全路径 // 默认不配置,即unconfined。 |
+
+- **LinuxPodSandboxConfig**
+
+ 设定和Linux主机及容器相关的一些配置
+
+ | **参数成员** | **描述** |
+ |----------------------------------------------|-----------------------------------------------------------------------------------------|
+ | string cgroup_parent | sandbox的cgroup父路径,runtime可根据实际情况使用cgroupfs或systemd的语法。(不支持配置) |
+ | LinuxSandboxSecurityContext security_context | sandbox的安全属性 |
+ | map\ sysctls | sandbox的linux sysctls配置 |
+
+- **PodSandboxMetadata**
+
+ Sandbox元数据包含构建sandbox名称的所有信息,鼓励容器运行时在用户界面中公开这些元数据以获得更好的用户体验,例如,运行时可以根据元数据生成sandbox的唯一命名。
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string name
+
+ sandbox的名称
+
+
+ string uid
+
+ sandbox的UID
+
+
+ string namespace
+
+ sandbox的命名空间
+
+
+ uint32 attempt
+
+ 尝试创建sandbox的次数,默认为0
+
+
+
+
+
+- **PodSandboxConfig**
+
+ 包含创建sandbox的所有必选和可选配置信息
+
+ | **参数成员** | **描述** |
+ |------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
+ | PodSandboxMetadata metadata | sandbox的元数据,这项信息唯一标识一个sandbox,runtime必须利用此信息确保操作正确,runtime也可以根据此信息来改善用户体验,例如构建可读的sandbox名称。 |
+ | string hostname | sandbox的hostname |
+ | string log_directory | 配置sandbox内的容器的日志文件所存储的文件夹 |
+ | DNSConfig dns_config | sandbox的DNS配置 |
+ | repeated PortMapping port_mappings | sandbox的端口映射 |
+ | map\ labels | 可用于标识单个或一系列sandbox的键值对 |
+ | map\ annotations | 存储任意信息的键值对,这些值是不可更改的,且能够利用PodSandboxStatus接口查询 |
+ | LinuxPodSandboxConfig linux | 与linux主机相关的可选项 |
+
+- **PodSandboxNetworkStatus**
+
+ 描述sandbox的网络状态
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string ip
+
+ sandbox的ip地址
+
+
+ string name
+
+ sandbox内的网络接口名
+
+
+ string network
+
+ 附加网络的名称
+
+
+
+
+
+- **Namespace**
+
+ 命名空间选项
+
+ | **参数成员** | **描述** |
+ |-------------------------|--------------------|
+ | NamespaceOption options | Linux 命名空间选项 |
+
+- **LinuxPodSandboxStatus**
+
+ 描述Linux sandbox的状态
+
+ | **参数成员** | **描述** |
+ |----------------------|-----------------|
+ | Namespace **namespaces** | sandbox命名空间 |
+
+- **PodSandboxState**
+
+ sandbox状态值的enum数据
+
+
+ 参数成员
+
+ 描述
+
+
+
+ SANDBOX_READY = 0
+
+ sandbox处于ready状态
+
+
+ SANDBOX_NOTREADY = 1
+
+ sandbox处于非ready状态
+
+
+
+
+
+- **PodSandboxStatus**
+
+ 描述Podsandbox的状态信息
+
+ | **参数成员** | **描述** |
+ |-------------------------------------------|---------------------------------------------------|
+ | string id | sandbox的ID |
+ | PodSandboxMetadata metadata | sandbox的元数据 |
+ | PodSandboxState state | sandbox的状态值 |
+ | int64 created_at | sandbox的创建时间戳,单位纳秒 |
+ | repeated PodSandboxNetworkStatus networks | sandbox的多平面网络状态 |
+ | LinuxPodSandboxStatus linux | Linux规范的sandbox状态 |
+ | map\ labels | 可用于标识单个或一系列sandbox的键值对 |
+ | map\ annotations | 存储任意信息的键值对,这些值是不可被runtime更改的 |
+
+- **PodSandboxStateValue**
+
+ 对PodSandboxState的封装
+
+ | **参数成员** | **描述** |
+ |-----------------------|-----------------|
+ | PodSandboxState state | sandbox的状态值 |
+
+- **PodSandboxFilter**
+
+ 用于列出sandbox时添加过滤条件,多个条件取交集显示
+
+ | **参数成员** | **描述** |
+ |------------------------------------|------------------------------------------------------|
+ | string id | sandbox的ID |
+ | PodSandboxStateValue state | sandbox的状态 |
+ | map\ label_selector | sandbox的labels,label只支持完全匹配,不支持正则匹配 |
+
+- **PodSandbox**
+
+ 包含最小化描述一个sandbox的数据
+
+ | **参数成员** | **描述** |
+ |---------------------------------|---------------------------------------------------|
+ | string id | sandbox的ID |
+ | PodSandboxMetadata metadata | sandbox的元数据 |
+ | PodSandboxState state | sandbox的状态值 |
+ | int64 created_at | sandbox的创建时间戳,单位纳秒 |
+ | map\ labels | 可用于标识单个或一系列sandbox的键值对 |
+ | map\ annotations | 存储任意信息的键值对,这些值是不可被runtime更改的 |
+
+- **KeyValue**
+
+ 键值对的封装
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string key
+
+ 键
+
+
+ string value
+
+ 值
+
+
+
+
+
+- **SELinuxOption**
+
+ 应用于容器的SELinux标签
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string user
+
+ 用户
+
+
+ string role
+
+ 角色
+
+
+ string type
+
+ 类型
+
+
+ string level
+
+ 级别
+
+
+
+
+
+- **ContainerMetadata**
+
+ Container元数据包含构建container名称的所有信息,鼓励容器运行时在用户界面中公开这些元数据以获得更好的用户体验,例如,运行时可以根据元数据生成container的唯一命名。
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string name
+
+ container的名称
+
+
+ uint32 attempt
+
+ 尝试创建container的次数,默认为0
+
+
+
+
+
+- **ContainerState**
+
+ 容器状态值的enum列表
+
+
+ 参数成员
+
+ 描述
+
+
+
+ CONTAINER_CREATED = 0
+
+ container创建完成
+
+
+ CONTAINER_RUNNING = 1
+
+ container处于运行状态
+
+
+ CONTAINER_EXITED = 2
+
+ container处于退出状态
+
+
+ CONTAINER_UNKNOWN = 3
+
+ 未知的容器状态
+
+
+
+
+
+- **ContainerStateValue**
+
+ 封装ContainerState的数据结构
+
+ | **参数成员** | **描述** |
+ |----------------------|------------|
+ | ContainerState **state** | 容器状态值 |
+
+- **ContainerFilter**
+
+ 用于列出container时添加过滤条件,多个条件取交集显示
+
+ | **参数成员** | **描述** |
+ |------------------------------------|--------------------------------------------------------|
+ | string id | container的ID |
+ | PodSandboxStateValue state | container的状态 |
+ | string pod_sandbox_id | sandbox的ID |
+ | map\ label_selector | container的labels,label只支持完全匹配,不支持正则匹配 |
+
+- **LinuxContainerSecurityContext**
+
+ 指定应用于容器的安全配置
+
+ | **参数成员** | **描述** |
+ |------------------------------------|------------------------------------------------------------------------------------------------------------------------------------|
+ | Capability capabilities | 新增或去除的权能 |
+ | bool privileged | 指定容器是否未特权模式, **缺省值:false** |
+ | NamespaceOption namespace_options | 指定容器的namespace选项 |
+ | SELinuxOption selinux_options | SELinux context(可选配置项) **暂不支持** |
+ | Int64Value run_as_user | 运行容器进程的UID。 一次只能指定run_as_user与run_as_username其中之一,run_as_username优先生效 |
+ | string run_as_username | 运行容器进程的用户名。 如果指定,用户必须存在于容器映像中(即在映像内的/etc/passwd中),并由运行时在那里解析; 否则,运行时必须出错 |
+ | bool readonly_rootfs | 设置容器中根文件系统是否为只读 **缺省值由config.json配置** |
+ | repeated int64 supplemental_groups | 容器运行的除主GID外首进程组的列表 |
+ | string apparmor_profile | 容器的AppArmor配置文件 **暂不支持** |
+ | string seccomp_profile_path | 容器的seccomp配置文件路径 |
+ | bool no_new_privs | 是否在容器上设置no_new_privs的标志 |
+
+- **LinuxContainerResources**
+
+ 指定Linux容器资源的特定配置
+
+
+ 参数成员
+
+ 描述
+
+
+ int64 cpu_period
+
+ CPU CFS(完全公平调度程序)周期。 缺省值:0
+
+
+ int64 cpu_quota
+
+ CPU CFS(完全公平调度程序)配额。 缺省值:0
+
+
+ int64 cpu_shares
+
+ 所占CPU份额(相对于其他容器的相对权重)。 缺省值:0
+
+
+ int64 memory_limit_in_bytes
+
+ 内存限制(字节)。 缺省值:0
+
+
+ int64 oom_score_adj
+
+ OOMScoreAdj用于调整oom-killer。 缺省值:0
+
+
+ string cpuset_cpus
+
+ 指定容器使用的CPU核心。 缺省值:“”
+
+
+ string cpuset_mems
+
+ 指定容器使用的内存节点。 缺省值:“”
+
+
+
+
+
+- **Image**
+
+ Image信息描述一个镜像的基本数据。
+
+ | **参数成员** | **描述** |
+ |------------------------------|------------------------|
+ | string id | 镜像ID |
+ | repeated string repo_tags | 镜像tag 名称 repo_tags |
+ | repeated string repo_digests | 镜像digest信息 |
+ | uint64 size | 镜像大小 |
+ | Int64Value uid | 镜像默认用户UID |
+ | string username | 镜像默认用户名称 |
+
+- **ImageSpec**
+
+ 表示镜像的内部数据结构,当前,ImageSpec只封装容器镜像名称
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string image
+
+ 容器镜像名
+
+
+
+
+
+- **StorageIdentifier**
+
+ 唯一定义storage的标识
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string uuid
+
+ 设备的UUID
+
+
+
+
+
+- **FilesystemUsage**
+
+ | **参数成员** | **描述** |
+ |------------------------------|----------------------------|
+ | int64 timestamp | 收集文件系统信息时的时间戳 |
+ | StorageIdentifier storage_id | 存储镜像的文件系统UUID |
+ | UInt64Value used_bytes | 存储镜像元数据的大小 |
+ | UInt64Value inodes_used | 存储镜像元数据的inodes个数 |
+
+- **AuthConfig**
+
+
+ 参数成员
+
+ 描述
+
+
+ string username
+
+ 下载镜像使用的用户名
+
+
+ string password
+
+ 下载镜像使用的密码
+
+
+ string auth
+
+ 下载镜像时使用的认证信息,base64编码
+
+
+ string server_address
+
+ 下载镜像的服务器地址,暂不支持
+
+
+ string identity_token
+
+ 用于与镜像仓库鉴权的令牌信息,暂不支持
+
+
+ string registry_token
+
+ 用于与镜像仓库交互的令牌信息,暂不支持
+
+
+
+
+
+- **Container**
+
+ 用于描述容器信息,例如ID, 状态等。
+
+ | **参数成员** | **描述** |
+ |---------------------------------|-------------------------------------------------------------|
+ | string id | container的ID |
+ | string pod_sandbox_id | 该容器所属的sandbox的ID |
+ | ContainerMetadata metadata | container的元数据 |
+ | ImageSpec image | 镜像规格 |
+ | string image_ref | 代表容器使用的镜像,对大多数runtime来产,这是一个image ID值 |
+ | ContainerState state | container的状态 |
+ | int64 created_at | container的创建时间戳,单位为纳秒 |
+ | map\ labels | 可用于标识单个或一系列container的键值对 |
+ | map\ annotations | 存储任意信息的键值对,这些值是不可被runtime更改的 |
+
+- **ContainerStatus**
+
+ 用于描述容器状态信息
+
+ | **参数成员** | **描述** |
+ |---------------------------------|---------------------------------------------------------------------------|
+ | string id | container的ID |
+ | ContainerMetadata metadata | container的元数据 |
+ | ContainerState state | container的状态 |
+ | int64 created_at | container的创建时间戳,单位为纳秒 |
+ | int64 started_at | container启动时的时间戳,单位为纳秒 |
+ | int64 finished_at | container退出时的时间戳,单位为纳秒 |
+ | int32 exit_code | 容器退出码 |
+ | ImageSpec image | 镜像规格 |
+ | string image_ref | 代表容器使用的镜像,对大多数runtime来产,这是一个image ID值 |
+ | string reason | 简要描述为什么容器处于当前状态 |
+ | string message | 易于人工阅读的信息,用于表述容器处于当前状态的原因 |
+ | map\ labels | 可用于标识单个或一系列container的键值对 |
+ | map\ annotations | 存储任意信息的键值对,这些值是不可被runtime更改的 |
+ | repeated Mount mounts | 容器的挂载点信息 |
+ | string log_path | 容器日志文件路径,该文件位于PodSandboxConfig中配置的log_directory文件夹下 |
+
+- **ContainerStatsFilter**
+
+ 用于列出container stats时添加过滤条件,多个条件取交集显示
+
+
+ 参数成员
+
+ 描述
+
+
+
+ string id
+
+ container的ID
+
+
+ string pod_sandbox_id
+
+ sandbox的ID
+
+
+ map<string, string> label_selector
+
+ container的labels,label只支持完全匹配,不支持正则匹配
+
+
+
+
+
+- **ContainerStats**
+
+ 用于列出container stats时添加过滤条件,多个条件取交集显示
+
+ | **参数成员** | **描述** |
+ |--------------------------------|----------------|
+ | ContainerAttributes attributes | 容器的信息 |
+ | CpuUsage cpu | CPU使用情况 |
+ | MemoryUsage memory | 内存使用情况 |
+ | FilesystemUsage writable_layer | 可写层使用情况 |
+
+- **ContainerAttributes**
+
+ 列出container的基本信息
+
+ | **参数成员** | **描述** |
+ |--------------------------------|---------------------------------------------------|
+ | string id | 容器的ID |
+ | ContainerMetadata metadata | 容器的metadata |
+ | map\ labels | 可用于标识单个或一系列container的键值对 |
+ | map\ annotations | 存储任意信息的键值对,这些值是不可被runtime更改的 |
+
+- **CpuUsage**
+
+ 列出container的CPU使用信息
+
+
+ 参数成员
+
+ 描述
+
+
+
+ int64 timestamp
+
+ 时间戳
+
+
+ UInt64Value usage_core_nano_seconds
+
+ CPU的使用值,单位/纳秒
+
+
+
+
+
+- **MemoryUsage**
+
+ 列出container的内存使用信息
+
+
+ 参数成员
+
+ 描述
+
+
+
+ int64 timestamp
+
+ 时间戳
+
+
+ UInt64Value working_set_bytes
+
+ 内存的使用值
+
+
+
+
+
+- **FilesystemUsage**
+
+ 列出container的读写层信息
+
+
+ 参数成员
+
+ 描述
+
+
+
+ int64 timestamp
+
+ 时间戳
+
+
+ StorageIdentifier storage_id
+
+ 可写层目录
+
+
+ UInt64Value used_bytes
+
+ 镜像在可写层的占用字节
+
+
+ UInt64Value inodes_used
+
+ 镜像在可写层的占用inode数
+
+
+
+
+
+- **Device**
+
+ 指定待挂载至容器的主机卷
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_path
+
+ 容器内的挂载路径
+
+
+ string host_path
+
+ 主机上的挂载路径
+
+
+ string permissions
+
+ 设备的Cgroup权限,(r允许容器从指定的设备读取; w允许容器从指定的设备写入; m允许容器创建尚不存在的设备文件)
+
+
+
+
+
+- **LinuxContainerConfig**
+
+ 包含特定于Linux平台的配置
+
+ | **参数成员** | **描述** |
+ |------------------------------------------------|-------------------------|
+ | LinuxContainerResources resources | 容器的资源规范 |
+ | LinuxContainerSecurityContext security_context | 容器的Linux容器安全配置 |
+
+- **ContainerConfig**
+
+ 包含用于创建容器的所有必需和可选字段
+
+ | **参数成员** | **描述** |
+ |---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
+ | ContainerMetadata metadata | 容器的元数据。 此信息将唯一标识容器,运行时应利用此信息来确保正确操作。 运行时也可以使用此信息来提升UX(用户体检设计),例如通过构造可读名称。(必选) |
+ | ImageSpec image | 容器使用的镜像 (**必选**) |
+ | repeated string command | 待执行的命令 **缺省值: "/bin/sh"** |
+ | repeated string args | 待执行命令的参数 |
+ | string working_dir | 命令执行的当前工作路径 |
+ | repeated KeyValue envs | 在容器中配置的环境变量 |
+ | repeated Mount mounts | 待在容器中挂载的挂载点信息 |
+ | repeated Device devices | 待在容器中映射的设备信息 |
+ | map\ labels | 可用于索引和选择单个资源的键值对。 |
+ | map\ annotations | 可用于存储和检索任意元数据的非结构化键值映射。 |
+ | string log_path | 相对于PodSandboxConfig.LogDirectory的路径,用于存储容器主机上的日志(STDOUT和STDERR)。 |
+ | bool stdin | 是否打开容器的stdin |
+ | bool stdin_once | 当某次连接stdin的数据流断开时,是否立即断开其他与stdin连接的数据流 **(暂不支持)** |
+ | bool tty | 是否使用伪终端连接容器的stdio |
+ | LinuxContainerConfig linux | linux系统上容器的特定配置信息 |
+
+- **RuntimeConfig**
+
+ Runtime的网络配置
+
+ | **参数成员** | **描述** |
+ |------------------------------|-------------------|
+ | NetworkConfig network_config | Runtime的网络配置 |
+
+- **RuntimeCondition**
+
+ 描述runtime的状态信息
+
+
+ 参数成员
+
+ 描述
+
+
+ string type
+
+ Runtime状态的类型
+
+
+ bool status
+
+ Runtime状态
+
+
+ string reason
+
+ 简要描述runtime状态变化的原因
+
+
+ string message
+
+ 具备可阅读性的信息表明runtime状态变化的原因
+
+
+
+
+
+- **RuntimeStatus**
+
+ Runtime的状态
+
+
+ 参数成员
+
+ 描述
+
+
+ repeated RuntimeCondition conditions
+
+ 描述当前runtime状态的列表
+
+
+
+
+
+### Runtime服务
+
+Runtime服务中包含操作pod和容器的接口,以及查询runtime自身配置和状态信息的接口。
+
+#### RunPodSandbox
+
+#### 接口原型
+
+```text
+rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse) {}
+```
+
+#### 接口描述
+
+创建和启动一个pod sandbox,若运行成功,sandbox处于ready状态。
+
+#### 注意事项
+
+1. 启动sandbox的默认镜像为rnd-dockerhub.huawei.com/library/pause-$\{machine\}:3.0, 其中$\{machine\}为架构,在x86\_64上,machine的值为amd64,在arm64上,machine的值为aarch64,当前rnd-dockerhub仓库上只有amd64和aarch64镜像可供下载,若机器上无此镜像,请确保机器能从rnd-dockerhub下载,若要使用其他镜像,请参考“iSulad部署配置”中的pod-sandbox-image指定镜像。
+2. 由于容器命名以PodSandboxMetadata中的字段为来源,且以下划线"\_"为分割字符,因此限制metadata中的数据不能包含下划线,否则会出现sandbox运行成功,但无法使用ListPodSandbox接口查询的现象。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|-------------------------|-----------------------------------------------------------------------|
+| PodSandboxConfig config | sandbox的配置 |
+| string runtime_handler | 指定创建sandbox的runtime运行时,当前支持lcr、kata-runtime运行时类型。 |
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ string pod_sandbox_id
+
+ 成功,返回response数据
+
+
+
+
+
+#### StopPodSandbox
+
+#### 接口原型
+
+```text
+rpc StopPodSandbox(StopPodSandboxRequest) returns (StopPodSandboxResponse) {}
+```
+
+#### 接口描述
+
+停止pod sandbox,停止sandbox容器,回收分配给sandbox的网络资源(比如IP地址)。如果有任何running的容器属于该sandbox,则必须被强制停止。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string pod_sandbox_id
+
+ sandbox的id
+
+
+
+
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ 无
+
+ 无
+
+
+
+
+
+#### RemovePodSandbox
+
+#### 接口原型
+
+```text
+rpc RemovePodSandbox(RemovePodSandboxRequest) returns (RemovePodSandboxResponse) {}
+```
+
+#### 接口描述
+
+删除sandbox,如果有任何running的容器属于该sandbox,则必须被强制停止和删除,如果sandbox已经被删除,不能返回错误。
+
+#### 注意事项
+
+1. 删除sandbox时,不会删除sandbox的网络资源,在删除pod前必须先调用StopPodSandbox才能清理网络资源,调用者应当保证在删除sandbox之前至少调用一次StopPodSandbox。
+2. 删除sandbox时,如果sandbox中的容器删除失败,则会出现sanbox被删除但容器还残留的情况,此时需要手动删除残留的容器进行清理。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string pod_sandbox_id
+
+ sandbox的id
+
+
+
+
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ 无
+
+ 无
+
+
+
+
+
+#### PodSandboxStatus
+
+#### 接口原型
+
+```text
+rpc PodSandboxStatus(PodSandboxStatusRequest) returns (PodSandboxStatusResponse) {}
+```
+
+#### 接口描述
+
+查询sandbox的状态,如果sandbox不存在,返回错误。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string pod_sandbox_id
+
+ sandbox的id
+
+
+ bool verbose
+
+ 标识是否显示sandbox的一些额外信息。(暂不支持配置)
+
+
+
+
+
+#### 返回值
+
+| **返回值** | **描述** |
+|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------|
+| PodSandboxStatus status | sandbox的状态信息 |
+| map\ info | sandbox的额外信息,key是任意string,value是json格式的字符串,这些信息可以是任意调试内容。当verbose为true时info不能为空。(暂不支持配置) |
+
+#### ListPodSandbox
+
+#### 接口原型
+
+```text
+rpc ListPodSandbox(ListPodSandboxRequest) returns (ListPodSandboxResponse) {}
+```
+
+#### 接口描述
+
+返回sandbox信息的列表,支持条件过滤。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|-------------------------|--------------|
+| PodSandboxFilter filter | 条件过滤参数 |
+
+#### 返回值
+
+| **返回值** | **描述** |
+|---------------------------|-------------------|
+| repeated PodSandbox items | sandbox信息的列表 |
+
+#### CreateContainer
+
+#### 接口原型
+
+```text
+rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse) {}
+```
+
+#### 接口描述
+
+在PodSandbox内创建一个容器。
+
+#### 注意事项
+
+- 请求CreateContainerRequest 中的sandbox\_config与传递给RunPodSandboxRequest以创建PodSandbox的配置相同。 它再次传递,只是为了方便参考。 PodSandboxConfig是不可变的,在pod的整个生命周期内保持不变。
+- 由于容器命名以ContainerMetadata中的字段为来源,且以下划线"\_"为分割字符,因此限制metadata中的数据不能包含下划线,否则会出现sandbox运行成功,但无法使用ListContainers接口查询的现象。
+- CreateContainerRequest中无runtime\_handler字段,创建container时的runtime类型和其对应的sandbox的runtime相同。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|---------------------------------|------------------------------------|
+| string pod_sandbox_id | 待在其中创建容器的PodSandbox的ID。 |
+| ContainerConfig config | 容器的配置信息 |
+| PodSandboxConfig sandbox_config | PodSandbox的配置信息 |
+
+#### 补充
+
+可用于存储和检索任意元数据的非结构化键值映射。有一些字段由于cri接口没有提供特定的参数,可通过该字段将参数传入
+
+- 自定义
+
+
+ 自定义 key:value
+
+ 描述
+
+
+ cgroup.pids.max:int64_t
+
+ 用于限制容器内的进/线程数(set -1 for unlimited)
+
+
+
+
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ string container_id
+
+ 创建完成的容器ID
+
+
+
+
+
+#### StartContainer
+
+#### 接口原型
+
+```text
+rpc StartContainer(StartContainerRequest) returns (StartContainerResponse) {}
+```
+
+#### 接口描述
+
+启动一个容器。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器id
+
+
+
+
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ 无
+
+ 无
+
+
+
+
+
+#### StopContainer
+
+#### 接口原型
+
+```text
+rpc StopContainer(StopContainerRequest) returns (StopContainerResponse) {}
+```
+
+#### 接口描述
+
+停止一个running的容器,支持配置优雅停止时间timeout,如果容器已经停止,不能返回错误。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器id
+
+
+ int64 timeout
+
+ 强制停止容器前的等待时间,缺省值为0,即强制停止容器。
+
+
+
+
+
+#### 返回值
+
+无
+
+#### RemoveContainer
+
+#### 接口原型
+
+```text
+rpc RemoveContainer(RemoveContainerRequest) returns (RemoveContainerResponse) {}
+```
+
+#### 接口描述
+
+删除一个容器,如果容器正在运行,必须强制停止,如果容器已经被删除,不能返回错误。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器id
+
+
+
+
+
+#### 返回值
+
+无
+
+#### ListContainers
+
+#### 接口原型
+
+```text
+rpc ListContainers(ListContainersRequest) returns (ListContainersResponse) {}
+```
+
+#### 接口描述
+
+返回container信息的列表,支持条件过滤。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|------------------------|--------------|
+| ContainerFilter filter | 条件过滤参数 |
+
+#### 返回值
+
+| **返回值** | **描述** |
+|-------------------------------|----------------|
+| repeated Container containers | 容器信息的列表 |
+
+#### ContainerStatus
+
+#### 接口原型
+
+```text
+rpc ContainerStatus(ContainerStatusRequest) returns (ContainerStatusResponse) {}
+```
+
+#### 接口描述
+
+返回容器状态信息,如果容器不存在,则返回错误。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器id
+
+
+ bool verbose
+
+ 标识是否显示sandbox的一些额外信息。(暂不支持配置)
+
+
+
+
+
+#### 返回值
+
+| **返回值** | **描述** |
+|--------------------------|------------------------------------------------------------------------------------------------------------------------------------------|
+| ContainerStatus status | 容器的状态信息 |
+| map\ info | sandbox的额外信息,key是任意string,value是json格式的字符串,这些信息可以是任意调试内容。当verbose为true时info不能为空。(暂不支持配置) |
+
+#### UpdateContainerResources
+
+#### 接口原型
+
+```text
+rpc UpdateContainerResources(UpdateContainerResourcesRequest) returns (UpdateContainerResourcesResponse) {}
+```
+
+#### 接口描述
+
+该接口用于更新容器资源配置。
+
+#### 注意事项
+
+- 该接口仅用于更新容器的资源配置,不能用于更新Pod的资源配置。
+- 当前不支持更新容器oom\_score\_adj配置。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|-------------------------------|-------------------|
+| string container_id | 容器id |
+| LinuxContainerResources linux | linux资源配置信息 |
+
+#### 返回值
+
+无
+
+#### ExecSync
+
+#### 接口原型
+
+```text
+rpc ExecSync(ExecSyncRequest) returns (ExecSyncResponse) {}
+```
+
+#### 接口描述
+
+以同步的方式在容器中执行命令,采用的gRPC通讯方式。
+
+#### 注意事项
+
+执行一条单独的命令,不能打开终端与容器交互。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器ID
+
+
+ repeated string cmd
+
+ 待执行命令
+
+
+ int64 timeout
+
+ 停止命令的超时时间(秒)。 缺省值:0(无超时限制)。 暂不支持
+
+
+
+
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ bytes stdout
+
+ 捕获命令标准输出
+
+
+ bytes stderr
+
+ 捕获命令标准错误输出
+
+
+ int32 exit_code
+
+ 退出代码命令完成。 缺省值:0(成功)。
+
+
+
+
+
+#### Exec
+
+#### 接口原型
+
+```text
+rpc Exec(ExecRequest) returns (ExecResponse) {}
+```
+
+#### 接口描述
+
+在容器中执行命令,采用的gRPC通讯方式从CRI服务端获取url,再通过获得的url与websocket服务端建立长连接,实现与容器的交互。
+
+#### 注意事项
+
+执行一条单独的命令,也能打开终端与容器交互。stdin/stdout/stderr之一必须是真的。如果tty为真,stderr必须是假的。 不支持多路复用, 在这种情况下, stdout和stderr的输出将合并为单流。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器ID
+
+
+ repeated string cmd
+
+ 待执行的命令
+
+
+ bool tty
+
+ 是否在TTY中执行命令
+
+
+ bool stdin
+
+ 是否流式标准输入
+
+
+ bool stdout
+
+ 是否流式标准输出
+
+
+ bool stderr
+
+ 是否流式输出标准错误
+
+
+
+
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ string url
+
+ exec流服务器的完全限定URL
+
+
+
+
+
+#### Attach
+
+#### 接口原型
+
+```text
+rpc Attach(AttachRequest) returns (AttachResponse) {}
+```
+
+#### 接口描述
+
+接管容器的1号进程,采用gRPC通讯方式从CRI服务端获取url,再通过获取的url与websocket服务端建立长连接,实现与容器的交互。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器id
+
+
+ bool tty
+
+ 是否在TTY中执行命令
+
+
+ bool stdin
+
+ 是否流式标准输入
+
+
+ bool stdout
+
+ 是否流式标准输出
+
+
+ bool stderr
+
+ 是否流式标准错误
+
+
+
+
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ string url
+
+ attach流服务器的完全限定URL
+
+
+
+
+
+#### ContainerStats
+
+#### 接口原型
+
+```text
+rpc ContainerStats(ContainerStatsRequest) returns (ContainerStatsResponse) {}
+```
+
+#### 接口描述
+
+返回单个容器占用资源信息,仅支持runtime类型为lcr的容器。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ string container_id
+
+ 容器id
+
+
+
+
+
+#### 返回值
+
+| **返回值** | **描述** |
+|----------------------|---------------------------------------------------------|
+| ContainerStats stats | 容器信息。 注:disk和inodes只支持oci格式镜像起的容器查询 |
+
+#### ListContainerStats
+
+#### 接口原型
+
+```text
+rpc ListContainerStats(ListContainerStatsRequest) returns (ListContainerStatsResponse) {}
+```
+
+#### 接口描述
+
+返回多个容器占用资源信息,支持条件过滤
+
+#### 参数
+
+| **参数成员** | **描述** |
+|-----------------------------|--------------|
+| ContainerStatsFilter filter | 条件过滤参数 |
+
+#### 返回值
+
+| **返回值** | **描述** |
+|-------------------------------|-----------------------------------------------------------------|
+| repeated ContainerStats stats | 容器信息的列表。注:disk和inodes只支持oci格式镜像启动的容器查询 |
+
+#### UpdateRuntimeConfig
+
+#### 接口原型
+
+```text
+rpc UpdateRuntimeConfig(UpdateRuntimeConfigRequest) returns (UpdateRuntimeConfigResponse);
+```
+
+#### 接口描述
+
+提供标准的CRI接口,目的为了更新网络插件的Pod CIDR,当前CNI网络插件无需更新Pod CIDR,因此该接口只会记录访问日志。
+
+#### 注意事项
+
+接口操作不会对系统管理信息修改,只是记录一条日志。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|------------------------------|-------------------------|
+| RuntimeConfig runtime_config | 包含Runtime要配置的信息 |
+
+#### 返回值
+
+无
+
+#### Status
+
+#### 接口原型
+
+```text
+rpc Status(StatusRequest) returns (StatusResponse) {};
+```
+
+#### 接口描述
+
+获取runtime和pod的网络状态,在获取网络状态时,会触发网络配置的刷新。
+
+#### 注意事项
+
+如果网络配置刷新失败,不会影响原有配置;只有刷新成功时,才会覆盖原有配置。
+
+#### 参数
+
+
+ 参数成员
+
+ 描述
+
+
+ bool verbose
+
+ 是否显示关于Runtime额外的信息(暂不支持)
+
+
+
+
+
+#### 返回值
+
+| **返回值** | **描述** |
+|--------------------------|-------------------------------------------------------------------------------------------------------------|
+| RuntimeStatus status | Runtime的状态 |
+| map\ info | Runtime额外的信息,info的key为任意值,value为json格式,可包含任何debug信息;只有Verbose为true是才应该被赋值 |
+
+### Image服务
+
+提供了从镜像仓库拉取、查看、和移除镜像的gRPC API。
+
+#### ListImages
+
+#### 接口原型
+
+```text
+rpc ListImages(ListImagesRequest) returns (ListImagesResponse) {}
+```
+
+#### 接口描述
+
+列出当前已存在的镜像信息。
+
+#### 注意事项
+
+为统一接口,对于embedded格式镜像,可以通过cri images查询到。但是因embedded镜像不是标准OCI镜像,因此查询得到的结果有以下限制:
+
+- 因embedded镜像无镜像ID,显示的镜像ID为镜像的config digest。
+- 因embedded镜像本身无digest仅有config的digest,且格式不符合OCI镜像规范,因此无法显示digest。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|------------------|----------------|
+| ImageSpec filter | 筛选的镜像名称 |
+
+#### 返回值
+
+| **返回值** | **描述** |
+|-----------------------|--------------|
+| repeated Image images | 镜像信息列表 |
+
+#### ImageStatus
+
+#### 接口原型
+
+```text
+rpc ImageStatus(ImageStatusRequest) returns (ImageStatusResponse) {}
+```
+
+#### 接口描述
+
+查询指定镜像信息。
+
+#### 注意事项
+
+1. 查询指定镜像信息,若镜像不存在,则返回ImageStatusResponse,其中Image设置为nil。
+2. 为统一接口,对于embedded格式镜像,因不符合OCI格式镜像,缺少字段,无法通过本接口进行查询。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|-----------------|----------------------------------------|
+| ImageSpec image | 镜像名称 |
+| bool verbose | 查询额外信息,暂不支持,无额外信息返回 |
+
+#### 返回值
+
+| **返回值** | **描述** |
+|--------------------------|----------------------------------------|
+| Image image | 镜像信息 |
+| map\ info | 镜像额外信息,暂不支持,无额外信息返回 |
+
+#### PullImage
+
+#### 接口原型
+
+```text
+ rpc PullImage(PullImageRequest) returns (PullImageResponse) {}
+```
+
+#### 接口描述
+
+下载镜像。
+
+#### 注意事项
+
+当前支持下载public镜像,使用用户名、密码、auth信息下载私有镜像,不支持authconfig中的server\_address、identity\_token、registry\_token字段。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|---------------------------------|-----------------------------------|
+| ImageSpec image | 要下载的镜像名称 |
+| AuthConfig auth | 下载私有镜像时的验证信息 |
+| PodSandboxConfig sandbox_config | 在Pod上下文中下载镜像(暂不支持) |
+
+#### 返回值
+
+
+ 返回值
+
+ 描述
+
+
+ string image_ref
+
+ 返回已下载镜像信息
+
+
+
+
+
+#### RemoveImage
+
+#### 接口原型
+
+```text
+rpc RemoveImage(RemoveImageRequest) returns (RemoveImageResponse) {}
+```
+
+#### 接口描述
+
+删除指定镜像。
+
+#### 注意事项
+
+为统一接口,对于embedded格式镜像,因不符合OCI格式镜像,缺少字段,无法通过本接口使用image id进行删除。
+
+#### 参数
+
+| **参数成员** | **描述** |
+|-----------------|------------------------|
+| ImageSpec image | 要删除的镜像名称或者ID |
+
+#### 返回值
+
+无
+
+#### ImageFsInfo
+
+#### 接口原型
+
+```text
+rpc ImageFsInfo(ImageFsInfoRequest) returns (ImageFsInfoResponse) {}
+```
+
+#### 接口描述
+
+查询存储镜像的文件系统信息。
+
+#### 注意事项
+
+查询到的为镜像元数据下的文件系统信息。
+
+#### 参数
+
+无
+
+#### 返回值
+
+| **返回值** | **描述** |
+|--------------------------------------------|----------------------|
+| repeated FilesystemUsage image_filesystems | 镜像存储文件系统信息 |
+
+### 约束
+
+1. 如果创建sandbox时,PodSandboxConfig参数中配置了log\_directory,则所有属于该sandbox的container在创建时必须在ContainerConfig中指定log\_path,否则可能导致容器无法使用CRI接口启动,甚至无法使用CRI接口删除。
+
+ 容器的真实LOGPATH=log\_directory/log\_path,如果log\_path不配置,那么最终的LOGPATH会变为LOGPATH=log\_directory。
+
+ - 如果该路径不存在,isulad在启动容器时会创建一个软链接,指向最终的容器日志真实路径,此时log\_directory变成一个软链接,此时有两种情况:
+ 1. 第一种情况,如果该sandbox里其他容器也没配置log\_path,在启动其他容器时,log\_directory会被删除,然后重新指向新启动容器的log\_path,导致之前启动的容器日志指向后面启动容器的日志。
+ 2. 第二种情况,如果该sandbox里其他容器配置了log\_path,则该容器的LOGPATH=log\_directory/log\_path,由于log\_directory实际是个软链接,使用log\_directory/log\_path为软链接指向容器真实日志路径时,创建会失败。
+
+ - 如果该路径存在,isulad在启动容器时首先会尝试删除该路径(非递归),如果该路径是个文件夹,且里面有内容,删除会失败,从而导致创建软链接失败,容器启动失败,删除该容器时,也会出现同样的现象,导致删除失败。
+
+2. 如果创建sandbox时,PodSandboxConfig参数中配置了log\_directory,且container创建时在ContainerConfig中指定log\_path,那么最终的LOGPATH=log\_directory/log\_path,isulad不会递归的创建LOGPATH,因而用户必须保证dirname\(LOGPATH\)存在,即最终的日志文件的上一级路径存在。
+3. 如果创建sandbox时,PodSandboxConfig参数中配置了log\_directory,如果有两个或多个container创建时在ContainerConfig中指定了同一个log\_path,或者不同的sandbox内的容器最终指向的LOGPATH是同一路径,若容器启动成功,则后启动的容器日志路径会覆盖掉之前启动的容器日志路径。
+4. 如果远程镜像仓库中镜像内容发生变化,调用CRI Pull image接口重新下载该镜像时,若本地原来存储有原镜像,则原镜像的镜像名称、TAG会变更为“none”
+
+ 举例如下:
+
+ 本地已存储镜像:
+
+ ```text
+ IMAGE TAG IMAGE ID SIZE
+ rnd-dockerhub.huawei.com/pproxyisulad/test latest 99e59f495ffaa 753kB
+ ```
+
+ 远程仓库中rnd-dockerhub.huawei.com/pproxyisulad/test:latest 镜像更新后,重新下载后:
+
+ ```text
+ IMAGE TAG IMAGE ID SIZE
+ 99e59f495ffaa 753kB
+ rnd-dockerhub.huawei.com/pproxyisulad/test latest d8233ab899d41 1.42MB
+ ```
+
+ 使用isula images 命令行查询,REF显示为"-":
+
+ ```text
+ REF IMAGE ID CREATED SIZE
+ rnd-dockerhub.huawei.com/pproxyisulad/test:latest d8233ab899d41 2019-02-14 19:19:37 1.42MB
+ - 99e59f495ffaa 2016-05-04 02:26:41 753kB
+ ```
+
+5. iSulad CRI exec/attach接口采用websocket协议实现,需要采用同样协议的客户端与iSulad进行交互;使用exec/attach接口时,请避免进行串口大量数据及文件的传输,仅用于基本命令交互,若用户侧处理不及时将存在数据丢失的风险;同时请勿使用cri exec/attach接口进行二进制数据及文件传输。
+6. iSulad CRI exec/attach流式接口依赖libwebsockets实现,流式接口建议仅用于长连接交互使用,不建议在大并发场景下使用,可能会因为宿主机资源不足导致连接失败,建议并发量不超过100。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/errorLabelCheck.py b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/errorLabelCheck.py
new file mode 100644
index 0000000000000000000000000000000000000000..153724c54b4695d4fd58e84faa84c0453650a4cb
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/errorLabelCheck.py
@@ -0,0 +1,121 @@
+import re
+import os
+from common import get_pr_files
+
+
+def check_unclosed_tags(html, markdown_lines, html_start_line):
+ """
+ 检查未闭合的HTML标签,并返回错误信息。
+ 行号信息映射到原始 Markdown 文件中的位置。
+ """
+ stack = []
+ index = 0
+ line_number = 1
+ errors = []
+ # 精确匹配 HTML 标签的正则表达式
+ html_tag_pattern = re.compile(r'<([a-zA-Z]+)(?:\s[^>]*)?(?:/>|>)|([a-zA-Z]+)>')
+
+ while index < len(html):
+ match = html_tag_pattern.search(html, index)
+ if not match:
+ break
+
+ start_index = match.start()
+ end_index = match.end()
+ tag = match.group(0)
+
+ # 更新行号
+ line_number += html[index:start_index].count('\n')
+
+ # 将 HTML 中的行号映射到原始 Markdown 文件中的行号
+ markdown_line_number = html_start_line + line_number - 1
+
+ if tag.startswith(''):
+ # 处理结束标签
+ closing_tag = match.group(2)
+ if stack and stack[-1][0] == closing_tag:
+ stack.pop()
+ else:
+ # 未匹配到对应的开始标签,记录错误
+ errors.append(f"在文件中的第 {markdown_line_number} 行发现未匹配的结束标签: {tag}")
+ else:
+ # 处理开始标签
+ tag_name = match.group(1)
+ if tag.endswith('/>'):
+ # 自闭合标签,不压入栈中
+ pass
+ else:
+ stack.append((tag_name, markdown_line_number)) # 记录标签名和行号
+
+ index = end_index
+
+ # 检查栈中是否还有未闭合的开始标签
+ if stack:
+ for tag, tag_line in stack:
+ errors.append(f"在文件中的第 {tag_line} 行发现未闭合的开始标签: <{tag}>")
+
+ return errors
+
+
+def extract_html_from_markdown(markdown):
+ html_blocks = []
+ block_start_lines = []
+ # 匹配 HTML 块的正则表达式,如 ...
这种完整块
+ html_block_pattern = re.compile(r'<([a-zA-Z]+)(?:\s[^>]*)?>(.*?)\1>', re.DOTALL)
+ # 匹配单个 HTML 标签的正则表达式
+ single_tag_pattern = re.compile(r'<([a-zA-Z]+)(?:\s[^>]*)?/>')
+
+ # 先提取完整的 HTML 块
+ for match in html_block_pattern.finditer(markdown):
+ start_index = match.start()
+ start_line = markdown[:start_index].count('\n') + 1
+ html_blocks.append(match.group(0))
+ block_start_lines.append(start_line)
+
+ # 再提取单个自闭合 HTML 标签
+ for match in single_tag_pattern.finditer(markdown):
+ start_index = match.start()
+ start_line = markdown[:start_index].count('\n') + 1
+ html_blocks.append(match.group(0))
+ block_start_lines.append(start_line)
+
+ return html_blocks, block_start_lines
+
+
+def process_markdown_file(file_path):
+ """
+ 处理Markdown文件,修复未闭合的HTML标签。
+ """
+ with open(file_path, 'r', encoding='utf-8') as file:
+ content = file.read()
+ markdown_lines = content.split('\n')
+
+ html_blocks, block_start_lines = extract_html_from_markdown(content)
+ all_errors = []
+
+ for html_block, start_line in zip(html_blocks, block_start_lines):
+ errors = check_unclosed_tags(html_block, markdown_lines, start_line)
+ all_errors.extend(errors)
+
+ if all_errors:
+ for error in all_errors:
+ print(f"文件{file_path}中发现错误:{error}")
+ raise ValueError("发现未闭合的HTML标签")
+ else:
+ print(f"文件 {file_path} 中的HTML标签已检查,未发现未闭合标签。")
+
+
+if __name__ == "__main__":
+ try:
+ pr_files = 'docs/zh/Cloud/ContainerEngine/iSulaContainerEngine/安装特性.md'
+ for pr_file in pr_files:
+ if not os.path.exists(pr_file):
+ print(f"文件不存在: {pr_file}")
+ continue
+ if ' ' in pr_file:
+ pr_file = pr_file.replace(' ', '\ ')
+ process_markdown_file(pr_file)
+ print(f"文件 {pr_file} 中的HTML标签已检查,未发现未闭合标签。")
+ except ValueError as e:
+ print(f"错误: {e}")
+ exit(1) # 退出脚本并返回非零状态码
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/figures/zh-cn_image_0183048952.png b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/figures/zh-cn_image_0183048952.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe9074f8fba969795f1e1d40fb879e21d5fc2a7c
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/figures/zh-cn_image_0183048952.png differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/image-management.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/image-management.md
new file mode 100644
index 0000000000000000000000000000000000000000..5824b3bf6bf347b0833e2302509ba6333c48bb83
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/image-management.md
@@ -0,0 +1,495 @@
+# 镜像管理
+
+
+
+- [镜像管理](#镜像管理)
+ - [docker镜像管理](#docker镜像管理)
+ - [登录到镜像仓库](#登录到镜像仓库)
+ - [从镜像仓库退出登录](#从镜像仓库退出登录)
+ - [从镜像仓库拉取镜像](#从镜像仓库拉取镜像)
+ - [删除镜像](#删除镜像)
+ - [加载镜像](#加载镜像)
+ - [列出镜像](#列出镜像)
+ - [检视镜像](#检视镜像)
+ - [双向认证](#双向认证)
+ - [embedded镜像管理](#embedded镜像管理)
+ - [加载镜像](#加载镜像-1)
+ - [列出镜像](#列出镜像-1)
+ - [检视镜像](#检视镜像-1)
+ - [删除镜像](#删除镜像-1)
+
+
+
+## docker镜像管理
+
+### 登录到镜像仓库
+
+#### 描述
+
+isula login命令用于登录到镜像仓库。登录成功后可以使用isula pull命令从该镜像仓库拉取镜像。如果镜像仓库不需要密码,则拉取镜像前不需要执行该命令。
+
+#### 用法
+
+```bash
+isula login [OPTIONS] SERVER
+```
+
+#### 参数
+
+login命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表1 表1-20 login命令参数列表" 。
+
+#### 示例
+
+```bash
+$ isula login -u abc my.csp-edge.com:5000
+
+Login Succeeded
+```
+
+### 从镜像仓库退出登录
+
+#### 描述
+
+isula logout命令用于从镜像仓库退出登录。退出登录成功后再执行isula pull命令从该镜像仓库拉取镜像会因为未认证而拉取失败。
+
+#### 用法
+
+```bash
+isula logout SERVER
+```
+
+#### 参数
+
+logout命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表2 logout命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula logout my.csp-edge.com:5000
+Logout Succeeded
+```
+
+### 从镜像仓库拉取镜像
+
+#### 描述
+
+从镜像仓库拉取镜像到本地。
+
+#### 用法
+
+```bash
+isula pull [OPTIONS] NAME[:TAG]
+```
+
+#### 参数
+
+login命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表3 pull命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula pull localhost:5000/official/busybox
+Image "localhost:5000/official/busybox" pulling
+Image "localhost:5000/official/busybox@sha256:bf510723d2cd2d4e3f5ce7e93bf1e52c8fd76831995ac3bd3f90ecc866643aff" pulled
+```
+
+### 删除镜像
+
+#### 描述
+
+删除一个或多个镜像。
+
+#### 用法
+
+```bash
+isula rmi [OPTIONS] IMAGE [IMAGE...]
+```
+
+#### 参数
+
+rmi命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表4 rmi命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula rmi rnd-dockerhub.huawei.com/official/busybox
+Image "rnd-dockerhub.huawei.com/official/busybox" removed
+```
+
+### 添加镜像标签
+
+#### 描述
+
+tag命令用于添加镜像标签
+
+#### 用法
+
+```bash
+isula tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
+```
+
+#### 参数
+
+tag命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表8 tag命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula tag busybox:latest test:latest
+```
+
+### 加载镜像
+
+#### 描述
+
+从一个tar包加载镜像。该tar包必须是使用docker save命令导出的tar包或格式一致的tar包。
+
+#### 用法
+
+```bash
+isula load [OPTIONS]
+```
+
+#### 参数
+
+load命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表5 load命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula load -i busybox.tar
+Load image from "/root/busybox.tar" success
+```
+
+### 列出镜像
+
+#### 描述
+
+列出当前环境中所有镜像。
+
+#### 用法
+
+```bash
+isula images [OPTIONS]
+```
+
+#### 参数
+
+images命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表6 images命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox latest beae173ccac6 2021-12-31 03:19:41 1.184MB
+```
+
+### 检视镜像
+
+#### 描述
+
+返回该镜像的配置信息。可以使用-f参数过滤出需要的信息。
+
+#### 用法
+
+```bash
+isula inspect [options] CONTAINER|IMAGE [CONTAINER|IMAGE...]
+```
+
+#### 参数
+
+inspect命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表7 inspect命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula inspect -f "{{json .image.id}}" rnd-dockerhub.huawei.com/official/busybox
+"e4db68de4ff27c2adfea0c54bbb73a61a42f5b667c326de4d7d5b19ab71c6a3b"
+```
+
+### 双向认证
+
+#### 描述
+
+开启该功能后isulad和镜像仓库之间的通信采用https通信,isulad和镜像仓库都会验证对方的合法性。
+
+#### 用法
+
+要支持该功能,需要镜像仓库支持该功能,同时isulad也需要做相应的配置:
+
+1. 修改isulad的配置\(默认路径/etc/isulad/daemon.json\),将配置里的use-decrypted-key项配置为false。
+2. 需要将相关的证书放置到/etc/isulad/certs.d目录下对应的镜像仓库命名的文件夹下,证书具体的生成方法见docker的官方链接:
+ - [https://docs.docker.com/engine/security/certificates/](https://docs.docker.com/engine/security/certificates/)
+ - [https://docs.docker.com/engine/security/https/](https://docs.docker.com/engine/security/https/)
+
+3. 执行systemctl restart isulad重启isulad。
+
+#### 参数
+
+可以在/etc/isulad/daemon.json中配置参数,也可以在启动isulad时携带参数:
+
+```bash
+isulad --use-decrypted-key=false
+```
+
+#### 示例
+
+配置use-decrypted-key参数为false
+
+```bash
+$ cat /etc/isulad/daemon.json
+{
+ "group": "isulad",
+ "graph": "/var/lib/isulad",
+ "state": "/var/run/isulad",
+ "engine": "lcr",
+ "log-level": "ERROR",
+ "pidfile": "/var/run/isulad.pid",
+ "log-opts": {
+ "log-file-mode": "0600",
+ "log-path": "/var/lib/isulad",
+ "max-file": "1",
+ "max-size": "30KB"
+ },
+ "log-driver": "stdout",
+ "hook-spec": "/etc/default/isulad/hooks/default.json",
+ "start-timeout": "2m",
+ "storage-driver": "overlay2",
+ "storage-opts": [
+ "overlay2.override_kernel_check=true"
+ ],
+ "registry-mirrors": [
+ "docker.io"
+ ],
+ "insecure-registries": [
+ "rnd-dockerhub.huawei.com"
+ ],
+ "pod-sandbox-image": "",
+ "image-opt-timeout": "5m",
+ "native.umask": "secure",
+ "network-plugin": "",
+ "cni-bin-dir": "",
+ "cni-conf-dir": "",
+ "image-layer-check": false,
+ "use-decrypted-key": false,
+ "insecure-skip-verify-enforce": false
+}
+```
+
+将证书放到对应的目录下
+
+```bash
+$ pwd
+/etc/isulad/certs.d/my.csp-edge.com:5000
+$ ls
+ca.crt tls.cert tls.key
+```
+
+重启isulad
+
+```bash
+$ systemctl restart isulad
+```
+
+执行pull命令从仓库下载镜像
+
+```bash
+$ isula pull my.csp-edge.com:5000/busybox
+Image "my.csp-edge.com:5000/busybox" pulling
+Image "my.csp-edge.com:5000/busybox@sha256:f1bdc62115dbfe8f54e52e19795ee34b4473babdeb9bc4f83045d85c7b2ad5c0" pulled
+```
+
+### 导入rootfs
+
+#### 描述
+
+把包含了一个rootfs的tar包导入为镜像,该tar包一般是之前使用export命令导出的,也可以是格式兼容的包含rootfs的tar包。目前支持
+格式(.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz),请勿使用其他格式的tar包进行导入。
+
+#### 用法
+
+```bash
+isula import file REPOSITORY[:TAG]
+```
+
+导入成功后打印的字符串是导入的rootfs生成的镜像id
+
+#### 参数
+
+import命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表9 import命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula import busybox.tar test
+sha256:441851e38dad32478e6609a81fac93ca082b64b366643bafb7a8ba398301839d
+$ isula images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+test latest 441851e38dad 2020-09-01 11:14:35 1.168 MB
+```
+
+### 导出rootfs
+
+#### 描述
+
+把一个容器的rootfs文件系统内容导出成tar包,导出的rootfs的tar包可以在后面使用import功能重新导入成镜像。
+
+#### 用法
+
+```bash
+isula export [OPTIONS] [ID|NAME]
+```
+
+#### 参数
+
+export命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表10 export命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula run -tid --name container_test test sh
+d7e601c2ef3eb8d378276d2b42f9e58a2f36763539d3bfcaf3a0a77dc668064b
+$ isula export -o rootfs.tar d7e601c
+$ ls
+rootfs.tar
+```
+
+## embedded镜像管理
+
+### 加载镜像
+
+#### 描述
+
+根据embedded镜像的manifest加载镜像。注意--type的值必须填写embedded。
+
+#### 用法
+
+```bash
+isula load [OPTIONS] --input=FILE --type=TYPE
+```
+
+#### 参数
+
+load命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表5 load命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula load -i test.manifest --type embedded
+Load image from "/root/work/bugfix/tmp/ci_testcase_data/embedded/img/test.manifest" success
+```
+
+### 列出镜像
+
+#### 描述
+
+列出当前环境中所有镜像。
+
+#### 用法
+
+```bash
+isula images [OPTIONS]
+```
+
+#### 参数
+
+images命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表6 images命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox latest beae173ccac6 2021-12-31 03:19:41 1.184MB
+```
+
+### 检视镜像
+
+#### 描述
+
+返回该镜像的配置信息。可以使用-f参数过滤出需要的信息。
+
+#### 用法
+
+```bash
+isula inspect [options] CONTAINER|IMAGE [CONTAINER|IMAGE...]
+```
+
+#### 参数
+
+inspect命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表7 inspect命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula inspect -f "{{json .created}}" test:v1
+"2018-03-01T15:55:44.322987811Z"
+```
+
+### 删除镜像
+
+#### 描述
+
+删除一个或多个镜像。
+
+#### 用法
+
+```bash
+isula rmi [OPTIONS] IMAGE [IMAGE...]
+```
+
+#### 参数
+
+rmi命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表4 rmi命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula rmi test:v1
+Image "test:v1" removed
+```
+
+### 添加名称
+
+#### 描述
+
+给镜像添加一个名称。
+
+#### 用法
+
+```bash
+isula tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
+```
+
+#### 参数
+
+tag命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表8 tag命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula tag test:v1 test:v2
+```
+
+### 导入镜像
+
+#### 描述
+
+将tar格式的rootfs导入生成一个新的镜像,该tar包必须是通过export命令导出的tar包。
+
+#### 用法
+
+```bash
+isula export [command options] [ID|NAME]
+```
+
+#### 参数
+
+export命令支持参数请参见"附录 > 命令行参数说明" 章节的 "表9 export命令参数列表"。
+
+#### 示例
+
+```bash
+$ isula export -o test.tar containername
+```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/installation-configuration.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/installation-configuration.md
new file mode 100644
index 0000000000000000000000000000000000000000..1de46d31627c6164e373362404094728fda57bbd
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/installation-configuration.md
@@ -0,0 +1,1022 @@
+# 安装与配置
+
+本章介绍iSulad的安装、安装后配置,以及升级和卸载的方法。
+>  **说明:**
+>
+> iSulad的安装、升级、卸载均需要使用root权限。
+
+## 安装方法
+
+iSulad可以通过yum或rpm命令两种方式安装,由于yum会自动安装依赖,而rpm命令需要手动安装所有依赖,所以推荐使用yum安装。
+
+这里给出两种安装方式的操作方法。
+
+- (推荐)使用yum安装iSulad,参考命令如下:
+
+ ```bash
+ # sudo yum install -y iSulad
+ ```
+
+- 使用rpm安装iSulad,需要下载iSulad及其所有依赖的RPM包,然后手动安装。安装单个iSulad的RPM包(依赖包安装方式相同),参考命令如下:
+
+ ```bash
+ # sudo rpm -ihv iSulad-xx.xx.xx-xx.xxx.aarch64.rpm
+ ```
+
+## 配置方法
+
+iSulad 安装完成后,可以根据需要进行相关配置。
+
+### 配置方式
+
+轻量级容器引擎(iSulad)服务端daemon为isulad,isulad可以通过配置文件进行配置,也可以通过命令行的方式进行配置,例如:isulad --xxx,优先级从高到低是:命令行方式\>配置文件\>代码中默认配置。
+
+>  **说明:**
+>
+> 如果采用systemd管理iSulad进程,修改/etc/sysconfig/iSulad文件中的OPTIONS字段,等同于命令行方式进行配置。
+
+- **命令行方式**
+
+ 在启动服务的时候,直接通过命令行进行配置。其配置选项可通过以下命令查阅:
+
+ ```bash
+ # isulad --help
+ isulad
+
+ lightweight container runtime daemon
+
+ Usage: isulad [global options]
+
+ GLOBAL OPTIONS:
+
+ --authorization-plugin Use authorization plugin
+ --cgroup-parent Set parent cgroup for all containers
+ --cni-bin-dir The full path of the directory in which to search for CNI plugin binaries. Default: /opt/cni/bin
+ --cni-conf-dir The full path of the directory in which to search for CNI config files. Default: /etc/cni/net.d
+ --container-log-driver Set default container log driver, such as: json-file
+ --container-log-opts Set default container log driver options, such as: max-file=7 to set max number of container log files
+ --default-ulimit Default ulimits for containers (default [])
+ -e, --engine Select backend engine
+ -g, --graph Root directory of the iSulad runtime
+ -G, --group Group for the unix socket(default is isulad)
+ --help Show help
+ --hook-spec Default hook spec file applied to all containers
+ -H, --host The socket name used to create gRPC server
+ --image-layer-check Check layer intergrity when needed
+ --insecure-registry Disable TLS verification for the given registry
+ --insecure-skip-verify-enforce Force to skip the insecure verify(default false)
+ --log-driver Set daemon log driver, such as: file
+ -l, --log-level Set log level, the levels can be: FATAL ALERT CRIT ERROR WARN NOTICE INFO DEBUG TRACE
+ --log-opt Set daemon log driver options, such as: log-path=/tmp/logs/ to set directory where to store daemon logs
+ --native.umask Default file mode creation mask (umask) for containers
+ --network-plugin Set network plugin, default is null, support null and cni
+ -p, --pidfile Save pid into this file
+ --pod-sandbox-image The image whose network/ipc namespaces containers in each pod will use. (default "pause-${machine}:3.0")
+ --registry-mirrors Registry to be prepended when pulling unqualified images, can be specified multiple times
+ --selinux-enabled Enable selinux support
+ --start-timeout timeout duration for waiting on a container to start before it is killed
+ -S, --state Root directory for execution state files
+ --storage-driver Storage driver to use(default overlay2)
+ -s, --storage-opt Storage driver options
+ --tls Use TLS; implied by --tlsverify
+ --tlscacert Trust certs signed only by this CA (default "/root/.iSulad/ca.pem")
+ --tlscert Path to TLS certificate file (default "/root/.iSulad/cert.pem")
+ --tlskey Path to TLS key file (default "/root/.iSulad/key.pem")
+ --tlsverify Use TLS and verify the remote
+ --use-decrypted-key Use decrypted private key by default(default true)
+ --userns-remap User/Group setting for user namespaces
+ -V, --version Print the version
+ --websocket-server-listening-port CRI websocket streaming service listening port (default 10350)
+ ```
+
+ 示例: 启动isulad,并将日志级别调整成DEBUG
+
+ ```bash
+ # isulad -l DEBUG
+ ```
+
+- **配置文件方式**
+
+ isulad配置文件为/etc/isulad/daemon.json和/etc/isulad/daemon_constants.json,各配置字段说明如下:
+
+ 配置文件/etc/isulad/daemon.json
+
+
+ 配置参数
+
+ 配置文件示例
+
+ 参数解释
+
+ 备注
+
+
+
+ -e, --engine
+
+ "engine": "lcr"
+
+ iSulad的运行时,默认是lcr
+
+ 无
+
+
+ -G, --group
+
+ "group": "isulad"
+
+ socket所属组
+
+ 无
+
+
+ --hook-spec
+
+ "hook-spec": "/etc/default/isulad/hooks/default.json"
+
+ 针对所有容器的默认钩子配置文件
+
+ 无
+
+
+ -H, --host
+
+ "hosts": "unix:///var/run/isulad.sock"
+
+ 通信方式
+
+ 除本地socket外,还支持tcp://ip:port方式,port范围(0-65535,排除被占用端口)
+
+
+ --log-driver
+
+ "log-driver": "file"
+
+ 日志驱动配置
+
+ 无
+
+
+ -l, --log-level
+
+ "log-level": "ERROR"
+
+ 设置日志输出级别
+
+ 无
+
+
+ --log-opt
+
+ "log-opts": {
+ "log-file-mode": "0600",
+ "log-path": "/var/lib/isulad",
+ "max-file": "1",
+ "max-size": "30KB"
+ }
+
+ 日志相关的配置
+
+ 可以指定max-file,max-size,log-path。max-file指日志文件个数;max-size指日志触发防爆的阈值,若max-file为1,max-size失效;log-path指定日志文件存储路径;log-file-mode用于设置日志文件的读写权限,格式要求必须为八进制格式,如0666。
+
+
+ --container-log-driver
+
+ "container-log": {
+ "driver": "json-file"
+ }
+
+ 容器串口日志驱动默认配置
+
+ 指定所有容器的默认串口日志的驱动
+
+
+ --start-timeout
+
+ "start-timeout": "2m"
+
+ 启动容器的耗时
+
+ 无
+
+
+ 无
+
+ "default-runtime": "lcr"
+
+ 创建容器时的runtime运行时,默认是lcr
+
+ 当命令行和配置文件均未指定时,默认为lcr,runtime的三种指定方式优先级:命令行>配置文件>默认lcr,当前支持lcr、kata-runtime。
+
+
+ 无
+
+ "runtimes": {
+ "kata-runtime": {
+ "path": "/usr/bin/kata-runtime",
+ "runtime-args": [
+ "--kata-config",
+ "/usr/share/defaults/kata-containers/configuration.toml"
+ ]
+ }
+ }
+
+ 启动容器时,通过此字段指定多runtimes配置,在此集合中的元素均为有效的启动容器的runtime运行时。
+
+ 容器的runtime白名单,在此集合中的自定义runtime才是有效的。示例为以kata-runtime为例的配置。
+
+
+ -p, --pidfile
+
+ "pidfile": "/var/run/isulad.pid"
+
+ 保存pid的文件
+
+ 当启动一个容器引擎的时候不需要配置,当需要启动两个以上的容器引擎时才需要配置。
+
+
+ -g, --graph
+
+ "graph": "/var/lib/isulad"
+
+ iSulad运行时的根目录
+
+
+ -S, --state
+
+ "state": "/var/run/isulad"
+
+ 执行文件的根目录
+
+
+ --storage-driver
+
+ "storage-driver": "overlay2"
+
+ 镜像存储驱动,默认为overlay2
+
+ 当前只支持overlay2
+
+
+ -s, --storage-opt
+
+ "storage-opts": [ "overlay2.override_kernel_check=true" ]
+
+ 镜像存储驱动配置选项
+
+ 可使用的选项为:
+ overlay2.override_kernel_check=true # 忽略内核版本检查
+ overlay2.size=${size} # 设置rootfs quota限额为${size}大小
+ overlay2.basesize=${size} #等价于overlay2.size
+
+
+ --registry-mirrors
+
+ "registry-mirrors": [ "docker.io" ]
+
+ 镜像仓库地址
+
+ 无
+
+
+ --insecure-registry
+
+ "insecure-registries": [ ]
+
+ 不使用TLS校验的镜像仓库
+
+ 无
+
+
+ --native.umask
+
+ "native.umask": "secure"
+
+ 容器umask策略,默认"secure",normal为不安全配置
+
+ 设置容器umask值。
+ 支持配置空字符(使用缺省值0027)、"normal"、"secure":
+ normal # 启动的容器umask值为0022
+ secure # 启动的容器umask值为0027(缺省值)
+
+
+ --pod-sandbox-image
+
+ "pod-sandbox-image": "rnd-dockerhub.huawei.com/library/pause-aarch64:3.0"
+
+ pod默认使用镜像,默认为"rnd-dockerhub.huawei.com/library/pause-${machine}:3.0"
+
+ 无
+
+
+ --network-plugin
+
+ "network-plugin": ""
+
+ 指定网络插件,默认为空字符,表示无网络配置,创建的sandbox只有loop网卡。
+
+ 支持cni和空字符,其他非法值会导致isulad启动失败。
+
+
+ --cni-bin-dir
+
+ "cni-bin-dir": ""
+
+ 指定cni插件依赖的二进制的存储位置
+
+ 默认为/opt/cni/bin
+
+
+ --cni-conf-dir
+
+ "cni-conf-dir": ""
+
+ 指定cni网络配置文件的存储位置
+
+ 默认为/etc/cni/net.d
+
+
+ --image-layer-check=false
+
+ "image-layer-check": false
+
+ 开启镜像层完整性检查功能,设置为true;关闭该功能,设置为false。默认为关闭。
+
+ isulad启动时会检查镜像层的完整性,如果镜像层被破坏,则相关的镜像不可用。isulad进行镜像完整性校验时,无法校验内容为空的文件和目录,以及链接文件。因此若镜像因掉电导致上述类型文件丢失,isulad的镜像数据完整性校验可能无法识别。isulad版本变更时需要检查是否支持该参数,如果不支持,需要从配置文件中删除。
+
+
+ --insecure-skip-verify-enforce=false
+
+ "insecure-skip-verify-enforce": false
+
+ Bool类型,是否强制跳过证书的主机名/域名验证,默认为false。当设置为true时,为不安全配置,会跳过证书的主机名/域名验证
+
+ 默认为false(不跳过),注意:因isulad使用的yajl json 解析库限制,若在/etc/isulad/daemon.json配置文件中配置非Bool类型的其他符合json格式的值时,isulad将使用缺省值false。
+
+
+ --use-decrypted-key=true
+
+ "use-decrypted-key": true
+
+ Bool类型,指定是否使用不加密的私钥。指定为true,表示使用不加密的私钥;指定为false,表示使用的为加密后的私钥,即需要进行双向认证。
+
+ 默认配置为true(使用不加密的私钥),注意:因isulad使用的yajl json 解析库限制,若在/etc/isulad/daemon.json配置文件中配置非Bool类型的其他符合json格式的值时,isulad将使用缺省值true。
+
+
+ --tls
+
+ "tls":false
+
+ Bool类型,是否使用TLS
+
+ 缺省值为false, 仅用于-H tcp://IP:PORT方式
+
+
+ --tlsverify
+
+ "tlsverify":false
+
+ Bool类型,是否使用TLS,并验证远程访问
+
+ 仅用于-H tcp://IP:PORT方式
+
+
+ --tlscacert
+ --tlscert
+ --tlskey
+
+ "tls-config": {
+ "CAFile": "/root/.iSulad/ca.pem",
+ "CertFile": "/root/.iSulad/server-cert.pem",
+ "KeyFile":"/root/.iSulad/server-key.pem"
+ }
+
+ TLS证书相关的配置
+
+ 仅用于-H tcp://IP:PORT方式
+
+
+ --authorization-plugin
+
+ "authorization-plugin": "authz-broker"
+
+ 用户权限认证插件
+
+ 当前只支持authz-broker
+
+
+ --cgroup-parent
+
+ "cgroup-parent": "lxc/mycgroup"
+
+ 字符串类型,容器默认cgroup父路径
+
+ 指定daemon端容器默认的cgroup父路径,如果客户端指定了--cgroup-parent,以客户端参数为准。
+ 注意:如果启了一个容器A,然后启一个容器B,容器B的cgroup父路径指定为容器A的cgroup路径,在删除容器的时候需要先删除容器B再删除容器A,否则会导致cgroup资源残留。
+
+
+ --default-ulimits
+
+ "default-ulimits": {
+ "nofile": {
+ "Name": "nofile",
+ "Hard": 6400,
+ "Soft": 3200
+ }
+ }
+
+ ulimit指定限制的类型,soft值及hard值
+
+ 指定限制的资源类型,如“nofile”。两个字段名字必须相同,即都为nofile,否则会报错 。Hard指定的值需要大于等于Soft'。如果Hard字段或者Soft字段未设置,则默认该字段默认为0。
+
+
+ --websocket-server-listening-port
+
+ "websocket-server-listening-port": 10350
+
+ 设置CRI websocket流式服务侦听端口,默认端口号10350
+
+ 指定CRI websocket流式服务侦听端,如果客户端指定了
+ --websocket-server-listening-port,以客户端参数为准。端口范围1024-49151
+
+
+ 无
+
+ "cri-runtimes": {
+ "kata": "io.containerd.kata.v2"
+ }
+
+ 自定义cri runtimes的映射
+
+ isulad通过自定义的cri runtimes映射,可以将runtimeclass转换为对应的runtime。
+
+
+
+
+
+ 配置文件/etc/isulad/daemon_constants.json
+
+
+ 配置参数
+
+ 配置文件示例
+
+ 参数解释
+
+ 备注
+
+
+
+ 不支持
+
+ "default-host": "docker.io"
+
+ 如果镜像名以该镜像仓库名为前缀,则保存和显示时会去除该镜像仓库名前缀
+
+ 一般情况下该参数不需要修改
+
+
+ 不支持
+
+ "registry-transformation": {
+ "docker.io": "registry-1.docker.io",
+ "index.docker.io": "registry-1.docker.io"
+ }
+
+ "key":"value"格式,表示从key指定的仓库拉取镜像时实际从value指定的仓库拉取镜像
+
+ 一般情况下该参数不需要修改
+
+
+
+
+
+ 示例:
+
+ ```bash
+ # cat /etc/isulad/daemon.json
+ {
+ "group": "isulad",
+ "default-runtime": "lcr",
+ "graph": "/var/lib/isulad",
+ "state": "/var/run/isulad",
+ "engine": "lcr",
+ "log-level": "ERROR",
+ "pidfile": "/var/run/isulad.pid",
+ "log-opts": {
+ "log-file-mode": "0600",
+ "log-path": "/var/lib/isulad",
+ "max-file": "1",
+ "max-size": "30KB"
+ },
+ "log-driver": "stdout",
+ "hook-spec": "/etc/default/isulad/hooks/default.json",
+ "start-timeout": "2m",
+ "storage-driver": "overlay2",
+ "storage-opts": [
+ "overlay2.override_kernel_check=true"
+ ],
+ "registry-mirrors": [
+ "docker.io"
+ ],
+ "insecure-registries": [
+ "rnd-dockerhub.huawei.com"
+ ],
+ "pod-sandbox-image": "",
+ "native.umask": "secure",
+ "network-plugin": "",
+ "cni-bin-dir": "",
+ "cni-conf-dir": "",
+ "image-layer-check": false,
+ "use-decrypted-key": true,
+ "insecure-skip-verify-enforce": false,
+ "cri-runtime": {
+ "kata": "io.containerd.kata.v2"
+ }
+ }
+
+ # cat /etc/isulad/daemon.json
+ {
+ "default-host": "docker.io",
+ "registry-transformation":{
+ "docker.io": "registry-1.docker.io",
+ "index.docker.io": "registry-1.docker.io"
+ }
+ }
+
+ ```
+
+ >  **须知:**
+ >
+ > 默认配置文件/etc/isulad/daemon.json仅供参考,请根据实际需要进行配置。
+
+### 存储说明
+
+
+ 文件名
+
+ 文件路径
+
+ 内容
+
+
+
+ \*
+
+ /etc/default/isulad/
+
+ 存放isulad的OCI配置文件和钩子模板文件,文件夹下的配置文件权限设置为0640,sysmonitor检查脚本权限为0550
+
+
+ \*
+
+ /etc/isulad/
+
+ isulad的默认配置文件和seccomp的默认配置文件
+
+
+ isulad.sock
+
+ /var/run/
+
+ 管道通信文件,客户端和isulad的通信使用的socket文件
+
+
+ isulad.pid
+
+ /var/run/
+
+ 存放isulad的PID,同时也是一个文件锁防止启动多个isulad实例
+
+
+ \*
+
+ /run/lxc/
+
+ 文件锁文件,isula运行过程创建的文件
+
+
+ \*
+
+ /var/run/isulad/
+
+ 实时通讯缓存文件,isulad运行过程创建的文件
+
+
+ \*
+
+ /var/run/isula/
+
+ 实时通讯缓存文件,isula运行过程创建的文件
+
+
+ \*
+
+ /var/lib/isulad/
+
+ isulad运行的根目录,存放创建的容器配置、日志的默认路径、数据库文件、mount点等
+ /var/lib/isulad/mnt/ :容器rootfs的mount点
+ /var/lib/isulad/engines/lcr/ :存放lcr容器配置目录,每个容器一个目录(以容器名命名)
+
+
+
+
+
+### 约束限制
+
+- 高并发场景(并发启动200容器)下,glibc的内存管理机制会导致内存空洞以及虚拟内存较大(例如10GB)的问题。该问题是高并发场景下glibc内存管理机制的限制,而不是内存泄露,不会导致内存消耗无限增大。可以通过设置MALLOC\_ARENA\_MAX环境变量来减少虚拟内存的问题,而且可以增大减少物理内存的概率。但是这个环境变量会导致iSulad的并发性能下降,需要用户根据实际情况做配置。
+
+ 参考实践情况,平衡性能和内存,可以设置MALLOC_ARENA_MAX为4。(在arm64服务器上面对iSulad的性能影响在10%以内)
+
+ 配置方法:
+ 1. 手动启动iSulad的场景,可以直接export MALLOC_ARENA_MAX=4,然后再启动iSulad即可。
+ 2. systemd管理iSulad的场景,可以修改/etc/sysconfig/iSulad,增加一条MALLOC_ARENA_MAX=4即可。
+
+- 为daemon指定各种运行目录时的注意事项
+
+ 以--root为例,当使用/new/path/作为daemon新的Root Dir时,如果/new/path/下已经存在文件,且目录或文件名与isulad需要使用的目录或文件名冲突(例如:engines、mnt等目录)时,isulad可能会更新原有目录或文件的属性,包括属主、权限等为自己的属主和权限。
+
+ 所以,用户需要明白重新指定各种运行目录和文件,会对冲突目录、文件属性的影响。建议用户指定的新目录或文件为isulad专用,避免冲突导致的文件属性变化以及带来的安全问题。
+
+- 日志文件管理:
+
+ >  **须知:**
+ >
+ > 日志功能对接: iSulad由systemd管理,日志也由systemd管理,然后传输给rsyslogd。rsyslog默认会对写日志速度有限制,可以通过修改/etc/rsyslog.conf文件,增加"$imjournalRatelimitInterval 0"配置项,然后重启rsyslogd的服务即可。
+
+- 命令行参数解析限制
+
+ 使用iSulad命令行接口时,其参数解析方式与docker略有不同,对于命令行中带参数的flag,不管使用长flag还是短flag,只会将该flag后第一个空格或与flag直接相连接的'='后的字符串作为flag的参数,具体如下:
+
+ 1. 使用短flag时,与“-”连接的字符串中的每个字符都被当作短flag(当有=号时,=号后的字符串当成=号前的短flag的参数)。
+
+ isula run -du=root busybox 等价于 isula run -du root busybox 或 isula run -d -u=root busybox 或 isula run -d -u root busybox ,当使用isula run -du:root时,由于-:不是有效的短flag,因此会报错。前述的命令行也等价于isula run -ud root busybox,但不推荐这种使用方式,可能带来语义困扰。
+
+ 2. 使用长flag时,与“--”连接的字符串作为一个整体当成长flag,若包含=号,则=号前的字符串为长flag,=号后的为参数。
+
+ ```bash
+ isula run --user=root busybox
+ ```
+
+ 等价于
+
+ ```bash
+ isula run --user root busybox
+ ```
+
+- 启动一个isulad容器,不能够以非root用户进行isula run -i/-t/-ti以及isula attach/exec操作。
+- isulad的临时文件存放路径默认为/var/lib/isulad/isulad_tmpdir,如果更换了isulad的根目录,则路径为`$isulad_root/isulad_tmpdir`。如果需要修改isulad存放临时文件的目录,可以通过在启动isulad前配置ISULAD_TMPDIR环境变量来实现,isulad启动时会进行检查,如果发现配置了ISULAD_TMPDIR环境变量,则会将`$ISULAD_TMPDIR/isulad_tmpdir`目录作为临时文件存放的路径,注意`$ISULAD_TMPDIR`下面的不要存放名称为isulad_tmpdir的文件/文件夹等,因为isulad启动时会递归删除`$ISULAD_TMPDIR/isulad_tmpdir`目录来防止数据残留。同时请确保`$ISULAD_TMPDIR`路径只有root用户可以访问,防止其他用户操作导致的安全问题。
+
+### DAEMON多端口的绑定
+
+## 描述
+
+daemon端可以绑定多个unix socket或者tcp端口,并在这些端口上侦听,客户端可以通过这些端口和daemon端进行交互。
+
+## 接口
+
+用户可以在/etc/isulad/daemon.json文件的hosts字段配置一个或者多个端口。当然用户也可以不指定hosts。
+
+```conf
+{
+ "hosts": [
+ "unix:///var/run/isulad.sock",
+ "tcp://localhost:5678",
+ "tcp://127.0.0.1:6789"
+ ]
+}
+```
+
+用户也可以在/etc/sysconfig/iSulad中通过-H或者--host配置端口。用户同样可以不指定hosts。
+
+```conf
+OPTIONS='-H unix:///var/run/isulad.sock --host tcp://127.0.0.1:6789'
+```
+
+如果用户在daemon.json文件及iSulad中均未指定hosts,则daemon在启动之后将默认侦听unix:///var/run/isulad.sock。
+
+## 限制
+
+- 用户不可以在/etc/isulad/daemon.json和/etc/sysconfig/iSulad两个文件中同时指定hosts,如果这样做将会出现错误,isulad无法正常启动;
+
+ ```text
+ unable to configure the isulad with file /etc/isulad/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [unix:///var/run/isulad.sock tcp://127.0.0.1:6789], from file: [unix:///var/run/isulad.sock tcp://localhost:5678 tcp://127.0.0.1:6789])
+ ```
+
+- 若指定的host是unix socket,则必须是合法的unix socket,需要以"unix://"开头,后跟合法的socket绝对路径;
+- 若指定的host是tcp端口,则必须是合法的tcp端口,需要以"tcp://"开头,后跟合法的IP地址和端口,IP地址可以为localhost;
+- 可以指定至多10个有效的端口,超过10个则会出现错误,isulad无法正常启动。
+
+### 配置TLS认证与开启远程访问
+
+#### 描述
+
+iSulad采用C/S模式进行设计,在默认情况,iSulad守护进程isulad只侦听本地/var/run/isulad.sock,因此只能在本地通过客户端isula执行相关命令操作容器。为了能使isula可以远程访问容器,isulad守护进程需要通过tcp:ip的方式侦听远程访问的端口。然而,仅通过简单配置tcp ip:port进行侦听,这样会导致所有的ip都可以通过调用`isula -H tcp://:port`与isulad通信,容易导致安全问题,因此推荐使用较安全版本的TLS(**Transport Layer Security - 安全传输层协议**)方式进行远程访问。
+
+#### 生成TLS证书
+
+- 明文私钥和证书生成方法示例
+
+ ```bash
+ #!/bin/bash
+ set -e
+ echo -n "Enter pass phrase:"
+ read password
+ echo -n "Enter public network ip:"
+ read publicip
+ echo -n "Enter host:"
+ read HOST
+
+ echo " => Using hostname: $publicip, You MUST connect to iSulad using this host!"
+
+ mkdir -p $HOME/.iSulad
+ cd $HOME/.iSulad
+ rm -rf $HOME/.iSulad/*
+
+ echo " => Generating CA key"
+ openssl genrsa -passout pass:$password -aes256 -out ca-key.pem 4096
+ echo " => Generating CA certificate"
+ openssl req -passin pass:$password -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=CN/ST=zhejiang/L=hangzhou/O=Huawei/OU=iSulad/CN=iSulad@huawei.com"
+ echo " => Generating server key"
+ openssl genrsa -passout pass:$password -out server-key.pem 4096
+ echo " => Generating server CSR"
+ openssl req -passin pass:$password -subj /CN=$HOST -sha256 -new -key server-key.pem -out server.csr
+ echo subjectAltName = DNS:$HOST,IP:$publicip,IP:127.0.0.1 >> extfile.cnf
+ echo extendedKeyUsage = serverAuth >> extfile.cnf
+ echo " => Signing server CSR with CA"
+ openssl x509 -req -passin pass:$password -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
+ echo " => Generating client key"
+ openssl genrsa -passout pass:$password -out key.pem 4096
+ echo " => Generating client CSR"
+ openssl req -passin pass:$password -subj '/CN=client' -new -key key.pem -out client.csr
+ echo " => Creating extended key usage"
+ echo extendedKeyUsage = clientAuth > extfile-client.cnf
+ echo " => Signing client CSR with CA"
+ openssl x509 -req -passin pass:$password -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
+ rm -v client.csr server.csr extfile.cnf extfile-client.cnf
+ chmod -v 0400 ca-key.pem key.pem server-key.pem
+ chmod -v 0444 ca.pem server-cert.pem cert.pem
+ ```
+
+- 加密私钥和证书请求文件生成方法示例
+
+ ```bash
+ #!/bin/bash
+
+ echo -n "Enter public network ip:"
+ read publicip
+ echo -n "Enter pass phrase:"
+ read password
+
+ # remove certificates from previous execution.
+ rm -f *.pem *.srl *.csr *.cnf
+
+
+ # generate CA private and public keys
+ echo 01 > ca.srl
+ openssl genrsa -aes256 -out ca-key.pem -passout pass:$password 2048
+ openssl req -subj '/C=CN/ST=zhejiang/L=hangzhou/O=Huawei/OU=iSulad/CN=iSulad@huawei.com' -new -x509 -days $DAYS -passin pass:$password -key ca-key.pem -out ca.pem
+
+ # create a server key and certificate signing request (CSR)
+ openssl genrsa -aes256 -out server-key.pem -passout pass:$PASS 2048
+ openssl req -new -key server-key.pem -out server.csr -passin pass:$password -subj '/CN=iSulad'
+
+ echo subjectAltName = DNS:iSulad,IP:${publicip},IP:127.0.0.1 > extfile.cnf
+ echo extendedKeyUsage = serverAuth >> extfile.cnf
+ # sign the server key with our CA
+ openssl x509 -req -days $DAYS -passin pass:$password -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem -extfile extfile.cnf
+
+ # create a client key and certificate signing request (CSR)
+ openssl genrsa -aes256 -out key.pem -passout pass:$password 2048
+ openssl req -subj '/CN=client' -new -key key.pem -out client.csr -passin pass:$password
+
+ # create an extensions config file and sign
+ echo extendedKeyUsage = clientAuth > extfile.cnf
+ openssl x509 -req -days 365 -passin pass:$password -in client.csr -CA ca.pem -CAkey ca-key.pem -out cert.pem -extfile extfile.cnf
+
+ # remove the passphrase from the client and server key
+ openssl rsa -in server-key.pem -out server-key.pem -passin pass:$password
+ openssl rsa -in key.pem -out key.pem -passin pass:$password
+
+ # remove generated files that are no longer required
+ rm -f ca-key.pem ca.srl client.csr extfile.cnf server.csr
+ ```
+
+#### 接口
+
+```conf
+{
+ "tls": true,
+ "tls-verify": true,
+ "tls-config": {
+ "CAFile": "/root/.iSulad/ca.pem",
+ "CertFile": "/root/.iSulad/server-cert.pem",
+ "KeyFile":"/root/.iSulad/server-key.pem"
+ }
+}
+```
+
+#### 限制
+
+服务端支持的模式如下:
+
+- 模式1(验证客户端):tlsverify, tlscacert, tlscert, tlskey。
+- 模式2(不验证客户端):tls, tlscert, tlskey。
+
+客户端支持的模式如下:
+
+- 模式1\(使用客户端证书进行身份验证,并根据给定的CA验证服务器\):tlsverify, tlscacert, tlscert, tlskey。
+- 模式2\(验证服务器\):tlsverify, tlscacert。
+
+如果需要采用双向认证方式进行通讯,则服务端采用模式1,客户端采用模式1;
+
+如果需要采用单向认证方式进行通讯,则服务端采用模式2,客户端采用模式2。
+
+>  **须知:**
+>
+> - 采用RPM安装方式时,服务端配置可通过/etc/isulad/daemon.json以及/etc/sysconfig/iSulad配置修改。
+> - 相比非认证或者单向认证方式,双向认证具备更高的安全性,推荐使用双向认证的方式进行通讯。
+> - GRPC开源组件日志不由iSulad进行接管,如果需要查看GRPC相关日志,请按需设置GRPC\_VERBOSITY和GRPC\_TRACE环境变量。
+
+#### 示例
+
+服务端:
+
+```bash
+ isulad -H=tcp://0.0.0.0:2376 --tlsverify --tlscacert ~/.iSulad/ca.pem --tlscert ~/.iSulad/server-cert.pem --tlskey ~/.iSulad/server-key.pem
+```
+
+客户端:
+
+```bash
+ isula version -H=tcp://$HOSTIP:2376 --tlsverify --tlscacert ~/.iSulad/ca.pem --tlscert ~/.iSulad/cert.pem --tlskey ~/.iSulad/key.pem
+```
+
+### 配置devicemapper存储驱动
+
+使用devicemapper存储驱动需要先配置一个thinpool设备,而配置thinpool需要一个独立的块设备,且该设备需要有足够的空闲空间用于创建thinpool,请用户根据实际需求确定。这里假设独立块设备为/dev/xvdf,具体的配置方法如下:
+
+**一、配置thinpool**
+
+1. 停止isulad服务。
+
+ ```bash
+ # systemctl stop isulad
+ ```
+
+2. 基于块设备创建一个lvm卷。
+
+ ```bash
+ # pvcreate /dev/xvdf
+ ```
+
+3. 使用刚才创建的物理卷创建一个卷组。
+
+ ```bash
+ # vgcreate isula /dev/xvdf
+ Volume group "isula" successfully created:
+ ```
+
+4. 创建名为thinpool和thinpoolmeta的两个逻辑卷。
+
+ ```bash
+ # lvcreate --wipesignatures y -n thinpool isula -l 95%VG
+ Logical volume "thinpool" created.
+ ```
+
+ ```bash
+ # lvcreate --wipesignatures y -n thinpoolmeta isula -l 1%VG
+ Logical volume "thinpoolmeta" created.
+ ```
+
+5. 将新创建的两个逻辑卷转换成thinpool以及thinpool所使用的metadata,这样就完成了thinpool配置。
+
+ ```bash
+ # lvconvert -y --zero n -c 512K --thinpool isula/thinpool --poolmetadata isula/thinpoolmeta
+
+ WARNING: Converting logical volume isula/thinpool and isula/thinpoolmeta to
+ thin pool's data and metadata volumes with metadata wiping.
+ THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
+ Converted isula/thinpool to thin pool.
+ ```
+
+**二、修改isulad配置文件**
+
+1. 如果环境之前运行过isulad,请先备份之前的数据。
+
+ ```bash
+ # mkdir /var/lib/isulad.bk
+ # mv /var/lib/isulad/* /var/lib/isulad.bk
+ ```
+
+2. 修改配置文件
+
+ 这里提供了两种配置方式,用户可根据实际情况的选择合适的方式。
+
+ - 编辑/etc/isulad/daemon.json,配置storage-driver字段值为devicemapper,并配置storage-opts字段的相关参数,支持参数请参见[参数说明](#zh-cn_topic_0222861454_section1712923715282)。配置参考如下所示:
+
+ ```conf
+ {
+ "storage-driver": "devicemapper"
+ "storage-opts": [
+ "dm.thinpooldev=/dev/mapper/isula-thinpool",
+ "dm.fs=ext4",
+ "dm.min_free_space=10%"
+ ]
+ }
+ ```
+
+ - 或者也可以通过编辑/etc/sysconfig/iSulad,在isulad启动参数里显式指定,支持参数请参见[参数说明](#zh-cn_topic_0222861454_section1712923715282)。配置参考如下所示:
+
+ ```conf
+ OPTIONS="--storage-driver=devicemapper --storage-opt dm.thinpooldev=/dev/mapper/isula-thinpool --storage-opt dm.fs=ext4 --storage-opt dm.min_free_space=10%"
+ ```
+
+3. 启动isulad,使配置生效。
+
+ ```bash
+ # systemctl start isulad
+ ```
+
+#### 参数说明
+
+storage-opts 支持的参数请参见[表1](#zh-cn_topic_0222861454_table3191161993812)。
+
+**表 1** storage-opts字段参数说明
+
+
+ 参数
+
+ 是否必选
+
+ 含义
+
+
+
+ dm.fs
+
+ 是
+
+ 用于指定容器使用的文件系统类型。当前必须配置为ext4,即dm.fs=ext4
+
+
+ dm.basesize
+
+ 否
+
+ 用于指定单个容器的最大存储空间大小,单位为k/m/g/t/p,也可以使用大写字母,例如dm.basesize=50G。该参数只在首次初始化时有效。
+
+
+ dm.mkfsarg
+
+ 否
+
+ 用于在创建基础设备时指定额外的mkfs参数。例如“dm.mkfsarg=-O ^has_journal”
+
+
+ dm.mountopt
+
+ 否
+
+ 用于在挂载容器时指定额外的mount参数。例如dm.mountopt=nodiscard
+
+
+ dm.thinpooldev
+
+ 否
+
+ 用于指定容器/镜像存储时使用的thinpool设备。
+
+
+ dm.min_free_space
+
+ 否
+
+ 用于指定最小的预留空间,用百分比表示。例如dm.min_free_space=10%,表示当剩余存储空间只剩10%左右时,创建容器等和存储相关操作就会失败。
+
+
+
+
+
+#### 注意事项
+
+- 配置devicemapper时,如果系统上没有足够的空间给thinpool做自动扩容,请禁止自动扩容功能。
+
+ 禁止自动扩容的方法是把/etc/lvm/profile/isula-thinpool.profile中thin\_pool\_autoextend\_threshold和thin\_pool\_autoextend\_percent两个值都改成100,如下所示:
+
+ ```conf
+ activation {
+ thin_pool_autoextend_threshold=100
+ thin_pool_autoextend_percent=100
+ }
+ ```
+
+- 使用devicemapper时,容器文件系统必须配置为ext4,需要在isulad的配置参数中加上--storage-opt dm.fs=ext4。
+- 当graphdriver为devicemapper时,如果metadata文件损坏且不可恢复,需要人工介入恢复。禁止直接操作或篡改daemon存储devicemapper的元数据。
+- 使用devicemapper lvm时,异常掉电导致的devicemapper thinpool损坏,无法保证thinpool损坏后可以修复,也不能保证数据的完整性,需重建thinpool。
+
+**iSula开启了user namespace特性,切换devicemapper存储池时的注意事项**
+
+- 一般启动容器时,deviceset-metadata文件为:/var/lib/isulad/devicemapper/metadata/deviceset-metadata。
+- 使用了user namespace场景下,deviceset-metadata文件使用的是:/var/lib/isulad/\{userNSUID.GID\}/devicemapper/metadata/deviceset-metadata。
+- 使用devicemapper存储驱动,容器在user namespace场景和普通场景之间切换时,需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空;针对thinpool扩容或者重建的场景下,也同样的需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空,否则isulad服务会重启失败。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/installation-upgrade-Uninstallation.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/installation-upgrade-Uninstallation.md
new file mode 100644
index 0000000000000000000000000000000000000000..f6d55640a1c0df735a3d9cdd8e698d47960e1cd0
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/installation-upgrade-Uninstallation.md
@@ -0,0 +1,3 @@
+# 安装、升级与卸载
+
+本章介绍 iSulad 的安装、安装后配置,以及升级和卸载的方法。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/interconnecting-isula-shim-v2-with-stratovirt.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/interconnecting-isula-shim-v2-with-stratovirt.md
new file mode 100644
index 0000000000000000000000000000000000000000..571b0d164531ed5eb56951ac2f12d577649dcea5
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/interconnecting-isula-shim-v2-with-stratovirt.md
@@ -0,0 +1,218 @@
+# iSula对接shim v2安全容器
+
+## 概述
+
+shim v2 是新一代 shim 架构方案,相比于 shim v1, 具有调用链更短、架构清晰的优势,在多业务容器场景,具备明显的低内存开销优势。iSula 运行安全容器可以通过 isulad-shim 或者 containerd-shim-kata-v2 来实现,其中 isulad-shim 组件是 shim v1 方案的具体实现,containerd-shim-kata-v2 组件是 shim v2 方案在安全容器场景的一种具体实现,本文介绍 iSula 与 containerd-shim-kata-v2 的对接。
+
+## 对接 containerd-shim-kata-v2
+
+### **前提条件**
+
+iSula 对接 containerd-shim-kata-v2 前,需要满足如下前提:
+
+- 已安装 iSulad和 kata-containers
+- StratoVirt 仅支持 devicemapper 存储驱动,因此需要配置 devicemapper 环境并确保 iSulad 使用的 devicemapper 存储驱动正常工作
+
+### 环境准备
+
+此处给出安装 iSulad 和 kata-containers 并进行相应配置的参考方法。
+
+#### 安装依赖软件
+
+按照所使用的OS版本自行配置相应的 yum 源,使用 root 权限安装 iSulad和kata-containers :
+
+```shell
+# yum install iSulad
+# yum install kata-containers
+```
+
+#### 制作并配置存储 Storage
+
+需要用户准备一个磁盘, 如 /dev/sdx , 该磁盘会被格式化,本章使用块设备 /dev/sda 进行演示。
+
+一、创建devicemapper
+
+1. 创建 PV
+
+ ```shell
+ $ pvcreate /dev/sda
+ Physical volume "/dev/loop0" successfully created.
+ ```
+
+2. 创建 VG
+
+ ```shell
+ $ vgcreate isula /dev/sda
+ Volume group "isula" successfully created
+ ```
+
+3. 创建 thinpool 以及 thinpoolmeta 逻辑卷
+
+ ```shell
+ $ lvcreate --wipesignatures y -n thinpool isula -l 95%VG
+ Logical volume "thinpool" created.
+
+ $ lvcreate --wipesignatures y -n thinpoolmeta isula -l 1%VG
+ Logical volume "thinpoolmeta" created.
+ ```
+
+4. 将上面创建的逻辑卷转换为 thinpool
+
+ ```shell
+ $ lvconvert -y --zero n -c 64K \
+ --thinpool isula/thinpool \
+ --poolmetadata isula/thinpoolmeta
+ Thin pool volume with chunk size 512.00 KiB can address at most 126.50 TiB of data.
+ WARNING: Converting isula/thinpool and isula/thinpoolmeta to thin pool's data and metadata volumes with metadata wiping.
+ THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
+ Converted isula/thinpool and isula/thinpoolmeta to thin pool.
+ ```
+
+5. 设置 lvm thinpool 自动扩展功能
+
+ ```shell
+ $ touch /etc/lvm/profile/isula-thinpool.profile
+ $ cat << EOF > /etc/lvm/profile/isula-thinpool.profile
+ activation {
+ thin_pool_autoextend_threshold=80
+ thin_pool_autoextend_percent=20
+ }
+ EOF
+ $ lvchange --metadataprofile isula-thinpool isula/thinpool
+ Logical volume isula/thinpool changed.
+ ```
+
+二、修改 iSulad 存储驱动类型并设置默认runtime
+
+更改配置文件 /etc/isulad/daemon.json, 将 default-runtime 设置为 io.containerd.kata.v2 , 将默认存储驱动类型 overlay 配置成 devicemapper,修改后如下所示:
+
+```json
+ {
+ "default-runtime": "io.containerd.kata.v2",
+ "storage-driver": "devicemapper",
+ "storage-opts": [
+ "dm.thinpooldev=/dev/mapper/isula-thinpool",
+ "dm.fs=ext4",
+ "dm.min_free_space=10%"
+ ],
+}
+```
+
+三、使能配置
+
+1. 重启 isulad使得配置生效 :
+
+ ```shell
+ # systemctl daemon-reload
+ # systemctl restart isulad
+ ```
+
+2. 确认 iSula 存储驱动是否配置成功:
+
+ ```shell
+ # isula info
+ ```
+
+ 若回显有如下信息,说明配置成功。
+
+ ```text
+ Storage Driver: devicemapper
+ ```
+
+### 对接指导
+
+本章给出 iSula 对接 containerd-shim-kata-v2 的操作指导。
+
+containerd-shim-kata-v2 默认使用 QEMU 虚拟化组件,本章分别介绍使用 QEMU 和 StratoVirt 两种虚拟化组件时的配置方法。
+
+#### 使用 QEMU
+
+containerd-shim-kata-v2 使用的虚拟化组件为 QEMU 时,iSula 对接 containerd-shim-kata-v2 的操作如下:
+
+1. 修改 kata 配置文件,路径为 /usr/share/defaults/kata-containers/configuration.toml
+
+ sandbox_cgroup_with_emulator 需要设置为 false, 目前 shimv2 不支该改功能, 其他参数与 shim v1 中 kata 配置参数保持一致或者保持缺省值。
+
+ ```conf
+ sandbox_cgroup_with_emulator = false
+ ```
+
+2. 使用 busybox 镜像运行安全容器并检查使用的 runtime 为 io.containerd.kata.v2
+
+ ```bash
+ $ id=`isula run -tid busybox /bin/sh`
+ $ isula inspect -f '{{ json .HostConfig.Runtime }}' $id
+ "io.containerd.kata.v2"
+ ```
+
+3. 确认 qemu 虚拟机进程被拉起,说明 qemu 和 shim v2 安全容器的对接成功
+
+ ```bash
+ $ ps -ef | grep qemu
+ ```
+
+#### 使用 StratoVirt
+
+containerd-shim-kata-v2 使用的虚拟化组件为 StratoVirt 时,iSula 对接 containerd-shim-kata-v2 的操作如下:
+
+1. 在任一目录(例如 /home 目录)新建脚本文件 stratovirt.sh 并使用 root 权限给文件添加执行权限:
+
+ ```shell
+ # touch /home/stratovirt.sh
+ # chmod +x /home/stratovirt.sh
+ ```
+
+ stratovirt.sh 内容如下,用于指定 StratoVirt 路径:
+
+ ```shell
+ #!/bin/bash
+ export STRATOVIRT_LOG_LEVEL=info # set log level which includes trace, debug, info, warn and error.
+ /usr/bin/stratovirt $@
+ ```
+
+2. 修改 kata 配置文件 ,将安全容器的 hypervisor 类型配置为 stratovirt,kernel 配置 StratoVirt 的 kernel 镜像绝对路径,initrd 配置为 kata-containers 的 initrd 镜像文件(使用 yum 安装 kata-containers 时,默认会下载这个文件并存放在 /var/lib/kata/ 目录),StratoVirt 仅支持 devicemapper 存储模式,需提前准备好环境并将 iSulad 设置为 devicemapper 模式。
+
+ 配置参考如下:
+
+ ```shell
+ [hypervisor.stratovirt]
+ path = "/home/stratovirt.sh"
+ kernel = "/var/lib/kata/vmlinux.bin"
+ initrd = "/var/lib/kata/kata-containers-initrd.img"
+ block_device_driver = "virtio-mmio"
+ use_vsock = true
+ enable_netmon = true
+ internetworking_model="tcfilter"
+ sandbox_cgroup_with_emulator = false
+ disable_new_netns = false
+ disable_block_device_use = false
+ disable_vhost_net = true
+ ```
+
+ StratoVirt 中使用 vsock 功能, 需要开启 vhost_vsock 内核模块并确认是否开启成功
+
+ ```bash
+ $ modprobe vhost_vsock
+ $ lsmod |grep vhost_vsock
+ ```
+
+ 下载对应版本和架构的 kernel 并放到 /var/lib/kata/ 路径下, 如下载 openEuler 21.03 版本 x86 架构的内核 [openeuler repo](https://repo.openeuler.org):
+
+ ```bash
+ $ cd /var/lib/kata
+ $ wget https://archives.openeuler.openatom.cn/openEuler-21.03/stratovirt_img/x86_64/vmlinux.bin
+ ```
+
+3. 使用 busybox 镜像运行安全容器并检查使用的 runtime 为 io.containerd.kata.v2
+
+ ```bash
+ $ id=`isula run -tid busybox sh`
+ $ isula inspect -f '{{ json .HostConfig.Runtime }}' $id
+ "io.containerd.kata.v2"
+ ```
+
+4. 确认 stratovirt 虚拟机进程被拉起,说明 StratoVirt 和 shim v2 安全容器的对接成功
+
+ ```bash
+ $ ps -ef | grep stratovirt
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/interconnection-with-the-cni-network.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/interconnection-with-the-cni-network.md
new file mode 100644
index 0000000000000000000000000000000000000000..7f634748f66e918fe162bc5582b5ca02565ae2fb
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/interconnection-with-the-cni-network.md
@@ -0,0 +1,121 @@
+# 支持CNI网络
+
+## 描述
+
+实现CRI接口对接CNI网络的能力,包括CNI网络配置文件的解析、CNI网络的加入和退出。Pod需要支持网络时,例如通过canal等容器网络插件提供网络能力,那么需要CRI接口能够和canal实现对接,并且调用canal的接口,为Pod提供网络能力。
+
+CNI配置文件相关行为描述:
+
+- 对--cni-conf-dir目录下的合法配置文件名进行字典排序,取第一个合法配置作为default网络平面的配置;
+- 每隔5s对配置目录进行扫描,重新加载更新CNI配置;
+- CRI Status接口不更新CNI的网络配置;
+
+## 接口
+
+CNI对用户可见的接口,主要涉及CNI网络配置和Pod配置中CNI网络相关的项。
+
+- CNI网络配置相关的接口,主要是isulad指定CNI网络配置文件所在路径、CNI网络插件二进制文件所在的路径以及使用的网络模式。详情请参见[表1 CNI网络配置接口](#zh-cn_topic_0183259146_table18221919589)。
+- Pod配置中CNI网络相关的项,主要是设置Pod加入的附加CNI网络列表,默认情况Pod只会加入到default CNI网络平面中,可以通过该配置把Pod加入到多个CNI网络平面中。
+
+**表 1** CNI网络配置接口
+
+
+
+
+ 命令行
+
+ 配置文件
+
+ 说明
+
+
+
+ 设置CNI网络插件二进制文件所在路径
+
+ --cni-bin-dir
+
+ "cni-bin-dir": "",
+
+ 缺省值为/opt/cni/bin
+
+
+ 设置CNI网络配置文件所在路径
+
+ --cni-conf-dir
+
+ "cni-conf-dir": "",
+
+ 系统会遍历目录下面所有后缀名为".conf"、".conflist"和 ".json"的文件。缺省值为/etc/cni/net.d
+
+
+ 指定网络模式
+
+ --network-plugin
+
+ "network-plugin": "",
+
+ 指定网络插件,默认为空字符,表示无网络配置,创建的sandbox只有loop网卡。支持cni和空字符,其他非法值会导致isulad启动失败。
+
+
+
+
+
+附加CNI网络配置方式:
+
+在Pod的配置文件的"annotations"中,增加一项"network.alpha.kubernetes.io/network": "网络平面配置";
+
+网络平面配置为json格式,包含两项:
+
+- name:指定CNI网络平面的名字
+- interface:指定网络接口的名字
+
+附加CNI网络配置方式示例如下:
+
+```conf
+"annotations" : {
+ "network.alpha.kubernetes.io/network": "{\"name\": \"mynet\", \"interface\": \"eth1\"}"
+ }
+```
+
+### CNI网络配置说明
+
+CNI网络配置包含两种类型,文件格式都为json:
+
+- 单网络平面配置,以.conf和.json为后缀的文件:具体的配置项请参见"附录 > CNI配置参数" 章节的 "表1 CNI单网络配置参数"。
+- 多网络平面配置,以.conflist为后缀的文件:具体的配置项请参见"附录 > CNI配置参数" 章节的 "表3 CNI多网络配置参数"。
+
+### 加入CNI网络列表
+
+如果iSulad配置了--network-plugin=cni,而且设置了default网络平面配置,那么在启动Pod的时候,会自动把Pod加入到default网络平面。如果在Pod的配置中配置了附加网络配置,那么启动Pod的时候也会把Pod加入到这些附加网络平面中。
+
+Pod配置中和网络相关的还有port\_mappings项,用于设置Pod的端口映射关系。配置方式如下:
+
+```conf
+"port_mappings":[
+ {
+ "protocol": 1,
+ "container_port": 80,
+ "host_port": 8080
+ }
+]
+```
+
+- protocol:表示映射使用的协议,支持tcp(用0标识)、udp(用1标识);
+- container\_port:表示容器映射出去的port;
+- host\_port:表示映射到主机的port。
+
+### 退出CNI网络列表
+
+StopPodSandbox的时候,会调用退出CNI网络的接口,清理网络相关的资源。
+
+> **说明:**
+>
+> - 在调用RemovePodSandbox接口之前,至少要调用一次StopPodSandbox接口。
+> - StopPodSandbox调用CNI接口失败,导致的网络资源残留,由CNI网络插件负责清理。
+
+## 使用限制
+
+- cniVersion的版本,当前只支持0.3.0和0.3.1。由于后期可能需要支持0.1.0和0.2.0,错误日志打印时,保留了0.1.0和0.2.0的提示信息。
+- name:必须是小写字符、数字、'-'以及'.'组成; '.'和'-'不能作为首字符和尾字符; 而且长度不超过200个字符。
+- 配置文件个数不超过200个,单个配置文件大小不超过1MB。
+- 扩展之后的参数,需要根据实际网络需求来配置,不需要使用的可选参数可以不写入到netconf.json文件中。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/isula-faqs.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/isula-faqs.md
new file mode 100644
index 0000000000000000000000000000000000000000..b41f205b7a5dc5bb145da44a387ec15742a39480
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/isula-faqs.md
@@ -0,0 +1,22 @@
+# 常见问题与解决方法
+
+## **问题1:修改`iSulad`默认运行时为`lxc`,启动容器报错:Failed to initialize engine or runtime**
+
+原因:`iSulad`默认运行时为`runc`,设置默认运行时为`lxc`时缺少依赖。
+
+解决方法:若需修改`iSulad`默认运行时为`lxc`,需要安装`lcr`、`lxc`软件包依赖,且配置`iSulad`配置文件中`runtime`为`lcr`
+或者启动容器时指定`--runtime lcr`。启动容器后不应该随意卸载`lcr`、`lxc`软件包,否则可能会导致删除容器时的资源残留。
+
+## **问题2:使用`iSulad` `CRI V1`接口,报错:rpc error: code = Unimplemented desc =**
+
+原因:`iSulad`同时支持`CRI V1alpha2`和`CRI V1`接口,默认使用`CRI V1alpha2`,若使用`CRI V1`,需要开启相应的配置。
+
+解决方法:在`iSulad`配置文件`/etc/isulad/daemon.json`中开启`CRI V1`的配置。
+
+```json
+{
+ "enable-cri-v1": true,
+}
+```
+
+若使用源码编译`iSulad`,还需在编译时增加`cmake`编译选项`-D ENABLE_CRI_API_V1=ON`。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/isulad-support-cdi.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/isulad-support-cdi.md
new file mode 100644
index 0000000000000000000000000000000000000000..08c299a85c497dae2295a889de22f07f551b9d60
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/isulad-support-cdi.md
@@ -0,0 +1,120 @@
+# iSulad支持CDI
+
+## 概述
+
+CDI(Container Device Interface,容器设备接口)是容器运行时的一种规范,用于支持第三方设备。
+
+CDI解决了如下问题:
+在Linux上,为了使容器具有设备感知能力,过去只需在该容器中暴露一个设备节点。但是,随着设备和软件变得越来越复杂,供应商希望执行更多的操作,例如:
+
+- 向容器公开设备可能需要公开多个设备节点、从运行时命名空间挂载文件或隐藏procfs条目。
+- 执行容器和设备之间的兼容性检查(例如:检查容器是否可以在指定设备上运行)。
+- 执行特定于运行时的操作(例如:虚拟机与基于Linux容器的运行时)。
+- 执行特定于设备的操作(例如:清理GPU的内存或重新配置FPGA)。
+
+在缺乏第三方设备标准的情况下,供应商通常不得不为不同的运行时编写和维护多个插件,甚至直接在运行时中贡献特定于供应商的代码。此外,运行时不统一地暴露插件系统(甚至根本不暴露插件系统),导致在更高级别的抽象(例如Kubernetes设备插件)中重复功能。
+
+CDI解决上述问题的方法:
+CDI描述了一种允许第三方供应商与设备交互的机制,从而不需要更改容器运行时。
+
+使用的机制是一个JSON文件(类似于容器网络接口(CNI)),它允许供应商描述容器运行时应该对容器的OCI规范执行的操作。
+
+iSulad目前已支持[CDI v0.6.0](https://github.com/cncf-tags/container-device-interface/blob/v0.6.0/SPEC.md)规范。
+
+## 配置iSulad支持CDI
+
+需要对daemon.json做如下配置,然后重启iSulad:
+
+```json
+{
+ ...
+ "enable-cri-v1": true,
+ "cdi-spec-dirs": ["/etc/cdi", "/var/run/cdi"],
+ "enable-cdi": true
+}
+```
+
+其中"cdi-spec-dirs"用于指定CDI specs所在目录,如果不指定则默认为"/etc/cdi", "/var/run/cdi"。
+
+## 使用示例
+
+### CDI specification实例
+
+具体每个字段含义详见[CDI v0.6.0](https://github.com/cncf-tags/container-device-interface/blob/v0.6.0/SPEC.md)
+
+```bash
+$ mkdir /etc/cdi
+$ cat > /etc/cdi/vendor.json <
+
+
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/privileged-container.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/privileged-container.md
new file mode 100644
index 0000000000000000000000000000000000000000..2c92da456dcde37f3282857129809db175067815
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/privileged-container.md
@@ -0,0 +1,232 @@
+# 特权容器
+
+## 场景说明
+
+iSulad默认启动的是普通容器,普通容器适合启动普通进程,其权限非常受限,仅具备/etc/default/isulad/config.json中capabilities所定义的默认权限。当需要特权操作时(比如操作/sys下的设备),需要特权容器完成这些操作,使用该特性,容器内的root将拥有宿主机的root权限, 否则,容器内的root在只是宿主机的普通用户权限。
+
+## 使用限制
+
+特权容器为容器提供了所有功能,还解除了设备cgroup控制器强制执行的所有限制,具备以下特性:
+
+- Secomp不block任何系统调用
+- /sys、/proc路径可写
+- 容器内能访问主机上所有设备
+
+- 系统的权能将全部打开
+
+普通容器默认权能为:
+
+
+ Capability Key
+
+ Capability Description
+
+
+
+ SETPCAP
+
+ 修改进程权能
+
+
+ MKNOD
+
+ 允许使用mknod()系统调用创建特殊文件
+
+
+ AUDIT_WRITE
+
+ 向内核审计日志写记录
+
+
+ CHOWN
+
+ 对文件的 UIDs 和 GIDs 做任意的修改(参考 chown(2))
+
+
+ NET_RAW
+
+ 使用 RAW 和 PACKET sockets;为透明代理绑定任何地址
+
+
+ DAC_OVERRIDE
+
+ 忽略文件的DAC访问限制
+
+
+ FOWNER
+
+ 忽略文件属主ID必须和进程用户ID相匹配的限制
+
+
+ FSETID
+
+ 允许设置文件的setuid位
+
+
+ KILL
+
+ 允许对不属于自己的进程发送信号
+
+
+ SETGID
+
+ 允许改变进程的组ID
+
+
+ SETUID
+
+ 允许改变进程的用户ID
+
+
+ NET_BIND_SERVICE
+
+ 允许绑定到小于1024的端口
+
+
+ SYS_CHROOT
+
+ 允许使用chroot()系统调用
+
+
+ SETFCAP
+
+ 允许向其他进程转移能力以及删除其他进程的能力
+
+
+
+
+
+当容器为特权模式时,将添加以下权能
+
+
+ Capability Key
+
+ Capability Description
+
+
+
+ SYS_MODULE
+
+ 加载和卸载内核模块
+
+
+ SYS_RAWIO
+
+ 允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备
+
+
+ SYS_PACCT
+
+ 允许执行进程的BSD式审计
+
+
+ SYS_ADMIN
+
+ 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
+
+
+ SYS_NICE
+
+ 允许提升优先级及设置其他进程的优先级
+
+
+ SYS_RESOURCE
+
+ 忽略资源限制
+
+
+ SYS_TIME
+
+ 允许改变系统时钟
+
+
+ SYS_TTY_CONFIG
+
+ 允许配置TTY设备
+
+
+ AUDIT_CONTROL
+
+ 启用和禁用内核审计;修改审计过滤器规则;提取审计状态和过滤规则
+
+
+ MAC_ADMIN
+
+ 覆盖强制访问控制 (Mandatory Access Control (MAC)),为Smack Linux安全模块(Linux Security Module (LSM)) 而实现
+
+
+ MAC_OVERRIDE
+
+ 允许 MAC 配置或状态改变。为 Smack LSM 而实现
+
+
+ NET_ADMIN
+
+ 允许执行网络管理任务
+
+
+ SYSLOG
+
+ 执行特权 syslog(2) 操作
+
+
+ DAC_READ_SEARCH
+
+ 忽略文件读及目录搜索的DAC访问限制
+
+
+ LINUX_IMMUTABLE
+
+ 允许修改文件的IMMUTABLE和APPEND属性标志
+
+
+ NET_BROADCAST
+
+ 允许网络广播和多播访问
+
+
+ IPC_LOCK
+
+ 允许锁定共享内存片段
+
+
+ IPC_OWNER
+
+ 忽略IPC所有权检查
+
+
+ SYS_PTRACE
+
+ 允许跟踪任何进程
+
+
+ SYS_BOOT
+
+ 允许重新启动系统
+
+
+ LEASE
+
+ 允许修改文件锁的FL_LEASE标志
+
+
+ WAKE_ALARM
+
+ 触发将唤醒系统的功能,如设置 CLOCK_REALTIME_ALARM 和 CLOCK_BOOTTIME_ALARM 定时器
+
+
+ BLOCK_SUSPEND
+
+ 可以阻塞系统挂起的特性
+
+
+
+
+
+## 使用指导
+
+iSulad使用--privileged给容器添加特权模式,在非必要情况下,不要给容器添加特权,遵循最小特权原则,减少存在的安全风险。
+
+```bash
+isula run --rm -it --privileged busybox
+```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-caution.gif b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-danger.gif b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-note.gif b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-notice.gif b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-tip.gif b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-warning.gif b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/querying-information.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/querying-information.md
new file mode 100644
index 0000000000000000000000000000000000000000..e6f485be203565724baadd5e59b77c4541bc8bd0
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/querying-information.md
@@ -0,0 +1,95 @@
+# 查询信息
+
+- [查询信息](#查询信息)
+ - [查询服务版本信息](#查询服务版本信息)
+ - [查询系统级信息](#查询系统级信息)
+
+## 查询信息
+
+## 查询服务版本信息
+
+### 描述
+
+isula version 命令用于查询iSulad服务的版本信息。
+
+### 用法
+
+```bash
+isula version
+```
+
+### 实例
+
+查询版本信息
+
+```bash
+isula version
+```
+
+如果isulad服务正常运行,则可以查看到客户端、服务端以及OCI config的版本等信息。
+
+```text
+Client:
+ Version: 1.0.31
+ Git commit: fa7f9902738e8b3d7f2eb22768b9a1372ddd1199
+ Built: 2019-07-30T04:21:48.521198248-04:00
+
+Server:
+ Version: 1.0.31
+ Git commit: fa7f9902738e8b3d7f2eb22768b9a1372ddd1199
+ Built: 2019-07-30T04:21:48.521198248-04:00
+
+OCI config:
+ Version: 1.0.0-rc5-dev
+ Default file: /etc/default/isulad/config.json
+```
+
+若isulad服务未运行,则仅仅查询到客户端的信息,并提示无法连接到服务端。
+
+```text
+Client:
+ Version: 1.0.31
+ Git commit: fa7f9902738e8b3d7f2eb22768b9a1372ddd1199
+ Built: 2019-07-30T04:21:48.521198248-04:00
+
+Can not connect with server.Is the iSulad daemon running on the host?
+```
+
+因此,isula version命令也常常用来检验isulad是否正常运行。
+
+## 查询系统级信息
+
+### 描述
+
+isula info命令用于对系统级信息,以及容器和镜像数目等信息的查询。
+
+### 用法
+
+```bash
+isula info
+```
+
+### 示例
+
+查询系统级信息,可以展示容器数目,镜像数目,内核版本、操作系统等信息
+
+```bash
+# isula info
+Containers: 2
+ Running: 0
+ Paused: 0
+ Stopped: 2
+Images: 8
+Server Version: 1.0.31
+Logging Driver: json-file
+Cgroup Driverr: cgroupfs
+Hugetlb Pagesize: 2MB
+Kernel Version: 4.19
+Operating System: Fedora 29 (Twenty Nine)
+OSType: Linux
+Architecture: x86_64
+CPUs: 8
+Total Memory: 7 GB
+Name: localhost.localdomain
+iSulad Root Dir: /var/lib/isulad
+```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/security-features.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/security-features.md
new file mode 100644
index 0000000000000000000000000000000000000000..8a436e5fe85668805bf88a626a9c86a6de846959
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/security-features.md
@@ -0,0 +1,248 @@
+# 安全特性
+
+- [安全特性](#安全特性.md)
+ - [seccomp安全配置场景](#seccomp安全配置场景)
+ - [capabilities安全配置场景](#capabilities安全配置场景)
+ - [SELinux安全配置场景](#selinux安全配置场景)
+
+## seccomp安全配置场景
+
+### 场景说明
+
+seccomp(**secure computing** **mode**)是linux kernel从2.6.23版本开始引入的一种简洁的sandboxing机制。在一些特定场景下,用户需要在容器中执行一些“特权”操作,但又不想启动特权容器,用户经常会在run时添加--cap-add来获得一些“小范围”的权限。对于安全要求比较严格的容器实例,上述的CAP粒度不一定能够满足安全需要,可使用一些办法精细化控制权限范围。
+
+- 举例
+
+ 普通容器场景中,用户使用-v将宿主机某目录(包含某普通用户无法执行的二进制),映射到容器中。
+
+ 在容器中,可以将二进制修改权限chmod 4777加入S标志位。这样在宿主机上,原先不能运行二进制的普通用户(或者运行此二进制受限),可以在S标志位的添加动作后,在运行此二进制的时候,获取到二进制自身的权限(比如root),从而提权运行或者访问其他文件。
+
+ 这个场景,如果在严格安全要求下,需要使用seccomp裁剪chmod、fchmod、fchmodat系统调用。
+
+### 使用限制
+
+- 不要禁用iSulad的seccomp特性
+
+ 默认的iSulad有一个seccomp的配置,配置中使用的是白名单,不在配置的sys_call会被seccomp禁掉,使用接口--security-opt 'seccomp:unconfined'可以禁止使用seccomp特性。如果禁用seccomp或使用自定义seccomp配置但过滤名单不全,都会增加容器对内核的攻击面。
+
+- 默认的Seccomp配置是白名单,不在白名单的syscall默认会返回SCMP_ACT_ERRNO,同时会根据不同的Cap开放不同的系统调用,不在白名单上面的权限,iSulad默认不会将权限给到容器。
+
+### 使用指导
+
+通过--security-opt将配置文件传给要过滤系统调用的容器。
+
+```bash
+isula run -itd --security-opt seccomp=/path/to/seccomp/profile.json rnd-dockerhub.huawei.com/official/busybox
+```
+
+>  **说明:**
+>
+> - 创建容器时通过--security-opt将配置文件传给容器时,采用默认配置文件(/etc/isulad/seccomp\_default.json)。
+> - 创建容器时--security-opt设置为unconfined时,对容器不过滤系统调用。
+> - “/path/to/seccomp/profile.json”需要是绝对路径。
+> - --security-opt采用“=”号进行分割,不支持使用“:”号分割。
+
+#### 获取普通容器的默认seccomp配置
+
+- 启动一个普通容器(或者是带--cap-add的容器),并查看默认权限配置:
+
+ ```bash
+ cat /etc/isulad/seccomp_default.json | python -m json.tool > profile.json
+ ```
+
+ 可以看到"seccomp"字段中,有很多的"syscalls",在此基础上,仅提取syscalls的部分,参考定制seccomp配置文件,进行定制化操作。
+
+ ```conf
+ "defaultAction": "SCMP_ACT_ERRNO",
+ "syscalls": [
+ {
+ "action": "SCMP_ACT_ALLOW",
+ "name": "accept"
+ },
+ {
+ "action": "SCMP_ACT_ALLOW",
+ "name": "accept4"
+ },
+ {
+ "action": "SCMP_ACT_ALLOW",
+ "name": "access"
+ },
+ {
+ "action": "SCMP_ACT_ALLOW",
+ "name": "alarm"
+ },
+ {
+ "action": "SCMP_ACT_ALLOW",
+ "name": "bind"
+ },
+ ]...
+ ```
+
+- 查看转换为lxc可识别的seccomp配置
+
+ ```bash
+ cat /var/lib/isulad/engines/lcr/74353e38021c29314188e29ba8c1830a4677ffe5c4decda77a1e0853ec8197cd/seccomp
+ ```
+
+ ```text
+ ...
+ waitpid allow
+ write allow
+ writev allow
+ ptrace allow
+ personality allow [0,0,SCMP_CMP_EQ,0]
+ personality allow [0,8,SCMP_CMP_EQ,0]
+ personality allow [0,131072,SCMP_CMP_EQ,0]
+ personality allow [0,131080,SCMP_CMP_EQ,0]
+ personality allow [0,4294967295,SCMP_CMP_EQ,0]
+ ...
+ ```
+
+#### 定制seccomp配置文件
+
+在启动容器的时候使用--security-opt引入seccomp配置文件,容器实例会按照配置文件规则进行限制系统API的运行。首先获取普通容器的默认seccomp,得到完整模板,然后按照本节定制配置文件,启动容器:
+
+```bash
+isula run --rm -it --security-opt seccomp:/path/to/seccomp/profile.json rnd-dockerhub.huawei.com/official/busybox
+```
+
+配置文件模板:
+
+```conf
+{
+"defaultAction": "SCMP_ACT_ALLOW",
+"syscalls": [
+{
+"name": "syscall-name",
+"action": "SCMP_ACT_ERRNO",
+"args": null
+}
+]
+}
+```
+
+>  **须知:**
+>
+> - defaultAction、syscalls:对应的action的类型是一样的,但其值是不能一样的,目的就是让所有的syscall都有一个默认的action,并且如果syscalls数组中有明确的定义,就以syscalls中的为准,由于defaultAction、action的值不一样,就能保证action不会有冲突。当前支持的action有:
+> - "SCMP\_ACT\_ERRNO":禁止,并打印错误信息。
+> - "SCMP\_ACT\_ALLOW":允许。
+> - syscalls: 数组,可以只有一个syscall,也可以有多个,可以带args,也可以不带。
+> - name:要过滤的syscall。
+> - args:数组,里面的每个object的定义如下:
+>
+> ```conf
+> type Arg struct {
+> Index uint `json:"index"` //参数的序号,如open(fd, buf, len),fd 对应的就是0,buf为1
+> Value uint64 `json:"value"` //跟参数进行比较的值
+> ValueTwo uint64 `json:"value_two"` //仅当Op=MaskEqualTo时起作用,用户传入值跟Value按位与操作后,跟ValueTwo进行比较,若相等则执行action。
+> Op Operator `json:"op"`
+> }
+> ```
+>
+> args中的Op,其取值可以下页面的任意一种:
+> "SCMP\_CMP\_NE": NotEqualTo
+> "SCMP\_CMP\_LT": LessThan
+> "SCMP\_CMP\_LE": LessThanOrEqualTo
+> "SCMP\_CMP\_EQ": EqualTo
+> "SCMP\_CMP\_GE": GreaterThanOrEqualTo
+> "SCMP\_CMP\_GT": GreaterThan
+> "SCMP\_CMP\_MASKED\_EQ": MaskEqualTo
+
+## capabilities安全配置场景
+
+### 场景说明
+
+capabilities机制是linux kernel 2.2之后引入的安全特性,用更小的粒度控制超级管理员权限,可以避免使用 root 权限,将root用户的权限细分为不同的领域,可以分别启用或禁用。capabilities详细信息可通过Linux Programmer's Manual进行查看([capabilities\(7\) - Linux man page](http://man7.org/linux/man-pages/man7/capabilities.7.html)):
+
+```bash
+man capabilities
+```
+
+### 使用限制
+
+- isulad默认Capabilities(白名单)配置如下,普通容器进程将默认携带:
+
+ ```conf
+ "CAP_CHOWN",
+ "CAP_DAC_OVERRIDE",
+ "CAP_FSETID",
+ "CAP_FOWNER",
+ "CAP_MKNOD",
+ "CAP_NET_RAW",
+ "CAP_SETGID",
+ "CAP_SETUID",
+ "CAP_SETFCAP",
+ "CAP_SETPCAP",
+ "CAP_NET_BIND_SERVICE",
+ "CAP_SYS_CHROOT",
+ "CAP_KILL",
+ "CAP_AUDIT_WRITE"
+ ```
+
+- 默认的权能配置,包含了CAP\_SETUID和CAP\_FSETID,如host和容器共享目录,容器可对共享目录的二进制文件进行文件权限设置,host上的普通用户可能使用该特性进行提权攻击。CAP\_AUDIT\_WRITE,容器可以对host写入,存在一定的风险,如果使用场景不需要,推荐在启动容器的时候使用--cap-drop将其删除。
+- 增加Capabilities意味着容器进程具备更大的能力,同时也会开放更多的系统调用接口。
+
+### 使用指导
+
+iSulad使用--cap-add/--cap-drop给容器增加/删去特定的权限,在非必要情况下,不要给容器增加额外的权限,推荐将容器默认但非必要的权限也去掉。
+
+```bash
+isula run --rm -it --cap-add all --cap-drop SYS_ADMIN rnd-dockerhub.huawei.com/official/busybox
+```
+
+## SELinux安全配置场景
+
+### 场景说明
+
+SELinux\(Security-Enhanced Linux\)是一个Linux内核的安全模块,提供了访问控制安全策略机制,iSulad将采用MCS(多级分类安全)实现对容器内进程打上标签限制容器访问资源的方式,减少提权攻击的风险,防止造成更为重要的危害。
+
+### 使用限制
+
+- 确保宿主机已使能SELinux,且daemon端已打开SELinux使能开发(/etc/isulad/daemon.json中“selinux-enabled”字段为true, 或者命令行参数添加--selinux-enabled)
+- 确保宿主机上已配置合适的selinux策略,推荐使用container-selinux进行配置
+- 引入SELinux会影响性能,设置SELinux之前需要对场景进行评估,确定必要时打开daemon端SELinux开关并设置容器SELinux配置
+- 对挂载卷进行标签配置时,源目录不允许为/、/usr、/etc、/tmp、/home、/run、/var、/root以及/usr的子目录。
+
+>  **说明:**
+>
+> - 目前iSulad不支持对容器的文件系统打标签,确保容器文件系统及配置目录打上容器可访问标签,需使用chcon命令对其打上标签。
+> - 若iSulad启用SELinux访问控制,建议daemon启动前对/var/lib/isulad目录打上标签,容器容器创建时目录下生产的文件及文件夹将默认继承其标签,例如:
+>
+> ```bash
+> chcon -R system_u:object_r:container_file_t:s0 /var/lib/isulad
+> ```
+
+### 使用指导
+
+- daemon端使能selinux:
+
+ ```bash
+ isulad --selinux-enabled
+ ```
+
+- 启动容器时配置selinux标签安全上下文
+
+ --security-opt="label=user:USER" 配置安全上下文用户
+
+ --security-opt="label=role:ROLE" 配置安全上下文角色
+
+ --security-opt="label=type:TYPE" 配置安全上下文类型
+
+ --security-opt="label=level:LEVEL" 配置安全上下文域
+
+ --security-opt="label=disable" 容器禁用SELinux配置
+
+ ```bash
+ $ isula run -itd --security-opt label=type:container_t --security-opt label=level:s0:c1,c2 rnd-dockerhub.huawei.com/official/centos
+ 9be82878a67e36c826b67f5c7261c881ff926a352f92998b654bc8e1c6eec370
+ ```
+
+- 为挂载卷打selinux标签\('z'为共享模式\)
+
+ ```bash
+ $ isula run -itd -v /test:/test:z rnd-dockerhub.huawei.com/official/centos
+ 9be82878a67e36c826b67f5c7261c881ff926a352f92998b654bc8e1c6eec370
+
+ $ls -Z /test
+ system_u:object_r:container_file_t:s0 file
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/supporting-oci-hooks.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/supporting-oci-hooks.md
new file mode 100644
index 0000000000000000000000000000000000000000..00373d38356374fe90a49d674afddf75ca4edd3a
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/supporting-oci-hooks.md
@@ -0,0 +1,77 @@
+# 支持OCI hooks
+
+## 描述
+
+支持在容器的生命周期中,运行OCI标准hooks。包括三种类型的hooks:
+
+- prestart hook:在执行isula start命令之后,而在容器的1号进程启动之前,被执行。
+- poststart hook:在容器1号进程启动之后,而在isula start命令返回之前,被执行。
+- poststop hook:在容器被停止之后,但是在停止命令返回之前,被执行。
+
+OCI hooks的配置格式规范如下:
+
+- path:格式是字符串,必须项,必须为绝对路径,指定的文件必须有可执行权限。
+- args:格式是字符串数组,可选项,语义和execv的args一致。
+- env:格式是字符串数组,可选项,语义和环境变量一致,内容为键值对,如:"PATH=/usr/bin"。
+- timeout:格式是整数,可选项,必须大于0,表示钩子执行的超时时间。如果钩子进程运行时间超过配置的时间,那么钩子进程会被杀死。
+
+hook的配置为json格式,一般存放在json结尾的文件中,示例如下:
+
+```json
+{
+ "prestart": [
+ {
+ "path": "/usr/bin/echo",
+ "args": ["arg1", "arg2"],
+ "env": [ "key1=value1"],
+ "timeout": 30
+ },
+ {
+ "path": "/usr/bin/ls",
+ "args": ["/tmp"]
+ }
+ ],
+ "poststart": [
+ {
+ "path": "/usr/bin/ls",
+ "args": ["/tmp"],
+ "timeout": 5
+ }
+ ],
+ "poststop": [
+ {
+ "path": "/tmp/cleanup.sh",
+ "args": ["cleanup.sh", "-f"]
+ }
+ ]
+}
+```
+
+## 接口
+
+isulad和isula都提供了hook的接口,isulad提供了默认的hook配置,会作用于所有容器;而isula提供的hook接口,只会作用于当前创建的容器。
+
+isulad提供的默认OCI hooks配置:
+
+- 通过/etc/isulad/daemon.json配置文件的hook-spec配置项设置hook配置的文件路径:"hook-spec": "/etc/default/isulad/hooks/default.json"。
+- 通过isulad --hook-spec参数设置hook配置的文件路径。
+
+isula提供的OCI hooks配置:
+
+- isula create --hook-spec:指定hook配置的json文件的路径。
+- isula run --hook-spec:指定hook配置的json文件的路径。
+
+run的配置其实也是在create阶段生效了。
+
+## 使用限制
+
+- hook-spec指定的路径必须是绝对路径。
+- hook-spec指定的文件必须存在。
+- hook-spec指定的路径对应的必须是普通文本文件,格式为json。
+- hook-spec指定的文件大小不能超过10MB。
+- hooks配置的path字段必须为绝对路径。
+- hooks配置的path字段指定文件必须存在。
+- hooks配置的path字段指定文件必须有可执行权限。
+- hooks配置的path字段指定文件的owner必须是root。
+- hooks配置的path字段指定文件必须只有root有写权限。
+- hooks配置的timeout必须大于0。
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/uninstallation.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/uninstallation.md
new file mode 100644
index 0000000000000000000000000000000000000000..c7e5d64daa66f0149f9746963890a41241f3a075
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/uninstallation.md
@@ -0,0 +1,22 @@
+# 卸载
+
+卸载iSulad的操作步骤如下:
+
+1. 卸载iSulad及其依赖软件包
+ - 若使用yum方式安装,卸载的参考命令如下:
+
+ ```bash
+ # yum remove iSulad
+ ```
+
+ - 若使用rpm方式安装,需卸载iSulad及其依赖包,卸载单个RPM包的参考命令如下:
+
+ ```bash
+ # rpm -e iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm
+ ```
+
+2. 镜像、容器、volumes以及相关配置文件不会自动删除,需要手动删除。参考命令如下:
+
+ ```bash
+ # rm -rf /var/lib/iSulad
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/upgrade-methods.md b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/upgrade-methods.md
new file mode 100644
index 0000000000000000000000000000000000000000..d0f24f80ae9655ad1121f0fc5f71a1c9269953bb
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerEngine/iSulaContainerEngine/upgrade-methods.md
@@ -0,0 +1,24 @@
+# 升级
+
+- 若为相同大版本之间的升级,例如从2.x.x版本升级到2.x.x版本,请执行如下命令:
+
+ ```bash
+ # sudo yum update -y iSulad
+ ```
+
+- 若为不同大版本之间的升级,例如从1.x.x版本升级到2.x.x版本,请先保存当前的配置文件/etc/isulad/daemon.json,并卸载已安装的iSulad软件包,然后安装待升级的iSulad软件包,随后恢复配置文件。
+
+>  **说明:**
+>
+> - 可通过**sudo rpm -qa |grep iSulad** 或 **isula version** 命令确认当前iSulad的版本号。
+> - 相同大版本之间,如果希望手动升级,请下载iSulad及其所有依赖库的RPM包进行升级,参考命令如下:
+>
+> ```bash
+> # sudo rpm -Uhv iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm
+> ```
+>
+> 若升级失败,可通过--force选项进行强制升级,参考命令如下:
+>
+> ```bash
+> # sudo rpm -Uhv --force iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm
+> ```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/_menu.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..44c1a7d062ddf01722070d128ef316905df9ee80
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/_menu.md
@@ -0,0 +1,21 @@
+---
+label: '安全容器'
+ismanual: 'Y'
+description: '安全容器结合了虚拟化技术和容器技术,具有更好的隔离性'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '安装与配置'
+ href: './installation-and-deployment-2.md'
+ - label: '使用方法'
+ href: './application-scenarios-2.md'
+ children:
+ - label: '管理安全容器的生命周期'
+ href: './managing-the-lifecycle-of-a-secure-container.md'
+ - label: '为安全容器配置资源'
+ href: './configuring-resources-for-a-secure-container.md'
+ - label: '监控安全容器'
+ href: './monitoring-secure-containers.md'
+ - label: '附录'
+ href: './appendix-2.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/appendix-2.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/appendix-2.md
new file mode 100644
index 0000000000000000000000000000000000000000..9fea9ff3482d0626aaea39a60ceec25602cfae62
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/appendix-2.md
@@ -0,0 +1,488 @@
+# 附录
+
+- [附录](#附录)
+ - [configuration.toml配置说明](#configuration-toml配置说明)
+ - [接口列表](#接口列表)
+
+## configuration-toml配置说明
+
+>  **说明:**
+>
+> configuration.toml配置文件中各个字段的取值以kata-containers-.rpm包中的configuration.toml文件为准,不支持用户对配置文件中的字段任意取值。
+
+```conf
+[hypervisor.qemu]
+path :指定虚拟化qemu执行路径
+kernel :指定guest kernel执行路径
+initrd :指定guest initrd执行路径
+image :指定guest image执行路径(不适用)
+machine_type :指定模拟芯片类型,ARM架构为virt,x86架构为pc
+kernel_params :指定guest内核运行参数
+firmware :指定固件路径,设空则使用默认固件
+machine_accelerators :指定加速器
+default_vcpus :指定每个SB/VM的默认vCPU数量
+default_maxvcpus :指定每个SB/VM的默认最大vCPU数量
+default_root_ports :指定每个SB/VM的默认Root Ports数量
+default_bridges :指定每个SB/VM的默认bridges数量
+default_memory :指定每个SB/VM的默认内存大小,默认为1024 MiB
+memory_slots :指定每个SB/VM的内存插槽数量,默认为10
+memory_offset :指定内存偏移量,默认为0
+disable_block_device_use :禁止将块设备用于容器的rootfs
+shared_fs :指定共享文件系统类型,默认为virtio-9p
+virtio_fs_daemon :指定vhost-user-fs守护进程路径
+virtio_fs_cache_size :指定DAX缓存的默认大小
+virtio_fs_cache :指定缓存模式
+block_device_driver :指定块设备驱动
+block_device_cache_set :指定块设备是否设置缓存相关选项,默认false
+block_device_cache_direct :指定是否使能O_DIRECT,默认false
+block_device_cache_noflush :指定是否忽略设备刷新请求,默认false
+enable_iothreads :使能iothreads
+enable_mem_prealloc :使能VM RAM预分配,默认false
+enable_hugepages :使能大页,默认false
+enable_swap :使能swap,默认false
+enable_debug :使能qemu debug,默认false
+disable_nesting_checks :关闭嵌套检查
+msize_9p = 8192 :指定每个9p包传输的字节数
+use_vsock :使用vsocks与agent直接通信(前提支持vsocks),默认false
+hotplug_vfio_on_root_bus :使能vfio设备在root bus热插拔,默认false
+disable_vhost_net :关闭vhost_net,默认false
+entropy_source :指定默认熵源
+guest_hook_path :指定guest hook二进制路径
+
+[factory]
+enable_template :使能VM模板,默认false
+template_path :指定模板路径
+vm_cache_number :指定VMCache的缓存数量,默认0
+vm_cache_endpoint :指定VMCache使用的Unix socket的地址,默认/var/run/kata-containers/cache.sock
+
+[proxy.kata]
+path :指定kata-proxy运行路径
+enable_debug :使能proxy debug,默认false
+
+[shim.kata]
+path :指定kata-shim运行路径
+enable_debug :使能shim debug,默认false
+enable_tracing :使能shim opentracing
+
+[agent.kata]
+enable_debug :使能agent debug,默认false
+enable_tracing :使能agent tracing
+trace_mode :指定trace模式
+trace_type :指定trace类型
+enable_blk_mount :开启block设备guest挂载
+
+[netmon]
+enable_netmon :使能网络监控,默认false
+path :指定kata-netmon运行路径
+enable_debug :使能netmon debug,默认false
+
+[runtime]
+enable_debug :使能runtime debug,默认false
+enable_cpu_memory_hotplug :使能cpu和内存热插拔,默认false
+internetworking_model :指定VM和容器网络互联模式
+disable_guest_seccomp :关闭在guest应用seccemp安全机制,默认true
+enable_tracing :使能runtime opentracing,默认false
+disable_new_netns :不为shim和hypervisor进程创建网络命名空间,默认false
+experimental :开启实验特性,不支持用户自定义配置
+```
+
+## 接口列表
+
+**表 1** kata-runtime网络相关的命令行接口
+
+
+ 命令
+
+ 子命令
+
+ 文件示例
+
+ 字段
+
+ 含义
+
+ 备注
+
+
+
+ kata-network
+ 说明: kata-network命令需成组使用。不经过kata-runtime kata-network添加的网络设备,无法使用kata-runtime kata-network删除或者列出。反之亦然。 kata-runtime kata-network通过文件或stdin传入配置参数。
+
+
+ add-iface
+ 说明: 一个interface只能添加到1个容器中。 执行结果以返回值为准(非零返回值)。
+
+
+
+ {
+ "device":"tap1",
+ "name":"eth1",
+ "IPAddresses":[{"address":"172.17.1.10","mask":"24"}],
+ "mtu":1300,
+ "hwAddr":"02:42:20:6f:a2:80"
+ "vhostUserSocket":"/usr/local/var/run/openvswitch/vhost-user1"
+ }
+
+
+ device
+
+ 设置网卡的主机端名称
+
+ 必选。支持字母、数字、下划线“\_”、“-” 以及“.”字符,必须以字母开头,且长度不超过15。需要确保同一个宿主机上device不能重复。
+
+
+ name
+
+ 设置网卡的容器内名称
+
+ 必选。支持字母、数字、下划线“\_”、“-” 以及“.”字符,必须以字母开头,且长度不超过15。需要确保同一个Sandbox内name不能重复。
+
+
+ IPAddresses
+
+ 设置网卡的IP地址
+
+ 可选。
+ 暂时支持一张网卡配置一个IP,如果不配置IP,则不会在容器内部配置IP。
+
+
+ mtu
+
+ 设置网卡的mtu值
+
+ 必选。
+ 有效范围46~9600。
+
+
+ hwAddr
+
+ 设置网卡的mac值
+
+ 必选。
+
+
+ vhostUserSocket
+
+ 设置dpdk轮循socket路径
+
+ 可选。
+ 路径最大长度128字节,命名规则支持数字、字母、“-”。必须以字母开头。
+
+
+ del-iface
+
+ {
+ "name":"eth1"
+ }
+
+ 无
+
+ 删除容器内的一个网卡
+
+ 说明: 删除网卡时,仅根据网卡容器内名称(name字段)来删除。即便填写其他字段,kata也不会使用。
+
+
+
+ list-ifaces
+
+ 无
+
+ 无
+
+ 查询容器内的网卡列表
+
+ 无
+
+
+ add-route
+
+ {
+ "dest":"172.17.10.10/24",
+ "gateway":"",
+ "device":"eth1"
+ }
+
+ dest
+
+ 设置路由对应的网段
+
+ 格式为<ip>/<mask>,<ip>必选。
+ 分三种情况:
+ 1. 配置<ip>/<mask>;
+ 2. 只配置<ip>,则默认掩码为32;
+ 3. 配置"dest":"default",默认无dest,需传入gateway。
+
+
+ gateway
+
+ 设置路由的下一跳网关
+
+ 设置"dest":"default"时,gateway必选;其他情况可选。
+
+
+ device
+
+ 设置路由对应的网卡名称
+
+ 必选。
+ 最长支持15字符。
+
+
+ del-route
+
+ {
+ "dest":"172.17.10.10/24"
+ }
+
+ 无
+
+ 删除容器的路由规则
+
+ dest为必选,device/gateway均为可选。
+ 说明: kata根据不同字段进行模糊匹配,删除对应的路由规则。
+
+
+
+ list-routes
+
+ 无
+
+ 无
+
+ 查询容器内的路由列表
+
+ 无
+
+
+
+
+
+**表 2** kata-ipvs命令行接口
+
+
+ 命令
+
+ 子命令
+
+ 字段
+
+ 参数
+
+ 子参数
+
+ 含义
+
+ 备注
+
+
+
+ kata-ipvs
+
+ ipvsadm
+
+ --parameters
+
+ -A, --add-service
+
+ -t, --tcp-service
+ -u, --udp-service
+
+ 虚拟服务类型
+
+ 必选项。--tcp-service、--udp-service,两个参数只能选择其一。格式为“ip:port”,port取值[1,65535]。
+ 举例:
+ kata-runtime kata-ipvs ipvsadm --parameters "--add-service --tcp-service 172.17.0.7:80 --scheduler rr --persistent 3000" <container-id>
+
+
+ -s, --scheduler
+
+ 负载均衡调度算法
+
+ 必选项。取值范围:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq。
+
+
+ -p, --persistent
+
+ 持续服务时间
+
+ 必选项。取值范围[1, 2678400],单位s。
+
+
+ -E, --edit-service
+
+ -t, --tcp-service
+ -u, --udp-service
+
+ 虚拟服务类型
+
+ 必选项。--tcp-service、--udp-service,两个参数只能选择其一。格式为“ip:port”,port取值[1,65535]。
+
+
+ -s, --scheduler
+
+ 负载均衡调度算法
+
+ 必选项。取值范围:rr|wrr|lc |wlc|lblc|lblcr|dh|sh|sed|nq 。
+
+
+ -p, --persistent
+
+ 持续服务时间
+
+ 必选项。取值范围[1, 2678400],单位s。
+
+
+ -D, --delete-service
+
+ -t, --tcp-service
+ -u, --udp-service
+
+ 虚拟服务类型
+
+ 必选项。--tcp-service、--udp-service,两个参数只能选择其一。格式为“ip:port”,port取值[1,65535]。
+
+
+ -a, --add-server
+
+ -t, --tcp-service
+ -u, --udp-service
+
+ 虚拟服务类型
+
+ 必选项。--tcp-service、--udp-service,两个参数只能选择其一。格式为“ip:port”,port取值[1,65535]。
+ 举例:
+ kata-runtime kata-ipvs ipvsadm --parameters "--add-server --tcp-service 172.17.0.7:80 --real-server 172.17.0.4:80 --weight 100" <container-id>
+
+
+ -r, --real-server
+
+ 真实服务器地址
+
+ 必选项。格式为“ip:port”,port取值[1,65535]。
+
+
+ -w, --weight
+
+ 权重
+
+ 可选项,取值[0,65535]。
+
+
+ -e, --edit-server
+
+ -t, --tcp-service
+ -u, --udp-service
+
+ 虚拟服务类型
+
+ 必选项。--tcp-service、--udp-service,两个参数只能选择其一。格式为“ip:port”,port取值[1,65535]。
+
+
+ -r, --real-server
+
+ 真实服务器地址
+
+ 必选项。格式为“ip:port”,port取值[1,65535]。
+
+
+ -w, --weight
+
+ 权重
+
+ 可选项,取值[0,65535]。
+
+
+ -d, --delete-server
+
+ -t, --tcp-service
+ -u, --udp-service
+
+ 虚拟服务类型
+
+ 必选项。--tcp-service、--udp-service,两个参数只能选择其一。格式为“ip:port”,port取值[1,65535]。
+
+
+ -r, --real-server
+
+ 真实服务器地址
+
+ 必选项。格式为“ip:port”,port取值[1,65535]。
+
+
+ -L, --list
+
+ -t, --tcp-service
+ -u, --udp-service
+
+ 指定查询虚拟服务信息
+
+ 可选项。
+ 举例:
+ kata-runtime kata-ipvs ipvsadm --parameters "--list --tcp-service ip:port" <container-id>
+
+
+ --set
+
+ --tcp
+
+ tcp超时
+
+ 必选项,取值[0, 1296000]。
+ 举例:
+ kata-runtime kata-ipvs ipvsadm --parameters "--set 100 100 200" <container-id>
+
+
+ --tcpfin
+
+ tcpfin超时
+
+ 必选项,取值[0, 1296000]。
+
+
+ --udp
+
+ udp超时
+
+ 必选项,取值[0, 1296000]。
+
+
+ --restore
+
+ -
+
+ 标准输入批量导入
+ 可指定规则文件
+
+ 举例:
+ kata-runtime kata-ipvs ipvsadm --restore - < <规则文件路径> <container-id>
+ 说明: 单条添加时默认使用NAT模式,批量导入时添加真实服务器需手动添加-m参数使用NAT模式。
+
规则文件内容示例:
+
-A -t 10.10.11.12:100 -s rr -p 3000
+
-a -t 10.10.11.12:100 -r 172.16.0.1:80 -m
+
-a -t 10.10.11.12:100 -r 172.16.0.1:81 -m
+
-a -t 10.10.11.12:100 -r 172.16.0.1:82 -m
+
+
+
+ cleanup
+
+ --parameters
+
+ -d, --orig-dst
+
+ ip信息
+
+ 必选项。
+ 举例:
+ kata-runtime kata-ipvs cleanup --parameters "--orig-dst 172.17.0.4 --protonum tcp" <container-id>
+
+
+ -p, --protonum
+
+ 协议类型
+
+ 必选项,取值为tcp|udp 。
+
+
+
+
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/application-scenarios-2.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/application-scenarios-2.md
new file mode 100644
index 0000000000000000000000000000000000000000..0850389b7cf36241dc1f940e78bbc1fbe9071f78
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/application-scenarios-2.md
@@ -0,0 +1,6 @@
+# 使用方法
+
+本章介绍安全容器的使用方法。
+>  **说明:**
+>
+> 安全容器的使用需要root权限。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/configuring-resources-for-a-secure-container.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/configuring-resources-for-a-secure-container.md
new file mode 100644
index 0000000000000000000000000000000000000000..e0b99d129f0c396cb72dff92558556d48696614a
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/configuring-resources-for-a-secure-container.md
@@ -0,0 +1,36 @@
+# 为安全容器配置资源
+
+- [为安全容器配置资源](#为安全容器配置资源)
+ - [资源共享](#资源共享-27)
+ - [限制资源](#限制资源)
+ - [热插拔限制内存资源](#热插拔限制内存资源)
+
+安全容器运行于虚拟化隔离的轻量级虚拟机内,因此资源的配置应分为两部分:对轻量级虚拟机的资源配置,即Host资源配置;对虚拟机内容器的配置,即Guest容器资源配置。以下资源配置均分为这两部分。
+
+## 资源共享
+
+由于安全容器运行于虚拟化隔离的轻量虚拟机内,故无法访问Host上某些namespace下的资源,因此启动时不支持--net host,--ipc host,--pid host,--uts host。
+
+当启动一个Pod时,同一个Pod中的所有容器默认共享同一个net namespace和ipc namespace。如果同一个Pod中的容器需要共享pid namespace,则可以通过Kubernetes进行配置,Kubernetes 1.11版本该值为默认关闭。
+
+## 限制资源
+
+对资源的限制建议在configuration.toml中进行配置。
+常用的字段的有:
+
+- default_vcpus :指定每个SB/VM的默认vCPU数量
+- default_maxvcpus :指定每个SB/VM的默认最大vCPU数量
+- default_root_ports :指定每个SB/VM的默认Root Ports数量
+- default_bridges :指定每个SB/VM的默认bridges数量
+- default_memory :指定每个SB/VM的默认内存大小,默认为1024 MiB
+- memory_slots :指定每个SB/VM的内存插槽数量,默认为10
+
+## 热插拔限制内存资源
+
+内存热插拔对于容器在部署时内存动态分配来说是一项关键特性。由于安全容器是运行在虚拟机当中的,所以这一项特性需要VMM和guest kernel两方面的支持。目前kata在arm64上默认使用的QEMU和guest kernel都是支持这一特性的。除了VMM和guest kernel,内存热插拔还取决于依赖着固件的ACPI。在x86上,由于ACPI可以隐式地随固件一起启动,所以可以直接用QEMU去启动一个打开了ACPI的虚拟机。不过在arm64上的话,在使用内存热插拔之前就需要手动去安装UEFI ROM。
+
+```shell
+$ pushd $GOPATH/src/github.com/kata-containers/tests
+$ sudo .ci/aarch64/install_rom_aarch64.sh #仅限ubuntu
+$ popd
+```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/figures/kata-arch.png b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/figures/kata-arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..60fbb602d94cf7a8e13bd6ecb520c99e574037e6
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/figures/kata-arch.png differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/figures/zh_cn_image_0221924928.png b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/figures/zh_cn_image_0221924928.png
new file mode 100644
index 0000000000000000000000000000000000000000..df046870b3dfbcbe4acb4a91f509ba8b26fa7c80
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/figures/zh_cn_image_0221924928.png differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/installation-and-deployment-2.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/installation-and-deployment-2.md
new file mode 100644
index 0000000000000000000000000000000000000000..7443f11f9b8ac34883523449a2d060ab5c1b310c
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/installation-and-deployment-2.md
@@ -0,0 +1,114 @@
+# 安装与配置
+
+## 安装方法
+
+### 前提条件
+
+- 安全容器的安装需要使用root权限。
+- 为了获取更好的性能体验,安全容器需要运行在裸金属服务器上,**暂不支持安全容器运行在虚拟机内**。
+- 安全容器运行依赖以下组件,请确保环境上已安装所需版本的依赖组件。以下组件来自配套的openEuler版本。如果使用iSula容器引擎,请参考iSula容器引擎的[安装与配置](../../ContainerEngine/iSulaContainerEngine/installation-configuration.md)章节安装iSulad。
+ - docker-engine
+ - qemu
+
+### 安装操作
+
+安全容器发布组件集成在同一个`kata-containers-.rpm`包中,使用rpm命令可以直接安装对应的软件,其中version为版本号。
+
+```bash
+rpm -ivh kata-containers-.rpm
+```
+
+## 配置方法
+
+### docker-engine容器引擎的配置
+
+为了让docker-engine容器引擎支持新的容器运行时kata-runtime,需要通过以下步骤对docker-engine容器引擎进行配置:
+
+1. 请保证环境上所有的软件包(docker-engine、kata-containers)都已经安装完毕。
+2. 停止docker-engine。
+
+ ```bash
+ systemctl stop docker
+ ```
+
+3. 修改docker-engine的配置文件/etc/docker/daemon.json,并新增如下配置:
+
+ ```conf
+ {
+ "runtimes": {
+ "kata-runtime": {
+ "path": "/usr/bin/kata-runtime",
+ "runtimeArgs": [
+ "--kata-config",
+ "/usr/share/defaults/kata-containers/configuration.toml"
+ ]
+ }
+ }
+ }
+ ```
+
+4. 重新启动docker-engine。
+
+ ```bash
+ systemctl start docker
+ ```
+
+### iSula容器引擎的配置
+
+与docker-engine容器引擎类似,为了让iSula容器引擎支持新的容器运行时kata-runtime,需要通过以下步骤对iSula容器引擎进行配置:
+
+1. 请保证环境上所有的软件包(iSulad、kata-containers)都已经安装完毕。
+2. 停止isulad。
+
+ ```bash
+ systemctl stop isulad
+ ```
+
+3. 修改iSula容器引擎的配置文件/etc/isulad/daemon.json,并新增如下配置:
+
+ ```conf
+ {
+ "runtimes": {
+ "kata-runtime": {
+ "path": "/usr/bin/kata-runtime",
+ "runtime-args": [
+ "--kata-config",
+ "/usr/share/defaults/kata-containers/configuration.toml"
+ ]
+ }
+ }
+ }
+ ```
+
+4. 重新启动isulad。
+
+ ```bash
+ systemctl start isulad
+ ```
+
+### 安全容器全局配置文件configuration-toml
+
+安全容器提供全局配置文件configuration.toml进行配置开关,用户也可以定制安全容器配置文件路径与配置选项。
+
+在docker-engine的runtimeArges字段可以利用--kata-config指定私有文件,默认的配置文件路径为/usr/share/defaults/kata-containers/configuration.toml。
+
+常用配置文件字段如下,详细的配置文件选项参见“安全容器 > 附录 > configuration.toml配置说明”。
+
+1. hypervisor.qemu
+ - path :指定虚拟化qemu执行路径。
+ - kernel :指定guest kernel执行路径。
+ - initrd :指定guest initrd执行路径。
+ - machin\_type :指定模拟芯片类型,其中arm为virt,x86架构为pc。
+ - kernel\_params :指定guest内核运行参数。
+
+2. proxy.kata
+ - path :指定kata-proxy运行路径。
+ - enable\_debug :kata-proxy进程debug开关。
+
+3. agent.kata
+ - enable\_blk\_mount :开启block设备guest挂载。
+ - enable\_debug :kata-agent进程debug开关。
+
+4. runtime
+ - enable\_cpu\_memory\_hotplug:CPU和内存热插拔开关。
+ - enable\_debug:kata-runtime进程debug开关。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/managing-the-lifecycle-of-a-secure-container.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/managing-the-lifecycle-of-a-secure-container.md
new file mode 100644
index 0000000000000000000000000000000000000000..1d8d63c6ff0df8fc8e9ed1674f09733053c8d9d7
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/managing-the-lifecycle-of-a-secure-container.md
@@ -0,0 +1,100 @@
+# 管理安全容器的生命周期
+
+- [管理安全容器的生命周期](#管理安全容器的生命周期)
+ - [启动安全容器](#启动安全容器)
+ - [停止安全容器](#停止安全容器)
+ - [删除安全容器](#删除安全容器)
+ - [在容器中执行一条新的命令](#在容器中执行一条新的命令)
+
+## 启动安全容器
+
+用户可以使用docker-engine或者iSulad作为安全容器的容器引擎,两者的调用方式类似,请用户自行选择一种方式启动安全容器。
+
+启动安全容器的操作步骤如下:
+
+1. 确保安全容器组件已经正确安装部署。
+2. 准备容器镜像。假设容器镜像为busybox,使用docker-engine和iSula容器引擎下载容器镜像的命令分别如下:
+
+ ```bash
+ docker pull busybox
+ ```
+
+ ```bash
+ isula pull busybox
+ ```
+
+3. 启动一个安全容器。使用docker-engine和iSula容器引擎启动安全容器的命令分别如下:
+
+ ```bash
+ docker run -tid --runtime kata-runtime --network none busybox
+ ```
+
+ ```bash
+ isula run -tid --runtime kata-runtime --network none busybox
+ ```
+
+ >  **说明:**
+ >
+ > 安全容器网络使用仅支持CNI网络,不支持CNM网络,不支持使用-p和--expose暴露容器端口,使用安全容器时需指定参数--net=none。
+
+4. 启动一个Pod
+ 1. 启动pause容器并根据回显获取pod的sandbox-id。使用docker-engine和iSula容器引擎启动的命令分别如下:
+
+ ```bash
+ docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=podsandbox
+ ```
+
+ ```bash
+ isula run -tid --runtime kata-runtime --network none --annotation io.kubernetes.cri.container-type=sandbox
+ ```
+
+ 2. 创建业务容器并加入到这个pod中。使用docker-engine和iSula容器引擎创建的命令分别如下:
+
+ ```bash
+ docker run -tid --runtime kata-runtime --network none --annotation io.kubernetes.docker.type=container --annotation io.kubernetes.sandbox.id= busybox
+ ```
+
+ ```bash
+ isula run -tid --runtime kata-runtime --network none --annotation io.kubernetes.cri.container-type=container --annotation io.kubernetes.cri.sandbox-id= busybox
+ ```
+
+ --annotation用于容器类型的标注,这里的docker-engine和isula提供该字段,上游社区的开源docker引擎则不提供。
+
+## 停止安全容器
+
+- 停止一个安全容器。
+
+ ```bash
+ docker stop
+ ```
+
+- 停止一个Pod。
+
+ Pod停止需要注意顺序,pause容器与Pod生命周期相同,因此先停止业务容器后再停止pause容器。
+
+## 删除安全容器
+
+删除前请确保容器已经停止:
+
+```bash
+docker rm
+```
+
+如果需要强制删除一个正在运行的容器,可以使用**-f**强制删除:
+
+```bash
+docker rm -f
+```
+
+## 在容器中执行一条新的命令
+
+由于pause容器仅作为占位容器,如果启动一个Pod时,请在业务容器内执行新的命令,pause容器并没有相应的指令;如果只启动一个容器时,则可以直接执行新增命令:
+
+```bash
+docker exec -ti
+```
+
+>  **说明:**
+>
+> - 如遇到docker exec -ti进入容器的同时,另一终端执行docker restart或者docker stop命令造成exec界面卡住的情况,可使用Ctrl+P+Q退出docker exec操作界面。
+> - 如果使用-d参数则命令在后台执行,不会打印错误信息,其退出码也不能作为命令执行是否正确的判断依据。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/monitoring-secure-containers.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/monitoring-secure-containers.md
new file mode 100644
index 0000000000000000000000000000000000000000..5f728428d80839c62d4d14c405f18f7aab673539
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/monitoring-secure-containers.md
@@ -0,0 +1,54 @@
+# 监控安全容器
+
+## 描述
+
+kata 2.x中移除了kata-runtime events命令,代之以kata-runtime metrics命令,用以收集sandbox的指标信息,包括但不限于虚拟机信息、shim v2的cpu seconds、guest OS的CPU信息等等。格式符合Prometheus metric,可以配合kata-monitor上报至Prometheus。
+
+## 用法
+
+```bash
+kata-runtime metrics
+```
+
+## 前置条件
+
+sandbox id为长id,要查询的容器状态必须为running,否则报错:Get " unix /run/vc/\/shim-monitor : connect : connection refused
+
+当使用annotation指定容器类型为运行在某个sandbox中的容器时,用kata-runtime metrics查询该容器会失败,只能去查询该容器对应的sandbox。
+
+该命令只支持查询监控一个sandbox的状态。
+
+## 示例
+
+```bash
+$ kata-runtime metrics e2270357d23f9d3dd424011e1e70aa8defb267d813c3d451db58f35aeac97a04
+
+# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
+# TYPE go_gc_duration_seconds summary
+go_gc_duration_seconds{quantile="0"} 2.656e-05
+go_gc_duration_seconds{quantile="0.25"} 3.345e-05
+go_gc_duration_seconds{quantile="0.5"} 3.778e-05
+go_gc_duration_seconds{quantile="0.75"} 4.657e-05
+go_gc_duration_seconds{quantile="1"} 0.00023001
+go_gc_duration_seconds_sum 0.00898126
+go_gc_duration_seconds_count 195
+# HELP go_goroutines Number of goroutines that currently exist.
+# TYPE go_goroutines gauge
+go_goroutines 27
+# HELP go_info Information about the Go environment.
+# TYPE go_info gauge
+go_info{version="go1.17.3"} 1
+# HELP kata_hypervisor_netdev Net devices statistics.
+# TYPE kata_hypervisor_netdev gauge
+kata_hypervisor_netdev{interface="lo",item="recv_bytes"} 0
+kata_hypervisor_netdev{interface="lo",item="recv_compressed"} 0
+kata_hypervisor_netdev{interface="lo",item="recv_drop"} 0
+kata_hypervisor_netdev{interface="lo",item="recv_errs"} 0
+kata_hypervisor_netdev{interface="lo",item="recv_fifo"} 0
+kata_hypervisor_netdev{interface="lo",item="recv_frame"} 0
+kata_hypervisor_netdev{interface="lo",item="recv_multicast"} 0
+kata_hypervisor_netdev{interface="lo",item="recv_packets"} 0
+kata_hypervisor_netdev{interface="lo",item="sent_bytes"} 0
+kata_hypervisor_netdev{interface="lo",item="sent_carrier"} 0
+kata_hypervisor_netdev{interface="lo",item="sent_colls"} 0
+```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/overview.md b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..795e5282aec84fe82d0e5583e7f0932191671ac0
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/overview.md
@@ -0,0 +1,27 @@
+# 概述
+
+安全容器是虚拟化技术和容器技术的有机结合,相比普通linux容器,安全容器具有更好的隔离性。
+
+普通linux容器利用namespace进行进程间运行环境的隔离,并使用cgroup进行资源限制;因此普通linux容器本质上还是共用同一个内核,单个容器有意或无意影响到内核都会影响到整台宿主机上的容器。
+
+安全容器是使用虚拟化层进行容器间的隔离,同一个主机上不同的容器间运行互相不受影响。
+
+**图 1** 安全容器架构
+
+
+安全容器与Kubernetes中的Pod概念紧密联系,Kubernetes为容器调度管理平台的开源生态标准,它定义了一组容器操作相关接口(Container Runtime Interface 简称CRI)。
+
+在CRI标准中,Pod为完成一组服务需要的一组容器集合,是编排调度的最小单元,通常共享IPC和网络namespace;一个Pod必然包含一个占位容器(pause容器)以及一个或多个业务容器,其中pause容器的生命周期与其所在Pod的生命周期相同。
+
+其中安全容器中的一个轻量级虚拟机对应为一个Pod,在此虚拟机中启动的第一个容器为pause容器,以后依次启动的容器为业务容器。
+
+安全容器同时提供启动单个容器与启动Pod的功能。
+
+安全容器与周边组件的关系如[图2](#fig17734185518269)所示。
+
+**图 2** 安全容器与周边组件的关系
+
+
+>  **说明:**
+>
+> 安全容器的安装和使用需要使用root权限。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-caution.gif b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-danger.gif b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-note.gif b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-notice.gif b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-tip.gif b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-warning.gif b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SecureContainer/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/_menu.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..fee0af8970dafda0e01d0409606483556b7756e3
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/_menu.md
@@ -0,0 +1,37 @@
+---
+label: '系统容器'
+ismanual: 'Y'
+description: '解决在重计算、高性能、大并发的场景下,重型应用和业务云化的问题'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '安装指导'
+ href: './installation-guideline.md'
+ - label: '使用指南'
+ href: './usage-guide.md'
+ children:
+ - label: '指定rootfs创建容器'
+ href: './specifying-rootfs-to-create-a-container.md'
+ - label: '通过systemd启动容器'
+ href: './using-systemd-to-start-a-container.md'
+ - label: '容器内reboot/shutdown'
+ href: './reboot-or-shutdown-in-a-container.md'
+ - label: 'cgroup路径可配置'
+ href: './configurable-cgroup-path.md'
+ - label: 'namespace化内核参数可写'
+ href: './writable-namespace-kernel-parameters.md'
+ - label: '共享内存通道'
+ href: './shared-memory-channels.md'
+ - label: '动态加载内核模块'
+ href: './dynamically-loading-the-kernel-module.md'
+ - label: '环境变量持久化'
+ href: './environment-variable-persisting.md'
+ - label: '最大句柄数限制'
+ href: './maximum-number-of-handles.md'
+ - label: '安全性和隔离性'
+ href: './security-and-isolation.md'
+ - label: '容器资源动态管理'
+ href: './dynamically-managing-container-resources-(syscontainer-tools).md'
+ - label: '附录'
+ href: './appendix-1.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/appendix-1.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/appendix-1.md
new file mode 100644
index 0000000000000000000000000000000000000000..d29a56e4de1bc1b5135b71d2308711839b8da628
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/appendix-1.md
@@ -0,0 +1,92 @@
+# 附录
+
+- [附录](#附录)
+ - [命令行接口列表](#命令行接口列表)
+
+## 命令行接口列表
+
+此处仅列出系统容器与普通容器的差异命令,其他命令用户可以查阅iSulad容器引擎相关章节,或者执行isula XXX --help进行查询。
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --external-rootfs
+
+字符串变量。 宿主机某个绝对路径。 运行系统容器时,必须使用此参数指定特定虚拟机的rootfs。
+
+
+ --system-container
+
+布尔变量。 指定某个容器是否属于系统容器,如果是系统容器场景,必须使能。
+
+
+ --add-host
+
+字符串变量。 格式为:<hostname>:<ip>,指定容器的hosts配置,可以指定多个参数。
+
+
+ --dns,--dns-option,--dns-search
+
+
+
+
+ --ns-change-opt
+
+字符串变量。 容器namespace化内核参数可修改选项,参数只能为net或ipc,如果指定多个,用逗号隔开,例如--ns-change-opt=net,ipc。
+
+
+ --oom-kill-disable
+
+布尔变量。 表示是否打开oom-kill-disable功能。
+
+
+ --shm-size
+
+字符串变量。 设置/dev/shm大小,默认64MB。 支持单位B(b)、K(k)、M(m)、G(g)、T(t)、P(p)。
+
+
+ --sysctl
+
+字符串变量。 指定容器内核参数值,格式为key=value,可传入多个,sysctl白名单如下:
+ kernel.msgmax,kernel.msgmnb,kernel.msgmni,kernel.sem,kernel.shmall,kernel.shmmax,kernel.shmmni, kernel.shm_rmid_forced,kernel.pid_max,net.,fs.mqueue。
+ 说明: 容器内kernel.pid_max参数需要内核支持pid_max namespace化,否则会报错。
+
容器内sysctl白名单参数值限制与物理机对应的内核参数限制保持一致(包括参数类型、参数取值范围等)。
+
+
+
+ --env-target-file
+
+字符串变量。 指定env持久化文件路径(路径必须为绝对路径,且文件必须在rootfs目录下),文件如果存在不能超过10MB,如果--env和文件里面的env出现冲突,--env指定值生效。 绝对路径的根目录/为rootfs根目录,,即要指定文件路径为容器内/etc/environment,只用指定env-target-file=/etc/environment,而不是env-target-file=/path/of/root-fs/etc/environemt。
+
+
+ --cgroup-parent
+
+字符串变量。 指定容器的cgroup父目录,cgroup根路径为/sys/fs/cgroup/<controller>。
+
+
+ --host-channel
+
+字符串变量。 指定宿主机和容器共享内存空间(tmpfs),格式为:
+ <host path>:<container path>:<rw/ro>:<size limit>
+
+
+ --files-limit
+
+
+
+
+ --user-remap
+
+字符串变量。 参数格式为:<uid>:<gid>:<offset>
+
+
+
+
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/configurable-cgroup-path.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/configurable-cgroup-path.md
new file mode 100644
index 0000000000000000000000000000000000000000..e8d6d6d201544e8b3035eaddb26dfc80fce90e9a
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/configurable-cgroup-path.md
@@ -0,0 +1,95 @@
+# cgroup路径可配置
+
+## 功能描述
+
+系统容器提供在宿主机上进行容器资源隔离和预留的能力。通过\--cgroup-parent参数,可以将容器使用的cgroup目录指定到某个特定目录下,从而达到灵活分配宿主机资源的目的。例如可以设置容器a、b、c的cgroup父路径为/lxc/cgroup1,容器d、e、f的cgroup父路径为/lxc/cgroup2,这样通过cgroup路径将容器分为两个group,实现容器cgroup组层面的资源隔离。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --cgroup-parent
+
+
+
+
+
+
+
+除了通过命令行指定单个系统容器对应的cgroup父路径外,还可通过修改iSulad容器引擎启动配置文件,指定所有容器的cgroup路径。
+
+
+ 配置文件路径
+
+ 配置项
+
+ 配置项说明
+
+
+
+ /etc/isulad/daemon.json
+
+ --cgroup-parent
+
+字符串变量。 指定容器默认cgroup父路径。 配置示例:"cgroup-parent": "/lxc/mycgroup"
+
+
+
+
+
+## 约束限制
+
+- 如果daemon端和客户端都设置了cgroup parent参数,最终以客户端指定的\--cgroup-parent生效。
+- 如果已启动容器A,然后启动容器B,容器B的cgroup父路径指定为容器A的cgroup路径,在删除容器的时候需要先删除容器B再删除容器A,否则会导致cgroup资源残留。
+
+## 使用示例
+
+启动系统容器,指定--cgroup-parent参数:
+
+```bash
+[root@localhost ~]# isula run -tid --cgroup-parent /lxc/cgroup123 --system-container --external-rootfs /root/myrootfs none init
+115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+```
+
+查看容器init进程的cgroup信息:
+
+```bash
+[root@localhost ~]# isula inspect -f "{{json .State.Pid}}" 11
+22167
+[root@localhost ~]# cat /proc/22167/cgroup
+13:blkio:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+12:perf_event:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+11:cpuset:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+10:pids:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+9:rdma:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+8:devices:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+7:hugetlb:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+6:memory:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+5:net_cls,net_prio:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+4:cpu,cpuacct:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+3:files:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+2:freezer:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+1:name=systemd:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e/init.scope
+0::/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
+```
+
+可以看到容器的cgroup父路径被设置为/sys/fs/cgroup//lxc/cgroup123
+
+同时,对于所有容器cgroup父路径的设置可以配置一下容器daemon文件,例如:
+
+```conf
+{
+ "cgroup-parent": "/lxc/cgroup123",
+}
+```
+
+然后重启容器引擎,配置生效。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/dynamically-loading-the-kernel-module.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/dynamically-loading-the-kernel-module.md
new file mode 100644
index 0000000000000000000000000000000000000000..dac7da266cdca29ab3ab40458e49b9d50b0c6890
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/dynamically-loading-the-kernel-module.md
@@ -0,0 +1,53 @@
+# 动态加载内核模块
+
+## 功能描述
+
+容器内业务可能依赖某些内核模块,可通过设置环境变量的方式,在系统容器启动前动态加载容器中业务需要的内核模块到宿主机,此特性需要配合syscontainer-hooks一起使用,具体使用可参看"容器资源动态管理(syscontainer-tools)"章节。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ -e KERNEL_MODULES=module_name1,module_name
+
+
+
+
+
+
+
+## 约束限制
+
+- 如果加载的内核模块是未经过验证的,或者跟宿主机已有模块冲突的场景,会导致宿主机出现不可预知问题,在做加载内核模块时需要谨慎操作。
+- 动态加载内核模块通过将需要加载的内核模块传递给容器,此功能是依靠syscontainer-tools捕获到容器启动的环境变量实现,依赖syscontainer-tools的正确安装部署。
+- 加载的内核模块需要手动进行删除。
+
+## 使用示例
+
+启动系统容器时,指定-e KERNEL\_MODULES参数,待系统容器启动后,可以看到ip\_vs模块被成功加载到内核中。
+
+```bash
+[root@localhost ~]# lsmod | grep ip_vs
+[root@localhost ~]# isula run -tid -e KERNEL_MODULES=ip_vs,ip_vs_wrr --hook-spec /etc/syscontainer-tools/hookspec.json --system-container --external-rootfs /root/myrootfs none init
+ae18c4281d5755a1e153a7bff6b3b4881f36c8e528b9baba8a3278416a5d0980
+[root@localhost ~]# lsmod | grep ip_vs
+ip_vs_wrr 16384 0
+ip_vs 176128 2 ip_vs_wrr
+nf_conntrack 172032 7 xt_conntrack,nf_nat,nf_nat_ipv6,ipt_MASQUERADE,nf_nat_ipv4,nf_conntrack_netlink,ip_vs
+nf_defrag_ipv6 20480 2 nf_conntrack,ip_vs
+libcrc32c 16384 3 nf_conntrack,nf_nat,ip_vs
+```
+
+>  **说明:**
+>
+> - 宿主机需要安装syscontainer-tools。
+> - 需要指定--hooks-spec为syscontainer hooks。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/dynamically-managing-container-resources-(syscontainer-tools).md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/dynamically-managing-container-resources-(syscontainer-tools).md
new file mode 100644
index 0000000000000000000000000000000000000000..287e9b935d453e936da743e194c37ec5e7ac98c3
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/dynamically-managing-container-resources-(syscontainer-tools).md
@@ -0,0 +1,476 @@
+# 容器资源动态管理
+
+普通容器无法支持对容器内的资源进行管理,例如添加一个块设备到容器、插入一块物理/虚拟网卡到容器。系统容器场景下,通过syscontainer-tools工具可以实现动态为容器挂载/卸载块设备,网络设备,路由和卷等资源。
+
+要使用此功能,需要安装syscontainer-tools工具:
+
+```sh
+[root@localhost ~]# yum install syscontainer-tools
+```
+
+## 设备管理
+
+### 功能描述
+
+syscontainer-tools支持将宿主机上的块设备(比如磁盘、LVM)或字符设备(比如GPU、binner、fuse)添加到容器中。在容器中使用该设备,例如可以对磁盘进行fdisk格式化,写入fs等操作。在容器不需要设备时,syscontainer-tools可以将设备从容器中删除,归还宿主机。
+
+### 命令格式
+
+```sh
+syscontainer-tools [COMMAND][OPTIONS] [ARG...]
+```
+
+其中:
+
+COMMAND:设备管理相关的命令。
+
+OPTIONS:设备管理命令支持的选项。
+
+container\_id:容器id。
+
+ARG:命令对应的参数。
+
+### 参数说明
+
+
+ 命令
+
+ 功能说明
+
+ 选项说明
+
+ 参数说明
+
+
+
+ add-device
+
+ 将宿主机块设备/字符设备添加到容器中。
+
+ 支持的选项如下:
+--blkio-weight-device:设置块设备IO权重(相对权重,10-100之间)。 --device-read-bps:设置块设备读取速率限制(byte/秒)。 --device-read-iops:设置块设备读取速率限制(IO/秒)。 --device-write-bps:设置块设备写入速率限制(byte/秒)。 --device-write-iops:设置块设备写入速率限制(IO/秒)。 --follow-partition:如果块设备是基础块设备(主SCSI块磁盘),加入此参数可以添加主磁盘下的所有分区。 --force:如果容器中已有块设备/字符设备,使用此参数覆盖旧的块设备/字符设备文件。 --update-config-only:只更新配置文件不实际做添加磁盘动作。
+
+ 参数格式为:hostdevice[:containerdevice][:permission] [hostdevice[:containerdevice][:permission] ...]
+ 其中:
+ hostdevice:设备在主机上的路径。
+ containerdevice:设备在容器中的路径。
+ permission:容器内对设备的操作权限。
+
+
+ remove-device
+
+ 将块设备/字符设备从容器中删除,还原至宿主机。
+
+ 支持的选项如下:
+ --follow-partition:如果块设备是基础块设备(主SCSI块磁盘),加入此参数可以删除容器中主磁盘下的所有分区,还原至宿主机。
+
+ 参数格式为:hostdevice[:containerdevice] [hostdevice[:containerdevice] ...]
+ 其中:
+ hostdevice:设备在主机上的路径。
+ containerdevice:设备在容器中的路径。
+
+
+ list-device
+
+ 列出容器中所有的块设备/字符设备。
+
+ 支持的选项如下:
+--pretty:按照json格式输出。 --sub-partition:如果某磁盘为主磁盘,加入此flag,在显示主磁盘的同时,也显示主磁盘的子分区。
+
+ 无
+
+
+ update-device
+
+ 更新磁盘Qos。
+
+ 支持的选项如下:
+--device-read-bps:设置块设备读取速率限制(byte/秒),建议设置值大于等于1024。 --device-read-iops:设置块设备读取速率限制(IO/秒)。 --device-write-bps:设置块设备写入速率限制(byte/秒),建议设置值大于等于1024。 --device-write-iops:设置块设备写入速率限制(IO/秒)。
+
+ 无
+
+
+
+
+
+### 约束限制
+
+- 添加/删除设备的时机可以是容器实例非运行状态,完成操作后启动容器,容器内会有体现;也可以在容器运行时(running)动态添加。
+- 不能在容器内和host上并发进行fdisk对磁盘的格式化写入,会影响容器磁盘使用。
+- add-device将磁盘添加到容器的特定目录时,如果容器内的父目录为多级目录(比如/dev/a/b/c/d/e...)且目录层级不存在,则syscontainer-tools会自动在容器内创建对应目录;当删除时,不会将创建的父目录删除。如果用户下一次add-device到该父目录,则会提示已经存在无法添加成功。
+- add-device添加磁盘、更新磁盘参数时,配置磁盘Qos;当配置磁盘Qos的read/write bps、read/write IOPS值时,不建议配置值过小,当设置过小时,会造成磁盘表现为不可读(实际原因是速度过慢),最终影响业务功能。
+- 使用--blkio-weight-device来限制指定块设备的权重,如果当前块设备仅支持BFQ模式,可能会报错,提示用户检查当前OS环境是否支持BFQ块设备权重值设置。
+
+### 使用示例
+
+- 启动一个系统容器,指定hook spec为syscontainer hook执行配置脚本
+
+ ```sh
+ [root@localhost ~]# isula run -tid --hook-spec /etc/syscontainer-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init
+ eed1096c8c7a0eca6d92b1b3bc3dd59a2a2adf4ce44f18f5372408ced88f8350
+ ```
+
+- 添加一个块设备到容器
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools add-device ee /dev/sdb:/dev/sdb123
+ Add device (/dev/sdb) to container(ee,/dev/sdb123) done.
+ [root@localhost ~]# isula exec ee fdisk -l /dev/sdb123
+ Disk /dev/sdb123: 50 GiB, 53687091200 bytes, 104857600 sectors
+ Units: sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+ Disklabel type: dos
+ Disk identifier: 0xda58a448
+
+ Device Boot Start End Sectors Size Id Type
+ /dev/sdb123p1 2048 104857599 104855552 50G 5 Extended
+ /dev/sdb123p5 4096 104857599 104853504 50G 83 Linux
+ ```
+
+- 更新设备信息
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools update-device --device-read-bps /dev/sdb:10m ee
+ Update read bps for device (/dev/sdb,10485760) done.
+ ```
+
+- 删除设备
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools remove-device ee /dev/sdb:/dev/sdb123
+ Remove device (/dev/sdb) from container(ee,/dev/sdb123) done.
+ Remove read bps for device (/dev/sdb) done.
+ ```
+
+## 网卡管理
+
+### 功能描述
+
+syscontainer-tools支持将宿主机上的物理网卡或虚拟网卡插入到容器,在不使用网卡的时候从容器中删除归还给宿主机,并且可以动态修改网卡配置。插入物理网卡即把宿主机上一块网卡直接添加到容器中,插入虚拟网卡则需要先创建一对veth pair,之后将一端插入到容器中。
+
+### 命令格式
+
+```sh
+syscontainer-tools [COMMAND][OPTIONS]
+```
+
+其中:
+
+COMMAND:网卡管理相关的命令。
+
+OPTIONS:网卡管理命令支持的选项。
+
+container\_id:容器id。
+
+### 参数说明
+
+
+ 命令
+
+ 功能说明
+
+ 选项说明
+
+
+
+ add-nic
+
+ 给容器创建一个网卡。
+
+ 支持的选项如下:
+--type:设置网卡类型,当前只支持eth/veth。 --name:设置网卡名称,格式为[host:]<container>,host不写是随机名字。 --ip:设置网卡IP地址。 --mac:设置网卡mac地址。 --bridge:设置网卡绑定的网桥。 --mtu:设置网卡的mtu值,缺省值为1500。 --update-config-only:如果此flag设置了,只更新配置文件,不会实际做添加网卡的动作。 --qlen:配置qlen值,缺省值为1000。
+
+
+ remove-nic
+
+ 从容器中将网卡删除,还原至宿主机。
+
+ 支持的选项如下:
+--type:设置网卡的类型。 --name:设置网卡的名称,格式为[host:]<container>。
+
+
+ list-nic
+
+ 列出容器中所有的网卡。
+
+ 支持的选项如下:
+--pretty:按照json格式输出。 --filter:按照过滤格式输出,比如--filter '{"ip":"192.168.3.4/24", "Mtu":1500}'。
+
+
+ update-nic
+
+ 更改容器内指定网卡的配置参数。
+
+ 支持的选项如下:
+--name:容器内网卡名(必须项)。 --ip:设置网卡IP地址。 --mac:设置网卡mac地址。 --bridge:设置网卡绑定的网桥。 --mtu:设置网卡的mtu值。 --update-config-only:如果此flag设置了,只更新配置文件,不会实际做更新网卡的动作。 --qlen:配置qlen值。
+
+
+
+
+
+### 约束限制
+
+- 支持添加物理网卡(eth)和虚拟网卡(veth)两种类型。
+- 在添加网卡时可以同时对网卡进行配置,参数包括--ip/--mac/--bridge/--mtu/--qlen。
+- 支持最多添加8个物理网卡到容器。
+- 使用syscontainer-tools add-nic向容器添加eth网卡后,如果不加hook,在容器退出前必须手工将nic删除,否则在host上的eth网卡的名字会被更改成容器内的名字。
+- 对于物理网卡(1822 vf网卡除外),add-nic必须使用原mac地址,update-nic禁止修改mac地址,容器内也不允许修改mac地址。
+- 使用syscontainer-tools add-nic时,设置mtu值,设置范围跟具体的网卡型号有关。
+- 使用syscontainer-tools向容器添加网卡和路由时,建议先执行add-nic添加网卡,然后执行add-route添加路由;使用syscontainer-tools从容器删除网卡和路由时,建议先执行remove-route删除路由,然后执行remove-nic删除网卡。
+- 使用syscontainer-tools添加网卡时,一块网卡只能添加到一个容器中。
+
+### 使用示例
+
+- 启动一个系统容器,指定hook spec为syscontainer hook执行配置脚本:
+
+ ```sh
+ [root@localhost ~]# isula run -tid --hook-spec /etc/syscontainer-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init
+ 2aaca5c1af7c872798dac1a468528a2ccbaf20b39b73fc0201636936a3c32aa8
+ ```
+
+- 添加一个虚拟网卡到容器
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools add-nic --type "veth" --name abc2:bcd2 --ip 172.17.28.5/24 --mac 00:ff:48:13:xx:xx --bridge docker0 2aaca5c1af7c
+ Add network interface to container 2aaca5c1af7c (bcd2,abc2) done
+ ```
+
+- 添加一个物理网卡到容器
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools add-nic --type "eth" --name eth3:eth1 --ip 172.17.28.6/24 --mtu 1300 --qlen 2100 2aaca5c1af7c
+ Add network interface to container 2aaca5c1af7c (eth3,eth1) done
+ ```
+
+ >  **说明:**
+ >
+ > 添加虚拟网卡或物理网卡时,请确保网卡处于空闲状态,添加正在使用的网卡会导致系统网络断开。
+
+## 路由管理
+
+### 功能描述
+
+syscontainer-tools工具可以对系统容器进行动态添加/删除路由表。
+
+### 命令格式
+
+```sh
+syscontainer-tools [COMMAND][OPTIONS] [ARG...]
+```
+
+其中:
+
+COMMAND:路由管理相关的命令。
+
+OPTIONS:路由管理命令支持的选项。
+
+container\_id:容器id。
+
+ARG:命令对应的参数。
+
+### 接口说明
+
+
+ 命令
+
+ 功能说明
+
+ 选项说明
+
+ 参数说明
+
+
+
+ add-route
+
+ 将网络路由规则添加到容器中。
+
+ 支持的选项如下:
+ --update-config-only:添加此参数,只更新配置文件,不做实际的更新路由表的动作。
+
+ 参数格式:[{rule1},{rule2}]
+ rule样例:
+ '[{"dest":"default", "gw":"192.168.10.1"},{"dest":"192.168.0.0/16","dev":"eth0","src":"192.168.1.2"}]'
+dest:目标网络,如果为空则是默认网关。 src:路由源IP。 gw:路由网关。 dev:网络设备。
+
+
+ remove-route
+
+ 从容器中删除路由。
+
+ 支持的选项如下:
+ --update-config-only:设置此参数,只更新配置文件,不做实际从容器中删除路由的动作。
+
+ 参数格式:[{rule1},{rule2}]
+ rule样例:
+ '[{"dest":"default", "gw":"192.168.10.1"},{"dest":"192.168.0.0/16","dev":"eth0","src":"192.168.1.2"}]'
+dest:目标网络,如果为空则是默认网关。 src:路由源IP。 gw:路由网关。 dev:网络设备。
+
+
+ list-route
+
+ 列出容器中所有的路由规则。
+
+ 支持的选项如下:
+--pretty:按照json格式输出。 --filter:按照过滤格式输出,比如--filter '{"ip":"192.168.3.4/24", "Mtu":1500}'。
+
+ 无
+
+
+
+
+
+### 约束限制
+
+- 使用syscontainer-tools向容器添加网卡和路由时,建议先执行add-nic添加网卡,然后执行add-route添加路由;使用syscontainer-tools从容器删除网卡和路由时,建议先执行remove-route删除路由,然后执行remove-nic删除网卡。
+- 向容器内添加路由规则时,需确保所添加的路由规则与容器内现有的路由规则不会产生冲突。
+
+### 使用示例
+
+- 启动一个系统容器,指定hook spec为syscontainer hook执行配置脚本:
+
+ ```sh
+ [root@localhost ~]# isula run -tid --hook-spec /etc/syscontainer-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init
+ 0d2d68b45aa0c1b8eaf890c06ab2d008eb8c5d91e78b1f8fe4d37b86fd2c190b
+ ```
+
+- syscontainer-tools向系统容器添加一块物理网卡:
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools add-nic --type "eth" --name enp4s0:eth123 --ip 172.17.28.6/24 --mtu 1300 --qlen 2100 0d2d68b45aa0
+ Add network interface (enp4s0) to container (0d2d68b45aa0,eth123) done
+ ```
+
+- syscontainer-tools添加一条路由规则到系统容器,注意格式需按照'\[\{"dest":"default", "gw":"192.168.10.1"\},\{"dest":"192.168.0.0/16","dev":"eth0","src":"192.168.1.2"\}\]'来配置。如果dest为空会自动填成default。
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools add-route 0d2d68b45aa0 '[{"dest":"172.17.28.0/32", "gw":"172.17.28.5","dev":"eth123"}]'
+ Add route to container 0d2d68b45aa0, route: {dest:172.17.28.0/32,src:,gw:172.17.28.5,dev:eth123} done
+ ```
+
+- 查看容器内是否新增一条路由规则:
+
+ ```sh
+ [root@localhost ~]# isula exec -it 0d2d68b45aa0 route
+ Kernel IP routing table
+ Destination Gateway Genmask Flags Metric Ref Use Iface
+ 172.17.28.0 172.17.28.5 255.255.255.255 UGH 0 0 0 eth123
+ 172.17.28.0 0.0.0.0 255.255.255.0 U 0 0 0 eth123
+ ```
+
+## 挂卷管理
+
+### 功能描述
+
+普通容器仅支持在创建时指定--volume参数将宿主机的目录/卷挂载到容器实现资源共享,但是无法在容器运行时将挂载到容器中的目录/卷卸载掉,也不支持将宿主机的目录/卷挂载到容器。系统容器可以通过syscontainer-tools工具实现动态将宿主机的目录/卷挂载到容器,以及将容器中的目录/卷进行卸载。
+
+### 命令格式
+
+```sh
+syscontainer-tools [COMMAND][OPTIONS] [ARG...]
+```
+
+其中:
+
+COMMAND:路由管理相关的命令。
+
+OPTIONS:路由管理命令支持的选项。
+
+container\_id:容器id。
+
+ARG:命令对应的参数。
+
+### 接口说明
+
+
+ 命令
+
+ 功能说明
+
+ 选项说明
+
+ 参数说明
+
+
+
+ add-path
+
+ 将宿主机文件/目录添加到容器中。
+
+ 无
+
+ 参数格式为:
+ hostpath:containerpath:permission [hostpath:containerpath:permission ...]
+ 其中:
+ hostdevice:卷在主机上的路径。
+ containerdevice:卷在容器中的路径。
+ permission:容器内对挂载路径的操作权限。
+
+
+ remove-path
+
+ 将容器中的目录/文件删除,还原到宿主机中。
+
+ 无
+
+ 参数格式为:hostpath:containerpath [hostpath:containerpath ...]
+ 其中:
+ hostdevice:卷在主机上的路径。
+ containerdevice:卷在容器中的路径。
+
+
+ list-path
+
+ 列出容器中所有的path目录。
+
+ 支持的选项如下:
+ --pretty:按照json格式输出。
+
+ 无
+
+
+
+
+
+### 约束限制
+
+- 挂载目录(add-path)的时候必须要指定绝对路径。
+- 挂载目录(add-path)会在主机上生成/.sharedpath挂载点。
+- 最多可以向单个容器中添加128个volume,超过128后无法添加成功。
+- add-path不能将主机目录覆盖容器中的根目录(/),否则会造成功能影响。
+
+### 使用示例
+
+- 启动一个系统容器,指定hook spec为syscontainer hook执行配置脚本:
+
+ ```sh
+ [root@localhost ~]# isula run -tid --hook-spec /etc/syscontainer-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init
+ e45970a522d1ea0e9cfe382c2b868d92e7b6a55be1dd239947dda1ee55f3c7f7
+ ```
+
+- syscontainer-tools将宿主机某个目录挂载到容器,实现资源共享:
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools add-path e45970a522d1 /home/test123:/home/test123
+ Add path (/home/test123) to container(e45970a522d1,/home/test123) done.
+ ```
+
+- 宿主机目录/home/test123创建一个文件,然后在容器内查看文件是否可以访问:
+
+ ```sh
+ [root@localhost ~]# echo "hello world" > /home/test123/helloworld
+ [root@localhost ~]# isula exec e45970a522d1 bash
+ [root@localhost /]# cat /home/test123/helloworld
+ hello world
+ ```
+
+- syscontainer-tools将挂载目录从容器内删除:
+
+ ```sh
+ [root@localhost ~]# syscontainer-tools remove-path e45970a522d1 /home/test123:/home/test123
+ Remove path (/home/test123) from container(e45970a522d1,/home/test123) done
+ [root@localhost ~]# isula exec e45970a522d1 bash
+ [root@localhost /]# ls /home/test123/helloworld
+ ls: cannot access '/home/test123/helloworld': No such file or directory
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/environment-variable-persisting.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/environment-variable-persisting.md
new file mode 100644
index 0000000000000000000000000000000000000000..75a6507e207703a4aa371a9a2aa3fe8e3e273a28
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/environment-variable-persisting.md
@@ -0,0 +1,47 @@
+# 环境变量持久化
+
+## 功能描述
+
+系统容器支持通过指定--env-target-file接口参数将env变量持久化到容器rootfs目录下的配置文件中。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --env-target-file
+
+字符串变量。 env持久化文件必须在rootfs目录下,且配置为绝对路径。
+
+
+
+
+
+## 约束限制
+
+- --env-target-file指定的目标文件如果存在的话,大小不能超过10MB。
+- --env-target-file指定的参数为rootfs目录下的绝对路径。
+- 如果--env和目标文件里面的env出现冲突,以--env指定值的参数为准。
+
+## 使用示例
+
+启动系统容器,指定env环境变量和--env-target-file参数:
+
+```bash
+[root@localhost ~]# isula run -tid -e abc=123 --env-target-file /etc/environment --system-container --external-rootfs /root/myrootfs none init
+b75df997a64da74518deb9a01d345e8df13eca6bcc36d6fe40c3e90ea1ee088e
+[root@localhost ~]# isula exec b7 cat /etc/environment
+PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+TERM=xterm
+abc=123
+```
+
+可以看到容器的env变量(abc=123)已经持久化到/etc/environment配置文件中。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/installation-guideline.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/installation-guideline.md
new file mode 100644
index 0000000000000000000000000000000000000000..ce8d5e3a0ea7314d308bceeb1c729e77826a4f3d
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/installation-guideline.md
@@ -0,0 +1,30 @@
+# 安装指导
+
+>  **说明:**
+>
+> 系统容器的安装需要使用root权限。
+
+1. 首先需要安装iSulad容器引擎。
+
+ ```bash
+ # yum install iSulad
+ ```
+
+2. 安装系统容器依赖包。
+
+ ```bash
+ # yum install syscontainer-tools authz lxcfs-tools lxcfs
+ ```
+
+3. 查看iSulad是否已经启动。
+
+ ```bash
+ # systemctl status isulad
+ ```
+
+4. 开启lxcfs和authz服务。
+
+ ```bash
+ # systemctl start lxcfs
+ # systemctl start authz
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/maximum-number-of-handles.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/maximum-number-of-handles.md
new file mode 100644
index 0000000000000000000000000000000000000000..227197b882c82a41348c1b08d5c47a9595c89b78
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/maximum-number-of-handles.md
@@ -0,0 +1,55 @@
+# 最大句柄数限制
+
+## 功能描述
+
+系统容器支持对容器内使用文件句柄数进行限制,文件句柄包括普通文件句柄和网络套接字,启动容器时,可以通过指定--files-limit参数限制容器内打开的最大句柄数。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --files-limit
+
+
+整数值,不能为负数。 指定为0表示不受限制,最大值限制由当前内核files cgroup决定。
+
+
+
+
+
+## 约束限制
+
+- 如果\--files-limit指定的值太小,可能会导致系统容器无法通过exec执行命令,报"open too many files"错误,所以files limit的值应该设置大一些。
+- 文件句柄包括普通文件句柄和网络套接字。
+
+## 使用示例
+
+使用\--files-limit限制容器内打开文件句柄数需要内核支持files cgroup,可以执行以下命令查看:
+
+```bash
+[root@localhost ~]# cat /proc/1/cgroup | grep files
+10:files:/
+```
+
+结果显示files,说明内核支持files cgroup。
+
+容器启动指定--files-limit参数,并检查files.limit参数是否成功写入:
+
+```bash
+[root@localhost ~]# isula run -tid --files-limit 1024 --system-container --external-rootfs /tmp/root-fs empty init 01e82fcf97d4937aa1d96eb8067f9f23e4707b92de152328c3fc0ecb5f64e91d
+[root@localhost ~]# isula exec -it 01e82fcf97d4 bash
+[root@localhost ~]# cat /sys/fs/cgroup/files/files.limit
+1024
+
+```
+
+可以看出,容器内文件句柄数被成功限制。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/overview.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..c1126a1c3c3cd3900ff1452ac9a973f013d25732
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/overview.md
@@ -0,0 +1,3 @@
+# 系统容器
+
+系统容器主要应对在重计算、高性能、大并发的场景下,重型应用和业务云化的问题。相比较虚拟机技术,系统容器可直接继承物理机特性,同时具备性能更优良,较少overhead的优点。从系统资源分配来看,系统容器在有限资源上相比虚拟机可分配更多计算单元,降低成本,通过系统容器可以构建产品的差异化竞争力,提供计算密度更高,价格更便宜,性能更优良的计算单元实例。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-caution.gif b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-danger.gif b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-note.gif b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-notice.gif b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-tip.gif b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-warning.gif b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/reboot-or-shutdown-in-a-container.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/reboot-or-shutdown-in-a-container.md
new file mode 100644
index 0000000000000000000000000000000000000000..37fb5386d605a45be16d467873ca8ad73881418c
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/reboot-or-shutdown-in-a-container.md
@@ -0,0 +1,76 @@
+# 容器内reboot/shutdown
+
+## 功能描述
+
+系统容器支持在容器内执行reboot和shutdown命令。执行reboot命令效果同重启容器一致;执行shutdown命令效果同停止容器一致。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --restart
+
+字符串变量。 可取指定值: on-reboot:表示重启系统容器。
+
+
+
+
+
+
+
+## 约束限制
+
+- shutdown功能,依赖于不同的OS,以实际容器运行环境对应OS为准。
+- 执行“shutdown -h now”命令关闭系统时,不能多次占用console。例如“isula run -ti”命令打开一个console,在另一个host bash中isula attach该容器,会打开另一个console,此时执行shutdown会失败。
+
+## 使用示例
+
+- 容器启动时指定\--restart on-reboot参数,示例如下:
+
+ ```bash
+ [root@localhost ~]# isula run -tid --restart on-reboot --system-container --external-rootfs /root/myrootfs none init
+ 106faae22a926e22c828a0f2b63cf5c46e5d5986ea8a5b26de81390d0ed9714f
+ ```
+
+- 进入容器执行reboot命令:
+
+ ```bash
+ [root@localhost ~]# isula exec -it 10 bash
+ [root@localhost /]# reboot
+ ```
+
+ 查看容器是否重启:
+
+ ```bash
+ [root@localhost ~]# isula exec -it 10 ps aux
+ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
+ root 1 0.1 0.0 21588 9504 ? Ss 12:11 0:00 init
+ root 14 0.1 0.0 27024 9376 ? Ss 12:11 0:00 /usr/lib/system
+ root 17 0.0 0.0 18700 5876 ? Ss 12:11 0:00 /usr/lib/system
+ dbus 22 0.0 0.0 9048 3624 ? Ss 12:11 0:00 /usr/bin/dbus-d
+ root 26 0.0 0.0 8092 3012 ? Rs+ 12:13 0:00 ps aux
+ ```
+
+- 进入容器执行shutdown命令:
+
+ ```bash
+ [root@localhost ~]# isula exec -it 10 bash
+ [root@localhost /]# shutdown -h now
+ [root@localhost /]# [root@localhost ~]#
+ ```
+
+ 检查容器是否停止:
+
+ ```bash
+ [root@localhost ~]# isula exec -it 10 bash
+ Error response from daemon: Exec container error;Container is not running:106faae22a926e22c828a0f2b63cf5c46e5d5986ea8a5b26de81390d0ed9714f
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/security-and-isolation.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/security-and-isolation.md
new file mode 100644
index 0000000000000000000000000000000000000000..6344bfa3550485e9c1d852c2f02cdc8579c26df7
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/security-and-isolation.md
@@ -0,0 +1,344 @@
+# 安全性和隔离性
+
+- [安全性和隔离性](#安全性和隔离性)
+ - [user namespace多对多](#user-namespace多对多)
+ - [用户权限控制](#用户权限控制)
+ - [proc文件系统隔离](#proc文件系统隔离)
+
+## user-namespace多对多
+
+### 功能描述
+
+user namespace是将容器的root映射到主机的普通用户,使得容器中的进程和用户在容器里有特权,但是在主机上就是普通权限,防止容器中的进程逃逸到主机上,进行非法操作。更进一步,使用user namespace技术后,容器和主机使用不同的uid和gid,保证容器内部的用户资源和主机资源进行隔离,例如文件描述符等。
+
+系统容器支持通过--user-remap接口参数将不同容器的user namespace映射到宿主机不同的user namespace,实现容器user namespace隔离。
+
+### 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --user-remap
+
+ 参数格式为<uid>:<gid>:<offset>,参数说明如下:
+uid、gid为整数型,且必须大于等于0。 offset为整数型,且必须大于0,并且小于65536。取值不能太小,否则容器无法启动。 uid加上offset的值必须小于等于2 32 -1,gid加上offset的值必须小于等于2 32 -1,否则容器启动会报错。
+
+
+
+
+
+### 约束限制
+
+- 如果系统容器指定了--user-remap,那么rootfs目录必须能够被--user-remap指定的uid/gid用户所访问,否则会导致容器user namespace无法访问rootfs,容器启动失败。
+- 容器内所有的id都应该能映射到主机rootfs,某些目录/文件可能是从主机mount到容器,比如/dev/pts目录下面的设备文件,如果offset值太小可能会导致mount失败。
+- uid、gid和offset的值由上层调度平台控制,容器引擎只做合法性检查。
+- --user-remap只适用于系统容器。
+- --user-remap和--privileged不能共存,否则容器启动会报错。
+- 如果uid或gid指定为0,则--user-remap参数不生效。
+- 如果系统容器指定了--user-remap,用户需保证--user-remap指定的uid/gid用户能访问isulad元数据目录(/var/lib/isulad/、/var/lib/isulad/engines/、/var/lib/isulad/engines/lcr)。
+- --user-remap与--userns不能同时使用。
+
+### 使用指导
+
+>  **说明:**
+>
+> 指定--user-remap参数前,请先将rootfs下所有目录和文件的uid和gid做整体偏移,偏移量为--user-remap指定uid和gid的偏移量。
+> 例如将dev目录的uid和gid整体uid和gid偏移100000的参考命令为:
+> chown 100000:100000 dev
+
+系统容器启动指定--user-remap参数:
+
+```bash
+[root@localhost ~]# chmod 751 /var/lib/isulad/
+[root@localhost ~]# chmod 751 /var/lib/isulad/engines/
+[root@localhost ~]# chmod 751 /var/lib/isulad/engines/lcr
+[root@localhost ~]# isula run -tid --user-remap 100000:100000:65535 --system-container --external-rootfs /home/root-fs none /sbin/init
+eb9605b3b56dfae9e0b696a729d5e1805af900af6ce24428fde63f3b0a443f4a
+```
+
+分别在宿主机和容器内查看/sbin/init进程信息:
+
+```bash
+[root@localhost ~]# isula exec eb ps aux | grep /sbin/init
+root 1 0.6 0.0 21624 9624 ? Ss 15:47 0:00 /sbin/init
+[root@localhost ~]# ps aux | grep /sbin/init
+100000 4861 0.5 0.0 21624 9624 ? Ss 15:47 0:00 /sbin/init
+root 4948 0.0 0.0 213032 808 pts/0 S+ 15:48 0:00 grep --color=auto /sbin/init
+```
+
+可以看到/sbin/init进程在容器内的owner是root用户,但是在宿主机的owner是uid=100000这个用户。
+
+在容器内创建一个文件,然后在宿主机上查看文件的owner:
+
+```bash
+[root@localhost ~]# isula exec -it eb bash
+[root@localhost /]# echo test123 >> /test123
+[root@localhost /]# exit
+exit
+[root@localhost ~]# ll /home/root-fs/test123
+-rw-------. 1 100000 100000 8 Aug 2 15:52 /home/root-fs/test123
+```
+
+可以看到,在容器内生成了一个文件,它的owner是root,但是在宿主机上看到的owner是id=100000这个用户。
+
+## 用户权限控制
+
+### 功能描述
+
+容器引擎支持通过TLS认证方式来认证用户的身份,并依此控制用户的权限,当前容器引擎可以对接authz插件实现权限控制。
+
+### 接口说明
+
+通过配置iSulad容器引擎启动参数来指定权限控制插件,daemon配置文件默认为/etc/isulad/daemon.json。
+
+
+ 配置参数
+
+ 示例
+
+ 说明
+
+
+
+ --authorization-plugin
+
+ "authorization-plugin": "authz-broker"
+
+ 用户权限认证插件,当前只支持authz-broker。
+
+
+
+
+
+### 约束限制
+
+- authz需要配置用户权限策略,策略文件默认为/var/lib/authz-broker/policy.json,该配置文件支持动态修改,修改完即时生效,不需要重启插件服务。
+- 由于容器引擎为root用户启动,放开一般用户使用的一些命令可能会导致该用户不当获得过大权限,需谨慎配置。目前container\_attach、container\_create和container\_exec\_create动作可能会有风险。
+- 对于某些复合操作,比如isula exec、isula attach等命令依赖isula inspect是否有权限,如果用户没有inspect权限会直接报错。
+- 采用SSL/TLS 加密通道在增加安全性的同时也会带来性能损耗,如增加延时,消耗较多的CPU资源,除了数据传输外,加解密需要更大吞吐量,因此在并发场景下,相比非TLS通信,其并发量有一定程度上的下降。经实测,在ARM服务器(Cortex-A72 64核)接近空载情况下,采用TLS并发起容器,其最大并发量在200\~250范围内。
+- 服务端指定--tlsverify时,认证文件默认配置路径为/etc/isulad。且默认文件名分别为ca.pem、cert.pem、key.pem。
+
+### 使用示例
+
+1. 确认宿主机安装了authz插件,如果需要安装,安装并启动authz插件服务命令如下:
+
+ ```bash
+ [root@localhost ~]# yum install authz
+ [root@localhost ~]# systemctl start authz
+ ```
+
+2. 要启动该功能,首先需要配置容器引擎和用户的TLS证书。可以使用OPENSSL来生成需要的证书,具体步骤如下:
+
+ ```bash
+ #SERVERSIDE
+
+ # Generate CA key
+ openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "ca-key.pem" 4096
+ # Generate CA
+ openssl req -new -x509 -days $VALIDITY -key "ca-key.pem" -sha256 -out "ca.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"
+ # Generate Server key
+ openssl genrsa -out "server-key.pem" 4096
+
+ # Generate Server Certs.
+ openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "server-key.pem" -out server.csr
+
+ echo "subjectAltName = DNS:localhost,IP:127.0.0.1" > extfile.cnf
+ echo "extendedKeyUsage = serverAuth" >> extfile.cnf
+
+ openssl x509 -req -days $VALIDITY -sha256 -in server.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "server-cert.pem" -extfile extfile.cnf
+
+ #CLIENTSIDE
+
+ openssl genrsa -out "key.pem" 4096
+ openssl req -subj "/CN=$CLIENT_NAME" -new -key "key.pem" -out client.csr
+ echo "extendedKeyUsage = clientAuth" > extfile.cnf
+ openssl x509 -req -days $VALIDITY -sha256 -in client.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "cert.pem" -extfile extfile.cnf
+ ```
+
+ 若要直接使用以上过程作为脚本,需替换各变量为配置数值。生成CA时使用的参数若为空则写为“''”。PASSWORD、COMMON\_NAME、CLIENT\_NAME、VALIDITY为必选项。
+
+3. 容器引擎启动时添加TLS相关参数和认证插件相关参数,并保证认证插件的运行。此外,为了使用TLS认证,容器引擎必须使用TCP侦听的方式启动,不能使用传统的unix socket的方式启动。容器daemon端配置如下:
+
+ ```conf
+ {
+ "tls": true,
+ "tls-verify": true,
+ "tls-config": {
+ "CAFile": "/root/.iSulad/ca.pem",
+ "CertFile": "/root/.iSulad/server-cert.pem",
+ "KeyFile":"/root/.iSulad/server-key.pem"
+ },
+ "authorization-plugin": "authz-broker"
+ }
+ ```
+
+4. 然后需要配置策略,对于基本授权流程,所有策略都位于一个配置文件下/var/lib/authz-broker/policy.json。该配置文件支持动态修改,更改时不需要重新启动插件,只需要向authz进程发送SIGHUP信号。文件格式是每行一个策略JSON对象。每行只有一个匹配。具体的策略配置示例如下:
+
+ - 所有用户都可以运行所有iSulad命令:\{"name":"policy\_0","users":\[""\],"actions":\[""\]\}。
+ - Alice可以运行所有iSulad命令:\{"name":"policy\_1","users":\["alice"\],"actions":\[""\]\}。
+ - 空用户都可以运行所有iSulad命令: \{"name":"policy\_2","users":\[""\],"actions":\[""\]\}。
+ - Alice和Bob可以创建新的容器:\{"name":"policy\_3","users":\["alice","bob"\],"actions":\["container\_create"\]\}。
+ - service\_account可以读取日志并运行docker top:\{"name":"policy\_4","users":\["service\_account"\],"actions":\["container\_logs","container\_top"\]\}。
+ - Alice可以执行任何container操作:\{"name":"policy\_5","users":\["alice"\],"actions":\["container"\]\}。
+ - Alice可以执行任何container操作,但请求的种类只能是get:\{"name":"policy\_5","users":\["alice"\],"actions":\["container"\], "readonly":true \}。
+
+ >  **说明:**
+ >
+ > - 配置中匹配action支持正则表达式。
+ > - users不支持正则表达式。
+ > - users不能有重复用户,即同一用户不能被多条规则匹配。
+
+5. 配置并更新完之后,客户端配置TLS参数连接容器引擎,即是以受限的权限访问。
+
+ ```bash
+ [root@localhost ~]# isula version --tlsverify --tlscacert=/root/.iSulad/ca.pem --tlscert=/root/.iSulad/cert.pem --tlskey=/root/.iSulad/key.pem -H=tcp://127.0.0.1:2375
+ ```
+
+ 如果想默认配置TLS认证进行客户端连接,可以将文件移动到\~/.iSulad,并设置 ISULAD\_HOST和ISULAD\_TLS\_VERIFY变量(而不是每次调用时传递 -H=tcp://$HOST:2375和--tlsverify)。
+
+ ```bash
+ [root@localhost ~]# mkdir -pv ~/.iSulad
+ [root@localhost ~]# cp -v {ca,cert,key}.pem ~/.iSulad
+ [root@localhost ~]# export ISULAD_HOST=localhost:2375 ISULAD_TLS_VERIFY=1
+ [root@localhost ~]# isula version
+ ```
+
+## proc文件系统隔离
+
+### 场景描述
+
+容器虚拟化带来轻量高效,快速部署的同时,也因其隔离性不够彻底,给用户带来一定程度的使用不便。由于Linux内核namespace本身还不够完善,因此容器在隔离性方面也存在一些缺陷。例如,在容器内部proc文件系统中可以看到宿主机上的proc信息(如meminfo, cpuinfo,stat, uptime等)。利用lxcfs工具可以将容器内的看到宿主机/proc文件系统的内容,替换成本容器实例的相关/proc内容,以便容器内业务获取正确的资源数值。
+
+### 接口说明
+
+系统容器对外提供两个工具包:一个是lxcfs软件,另外一个是配合lxcfs一起使用的lxcfs-tools工具。其中lxcfs作为宿主机daemon进程常驻,lxcfs-tools通过hook机制将宿主机的lxcfs文件系统绑定挂载到容器。
+
+lxcfs-tools命令行格式如下:
+
+```bash
+lxcfs-tools [OPTIONS] COMMAND [COMMAND_OPTIONS]
+```
+
+
+ 命令
+
+ 功能说明
+
+ 参数
+
+
+
+ remount
+
+ 将lxcfs重新mount到容器中
+
+ --all:对所有的容器执行remout lxcfs操作
+ --container-id:remount lxcfs到特定的容器ID
+
+
+ umount
+
+ 将lxcfs从容器中umount掉
+
+ --all:对所有的容器执行umout lxcfs操作
+ --container-id:对特定容器执行umount lxcfs操作
+
+
+ check-lxcfs
+
+ 检查lxcfs服务是否运行
+
+ 无
+
+
+ prestart
+
+ 在lxcfs服务启动前将/var/lib/lxcfs目录mount到容器中
+
+ 无
+
+
+
+
+
+### 约束限制
+
+- 当前只支持proc文件系统下的cpuinfo, meminfo, stat, diskstats, partitions,swaps和uptime文件,其他的文件和其他内核API文件系统(比如sysfs)未做隔离 。
+- 安装rpm包后会在/var/lib/isulad/hooks/hookspec.json生成样例json文件,用户如果需要增加日志功能,需要在定制时加入--log配置。
+- diskstats只能显示支持cfq调度的磁盘信息,无法显示分区信息。容器内设备会被显示为/dev目录下的名字。若不存在则为空。此外,容器根目录所在设备会被显示为sda。
+- 挂载lxcfs时必须使用slave参数。若使用shared参数,可能会导致容器内挂载点泄露到主机,影响主机运行 。
+- lxcfs支持服务优雅降级使用,若lxcfs服务crash或者不可用,容器内查看到的cpuinfo, meminfo, stat, diskstats, partitions, swaps和uptime均为host信息,容器其他业务功能不受影响。
+- lxcfs底层依赖fuse内核模块以及libfuse库,因此需要内核支持fuse。
+- lxcfs当前仅支持容器内运行64位的app,如果容器内运行32位的app可能会导致app读取到的cpuinfo信息不符合预期。
+- lxcfs只是对容器cgroup进行资源视图模拟,对于容器内的系统调用(例如sysconf)获取到的仍然是主机的信息,lxcfs无法做到内核隔离。
+- lxcfs使用隔离后的cpuinfo显示的cpu信息具有如下特征:
+ - processor:从0开始依次递增。
+ - physical id:从0开始依次递增。
+ - sibliing:固定为1。
+ - core id:固定为0。
+ - cpu cores:固定为1。
+
+### 使用示例
+
+1. 首先需要安装lxcfs和lxcfs-tools这两个包,并启动lxcfs服务。
+
+ ```bash
+ [root@localhost ~]# yum install lxcfs lxcfs-tools
+ [root@localhost ~]# systemctl start lxcfs
+ ```
+
+2. 容器启动完成之后查看容器内是否存在lxcfs挂载点。
+
+ ```bash
+ [root@localhost ~]# isula run -tid -v /var/lib/lxc:/var/lib/lxc --hook-spec /var/lib/isulad/hooks/hookspec.json --system-container --external-rootfs /home/root-fs none init
+ a8acea9fea1337d9fd8270f41c1a3de5bceb77966e03751346576716eefa9782
+ [root@localhost ~]# isula exec a8 mount | grep lxcfs
+ lxcfs on /var/lib/lxc/lxcfs type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ lxcfs on /proc/cpuinfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ lxcfs on /proc/diskstats type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ lxcfs on /proc/meminfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ lxcfs on /proc/partitions type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ lxcfs on /proc/stat type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ lxcfs on /proc/swaps type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ lxcfs on /proc/uptime type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
+ ```
+
+3. 执行update命令更新容器的cpu和mem资源配置,然后查看容器资源。根据如下回显可知,容器资源视图显示的是容器真实资源数据而不是宿主机的数据。
+
+ ```bash
+ [root@localhost ~]# isula update --cpuset-cpus 0-1 --memory 1G a8
+ a8
+ [root@localhost ~]# isula exec a8 cat /proc/cpuinfo
+ processor : 0
+ BogoMIPS : 100.00
+ cpu MHz : 2400.000
+ Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
+ CPU implementer : 0x41
+ CPU architecture: 8
+ CPU variant : 0x0
+ CPU part : 0xd08
+ CPU revision : 2
+
+ processor : 1
+ BogoMIPS : 100.00
+ cpu MHz : 2400.000
+ Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
+ CPU implementer : 0x41
+ CPU architecture: 8
+ CPU variant : 0x0
+ CPU part : 0xd08
+ CPU revision : 2
+
+ [root@localhost ~]# isula exec a8 free -m
+ total used free shared buff/cache available
+ Mem: 1024 17 997 7 8 1006
+ Swap: 4095 0 4095
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/shared-memory-channels.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/shared-memory-channels.md
new file mode 100644
index 0000000000000000000000000000000000000000..87c11f1f025b1dadce15cc11ac53d92c0a1a65ea
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/shared-memory-channels.md
@@ -0,0 +1,56 @@
+# 共享内存通道
+
+## 功能描述
+
+系统容器提供容器与主机进程通过共享内存进行通信的功能,通过在容器创建时配置\--host-channel参数,可以在容器与主机之间共享同一tmpfs,从而达到主机与容器间通信的功能。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --host-channel
+
+字符串变量,格式为: <host path>:<container path>:<rw/ro>:<size limit>
+ 参数说明如下: <host path>:将在宿主机上挂载tmpfs的路径,必须是绝对路径。
+ <container path>:将在容器内挂载tmpfs的路径,必须是绝对路径。
+ <rw/ro>:在容器内挂载的文件系统的使用权限,只能配置为rw(可读写)或ro(只读),默认为rw。
+ <size limit>:挂载的tmpfs能够使用的最大限制,最小支持1物理页(4KB),最大支持系统总物理内存的1/2 。默认为64MB。
+
+
+
+
+
+
+## 约束限制
+
+- 宿主机上挂载的tmpfs的生命周期为从容器启动到容器删除,容器删除并解除对空间的占用后会移除这片空间。
+- 容器删除时会将宿主机上挂载tmpfs的路径删除,所以不允许使用宿主机上已存在的目录。
+- 为了宿主机上非root用户运行的进程能够与容器内进行通信,宿主机上tmpfs挂载的权限为1777。
+
+## 使用示例
+
+创建容器时指定\--host-channel参数:
+
+```bash
+[root@localhost ~]# isula run --rm -it --host-channel /testdir:/testdir:rw:32M --system-container --external-rootfs /root/myrootfs none init
+root@3b947668eb54:/# dd if=/dev/zero of=/testdir/test.file bs=1024 count=64K
+dd: error writing '/testdir/test.file': No space left on device
+32769+0 records in
+32768+0 records out
+33554432 bytes (34 MB, 32 MiB) copied, 0.0766899 s, 438 MB/s
+```
+
+>  **说明:**
+>
+> - 使用--host-channel大小限制时,若在容器内创建共享文件,则会受到容器内的内存配额限制(在容器内存使用达到极限时可能会产生oom)。
+> - 若用户在主机端创建共享文件,则不受容器内的内存配额限制。
+> - 若用户需要在容器内创建共享文件,且业务为内存密集型,可以通过设置容器内存配额为在原本基础上加上--host-channel配置的大小来消除影响。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/specifying-rootfs-to-create-a-container.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/specifying-rootfs-to-create-a-container.md
new file mode 100644
index 0000000000000000000000000000000000000000..654b784d33d71671828b701afb02517c5cbbef4a
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/specifying-rootfs-to-create-a-container.md
@@ -0,0 +1,46 @@
+# 指定rootfs创建容器
+
+## 功能描述
+
+系统容器不同于普通容器,普通容器需要指定一个容器镜像来启动,而系统容器通过参数 \--external-rootfs 指定一个本地的根文件系统rootfs(Root File System)来启动,rootfs包含了容器运行时依赖的操作系统环境。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --external-rootfs
+
+字符串变量。 容器根文件系统对应的绝对路径,即 rootfs 的路径。
+
+
+
+
+
+## 约束限制
+
+- 参数--external-rootfs指定的rootfs目录必须为绝对路径,不能为相对路径。
+- 参数--external-rootfs指定的rootfs目录必须为一个完整运行的操作系统环境(包含systemd软件包),否则容器会启动失败。
+- 容器删除时,不会删除--external-rootfs指定的rootfs目录。
+- 不支持在x86环境上运行基于arm rootfs的容器,也不支持在arm环境上运行基于x86 rootfs的容器。
+- 同一份rootfs,不建议启动多个容器实例,即同一份rootfs只供一个生命周期内的容器实例使用。
+
+## 使用示例
+
+假设本地rootfs的路径为/root/myrootfs,那么启动一个系统容器的命令如下:
+
+```bash
+# isula run -tid --system-container --external-rootfs /root/myrootfs none init
+```
+
+>  **说明:**
+>
+> rootfs为自定义的文件系统,请用户自行准备。例如容器镜像的tar包解压后,即为一个rootfs。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/usage-guide.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/usage-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..87f72bab61139ff168295bdfa7dbeb232bd1f0a6
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/usage-guide.md
@@ -0,0 +1,21 @@
+# 使用指南
+
+系统容器基于iSula容器引擎进行功能增强,提供系统容器相关功能。系统容器提供的容器管理功能和iSula容器引擎保持一致,其命令格式和功能与iSula容器引擎相同。
+
+本文档仅描述系统容器提供的增强功能对应的使用方式,其他命令行操作请参考 "iSula容器引擎" 章节。
+
+系统容器功能仅涉及isula create/run命令行,后续未特别说明,各功能均使用此命令行。其命令行格式如下所示:
+
+```sh
+# isula create/run [OPTIONS] [COMMAND] [ARG...]
+```
+
+其中:
+
+- OPTIONS:命令参数,可以一个或者多个,可选参数请参见 "iSula容器引擎 > 附录 > 命令行参数说明"。
+- COMMAND:系统容器启动后执行的命令。
+- ARG:系统容器启动后执行命令对应的参数。
+
+>  **说明:**
+>
+> 系统容器的使用需要root权限。
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/using-systemd-to-start-a-container.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/using-systemd-to-start-a-container.md
new file mode 100644
index 0000000000000000000000000000000000000000..1eb74dae831358246d740739a30009b6a5a2620a
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/using-systemd-to-start-a-container.md
@@ -0,0 +1,85 @@
+# 通过systemd启动容器
+
+## 功能描述
+
+系统容器与普通容器最大的差异就在于容器启动的init进程,普通容器无法通过systemd启动系统服务,而系统容器具备这个能力,通过在启动容器时指定\--system-container参数可以使能systemd服务。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --system-container
+
+布尔变量,取值为true、false,未指定值时表示true。 指定某个容器类型是否属于系统容器,必须使能。
+
+
+
+
+
+## 约束限制
+
+- systemd服务需要调用一些特殊系统调用,包括mount、umount2、unshare、reboot以及name\_to\_handle\_at,所以在不开启特权容器标签的情况下,系统容器打开了调用上述接口的权限。
+- 系统容器都是init启动,init进程不响应表示正常退出的SIGTERM信号,stop默认在10s之后才会强制杀死容器。如果需要快速结束,可以手动指定stop的超时时间。
+- \--system-container必须配合\--external-rootfs参数一起使用。
+- 系统容器内支持运行各类服务,服务的启停通过systemctl来管理,服务之间可能会出现相互依赖关系导致异常情况下某些服务进程出现D/Z状态,使得容器无法正常退出。
+- 系统容器内的某些服务进程可能会影响其他操作结果,例如容器内若运行了NetworkManager服务,可能会影响向容器添加网卡的行为(网卡添加成功然后被NetworkManger停掉),导致不可预期的结果。
+- 系统容器和主机暂时无法实现udev事件隔离,所以fstab配置也暂不支持。
+- systemd服务可能和libcgroup提供的cgconfig服务在功能上出现冲突,建议在容器内去掉libcgroup相关的包或者配置cgconfig服务的Delegate值为no。
+
+## 使用示例
+
+- 指定\--system-container和\--external-rootfs参数启动系统容器。
+
+ ```sh
+ [root@localhost ~]# isula run -tid -n systest01 --system-container --external-rootfs /root/myrootfs none init
+ ```
+
+- 执行以上命令后容器成功运行,通过exec进入容器查看进程信息,可看到systemd服务已启动。
+
+ ```sh
+ [root@localhost ~]# isula exec -it systest01 bash
+ [root@localhost /]# ps -ef
+ UID PID PPID C STIME TTY TIME CMD
+ root 1 0 2 06:49 ? 00:00:00 init
+ root 14 1 2 06:49 ? 00:00:00 /usr/lib/systemd/systemd-journal
+ root 16 1 0 06:49 ? 00:00:00 /usr/lib/systemd/systemd-network
+ dbus 23 1 0 06:49 ? 00:00:00 /usr/bin/dbus-daemon --system --
+ root 25 0 0 06:49 ? 00:00:00 bash
+ root 59 25 0 06:49 ? 00:00:00 ps –ef
+ ```
+
+- 容器内执行systemctl命令查看服务状态,可看到服务被systemd管理。
+
+ ```sh
+ [root@localhost /]# systemctl status dbus
+ ● dbus.service - D-Bus System Message Bus
+ Loaded: loaded (/usr/lib/systemd/system/dbus.service; static; vendor preset:
+ disabled)
+ Active: active (running) since Mon 2019-07-22 06:49:38 UTC; 2min 5
+ 8s ago
+ Docs: man:dbus-daemon(1)
+ Main PID: 23 (dbus-daemon)
+ CGroup: /system.slice/dbus.service
+ └─23 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidf
+ ile --systemd-activation --syslog-only
+
+ Jul 22 06:49:38 localhost systemd[1]: Started D-Bus System Message Bus.
+ ```
+
+- 容器内通过systemctl stop/start服务,可看到服务被systemd管理。
+
+ ```sh
+ [root@localhost /]# systemctl stop dbus
+ Warning: Stopping dbus.service, but it can still be activated by:
+ dbus.socket
+ [root@localhost /]# systemctl start dbus
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerForm/SystemContainer/writable-namespace-kernel-parameters.md b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/writable-namespace-kernel-parameters.md
new file mode 100644
index 0000000000000000000000000000000000000000..4997867535adbe8d5f938ad1b46c04310c5ace48
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerForm/SystemContainer/writable-namespace-kernel-parameters.md
@@ -0,0 +1,87 @@
+# namespace化内核参数可写
+
+## 功能描述
+
+对于运行在容器内的业务,如数据库,大数据,包括普通应用,有对部分内核参数进行设置和调整的需求,以满足最佳的业务运行性能和可靠性。内核参数要么不允许修改,要么全部允许修改(特权容器):
+
+在不允许用户在容器内修改时,只提供了--sysctl外部接口,而且容器内不能灵活修改参数值。
+
+在允许用户在容器内修改时,部分内核参数是全局有效的,某个容器修改后,会影响主机上所有的程序,安全性降低。
+
+系统容器提供--ns-change-opt参数,可以指定namespace化的内核参数在容器内动态设置,当前仅支持net、ipc。
+
+## 参数说明
+
+
+ 命令
+
+ 参数
+
+ 参数指定值说明
+
+
+
+ isula create/run
+
+ --ns-change-opt
+
+字符串变量。 仅支持配置net、ipc: net:支持/proc/sys/net目录下所有namespace化参数。
+ ipc:支持的namespace化参数列表如下:
+ /proc/sys/kernel/msgmax
+ /proc/sys/kernel/msgmnb
+ /proc/sys/kernel/msgmni
+ /proc/sys/kernel/sem
+ /proc/sys/kernel/shmall
+ /proc/sys/kernel/shmmax
+ /proc/sys/kernel/shmmni
+ /proc/sys/kernel/shm_rmid_forced
+ /proc/sys/fs/mqueue/msg_default
+ /proc/sys/fs/mqueue/msg_max
+ /proc/sys/fs/mqueue/msgsize_default
+ /proc/sys/fs/mqueue/msgsize_max
+ /proc/sys/fs/mqueue/queues_max
+ 支持通知指定多个namespace配置,多个配置间通过逗号隔开,例如:--ns-change-opt=net,ipc。
+
+
+
+
+
+## 约束限制
+
+- 如果容器启动同时指定了--privileged(特权容器)和--ns-change-opt,则--ns-change-opt不生效。
+
+## 使用示例
+
+启动容器, 指定--ns-change-opt=net:
+
+```bash
+[root@localhost ~]# isula run -tid --ns-change-opt net --system-container --external-rootfs /root/myrootfs none init
+4bf44a42b4a14fdaf127616c90defa64b4b532b18efd15b62a71cbf99ebc12d2
+[root@localhost ~]# isula exec -it 4b mount | grep /proc/sys
+proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
+proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/net type proc (rw,nosuid,nodev,noexec,relatime)
+```
+
+可以看到容器内/proc/sys/net挂载点为rw,说明net相关的namespace化的内核参数具有读写权限。
+
+再启动一个容器,指定--ns-change-opt=ipc:
+
+```bash
+[root@localhost ~]# isula run -tid --ns-change-opt ipc --system-container --external-rootfs /root/myrootfs none init
+c62e5e5686d390500dab2fa76b6c44f5f8da383a4cbbeac12cfada1b07d6c47f
+[root@localhost ~]# isula exec -it c6 mount | grep /proc/sys
+proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
+proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/shmmax type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/shmmni type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/shmall type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/shm_rmid_forced type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/msgmax type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/msgmni type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/msgmnb type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/kernel/sem type proc (rw,nosuid,nodev,noexec,relatime)
+proc on /proc/sys/fs/mqueue type proc (rw,nosuid,nodev,noexec,relatime)
+```
+
+可以看到容器内ipc相关的内核参数挂载点为rw,说明ipc相关的namespace化的内核参数具有读写权限。
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/_menu.md b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..e7c2af6fcdacc194b76be340372aa6f9305df337
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/_menu.md
@@ -0,0 +1,14 @@
+---
+label: 'Kuasar多沙箱容器运行时'
+ismanual: 'Y'
+description: '一款支持多种类型沙箱统一管理的容器运行时,可同时支持多种业界主流的沙箱隔离技术'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '安装与配置'
+ href: './kuasar-install-config.md'
+ - label: '使用指南'
+ href: './kuasar-usage.md'
+ - label: '附录'
+ href: './kuasar-appendix.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/figures/kuasar_arch.png b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/figures/kuasar_arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..73cc7144880271677c1e2e684a3ac7b950e35e6f
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/figures/kuasar_arch.png differ
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-appendix.md b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-appendix.md
new file mode 100644
index 0000000000000000000000000000000000000000..7d44dabaab12d58d1354de4fa6b722ed03f97bc7
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-appendix.md
@@ -0,0 +1,24 @@
+# 附录
+
+ /var/lib/kuasar/config_stratovirt.toml配置文件字段说明:
+
+```conf
+[sandbox]
+log_level :指定kuasar日志级别,默认为info
+
+[hypervisor]
+path :指定stratovirt二进制路径
+machine_type :指定模拟芯片类型,ARM架构为virt,x86架构为q35
+kernel_path :指定guest kernel执行路径
+image_path :指定guest image执行路径
+initrd_path :指定guest initrd执行路径,与image二选一
+kernel_params :指定guest内核运行参数
+vcpus :指定每个沙箱的默认vCPU数量,默认为1
+memory_in_mb :指定每个沙箱的默认内存大小,默认为1024 MiB
+block_device_driver :指定块设备驱动
+debug :指定是否开启debug模式
+enable_mem_prealloc :指定是否开启内存预占
+
+[hypervisor.virtiofsd_conf]
+path :指定vhost_user_fs路径
+```
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-install-config.md b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-install-config.md
new file mode 100644
index 0000000000000000000000000000000000000000..0eecaadf1929acefa46ebc6c9aafa8296212001f
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-install-config.md
@@ -0,0 +1,126 @@
+# 安装与配置
+
+## 安装方法
+
+### 前提条件
+
+- 为了获取更好的性能体验,kuasar需要运行在裸金属服务器上,**暂不支持kuasar运行在虚拟机内**。
+- kuasar运行依赖以下openEuler组件,请确保环境上已安装所需版本的依赖组件。
+ - iSulad(请参考iSula容器引擎的[安装与配置](../../ContainerEngine/iSulaContainerEngine/installation-configuration.md)章节安装iSulad)
+ - StratoVirt(请参考StratoVirt的[安装](../../../Virtualization/VirtualizationPlatform/StratoVirt/Install_StratoVirt.md)章节安装StratoVirt)
+
+### 安装操作
+
+1. kuasar发布组件集成在kuasar rpm包中,使用yum命令可以直接安装
+
+ ```sh
+ $ yum install kuasar
+ ```
+
+2. 安装启动沙箱及容器需要使用的cri命令行工具crictl
+
+ ```sh
+ # arm环境
+ $ wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-arm64.tar.gz
+ $ tar -zxvf crictl-v1.25.0-linux-arm64.tar.gz -C /usr/local/bin
+ # x86环境
+ $ wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.25.0/crictl-v1.25.0-linux-amd64.tar.gz
+ $ tar -zxvf crictl-v1.25.0-linux-amd64.tar.gz -C /usr/local/bin
+ ```
+
+3. 安装cri配置网络需要使用的cni插件
+
+ ```sh
+ $ mkdir -p /opt/cni/bin && mkdir -p /etc/cni/net.d
+
+ # arm环境
+ $ wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-arm64-v1.3.0.tgz
+ $ tar -zxvf cni-plugins-linux-arm64-v1.3.0.tgz -C /opt/cni/bin/
+ # x86环境
+ $ wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
+ $ tar -zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin/
+ ```
+
+## 配置方法
+
+### iSulad容器引擎的配置
+
+修改iSulad容器引擎的配置文件/etc/isulad/daemon.json以支持iSulad容器引擎调用kuasar vmm虚拟机类型的容器运行时,新增如下配置:
+
+```sh
+$ cat /etc/isulad/daemon.json
+...
+ "cri-sandboxers": {
+ "vmm": {
+ "name": "vmm",
+ "address": "/run/vmm-sandboxer.sock"
+ }
+ },
+ "cri-runtimes": {
+ "vmm": "io.containerd.vmm.v1"
+ },
+...
+```
+
+重新启动iSulad
+
+```sh
+$ systemctl restart isulad
+```
+
+### crictl的配置
+
+修改crictl配置文件/etc/crictl.yaml对接isulad
+
+```sh
+$ cat /etc/crictl.yaml
+runtime-endpoint: unix:///var/run/isulad.sock
+image-endpoint: unix:///var/run/isulad.sock
+timeout: 10
+```
+
+### kuasar的配置
+
+修改kuasar对接stratovirt配置文件(可使用默认配置,配置文件字段说明详见[附录](./kuasar-appendix.md))
+
+```sh
+$ cat /var/lib/kuasar/config_stratovirt.toml
+[sandbox]
+log_level = "info"
+
+[hypervisor]
+path = "/usr/bin/stratovirt"
+machine_type = "virt,mem-share=on"
+kernel_path = "/var/lib/kuasar/vmlinux.bin"
+image_path = ""
+initrd_path = "/var/lib/kuasar/kuasar.initrd"
+kernel_params = "task.log_level=debug task.sharefs_type=virtiofs"
+vcpus = 1
+memory_in_mb = 1024
+block_device_driver = "virtio-blk"
+debug = true
+enable_mem_prealloc = false
+
+[hypervisor.virtiofsd_conf]
+path = "/usr/bin/vhost_user_fs"
+```
+
+启动kuasar-vmm服务
+
+```sh
+$ systemctl start kuasar-vmm
+```
+
+确认服务已处于running状态
+
+```sh
+$ systemctl status kuasar-vmm
+● kuasar-vmm.service - Kuasar microVM type sandboxer daemon process
+ Loaded: loaded (/usr/lib/systemd/system/kuasar-vmm.service; disabled; vendor preset: disabled)
+ Active: active (running) since Sat 2023-08-26 14:57:08 CST; 1h 25min ago
+ Main PID: 1000445 (vmm-sandboxer)
+ Tasks: 99 (limit: 814372)
+ Memory: 226.4M
+ CGroup: /system.slice/kuasar-vmm.service
+ └─ 1000445 /usr/local/bin/vmm-sandboxer --listen /run/vmm-sandboxer.sock --dir /run/kuasar-vmm
+```
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-usage.md b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-usage.md
new file mode 100644
index 0000000000000000000000000000000000000000..c326b1dc42f1218d8009c7e0ecfd66aa26f09adb
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/kuasar-usage.md
@@ -0,0 +1,93 @@
+# 使用指南
+
+启动kuasar沙箱的操作步骤如下:
+
+1. 确保kuasar及其相关组件已经正确安装配置
+
+2. 准备业务容器镜像,假设容器镜像为busybox,使用iSula容器引擎下载容器镜像
+
+ ```sh
+ $ isula pull busybox
+ ```
+
+3. 准备pod和container的yaml文件,范例如下:
+
+ ```sh
+ $ cat podsandbox.yaml
+ metadata:
+ name: busybox-sandbox
+ namespace: default
+ uid: hdishd83djaidwnduwk28bcsc
+ log_directory: /tmp
+ linux:
+ namespaces:
+ options: {}
+
+ $ cat pod-container.yaml
+ metadata:
+ name: busybox
+ image:
+ image: docker.io/library/busybox:latest
+ command:
+ - top
+ log_path: busybox.log
+ ```
+
+4. 启动pod
+
+ ```sh
+ $ crictl runp --runtime=vmm podsandbox.yaml
+ 5cbcf744949d8500e7159d6bd1e3894211f475549c0be15d9c60d3c502c7ede3
+ ```
+
+ 查看pod列表,pod为Ready状态
+
+ ```sh
+ $ crictl pods
+ POD ID CREATED STATE NAME NAMESPACE ATTEMPT
+ 5cbcf744949d8 About a minute ago Ready busybox-sandbox default 1
+ ```
+
+5. 在pod内创建一个业务容器
+
+ ```sh
+ $ crictl create 5cbcf744949d8500e7159d6bd1e3894211f475549c0be15d9c60d3c502c7ede3 pod-container.yaml podsandbox.yaml
+ c11df540f913e57d1e28372334c028fd6550a2ba73208a3991fbcdb421804a50
+ ```
+
+ 查看容器列表,容器为Created状态
+
+ ```sh
+ $ crictl ps -a
+ CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
+ c11df540f913e docker.io/library/busybox:latest 15 seconds ago Created busybox 0 5cbcf744949d
+ ```
+
+6. 启动业务容器
+
+ ```sh
+ $ crictl start c11df540f913e57d1e28372334c028fd6550a2ba73208a3991fbcdb421804a50
+ ```
+
+ 查看容器列表,容器为running状态
+
+ ```sh
+ $ crictl ps
+ CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
+ c11df540f913e docker.io/library/busybox:latest 2 minutes ago Running busybox 0 5cbcf744949d8
+ ```
+
+ >  **说明:**
+ >
+ > 以上步骤4、5、6也可以通过`crictl run`命令直接启动一个pod以及对应的业务容器
+ >
+ > ```sh
+ > $ crictl run -r vmm --no-pull container-config.yaml podsandbox-config.yaml
+ > ```
+
+7. 停止并删除容器以及pod
+
+ ```sh
+ $ crictl rm -f c11df540f913e
+ $ crictl rmp -f 5cbcf744949d8
+ ```
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/overview.md b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..5f1a13d9685233d55d33f2671379e8226d4a13d3
--- /dev/null
+++ b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/overview.md
@@ -0,0 +1,13 @@
+# Kuasar多沙箱容器运行时
+
+## 概述
+
+Kuasar是一款支持多种类型沙箱统一管理的容器运行时,可同时支持业界主流的多种沙箱隔离技术,例如包括基于内核的原生容器沙箱、基于轻量级虚拟化技术的microVM沙箱、基于进程级虚拟化的App Kernel沙箱,以及新兴的WebAssembly沙箱。
+openEuler基于Kuasar统一容器运行时并结合已有openEuler生态中iSulad容器引擎和StratoVirt虚拟化引擎技术,打造面向云原生场景轻量级全栈自研的安全容器,构建极低底噪、极速启动的关键竞争力。
+
+**图 1** Kuasar多沙箱容器运行时架构
+
+
+>  **说明:**
+>
+> kuasar的安装和使用需要使用root权限。
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-caution.gif b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-danger.gif b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-note.gif b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-notice.gif b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-tip.gif b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-warning.gif b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ContainerRuntime/Kuasar/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Cloud/HybridDeployment/oncn-bwm/_menu.md b/docs/en/25.03/Cloud/HybridDeployment/oncn-bwm/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..f51097462a99de75eb50a484ee9f61f23af8b13a
--- /dev/null
+++ b/docs/en/25.03/Cloud/HybridDeployment/oncn-bwm/_menu.md
@@ -0,0 +1,8 @@
+---
+label: 'oncn-bwm用户指南'
+ismanual: 'Y'
+description: '混合业务场景下的Pod带宽管理方案'
+children:
+ - label: '概述'
+ href: './overview.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/HybridDeployment/oncn-bwm/overview.md b/docs/en/25.03/Cloud/HybridDeployment/oncn-bwm/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..2eaff8cd71456e37eb9acee8d5cad44b72d5d67d
--- /dev/null
+++ b/docs/en/25.03/Cloud/HybridDeployment/oncn-bwm/overview.md
@@ -0,0 +1,237 @@
+# oncn-bwm用户指南
+
+## 简介
+
+随着云计算、大数据、人工智能、5G、物联网等技术的迅速发展,数据中心的建设越来越重要。然而,数据中心的服务器资源利用率很低,造成了巨大的资源浪费。为了提高服务器资源利用率,oncn-bwm 应运而生。
+
+oncn-bwm 是一款适用于在线、离线业务混合部署场景的 Pod 带宽管理工具,它会根据 QoS 分级对节点内的网络资源进行合理调度,保障在线业务服务体验的同时,大幅提升节点整体的网络带宽利用率。
+
+oncn-bwm 工具支持如下功能:
+
+- 使能/去除/查询 Pod 带宽管理
+- 设置 Pod 网络优先级
+- 设置离线业务带宽范围和在线业务水线
+- 内部统计信息查询
+
+## 安装
+
+安装 oncn-bwm 工具需要操作系统为 openEuler 22.09,在配置了 openEuler yum 源的机器直接使用 yum 命令安装,参考命令如下:
+
+```shell
+# yum install oncn-bwm
+```
+
+此处介绍如何安装 oncn-bwm 工具。
+
+### 环境要求
+
+- 操作系统:openEuler 22.09
+
+### 安装步骤
+
+安装 oncn-bwm 工具的操作步骤如下:
+
+1. 配置openEuler的yum源,直接使用yum命令安装
+
+ ```shell
+ yum install oncn-bwm
+ ```
+
+## 使用方法
+
+oncn-bwm 工具提供了 `bwmcli` 命令行工具来使能 Pod 带宽管理或进行相关配置。`bwmcli` 命令的整体格式如下:
+
+**bwmcli** \< option(s) >
+
+> 说明:
+>
+> 使用 `bwmcli` 命令需要 root 权限。
+>
+> 仅支持节点上出方向(报文从节点内发往其他节点)的 Pod 带宽管理。
+>
+> 已设置 tc qdisc 规则的网卡,不支持使能 Pod 带宽管理。
+>
+> 升级 oncn-bwm 包不会影响升级前的使能状态;卸载 oncn-bwm 包会关闭所有网卡的 Pod 带宽管理。
+
+### 命令接口
+
+#### Pod 带宽管理
+
+**命令和功能**
+
+| 命令格式 | 功能 |
+| --------------------------- | ------------------------------------------------------------ |
+| **bwmcli –e** \<网卡名称> | 使能指定网卡的 Pod 带宽管理。 |
+| **bwmcli -d** \<网卡名称> | 去除指定网卡的 Pod 带宽管理。 |
+| **bwmcli -p devs** | 查询节点所有网卡的 Pod 带宽管理。 |
+
+> 说明:
+>
+> - 不指定网卡名时,上述命令会对节点上的所有的网卡生效。
+>
+> - 执行 `bwmcli` 其他命令前需要开启 Pod 带宽管理。
+
+**使用示例**
+
+- 使能网卡 eth0 和 eth1 的 Pod 带宽管理
+
+ ```shell
+ # bwmcli –e eth0 –e eth1
+ enable eth0 success
+ enable eth1 success
+ ```
+
+- 取消网卡 eth0 和 eth1 的 Pod 带宽管理
+
+ ```shell
+ # bwmcli –d eth0 –d eth1
+ disable eth0 success
+ disable eth1 success
+ ```
+
+- 查询节点所有网卡的 Pod 带宽管理
+
+ ```shell
+ # bwmcli -p devs
+ eth0 : enabled
+ eth1 : disabled
+ eth2 : disabled
+ docker0 : disabled
+ lo : disabled
+ ```
+
+#### Pod 网络优先级
+
+**命令和功能**
+
+| 命令格式 | 功能 |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| **bwmcli –s** *path* \ | 设置 Pod 网络优先级。其中 *path* 为 Pod 对应的 cgroup 路径, *prio* 为优先级。*path* 取相对路径或者绝对路径均可。 *prio* 缺省值为 0,可选值为 0 和 -1,0 标识为在线业务,-1 标识为离线业务。 |
+| **bwmcli –p** *path* | 查询 Pod 网络优先级。 |
+
+> 说明:
+>
+> 支持在线或离线两种网络优先级,oncn-bwm 工具会按照网络优先级实时控制 Pod 的带宽,具体策略为:对于在线类型的 Pod ,不会限制其带宽;对于离线类型的 Pod ,会将其带宽限制在离线带宽范围内。
+
+**使用示例**
+
+- 设置 cgroup 路径为 /sys/fs/cgroup/net_cls/test_online 的 Pod 的优先级为 0
+
+ ```shell
+ # bwmcli -s /sys/fs/cgroup/net_cls/test_online 0
+ set prio success
+ ```
+
+- 查询 cgroup 路径为 /sys/fs/cgroup/net_cls/test_online 的 Pod 的优先级
+
+ ```shell
+ # bwmcli -p /sys/fs/cgroup/net_cls/test_online
+ 0
+ ```
+
+#### 离线业务带宽范围
+
+| 命令格式 | 功能 |
+| ---------------------------------- | ------------------------------------------------------------ |
+| **bwmcli –s bandwidth** `` | 设置一个主机/虚拟机的离线带宽。其中 low 表示最低带宽,high 表示最高带宽,其单位可取值为 kb/mb/gb ,有效范围为 [1mb, 9999gb]。 |
+| **bwmcli –p bandwidth** | 查询设置一个主机/虚拟机的离线带宽。 |
+
+> 说明:
+>
+> - 一个主机上所有使能 Pod 带宽管理的网卡在实现内部被当成一个整体看待,也就是共享设置的在线业务水线和离线业务带宽范围。
+>
+> - 使用 `bwmcli` 设置 Pod 带宽对此节点上所有离线业务生效,所有离线业务的总带宽不能超过离线业务带宽范围。在线业务没有网络带宽限制。
+>
+> - 离线业务带宽范围与在线业务水线共同完成离线业务带宽限制,当在线业务带宽低于设置的水线时,离线业务允许使用设置的最高带宽;当在线业务带宽高于设置的水线时,离线业务允许使用设置的最低带宽。
+
+**使用示例**
+
+- 设置离线带宽范围在 30mb 到 100mb
+
+ ```shell
+ # bwmcli -s bandwidth 30mb,100mb
+ set bandwidth success
+ ```
+
+- 查询离线带宽范围
+
+ ```shell
+ # bwmcli -p bandwidth
+ bandwidth is 31457280(B),104857600(B)
+ ```
+
+#### 在线业务水线
+
+**命令和功能**
+
+| 命令格式 | 功能 |
+| ---------------------------------------------- | ------------------------------------------------------------ |
+| **bwmcli –s waterline** \ | 设置一个主机/虚拟机的在线业务水线,其中 *val* 为水线值,单位可取值为 kb/mb/gb ,有效范围为 [20mb, 9999gb]。 |
+| **bwmcli –p waterline** | 查询一个主机/虚拟机的在线业务水线。 |
+
+> 说明:
+>
+> - 当一个主机上所有在线业务的总带宽高于水线时,会限制离线业务可以使用的带宽,反之当一个主机上所有在线业务的总带宽低于水线时,会提高离线业务可以使用的带宽。
+> - 判断在线业务的总带宽是否超过/低于设置的水线的时机:每 10 ms 判断一次,根据每个 10 ms 内统计的在线带宽是否高于水线来决定对离线业务采用的带宽限制。
+
+**使用示例**
+
+- 设置在线业务水线为 20mb
+
+ ```shell
+ # bwmcli -s waterline 20mb
+ set waterline success
+ ```
+
+- 查询在线业务水线
+
+ ```shell
+ # bwmcli -p waterline
+ waterline is 20971520(B)
+ ```
+
+#### 统计信息
+
+**命令和功能**
+
+| 命令格式 | 功能 |
+| ------------------- | ------------------ |
+| **bwmcli –p stats** | 查询内部统计信息。 |
+
+> 说明:
+>
+> - offline_target_bandwidth 表示离线业务目标带宽
+>
+> - online_pkts 表示开启 Pod 带宽管理后在线业务总包数
+>
+> - offline_pkts 表示开启 Pod 带宽管理后离线业务总包数
+>
+> - online_rate 表示当前在线业务速率
+>
+> - offline_rate 表示当前离线业务速率
+
+**使用示例**
+
+查询内部统计信息
+
+```shell
+# bwmcli -p stats
+offline_target_bandwidth: 2097152
+online_pkts: 2949775
+offline_pkts: 0
+online_rate: 602
+offline_rate: 0
+```
+
+### 典型使用案例
+
+完整配置一个节点上的 Pod 带宽管理可以按照如下步骤顺序操作:
+
+```shell
+bwmcli -p devs # 查询系统当前网卡 Pod 带宽管理状态
+bwmcli -e eth0 # 使能 eth0 的网卡 Pod 带宽管理
+bwmcli -s /sys/fs/cgroup/net_cls/online 0 # 设置在线业务 Pod 的网络优先级为 0
+bwmcli -s /sys/fs/cgroup/net_cls/offline -1 # 设置离线业务 Pod 的网络优先级为 -1
+bwmcli -s bandwidth 20mb,1gb # 配置离线业务带宽范围
+bwmcli -s waterline 30mb # 配置在线业务的水线
+```
diff --git a/docs/en/25.03/Cloud/HybridDeployment/rubik/_menu.md b/docs/en/25.03/Cloud/HybridDeployment/rubik/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..4006270bdc442d94bc9fbbd0f3e457fdcd91e62a
--- /dev/null
+++ b/docs/en/25.03/Cloud/HybridDeployment/rubik/_menu.md
@@ -0,0 +1,14 @@
+---
+label: '云原生混合部署rubik用户指南'
+ismanual: 'Y'
+description: '在业务混合部署的场景下,根据QoS分级,对资源进行合理调度'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '安装与部署'
+ href: './installation-and-deployment.md'
+ - label: 'http接口文档'
+ href: './http-apis.md'
+ - label: '混部隔离示例'
+ href: './example-of-isolation-for-hybrid-deployed-services.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/HybridDeployment/rubik/example-of-isolation-for-hybrid-deployed-services.md b/docs/en/25.03/Cloud/HybridDeployment/rubik/example-of-isolation-for-hybrid-deployed-services.md
new file mode 100644
index 0000000000000000000000000000000000000000..d9c1e15876008d3fb7354ff95da35ef12f6b5376
--- /dev/null
+++ b/docs/en/25.03/Cloud/HybridDeployment/rubik/example-of-isolation-for-hybrid-deployed-services.md
@@ -0,0 +1,233 @@
+# 混部隔离示例
+
+## 环境准备
+
+查看内核是否支持混部隔离功能
+
+```bash
+# 查看/boot/config-系统配置是否开启混部隔离功能
+# 若CONFIG_QOS_SCHED=y则说明使能了混部隔离功能,例如:
+cat /boot/config-5.10.0-60.18.0.50.oe2203.x86_64 | grep CONFIG_QOS
+CONFIG_QOS_SCHED=y
+```
+
+安装docker容器引擎
+
+```bash
+yum install -y docker-engine
+docker version
+# 如下为docker version显示结果
+Client:
+ Version: 18.09.0
+ EulerVersion: 18.09.0.300
+ API version: 1.39
+ Go version: go1.17.3
+ Git commit: aa1eee8
+ Built: Wed Mar 30 05:07:38 2022
+ OS/Arch: linux/amd64
+ Experimental: false
+
+Server:
+ Engine:
+ Version: 18.09.0
+ EulerVersion: 18.09.0.300
+ API version: 1.39 (minimum version 1.12)
+ Go version: go1.17.3
+ Git commit: aa1eee8
+ Built: Tue Mar 22 00:00:00 2022
+ OS/Arch: linux/amd64
+ Experimental: false
+```
+
+## 混部业务
+
+**在线业务(clickhouse)**
+
+使用clickhouse-benchmark测试工具进行性能测试,统计出QPS/P50/P90/P99等相关性能指标,用法参考:
+
+**离线业务(stress)**
+
+stress是一个CPU密集型测试工具,可以通过指定--cpu参数启动多个并发CPU密集型任务给系统环境加压
+
+## 使用说明
+
+1)启动一个clickhouse容器(在线业务)。
+
+2)进入容器内执行clickhouse-benchmark命令,设置并发线程数为10个、查询10000次、查询总时间30s。
+
+3)同时启动一个stress容器(离线业务),并发执行10个CPU密集型任务对环境进行加压。
+
+4)clickhouse-benchmark执行完后输出一个性能测试报告。
+
+混部隔离测试脚本(**test_demo.sh**)如下:
+
+```bash
+#!/bin/bash
+
+with_offline=${1:-no_offline}
+enable_isolation=${2:-no_isolation}
+stress_num=${3:-10}
+concurrency=10
+timeout=30
+output=/tmp/result.json
+online_container=
+offline_container=
+
+exec_sql="echo \"SELECT * FROM system.numbers LIMIT 10000000 OFFSET 10000000\" | clickhouse-benchmark -i 10000 -c $concurrency -t $timeout"
+
+function prepare()
+{
+ echo "Launch clickhouse container."
+ online_container=$(docker run -itd \
+ -v /tmp:/tmp:rw \
+ --ulimit nofile=262144:262144 \
+ -p 34424:34424 \
+ yandex/clickhouse-server)
+
+ sleep 3
+ echo "Clickhouse container lauched."
+}
+
+function clickhouse()
+{
+ echo "Start clickhouse benchmark test."
+ docker exec $online_container bash -c "$exec_sql --json $output"
+ echo "Clickhouse benchmark test done."
+}
+
+function stress()
+{
+ echo "Launch stress container."
+ offline_container=$(docker run -itd joedval/stress --cpu $stress_num)
+ echo "Stress container launched."
+
+ if [ $enable_isolation == "enable_isolation" ]; then
+ echo "Set stress container qos level to -1."
+ echo -1 > /sys/fs/cgroup/cpu/docker/$offline_container/cpu.qos_level
+ fi
+}
+
+function benchmark()
+{
+ if [ $with_offline == "with_offline" ]; then
+ stress
+ sleep 3
+ fi
+ clickhouse
+ echo "Remove test containers."
+ docker rm -f $online_container
+ docker rm -f $offline_container
+ echo "Finish benchmark test for clickhouse(online) and stress(offline) colocation."
+ echo "===============================clickhouse benchmark=================================================="
+ cat $output
+ echo "===============================clickhouse benchmark=================================================="
+}
+
+prepare
+benchmark
+```
+
+## 测试结果
+
+单独执行clickhouse在线业务
+
+```bash
+sh test_demo.sh no_offline no_isolation
+```
+
+得到在线业务的QoS(QPS/P50/P90/P99等指标)**基线数据**如下:
+
+```json
+{
+"localhost:9000": {
+"statistics": {
+"QPS": 1.8853412284364512,
+......
+},
+"query_time_percentiles": {
+......
+"50": 0.484905256,
+"60": 0.519641313,
+"70": 0.570876148,
+"80": 0.632544937,
+"90": 0.728295525,
+"95": 0.808700418,
+"99": 0.873945121,
+......
+}
+}
+}
+```
+
+启用stress离线业务,未开启混部隔离功能下,执行test_demo.sh测试脚本
+
+```bash
+# with_offline参数表示启用stress离线业务
+# no_isolation参数表示未开启混部隔离功能
+sh test_demo.sh with_offline no_isolation
+```
+
+**未开启混部隔离的情况下**,clickhouse业务QoS数据(QPS/P80/P90/P99等指标)如下:
+
+```json
+{
+"localhost:9000": {
+"statistics": {
+"QPS": 0.9424028693636205,
+......
+},
+"query_time_percentiles": {
+......
+"50": 0.840476774,
+"60": 1.304607373,
+"70": 1.393591017,
+"80": 1.41277543,
+"90": 1.430316688,
+"95": 1.457534764,
+"99": 1.555646855,
+......
+}
+}
+```
+
+启用stress离线业务,开启混部隔离功能下,执行test_demo.sh测试脚本
+
+```bash
+# with_offline参数表示启用stress离线业务
+# enable_isolation参数表示开启混部隔离功能
+sh test_demo.sh with_offline enable_isolation
+```
+
+**开启混部隔离功能的情况下**,clickhouse业务QoS数据(QPS/P80/P90/P99等指标)如下:
+
+```json
+{
+"localhost:9000": {
+"statistics": {
+"QPS": 1.8825798759270718,
+......
+},
+"query_time_percentiles": {
+......
+"50": 0.485725185,
+"60": 0.512629901,
+"70": 0.55656488,
+"80": 0.636395956,
+"90": 0.734695906,
+"95": 0.804118275,
+"99": 0.887807409,
+......
+}
+}
+}
+```
+
+从上面的测试结果整理出一个表格如下:
+
+| 业务部署方式 | QPS | P50 | P90 | P99 |
+| -------------------------------------- | ------------- | ------------- | ------------- | ------------- |
+| 单独运行clickhouse在线业务(基线) | 1.885 | 0.485 | 0.728 | 0.874 |
+| clickhouse+stress(未开启混部隔离功能) | 0.942(-50%) | 0.840(-42%) | 1.430(-49%) | 1.556(-44%) |
+| clickhouse+stress(开启混部隔离功能) | 1.883(-0.11%) | 0.486(-0.21%) | 0.735(-0.96%) | 0.888(-1.58%) |
+
+在未开启混部隔离功能的情况下,在线业务clickhouse的QPS从1.9下降到0.9,同时业务的响应时延(P90)也从0.7s增大到1.4s,在线业务QoS下降了50%左右;而在开启混部隔离功能的情况下,不管是在线业务的QPS还是响应时延(P50/P90/P99)相比于基线值下降不到2%,在线业务QoS基本没有变化。
diff --git a/docs/en/25.03/Cloud/HybridDeployment/rubik/figures/icon-note.gif b/docs/en/25.03/Cloud/HybridDeployment/rubik/figures/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/HybridDeployment/rubik/figures/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/HybridDeployment/rubik/http-apis.md b/docs/en/25.03/Cloud/HybridDeployment/rubik/http-apis.md
new file mode 100644
index 0000000000000000000000000000000000000000..d8ec85832901f95a8426c485f2387fd82a5a78f0
--- /dev/null
+++ b/docs/en/25.03/Cloud/HybridDeployment/rubik/http-apis.md
@@ -0,0 +1,67 @@
+# http接口
+
+## 概述
+
+rubik对外开放接口均为http接口,当前包括pod优先级设置/更新接口、rubik探活接口和rubik版本号查询接口。
+
+## 接口介绍
+
+### 设置、更新Pod优先级接口
+
+rubik提供了设置或更新pod优先级的功能,外部可通过调用该接口发送pod相关信息,rubik根据接收到的pod信息对其设置优先级从而达到资源隔离的目的。接口调用格式为:
+
+```bash
+HTTP POST /run/rubik/rubik.sock
+{
+ "Pods": {
+ "podaaa": {
+ "CgroupPath": "kubepods/burstable/podaaa",
+ "QosLevel": 0
+ },
+ "podbbb": {
+ "CgroupPath": "kubepods/burstable/podbbb",
+ "QosLevel": -1
+ }
+ }
+}
+```
+
+Pods 配置中为需要设置或更新优先级的 Pod 信息,每一个http请求至少需要指定配置1个 pod,每个 pod 必须指定CgroupPath 和 QosLevel,其含义如下:
+
+| 配置项 | 配置值类型 | 配置取值范围 | 配置含义 |
+| ---------- | ---------- | ------------ | ------------------------------------------------------- |
+| QosLevel | int | 0、-1 | pod优先级,0表示其为在线业务,-1表示其为离线业务 |
+| CgroupPath | string | 相对路径 | 对应Pod的cgroup子路径(即其在cgroup子系统下的相对路径) |
+
+接口调用示例如下:
+
+```sh
+curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST --data '{"Pods": {"podaaa": {"CgroupPath": "kubepods/burstable/podaaa","QosLevel": 0},"podbbb": {"CgroupPath": "kubepods/burstable/podbbb","QosLevel": -1}}}' --unix-socket /run/rubik/rubik.sock http://localhost/
+```
+
+### 探活接口
+
+rubik作为HTTP服务,提供探活接口用于帮助判断rubik是否处于运行状态。
+
+接口形式:HTTP/GET /ping
+
+接口调用示例如下:
+
+```sh
+curl -XGET --unix-socket /run/rubik/rubik.sock http://localhost/ping
+```
+
+若返回ok则代表rubik服务处于运行状态。
+
+### 版本信息查询接口
+
+rubik支持通过HTTP请求查询当前rubik的版本号。
+
+接口形式:HTTP/GET /version
+
+接口调用示例如下:
+
+```sh
+curl -XGET --unix-socket /run/rubik/rubik.sock http://localhost/version
+{"Version":"0.0.1","Release":"1","Commit":"29910e6","BuildTime":"2021-05-12"}
+```
diff --git a/docs/en/25.03/Cloud/HybridDeployment/rubik/installation-and-deployment.md b/docs/en/25.03/Cloud/HybridDeployment/rubik/installation-and-deployment.md
new file mode 100644
index 0000000000000000000000000000000000000000..5dcc45a391945dc50d3172f9446d6d105cf07fd0
--- /dev/null
+++ b/docs/en/25.03/Cloud/HybridDeployment/rubik/installation-and-deployment.md
@@ -0,0 +1,198 @@
+# 安装与部署
+
+## 概述
+
+本章节主要介绍rubik组件的安装以及部署方式。
+
+## 软硬件要求
+
+### 硬件要求
+
+* 当前仅支持 x86、aarch64架构。
+* rubik磁盘使用需求:配额1GB及以上。
+* rubik内存使用需求:配额100MB及以上。
+
+### 软件要求
+
+* 操作系统:openEuler 22.03-LTS
+* 内核:openEuler 22.03-LTS版本内核
+
+### 环境准备
+
+* 安装 openEuler 系统,安装方法参考《[安装指南](../../../Server/InstallationUpgrade/Installation/installation.md)》。
+* 安装并部署 kubernetes,安装及部署方法参考《Kubernetes 集群部署指南》。
+* 安装docker或isulad容器引擎,若采用isulad容器引擎,需同时安装isula-build容器镜像构建工具。
+
+## 安装rubik
+
+rubik以k8s daemonSet形式部署在k8s的每一个节点上,故需要在每一个节点上使用以下步骤安装rubik rpm包。
+
+1. 配置 yum 源:openEuler 22.03-LTS 和 openEuler 22.03-LTS:EPOL(rubik组件当前仅在EPOL源中),参考如下:
+
+ ```conf
+ # openEuler 22.03-LTS 官方发布源
+ name=openEuler22.03
+ baseurl=https://repo.openeuler.org/openEuler-22.03-LTS/everything/$basearch/
+ enabled=1
+ gpgcheck=1
+ gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS/everything/$basearch/RPM-GPG-KEY-openEuler
+ ```
+
+ ```conf
+ # openEuler 22.03-LTS:Epol 官方发布源
+ name=Epol
+ baseurl=https://repo.openeuler.org/openEuler-22.03-LTS/EPOL/$basearch/
+ enabled=1
+ gpgcheck=0
+ ```
+
+2. 使用root权限安装rubik:
+
+ ```bash
+ sudo yum install -y rubik
+ ```
+
+> **说明**:
+>
+> rubik工具相关文件会安装在/var/lib/rubik目录下
+
+## 部署rubik
+
+rubik以容器形式运行在混合部署场景下的k8s集群中,用于对不同优先级业务进行资源隔离和限制,避免离线业务对在线业务产生干扰,在提高资源总体利用率的同时保障在线业务的服务质量。当前rubik支持对CPU、内存资源进行隔离和限制,需配合openEuler 22.03-LTS版本的内核使用。若用户想要开启内存优先级特性(即针对不同优先级业务实现内存资源的分级),需要通过设置/proc/sys/vm/memcg_qos_enable开关,有效值为0和1,其中0为缺省值表示关闭特性,1表示开启特性。
+
+```bash
+sudo echo 1 > /proc/sys/vm/memcg_qos_enable
+```
+
+### 部署rubik daemonset
+
+1. 使用docker或isula-build容器引擎构建rubik镜像,由于rubik以daemonSet形式部署,故每一个节点都需要rubik镜像。用户可以在一个节点构建镜像后使用docker save/load功能将rubik镜像load到k8s的每一个节点,也可以在各节点上都构建一遍rubik镜像。以isula-build为例,参考命令如下:
+
+ ```bash
+ isula-build ctr-img build -f /var/lib/rubik/Dockerfile --tag rubik:0.1.0 .
+ ```
+
+2. 在k8s master节点,修改`/var/lib/rubik/rubik-daemonset.yaml`文件中的rubik镜像名,与上一步构建出来的镜像名保持一致。
+
+ ```yaml
+ ...
+ containers:
+ - name: rubik-agent
+ image: rubik:0.1.0 # 此处镜像名需与上一步构建的rubik镜像名一致
+ imagePullPolicy: IfNotPresent
+ ...
+ ```
+
+3. 在k8s master节点,使用kubectl命令部署rubik daemonset,rubik会自动被部署在k8s的所有节点:
+
+ ```bash
+ kubectl apply -f /var/lib/rubik/rubik-daemonset.yaml
+ ```
+
+4. 使用`kubectl get pods -A`命令查看rubik是否已部署到集群每一个节点上(rubik-agent数量与节点数量相同且均为Running状态)
+
+ ```bash
+ [root@localhost rubik]# kubectl get pods -A
+ NAMESPACE NAME READY STATUS RESTARTS AGE
+ ...
+ kube-system rubik-agent-76ft6 1/1 Running 0 4s
+ ...
+ ```
+
+## 常用配置说明
+
+通过以上方式部署的rubik将以默认配置启动,用户可以根据实际需要修改rubik配置,可通过修改rubik-daemonset.yaml文件中的config.json段落内容后重新部署rubik daemonset实现。
+
+本章介绍 config.json 的常用配置,以方便用户根据需要进行配置。
+
+### 配置项说明
+
+```yaml
+# 该部分配置内容位于rubik-daemonset.yaml文件中的config.json段落
+{
+ "autoConfig": true,
+ "autoCheck": false,
+ "logDriver": "stdio",
+ "logDir": "/var/log/rubik",
+ "logSize": 1024,
+ "logLevel": "info",
+ "cgroupRoot": "/sys/fs/cgroup"
+}
+```
+
+| 配置项 | 配置值类型 | 配置取值范围 | 配置含义 |
+| ---------- | ---------- | ------------------ | ------------------------------------------------------------ |
+| autoConfig | bool | true、false | true:开启Pod自动感知功能。 false:关闭 Pod 自动感知功能。 |
+| autoCheck | bool | true、false | true:开启 Pod 优先级校验功能。 false:关闭 Pod 优先级校验功能。 |
+| logDriver | string | stdio、file | stdio:直接向标准输出打印日志,日志收集和转储由调度平台完成。 file:将文件打印到日志目录,路径由logDir指定。 |
+| logDir | string | 绝对路径 | 指定日志存放的目录路径。 |
+| logSize | int | [10,1048576] | 指定日志存储总大小,单位 MB,若日志总量达到上限则最早的日志会被丢弃。 |
+| logLevel | string | error、info、debug | 指定日志级别。 |
+| cgroupRoot | string | 绝对路径 | 指定 cgroup 挂载点。 |
+
+### Pod优先级自动配置
+
+若在rubik config中配置autoConfig为true开启了Pod自动感知配置功能,用户仅需在部署业务pod时在yaml中通过annotation指定其优先级,部署后rubik会自动感知当前节点pod的创建与更新,并根据用户配置的优先级设置pod优先级。
+
+### 依赖于kubelet的Pod优先级配置
+
+由于Pod优先级自动配置依赖于来自api-server pod创建事件的通知,具有一定的延迟性,无法在进程启动之前及时完成Pod优先级的配置,导致业务性能可能存在抖动。用户可以关闭优先级自动配置选项,通过修改kubelet源码,在容器cgroup创建后、容器进程启动前调用rubik http接口配置pod优先级,http接口具体使用方法详见[http接口文档](./http-apis.md)
+
+### 支持自动校对Pod优先级
+
+rubik支持在启动时对当前节点Pod QoS优先级配置进行一致性校对,此处的一致性是指k8s集群中的配置和rubik对pod优先级的配置之间的一致性。该校对功能默认关闭,用户可以通过 autoCheck 选项控制是否开启。若开启该校对功能,启动或者重启 rubik 时,rubik会自动校验并更正当前节点pod优先级配置。
+
+## 在离线业务配置示例
+
+rubik部署成功后,用户在部署实际业务时,可以根据以下配置示例对业务yaml文件进行修改,指定业务的在离线类型,rubik即可在业务部署后对其优先级进行配置,从而达到资源隔离的目的。
+
+以下为部署一个nginx在线业务的示例:
+
+```yaml
+apiVersion: v1
+kind: Pod
+metadata:
+ name: nginx
+ namespace: qosexample
+ annotations:
+ volcano.sh/preemptable: "false" # volcano.sh/preemptable为true代表业务为离线业务,false代表业务为在线业务,默认为false
+spec:
+ containers:
+ - name: nginx
+ image: nginx
+ resources:
+ limits:
+ memory: "200Mi"
+ cpu: "1"
+ requests:
+ memory: "200Mi"
+ cpu: "1"
+```
+
+## 约束限制
+
+* rubik接受HTTP请求并发量上限1000QPS,并发量超过上限则报错。
+
+* rubik接受的单个请求中pod上限为100个,pod数量越界则报错。
+
+* 每个k8s节点只能部署一个rubik,多个rubik会冲突。
+
+* rubik不提供端口访问,只能通过socket通信。
+
+* rubik只接收合法http请求路径及网络协议:](./http-apis.md)。
+
+* rubik磁盘使用需求:配额1GB及以上。
+
+* rubik内存使用需求:配额100MB及以上。
+
+* 禁止将业务从低优先级(离线业务)往高优先级(在线业务)切换。如业务A先被设置为离线业务,接着请求设置为在线业务,rubik报错。
+
+* 容器挂载目录时,rubik本地套接字/run/rubik的目录权限需由业务侧保证最小权限700。
+
+* rubik服务端可用时,单个请求超时时间为120s。如果rubik进程进入T(暂停状态或跟踪状态)、D状态(不可中断的睡眠状态),则服务端不可用,此时rubik服务不会响应任何请求。为了避免此情况的发生,请在客户端设置超时时间,避免无限等待。
+
+* 使用混部后,原始的cgroup cpu share功能存在限制。具体表现为:
+
+ 若当前CPU中同时有在线任务和离线任务运行,则离线任务的CPU share配置无法生效。
+
+ 若当前CPU中只有在线任务或只有离线任务,CPU share能生效。
diff --git a/docs/en/25.03/Cloud/HybridDeployment/rubik/overview.md b/docs/en/25.03/Cloud/HybridDeployment/rubik/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..c07cf4abfff942d0b036db88692cd3eb640345dc
--- /dev/null
+++ b/docs/en/25.03/Cloud/HybridDeployment/rubik/overview.md
@@ -0,0 +1,17 @@
+# rubik使用指南
+
+## 概述
+
+服务器资源利用率低一直是业界公认的难题,随着云原生技术的发展,将在线(高优先级)、离线(低优先级)业务混合部署成为了当下提高资源利用率的有效手段。
+
+rubik容器调度在业务混合部署的场景下,根据QoS分级,对资源进行合理调度,从而实现在保障在线业务服务质量的前提下,大幅提升资源利用率。
+
+rubik当前支持如下特性:
+
+- pod CPU优先级的配置
+- pod memory优先级的配置
+
+本文档适用于使用openEuler系统并希望了解和使用rubik的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备以下经验和技能:
+
+- 熟悉Linux基本操作
+- 熟悉kubernetes和docker/iSulad基本操作
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/_menu.md b/docs/en/25.03/Cloud/ImageBuilder/isula-build/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..e8c0a785c81f8776b8f184c4b97e7c36fd02d6f6
--- /dev/null
+++ b/docs/en/25.03/Cloud/ImageBuilder/isula-build/_menu.md
@@ -0,0 +1,14 @@
+---
+label: '容器镜像构建'
+ismanual: 'Y'
+description: '支持通过Dockerfile文件快速构建容器镜像'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '使用指南'
+ href: './isula-build.md'
+ - label: '常见问题与解决方法'
+ href: './isula-build-faqs.md'
+ - label: '附录'
+ href: './isula-build-appendix.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/figures/isula-build_arch.png b/docs/en/25.03/Cloud/ImageBuilder/isula-build/figures/isula-build_arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..911a9ae6f46988586ab49f15de282948f5470c37
Binary files /dev/null and b/docs/en/25.03/Cloud/ImageBuilder/isula-build/figures/isula-build_arch.png differ
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build-appendix.md b/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build-appendix.md
new file mode 100644
index 0000000000000000000000000000000000000000..35b0fbcc9e4ad33ac420f0706a2c35acdaefa780
--- /dev/null
+++ b/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build-appendix.md
@@ -0,0 +1,91 @@
+# 附录
+
+## 命令行参数说明
+
+**表1** ctr-img build 命令参数列表
+
+| **命令** | **参数** | **说明** |
+| ------------- | -------------- | ------------------------------------------------------------ |
+| ctr-img build | --build-arg | string列表,构建过程中需要用到的变量 |
+| | --build-static | KV值,构建二进制一致性。目前包含如下K值:- build-time:string,使用固定时间戳来构建容器镜像;时间戳格式为“YYYY-MM-DD HH-MM-SS” |
+| | -f, --filename | string,Dockerfile的路径,不指定则是使用当前路径的Dockerfile文件 |
+| | --format | string,设置构建镜像的镜像格式:oci|docker(需开启实验特性选项)|
+| | --iidfile | string,输出 image ID 到本地文件 |
+| | -o, --output | string,镜像导出的方式和路径 |
+| | --proxy | 布尔值,继承主机侧环境的proxy环境变量(默认为true) |
+| | --tag | string,给构建的镜像添加tag |
+| | --cap-add | string列表,构建过程中RUN指令所需要的权限 |
+
+**表2** ctr-img load 命令参数列表
+
+| **命令** | **参数** | **说明** |
+| ------------ | ----------- | --------------------------------- |
+| ctr-img load | -i, --input | string,需要导入的本地tar包的路径 |
+
+**表3** ctr-img push 命令参数列表
+
+| **命令** | **参数** | **说明** |
+| ------------ | ----------- | --------------------------------- |
+| ctr-img push | -f, --format | string,推送的镜像格式:oci|docker(需开启实验特性选项)|
+
+**表4** ctr-img rm 命令参数列表
+
+| **命令** | **参数** | **说明** |
+| ---------- | ----------- | --------------------------------------------- |
+| ctr-img rm | -a, --all | 布尔值,删除所有本地持久化存储的镜像 |
+| | -p, --prune | 布尔值,删除所有没有tag的本地持久化存储的镜像 |
+
+**表5** ctr-img save 命令参数列表
+
+| **命令** | **参数** | **说明** |
+| ------------ | ------------ | ---------------------------------- |
+| ctr-img save | -o, --output | string,镜像导出后在本地的存储路径 |
+| | -f, --format | string,导出层叠镜像的镜像格式:oci|docker(需开启实验特性选项)|
+
+**表6** login 命令参数列表
+
+| **命令** | **参数** | **说明** |
+| -------- | -------------------- | ------------------------------------------------------- |
+| login | -p, --password-stdin | 布尔值,是否通过stdin读入密码;或采用交互式界面输入密码 |
+| | -u, --username | string,登录镜像仓库所使用的用户名 |
+
+**表7** logout 命令参数列表
+
+| **命令** | **参数** | **说明** |
+| -------- | --------- | ------------------------------------ |
+| logout | -a, --all | 布尔值,是否登出所有已登录的镜像仓库 |
+
+**表8** manifest annotate命令参数列表
+
+| **命令** | **说明** | **参数** |
+| ----------------- | ------------- | ------------------------------------------ |
+| manifest annotate | --arch | string,重写镜像适用架构 |
+| | --os | string,重写镜像适用系统 |
+| | --os-features | string列表,指定镜像需要的OS特性,很少使用 |
+| | --variant | string,指定列表中记录镜像的变量 |
+
+## 通信矩阵
+
+isula-build两个组件进程之间通过unix socket套接字文件进行通信,无端口通信。
+
+## 文件与权限
+
+* isula-build 所有的操作均需要使用 root 权限。如需使用非特权用户操作,则需要配置--group参数
+
+* isula-build 运行涉及文件权限如下表所示:
+
+| **文件路径** | **文件/文件夹权限** | **说明** |
+| ------------------------------------------- | ------------------- | ------------------------------------------------------------ |
+| /usr/bin/isula-build | 550 | 命令行工具二进制文件。 |
+| /usr/bin/isula-builder | 550 | 服务端isula-builder进程二进制文件。 |
+| /usr/lib/systemd/system/isula-build.service | 640 | systemd配置文件,用于管理isula-build服务。 |
+| /etc/isula-build | 650 | isula-builder 配置文件根目录 |
+| /etc/isula-build/configuration.toml | 600 | isula-builder 总配置文件,包含设置 isula-builder 日志级别、持久化目录和运行时目录、OCI runtime等。 |
+| /etc/isula-build/policy.json | 600 | 签名验证策略文件的语法文件。 |
+| /etc/isula-build/registries.toml | 600 | 针对各个镜像仓库的配置文件,含可用的镜像仓库列表、镜像仓库黑名单。 |
+| /etc/isula-build/storage.toml | 600 | 本地持久化存储的配置文件,包含所使用的存储驱动的配置。 |
+| /etc/isula-build/isula-build.pub | 400 | 非对称加密公钥文件 |
+| /var/run/isula_build.sock | 660 | 服务端isula-builder的本地套接字。 |
+| /var/lib/isula-build | 700 | 本地持久化目录。 |
+| /var/run/isula-build | 700 | 本地运行时目录。 |
+| /var/lib/isula-build/tmp/[buildid]/isula-build-tmp-*.tar | 644 | 镜像导出至iSulad时的本地暂存目录。 |
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build-faqs.md b/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build-faqs.md
new file mode 100644
index 0000000000000000000000000000000000000000..a9c308f1669737a117553b7d3b8278048c5670d6
--- /dev/null
+++ b/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build-faqs.md
@@ -0,0 +1,7 @@
+# 常见问题与解决方法
+
+## **问题1:isula-build拉取镜像报错:pinging container registry xx: get xx: dial tcp host:repo: connect: connection refused**
+
+原因:拉取的镜像来源于非授信仓库。
+
+解决方法:修改isula-build镜像仓库的配置文件/etc/isula-build/registries.toml,将该非授信仓库加入[registries.insecure],重启isula-build。
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build.md b/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build.md
new file mode 100644
index 0000000000000000000000000000000000000000..d4838f986ef64dfbe9277b51d75ee738ea2fa606
--- /dev/null
+++ b/docs/en/25.03/Cloud/ImageBuilder/isula-build/isula-build.md
@@ -0,0 +1,934 @@
+# 安装
+
+## 环境准备
+
+为了确保isula-build成功安装,需满足以下软件硬件要求。
+
+* 支持的机器架构:x86_64 和 AArch64
+* 支持的操作系统:openEuler
+* 用户具有root权限。
+
+### 安装isula-build
+
+使用isula-build构建容器镜像,需要先安装以下软件包。
+
+#### (推荐)方法一:使用yum安装
+
+1. 配置openEuler yum源。
+
+2. 使用root权限,登录目标服务器,安装isula-build。
+
+ ```sh
+ sudo yum install -y isula-build
+ ```
+
+#### 方法二:使用rpm包安装
+
+1. 从openEuler yum源中获取isula-build对应安装包isula-build-*.rpm。例如isula-build-0.9.6-4.oe1.x86_64.rpm。
+
+2. 将获取的rpm软件包上传至目标服务器的任一目录,例如 /home/。
+
+3. 使用root权限,登录目标服务器,参考如下命令安装isula-build。
+
+ ```sh
+ sudo rpm -ivh /home/isula-build-*.rpm
+ ```
+
+>  **说明:**
+>
+> 安装完成后,需要手工启动isula-build服务。启动请参见[管理服务](isula-build构建工具.md#管理服务)。
+
+# 配置与管理服务
+
+## 配置服务
+
+在安装完 isula-build 软件包之后,systemd 管理服务会以 isula-build 软件包自带的 isula-build 服务端默认配置启动 isula-build 服务。如果 isula-build 服务端的默认配置文件不能满足用户的需求,可以参考如下介绍进行定制化配置。需要注意的是,修改完默认配置之后,需要重启 isula-build 服务端使新配置生效,具体操作可参考下一章节。
+
+目前 isula-build 服务端包含如下配置文件:
+
+* /etc/isula-build/configuration.toml:isula-builder 总体配置文件,用于设置 isula-builder 日志级别、持久化目录和运行时目录、OCI runtime等。其中各参数含义如下:
+
+| 配置项 | 是否可选 | 配置项含义 | 配置项取值 |
+| --------- | -------- | --------------------------------- | ----------------------------------------------- |
+| debug | 可选 | 设置是否打开debug日志 | true:打开debug日志 false:关闭debug日志 |
+| loglevel | 可选 | 设置日志级别 | debug info warn error |
+| run_root | 必选 | 设置运行时数据根目录 | 运行时数据根目录路径,例如/var/run/isula-build/ |
+| data_root | 必选 | 设置本地持久化目录 | 本地持久化目录路径,例如/var/lib/isula-build/ |
+| runtime | 可选 | 设置runtime种类,目前仅支持runc | runc |
+| group | 可选 | 设置本地套接字isula_build.sock文件属组使得加入该组的非特权用户可以操作isula-build | isula |
+| experimental | 可选 | 设置是否开启实验特性 | true:开启实验特性;false:关闭实验特性 |
+
+* /etc/isula-build/storage.toml: 本地持久化存储的配置文件,包含所使用的存储驱动的配置。
+
+| 配置项 | 是否可选 | 配置项含义 |
+| ------ | -------- | ------------------------------ |
+| driver | 可选 | 存储驱动类型,目前支持overlay2 |
+
+ 更多设置可参考 [containers-storage.conf.5](https://github.com/containers/storage/blob/main/docs/containers-storage.conf.5.md)。
+
+* /etc/isula-build/registries.toml : 针对各个镜像仓库的配置文件。
+
+| 配置项 | 是否可选 | 配置项含义 |
+| ------------------- | -------- | ------------------------------------------------------------ |
+| registries.search | 可选 | 镜像仓库搜索域,在此list的镜像仓库可以被感知,不在此列的不被感知。 |
+| registries.insecure | 可选 | 可访问的不安全镜像仓库地址,在此列表中的镜像仓库将不会通过鉴权,不推荐使用。 |
+
+ 更多设置可参考 [containers-registries.conf.5](https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md)。
+
+* /etc/isula-build/policy.json:镜像pull/push策略文件。当前不支持对其进行配置。
+
+>  **说明:**
+>
+> * isula-build 支持最大 1MiB 的上述配置文件。
+> * isula-build 不支持将持久化工作目录 dataroot 配置在内存盘上,比如 tmpfs。
+> * isula-build 目前仅支持使用overlay2为底层 graphdriver。
+> * 在设置--group参数前,需保证本地OS已经创建了对应的用户组,且非特权用户已经加入该组。重启isula-builder之后即可使该非特权用户使用isula-build功能。同时,为了保持权限一致性,isula-build的配置文件目录/etc/isula-build的属组也会被设置为--group指定的组。
+
+## 管理服务
+
+目前 openEuler 采用 systemd 管理软件服务,isula-build 软件包已经自带了 systemd 的服务文件,用户安装完 isula-build 软件包之后,可以直接通过 systemd 工具对它进行服务启停等操作。用户同样可以手动启动 isula-build 服务端软件。需要注意的是,同一个节点上不可以同时启动多个 isula-build 服务端软件。
+
+>  **说明:**
+>
+> 同一个节点上不可以同时启动多个 isula-build 服务端软件。
+
+### 通过 systemd 管理(推荐方式)
+
+用户可以通过如下 systemd 的标准指令控制 isula-build 服务的启动、停止、重启等动作:
+
+* 启动 isula-build 服务:
+
+ ```sh
+ sudo systemctl start isula-build.service
+ ```
+
+* 停止 isula-build 服务:
+
+ ```sh
+ sudo systemctl stop isula-build.service
+ ```
+
+* 重启 isula-build 服务:
+
+ ```sh
+ sudo systemctl restart isula-build.service
+ ```
+
+isula-build 软件包安装的 systemd 服务文件保存在 `/usr/lib/systemd/system/isula-build.service`。如果用户需要修改 isula-build 服务的 systemd 配置,可以修改该文件,执行如下命令使配置生效,之后再根据上面提到的 systemd 管理指令重启 isula-build 服务
+
+```sh
+sudo systemctl daemon-reload
+```
+
+### 直接运行 isula-build 服务端
+
+您也可以通过执行 isula-build 服务端命令( isula-builder)的方式启动服务。其中,服务端启动配置,可通过isula-builder命令支持的 flags 设置。isula-build 服务端目前支持的 flags 如下:
+
+* -D, --debug: 是否开启调测模式。
+* --log-level: 日志级别,支持 “debug”, “info”, “warn” or “error”,默认为 “info”。
+* --dataroot: 本地持久化路径,默认为”/var/lib/isula-build/“。
+* --runroot: 运行时路径,默认为”/var/run/isula-build/“。
+* --storage-driver:底层存储驱动类型。
+* --storage-opt: 底层存储驱动配置。
+* --group: 设置本地套接字isula_build.sock文件属组使得加入该组的非特权用户可以操作isula-build,默认为“isula”。
+* --experimental: 是否开启实验特性,默认为false。
+
+>  **说明:**
+>
+> 当命令行启动参数中传递了与配置文件相同的配置选项时,优先使用命令行参数启动。
+
+启动 isula-build 服务。例如指定本地持久化路径/var/lib/isula-build,且不开启调试的参考命令如下:
+
+```sh
+sudo isula-builder --dataroot "/var/lib/isula-build" --debug=false
+```
+
+# 使用指南
+
+## 前提条件
+
+isula-build 构建 Dockerfile 内的 RUN 指令时依赖可执行文件 runc ,需要 isula-build 的运行环境上预装好 runc。安装方式视用户使用场景而定,如果用户不需要使用完整的 docker-engine 工具链,则可以仅安装 docker-runc rpm包:
+
+```sh
+sudo yum install -y docker-runc
+```
+
+如果用户需要使用完整的 docker-engine 工具链,则可以安装 docker-engine rpm包,默认包含可执行文件 runc :
+
+```sh
+sudo yum install -y docker-engine
+```
+
+>  **说明:**
+>
+> 用户需保证OCI runtime(runc)可执行文件的安全性,避免被恶意替换。
+
+## 总体说明
+
+isula-build 客户端提供了一系列命令用于构建和管理容器镜像,当前 isula-build 包含的命令行指令如下:
+
+* ctr-img,容器镜像管理。ctr-img又包含如下子命令:
+ * build,根据给定dockerfile构建出容器镜像。
+ * images,列出本地容器镜像。
+ * import,导入容器基础镜像。
+ * load,导入层叠镜像。
+ * rm,删除本地容器镜像。
+ * save,导出层叠镜像至本地磁盘。
+ * tag,给本地容器镜像打tag。
+ * pull,拉取镜像到本地。
+ * push,推送本地镜像到远程仓库。
+* info,查看isula-build的运行环境和系统信息。
+* login,登录远端容器镜像仓库。
+* logout,退出远端容器镜像仓库。
+* version,查看isula-build和isula-builder的版本号。
+* manifest(实验特性),管理manifest列表。
+
+>  **说明:**
+>
+> * isula-build completion 和 isula-builder completion 命令用于生成bash命令补全脚本。该命令为命令行框架隐式提供,不会显示在help信息中。
+> * isula-build客户端不包含配置文件,当用户需要使用isula-build实验特性时,需要在客户端通过命令`export ISULABUILD_CLI_EXPERIMENTAL=enabled`配置环境变量ISULABUILD_CLI_EXPERIMENTAL来开启实验特性。
+
+以下按照上述维度依次详细介绍这些命令行指令的使用。
+
+## ctr-img: 容器镜像管理
+
+isula-build 将所有容器镜像管理相关命令划分在子命令 `ctr-img` 下,命令原型为:
+
+```sh
+isula-build ctr-img [command]
+```
+
+### build: 容器镜像构建
+
+ctr-img 的子命令 build 用于构建容器镜像,命令原型为:
+
+```sh
+isula-build ctr-img build [flags]
+```
+
+其中 build 包含如下 flags:
+
+* --build-arg:string列表,构建过程中需要用到的变量。
+* --build-static:KeyValue值,构建二进制一致性。目前包含如下Key值:
+ * build-time:string,使用固定时间戳来构建容器镜像;时间戳格式为“YYYY-MM-DD HH-MM-SS”。
+* -f, --filename:string,Dockerfile的路径,不指定则是使用当前路径的Dockerfile文件。
+* --format: string, 设置构建镜像的镜像格式:oci | docker(需开启实验特性选项)。
+* --iidfile:string,输出 image ID 到本地文件。
+* -o, --output:string,镜像导出的方式和路径。
+* --proxy:布尔值,继承主机侧环境的proxy环境变量(默认为true)。
+* --tag:string,设置构建成功的镜像的tag值。
+* --cap-add:string列表,构建过程中RUN指令所需要的权限。
+
+**以下为各个 flags 的详解。**
+
+**\--build-arg**
+
+从命令行接受参数作为Dockerfile中的参数,用法:
+
+```sh
+$ echo "This is bar file" > bar.txt
+$ cat Dockerfile_arg
+FROM busybox
+ARG foo
+ADD ${foo}.txt .
+RUN cat ${foo}.txt
+$ sudo isula-build ctr-img build --build-arg foo=bar -f Dockerfile_arg
+STEP 1: FROM busybox
+Getting image source signatures
+Copying blob sha256:8f52abd3da461b2c0c11fda7a1b53413f1a92320eb96525ddf92c0b5cde781ad
+Copying config sha256:e4db68de4ff27c2adfea0c54bbb73a61a42f5b667c326de4d7d5b19ab71c6a3b
+Writing manifest to image destination
+Storing signatures
+STEP 2: ARG foo
+STEP 3: ADD ${foo}.txt .
+STEP 4: RUN cat ${foo}.txt
+This is bar file
+Getting image source signatures
+Copying blob sha256:6194458b07fcf01f1483d96cd6c34302ffff7f382bb151a6d023c4e80ba3050a
+Copying blob sha256:6bb56e4a46f563b20542171b998cb4556af4745efc9516820eabee7a08b7b869
+Copying config sha256:39b62a3342eed40b41a1bcd9cd455d77466550dfa0f0109af7a708c3e895f9a2
+Writing manifest to image destination
+Storing signatures
+Build success with image id: 39b62a3342eed40b41a1bcd9cd455d77466550dfa0f0109af7a708c3e895f9a2
+```
+
+**\--build-static**
+
+指定为静态构建,即使用isula-build构建容器镜像时消除所有时间戳和其他构建因素(例如容器ID、hostname等)的差异。最终构建出满足静态要求的容器镜像。
+
+在使用isula-build进行容器镜像构建时,假如给 build 子命令一个固定的时间戳,并在限定如下条件的时候:
+
+* 构建环境前后保持一致。
+* 构建Dockerfile前后保持一致。
+* 构建产生的中间数据前后保持一致。
+* 构建命令相同。
+* 第三方库版本一致。
+
+对于容器镜像构建,isula-build支持相同的Dockerfile。如果构建环境相同,则多次构建生成的镜像内容和镜像ID相同。
+
+--build-static接受k=v形式的键值对选项,当前支持的选项有:
+
+* build-time:字符串类型。构建静态镜像的固定时间戳,格式为“YYYY-MM-DD HH-MM-SS”。时间戳影响diff层创建修改时间的文件属性。
+
+ 使用示例如下:
+
+ ```sh
+ sudo isula-build ctr-img build -f Dockerfile --build-static='build-time=2020-05-23 10:55:33' .
+ ```
+
+ 以此方式,同一环境多次构建出来的容器镜像和镜像ID均会保持一致。
+
+**\--format**
+开始实验特性后该选项可用,默认为OCI镜像格式。可以手动指定镜像格式进行构建,例如,下面分别为构建OCI镜像格式以及Docker镜像格式镜像的命令。
+
+ ```sh
+ export ISULABUILD_CLI_EXPERIMENTAL=enabled; sudo isula-build ctr-img build -f Dockerfile --format oci .
+ ```
+
+ ```sh
+ export ISULABUILD_CLI_EXPERIMENTAL=enabled; sudo isula-build ctr-img build -f Dockerfile --format docker .
+ ```
+
+**\--iidfile**
+
+将构建的镜像ID输出到文件,用法:
+
+```sh
+isula-build ctr-img build --iidfile filename
+```
+
+例如,将容器镜像ID输出到testfile的参考命令如下:
+
+ ```sh
+sudo isula-build ctr-img build -f Dockerfile_arg --iidfile testfile
+ ```
+
+ 查看testfile中的容器镜像ID:
+
+ ```sh
+$ cat testfile
+76cbeed38a8e716e22b68988a76410eaf83327963c3b29ff648296d5cd15ce7b
+ ```
+
+**\-o, --output**
+
+目前 -o, --output 支持如下形式:
+
+* `isulad:image:tag`:将构建成功的镜像直接推送到 iSulad。比如:`-o isulad:busybox:latest`。同时需要注意如下约束:
+
+ * isula-build 和 iSulad 必须在同一个节点上
+ * tag必须配置
+ * isula-build client端需要将构建成功的镜像暂存成 `/var/tmp/isula-build-tmp-%v.tar` 再导入至 iSulad,用户需要保证 `/var/tmp/` 目录有足够磁盘空间
+
+* `docker-daemon:image:tag`:将构建成功的镜像直接推送到 Docker daemon。比如:`-o docker-daemon:busybox:latest`。同时需要注意如下约束:
+ * isula-build 和 docker 必须在同一个节点上
+ * tag必须配置
+
+* `docker://registry.example.com/repository:tag`:将构建成功的镜像以Docker镜像格式直接推送到远端镜像仓库。比如:`-o docker://localhost:5000/library/busybox:latest`。
+
+* `docker-archive:/:image:tag`:将构建成功的镜像以Docker镜像格式保存至本地。比如:`-o docker-archive:/root/image.tar:busybox:latest`。
+
+打开实验特性之后,可以启用相应OCI镜像的构建:
+
+* `oci://registry.example.com/repository:tag`:将构建成功的镜像以OCI镜像格式直接推送到远端镜像仓库(远程镜像仓库须支持OCI镜像格式)。比如:`-o oci://localhost:5000/library/busybox:latest`。
+
+* `oci-archive:/:image:tag`:将构建成功的镜像以OCI镜像的格式保存至本地。比如:`-o oci-archive:/root/image.tar:busybox:latest`。
+
+除去各个flags之外,build子命令的命令行最后还会接收一个argument,该argument类型是string,意义为context,即该Dockerfile构建环境的上下文。该参数缺省值为isula-build被执行的当前路径。该路径会影响 .dockerignore 和 Dockerfile的ADD/COPY指令 所检索的路径。
+
+**\--proxy**
+
+选择构建时RUN指令启动的容器是否从环境上继承proxy相关环境变量“http_proxy”,“https_proxy”,“ftp_proxy”,“no_proxy”,“HTTP_PROXY”,“HTTPS_PROXY”,“FTP_PROXY”,“NO_PROXY”,默认为true。
+
+当用户在Dockerfile配置proxy相关ARG或ENV,将覆盖所继承的环境变量。
+
+注意:若client与daemon不在同一个终端运行,所能继承的环境变量为daemon所在终端的环境变量。
+
+**\--tag**
+
+设置镜像构建成功之后,该镜像在本地磁盘存储时的tag。
+
+**\--cap-add**
+
+添加构建过程中RUN指令所需权限,用法:
+
+```sh
+isula-build ctr-img build --cap-add ${CAP}
+```
+
+使用举例:
+
+```sh
+sudo isula-build ctr-img build --cap-add CAP_SYS_ADMIN --cap-add CAP_SYS_PTRACE -f Dockerfile
+```
+
+>  **说明:**
+>
+> * isula-build最大支持并发构建100个容器镜像。
+> * isula-build支持Dockerfile最大为1MiB。
+> * isula-build支持 .dockerignore 最大为 1MiB。
+> * 用户需保证Dockerfile文件的权限为仅当前用户可读写,避免别的用户进行篡改。
+> * 构建时,RUN指令会启动容器在容器内进行构建,目前 isula-build 仅支持使用主机网络。
+> * isula-build 导出的镜像压缩格式,目前仅支持tar格式。
+> * isula-build 在每一个镜像构建stage完成后做一次提交,而不是每执行 Dockerfile的一行就提交一次。
+> * isula-build 暂不支持构建缓存。
+> * isula-build 仅在构建RUN指令时会启动构建容器。
+> * 目前不支持docker镜像格式的history功能。
+> * isula-build 的stage name支持以数字开头。
+> * isula-build 的stage name最长可为64个字符。
+> * isula-build 暂不支持对单次Dockerfile的构建进行资源限制。如有资源限制需求,可通过对 isula-builder 服务端配置资源限额的方式进行限制。
+> * isula-build 目前不支持Dockerfile里的ADD指令提供的数据来源是远端url。
+> * isula-build 使用docker-archive以及oci-archive类型导出的本地tar包未经压缩。如有需求,用户可以手动进行压缩。
+
+### image: 查看本地持久化构建镜像
+
+可通过images命令查看当前本地持久化存储的镜像:
+
+```sh
+$ sudo isula-build ctr-img images
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+REPOSITORY TAG IMAGE ID CREATED SIZE
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+localhost:5000/library/alpine latest a24bb4013296 2022-01-17 10:02:19 5.85 MB
+ 39b62a3342ee 2022-01-17 10:01:12 1.45 MB
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+```
+
+>  **说明:**
+>
+> 通过`isula-build ctr-img images`查看的镜像大小与`docker images`的显示上有一定差异。这是因为统计镜像大小时,isula-build是直接计算每层tar包大小之和,而docker是通过解压tar遍历diff目录计算文件大小之和,因此存在统计上的差异。
+
+### import: 导入容器基础镜像
+
+可以通过`ctr-img import`指令将rootfs形式的tar文件导入到isula-build中。
+
+命令原型如下:
+
+```sh
+isula-build ctr-img import [flags]
+```
+
+使用举例:
+
+```sh
+$ sudo isula-build ctr-img import busybox.tar mybusybox:latest
+Getting image source signatures
+Copying blob sha256:7b8667757578df68ec57bfc9fb7754801ec87df7de389a24a26a7bf2ebc04d8d
+Copying config sha256:173b3cf612f8e1dc34e78772fcf190559533a3b04743287a32d549e3c7d1c1d1
+Writing manifest to image destination
+Storing signatures
+Import success with image id: "173b3cf612f8e1dc34e78772fcf190559533a3b04743287a32d549e3c7d1c1d1"
+$ sudo isula-build ctr-img images
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+REPOSITORY TAG IMAGE ID CREATED SIZE
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+mybusybox latest 173b3cf612f8 2022-01-12 16:02:31 1.47 MB
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+```
+
+>  **说明:**
+>
+> isula-build 支持导入最大1GiB的容器基础镜像。
+
+### load: 导入层叠镜像
+
+层叠镜像指的是通过 docker save 或 isula-build ctr-img save 等指令,将一个构建完成的镜像保存至本地之后,镜像压缩包内是一层一层 layer.tar 的镜像包。可以通过 ctr-img load 指令将它导入至 isula-build。
+
+命令原型如下:
+
+```sh
+isula-build ctr-img load [flags]
+```
+
+目前支持的 flags 为:
+
+* -i, --input:本地tar包的路径
+
+使用举例如下:
+
+```sh
+$ sudo isula-build ctr-img load -i ubuntu.tar
+Getting image source signatures
+Copying blob sha256:cf612f747e0fbcc1674f88712b7bc1cd8b91cf0be8f9e9771235169f139d507c
+Copying blob sha256:f934e33a54a60630267df295a5c232ceb15b2938ebb0476364192b1537449093
+Copying blob sha256:943edb549a8300092a714190dfe633341c0ffb483784c4fdfe884b9019f6a0b4
+Copying blob sha256:e7ebc6e16708285bee3917ae12bf8d172ee0d7684a7830751ab9a1c070e7a125
+Copying blob sha256:bf6751561805be7d07d66f6acb2a33e99cf0cc0a20f5fd5d94a3c7f8ae55c2a1
+Copying blob sha256:c1bd37d01c89de343d68867518b1155cb297d8e03942066ecb44ae8f46b608a3
+Copying blob sha256:a84e57b779297b72428fc7308e63d13b4df99140f78565be92fc9dbe03fc6e69
+Copying blob sha256:14dd68f4c7e23d6a2363c2320747ab88986dfd43ba0489d139eeac3ac75323b2
+Copying blob sha256:a2092d776649ea2301f60265f378a02405539a2a68093b2612792cc65d00d161
+Copying blob sha256:879119e879f682c04d0784c9ae7bc6f421e206b95d20b32ce1cb8a49bfdef202
+Copying blob sha256:e615448af51b848ecec00caeaffd1e30e8bf5cffd464747d159f80e346b7a150
+Copying blob sha256:f610bd1e9ac6aa9326d61713d552eeefef47d2bd49fc16140aa9bf3db38c30a4
+Copying blob sha256:bfe0a1336d031bf5ff3ce381e354be7b2bf310574cc0cd1949ad94dda020cd27
+Copying blob sha256:f0f15db85788c1260c6aa8ad225823f45c89700781c4c793361ac5fa58d204c7
+Copying config sha256:c07ddb44daa97e9e8d2d68316b296cc9343ab5f3d2babc5e6e03b80cd580478e
+Writing manifest to image destination
+Storing signatures
+Loaded image as c07ddb44daa97e9e8d2d68316b296cc9343ab5f3d2babc5e6e03b80cd580478e
+```
+
+>  **说明:**
+>
+> * isula-build 支持导入最大50G的容器层叠镜像。
+> * isula-build 会自动识别容器层叠镜像的格式并进行导入。
+
+### rm: 删除本地持久化镜像
+
+可通过rm命令删除当前本地持久化存储的镜像。命令原型为:
+
+```sh
+isula-build ctr-img rm IMAGE [IMAGE...] [FLAGS]
+```
+
+目前支持的 flags 为:
+
+* -a, --all:删除所有本地持久化存储的镜像。
+* -p, --prune:删除所有没有tag的本地持久化存储的镜像。
+
+使用示例如下:
+
+```sh
+$ sudo isula-build ctr-img rm -p
+Deleted: sha256:78731c1dde25361f539555edaf8f0b24132085b7cab6ecb90de63d72fa00c01d
+Deleted: sha256:eeba1bfe9fca569a894d525ed291bdaef389d28a88c288914c1a9db7261ad12c
+```
+
+### save: 导出层叠镜像
+
+可通过save命令导出层叠镜像到本地磁盘。命令原型如下:
+
+```sh
+isula-build ctr-img save [REPOSITORY:TAG]|imageID -o xx.tar
+```
+
+目前支持的 flags 为:
+
+* -f, --format:导出层叠镜像的镜像格式:oci | docker(需开启实验特性选项)
+* -o, --output:本地tar包路径
+
+以下示例通过 `image/tag` 的形式将镜像进行导出:
+
+```sh
+$ sudo isula-build ctr-img save busybox:latest -o busybox.tar
+Getting image source signatures
+Copying blob sha256:50644c29ef5a27c9a40c393a73ece2479de78325cae7d762ef3cdc19bf42dd0a
+Copying blob sha256:824082a6864774d5527bda0d3c7ebd5ddc349daadf2aa8f5f305b7a2e439806f
+Copying blob sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
+Copying config sha256:21c3e96ac411242a0e876af269c0cbe9d071626bdfb7cc79bfa2ddb9f7a82db6
+Writing manifest to image destination
+Storing signatures
+Save success with image: busybox:latest
+```
+
+以下示例通过 `ImageID` 的形式将镜像进行导出:
+
+```sh
+$ sudo isula-build ctr-img save 21c3e96ac411 -o busybox.tar
+Getting image source signatures
+Copying blob sha256:50644c29ef5a27c9a40c393a73ece2479de78325cae7d762ef3cdc19bf42dd0a
+Copying blob sha256:824082a6864774d5527bda0d3c7ebd5ddc349daadf2aa8f5f305b7a2e439806f
+Copying blob sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
+Copying config sha256:21c3e96ac411242a0e876af269c0cbe9d071626bdfb7cc79bfa2ddb9f7a82db6
+Writing manifest to image destination
+Storing signatures
+Save success with image: 21c3e96ac411
+```
+
+以下示例导出多个镜像到同一个tar包:
+
+```sh
+$ sudo isula-build ctr-img save busybox:latest nginx:latest -o all.tar
+Getting image source signatures
+Copying blob sha256:eb78099fbf7fdc70c65f286f4edc6659fcda510b3d1cfe1caa6452cc671427bf
+Copying blob sha256:29f11c413898c5aad8ed89ad5446e89e439e8cfa217cbb404ef2dbd6e1e8d6a5
+Copying blob sha256:af5bd3938f60ece203cd76358d8bde91968e56491daf3030f6415f103de26820
+Copying config sha256:b8efb18f159bd948486f18bd8940b56fd2298b438229f5bd2bcf4cedcf037448
+Writing manifest to image destination
+Storing signatures
+Getting image source signatures
+Copying blob sha256:e2d6930974a28887b15367769d9666116027c411b7e6c4025f7c850df1e45038
+Copying config sha256:a33de3c85292c9e65681c2e19b8298d12087749b71a504a23c576090891eedd6
+Writing manifest to image destination
+Storing signatures
+Save success with image: [busybox:latest nginx:latest]
+```
+
+>  **说明:**
+>
+> * save 导出的镜像默认格式为未压缩的tar格式,如有需求,用户可以再save之后手动压缩。
+> * 在使用镜像名导出镜像时,需要给出完整的镜像名格式:REPOSITORY:TAG。
+
+### tag: 给本地持久化镜像打标签
+
+可使用tag命令给本地持久化的容器镜像打tag。命令原型如下:
+
+```sh
+isula-build ctr-img tag / busybox:latest
+```
+
+使用举例:
+
+```sh
+$ sudo isula-build ctr-img images
+--------------------------------------- ----------- ----------------- -------------------------- ------------
+REPOSITORY TAG IMAGE ID CREATED SIZE
+--------------------------------------- ----------- ----------------- -------------------------- ------------
+alpine latest a24bb4013296 2020-05-29 21:19:46 5.85 MB
+--------------------------------------- ----------- ----------------- -------------------------- ------------
+$ sudo isula-build ctr-img tag a24bb4013296 alpine:v1
+$ sudo isula-build ctr-img images
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+REPOSITORY TAG IMAGE ID CREATED SIZE
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+alpine latest a24bb4013296 2020-05-29 21:19:46 5.85 MB
+alpine v1 a24bb4013296 2020-05-29 21:19:46 5.85 MB
+--------------------------------------- ----------- ----------------- ------------------------ ------------
+```
+
+### pull: 拉取镜像到本地
+
+可通过pull命令拉取远程镜像仓库中的镜像到本地。命令原型如下:
+
+```sh
+isula-build ctr-img pull REPOSITORY[:TAG]
+```
+
+使用示例:
+
+```sh
+$ sudo isula-build ctr-img pull example-registry/library/alpine:latest
+Getting image source signatures
+Copying blob sha256:8f52abd3da461b2c0c11fda7a1b53413f1a92320eb96525ddf92c0b5cde781ad
+Copying config sha256:e4db68de4ff27c2adfea0c54bbb73a61a42f5b667c326de4d7d5b19ab71c6a3b
+Writing manifest to image destination
+Storing signatures
+Pull success with image: example-registry/library/alpine:latest
+```
+
+### push: 将本地镜像推送到远程仓库
+
+可通过push命令将本地镜像推送到远程仓库。命令原型如下:
+
+```sh
+isula-build ctr-img push REPOSITORY[:TAG]
+```
+
+目前支持的 flags 为:
+
+* -f, --format:推送的镜像格式:oci|docker(需开启实验特性选项)
+
+使用示例:
+
+```sh
+$ sudo isula-build ctr-img push example-registry/library/mybusybox:latest
+Getting image source signatures
+Copying blob sha256:d2421964bad195c959ba147ad21626ccddc73a4f2638664ad1c07bd9df48a675
+Copying config sha256:f0b02e9d092d905d0d87a8455a1ae3e9bb47b4aa3dc125125ca5cd10d6441c9f
+Writing manifest to image destination
+Storing signatures
+Push success with image: example-registry/library/mybusybox:latest
+```
+
+>  **说明:**
+>
+> 推送镜像时,需要先登录对应的镜像仓库
+
+## info: 查看运行环境与系统信息
+
+可以通过“isula-build info”指令查看 isula-build 目前的运行环境与系统信息。命令原型如下:
+
+```sh
+isula-build info [flags]
+```
+
+支持如下Flags:
+
+* -H, --human-readable 布尔值,以常用内存表示格式打印内存信息,使用1000次幂
+* -V, --verbose 布尔值,显示运行时内存占用信息
+
+使用示例:
+
+```sh
+$ sudo isula-build info -HV
+ General:
+ MemTotal: 7.63 GB
+ MemFree: 757 MB
+ SwapTotal: 8.3 GB
+ SwapFree: 8.25 GB
+ OCI Runtime: runc
+ DataRoot: /var/lib/isula-build/
+ RunRoot: /var/run/isula-build/
+ Builders: 0
+ Goroutines: 12
+ Store:
+ Storage Driver: overlay
+ Backing Filesystem: extfs
+ Registry:
+ Search Registries:
+ oepkgs.net
+ Insecure Registries:
+ localhost:5000
+ oepkgs.net
+ Runtime:
+ MemSys: 68.4 MB
+ HeapSys: 63.3 MB
+ HeapAlloc: 7.41 MB
+ MemHeapInUse: 8.98 MB
+ MemHeapIdle: 54.4 MB
+ MemHeapReleased: 52.1 MB
+```
+
+## login: 登录远端镜像仓库
+
+用户可以运行 login 命令来登录远程镜像仓库。命令原型如下:
+
+```sh
+ isula-build login SERVER [FLAGS]
+```
+
+目前支持的flag有:
+
+```Conf
+ Flags:
+ -p, --password-stdin Read password from stdin
+ -u, --username string Username to access registry
+```
+
+通过stdin输入密码。以下示例通过通过管道将creds.txt里的密码传给isula-build的stdin进行输入:
+
+```sh
+ $ cat creds.txt | sudo isula-build login -u cooper -p mydockerhub.io
+ Login Succeeded
+```
+
+通过交互式输入密码:
+
+```sh
+ $ sudo isula-build login mydockerhub.io -u cooper
+ Password:
+ Login Succeeded
+```
+
+## logout: 退出远端镜像仓库
+
+用户可以运行 logout 命令来登出远程镜像仓库。命令原型如下:
+
+```sh
+isula-build logout [SERVER] [FLAGS]
+```
+
+目前支持的flag有:
+
+```sh
+ Flags:
+ -a, --all Logout all registries
+```
+
+使用示例如下:
+
+```sh
+$ sudo isula-build logout -a
+ Removed authentications
+```
+
+## version: 版本查询
+
+可通过version命令查看当前版本信息:
+
+```sh
+$ sudo isula-build version
+Client:
+ Version: 0.9.6-4
+ Go Version: go1.15.7
+ Git Commit: 83274e0
+ Built: Wed Jan 12 15:32:55 2022
+ OS/Arch: linux/amd64
+
+Server:
+ Version: 0.9.6-4
+ Go Version: go1.15.7
+ Git Commit: 83274e0
+ Built: Wed Jan 12 15:32:55 2022
+ OS/Arch: linux/amd64
+```
+
+## manifest: manifest列表管理
+
+manifest列表包含不同系统架构对应的镜像信息,通过使用manifest列表,用户可以在不同的架构中使用相同的manifest(例如openeuler:latest)获取对应架构的镜像,manifest包含create、annotate、inspect和push子命令。
+>  **说明:**
+>
+> manifest为实验特性,使用时需开启客户端和服务端的实验选项,方式详见客户端总体说明和配置服务章节。
+
+### create: manifest列表创建
+
+manifest的子命令create用于创建manifest列表,命令原型为:
+
+```sh
+isula-build manifest create MANIFEST_LIST MANIFEST [MANIFEST...]
+```
+
+用户可以指定manifest列表的名称以及需要加入到列表中的远程镜像,若不指定任何远程镜像,则会创建一个空的manifest列表。
+
+使用示例如下:
+
+```sh
+sudo isula-build manifest create openeuler localhost:5000/openeuler_x86:latest localhost:5000/openeuler_aarch64:latest
+```
+
+### annotate: manifest列表更新
+
+manifest的子命令annotate用于更新manifest列表,命令原型为:
+
+```sh
+isula-build manifest annotate MANIFEST_LIST MANIFEST [flags]
+```
+
+用户可以指定需要更新的manifest列表以及其中的镜像,通过flags指定需要更新的选项,此命令也可用于添加新的镜像到列表中。
+
+其中annotate包含如下flags:
+
+* --arch: string,重写镜像适用架构
+* --os: string,重写镜像适用系统
+* --os-features: string列表,指定镜像需要的OS特性,很少使用
+* --variant: string,指定列表中记录镜像的变量
+
+使用示例如下:
+
+```sh
+sudo isula-build manifest annotate --os linux --arch arm64 openeuler:latest localhost:5000/openeuler_aarch64:latest
+```
+
+### inspect: manifest列表查询
+
+manifest子命令inspect用于查询manifest列表信息,命令原型为:
+
+```sh
+isula-build manifest inspect MANIFEST_LIST
+```
+
+使用示例如下:
+
+```sh
+$ sudo isula-build manifest inspect openeuler:latest
+{
+ "schemaVersion": 2,
+ "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
+ "manifests": [
+ {
+ "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
+ "size": 527,
+ "digest": "sha256:bf510723d2cd2d4e3f5ce7e93bf1e52c8fd76831995ac3bd3f90ecc866643aff",
+ "platform": {
+ "architecture": "amd64",
+ "os": "linux"
+ }
+ },
+ {
+ "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
+ "size": 527,
+ "digest": "sha256:f814888b4bb6149bd39ba8375a1932fb15071b4dbffc7f76c7b602b06abbb820",
+ "platform": {
+ "architecture": "arm64",
+ "os": "linux"
+ }
+ }
+ ]
+}
+```
+
+### push: 将manifest列表推送到远程仓库
+
+manifest子命令push用于将manifest列表推送到远程仓库,命令原型为:
+
+```sh
+isula-build manifest push MANIFEST_LIST DESTINATION
+```
+
+使用示例如下:
+
+```sh
+sudo isula-build manifest push openeuler:latest localhost:5000/openeuler:latest
+```
+
+# 直接集成容器引擎
+
+isula-build可以与iSulad和docker集成,将构建好的容器镜像导入到容器引擎的本地存储中。
+
+## 与iSulad集成
+
+支持将构建成功的镜像直接导出到iSulad。
+
+命令行举例:
+
+```sh
+sudo isula-build ctr-img build -f Dockerfile -o isulad:busybox:2.0
+```
+
+通过在-o参数中指定iSulad,将构建好的容器镜像导出到iSulad,可以通过isula images查询:
+
+```sh
+$ sudo isula images
+isula images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox 2.0 2d414a5cad6d 2020-08-01 06:41:36 5.577 MB
+```
+
+>  **说明:**
+>
+> * 要求isula-build和iSulad在同一节点。
+> * 直接导出镜像到iSulad时,isula-build client端需要将构建成功的镜像暂存成 `/var/lib/isula-build/tmp/[buildid]/isula-build-tmp-%v.tar` 再导入至 iSulad,用户需要保证 /var/lib/isula-build/tmp/ 目录有足够磁盘空间;同时如果在导出过程中 isula-build client进程被KILL或Ctrl+C终止,需要依赖用户手动清理 `/var/lib/isula-build/tmp/[buildid]/isula-build-tmp-%v.tar` 文件。
+
+## 与Docker集成
+
+支持将构建成功的镜像直接导出到Docker daemon。
+
+命令行举例:
+
+```sh
+sudo isula-build ctr-img build -f Dockerfile -o docker-daemon:busybox:2.0
+```
+
+通过在-o参数中指定docker-daemon,将构建好的容器镜像导出到docker, 可以通过docker images查询。
+
+```sh
+$ sudo docker images
+REPOSITORY TAG IMAGE ID CREATED SIZE
+busybox 2.0 2d414a5cad6d 2 months ago 5.22MB
+```
+
+>  **说明:**
+>
+> 要求isula-build和Docker在同一节点。
+
+# 使用注意事项
+
+本章节主要介绍在使用isula-build构建镜像时相关的约束和限制,以及与docker build的差异。
+
+## 约束和限制
+
+1. 当导出镜像到[`iSulad`](https://gitee.com/openeuler/iSulad/blob/master/README.md/)时,镜像必须指明tag。
+2. 因为isula-builder运行`RUN`指令时,需要调用系统中的oci 运行时(如`runc`),用户需要保证该运行时的安全性,不受篡改。
+3. `DataRoot`不能设置在内存盘上(tmpfs)。
+4. `Overlay2`是目前isula-builder唯一支持的存储驱动。
+5. `Docker`镜像是目前唯一支持的镜像格式,未来即将支持`oci`格式镜像。
+6. `Dockerfile`文件权限强烈建议设置为**0600**以防止恶意篡改。
+7. `RUN`命令中目前只支持主机侧网络(host network)。
+8. 当导出镜像到本地tar包时,目前只支持保存为`tar`格式。
+9. 当使用`import`功能导入基础镜像时,最大支持**1G**。
+
+## 与“docker build”差异
+
+`isula-build`兼容[Docker镜像格式规范](https://docs.docker.com/engine/reference/builder/),但仍然和`docker build`存在一些差异:
+
+1. 支持镜像压缩,即对每个`stage`进行提交而非每一行。
+2. 目前不支持构建缓存。
+3. 只有`RUN`指令会运行容器进行构建。
+4. 目前不支持查询镜像构建历史。
+5. `Stage`名称可以用数字开头。
+6. `Stage`名称最大长度为64。
+7. `ADD`命令不支持远端URL格式。
+8. 暂不支持对单次构建进行资源限额,可采取对isula-builder配置资源限额的方式进行限制。
+9. 统计镜像大小时,isula-build是直接计算每层tar包大小之和,而docker是通过解压tar遍历diff目录计算文件大小之和,因此通过`isula-build ctr-img images`查看的镜像大小与`docker images`的显示上有一定差异。
+10. 操作时的镜像名称需要明确,格式为IMAGE_NAME:IMAGE_TAG。例如 busybox:latest, 其中latest不可省略。
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/overview.md b/docs/en/25.03/Cloud/ImageBuilder/isula-build/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..67e98d6f48ca701fd3f59d820aa1066e2c7257ac
--- /dev/null
+++ b/docs/en/25.03/Cloud/ImageBuilder/isula-build/overview.md
@@ -0,0 +1,11 @@
+# 容器镜像构建
+
+isula-build是iSula容器团队推出的容器镜像构建工具,支持通过Dockerfile文件快速构建容器镜像。
+
+isula-build采用服务端/客户端模式。其中,isula-build为客户端,提供了一组命令行工具,用于镜像构建及管理等;isula-builder为服务端,用于处理客户端管理请求,作为守护进程常驻后台。
+
+
+
+>  **说明:**
+>
+> isula-build当前支持OCI镜像格式([OCI Image Format Specification](https://github.com/opencontainers/image-spec/blob/main/spec.md/))以及Docker镜像格式([Image Manifest Version 2, Schema 2](https://docs.docker.com/registry/spec/manifest-v2-2/))。通过命令`export ISULABUILD_CLI_EXPERIMENTAL=enabled`开启实验特性以支持OCI镜像格式。不开启实验特性时,isula-build默认采用Docker镜像格式;当开启实验特性后,将默认采用OCI镜像格式。
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-caution.gif b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-danger.gif b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-note.gif b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-notice.gif b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-tip.gif b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-warning.gif b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Cloud/ImageBuilder/isula-build/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/_menu.md b/docs/en/25.03/Cloud/Kmesh/Kmesh/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..83190a6946c3dd42af885686afd153f68515d1a1
--- /dev/null
+++ b/docs/en/25.03/Cloud/Kmesh/Kmesh/_menu.md
@@ -0,0 +1,18 @@
+---
+label: 'Kmesh用户指南'
+ismanual: 'Y'
+description: 'openEuler系统高性能服务网格数据面软件'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '认识Kmesh'
+ href: './getting-to-know-kmesh.md'
+ - label: '安装与部署'
+ href: './installation-and-deployment.md'
+ - label: '使用方法'
+ href: './usage.md'
+ - label: '常见问题与解决方法'
+ href: './faqs.md'
+ - label: '附录'
+ href: './appendixes.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/appendixes.md b/docs/en/25.03/Cloud/Kmesh/Kmesh/appendixes.md
new file mode 100644
index 0000000000000000000000000000000000000000..59b86f94ad67534866cb2e20abc826bebd3bd785
--- /dev/null
+++ b/docs/en/25.03/Cloud/Kmesh/Kmesh/appendixes.md
@@ -0,0 +1,3 @@
+# 附录
+
+更详细的使用说明可访问[Kmesh](https://gitee.com/openeuler/Kmesh#kmesh)项目首页获取。
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/faqs.md b/docs/en/25.03/Cloud/Kmesh/Kmesh/faqs.md
new file mode 100644
index 0000000000000000000000000000000000000000..eab2cba82cd4416c1798ad786f93f9f8478f79b6
--- /dev/null
+++ b/docs/en/25.03/Cloud/Kmesh/Kmesh/faqs.md
@@ -0,0 +1,23 @@
+# 常见问题与解决方法
+
+## **问题1:在使用集群启动模式时,若没有配置控制面程序ip信息,Kmesh服务启动后会报错退出**
+
+
+
+原因:集群启动模式下,Kmesh服务需要跟控制面程序通信,然后从控制面获取配置信息,因此需要设置正确的控制面程序ip信息。
+
+解决方法:参考[安装与部署](./installation-and-deployment.md)章节中集群启动模式,设置正确的控制面程序ip信息。
+
+## **问题2:Kmesh服务在启动时,提示"get kube config error!"**
+
+
+
+原因:集群启动模式下,Kmesh服务会根据k8s的配置,自动获取控制面程序ip信息,若环境中没有配置k8s的kubeconfig路径,会导致获取kubeconfig失败,然后提示上述信息。(若已经手动修改Kmesh的配置文件,正确配置控制面程序ip信息,该问题可忽略)
+
+解决方法:按如下方式配置kubeconfig:
+
+```shell
+mkdir -p $HOME/.kube
+sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
+sudo chown $(id -u):$(id -g) $HOME/.kube/config
+```
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/get_kubeconfig_error.png b/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/get_kubeconfig_error.png
new file mode 100644
index 0000000000000000000000000000000000000000..99087b68c6fafea1506e5f8bd862c371e93bdc97
Binary files /dev/null and b/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/get_kubeconfig_error.png differ
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/kmesh-arch.png b/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/kmesh-arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..000ec80ff35556199caef6ce78953599c1c52312
Binary files /dev/null and b/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/kmesh-arch.png differ
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/not_set_cluster_ip.png b/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/not_set_cluster_ip.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c879f37fa93c0f4fe0ab0f6220beff174e5f436
Binary files /dev/null and b/docs/en/25.03/Cloud/Kmesh/Kmesh/figures/not_set_cluster_ip.png differ
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/getting-to-know-kmesh.md b/docs/en/25.03/Cloud/Kmesh/Kmesh/getting-to-know-kmesh.md
new file mode 100644
index 0000000000000000000000000000000000000000..d82f45f673d721178235b9202323c81f7f59b94f
--- /dev/null
+++ b/docs/en/25.03/Cloud/Kmesh/Kmesh/getting-to-know-kmesh.md
@@ -0,0 +1,38 @@
+# 认识Kmesh
+
+## 简介
+
+随着越来越多的应用云原生化,云上应用的规模、应用SLA诉求等都对云基础设施提出了很高的要求。
+
+基于k8s的云基础设施能够帮助应用实现敏捷的部署管理,但在应用流量编排方面有所欠缺,serviceMesh的出现很好的弥补了k8s流量编排的缺陷,与k8s互补,真正实现敏捷的云应用开发运维;但随着对serviceMesh应用的逐步深入,当前基于sidecar的网格架构在数据面存在明显的性能缺陷,已成为业界共识的问题:
+
+* 时延性能差
+ 以serviceMesh典型软件istio为例,网格化后,服务访问单跳时延增加2.65ms;无法满足时延敏感型应用诉求
+
+* 底噪开销大
+ istio中,每个sidecar软件占用内存50M+,CPU默认独占2 core,对于大规模集群底噪开销太大,降低了业务容器的部署密度
+
+Kmesh基于可编程内核,将网格流量治理下沉OS,数据路径3跳->1跳,大幅提升网格数据面的时延性能,帮助业务快速创新。
+
+## 架构
+
+Kmesh总体架构如下图所示:
+
+
+
+Kmesh的主要部件包括:
+
+* kmesh-controller:
+ kmesh管理程序,负责Kmesh生命周期管理、XDS协议对接、观测运维等功能
+
+* kmesh-api:
+ kmesh对外提供的api接口层,主要包括:xds转换后的编排API、观测运维通道等
+
+* kmesh-runtime:
+ kernel中实现的支持L3~L7流量编排的运行时
+
+* kmesh-orchestration:
+ 基于ebpf实现L3~L7流量编排,如路由、灰度、负载均衡等
+
+* kmesh-probe:
+ 观测运维探针,提供端到端观测能力
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/installation-and-deployment.md b/docs/en/25.03/Cloud/Kmesh/Kmesh/installation-and-deployment.md
new file mode 100644
index 0000000000000000000000000000000000000000..690bee66b471b4aefbfcdc3ba7d08fb57d0ebaf2
--- /dev/null
+++ b/docs/en/25.03/Cloud/Kmesh/Kmesh/installation-and-deployment.md
@@ -0,0 +1,101 @@
+# 安装与部署
+
+## 软件要求
+
+* 操作系统:openEuler 23.09
+
+## 硬件要求
+
+* x86_64架构
+
+## 环境准备
+
+* 安装openEuler系统,安装方法参考 《[安装指南](../../../Server/InstallationUpgrade/Installation/installation.md)》。
+
+* 安装Kmesh需要使用root权限。
+
+## 安装Kmesh
+
+* 安装Kmesh软件包,参考命令如下:
+
+```shell
+[root@openEuler ~]# yum install Kmesh
+```
+
+* 查看安装是否成功,参考命令如下,若回显有对应软件包,表示安装成功:
+
+```shell
+[root@openEuler ~]# rpm -q Kmesh
+```
+
+## 部署Kmesh
+
+### 集群启动模式
+
+启动前,先进行配置修改,设置集群中控制面程序ip信息(如istiod ip地址),操作如下:
+
+```json
+ "clusters": [
+ {
+ "name": "xds-grpc",
+ "type" : "STATIC",
+ "connect_timeout": "1s",
+ "lb_policy": "ROUND_ROBIN",
+ "load_assignment": {
+ "cluster_name": "xds-grpc",
+ "endpoints": [{
+ "lb_endpoints": [{
+ "endpoint": {
+ "address":{
+ "socket_address": {
+ "protocol": "TCP",
+ "address": "192.168.0.1",# 设置控制面ip(如istiod ip)
+ "port_value": 15010
+ }
+ }
+ }
+ }]
+ }]
+```
+
+当前集群启动模式下仅支持Kmesh流量编排功能。
+
+### 本地启动模式
+
+启动前,修改kmesh.service,选择需要使用的功能选项。
+
+使用流量编排功能,操作如下:
+
+```shell
+# 选择-enable-kmesh,禁用ads开关
+[root@openEuler ~]# vim /usr/lib/systemd/system/kmesh.service
+ExecStart=/usr/bin/kmesh-daemon -enable-kmesh -enable-ads=false
+[root@openEuler ~]# systemctl daemon-reload
+```
+
+使用网格加速功能,操作如下:
+
+```shell
+# 选择-enable-mda选项,禁用ads开关
+[root@openEuler ~]# vim /usr/lib/systemd/system/kmesh.service
+ExecStart=/usr/bin/kmesh-daemon -enable-mda -enable-ads=false
+[root@openEuler ~]# systemctl daemon-reload
+```
+
+Kmesh服务启动时会调用kmesh-daemon程序,具体使用方式可以参考[kmesh-daemon使用](./usage.md)。
+
+### 启动Kmesh
+
+```shell
+# 启动Kmesh服务
+[root@openEuler ~]# systemctl start kmesh.service
+# 查看Kmesh运行状态
+[root@openEuler ~]# systemctl status kmesh.service
+```
+
+### 停止Kmesh
+
+```shell
+# 停止Kmesh服务
+[root@openEuler ~]# systemctl stop kmesh.service
+```
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/overview.md b/docs/en/25.03/Cloud/Kmesh/Kmesh/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..611ee4e6b6004e3f36603cd533b3ae3f82ad9031
--- /dev/null
+++ b/docs/en/25.03/Cloud/Kmesh/Kmesh/overview.md
@@ -0,0 +1,5 @@
+# Kmesh用户指南
+
+本文档介绍openEuler系统高性能服务网格数据面软件Kmesh的安装部署与使用方法,以指导用户快速了解并使用Kmesh。
+
+本文档适用于使用openEuler系统并希望了解和使用Kmesh的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备基本的Linux操作系统知识。
diff --git a/docs/en/25.03/Cloud/Kmesh/Kmesh/usage.md b/docs/en/25.03/Cloud/Kmesh/Kmesh/usage.md
new file mode 100644
index 0000000000000000000000000000000000000000..8b604c9bfef0466b6852692fe36b3c50c01db89e
--- /dev/null
+++ b/docs/en/25.03/Cloud/Kmesh/Kmesh/usage.md
@@ -0,0 +1,76 @@
+# 使用方法
+
+## kmesh-daemon使用
+
+```shell
+# 命令help
+[root@openEuler ~]# kmesh-daemon -h
+Usage of kmesh-daemon:
+ -bpf-fs-path string
+ bpf fs path (default "/sys/fs/bpf")
+ -cgroup2-path string
+ cgroup2 path (default "/mnt/kmesh_cgroup2")
+ -config-file string
+ [if -enable-kmesh] deploy in kube cluster (default "/etc/kmesh/kmesh.json")
+ -enable-ads
+ [if -enable-kmesh] enable control-plane from ads (default true)
+ -enable-kmesh
+ enable bpf kmesh
+ -enable-mda
+ enable mda
+ -service-cluster string
+ [if -enable-kmesh] TODO (default "TODO")
+ -service-node string
+ [if -enable-kmesh] TODO (default "TODO")
+
+# 默认使能ads
+[root@openEuler ~]# kmesh-daemon -enable-kmesh
+
+# 使能ads,并指定配置文件路径
+[root@openEuler ~]# kmesh-daemon -enable-kmesh -enable-ads=true -config-file=/examples/kmesh.json
+
+# 不使能ads
+[root@openEuler ~]# kmesh-daemon -enable-kmesh -enable-ads=false
+
+# 使能sockmap加速
+[root@openEuler ~]# kmesh-daemon -enable-mda -enable-ads=false
+```
+
+## kmesh-cmd使用
+
+```shell
+# 命令help
+[root@openEuler ~]# kmesh-cmd -h
+Usage of kmesh-cmd:
+ -config-file string
+ input config-resources to bpf maps (default "./config-resources.json")
+
+# 手动加载配置
+[root@openEuler ~]# kmesh-cmd -config-file=/examples/config-resources.json
+```
+
+## 运维相关命令使用
+
+```shell
+# 命令help
+[root@openEuler ~]# curl http://localhost:15200/help
+ /help: print list of commands
+ /options: print config options
+ /bpf/kmesh/maps: print bpf kmesh maps in kernel
+ /controller/envoy: print control-plane in envoy cache
+ /controller/kubernetes: print control-plane in kubernetes cache
+
+# 读取加载的配置
+[root@openEuler ~]# curl http://localhost:15200/bpf/kmesh/maps
+[root@openEuler ~]# curl http://localhost:15200/options
+```
+
+## 注意事项
+
+* -enable-ads=true时,Kmesh从服务网格控制面自动接收编排规则,此配置下,不要使用kmesh-cmd命令下发规则,避免多次配置。
+
+* -bpf-fs-path选项用于指定系统的bpf文件系统路径,kmesh bpf程序相关的数据会存放在该路径下,默认路径为/sys/fs/bpf。
+
+* -cgroup2-path选项用于指定系统cgroup路径,默认路径为/mnt/kmesh_cgroup2。
+
+* -enable-kmesh和-enable-mda当前不支持同时使用,同一时刻只能使用其中一种。
diff --git a/docs/en/25.03/Cloud/KubeOS/KubeOS/_menu.md b/docs/en/25.03/Cloud/KubeOS/KubeOS/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..ffbc4d0644b636b967966f84e66bd6fe13ffec86
--- /dev/null
+++ b/docs/en/25.03/Cloud/KubeOS/KubeOS/_menu.md
@@ -0,0 +1,16 @@
+---
+label: '容器OS升级用户指南'
+ismanual: 'Y'
+description: 'KubeOS是专为容器化业务涉及的轻量级操作系统,支持原子化升级,确保版本一致性,降低运维复杂性'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '认识容器OS升级'
+ href: './about-kubeos.md'
+ - label: '安装与部署'
+ href: './installation-and-deployment.md'
+ - label: '使用方法'
+ href: './usage-instructions.md'
+ - label: '容器OS镜像制作指导'
+ href: './kubeos-image-creation.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/KubeOS/KubeOS/about-kubeos.md b/docs/en/25.03/Cloud/KubeOS/KubeOS/about-kubeos.md
new file mode 100644
index 0000000000000000000000000000000000000000..ae57ffb2d09fb8338cf9e18b9abe1fa061474db2
--- /dev/null
+++ b/docs/en/25.03/Cloud/KubeOS/KubeOS/about-kubeos.md
@@ -0,0 +1,39 @@
+# 认识容器 OS 升级
+
+## 概述
+
+在云场景中,容器和 kubernetes 的应用越来越广泛。然而,当前对容器和 OS 进行独立管理的方式,往往面临功能冗余、两套调度系统协同困难的问题。另外,OS 的版本管理比较困难,相同版本的 OS 在使用过程中会各自安装、更新、删除软件包,一段时间后 OS 版本变得不一致,导致版本分裂,并且 OS 可能和业务紧耦合,造成大版本升级等比较困难。为了应对上述问题,openEuler 推出了基于openEuler的容器 OS 升级工具。
+
+容器 OS 针对业务以容器的形式运行的场景,专门设计的一种轻量级操作系统。基于openEuler的容器 OS 升级工具将容器 OS 作为组件接入 kubernetes,使容器 OS 和业务处于同等地位,通过 kubernetes 集群统一管理容器和容器 OS,实现一套系统管理容器和OS。
+
+openEuler 容器 OS 升级工具通过 kubernetes operator 扩展机制控制容器 OS 的升级流程,对容器 OS 进行整体升级,从而实现 OS 管理器和业务协同,该升级方式会在容器 OS 升级前,将业务迁移到其他非升级节点,减少 OS 升级、配置过程中对业务的影响。该升级方式是对容器 OS 进行原子升级,使 OS 一直向预想的状态同步,保证集群里的 OS 版本一致,避免版本分裂问题。
+
+## 架构介绍
+
+### 容器 OS 升级架构
+
+**图1** 容器 OS 升级架构
+
+
+
+如图所示,容器 OS 主要包含三个组件 os-operator,os-proxy 和 os-agent 。os-operator 和 os-proxy 运行在容器中,部署在 kubernetes 集群内;os-agent 不属于集群,直接作为进程运行在 Worker Node 中。
+
+- os-operator:全局的容器 OS 管理器,持续查看所有节点的容器 OS 版本信息,并根据用户配置的信息控制同时进行升级的节点个数,并标记准备升级的节点。
+
+- os-proxy:单节点的 OS 管理器,持续查看当前节点的容器 OS 版本信息。如果当前节点被 os-operator 标记为准备升级的节点后,锁定节点并驱逐 pod,转发升级信息到 os-agent 。
+
+- os-agent:接收来自 proxy 的信息,从 OSImage Server 下载用于更新的容器 OS 镜像,然后进行升级并重启节点。
+
+### 容器 OS 文件系统
+
+**图 2** 容器 OS 文件系统布局
+
+
+
+如图所示,容器 OS 包含四个分区:
+
+- boot 分区:grub2文件分区
+- Persist 分区:用于存放持久性用户数据,容器 OS 升级时,该分区的数据也会保留。
+- 两个 root 分区:容器 OS 采用双分区模式,将 root 分区划分为 rootA 和 rootB。假定初始化时,系统运行在 rootA 分区上,当进行系统更新时,会下载新系统到 rootB 分区,grub会有两个启动项分别为A,B,将 grub 默认启动项设置为B,最后会重启虚拟机。虚拟机启动后容器 OS 将运行在刚更新过的 rootB 分区上。
+
+容器OS的root文件系统为只读,用户的持久化数据存放在Persist持久化数据分区 。
diff --git "a/docs/en/25.03/Cloud/KubeOS/KubeOS/figures/\345\256\271\345\231\250OS\346\226\207\344\273\266\345\270\203\345\261\200.png" "b/docs/en/25.03/Cloud/KubeOS/KubeOS/figures/\345\256\271\345\231\250OS\346\226\207\344\273\266\345\270\203\345\261\200.png"
new file mode 100644
index 0000000000000000000000000000000000000000..7dfdcb3aaef79462ecc196159659b22cb21b9a9d
Binary files /dev/null and "b/docs/en/25.03/Cloud/KubeOS/KubeOS/figures/\345\256\271\345\231\250OS\346\226\207\344\273\266\345\270\203\345\261\200.png" differ
diff --git "a/docs/en/25.03/Cloud/KubeOS/KubeOS/figures/\345\256\271\345\231\250OS\346\236\266\346\236\204.png" "b/docs/en/25.03/Cloud/KubeOS/KubeOS/figures/\345\256\271\345\231\250OS\346\236\266\346\236\204.png"
new file mode 100644
index 0000000000000000000000000000000000000000..626071e62735bab2e33ec2a6f1a5839409d33319
Binary files /dev/null and "b/docs/en/25.03/Cloud/KubeOS/KubeOS/figures/\345\256\271\345\231\250OS\346\236\266\346\236\204.png" differ
diff --git a/docs/en/25.03/Cloud/KubeOS/KubeOS/installation-and-deployment.md b/docs/en/25.03/Cloud/KubeOS/KubeOS/installation-and-deployment.md
new file mode 100644
index 0000000000000000000000000000000000000000..c4f8ffcbb1706a72dcde655a804524b337e68091
--- /dev/null
+++ b/docs/en/25.03/Cloud/KubeOS/KubeOS/installation-and-deployment.md
@@ -0,0 +1,183 @@
+# 安装与部署
+
+本章介绍如何安装和部署容器 OS 升级工具。
+
+## 软硬件要求
+
+### 硬件要求
+
+- 当前仅支持 x86和 AArch64 架构
+
+### 软件要求
+
+- 操作系统:openEuler 24.09
+
+### 环境准备
+
+- 安装 openEuler 系统,安装方法参考《[安装指南](../../../Server/InstallationUpgrade/Installation/installation.md)》
+- 安装 qemu-img,bc,parted,tar,yum,docker,dosfstools
+
+## 安装容器OS升级工具
+
+安装容器 OS 升级工具的操作步骤如下:
+
+1. 配置 openEuler 24.09 yum 源:
+
+ ```conf
+ [openEuler24.09] # openEuler 24.09 官方发布源
+ name=openEuler24.09
+ baseurl=http://repo.openeuler.org/openEuler-24.09/everything/$basearch/
+ enabled=1
+ gpgcheck=1
+ gpgkey=http://repo.openeuler.org/openEuler-24.09/everything/$basearch/RPM-GPG-KEY-openEuler
+ ```
+
+2. 使用 root 帐户安装容器 OS 升级工具:
+
+ ```shell
+ # yum install KubeOS KubeOS-scripts -y
+ ```
+
+> **说明**:
+>
+> 容器 OS 升级工具会安装在 /opt/kubeOS 目录下,包括os-operator,os-proxy,os-agent二进制,制作容器 OS 工具及相应配置文件 。
+
+## 部署容器OS升级工具
+
+容器OS升级工具安装完成后,需要对此进行配置部署,本章介绍如何配置和部署容器OS升级工具。
+
+### 制作os-operator和os-proxy镜像
+
+#### 环境准备
+
+使用 Docker 制作容器镜像,请先确保 Docker 已经安装和配置完成。
+
+#### 操作步骤
+
+1. 进入工作目录。
+
+ ```shell
+ cd /opt/kubeOS
+ ```
+
+2. 指定 proxy 的镜像仓库、镜像名及版本。
+
+ ```shell
+ export IMG_PROXY=your_imageRepository/os-proxy_imageName:version
+ ```
+
+3. 指定 operator 的镜像仓库、镜像名及版本。
+
+ ```shell
+ export IMG_OPERATOR=your_imageRepository/os-operator_imageName:version
+ ```
+
+4. 请用户自行编写Dockerfile来构建镜像 ,Dockfile编写请注意以下几项
+
+ - os-operator和os-proxy镜像需要基于baseimage进行构建,请用户保证baseimage的安全性
+ - 需将os-operator和os-proxy二进制文件分别拷贝到对应的镜像中
+ - 请确保os-proxy镜像中os-proxy二进制文件件属主和属组为root,文件权限为500
+ - 请确保os-operator镜像中os-operator二进制文件属主和属组为容器内运行os-operator进程的用户,文件权限为500
+ - os-operator和os-proxy的二进制文件在镜像内的位置和容器启动时运行的命令需与部署的yaml中指定的字段相对应。
+
+ Dockerfile示例如下
+
+ ```shell
+ FROM your_baseimage
+ COPY ./bin/proxy /proxy
+ ENTRYPOINT ["/proxy"]
+ ```
+
+ ```shell
+ FROM your_baseimage
+ COPY --chown=6552:6552 ./bin/operator /operator
+ ENTRYPOINT ["/operator"]
+ ```
+
+ Dockerfile也可以使用多阶段构建。
+
+5. 构建容器镜像(os-operator 和 os-proxy 镜像)。
+
+ ```shell
+ # 指定proxy的Dockerfile地址
+ export DOCKERFILE_PROXY=your_dockerfile_proxy
+ # 指定operator的Dockerfile路径
+ export DOCKERFILE_OPERATOR=your_dockerfile_operator
+ # 镜像构建
+ docker build -t ${IMG_OPERATOR} -f ${DOCKERFILE_OPERATOR} .
+ docker build -t ${IMG_PROXY} -f ${DOCKERFILE_PROXY} .
+ ```
+
+6. 将容器镜像 push 到镜像仓库。
+
+ ```shell
+ docker push ${IMG_OPERATOR}
+ docker push ${IMG_PROXY}
+ ```
+
+### 制作容器OS虚拟机镜像
+
+#### 注意事项
+
+- 以虚拟机镜像为例,如需进行物理机的镜像制作请见《容器OS镜像制作指导》
+- 制作容器OS 镜像需要使用 root 权限
+- 容器OS 镜像制作工具的 rpm 包源为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库
+- 使用默认 rpmlist 制作的容器OS虚拟机镜像,默认和制作工具保存在相同路径,该分区至少有 25GiB 的剩余磁盘空间
+- 制作容器 OS 镜像时,不支持用户自定义配置挂载文件
+
+#### 操作步骤
+
+制作容器OS 虚拟机镜像使用 kbimg.sh 脚本,命令详情请见《容器OS镜像制作指导》
+
+制作容器OS 虚拟机镜像的步骤如下:
+
+1. 进入执行目录:
+
+ ```shell
+ cd /opt/kubeOS/scripts
+ ```
+
+2. 执行 kbming.sh 制作容器OS,参考命令如下:
+
+ ```shell
+ bash kbimg.sh create vm-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0'''
+ ```
+
+ 其中 xx.repo 为制作镜像所需要的 yum 源,yum 源建议配置为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。
+
+ 容器 OS 镜像制作完成后,会在 /opt/kubeOS/scripts 目录下生成:
+
+ - raw格式的系统镜像system.img,system.img大小默认为20G,支持的根文件系统分区大小<2560MiB,持久化分区<14GB。
+ - qcow2 格式的系统镜像 system.qcow2。
+ - 可用于升级的根文件系统分区镜像 update.img。
+
+ 制作出来的容器 OS 虚拟机镜像目前只能用于 CPU 架构为 x86 和 AArch64 的虚拟机场景,不支持 x86 架构的虚拟机使用 legacy 启动模式启动。
+
+### 部署CRD,operator和proxy
+
+#### 注意事项
+
+- 请先部署 Kubernetes 集群,部署方法参考《openEuler 24.09 Kubernetes 集群部署指南》
+
+- 集群中准备进行升级的 Worker 节点的 OS 需要为使用上一节方式制作出来的容器 OS,如不是,请用 system.qcow2重新部署虚拟机,虚拟机部署请见《openEuler 24.09 虚拟化用户指南》,Master节点目前不支持容器 OS 升级,请用openEuler 24.09部署Master节点
+- 部署 OS 的 CRD(CustomResourceDefinition),os-operator,os-proxy 以及 RBAC (Role-based access control) 机制的 YAML 需要用户自行编写。
+- operator 和 proxy 部署在 kubernetes 集群中,operator 应部署为 deployment,proxy 应部署为damonset
+- 尽量部署好 kubernetes 的安全措施,如 rbac 机制,pod 的 service account 和 security policy 配置等
+
+#### 操作步骤
+
+1. 准备 YAML 文件,包括用于部署 OS 的CRD、RBAC 机制、os- operator 和os- proxy 的 YAML 文件,可参考[yaml-example](https://gitee.com/openeuler/KubeOS/tree/master/docs/example/config)。假设分别为 crd.yaml、rbac.yaml、manager.yaml 。
+
+2. 部署 CRD、RBAC、os-operator 和 os-proxy。假设 crd.yaml、rbac.yaml、manager.yaml 文件分别存放在当前目录的 config/crd、config/rbac、config/manager 目录下 ,参考命令如下:
+
+ ```shell
+ kubectl apply -f config/crd
+ kubectl apply -f config/rbac
+ kubectl apply -f config/manager
+ ```
+
+3. 部署完成后,执行以下命令,确认各个组件是否正常启动。如果所有组件的 STATUS 为 Running,说明组件已经正常启动。
+
+ ```shell
+ kubectl get pods -A
+ ```
diff --git a/docs/en/25.03/Cloud/KubeOS/KubeOS/kubeos-image-creation.md b/docs/en/25.03/Cloud/KubeOS/KubeOS/kubeos-image-creation.md
new file mode 100644
index 0000000000000000000000000000000000000000..21b229b3a3c234167609ae87d3253d444dcfae99
--- /dev/null
+++ b/docs/en/25.03/Cloud/KubeOS/KubeOS/kubeos-image-creation.md
@@ -0,0 +1,169 @@
+# 容器OS镜像制作指导
+
+## 简介
+
+kbimg是KubeOS部署和升级所需的镜像制作工具,可以使用kbimg制作KubeOS docker,虚拟机和物理机镜像。
+
+## 命令介绍
+
+### 命令格式
+
+**bash kbimg.sh** \[ --help | -h \] create \[ COMMANDS \] \[ OPTIONS \]
+
+### 参数说明
+
+* COMMANDS
+
+ | 参数 | 描述 |
+ | ------------- | ---------------------------------------------- |
+ | upgrade-image | 生成用于安装和升级的OCI镜像格式的 KubeOS 镜像 |
+ | vm-image | 生成用于部署和升级的虚拟机镜像 |
+ | pxe-image | 生成物理机安装所需的镜像及文件 |
+
+* OPTIONS
+
+ | 参数 | 描述 |
+ | ------------ | ------------------------------------------------------------ |
+ | -p | repo 文件的路径,repo 文件中配置制作镜像所需要的 yum 源 |
+ | -v | 制作出来的KubeOS镜像的版本 |
+ | -b | os-agent二进制的路径 |
+ | -e | KubeOS 镜像 root 用户密码,加密后的带盐值的密码,可以用 openssl,kiwi 命令生成 |
+ | -d | 生成或者使用的 docke r镜像 |
+ | -h --help | 查看帮助信息 |
+
+## 使用说明
+
+### 注意事项
+
+* kbimg.sh 执行需要 root 权限
+* 当前仅支持 x86和 AArch64 架构使用
+* 容器 OS 镜像制作工具的 rpm 包源为 openEuler 具体版本的 everything 仓库和 EPOL 仓库。制作镜像时提供的 repo 文件中,yum 源建议同时配置 openEuler 具体版本的 everything 仓库和 EPOL 仓库
+
+### KubeOS OCI 镜像制作
+
+#### 注意事项
+
+* 制作的 OCI 镜像仅用于后续的虚拟机/物理机镜像制作或升级使用,不支持启动容器
+* 使用默认 rpmlist 进行容器OS镜像制作时所需磁盘空间至少为6G,如自已定义 rpmlist 可能会超过6G
+
+#### 使用示例
+
+* 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件
+
+```shell
+ cd /opt/kubeOS/scripts
+ touch resolv.conf
+ vim resolv.conf
+```
+
+* 制作KubeOS容器镜像
+
+``` shell
+cd /opt/kubeOS/scripts
+bash kbimg.sh create upgrade-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0''' -d your_imageRepository/imageName:version
+```
+
+* 制作完成后查看制作出来的KubeOS容器镜像
+
+``` shell
+docker images
+```
+
+### KubeOS 虚拟机镜像制作
+
+#### 注意事项
+
+* 如使用 docker 镜像制作请先拉取相应镜像或者先制作docker镜像,并保证 docker 镜像的安全性
+* 制作出来的容器 OS 虚拟机镜像目前只能用于 CPU 架构为 x86 和 AArch64 的虚拟机
+* 容器 OS 目前不支持 x86 架构的虚拟机使用 legacy 启动模式启动
+* 使用默认rpmlist进行容器OS镜像制作时所需磁盘空间至少为25G,如自已定义rpmlist可能会超过25G
+
+#### 使用示例
+
+* 使用repo源制作
+ * 如需进行DNS配置,请先在```scripts```目录下自定义```resolv.conf```文件
+
+ ```shell
+ cd /opt/kubeOS/scripts
+ touch resolv.conf
+ vim resolv.conf
+ ```
+
+ * KubeOS虚拟机镜像制作
+
+ ``` shell
+ cd /opt/kubeOS/scripts
+ bash kbimg.sh create vm-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0'''
+ ```
+
+* 使用docker镜像制作
+
+ ``` shell
+ cd /opt/kubeOS/scripts
+ bash kbimg.sh create vm-image -d your_imageRepository/imageName:version
+ ```
+
+* 结果说明
+ 容器 OS 镜像制作完成后,会在 /opt/kubeOS/scripts 目录下生成:
+ * system.qcow2: qcow2 格式的系统镜像,大小默认为 20GiB,支持的根文件系统分区大小 < 2020 MiB,持久化分区 < 16GiB 。
+ * update.img: 用于升级的根文件系统分区镜像
+
+### KubeOS 物理机安装所需镜像及文件制作
+
+#### 注意事项
+
+* 如使用 docker 镜像制作请先拉取相应镜像或者先制作 docker 镜像,并保证 docker 镜像的安全性
+* 制作出来的容器 OS 物理安装所需的镜像目前只能用于 CPU 架构为 x86 和 AArch64 的物理机安装
+* Global.cfg配置中指定的ip为安装时使用的临时ip,请在系统安装启动后请参考《openEuler 22.09 管理员指南-配置网络》进行网络配置
+* 不支持多个磁盘都安装KubeOS,可能会造成启动失败或挂载紊乱
+* 容器OS 目前不支持 x86 架构的物理机使用 legacy 启动模式启动
+* 使用默认rpmlist进行镜像制作时所需磁盘空间至少为5G,如自已定义 rpmlist 可能会超过5G
+
+#### 使用示例
+
+* 首先需要修改```00bootup/Global.cfg```的配置,对相关参数进行配置,参数均为必填,ip目前仅支持ipv4,配置示例如下
+
+ ```shell
+ # rootfs file name
+ rootfs_name=kubeos.tar
+ # select the target disk to install kubeOS
+ disk=/dev/sda
+ # pxe server ip address where stores the rootfs on the http server
+ server_ip=192.168.1.50
+ # target machine temporary ip
+ local_ip=192.168.1.100
+ # target machine temporary route
+ route_ip=192.168.1.1
+ # target machine temporary netmask
+ netmask=255.255.255.0
+ # target machine netDevice name
+ net_name=eth0
+ ```
+
+* 使用 repo 源制作
+ * 如需进行DNS配置,请在```scripts```目录下自定义```resolv.conf```文件
+
+ ```shell
+ cd /opt/kubeOS/scripts
+ touch resolv.conf
+ vim resolv.conf
+ ```
+
+ * KubeOS物理机安装所需镜像制作
+
+ ```shell
+ cd /opt/kubeOS/scripts
+ bash kbimg.sh create pxe-image -p xxx.repo -v v1 -b ../bin/os-agent -e '''$1$xyz$RdLyKTL32WEvK3lg8CXID0'''
+ ```
+
+* 使用 docker 镜像制作
+
+ ``` shell
+ cd /opt/kubeOS/scripts
+ bash kbimg.sh create pxe-image -d your_imageRepository/imageName:version
+ ```
+
+* 结果说明
+
+ * initramfs.img: 用于pxe启动用的 initramfs 镜像
+ * kubeos.tar: pxe安装所用的 OS
diff --git a/docs/en/25.03/Cloud/KubeOS/KubeOS/overview.md b/docs/en/25.03/Cloud/KubeOS/KubeOS/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..3b9405aa48795ce6ede124d3aa67b17f00c590d9
--- /dev/null
+++ b/docs/en/25.03/Cloud/KubeOS/KubeOS/overview.md
@@ -0,0 +1,8 @@
+# 容器OS升级指南
+
+本文档介绍基于openEuler系统的容器OS升级特性的安装部署和使用方法,容器OS升级是使OS可以通过标准扩展方式接入调度系统,通过调度系统管理集群内节点的OS的升级。
+
+本文档适用于使用openEuler系统并希望了解和使用容器OS的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备以下经验和技能:
+
+* 熟悉Linux基本操作。
+* 对kubernetes和docker有一定了解
diff --git a/docs/en/25.03/Cloud/KubeOS/KubeOS/public_sys-resources/icon-note.gif b/docs/en/25.03/Cloud/KubeOS/KubeOS/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Cloud/KubeOS/KubeOS/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Cloud/KubeOS/KubeOS/usage-instructions.md b/docs/en/25.03/Cloud/KubeOS/KubeOS/usage-instructions.md
new file mode 100644
index 0000000000000000000000000000000000000000..ad0d0294a900e713929149665255a4c4b7b9f7db
--- /dev/null
+++ b/docs/en/25.03/Cloud/KubeOS/KubeOS/usage-instructions.md
@@ -0,0 +1,503 @@
+# 使用方法
+
+## 注意事项
+
+- 公共注意事项
+ - 仅支持虚拟机和物理机x86和arm64 UEFI场景。
+ - 使用kubectl apply通过YAML创建或更新OS的CR时,不建议并发apply,当并发请求过多时,kube-apiserver会无法处理请求导致失败。
+ - 如用户配置了容器镜像仓的证书或密钥,请用户保证证书或密钥文件的权限最小。
+- 升级注意事项
+ - 升级为所有软件包原子升级,默认不提供单包升级能力。
+ - 升级为双区升级的方式,不支持更多分区数量。
+ - 当前暂不支持跨大版本升级。
+ - 单节点的升级过程的日志可在节点的 /var/log/messages 文件查看。
+ - 请严格按照提供的升级和回退流程进行操作,异常调用顺序可能会导致系统无法升级或回退。
+ - 节点上containerd如需配置ctr使用的私有镜像,请将配置文件host.toml按照ctr指导放在/etc/containerd/certs.d目录下。
+ - 使用OCI 镜像升级和mtls双向认证仅支持 openEuler 22.09 及之后的版本
+ - nodeselector、executionmode、timewindow和timeinterval 仅支持openEuler 24.09及之后版本
+ - KubeOS 24.09 版本与历史版本不兼容
+
+- 配置注意事项
+ - 用户自行指定配置内容,用户需保证配置内容安全可靠 ,尤其是持久化配置(kernel.sysctl.persist、grub.cmdline.current、grub.cmdline.next),KubeOS不对参数有效性进行检验。
+ - opstype=config时,若osversion与当前集群节点的OS版本不一致,配置不会进行。
+ - 当前仅支持kernel参数临时配置(kernel.sysctl)、持久化配置(kernel.sysctl.persist)和grub cmdline配置(grub.cmdline.current和grub.cmdline.next)。
+ - 持久化配置会写入persist持久化分区,升级重启后配置保留;kernel参数临时配置重启后不保留。
+ - 配置grub.cmdline.current或grub.cmdline.next时,如为单个参数(非key=value格式参数),请指定key为该参数,value为空。
+ - 进行配置删除(operation=delete)时,key=value形式的配置需保证key、value和实际配置一致。
+ - 配置不支持回退,如需回退,请修改配置版本和配置内容,重新下发配置。
+ - 配置出现错误,节点状态陷入config时,请将配置版本恢复成上一版本并重新下发配置,从而使节点恢复至idel状态。 但是请注意:出现错误前已经配置完成的参数无法恢复。
+ - 在配置grub.cmdline.current或grub.cmdline.next时,若需要将已存在的“key=value”格式的参数更新为只有key无value格式,比如将“rd.info=0”更新成rd.info,需要先删除“key=value”,然后在下一次配置时,添加key。不支持直接更新或者更新删除动作在同一次完成。
+
+## OS CR参数说明
+
+在集群中创建类别为OS的定制对象,设置相应字段。类别OS来自于安装和部署章节创建的CRD对象,字段及说明如下:
+
+- imageurl指定的地址里包含协议,只支持http或https协议。imageurl为https协议时为安全传输,imageurl为http地址时,需指定flagSafe为true,即用户明确该地址为安全时,才会下载镜像。如imageurl为http地址且没有指定flagSafe为true,默认该地址不安全,不会下载镜像并且在升级节点的日志中提示用户该地址不安全。
+- 对于imageurl,推荐使用https协议,使用https协议需要升级的机器已安装相应证书。如果镜像服务器由用户自己维护,需要用户自己进行签名,并保证升级节点已安装对应证书。用户需要将证书放在容器OS```/etc/KubeOS/certs```目录下。地址由管理员传入,管理员应该保证网址的安全性,推荐采用内网地址。
+- 容器OS镜像的合法性检查需要由容器OS镜像服务提供者做合法性检查,确保下载的容器OS镜像来源可靠。
+- 集群存在多OS版本即存在多个OS的实例时,OS的nodeselector字段需要与其他OS不同,即通过label区分的一类node只能对应一个OS实例:
+ - 当有OS的nodeselector为all-label时,集群只能存在这一个OS的有效实例(有效实例为存在与这个OS对应的节点)。
+ - nodeselector不配置的OS也只能有一个,因为nodeselector不配置时认为是对没有label的节点进行操作。
+- timewinterval参数说明:
+ - 参数不设置时默认为15s。
+ - 参数设置为0时,由于k8s controller-runtime的rate limit限制,operator下发任务的时间间隔会逐渐增加直至1000s。
+ - 并行时为每批次operator下发升级/配置的时间间隔。
+ - 在串行时为每批次节点串行升级完毕后与下次升级/配置下发的时间间隔,批次内部的时间间隔为15s。
+ - OS的实例字段进行更新会立刻触发operator。
+
+ | 参数 |参数类型 | 参数说明 | 使用说明 | 是否必选 |
+ | -------------- | ------ | ------------------------------------------------------------ | ----- | ---------------- |
+ | imagetype | string | 升级镜像的类型 | 仅支持docker ,containerd ,或者是 disk,仅在升级场景有效。**注意**:若使用containerd,agent优先使用crictl工具拉取镜像,没有crictl时才会使用ctr命令拉取镜像。使用ctr拉取镜像时,镜像如果在私有仓内,需按照[官方文档](https://github.com/containerd/containerd/blob/main/docs/hosts.md)在/etc/containerd/certs.d目录下配置私有仓主机信息,才能成功拉取镜像。 |是 |
+ | opstype | string | 操作类型:升级,回退或者配置 | 仅支持upgrade ,config 或者 rollback |是 |
+ | osversion | string | 升级/回退的目标版本 | osversion需与节点的目标os版本对应(节点上/etc/os-release中PRETTY_NAME字段或k8s检查到的节点os版本) 例如:KubeOS 1.0.0。 |是 |
+ | maxunavailable | int | 每批同时进行升级/回退/配置的节点数。 | maxunavailable值大于实际节点数时,取实际节点数进行升级/回退/配置。 |是 |
+ | containerimage | string | 用于升级的容器镜像 | 仅在imagetype是容器类型时生效,仅支持以下3种格式的容器镜像地址: repository/name repository/name@sha256:xxxx repository/name:tag |是 |
+ | imageurl | string | 用于升级的磁盘镜像的地址 | imageurl中包含协议,只支持http或https协议,例如:```https://192.168.122.15/update.img``` ,仅在使用磁盘镜像升级场景下有效 |是 |
+ | checksum | string | 用于升级的磁盘镜像校验的checksum(SHA-256)值或者是用于升级的容器镜像的digests值 | 仅在升级场景下有效 |是 |
+ | flagSafe | bool | 当imageurl的地址使用http协议表示是否是安全的 | 需为 true 或者 false ,仅在imageurl使用http协议时有效 |是 |
+ | mtls | bool | 用于表示与imageurl连接是否采用https双向认证 | 需为 true 或者 false ,仅在imageurl使用https协议时有效|是 |
+ | cacert | string | https或者https双向认证时使用的根证书文件 | 仅在imageurl使用https协议时有效| imageurl使用https协议时必选 |
+ | clientcert | string | https双向认证时使用的客户端证书文件 | 仅在使用https双向认证时有效|mtls为true时必选 |
+ | clientkey | string | https双向认证时使用的客户端公钥 | 仅在使用https双向认证时有效|mtls为true时必选 |
+ | evictpodforce | bool | 升级/回退时是否强制驱逐pod | 需为 true 或者 false ,仅在升级或者回退时有效| 必选 |
+ | sysconfigs | / | 配置设置 | 1. “opstype=config”时只进行配置。 2.“opstype=upgrade/rollback”时,代表升级/回退后配置,即在升级/回退重启后进行配置,详细字段说明请见[配置(Settings)指导](#配置settings指导) | “opstype=config”时必选 |
+ | upgradeconfigs | / | 升级前配置设置 | 在升级或者回退时有效,在升级或者回退操作之前起效,详细字段说明请见[配置(Settings)指导](#配置settings指导)| 可选 |
+ | nodeselector | string | 需要进行升级/配置/回滚操作的节点label | 用于只对具有某些特定label的节点而不是集群所有worker节点进行运维的场景,需要进行运维操作的节点需要包含key为upgrade.openeuler.org/node-selector的label,nodeselector为该label的value值。 注意事项: 1.此参数不配置时,或者配置为“no-label”时对没有upgrade.openeuler.org/node-selector的节点进行操作 2.此参数为“”时,对具有upgrade.openeuler.org/node-selector=“”的节点进行操作 3.如需忽略label,对所有节点进行操作,需指定此参数为all-label| 可选 |
+ | timewindow | / | 升级/配置/回滚操作的时间窗口 |1.指定时间窗口时starttime和endtime都需指定,即二者需要同时为空或者同时不为空 2.starttime和endtime类型为string,需要为YYYY-MM-DD HH:MM:SS格式或者HH:MM:SS格式,且二者格式需一致 3.为HH:MM:SS格式时,starttime \< endtime认为starttime是下一天的该时间 4.timewindow不配置时默认为不存在时间窗限制| 可选 |
+ | timeinterval | int | 升级/配置/回滚操作每批次任务下发的时间间隔 |参数单位为秒,时间间隔为operator下发任务的时间间隔,如k8s集群繁忙无法立即响应operator请求,实际时间间隔可能会大于指定时间| 可选 |
+ | executionmode | string | 升级/配置/回滚操作执行的方式 |仅支持serial或者parallel,即串行或者并行,当次参数不设置时,默认采用并行的方式| 可选 |
+
+## 升级指导
+
+1. 编写YAML文件,在集群中部署 OS 的cr实例,用于部署cr实例的YAML示例如下,假定将上面的YAML保存到upgrade_v1alpha1_os.yaml;
+
+ - 使用磁盘镜像进行升级
+
+ ```yaml
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: disk
+ opstype: upgrade
+ osversion: edit.os.version
+ maxunavailable: edit.node.upgrade.number
+ containerimage: ""
+ evictpodforce: true/false
+ imageurl: edit.image.url
+ checksum: image.checksum
+ flagSafe: imageurl.safety
+ mtls: imageurl use mtls or not
+ cacert: ca certificate
+ clientcert: client certificate
+ clientkey: client certificate key
+ ```
+
+ - 使用容器镜像进行升级
+ - 使用容器镜像进行升级前请先制作升级所需的容器镜像,制作方式请见[《容器OS镜像制作指导》](./kubeos-image-creation.md)中 [KubeOS OCI 镜像制作](./kubeos-image-creation.md#kubeos-oci-镜像制作)
+ - 节点容器引擎为docker
+
+ ```shell
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: docker
+ opstype: upgrade
+ osversion: edit.os.version
+ maxunavailable: edit.node.upgrade.number
+ containerimage: container image like repository/name:tag
+ evictpodforce: true/false
+ imageurl: ""
+ checksum: container image digests
+ flagSafe: false
+ mtls: true
+ ```
+
+ - 节点容器引擎为containerd
+
+ ```yaml
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: containerd
+ opstype: upgrade
+ osversion: edit.os.version
+ maxunavailable: edit.node.upgrade.number
+ containerimage: container image like repository/name:tag
+ evictpodforce: true/false
+ imageurl: ""
+ checksum: container image digests
+ flagSafe: false
+ mtls: true
+ ```
+
+ - 升级并且进行配置的示例如下
+ - 以节点容器引擎为containerd为例,升级方式对配置无影响,upgradeconfigs在升级前起效,sysconfigs在升级后起效,配置参数说明请见[配置(Settings)指导](#配置settings指导)
+ - 升级并且配置时opstype字段需为upgrade
+ - upgradeconfig为升级之前执行的配置,sysconfigs为升级机器重启后执行的配置,用户可按需进行配置
+
+ ```yaml
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: ""
+ opstype: upgrade
+ osversion: edit.os.version
+ maxunavailable: edit.node.upgrade.number
+ containerimage: ""
+ evictpodforce: true/false
+ imageurl: ""
+ checksum: container image digests
+ flagSafe: false
+ mtls: false
+ sysconfigs:
+ version: edit.os.version
+ configs:
+ - model: kernel.sysctl
+ contents:
+ - key: kernel param key1
+ value: kernel param value1
+ - key: kernel param key2
+ value: kernel param value2
+ - model: kernel.sysctl.persist
+ configpath: persist file path
+ contents:
+ - key: kernel param key3
+ value: kernel param value3
+ - key: ""
+ value: ""
+ upgradeconfigs:
+ version: 1.0.0
+ configs:
+ - model: kernel.sysctl
+ contents:
+ - key: kernel param key4
+ value: kernel param value4
+ ```
+
+ - 设置nodeselector、timewindow、timeinterval、executionmode升级部分节点示例如下
+ - 以节点容器引擎为containerd为例,升级方式对节点筛选无影响
+ - 需要进行升级的节点需包含key为upgrade.openeuler.org/node-selector的label,nodeselector的值为该label的value,即假定nodeselector值为kubeos,则只对包含upgrade.openeuler.org/node-selector=kubeos的label的worker节点进行升级
+ - nodeselector、timewindow、timeinterval、executionmode对配置和回滚同样有效
+ - 节点添加label、修改label、删除label和查看label命令示例如下:
+
+ ```shell
+ # 为节点kubeos-node1增加label
+ kubectl label nodes kubeos-node1 upgrade.openeuler.org/node-selector=kubeos-v1
+ # 修改节点kubeos-node1的label
+ kubectl label --overwrite nodes kubeos-node1 upgrade.openeuler.org/node-selector=kubeos-v2
+ # 删除节点kubeos-node1的label
+ kubectl label nodes kubeos-node1 upgrade.openeuler.org/node-selector-
+ # 查看节点的label
+ kubectl get nodes --show-labels
+ ```
+
+ - yaml示例如下:
+
+ ```yaml
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: containerd
+ opstype: upgrade
+ osversion: edit.os.version
+ maxunavailable: edit.node.upgrade.number
+ containerimage: container image like repository/name:tag
+ evictpodforce: true/false
+ imageurl: ""
+ checksum: container image digests
+ flagSafe: false
+ mtls: true
+ nodeselector: edit.node.label.key
+ timewindow:
+ starttime: "HH::MM::SS/YYYY-MM-DD HH::MM::SS"
+ endtime: "HH::MM::SS/YYYY-MM-DD HH::MM::SS"
+ timeinterval: time intervel like 30
+ executionmode: serial/parallel
+ ```
+
+2. 查看未升级的节点的 OS 版本
+
+ ```shell
+ kubectl get nodes -o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.osImage'
+ ```
+
+3. 执行命令,在集群中部署cr实例后,节点会根据配置的参数信息进行升级。
+
+ ```shell
+ kubectl apply -f upgrade_v1alpha1_os.yaml
+ ```
+
+4. 再次查看节点的 OS 版本来确认节点是否升级完成
+
+ ```shell
+ kubectl get nodes -o custom-columns='NAME:.metadata.name,OS:.status.nodeInfo.osImage'
+ ```
+
+5. 如果后续需要再次升级,与上面相同,对upgrade_v1alpha1_os.yaml的相应字段进行修改
+
+> **说明**:
+>
+> 如果后续需要再次升级,与上面相同对 upgrade_v1alpha1_os.yaml 的 imageurl ,osversion,checksum,maxunavailable,flagSafe 或者dockerimage字段进行相应修改。
+
+## 配置(Settings)指导
+
+- Settings参数说明:
+
+ 基于示例YAML对配置的参数进行说明,示例YAML如下,配置的格式(缩进)需和示例保持一致:
+
+ ```yaml
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: ""
+ opstype: config
+ osversion: edit.os.version
+ maxunavailable: edit.node.config.number
+ containerimage: ""
+ evictpodforce: false
+ checksum: ""
+ sysconfigs:
+ version: edit.sysconfigs.version
+ configs:
+ - model: kernel.sysctl
+ contents:
+ - key: kernel param key1
+ value: kernel param value1
+ - key: kernel param key2
+ value: kernel param value2
+ operation: delete
+ - model: kernel.sysctl.persist
+ configpath: persist file path
+ contents:
+ - key: kernel param key3
+ value: kernel param value3
+ - model: grub.cmdline.current
+ contents:
+ - key: boot param key1
+ - key: boot param key2
+ value: boot param value2
+ - key: boot param key3
+ value: boot param value3
+ operation: delete
+ - model: grub.cmdline.next
+ contents:
+ - key: boot param key4
+ - key: boot param key5
+ value: boot param value5
+ - key: boot param key6
+ value: boot param value6
+ operation: delete
+ ```
+
+ 配置的参数说明如下:
+
+ | 参数 | 参数类型 | 参数说明 | 使用说明 | 配置中是否必选 |
+ | ---------- | -------- | --------------------------- | ------------------------------------------------------------ | ----------------------- |
+ | version | string | 配置的版本 | 通过version是否相等来判断配置是否触发,version为空(为""或者没有值)时同样进行判断,所以不配置sysconfigs/upgradeconfigs时,继存的version值会被清空并触发配置。 | 是 |
+ | configs | / | 具体配置内容 | 包含具体配置项列表。 | 是 |
+ | model | string | 配置的类型 | 支持的配置类型请看附录下的[Settings列表](#setting-列表) | 是 |
+ | configpath | string | 配置文件路径 | 仅在kernel.sysctl.persist配置类型中生效,请看附录下的[Settings列表](#setting-列表)对配置文件路径的说明。 | 否 |
+ | contents | / | 具体key/value的值及操作类型 | 包含具体配置参数列表。 | 是 |
+ | key | string | 参数名称 | key不能为空,不能包含"=",不建议配置含空格、tab键的字符串,具体请看附录下的[Settings列表](#setting-列表)中每种配置类型对key的说明。 | 是 |
+ | value | string | 参数值 | key=value形式的参数中,value不能为空,不建议配置含空格、tab键的字符串,具体请看附录下的[Settings列表](#setting-列表)中对每种配置类型对value的说明。 | key=value形式的参数必选 |
+ | operation | string | 对参数进行的操作 | 仅对kernel.sysctl.persist、grub.cmdline.current、grub.cmdline.next类型的参数生效。默认为添加或更新。仅支持配置为delete,代表删除已存在的参数(key=value需完全一致才能删除)。 | 否 |
+
+ - upgradeconfigs与sysconfigs参数相同,upgradeconfigs为升级/回退前进行的配置,仅在upgrade/rollback场景起效,sysconfigs既支持只进行配置,也支持在升级/回退重启后进行配置
+
+- 使用说明
+
+ - 编写YAML文件,在集群中部署 OS 的cr实例,用于部署cr实例的YAML示例如上,假定将上面的YAML保存到upgrade_v1alpha1_os.yaml
+
+ - 查看配置之前的节点的配置的版本和节点状态(NODESTATUS状态为idle)
+
+ ```shell
+ kubectl get osinstances -o custom-columns='NAME:.metadata.name,NODESTATUS:.spec.nodestatus,SYSCONFIG:status.sysconfigs.version,UPGRADECONFIG:status.upgradeconfigs.version'
+ ```
+
+ - 执行命令,在集群中部署cr实例后,节点会根据配置的参数信息进行配置,再次查看节点状态(NODESTATUS变成config)
+
+ ```shell
+ kubectl apply -f upgrade_v1alpha1_os.yaml
+ kubectl get osinstances -o custom-columns='NAME:.metadata.name,NODESTATUS:.spec.nodestatus,SYSCONFIG:status.sysconfigs.version,UPGRADECONFIG:status.upgradeconfigs.version'
+ ```
+
+ - 再次查看节点的配置的版本确认节点是否配置完成(NODESTATUS恢复为idle)
+
+ ```shell
+ kubectl get osinstances -o custom-columns='NAME:.metadata.name,NODESTATUS:.spec.nodestatus,SYSCONFIG:status.sysconfigs.version,UPGRADECONFIG:status.upgradeconfigs.version'
+ ```
+
+- 如果后续需要再次配置,与上面相同对 upgrade_v1alpha1_os.yaml 的相应字段进行相应修改。
+
+## 回退指导
+
+- 回退场景
+ - 虚拟机无法正常启动时,可在grub启动项页面手动切换启动项,使系统回退至上一版本(即手动回退)。
+ - 虚拟机能够正常启动并且进入系统时,支持工具回退和手动回退,建议使用工具回退。
+ - 工具回退有两种方式:
+ 1. rollback模式直接回退至上一版本。
+ 2. upgrade模式重新升级至上一版本。
+- 手动回退指导
+ - 手动重启虚拟机,进入启动项页面后,选择第二启动项进行回退,手动回退仅支持回退到上一个版本。
+- 工具回退指导
+ - 回退至任意版本
+ 1. 修改 OS 的cr实例的YAML 配置文件(例如 upgrade_v1alpha1_os.yaml),设置相应字段为期望回退的老版本镜像信息。类别OS来自于安装和部署章节创建的CRD对象,字段说明及示例请见上一节升级指导。
+ 2. YAML修改完成后执行更新命令,在集群中更新定制对象后,节点会根据配置的字段信息进行回退
+
+ ```bash
+ kubectl apply -f upgrade_v1alpha1_os.yaml
+ ```
+
+ - 回退至上一版本
+ - OS回退至上一版本:修改upgrade_v1alpha1_os.yaml,设置osversion为上一版本,opstype为rollback,回退至上一版本(即切换至上一分区)。YAML示例如下:
+
+ ```yaml
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: ""
+ opstype: rollback
+ osversion: KubeOS previous version
+ maxunavailable: 2
+ containerimage: ""
+ evictpodforce: true/false
+ imageurl: ""
+ checksum: ""
+ flagSafe: false
+ mtls: true
+ ```
+
+ - 配置回退至上一版本:修改upgrade_v1alpha1_os.yaml,设置sysconfigs/upgradeconfigs的version为上一版本,回退至上一版本(已配置的参数无法回退)。YAML示例如下:
+
+ ```yaml
+ apiVersion: upgrade.openeuler.org/v1alpha1
+ kind: OS
+ metadata:
+ name: os-sample
+ spec:
+ imagetype: ""
+ opstype: config
+ osversion: edit.os.version
+ maxunavailable: edit.node.config.number
+ containerimage: ""
+ evictpodforce: true/false
+ imageurl: ""
+ checksum: ""
+ flagSafe: false
+ mtls: false
+ sysconfigs:
+ version: previous config version
+ configs:
+ - model: kernel.sysctl
+ contents:
+ - key: kernel param key1
+ value: kernel param value1
+ - key: kernel param key2
+ value: kernel param value2
+ - model: kernel.sysctl.persist
+ configpath: persist file path
+ contents:
+ - key: kernel param key3
+ value: kernel param value3
+ ```
+
+ - YAML修改完成后执行更新命令,在集群中更新定制对象后,节点会根据配置的字段信息进行回退
+
+ ```shell
+ kubectl apply -f upgrade_v1alpha1_os.yaml
+ ```
+
+ 更新完成后,节点会根据配置信息回退容器 OS。
+ - 查看节点容器 OS 版本(回退OS版本)或节点config版本&节点状态为idle(回退config版本),确认回退是否成功。
+
+ ```shell
+ kubectl get osinstances -o custom-columns='NAME:.metadata.name,NODESTATUS:.spec.nodestatus,SYSCONFIG:status.sysconfigs.version,UPGRADECONFIG:status.upgradeconfigs.version'
+ ```
+
+## 附录
+
+### Setting 列表
+
+#### kernel Settings
+
+- kernel.sysctl:临时设置内核参数,重启后无效,key/value 表示内核参数的 key/value, key与value均不能为空且key不能包含“=”,该参数不支持删除操作(operation=delete)示例如下:
+
+ ```yaml
+ configs:
+ - model: kernel.sysctl
+ contents:
+ - key: user.max_user_namespaces
+ value: 16384
+ - key: net.ipv4.tcp_tw_recycle
+ value: 0
+ operation: delete
+ ```
+
+- kernel.sysctl.persist: 设置持久化内核参数,key/value表示内核参数的key/value,key与value均不能为空且key不能包含“=”, configpath为配置文件路径,支持新建(需保证父目录存在),如不指定configpath默认修改/etc/sysctl.conf,示例如下:
+
+ ```yaml
+ configs:
+ - model: kernel.sysctl.persist
+ configpath : /etc/persist.conf
+ contents:
+ - key: user.max_user_namespaces
+ value: 16384
+ - key: net.ipv4.tcp_tw_recycle
+ value: 0
+ operation: delete
+ ```
+
+#### Grub Settings
+
+- grub.cmdline.current/next: 设置grub.cfg文件中的内核引导参数,该行参数在grub.cfg文件中类似如下示例:
+
+ ```shell
+ linux /boot/vmlinuz root=/dev/sda2 ro rootfstype=ext4 nomodeset quiet oops=panic softlockup_panic=1 nmi_watchdog=1 rd.shell=0 selinux=0 crashkernel=256M panic=3
+ ```
+
+ - KubeOS使用双分区,grub.cmdline.current/next支持对当前分区或下一分区进行配置:
+
+ - grub.cmdline.current:对当前分区的启动项参数进行配置。
+ - grub.cmdline.next:对下一分区的启动项参数进行配置。
+
+ - 注意:升级/回退前后的配置,始终基于升级/回退操作下发时的分区位置进行current/next的区分。假设当前分区为A分区,下发升级操作并在sysconfigs(升级重启后配置)中配置grub.cmdline.current,重启后进行配置时仍修改A分区对应的grub cmdline。
+
+ - grub.cmdline.current/next支持“key=value”(value不能为空),也支持单key。若value中有“=”,例如“root=UUID=some-uuid”,key应设置为第一个“=”前的所有字符,value为第一个“=”后的所有字符。 配置方法示例如下:
+
+ ```yaml
+ configs:
+ - model: grub.cmdline.current
+ contents:
+ - key: selinux
+ value: "0"
+ - key: root
+ value: UUID=e4f1b0a0-590e-4c5f-9d8a-3a2c7b8e2d94
+ - key: panic
+ value: "3"
+ operation: delete
+ - key: crash_kexec_post_notifiers
+ - model: grub.cmdline.next
+ contents:
+ - key: selinux
+ value: "0"
+ - key: root
+ value: UUID=e4f1b0a0-590e-4c5f-9d8a-3a2c7b8e2d94
+ - key: panic
+ value: "3"
+ operation: delete
+ - key: crash_kexec_post_notifiers
+ ```
diff --git a/docs/en/25.03/Cloud/NestOS/NestOS/_menu.md b/docs/en/25.03/Cloud/NestOS/NestOS/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..378fcc9f6aa8a731dce93d80ef1f09554be45fec
--- /dev/null
+++ b/docs/en/25.03/Cloud/NestOS/NestOS/_menu.md
@@ -0,0 +1,12 @@
+---
+label: 'NestOS用户指南'
+ismanual: 'Y'
+description: 'NestOS是为容器化设计的轻量级操作系统,采用双分区院子更新,确保安全可靠'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: 'NestOS For Container用户指南'
+ href: './nestos-for-container.md'
+ - label: '功能特性描述'
+ href: './feature-description.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Cloud/NestOS/NestOS/feature-description.md b/docs/en/25.03/Cloud/NestOS/NestOS/feature-description.md
new file mode 100644
index 0000000000000000000000000000000000000000..d916f2ba5f73096ca4faa328532f378040d77a0f
--- /dev/null
+++ b/docs/en/25.03/Cloud/NestOS/NestOS/feature-description.md
@@ -0,0 +1,105 @@
+# 功能特性描述
+
+## 容器技术
+
+NestOS通过容器化 (containerized) 的运算环境向应用程序提供运算资源,应用程序之间共享系统内核和资源,但是彼此之间又互不可见。这意味着应用程序将不会再被直接安装到操作系统中,而是通过 容器引擎(Docker、Podman、iSulad等) 运行在容器中。大大降低了操作系统、应用程序及运行环境之间的耦合度。相对于传统的应用程序部署部署方式而言,在NestOS 集群中部署应用程序更加灵活便捷,应用程序运行环境之间的干扰更少,而且操作系统自身的维护也更加容易。
+
+## rpm-ostree
+
+### 系统更新
+
+rpm-ostree是一种镜像/包混合系统,可以看成是rpm和ostree的合体。一方面它提供了基于rpm的软件包安装管理方式,另一方面它提供了基于ostree的操作系统更新升级。rpm-ostree将这两种操作都视为对操作系统的更新,每次对系统的更新都像rpm-ostree在提交“Transaction-事务”,从而确保更新全部成功或全部失败,并且允许在更新系统后回滚到更新前的状态。
+
+rpm-ostree在更新操作系统的时候会有2个bootable区域,分别为主动分区和被动分区,对系统的更新升级在被动分区进行,在重启操作系统主动分区和被动分区转换后才生效。如果软件安装或升级出现问题,通过rpm-ostree会使NestOS回滚到先前的状态。NestOS的“/ostree/”和“/boot/”目录是ostree Repository环境,通过该目录可以查看当前boot使用的哪个ostree。
+
+### 只读文件系统
+
+在rpm-ostree的文件系统布局中,只有/etc和/var是唯一可写的目录,/var中的任何数据不会被触及,而是在升级过程中共享。在系统升级的过程中采用新的缺省值/etc,并将更改添加到顶部。这意味着升级将会接收/etc中新的默认文件,这是一个非常关键的特性。
+
+在通用操作系统中,/var目录下的部分文件采用“/var to tmpfiles.d”的处理策略,即系统通过systemd-tmpfile-setup.service读取/usr/lib/tmpfiles.d/目录下的conf文件,完成/var目录下文件夹和空白文件的创建,/usr/lib/tmpfiles.d/目录下的conf文件全部由相关rpm包提供。在NestOS中,/var目录不涉及rpm-ostree的commit分层,rpm-ostree各个commit 分层都会共享一个/var目录,但是/var目录下的文件会与ostree事务更新模型冲突,在安装软件包时rpm-ostree会将该文件删除。/var目录下的内容完全依赖“/var to tmpfiles.d”来生成,因此NestOS的/usr/lib/tmpfiles.d/目录下,除了部分rpm提供出的conf外,还存在由rpm-ostree在安装XXX软件包时生成的pkg-XXX.conf文件(即使XXX已经提供了conf文件),该文件记录了XXX软件包提供的/var下的文件夹,不涉及文件(文件在rpm-ostree安装包时已经删除)。当用户需要对rpm包提供的/var下的文件夹进行操作时,如删除某文件夹,简单的使用rm命令只能暂时删除,当系统重启后,该文件夹依旧存在,只有修改pkg-XXX.conf文件才能完成永久删除。
+
+ostree旨在可以并行安装多个独立操作系统的版本,ostree依赖于一个新的ostree 目录,该目录实际上可以并行安装在现有的操作系统或者是占据物理/root目录的发行版本中。每台客户机和每组部署上都存储在 /ostree/deploy/STATEROOT/CHECKSUM 上,而且还有一个ostree Repository存储在 /ostree/repo 中。每个部署主要由一组指向存储库的硬链接组成,这意味着每个版本都进行了重复数据的删除并且升级过程中只消耗了与新文件成比例的磁盘空间加上一些恒定的开销。
+
+ostree模型强调的是OS只读内容保存在 /usr 中,它附带了⽤于创建Linux只读安装以防止无意损坏的代码,对于给定的操作系统,每个部署之间都有一个 /var 共享的可供读写的目录。ostree核心代码不触及该目录的内容,如何管理和升级状态取决于每个操作系统中的代码。
+
+### 系统扩展
+
+出于安全性和可维护性的考虑,NestOS让基础镜像尽可能保持小巧和精简。但是在某些情况下,需要向基本操作系统本⾝添加软件,例如驱动软件,VPN等等,因为它们比较难容器化。这些包拓展了操作系统的功能,为此,rpm-ostree将这些包视为拓展,而不是仅仅在用户运行时提供。也就是说,目前NestOS对于实际安装哪些包没有限制,默认情况下,软件包是从openEuler仓库下载的。
+
+要对软件包进行分层,需要重新编写一个systemd单元来执行rpm-ostree命令安装所需要的包,所做的更改应⽤于新部署,重新启动才能⽣效。
+
+## nestos-installer
+
+nestos-installer是一个帮助安装Nestos的程序,它可以执行以下操作:
+
+(1)安装操作系统到一个目标磁盘,可使用Ignition和首次引导内核参数对其进行自定义(nestos-installer install)
+
+(2)下载并验证各种云平台、虚拟化或者裸机平台的操作系统映像(nestos-installer download)
+
+(3)列出可供下载的nestos镜像(nestos-installer list-stream)
+
+(4)在ISO中嵌入一个Ignition配置,以自定义地从中启动操作系统(nestos-installer iso ignition)
+
+(5)将Ignition配置包装在initd映像中,该映像可以被加入到PXE initramfs中以自定义从中启动的操作系统(nestos-installer pxe ignition)
+
+## zincati
+
+Zincati是NestOS⾃动更新的代理,它作为Cincinnati服务的客户端,负责监听NestOS版本变化并调用rpn-ostree进行⾃动更新。Zincati有如下特点:
+
+(1)支持自动更新代理,支持分阶段推出
+
+(2)通过toml配置文件支持运行时自定义,用户自定义配置文件可覆盖默认配置
+
+(3)多种更新策略
+
+(4)通过维护窗口每周在特定时间范围内进行更新的策略
+
+(5)收集和导出本地运行的zincati内部指标,可提供给Prometheus以减轻跨大量节点的监控任务
+
+(6)具有可配置优先级的日志记录
+
+(7)通过Cincinnati协议支持复杂的更新图
+
+(8)通过外部锁管理器支持集群范围的重启编排
+
+## 系统初始化(Ignition)
+
+Ignition 是一个与分发无关的配置实用程序,不仅用于安装,还读取配置文件(JSON 格式)并根据该配置初始化NestOS。可配置的组件包括存储和文件系统、systemd单元和用户。
+
+Ignition仅在系统第一次引导期间运行一次(在initramfs中)。因为 Ignition 在启动过程的早期运行,所以它可以在用户空间开始启动之前重新分区磁盘、格式化文件系统、创建用户和写入文件。 因此,systemd 服务在 systemd 启动时已经写入磁盘,从而加快了启动速度。
+
+(1)Ignition 仅在第一次启动时运行
+
+Ignition 旨在用作配置工具,而不是配置管理工具。 Ignition 鼓励不可变的基础设施,其中机器修改要求用户丢弃旧节点并重新配置机器。
+
+(2)Ignition不是在任何情况下都可以完成配置
+
+Ignition 执行它需要的操作,使系统与 Ignition 配置中描述的状态相匹配。 如果由于任何原因 Ignition 无法提供配置要求的确切机器,Ignition 会阻止机器成功启动。例如,如果用户想要获取托管在 的文档并将其写入磁盘,如果无法解析给定的 URL,Ignition 将阻止机器启动。
+
+(3)Ignition只是声明性配置
+
+Ignition配置只描述了系统的状态,没有列出 Ignition 应该采取的一系列步骤。
+
+Ignition 配置不允许用户提供任意逻辑(包括 Ignition 运行的脚本)。用户只需描述哪些文件系统必须存在、哪些文件必须创建、哪些用户必须存在等等。任何进一步的定制都必须使用由 Ignition 创建的 systemd 服务。
+
+(4)Ignition配置不应手写
+
+Ignition 配置被设计为人类可读但难以编写,是为了阻止用户尝试手动编写配置。可以使用Butane或类似工具生成或转化生成Ignition 配置。
+
+## Afterburn
+
+Afterburn是类似于云平台一样的一次性代理,可以用于与特定的提供者的元数据端点进行交互,通常和Ignition结合使用。
+
+Afterburn包含了很多可以在实例生命周期中不同时间段运行的模块。下面是特定的平台可能在第一次启动时在initramfs中运行的服务:
+
+(1)设置本地主机名
+
+(2)加入网络命令行参数
+
+以下的功能是在一定条件下,作为systemd服务单元在一些平台上才能使用的:
+
+(1)为本地系统用户安装公共SSH密钥
+
+(2)从实例元数据中检索属性
+
+(3)给提供者登记以便报道成功的启动或实例供应
diff --git a/docs/en/25.03/Cloud/NestOS/NestOS/figures/figure1.png b/docs/en/25.03/Cloud/NestOS/NestOS/figures/figure1.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4eb9017ed202e854c076802492d8561942dfc88
Binary files /dev/null and b/docs/en/25.03/Cloud/NestOS/NestOS/figures/figure1.png differ
diff --git a/docs/en/25.03/Cloud/NestOS/NestOS/figures/figure2.png b/docs/en/25.03/Cloud/NestOS/NestOS/figures/figure2.png
new file mode 100644
index 0000000000000000000000000000000000000000..90049769c04e2bd494533da1613e38a5199da3d7
Binary files /dev/null and b/docs/en/25.03/Cloud/NestOS/NestOS/figures/figure2.png differ
diff --git a/docs/en/25.03/Cloud/NestOS/NestOS/nestos-for-container.md b/docs/en/25.03/Cloud/NestOS/NestOS/nestos-for-container.md
new file mode 100644
index 0000000000000000000000000000000000000000..9b7e0e383245e4c8286966a4332adc721c73a306
--- /dev/null
+++ b/docs/en/25.03/Cloud/NestOS/NestOS/nestos-for-container.md
@@ -0,0 +1,995 @@
+# NestOS用户使用指南
+
+## 1. NestOS介绍
+
+### 1.1 前言
+
+NestOS是麒麟软件在openEuler社区开源孵化的云底座操作系统,集成了rpm-ostree支持、ignition配置等技术,采用双根文件系统互为主备、原子化更新的设计思路,提供nestos-assembler工具快速集成构建。NestOS针对K8S、OpenStack平台进行适配,优化容器运行底噪,使系统具备十分便捷的集群组建能力,可以更安全的运行大规模的容器化工作负载。
+
+本手册将完整阐述从构建、安装部署到使用NestOS的全流程,帮助用户充分利用NestOS的优势,快速高效地完成系统的配置和部署。
+
+### 1.2 应用场景与优势
+
+NestOS 适合作为以容器化应用为主的云场景基础运行环境,解决了在使用容器技术与容器编排技术实现业务发布、运维时与底层环境高度解耦而带来的运维技术栈不统一,运维平台重复建设等问题,保证了业务与底座操作系统运维的一致性。
+
+
+
+## 2. 环境准备
+
+### 2.1 构建环境要求
+
+#### 2.1.1 制作构建工具nestos-assembler环境要求
+
+- 推荐使用openEuler环境
+
+- 剩余可用硬盘空间 > 5G
+
+#### 2.1.2 构建NestOS环境要求
+
+| **类别** | **要求** |
+| :------: | :---------------: |
+| CPU | 4vcpu |
+| 内存 | 4GB |
+| 硬盘 | 剩余可用空间>10GB |
+| 架构 | x86_64或aarch64 |
+| 其他 | 支持kvm |
+
+### 2.2 部署配置要求
+
+| **类别** | **推荐配置** | **最低配置** |
+| :------: | :-------------: | :----------: |
+| CPU | >4vcpu | 1vcpu |
+| 内存 | >4GB | 512M |
+| 硬盘 | >20GB | 10GB |
+| 架构 | x86_64、aarch64 | / |
+
+## 3. 快速使用
+
+### 3.1 快速构建
+
+1)获取nestos-assembler容器镜像
+
+推荐使用基于openEuler的base镜像,更多说明请参考6.1
+
+```bash
+docker pull hub.oepkgs.net/nestos/nestos-assembler:24.03-LTS.20240903.0-aarch64
+```
+
+2)编写名为nosa的脚本并存放至/usr/local/bin,并赋予可执行权限
+
+```bash
+#!/bin/bash
+
+sudo docker run --rm -it --security-opt label=disable --privileged --user=root \
+ -v ${PWD}:/srv/ --device /dev/kvm --device /dev/fuse --network=host \
+ --tmpfs /tmp -v /var/tmp:/var/tmp -v /root/.ssh/:/root/.ssh/ -v /etc/pki/ca-trust/:/etc/pki/ca-trust/ \
+ ${COREOS_ASSEMBLER_CONFIG_GIT:+-v $COREOS_ASSEMBLER_CONFIG_GIT:/srv/src/config/:ro} \
+ ${COREOS_ASSEMBLER_GIT:+-v $COREOS_ASSEMBLER_GIT/src/:/usr/lib/coreos-assembler/:ro} \
+ ${COREOS_ASSEMBLER_CONTAINER_RUNTIME_ARGS} \
+ ${COREOS_ASSEMBLER_CONTAINER:-nestos-assembler:your_tag} "$@"
+```
+
+注意修改COREOS_ASSEMBLER_CONTAINER 的值为本地环境中实际的nestos-assembler容器镜像。
+
+3)获取nestos-config
+
+使用nosa init 初始化构建工作目录,拉取构建配置,创建工作目录nestos-build,在该目录下执行如下命令
+
+```bash
+nosa init https://gitee.com/openeuler/nestos-config
+```
+
+4)调整构建配置
+
+nestos-config提供默认构建配置,无需额外操作。如需调整,请参考第5章。
+
+5)NestOS镜像构建
+
+```bash
+# 拉取构建配置、更新缓存
+nosa fetch
+# 生成根文件系统、qcow2及OCI镜像
+nosa build
+# 生成live iso及PXE镜像
+nosa buildextend-metal
+nosa buildextend-metal4k
+nosa buildextend-live
+```
+
+详细构建及部署流程请参考第6章。
+
+### 3.2 快速部署
+
+以NestOS ISO镜像为例,启动进入live环境后,执行如下命令根据向导提示完成安装:
+
+```bash
+sudo installnestos
+```
+
+其他部署方式请参考第8章。
+
+## 4. 系统默认配置
+
+| **选项** | **默认配置** |
+| :-------------: | :---------------------: |
+| docker服务 | 默认disable,需主动开启 |
+| ssh服务安全策略 | 默认仅支持密钥登录 |
+
+## 5. 构建配置nestos-config
+
+### 5.1 获取配置
+
+nestos-config的仓库地址为
+
+### 5.2 配置目录结构说明
+
+| **目录/****文件** | **说明** |
+| :---------------: | :--------------------: |
+| live/* | 构建liveiso的引导配置 |
+| overlay.d/* | 自定义文件配置 |
+| tests/* | 用户自定义测试用例配置 |
+| *.repo | repo源配置 |
+| .yaml,manifests/ | 主要构建配置 |
+
+### 5.3 主要文件解释
+
+#### 5.3.1 repo文件
+
+目录下的repo文件可用来配置用于构建nestos的软件仓库。
+
+#### 5.3.2 yaml配置文件
+
+目录下的yaml文件主要是提供nestos构建的各种配置,详见5.4章节。
+
+### 5.4 主要字段解释
+
+| **字段名称** | **作用** |
+| :------------------------------------------ | ------------------------------------------------------------ |
+| packages-aarch64、packages-x86_64、packages | 软件包集成范围 |
+| exclude-packages | 软件包集成黑名单 |
+| remove-from-packages | 从指定软件包删除文件(夹) |
+| remove-files | 删除特定文件(夹) |
+| extra-kargs | 额外内核引导参数 |
+| initramfs-args | initramfs构建参数 |
+| postprocess | 文件系统构建后置脚本 |
+| default-target | 配置default-target,如 multi-user.target |
+| rolij.name、releasever | 镜像相关信息(镜像名称、版本) |
+| lockfile-repos | 构建可使用的仓库名列表,与5.3.1 介绍的repo文件中的仓库名需要对应 |
+
+### 5.5 用户可配置项说明
+
+#### 5.5.1 repo源配置
+
+1)在配置目录编辑repo文件,将内容修改为期望的软件仓库
+
+```bash
+$ vim nestos-pool.repo
+[repo_name_1]
+Name=xxx
+baseurl = https://ip.address/1
+enabled = 1
+
+[repo_name_2]
+Name=xxx
+baseurl = https://ip.address/2
+enabled = 1
+```
+
+2)修改yaml配置文件中的lockfile-repo字段内容为相应的仓库名称列表
+
+注:仓库名称为repo文件中[]内的内容,不是name字段内容
+
+```bash
+$ vim manifests/rpmlist.yaml
+修改lockfile-repo字段内容为
+lockfile-repos:
+- repo_name_1
+- repo_name_2
+```
+
+#### 5.5.2 软件包裁剪
+
+修改packages、packages-aarch64、packages-x86_64字段,可在其中添加或删除软件包。
+
+如下所示,在package字段中添加了nano,构建安装后系统中会有nano 。
+
+```bash
+$ vim manifests/rpmlist.yaml
+packages:
+- bootupd
+...
+- authselect
+- nano
+...
+packages-aarch64:
+- grub2-efi-aa64
+packages-x86_64:
+- microcode_ctl
+- grub2-efi-x64
+```
+
+#### 5.5.3 自定义镜像名称与版本号
+
+修改yaml文件中的releasever及rolij.name 字段,这些字段分别控制镜像的版本号及名称。
+
+```bash
+$ vim manifest.yaml
+
+releasever: "1.0"
+rojig:
+ license: MIT
+ name: nestos
+ summary: NestOS stable
+```
+
+如上配置,构建出的镜像格式为:nestos-1.0.$(date "+%Y%m%d").$build_num.$type,其中build_num为构建次数,type为类型后缀。
+
+#### 5.5.4 自定义镜像中的release信息
+
+正常release信息是由我们集成的release包(如openeuler-release)提供的,但是我们也可以通过添加postprocess脚本对/etc/os-release文件进行重写操作。
+
+```bash
+$ vim manifests/ system-configuration.yaml
+在postprocess添加如下内容,若已存在相关内容,则只需修改对应release信息即可
+postprocess:
+ - |
+ #!/usr/bin/env bash
+ set -xeuo pipefail
+ export OSTREE_VERSION="$(tail -1 /etc/os-release)"
+ date_now=$(date "+%Y%m%d")
+ echo -e 'NAME="openEuler NestOS"\nVERSION="24.03-LTS"\nID="openeuler"\nVERSION_ID="24.03-LTS"\nPRETTY_NAME="NestOS"\nANSI_COLOR="0;31"\nBUILDID="'${date_now}'"\nVARIANT="NestOS"\nVARIANT_ID="nestos"\n' > /usr/lib/os-release
+ echo -e $OSTREE_VERSION >> /usr/lib/os-release
+ cp -f /usr/lib/os-release /etc/os-release
+```
+
+#### 5.5.5 成自定义文件
+
+在overlay.d目录下每个目录进行自定义文件的添加和修改,这种操作可以实现构建镜像内容的自定义。
+
+```bash
+mkdir -p overlay.d/15nestos/etc/test/test.txt
+echo "This is a test message !" > overlay.d/15nestos/etc/test/test.txt
+```
+
+使用如上配置进行镜像构建,启动构建出的镜像,查看系统中对应文件内容即为我们上述自定义添加的内容。
+
+```bash
+[root@nosa-devsh ~]# cat /etc/test/test.txt
+This is a test message !
+```
+
+## 6.构建流程
+
+NestOS采用容器化的方式将构建工具链集成为一个完整的容器镜像,称为NestOS-assembler。
+
+NestOS提供构建NestOS-assembler容器镜像能力,方便用户使用。使用该容器镜像,用户可在任意linux发行版环境中构建多种形态NestOS镜像(例如在现有CICD环境中使用),也可对构建发布件进行管理、调试和自动化测试。
+
+### 6.1 制作构建工具NestOS-assembler容器镜像
+
+#### 6.1.1 前置步骤
+
+1)准备容器base镜像
+
+NestOS-assembler容器镜像需要基于支持yum/dnf软件包管理器的base镜像制作,理论上可由任意发行版base镜像制作,但为最大程度减少软件包兼容性问题,仍推荐使用基于openEuler的base镜像。
+
+2)安装必要软件包
+
+安装必备依赖docker
+
+```bash
+dnf install -y docker
+```
+
+3)克隆nestos-assembler源代码仓库
+
+```bash
+git clone --depth=1 --single-branch https://gitee.com/openeuler/nestos-assembler.git
+```
+
+#### 6.1.2 构建NestOS-assembler容器镜像
+
+使用openEuler容器镜像作为base镜像,使用以下指令构建:
+
+```bash
+cd nestos-assembler/
+docker build -f Dockerfile . -t nestos-assembler:your_tag
+```
+
+### 6.2 使用NestOS-assembler容器镜像
+
+#### 6.2.1 前置步骤
+
+1)准备nestos-assembler容器镜像
+
+参考6.1章节构建nestos-assembler容器镜像后,可通过私有化部署容器镜像仓库对该容器镜像进行管理和分发。请确保构建NestOS前,拉取适当版本的nestos-assembler容器镜像至当前环境。
+
+2)编写使用脚本nosa
+
+因NestOS构建过程需多次调用nestos-assembler容器镜像执行不同命令,同时需配置较多参数,为简化用户操作,可编写nosa命令脚本,可参见3.1快速构建部分。
+
+#### 6.2.2 使用说明
+
+构建工具命令一览
+
+| **命令** | **功能说明** |
+| :-------------------: | :-------------------------------------------------: |
+| init | 初始化构建环境及构建配置,详见6.3 |
+| fetch | 根据构建配置获取最新软件包至本地缓存 |
+| build | 构建ostree commit,是构建NestOS的核心命令 |
+| run | 直接启动一个qemu实例,默认使用最新构建版本 |
+| prune | 清理历史构建版本,默认保留最新3个版本 |
+| clean | 删除全部构建发布件,添加--all参数时同步清理本地缓存 |
+| list | 列出当前构建环境中存在的版本及发布件 |
+| build-fast | 基于前次构建记录快速构建新版本 |
+| push-container | 推送容器镜像发布件至容器镜像仓库 |
+| buildextend-live | 构建支持live环境的ISO发布件及PXE镜像 |
+| buildextend-metal | 构建裸金属raw发布件 |
+| buildextend-metal4k | 构建原生4K模式的裸金属raw发布件 |
+| buildextend-openstack | 构建适用于openstack平台的qcow2发布件 |
+| buildextend-qemu | 构建适用于qemu的qcow2发布件 |
+| basearch | 获得当前架构信息 |
+| compress | 压缩发布件 |
+| kola | 自动化测试框架 |
+| kola-run | 输出汇总结果的自动化测试封装 |
+| runc | 以容器方式挂载当前构建根文件系统 |
+| tag | 管理构建工程tag |
+| virt-install | 通过virt-install为指定构建版本创建实例 |
+| meta | 管理构建工程元数据 |
+| shell | 进入nestos-assembler容器镜像 |
+
+### 6.3 准备构建环境
+
+NestOS构建环境需要独立的空文件夹作为工作目录,且支持多次构建,保留、管理历史构建版本。创建构建环境前需首先准备构建配置(参考第5章)。
+
+建议一份独立维护的构建配置对应一个独立的构建环境,即如果您希望构建多个不同用途的NestOS,建议同时维护多份构建配置及对应的构建环境目录,这样可以保持不同用途的构建配置独立演进和较为清晰的版本管理。
+
+#### 6.3.1 初始化构建环境
+
+进入待初始化工作目录,执行如下命令即可初始化构建环境:
+
+```bash
+nosa init https://gitee.com/openeuler/nestos-config
+```
+
+仅首次构建时需初始化构建环境,后续构建在不对构建配置做出重大更改的前提下,可重复使用该构建环境。
+
+#### 6.3.2 构建环境说明
+
+初始化完成后,工作目录创建出如下文件夹:
+
+**builds:**构建发布件及元数据存储目录,latest子目录软链接指向最新构建版本。
+
+**cache:**缓存目录,根据构建配置中的软件源及软件包列表拉取至本地,历史构建NestOS的ostree repo均缓存于此目录。
+
+**overrides:**构建过程希望附加到最终发布件rootfs中的文件或rpm包可置于此目录。
+
+**src:**构建配置目录,存放nestos-config相关内容。
+
+**tmp:**临时目录,构建过程、自动化测试等场景均会使用该目录作为临时目录,构建发生异常时可在此处查看虚拟机命令行输出、journal日志等信息。
+
+### 6.4 构建步骤
+
+NestOS构建主要步骤及参考命令如下:
+
+
+
+#### 6.4.1 首次构建
+
+首次构建时需初始化构建环境,详见6.3。
+
+非首次构建可直接使用原构建环境,可通过nosa list查看当前构建环境已存在版本及对应发布件。
+
+#### 6.4.2 更新构建配置及缓存
+
+初始化构建环境后,执行如下命令更新构建配置及缓存:
+
+```bash
+nosa fetch
+```
+
+该步骤初步校验构建配置是否可用,并通过配置的软件源拉取软件包至本地缓存。当构建配置发生变更或单纯希望更新软件源中最新版本软件包,均需要重新执行该步骤,否则可能导致构建失败或不符合预期。
+
+当构建配置发生较大变更,希望清空本地缓存重新拉取时,需执行如下命令:
+
+```bash
+nosa clean --all
+```
+
+#### 6.4.3 构建不可变根文件系统
+
+NestOS不可变操作系统的核心是基于ostree技术的不可变根文件系统,执行如下步骤构建ostree文件系统:
+
+```bash
+nosa build
+```
+
+build命令默认会生成ostree文件系统和OCI归档文件,您也可以在执行命令时同步添加qemu、metal、metal4k中的一个或多个,同步构建发布件,等效于后续继续执行buildextend-qemu、buildextend-metal和buildextend-metal4k命令。
+
+```bash
+nosa build qemu metal metal4k
+```
+
+如您希望在构建NestOS时,添加自定义文件或rpm包,请在执行build命令前将相应文件放入构建环境overrides目录下rootfs/或rpm/文件夹。
+
+#### 6.4.4 构建各类发布件
+
+build命令执行完毕后,可继续执行buildextend-XXX命令用于构建各类型发布件,具体介绍如下:
+
+- 构建qcow2镜像
+
+```bash
+nosa buildextend-qemu
+```
+
+- 构建带live环境的ISO镜像或PXE启动组件
+
+```bash
+nosa buildextend-metal
+nosa buildextend-metal4k
+nosa buildextend-live
+```
+
+- 构建适用于openstack环境的qcow2镜像
+
+```bash
+nosa buildextend-openstack
+```
+
+- 构建适用于容器镜像方式更新的容器镜像
+
+执行nosa build命令构建ostree文件系统时,会同时生成ociarchive格式镜像,该镜像可直接执行如下命令推送到本地或远程镜像仓库,无需执行其他构建步骤。
+
+```bash
+nosa push-container [container-image-name]
+```
+
+ 远程镜像仓库地址需附加到推送容器镜像名称中,且除隔离镜像tag外,不得出现":"。如未检测到":",该命令会自动生成{latest_build}-{arch}格式的tag。示例如下:
+
+```bash
+nosa push-container registry.example.com/nestos:1.0.20240903.0-x86_64
+```
+
+该命令支持以下可选参数:
+
+--authfile :指定登录远程镜像仓库的鉴权文件
+
+--insecure:如远程镜像仓库采用自签名证书等场景,添加该参数可不校验SSL/TLS协议
+
+--transport:指定目标镜像推送协议,默认为docker,具体支持项及说明如下:
+
+ containers-storage:推送至podman、crio等容器引擎本地存储目录
+
+ dir:推送至指定本地目录
+
+ docker:以docker API推送至私有或远端容器镜像仓库
+
+ docker-archive:等效于docker save导出归档文件,可供docker load使用
+
+ docker-daemon:推送至docker容器引擎本地存储目录
+
+### 6.5 获取发布件
+
+构建完毕后,发布件均生成于构建环境中如下路径:
+
+```bash
+builds/{version}/{arch}/
+```
+
+如您仅关心最新构建版本或通过CI/CD调用,提供latest目录软链接至最新版本目录,即:
+
+```bash
+builds/latest/{arch}/
+```
+
+为方便传输,您可以调用如下命令,压缩发布件体积:
+
+```bash
+nosa compress
+```
+
+压缩后原文件会被移除,会导致部分调试命令无法使用,可以调用解压命令恢复原文件:
+
+```bash
+nosa uncompress
+```
+
+### 6.6 构建环境维护
+
+在构建NestOS环境前后,可能存在如下需求,可使用推荐的命令解决相应问题:
+
+#### 6.6.1 清理历史或无效构建版本,以释放磁盘空间
+
+可以通过以下命令清理历史版本构建:
+
+```bash
+nosa prune
+```
+
+也可删除当前构建环境中的全部发布件:
+
+```bash
+nosa clean
+```
+
+如构建配置更换过软件源或历史缓存无保留价值,可彻底清理当前构建环境缓存:
+
+```bash
+nosa clean --all
+```
+
+#### 6.6.2 临时运行构建版本实例,用于调试或确认构建正确
+
+```bash
+nosa run
+```
+
+可通过--qemu-image或--qemu-iso指定启动镜像地址,其余参数请参考nosa run --help说明。
+
+实例启动后,构建环境目录会被挂载至/var/mnt/workdir,可通过构建环境目录
+
+#### 6.6.3 运行自动化测试
+
+```bash
+nosa kola run
+```
+
+该命令会执行预设的测试用例,也可在其后追加测试用例名称,单独执行单条用例。
+
+```bash
+nosa kola testiso
+```
+
+该命令会执行iso或pxe live环境安装部署测试,可作为构建工程的冒烟测试。
+
+#### 6.6.4 调试验证构建工具(NestOS-assembler)
+
+```bash
+nosa shell
+```
+
+该命令可启动进入构建工具链容器的shell环境,您可以通过此命令验证构建工具链工作环境是否正常。
+
+## 7. 部署配置
+
+### 7.1 前言
+
+在开始部署NestOS之前,了解和准备必要的配置是至关重要的。NestOS通过点火文件(ignition文件)提供了一系列灵活的配置选项,可以通过Butane工具进行管理,方便用户进行自动化部署和环境设置。
+
+在本章节中,将详细的介绍Butane工具的功能和使用方法,并根据不同场景提供配置示例。这些配置将帮助您快速启动和运行NestOS,在满足应用需求的同时,确保系统的安全性和可靠性。此外,还会介绍如何自定义镜像,将点火文件预集成至镜像中,以满足特定应用场景的需求,从而实现高效的配置和部署NestOS。
+
+### 7.2 Butane简介
+
+Butane是一个用于将人类可读的YAML配置文件转换为NestOS点火文件(Ignition 文件)的工具。Butane工具简化了复杂配置的编写过程,允许用户以更易读的格式编写配置文件,然后将其转换为适合NestOS使用的JSON格式。
+
+NestOS对Butane进行了适配修改,新增nestos变体支持和配置规范版本v1.0.0,对应的点火(ignition)配置规范为v3.3.0,确保了配置的稳定性和兼容性。
+
+### 7.3 Butane使用
+
+安装butane软件包
+
+```bash
+dnf install butane
+```
+
+编辑example.yaml并执行以下指令将其转换为点火文件example.ign,其中关于yaml文件的编写,将在后续展开:
+
+```bash
+butane example.yaml -o example.ign -p
+```
+
+### 7.4 支持的功能场景
+
+以下配置示例(example.yaml)简述了NestOS主要支持的功能场景和进阶使用方法。
+
+#### 7.4.1 设置用户和组并配置密码/密钥
+
+```conf
+variant: nestos
+version: 1.0.0
+passwd:
+ users:
+ - name: nest
+ ssh_authorized_keys:
+ - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHn2eh...
+ - name: jlebon
+ groups:
+ - wheel
+ ssh_authorized_keys:
+ - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDC5QFS...
+ - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIveEaMRW...
+ - name: miabbott
+ groups:
+ - docker
+ - wheel
+ password_hash: $y$j9T$aUmgEDoFIDPhGxEe2FUjc/$C5A...
+ ssh_authorized_keys:
+ - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDTey7R...
+```
+
+#### 7.4.2 文件操作——以配置网卡为例
+
+```conf
+variant: nestos
+version: 1.0.0
+storage:
+ files:
+ - path: /etc/NetworkManager/system-connections/ens2.nmconnection
+ mode: 0600
+ contents:
+ inline: |
+ [connection]
+ id=ens2
+ type=ethernet
+ interface-name=ens2
+ [ipv4]
+ address1=10.10.10.10/24,10.10.10.1
+ dns=8.8.8.8;
+ dns-search=
+ may-fail=false
+ method=manual
+```
+
+#### 7.4.3 创建目录、文件、软连接并配置权限
+
+```conf
+variant: nestos
+version: 1.0.0
+storage:
+ directories:
+ - path: /opt/tools
+ overwrite: true
+ files:
+ - path: /var/helloworld
+ overwrite: true
+ contents:
+ inline: Hello, world!
+ mode: 0644
+ user:
+ name: dnsmasq
+ group:
+ name: dnsmasq
+ - path: /opt/tools/transmogrifier
+ overwrite: true
+ contents:
+ source: https://mytools.example.com/path/to/archive.gz
+ compression: gzip
+ verification:
+ hash: sha512-00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ mode: 0555
+ links:
+ - path: /usr/local/bin/transmogrifier
+ overwrite: true
+ target: /opt/tools/transmogrifier
+ hard: false
+```
+
+#### 7.4.4 编写systemd服务——以启停容器为例
+
+```conf
+variant: nestos
+version: 1.0.0
+systemd:
+ units:
+ - name: hello.service
+ enabled: true
+ contents: |
+ [Unit]
+ Description=MyApp
+ After=network-online.target
+ Wants=network-online.target
+
+ [Service]
+ TimeoutStartSec=0
+ ExecStartPre=-/bin/podman kill busybox1
+ ExecStartPre=-/bin/podman rm busybox1
+ ExecStartPre=/bin/podman pull busybox
+ ExecStart=/bin/podman run --name busybox1 busybox /bin/sh -c ""trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 1; done""
+
+ [Install]
+ WantedBy=multi-user.target
+```
+
+### 7.5 点火文件预集成
+
+NestOS构建工具链支持用户根据实际使用场景和需求定制镜像。在镜像制作完成后,nestos-installer还提供了针对镜像部署与应用等方面进行自定义的一系列功能,如嵌入点火文件、预分配安装位置、增删内核参数等功能,以下将针对主要功能进行介绍。
+
+#### 7.5.1 点火文件预集成至ISO镜像
+
+准备好NestOS的ISO镜像至本地;安装nestos-installer软件包;编辑example.yaml,并使用butane工具将其转换为ign文件,在这里,我们仅配置简单的用户名和密码(密码要求加密,示例中为qwer1234),内容如下:
+
+```conf
+variant: nestos
+version: 1.0.0
+passwd:
+ users:
+ - name: root
+ password_hash: "$1$root$CPjzNGH.NqmQ7rh26EeXv1"
+```
+
+将上述yaml转换为ign文件后,执行如下指令嵌入点火文件并指定目标磁盘位置,其中xxx.iso为准备至本地的NestOS ISO镜像:
+
+```bash
+nestos-installer iso customize --dest-device /dev/sda --dest-ignition example.ign xxx.iso
+```
+
+使用该集成点火文件的ISO镜像进行安装时,NestOS会自动读取点火文件并安装至目标磁盘,待进度条完成度为100%后,自动进入安装好的NestOS环境,用户可根据ign文件配置的用户名和密码进入系统。
+
+#### 7.5.2 点火文件预集成至PXE镜像
+
+准备好NestOS的PXE镜像至本地,组件获取方式参考6.5【获取发布件】章节,其他步骤同上。
+
+为了方便用户使用,nestos-installer也支持从ISO镜像中提取PXE组件的功能,执行如下指令,其中xxx.iso为保存至本地的NestOS ISO镜像:
+
+```bash
+nestos-installer iso extract pxe xxx.iso
+```
+
+得到如下输出件:
+
+```text
+xxx-initrd.img
+xxx-rootfs.img
+xxx-vmlinuz
+```
+
+执行如下指令嵌入点火文件并指定目标磁盘位置:
+
+```bash
+nestos-installer pxe customize --dest-device /dev/sda --dest-ignition example.ign xxx-initrd.img --output custom-initrd.img
+```
+
+根据使用PXE安装NestOS的方式,替换相应的xxx-initrd.img为custom-initrd.img。启动后NestOS会自动读取点火文件并安装至目标磁盘,待进度条完成度为100%后,自动进入安装好的NestOS环境,用户可根据ign文件配置的用户名和密码进入系统。
+
+## 8. 部署流程
+
+### 8.1 简介
+
+NestOS支持多种部署平台及常见部署方式,当前主要支持qcow2、ISO与PXE三种部署方式。与常见通用OS部署相比,主要区别在于如何传入以ign文件为特征的自定义部署配置,以下各部分将会分别介绍。
+
+### 8.2 使用qcow2镜像安装
+
+#### 8.2.1 使用qemu创建qcow2实例
+
+准备NestOS的qcow2镜像及相应点火文件(详见第7章),终端执行如下步骤:
+
+```conf
+IGNITION_CONFIG="/path/to/example.ign"
+IMAGE="/path/to/image.qcow2"
+IGNITION_DEVICE_ARG="-fw_cfg name=opt/com.coreos/config,file=${IGNITION_CONFIG}"
+
+qemu-img create -f qcow2 -F qcow2 -b ${IMAGE} my-nestos-vm.qcow2
+```
+
+aarch64环境执行如下命令:
+
+```bash
+qemu-kvm -m 2048 -M virt -cpu host -nographic -drive if=virtio,file=my-nestos-vm.qcow2 ${IGNITION_DEVICE_ARG} -nic user,model=virtio,hostfwd=tcp::2222-:22 -bios /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw
+```
+
+x86_64环境执行如下命令:
+
+```bash
+qemu-kvm -m 2048 -M pc -cpu host -nographic -drive if=virtio,file=my-nestos-vm.qcow2 ${IGNITION_DEVICE_ARG} -nic user,model=virtio,hostfwd=tcp::2222-:22
+```
+
+#### 8.2.2 使用virt-install创建qcow2实例
+
+假设libvirt服务正常,网络默认采用default子网,绑定virbr0网桥,您可参考以下步骤创建NestOS实例。
+
+准备NestOS的qcow2镜像及相应点火文件(详见第7章),终端执行如下步骤:
+
+```conf
+IGNITION_CONFIG="/path/to/example.ign"
+IMAGE="/path/to/image.qcow2"
+VM_NAME="nestos"
+VCPUS="4"
+RAM_MB="4096"
+DISK_GB="10"
+IGNITION_DEVICE_ARG=(--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${IGNITION_CONFIG}")
+```
+
+**注意:使用virt-install安装,qcow2镜像及ign文件需指定绝对路径。**
+
+执行如下命令创建实例:
+
+```bash
+virt-install --connect="qemu:///system" --name="${VM_NAME}" --vcpus="${VCPUS}" --memory="${RAM_MB}" --os-variant="kylin-hostos10.0" --import --graphics=none --disk="size=${DISK_GB},backing_store=${IMAGE}" --network bridge=virbr0 "${IGNITION_DEVICE_ARG[@]}
+```
+
+### 8.3 使用ISO镜像安装
+
+准备NestOS的ISO镜像并启动。首次启动的NestOS ISO镜像会默认进入Live环境,该环境为易失的内存环境。
+
+#### 8.3.1 通过nestos-installer安装向导脚本安装OS至目标磁盘
+
+1)在NestOS的Live环境中,根据首次进入的打印提示,可输入以下指令,即可自动生成一份简易的点火文件并自动安装重启
+
+```bash
+sudo installnestos
+```
+
+2)根据终端提示信息依次输入用户名和密码;
+
+3)选择目标磁盘安装位置,可直接选择回车设置为默认项/dev/sda;
+
+4)执行完以上步骤后,nestos-installer开始根据我们提供的配置将NestOS安装至目标磁盘,待进度条100%后,自动重启;
+
+5)重启后自动进入NestOS,在grub菜单直接回车或者等待5s后启动系统,随后根据此前配置的用户名和密码进入系统。至此,安装完成。
+
+#### 8.3.2 通过nestos-installer命令手动安装OS至目标磁盘
+
+1)准备好点火文件example.ign(详见第7章);
+
+2)根据首次进入NestOS的Live环境打印的提示,输入以下指令开始安装:
+
+```bash
+sudo nestos-installer install /dev/sda --ignition-file example.ign
+```
+
+如具备网络条件,点火文件也可通过网络获取,如:
+
+```bash
+sudo nestos-installer install /dev/sda --ignition-file http://www.example.com/example.ign
+```
+
+3)执行完上述指令后,nestos-installer开始根据我们提供的配置将NestOS安装至目标磁盘,待进度条100%后,自动重启;
+
+4)重启后自动进入NestOS,在gurb菜单直接回车或者等待5s后启动系统,随后根据此前配置的用户名和密码进入系统。至此,安装完成
+
+### 8.4 PXE部署
+
+NestOS的PXE安装组件包括kernel、initramfs.img和rootfs.img。这些组件以nosa buildextend-live命令生成(详见第6章)。
+
+1)使用PXELINUX 的kernel命令行指定内核,简单示例如下:
+
+```bash
+KERNEL nestos-live-kernel-x86_64
+```
+
+2)使用PXELINUX 的append命令行指定initrd和rootfs,简单示例如下:
+
+```bash
+APPEND initrd=nestos-live-initramfs.x86_64.img,nestos-live-rootfs.x86_64.img
+```
+
+**注意:如您采用7.5章节所述,已将点火文件预集成至PXE组件,则仅需在此进行替换,无需执行后续步骤。**
+
+3)指定安装位置,以/dev/sda为例,在APPEND后追加,示例如下:
+
+```bash
+nestosos.inst.install_dev=/dev/sda
+```
+
+4)指定点火文件,需通过网络获取,在APPEND后追加相应地址,示例如下:
+
+```bash
+nestos.inst.ignition_url=http://www.example.com/example.ign
+```
+
+5)启动后NestOS会自动读取点火文件并安装至目标磁盘,待进度条完成度为100%后,自动进入安装好的NestOS环境,用户可根据ign文件配置的用户名和密码进入系统。
+
+## 9. 基本使用
+
+### 9.1 简介
+
+NestOS采用基于ostree和rpm-ostree技术的操作系统封装方案,将关键目录设置为只读状态,核心系统文件和配置不会被意外修改;采用overlay分层思想,允许用户在基础ostree文件系统之上分层管理RPM包,不会破坏初始系统体系结构;同时支持构建OCI格式镜像,实现以镜像为最小粒度进行操作系统版本的切换。
+
+### 9.2 SSH连接
+
+出于安全考虑,NestOS 默认不支持用户使用密码进行SSH登录,而只能使用密钥认证方式。这一设计旨在增强系统的安全性,防止因密码泄露或弱密码攻击导致的潜在安全风险。
+
+NestOS通过密钥进行SSH连接的方法与openEuler一致,如果用户需要临时开启密码登录,可按照以下步骤执行:
+
+1)编辑ssh服务附加配置文件
+
+```bash
+vi /etc/ssh/sshd_config.d/40-disable-passwords.conf
+```
+
+2)修改默认配置PasswordAuthentication为如下内容:
+
+```conf
+PasswordAuthentication yes
+```
+
+3)重启sshd服务,便可实现临时使用密码进行SSH登录。
+
+### 9.3 RPM包安装
+
+**注意:不可变操作系统不提倡在运行环境中安装软件包,提供此方法仅供临时调试等场景使用,因业务需求需要变更集成软件包列表请通过更新构建配置重新构建实现。**
+
+NestOS不支持常规的包管理器dnf/yum,而是通过rpm-ostree来管理系统更新和软件包安装。rpm-ostree结合了镜像和包管理的优势,允许用户在基础系统之上分层安装和管理rpm包,并且不会破环初始系统的结构。使用以下命令安装rpm包:
+
+```bash
+rpm-ostree install
+```
+
+安装完成后,重新启动操作系统,可以看到引导加载菜单出现了两个分支,默认第一个分支为最新的分支
+
+```bash
+systemctl reboot
+```
+
+重启进入系统,查看系统包分层状态,可看到当前版本已安装\
+
+```bash
+rpm-ostree status -v
+```
+
+### 9.4 版本回退(临时/永久)
+
+更新/rpm包安装完成后,上一版本的操作系统部署仍会保留在磁盘上。如果更新导致问题,用户可以使用rpm-ostree进行版本回退,这一步操作需要用户手动操作,具体流程如下:
+
+#### 9.4.1 临时回退
+
+要临时回滚到之前的OS部署,在系统启动过程中按住shift键,当引导加载菜单出现时,在菜单中选择相应的分支(默认有两个,选择另外一个即可)。在此之前,可以使用以下指令查看当前环境中已存在的两个版本分支:
+
+```bash
+rpm-ostree status
+```
+
+#### 9.4.2 永久回退
+
+要永久回滚到之前的操作系统部署,用户需在当前版本中运行如下指令,此操作将使用之前版本的系统部署作为默认部署。
+
+```bash
+rpm-ostree rollback
+```
+
+重新启动以生效,引导加载菜单的默认部署选项已经改变,无需用户手动切换。
+
+```bash
+systemctl reboot
+```
+
+## 10. 容器镜像方式更新
+
+### 10.1 应用场景说明
+
+NestOS作为基于不可变基础设施思想的容器云底座操作系统,将文件系统作为一个整体进行分发和更新。这一方案在运维与安全方面带来了巨大的便利。然而,在实际生产环境中,官方发布的版本往往难以满足用户的需求。例如,用户可能希望在系统中默认集成自维护的关键基础组件,或者根据特定场景的需求对软件包进行进一步的裁剪,以减少系统的运行负担。因此,与通用操作系统相比,用户对NestOS有着更强烈和更频繁的定制需求。
+
+ NestOS-assembler 可提供符合OCI标准的容器镜像,且不仅是将根文件系统打包分发,利用ostree native container特性,可使容器云场景用户使用熟悉的技术栈,只需编写一个ContainerFile(Dockerfile)文件,即可轻松构建定制版镜像,用于自定义集成组件或后续的升级维护工作。
+
+### 10.2 使用方式
+
+#### 10.2.1 定制镜像
+
+- 基本步骤
+
+(1) 参考第6章构建NestOS容器镜像,可使用nosa push-container命令推送至公共或私有容器镜像仓库。
+
+(2) 编写Containerfile(Dockerfile)示例如下:
+
+```conf
+FROM registry.example.com/nestos:1.0.20240603.0-x86_64
+
+# 执行自定义构建步骤,例如安装软件或拷贝自构建组件
+# 此处以安装strace软件包为例
+RUN rpm-ostree install strace && rm -rf /var/cache && ostree container commit
+```
+
+(3)执行docker build或集成于CICD中构建相应镜像
+
+- 注意事项
+
+(1) NestOS 无yum/dnf包管理器,如需安装软件包可采用rpm-ostree install命令安装本地rpm包或软件源中提供软件
+
+(2) 如有需求也可修改/etc/yum.repo.d/目录下软件源配置
+
+(3) 每层有意义的构建命令末尾均需添加&& ostree container commit命令,从构建容器镜像最佳实践角度出发,建议尽可能减少RUN层的数量
+
+(4) 构建过程中会对非/usr或/etc目录内容进行清理,因此通过容器镜像方式定制主要适用于软件包或组件更新,请勿通过此方式进行系统维护或配置变更(例如添加用户useradd)
+
+#### 10.2.2 部署/升级镜像
+
+假设上述步骤构建容器镜像被推送为registry.example.com/nestos:1.0.20240903.0-x86_64。
+
+在已部署NestOS的环境中执行如下命令:
+
+```bash
+sudo rpm-ostree rebase ostree-unverified-registry:registry.example.com/nestos:1.0.20240903.0-x86_64
+```
+
+重新引导后完成定制版本部署。
+
+当您使用容器镜像方式部署后,rpm-ostree upgrade 默认会将更新源从ostree更新源地址更新为容器镜像地址。之后,您可以在相同的tag下更新容器镜像,使用 rpm-ostree upgrade 可以检测远端镜像是否已经更新,如果有变更,它会拉取最新的镜像并完成部署。
diff --git a/docs/en/25.03/Cloud/NestOS/NestOS/overview.md b/docs/en/25.03/Cloud/NestOS/NestOS/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..1d744c820ca42dca9441b53db275b9d72cddaa21
--- /dev/null
+++ b/docs/en/25.03/Cloud/NestOS/NestOS/overview.md
@@ -0,0 +1,4 @@
+# NestOS云底座操作系统
+
+本文介绍云底座操作系统NestOS For Container(下称NestOS)的安装部署与各个特性说明和使用方法,使用户能够快速了解并使用NestOS。NestOS For Virt的使用方法与通用操作系统使用方法一致,可参考欧拉官方文档。
+Nestos搭载了docker、iSulad、podman、cri-o等常见容器引擎,将ignition配置、rpm-ostree、OCI支持、SElinux强化等技术集成在一起,采用基于双系统分区、容器技术和集群架构的设计思路,可以适配云场景下多种基础运行环境。同时NestOS针对Kubernetes进行优化,在IaaS生态构建方面,针对openStack、oVirt等平台提供支持;在PaaS生态构建方面,针对OKD、Rancher等平台提供支持,使系统具备十分便捷的集群组建能力,可以更安全的运行大规模的容器化工作负载。镜像下载地址详见[NestOS官网](https://nestos.openeuler.org/)。
diff --git a/docs/en/25.03/Cloud/_menu.md b/docs/en/25.03/Cloud/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..7d05dfaf0421483d91cdb9c4d6819d6ce927d133
--- /dev/null
+++ b/docs/en/25.03/Cloud/_menu.md
@@ -0,0 +1,35 @@
+---
+label: '云原生'
+children:
+ - label: '容器引擎'
+ children:
+ - reference: './ContainerEngine/iSulaContainerEngine/_menu.md'
+ - reference: './ContainerEngine/DockerEngine/_menu.md'
+ - label: '容器形态'
+ children:
+ - reference: './ContainerForm/SecureContainer/_menu.md'
+ - reference: './ContainerForm/SystemContainer/_menu.md'
+ - label: '容器运行时'
+ children:
+ - reference: './ContainerRuntime/Kuasar/_menu.md'
+ - label: '容器镜像构建工具'
+ children:
+ - reference: './ImageBuilder/isula-build/_menu.md'
+ - label: '云原生操作系统'
+ children:
+ - reference: './KubeOS/KubeOS/_menu.md'
+ - label: '云底座操作系统'
+ children:
+ - reference: './NestOS/NestOS/_menu.md'
+ - label: '混合部署'
+ children:
+ - reference: './HybridDeployment/rubik/_menu.md'
+ - reference: './HybridDeployment/oncn-bwm/_menu.md'
+ - label: '集群部署'
+ children:
+ - reference: './ClusterDeployment/Kubernetes/_menu.md'
+ - reference: './ClusterDeployment/iSulad+k8s/_menu.md'
+ - label: '服务网格'
+ children:
+ - reference: './Kmesh/Kmesh/_menu.md'
+---
diff --git a/docs/en/25.03/Cloud/index.md b/docs/en/25.03/Cloud/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..7d3f4694f4b5e1bde97476c3ffd396573ed55d31
--- /dev/null
+++ b/docs/en/25.03/Cloud/index.md
@@ -0,0 +1,4 @@
+---
+title: 云原生
+overview: true
+---
\ No newline at end of file
diff --git a/docs/en/25.03/EdgeComputing/K3s/K3s-deployment-guide.md b/docs/en/25.03/EdgeComputing/K3s/K3s-deployment-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..de7ce199c804388851a09d47582dd6ee59138f92
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/K3s/K3s-deployment-guide.md
@@ -0,0 +1,90 @@
+# K3s部署指南
+
+## 什么是K3s
+
+K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化。K3s 有以下增强功能:
+
+- 打包为单个二进制文件。
+- 使用基于 sqlite3 的轻量级存储后端作为默认存储机制。同时支持使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。
+- 封装在简单的启动程序中,通过该启动程序处理很多复杂的 TLS 和选项。
+- 默认情况下是安全的,对轻量级环境有合理的默认值。
+- 添加了简单但功能强大的batteries-included功能,例如:本地存储提供程序,服务负载均衡器,Helm controller 和 Traefik Ingress controller。
+- 所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。
+- 最大程度减轻了外部依赖性,K3s 仅需要 kernel 和 cgroup 挂载。
+
+## 适用场景
+
+K3s 适用于以下场景:
+
+- 边缘计算(Edge Computing)
+- 物联网(Internet of Things,IoT)
+- 持续集成(Continuous Integration,CI)
+- 开发(Development)
+- 基于ARM的单板计算机(ARM-based single-board computers)
+- 嵌入式K8s(Embedded K8s)
+
+由于运行 K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。在这些场景中,如果开发或测试人员需要对某些功能进行验证,或对某些问题进行重现,那么使用 K3s 不仅能够缩短启动集群的时间,还能够减少集群需要消耗的资源。
+
+## 部署K3s
+
+### 准备工作
+
+- 确保server节点及agent节点主机名不一致:
+
+可以通过 hostnamectl set-hostname “主机名” 进行主机名的修改。
+
+
+
+- 在各节点yum 安装 K3s:
+
+ K3s官网采用下载对应架构二进制可执行文件的格式,通过install.sh脚本进行离线安装,openEuler社区将该二进制文件的编译过程移植到社区中,并编译出RPM包。此处可通过yum命令直接进行下载安装。
+
+
+
+### 部署server节点
+
+如需在单个服务器上安装 K3s,可以在 server 节点上执行如下操作:
+
+```sh
+INSTALL_K3S_SKIP_DOWNLOAD=true k3s-install.sh
+```
+
+
+
+### 检查server部署情况
+
+
+
+### 部署agent节点
+
+首先查询server节点的token值,该token可在server节点的/var/lib/rancher/k3s/server/node-token查到。
+
+> **注意**:
+>
+> 后续我们只用到该token的后半部分。
+
+
+
+选择添加其他 agent,请在每个 agent 节点上执行以下操作。
+
+```sh
+INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken k3s-install.sh
+```
+
+> **注意**
+>
+> 将 myserver 替换为 server 的 IP 或有效的 DNS,并将 mynodetoken 替换 server 节点的 token:
+
+
+
+### 检查agent节点是否部署成功
+
+安装完毕后,回到 **server** 节点,执行 `kubectl get nodes`,可以看到agent节点已注册成功。
+
+
+
+至此,一个基础的k3s集群搭建完成。
+
+### 更多用法
+
+K3s的更多用法可以参考K3s官网, ,
diff --git a/docs/en/25.03/EdgeComputing/K3s/_menu.md b/docs/en/25.03/EdgeComputing/K3s/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..9717536710792eedcfc8845caaebfb73d59e4889
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/K3s/_menu.md
@@ -0,0 +1,8 @@
+---
+label: 'K3s部署指南'
+ismanual: 'Y'
+description: 'K3s 是一个轻量级的 Kubernetes 发行版,针对边缘计算等场景进行了优化'
+children:
+ - label: 'K3s部署指南'
+ href: './K3s-deployment-guide.md'
+---
diff --git a/docs/en/25.03/EdgeComputing/K3s/figures/agent-install.png b/docs/en/25.03/EdgeComputing/K3s/figures/agent-install.png
new file mode 100644
index 0000000000000000000000000000000000000000..dca1d64ec8aae821393bb715daf4c56b783a68e0
Binary files /dev/null and b/docs/en/25.03/EdgeComputing/K3s/figures/agent-install.png differ
diff --git a/docs/en/25.03/EdgeComputing/K3s/figures/check-agent.png b/docs/en/25.03/EdgeComputing/K3s/figures/check-agent.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa467713353d70ad513e8ee13ac9d8b6520b7ee0
Binary files /dev/null and b/docs/en/25.03/EdgeComputing/K3s/figures/check-agent.png differ
diff --git a/docs/en/25.03/EdgeComputing/K3s/figures/check-server.png b/docs/en/25.03/EdgeComputing/K3s/figures/check-server.png
new file mode 100644
index 0000000000000000000000000000000000000000..06343de9a8b0eacb0f6194cf438b2b27af88cae4
Binary files /dev/null and b/docs/en/25.03/EdgeComputing/K3s/figures/check-server.png differ
diff --git a/docs/en/25.03/EdgeComputing/K3s/figures/server-install.png b/docs/en/25.03/EdgeComputing/K3s/figures/server-install.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d30c8f4f73946c8b0555186c1736492039da731
Binary files /dev/null and b/docs/en/25.03/EdgeComputing/K3s/figures/server-install.png differ
diff --git a/docs/en/25.03/EdgeComputing/K3s/figures/set-hostname.png b/docs/en/25.03/EdgeComputing/K3s/figures/set-hostname.png
new file mode 100644
index 0000000000000000000000000000000000000000..32564d6159825b6d4131a6b138a493188ce88c6c
Binary files /dev/null and b/docs/en/25.03/EdgeComputing/K3s/figures/set-hostname.png differ
diff --git a/docs/en/25.03/EdgeComputing/K3s/figures/token.png b/docs/en/25.03/EdgeComputing/K3s/figures/token.png
new file mode 100644
index 0000000000000000000000000000000000000000..79e5313bd1d5e707659cd08d4aafdf528b9df8f0
Binary files /dev/null and b/docs/en/25.03/EdgeComputing/K3s/figures/token.png differ
diff --git a/docs/en/25.03/EdgeComputing/K3s/figures/yum-install.png b/docs/en/25.03/EdgeComputing/K3s/figures/yum-install.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e601a23a5a67e7927f12bc90d1a4137e1a3a567
Binary files /dev/null and b/docs/en/25.03/EdgeComputing/K3s/figures/yum-install.png differ
diff --git a/docs/en/25.03/EdgeComputing/KubeEdge/_menu.md b/docs/en/25.03/EdgeComputing/KubeEdge/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..d8b89a2d5ecd7ce104cc4c746b7b93fc015de4a3
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/KubeEdge/_menu.md
@@ -0,0 +1,11 @@
+---
+label: 'KubeEdge部署指南'
+ismanual: 'Y'
+description: 'KubeEdge 将 Kubernetes 的能力延伸到了边缘场景中'
+children:
+ - label: 'KubeEdge使用文档'
+ href: './kubeedge-usage-guide.md'
+ - label: 'KubeEdge部署指南'
+ href: './kubeedge-deployment-guide.md'
+---
+
diff --git a/docs/en/25.03/EdgeComputing/KubeEdge/kubeedge-deployment-guide.md b/docs/en/25.03/EdgeComputing/KubeEdge/kubeedge-deployment-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..5857daaf8bed314c269ba3ebdfb9c9091d06ab69
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/KubeEdge/kubeedge-deployment-guide.md
@@ -0,0 +1,224 @@
+# KubeEdge 部署指南
+
+## 介绍
+
+### KubeEdge
+
+KubeEdge 是一个致力于解决边缘场景问题的开源系统,它将容器化应用程序编排和设备管理的能力扩展到边缘设备。基于 Kubernetes,KubeEdge 为网络、应用程序部署以及云侧与边缘侧之间的元数据同步提供核心基础设施支持。KubeEdge 支持 MQTT,并允许开发人员编写自定义逻辑,在边缘上启用资源受限的设备通信。KubeEdge 由云部分和边缘部分组成,目前均已开源。
+
+>
+
+### iSulad
+
+iSulad 是一个轻量级容器 runtime 守护程序,专为 IOT 和 Cloud 基础设施而设计,具有轻便、快速且不受硬件规格和体系结构限制的特性,可以被更广泛地应用在云、IoT、边缘计算等多个场景。
+
+>
+
+## 集群概览
+
+### 组件版本
+
+| 组件 | 版本 |
+| ---------- | --------------------------------- |
+| OS | openEuler 22.03 |
+| Kubernetes | 1.20.2-4 |
+| iSulad | 2.0.11 |
+| KubeEdge | v1.8.0 |
+
+### 节点规划(示例)
+
+| 节点名 | 位置 | 组件 |
+| -------------- | ------------ | ------------------------------ |
+| cloud.kubeedge | 云侧(cloud) | k8s(master)、isulad、cloudcore |
+| edge.kubeedge | 边缘侧(edge) | isulad、edgecore |
+
+> 提示:云侧和边缘侧的主机名可以使用 `hostnamectl set-hostname [cloud,edge].kubeedge` 命令提前设置好
+
+## 准备
+
+### 下载工具包
+
+[kubeedge-tools](https://gitee.com/Poorunga/kubeedge-tools) 工具包提供了完备的离线安装包以及部署脚本,降低了部署复杂度并且支持在节点无法访问外网的条件下快速搭建 KubeEdge 集群。
+
+```bash
+# 下载 kubeedge-tools 工具包并解压(包括云侧和边缘侧)
+$ wget -O kubeedge-tools.zip https://gitee.com/Poorunga/kubeedge-tools/repository/archive/master.zip
+$ unzip kubeedge-tools.zip
+
+# 进入 kubeedge-tools 工具包目录(后续所有操作基于此目录)
+$ cd kubeedge-tools-master
+```
+
+### 部署 k8s
+
+以下操作仅在云侧执行
+
+#### 初始化云侧环境
+
+```bash
+$ ./setup-cloud.sh
+```
+
+#### 安装 k8s
+
+k8s 的安装部署使用 openEuler 22.03 SP2 的版本
+
+#### 安装云侧容器网络
+
+目前有丰富的 cni 软件可以为 k8s 节点提供容器网络功能,比如 [flannel](https://github.com/flannel-io/flannel)、[calico](https://github.com/projectcalico/calico)、[cilium](https://github.com/cilium/cilium) 等,如果你暂时不明确选用哪款 cni 软件,可以使用下方命令安装云侧容器网络:
+
+```bash
+$ ./install-flannel-cloud.sh
+```
+
+#### 检查部署情况
+
+```bash
+# 查看节点状态(Ready 即正常)
+$ kubectl get nodes
+NAME STATUS ROLES AGE VERSION
+cloud.kubeedge Ready control-plane,master 12m v1.20.2
+
+# 查看所有 k8s 组件运行状态(Running 即正常)
+$ kubectl get pods -n kube-system
+NAME READY STATUS RESTARTS AGE
+coredns-74ff55c5b-4ptkh 1/1 Running 0 15m
+coredns-74ff55c5b-zqx5n 1/1 Running 0 15m
+etcd-cloud.kubeedge 1/1 Running 0 15m
+kube-apiserver-cloud.kubeedge 1/1 Running 0 15m
+kube-controller-manager-cloud.kubeedge 1/1 Running 0 15m
+kube-flannel-cloud-ds-lvh4n 1/1 Running 0 13m
+kube-proxy-2tcnn 1/1 Running 0 15m
+kube-scheduler-cloud.kubeedge 1/1 Running 0 15m
+```
+
+## 部署
+
+### 部署 cloudcore
+
+以下操作仅在云侧执行
+
+#### 初始化集群
+
+```bash
+# --advertise-address 填写云侧节点的主机 IP 地址
+$ keadm init --advertise-address="云侧IP" --kubeedge-version=1.8.0
+...
+CloudCore started
+```
+
+#### 调整 cloudcore 配置
+
+```bash
+$ ./patch-cloud.sh
+```
+
+#### 检查部署情况
+
+```bash
+# active (running)即正常
+$ systemctl status cloudcore | grep running
+ Active: active (running) since Fri 2022-03-04 10:54:30 CST; 5min ago
+```
+
+至此,云侧的 cloudcore 已部署完成,接下来部署边缘侧 edgecore。
+
+### 部署 edgecore
+
+以下命令如无特殊说明则仅在边缘侧执行
+
+#### 初始化边缘侧环境
+
+```bash
+$ ./setup-edge.sh
+```
+
+#### 纳管边缘节点
+
+```bash
+# keadm gettoken 命令需要在云侧执行
+$ keadm gettoken
+96058ab80ffbeb87fe58a79bfb19ea13f9a5a6c3076a17c00f80f01b406b4f7c.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDY0NDg4NzF9.1mJegWB7SUVjgf-OvAqILgbZXeMHR9eOzMxpNFc42SI
+# 记录并保存此 token 值,后续步骤需要使用
+
+
+# keadm join 命令在边缘侧执行
+# --cloudcore-ipport 填写云侧节点的主机 IP 地址:10000,--token 填写上方 token 值
+$ keadm join --cloudcore-ipport=云侧IP:10000 --kubeedge-version=1.8.0 --token=96058ab80ffbeb87fe58a79bfb19ea13f9a5a6c3076a17c00f80f01b406b4f7c.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDY0NDg4NzF9.1mJegWB7SUVjgf-OvAqILgbZXeMHR9eOzMxpNFc42SI
+...
+KubeEdge edgecore is running...
+```
+
+#### 调整 edgecore 配置
+
+```bash
+$ ./patch-edge.sh
+```
+
+#### 安装边缘侧容器网络
+
+如果你暂时不明确选用哪款 cni 软件,可以使用下方命令安装边缘侧容器网络:
+
+```bash
+# 下方命令需要在云侧执行
+$ ./install-flannel-edge.sh
+```
+
+#### 检查边缘节点是否纳管成功
+
+```bash
+# 下方命令需要在云侧执行(发现已经有了边缘节点)
+$ kubectl get nodes
+NAME STATUS ROLES AGE VERSION
+cloud.kubeedge Ready control-plane,master 1h v1.20.2
+edge.kubeedge Ready agent,edge 10m v1.19.3-kubeedge-v1.8.0
+```
+
+至此,KubeEdge 集群部署完成,接下来我们测试一下从云侧下发应用到边缘侧。
+
+### 部署应用
+
+以下命令在云侧执行
+
+#### 部署nginx
+
+```bash
+$ kubectl apply -f yamls/nginx-deployment.yaml
+deployment.apps/nginx-deployment created
+
+# 查看应用是否部署到了边缘侧(Running 即正常)
+$ kubectl get pod -owide | grep nginx
+nginx-deployment-84b99f4bf-jb6sz 1/1 Running 0 30s 10.244.1.2 edge.kubeedge
+```
+
+#### 测试功能
+
+```bash
+# 进入边缘侧节点,访问 nginx 应用
+$ curl 10.244.1.2:80
+
+
+
+Welcome to nginx!
+
+
+
+Welcome to nginx!
+If you see this page, the nginx web server is successfully installed and
+working. Further configuration is required.
+
+For online documentation and support please refer to
+nginx.org .
+Commercial support is available at
+nginx.com .
+
+Thank you for using nginx.
+
+
+```
+
+至此,KubeEdge 部署已经全流程打通。
diff --git a/docs/en/25.03/EdgeComputing/KubeEdge/kubeedge-usage-guide.md b/docs/en/25.03/EdgeComputing/KubeEdge/kubeedge-usage-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..64cd9a6a8f83e5e26e6388a1e9825b49d9267623
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/KubeEdge/kubeedge-usage-guide.md
@@ -0,0 +1,224 @@
+# KubeEdge使用文档
+
+KubeEdge将Kubernetes的能力延伸到了边缘场景中,为云和边缘之间的网络,应用部署和元数据同步提供基础架构支持。KubeEdge在使用上与Kubernetes保持完全一致,除此之外还扩展了对边缘设备的管理与控制。本节将通过一个简单的例子向用户演示如何通过KubeEdge完成设备边云协同任务。
+
+## 1. 准备工作
+
+选用示例:**KubeEdge Counter Demo**
+
+计数器是一个伪设备,用户无需任何额外的物理设备即可运行此演示。计数器在边缘侧运行,用户可以从云侧在Web中对其进行控制,也可以从云侧在Web中获得计数器值。原理图如下:
+
+详细文档参考:
+
+1. 本示例要求KubeEdge版本必须是v1.2.1+,此次选择最新版的KubeEdge v1.8.0
+
+ ```sh
+ [root@ke-cloud ~]# kubectl get node
+ NAME STATUS ROLES AGE VERSION
+ ke-cloud Ready master 13h v1.20.2
+ ke-edge1 Ready agent,edge 64s v1.19.3-kubeedge-v1.8.0
+
+ 说明:本文接下来的验证将使用边缘节点ke-edge1进行,如果你参考本文进行相关验证,后续边缘节点名称的配置需要根据你的实际情况进行更改。
+ ```
+
+2. 确保k8s apiserver开启了以下配置:
+
+ ```shell
+ --insecuret-port=8080
+ --insecure-bind-address=0.0.0.0
+ ```
+
+ 可以通过修改/etc/kubernetes/manifests/kube-apiserver.yaml文件,并重启k8s-apiserver组件的pod来进行更改。
+
+3. 下载示例代码:
+
+ ```sh
+ [root@ke-cloud ~]# git clone https://github.com/kubeedge/examples.git $GOPATH/src/github.com/kubeedge/examples
+ ```
+
+## 2. 创建device model和device
+
+1. 创建device model
+
+ ```sh
+ [root@ke-cloud ~]# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
+ [root@ke-cloud crds~]# kubectl create -f kubeedge-counter-model.yaml
+ ```
+
+2. 创建device
+
+ 根据你的实际情况修改matchExpressions:
+
+ ```sh
+ [root@ke-cloud ~]# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
+ [root@ke-cloud crds~]# vim kubeedge-counter-instance.yaml
+ apiVersion: devices.kubeedge.io/v1alpha1
+ kind: Device
+ metadata:
+ name: counter
+ labels:
+ description: 'counter'
+ manufacturer: 'test'
+ spec:
+ deviceModelRef:
+ name: counter-model
+ nodeSelector:
+ nodeSelectorTerms:
+ - matchExpressions:
+ - key: 'kubernetes.io/hostname'
+ operator: In
+ values:
+ - ke-edge1
+
+ status:
+ twins:
+ - propertyName: status
+ desired:
+ metadata:
+ type: string
+ value: 'OFF'
+ reported:
+ metadata:
+ type: string
+ value: '0'
+
+ [root@ke-cloud crds~]# kubectl create -f kubeedge-counter-instance.yaml
+ ```
+
+## 3. 部署云端应用
+
+1. 修改代码
+
+ 云端应用web-controller-app用来控制边缘端的pi-counter-app应用,该程序默认监听的端口号为80,此处修改为8089,如下所示:
+
+ ```sh
+ [root@ke-cloud ~]# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app
+ [root@ke-cloud web-controller-app~]# vim main.go
+ package main
+
+ import (
+ "github.com/astaxie/beego"
+ "github.com/kubeedge/examples/kubeedge-counter-demo/web-controller-app/controller"
+ )
+
+ func main() {
+ beego.Router("/", new(controllers.TrackController), "get:Index")
+ beego.Router("/track/control/:trackId", new(controllers.TrackController), "get,post:ControlTrack")
+
+ beego.Run(":8089")
+ }
+ ```
+
+2. 构建镜像
+
+ 注意:构建镜像时,请将源码拷贝到GOPATH对应的路径下,如果开启了go mod请关闭。
+
+ ```sh
+ [root@ke-cloud web-controller-app~]# make all
+ [root@ke-cloud web-controller-app~]# make docker
+ ```
+
+3. 部署web-controller-app
+
+ ```sh
+ [root@ke-cloud ~]# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
+ [root@ke-cloud crds~]# kubectl apply -f kubeedge-web-controller-app.yaml
+ ```
+
+## 4. 部署边缘端应用
+
+边缘端的pi-counter-app应用受云端应用控制,主要与mqtt服务器通信,进行简单的计数功能。
+
+1. 修改代码与构建镜像
+
+ 需要将Makefile中的GOARCH修改为amd64才能运行该容器。
+
+ ```sh
+ [root@ke-cloud ~]# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/counter-mapper
+ [root@ke-cloud counter-mapper~]# vim Makefile
+ .PHONY: all pi-execute-app docker clean
+ all: pi-execute-app
+
+ pi-execute-app:
+ GOARCH=amd64 go build -o pi-counter-app main.go
+
+ docker:
+ docker build . -t kubeedge/kubeedge-pi-counter:v1.0.0
+
+ clean:
+ rm -f pi-counter-app
+
+ [root@ke-cloud counter-mapper~]# make all
+ [root@ke-cloud counter-mapper~]# make docker
+ ```
+
+2. 部署Pi Counter App
+
+ ```sh
+ [root@ke-cloud ~]# cd $GOPATH/src/github.com/kubeedge/examples/kubeedge-counter-demo/crds
+ [root@ke-cloud crds~]# kubectl apply -f kubeedge-pi-counter-app.yaml
+
+ 说明:为了防止Pod的部署卡在`ContainerCreating`,这里直接通过docker save、scp和docker load命令将镜像发布到边缘端
+
+ [root@ke-cloud ~]# docker save -o kubeedge-pi-counter.tar kubeedge/kubeedge-pi-counter:v1.0.0
+ [root@ke-cloud ~]# scp kubeedge-pi-counter.tar root@192.168.1.56:/root
+ [root@ke-edge1 ~]# docker load -i kubeedge-pi-counter.tar
+ ```
+
+## 5. 体验Demo
+
+现在,KubeEdge Demo的云端部分和边缘端的部分都已经部署完毕,如下:
+
+```sh
+[root@ke-cloud ~]# kubectl get pods -o wide
+NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
+kubeedge-counter-app-758b9b4ffd-f8qjj 1/1 Running 0 26m 192.168.1.66 ke-cloud
+kubeedge-pi-counter-c69698d6-rb4xz 1/1 Running 0 2m 192.168.1.56 ke-edge1
+```
+
+我们现在开始测试一下该Demo运行效果:
+
+1. 执行ON命令
+
+ 在web页面上选择ON,并点击Execute,可以在edge节点上通过以下命令查看执行结果:
+
+ ```sh
+ [root@ke-edge1 ~]# docker logs -f counter-container-id
+ ```
+
+2. 查看counter STATUS
+
+ 在web页面上选择STATUS,并点击Execute,会在Web页面上返回counter当前的status。
+
+3. 执行OFF命令
+
+ 在web页面上选择OFF,并点击Execute,可以再edge节点上通过以下命令查看执行结果:
+
+ ```sh
+ [root@ke-edge1 ~]# docker logs -f counter-container-id
+ ```
+
+## 6. 其他
+
+1. 更多的KubeEdge官方示例请参考
+
+ |Name | Description |
+ |---|---|
+ |[LED-RaspBerry-Pi](https://github.com/kubeedge/examples/blob/master/led-raspberrypi/README.md) |Controlling a LED light with Raspberry Pi using KubeEdge platform.|
+ |[Data Analysis @ Edge](https://github.com/kubeedge/examples/blob/master/apache-beam-analysis/README.md) | Analyzing data at edge by using Apache Beam and KubeEdge.|
+ |[Security@Edge](https://github.com/kubeedge/examples/blob/master/security-demo/README.md) | Security at edge using SPIRE for identity management.|
+ |[Bluetooth-CC2650-demo](https://github.com/kubeedge/examples/blob/master/bluetooth-CC2650-demo/README.md) |Controlling a CC2650 SensorTag bluetooth device using KubeEdge platform.|
+ |[Play Music @Edge through WeChat](https://github.com/kubeedge/examples/blob/master/wechat-demo/README.md) | Play music at edge based on WeChat and KubeEdge.|
+ |[Play Music @Edge through Web](https://github.com/kubeedge/examples/blob/master/web-demo/README.md) | Play music at edge based on Web and KubeEdge.|
+ |[Collecting temperature @Edge](https://github.com/kubeedge/examples/blob/master/temperature-demo/README.md) | Collecting temperature at edge based KubeEdge.|
+ |[Control pseudo device counter and collect data](https://github.com/kubeedge/examples/blob/master/kubeedge-counter-demo/README.md) | Control pseudo device counter and collect data based KubeEdge.|
+ |[Play Music @Edge through Twitter](https://github.com/kubeedge/examples/blob/master/ke-twitter-demo/README.md)| Play music at edge based on Twitter and KubeEdge.|
+ |[Control Zigbee @Edge through cloud](https://github.com/kubeedge/examples/blob/master/kubeedge-edge-ai-application/README.md) | Face detection at cloud using OpenCV and using it to control zigbee on edge using Kubeedge.|
+
+2. 使用EdgeMesh做边缘服务发现
+
+
+
+3. 自定义云边消息路由
+
+
diff --git a/docs/en/25.03/EdgeComputing/KubeEdge/overview.md b/docs/en/25.03/EdgeComputing/KubeEdge/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..b52a1d7075b8b60f255b9f2b6cce1380e259d3e6
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/KubeEdge/overview.md
@@ -0,0 +1,3 @@
+# KubeEdge 边缘计算平台用户指南
+
+本文档主要介绍了边缘计算平台 KubeEdge 的部署指南与使用文档,让用户了解 KubeEdge,并指导用户和管理员安装和使用 KubeEdge。
diff --git a/docs/en/25.03/EdgeComputing/_menu.md b/docs/en/25.03/EdgeComputing/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..7fa74d942a4656718366fa8e46d38dba32834731
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/_menu.md
@@ -0,0 +1,6 @@
+---
+label: '边缘计算'
+children:
+ - reference: './KubeEdge/_menu.md'
+ - reference: './K3s/_menu.md'
+---
diff --git a/docs/en/25.03/EdgeComputing/index.md b/docs/en/25.03/EdgeComputing/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..0a19114ebd5ee2338e79c0423c84ee8941730f38
--- /dev/null
+++ b/docs/en/25.03/EdgeComputing/index.md
@@ -0,0 +1,4 @@
+---
+title: 边缘计算
+overview: true
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Embedded/UniProton/UniProton-apis.md b/docs/en/25.03/Embedded/UniProton/UniProton-apis.md
new file mode 100644
index 0000000000000000000000000000000000000000..eaf58cce8f31d56291c3b952d17aec0c2066de0e
--- /dev/null
+++ b/docs/en/25.03/Embedded/UniProton/UniProton-apis.md
@@ -0,0 +1,6311 @@
+# UniProton接口说明
+
+## 任务
+
+### 创建并激活任务
+
+在OS启动之前(比如在uniAppInit)中创建的任务,只是简单地加入就绪队列。 OS启动后创建的任务,如果优先级高于当前任务且未锁任务,则立即发生任务调度并被运行,否则加入就绪队列,等待执行。
+
+**输入**: 任务创建参数,包括任务名、任务栈大小、任务优先级、任务处理函数等。
+
+**处理**:
+
+1. 申请任务栈空间,初始化任务栈,置栈顶魔术字。
+2. 初始化任务上下文。
+3. 初始化任务控制块。
+4. 激活任务,任务是否马上能得到执行,取决于OS是否已经启动、优先级是否高于当前任务且没有锁任务调度、当前线程是否为硬中断。
+
+**输出** :
+
+- 成功:任务ID,若任务具备执行条件,则直接运行任务,否则将任务挂入就绪队列。
+
+- 失败:提示错误码。
+
+### 删除任务
+
+ 删除任务并释放任务资源。
+
+**输入**:任务ID。
+
+**处理**:
+
+1. 检查任务是否具备删除条件,如锁任务调度情况下不允许删除任务。
+2. 如果任务处于阻塞状态,从对应的阻塞队列中摘除。
+3. 释放任务控制块。
+4. 释放任务栈空间。
+5. 从就绪队列中载入最高优先级的任务,若具备调度条件,则执行。
+
+**输出**:
+
+- 成功:若具备调度条件,则执行就绪队列中的最高任务;
+
+- 失败:返回错误码。
+
+### 挂起任务
+
+ 挂起任务。
+
+**输入**:任务ID。
+
+**处理**:将指定任务从就绪队列中摘除,若指定任务处于Running态,则会触发任务切换。
+
+**输出**:
+
+- 成功:挂起指定任务。
+
+- 失败:返回错误码。
+
+### 恢复任务
+
+恢复挂起的任务。
+
+**输入**:任务ID。
+
+**处理**:恢复挂起的任务,若任务仍处于延时、阻塞态,则只是取消挂起态,并不加入就绪队列。
+
+**输出**:
+
+- 成功:取消任务挂起状态。
+- 失败:返回错误码。
+
+### 任务延时
+
+将当前任务延时指定时间。
+
+**输入**:延时时间。
+
+**处理**:
+
+1. 延时时间转换成OS的Tick数。
+2. 将当前任务从就绪队列中摘除,置成延时态。
+3. 从就绪队列中载入最高优先级的任务,并执行。
+4. Tick中断处理函数中判断任务的延时时间是否已经足够,如果足够,将任务加入就绪队列。
+
+**输出**:
+
+- 成功:当前任务切出,就绪队列中的最高优先级任务切入。
+- 失败:返回错误码。
+
+### 锁任务调度
+
+禁止任务之间的切换。
+
+**输入**:锁任务调度请求。
+
+**处理**:
+
+1. 若有任务切换请求,将其清除。
+2. 锁任务调度次数依次递增。
+
+**输出**: 任务之间无法切换。
+
+### 恢复任务调度的锁/解锁状态
+
+与锁任务调度配对使用,是否解锁任务调度,取决于最近一次锁任务调度前,是否允许任务调度。
+
+**输入**:恢复任务调度的锁/解锁状态请求。
+
+**处理**:
+
+1. 锁任务调度次数依次递减。
+2. 若锁任务调度次数等于0,则发起任务调度。
+
+**输出**:若最近一次锁任务调度前,允许任务调度,则从就绪队列中载入最高优先级任务,并执行。否则,维持原状,不能发生任务切换。
+
+### 任务PID合法性检查
+
+检查指定任务PID是否合法。
+
+**输入**:任务PID。
+
+**处理**:判断输入的任务PID是否超过最大任务PID号或是否已创建。
+
+**输出**:
+
+- TRUE :任务PID有效。
+- FALSE:任务PID无效。
+
+### 任务私有数据获取
+
+获取当前任务的私有数据。
+
+**输入**:无。
+
+**处理**:将任务TCB中记录的任务私有数据返回。
+
+**输出**:任务私有数据。
+
+### 查询本核指定任务正在PEND的信号量
+
+查询指定任务正在PEND的信号量ID。
+
+**输入**:任务PID。
+
+**处理**: 根据任务状态和任务控制块,判断任务是否PEND在某个信号量上,以及PEND的信号量ID。
+
+**输出**:
+
+- 成功:返回信号量ID。
+- 失败:返回错误码。
+
+### 查询任务状态
+
+获取指定任务的状态。
+
+**输入**:任务PID。
+
+**处理**:将指定任务的TCB中记录的任务状态字段返回。
+
+**输出**:
+
+- 成功:返回任务状态信息。
+- 失败:返回错误码。
+
+### 查询任务上下文信息
+
+获取指定任务的上下文信息。
+
+**输入**:任务PID。
+
+**处理**: 将指定任务的TCB中记录的任务上下文信息返回。
+
+**输出**:
+
+- 成功:返回任务上下文信息。
+- 失败:返回错误码。
+
+### 查询任务基本信息
+
+获取任务基本信息,包括任务切换时的PC,SP、任务状态、优先级、任务栈大小、栈顶值,任务名等。
+
+**输入**:任务PID,用于存放任务基本信息查询结果的缓冲区
+
+**处理**: 将指定任务的TCB中记录的任务基本信息返回。
+
+**输出**:
+
+- 成功:返回任务基本信息。
+- 失败:返回错误码。
+
+### 任务优先级获取
+
+获取指定任务的优先级。
+
+**输入**:任务PID
+
+**处理**:将指定任务的TCB中记录的优先级字段返回。
+
+**输出**:
+
+- 成功:返回任务优先级信息。
+- 失败:返回错误码。
+
+### 任务优先级设定
+
+设置指定任务的优先级。
+
+**输入**:任务PID、优先级值
+
+**处理**:将输入的任务优先级信息存入指定任务TCB中优先级字段
+
+**输出**:
+
+- 成功:指定任务的优先级被修改。
+- 失败:返回错误码。
+
+### 调整指定优先级的任务调度顺序
+
+设置指定任务的优先级以及调整调度顺序。
+
+**输入**:指定的优先级、指定需要调整调度顺序的任务,用于保存被调整到队首的任务ID的缓冲。
+
+**处理**:若指定要调整调度顺序的任务为TASK_NULL_ID,则优先级队列中的第一个就绪任务调整至队尾;否则,将指定要调整调度顺序的任务调整至优先级队列的队首。
+
+**输出**:
+
+- 成功:指定优先级的任务调度顺序被修改。
+- 失败:返回错误码。
+
+## 事件
+
+### 写事件
+
+写事件操作实现对指定任务写入指定类型的事件,可以一次同时写多个事件。
+
+**输入**:任务ID、事件号。
+
+**处理**:
+
+1. 对指定任务事件类型写上输入事件。
+2. 判断目的任务是否正在接收等待事件,且其等待的事件是否已经符合唤醒条件(唤醒条件即读取的事件已经发生)。
+3. 如果符合唤醒条件,则需清除任务读事件状态。
+4. 如果符合唤醒条件,则需清除任务读事件状态。
+5. 清除任务超时状态。
+6. 在任务没有被挂起的情况下,需要将任务加入就绪队列并尝试任务调度。
+
+**输出**:
+
+- 成功:事件写入成功。
+- 失败:错误码。
+
+### 读事件
+
+读事件操作可以根据入参事件掩码类型读取单个或者多个事件。
+
+**输入**:要读取的事件掩码、读取事件所采取的策略、超时时间、接收事件的指针。
+
+**处理**:
+
+1. 根据入参事件掩码类型对自身任务输入读取事件类型。
+2. 判断事件读取模式,是读取输入的所有事件还是其中的任意一种事件。
+3. 根据读取模式,判断期望的事件是否满足读取情况。
+4. 判断事件等待模式:如果为等待事件模式则根据模式来设置相应的超时时间;如果为非等待模式则事件读取失败。
+5. 如果需要等待阻塞读取,则需要将自己的任务从就绪列表中删除,并进行任务调度。
+6. 读取成功后,清除读取的事件类型,并且把事件类型返回。
+
+**输出**:
+
+- 成功:读事件成功,事件指针赋值。
+- 失败:错误码
+
+## 队列
+
+### 创建队列
+
+创建一个队列,创建时可以设定队列长度和队列结点大小。
+
+**输入**: 队列节点个数、每个队列节点大小、队列ID指针。
+
+**处理**:
+
+1. 申请一个空闲的队列资源。
+2. 申请队列所需内存。
+3. 初始化队列配置。
+
+**输出**:
+
+- 成功:队列ID。
+- 失败:错误码。
+
+### 读队列
+
+读指定队列的数据。
+
+**输入**:队列ID、缓冲区指针、长度指针、超时时间。
+
+**处理**:
+
+1. 获取指定队列控制块。
+2. 读队列PEND标志,根据缓冲区大小填入队列数据。
+3. 修改队列头指针。
+
+**输出**:
+
+- 成功:缓冲区内填入队列数据。
+- 失败:错误码。
+
+### 写队列
+
+写数据到指定队列。
+
+**输入**: 队列ID、缓冲区指针、缓冲区长度、超时时间、优先级。
+
+**处理**:
+
+1. 获取指定队列控制块。
+2. 读队列PEND标志,选取消息节点,初始化消息节点并拷贝数据。
+3. 队列读资源计数器加一。
+
+**输出**:
+
+- 成功:写入队列数据成功。
+- 失败:错误码。
+
+### 删除队列
+
+删除一个消息队列,删除后队列资源被回收。
+
+**输入**:队列ID。
+
+**处理**:
+
+1. 获取指定队列控制块,确保队列未在使用中。
+2. 释放队列内存。
+
+**输出**:
+
+- 成功:删除队列成功。
+- 失败:错误码
+
+### 查询队列的历史最大使用长度
+
+获取从队列创建到删除前的历史最大使用长度。
+
+**输入**:队列ID、队列节点使用峰值指针。
+
+**处理**:
+
+1. 获取指定队列控制块。
+2. 将队列节点使用峰值赋值到指针参数。
+
+**输出**:
+
+- 成功:获取峰值成功。
+- 失败:错误码
+
+### 查询指定源PID的待处理消息个数
+
+从指定队列中,获取指定源PID的待处理消息个数。
+
+**输入**:队列ID、线程PID、待处理的消息个数指针。
+
+**处理**:
+
+1. 获取指定队列控制块。
+2. 遍历队列查询待处理的消息个数,赋值到指针变量。
+
+**输出**:
+
+- 成功:获取待处理的消息个数成功。
+- 失败:错误码。
+
+## 中断
+
+### 创建硬中断
+
+硬中断在使用前,必须先创建。
+
+**输入**:硬中断的创建参数,如:硬中断号(与芯片相关)、硬中断优先级、硬中断处理函数等。
+
+**处理**:根据硬中断号设置硬中断优先级、处理函数。
+
+**输出**:
+
+- 成功:硬中断触发后,CPU能够响应该硬中断,并回调硬中断处理函数。
+- 失败:返回错误码。
+
+### 硬中断属性设置
+
+在创建硬中断前,需要设置硬中断的模式,包括独立型(#OS_HWI_MODE_ENGROSS)和组合型(#OS_HWI_MODE_COMBINE)两种配置模式。
+
+**输入**:硬中断号、硬中断模式。
+
+**处理**:根据硬中断号设置硬中断的模式;
+
+**输出**:
+
+- 成功:指定的硬中断号被设置好硬中断模式。
+- 失败:返回错误码。
+
+### 删除硬中断
+
+删除相应硬中断或事件,取消硬中断处理函数的注册。
+
+**输入**:硬中断号。
+
+**处理**:取消指定硬中断的处理函数与中断号的绑定关系。
+
+**输出**:硬中断被删除,当硬中断信号触发后,CPU不会响应该中断。
+
+### 使能硬中断
+
+使能指定的硬中断。
+
+**输入**:硬中断号。
+
+**处理**:将指定硬中断的使能位置位。
+
+**输出**:指定的硬中断被使能,当硬中断信号触发后,CPU会响应该中断。
+
+### 屏蔽硬中断
+
+屏蔽指定的硬中断。
+
+**输入**:硬中断号。
+
+**处理**:清除指定硬中断的使能位。
+
+**输出**:指定的硬中断被屏蔽,当硬中断信号触发后,CPU不会响应该中断。
+
+### 恢复指定硬中断
+
+恢复指定的硬中断。
+
+**输入**:硬中断号、中断使能寄存器的保存值。
+
+**处理**:还原指定硬中断的使能位。
+
+**输出**:指定中断的使能位恢复为指定状态。
+
+### 禁止硬中断
+
+禁止响应所有可屏蔽硬中断。
+
+**输入**:禁止硬中断请求。
+
+**处理**:
+
+1. 记录系统状态,用于后续返回。
+2. 禁止响应所有可屏蔽硬中断。
+
+**输出**:
+
+- 所有可屏蔽硬中断都不能响应。
+- 禁止硬中断响应前的系统状态。
+
+### 恢复硬中断
+
+恢复硬中断的禁止或允许响应状态,与禁止硬中断配对使用。是否允许响应硬中断,取决于最近一次禁止硬中断前,系统是否允许响应硬中断。
+
+**输入**:最近一次禁止硬中断前的系统状态。
+
+**处理**:将系统状态恢复到最近一次禁止硬中断前。
+
+**输出**:系统状态恢复到最近一次禁止硬中断前。
+
+### 响应硬中断
+
+硬中断触发后,CPU会响应硬中断。
+
+**输入**:硬件触发的硬中断信号,且系统没有禁止硬中断。
+
+**处理**:
+
+1. 保存当前上下文。
+2. 调用硬中断处理函数。
+3. 若任务被打断,则恢复最高优先级任务的上下文,该任务不一定是被中断打断的任务。
+4. 若低优先级中断被打断,则直接恢复低先级中断的上下文。
+
+**输出**:硬中断被响应。
+
+### 触发硬中断
+
+触发指定核号的指定硬中断。
+
+**输入**:核号、硬中断号。
+
+**处理**:
+
+1. 目前只支持触发本核的硬中断,若指定的核号不为本核,则做报错处理。
+2. 目前只支持触发软件可触发的硬中断,若指定的中断无法进行软件触发,则做报错处理。
+3. 当以前两个条件都满足,则设置对应的中断触发寄存器,软件触发中断。
+
+**输出**:
+
+- 成功:响应的硬中断被触发。
+- 失败:返回错误码。
+
+### 清除中断位
+
+清除所有的中断请求位或指定的中断请求位。
+
+**输入**:硬中断号。
+
+**处理**:清除所有的中断请求位或指定的中断请求位。
+
+**输出**:所有的中断请求位或指定的中断请求位被清除
+
+## 定时器
+
+### 定时器创建
+
+根据定时器类型,触发模式,定时时长,处理函数等创建一个定时器。
+
+**输入**:
+
+1. 创建参数结构体(包括定时器类型,触发模式,定时时长,处理函数等)。
+2. 用于保存输出的定时器句柄的指针。
+
+**处理**:根据入参找到空闲控制块,将入参内容填入控制块中相应的字段中。
+
+**输出**:
+
+- 成功:定时器创建成功,后续可根据得到的定时器句柄做启动、删除等操作。
+- 失败:返回错误码。
+
+### 定时器删除
+
+删除指定的定时器。
+
+**输入**: 定时器句柄
+
+**处理**:根据传入的定时器句柄,找到定时器控制块,将其内容清空并将控制块挂接到相应的空闲链表中。
+
+**输出**:
+
+- 成功:定时器被删除。
+- 失败:返回错误码。
+
+### 定时器启动
+
+指定的定时器开始计时。
+
+**输入**: 定时器句柄
+
+**处理**:对于软件定时器,根据当前Tick计数以及定时器周期,计算结束时间,将此定时器控制块挂入定时器SortLink。
+
+**输出**:
+
+- 成功:定时器开始计时。
+- 失败:返回错误码。
+
+### 定时器停止
+
+指定的定时器停止计时。
+
+**输入**:定时器句柄。
+
+**处理**:对于软件定时器,计算剩余时间并将其保存后,将此定时器控制块从定时器SortLink中摘除。
+
+**输出**:
+
+- 成功:指定任务的信号量计数值被修改。
+- 失败:返回错误码。
+
+### 定时器重启
+
+指定的定时器重新开始计时。
+
+**输入**:定时器句柄
+
+**处理**:对于软件定时器,根据当前Tick计数以及定时器周期,计算结束时间,将此定时器控制块挂入定时器SortLink。
+
+**输出**:
+
+- 成功:指定任务的信号量计数值被修改。
+- 失败:返回错误码。
+
+### 软件定时器组创建
+
+创建一个软件定时器组,后续的软件定时器创建时需要以此为基础。
+
+**输入**:
+
+1. 软件定时器组创建参数(主要关注时钟源类型及最大支持的定时器个数)。
+2. 用于保存输出的定时器组号的地址。
+
+**处理**:根据传入的最大支持的定时器个数申请定时器控制块内存,并完成其初始化操作。
+
+**输出**:
+
+- 成功:基于Tick的软件定时器组被成功创建。
+- 失败:返回错误码。
+
+## 信号量
+
+### 信号量创建
+
+创建一个信号量,并设置其初始计数器数值。
+
+**输入**:信号量初始计数值、用于保存创建得到句柄的地址。
+
+**处理**:找到一个空闲信号量控制块,将输入的初始计数值填入后将信号量ID当做句柄返回。
+
+**输出**:
+
+- 成功:信号量被创建。
+- 失败:返回错误码。
+
+### 信号量删除
+
+删除指定信号量,若有任务阻塞于该信号量,则删除失败。
+
+**输入**:信号量句柄
+
+**处理**:对于核内信号量,根据输入的信号量句柄找到信号量控制块,通过查看控制块中任务阻塞链表是否为空来判断是否有任务阻塞于该信号量,若有则删除失败返回,否则释放该信号量控制块。
+
+**输出**:
+
+- 成功:信号量被删除。
+- 失败:返回错误码。
+
+### Pend信号量
+
+申请指定的信号量,若其计数值大于0,则直接将计数值减1返回,否则发生任务阻塞,等待时间可通过入参设定。
+
+**输入**:信号量句柄、等待时间
+
+**处理**:
+
+
+
+**输出**:
+
+- 成功:返回0。
+- 失败:返回错误码。
+
+### Post信号量
+
+发布信号量,将该信号量计数值+1,若有任务阻塞于该信号量,则将其唤醒。
+
+**输入**:信号量句柄。
+
+**处理**:
+
+
+
+**输出**:
+
+- 成功:信号量发布成功。
+- 失败:返回错误码。
+
+### 信号量计数值重置
+
+设置指定信号量计数值,如果有任务阻塞于该信号量,则设置失败。
+
+**输入**:信号量句柄、信号量计数值。
+
+**处理**:根据输入的信号量句柄,找到相应的信号量控制块,查看控制块中任务阻塞链表,若其不为空,则返回错误,否则将控制块中信号量计数值设为输入的计数值。
+
+**输出**:
+
+- 成功:指定信号量的计数值被修改;
+- 失败:返回错误码。
+
+### 信号量计数值获取
+
+ 获取指定信号量计数值。
+
+**输入**: 信号量句柄
+
+**处理**:根据输入的信号量句柄,找到相应的信号量控制块,将控制块中记录的信号量计数值返回。
+
+**输出**:
+
+- 成功:返回信号量计数值。
+- 失败:返回错误计数值标记。
+
+### 信号量阻塞任务PID获取
+
+获取阻塞在指定信号量上的任务个数及任务PID列表。
+
+**输入**:
+
+1. 信号量句柄。
+2. 用于存放输出的阻塞任务个数的地址。
+3. 用于存放输出的阻塞任务PID的缓冲区首地址。
+4. 用于存放输出的阻塞任务PID的缓冲区长度。
+
+**处理**:若有任务阻塞于指定信号量,则输出阻塞任务的个数及任务PID清单;否则,将阻塞任务个数置为0。
+
+**输出**:
+
+- 成功:输出阻塞于该信号量的任务个数及任务PID清单。
+- 失败:返回错误码。
+
+## 异常
+
+### 用户注册异常处理钩子
+
+用户注册异常处理函数类型定义的异常处理函数钩子,记录异常信息。
+
+**输入**:类型为ExcProcFunc的钩子函数。
+
+**处理**:将用户注册的钩子函数注册到OS框架里,发生异常时调用。
+
+**输出**:
+
+- 成功:注册成功。
+- 失败:返回错误码。
+
+## CPU占用率
+
+### 获取当前cpu占用率
+
+通过本接口获取当前cpu占用率。
+
+**输入**:无。
+
+**处理**:采用基于IDLE计数的统计算法,统计结果会有一定误差,误差不超过百分之五。
+
+**输出**:
+
+- 成功:返回当前的cpu占用率[0,10000]。
+- 失败:返回错误码。
+
+### 获取指定个数的线程的CPU占用率
+
+根据用户输入的线程个数,获取指定个数的线程CPU占用率。
+
+**输入**: 线程个数、缓冲区指针、实际线程个数指针。
+
+**处理**:
+
+1. 采用基于 IDLE 计数的统计算法,统计结果会有一定误差,误差不超过百分之五。
+2. 当配置项中的采样周期值等于0时,线程级CPUP采样周期为两次调用该接口或者PRT_CpupNow之间的间隔。否则,线程级CPUP采样周期为配置项中的OS_CPUP_SAMPLE_INTERVAL大小。
+3. 输出的实际线程个数不大于系统中实际的线程个数(任务个数和一个中断线程)。
+4. 若在一个采样周期内有任务被删除,则统计的任务线程和中断线程CPUP总和小于10000。
+
+**输出**:
+
+- 成功:在缓冲区写入cpu占用率。
+- 失败:返回错误码。
+
+### 设置CPU占用率告警阈值
+
+根据用户配置的 CPU 占用率告警阈值 warn 和告警恢复阈值 resume,设置告警和恢复阈值。
+
+**输入**:告警阈值、恢复阈值。
+
+**处理**:设置 CPUP 告警阈值和恢复阈值
+
+**输出**:
+
+- 成功:设置成功。
+- 失败:返回错误码。
+
+### 查询CPUP告警阈值和告警恢复阈值
+
+根据用户配置的告警阈值指针 warn 和告警恢复阈值指针 resume,查询告警阈值和告警恢复阈值。
+
+**输入**:告警阈值指针、恢复阈值指针。
+
+**处理**:获取 CPUP 告警阈值和恢复阈值,赋值指针变量。
+
+**输出**:
+
+- 成功:获取成功。
+- 失败:返回错误码。
+
+### 注册CPUP告警回调函数
+
+根据用户配置的回调函数 hook,注册 CPUP 告警回调函数。
+
+**输入**:类型为 CpupHookFunc 的 CPU 告警回调函数。
+
+**处理**:将用户的钩子函数注册到 OS 框架。
+
+**输出**:
+
+- 成功:注册成功。
+- 失败:错误码
+
+## OS启动
+
+### main函数入口
+
+二进制执行文件函数入口。
+
+**输入**:无
+
+**输出**:
+
+- 成功:返回OK。
+- 失败:错误码
+
+### 用户业务入口
+
+PRT_AppInit 用户业务函数入口,在 main 函数后调用,在此函数中添加业务功能代码。
+
+**输入**:无
+
+**输出**:
+
+- 成功:返回OK。
+- 失败:错误码
+
+### 硬件驱动初始化入口
+
+PRT_HardDrvInit 硬件驱动初始化函数入口,在 main 函数后调用,在此函数中添加板级驱动初始化功能代码。
+
+**输入**:无
+
+**输出**:
+
+- 成功:返回OK。
+- 失败:错误码
+
+### 硬件启动流程入口
+
+PRT_HardBootInit 在 OS 启动时调用,在main函数前被调用,可以用于 BSS 初始化、随机值设置等。
+
+**输入**:无
+
+**输出**:
+
+- 成功:返回OK。
+- 失败:错误码。
+
+## openamp
+
+### 初始化openamp资源函数
+
+初始化保留内存,初始化 remoteproc、virtio、rpmsg,建立 Uniproton 与 Linux 两端配对的 endpoint,供消息收发使用。
+
+**输入**:无。
+
+**输出**:
+
+- 成功:初始化成功。
+- 失败:错误码。
+
+### 消息接收函数
+
+接收消息,并触发SGI中断
+
+**输入**:
+
+1. 类型为 unsigned char * 的存储消息的缓冲区。
+2. 类型为 int 的消息预期长度。
+3. 类型为 int *,用于获取消息实际长度。
+
+**输出**:
+
+- 成功:消息接收成功。
+- 失败:错误码。
+
+### 消息发送函数
+
+发送消息和SGI中断
+
+**输入**:类型为 unsigned char * 的存储消息的缓冲区、类型为 int 的消息长度。
+
+**输出**:
+
+- 成功:消息发送成功。
+- 失败:错误码。
+
+### 释放openamp资源
+
+用于释放openamp资源。
+
+**输入**:无
+
+**输出**:
+
+- 成功:资源释放成功。
+- 失败:错误码。
+
+## POSIX接口
+
+| 接口名 | 适配情况 |
+| :---: | :-----: |
+| [pthread_atfork](#pthread_atfork) | 不支持 |
+| [pthread_attr_destroy](#pthread_attr_destroy) | 支持 |
+| [pthread_attr_getdetachstate](#pthread_attr_getdetachstate) | 支持 |
+| [pthread_attr_getguardsize](#pthread_attr_getguardsize) | 不支持 |
+| [pthread_attr_getinheritsched](#pthread_attr_getinheritsched) | 支持 |
+| [pthread_attr_getschedparam](#pthread_attr_getschedparam) | 支持 |
+| [pthread_attr_getschedpolicy](#pthread_attr_getschedpolicy) | 支持 |
+| [pthread_attr_getscope](#pthread_attr_getscope) | 支持 |
+| [pthread_attr_getstack](#pthread_attr_getstack) | 支持 |
+| [pthread_attr_getstackaddr](#pthread_attr_getstackaddr) | 支持 |
+| [pthread_attr_getstacksize](#pthread_attr_getstacksize) | 支持 |
+| [pthread_attr_init](#pthread_attr_init) | 支持 |
+| [pthread_attr_setdetachstate](#pthread_attr_setdetachstate) | 支持 |
+| [pthread_attr_setguardsize](#pthread_attr_setguardsize) | 不支持 |
+| [pthread_attr_setinheritsched](#pthread_attr_setinheritsched) | 支持 |
+| [pthread_attr_setschedparam](#pthread_attr_setschedparam) | 部分支持 |
+| [pthread_attr_setschedpolicy](#pthread_attr_setschedpolicy) | 部分支持 |
+| [pthread_attr_setscope](#pthread_attr_setscope) | 部分支持 |
+| [pthread_attr_setstack](#pthread_attr_setstack) | 支持 |
+| [pthread_attr_setstackaddr](#pthread_attr_setstackaddr) | 支持 |
+| [pthread_attr_setstacksize](#pthread_attr_setstacksize) | 支持 |
+| [pthread_barrier_destroy](#pthread_barrier_destroy) | 支持 |
+| [pthread_barrier_init](#pthread_barrier_init) | 部分支持 |
+| [pthread_barrier_wait](#pthread_barrier_wait) | 支持 |
+| [pthread_barrierattr_getpshared](#pthread_barrierattr_getpshared) | 支持 |
+| [pthread_barrierattr_setpshared](#pthread_barrierattr_setpshared) | 部分支持 |
+| [pthread_cancel](#pthread_cancel) | 支持 |
+| [pthread_cond_broadcast](#pthread_cond_broadcast) | 支持 |
+| [pthread_cond_destroy](#pthread_cond_destroy) | 支持 |
+| [pthread_cond_init](#pthread_cond_init) | 支持 |
+| [pthread_cond_signal](#pthread_cond_signal) | 支持 |
+| [pthread_cond_timedwait](#pthread_cond_timedwait) | 支持 |
+| [pthread_cond_wait](#pthread_cond_wait) | 支持 |
+| [pthread_condattr_destroy](#pthread_condattr_destroy) | 支持 |
+| [pthread_condattr_getclock](#pthread_condattr_getclock) | 支持 |
+| [pthread_condattr_getpshared](#pthread_condattr_getpshared) | 支持 |
+| [pthread_condattr_init](#pthread_condattr_init) | 支持 |
+| [pthread_condattr_setclock](#pthread_condattr_setclock) | 部分支持 |
+| [pthread_condattr_setpshared](#pthread_condattr_setpshared) | 部分支持 |
+| [pthread_create](#pthread_create) | 支持 |
+| [pthread_detach](#pthread_detach) | 支持 |
+| [pthread_equal](#pthread_equal) | 支持 |
+| [pthread_exit](#pthread_exit) | 支持 |
+| [pthread_getcpuclockid](#pthread_getcpuclockid) | 不支持 |
+| [pthread_getschedparam](#pthread_getschedparam) | 支持 |
+| [pthread_getspecific](#pthread_getspecific) | 支持 |
+| [pthread_join](#pthread_join) | 支持 |
+| [pthread_key_create](#pthread_key_create) | 支持 |
+| [pthread_key_delete](#pthread_key_delete) | 支持 |
+| [pthread_kill](#pthread_kill) | 不支持 |
+| [pthread_mutex_consistent](#pthread_mutex_consistent) | 不支持 |
+| [pthread_mutex_destroy](#pthread_mutex_destroy) | 支持 |
+| [pthread_mutex_getprioceiling](#pthread_mutex_getprioceiling) | 不支持 |
+| [pthread_mutex_init](#pthread_mutex_init) | 支持 |
+| [pthread_mutex_lock](#pthread_mutex_lock) | 支持 |
+| [pthread_mutex_setprioceiling](#pthread_mutex_setprioceiling) | 不支持 |
+| [pthread_mutex_timedlock](#pthread_mutex_timedlock) | 支持 |
+| [pthread_mutex_trylock](#pthread_mutex_trylock) | 支持 |
+| [pthread_mutex_unlock](#pthread_mutex_unlock) | 支持 |
+| [pthread_mutexattr_destroy](#pthread_mutexattr_destroy) | 支持 |
+| [pthread_mutexattr_getprioceiling](#pthread_mutexattr_getprioceiling) | 不支持 |
+| [pthread_mutexattr_getprotocol](#pthread_mutexattr_getprotocol) | 支持 |
+| [pthread_mutexattr_getpshared](#pthread_mutexattr_getpshared) | 部分支持 |
+| [pthread_mutexattr_getrobust](#pthread_mutexattr_getrobust) | 部分支持 |
+| [pthread_mutexattr_gettype](#pthread_mutexattr_gettype) | 支持 |
+| [pthread_mutexattr_init](#pthread_mutexattr_init) | 支持 |
+| [pthread_mutexattr_setprioceiling](#pthread_mutexattr_setprioceiling) | 不支持 |
+| [pthread_mutexattr_setprotocol](#pthread_mutexattr_setprotocol) | 部分支持 |
+| [pthread_mutexattr_setpshared](#pthread_mutexattr_setpshared) | 不支持 |
+| [pthread_mutexattr_setrobust](#pthread_mutexattr_setrobust) | 部分支持 |
+| [pthread_mutexattr_settype](#pthread_mutexattr_settype) | 支持 |
+| [pthread_once](#pthread_once) | 部分支持 |
+| [pthread_rwlock_destroy](#pthread_rwlock_destroy) | 支持 |
+| [pthread_rwlock_init](#pthread_rwlock_init) | 支持 |
+| [pthread_rwlock_rdlock](#pthread_rwlock_rdlock) | 支持 |
+| [pthread_rwlock_timedrdlock](#pthread_rwlock_timedrdlock) | 支持 |
+| [pthread_rwlock_timedwrlock](#pthread_rwlock_timedwrlock) | 支持 |
+| [pthread_rwlock_tryrdlock](#pthread_rwlock_tryrdlock) | 支持 |
+| [pthread_rwlock_trywrlock](#pthread_rwlock_trywrlock) | 支持 |
+| [pthread_rwlock_unlock](#pthread_rwlock_unlock) | 支持 |
+| [pthread_rwlock_wrlock](#pthread_rwlock_wrlock) | 支持 |
+| [pthread_rwlockattr_destroy](#pthread_rwlockattr_destroy) | 不支持 |
+| [pthread_rwlockattr_getpshared](#pthread_rwlockattr_getpshared) | 部分支持 |
+| [pthread_rwlockattr_init](#pthread_rwlockattr_init) | 不支持 |
+| [pthread_rwlockattr_setpshared](#pthread_rwlockattr_setpshared) | 部分支持 |
+| [pthread_self](#pthread_self) | 支持 |
+| [pthread_setcancelstate](#pthread_setcancelstate) | 支持 |
+| [pthread_setcanceltype](#pthread_setcanceltype) | 支持 |
+| [pthread_setschedparam](#pthread_setschedparam) | 部分支持 |
+| [pthread_setschedprio](#pthread_setschedprio) | 支持 |
+| [pthread_setspecific](#pthread_setspecific) | 支持 |
+| [pthread_sigmask](#pthread_sigmask) | 不支持 |
+| [pthread_spin_init](#pthread_spin_init) | 不支持 |
+| [pthread_spin_destory](#pthread_spin_destory) | 不支持 |
+| [pthread_spin_lock](#pthread_spin_lock) | 不支持 |
+| [pthread_spin_trylock](#pthread_spin_trylock) | 不支持 |
+| [pthread_spin_unlock](#pthread_spin_unlock) | 不支持 |
+| [pthread_testcancel](#pthread_testcancel) | 支持 |
+| [sem_close](#sem_close) | 支持 |
+| [sem_destroy](#sem_destroy) | 支持 |
+| [sem_getvalue](#sem_getvalue) | 支持 |
+| [sem_init](#sem_init) | 支持 |
+| [sem_open](#sem_open) | 支持 |
+| [sem_post](#sem_post) | 支持 |
+| [sem_timedwait](#sem_timedwait) | 支持 |
+| [sem_trywait](#sem_trywait) | 支持 |
+| [sem_unlink](#sem_unlink) | 部分支持 |
+| [sem_wait](#sem_wait) | 支持 |
+| [sched_yield](#sched_yield) | 支持 |
+| [sched_get_priority_max](#sched_get_priority_max) | 支持 |
+| [sched_get_priority_min](#sched_get_priority_min) | 支持 |
+| [asctime](#asctime) | 支持 |
+| [asctime_r](#asctime_r) | 支持 |
+| [clock](#clock) | 支持 |
+| [clock_getcpuclockid](#clock_getcpuclockid) | 部分支持 |
+| [clock_getres](#clock_getres) | 部分支持 |
+| [clock_gettime](#clock_gettime) | 支持 |
+| [clock_nanosleep](#clock_nanosleep) | 部分支持 |
+| [clock_settime](#clock_settime) | 支持 |
+| [ctime](#ctime) | 支持 |
+| [ctime_r](#ctime_r) | 支持 |
+| [difftime](#difftime) | 支持 |
+| [getdate](#getdate) | 不支持 |
+| [gettimeofday](#gettimeofday) | 支持 |
+| [gmtime](#gmtime) | 支持 |
+| [gmtime_r](#gmtime_r) | 支持 |
+| [localtime](#localtime) | 支持 |
+| [localtime_r](#localtime_r) | 支持 |
+| [mktime](#mktime) | 支持 |
+| [nanosleep](#nanosleep) | 支持 |
+| [strftime](#strftime) | 不支持 |
+| [strftime_l](#strftime_l) | 不支持 |
+| [strptime](#strptime) | 支持 |
+| [time](#time) | 支持 |
+| [timer_create](#timer_create) | 支持 |
+| [timer_delete](#timer_delete) | 支持 |
+| [timer_getoverrun](#timer_getoverrun) | 支持 |
+| [timer_gettime](#timer_gettime) | 支持 |
+| [timer_settime](#timer_settime) | 支持 |
+| [times](#times) | 支持 |
+| [timespec_get](#timespec_get) | 支持 |
+| [utime](#utime) | 不支持 |
+| [wcsftime](#wcsftime) | 不支持 |
+| [wcsftime_l](#wcsftime_l) | 不支持 |
+| [malloc](#malloc) | 支持 |
+| [free](#free) | 支持 |
+| [memalign](#memalign) | 支持 |
+| [realloc](#realloc) | 支持 |
+| [malloc_usable_size](#malloc_usable_size) | 支持 |
+| [aligned_alloc](#aligned_alloc) | 支持 |
+| [reallocarray](#reallocarray) | 支持 |
+| [calloc](#calloc) | 支持 |
+| [posix_memalign](#posix_memalign) | 支持 |
+| [abort](#abort) | 支持 |
+| [_Exit](#_Exit) | 支持 |
+| [atexit](#atexit) | 支持 |
+| [quick_exit](#quick_exit) | 支持 |
+| [at_quick_exit](#at_quick_exit) | 支持 |
+| [assert](#assert) | 支持 |
+| [div](#div) | 支持 |
+| [ldiv](#ldiv) | 支持 |
+| [lldiv](#lldiv) | 支持 |
+| [imaxdiv](#imaxdiv) | 支持 |
+| [wcstol](#wcstol) | 支持 |
+| [wcstod](#wcstod) | 支持 |
+| [fcvt](#fcvt) | 支持 |
+| [ecvt](#ecvt) | 支持 |
+| [gcvt](#gcvt) | 支持 |
+| [qsort](#qsort) | 支持 |
+| [abs](#abs) | 支持 |
+| [labs](#labs) | 支持 |
+| [llabs](#llabs) | 支持 |
+| [imaxabs](#imaxabs) | 支持 |
+| [strtol](#strtol) | 支持 |
+| [strtod](#strtod) | 支持 |
+| [atoi](#atoi) | 支持 |
+| [atol](#atol) | 支持 |
+| [atoll](#atoll) | 支持 |
+| [atof](#atof) | 支持 |
+| [bsearch](#bsearch) | 支持 |
+| [semget](#semget) | 支持 |
+| [semctl](#semctl) | 部分支持 |
+| [semop](#semop) | 部分支持 |
+| [semtimedop](#semtimedop) | 部分支持 |
+| [msgget](#msgget) | 支持 |
+| [msgctl](#msgctl) | 部分支持 |
+| [msgsnd](#msgsnd) | 部分支持 |
+| [msgrcv](#msgrcv) | 部分支持 |
+| [shmget](#shmget) | 不支持 |
+| [shmctl](#shmctl) | 不支持 |
+| [shmat](#shmat) | 不支持 |
+| [shmdt](#shmdt) | 不支持 |
+| [ftok](#ftok) | 不支持 |
+| [fstatat](#fstatat) | 支持 |
+| [fchmodat](#fchmodat) | 支持 |
+| [mkdir](#mkdir) | 支持 |
+| [chmod](#chmod) | 支持 |
+| [lstat](#lstat) | 支持 |
+| [utimensat](#utimensat) | 支持 |
+| [mkfifo](#mkfifo) | 支持 |
+| [fchmod](#fchmod) | 支持 |
+| [mknod](#mknod) | 支持 |
+| [statvfs](#statvfs) | 支持 |
+| [mkfifoat](#mkfifoat) | 支持 |
+| [umask](#umask) | 支持 |
+| [mknodat](#mknodat) | 支持 |
+| [futimesat](#futimesat) | 支持 |
+| [lchmod](#lchmod) | 支持 |
+| [futimens](#futimens) | 支持 |
+| [mkdirat](#mkdirat) | 支持 |
+| [fstat](#fstat) | 支持 |
+| [stat](#stat) | 支持 |
+| [open](#open) | 支持 |
+| [creat](#creat) | 支持 |
+| [posix_fadvise](#posix_fadvise) | 不支持 |
+| [fcntl](#fcntl) | 支持 |
+| [posix_fallocate](#posix_fallocate) | 支持 |
+| [openat](#openat) | 支持 |
+| [scandir](#scandir) | 不支持 |
+| [seekdir](#seekdir) | 支持 |
+| [readdir_r](#readdir_r) | 不支持 |
+| [fdopendir](#fdopendir) | 支持 |
+| [versionsort](#versionsort) | 支持 |
+| [alphasort](#alphasort) | 支持 |
+| [rewinddir](#rewinddir) | 支持 |
+| [dirfd](#dirfd) | 支持 |
+| [readdir](#readdir) | 不支持 |
+| [telldir](#telldir) | 支持 |
+| [closedir](#closedir) | 支持 |
+| [opendir](#opendir) | 支持 |
+| [putwchar](#putwchar) | 支持 |
+| [fgetws](#fgetws) | 支持 |
+| [vfwprintf](#vfwprintf) | 支持 |
+| [fscanf](#fscanf) | 支持 |
+| [snprintf](#snprintf) | 支持 |
+| [sprintf](#sprintf) | 支持 |
+| [fgetpos](#fgetpos) | 支持 |
+| [vdprintf](#vdprintf) | 支持 |
+| [gets](#gets) | 支持 |
+| [ungetc](#ungetc) | 支持 |
+| [ftell](#ftell) | 支持 |
+| [clearerr](#clearerr) | 支持 |
+| [getc_unlocked](#getc_unlocked) | 支持 |
+| [fmemopen](#fmemopen) | 支持 |
+| [putwc](#putwc) | 支持 |
+| [getchar](#getchar) | 支持 |
+| [open_wmemstream](#open_wmemstream) | 支持 |
+| [asprintf](#asprintf) | 支持 |
+| [funlockfile](#funlockfile) | 支持 |
+| [fflush](#fflush) | 支持 |
+| [vfprintf](#vfprintf) | 支持 |
+| [vsscanf](#vsscanf) | 支持 |
+| [vfwscanf](#vfwscanf) | 支持 |
+| [puts](#puts) | 支持 |
+| [getchar_unlocked](#getchar_unlocked) | 支持 |
+| [setvbuf](#setvbuf) | 支持 |
+| [getwchar](#getwchar) | 支持 |
+| [setbuffer](#setbuffer) | 支持 |
+| [vsnprintf](#vsnprintf) | 支持 |
+| [freopen](#freopen) | 支持 |
+| [fwide](#fwide) | 支持 |
+| [sscanf](#sscanf) | 支持 |
+| [fgets](#fgets) | 支持 |
+| [vswscanf](#vswscanf) | 支持 |
+| [vprintf](#vprintf) | 支持 |
+| [fputws](#fputws) | 支持 |
+| [wprintf](#wprintf) | 支持 |
+| [wscanf](#wscanf) | 支持 |
+| [fputc](#fputc) | 支持 |
+| [putchar](#putchar) | 支持 |
+| [flockfile](#flockfile) | 支持 |
+| [vswprintf](#vswprintf) | 支持 |
+| [fputwc](#fputwc) | 支持 |
+| [fopen](#fopen) | 支持 |
+| [tmpnam](#tmpnam) | 支持 |
+| [ferror](#ferror) | 支持 |
+| [printf](#printf) | 支持 |
+| [open_memstream](#open_memstream) | 支持 |
+| [fwscanf](#fwscanf) | 支持 |
+| [fprintf](#fprintf) | 支持 |
+| [fgetc](#fgetc) | 支持 |
+| [rewind](#rewind) | 支持 |
+| [getwc](#getwc) | 支持 |
+| [scanf](#scanf) | 支持 |
+| [perror](#perror) | 支持 |
+| [vsprintf](#vsprintf) | 支持 |
+| [vasprintf](#vasprintf) | 支持 |
+| [getc](#getc) | 支持 |
+| [dprintf](#dprintf) | 支持 |
+| [popen](#popen) | 不支持 |
+| [putc](#putc) | 支持 |
+| [fseek](#fseek) | 支持 |
+| [fgetwc](#fgetwc) | 支持 |
+| [tmpfile](#tmpfile) | 支持 |
+| [putw](#putw) | 支持 |
+| [tempnam](#tempnam) | 支持 |
+| [vwprintf](#vwprintf) | 支持 |
+| [getw](#getw) | 支持 |
+| [putchar_unlocked](#putchar_unlocked) | 支持 |
+| [fread](#fread) | 支持 |
+| [fileno](#fileno) | 支持 |
+| [remove](#remove) | 支持 |
+| [putc_unlocked](#putc_unlocked) | 支持 |
+| [fclose](#fclose) | 支持 |
+| [feof](#feof) | 支持 |
+| [fwrite](#fwrite) | 支持 |
+| [setbuf](#setbuf) | 支持 |
+| [pclose](#pclose) | 不支持 |
+| [swprintf](#swprintf) | 支持 |
+| [fwprintf](#fwprintf) | 支持 |
+| [swscanf](#swscanf) | 支持 |
+| [rename](#rename) | 支持 |
+| [getdelim](#getdelim) | 支持 |
+| [vfscanf](#vfscanf) | 支持 |
+| [setlinebuf](#setlinebuf) | 支持 |
+| [fputs](#fputs) | 支持 |
+| [fsetpos](#fsetpos) | 支持 |
+| [fopencookie](#fopencookie) | 支持 |
+| [fgetln](#fgetln) | 支持 |
+| [vscanf](#vscanf) | 支持 |
+| [ungetwc](#ungetwc) | 支持 |
+| [getline](#getline) | 支持 |
+| [ftrylockfile](#ftrylockfile) | 支持 |
+| [vwscanf](#vwscanf) | 支持 |
+
+### 任务管理
+
+#### pthread_attr_init
+
+pthread_attr_init() 函数初始化一个线程对象的属性,需要用 pthread_attr_destroy() 函数对其去除初始化。
+
+**参数**:指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr,结构中的元素分别对应着新线程的运行属性。
+
+**输出**:
+
+- 0:初始化成功。
+- ENOMEM:内存不足,无法初始化线程属性对象。
+- EBUSY:attr是以前初始化但未销毁的线程属性。
+
+#### pthread_attr_destroy
+
+pthread_attr_destroy()函数应销毁线程属性对象。被销毁的attr属性对象可以使用pthread_attr_init()重新初始化;在对象被销毁后引用该对象的结果是未定义的。
+
+**参数**:指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+
+**输出**:
+
+- 0:函数销毁对象成功。
+- EINVAL:attr指向的是未初始化的线程属性对象。
+
+#### pthread_attr_setstackaddr
+
+pthread_attr_setstackaddr()函数设置attr对象中的线程创建堆栈addr属性。堆栈addr属性指定用于创建线程堆栈的存储位置。
+
+**输入**:指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr、 栈地址stackaddr。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:attr指向的是未初始化的线程属性对象。
+
+#### pthread_attr_getstackaddr
+
+pthread_attr_getstackaddr()如果成功,函数将堆栈地址属性值存储在堆栈地址中。
+
+**参数**:指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr、栈地址stackaddr.
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:attr指向的是未初始化的线程属性对象。
+
+#### pthread_attr_getstacksize
+
+pthread_attr_getstacksize()和pthread_attr_setstacksize()函数分别应获取和设置 attr 对象中的线程创建堆栈大小属性(以字节为单位)。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr.
+2. 栈大小指针stacksize,指向设置或获取的堆栈大小。
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:attr指向的是未初始化的线程属性对象。
+
+#### pthread_attr_setstacksize
+
+设置attr对象中的线程创建堆栈大小属性。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 栈大小指针stacksize,指向设置或获取的堆栈大小。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:堆栈size小于最小值或超过限制。
+
+#### pthread_attr_getinheritsched
+
+获取线程的继承属性。
+
+**参数**:
+
+- 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+- 线程的继承性指针inheritsched。
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:attr指向的是未初始化的线程属性对象。
+
+#### pthread_attr_setinheritsched
+
+设置线程的继承属性。可设置如下参数:
+
+- PTHREAD_INHERIT_SCHED:指定线程调度属性应继承自创建线程,并且应忽略此attr参数中的调度属性。
+- PTHREAD_EXPLICIT_SCHED:指定线程调度属性应设置为此属性对象中的相应值。
+
+**参数**:
+
+- 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+- 线程的继承性inheritsched。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:继承的值无效,或attr指向的是未初始化的线程属性对象。
+- ENOTSUP:试图将属性设置为不支持的值。
+
+#### pthread_attr_getschedpolicy
+
+获取调度策略属性,策略支持SCHED_FIFO。当使用调度策略SCHED_FIFO执行的线程正在等待互斥体时,互斥体解锁,它们应按优先级顺序获取互斥体。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 线程的调度策略指针policy。
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:attr指向的是未初始化的线程属性对象。
+
+#### pthread_attr_setschedpolicy
+
+设置调度策略属性,策略支持SCHED_FIFO。当使用调度策略SCHED_FIFO执行的线程正在等待互斥体时,互斥体解锁时,它们应按优先级顺序获取互斥体。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 线程的调度策略policy。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:policy的值无效,或者attr指向没有初始化的线程对象。
+- ENOTSUP:试图将属性设置为不支持的值。
+
+#### pthread_attr_getdetachstate
+
+获取线程分离属性,分离状态应设置为PTHREAD_CREATE_DETAED或PTHREAD_CREATE_JOI无BLE。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 分离属性指针detachstate。
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:attr指向没有初始化的线程对象。
+
+#### pthread_attr_setdetachstate
+
+设置线程分离属性。分离状态应设置为PTHREAD_CREATE_DETAED或PTHREAD_CREATE_JOINABLE。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 分离属性detachstate。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:attr指向没有初始化的线程对象或分离状态的值无效。
+
+#### pthread_attr_setschedparam
+
+pthread_attr_setschedparam() 可用来设置线程属性对象的优先级属性。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 调度属性指针schedparam。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:参数不合法或attr未初始化。
+- ENOTSUP:schedparam的优先级属性不支持。
+
+#### pthread_attr_getschedparam
+
+pthread_attr_getschedparam() 可用来获取线程属性对象的优先级属性。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 调度属性指针schedparam。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:参数不合法或attr未初始化。
+
+#### pthread_attr_getscope
+
+pthread_attr_getscope() 可用来获取线程属性对象的作用域属性。
+
+**参数**:
+
+- 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+- 线程的作用域属性指针scope。
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:指针未初始化。
+
+#### pthread_attr_setscope
+
+设置线程的作用域,支持PTHREAD_SCOPE_SYSTEM,控制线程在系统级竞争资源。
+
+**参数**:
+
+1. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+2. 作用域scope。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:scope的值无效,或者attr指向没有初始化的线程对象。
+- ENOTSUP:试图将属性设置为不支持的值。
+
+#### pthread_attr_getstack
+
+pthread_attr_getstack() 可用来获取线程属性对象的栈信息。
+
+**参数**:
+
+- 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+- 线程的栈地址指针stackAddr。
+- 线程的栈大小指针stackSize。
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:指针未初始化。
+
+#### pthread_attr_setstack
+
+pthread_attr_setstack() 可用来设置线程属性对象的栈地址和栈大小。
+
+**参数**:
+
+- 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+- 线程的栈地址stackAddr。
+- 线程的栈大小stackSize。
+
+**输出**:
+
+- 0:获取成功。
+- EINVAL:指针未初始化或值无效。
+
+#### pthread_attr_getguardsize
+
+暂不支持。
+
+#### pthread_attr_setguardsize
+
+暂不支持。
+
+#### pthread_atfork
+
+暂不支持。
+
+#### pthread_create
+
+pthread_create()函数创建一个新线程,其属性由 attr 指定。如果 attr 为 NULL,则使用默认属性。创建成功后,pthread_create()应将创建的线程的ID存储在参数 thread 的位置。
+
+**参数**:
+
+1. 指向线程[标识符](https://baike.baidu.com/item/标识符?fromModule=lemma_inlink)的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)thread。
+2. 指向一个线程属性结构的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)attr。
+3. 线程处理函数的起始地址 start_routine。
+4. 运行函数的参数 arg。
+
+**输出**:
+
+- 0:创建成功。
+- EINVAL:attr指定的属性无效。
+- EAGAIN:系统缺少创建新线程所需的资源,或者将超过系统对线程总数施加的限制。
+- EPERM:调用者没有权限。
+
+#### pthread_cancel
+
+取消线程的执行。pthread_cancel()函数应请求取消线程。目标线程的可取消状态和类型决定取消何时生效。当取消被操作时,应调用线程的取消处理程序。
+
+**参数**:线程的ID thread。
+
+**输出**:
+
+- 0:取消成功。
+- ESRCH:找不到与给定线程ID相对应的线程。
+
+#### pthread_testcancel
+
+设置可取消状态。pthread_testcancel()函数应在调用线程中创建一个取消点。如果禁用了可取消性,pthread_testcancel()函数将无效。
+
+**参数**:无
+
+**输出**:无
+
+#### pthread_setcancelstate
+
+pthread_setcancelstate() 将调用线程的可取消性状态设置为 state 中给出的值。线程以前的可取消性状态返回到oldstate所指向的缓冲区中。state状态的合法值为PTHREAD_CANCEL_E无BLE和PTHREAD_CANCEL_DISABLE。
+
+**参数**:
+
+- 线程的可取消性状态 state。
+- 之前的可取消状态 oldstate。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:指定的状态不是 PTHREAD_CANCEL_E无BLE 或 PTHREAD_CANCEL_DISABLE。
+
+#### pthread_setcanceltype
+
+pthread_setcanceltype()函数应原子地将调用线程的可取消类型设置为指定的类型,并在oldtype引用的位置返回上一个可取消类型。类型的合法值为PTHREAD_CANCEL_DEFERRED和PTHREAD_CANCEL_ASYNCHRONOUS。
+
+**输入**:
+
+- 线程的可取消类型type。
+- 之前的可取消类型oldtype。
+
+**输出**:
+
+- 0:设置成功。
+- EINVAL:指定的类型不是PTHREAD_CANCEL_DEFERRED或PTHREAD_CANCEL_ASYNCHRONOUS。
+
+#### pthread_exit
+
+线程的终止可以是调用 pthread_exit 或者该线程的例程结束。由此可看出,一个线程可以隐式退出,也可以显式调用 pthread_exit 函数来退出。pthread_exit 函数唯一的参数 value_ptr 是函数的返回代码,只要 pthread_join 中的第二个参数 value_ptr 不是NULL,这个值将被传递给 value_ptr。
+
+**参数**:线程退出状态value_ptr,通常传NULL。
+
+**输出**:无
+
+#### pthread_cleanup_push
+
+pthread_cleanup_push() 函数应将指定的取消处理程序推送到调用线程的取消堆栈上。pthread_cleanup_push必须和pthread_cleanup_pop同时使用。当push后,在线程退出前使用pop,便会调用清理函数。
+
+**参数**:
+
+1. 取消处理程序入口地址 routine。
+2. 传递给处理函数的参数 arg。
+
+**输出**:无
+
+#### pthread_cleanup_pop
+
+pthread_cleanup_pop()应删除调用线程取消处理程序,并可选择调用它(如果execute非零)。
+
+**参数**:执行参数execute。
+
+**输出**:无
+
+#### pthread_setschedprio
+
+pthread_setschedprio()函数应将线程 ID 指定的调度优先级设置为 prio 给出的值。如果 pthread_setschedprio()函数失败,则目标线程的调度优先级不应更改。
+
+**参数**:
+
+1. 线程ID:thread。
+2. 优先级:prio。
+
+**输出**:
+
+- 0,设置成功。
+- EINVAL:prio对指定线程的调度策略无效。
+- ENOTSUP:试图将优先级设置为不支持的值。
+- EPERM:调用者没有设置指定线程的调度策略的权限。
+- EPERM:不允许将优先级修改为指定的值。
+- ESRCH:thread指定的线程不存在。
+
+#### pthread_self
+
+pthread_self()函数应返回调用线程的线程ID。
+
+**参数**:无
+
+**输出**:返回调用线程的线程ID。
+
+#### pthread_equal
+
+此函数应比较线程ID t1和t2。
+
+**参数**:
+
+1. 线程ID t1。
+2. 线程ID t2。
+
+**输出**:
+
+- 如果t1和t2相等,pthread_equal()函数应返回非零值。
+- 如果t1和t2不相等,应返回零。
+- 如果t1或t2不是有效的线程ID,则行为未定义。
+
+#### sched_yield
+
+sched_yield()函数应强制正在运行的线程放弃处理器,并触发线程调度。
+
+**参数**:无
+
+**输出**:输出0时,成功完成;否则应返回值-1。
+
+#### sched_get_priority_max
+
+sched_get_priority_max()和 sched_get_priority_min()函数应分别返回指定调度策略的优先级最大值或最小值。
+
+**参数**:调度策略policy。
+
+**输出**:
+
+返回值:
+
+- -1:失败。
+- 返回优先级最大值。
+
+errno:
+
+- EINVAL:调度策略非法。
+
+#### sched_get_priority_min
+
+返回指定调度策略的优先级最小值
+
+**参数**:调度策略policy。
+
+**输出**:
+
+返回值:
+
+- -1:失败。
+- 返回优先级最小值。
+
+errno:
+
+- EINVAL:调度策略非法。
+
+#### pthread_join
+
+pthread_join() 函数,以阻塞的方式等待 thread 指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且 thread 指定的线程必须是 joi无ble 的。当 pthread_join()成功返回时,目标线程已终止。对指定同一目标线程的pthread_join()的多个同时调用的结果未定义。如果调用pthread_join()的线程被取消,则目标线程不应被分离
+
+**参数**:
+
+1. 线程ID:thread。
+2. 退出线程:返回值value_ptr。
+
+**输出**:
+
+- 0:成功完成。
+- ESRCH:找不到与给定ID相对应的线程。
+- EDEADLK:检测到死锁或thread的值指定调用线程。
+- EINVAL:thread指定的线程不是joinable的。
+
+#### pthread_detach
+
+实现线程分离,即主线程与子线程分离,子线程结束后,资源自动回收。
+
+**参数**:线程ID:thread。
+
+**输出**:
+
+- 0:成功完成。
+- EINVAL:thread是分离线程。
+- ESRCH:给定线程ID指定的线程不存在。
+
+#### pthread_key_create
+
+分配用于标识线程特定数据的键。pthread_key_create 第一个参数为指向一个键值的[指针](https://baike.baidu.com/item/指针/2878304?fromModule=lemma_inlink),第二个参数指明了一个 destructor 函数,如果这个参数不为空,那么当每个线程结束时,系统将调用这个函数来释放绑定在这个键上的内存块。
+
+**参数**:
+
+1. 键值的[指针](https://baike.baidu.com/item/指针/2878304?fromModule=lemma_inlink)key。
+2. destructor 函数入口 destructor。
+
+**输出**:
+
+- 0:创建成功。
+- EAGAIN:系统缺乏创建另一个特定于线程的数据密钥所需的资源,或者已超过系统对每个进程的密钥总数施加的限制。
+- ENOMEM:内存不足,无法创建密钥。
+
+#### pthread_setspecific
+
+pthread_setspecific() 函数应将线程特定的 value 与通过先前调用 pthread_key_create()获得的 key 关联起来。不同的线程可能会将不同的值绑定到相同的键上。这些值通常是指向已保留供调用线程使用的动态分配内存块的指针。
+
+**参数**:
+
+1. 键值key。
+2. 指针value
+
+**输出**:
+
+- 0:设置成功。
+- ENOMEM:内存不足,无法将非NULL值与键关联。
+- EINVAL:key的值不合法。
+
+#### pthread_getspecific
+
+将与key关联的数据读出来,返回数据类型为 void *,可以指向任何类型的数据。需要注意的是,在使用此返回的指针时,需满足是 void 类型,虽指向关联的数据地址处,但并不知道指向的数据类型,所以在具体使用时,要对其进行强制类型转换。
+
+**参数**:键值key。
+
+**输出**:
+
+- 返回与给定 key 关联的线程特定数据值。
+- NULL:没有线程特定的数据值与键关联。
+
+#### pthread_key_delete
+
+销毁线程特定数据键。
+
+**参数**:需要删除的键key。
+
+**输出**:
+
+- 0:删除成功。
+- EINVAL:key值无效。
+
+#### pthread_getcpuclockid
+
+暂不支持。
+
+#### pthread_getschedparam
+
+获取线程调度策略和优先级属性。
+
+**参数**:
+
+1. 线程对象指针thread。
+2. 调度策略指针policy。
+3. 调度属性对象指针param。
+
+**输出**:
+
+- 0:删除成功。
+- EINVAL:指针未初始化。
+
+#### pthread_setschedparam
+
+设置线程调度策略和优先级属性。调度策略仅支持SCHED_FIFO。
+
+**参数**:
+
+1. 线程对象指针thread。
+2. 调度策略指针policy。
+3. 调度属性对象指针param。
+
+**输出**:
+
+- 0:删除成功。
+- EINVAL:指针未初始化。
+- ENOTSUP:设置不支持的值。
+
+#### pthread_kill
+
+暂不支持。
+
+#### pthread_once
+
+pthread_once() 函数使用指定once_contol变量会保证init_routine函数只执行一次。当前init_routine函数不支持被取消。
+
+**参数**:
+
+1. 控制变量control。
+2. 执行函数init_routine。
+
+**输出**:
+
+- 0:删除成功。
+- EINVAL:指针未初始化。
+
+#### pthread_sigmask
+
+暂不支持。
+
+#### pthread_spin_init
+
+暂不支持。
+
+#### pthread_spin_destory
+
+暂不支持。
+
+#### pthread_spin_lock
+
+暂不支持。
+
+#### pthread_spin_trylock
+
+暂不支持。
+
+#### pthread_spin_unlock
+
+暂不支持。
+
+### 信号量管理
+
+#### sem_init
+
+sem_init()函数应初始化 sem 引用的匿名信号量。初始化信号量的值应为 value。在成功调用 sem_init()后,信号量可用于后续调用 sem_wait()、sem_timedwait()、sem_trywait()、sem_post()和sem_destroy()。此信号量应保持可用,直到信号量被销毁。
+
+**参数**:
+
+1. 指向信号量指针sem。
+2. 指明信号量的类型pshared。
+3. 信号量值的大小value。
+
+**输出**:
+
+- 0:初始化成功。
+- EINVAL:值参数超过{SEM_VALUE_MAX}。
+- ENOSPC:初始化信号量所需的资源已耗尽,或已达到信号量的限制。
+- EPERM:缺乏初始化信号量的权限。
+
+#### sem_destroy
+
+sem_destroy()函数销毁 sem 指示的匿名信号量。只有使用 sem_init()创建的信号量才能使用 sem_destroy()销毁;使用命名信号量调用 sem_destroy()的效果未定义。在 sem 被另一个对 sem_init()的调用重新初始化之前,后续使用信号量 sem 的效果是未定义的。
+
+**参数**:指向信号量指针sem。
+
+**输出**:
+
+- 0:销毁成功。
+- EINVAL:sem不是有效的信号量。
+- EBUSY:信号量上当前有线程被阻止。
+
+#### sem_open
+
+创建并初始化有名信号量。此信号量可用于后续对 sem_wait()、sem_timedwait()、sem_trywait()、sem_post()和sem_close() 的调用。
+
+**参数**:
+
+1. 信号量名无me指针。
+
+2. oflag参数控制信号量是创建还是仅通过调用sem_open()访问。以下标志位可以在oflag中设置:
+
+ - O_CREAT:如果信号量不存在,则此标志用于创建信号量。
+
+ - O_EXCL:如果设置了O_EXCL和O_CREAT,且信号量名称存在,sem_open()将失败。如果设置了O_EXCL而未设置O_CREAT,则效果未定义。
+
+3. 如果在oflag参数中指定了O_CREAT和O_EXCL以外的标志,则效果未指定。
+
+**输出**:
+
+- 创建并初始化成功,返回信号量地址。
+- EACCES:创建命名信号量的权限被拒绝。
+- EEXIST:已设置O_CREAT和O_EXCL,且命名信号量已存在。
+- EINTR:sem_open()操作被信号中断。
+- EINVAL:给定名称不支持sem_open(),或在oflag中指定了O_CREAT,并且值大于最大值。
+- EMFILE:当前使用的信号量描述符或文件描述符太多。
+- ENAMETOOLONG:name参数的长度超过{PATH_MAX},或者路径名组件的长度超过{NAME_MAX}。
+- ENFILE:系统中当前打开的信号量太多。
+- ENOENT:未设置O_CREAT且命名信号量不存在。
+- ENOSPC:没有足够的空间来创建新的命名信号量。
+
+#### sem_close
+
+关闭一个命名信号量。未命名的信号量(由sem_init() 创建的信号量)调用 sem_close() 的效果未定义。sem_close() 函数应解除系统分配给此信号量的任何系统资源。此过程后续使用sem指示的信号量的影响未定义。
+
+**参数**:信号量指针sem。
+
+**输出**:
+
+- 0: 销毁成功。
+- EINVAL:sem参数不是有效的信号量描述符。
+
+#### sem_wait
+
+sem_wait()函数通过对 sem 引用的信号量执行信号量锁定操作来锁定该信号量。如果信号量值当前为零,则调用线程在锁定信号量或调用被信号中断之前,不会从对 sem_wait()的调用返回。
+
+**参数**:信号量指针sem。
+
+**输出**:
+
+- 0:操作成功。
+- EAGAIN:信号量已被锁定,无法立即被 sem_trywait()操作。
+- EDEADLK:检测到死锁条件。
+- EINTR:信号中断了此功能。
+- EINVAL:sem参数未引用有效的信号量。
+
+#### sem_trywait
+
+只有当信号量当前未锁定时,即信号量值当前为正值,sem_trywait()函数才应锁定 sem 引用的信号量。否则它不应锁定信号量。
+
+**参数**:信号量指针sem。
+
+**输出**:
+
+- 0:操作成功。
+- EAGAIN:信号量已被锁定,无法立即被sem_trywait()操作。
+- EDEADLK:检测到死锁条件。
+- EINTR:信号中断了此功能。
+- EINVAL:sem参数未引用有效的信号量。
+
+#### sem_timedwait
+
+sem_timedwait()函数应锁定 sem 引用的信号量,就像 sem_wait()函数一样。如果在不等待另一个线程执行sem_post()解锁信号量的情况下无法锁定信号量,则在指定的超时到期时,此等待将终止。
+
+**参数**:
+
+1. 信号量指针sem。
+2. 阻塞时间指针abs_timeout。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:线程可能会阻塞,abs_timeout 指定的纳秒值小于0或大于等于1000 million。
+- ETIMEDOUT:在指定的超时到期之前,无法锁定信号量。
+- EDEADLK:检测到死锁条件。
+- EINTR:信号中断了此功能。
+- EINVAL:sem参数未引用有效的信号量。
+
+#### sem_post
+
+sem_post()函数应通过对 sem 引用的信号量执行信号量解锁操作,当有线程阻塞在这个信号量上时,调用这个函数会使其中一个线程不在阻塞,选择机制是有线程的调度策略决定的。
+
+**参数**:信号量指针sem。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:sem参数未引用有效的信号量。
+
+#### sem_getvalue
+
+sem_getvalue()函数获取 sem 引用的信号量的值,而不影响信号量的状态。获取的 sval 值表示在调用期间某个未指定时间发生的实际信号量值。
+
+**参数**:
+
+1. 信号量指针sem。
+2. 信号量计数值指针sval。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:sem参数未引用有效的信号量。
+
+#### sem_unlink
+
+sem_unlink() 函数将删除由字符串名称命名的信号量。如果信号量当前被其他进程引用,那么sem_unlink() 将不会影响信号量的状态。如果在调用sem_unlink() 时一个或多个进程打开了信号量,则信号量的销毁将被推迟,直到信号量的所有引用都被销毁了。
+
+**参数**:信号量名称name。
+
+**输出**:
+
+- 0:操作成功。
+- -1:name参数未引用有效的信号量。
+
+### 互斥量管理
+
+#### pthread_mutexattr_init
+
+pthread_mutexattr_init()函数初始化互斥锁。如果调用 pthread_mutexattr_init()指定已初始化的attr属性对象行为未定义。
+
+**参数**:互斥锁属性对象指针attr。
+
+**输出**:
+
+- 0:操作成功。
+- ENOMEM:内存不足,无法初始化互斥属性对象。
+
+#### pthread_mutexattr_destroy
+
+ 注销一个互斥锁。销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。
+
+**参数**:互斥锁属性对象指针attr。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:attr指定的值无效。
+
+#### pthread_mutexattr_settype
+
+pthread_mutexattr_settype()函数设置互斥 type 属性。默认值为 PTHREAD_MUTEX_DEFAULT。有效的互斥类型包括:
+
+PTHREAD_MUTEX_NORMAL:此类型的互斥锁不会检测死锁。
+
+- 如果线程在不解除互斥锁的情况下尝试重新锁定该互斥锁,则会产生死锁。
+- 如果尝试解除由其他线程锁定的互斥锁,会产生不确定的行为。
+- 如果尝试解除锁定的互斥锁未锁定,则会产生不确定的行为。
+
+PTHREAD_MUTEX_ERRORCHECK:此类型的互斥锁可提供错误检查。
+
+- 如果线程在不解除锁定互斥锁的情况下尝试重新锁定该互斥锁,则会返回错误。
+- 如果线程尝试解除锁定的互斥锁已经由其他线程锁定,则会返回错误。
+- 如果线程尝试解除锁定的互斥锁未锁定,则会返回错误。
+
+PTHREAD_MUTEX_RECURSIVE:
+
+- 如果线程在不解除锁定互斥锁的情况下尝试重新锁定该互斥锁,则可成功锁定该互斥锁。 与 PTHREAD_MUTEX_NORMAL 类型的互斥锁不同,对此类型互斥锁进行重新锁定时不会产生死锁情况。多次锁定互斥锁需要进行相同次数的解除锁定才可以释放该锁,然后其他线程才能获取该互斥锁。
+- 如果线程尝试解除锁定的互斥锁已经由其他线程锁定,则会返回错误。
+- 如果线程尝试解除锁定的互斥锁未锁定,则会返回错误。
+
+PTHREAD_MUTEX_DEFAULT:
+
+- 如果尝试以[递归](https://baike.baidu.com/item/递归?fromModule=lemma_inlink)方式锁定此类型的互斥锁,则会产生不确定的行为。
+- 对于不是由调用线程锁定的此类型互斥锁,如果尝试对它解除锁定,则会产生不确定的行为。
+- 对于尚未锁定的此类型互斥锁,如果尝试对它解除锁定,也会产生不确定的行为。
+
+**参数**:
+
+1. 互斥锁属性对象指针attr。
+2. 互斥锁类型type。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:attr指定的值无效,或type无效。
+
+#### pthread_mutexattr_gettype
+
+pthread_mutexattr_gettype() 可用来获取由 pthread_mutexattr_settype() 设置的互斥锁的 type 属性。
+
+**参数**:
+
+1. 互斥锁属性对象指针attr。
+2. 互斥锁类型指针type。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:attr指定的值无效。
+
+#### pthread_mutexattr_setprotocol
+
+pthread_mutexattr_setprotocol() 可用来设置互斥锁属性对象的协议属性。定义的 protocol 可以为以下值之一:
+
+- PTHREAD_PRIO_NONE
+- PTHREAD_PRIO_INHERIT
+- PTHREAD_PRIO_PROTECT(当前版本暂不支持)
+
+**参数**:
+
+1. 互斥锁属性对象指针 attr。
+2. 互斥锁属性对象的协议 protocol。
+
+**输出**:
+
+- 0:操作成功。
+- ENOTSUP:协议指定的值不支持。
+- EINVAL:attr指定的值无效。
+- EPERM:调用者没有权限。
+
+#### pthread_mutexattr_getprotocol
+
+pthread_mutexattr_getprotocol() 获取互斥锁属性对象的协议属性。
+
+**参数**:
+
+1. 互斥锁属性对象指针attr。
+2. 互斥锁属性对象的协议指针protocol。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:attr指定的值无效。
+- EPERM:调用者没有权限。
+
+#### pthread_mutexattr_getprioceiling
+
+暂不支持。
+
+#### pthread_mutexattr_setprioceiling
+
+暂不支持。
+
+#### pthread_mutexattr_getpshared
+
+获取互斥锁属性对象的共享属性。当前支持PTHREAD_PROCESS_PRIVATE,互斥锁为进程内私有。
+
+**参数**:
+
+1. 互斥锁属性对象指针attr。
+2. 共享属性指针pshared。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_mutexattr_setpshared
+
+暂不支持。
+
+#### pthread_mutexattr_getrobust
+
+获取互斥锁属性对象的健壮属性。当前支持PTHREAD_MUTEX_STALLED,如果互斥锁的所有者在持有互斥锁时终止,则不会执行特殊操作。
+
+**参数**:
+
+1. 互斥锁属性对象指针attr。
+2. 健壮属性指针robust。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_mutexattr_setrobust
+
+设置互斥锁属性对象的健壮属性。当前支持PTHREAD_MUTEX_STALLED。
+
+**参数**:
+
+1. 互斥锁属性对象指针attr。
+2. 健壮属性robust。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- ENOTSUP:设置不支持的值。
+
+#### pthread_mutex_init
+
+pthread_mutex_init()函数初始化互斥锁,属性由 attr 指定。如果 attr 为NULL,则使用默认互斥属性。
+
+**参数**:
+
+1. 互斥锁指针mutex。
+2. 互斥锁属性对象指针attr。
+
+**输出**:
+
+- 0:操作成功。
+- EAGAIN:缺少初始化互斥锁所需的资源(内存除外)。
+- ENOMEM:内存不足,无法初始化互斥体。
+- EPERM:没有执行操作的权限。
+- EBUSY:互斥锁已经初始化但尚未销毁。
+- EINVAL:attr指定的值无效。
+
+#### pthread_mutex_destroy
+
+pthread_mutex_destroy() 用于注销一个互斥锁。销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。
+
+**参数**:互斥锁指针mutex。
+
+**输出**:
+
+- 0:操作成功。
+- EBUSY:锁当前未处于开放状态。
+- EINVAL:mutex指定的值无效。
+
+#### pthread_mutex_lock
+
+当pthread_mutex_lock() 返回时,该[互斥锁](https://baike.baidu.com/item/互斥锁/841823?fromModule=lemma_inlink)已被锁定。[线程](https://baike.baidu.com/item/线程/103101?fromModule=lemma_inlink)调用该函数让互斥锁上锁,如果该互斥锁已被另一个线程锁定和拥有,则调用该线程将阻塞,直到该互斥锁变为可用为止。
+
+**参数**:互斥锁指针mutex。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:mutex指定的值未初始化。
+- EAGAIN:无法获取互斥锁。
+- EDEADLK:当前线程已经拥有互斥锁。
+
+#### pthread_mutex_trylock
+
+pthread_mutex_trylock() 语义与 pthread_mutex_lock() 类似,不同点在于锁已经被占据时返回 EBUSY, 而非挂起等待。
+
+**参数**:互斥锁指针mutex。
+
+**输出**:
+
+- 0,操作成功。
+- EBUSY:mutex指定的锁已经被占据。
+- EINVAL:mutex指定的值未初始化。
+- EAGAIN:无法获取互斥锁。
+- EDEADLK:当前线程已经拥有互斥锁。
+
+#### pthread_mutex_timedlock
+
+pthread_mutex_timedlock() 语义与pthread_mutex_lock() 类似,不同点在于锁已经被占据时增加一个超时时间,等待超时返回错误码。
+
+**参数**:
+
+1. 互斥锁指针mutex。
+2. 超时时间指针abs_timeout。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:mutex指定的值未初始化,abs_timeout指定的纳秒值小于0或大于等于1000 million。
+- ETIMEDOUT:等待超时。
+- EAGAIN:无法获取互斥锁。
+- EDEADLK:当前线程已经拥有互斥锁。
+
+#### pthread_mutex_unlock
+
+释放互斥锁。
+
+**参数**:互斥锁指针mutex。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:mutex指定的值未初始化。
+- EPERM:当前线程不拥有互斥锁。
+
+#### pthread_mutex_consistent
+
+暂不支持。
+
+#### pthread_mutex_getprioceiling
+
+暂不支持。
+
+#### pthread_mutex_setprioceiling
+
+暂不支持。
+
+### 读写锁编程
+
+#### pthread_rwlock_init
+
+pthread_rwlock_init()初始化读写锁。如果 attr 为 NULL,则使用默认的读写锁属性。一旦初始化,锁可以使用任何次数,而无需重新初始化。调用 pthread_rwlock_init()指定已初始化的读写锁行为未定义。如果在没有初始化的情况下使用读写锁,则结果是未定义的。
+
+**参数**:
+
+1. 读写锁指针rwlock。
+2. 读写锁属性指针attr。
+
+**输出**:
+
+- 0:操作成功。
+- EAGAIN:系统缺少初始化读写锁所需的资源(内存除外)。
+- ENOMEM:内存不足,无法初始化读写锁。
+- EPERM:没有执行操作的权限。
+- EBUSY:rwlock是以已初始化但尚未销毁的读写锁。
+- EINVAL:attr指定的值无效。
+
+#### pthread_rwlock_destroy
+
+pthread_rwlock_destroy()函数应销毁 rwlock 引用的读写锁,并释放锁使用的资源。在再次调用pthread_rwlock_init()重新初始化锁之前,后续使用锁的行为未定义。如果在任何线程持有 rwlock 时调用pthread_rwlock_destroy()行为未定义。尝试销毁未初始化的读写锁行为未定义。
+
+**参数**:读写锁指针rwlock。
+
+**输出**:
+
+- 0:操作成功。
+- EBUSY: rwlock引用的对象被锁定时销毁该对象。
+- EINVAL:attr指定的值无效。
+
+#### pthread_rwlock_rdlock
+
+pthread_rwlock_rdlock()函数应将读锁应用于rwlock引用的读写锁。
+
+**参数**:读写锁指针rwlock。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:rwlock是未初始化的读写锁。
+- EAGAIN:无法获取读锁,因为已超过rwlock的最大读锁数。
+- EDEADLK:检测到死锁条件或当前线程已拥有写锁。
+
+#### pthread_rwlock_tryrdlock
+
+pthread_rwlock_tryrdlock()函数语义与pthread_rwlock_rdlock()类似。在任何情况下,pthread_rwlock_tryrdlock()函数都不会阻塞;它会一直获取锁,或者失败并立即返回。
+
+**参数**:读写锁指针rwlock。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:rwlock是未初始化的读写锁。
+- EAGAIN:无法获取读锁,因为已超过rwlock的最大读锁数。
+- EBUSY:无法获取读写锁以进行读取,因为写入程序持有该锁。
+
+#### pthread_rwlock_timedrdlock
+
+pthread_rwlock_timedrdlock()语义与pthread_rwlock_rdlock()类似,不同的是在锁已经被占据时增加一个超时时间,等待超时返回错误码。
+
+**参数**:
+
+1. 读写锁指针rwlock。
+2. 超时时间指针abs_timeout。
+
+**输出**:
+
+- 0:操作成功。
+- ETIMEDOUT:在指定的超时到期之前,无法获取锁。
+- EAGAIN:无法获取读锁,超过锁的最大读锁数量。
+- EDEADLK:检测到死锁条件或调用线程已在rwlock上持有写锁。
+- EINVAL:rwlock指定的锁未初始化,或者abs_timeout纳秒值小于0或大于等于1000 million。
+
+#### pthread_rwlock_wrlock
+
+pthread_rwlock_wrlock()函数将写锁应用于 rwlock 引用的读写锁。如果没有其他线程持有读写锁 rwlock,调用线程将获得写锁。否则,线程应阻塞,直到它能够获得锁。如果调用线程在调用时持有读写锁(无论是读锁还是写锁),则调用线程可能会死锁。
+
+**参数**:读写锁指针rwlock。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:rwlock指定的值未初始化。
+- EDEADLK:检测到死锁情况,或者当前线程已经拥有用于写入或读取的读写锁。
+
+#### pthread_rwlock_trywrlock
+
+pthread_rwlock_trywrlock()函数类似 pthread_rwlock_wrlock(),但如果任何线程当前持有rwlock(用于读取或写入,该函数将失败)。
+
+**参数**:读写锁指针rwlock。
+
+**输出**:
+
+- 0:操作成功。
+- EBUSY:无法获取读写锁以进行写入,因为它已被锁定以进行读取或写入。
+- EINVAL:rwlock指定的值未初始化。
+
+#### pthread_rwlock_timedwrlock
+
+pthread_rwlock_timedwrlock()语义与pthread_rwlock_wrlock()类似,不同的是在锁已经被占据时增加一个超时时间,等待超时返回错误码。
+
+**参数**:
+
+1. 读写锁指针rwlock。
+2. 超时时间指针abs_timeout。
+
+**输出**:
+
+- 0:操作成功。
+- ETIMEDOUT:在指定的超时到期之前,无法获取锁。
+- EAGAIN:无法获取读锁,超过锁的最大读锁数量。
+- EDEADLK:检测到死锁条件或调用线程已在rwlock上持有写锁。
+- EINVAL;rwlock指定的锁未初始化,或者abs_timeout纳秒值小于0或大于等于1000 million。
+
+#### pthread_rwlock_unlock
+
+pthread_rwlock_unlock()函数释放rwlock引用的读写锁上持有的锁。如果读写锁rwlock未被调用线程持有,则结果未定义。
+
+**参数**:读写锁指针rwlock。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:rwlock指定的锁未初始化。
+- EPERM:当前线程不持有读写锁。
+
+#### pthread_rwlockattr_init
+
+暂不支持
+
+#### pthread_rwlockattr_destroy
+
+暂不支持
+
+#### pthread_rwlockattr_getpshared
+
+pthread_rwlockattr_getpshared() 函数从attr引用的读写锁属性对象中获取进程共享属性的值。
+
+**参数**:
+
+1. 读写锁属性指针attr。
+2. 共享属性指针pshared。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+### pthread_rwlockattr_setpshared
+
+设置读写锁属性对象中进程共享属性的值。当前支持PTHREAD_PROCESS_PRIVATE,读写锁为进程私有。
+
+**参数**:
+
+1. 读写锁属性指针attr。
+2. 共享属性指针pshared。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- ENOTSUP:设置不支持的值。
+
+### 线程屏障管理
+
+#### pthread_barrier_destroy
+
+销毁线程屏障变量,并释放该屏障使用的任何资源。
+
+**参数**:屏障变量指针b。
+
+**输出**:
+
+- 0:操作成功。
+- EBUSY:另一个线程在使用该变量。
+
+#### pthread_barrier_init
+
+分配线程屏障变量所需的资源,并使用attr的属性初始化屏障。如果attr为NULL,则使用默认的屏障属性。
+
+**参数**:
+
+1. 屏障变量指针b。
+2. 屏障属性指针attr。
+3. 等待线程个数count。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:count为0。
+- ENOTSUP:attr指定的屏障属性不支持。
+- EAGAIN:系统缺乏初始化一个屏障所需的资源。
+
+#### pthread_barrier_wait
+
+pthread_barrier_wait() 阻塞调用线程,直到等待的线程达到了预定的数量。
+
+**参数**:屏障变量指针b。
+
+**输出**:
+
+- 0:操作成功。
+- -1:第一个线程成功返回。
+
+#### pthread_barrierattr_getpshared
+
+获取屏障属性的共享属性值。
+
+**参数**:
+
+1. 屏障属性指针a。
+2. 共享属性值指针pshared。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_barrierattr_setpshared
+
+设置屏障属性的共享属性值。支持PTHREAD_PROCESS_PRIVATE,该屏障为进程私有的,不允许不同进程的线程访问该屏障。
+
+**参数**:
+
+1. 屏障属性指针a。
+2. 共享属性值pshared。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- ENOTSUP:试图将属性设置为不支持的值。
+
+### 条件变量管理
+
+#### pthread_cond_init
+
+使用attr引用的属性初始化cond引用的条件变量。如果attr为NULL,则使用默认条件变量属性。
+
+**参数**
+
+1. 条件变量指针cond。
+2. 条件变量属性指针attr。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- EAGAIN:系统缺乏初始化一个条件变量所需的资源。
+
+#### pthread_cond_destroy
+
+销毁指定条件变量,使得该条件变量未初始化,可以使用pthread_cond_init() 重新初始化。
+
+**参数**:条件变量指针cond。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- EBUSY:另一个线程在使用该变量。
+
+#### pthread_cond_broadcast
+
+pthread_cond_broadcast()函数取消阻塞指定条件变量cond上当前阻塞的所有线程。
+
+**参数**:条件变量指针cond。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_cond_signal
+
+pthread_cond_signal() 函数取消阻塞在指定的条件变量cond上阻塞的线程中的至少一个(如果有任何线程在cond上被阻塞)。
+
+**参数**:条件变量指针cond。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_cond_timedwait
+
+pthread_cond_timedwait() 函数阻塞当前线程等待cond指定的条件变量,并释放互斥体指定的互斥体。只有在另一个线程使用相同的条件变量调用pthread_cond_signal() 或pthread_cond_broadcast() 后,或者如果系统时间达到指定的时间,并且当前线程重新获得互斥锁时,等待线程才会解锁。
+
+**参数**:
+
+1. 条件变量指针cond。
+2. 互斥锁指针m。
+3. 超时时间指针ts。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- ETIMEDOUT:阻塞超时
+
+#### pthread_cond_wait
+
+pthread_cond_wait() 函数与pthread_cond_timedwait() 类似,阻塞当前线程等待cond指定的条件变量,并释放互斥体指定的互斥体。只有在另一个线程使用相同的条件变量调用pthread_cond_signal() 或pthread_cond_broadcast() 后,并且当前线程重新获得互斥锁时,等待线程才会解锁。
+
+**参数**:
+
+1. 条件变量指针cond。
+2. 互斥锁指针m。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_condattr_init
+
+使用属性的默认值初始化条件变量属性对象attr。
+
+**参数**: 条件变量属性对象指针attr。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_condattr_destroy
+
+pthread_condattr_destroy)函数销毁条件变量属性对象,使对象变得未初始化,可以使用pthread_condattr_init() 重新初始化。
+
+**参数**:条件变量属性对象指针attr。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_condattr_getclock
+
+从attr引用的属性对象中获取时钟属性的值。
+
+**参数**:
+
+1. 条件变量属性对象指针attr。
+2. 时钟属性指针clk。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_condattr_setclock
+
+设置attr引用的属性对象中时钟属性的值。当前支持CLOCK_REALTIME,采用系统时间。
+
+**参数**:
+
+1. 条件变量属性对象指针attr。
+2. 时钟属性clock。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- ENOTSUP:设置不支持的值。
+
+#### pthread_condattr_getpshared
+
+从attr引用的属性对象中获取共享属性的值。
+
+**参数**:
+
+1. 条件变量属性对象指针attr。
+2. 共享属性指针pshared。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+#### pthread_condattr_setpshared
+
+设置attr引用的属性对象中共享属性属性的值。当前支持PTHREAD_PROCESS_PRIVATE,该条件变量为进程私有的,不允许不同进程的线程访问。
+
+**参数**:
+
+1. 条件变量属性对象指针attr。
+2. 共享属性pshared。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- ENOTSUP:设置不支持的值。
+
+### 时钟管理
+
+#### asctime
+
+asctime() 函数将timeptr指向的tm结构体对象转换为的字符串。
+
+**参数**: tm结构体指针timeptr。
+
+**输出**:
+
+- 成功则返回字符串指针。
+- 失败返回NULL。
+
+#### asctime_r
+
+与asctime() 函数类似,将timeptr指向的tm结构体对象转换为的字符串。不同的是该字符串放置在用户提供的缓冲区buf(至少包含26字节)中,然后返回buf。
+
+**参数**:
+
+1. tm结构体指针timeptr。
+2. 字符串缓冲区buf。
+
+**输出**:
+
+- 成功则返回字符串指针。
+- 失败返回NULL。
+
+#### clock
+
+返回该进程使用等处理器时间的最佳近似值。
+
+**参数**:无
+
+**输出**:
+
+- 成功则返回时间。
+- -1:失败。
+
+#### clock_gettime
+
+clock_gettime()函数应返回指定时钟的当前值tp。
+
+**参数**:
+
+1. 时钟类型clock_id。
+2. timespec结构体指针tp。
+
+**输出**:
+
+返回值:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:clock_id不合法。
+- ENOTSUP:clock_id不支持。
+
+#### clock_settime
+
+clock_settime()函数应将指定的clock_id设置为tp指定的值。
+
+**参数**:
+
+1. 时钟类型clock_id。
+2. timespec结构体指针tp。
+
+**输出**:
+
+返回值:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:clock_id不合法,或tp参数指定的纳秒值小于0或大于等于1000 million。
+- ENOTSUP:clock_id不支持。
+
+#### clock_getres
+
+clock_getres()返回时钟的分辨率。如果参数res不为NULL,则指定时钟的分辨率应存储在res指向的位置。如果res为NULL,则不返回时钟分辨率。如果clock_settime()的时间参数不是res的倍数,则该值将被截断为res的倍数。
+
+**参数**:
+
+1. 时钟类型clock_id。
+2. timespec结构体指针res。
+
+**输出**:
+
+返回值:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:clock_id不合法。
+- ENOTSUP:clock_id不支持。
+
+#### clock_getcpuclockid
+
+clock_getcpuclockid函数获取CPU时间时钟的ID,当前进程只有一个,因此无论传入的pid是什么,都返回CLOCK_PROCESS_CPUTIME_ID。
+
+**参数**:
+
+1. 进程ID:pid。
+2. 时钟指针:clk。
+
+**输出**:
+
+- 0:操作成功。
+
+#### clock_nanosleep
+
+与nanosleep类似,clock_nanosleep() 允许调用线程在以纳秒精度指定的时间间隔内休眠,并可以将睡眠间隔指定为绝对值或相对值。当前支持CLOCK_REALTIME。
+
+**参数**:
+
+1. 时钟ID:clk。
+2. 是否为绝对值:flag。
+3. 指定的时间间隔值eq。
+4. 剩余时间值:rem。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+- EINVAL:时钟ID错误。
+- ENOTSUP:不支持的时钟ID。
+
+#### nanosleep
+
+nanosleep()函数应导致当前线程暂停执行,直到rqtp参数指定的时间间隔过去或信号传递到调用线程。挂起时间可能比请求的长,因为参数值被四舍五入到睡眠分辨率的整数倍,或者因为系统调度了其他活动。但是,除被信号中断外,暂停时间不得小于rqtp规定的时间。
+
+如果rmtp参数是非NULL,则更新其为剩余的时间量(请求的时间减去实际睡眠时间)。如果rmtp参数为NULL,则不返回剩余时间。
+
+**参数**:
+
+1. timespec结构体指针rqtp。
+2. timespec结构体指针rmtp。
+
+**输出**:
+
+返回值:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:rqtp参数指定的纳秒值小于0或大于等于1000 million。
+- EINTR:信号中断。
+
+#### sleep
+
+sleep()函数应导致调用线程暂停执行,直到参数seconds指定的实时秒数过去或信号被传递到调用线程。由于系统安排了其他活动,暂停时间可能比请求的要长。
+
+**参数**: 秒数seconds。
+
+**输出**:
+
+- 0:操作成功。
+- 如果由于信号的传递而返回,则返回值应为“未睡眠”量,以秒为单位。
+
+#### timer_create
+
+timer_create()函数使用指定的时钟clock_id作为时序基创建计时器,在timerid引用的位置返回计时器ID,用于标识计时器。在删除计时器之前,此计时器ID在调用过程中应是唯一的。
+
+**参数**:
+
+1. 时钟类型clock_id。
+2. sigevent结构体指针evp。(仅支持SIGEV_THREAD)
+3. 定时器ID指针timerid。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:clock_id不合法。
+- EAGAIN:系统缺少足够的资源来满足请求。
+- EINVAL:指定的时钟ID未定义。
+- ENOTSUP:不支持创建附加到clock_id时钟上的计时器。
+
+#### timer_delete
+
+删除定时器。
+
+**参数**:定时器ID指针timerid。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:timerid不合法。
+
+#### timer_settime
+
+如果value的it_value成员非0,timer_settime()函数从value参数的it_value成员设置timerid指定的计时器的到期时间。如果在调用timer_settime()时指定的计时器已启用,则此调用应将下次到期的时间重置为指定的值。如果value的it_value成员为0,则应解除计时器。
+
+**参数**:
+
+1. 定时器ID timerid。
+2. 计时器的特征flag。
+3. itimerspec结构体指针value。
+4. itimerspec结构体指针ovalue。返回上一次计时器设置超时时间。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:timerid不合法。
+
+#### timer_gettime
+
+timer_gettime() 函数存储定时器 timerid 的剩余时间以及间隔。value 的 it_value 成员包含计时器到期前的时间量,如果计时器已解除,则为零。value 的 it_interval 成员将包含 timer_settime() 上次设置的间隔时间。
+
+**参数**:
+
+1. 定时器ID timerid。
+2. itimerspec结构体指针value。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:timerid不合法。
+
+#### timer_getoverrun
+
+根据指定的定时器ID,获取定时器的超时次数。
+
+**参数**:
+
+1. 定时器ID timerid。
+2. itimerspec结构体指针value。
+
+**输出**:
+
+- 非负数:超时次数。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:无效ID或定时器未初始化。
+
+#### times
+
+获取进程的执行时间。由于UniProton无用户模式/内核模式且无子进程概念,出参和返回值均为进程执行总时间。
+
+**参数**:
+
+1. tms结构体指针ts。
+
+**输出**:
+
+- 非负数:进程的执行时间。
+
+#### ctime
+
+ctime() 函数将tp指向的time_t结构体对象转换为的字符串。效果等同于asctime(localtime(t))。
+
+**参数**: time_t结构体指针tp。
+
+**输出**:
+
+- 成功则返回字符串指针。
+- 失败返回NULL。
+
+#### ctime_r
+
+ctime_r() 函数将tp指向的time_t结构体对象转换为的字符串,并将字符串放入buf指向的数组中(其大小应至少为26字节)并返回buf。
+
+**参数**:
+
+1. tm结构体指针timeptr。
+2. 字符串缓冲区buf。
+
+**输出**:
+
+- 成功则返回字符串指针。
+- 失败返回NULL。
+
+#### difftime
+
+计算两个日历时间之间的差值(由第一个参数减去第二个参数)。
+
+**参数**:
+
+1. 第一个时间值t1。
+2. 第二个时间值t0。
+
+**输出**:
+
+- 返回时间差值。
+
+#### getdate
+
+暂不支持
+
+#### gettimeofday
+
+gettimeofday() 函数应获取当前时间,并将其存储在tp指向的timeval结构中。如果时区结果tz不是空指针,则行为未指定。
+
+**参数**:
+
+1. timeval结构体指针tp。
+2. 时区指针tz。
+
+**输出**:
+
+- 返回0。
+
+#### gmtime
+
+将time_t结构表示的日历时间转换为tm结构表示的时间,无时区转换。
+
+**参数**:time_t结构体指针。
+
+**输出**:
+
+返回值:
+
+- tm结构体指针。
+
+errno:
+
+- EOVERFLOW:转换溢出。
+
+#### gmtime_r
+
+与gmtime函数类似,不同的是gmtime_r会将结果放入在用户提供的tm结构体中。
+
+**参数**:
+
+1. time_t结构体指针。
+2. tm结构体指针。
+
+**输出**:
+
+返回值:
+
+- tm结构体指针。
+
+errno:
+
+- EOVERFLOW:转换溢出。
+
+#### localtime
+
+将time_t结构表示的日历时间转换为tm结构表示的本地时间,受时区的影响。
+
+**参数**:time_t结构体指针。
+
+**输出**:
+
+返回值:
+
+- tm结构体指针。
+
+errno:
+
+- EOVERFLOW:转换溢出。
+
+#### localtime_r
+
+与localtime函数类似,不同的是localtime_r会将结果放入在用户提供的tm结构体中。
+
+**参数**:
+
+1. time_t结构体指针。
+2. tm结构体指针。
+
+**输出**:
+
+返回值:
+
+- tm结构体指针。
+
+errno:
+
+- EOVERFLOW:转换溢出。
+
+#### mktime
+
+将已经根据时区信息计算好的tm结构表示的时间转换为time_t结构表示的时间戳,受时区的影响。
+
+**参数**:tm结构体指针。
+
+**输出**:
+
+返回值:
+
+- time_t结构体指针。
+
+errno:
+
+- EOVERFLOW:转换溢出。
+
+#### strftime
+
+暂不支持
+
+#### strftime_l
+
+暂不支持
+
+#### strptime
+
+使用format指定的格式,将buf指向的字符串解析转换为tm结构体的时间值。
+
+**参数**:
+
+1. 时间字符串buf。
+2. 格式字符串format。
+3. tm结构体指针tp。
+
+**输出**:
+
+- 成功则返回指针,指向解析的最后一个字符后面的字符。
+- 失败返回NULL。
+
+#### time
+
+获取当前的日历时间,即从一个标准时间点到此时的时间经过的秒数。
+
+**参数**:time_t结构体指针t。
+
+**输出**:time_t结构体指针t。
+
+#### timespec_get
+
+返回基于给定时基base的时间,由timespec结构体保存。时基通常为TIME_UTC。
+
+**参数**:
+
+1. timespec结构体指针ts。
+2. 时基base
+
+**输出**:
+
+- 成功则返回时基的值。
+- 失败则返回0。
+
+#### utime
+
+暂不支持。
+
+#### wcsftime
+
+暂不支持
+
+#### wcsftime_l
+
+暂不支持
+
+### 内存管理
+
+#### malloc
+
+malloc()分配大小(以字节为单位)size 的未使用的空间。
+
+**参数**:大小size。
+
+**输出**:分配成功时,返回指向分配空间的指针。
+
+- 如果size 为0,则返回空指针或可以成功传递给 free()的唯一指针。
+- 否则它将返回一个空指针,并设置 errno 来指示错误:ENOMEM 存储空间不足。
+
+#### free
+
+Free()函数释放ptr指向的空间,即可供进一步分配。如果ptr是空指针,则不发生任何操作。如果空间已被对free()或realloc()的调用释放,则行为未定义。
+
+**参数**:指针ptr。
+
+**输出**:无
+
+#### memalign
+
+memalign()函数将分配按align大小字节对齐,大小为len的内存空间指针。
+
+**参数**:align是对齐字节数,len指定分配内存的字节大小。
+
+**输出**:成功完成后,空间大小为len的指针。
+
+#### realloc
+
+realloc()函数将释放ptr所指向的旧对象,并返回一个指向新对象的指针,该对象的大小由size指定。并拷贝旧指针指向的内容到新指针,然后释放旧指针指向的空间。如果ptr是空指针,则realloc()对于指定的大小应等同于malloc()。
+
+**参数**:旧指针地址;新指针的目标分配空间大小。
+
+**输出**:在成功完成后,realloc()将返回一个指向分配空间的指针。如果size为0,则行为不可预测。
+
+#### malloc_usable_size
+
+malloc_usable_size()函数返回ptr所指向的块中的可用字节数。
+
+**参数**:待计算内存块大小的指针。
+
+**输出**:返回ptr指向的已分配内存块中的可用字节数。如果ptr为NULL,则返回0。
+
+#### aligned_alloc
+
+aligned_alloc()函数分配size字节未初始化的存储空间,按照alignment指定对齐。
+
+**参数**:alignment指定对齐;size是分配的字节数。
+
+**输出**:返回指向新分配内存的指针。
+
+#### reallocarray
+
+reallocarray()函数将释放ptr所指向的旧对象,并返回一个指向新对象的指针,该对象的大小由size由入参m和n决定。等同于realloc(ptr, m * n);
+
+**参数**:ptr待释放的指针内容,m和n代表数组的长度和单个元素的字节数。
+
+**输出**:在成功完成后返回一个指向分配空间的指针。如果size为0,则行为不可预测。
+
+#### calloc
+
+calloc()函数将为一个数组分配未使用的空间,并将该空间应初始化为所有位0。
+
+**参数**:m和n分别代表数组的元素个数或单个元素的大小。
+
+**输出**:分配成功时,返回指向分配空间的指针。失败时则行为不可预测。
+
+#### posix_memalign
+
+posix_memalign()函数将分配按align指定的边界对齐的大小字节,并返回指向在memptr中分配的内存的指针。对齐的值应该是sizeof(void *)的2倍幂。
+
+**参数**:res分配好的内存空间的首地址,align是对齐字节数,len指定分配内存的字节大小。
+
+**输出**:成功完成后,posix_memalign()将返回零;否则,将返回一个错误号来表示错误,并且不修改memptr的内容,或者将其设置为空指针。
+
+### 退出管理
+
+#### abort
+
+abort()函数触发程序的异常终止,除了信号SIGABRT没有被捕获或者返回。
+
+**参数**:无
+
+**输出**:无
+
+#### _Exit
+
+_Exit()函数终止程序。
+
+**参数**:入参是0,EXIT_SUCCESS, EXIT_FAILURE或任何其他值。wait()和waitpid()只能获得最低有效的8位(即status & 0377);完整的值应该可以从waitid()和siginfo_t中获得,SIGCHLD传递给信号处理程序。
+
+**输出**:无
+
+#### atexit
+
+atexit()注册一个在程终止时运行的函数。在正常的程序终止时,所有由atexit()函数注册的函数都应该按照其注册的相反顺序被调用,除非一个函数在之前注册的函数之后被调用,而这些函数在注册时已经被调用了。正常的终止发生在调用exit()或从main()返回时。
+
+**参数**:函数指针,该入参函数不带参数。
+
+**输出**:成功返回0;失败返回非0。
+
+#### quick_exit
+
+quick_exit()函数触发快速程序终止,并以后进先出(LIFO)的顺序调用由at_quick_exit注册的函数。
+
+**参数**:程序退出的状态码。
+
+**输出**:无
+
+#### at_quick_exit
+
+at_quick_exit()函数注册由func指向的函数,在快速程序终止时(通过quick_exit)调用。最多能注册32个函数。
+
+**参数**:指向快速程序退出时要调用的函数的指针。
+
+**输出**:注册成功返回0,否则为非零值。
+
+#### assert
+
+assert()宏将在程序中插入断言,它将扩展为一个void表达式。当它被执行时,如果判断条件失败。assert()将写失败特定的调用信息,并将调用abort()退出程序。
+
+**参数**:判断表达式。
+
+**输出**:无
+
+### stdlib接口
+
+#### div
+
+div()函数计算int型除法的商和余数。如果余数或商不能表示,结果是未知的。
+
+**参数**:int numer(分子), int denom(分母)。
+
+**输出**:结构体div_t,int型的商和余数。
+
+#### ldiv
+
+ldiv()函数将计算long型除法的商和余数。如果余数或商不能表示,结果是未知的。
+
+**参数**:long numer(分子), long denom(分母)。
+
+**输出**:结构体ldiv_t,long型的商和余数。
+
+#### lldiv
+
+lldiv()函数将计算long long型除法的商和余数。如果余数或商不能表示,结果是未知的。
+
+**参数**:long long numer(分子), long long denom(分母)。
+
+**输出**:结构体lldiv_t,long long型的商和余数。
+
+#### imaxdiv
+
+imaxdiv()函数将计算intmax_t型除法的商和余数。如果余数或商不能表示,结果是未知的。
+
+**参数**:intmax_t numer(分子), intmax_t denom(分母)。
+
+**输出**:结构体imaxdiv_t,intmax_t型的商和余数。
+
+#### wcstol
+
+wcstol()将宽字符串转换为long型正数。输入字符串分解为三部分。
+
+1. 初始的(可能为空的)空白宽字符代码序列(由iswspace()指定)。
+2. long型整数,进制的类型由base入参决定。
+3. 由一个或多个无法识别的宽字符代码组成的最终宽字符串。
+
+**参数**:指向要解释的以空字符结尾的宽字符串的指针;指向宽字符的指针;解释的整数值的基数。
+
+**输出**:转换后的long型数值。如果无法进行转换,则返回0,并设置errno表示错误。如果正确值在可表示的值范围之外,则返回LONG_MIN,LONG_MAX,LLONG_MIN或LLONG_MAX,并将errno设置为ERANGE。
+
+#### wcstod
+
+wcstod()将宽字符串转换为double型浮点数。输入字符串分解为三部分。
+
+1. 初始的(可能为空的)空白宽字符代码序列(由iswspace()指定)。
+2. double型浮点数、无穷大或者NaN。
+3. 由一个或多个无法识别的宽字符代码组成的最终宽字符串。
+
+**参数**:指向要解释的以空字符结尾的宽字符串的指针;指向宽字符的指针;
+
+**输出**:转换后的double型浮点数。如果越界,则可能返回±HUGE_VAL, ±HUGE_VALF或±HUGE_VALL,并将errno设置为ERANGE。
+
+#### fcvt
+
+fcvt()将浮点数转换为要求长度的字符串,没有小数点,如果超过value的数字长度将补零。
+
+**参数**:待转换的浮点数、转换后字符串的长度、小数点所在位指针、符号位指针。
+
+**输出**:转换后字符串指针。
+
+#### ecvt
+
+ecvt()函数将浮点数转换为要求长度的字符串,没有小数点,如果超过value的数字长度不补零(与fcvt的区别)。
+
+**参数**:待转换的浮点数、转换后字符串的长度、小数点所在位指针、符号位指针。
+
+**输出**:转换后字符串指针。
+
+#### gcvt
+
+gcvt()函数将double类型的值转换为要求长度的字符串,包含小数点。
+
+**参数**:待转换的浮点数,转换后字符串的长度、转换后字符串指针。
+
+**输出**:转换后字符串指针(等于函数成功调用后第三个入参的指针)。
+
+#### qsort
+
+qsort()函数对数据表进行排序。
+
+**参数**:qsort()函数将对nel对象数组进行排序,该数组的初始元素由base指向。每个对象的大小(以字节为单位)由width参数指定。如果nel参数的值为0,则不会调用comp所指向的比较函数,也不会进行重排。应用程序应确保compar所指向的比较函数不会改变数组的内容。实现可以在调用比较函数之间对数组元素重新排序,但不能改变任何单个元素的内容。
+
+**输出**:无
+
+#### abs
+
+abs()函数计算并返回int型数值的绝对值。
+
+**参数**:int整型数值。
+
+**输出**:int整型数值的绝对值。
+
+#### labs
+
+labs()函数计算并返回long型数值的绝对值。
+
+**参数**:long型数值。
+
+**输出**:long型数值的绝对值。
+
+#### llabs
+
+llabs()函数计算并返回long long型数值的绝对值。
+
+**参数**:long long型数值。
+
+**输出**:long long型数值的绝对值。
+
+#### imaxabs
+
+imaxabs()函数计算并返回intmax_t型的绝对值。
+
+**参数**:intmax_t型数值。
+
+**输出**:intmax_t型数值的绝对值。
+
+#### strtol
+
+strtol()函数转换字符串到long型数值。这将nptr所指向的字符串的初始部分转换为long类型的表示形式。首先,它们将输入字符串分解为三部分:
+
+1. 一个初始的、可能为空的空白字符序列(由isspace()函数判断)。
+2. long型整数,进制的类型由base入参决定。
+3. 由一个或多个不可识别字符组成的最后字符串,包括输入字符串的终止NUL字符。
+
+**参数**:待转换的字符串的指针;指向字符的指针;解释的整数值的基数。
+
+**输出**:转换后的long型。如果无法进行转换,则返回0,并设置errno表示错误。如果正确值在可表示的值范围之外,则返回LONG_MIN, LONG_MAX, LLONG_MIN或LLONG_MAX,并将errno设置为EINVAL。
+
+#### strtod
+
+strtod()函数将字符串转换为double型。输入字符串分解为三部分。
+
+1. 初始的(可能为空的)空白字符代码序列(由isspace()指定)。
+2. double型浮点数、无穷大或者NaN。
+3. 由一个或多个无法识别的字符代码组成的最终字符串。
+
+**参数**:待转换的字符串的指针;指向字符的指针;
+
+**输出**:转换后的double型浮点数。如果越界,则可能返回±HUGE_VAL, ±HUGE_VALF或±HUGE_VALL,并将errno设置为EINVAL。
+
+#### atoi
+
+atoi()函数将字符串转换为int型整数。
+
+**参数**:待转换的字符串的指针。
+
+**输出**:转换后的int型数值。如果是无法显示数值,返回值不可预测。
+
+#### atol
+
+atol()函数将字符串转换为long型整数。
+
+**参数**:待转换的字符串的指针。
+
+**输出**:转换后的long型数值。如果是无法显示数值,返回值不可预测。
+
+#### atoll
+
+atoll()函数将字符串转换为long long型整数。
+
+**参数**:待转换的字符串的指针。
+
+**输出**:转换后的long long型数值。如果是无法显示数值,返回值不可预测。
+
+#### atof
+
+atof()函数将字符串转换为double型浮点数。
+
+**参数**:待转换的字符串的指针。
+
+**输出**:转换后的double型数值。如果是无法显示数值,返回值不可预测。
+
+#### bsearch
+
+bsearch()函数二分查找一个已排序表.将搜索一个nel对象数组,该数组的初始元素由base指向,以查找与key指向的对象匹配的元素。数组中每个元素的大小由width指定。如果nel参数的值为0,则不会调用compar所指向的比较函数,也不会找到匹配项。
+
+**参数**:依次为目标查找的元素,待查找的数组的指针,数组的元素个数,数组每个元素的size大小,两个元素的比较函数。
+
+**输出**:指向数组中匹配成员的指针,如果没找到则返回空指针。
+
+### SystemV IPC
+
+#### semget
+
+semget()函数返回与参数key相关联的SystemV信号量集的标识符。它可用于获得先前创建的信号量集合的标识符(当flag为0且key不为IPC_PRIVATE时)或来创建一个新的集合。最多可以支持创建SEMSET_MAX_SYS_LIMIT个信号量集合,每个集合最多支持SEMSET_MAX_SEM_NUM个信号量。
+
+**参数**:
+
+1. 键值key。
+2. 信号量的个数nsems。
+3. 信号量的创建方式和权限flag。
+
+**输出**:
+
+- 非负数:信号量集的标识符。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ENOENT:信号量集不存在。
+- ENOSPC:超出最大信号量集合的限制。
+- EEXIST:flag包含了IPC_CREAT和IPC_EXCL但标识符已存在。
+
+#### semctl
+
+semctl()函数在由semid标识的SystemV信号量集合中的第semnum个信号量上执行由cmd指定的控制操作。集合中的信号量从0开始编号。当前支持的cmd包括IPC_STAT(支持获取信号量集合中的个数)、GETALL(获取信号量集合中所有信号量的值)、GETVAL(获取单个信号量的值)和IPC_RMID(根据标识符删除信号量集合)。
+
+**参数**:
+
+1. 信号量集合标识符semid。
+2. 信号量中的编号semnum。
+3. 要执行的操作命令cmd。
+4. 可选参数union semun结构体arg。
+
+**输出**:
+
+- 0:操作成功。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EIDRM:信号量集合已删除。
+- EFAULT:arg中的buf或array指针为空。
+
+#### semop
+
+semop()函数对semid关联的信号量集合中选定的信号量进行操作,也就是使用资源或者释放资源。具体操作由struct sembuf结构体来决定。结构体包括数组索引semnum,信号量操作(支持+1或-1,表示释放资源和使用资源)op,操作方式flag(支持IPC_NOWAIT,不阻塞操作)。当前只支持单个信号量的操作。
+
+**参数**:
+
+1. 信号量集合标识符semid。
+2. 指向struct sembuf结构体的数组sops。
+3. 数组个数nsops。
+
+**输出**:
+
+- 0:操作成功。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ENOTSUP:操作不支持。
+- EFAULT:数组指针sops为空。
+- E2BIG:数组个数nsops超过限制。
+- EIDRM;信号量集合已删除。
+- EFBIG:某个信号量索引超过限制。
+- EAGAIN:操作无法立即进行,如flag包含了IPC_NOWAIT或超时。
+
+#### semtimedop
+
+semtimedop()的行为与semop()相同,不同点在于增加一个超时时间,等待超时返回错误码。
+
+**参数**:
+
+1. 信号量集合标识符semid。
+2. 指向struct sembuf结构体的数组sops。
+3. 数组个数nsops。
+4. timespec结构体指针timeout。
+
+**输出**:
+
+- 0:操作成功。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ENOTSUP:操作不支持。
+- EFAULT:数组指针sops为空。
+- E2BIG:数组个数nsops超过限制。
+- EIDRM;信号量集合已删除。
+- EFBIG:某个信号量索引超过限制。
+- EAGAIN:操作无法立即进行,如flag包含了IPC_NOWAIT或超时。
+
+#### msgget
+
+msgget()返回与参数key相关联的SystemV消息队列的标识符。它可用于获得先前创建的消息队列的标识符(当flag为0且key不为IPC_PRIVATE时)或来创建一个新的消息队列。最多支持创建MSGQUE_MAX_SYS_LIMIT个消息队列,消息队列默认大小为MSGQUE_MAX_MSG_NUM,消息大小默认为MSGQUE_MAX_MSG_SIZE。
+
+**参数**:
+
+1. 键值key。
+2. 消息队列的创建方式和权限flag。
+
+**输出**:
+
+- 非负数:消息队列的标识符。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ENOENT:消息队列不存在。
+- ENOSPC:超出最大消息队列的限制。
+- EEXIST:flag包含了IPC_CREAT和IPC_EXCL但标识符已存在。
+- ENOMEM:内存不足。
+
+#### msgctl
+
+msgctl()在标识为msgqid的SystemV消息队列上执行cmd指定的控制操作。当前支持IPC_STAT(支持获取消息队列中的消息个数和大小)、IPC_RMID(删除消息队列)。
+
+**参数**:
+
+1. 消息队列标识符msgqid。
+2. 消息队列控制命令cmd。
+3. 消息队列信息msqid_ds结构体buf。
+
+**输出**:
+
+- 0:操作成功。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EFAULT:msqid_ds结构体指针为空。
+- EIDRM:消息队列已删除。
+- ENOTSUP:不支持的命令。
+
+#### msgsnd
+
+msgsnd()将msgp指向的消息追加到msgqid指定的SystemV消息队列中,如果队列有足够空间,msgsnd立即执行。消息大小不超过MSGQUE_MAX_MSG_SIZE。当前flag支持IPC_NOWAIT,表示操作不等待。
+
+**参数**:
+
+1. 消息队列标识符msgqid。
+2. 需要发送的消息msgp。
+3. 发送消息的大小msgsz。
+4. 发送方式flag。
+
+**输出**:
+
+- 0:操作成功。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EFAULT:msgp指针为空。
+- EIDRM:消息队列已删除。
+- ENOTSUP:不支持的命令。
+
+#### msgrcv
+
+msgrcv()函数将消息从msgqid指定的消息队列中移除,并放入msgp指向的缓冲区中。参数msgsz指定了缓冲区buf的大小。当前msgtype支持的值为0,flag支持IPC_NOWAIT,表示操作不等待。
+
+**参数**:
+
+1. 消息队列标识符msgqid。
+2. 需要接受消息的缓冲区msgp。
+3. 接受消息的大小msgsz。
+4. 接受消息的类型msgtype。
+5. 发送方式flag。
+
+**输出**:
+
+- 0:操作成功。
+- -1: 操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EFAULT:msgp指针为空。
+- EIDRM:消息队列已删除。
+- ENOTSUP:不支持的命令。
+- ENOMSG:消息队列中没有请求类型的消息。
+
+#### shmget
+
+暂不支持
+
+#### shmctl
+
+暂不支持
+
+#### shmat
+
+暂不支持
+
+#### shmdt
+
+暂不支持
+
+#### ftok
+
+暂不支持
+
+#### fstatat
+
+fstatat()函数根据相对路径获取相关的文件统计信息。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 路径名path。
+3. 文件信息指针st。
+4. 操作标记flag。
+
+**输出**:
+
+- 目录流指针:操作成功。
+- NULL:操作失败。
+
+errno:
+
+- EFAULT:指针为空。
+- ENOENT:没有这样的文件。
+- ENOSYS:缺少相关函数。
+
+#### fchmodat
+
+fchmodat()函数根据相对路径更改相关文件的访问权限。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 路径名path。
+3. 访问模式mode。
+4. 操作标记flag。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ELOOP:符号连接的层数过多。
+- ENOSYS:缺少相关函数。
+
+#### mkdir
+
+mkdir()函数用于参数路径名path的创建目录。
+
+**参数**:
+
+1. 路径名path。
+2. 访问模式mode。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- ENXIO:驱动程序问题。
+- EEXIST:目录已存在。
+- ENOSYS:缺少相关函数。
+
+#### chmod
+
+chmod()函数用来控制相关文件的权限。
+
+**参数**:
+
+1. 路径名path。
+2. 访问模式mode。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ELOOP:符号连接的层数过多。
+
+#### lstat
+
+lstat()函数根据路径名path获取相关的链接文件统计信息。
+
+**参数**:
+
+1. 路径名path。
+2. 文件信息结构体stat。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EFAULT:参数指针为空。
+- ENOENT:没有这样的文件。
+- ENOMEM:内存不足。
+
+#### utimensat
+
+utimensat()函数根据相对目录更改相关的文件时间戳。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 路径名pathname。
+3. 时间结构体数组times。
+4. 操作标识flags。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### mkfifo
+
+mkfifo()函数用于在文件系统中创建一个有名管道。
+
+**参数**:
+
+1. 路径名pathname。
+2. 访问模式mode。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EEXIST:文件已存在。
+- ENXIO:驱动程序问题。
+- ENOSYS:缺少相关函数。
+
+#### fchmod
+
+fchmod()函数可以修改文件描述符fd相关的文件权限。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 访问模式mode。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ELOOP:符号连接的层数过多。
+- ENOSYS:缺少相关函数。
+
+#### mknod
+
+mknod()函数用于建立FIFO、字符设备文件以及块设备文件等。
+
+**参数**:
+
+1. 路径名path。
+2. 访问模式mode。
+3. 设备号dev。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EEXIST:文件已存在。
+- ENXIO:驱动程序问题。
+- ENOSYS:缺少相关函数。
+
+#### statvfs
+
+statvfs()函数根据路径名path获取磁盘信息。
+
+**参数**:
+
+1. 路径名path。
+2. statvfs结构体指针buf。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EFAULT:错误地址。
+- ENOENT:不存在文件。
+- ENOMEM:内存不足。
+
+#### mkfifoat
+
+mkfifoat()函数与mkfifo()函数类似,在参数fd表示的目录相关位置创建一个有名管道。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 路径名path。
+3. 访问模式mode。
+4. 设备号dev。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EEXIST:文件已存在。
+- ENXIO:驱动程序问题。
+- ENOSYS:缺少相关函数。
+
+#### umask
+
+umask()函数设置预设的文件权限。
+
+**参数**:
+
+1. 访问权限mode。
+
+**输出**:
+
+- 前一个访问权限:操作成功。
+
+#### mknodat
+
+mknodat()函数用于建立FIFO、字符设备文件以及块设备文件等,在参数fd表示的目录相关位置创建。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 路径名path。
+3. 访问模式mode。
+4. 设备号dev。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EEXIST:文件已存在。
+- ENXIO:驱动程序问题。
+- ENOSYS:缺少相关函数。
+
+#### futimesat
+
+futimesat()函数根据目录文件描述符更改相关的文件时间戳。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 路径名pathname。
+3. 时间结构体数组times。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### lchmod
+
+lchmod()函数用来控制相关文件的权限。
+
+**参数**:
+
+1. 路径名pathname。
+2. 访问模式mode。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ELOOP:符号连接的层数过多。
+- ENOSYS:缺少相关函数。
+
+#### futimens
+
+futimens()函数根据文件描述符fd更改相关的文件时间戳的方法。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 时间结构体数组times。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### mkdirat
+
+mkdirat()函数根据相对目录文件描述符创建一个新目录。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 路径名path。
+3. 访问模式mode。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- ENXIO:驱动程序问题。
+- EEXIST:目录已存在。
+- ENOSYS:缺少相关函数。
+
+#### fstat
+
+fstat()函数根据文件描述符fd获取相关文件的信息。
+
+**参数**:
+
+1. 文件描述符fd。
+2. stat结构体指针buf。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EBADF:无效的描述符。
+- ENOSYS:缺少相关函数。
+
+#### stat
+
+stat()函数根据路径名获取相关文件的信息。
+
+**参数**:
+
+1. 路径名path。
+2. stat结构体指针buf。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EFAULT:参数指针为空。
+- ENOENT:不存在文件。
+- ENOSYS:缺少相关函数。
+
+#### open
+
+open()函数根据文件名pathname打开相关的文件。
+
+**参数**:
+
+1. 文件名pathname。
+2. 文件访问模式mode。
+3. 可变参数。
+
+**输出**:
+
+- 文件描述符fd:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ELOOP:符号连接的层数过多。
+- EACCES:权限不足。
+- ENXIO:驱动程序问题。
+
+#### creat
+
+creat()函数根据文件名pathname创建相关的文件。
+
+**参数**:
+
+1. 文件名pathname。
+2. 文件访问模式mode。
+
+**输出**:
+
+- 文件描述符fd:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ELOOP:符号连接的层数过多。
+- EACCES:权限不足。
+- ENXIO:驱动程序问题。
+
+#### posix_fadvise
+
+暂不支持。
+
+#### fcntl
+
+fcntl()函数用来修改已经打开文件的属性的函数。操作命令目前只支持F_DUPFD、F_DUPFD_CLOEXEC、F_GETFD、F_SETFD、F_GETFL、F_SETFL、F_GETPATH。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 操作命名cmd。
+3. 可变参数。
+
+**输出**:
+
+- 文件描述符fd:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EBADF:无效的描述符。
+- ENOSYS:缺少相关函数。
+- EINVAL:参数错误。
+
+#### posix_fallocate
+
+posix_fallocate()函数确保为文件描述符fd引用的文件分配磁盘空间,从偏移开始,持续len字节。如果文件大小小于offset+len,则文件为增加到这个大小,否则将保留文件大小不变。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 偏移offset。
+3. 长度len。
+
+**输出**:
+
+- 文件描述符fd:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EFBIG:长度错误。
+- EBADF:无效的描述符。
+- EROFS:文件系统仅可读。
+- ENOSYS:缺少相关函数。
+
+#### openat
+
+openat()函数当参数传入为绝对路径时,与open()函数一致。如果openat()函数的第一个参数fd是常量AT_FDCWD时,则其后的第二个参数路径名是以当前工作目录为基址的;否则以fd指定的目录文件描述符为基址。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 文件路径path。
+3. 打开标识oflag。
+4. 访问模式mode。
+
+**输出**:
+
+- 文件描述符fd:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EFBIG:长度错误。
+- EBADF:无效的描述符。
+- EROFS:文件系统仅可读。
+- ENOSYS:缺少相关函数。
+
+#### scandir
+
+暂不支持。
+
+#### seekdir
+
+seekdir()函数用来设置参数dir目录流当前的读取位置。
+
+**参数**:
+
+1. 目录流指针dir。
+2. 偏移位置off。
+
+**输出**:无。
+
+#### readdir_r
+
+暂不支持。
+
+#### fdopendir
+
+fdopendir()函数打开与目录名称相对应的目录流指针。
+
+**参数**:
+
+1. 文件描述符fd。
+
+**输出**:
+
+- 目录流指针dir:操作成功。
+- NULL:操作失败。
+
+errno:
+
+- EBADF:无效的描述符。
+- ENOTDIR:不是目录。
+
+#### versionsort
+
+versionsort()函数将dirent的名称通过strverscmp()进行比较,用于比较版本号字符串。
+
+**参数**:
+
+1. dirent指针a。
+2. dirent指针b。
+
+**输出**:
+
+- 小于,等于或大于零的整数:操作成功。
+
+#### alphasort
+
+alphasort()函数将dirent的名称通过strcoll()进行比较,用于比较版本号字符串。
+
+**参数**:
+
+1. dirent指针a。
+2. dirent指针b。
+
+**输出**:
+
+- 小于,等于或大于零的整数:操作成功。
+
+#### rewinddir
+
+rewinddir()函数设置参数dir目录流读取位置为原来开头的读取位置。
+
+**参数**:
+
+1. 目录流指针dir。
+
+**输出**:无。
+
+#### dirfd
+
+dirfd()函数返回参数dir目录流相关的文件描述符fd。
+
+**参数**:
+
+1. 目录流指针dir。
+
+**输出**:
+
+- 整型文件描述符值:操作成功。
+
+#### readdir
+
+暂不支持。
+
+#### telldir
+
+telldir()函数返回一个目录流dir的当前位置。
+
+**参数**:
+
+1. 目录流指针dir。
+
+**输出**:
+
+- 位置整型值:操作成功。
+
+#### closedir
+
+closedir()函数关闭一个目录流dir。
+
+**参数**:
+
+1. 目录流指针dir。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EBADF:无效的描述符。
+
+#### opendir
+
+opendir()函数用来打开参数name指定的目录流。
+
+**参数**:
+
+1. 文件名name。
+
+**输出**:
+
+- 目录流指针:操作成功。
+- NULL:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- ELOOP:符号连接的层数过多。
+- EACCES:权限不足。
+- ENXIO:驱动程序问题。
+
+#### putwchar
+
+putwchar()函数将宽字符wc写入标准输出stdout。
+
+**参数**:
+
+1. 宽字符wc。
+
+**输出**:
+
+- wc:操作成功。
+- WEOF: 操作失败。
+
+errno:
+
+- EILSEQ:宽字符转换错误。
+
+#### fgetws
+
+fgetws()函数文件流中读取最多n-1个宽字符的字符串,并增加一个终结宽空字符,保存到输入字符串ws中。
+
+**参数**:
+
+1. 宽字符串ws。
+2. 宽字符串长度n。
+3. 文件流stream。
+
+**输出**:
+
+- ws:操作成功。
+- NULL:操作失败。
+
+#### vfwprintf
+
+vfwprintf()函数将format指向可变参数列表中的格式化数据的字符串写入文件流stream。
+
+**参数**:
+
+1. 文件流stream。
+2. 指向宽字符串的指针format。
+
+**输出**:
+
+- 成功转换字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EOVERFLOW:字符串长度溢出。
+- EINVAL:参数错误。
+
+#### fscanf
+
+fscanf()函数从文件流stream读取格式化数据到变量参数列表中。
+
+**参数**:
+
+1. 文件流stream。
+2. 格式化输入format。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- EOF:操作失败。
+
+#### snprintf
+
+snprintf()函数用于格式化输出字符串,并将结果写入到指定的缓冲区,并限制输出的字符数,避免缓冲区溢出。
+
+**参数**:
+
+1. 目标字符串str。
+2. 字符数组的大小size。
+3. 格式化字符串format。
+4. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### sprintf
+
+sprintf()函数发送格式化输出到str所指向的字符串。
+
+**参数**:
+
+1. 目标字符串str。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### fgetpos
+
+fgetpos()函数获取文件流stream的当前文件位置,并把它写入到pos。
+
+**参数**:
+
+1. 指向文件流对象指针stream。
+2. 指向fpos_t对象的指针。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### vdprintf
+
+vdprintf()函数将可变参数的格式化后的字符串输出到文件描述符中。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### gets
+
+gets()函数从标准输入stdin读取一行,并存储在str所指向的字符串中。
+
+**参数**:
+
+1. 字符串指针str。
+
+**输出**:
+
+- 字符串指针str:操作成功。
+- NULL:操作失败。
+
+#### ungetc
+
+ungetc()函数将字符char推入到指定的文件流stream中,以便它是下一个被读取到的字符。
+
+**参数**:
+
+1. 被推入的字符char。
+2. 文件流指针stream。
+
+**输出**:
+
+- 字符char:操作成功。
+- EOF:操作失败。
+
+#### ftell
+
+ftell()函数返回给定文件流stream的当前文件位置。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 当前文件位置:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EOVERFLOW:文件位置溢出。
+
+#### clearerr
+
+clearerr()函数清除给定文件流stream的文件结束符和错误标识符。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:无
+
+#### getc_unlocked
+
+getc_unlocked()函数从文件流stream读取字符char。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 字符char:操作成功。
+- EOF:文件流结束。
+
+#### fmemopen
+
+fmemopen()函数打开一个内存流,使其可以读取或写入由buf指定的缓冲区。
+
+**参数**:
+
+1. 缓冲区buf。
+2. 缓冲区大小size。
+3. 操作模式mode。
+
+**输出**:
+
+- 文件流指针:操作成功。
+- NULL:操作失败。
+
+errno:
+
+- EINVAL:参数失败。
+- ENOMEM:内存不足。
+
+#### putwc
+
+putwc()函数将宽字符wc写入给定的文件流stream中。
+
+**参数**:
+
+1. 宽字符wc。
+2. 文件流stream。
+
+**输出**:
+
+- 宽字符wc:操作成功。
+- WEOF:操作失败。
+
+errno:
+
+- EILSEQ:宽字符转换错误。
+
+#### getchar
+
+getchar()函数从标准输入stdin获取一个字符。
+
+**参数**:无
+
+**输出**:
+
+- 字符ch:操作成功。
+- EOF:操作失败或文件末尾。
+
+#### open_wmemstream
+
+open_wmemstream()函数打开用于写入宽字符串缓冲区的文件流。缓冲区是动态分配的。
+
+**参数**:
+
+1. 指向缓冲区宽字符串指针ptr。
+2. 指向缓冲区大小的指针size。
+
+**输出**:
+
+- 文件流指针:操作成功。
+- NULL:操作失败。
+
+#### asprintf
+
+asprintf()函数将可变参数的格式化后的数据写入字符串缓冲区buffer。
+
+**参数**:
+
+1. 存放字符串的指针buf。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### funlockfile
+
+funlockfile()函数将文件流解锁。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:无
+
+#### fflush
+
+fflush()函数刷新文件流stream的输出缓冲区。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 0:操作成功。
+- EOF:操作失败。
+
+#### vfprintf
+
+vfprintf()函数将可变参数的格式化数据输出到文件流stream中。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EOVERFLOW:字符串长度溢出。
+- EINVAL:参数错误。
+
+#### vsscanf
+
+vsscanf()函数从字符串中读取格式化的数据到变量参数列表中。
+
+**参数**:
+
+1. 处理字符串的指针str。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### vfwscanf
+
+vfwscanf()函数从文件流中读取格式化的数据到变量参数列表中。
+
+**参数**:
+
+1. 输入文件流stream。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### puts
+
+puts()函数将指定字符串写入到标准输出stdout中。
+
+**参数**:
+
+1. 输出字符串str。
+
+**输出**:
+
+- 字符串长度:操作成功。
+- EOF:操作失败。
+
+#### getchar_unlocked
+
+getchar_unlocked()函数读取标准输入stdin的一个字符。
+
+**参数**:无。
+
+**输出**:
+
+- 读取字符char:操作成功。
+- EOF:操作失败。
+
+#### setvbuf
+
+setvbuf()函数设置文件流stream的缓冲模式。当前只支持无缓冲模式。
+
+**参数**:
+
+1. 文件流stream。
+2. 分配的缓冲区buf。
+3. 指定文件缓冲的模式mode。
+4. 缓冲区大小size。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### getwchar
+
+getwchar()函数从标准输入stdin获取一个宽字符。
+
+**参数**:无。
+
+**输出**:
+
+- 宽字符ch:操作成功。
+- EOF:操作失败或文件末尾。
+
+#### setbuffer
+
+setbuffer()函数用来设置文件流stream的缓冲区。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 缓冲区buf。
+3. 缓冲区大小size。
+
+**输出**:无。
+
+#### vsnprintf
+
+vsnprintf()函数将可变参数的格式化数据输出到字符串缓冲区中。
+
+**参数**:
+
+1. 字符串缓冲区str。
+2. 缓冲区大小size。
+3. 格式化字符串format。
+4. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### freopen
+
+freopen()函数将一个新的文件名filename与给定的打开的流stream关联,同时关闭流中的旧文件。
+
+**参数**:
+
+1. 新的文件名filename。
+2. 文件访问模式mode。
+3. 文件流指针stream。
+
+**输出**:
+
+- 文件流指针stream:操作成功。
+- NULL:操作失败。
+
+#### fwide
+
+fwide()函数用于设置文件流的定向。
+
+**参数**:
+
+1. 文件流fp。
+2. 设置模式mode。
+
+**输出**:
+
+- mode:操作成功。
+
+#### sscanf
+
+sscanf()函数从字符串中读取格式化的数据到变量列表中。
+
+**参数**:
+
+1. 处理字符串的指针str。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### fgets
+
+fgets()函数从指定的流中读取数据,每次读取n-1个字符或换行符或结束,并存储在参数str所指向的字符串内。
+
+**参数**:
+
+1. 字符串的指针str。
+2. 读取最大字符数n.
+3. 文件流stream。
+
+**输出**:
+
+- 返回相同的str参数:操作成功。
+- NULL:操作失败。
+
+#### vswscanf
+
+vswscanf()函数从参数str读取格式化的宽字符数据到变量参数列表中。
+
+**参数**:
+
+1. 字符串的指针str。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配数:操作成功。
+- -1:操作失败。
+
+#### vprintf
+
+vprintf()函数将格式化字符串输出到标准输出stdout。
+
+**参数**:
+
+1. 格式化字符串format。
+2. 可变参数。
+
+**输出**:
+
+- 成功写入字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EOVERFLOW:字符串溢出。
+
+#### fputws
+
+fputws()函数将参数宽字符串str写入指定的文件流stream。
+
+**参数**:
+
+1. 宽字符串str。
+2. 文件流指针stream。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### wprintf
+
+wprintf()函数将格式化字符串format写入到标准输出stdout。
+
+**参数**:
+
+1. 格式化字符串format。
+2. 可变参数。
+
+**输出**:
+
+- 返回写入字符数:操作成功。
+- -1:操作失败。
+
+#### wscanf
+
+wscanf()函数从标准输入stdin读取格式化的宽字符数据到可变变量列表。
+
+**参数**:
+
+1. 格式化字符串format。
+2. 可变参数。
+
+**输出**:
+
+- 返回成功匹配数:操作成功。
+- -1:操作失败。
+
+#### fputc
+
+fputc()函数将字符c写入指定的文件流stream。
+
+**参数**:
+
+1. 输入字符c。
+2. 文件流指针stream。
+
+**输出**:
+
+- 返回成功匹配数:操作成功。
+- EOF:操作失败。
+
+#### putchar
+
+putchar()函数将字符c写入标准输入stdin。
+
+**参数**:
+
+1. 输入字符c。
+
+**输出**:
+
+- 返回成功匹配数:操作成功。
+- EOF:操作失败。
+
+#### flockfile
+
+flockfile()函数将指定的文件流锁定。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:无。
+
+#### vswprintf
+
+vswprintf()函数将格式化字符串写入大小已设置的缓冲区中。
+
+**参数**:
+
+1. 宽字符串ws。
+2. 宽字符串大小len。
+3. 格式化字符串format。
+4. 可变参数。
+
+**输出**:
+
+- 返回成功匹配数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EOVERFLOW:字符串溢出。
+
+#### fputwc
+
+fputwc()函数将参数宽字符wc写入文件流stream。
+
+**参数**:
+
+1. 宽字符wc。
+2. 文件流指针stream。
+
+**输出**:
+
+- 宽字符wc:操作成功。
+- WEOF:操作失败。
+
+#### fopen
+
+fopen()函数使用给定的模式mode打开filename所指向的文件。
+
+**参数**:
+
+1. 文件名filename。
+2. 文件访问模式mode。
+
+**输出**:
+
+- 文件流指针:操作成功。
+- NULL:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+
+#### tmpnam
+
+tmpnam()函数生成并返回一个有效的临时文件名,并存储在参数缓冲区buf中。
+
+**参数**:
+
+1. 文件名filename。
+
+**输出**:
+
+- 临时文件名:操作成功。
+- NULL:操作失败。
+
+#### ferror
+
+ferror()函数测试给定文件流stream的错误标识符。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 0:文件流未出错。
+- 非零值:文件流出错。
+
+#### printf
+
+printf()函数将格式化字符串format写入到标准输出stdout。
+
+**参数**:
+
+1. 格式化字符串format。
+2. 可变参数。
+
+**输出**:
+
+- 成功写入字符数:操作成功。
+- -1:操作失败。
+
+#### open_memstream
+
+open_memstream()函数打开用于写入字符串缓冲区的文件流。缓冲区是动态分配的。
+
+**参数**:
+
+1. 指向缓冲区宽字符串指针ptr。
+2. 指向缓冲区大小的指针size。
+
+**输出**:
+
+- 文件流指针:操作成功。
+- NULL:操作失败。
+
+#### fwscanf
+
+fwscanf()函数从文件流stream中读取格式化数据将值存储到可变变量列表中。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### fprintf
+
+fprintf()函数将格式化字符串写入到指定文件流stream。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EOVERFLOW:字符串长度溢出。
+- EINVAL:参数错误。
+
+#### fgetc
+
+fgetc()函数从文件流stream中读取一个字符c。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 读取的字符c:操作成功。
+- EOF:操作失败。
+
+#### rewind
+
+rewind()函数将文件流内部指针重新指向开头。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:无。
+
+#### getwc
+
+getwc()函数从文件流读取一个宽字符wc。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 读取的宽字符c:操作成功。
+- WEOF:操作失败。
+
+#### scanf
+
+scanf()函数从标准输入stdin读取格式化输入到可变变量列表中。
+
+**参数**:
+
+1. 格式化字符串format。
+2. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### perror
+
+perror()函数将错误提示字符串打印出来。
+
+**参数**:
+
+1. 错误字符串msg。
+
+**输出**:无。
+
+#### vsprintf
+
+vsprintf()函数将格式化字符串输出到参数指定的字符串str。
+
+**参数**:
+
+1. 字符串缓冲区str。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### vasprintf
+
+vasprintf()函数将格式化字符串写入动态分配的字符串缓冲区中。
+
+**参数**:
+
+1. 字符串缓冲区指针str。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### getc
+
+getc()函数从文件流stream中读取一个字符c。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 读取的字符c:操作成功。
+- EOF:操作失败。
+
+#### dprintf
+
+dprintf()函数将格式化字符串写入到文件描述符fd指定的文件中。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 格式化字符串format。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EOVERFLOW:字符串溢出。
+
+#### popen
+
+暂不支持。
+
+#### putc
+
+putc()函数将一个字符c写入文件流stream。
+
+**参数**:
+
+1. 文件描述符fd。
+2. 格式化字符串format。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+#### fseek
+
+fseek()函数设置文件流stream的位置。
+
+**参数**:
+
+1. 文件流stream。
+2. 相对偏移量offset。
+3. 开始位置whence。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### fgetwc
+
+fgetwc()函数从文件流stream读取一个宽字符wc。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 宽字符wc:操作成功。
+- WEOF:操作失败。
+
+errno:
+
+- EILSEQ:转换失败。
+
+#### tmpfile
+
+tmpfile()函数生成一个临时文件流指针。
+
+**参数**:无。
+
+**输出**:
+
+- 临时文件流指针:操作成功。
+- NULL:操作失败。
+
+#### putw
+
+putw()函数将一个字符c写入指定的文件流stream。
+
+**参数**:
+
+1. 输出字符c。
+2. 文件流指针stream。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### tempnam
+
+tempnam()函数在指定的目录中可用于创建一个临时文件的文件名。
+
+**参数**:
+
+1. 指定目录dir。
+2. 文件名前缀prefix。
+
+**输出**:
+
+- 临时文件名:操作成功。
+- NULL:操作失败。
+
+#### vwprintf
+
+vwprintf()函数将格式化宽字符串写入到标准输出stdout。
+
+**参数**:
+
+1. 格式化字符串format。
+2. 可变参数。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EOVERFLOW:字符串溢出。
+
+#### getw
+
+getw()函数从指定文件流stream读取一个字符c。
+
+**参数**:
+
+1. 文件流stream。
+
+**输出**:
+
+- 读取的字符c:操作成功。
+- EOF:操作失败。
+
+#### putchar_unlocked
+
+putchar_unlocked()函数将一个字符c写入标准输出stdout。
+
+**参数**:
+
+1. 写入字符c。
+
+**输出**:
+
+- 字符c:操作成功。
+- EOF:操作失败。
+
+#### fread
+
+fread()函数从给定文件流stream读取最多count的字符到字符串缓冲区buf。
+
+**参数**:
+
+1. 缓冲区指针buf。
+2. 每个元素大小size。
+3. 元素个数count。
+4. 文件流指针stream。
+
+**输出**:
+
+- 成功匹配字符数:操作成功。
+- 0:操作失败。
+
+#### fileno
+
+fileno()函数返回文件流stream相关的文件描述符。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 文件描述符:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EBADF:无效的描述符。
+
+#### remove
+
+remove()函数删除给定的文件名filename。
+
+**参数**:
+
+1. 文件名filename。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### putc_unlocked
+
+putc_unlocked()函数将一个字符c写入指定的文件流stream。
+
+**参数**:
+
+1. 写入字符c。
+2. 文件流指针stream。
+
+**输出**:
+
+- 写入字符c:操作成功。
+- EOF:操作失败。
+
+#### fclose
+
+fclose()函数关闭文件流stream。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 0:操作成功。
+- EOF:操作失败。
+
+#### feof
+
+feof()函数检测文件流的文件结束符。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 1:文件结束。
+- 0:文件未结束。
+
+#### fwrite
+
+fwrite()函数将指定的字符串str写入文件流stream。
+
+**参数**:
+
+1. 字符串str。
+2. 元素的大小size。
+3. 元素的个数count。
+4. 文件流指针stream。
+
+**输出**:
+
+- 返回成功写入字符数:操作成功。
+- 0:操作失败。
+
+#### setbuf
+
+setbuf()函数打开或关闭缓冲机制。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 缓冲区buf。
+
+**输出**:无。
+
+#### pclose
+
+暂不支持。
+
+#### swprintf
+
+swprintf()函数将格式化的数据写入到指定的宽字符串中。
+
+**参数**:
+
+1. 宽字符串缓冲区buf。
+2. 宽字符串大小size。
+3. 格式化字符串format。
+4. 可变参数。
+
+**输出**:
+
+- 成功写入字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EOVERFLOW:字符串溢出。
+
+#### fwprintf
+
+fwprintf()函数将格式化宽字符串写入文件流stream。
+
+**参数**:
+
+1. 文件流stream。
+2. 格式化宽字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功写入字符数:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+- EOVERFLOW:字符串溢出。
+
+#### swscanf
+
+swscanf()函数从宽字符串中读取格式化的数据到变量列表中。
+
+**参数**:
+
+1. 宽字符串ws。
+2. 格式化宽字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配数:操作成功。
+- -1:操作失败。
+
+#### rename
+
+rename()函数将旧文件名old_filename重命名为新文件名new_filename。
+
+**参数**:
+
+1. 旧文件名old_filename。
+2. 新文件名new_filename。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+errno:
+
+- EINVAL:参数错误。
+
+#### getdelim
+
+getdelim()函数从文件流中读取字符串,由参数指定的delimiter的进行分隔。
+
+**参数**:
+
+1. 字符串缓冲区buf。
+2. 字符串缓冲区大小指针n。
+3. 分隔符delimiter。
+4. 文件流指针stream。
+
+**输出**:
+
+- 成功写入字符数:操作成功。
+- -1:操作失败。
+
+#### vfscanf
+
+vfscanf()函数从文件流stream读取格式化的数据到变量参数列表中。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 格式化字符串format。
+3. 可变参数。
+
+**输出**:
+
+- 成功匹配数:操作成功。
+- -1:操作失败。
+
+#### setlinebuf
+
+setlinebuf()函数设置文件流stream的行缓冲模式。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:无。
+
+#### fputs
+
+fputs()函数将字符串str写入到指定的文件流stream。
+
+**参数**:
+
+1. 字符串str。
+2. 文件流指针stream。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### fsetpos
+
+fsetpos()函数将文件指针定位在参数pos指定的位置上。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 文件位置pos。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### fopencookie
+
+fopencookie()函数打开一个可以自定义实现的I/O流。
+
+**参数**:
+
+1. 结构体指针cookie。
+2. 访问模式mode。
+3. 自定义I/O流函数。
+
+**输出**:
+
+- 文件流指针:操作成功。
+- NULL:操作失败。
+
+#### fgetln
+
+fgetln()函数从文件流中读取一行数据,并存储在大小为*len的缓冲区中。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 缓冲区长度指针len。
+
+**输出**:
+
+- 字符串指针:操作成功。
+- NULL:操作失败。
+
+#### vscanf
+
+vscanf()函数从标准输入stdin将格式化的数据读入可变参数列表。
+
+**参数**:
+
+1. 格式化字符串format。
+2. 可变参数。
+
+**输出**:
+
+- 成功匹配数:操作成功。
+- -1:操作失败。
+
+#### ungetwc
+
+ungetwc()函数将宽字符ch推回与文件流关联的缓冲区中,除非ch等于WEOF。
+
+**参数**:
+
+1. 宽字符wc。
+2. 文件流指针stream。
+
+**输出**:
+
+- 返回宽字符wc:操作成功。
+- WEOF:操作失败。
+
+#### getline
+
+getline()函数从文件流中读取字符串,由换行符\n的进行分隔。
+
+**参数**:
+
+1. 字符串缓冲区buf。
+2. 字符串缓冲区大小指针n。
+3. 文件流指针stream。
+
+**输出**:
+
+- 成功写入字符数:操作成功。
+- -1:操作失败。
+
+#### ftrylockfile
+
+ftrylockfile()函数尝试进行文件锁定。
+
+**参数**:
+
+1. 文件流指针stream。
+
+**输出**:
+
+- 0:操作成功。
+- -1:操作失败。
+
+#### vwscanf
+
+vwscanf()函数从标准输入stdin中读取格式化的数据到变量参数列表中。
+
+**参数**:
+
+1. 文件流指针stream。
+2. 可变参数。
+
+**输出**:
+
+- 成功匹配数:操作成功。
+- -1:操作失败。
+
+## C11接口
+
+| 接口名 | 适配情况 |
+| :---: | :-----: |
+| [cnd_broadcast](#cnd_broadcast) | 支持 |
+| [cnd_destroy](#cnd_destroy) | 支持 |
+| [cnd_init](#cnd_init) | 支持 |
+| [cnd_signal](#cnd_signal) | 支持 |
+| [cnd_timedwait](#cnd_timedwait) | 支持 |
+| [cnd_wait](#cnd_wait) | 支持 |
+| [mtx_destroy](#mtx_destroy) | 支持 |
+| [mtx_init](#mtx_init) | 支持 |
+| [mtx_lock](#mtx_lock) | 支持 |
+| [mtx_timedlock](#mtx_timedlock) | 支持 |
+| [mtx_trylock](#mtx_trylock) | 支持 |
+| [thrd_create](#thrd_create) | 支持 |
+| [thrd_current](#thrd_current) | 支持 |
+| [thrd_detach](#thrd_detach) | 支持 |
+| [thrd_equal](#thrd_equal) | 支持 |
+| [thrd_exit](#thrd_exit) | 支持 |
+| [thrd_join](#thrd_join) | 支持 |
+| [thrd_sleep](#thrd_sleep) | 支持 |
+| [thrd_yield](#thrd_yield) | 支持 |
+| [tss_create](#tss_create) | 支持 |
+| [tss_delete](#tss_delete) | 支持 |
+| [tss_get](#tss_get) | 支持 |
+| [tss_set](#tss_set) | 支持 |
+
+### 条件变量管理
+
+#### cnd_init
+
+初始化条件变量cond。同使用条件变量属性为NULL的pthread_cond_init()。
+
+**参数**
+
+1. 条件变量指针cond。
+2. 条件变量属性指针attr。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+
+#### cnd_destroy
+
+销毁指定条件变量,使得该条件变量未初始化,可以使用cnd_init() 重新初始化。同pthread_cond_destory()。
+
+**参数**:条件变量指针cond。
+
+**输出**:无。
+
+#### cnd_broadcast
+
+取消阻止当前等待cond所指向的条件变量的所有线程。如果没有线程被阻塞,则不执行任何操作并返回thrd_success。
+
+**参数**:条件变量指针cond。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+
+#### cnd_signal
+
+取消阻塞在指定的条件变量cond上阻塞的线程中的至少一个(如果有任何线程在cond上被阻塞)。
+
+**参数**:条件变量指针cond。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+
+#### cnd_timedwait
+
+阻塞当前线程等待cond指定的条件变量,并释放互斥体指定的互斥体。只有在另一个线程使用相同的条件变量调用cnd_signal() 或cnd_broadcast() 后,或者如果系统时间达到指定的时间,并且当前线程重新获得互斥锁时,等待线程才会解锁。
+
+**参数**:
+
+1. 条件变量指针cond。
+2. 互斥锁指针m。
+3. 超时时间指针ts。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+- thrd_timedout:阻塞超时
+
+#### cnd_wait
+
+cnd_wait() 函数与cnd_timedwait() 类似,阻塞当前线程等待cond指定的条件变量,并释放互斥体指定的互斥体。只有在另一个线程使用相同的条件变量调用cnd_signal() 或cnd_broadcast() 后,并且当前线程重新获得互斥锁时,等待线程才会解锁。
+
+**参数**:
+
+1. 条件变量指针cond。
+2. 互斥锁指针m。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+
+### 互斥锁管理
+
+#### mtx_init
+
+mtx_init()函数根据属性type初始化互斥锁。
+
+**参数**:
+
+1. 互斥锁指针mutex。
+2. 互斥锁属性type。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+
+#### mtx_destroy
+
+mtx_destroy() 用于注销一个互斥锁。销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。
+
+**参数**:互斥锁指针mutex。
+
+**输出**:无。
+
+#### mtx_lock
+
+当pthread_mutex_lock() 返回时,该[互斥锁](https://baike.baidu.com/item/互斥锁/841823?fromModule=lemma_inlink)已被锁定。[线程](https://baike.baidu.com/item/线程/103101?fromModule=lemma_inlink)调用该函数让互斥锁上锁,如果该互斥锁已被另一个线程锁定和拥有,则调用该线程将阻塞,直到该互斥锁变为可用为止。
+
+**参数**:互斥锁指针mutex。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+
+#### mtx_timedlock
+
+mtx_timedlock() 语义与mtx_lock() 类似,不同点在于锁已经被占据时增加一个超时时间,等待超时返回错误码。
+
+**参数**:
+
+1. 互斥锁指针mutex。
+2. 超时时间指针ts。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+- thrd_timedout:等待超时。
+
+#### mtx_trylock
+
+mtx_trylock() 语义与 mtx_lock() 类似,不同点在于锁已经被占据时返回 thrd_busy, 而非挂起等待。
+
+**参数**:互斥锁指针mutex。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_busy:mutex指定的锁已经被占据。
+- thrd_error:操作失败。
+
+### 任务管理
+
+#### thrd_create
+
+thrd_create()函数创建一个执行函数为func的新线程,创建成功后,将创建的线程的ID存储在参数 thread 的位置。
+
+**参数**:
+
+1. 指向线程[标识符](https://baike.baidu.com/item/标识符?fromModule=lemma_inlink)的[指针](https://baike.baidu.com/item/指针?fromModule=lemma_inlink)thread。
+2. 线程处理函数的起始地址 func。
+3. 运行函数的参数 arg。
+
+**输出**:
+
+- thrd_success:创建成功。
+- thrd_error:attr指定的属性无效。
+- thrd_nomem:系统缺少创建新线程所需的资源。
+
+#### thrd_current
+
+返回调用线程的线程ID。
+
+**参数**:无
+
+**输出**:返回调用线程的线程ID。
+
+#### thrd_detach
+
+实现线程分离,即主线程与子线程分离,子线程结束后,资源自动回收。
+
+**参数**:线程ID:thread。
+
+**输出**:
+
+- 0:成功完成。
+- EINVAL:thread是分离线程。
+- ESRCH:给定线程ID指定的线程不存在。
+
+#### thrd_equal
+
+此函数应比较线程ID t1和t2。
+
+**参数**:
+
+1. 线程ID t1。
+2. 线程ID t2。
+
+**输出**:
+
+- 如果t1和t2相等,pthread_equal()函数应返回非零值。
+- 如果t1和t2不相等,应返回零。
+- 如果t1或t2不是有效的线程ID,则行为未定义。
+
+#### thrd_exit
+
+线程的终止可以是调用 thrd_exit 或者该线程的例程结束。由此可看出,一个线程可以隐式退出,也可以显式调用 thrd_exit 函数来退出。thrd_exit 函数唯一的参数 value_ptr 是函数的返回代码,只要 thrd_join 中的第二个参数 value_ptr 不是NULL,这个值将被传递给 value_ptr。
+
+**参数**:线程退出状态value_ptr,通常传NULL。
+
+**输出**:无
+
+#### thrd_join
+
+thrd_join() 函数,以阻塞的方式等待 thread 指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且 thread 指定的线程必须是 joinable 的。当 thrd_join()成功返回时,目标线程已终止。对指定同一目标线程的thrd_join()的多个同时调用的结果未定义。如果调用thrd_join()的线程被取消,则目标线程不应被分离。
+
+**参数**:
+
+1. 线程ID:thread。
+2. 退出线程:返回值value_ptr。
+
+**输出**:
+
+- thrd_success:操作成功。
+
+#### thrd_sleep
+
+至少在达到time_point指向的基于TIME_UTC的时间点之前,阻塞当前线程的执行。如果收到未被忽略的信号,睡眠可能会恢复。
+
+**参数**:
+
+1. 应等待时间:req。
+2. 实际等待时间:rem。
+
+**输出**:
+
+- 0:操作成功。
+- -2: 操作失败。
+
+#### thrd_yield
+
+thrd_yield()函数应强制正在运行的线程放弃处理器,并触发线程调度。
+
+**参数**:无
+
+**输出**:输出0时,成功完成;否则应返回值-1。
+
+#### tss_create
+
+分配用于标识线程特定数据的键。tss_create 第一个参数为指向一个键值的[指针](https://baike.baidu.com/item/指针/2878304?fromModule=lemma_inlink),第二个参数指明了一个 destructor 函数,如果这个参数不为空,那么当每个线程结束时,系统将调用这个函数来释放绑定在这个键上的内存块。
+
+**参数**:
+
+1. 键值的[指针](https://baike.baidu.com/item/指针/2878304?fromModule=lemma_inlink)tss。
+2. destructor 函数入口 destructor。
+
+**输出**:
+
+- thrd_success:操作成功。
+- thrd_error:操作失败。
+
+#### tss_delete
+
+销毁线程特定数据键。
+
+**参数**:需要删除的键key。
+
+**输出**:无
+
+#### tss_get
+
+将与key关联的数据读出来,返回数据类型为 void *,可以指向任何类型的数据。需要注意的是,在使用此返回的指针时,需满足是 void 类型,虽指向关联的数据地址处,但并不知道指向的数据类型,所以在具体使用时,要对其进行强制类型转换。
+
+**参数**:键值key。
+
+**输出**:
+
+- 返回与给定 key 关联的线程特定数据值。
+- NULL:没有线程特定的数据值与键关联。
+
+#### tss_set
+
+tss_set() 函数应将线程特定的 value 与通过先前调用 tss_create()获得的 key 关联起来。不同的线程可能会将不同的值绑定到相同的键上。这些值通常是指向已保留供调用线程使用的动态分配内存块的指针。
+
+**参数**:
+
+1. 键值key。
+2. 指针value
+
+**输出**:
+
+- 0:设置成功。
+
+## 其他接口
+
+| 接口名 | 适配情况 |
+| :---: | :-----: |
+| [pthread_getattr_default_np](#pthread_getattr_default_np) | 支持 |
+| [pthread_getattr_np](#pthread_getattr_np) | 支持 |
+| [pthread_getname_np](#pthread_getattr_np) | 支持 |
+| [pthread_setattr_default_np](#pthread_setattr_default_np) | 支持 |
+| [pthread_setname_np](#pthread_setname_np) | 支持 |
+| [pthread_timedjoin_np](#pthread_timedjoin_np) | 支持 |
+| [pthread_tryjoin_np](#pthread_tryjoin_np) | 支持 |
+| [ftime](#ftime) | 支持 |
+| [timegm](#timegm) | 支持 |
+
+### pthread_getattr_default_np
+
+pthread_getattr_default_np() 函数初始化attr引用的线程属性对象,使其包含用于创建线程的默认属性。
+
+**参数**:线程属性对象attr。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+### pthread_setattr_default_np
+
+pthread_setattr_default_np() 函数用于设置创建新线程的默认属性,即当使用NULL的第二个参数调用pthread_create时使用的属性。
+
+**参数**:线程属性对象attr。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+### pthread_getattr_np
+
+pthread_getattr_np() 函数初始化attr引用的线程属性对象,使其包含描述正在运行的线程线程的实际属性值。
+
+**参数**:
+
+1. 线程ID值thread。
+2. 线程属性对象attr。
+
+**输出**:
+
+- 0:操作成功。
+- 非0值:操作失败。
+
+### pthread_getname_np
+
+pthread_getname_np() 函数可用于检索线程的名称。thread参数指定要检索其名称的线程。
+
+**参数**:
+
+1. 线程ID值thread。
+2. 线程名字符串name。
+3. 字符串大小len。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+### pthread_setname_np
+
+pthread_setname_np() 函数可用于设置线程的名称。
+
+**参数**:
+
+1. 线程ID值thread。
+2. 线程名字符串name。
+3. 字符串大小len。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+
+### pthread_timedjoin_np
+
+类似pthread_join,如果线程尚未终止,则调用将阻塞直到abstime中指定的最大时间。如果超时在线程终止之前到期,则调用将返回错误。
+
+**参数**:
+
+1. 线程ID值thread。
+2. 线程退出状态status。
+3. 阻塞时间指针ts。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- ETIMEDOUT:阻塞超时。
+
+### pthread_tryjoin_np
+
+类似pthread_join,但如果线程尚未终止,将立即返回EBUSY。
+
+**参数**:
+
+1. 线程ID值thread。
+2. 线程退出状态status。
+
+**输出**:
+
+- 0:操作成功。
+- EINVAL:指针未初始化。
+- EBUSY:调用时线程尚未终止。
+
+### ftime
+
+取得当前的时间和日期,由一个timeb结构体返回。
+
+**参数**:
+
+1. timeb结构体指针tp。
+
+**输出**:无
+
+### timegm
+
+将tm结构体表示的时间转换为自一个标准时间点以来的时间,不受本地时区的影响。
+
+**参数**:
+
+1. tm结构体指针tp。
+
+**输出**:
+
+返回值:
+
+- time_t结构体表示的时间值。
+- -1: 转换失败。
+
+errno:
+
+- EOVERFLOW:转换溢出。
+
+## math数学库
+
+| 接口名 | 描述 | 输入参数 | 适配情况 |
+| :---: | :-----: | :-----: | :-----: |
+| [acos](#acos) | 计算参数x的反余弦值,参数x的取值范围[-1, +1],返回类型double | double类型的浮点数x | 支持 |
+| [acosf](#acosf) | 计算参数x的反余弦值,参数x的取值范围[-1, +1],返回类型float | float类型的浮点数x | 支持 |
+| [acosl](#acosl) | 计算参数x的反余弦值,参数x的取值范围[-1, +1],返回类型long double | long double类型的浮点数x | 支持 |
+| [acosh](#acosh) | 计算参数x的反双曲余弦值,返回类型double | double类型的浮点数x | 支持 |
+| [acoshf](#acoshf) | 计算参数x的反双曲余弦值,返回类型float | float类型的浮点数x | 支持 |
+| [acoshl](#acoshl) | 计算参数x的反双曲余弦值,返回类型long double | long double类型的浮点数x | 支持 |
+| [asin](#asin) | 计算参数x的反正弦值,参数x的取值范围为[-1, +1] | duoble类型的浮点数x | 支持 |
+| [asinf](#asinf) | 计算参数x的反正弦值,参数x的取值范围为[-1, +1] | float类型的浮点数x | 支持 |
+| [asinl](#asinl) | 计算参数x的反正弦值,参数x的取值范围为[-1, +1] | long double类型的浮点数x | 支持 |
+| [asinh](#asinh) | 计算参数x的反双曲正弦值,返回类型double | double类型的浮点数x | 支持 |
+| [asinhf](#asinhf) | 计算参数x的反双曲正弦值,返回类型float | float类型的浮点数x | 支持 |
+| [asinhl](#asinhl) | 计算参数x的反双曲正弦值,返回类型long double | long double类型的浮点数x | 支持 |
+| [atan](#atan) | 计算参数x的反正切值,返回类型double | double类型的浮点数x | 支持 |
+| [atanf](#atanf) | 计算参数x的反正切值,返回类型float | float类型的浮点数x | 支持 |
+| [atanl](#atanl) | 计算参数x的反正切值,返回类型long double | long double类型的浮点数x | 支持 |
+| [atan2](#atan2) | 计算参数y除以x的反正切值,使用两个参数的符号确定返回值的象限 | double类型的浮点数y double类型的浮点数x | 支持 |
+| [atan2f](#atan2f) | 计算参数y除以x的反正切值,使用两个参数的符号确定返回值的象限 | float类型的浮点数y float类型的浮点数x | 支持 |
+| [atan2l](#atan2l) | 计算参数y除以x的反正切值,使用两个参数的符号确定返回值的象限 | long double类型的浮点数y long double类型的浮点数x | 支持 |
+| [atanh](#atanh) | 计算参数x的反双曲正切值,返回类型double | double类型的浮点数x | 支持 |
+| [atanhf](#atanhf) | 计算参数x的反双曲正切值,返回类型float | float类型的浮点数x | 支持 |
+| [atanhl](#atanhl) | 计算参数x的反双曲正切值,返回类型long double | long double类型的浮点数x | 支持 |
+| [cbrt](#cbrt) | 计算参数x的立方根,返回类型double | double类型的浮点数x | 支持 |
+| [cbrtf](#cbrtf) | 计算参数x的立方根,返回类型float | float类型的浮点数x | 支持 |
+| [cbrtl](#cbrtl) | 计算参数x的立方根,返回类型long double | long double类型的浮点数x | 支持 |
+| [ceil](#ceil) | 计算不小于参数x的最小整数值,返回类型double | duoble类型的浮点数x | 支持 |
+| [ceilf](#ceilf) | 计算不小于参数x的最小整数值,返回类型float | float类型的浮点数x | 支持 |
+| [ceill](#ceill) | 计算不小于参数x的最小整数值,返回类型long double | long duoble类型的浮点数x | 支持 |
+| [copysign](#copysign) | 生成一个值,该值具有参数x的大小和参数y的符号 | duoble类型的浮点数x double类型的浮点数y | 支持 |
+| [copysignf](#copysignf) | 生成一个值,该值具有参数x的大小和参数y的符号 | float类型的浮点数x float类型的浮点数y | 支持 |
+| [copysignl](#copysignl) | 生成一个值,该值具有参数x的大小和参数y的符号 | long duoble类型的浮点数x long double类型的浮点数y | 支持 |
+| [cos](#cos) | 计算参数x的余弦值,参数应为弧度值,返回类型double | duoble类型的浮点数x | 支持 |
+| [cosf](#cosf) | 计算参数x的余弦值,参数应为弧度值,返回类型float | float类型的浮点数x | 支持 |
+| [cosl](#cosl) | 计算参数x的余弦值,参数应为弧度值,返回类型long double | long double类型的浮点数x | 支持 |
+| [cosh](#cosh) | 计算参数x的双曲余弦值,返回类型double | double类型的浮点数x | 支持 |
+| [coshf](#coshf) | 计算参数x的双曲余弦值,返回类型float | float类型的浮点数x | 支持 |
+| [coshl](#coshl) | 计算参数x的双曲余弦值,返回类型long double | long double类型的浮点数x | 支持 |
+| [erf](#erf) | 计算参数x的高斯误差函数的值 | double类型的浮点数x | 支持 |
+| [erff](#erff) | 计算参数x的高斯误差函数的值 | float类型的浮点数x | 支持 |
+| [erfl](#erfl) | 计算参数x的高斯误差函数的值 | long double类型的浮点数x | 支持 |
+| [erfc](#erfc) | 计算参数x的高斯误差函数的值 | double类型的浮点数x | 支持 |
+| [erfcf](#erfcf) | 计算参数x的互补误差函数的值 | float类型的浮点数x | 支持 |
+| [erfcl](#erfcl) | 计算参数x的互补误差函数的值 | long double类型的浮点数x | 支持 |
+| [exp](#exp) | 以e为基数的指数,即$e^x$的值,返回类型double | double类型的浮点数x | 支持 |
+| [expf](#expf) | 以e为基数的指数,即$e^x$的值,返回类型float | float类型的浮点数x | 支持 |
+| [expl](#expl) | 以e为基数的指数,即$e^x$的值,返回类型long double | long double类型的浮点数x | 支持 |
+| [exp10](#exp10) | 以10为基数的指数,即$10^x$的值,返回类型double | double类型的浮点数x | 支持 |
+| [exp10f](#exp10f) | 以10为基数的指数,即$10^x$的值,返回类型float | float类型的浮点数x | 支持 |
+| [exp10l](#exp10l) | 以10为基数的指数,即$10^x$的值,返回类型long double | long double类型的浮点数x | 支持 |
+| [exp2](#exp2) | 以2为基数的指数函数,返回类型double | double类型的浮点数x | 支持 |
+| [exp2f](#exp2f) | 以2为基数的指数函数,返回类型float | float类型的浮点数x | 支持 |
+| [exp2l](#exp2l) | 以2为基数的指数函数,返回类型long double | long double类型的浮点数x | 支持 |
+| [expm1](#expm1) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | double类型的浮点数x | 支持 |
+| [expm1f](#expm1f) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | float类型的浮点数x | 支持 |
+| [expm1l](#expm1l) | 计算$e^x - 1$的值。如果参数x是个小值,expm1(x)函数的值比表达式$e^x - 1$更准确 | long double类型的浮点数x | 支持 |
+| [fabs](#fabs) | 计算参数x的绝对值,返回类型double | double类型的浮点数x | 支持 |
+| [fabsf](#fabsf) | 计算参数x的绝对值,返回类型float | float类型的浮点数x | 支持 |
+| [fabsl](#fabsl) | 计算参数x的绝对值,返回类型long double | long double类型的浮点数x | 支持 |
+| [fdim](#fdim) | 计算参数x和参数y之间的正差值 | double类型的浮点数x double类型的浮点数y | 支持 |
+| [fdimf](#fdimf) | 计算参数x和参数y之间的正差值 | float类型的浮点数x float类型的浮点数y | 支持 |
+| [fdiml](#fdiml) | 计算参数x和参数y之间的正差值 | long double类型的浮点数x long double类型的浮点数y | 支持 |
+| [finite](#finite) | 如果参数x既不是无限值也不是NaN,则返回一个非零值,否则返回0 | double类型的浮点数x | 支持 |
+| [finitef](#finitef) | 如果参数x既不是无限值也不是NaN,则返回一个非零值,否则返回0 | float类型的浮点数x| 支持 |
+| [floor](#floor) | 计算不大于参数x到最大整数值,返回类型double | double类型的浮点数x | 支持 |
+| [floorf](#floorf) | 计算不大于参数x到最大整数值,返回类型float | float类型的浮点数x | 支持 |
+| [floorl](#floorl) | 计算不大于参数x到最大整数值,返回类型long double | long double类型的浮点数x | 支持 |
+| [fma](#fma) | 计算表达式$(x * y) + z$的值,返回double类型 | double类型的浮点数x double类型的浮点数y double类型的浮点数z | 支持 |
+| [fmaf](#fmaf) | 计算表达式$(x * y) + z$的值,返回float类型 | float类型的浮点数x float类型的浮点数y float类型的浮点数z | 支持 |
+| [fmal](#fmal) | 计算表达式$(x * y) + z$的值,返回long double类型 | long double类型的浮点数x long double类型的浮点数y long double类型的浮点数z | 支持 |
+| [fmax](#fmax) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | double类型的浮点数x double类型的浮点数y | 支持 |
+| [fmaxf](#fmaxf) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | float类型的浮点数x float类型的浮点数y | 支持 |
+| [fmaxl](#fmaxl) | 确定其参数的最大数值。如果一个参数是非数值(NaN),另一个参数是数值,fmax函数将选择数值 | long double类型的浮点数x long double类型的浮点数y | 支持 |
+| [fmin](#fmin) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | double类型的浮点数x double类型的浮点数y | 支持 |
+| [fminf](#fminf) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | float类型的浮点数x float类型的浮点数y | 支持 |
+| [fminl](#fminl) | 返回其参数的最小数值。非数值NaN参数视为缺失数据。如果一个参数是非数值,另一个参数是数值,fmin函数将选择数值 | long double类型的浮点数x long double类型的浮点数y | 支持 |
+| [fmod](#fmod) | 计算表达式x/y的浮点余数,返回double类型 | double类型的浮点数x double类型的浮点数y | 支持 |
+| [fmodf](#fmodf) | 计算表达式x/y的浮点余数,返回float类型 | float类型的浮点数x float类型的浮点数y | 支持 |
+| [fmodl](#fmodl) | 计算表达式x/y的浮点余数,返回long double类型 | long double类型的浮点数x long double类型的浮点数y | 支持 |
+| [frexp](#frexp) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | double类型的浮点数x int *类型的浮点数y | 支持 |
+| [frexpf](#frexpf) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | float类型的浮点数x int *类型的浮点数y | 支持 |
+| [frexpl](#frexpl) | 将浮点数分解为规格化小数和2的整数幂,并将整数存入参数exp指向的对象中 | long double类型的浮点数x int *类型的浮点数y | 支持 |
+| [hypot](#hypot) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | double类型的浮点数x double类型的浮点数y | 支持 |
+| [hypotf](#hypotf) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | float类型的浮点数x float类型的浮点数y | 支持 |
+| [hypotl](#hypotl) | 计算表达式$(x^2 + y^2)^{1/2}$的值 | long double类型的浮点数x long double类型的浮点数y | 支持 |
+| [ilogb](#ilogb) | 以FLT_RADIX作为对数的底数,返回double类型x的对数的整数部分 | double类型的浮点数x | 支持 |
+| [ilogbf](#ilogbf) | 以FLT_RADIX作为对数的底数,返回float类型x的对数的整数部分 | float类型的浮点数x | 支持 |
+| [ilogbl](#ilogbl) | 以FLT_RADIX作为对数的底数,返回long double类型x的对数的整数部分 | long double类型的浮点数x | 支持 |
+| [j0](#j0) | 计算参数x的第一类0阶贝塞尔函数 | double类型浮点数x | 支持 |
+| [j0f](#j0f) | 计算参数x的第一类0阶贝塞尔函数 | float类型浮点数x | 支持 |
+| [j1](#j1) | 计算参数x的第一类1阶贝塞尔函数 | double类型浮点数x | 支持 |
+| [j1f](#j1f) | 计算参数x的第一类1阶贝塞尔函数 | float类型浮点数x | 支持 |
+| [jn](#jn) | 计算参数x的第一类n阶贝塞尔函数 | int类型阶数 double类型浮点数x | 支持 |
+| [jnf](#jnf) | 计算参数x的第一类n阶贝塞尔函数 | int类型阶数 float类型浮点数x | 支持 |
+| [ldexp](#ldexp) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的double类型值。 | double类型的浮点数x int类型的指数exp | 支持 |
+| [ldexpf](#ldexpf) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的float类型值。 | float类型的浮点数x int类型的指数exp | 支持 |
+| [ldexpl](#ldexpl) | 计算参数x与2的exp次幂的乘积,即返回$x * 2^{exp}$的long double类型值。 | long double类型的浮点数x int类型的指数exp | 支持 |
+| [lgamma](#lgamma) | 计算参数x伽玛绝对值的自然对数,返回double类型 | double类型的浮点数x | 支持 |
+| [lgammaf](#lgammaf) | 计算参数x伽玛绝对值的自然对数,返回float类型 | float类型的浮点数x | 支持 |
+| [lgammal](#lgammal) | 计算参数x伽玛绝对值的自然对数,返回long double类型 | long double类型的浮点数x | 支持 |
+| [lgamma_r](#lgamma_r) | 计算参数x伽玛绝对值的自然对数,与lgamma不同在于是线程安全的 | double类型的浮点数x int *类型符号参数 | 支持 |
+| [lgamma_r](#lgamma_r) | 计算参数x伽玛绝对值的自然对数,与lgamma不同在于是线程安全的 | float类型的浮点数x int *类型符号参数 | 支持 |
+| [llrint](#llrint) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | double类型的浮点数x | 支持 |
+| [llrintf](#llrintf) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | float类型的浮点数x | 支持 |
+| [llrintl](#llrintl) | 根据当前舍入模式,将参数舍入为long long int类型的最接近整数值 | long double类型的浮点数x | 支持 |
+| [llround](#llround) | 将double类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 |
+| [llroundf](#llroundf) | 将float类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 |
+| [llroundl](#llroundl) | 将long double类型x舍入为浮点形式表示的long long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 |
+| [log](#log) | double类型x的自然对数函数 | double类型的浮点数x | 支持 |
+| [logf](#logf) | float类型x的自然对数函数 | float类型的浮点数x | 支持 |
+| [logl](#logl) | long double类型x的自然对数函数 | long double类型的浮点数x | 支持 |
+| [log10](#log10) | double类型x以10为底数的对数函数 | double类型的浮点数x | 支持 |
+| [log10f](#log10f) | float类型x以10为底数的对数函数 | float类型的浮点数x | 支持 |
+| [log10l](#log10l) | long double类型x以10为底数的对数函数 | long double类型的浮点数x | 支持 |
+| [log1p](#log1p) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | double类型的浮点数x | 支持 |
+| [log1pf](#log1pf) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | float类型的浮点数x | 支持 |
+| [log1pl](#log1pl) | 以e为底数的对数函数,计算$log_e(1 + x)$的值。如果参数x是个小值,表达式log1p(x)比表达式log(1 + x)更准确 | long double类型的浮点数x | 支持 |
+| [log2](#log2) | double类型x以2为底数的对数函数 | double类型的浮点数x | 支持 |
+| [log2f](#log2f) | float类型x以2为底数的对数函数 | flaot类型的浮点数x | 支持 |
+| [log2l](#log2l) | long double类型x以2为底数的对数函数 | long double类型的浮点数x | 支持 |
+| [logb](#logb) | double类型x以FLT_RADIX为的底数到对数函数 | double类型的浮点数x | 支持 |
+| [logbf](#logbf) | float类型x以FLT_RADIX为的底数到对数函数 | float类型的浮点数x | 支持 |
+| [logbl](#logbl) | double类型x以FLT_RADIX为的底数到对数函数 | double类型的浮点数x | 支持 |
+| [lrint](#lrint) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | double类型的浮点数x | 支持 |
+| [lrintf](#lrintf) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | float类型的浮点数x | 支持 |
+| [lrintl](#lrintl) | 根据当前舍入模式,将参数舍入为long int类型的最接近整数值 | long double类型的浮点数x | 支持 |
+| [lround](#lround) | 将double类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 |
+| [lroundf](#lroundf) | 将float类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 |
+| [lroundl](#lroundl) | 将long double类型x舍入为浮点形式表示的long int型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 |
+| [modf](#modf) | 将double类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | double类型的浮点数value double *类型的指数iptr | 支持 |
+| [modff](#modff) | 将float类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | float类型的浮点数value float *类型的指数iptr | 支持 |
+| [modfl](#modfl) | 将long double类型的参数value分成整数部分和小数部分,两部分与参数value具有相同的类型和符号。整数部分以浮点形式存入参数iptr指向的对象中 | long double类型的浮点数value long double *类型的指数iptr | 支持 |
+| [nan](#nan) | 返回一个double类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 |
+| [nanf](#nanf) | 返回一个float类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 |
+| [nanl](#nanl) | 返回一个long double类型的非数值NaN,内容由参数tagp确定 | const char*类型tagp | 支持 |
+| [nearbyint](#nearbyint) | 根据当前舍入模式,将double型参数x舍入为浮点格式的double型整数值 | double类型x | 支持 |
+| [nearbyintf](#nearbyintf) | 根据当前舍入模式,将float型参数x舍入为浮点格式的float型整数值 | float类型x | 支持 |
+| [nearbyintl](#nearbyintl) | 根据当前舍入模式,将long double型参数x舍入为浮点格式的double型整数值 | long double类型x | 支持 |
+| [nextafter](#nextafter) | 返回double类型参数x沿参数y方向的下一个可表示值 | double类型x double类型y | 支持 |
+| [nextafterf](#nextafterf) | 返回double类型参数x沿参数y方向的下一个可表示值 | float类型x flaot类型y | 支持 |
+| [nextafterl](#nextafterl) | 返回double类型参数x沿参数y方向的下一个可表示值 | long double类型x long double类型y | 支持 |
+| [nexttoward](#nexttoward) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | double类型浮点数x long double类型浮点数y | 支持 |
+| [nexttowardf](#nexttowardf) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | float类型浮点数x long double类型浮点数y | 支持 |
+| [nexttowardl](#nexttowardl) | 返回double类型参数x沿参数y方向的下一个可表示值,等价于nextafter,区别在于参数y为long double | long double类型浮点数x long double类型浮点数y | 支持 |
+| [pow](#pow) | 计算表达式$x^y$的值 | double类型浮点数x double类型浮点数y | 支持 |
+| [powf](#powf) | 计算表达式$x^y$的值 | float类型浮点数x float类型浮点数y | 支持 |
+| [powl](#powl) | 计算表达式$x^y$的值 | long double类型浮点数x long double类型浮点数y | 支持 |
+| [pow10](#pow10) | 计算表达式$10^x$的值 | double类型浮点数x | 支持 |
+| [pow10f](#pow10f) | 计算表达式$10^x$的值 | float类型浮点数x| 支持 |
+| [pow10l](#pow10l) | 计算表达式$10^x$的值 | long double类型浮点数x | 支持 |
+| [remainder](#remainder) | 计算参数x除以y的余数,等同于drem | double类型浮点数x double类型浮点数y | 支持 |
+| [remainderf](#remainderf) | 计算参数x除以y的余数,等同于dremf | float类型浮点数x float类型浮点数y | 支持 |
+| [remainderl](#remainderl) | 计算参数x除以y的余数 | long double类型浮点数x long double类型浮点数y | 支持 |
+| [remquo](#remquo) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | double类型浮点数x double类型浮点数y int *类型商que | 支持 |
+| [remquof](#remquof) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | float类型浮点数x float类型浮点数y int *类型商que | 支持 |
+| [remquol](#remquol) | 计算参数x和参数y的浮点余数,并将商保存在传递的参数指针quo中 | long double类型浮点数x long double类型浮点数y int *类型商que | 支持 |
+| [rint](#rint) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | double类型的浮点数x | 支持 |
+| [rintf](#rintf) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | float类型的浮点数x | 支持 |
+| [rintl](#rintl) | 根据当前舍入模式,将参数x舍入为浮点个数的整数值 | long double类型的浮点数x | 支持 |
+| [round](#round) | 将double类型x舍入为浮点形式表示的double型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | double类型的浮点数x | 支持 |
+| [roundf](#roundf) | 将float类型x舍入为浮点形式表示的float型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | float类型的浮点数x | 支持 |
+| [roundl](#roundl) | 将long double类型x舍入为浮点形式表示的long double型最近整数值。如果x位于两个整数中心,将向远离0的方向舍入。 | long double类型的浮点数x | 支持 |
+| [scalb](#scalb) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x double类型的指数exp | 支持 |
+| [scalbf](#scalbf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x float类型的指数exp | 支持 |
+| [scalbln](#scalbln) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x long类型的指数exp | 支持 |
+| [scalblnf](#scalblnf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x long类型的指数exp | 支持 |
+| [scalblnl](#scalblnl) | 计算$x * FLT\_RADIX^{exp}$的long double类型值 | long double类型的浮点数x long类型的指数exp | 支持 |
+| [scalbn](#scalbn) | 计算$x * FLT\_RADIX^{exp}$的double类型值 | double类型的浮点数x int类型的指数exp | 支持 |
+| [scalbnf](#scalbnf) | 计算$x * FLT\_RADIX^{exp}$的float类型值 | float类型的浮点数x int类型的指数exp | 支持 |
+| [scalbnl](#scalbnl) | 计算$x * FLT\_RADIX^{exp}$的long double类型值 | long double类型的浮点数x int类型的指数exp | 支持 |
+| [significand](#significand) | 用于分离浮点数x的尾数部分,返回double类型 | double类型的浮点数x | 支持 |
+| [significandf](#significandf) | 用于分离浮点数x的尾数部分,返回double类型 | double类型的浮点数x | 支持 |
+| [sin](#sin) | 计算参数x的正弦值,参数应为弧度值,返回double类型 | double类型的浮点数x | 支持 |
+| [sinf](#sinf) | 计算参数x的正弦值,参数应为弧度值,返回float类型 | float类型的浮点数x | 支持 |
+| [sinl](#sinl) | 计算参数x的正弦值,参数应为弧度值,返回long double类型 | long double类型的浮点数x | 支持 |
+| [sincos](#sincos) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | double类型的浮点数x double*类型的浮点数sin double*类型的浮点数cos | 支持 |
+| [sincosf](#sincosf) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | float类型的浮点数x float*类型的浮点数sin float*类型的浮点数cos | 支持 |
+| [sincosl](#sincosl) | 同时计算参数x的正弦值和余弦值,并将结果存储在*sin和*cos,比单独调用sin和cos效率更高 | long double类型的浮点数x long double*类型的浮点数sin long double*类型的浮点数cos | 支持 |
+| [sinh](#sinh) | 计算参数x的双曲正弦值,返回double类型 | double类型的浮点数x | 支持 |
+| [sinhf](#sinhf) | 计算参数x的双曲正弦值,返回float类型 | float类型的浮点数x | 支持 |
+| [sinhl](#sinhl) | 计算参数x的双曲正弦值,返回long double类型 | long double类型的浮点数x | 支持 |
+| [sqrt](#sqrt) | 计算参数x的平方根,返回类型double | double类型的浮点数x | 支持 |
+| [sqrtf](#sqrtf) | 计算参数x的平方根,返回类型float | float类型的浮点数x | 支持 |
+| [sqrtl](#sqrtl) | 计算参数x的平方根,返回类型long double | long double类型的浮点数x | 支持 |
+| [tan](#tan) | 计算参数x的正切值,参数应为弧度值,返回double类型 | double类型的浮点数x | 支持 |
+| [tanf](#tanf) | 计算参数x的正切值,参数应为弧度值,返回float类型 | float类型的浮点数x | 支持 |
+| [tanl](#tanl) | 计算参数x的正切值,参数应为弧度值,返回long double类型 | long double类型的浮点数x | 支持 |
+| [tanh](#tanh) | 计算参数x的双曲正切值,返回double类型 | double类型的浮点数x | 支持 |
+| [tanhf](#tanhf) | 计算参数x的双曲正切值,返回float类型 | float类型的浮点数x | 支持 |
+| [tanhl](#tanhl) | 计算参数x的双曲正切值,返回long double类型 | long double类型的浮点数x | 支持 |
+| [tgamma](#tgamma) | 计算参数x的伽马函数,返回double类型 | double类型的浮点数x | 支持 |
+| [tgammaf](#tgammaf) | 计算参数x的伽马函数,返回float类型 | float类型的浮点数x | 支持 |
+| [tgammal](#tgammal) | 计算参数x的伽马函数,返回long double类型 | long double类型的浮点数x | 支持 |
+| [trunc](#trunc) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | double类型的浮点数x | 支持 |
+| [truncf](#truncf) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | float类型的浮点数x | 支持 |
+| [truncl](#truncl) | 截取参数x的整数部分,并将整数部分以浮点形式表示 | long double类型的浮点数x | 支持 |
+| [y0](#y0) | 计算参数x的第二类0阶贝塞尔函数 | double类型的浮点数x | 支持 |
+| [y0f](#y0f) | 计算参数x的第二类0阶贝塞尔函数 | float类型的浮点数x | 支持 |
+| [y1](#y1) | 计算参数x的第二类1阶贝塞尔函数 | double类型的浮点数x | 支持 |
+| [y1f](#y1f) | 计算参数x的第二类1阶贝塞尔函数 | float类型的浮点数x | 支持 |
+| [yn](#yn) | 计算参数x的第二类n阶贝塞尔函数 | int类型阶数n double类型的浮点数x | 支持 |
+| [ynf](#ynf) | 计算参数x的第二类n阶贝塞尔函数 | int类型阶数n float类型的浮点数x | 支持 |
+
+## 设备驱动
+
+### register_driver
+
+在文件系统中注册一个字符设备驱动程序。
+
+**参数**:
+
+1. 要创建的索引节点的路径path。
+2. file_operations结构体指针fops。
+3. 访问权限mode。
+4. 将与inode关联的私有用户数据priv。
+
+**输出**:
+
+- 0:操作成功。
+- 负数值:操作失败。
+
+#### unregister_driver
+
+从文件系统中删除“path”处的字符驱动程序。
+
+**参数**:
+
+1. 要删除的索引节点的路径path。
+
+**输出**:
+
+- 0:操作成功。
+- -EINVAL:无效的path路径。
+- -EEXIST:path中已存在inode。
+- -ENOMEM:内存不足。
+
+#### register_blockdriver
+
+在文件系统中注册一个块设备驱动程序。
+
+**参数**:
+
+1. 要创建的索引节点的路径path。
+2. block_operations结构体指针bops。
+3. 访问权限mode。
+4. 将与inode关联的私有用户数据priv。
+
+**输出**:
+
+- 0:操作成功。
+- -EINVAL:无效的path路径。
+- -EEXIST:path中已存在inode。
+- -ENOMEM:内存不足。
+
+#### unregister_blockdriver
+
+从文件系统中删除“path”处的块设备驱动程序。
+
+**参数**:
+
+1. 要删除的索引节点的路径path。
+
+**输出**:
+
+- 0:操作成功。
+- -EINVAL:无效的path路径。
+- -EEXIST:path中已存在inode。
+- -ENOMEM:内存不足。
+
+## Shell模块
+
+### SHELLCMD_ENTRY
+
+向Shell模块静态注册命令。
+
+**参数**:
+
+1. 命令变量名name。
+2. 命令类型cmdType。
+3. 命令关键字cmdKey。
+4. 处理函数的入参最大个数paraNum。
+5. 命令处理函数回调cmdHook。
+
+**输出**:无
+
+### osCmdReg
+
+向Shell模块动态注册命令。
+
+**参数**:
+
+1. 命令类型cmdType。
+2. 命令关键字cmdKey。
+3. 处理函数的入参最大个数paraNum。
+4. 命令处理函数回调cmdHook。
+
+**输出**:
+
+- 0:操作成功。
+- OS_ERRNO_SHELL_NOT_INIT:shell模块未初始化。
+- OS_ERRNO_SHELL_CMDREG_PARA_ERROR:无效的输入参数。
+- OS_ERRNO_SHELL_CMDREG_CMD_ERROR:无效的字符串关键字。
+- OS_ERRNO_SHELL_CMDREG_CMD_EXIST:关键字已存在。
+- OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR:内存不足。
diff --git a/docs/en/25.03/Embedded/UniProton/UniProton-functions.md b/docs/en/25.03/Embedded/UniProton/UniProton-functions.md
new file mode 100644
index 0000000000000000000000000000000000000000..29349da52cfd8d8d9f3959cfccd4fb83dbbfd6f0
--- /dev/null
+++ b/docs/en/25.03/Embedded/UniProton/UniProton-functions.md
@@ -0,0 +1,195 @@
+# UniProton功能设计
+
+
+
+- [UniProton功能设计](#uniproton功能设计)
+
+ - [支持任务管理](#支持任务管理)
+
+ - [支持事件管理](#支持事件管理)
+
+ - [支持队列管理](#支持队列管理)
+
+ - [支持硬中断管理](#支持硬中断管理)
+
+ - [支持内存管理](#支持内存管理)
+
+ [FSC内存算法](#fsc内存算法)
+
+ [核心思想](#核心思想)
+
+ [内存申请](#内存申请)
+
+ [内存释放](#内存释放)
+
+ - [支持定时器管理](#支持定时器管理)
+
+ - [支持信号量管理](#支持信号量管理)
+
+ - [支持异常管理](#支持异常管理)
+
+ - [支持CPU占用率统计](#支持cpu占用率统计)
+
+ - [支持STM32F407ZGT6开发板](#支持stm32f407zgt6开发板)
+
+ - [支持OpenAMP混合部署](#支持openamp混合部署)
+
+ - [支持POSIX标准接口](#支持posix标准接口)
+
+
+
+## 支持任务管理
+
+UniProton是一个单进程支持多线程的操作系统。在UniProton中,一个任务表示一个线程。UniProton中的任务为抢占式调度机制,而非时间片轮转调度方式。高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务挂起或阻塞后才能得到调度。
+
+UniProton的任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31。每个优先级可以创建多个任务。
+
+UniProton任务管理模块提供任务创建、任务删除、任务挂起、任务恢复、任务延时、锁任务调度、解锁任务调度、当前任务ID获取、任务私有数据获取与设置、查询指定任务正在Pending的信号量ID、查询指定任务状态、上下文信息、任务通用信息、任务优先级设定与获取、调整指定优先级的任务调度顺序、注册及取消任务创建钩子、任务删除钩子、任务切换钩子等功能。UniProton在初始化阶段,默认会创建一个最低优先级的IDLE任务,用户在没有处于运行态的任务时,IDLE任务被运行。
+
+## 支持事件管理
+
+事件机制可以实现线程之间的通讯。事件通讯只能是事件类型的通讯,无数据传输。
+
+UniProton事件作为任务的扩展,实现任务之间的通讯。每个任务支持32种类型事件(32个 bit位,每bit代表一种事件类型)。
+
+UniProton提供读取本任务事件和写指定任务事件的功能。读事件时可以同时读取多种事件,也可以只读取一种事件,写事件时也可以同时写一种或多种类型事件。
+
+## 支持队列管理
+
+队列(Queue),又称消息队列,是线程间实现通信的一种方式,实现了数据的存储和传递功能。根据优先级可以将数据写入到队列头或队列尾,但只能从队列的头处读取数据。
+
+UniProton创建队列时,根据用户传入队列长度和消息单元大小来开辟相应的内存空间以供该队列使用。在队列控制块中维护一个头指针Head和一个尾指针Tail来表示当前队列中数据存储情况。头指针Head表示队列中被占用消息的起始地址,尾指针Tail表示队列中空闲消息的起始地址。
+
+## 支持硬中断管理
+
+硬中断是由硬件触发的会改变系统运行轨迹的一个电平信号,硬中断用于通知CPU某个硬件事件的发生。硬中断一般分为可屏蔽中断和不可屏蔽中断(NMI)两种。
+
+硬中断的优先级高于所有任务,其内部也有不同的优先级,当同时有多个硬中断被触发时,最高优先级的硬中断总是优先得到响应。高优先级硬中断是否能打断正在执行的低优先级硬中断(即中断嵌套),视不同芯片平台而异。
+
+出于任务延时、软件定时器等需要,OS会在初始化阶段,创建1个Tick硬中断,其实质是一个周期性的硬件定时器。
+
+## 支持内存管理
+
+内存管理主要工作是动态的划分并管理用户分配好的大片内存区间。当程序某一部分需要使用内存,可以通过操作系统的内存申请函数索取指定大小内存块,一旦使用完毕,通过内存释放函数归还所占用内存,使之可以重复使用。
+
+目前UniProton提供了FSC内存算法,该算法优缺点及应用场景如下表所示:
+
+| 内存算法 | 优点 | 缺点 | 应用场景 |
+| :----------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------ | ------------------------------------ |
+| 类型 私有FSC算法 | 内存控制块信息占用内存较少,支持最小4字节对齐的内存块大小申请;支持相邻内存块的快速分割合并,无内存碎片。 | 内存申请和内存释放的效率较低。 | 能够灵活适应各种产品的场景。 |
+
+如下简要描述一下FSC内存算法:
+
+### FSC内存算法
+
+#### 核心思想
+
+对于申请的内存大小为uwSize,如果用二进制,则表示为0b{0}1xxx,{0}表示1前面可能有0个或多个零。无论1后面xxx为何内容,如果将1变成10,xxx则全部变成0,则总会出现10yyy > 1xxx(此处yyy表示xxx的对应位全部变成0)。
+
+我们可以直接得到最左边的1的下标。下标值或者从高位到低位依次为0-31(BitMap),或者从低位到高位依次为0-31(uwSize)。如果32位寄存器从高位到低位的bit位的下标依次为0-31,则0x80004000的最左边1的下标为0。于是我们可以维护一个空闲链表头数组(元素数不超过31),以内存块大小最左边的1的下标做为链表头的数组索引,即将所有最左边的1的下标相同的内存块挂接在同一个空闲链表中。
+
+如:索引为2的链表可挂接的空闲块大小为4、5、6、7;索引为N的链表可挂接的空闲块大小为2^N到2^(N+1)-1。
+
+
+
+#### 内存申请
+
+当申请uwSize大小的内存时,首先利用汇编指令得到最左边的1的下标,假定为n。为确保空闲链表中的第一个空闲内存块满足uwSize,从索引为n+1开始搜索。若n+1所属空闲链表不为空,则取该链表中的第一个空闲块。若n+1链表为空,则判断n+2链表,依次类推,直到找到非空链表或索引达到31。
+
+为避免for循环逐级判断空闲链表是否为空,定义一个32位的BitMap全局变量。若索引n的空闲链表非空,则BitMap的下标为n的位置1,否则清0。BitMap的下标为31的位在初始化时直接置1。于是查找从n+1开始的第一个非空闲链表,可以首先将BitMap复本的0到n位清零,然后获取复本的最左边的1的下标,若不等于31,即为第一个空闲链表非空的数组索引。
+
+所有的空闲块都以双向链表的形式,串接在空闲链表中。若从链表中获取的第一个空闲块比较大,即分割出一个uwSize的内存块后,剩下的空间至少可做一次最小分配,则将剩余的空闲块调整到对应的空闲链表中。
+
+ 
+
+内存控制头中记录空闲内存块的大小(包括控制头本身)。内存控制头中有一个复用成员,位于最首部。当内存块空闲时,作为指向后一个空闲内存块的指针;当内存块占用时,存放魔术字,表示该内存块非空闲。为避免魔术字与指针冲突(与地址值相同),高低4位均为0xf。因为已分配的内存块起始地址需按4字节对齐,所以不存在冲突。
+
+#### 内存释放
+
+当释放内存时,需要将前后相邻的空闲块进行合并。首先,通过判断控制头中的魔术字,确认地址参数(pAddr)的合法性。通过首地址加偏移值的方式,得到后邻的内存块控制头的起始地址。若后邻内存块是空闲的,则将后邻内存块从所属空闲链表中删除,调整当前内存块的大小。
+
+为了使内存释放时能迅速找到前邻的内存块控制头,及判断前邻的内存块是否空闲。内存控制头中增加一个成员,标记前邻的内存块是否空闲。可在内存申请时,将后邻的该标记设置为占用态(若空闲内存块被分割成两块,前一块为空闲,将当前内存块的该标记设置为空闲态);在内存释放时,将后邻的该标记设置为空闲态。释放当前内存时,若前邻的内存块标记为使用,则不需要合并前邻的内存块;若前邻的内存块标记为空闲,则需要进行合并。若某个内存块为空闲时,则将其后邻控制块的标记设为到本控制块的距离值。
+
+ 
+
+## 支持定时器管理
+
+定时器管理是为满足产品定时业务需要,UniProton提供了软件定时器功能。
+
+对于软件定时器,是基于Tick实现,所以定时周期必须为Tick的整数倍,在Tick处理函数中进行软件定时器的超时扫描。
+
+目前提供的软件定时器接口,可以完成定时器创建,启动,停止,重启,删除操作。
+
+## 支持信号量管理
+
+信号量(Semaphore)常用于协助一组互相竞争的任务来访问临界资源,在需要互斥的场合作为临界资源计数使用,根据临界资源使用场景分为核内信号量和核间信号量。
+
+信号量对象有一个内部计数器,它支持如下两种操作:
+
+- 申请(Pend):Pend 操作等待指定的信号量,若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其他线程发布该信号量,等待的容忍时间可设定。
+
+- 释放(Post):Post操作发布指定的信号量,若无任务等待该信号量,则直接将计数器加1返回。否则唤醒为此信号量挂起的任务列表中的第一个任务(最早阻塞的)。
+
+通常一个信号量的计数值用于对应有效的资源数,表示剩余可被占用的互斥资源数。其值的含义如下有两种情况:
+
+- 为0值:表示没有积累下来的Post操作,且有可能有在此信号量上阻塞的任务。
+
+- 为正值:表示有一个或多个Post下来的发布操作。
+
+## 支持异常管理
+
+UniProton中的异常接管属于维测特性,其主要目的是在系统出现异常后,记录尽可能多的异常现场信息,便于后续问题定位。同时提供异常时的钩子函数,便于用户能够在异常发生时做一些用户化的特殊处理。其主要功能是接管内部异常处理或者外部硬件异常。
+
+## 支持CPU占用率统计
+
+UniProton中的系统CPU占用率(CPU Percent)是指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~10000,其精度为万分比。10000表示系统满负荷运转。
+
+UniProton中的线程CPU占用率指单个线程的CPU占用率,用于表示单个线程在一段时间内的闲忙程度。线程CPU占用率的有效表示范围为0~10000,其精度为万分比。10000表示在一段时间内系统一直在运行该线程。单核系统所有线程(包括中断和空闲任务)的CPU之和为10000。
+
+UniProton的系统级CPU占用率依赖于Tick模块,通过Tick采样IDLE任务或IDLE软中断计数来实现
+
+## 支持STM32F407ZGT6开发板
+
+支持开发板主要涉及OS内核外围的启动流程和单板驱动,目录结构如下:
+
+├─apps # 基于UniProton实时OS编程的demo程序。
+
+│ └─hello_world # hello_world示例程序。
+
+├─bsp # 提供的板级驱动与OS对接。
+
+├─build # 提供编译脚本编译出最终镜像。
+
+├─config # 配置选项,供用户调整运行时参数。
+
+├─include # UniProton实时部分提供的编程接口API。
+
+└─libs # UniProton实时部分的静态库,build目录中的makefile示例已经将头文件和静态库的引用准备好,应用可直接使用。
+
+## 支持OpenAMP混合部署
+
+OpenAMP是一个开源软件框架,旨在通过非对称多处理器的开源解决方案,来标准化异构嵌入式系统中操作环境之间的交互。OpenAMP包括如下四大组件:
+
+1. remoteproc:管理从核的生命周期,管理共享内存、通信使用的buffer、vring等资源,初始化rpmsg和virtio。
+2. rpmsg:实现多核通信的通道,基于virtio实现。
+3. virtio:通过一套虚拟IO实现主从核的驱动程序通信,是一种半虚拟化技术。
+4. libmetal:屏蔽操作系统实现细节,提供通用用户API访问设备,处理设备中断、内存请求。
+
+## 支持POSIX标准接口
+
+[UniProton支持posix标准接口](./UniProton接口说明.md)
+
+## 支持设备驱动
+
+UniProton的驱动结构、风格与linux类似,将驱动设备文件化,即VFS系统,通过驱动注册接口,将驱动注册到文件系统中,应用层只需要通过标准系统调用,即可调用底层驱动。整个驱动框架代码适配自开源RTOS系统Nuttx的驱动模块,因此接口调用也与Nuttx基本一致。struct file_operations结构体保存设备文件操作的方法,定义在fs.h头文件中,通过register_driver接口将驱动设备挂到对应的struct inode节点中,struct inode描述了每个设备节点的位置和数据。当系统调用操作设备文件时,根据对应文件的inode就能索引到对应的函数。接口详细信息可以查看[UniProton接口说明](./UniProton接口说明.md)。
+
+## 支持Shell命令行
+
+UniProton提供shell命令行,它能够以命令行交互的方式访问操作系统的功能或服务:它接受并解析用户输入的命令,并处理操作系统的输出结果。UniProton的shell模块代码适配自开源ROTS系统LiteOS的shell模块。因此与LiteOS一致,用户可以新增定制的命令,新增命令需重新编译烧录后才能执行。当前UniProton只支持了help命令,其他命令将在后续的版本中进行完善。Shell模块为用户提供下面几个接口。
+
+| 接口名 | 描述 |
+| :---: | :--: |
+| SHELLCMD_ENTRY | 静态注册命令 |
+| osCmdReg | 动态注册命令 |
+
+通常静态注册命令方式一般用于注册系统常用命令,动态注册命令方式一般用于注册用户命令。静态注册命令有5个入参,动态注册命令有4个入参。下面除去第一个入参是静态注册独有的,剩余的四个入参两个注册命令是一致的。接口详细信息可以查看[UniProton接口说明](./UniProton接口说明.md)
diff --git a/docs/en/25.03/Embedded/UniProton/_menu.md b/docs/en/25.03/Embedded/UniProton/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..848998e4dc31b20cd176fe31917cdb85a27d7f41
--- /dev/null
+++ b/docs/en/25.03/Embedded/UniProton/_menu.md
@@ -0,0 +1,12 @@
+---
+label: 'UniProton用户指南'
+ismanual: 'Y'
+description: 'UniProton是面向嵌入式场景的操作系统,支持任务和内存管理、中断处理,提供强大调试能力'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: 'UniProton功能设计'
+ href: './UniProton-functions.md'
+ - label: 'UniProton接口说明'
+ href: './UniProton-apis.md'
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Embedded/UniProton/figures/FCS.png b/docs/en/25.03/Embedded/UniProton/figures/FCS.png
new file mode 100644
index 0000000000000000000000000000000000000000..afb47c557755c10a3f0b196b7080b16a0f86ab6a
Binary files /dev/null and b/docs/en/25.03/Embedded/UniProton/figures/FCS.png differ
diff --git a/docs/en/25.03/Embedded/UniProton/figures/MemoryApplication.png b/docs/en/25.03/Embedded/UniProton/figures/MemoryApplication.png
new file mode 100644
index 0000000000000000000000000000000000000000..de46581c40122a82b92db8a67ae3fcd76a97041a
Binary files /dev/null and b/docs/en/25.03/Embedded/UniProton/figures/MemoryApplication.png differ
diff --git a/docs/en/25.03/Embedded/UniProton/figures/MemoryRelease.png b/docs/en/25.03/Embedded/UniProton/figures/MemoryRelease.png
new file mode 100644
index 0000000000000000000000000000000000000000..f91c89bb02311f104949e2af42cddc4a3faaaca3
Binary files /dev/null and b/docs/en/25.03/Embedded/UniProton/figures/MemoryRelease.png differ
diff --git a/docs/en/25.03/Embedded/UniProton/figures/pend_semaphore.png b/docs/en/25.03/Embedded/UniProton/figures/pend_semaphore.png
new file mode 100644
index 0000000000000000000000000000000000000000..59d8159d1ff1cecb43f59cc5d7c5a9900db8e767
Binary files /dev/null and b/docs/en/25.03/Embedded/UniProton/figures/pend_semaphore.png differ
diff --git a/docs/en/25.03/Embedded/UniProton/figures/post_semaphore.png b/docs/en/25.03/Embedded/UniProton/figures/post_semaphore.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa08d76dafd335b60838dda08db61ccadd8c6b8d
Binary files /dev/null and b/docs/en/25.03/Embedded/UniProton/figures/post_semaphore.png differ
diff --git a/docs/en/25.03/Embedded/UniProton/overview.md b/docs/en/25.03/Embedded/UniProton/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..79ecdf23c70904b152181c164a0e4f4543c5d881
--- /dev/null
+++ b/docs/en/25.03/Embedded/UniProton/overview.md
@@ -0,0 +1,11 @@
+# UniProton用户指南
+
+## 介绍
+
+UniProton是基于openEuler社区面向嵌入式场景的操作系统,旨在成为一个高质量的为上层业务软件屏蔽底层硬件差异,并提供强大的调试功能的操作系统平台。使业务软件可以在不同的硬件平台之间快速移植,方便产品芯片选型,降低硬件采购成本和软件维护成本。
+
+本文档主要用于介绍UniProton的基本功能和接口说明,便于开发人员了解基本的UniProton操作系统知识。
+
+## 编译教程
+
+相关编译教程,可参考:[https://gitee.com/openeuler/UniProton/blob/master/doc/UniProton_build.md](https://gitee.com/openeuler/UniProton/blob/master/doc/UniProton_build.md/)。
diff --git a/docs/en/25.03/Embedded/_menu.md b/docs/en/25.03/Embedded/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..eff38b3a4abf71f626e4d3e1d8e92165661cefc8
--- /dev/null
+++ b/docs/en/25.03/Embedded/_menu.md
@@ -0,0 +1,9 @@
+---
+label: '嵌入式'
+children:
+ - label: 'openEuler Embedded用户指南'
+ href: 'https://pages.openeuler.openatom.cn/embedded/docs/build/html/master/index.html'
+ description: 'openEuler Embedded是为嵌入式场景设计的轻量、安全、实时操作系统,支持多硬件架构'
+ - reference: './UniProton/_menu.md'
+---
+
diff --git a/docs/en/25.03/Embedded/index.md b/docs/en/25.03/Embedded/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..1b2561452e4f59fce10fffb5625d2dcb32f93c66
--- /dev/null
+++ b/docs/en/25.03/Embedded/index.md
@@ -0,0 +1,4 @@
+---
+title: 嵌入式
+overview: true
+---
\ No newline at end of file
diff --git a/docs/en/25.03/Server/Administration/Administrator/_menu.md b/docs/en/25.03/Server/Administration/Administrator/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..84eaa9a00c4176d230222e8ec513b347336e71d6
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/_menu.md
@@ -0,0 +1,31 @@
+---
+label: '管理员指南'
+ismanual: 'Y'
+description: 'openEuler 系统常用的管理员操作'
+children:
+ - label: '查看系统信息'
+ href: './viewing-system-information.md'
+ - label: '基础配置'
+ href: './basic-configuration.md'
+ - label: '管理用户和用户组'
+ href: './user-and-user-group-management.md'
+ - label: '使用DNF管理软件包'
+ href: './using-dnf-to-manage-software-packages.md'
+ - label: '管理服务'
+ href: './service-management.md'
+ - label: '管理进程'
+ href: './process-management.md'
+ - label: '搭建服务'
+ href: './configuring-services.md'
+ children:
+ - label: '搭建repo服务器'
+ href: './configuring-the-repo-server.md'
+ - label: '搭建FTP服务器'
+ href: './configuring-the-ftp-server.md'
+ - label: '搭建web服务器'
+ href: './configuring-the-web-server.md'
+ - label: '搭建数据库服务器'
+ href: './setting-up-the-database-server.md'
+ - label: '常见问题与解决方法'
+ href: './faqs.md'
+---
diff --git a/docs/en/25.03/Server/Administration/Administrator/administration.md b/docs/en/25.03/Server/Administration/Administrator/administration.md
new file mode 100644
index 0000000000000000000000000000000000000000..89dd0f1865325203c28439b9e89e44b99839d526
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/administration.md
@@ -0,0 +1,4 @@
+# 管理员指南
+
+本文档提供了openEuler系统常用的管理员操作,方便管理员更好地使用openEuler。
+本文档适用于所有使用openEuler系统的管理员。
diff --git a/docs/en/25.03/Server/Administration/Administrator/basic-configuration.md b/docs/en/25.03/Server/Administration/Administrator/basic-configuration.md
new file mode 100644
index 0000000000000000000000000000000000000000..11a57803405e33678e2da50ab72ee6763632d9a4
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/basic-configuration.md
@@ -0,0 +1,498 @@
+# 基础配置
+
+
+
+- [基础配置](#基础配置)
+ - [设置语言环境](#设置语言环境)
+ - [显示当前语言环境状态](#显示当前语言环境状态)
+ - [列出可用的语言环境](#列出可用的语言环境)
+ - [设置语言环境](#设置语言环境-1)
+ - [设置键盘](#设置键盘)
+ - [显示当前设置](#显示当前设置)
+ - [列出可用的键盘布局](#列出可用的键盘布局)
+ - [设置键盘布局](#设置键盘布局)
+ - [设置日期和时间](#设置日期和时间)
+ - [使用timedatectl命令设置](#使用timedatectl命令设置)
+ - [显示日期和时间](#显示日期和时间)
+ - [通过远程服务器进行时间同步](#通过远程服务器进行时间同步)
+ - [修改日期](#修改日期)
+ - [修改时间](#修改时间)
+ - [修改时区](#修改时区)
+ - [使用date命令设置](#使用date命令设置)
+ - [显示当前的日期和时间](#显示当前的日期和时间)
+ - [修改时间](#修改时间-1)
+ - [修改日期](#修改日期-1)
+ - [使用hwclock命令设置](#使用hwclock命令设置)
+ - [硬件时钟和系统时钟](#硬件时钟和系统时钟)
+ - [显示日期和时间](#显示日期和时间-1)
+ - [设置日期和时间](#设置日期和时间-1)
+ - [设置kdump](#设置kdump)
+ - [设置kdump预留内存](#设置kdump预留内存)
+ - [预留内存参数格式](#预留内存参数格式)
+ - [预留内存推荐值](#预留内存推荐值)
+ - [禁用网络相关驱动](#禁用网络相关驱动)
+ - [设置磁盘调度算法](#设置磁盘调度算法)
+ - [临时修改调度策略](#临时修改调度策略)
+ - [永久设置调度策略](#永久设置调度策略)
+
+
+
+## 设置语言环境
+
+您可以通过localectl修改系统的语言环境,对应的参数设置保存在/etc/locale.conf文件中。这些参数会在系统启动过程中被systemd的守护进程读取。
+
+### 显示当前语言环境状态
+
+显示当前语言环境,命令如下:
+
+```shell
+localectl status
+```
+
+例如显示系统当前的设置,命令和输出如下:
+
+```shell
+# localectl status
+ System Locale: LANG=zh_CN.UTF-8
+ VC Keymap: cn
+ X11 Layout: cn
+```
+
+### 列出可用的语言环境
+
+显示当前可用的语言环境,命令如下:
+
+```shell
+# localectl list-locales
+```
+
+例如显示当前系统中所有可用的中文环境,命令和输出如下:
+
+```shell
+# localectl list-locales | grep zh
+zh_CN.UTF-8
+```
+
+### 设置语言环境-1
+
+要设置语言环境,在root权限下执行如下命令,其中 _locale_ 是您要设置的语言类型,取值范围可通过**localectl list-locales**获取,请根据实际情况修改。
+
+```shell
+# localectl set-locale LANG=locale
+```
+
+例如设置为简体中文语言环境,在root权限下执行如下命令:
+
+```shell
+# localectl set-locale LANG=zh_CN.UTF-8
+```
+
+>  **说明:**
+> 修改后需要重新登录或者在root权限下执行`source /etc/locale.conf`命令刷新配置文件,使修改生效。
+
+## 设置键盘
+
+您可以通过localectl修改系统的键盘设置,对应的参数设置保存在/etc/locale.conf文件中。这些参数,会在系统启动的早期被systemd的守护进程读取。
+
+### 显示当前设置
+
+显示当前键盘设置,命令如下:
+
+```shell
+# localectl status
+```
+
+例如显示系统当前的设置,命令和输出如下:
+
+```shell
+# localectl status
+ System Locale: LANG=zh_CN.UTF-8
+ VC Keymap: cn
+ X11 Layout: cn
+```
+
+### 列出可用的键盘布局
+
+显示当前可用的键盘布局,命令如下:
+
+```shell
+# localectl list-keymaps
+```
+
+例如显示系统当前的中文键盘布局,命令和输出如下:
+
+```shell
+# localectl list-keymaps | grep cn
+cn
+```
+
+### 设置键盘布局
+
+设置键盘布局,在root权限下执行如下命令,其中 _map_ 是您想要设置的键盘类型,取值范围可通过**localectl list-keymaps**获取,请根据实际情况修改:
+
+```shell
+# localectl set-keymap map
+```
+
+此时设置的键盘布局同样也会应用到图形界面中。
+
+设置完成后,查看当前状态:
+
+```shell
+# localectl status
+ System Locale: LANG=zh_CN.UTF-8
+ VC Keymap: cn
+ X11 Layout: us
+```
+
+## 设置日期和时间
+
+本节介绍如何通过timedatectl、date、hwclock命令来设置系统的日期、时间和时区等。
+
+### 使用timedatectl命令设置
+
+#### 显示日期和时间
+
+显示当前的日期和时间,命令如下:
+
+```shell
+# timedatectl
+```
+
+例如显示系统当前的日期和时间,命令和输出如下:
+
+```shell
+# timedatectl
+ Local time: Mon 2019-09-30 04:05:00 EDT
+ Universal time: Mon 2019-09-30 08:05:00 UTC
+ RTC time: Mon 2019-09-30 08:05:00
+ Time zone: China Standard Time (CST), UTC +8
+System clock synchronized: no
+ NTP service: inactive
+ RTC in local TZ: no
+```
+
+#### 通过远程服务器进行时间同步
+
+您可以启用NTP远程服务器进行系统时钟的自动同步。是否启用NTP,可在root权限下执行如下命令进行设置。其中 _boolean_ 可取值yes和no,分别表示启用和不启用NTP进行系统时钟自动同步,请根据实际情况修改。
+
+>  **说明:**
+> 若启用了NTP远程服务器进行系统时钟自动同步,则不能手动修改日期和时间。若需要手动修改日期或时间,则需确保已经关闭NTP系统时钟自动同步。可执行`timedatectl set-ntp no`命令进行关闭。
+
+例如开启自动远程时间同步,命令如下:
+
+```shell
+# timedatectl set-ntp yes
+```
+
+#### 修改日期
+
+>  **说明:**
+> 修改日期前,请确保已经关闭NTP系统时钟自动同步。
+
+修改当前的日期,在root权限下执行如下命令,其中 _YYYY_ 代表年份,_MM_ 代表月份,_DD_ 代表某天,请根据实际情况修改:
+
+```shell
+# timedatectl set-time YYYY-MM-DD
+```
+
+例如修改当前的日期为2019年8月14号,命令如下:
+
+```shell
+# timedatectl set-time '2019-08-14'
+```
+
+#### 修改时间
+
+>  **说明:**
+> 修改时间前,请确保已经关闭NTP系统时钟自动同步。
+
+修改当前的时间,在root权限下执行如下命令,其中 _HH_ 代表小时,_MM_ 代表分钟,_SS_ 代表秒,请根据实际情况修改:
+
+```shell
+# timedatectl set-time HH:MM:SS
+```
+
+例如修改当前的时间为15点57分24秒,命令如下:
+
+```shell
+# timedatectl set-time 15:57:24
+```
+
+#### 修改时区
+
+显示当前可用时区,命令如下:
+
+```shell
+timedatectl list-timezones
+```
+
+要修改当前的时区,在root权限下执行如下命令,其中 _time\_zone_ 是您想要设置的时区,请根据实际情况修改:
+
+```shell
+# timedatectl set-timezone time_zone
+```
+
+例如修改当前的时区,首先查询所在地域的可用时区,此处以Asia为例:
+
+```shell
+# timedatectl list-timezones | grep Asia
+Asia/Aden
+Asia/Almaty
+Asia/Amman
+Asia/Anadyr
+Asia/Aqtau
+Asia/Aqtobe
+Asia/Ashgabat
+Asia/Baghdad
+Asia/Bahrain
+……
+
+Asia/Seoul
+Asia/Shanghai
+Asia/Singapore
+Asia/Srednekolymsk
+Asia/Taipei
+Asia/Tashkent
+Asia/Tbilisi
+Asia/Tehran
+Asia/Thimphu
+Asia/Tokyo
+```
+
+然后修改当前的时区为“Asia/Shanghai”,命令如下:
+
+```shell
+# timedatectl set-timezone Asia/Shanghai
+```
+
+### 使用date命令设置
+
+#### 显示当前的日期和时间
+
+显示当前的日期和时间,命令如下:
+
+```shell
+# date
+```
+
+默认情况下,date命令显示本地时间。要显示UTC时间,添加\-\-utc或-u参数:
+
+```shell
+# date --utc
+```
+
+要自定义对应的输出信息格式,添加 +"format" 参数:
+
+```shell
+# date +"format"
+```
+
+**表 1** 参数说明
+
+
+ 格式参数
+
+ 说明
+
+
+
+ %H
+
+ 小时以HH格式(例如 17)。
+
+
+ %M
+
+ 分钟以MM格式(例如 37)。
+
+
+ %S
+
+ 秒以SS格式(例如 25)。
+
+
+ %d
+
+ 日期以DD格式(例如 15)。
+
+
+ %m
+
+ 月份以MM格式(例如 07)。
+
+
+ %Y
+
+ 年份以YYYY格式(例如 2019)。
+
+
+ %Z
+
+ 时区缩写(例如CEST)。
+
+
+ %F
+
+ 日期整体格式为YYYY-MM-DD(例如 2019-7-15),等同%Y-%m-%d。
+
+
+ %T
+
+ 时间整体格式为HH:MM:SS(例如 18:30:25),等同%H:%M:%S。
+
+
+
+
+
+实际使用示例如下:
+
+- 显示当前的日期和本地时间。
+
+ ```shell
+ # date
+ 2019年 08月 17日 星期六 17:26:34 CST
+ ```
+
+- 显示当前的日期和UTC时间。
+
+ ```shell
+ # date --utc
+ 2019年 08月 17日 星期六 09:26:18 UTC
+ ```
+
+- 自定义date命令的输出。
+
+ ```shell
+ # date +"%Y-%m-%d %H:%M"
+ 2019-08-17 17:24
+ ```
+
+#### 修改时间-1
+
+要修改当前的时间,添加\-\-set或者-s参数。在root权限下执行如下命令,其中 _HH_ 代表小时,_MM_ 代表分钟,_SS_ 代表秒,请根据实际情况修改:
+
+```shell
+# date --set HH:MM:SS
+```
+
+默认情况下, date命令设置本地时间。要设置UTC时间,添加\-\-utc或-u参数:
+
+```shell
+# date --set HH:MM:SS --utc
+```
+
+例如修改当前的时间为23点26分00秒,在root权限下执行如下命令:
+
+```shell
+# date --set 23:26:00
+```
+
+#### 修改日期-1
+
+修改当前的日期,添加\-\-set或者-s参数。在root权限下执行如下命令,其中 _YYYY_ 代表年份,_MM_ 代表月份,_DD_ 代表某天,请根据实际情况修改:
+
+```shell
+# date --set YYYY-MM-DD
+```
+
+例如修改当前的日期为2019年11月2日,命令如下:
+
+```shell
+# date --set 2019-11-02
+```
+
+### 使用hwclock命令设置
+
+可以使用 hwclock 命令设置硬件时钟RTC \(Real Time Clock\) 。
+
+#### 硬件时钟和系统时钟
+
+Linux 将时钟分为:
+
+- 系统时钟 \(System Clock\) :当前Linux Kernel中的时钟。
+- 硬件时钟 RTC:主板上由电池供电的主板硬件时钟,该时钟可以在BIOS的 "Standard BIOS Feature" 项中进行设置。
+
+当Linux启动时,会读取硬件时钟,并根据硬件时间来设置系统时间。
+
+#### 显示日期和时间-1
+
+显示当前硬件的日期和时间,在root权限下执行如下命令:
+
+```shell
+# hwclock
+```
+
+例如显示当前硬件的日期和时间,命令和输出如下:
+
+```shell
+# hwclock
+2019-08-26 10:18:42.528948+08:00
+```
+
+#### 设置日期和时间-1
+
+修改当前硬件的日期和时间,在root权限下执行如下命令,其中 _dd_ 表示日,_mm_ 表示月份,_yyyy_ 表示年份,_HH_ 表示小时,_MM_ 表示分钟,请根据实际情况修改:
+
+```shell
+# hwclock --set --date "yyyy-mm-dd HH:MM"
+```
+
+例如修改当前的时间为2019年10月21日21点17分,命令如下:
+
+```shell
+# hwclock --set --date "2019-10-21 21:17"
+```
+
+## 设置kdump
+
+本节介绍如何设置kdump预留内存及修改kdump配置文件参数。
+
+### 设置kdump预留内存
+
+#### 预留内存参数格式
+
+kdump预留内存参数必须添加到内核启动参数中,配置文件为/boot/efi/EFI/openEuler/grub.cfg(UEFI引导模式)或/boot/grub2/grub.cfg(legacy引导模式),openEuler发布版本中默认已经添加,可以根据实际使用情况调整。添加和修改启动参数后,重启系统生效。kdump预留内存参数格式如下:
+
+| 内核启动参数 | 描述 | 缺省值 | 备注 |
+|--------------------|-------------------------------------------|---------------|------------------------------------------------------------|
+| crashkernel=x | 在4G以下的物理内存预留x大小的内存给kdump使用。 | x86版本默认配置512M | 该配置方法只在4G以下内存预留,必须保证4G以下连续可用内存足够预留。 |
+| crashkernel=x@y | 在y起始地址预留x大小的内存给kdump使用。 | 未使用 | 需要确保y起始地址的x大小的内存未被其他模块预留。 |
+| crashkernel=x,high | 在4G以下的物理内存中预留256M内存,在4G以上预留x大小内存给kdump使用。 | arm64版本默认配置1024M,high | 需要确保4G以下有256M连续可用的物理内存,4G以上有连续的x大小的连续物理内存。实际预留内存大小为256M+x。 |
+| crashkernel=x,low crashkernel=y,high | 在4G以下的物理内存中预留x大小,在4G以上预留y大小内存给kdump使用。 | 未使用 | 需要确保4G以下有连续的x大小物理内存,4G以上有连续的y大小物理内存。 |
+
+### 预留内存推荐值
+
+| 推荐方案 | 预留参数 | 参数说明 |
+|------|------------------------|----------------------------------------------|
+| 通用方案 | crashkernel=2048M,high | 4G以下预留256M,4G以上预留2048M内存给kdump使用。共256+2048M。 |
+| 经济方案 | crashkernel=1024M,high | 4G以下预留256M,4G以上预留1024M内存给kdump使用。共256+1024M。 推荐系统512M内存以内的场景,并不使用网络转储kdump文件。对于虚拟机场景,可以适当减少内存预留值,推荐虚拟机设置为crashkernel=512M或者crashkernel=256M,high |
+
+>  **说明:**
+> 不通过网络转储kdump文件时,需要设置kdump文件系统不打包网络相关驱动。网络驱动加载需要申请较大内存,可能导致预留内存不足,kdump失败。因此建议禁用网络相关驱动。
+
+### 禁用网络相关驱动
+
+kdump配置文件(/etc/kdump.conf)中,dracut参数可以设置裁剪的驱动模块,可以将网络驱动配置到裁剪驱动列表中,让kdump文件系统中不加载该驱动,修改配置文件后,重启kdump服务生效。dracut参数配置如下所示:
+
+`dracut_args --omit-drivers "mdio-gpi usb_8dev et1011c rt2x00usb bcm-phy-lib mac80211_hwsim rtl8723be rndis_host hns3_cae amd vrf rtl8192cu mt76x02-lib int51x1 ppp_deflate team_mode_loadbalance smsc911x aweth bonding mwifiex_usb hnae dnet rt2x00pci vaser_pci hdlc_ppp marvell rtl8xxxu mlxsw_i2c ath9k_htc rtl8150 smc91x cortina at803x rockchip cxgb4 spi_ks8995 mt76x2u smsc9420 mdio-cavium bnxt_en ch9200 dummy macsec ice mt7601u rtl8188ee ixgbevf net1080 liquidio_vf be2net mlxsw_switchx2 gl620a xilinx_gmii2rgmii ppp_generic rtl8192de sja1000_platform ath10k_core cc770_platform realte igb c_can_platform c_can ethoc dm9601 smsc95xx lg-vl600 ifb enic ath9 mdio-octeon ppp_mppe ath10k_pci cc770 team_mode_activebackup marvell10g hinic rt2x00lib mlx4_en iavf broadcom igc c_can_pci alx rtl8192se rtl8723ae microchip lan78xx atl1c rtl8192c-common almia ax88179_178a qed netxen_nic brcmsmac rt2800usb e1000 qla3xxx mdio-bitbang qsemi mdio-mscc-miim plx_pci ipvlan r8152 cx82310_eth slhc mt76x02-usb ems_pci xen-netfront usbnet pppoe mlxsw_minimal mlxsw_spectrum cdc_ncm rt2800lib rtl_usb hnae3 ath9k_common ath9k_hw catc mt76 hns_enet_drv ppp_async huawei_cdc_ncm i40e rtl8192ce dl2 qmi_wwan mii peak_usb plusb can-dev slcan amd-xgbe team_mode_roundrobin ste10Xp thunder_xcv pptp thunder_bgx ixgbe davicom icplus tap tun smsc75xx smsc dlci hns_dsaf mlxsw_core rt2800mmi softing uPD60620 vaser_usb dp83867 brcmfmac mwifiex_pcie mlx4_core micrel team macvlan bnx2 virtio_net rtl_pci zaurus hns_mdi libcxgb hv_netvsc nicvf mt76x0u teranetics mlxfw cdc_eem qcom-emac pppox mt76-usb sierra_net i40evf bcm87xx mwifiex pegasus rt2x00mmi sja1000 ena hclgevf cnic cxgb4vf ppp_synctty iwlmvm team_mode_broadcast vxlan vsockmon hdlc_cisc rtl8723-common bsd_comp fakelb dp83822 dp83tc811 cicada fm10 8139t sfc hs geneve hclge xgene-enet-v2 cdc_mbim hdlc asix netdevsim rt2800pci team_mode_random lxt ems_usb mlxsw_pci sr9700 mdio-thunder mlxsw_switchib macvtap atlantic cdc_ether mcs7830 nicpf mdi peak_pci atl1e cdc_subset ipvtap btcoexist mt76x0-common veth slip iwldvm bcm7xxx vitesse netconsole epic100 myri10ge r8169 qede microchip_t1 liquidi bnx2x brcmutil mwifiex_sdi mlx5_core rtlwifi vmxnet3 nlmon hns3 hdlc_raw esd_usb2 atl2 mt76x2-common iwlwifi mdio-bcm-unimac national ath rtwpci rtw88 nfp rtl8821ae fjes thunderbolt-net 8139cp atl1 mscc vcan dp83848 dp83640 hdlc_fr e1000e ipheth net_failover aquantia rtl8192ee igbvf rocker intel-xway tg3" --omit "ramdisk network ifcfg qemu-net" --install "chmod" --nofscks`
+
+## 设置磁盘调度算法
+
+本节介绍如何设置磁盘调度算法。
+
+### 临时修改调度策略
+
+例如将所有IO调度算法修改为mq-deadline,此修改重启后会失效。
+
+```shell
+# echo mq-deadline > /sys/block/sd*/queue/scheduler
+```
+
+### 永久设置调度策略
+
+可以通过在内核启动配置文件grub.cfg中的kernel行追加:elevator=mq-deadline,重启后生效。
+
+```text
+linux /vmlinuz-4.19.90-2003.4.0.0036.oe1.x86_64 root=/dev/mapper/openeuler-root ro resume=/dev/mapper/openeuler-swap rd.lvm.lv=openeuler/root rd.lvm.lv=openeuler/swap quiet crashkernel=512M elevator=mq-deadline
+```
diff --git a/docs/en/25.03/Server/Administration/Administrator/configuring-services.md b/docs/en/25.03/Server/Administration/Administrator/configuring-services.md
new file mode 100644
index 0000000000000000000000000000000000000000..72cb121e1c967ead660145cd62b8819585148b63
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/configuring-services.md
@@ -0,0 +1 @@
+# 搭建服务
diff --git a/docs/en/25.03/Server/Administration/Administrator/configuring-the-ftp-server.md b/docs/en/25.03/Server/Administration/Administrator/configuring-the-ftp-server.md
new file mode 100644
index 0000000000000000000000000000000000000000..bec57655007ef97303720676265cac13d81daf7d
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/configuring-the-ftp-server.md
@@ -0,0 +1,503 @@
+# 搭建FTP服务器
+
+## 总体介绍
+
+### FTP简介
+
+FTP(File Transfer Protocol)即文件传输协议,是互联网最早的传输协议之一,其最主要的功能是服务器和客户端之间的文件传输。FTP使用户可以通过一套标准的命令访问远程系统上的文件,而不需要直接登录远程系统。另外,FTP服务器还提供了如下主要功能:
+
+- 用户分类
+
+ 默认情况下,FTP服务器依据登录情况,将用户分为实体用户(real user)、访客(guest)、匿名用户(anonymous)三类。三类用户对系统的访问权限差异较大,实体用户具有较完整的访问权限,匿名用户仅有下载资源的权限。
+
+- 命令记录和日志文件记录
+
+ FTP可以利用系统的syslogd记录数据,这些数据包括用户历史使用命令与用户传输数据(传输时间、文件大小等),用户可以在/var/log/中获得各项日志信息。
+
+- 限制用户的访问范围
+
+ FTP可以将用户的工作范围限定在用户主目录。用户通过FTP登录后系统显示的根目录就是用户主目录,这种环境被称为change root,简称chroot。这种方式可以限制用户只能访问主目录,而不允许访问/etc、/home、/usr/local等系统的重要目录,从而保护系统,使系统更安全。
+
+### FTP使用到的端口
+
+FTP的正常工作需要使用到多个网络端口,服务器端会使用到的端口主要有:
+
+- 命令通道,默认端口为21
+- 数据通道,默认端口为20
+
+两者的连接发起端不同,端口21主要接收来自客户端的连接,端口20则是FTP服务器主动连接至客户端。
+
+### vsftpd简介
+
+由于FTP历史悠久,它采用未加密的传输方式,所以被认为是一种不安全的协议。为了更安全地使用FTP,这里介绍FTP较为安全的守护进程vsftpd(Very Secure FTP Daemon)。
+
+之所以说vsftpd安全,是因为它最初的发展理念就是构建一个以安全为中心的FTP服务器。它具有如下特点:
+
+- vsftpd服务的启动身份为一般用户,具有较低的系统权限。此外,vsftpd使用chroot改变根目录,不会误用系统工具。
+- 任何需要较高执行权限的vsftpd命令均由一个特殊的上层程序控制,该上层程序的权限较低,以不影响系统本身为准。
+- vsftpd整合了大部分FTP会使用到的额外命令(例如dir、ls、cd等),一般不需要系统提供额外命令,对系统来说比较安全。
+
+## 使用vsftpd
+
+### 安装vsftpd
+
+使用vsftpd需要安装vsftpd软件,在已经配置yum源的情况下,通过root权限执行如下命令,即可完成vsftpd的安装。
+
+```shell
+# dnf install vsftpd
+```
+
+### 管理vsftpd服务
+
+启动、停止和重启vsftpd服务,请在root权限下执行对应命令。
+
+- 启动vsftpd服务
+
+ ```shell
+ # systemctl start vsftpd
+ ```
+
+ 可以通过netstat命令查看通信端口21是否开启,如下显示说明vsftpd已经启动。
+
+ ```shell
+ # netstat -tulnp | grep 21
+ tcp6 0 0 :::21 :::* LISTEN 19716/vsftpd
+ ```
+
+ >  **说明:**
+ > 如果没有**netstat**命令,可以执行**dnf install net-tools**命令安装后再使用**netstat**命令。
+
+- 停止vsftpd服务
+
+ ```shell
+ # systemctl stop vsftpd
+ ```
+
+- 重启vsftpd服务
+
+ ```shell
+ # systemctl restart vsftpd
+ ```
+
+## 配置vsftpd
+
+### vsftpd配置文件介绍
+
+用户可以通过修改vsftpd的配置文件,控制用户权限等。vsftpd的主要配置文件和含义如[表1](#table1541615718372)所示,用户可以根据需求修改配置文件的内容。更多的配置参数含义可以通过man查看。
+
+**表 1** vsftpd配置文件介绍
+
+
+ 配置文件
+
+ 含义
+
+
+
+ /etc/vsftpd/vsftpd.conf
+
+ vsftpd进程的主配置文件,配置内容格式为“参数=参数值”,且参数和参数值不能为空。
+ vsftpd.conf 的详细介绍可以使用如下命令查看:
+ man 5 vsftpd.conf
+
+
+ /etc/pam.d/vsftpd
+
+ PAM(Pluggable Authentication Modules)认证文件,主要用于身份认证和限制一些用户的操作。
+
+
+ /etc/vsftpd/ftpusers
+
+禁止使用vsftpd的用户列表文件 。默认情况下,系统帐号也在该文件中,因此系统帐号默认无法使用vsftpd。
+
+
+ /etc/vsftpd/user_list
+
+禁止或允许登录vsftpd服务器的用户列表文件 。该文件是否生效,取决于主配置文件vsftpd.conf中的如下参数:
+ userlist_enable:是否启用userlist机制,YES为启用,此时userlist_deny配置有效,NO为禁用。
+ userlist_deny:是否禁止user_list中的用户登录,YES为禁止名单中的用户登录,NO为允许命令中的用户登录。
+ 例如userlist_enable=YES,userlist_deny=YES,则user_list中的用户都无法登录。
+
+
+ /etc/vsftpd/chroot_list
+
+ 是否限制在主目录下的用户列表。该文件默认不存在,需要手动建立。它是主配置文件vsftpd.conf中参数chroot_list_file的参数值。
+ 其作用是限制还是允许,取决于主配置文件vsftpd.conf中的如下参数:
+chroot_local_user:是否将所有用户限制在主目录,YES为启用,NO禁用 。chroot_list_enable: 是否启用限制用户的名单,YES为启用,NO禁用。
+ 例如chroot_local_user =YES,chroot_list_enable =YES,且指定chroot_list_file=/etc/vsftpd/chroot_list时,表示所有用户被限制在其主目录下,而chroot_list中的用户不受限制。
+
+
+ /usr/sbin/vsftpd
+
+ vsftpd的唯一执行文件。
+
+
+ /var/ftp/
+
+ 匿名用户登录的默认根目录,与ftp帐户的用户主目录有关。
+
+
+
+
+
+### 默认配置说明
+
+>  **说明:**
+> 文档中的配置内容仅供参考,请用户根据实际情况(例如安全加固需要)进行修改。
+
+openEuler系统中 ,vsftpd默认不开放匿名用户,使用vim命令查看主配置文件,其内容如下:
+
+```shell
+# vim /etc/vsftpd/vsftpd.conf
+anonymous_enable=NO
+local_enable=YES
+write_enable=YES
+local_umask=022
+dirmessage_enable=YES
+xferlog_enable=YES
+connect_from_port_20=YES
+xferlog_std_format=YES
+listen=NO
+listen_ipv6=YES
+pam_service_name=vsftpd
+userlist_enable=YES
+```
+
+其中各参数含义如[表2](#table18185162512499)所示。
+
+**表 2** 参数说明
+
+
+ 参数
+
+ 含义
+
+
+
+ anonymous_enable
+
+ 是否允许匿名用户登录,YES为允许匿名登录,NO为不允许。
+
+
+ local_enable
+
+ 是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许。
+
+
+ write_enable
+
+ 是否允许登录用户有写权限,YES为启用上传写入功能,NO为禁用。
+
+
+ local_umask
+
+ 本地用户新增档案时的umask值。
+
+
+ dirmessage_enable
+
+ 当用户进入某个目录时,是否显示该目录需要注意的内容,YES为显示注意内容,NO为不显示。
+
+
+ xferlog_enable
+
+ 是否记录使用者上传与下载文件的操作,YES为记录操作,NO为不记录。
+
+
+ connect_from_port_20
+
+ Port模式进行数据传输是否使用端口20,YES为使用端口20,NO为不使用端口20。
+
+
+ xferlog_std_format
+
+ 传输日志文件是否以标准xferlog格式书写,YES为使用该格式书写,NO为不使用。
+
+
+ listen
+
+ 设置vsftpd是否以stand alone的方式启动,YES为使用stand alone方式启动,NO为不使用该方式。
+
+
+ pam_service_name
+
+ 支持PAM模块的管理,配置值为服务名称,例如vsftpd。
+
+
+ userlist_enable
+
+ 是否支持/etc/vsftpd/user_list文件内的帐号登录控制,YES为支持,NO为不支持。
+
+
+ tcp_wrappers
+
+ 是否支持TCP Wrappers的防火墙机制,YES为支持,NO为不支持。
+
+
+ listen_ipv6
+
+ 是否侦听IPv6的FTP请求,YES为侦听,NO为不侦听。listen和listen_ipv6不能同时开启。
+
+
+
+
+
+### 配置本地时间
+
+#### 概述
+
+openEuler系统中,vsftpd默认使用GMT时间(格林尼治时间),可能和本地时间不一致,例如GMT时间比北京时间晚8小时,请用户改为本地时间,否则服务器和客户端时间不一致,在上传下载文件时可能引起错误。
+
+#### 设置方法
+
+在root权限下设置vsftpd时间为本地时间的操作步骤如下:
+
+1. 打开配置文件vsftpd.conf,将参数use\_localtime的参数值改为YES。命令如下:
+
+ ```shell
+ # vim /etc/vsftpd/vsftpd.conf
+ ```
+
+ 配置内容如下:
+
+ ```text
+ use_localtime=YES
+ ```
+
+2. 重启vsftpd服务。
+
+ ```shell
+ # systemctl restart vsftpd
+ ```
+
+3. 设置vsftpd服务开机启动。
+
+ ```shell
+ # systemctl enable vsftpd
+ ```
+
+### 配置欢迎信息
+
+使用vsftpd服务,建议新建欢迎信息文件(没有也不影响使用)。在root权限下设置vsftpd的欢迎信息welcome.txt文件的操作步骤如下:
+
+1. 打开配置文件vsftpd.conf,加入欢迎信息文件配置内容后保存退出。
+
+ ```shell
+ # vim /etc/vsftpd/vsftpd.conf
+ ```
+
+ 需要加入的配置行如下:
+
+ ```shell
+ banner_file=/etc/vsftpd/welcome.txt
+ ```
+
+2. 建立欢迎信息。即打开welcome.txt文件,写入欢迎信息后保存退出。
+
+ ```shell
+ # vim /etc/vsftpd/welcome.txt
+ ```
+
+ 欢迎信息举例如下:
+
+ ```text
+ Welcome to this FTP server!
+ ```
+
+### 配置系统帐号登录权限
+
+一般情况下,用户需要限制部分帐号的登录权限。用户可根据需要进行配置。
+
+vsftpd有两个默认存放用户名单的文件,来对访问FTP服务的用户身份进行管理和限制。vsftpd会分别检查两个配置文件,只要是被任何一个文件所禁止的用户,FTP访问到本机的请求都会被拒绝。
+
+- /etc/vsftpd/user_list:可以作为用户白名单,或者是黑名单,或者无效名单,由userlist_enable和userlist_deny这两个参数决定。
+- /etc/vsftpd/ftpusers:只能是用户黑名单,不受任何参数限制。
+
+## 验证FTP服务是否搭建成功
+
+可以使用openEuler提供的FTP客户端进行验证。命令和回显如下,根据提示输入用户名(用户为系统中存在的用户)和密码。如果显示Login successful,即说明FTP服务器搭建成功。
+
+```shell
+# ftp localhost
+Trying 127.0.0.1...
+Connected to localhost (127.0.0.1).
+220-Welcome to this FTP server!
+220
+Name (localhost:root): USERNAME
+331 Please specify the password.
+Password:
+230 Login successful.
+Remote system type is UNIX.
+Using binary mode to transfer files.
+ftp> bye
+221 Goodbye.
+```
+
+>  **说明:**
+> 如果没有**ftp**命令,可以在root权限下执行**dnf install ftp**命令安装后再使用**ftp**命令。
+
+## 配置防火墙
+
+如果要将FTP开放给Internet使用,需要在root权限下对防火墙和SElinux进行设置。
+
+```shell
+# firewall-cmd --add-service=ftp --permanent
+success
+# firewall-cmd --reload
+success
+# setsebool -P ftpd_full_access on
+```
+
+## 传输文件
+
+### 概述
+
+这里给出vsftpd服务启动后,如何进行文件传输的指导。
+
+### 连接服务器
+
+#### 命令格式
+
+**ftp** \[_hostname_ | _ip-address_\]
+
+其中hostname为服务器名称,ip-address为服务器IP地址。
+
+#### 操作说明
+
+在openEuler系统的命令行终端,执行如下命令:
+
+```shell
+# ftp ip-address
+```
+
+根据提示输入用户名和密码,认证通过后显示如下,说明ftp连接成功,此时进入了连接到的服务器目录。
+
+```shell
+ftp>
+```
+
+在该提示符下,可以输入不同的命令进行相关操作:
+
+- 显示服务器当前路径
+
+ ```shell
+ ftp>pwd
+ ```
+
+- 显示本地路径,用户可以将该路径下的文件上传到FTP服务器对应位置
+
+ ```shell
+ ftp>lcd
+ ```
+
+- 退出当前窗口,返回本地Linux终端
+
+ ```shell
+ ftp>!
+ ```
+
+### 下载文件
+
+通常使用get或mget命令下载文件。
+
+#### get使用方法
+
+- 功能说明:将文件从远端主机中传送至本地主机中
+- 命令格式:**get** \[_remote-file_\] \[_local-file_\]
+
+ 其中 _remote-file_ 为远程文件,_local-file_ 为本地文件
+
+- 示例:获取远程服务器上的/home/openEuler/openEuler.htm文件到本地/home/myopenEuler/,并改名为myopenEuler.htm,命令如下:
+
+ ```shell
+ ftp> get /home/openEuler/openEuler.htm /home/myopenEuler/myopenEuler.htm
+ ```
+
+#### mget使用方法
+
+- 功能说明:从远端主机接收一批文件至本地主机
+- 命令格式:**mget** \[_remote-file_\]
+
+ 其中 _remote-file_ 为远程文件
+
+- 示例:获取服务器上/home/openEuler/目录下的所有文件,命令如下:
+
+ ```shell
+ ftp> cd /home/openEuler/
+ ftp> mget *.*
+ ```
+
+ >  **说明:**
+ > 此时每下载一个文件,都会有提示信息。如果要屏蔽提示信息,则在 **mget \*.\*** 命令前先执行**prompt off**
+ > 文件都被下载到Linux主机的当前目录下。比如,在/home/myopenEuler/下运行的ftp命令,则文件都下载到/home/myopenEuler/下。
+
+### 上传文件
+
+通常使用put或mput命令上传文件。
+
+#### put使用方法
+
+- 功能说明:将本地的一个文件传送到远端主机中
+- 命令格式:**put** \[_local-file_\] \[_remote-file_\]
+
+ 其中 _remote-file_ 为远程文件,_local-file_ 为本地文件
+
+- 示例:将本地的myopenEuler.htm传送到远端主机/home/openEuler/,并改名为openEuler.htm,命令如下:
+
+ ```shell
+ ftp> put myopenEuler.htm /home/openEuler/openEuler.htm
+ ```
+
+#### mput使用方法
+
+- 功能说明:将本地主机中一批文件传送至远端主机
+- 命令格式:**mput** \[_local-file_\]
+
+ 其中 _local-file_ 为本地文件
+
+- 示例:将本地当前目录下所有htm文件上传到服务器/home/openEuler/下,命令如下:
+
+ ```shell
+ ftp> cd /home/openEuler/
+ ftp> mput *.htm
+ ```
+
+### 删除文件
+
+通常使用delete或mdelete命令删除文件。
+
+#### delete使用方法
+
+- 功能说明:删除远程服务器上的一个或多个文件
+- 命令格式:**delete** \[_remote-file_\]
+
+ 其中 _remote-file_ 为远程文件
+
+- 示例:删除远程服务器上/home/openEuler/下的openEuler.htm文件,命令如下:
+
+ ```shell
+ ftp> cd /home/openEuler/
+ ftp> delete openEuler.htm
+ ```
+
+#### mdelete使用方法
+
+- 功能说明:删除远程服务器上的文件,常用于批量删除
+- 命令格式:**mdelete** \[_remote-file_\]
+
+ 其中 _remote-file_ 为远程文件
+
+- 示例:删除远程服务器上/home/openEuler/下所有a开头的文件,命令如下:
+
+ ```shell
+ ftp> cd /home/openEuler/
+ ftp> mdelete a*
+ ```
+
+### 断开服务器
+
+断开与服务器的连接,使用bye命令,如下:
+
+```shell
+ftp> bye
+```
diff --git a/docs/en/25.03/Server/Administration/Administrator/configuring-the-repo-server.md b/docs/en/25.03/Server/Administration/Administrator/configuring-the-repo-server.md
new file mode 100644
index 0000000000000000000000000000000000000000..9922cc486fd205d39847ead28639234ee6541b13
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/configuring-the-repo-server.md
@@ -0,0 +1,376 @@
+# 搭建repo服务器
+
+>  **说明:**
+> openEuler提供了多种repo源供用户在线使用,各repo源含义可参考[系统安装](../../Releasenotes/Releasenotes/installing-the-os.md)。若用户无法在线获取openEuler repo源,则可使用openEuler提供的ISO发布包创建为本地openEuler repo源。本章节中以openEuler-21.09-aarch64-dvd.iso发布包为例,请根据实际需要的ISO发布包进行修改。
+
+## 概述
+
+将openEuler提供的ISO发布包openEuler-21.09-aarch64-dvd.iso创建为repo源,如下以使用nginx进行repo源部署,提供http服务为例进行说明。
+
+## 创建/更新本地repo源
+
+使用mount挂载,将openEuler的ISO发布包openEuler-21.09-aarch64-dvd.iso创建为repo源,并能够对repo源进行更新。
+
+### 获取ISO发布包
+
+请从如下网址获取openEuler的ISO发布包:
+
+[https://repo.openeuler.org/openEuler-21.09/](https://repo.openeuler.org/openEuler-21.09/)
+
+### 挂载ISO创建repo源
+
+在root权限下使用mount命令挂载ISO发布包。
+
+示例如下:
+
+```shell
+# mount /home/openEuler/openEuler-21.09-aarch64-dvd.iso /mnt/
+```
+
+挂载好的mnt目录如下:
+
+```text
+.
+│── boot.catalog
+│── docs
+│── EFI
+│── images
+│── Packages
+│── repodata
+│── TRANS.TBL
+└── RPM-GPG-KEY-openEuler
+```
+
+其中,Packages为rpm包所在的目录,repodata为repo源元数据所在的目录,RPM-GPG-KEY-openEuler为openEuler的签名公钥。
+
+### 创建本地repo源
+
+可以拷贝ISO发布包中相关文件至本地目录以创建本地repo源,示例如下:
+
+```shell
+# mount /home/openEuler/openEuler-21.09-aarch64-dvd.iso /mnt/
+# mkdir -p /home/openEuler/srv/repo/
+# cp -r /mnt/Packages /home/openEuler/srv/repo/
+# cp -r /mnt/repodata /home/openEuler/srv/repo/
+# cp -r /mnt/RPM-GPG-KEY-openEuler /home/openEuler/srv/repo/
+```
+
+从而本地repo目录如下:
+
+```text
+.
+│── Packages
+│── repodata
+└── RPM-GPG-KEY-openEuler
+```
+
+Packages为rpm包所在的目录,repodata为repo源元数据所在的目录,RPM-GPG-KEY-openEuler为openEuler的签名公钥。
+
+### 更新repo源
+
+更新repo源有两种方式:
+
+- 通过新版本的ISO更新已有的repo源,与创建repo源的方式相同,即挂载ISO发布包或重新拷贝ISO发布包至本地目录。
+
+- 在repo源的Packages目录下添加rpm包,然后通过createrepo命令更新repo源。
+
+ ```shell
+ # createrepo --update --workers=10 ~/srv/repo
+ ```
+
+ 其中,\-\-update表示更新,\-\-workers表示线程数,可自定义。
+
+ >  **说明:**
+ > 若命令打印信息为“createrepo:未找到命令”,则表示未安装createrepo软件,可在root权限下执行**dnf install createrepo**进行安装。
+
+## 部署远端repo源
+
+安装openEuler操作系统,在openEuler上通过nginx部署repo源。
+
+### nginx安装与配置
+
+1. 请自行下载nginx工具并在root权限下安装nginx。
+2. 安装nginx之后,在root权限下配置/etc/nginx/nginx.conf。
+
+ >  **说明:**
+ > 文档中的配置内容仅供参考,请用户根据实际情况(例如安全加固需要)进行配置。
+
+ ```text
+ user nginx;
+ worker_processes auto; # 建议设置为core-1
+ error_log /var/log/nginx/error.log warn; # log存放位置
+ pid /var/run/nginx.pid;
+
+ events {
+ worker_connections 1024;
+ }
+
+ http {
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ log_format main '$remote_addr - $remote_user [$time_local] "$request" '
+ '$status $body_bytes_sent "$http_referer" '
+ '"$http_user_agent" "$http_x_forwarded_for"';
+
+ access_log /var/log/nginx/access.log main;
+ sendfile on;
+ keepalive_timeout 65;
+
+ server {
+ listen 80;
+ server_name localhost; # 服务器名(url)
+ client_max_body_size 4G;
+ root /usr/share/nginx/repo; # 服务默认目录
+
+ location / {
+ autoindex on; # 开启访问目录下层文件
+ autoindex_exact_size on;
+ autoindex_localtime on;
+ }
+
+ }
+
+ }
+ ```
+
+### 启动nginx服务
+
+1. 在root权限下通过systemctl命令启动nginx服务:
+
+ ```shell
+ # systemctl enable nginx
+ # systemctl start nginx
+ ```
+
+2. nginx是否启动成功可通过下面命令查看:
+
+ ```shell
+ # systemctl status nginx
+ ```
+
+ - [图1](#zh-cn_topic_0151920971_fd25e3f1d664b4087ae26631719990a71)表示nginx服务启动成功
+
+ **图 1** nginx服务启动成功
+ 
+
+ - 若nginx服务启动失败,查看错误信息:
+
+ ```shell
+ # systemctl status nginx.service --full
+ ```
+
+ **图 2** nginx服务启动失败
+ 
+
+ 如[图2](#zh-cn_topic_0151920971_f1f9f3d086e454b9cba29a7cae96a4c54)所示nginx服务创建失败,是由于目录/var/spool/nginx/tmp/client\_body创建失败,在root权限下手动进行创建,类似的问题也这样处理:
+
+ ```shell
+ # mkdir -p /var/spool/nginx/tmp/client_body
+ # mkdir -p /var/spool/nginx/tmp/proxy
+ # mkdir -p /var/spool/nginx/tmp/fastcgi
+ # mkdir -p /usr/share/nginx/uwsgi_temp
+ # mkdir -p /usr/share/nginx/scgi_temp
+ ```
+
+### repo源部署
+
+1. 在root权限下创建nginx配置文件/etc/nginx/nginx.conf中指定的目录/usr/share/nginx/repo:
+
+ ```shell
+ # mkdir -p /usr/share/nginx/repo
+ ```
+
+2. 在root权限下修改目录/usr/share/nginx/repo的权限:
+
+ ```shell
+ # chmod -R 755 /usr/share/nginx/repo
+ ```
+
+3. 设置防火墙规则,开启nginx设置的端口(此处为80端口),在root权限下通过firewall设置端口开启:
+
+ ```shell
+ # firewall-cmd --add-port=80/tcp --permanent
+ # firewall-cmd --reload
+ ```
+
+ 在root权限下查询80端口是否开启成功,输出为yes则表示80端口开启成功:
+
+ ```shell
+ # firewall-cmd --query-port=80/tcp
+ ```
+
+ 也可在root权限下通过iptables来设置80端口开启:
+
+ ```shell
+ # iptables -I INPUT -p tcp --dport 80 -j ACCEPT
+ ```
+
+4. nginx服务设置好之后,即可通过ip直接访问网页,如[图3](#zh-cn_topic_0151921017_fig1880404110396):
+
+ **图 3** nginx部署成功
+ 
+
+5. 通过下面几种方式将repo源放入到/usr/share/nginx/repo下:
+ - 在root权限下拷贝镜像中相关文件至/usr/share/nginx/repo下,并修改目录权限。
+
+ ```shell
+ # mount /home/openEuler/openEuler-21.09-aarch64-dvd.iso /mnt/
+ # cp -r /mnt/Packages /usr/share/nginx/repo
+ # cp -r /mnt/repodata /usr/share/nginx/repo
+ # cp -r /mnt/RPM-GPG-KEY-openEuler /usr/share/nginx/repo
+ # chmod -R 755 /usr/share/nginx/repo
+ ```
+
+ openEuler-21.09-aarch64-dvd.iso存放在/home/openEuler目录下。
+
+ - 使用root在/usr/share/nginx/repo下创建repo源的软链接。
+
+ ```shell
+ # ln -s /mnt /usr/share/nginx/repo/os
+ ```
+
+ /mnt为已经创建好的repo源,/usr/share/nginx/repo/os将指向/mnt。
+
+## 使用repo源
+
+repo可配置为yum源,yum(全称为 Yellow dog Updater, Modified)是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载和安装。
+
+### repo配置为yum源(软件源)
+
+构建好的repo可以配置为yum源使用,在/etc/yum.repos.d/目录下使用root权限创建\*\*\*.repo的配置文件(必须以.repo为扩展名),分为本地和http服务器配置yum源两种方式:
+
+- 配置本地yum源
+
+ 在/etc/yum.repos.d目录下创建openEuler.repo文件,使用构建的本地repo源作为yum源,openEuler.repo的内容如下:
+
+ ```text
+ [base]
+ name=base
+ baseurl=file:///home/openEuler/srv/repo
+ enabled=1
+ gpgcheck=1
+ gpgkey=file:///home/openEuler/srv/repo/RPM-GPG-KEY-openEuler
+ ```
+
+ >  **说明:**
+ >
+ > - \[*repoid*\]中的repoid为软件仓库(repository)的ID号,所有.repo配置文件中的各repoid不能重复,必须唯一。示例中repoid设置为**base**。
+ > - name为软件仓库描述的字符串。
+ > - baseurl为软件仓库的地址。
+ > - enabled为是否启用该软件源仓库,可选值为1和0。缺省值为1,表示启用该软件源仓库。
+ > - gpgcheck可设置为1或0,1表示进行gpg(GNU Private Guard)校验,0表示不进行gpg校验,gpgcheck可以确定rpm包的来源是有效和安全的。
+ > - gpgkey为验证签名用的公钥。
+
+- 配置http服务器yum源
+
+ 在/etc/yum.repos.d目录下创建openEuler.repo文件。
+
+ - 若使用用户部署的http服务端的repo源作为yum源,openEuler.repo的内容如下:
+
+ ```text
+ [base]
+ name=base
+ baseurl=http://192.168.139.209/
+ enabled=1
+ gpgcheck=1
+ gpgkey=http://192.168.139.209/RPM-GPG-KEY-openEuler
+ ```
+
+ >  **说明:**
+ > “192.168.139.209”为示例地址,请用户根据实际情况进行配置。
+
+ - 若使用openEuler提供的openEuler repo源作为yum源,以openEuler-24.03-LTS-SP1版本的AArch64架构的OS repo源为例,openEuler.repo的内容如下:
+
+ ```text
+ [base]
+ name=base
+ baseurl=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/OS/aarch64/
+ enabled=1
+ gpgcheck=1
+ gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP1/OS/aarch64/RPM-GPG-KEY-openEuler
+ ```
+
+### repo优先级
+
+当有多个repo源时,可通过在.repo文件的priority参数设置repo的优先级(如果不设置,默认优先级是99,当相同优先级的源中存在相同rpm包时,会安装最新的版本)。其中,1为最高优先级,99为最低优先级,如给openEuler.repo配置优先级为2:
+
+```text
+[base]
+name=base
+baseurl=http://192.168.139.209/
+enabled=1
+priority=2
+gpgcheck=1
+gpgkey=http://192.168.139.209/RPM-GPG-KEY-openEuler
+```
+
+### dnf相关命令
+
+dnf命令在安装升级时能够自动解析包的依赖关系,一般的使用方式如下:
+
+```shell
+dnf
+```
+
+常用的命令如下:
+
+- 安装,需要在root权限下执行。
+
+ ```shell
+ # dnf install
+ ```
+
+- 升级,需要在root权限下执行。
+
+ ```shell
+ # dnf update
+ ```
+
+- 回退,需要在root权限下执行。
+
+ ```shell
+ # dnf downgrade
+ ```
+
+- 检查更新
+
+ ```shell
+ # dnf check-update
+ ```
+
+- 卸载,需要在root权限下执行。
+
+ ```shell
+ # dnf remove
+ ```
+
+- 查询
+
+ ```shell
+ # dnf search
+ ```
+
+- 本地安装,需要在root权限下执行。
+
+ ```shell
+ # dnf localinstall
+ ```
+
+- 查看历史记录
+
+ ```shell
+ # dnf history
+ ```
+
+- 清除缓存目录
+
+ ```shell
+ # dnf clean all
+ ```
+
+- 更新缓存
+
+ ```shell
+ # dnf makecache
+ ```
diff --git a/docs/en/25.03/Server/Administration/Administrator/configuring-the-web-server.md b/docs/en/25.03/Server/Administration/Administrator/configuring-the-web-server.md
new file mode 100644
index 0000000000000000000000000000000000000000..4fed7d46a18f2c6231a71a48d71275c3c0b2a6f2
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/configuring-the-web-server.md
@@ -0,0 +1,498 @@
+# 搭建web服务器
+
+## Apache服务器
+
+### 概述
+
+Web(World Wide Web)是目前最常用的Internet协议之一。目前在Unix-Like系统中的web服务器主要通过Apache服务器软件实现。为了实现运营动态网站,产生了LAMP(Linux + Apache +MySQL + PHP)。web服务可以结合文字、图形、影像以及声音等多媒体,并支持超链接(Hyperlink)的方式传输信息。
+
+openEuler系统中的web服务器版本是Apache HTTP服务器2.4版本,即httpd,一个由Apache软件基金会发展而来的开源web服务器。
+
+### 管理httpd
+
+#### 概述
+
+通过systemctl工具,可以对httpd服务进行管理,包括启动、停止、重启服务,以及查看服务状态等。本章介绍Apache HTTP服务的管理操作,以指导用户使用。
+
+#### 前提条件
+
+- 为了能够使用Apache HTTP服务,请确保您的系统中已经安装httpd服务的rpm包。在root权限下执行如下命令进行安装:
+
+ ```shell
+ # dnf install httpd
+ ```
+
+ 更多关于管理服务的内容,请参见[管理服务](./service-management.md)。
+
+- 启动、停止和重启httpd服务,需要使用root权限。
+
+#### 启动服务
+
+- 启动并运行httpd服务,命令如下:
+
+ ```shell
+ # systemctl start httpd
+ ```
+
+- 假如希望在系统启动时,httpd服务自动启动,则命令和回显如下:
+
+ ```shell
+ # systemctl enable httpd
+ Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
+ ```
+
+>  **说明:**
+> 假如正在运行的Apache HTTP服务器作为一个安全服务器,系统开机启动后需要密码,这个密码使用的是加密的私有SSL密钥。
+
+#### 停止服务
+
+- 停止运行的httpd服务,命令如下:
+
+ ```shell
+ # systemctl stop httpd
+ ```
+
+- 如果希望防止服务在系统开机阶段自动开启,命令和回显如下:
+
+ ```shell
+ # systemctl disable httpd
+ Removed /etc/systemd/system/multi-user.target.wants/httpd.service.
+ ```
+
+#### 重启服务
+
+重启服务有三种方式:
+
+- 完全重启服务
+
+ ```shell
+ # systemctl restart httpd
+ ```
+
+ 该命令会停止运行的httpd服务并且立即重新启动它。一般在服务安装以后或者去除一个动态加载的模块(例如PHP)时使用这个命令。
+
+- 重新加载配置
+
+ ```shell
+ # systemctl reload httpd
+ ```
+
+ 该命令会使运行的httpd服务重新加载它的配置文件。任何当前正在处理的请求将会被中断,从而造成客户端浏览器显示一个错误消息或者重新渲染部分页面。
+
+- 重新加载配置而不影响激活的请求
+
+ ```shell
+ # apachectl graceful
+ ```
+
+ 该命令会使运行的httpd服务重新加载它的配置文件。任何当前正在处理的请求将会继续使用旧的配置文件。
+
+#### 验证服务状态
+
+验证httpd服务是否正在运行
+
+```shell
+# systemctl is-active httpd
+```
+
+回显为“active”说明服务处于运行状态。
+
+### 配置文件说明
+
+当httpd服务启动后,默认情况下它会读取如[表1](#table24341012096)所示的配置文件。
+
+**表 1** 配置文件说明
+
+
+ 文件
+
+ 说明
+
+
+
+ /etc/httpd/conf/httpd.conf
+
+ 主要的配置文件
+
+
+ /etc/httpd/conf.d
+
+ 配置文件的辅助目录,这些配置文件也被包含在主配置文件当中
+ 一个配置文件的辅助目录被包含在主要的配置文件中
+
+
+
+
+
+虽然默认配置可以适用于多数情况,但是用户至少需要熟悉里面的一些重要配置项。配置文件修改完成后,可以在root权限下使用如下命令检查配置文件可能出现的语法错误。
+
+```shell
+# apachectl configtest
+```
+
+如果回显如下,说明配置文件语法正确。
+
+```text
+Syntax OK
+```
+
+>  **说明:**
+> 在修改配置文件之前,请先备份原始文件,以便出现问题时能够快速恢复配置文件。
+> 需要重启web服务,才能使修改后的配置文件生效。
+
+### 管理模块和SSL
+
+#### 概述
+
+httpd服务是一个模块化的应用,它和许多动态共享对象DSO(Dynamic Shared Objects)一起分发。动态共享对象DSO,在必要情况下,可以在运行时被动态加载或卸载。服务器操作系统中这些模块位于/usr/lib64/httpd/modules/目录下。本节介绍如何加载和写入模块。
+
+#### 加载模块
+
+为了加载一个特殊的DSO模块,在配置文件中使用加载模块指示。独立软件包提供的模块一般在/etc/httpd/conf.modules.d目录下有他们自己的配置文件。
+
+例如,加载asis DSO模块的操作步骤如下:
+
+1. 在/etc/httpd/conf.modules.d/00-optional.conf文件中,使用root权限取消注释如下配置行。
+
+ ```shell
+ LoadModule asis_module modules/mod_asis.so
+ ```
+
+2. 加载完成后,请使用root权限重启httpd服务以便于重新加载配置文件。
+
+ ```shell
+ # systemctl restart httpd
+ ```
+
+3. 加载完成后,在root权限下使用httpd -M的命令查看是否已经加载了asis DSO模块。
+
+ ```shell
+ # httpd -M | grep asis
+ ```
+
+ 回显如下,说明asis DSO模块加载成功。
+
+ ```text
+ asis_module (shared)
+ ```
+
+>  **说明:**
+> **httpd 的常用命令:**
+> httpd -v : 查看httpd的版本号。
+> httpd -l:查看编译进httpd程序的静态模块。
+> httpd -M:查看已经编译进httpd程序的静态模块和已经加载的动态模块。
+
+#### SSL介绍
+
+安全套接层SSL(Secure Sockets Layer)是一个允许服务端和客户端之间进行安全通信的加密协议。其中,传输层安全性协议TLS(Transport Layer Security)为网络通信提供了安全性和数据完整性保障。openEuler支持Mozilla NSS(Network Security Services)作为安全性协议TLS进行配置。加载SSL的操作步骤如下:
+
+1. 在root权限下安装mod\_ssl的rpm包。
+
+ ```shell
+ # dnf install mod_ssl
+ ```
+
+2. 安装完成后,请在root权限下重启httpd服务以便于重新加载配置文件。
+
+ ```shell
+ # systemctl restart httpd
+ ```
+
+3. 加载完成后,在root权限下使用httpd -M的命令查看是否已经加载了SSL。
+
+ ```shell
+ # httpd -M | grep ssl
+ ```
+
+ 回显如下,说明SSL已加载成功。
+
+ ```text
+ ssl_module (shared)
+ ```
+
+### 验证web服务是否搭建成功
+
+Web服务器搭建完成后,可以通过如下方式验证是否搭建成功。
+
+1. 在root权限下查看服务器的IP地址,命令如下:
+
+ ```shell
+ # ip a
+
+ ```
+
+2. 在root权限下配置防火墙:
+
+ ```shell
+ # firewall-cmd --add-service=http --permanent
+ success
+ # firewall-cmd --reload
+ success
+ ```
+
+3. 验证web服务器是否搭建成功,用户可选择Linux或Windows系统进行验证。
+ - 使用Linux系统验证
+
+ 执行如下命令,查看是否可以访问网页信息,服务搭建成功时,该网页可以正常访问。
+
+ ```shell
+ # curl http://192.168.1.60
+ ```
+
+ 执行如下命令,查看命令返回值是否为0,返回值为0,说明httpd服务器搭建成功。
+
+ ```shell
+ # echo $?
+ ```
+
+ - 使用Windows系统验证
+
+ 打开浏览器,在地址栏输入如下地址,如果能正常访问网页,说明httpd服务器搭建成功。
+
+
+
+ 如果修改了端口号,输入地址格式如下:
+
+
+
+## Nginx服务器
+
+### 概述
+
+Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能,并且支持很多第三方的模块扩展。
+
+### 安装
+
+1. 配置本地yum源,详细信息请参考[搭建repo服务器](./configuring-the-repo-server.md)。
+2. 清除缓存。
+
+ ```shell
+ # dnf clean all
+ ```
+
+3. 创建缓存。
+
+ ```shell
+ # dnf makecache
+ ```
+
+4. 在root权限下安装nginx服务。
+
+ ```shell
+ # dnf install nginx
+ ```
+
+5. 查看安装后的rpm包。
+
+ ```shell
+ # dnf list all | grep nginx
+ ```
+
+### 管理nginx
+
+#### 概述
+
+通过systemctl工具,可以对nginx服务进行管理,包括启动、停止、重启服务,以及查看服务状态等。本章介绍nginx服务的管理操作,以指导用户使用。
+
+#### 前提条件
+
+- 为了能够使用nginx服务,请确保您的系统中已经安装nginx服务。若未安装,可参考[安装](#安装)进行安装。
+
+- 更多关于管理服务的内容,请参见[管理服务](./service-management.md)。
+
+- 启动、停止和重启nginx服务,需要使用root权限。
+
+#### 启动服务
+
+- 启动并运行nginx服务,命令如下:
+
+ ```shell
+ # systemctl start nginx
+ ```
+
+- 假如希望在系统启动时,nginx服务自动启动,则命令和回显如下:
+
+ ```shell
+ # systemctl enable nginx
+ Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
+ ```
+
+>  **说明:**
+> 假如正在运行的nginx服务器作为一个安全服务器,系统开机启动后需要密码,这个密码使用的是加密的私有SSL密钥。
+
+#### 停止服务
+
+- 停止运行的nginx服务,命令如下:
+
+ ```shell
+ # systemctl stop nginx
+ ```
+
+- 如果希望防止服务在系统开机阶段自动开启,命令和回显如下:
+
+ ```shell
+ # systemctl disable nginx
+ Removed /etc/systemd/system/multi-user.target.wants/nginx.service.
+ ```
+
+#### 重启服务
+
+重启服务有三种方式:
+
+- 完全重启服务
+
+ ```shell
+ # systemctl restart nginx
+ ```
+
+ 该命令会停止运行的nginx服务并且立即重新启动它。一般在服务安装以后或者去除一个动态加载的模块(例如PHP)时使用这个命令。
+
+- 重新加载配置
+
+ ```shell
+ # systemctl reload nginx
+ ```
+
+ 该命令会使运行的nginx服务重新加载它的配置文件。任何当前正在处理的请求将会被中断,从而造成客户端浏览器显示一个错误消息或者重新渲染部分页面。
+
+- 平滑重启nginx
+
+ ```shell
+ # kill -HUP 主进程ID
+ ```
+
+ 该命令会使运行的nginx服务重新加载它的配置文件。任何当前正在处理的请求将会继续使用旧的配置文件。
+
+#### 验证服务状态
+
+验证nginx服务是否正在运行
+
+```shell
+# systemctl is-active nginx
+```
+
+回显为“active”说明服务处于运行状态。
+
+### 配置文件说明
+
+当nginx服务启动后,默认情况下它会读取如[表2](#table24341012096)所示的配置文件。
+
+**表 2** 配置文件说明
+
+
+ 文件
+
+ 说明
+
+
+
+ /etc/nginx/nginx.conf
+
+ 主要的配置文件
+
+
+ /etc/nginx/conf.d
+
+ 配置文件的辅助目录,这些配置文件也被包含在主配置文件当中
+ 一个配置文件的辅助目录被包含在主要的配置文件中
+
+
+
+
+
+虽然默认配置可以适用于多数情况,但是用户至少需要熟悉里面的一些重要配置项。配置文件修改完成后,可以在root权限下使用如下命令检查配置文件可能出现的语法错误。
+
+```shell
+# nginx -t
+```
+
+如果回显信息中有“syntax is ok”,说明配置文件语法正确。
+
+>  **说明:**
+> 在修改配置文件之前,请先备份原始文件,以便出现问题时能够快速恢复配置文件。
+> 需要重启web服务,才能使修改后的配置文件生效。
+
+### 管理模块
+
+#### 概述
+
+nginx服务是一个模块化的应用,它和许多动态共享对象DSO(Dynamic Shared Objects)一起分发。动态共享对象DSO,在必要情况下,可以在运行时被动态加载或卸载。服务器操作系统中这些模块位于/usr/lib64/nginx/modules/目录下。本节介绍如何加载和写入模块。
+
+#### 加载模块
+
+为了加载一个特殊的DSO模块,在配置文件中使用加载模块指示。独立软件包提供的模块一般在/usr/share/nginx/modules目录下有他们自己的配置文件。
+
+openEuler操作系统中使用dnf install nginx安装nginx时会自动加载DSO。
+
+### 验证web服务是否搭建成功
+
+Web服务器搭建完成后,可以通过如下方式验证是否搭建成功。
+
+1. 在root权限下查看服务器的IP地址,命令如下:
+
+ ```shell
+ # ip a
+ ```
+
+ 回显信息如下,说明服务器IP为 192.168.1.60。
+
+ ```text
+ enp3s0: flags=4163 mtu 1500
+ inet 192.168.1.60 netmask 255.255.255.0 broadcast 192.168.1.255
+ inet6 fe80::5054:ff:fe95:499f prefixlen 64 scopeid 0x20
+ ether 52:54:00:95:49:9f txqueuelen 1000 (Ethernet)
+ RX packets 150713207 bytes 49333673733 (45.9 GiB)
+ RX errors 0 dropped 43 overruns 0 frame 0
+ TX packets 2246438 bytes 203186675 (193.7 MiB)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+ enp4s0: flags=4163 mtu 1500
+ ether 52:54:00:7d:80:9e txqueuelen 1000 (Ethernet)
+ RX packets 149937274 bytes 44652889185 (41.5 GiB)
+ RX errors 0 dropped 1102561 overruns 0 frame 0
+ TX packets 0 bytes 0 (0.0 B)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+
+ lo: flags=73 mtu 65536
+ inet 127.0.0.1 netmask 255.0.0.0
+ inet6 ::1 prefixlen 128 scopeid 0x10
+ loop txqueuelen 1000 (Local Loopback)
+ RX packets 37096 bytes 3447369 (3.2 MiB)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 37096 bytes 3447369 (3.2 MiB)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
+ ```
+
+2. 在root权限下配置防火墙:
+
+ ```shell
+ # firewall-cmd --add-service=http --permanent
+ success
+ # firewall-cmd --reload
+ success
+ ```
+
+3. 验证web服务器是否搭建成功,用户可选择Linux或Windows系统进行验证。
+ - 使用Linux系统验证
+
+ 执行如下命令,查看是否可以访问网页信息,服务搭建成功时,该网页可以正常访问。
+
+ ```shell
+ # curl http://192.168.1.60
+ ```
+
+ 执行如下命令,查看命令返回值是否为0,返回值为0,说明nginx服务器搭建成功。
+
+ ```shell
+ # echo $?
+ ```
+
+ - 使用Windows系统验证
+
+ 打开浏览器,在地址栏输入如下地址,如果能正常访问网页,说明nginx服务器搭建成功。
+
+
+
+ 如果修改了端口号,输入地址格式如下:
+
+
diff --git a/docs/en/25.03/Server/Administration/Administrator/faqs.md b/docs/en/25.03/Server/Administration/Administrator/faqs.md
new file mode 100644
index 0000000000000000000000000000000000000000..746cec8056689834ca9a15f83f950cfeb3a4afe6
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/faqs.md
@@ -0,0 +1,391 @@
+# 常见问题与解决方法
+
+## **问题1:使用systemctl和top命令查询libvirtd服务占用内存不同**
+
+### 问题描述
+
+使用systemctl和systemd-cgtop命令查询libvirtd服务占用内存超1.5G,而使用top命令查询libvirtd服务占用内存仅70M左右。
+
+### 原因分析
+
+systemd管理的服务(包括systemctl和systemd-cgtop)中显示的内存通过查询CGroup对应的memory.usage\_in\_bytes得到。top是直接统计/proc下内存相关信息计算得出。两者的统计方法不同,不能直接比较。
+
+一般来说,业务进程使用的内存主要有以下几种情况:
+
+- anon\_rss:用户空间的匿名映射页(Anonymous pages in User Mode address spaces),比如调用malloc分配的内存,以及使用MAP\_ANONYMOUS的mmap。当系统内存不够时,内核可以将这部分内存交换出去。
+- file\_rss:用户空间的文件映射页(Mapped pages in User Mode address spaces),包含map file和map tmpfs,前者比如指定文件的mmap,后者比如IPC共享内存。当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据。
+- file\_cache:文件缓存(page in page cache of disk file),普通读写(read/write)文件时产生的文件缓存。当系统内存不够时,内核可以回收这些页,但回收之前可能需要与文件同步数据。
+- buffer pages:属于page cache,比如读取块设备文件时的相关缓存。
+
+其中anon\_rss和file\_rss属于进程的RSS,file\_cache和buffer pages属于page cache。简单来说:
+
+top里的RSS = anon\_rss + file\_rss,SHR = file\_rss。
+
+CGroup里的memory.usage\_in\_bytes = cache + RSS + swap。
+
+由上可知,syestemd相关命令和top命令的内存占用率含义不同,所以查询结果不同。
+
+## **问题2:设置RAID0卷,参数stripsize设置为4时出错**
+
+### 问题现象
+
+设置RAID0卷,参数stripsize设置为4时出错。
+
+### 原因分析
+
+64K页表开启只能支持64K场景。
+
+### 解决方法
+
+不需要修改配置文件,openEuler执行lvcreate命令时,条带化规格支持的stripesize最小值为64KB,将参数stripesize设置为64。
+
+## **问题3:使用rpmbuild编译mariadb失败**
+
+### 问题描述
+
+如果使用root帐号登录系统,并在该帐号下使用rpmbuild命令编译mariadb源代码,会出现编译失败现象,提示:
+
+```shell
+# echo 'mysql can'\''t run test as root'
+mysql can't run test as root
+# exit 1
+```
+
+### 原因分析
+
+mariadb数据库不允许使用root权限的帐号进行测试用例执行,所以会阻止编译过程(编译过程中会自动执行测试用例)。
+
+### 解决方案
+
+使用vi等文本编辑工具,修改mariadb.spec文件中runtest变量的值。
+
+修改前:
+
+```text
+%global runtest 1
+```
+
+修改后:
+
+```text
+%global runtest 0
+```
+
+该修改关闭了编译阶段执行测试用例的功能,但不会影响编译和编译后的RPM包内容。
+
+## **问题4:使用默认配置启动SNTP服务失败**
+
+### 问题现象
+
+默认配置情况下SNTP服务启动失败。
+
+### 原因分析
+
+默认配置中未添加授时服务器域名。
+
+### 解决方案
+
+修改/etc/sysconfig/sntp文件 ,在文件中添加中国NTP快速授时服务器域名:0.generic.pool.ntp.org。
+
+## **问题5:安装时出现软件包冲突、文件冲突或缺少软件包导致安装失败**
+
+### 问题现象
+
+安装软件包过程中,可能出现软件包冲突、文件冲突或缺少软件包,从而导致升安装被中断,最终安装失败。软件包冲突、文件冲突和缺少软件包的报错信息分别如下所示。
+
+软件包冲突报错信息示例(以 libev-libevent-devel-4.24-11.oe1.aarch64与libevent-devel-2.1.11-2.oe1.aarch64冲突为例):
+
+```text
+package libev-libevent-devel-4.24-11.oe1.aarch64 conflicts with libevent-devel provided by libevent-devel-2.1.11-2.oe1.aarch64
+ - cannot install the best candidate for the job
+ - conflicting requests
+```
+
+文件冲突报错信息示例(以/usr/bin/containerd文件冲突为例):
+
+```text
+Error: Transaction test error:
+ file /usr/bin/containerd from install of containerd-1.2.0-101.oe1.aarch64 conflicts with file from package docker-engine-18.09.0-100.aarch64
+ file /usr/bin/containerd-shim from install of containerd-1.2.0-101.oe1.aarch64 conflicts with file from package docker-engine-18.09.0-100.aarch64
+```
+
+缺少软件包的报错信息示例(以缺失blivet-data软件包为例):
+
+```text
+Error:
+ Problem: cannot install both blivet-data-1:3.1.1-6.oe1.noarch and blivet-data-1:3.1.1-5.noarch
+ - package python2-blivet-1:3.1.1-5.noarch requires blivet-data = 1:3.1.1-5, but none of the providers can be installed
+ - cannot install the best update candidate for package blivet-data-1:3.1.1-5.noarch
+ - problem with installed package python2-blivet-1:3.1.1-5.noarch(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
+```
+
+### 原因分析
+
+- openEuler提供的软件包中,有些软件包虽然名称不同,但功能相同,导致两个软件包无法同时安装。
+- openEuler提供的软件包中,有些软件包虽然名称不同,但功能相同,导致安装时安装后的文件相同,从而产生了文件冲突。
+- 有些软件包,因在升级安装前被其他软件包所依赖,一旦该软件包升级后,可能导致依赖它的软件包因缺少软件包而不能安装。
+
+### 解决方案
+
+若为软件包冲突,则按如下步骤进行处理(以问题现象中示例的软件包冲突为例):
+
+1. 根据安装过程中的软件包冲突报错信息,确定与待安装的 libev-libevent-devel-4.24-11.oe1.aarch64软件包冲突的软件包为libevent-devel-2.1.11-2.oe1.aarch64。
+2. 执行**dnf remove**命令将与待安装软件包冲突的软件包单独卸载。
+
+ ```shell
+ # dnf remove libevent-devel-2.1.11-2.oe1.aarch64
+ ```
+
+3. 重新进行安装操作。
+
+若为文件冲突,则按如下步骤进行处理(以问题现象中示例的文件冲突为例):
+
+1. 根据安装过程中的文件冲突报错信息,确定导致文件冲突的软件包名称为containerd-1.2.0-101.oe1.aarch64和docker-engine-18.09.0-100.aarch64。
+2. 将不需要安装的软件包名称记录下来,以不需要安装docker-engine-18.09.0-100.aarch64为例。
+3. 执行**dnf remove**命令将不需要安装的软件包单独卸载。
+
+ ```shell
+ # dnf remove docker-engine-18.09.0-100.aarch64
+ ```
+
+4. 重新进行安装操作。
+
+若为缺少软件包,则按如下步骤进行处理(以问题现象中示例的缺少软件包为例):
+
+1. 根据升级安装过程中的缺少软件包报错信息,确定待升级的软件包名称blivet-data-1:3.1.1-5.noarch及依赖它的软件包名称python2-blivet-1:3.1.1-5.noarch。
+2. 执行dnf remove命令将依赖待升级包才能安装的软件包单独卸载或在升级软件包时加上\-\-allowerasing参数。
+ - 执行**dnf remove**命令将依赖blivet-data-1:3.1.1-5.noarch软件包才能安装的软件包单独卸载。
+
+ ```shell
+ # dnf remove python2-blivet-1:3.1.1-5.noarch
+ ```
+
+ - 升级软件包时加上\-\-allowerasing参数。
+
+ ```shell
+ # yum update blivet-data-1:3.1.1-5.noarch -y --allowerasing
+ ```
+
+3. 重新进行升级操作。
+
+### 安装冲突实例
+
+- 文件冲突
+
+ python3-edk2-devel.noarch 与 build.noarch 因文件名重复存在冲突。
+
+ ```shell
+ # yum install python3-edk2-devel.noarch build.noarch
+ ...
+ Error: Transaction test error:
+ file /usr/bin/build conflicts between attempted installs of python3-edk2-devel-202002-3.oe1.noarch and build-20191114-324.4.oe1.noarch
+ ```
+
+## **问题6:libiscsi降级失败**
+
+### 问题现象
+
+libiscsi-1.19.0-4 版本及以上降级到 libiscsi-1.19.0-3 及以下版本时失败。
+
+```text
+Error:
+Problem: problem with installed package libiscsi-utils-1.19.0-4.oe1.x86_64
+- package libiscsi-utils-1.19.0-4.oe1.x86_64 requires libiscsi(x86-64) = 1.19.0-4.oe1, but none of the providers can be installed
+- cannot install both libiscsi-1.19.0-3.oe1.x86_64 and libiscsi-1.19.0-4.oe1.x86_64
+- cannot install both libiscsi-1.19.0-4.oe1.x86_64 and libiscsi-1.19.0-3.oe1.x86_64
+- conflicting requests
+(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
+```
+
+### 原因分析
+
+libiscsi-1.19.0-3 之前的版本把 iscsi-xxx 等二进制文件打包进了主包 libiscsi,而这些二进制文件引入了不合理的依赖 CUnit, 为了解决这种不合理的依赖,在 libiscsi-1.19.0-4 版本把这些二进制文件单独拆分出来一个子包 libiscsi-utils,主包弱依赖于子包,产品可以根据自己的需求在做镜像时是否集成该子包;不集成或卸载子包不会影响 libiscsi 主包的功能。
+如果系统中安装了 libiscsi-utils 子包,libiscsi-1.19.0-4 及以上版本降级到 libiscsi-1.19.0-3 及以下版本时,由于 libiscsi-1.19.0-3 及以下版本无法提供对应的 libiscsi-utils,因此 libiscsi-utils 不会降级,但 libiscsi-utils 依赖于降级前的 libiscsi 主包,导致依赖问题无法解决,最终导致降级失败。
+
+### 解决方案
+
+执行以下命令,卸载 libiscsi-utils 子包,卸载成功后再进行降级操作。
+
+```text
+yum remove libiscsi-utils
+```
+
+## **问题7:xfsprogs降级失败**
+
+### 问题现象
+
+xfsprogs-5.6.0-2 及以上版本降级到 xfsprogs-5.6.0-1 及以下版本时失败。
+
+```text
+Error:
+Problem: problem with installed package xfsprogs-xfs_scrub-5.6.0-2.oe1.x86_64
+- package xfsprogs-xfs_scrub-5.6.0-2.oe1.x86_64 requires xfsprogs = 5.6.0-2.oe1, but none of the providers can be installed
+- cannot install both xfsprogs-5.6.0-1.oe1.x86_64 and xfsprogs-5.6.0-2.oe1.x86_64
+- cannot install both xfsprogs-5.6.0-2.oe1.x86_64 and xfsprogs-5.6.0-1.oe1.x86_64
+- conflicting requests
+```
+
+### 原因分析
+
+在 xfsprogs-5.6.0-2 版本中,为了减少 xfsprogs 主包的不合理依赖,同时将实验性质的命令从主包中分来,我们将 xfs_scrub* 命令拆分到单独的 xfsprogs-xfs_scrub 子包中。而 xfsprogs 主包弱依赖于 xfsprogs-xfs_scrub 子包,所以产品可以根据自己的需求在做镜像时是否集成该子包,或者是否卸载该子包。不集成或卸载该子包不会影响 xfsprogs 主包功能。
+
+如果系统中安装了 xfsprogs-xfs_scrub 子包,从 xfsprogs-5.6.0-2 及以上版本降级到 xfsprogs-5.6.0-1 及以下版本时,由于 xfsprogs-5.6.0-1 及以下版本无法提供对应的 xfsprogs-xfs_scrub,因此 xfsprogs-xfs_scrub 不会降级,但 xfsprogs-xfs_scrub 依赖于降级前的 xfsprogs 主包,导致依赖问题无法解决,最终导致降级失败。
+
+### 解决方案
+
+执行以下命令,卸载 xfsprogs-xfs_scrub 子包,卸载成功后再进行降级操作。
+
+```shell
+# yum remove xfsprogs-xfs_scrub
+```
+
+## **问题8:elfutils降级失败**
+
+### 问题现象
+
+elfutils降级缺少依赖,导致无法降级。
+
+
+
+### 原因分析
+
+22.03-LTS、22.03-LTS-Next分支:elfutils-0.185-12
+
+master分支:elfutils-0.187-7
+
+20.03-LTS-SP1分支:elfutils-0.180-9
+
+如上版本,elfutils主包提供的eu-objdump、eu-readelf、eu-nm命令拆分到elfutils-extra子包中。当系统已安装elfutils-extra,且elfutils进行降级时,由于低版本(如上分支版本)无法提供对应的elfutils-extra包,因此elfutils-extra子包不会降级(elfutils-extra依赖于降级前的elfutils包),导致依赖问题无法解决,最终elfutils降级失败。
+
+### 解决方案
+
+执行以下命令,先卸载elfutils-extra包,再进行降级操作。
+
+```shell
+# yum remove -y elfutils-extra
+```
+
+## **问题9:cpython/Lib发现CVE-2019-9674:Zip炸弹漏洞**
+
+### 问题现象
+
+Python 3.7.2 及以下版本中的 Lib/zipfile.py 允许远程攻击者通过 zip 炸弹制造拒绝服务请求,从而导致资源消耗过大。
+
+### 原因分析
+
+远程攻击者通过 zip 炸弹导致拒绝服务,影响目标系统业务甚至达到使系统崩溃的结果。zip 炸弹就是一个高压缩比的 zip 文件,它本身可能只有几M或几十M的大小,但是解压缩之后会产生巨大的数据量,产生巨大的资源消耗。
+
+### 解决方案
+
+在 zipfile 文档中添加告警信息:
+
+## **问题10:不合理使用glibc正则表达式引起ReDoS攻击**
+
+### 问题现象
+
+使用glibc的regcomp/regexec接口编程,或者grep/sed等应用glibc正则表达式的shell命令,不合理的正则表达式或输入会造成ReDoS攻击(CVE-2019-9192/CVE-2018-28796)。
+典型正则表达式pattern为“反向引用”(\1表示)与“*”(匹配零次或多次)、“+”(匹配一次或多次)、“{m,n}”(最小匹配m次,最多匹配n次)的组合,或者配合超长字符串输入,示例如下:
+
+```shell
+# echo D | grep -E "$(printf '(\0|)(\\1\\1)*')"Segmentation fault (core dumped)
+# grep -E "$(printf '(|)(\\1\\1)*')"
+Segmentation fault (core dumped)
+# echo A | sed '/\(\)\(\1\1\)*/p'
+Segmentation fault (core dumped)
+# time python -c 'print "a"*40000' | grep -E "a{1,32767}"
+Segmentation fault (core dumped)
+# time python -c 'print "a"*40900' | grep -E "(a)\\1"
+Segmentation fault (core dumped)
+```
+
+### 原因分析
+
+使用正则表达式的进程coredump。具体原因为glibc正则表达式的实现为NFA/DFA混合算法,内部原理是使用贪婪算法进行递归查找,目的是尽可能匹配更多的字符串,贪婪算法在处理递归正则表达式时会导致ReDoS。
+
+### 解决方案
+
+1. 需要对用户做严格的权限控制,减少攻击面。
+2. 用户需保证正则表达式的正确性,不输入无效正则表达式,或者超长字符串配合正则的“引用” “*”等容易触发无限递归的组合。
+
+ ```shell
+ # ()(\1\1)*
+ # "a"*400000
+ ```
+
+3. 用户程序在检测到进程异常之后,通过重启进程等手段恢复业务,提升程序的可靠性。
+
+## **问题11:安装卸载httpd-devel和apr-util-devel软件包,其中的依赖包gdbm-devel安装、卸载有报错**
+
+### 问题现象
+
+1. gdbm-devel-1.18.1-1包安装、卸载有报错;
+2. 问题1修复后,gdbm和gdbm-devel包更新到1.18.1-2版本,但在安装httpd-devel、apr-util-devel等包(依赖关系中有gdbm-devel软件包)时,默认安装的gdbm-devel还是1.18.1-1旧版本,导致问题报错依然存在。
+
+### 原因分析
+
+1. gdbm-devel-1.18.1-1包中缺少提供info信息的help软件包,导致单独安装gdbm-devel并不能将help包引入进来,所以出现了如下告警信息。
+
+ ```text
+ install-info: 没有那个文件或目录 for /usr/share/info/gdbm.info.gz
+ ```
+
+2. 由于系统默认安装的gdbm主包是1.18.1-1版本,而没有安装gdbm-devel包。依赖gdbm-devel包的相关软件包在安装gdbm-devel包的过程中,仍会匹配gdbm的主包版本,故而依然安装了gdbm-devel的旧版本1.18.1-1,导致警告信息依然存在。
+
+### 解决方案
+
+1. 单包升级gdbm,安装使用gdbm-1.18.1-2版本相关软件包后,告警信息消失;
+2. 在单包升级gdbm后,再进行安装依赖的gdbm-devel软件包安装,让其依赖高版本gdbm软件包,告警信息消失。
+
+## **问题12:系统reboot后,执行yum/dnf等命令报错,提示rpmdb error**
+
+### 问题现象
+
+1. reboot系统,重启后,执行rpm相关命令(yum/dnf)提示:
+ error: db5 error(-30973) from dbenv->open: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
+ error: cannot open Packages index using db5 - (-30973)
+ error: cannot open Packages database in /var/lib/rpm
+ Error: Error: rpmdb open failed
+
+### 原因分析
+
+1. 执行安装升级动作过程中,会对/var/lib/rpm/__db.00*文件进行读写操作,如果在运行中出现强制下电、磁盘空间满或者 ‘kill -9’ 等异常中断操作,会导致对应_db文件损坏,后续执行rpm相关命令(dnf/yum)会发生报错
+
+### 解决方案
+
+步骤1 执行`kill -9`停止所有正在运行的rpm命令。
+步骤2 执行`rm -rf /var/lib/rpm/__db.00*`删除所有db.00的文件。
+步骤3 执行`rpmdb --rebuilddb`命令,重建rpm db后即可。
+
+## **问题13:执行 rpmrebuild -d /home/test filesystem对filesystem包rebuild时,rebuild失败**
+
+### 问题现象
+
+执行 rpmrebuild --comment-missing=y --keep-perm -b -d /home/test filesystem-3.16-3.oe1.aarch64对filesystem包rebuild时,rebuild失败.
+/usr/lib/rpmrebuild/rpmrebuild.sh:Error:(RpmBuild) Package 'filesystem-3.16-3.oe1.aarch64' build failed.
+/usr/lib/rpmrebuild/rpmrebuild.sh:Error: RpmBuild
+
+### 原因分析
+
+软件包在%pretrans -p阶段创建目录,并在%ghost阶段对该目录进行修饰,如果用户在该目录下创建目录或文件,执行rpmrebuild对该包进行打包,发现创建的目录或文件也会打包到该包中。
+
+上述问题的根本原因是因为filesystem在%pretrans阶段创建了/proc目录,并在%ghost阶段对该目录进行了修饰,但是该目录在系统运行时会动态的创建一些微量进程,这些进程非目录也非文件,在执行rpmrebuild的时无法对这些进程进行打包,所以rebuild失败。
+
+### 解决方案
+
+暂时不使用rpmrebuild命令对filesystem进行rebuild。
+
+## **问题14:带参数f执行modprobe或insmod报错**
+
+### 问题现象
+
+执行`modprobe -f `或`insmod -f .ko.xz`报错,比如`insmod -f xfs.ko.xz`报错:`modprobe: ERROR: could not insert 'xfs': Key was rejected by service`。
+
+迄今为止(2022.09.20, kmod v30),该问题尚未被kmod社区修复。Linux v5.17 [b1ae6dc](https://github.com/torvalds/linux/commit/b1ae6dc41eaaa98bb75671e0f3665bfda248c3e7)添加了对压缩内核模块的支持,kmod尚未支持该特性。
+
+### 原因分析
+
+对于未经压缩的ko,`{modprobe, insmod}`使用`finit_module()`系统调用,而对于压缩的ko,解压由kmod完成,使用`init_module()`系统调用。系统调用`init_module()`无法传入ignore check的flag,导致内核执行路径中`mod_verify_sig()`始终进入,并且`{modprobe, insmod} -f`参数会更改ko有关的校验信息,导致`mod_verify_sig()`校验失败。
+
+### 解决方案
+
+对压缩了的ko不使用`{insmod, modprobe} -f`。
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/1665628542704.png b/docs/en/25.03/Server/Administration/Administrator/figures/1665628542704.png
new file mode 100644
index 0000000000000000000000000000000000000000..58907e0ed31c79b260be80480d4fd4c27e4e2e24
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/1665628542704.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/D1376B2A-D036-41C4-B852-E8368F363B5E-1.png b/docs/en/25.03/Server/Administration/Administrator/figures/D1376B2A-D036-41C4-B852-E8368F363B5E-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..900cdc07c1f0e844bc48fe2342e83c91a23c24ec
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/D1376B2A-D036-41C4-B852-E8368F363B5E-1.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/D1376B2A-D036-41C4-B852-E8368F363B5E.png b/docs/en/25.03/Server/Administration/Administrator/figures/D1376B2A-D036-41C4-B852-E8368F363B5E.png
new file mode 100644
index 0000000000000000000000000000000000000000..900cdc07c1f0e844bc48fe2342e83c91a23c24ec
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/D1376B2A-D036-41C4-B852-E8368F363B5E.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/PostgreSql_architecture.png b/docs/en/25.03/Server/Administration/Administrator/figures/PostgreSql_architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..f780ad9cb56378e7baa3497da68ca1610a6dfadb
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/PostgreSql_architecture.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/creat_datadisk.png b/docs/en/25.03/Server/Administration/Administrator/figures/creat_datadisk.png
new file mode 100644
index 0000000000000000000000000000000000000000..0dfd6a2802184af6d809c485191ea52452cf28d5
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/creat_datadisk.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/creat_datadisk1.png b/docs/en/25.03/Server/Administration/Administrator/figures/creat_datadisk1.png
new file mode 100644
index 0000000000000000000000000000000000000000..0dfd6a2802184af6d809c485191ea52452cf28d5
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/creat_datadisk1.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/etmem-system-architecture.png b/docs/en/25.03/Server/Administration/Administrator/figures/etmem-system-architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e077e00f44c0404526a4742d49c6e866601eee1
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/etmem-system-architecture.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/logical_architectureofMariaDB.png b/docs/en/25.03/Server/Administration/Administrator/figures/logical_architectureofMariaDB.png
new file mode 100644
index 0000000000000000000000000000000000000000..8caa189a6fbf37bf4e9fd863c2ebb24e25547789
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/logical_architectureofMariaDB.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/login.png b/docs/en/25.03/Server/Administration/Administrator/figures/login.png
new file mode 100644
index 0000000000000000000000000000000000000000..d15c2cad98fba16320d587f3c7b0c80f435c5d3a
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/login.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/nginx_deployed_success.png b/docs/en/25.03/Server/Administration/Administrator/figures/nginx_deployed_success.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ffb2c142defbd690e5407659116bf8e5582ba73
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/nginx_deployed_success.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/nginx_start_failed.png b/docs/en/25.03/Server/Administration/Administrator/figures/nginx_start_failed.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8b855453433796265de42d7ffd0189c7ff9be2b
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/nginx_start_failed.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/nginx_start_success.png b/docs/en/25.03/Server/Administration/Administrator/figures/nginx_start_success.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc6929772fd98fac3494b4436f26910b09818cb7
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/nginx_start_success.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/postgres.png b/docs/en/25.03/Server/Administration/Administrator/figures/postgres.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7fc36882718587ec949133fe9892185cb4c2158
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/postgres.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/top_display.png b/docs/en/25.03/Server/Administration/Administrator/figures/top_display.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d77d3dc2934763b5da896a827b9805da34d1c09
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/top_display.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0229622729.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0229622729.png
new file mode 100644
index 0000000000000000000000000000000000000000..a32856aa08e459ed0f51f8fcf4c2f51511c12095
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0229622729.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0229622789.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0229622789.png
new file mode 100644
index 0000000000000000000000000000000000000000..d245d48dc07e2b01734e21ec1952e89fa9269bdb
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0229622789.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0230050789.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0230050789.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b785be2a026fe059c6ee41700a971a11cfff7ae
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0230050789.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143176.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143176.png
new file mode 100644
index 0000000000000000000000000000000000000000..300165189e6d3e8fa356f3d463cfc627c2ece0e2
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143176.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143177.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143177.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccafce4b0c58a4da0a9f7aece335ede24e5030c0
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143177.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143178.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143178.png
new file mode 100644
index 0000000000000000000000000000000000000000..bff125f096215e91b28ee6deacde6d886e5b21eb
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143178.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143180.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143180.png
new file mode 100644
index 0000000000000000000000000000000000000000..52f5644f9c985bcc39c0d146006dd9136140bc01
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143180.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143181.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143181.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3698e6c0e021a56be46b9f4944c858a425eb66c
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143181.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143183.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143183.png
new file mode 100644
index 0000000000000000000000000000000000000000..55ffdfa2616ee259543c1539e46c3e05f9335354
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143183.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143185.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143185.png
new file mode 100644
index 0000000000000000000000000000000000000000..bff125f096215e91b28ee6deacde6d886e5b21eb
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143185.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143187.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143187.png
new file mode 100644
index 0000000000000000000000000000000000000000..52f5644f9c985bcc39c0d146006dd9136140bc01
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231143187.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563132.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563132.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb801a9471f3f3541ba96491654f25e2df9ce8bf
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563132.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563134.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563134.png
new file mode 100644
index 0000000000000000000000000000000000000000..398d15376d29d3aa406abb2e7e065d4625428c4d
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563134.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563135.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563135.png
new file mode 100644
index 0000000000000000000000000000000000000000..785977142a6bf0e1c1815b82dea73d75fa206a75
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563135.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563136.png b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563136.png
new file mode 100644
index 0000000000000000000000000000000000000000..c274db4d0ca9d8758267a916e19fdef4aa22d0ba
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/figures/zh-cn_image_0231563136.png differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/process-management.md b/docs/en/25.03/Server/Administration/Administrator/process-management.md
new file mode 100644
index 0000000000000000000000000000000000000000..5e267c94c37366a128d6de75d6ed1cae958a6eab
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/process-management.md
@@ -0,0 +1,333 @@
+# 管理进程
+
+操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主要存储,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源,当用户提出一个请求时,造成好像系统被用户独占的假象。实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户任务、操作系统任务、邮件和打印任务等。本章节将从用户的角度讲述如何控制进程。
+
+## 查看进程
+
+Linux是一个多任务系统,经常需要对这些进程进行一些调配和管理。要进行管理,首先就要知道现在的进程情况:有哪些进程、进程的状态如何等。Linux提供了多种命令来了解进程的状况。
+
+### who命令
+
+who命令主要用于查看当前系统中的用户情况。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。
+
+例如查看系统中的用户及其状态。使用如下:
+
+```shell
+# who
+admin tty1 Jul 28 15:55
+admin pts/0 Aug 5 15:46 (192.168.0.110)
+admin pts/2 Jul 29 19:52 (192.168.0.110)
+root pts/3 Jul 30 12:07 (192.168.0.110)
+root pts/4 Jul 31 10:29 (192.168.0.144)
+root pts/5 Jul 31 14:52 (192.168.0.11)
+root pts/6 Aug 6 10:12 (192.168.0.234)
+root pts/8 Aug 6 11:34 (192.168.0.234)
+```
+
+### ps命令
+
+ps命令是最基本又非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等,大部分进程信息都是可以通过执行该命令得到的。
+
+ps命令最常用的还是用来监控后台进程的工作情况,因为后台进程是不与屏幕、键盘这些标准输入/输出设备进行通信的,所以如果需要检测其状况,就可使用ps命令。ps命令的常见选项如[表1](#zh-cn_topic_0151921029_t34619d964a3d41ad8694189ec383359c)所示。
+
+**表 1** 选项说明
+
+
+ 选项
+
+ 描述
+
+
+
+ -e
+
+ 显示所有进程。
+
+
+ -f
+
+ 全格式。
+
+
+ -h
+
+ 不显示标题。
+
+
+ -l
+
+ 使用长格式。
+
+
+ -w
+
+ 宽行输出。
+
+
+ -a
+
+ 显示终端上的所有进程,包括其他用户的进程。
+
+
+ -r
+
+ 只显示正在运行的进程。
+
+
+ -x
+
+ 显示没有控制终端的进程。
+
+
+
+
+
+例如显示系统中终端上的所有进程。命令如下:
+
+```shell
+# ps -a
+ PID TTY TIME CMD
+12175 pts/6 00:00:00 bash
+24526 pts/0 00:00:00 vsftpd
+29478 pts/5 00:00:00 ps
+32461 pts/0 1-01:58:33 sh
+```
+
+### top命令
+
+top命令和ps命令的基本作用是相同的,显示系统当前的进程和其他状况,但是top是一个动态显示过程,即可以通过用户按键来不断刷新进程的当前状态,如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。其实top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU的任务列表。该命令可以按CPU使用、内存使用和执行时间对任务进行排序,而且该命令的很多特性都可以通过交互式命令或者在定制文件中进行设定。
+
+top命令输出的示例如[图1](#zh-cn_topic_0151921029_f289234fcdbac453796200d80e9889cd1)所示:
+
+**图 1** top显示
+
+
+### kill命令
+
+当需要中断一个前台进程的时候,通常足使用“Ctrl+c”组合键,而对于后台进程不能用组合键来终止,这时就可以使用kill命令。该命令可以终止前台和后台进程。终止后台进程的原因包括:该进程占用CPU的时间过多、该进程已经死锁等。
+
+kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送的信号,那么缺省值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用KILL信号(它的编号为9),而该信号不能被捕捉。
+
+kill命令的浯法格式有以下两种方式:
+
+```shell
+kill [-s 信号 | -p] [-a] 进程号…
+kill -l [信号]
+```
+
+其中进程号可以通过ps命令的输出得到。-s选项是给程序发送指定的信号,详细的信号可以用“kill -l”命令查看;-p选项只显示指定进程的ID号。
+
+杀死pid为1409的进程,在root权限下执行如下命令:
+
+```shell
+# kill -9 1409
+```
+
+显示所有的信号及其编号对应关系,示例如下:
+
+```shell
+# kill -l
+ 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
+ 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
+11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
+16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
+21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
+26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
+31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
+38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
+43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
+48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
+53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
+58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
+63) SIGRTMAX-1 64) SIGRTMAX
+```
+
+## 调度启动进程
+
+有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这些任务。要使用自动启动进程的功能,就需要掌握以下几个启动命令。
+
+### 定时运行一批程序(at)
+
+#### at命令
+
+用户使用at命令在指定时刻执行指定的命令序列。该命令至少需要指定一个命令和一个执行时间。at命令可以只指定时间,也可以时间和日期一起指定。
+
+at命令的语法格式如下:
+
+```shell
+ at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间
+ at -c 作业 [作业…]
+```
+
+#### 设置时间
+
+at允许使用一套相当复杂的时间指定方法,比如:
+
+- 接受在当天的hh:mm(小时:分钟)式的时间指定。如果该时间已经过去,那么就放在第二天执行。
+- 使用midnight(深夜)、noon(中午)、teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
+- 采用12小时计时制,即在时间后面加上AM(上午)或者PM(下午)来说明是上午还是下午。
+- 指定命令执行的具体日期,指定格式为month day(月日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。
+
+上面介绍的都是绝对计时法,其实还可以使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为now+count time-units,now就是当前时间,time-units是时间单位,这里可以是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时等。还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。下面通过一些例子来说明具体用法。
+
+例如指定在今天下午4:30执行某个命令。假设现在时间是中午12:30,2019年6月7日,可用命令格式如下:
+
+```shell
+ at 4:30pm
+ at 16:30
+ at 16:30 today
+ at now+4 hours
+ at now+ 240 minutes
+ at 16:30 7.6.19
+ at 16:30 6/7/19
+ at 16:30 Jun 7
+```
+
+以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误,例如上例可以写成:at 16:30 6/7/19。
+
+#### 执行权限
+
+对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的所有者。
+
+例如在6月8日上午10点执行slocate -u命令。在root权限下执行命令如下:
+
+```shell
+# at 10:00 6/8/19
+at> slocate -u
+at>
+[1]+ Stopped at 10:00 6/8/19
+```
+
+上面的结果中,输入at命令之后,会出现提示符at\>,提示用户输入命令,在此输入了slocate -u,然后按回车键。还可以输入多条命令,当所有要执行的命令输入结束后,按“Ctrl+d”键结束at命令。
+
+在任何情况下,管理员帐户都可以使用这个命令。对于其他用户来说,是否可以使用就取决于/etc/at.allow和/etc/at.deny文件。
+
+### 周期性运行一批程序(cron)
+
+前面介绍at命令都会在一定时间内完成一定任务,但是它只能执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,以后就不再执行了。但是在很多情况下需要周期性重复执行一些命令,这时候就需要使用cron命令来完成任务。
+
+#### 运行机制
+
+首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将装入内存。比如一个用户名为userexample的用户,对应的crontab文件应该是/var/spool/cron/userexample,即以该用户命名的crontab文件存放在/var/spool/cron目录下面。
+
+cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的。cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入睡眠状态,释放系统资源。所以该后台进程占用资源极少,它每分钟被唤醒一次,查看当前是否有需要运行的命令。
+
+命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文件中MAILTO环境变量中指定的用户。这是cron的工作原理,但是cron命令的执行不需要用户干涉,用户只需要修改crontab中要执行的命令。
+
+#### crontab命令
+
+crontab命令用于安装、删除或者显示用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行,而且每个用户都可以有自己的crontab文件。
+
+crontab命令的常用方法如下:
+
+- crontab -u //设置某个用户的cron服务,root用户在执行crontab时需要此参数。
+- crontab -l //列出某个用户cron服务的详细内容。
+- crontab -r //删除某个用户的cron服务。
+- crontab -e //编辑某个用户的cron服务。
+
+例如root查看自己的cron设置。命令如下:
+
+```shell
+# crontab -u root -l
+```
+
+#### crontab文件
+
+在crontab文件中输入需要执行的命令和时间。该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:
+
+```shell
+minute hour day-of-month month-of-year day-of-week commands
+```
+
+对于每一项的说明如[表2](#zh-cn_topic_0151921016_t7d97d1204fe249d7ae0a87b4cf9a9353)所示。
+
+**表 2** 参数说明
+
+
+ 参数
+
+ 描述
+
+
+
+ minute
+
+ 分钟(0~59)。
+
+
+ hour
+
+ 小时(0~23)。
+
+
+ day-of-month
+
+ 一个月的第几天(1~31)。
+
+
+ month-of-year
+
+ 一年的第几个月(1~12)。
+
+
+ day-of-week
+
+ 一周的星期几(0~6),0代表星期天。
+
+
+ commands
+
+ 需要执行的命令。
+
+
+
+
+
+这些项都不能为空,必须指定值。除了数字还有几个特殊的符号“\*”、“/”和“-”、“,”。其中,\*代表所有的取值范围内的数字,/代表每的意思,“\*/5”表示每5个单位,“-”代表从某个数字到某个数字,“,”用于分开几个离散数字。对于要执行的命令,调用的时候需要写出命令的完整路径。
+
+例如晚上18点到22点之间每两个小时,在/tmp/test.txt文件中加入sleepy文本。在crontab文件中对应的行如下:
+
+```shell
+* 18-22/2 * * * echo "sleepy" >> /tmp/test.txt
+```
+
+每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件。此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e来编辑。用户也可以另外建立一个文件,使用“cron文件名”命令导入cron设置。
+
+假设有个用户名为userexample,它需要为自己创建一个crontab文件。步骤如下:
+
+1. 首先可以使用任何文本编辑器建立一个新文件,并向该文件加入需要运行的命令和要定期执行的时间,假设该文件为 \~/userexample.cron。
+2. 然后在root权限下使用crontab命令安装这个文件,使之成为该用户的crontab文件。命令如下:
+
+ ```shell
+ # crontab -u userexample ~/userexample.cron
+ ```
+
+这样crontab文件就建立好了,可以转到/var/spool/cron目录下面查看,发现多了一个userexample文件。这个文件就是所需的crontab文件。
+
+>  **说明:**
+> cron启动后,每过一分钟读一次crontab文件,检查是否要执行里面的命令。因此该文件被修改后不需要重新启动cron服务。
+
+#### 编辑配置文件
+
+cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此通过配置这个文件也能得到cron的服务。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式如下:
+
+```text
+SHELL=/bin/sh
+PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
+MAILTO=root //如果出现错误,或者有数据输出,将发邮件给这个帐号
+HOME=/
+# run-parts
+01 * * * * root run-parts /etc/cron.hourly //每个小时执行一次/etc/cron.hourly里的脚本
+02 4 * * * root run-parts /etc/cron.daily //每天执行一次/etc/cron.daily里的脚本
+22 4 * * 0 root run-parts /etc/cron.weekly //每周执行一次/etc/cron.weekly里的脚本
+42 4 1 * * root run-parts /etc/cron.monthly //每月执行一次/etc/cron.monthly里的脚本
+```
+
+>  **说明:**
+> 如果去掉run-parts参数,其后面就是运行的某个脚本名,而不是目录名。
+
+## 挂起/恢复进程
+
+作业控制允许进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复后将从中止处开始继续运行。只要在键盘上按“Ctrl+Z”键,即可挂起当前的前台作业。在键盘上按“Ctrl+Z”键后,将挂起当前执行的命令cat。使用jobs命令可以显示shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。
+
+恢复进程执行时,有两种选择:用fg命令将挂起的作业放回到前台执行;用bg命令将挂起的作业放到后台执行。灵活使用上述命令,将给自己带来很大的方便。
diff --git a/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-caution.gif b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-danger.gif b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-note.gif b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-notice.gif b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-tip.gif b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-warning.gif b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Administration/Administrator/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Server/Administration/Administrator/service-management.md b/docs/en/25.03/Server/Administration/Administrator/service-management.md
new file mode 100644
index 0000000000000000000000000000000000000000..5b33f6c514e5c86a95a58433652bd754613085e3
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/service-management.md
@@ -0,0 +1,805 @@
+# 管理服务
+
+本章介绍如何使用systemd进行系统和服务管理。
+
+## 简介
+
+systemd是在Linux下,与SysV和LSB初始化脚本兼容的系统和服务管理器。systemd使用socket和D-Bus来开启服务,提供基于守护进程的按需启动策略,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有更高的并行性能。
+
+### 概念介绍
+
+systemd开启和监督整个系统是基于unit的概念。unit是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit有一个具有相同名字的配置文件,是守护进程Avahi的一个封装单元)。unit有多种类型,如[表1](#zh-cn_topic_0151921012_t2dcb6d973cc249ed9ccd56729751ca6b)所示。
+
+**表 1** unit说明
+
+
+ unit名称
+
+ 后缀名
+
+ 描述
+
+
+
+ Service unit
+
+ .service
+
+ 系统服务。
+
+
+ Target unit
+
+ .target
+
+ 一组systemd units。
+
+
+ Automount unit
+
+ .automount
+
+ 文件系统挂载点。
+
+
+ Device unit
+
+ .device
+
+ 内核识别的设备文件。
+
+
+ Mount unit
+
+ .mount
+
+ 文件系统挂载点。
+
+
+ Path unit
+
+ .path
+
+ 在一个文件系统中的文件或目录。
+
+
+ Scope unit
+
+ .scope
+
+ 外部创建的进程。
+
+
+ Slice unit
+
+ .slice
+
+ 一组用于管理系统进程分层组织的units。
+
+
+ Socket unit
+
+ .socket
+
+ 一个进程间通信的Socket。
+
+
+ Swap unit
+
+ .swap
+
+ swap设备或者swap文件。
+
+
+ Timer unit
+
+ .timer
+
+ systemd计时器。
+
+
+
+
+
+所有的可用systemd unit类型,可在如[表2](#zh-cn_topic_0151921012_t2523a0a9a0c54f9b849e52d1efa0160c)所示的路径下查看。
+
+**表 2** 可用systemd unit类型
+
+
+ 路径
+
+ 描述
+
+
+
+ /usr/lib/systemd/system/
+
+ 随安装的RPM产生的systemd units。
+
+
+ /run/systemd/system/
+
+ 在运行时创建systemd units。
+
+
+ /etc/systemd/system/
+
+ 由系统管理员创建和管理的systemd units。
+
+
+
+
+
+## 特性说明
+
+### 更快的启动速度
+
+systemd提供了比UpStart更激进的并行启动能力,采用了socket/D-Bus activation等技术启动服务,带来了更快的启动速度。
+
+为了减少系统启动时间,systemd的目标是:
+
+- 尽可能启动更少的进程。
+- 尽可能将更多进程并行启动。
+
+### 提供按需启动能力
+
+当sysvinit系统初始化的时候,它会将所有可能用到的后台服务进程全部启动运行。并且系统必须等待所有的服务都启动就绪之后,才允许用户登录。这种做法有两个缺点:首先是启动时间过长;其次是系统资源浪费。
+
+某些服务很可能在很长一段时间内,甚至整个服务器运行期间都没有被使用过。比如CUPS,打印服务在多数服务器上很少被真正使用到。您可能没有想到,在很多服务器上SSHD也是很少被真正访问到的。花费在启动这些服务上的时间是不必要的;同样,花费在这些服务上的系统资源也是一种浪费。
+
+systemd可以提供按需启动的能力,只有在某个服务被真正请求的时候才启动它。当该服务结束,systemd可以关闭它,等待下次需要时再次启动它。
+
+### 采用cgroup特性跟踪和管理进程的生命周期
+
+init系统的一个重要职责就是负责跟踪和管理服务进程的生命周期。它不仅可以启动一个服务,也能够停止服务。这看上去没有什么特别的,然而在真正用代码实现的时候,您或许会发现停止服务比一开始想的要困难。
+
+服务进程一般都会作为守护进程(daemon)在后台运行,为此服务程序有时候会派生(fork)两次。在UpStart中,需要在配置文件中正确地配置expect小节。这样UpStart通过对fork系统调用进行计数,从而获知真正的精灵进程的PID号。
+
+cgroup已经出现了很久,它主要用来实现系统资源配额管理。cgroup提供了类似文件系统的接口,使用方便。当进程创建子进程时,子进程会继承父进程的cgroup。因此无论服务如何启动新的子进程,所有的这些相关进程都会属于同一个cgroup,systemd只需要简单地遍历指定的cgroup即可正确地找到所有的相关进程,将它们逐一停止即可。
+
+### 启动挂载点和自动挂载的管理
+
+传统的Linux系统中,用户可以用/etc/fstab文件来维护固定的文件系统挂载点。这些挂载点在系统启动过程中被自动挂载,一旦启动过程结束,这些挂载点就会确保存在。这些挂载点都是对系统运行至关重要的文件系统,比如HOME目录。和sysvinit一样,systemd管理这些挂载点,以便能够在系统启动时自动挂载它们。systemd还兼容/etc/fstab文件,您可以继续使用该文件管理挂载点。
+
+有时候用户还需要动态挂载点,比如打算访问DVD内容时,才临时执行挂载以便访问其中的内容,而不访问光盘时该挂载点被取消(umount),以便节约资源。传统地,人们依赖autofs服务来实现这种功能。
+
+systemd内建了自动挂载服务,无需另外安装autofs服务,可以直接使用systemd提供的自动挂载管理能力来实现autofs的功能。
+
+### 实现事务性依赖关系管理
+
+系统启动过程是由很多的独立工作共同组成的,这些工作之间可能存在依赖关系,比如挂载一个NFS文件系统必须依赖网络能够正常工作。systemd虽然能够最大限度地并发执行很多有依赖关系的工作,但是类似“挂载NFS”和“启动网络”这样的工作还是存在天生的先后依赖关系,无法并发执行。对于这些任务,systemd维护一个“事务一致性”的概念,保证所有相关的服务都可以正常启动而不会出现互相依赖,以至于死锁的情况。
+
+### 与SysV初始化脚本兼容
+
+和UpStart一样,systemd引入了新的配置方式,对应用程序的开发也有一些新的要求。如果systemd想替代目前正在运行的初始化系统,就必须和现有程序兼容。任何一个Linux发行版都很难为了采用systemd而在短时间内将所有的服务代码都修改一遍。
+
+systemd提供了和sysvinit以及LSB initscripts兼容的特性。系统中已经存在的服务和进程无需修改。这降低了系统向systemd迁移的成本,使得systemd替换现有初始化系统成为可能。
+
+### 能够对系统进行快照和恢复
+
+systemd支持按需启动,因此系统的运行状态是动态变化的,人们无法准确地知道系统当前运行了哪些服务。systemd快照提供了一种将当前系统运行状态保存并恢复的能力。
+
+比如系统当前正运行服务A和B,可以用systemd命令行对当前系统运行状况创建快照。然后将进程A停止,或者做其他的任意的对系统的改变,比如启动新的进程C。在这些改变之后,运行systemd的快照恢复命令,就可立即将系统恢复到快照时刻的状态,即只有服务A和B在运行。一个可能的应用场景是调试:比如服务器出现一些异常,为了调试用户将当前状态保存为快照,然后可以进行任意的操作,比如停止服务等等。等调试结束,恢复快照即可。
+
+## 管理系统服务
+
+systemd提供systemctl命令来运行、关闭、重启、显示、启用/禁用系统服务。
+
+### sysvinit命令和systemd命令
+
+systemd提供systemctl命令与sysvinit命令的功能类似。当前版本中依然兼容service和chkconfig命令,相关说明如[表3](#zh-cn_topic_0151920917_ta7039963b0c74b909b72c22cbc9f2e28),但建议用systemctl进行系统服务管理。
+
+**表 3** sysvinit命令和systemd命令的对照表
+
+
+ sysvinit命令
+
+ systemd命令
+
+ 备注
+
+
+
+ service network start
+
+ systemctl start network .service
+
+ 用来启动一个服务 (并不会重启现有的)。
+
+
+ service network stop
+
+ systemctl stop network .service
+
+ 用来停止一个服务 (并不会重启现有的)。
+
+
+ service network restart
+
+ systemctl restart network .service
+
+ 用来停止并启动一个服务。
+
+
+ service network reload
+
+ systemctl reload network .service
+
+ 当支持时,重新装载配置文件而不中断等待操作。
+
+
+ service network condrestart
+
+ systemctl condrestart network .service
+
+ 如果服务正在运行那么重启它。
+
+
+ service network status
+
+ systemctl status network .service
+
+ 检查 服务 的 运行 状态 。
+
+
+ chkconfig network on
+
+ systemctl enable network .service
+
+ 在下次启动时或满足其他触发条件时设置服务为启用。
+
+
+ chkconfig network off
+
+ systemctl disable network .service
+
+ 在下次启动时或满足其他触发条件时设置服务为禁用。
+
+
+ chkconfig network
+
+ systemctl is-enabled network .service
+
+ 用来检查一个服务在当前环境下被配置为启用还是禁用。
+
+
+ chkconfig --list
+
+ systemctl list-unit-files --type=service
+
+ 输出在各个运行级别下服务的启用和禁用情况。
+
+
+ chkconfig network --list
+
+ ls /etc/systemd/system/*.wants/ network .service
+
+ 用来列出该服务在哪些运行级别下启用和禁用。
+
+
+ chkconfig network --add
+
+ systemctl daemon-reload
+
+ 当您创建新服务文件或者变更设置时使用。
+
+
+
+
+
+### 显示所有当前服务
+
+如果您需要显示当前正在运行的服务,使用命令如下:
+
+```shell
+systemctl list-units --type service
+```
+
+如果您需要显示所有的服务(包括未运行的服务),需要添加-all参数,使用命令如下:
+
+```shell
+# systemctl list-units --type service --all
+```
+
+例如显示当前正在运行的服务,命令如下:
+
+```shell
+# systemctl list-units --type service
+UNIT LOAD ACTIVE SUB DESCRIPTION
+atd.service loaded active running Deferred execution scheduler
+auditd.service loaded active running Security Auditing Service
+avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
+chronyd.service loaded active running NTP client/server
+crond.service loaded active running Command Scheduler
+dbus.service loaded active running D-Bus System Message Bus
+dracut-shutdown.service loaded active exited Restore /run/initramfs on shutdown
+firewalld.service loaded active running firewalld - dynamic firewall daemon
+getty@tty1.service loaded active running Getty on tty1
+gssproxy.service loaded active running GSSAPI Proxy Daemon
+......
+```
+
+### 显示服务状态
+
+如果您需要显示某个服务的状态,可执行如下命令:
+
+```shell
+systemctl status name.service
+```
+
+相关状态显示参数说明如[表4](#zh-cn_topic_0151920917_t36cd267d69244ed39ae06bb117ed8e62)所示。
+
+**表 4** 状态参数说明
+
+
+ 参数
+
+ 描述
+
+
+
+ Loaded
+
+ 说明服务是否被加载,并显示服务对应的绝 对 路径以及是否启用。
+
+
+ Active
+
+ 说明服务是否正在运行,并显示时间节点。
+
+
+ Main PID
+
+ 相应的系统服务的PID值。
+
+
+ CGroup
+
+ 相关控制组(CGroup)的其他信息。
+
+
+
+
+
+如果您需要鉴别某个服务是否运行,可执行如下命令:
+
+```shell
+systemctl status name.service
+```
+
+is-active命令的返回结果如下:
+
+**表 5** is-active命令的返回结果
+
+
+ 状态
+
+ 含义
+
+
+
+ active(running)
+
+ 有一个或多个程序正在系统中执行。
+
+
+ active(exited)
+
+ 仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者 是挂载时才会进行一次的 quotaon 功能。
+
+
+ active(waiting)
+
+ 正在执行当中,不过要等待其他的事件才能继续处理。例如:打印的队列相关服务 就是这种状态,虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机 服务来进行下一步打印的功能
+
+
+ inactive
+
+ 这个服务没有运行
+
+
+
+
+
+同样,如果您需要判断某个服务是否被启用,可执行如下命令:
+
+```shell
+systemctl is-enabled name.service
+```
+
+is-enabled命令的返回结果如下:
+
+**表 6** is-enabled命令的返回结果
+
+
+ 状态
+
+ 含义
+
+
+
+ "enabled"
+
+ 已经通过 /etc/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软链接被永久启用。
+
+
+ "enabled-runtime"
+
+ 已经通过 /run/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软链接被临时启用。
+
+
+ "linked"
+
+ 虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软链接已经存在于 /etc/systemd/system/ 永久目录中。
+
+
+ "linked-runtime"
+
+ 虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软链接已经存在于 /run/systemd/system/ 临时目录中。
+
+
+ "masked"
+
+ 已经被 /etc/systemd/system/ 目录永久屏蔽(软链接指向 /dev/null 文件),因此 start 操作会失败。
+
+
+ "masked-runtime"
+
+ 已经被 /run/systemd/systemd/ 目录临时屏蔽(软链接指向 /dev/null 文件),因此 start 操作会失败。
+
+
+ "static"
+
+ 尚未被启用,并且单元文件的 "[Install]" 小节中没有可用于 enable 命令的选项。
+
+
+ "indirect"
+
+ 尚未被启用,但是单元文件的 "[Install]" 小节中 Also= 选项的值列表非空(也就是列表中的某些单元可能已被启用)、或者它拥有一个不在 Also= 列表中的其他名称的别名软链接。对于模版单元来说,表示已经启用了一个不同于 DefaultInstance= 的实例。
+
+
+ "disabled"
+
+ 尚未被启用,但是单元文件的 "[Install]" 小节中存在可用于 enable 命令的选项
+
+
+ "generated"
+
+ 单元文件是被单元生成器动态生成的。被生成的单元文件可能并未被直接启用,而是被单元生成器隐含的启用了。
+
+
+ "transient"
+
+ 单元文件是被运行时API动态临时生成的。该临时单元可能并未被启用。
+
+
+ "bad"
+
+ 单元文件不正确或者出现其他错误。 is-enabled 不会返回此状态,而是会显示一条出错信息。 list-unit-files 命令有可能会显示此单元。
+
+
+
+
+
+例如查看gdm.service服务状态,命令如下:
+
+```shell
+# systemctl status gdm.service
+gdm.service - GNOME Display Manager Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled) Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
+ Main PID: 1029 (gdm)
+ CGroup: /system.slice/gdm.service
+ ├─1029 /usr/sbin/gdm
+ ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...
+ └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.
+```
+
+### 运行服务
+
+如果您需要运行某个服务,请在root权限下执行如下命令:
+
+```shell
+systemctl start name.service
+```
+
+例如运行httpd服务,命令如下:
+
+```shell
+# systemctl start httpd.service
+```
+
+### 关闭服务
+
+如果您需要关闭某个服务,请在root权限下执行如下命令:
+
+```shell
+systemctl stop name.service
+```
+
+例如关闭蓝牙服务,命令如下:
+
+```shell
+# systemctl stop bluetooth.service
+```
+
+### 重启服务
+
+如果您需要重启某个服务,请在root权限下执行如下命令:
+
+```shell
+systemctl restart name.service
+```
+
+执行命令后,当前服务会被关闭,但马上重新启动。如果您指定的服务,当前处于关闭状态,执行命令后,服务也会被启动。
+
+例如重启蓝牙服务,命令如下:
+
+```shell
+# systemctl restart bluetooth.service
+```
+
+### 启用服务
+
+如果您需要在开机时启用某个服务,请在root权限下执行如下命令:
+
+```shell
+systemctl enable name.service
+```
+
+例如设置httpd服务开机时启动,命令如下:
+
+```shell
+# systemctl enable httpd.service
+ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
+```
+
+### 禁用服务
+
+如果您需要在开机时禁用某个服务,请在root权限下执行如下命令:
+
+```shell
+systemctl disable name.service
+```
+
+例如在开机时禁用蓝牙服务启动,命令如下:
+
+```shell
+# systemctl disable bluetooth.service
+Removed /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
+Removed /etc/systemd/system/dbus-org.bluez.service.
+```
+
+## 改变运行级别
+
+### Target和运行级别
+
+systemd用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其他服务,来创建自己的目标。[表7](#zh-cn_topic_0151920939_t9af92c282ad240ea9a79fb08d26e8181)列举了systemd下的目标和常见runlevel的对应关系。
+
+**表 7** 运行级别和systemd目标
+
+
+ 运行级别
+
+ systemd目标(target)
+
+ 描述
+
+
+
+ 0
+
+ runlevel0.target,poweroff.target
+
+ 关闭系统。
+
+
+ 1 , s, single
+
+ runlevel1.target,rescue.target
+
+ 单用户模式。
+
+
+ 2 , 4
+
+ runlevel2.target, runlevel4.target, multi-user.target
+
+ 用户定义/域特定运行级别。默认等同于3。
+
+
+ 3
+
+ runlevel3.target,multi-user.target
+
+ 多用户,非图形化。用户可以通过多个控制台或网络登录。
+
+
+ 5
+
+ runlevel5.target,graphical.target
+
+ 多用户,图形化。通常为所有运行级别3的服务外加图形化登录。
+
+
+ 6
+
+ runlevel6.target,reboot.target
+
+ 重启系统。
+
+
+ emergency
+
+ emergency.target
+
+ 紧急Shell。
+
+
+
+
+
+### 查看系统默认启动目标
+
+查看当前系统默认的启动目标,命令如下:
+
+```shell
+systemctl get-default
+```
+
+### 查看当前系统所有的启动目标
+
+查看当前系统所有的启动目标,命令如下:
+
+```shell
+systemctl list-units --type=target
+```
+
+### 改变默认目标
+
+改变系统默认的目标,在root权限下执行如下命令:
+
+```shell
+systemctl set-default name.target
+```
+
+### 改变当前目标
+
+改变当前系统的目标,在root权限下执行如下命令:
+
+```shell
+systemctl isolate name.target
+```
+
+### 切换到救援模式
+
+改变当前系统为救援模式,在root权限下执行如下命令:
+
+```shell
+systemctl rescue
+```
+
+这条命令和“systemctl isolate rescue.target”类似。命令执行后会在串口有如下打印信息:
+
+```shell
+You are in rescue mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
+Give root password for maintenance
+(or press Control-D to continue):
+```
+
+> **说明:**
+>从救援模式进入正常模式,用户需要重启系统。
+
+### 切换到紧急模式
+
+改变当前系统为紧急模式,在root权限下执行如下命令:
+
+```shell
+systemctl emergency
+```
+
+这条命令和“systemctl isolate emergency.target”类似。命令执行后会在串口有如下打印信息:
+
+```shell
+You are in emergency mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
+Give root password for maintenance
+(or press Control-D to continue):
+```
+
+> **说明:**
+>从紧急模式进入正常模式,用户需要重启系统。
+
+## 关闭、暂停和休眠系统
+
+### systemctl命令
+
+systemd通过systemctl命令可以对系统进行关机、重启、休眠等一系列操作。当前仍兼容部分Linux常用管理命令,对应关系如[表8](#zh-cn_topic_0151920964_t3daaaba6a03b4c36be9668efcdb61f3b)。建议用户使用systemctl命令进行操作。
+
+**表 8** 命令对应关系
+
+
+ Linux常用管理 命令
+
+ systemctl命令
+
+ 描述
+
+
+
+ halt
+
+ systemctl halt
+
+ 关闭系统
+
+
+ poweroff
+
+ systemctl poweroff
+
+ 关闭电源
+
+
+ reboot
+
+ systemctl reboot
+
+ 重启
+
+
+
+
+
+### 关闭系统
+
+关闭系统并下电,在root权限下执行如下命令:
+
+```shell
+systemctl poweroff
+```
+
+关闭系统但不下电机器,在root权限下执行如下命令:
+
+```shell
+systemctl halt
+```
+
+执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“--no-wall”参数。具体命令如下:
+
+```shell
+systemctl --no-wall poweroff
+```
+
+### 重启系统
+
+重启系统,在root权限下执行如下命令:
+
+```shell
+systemctl reboot
+```
+
+执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“--no-wall”参数。具体命令如下:
+
+```shell
+systemctl --no-wall reboot
+```
+
+### 使系统待机
+
+使系统待机,在root权限下执行如下命令:
+
+```shell
+systemctl suspend
+```
+
+### 使系统休眠
+
+使系统休眠,在root权限下执行如下命令:
+
+```shell
+systemctl hibernate
+```
+
+使系统待机且处于休眠状态,在root权限下执行如下命令:
+
+```shell
+systemctl hybrid-sleep
+```
diff --git a/docs/en/25.03/Server/Administration/Administrator/setting-up-the-database-server.md b/docs/en/25.03/Server/Administration/Administrator/setting-up-the-database-server.md
new file mode 100644
index 0000000000000000000000000000000000000000..3ac924ff2042ddcc1e367eebfb0cd3fdcbbc7432
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/setting-up-the-database-server.md
@@ -0,0 +1,2134 @@
+# 搭建数据库服务器
+
+## PostgreSql服务器
+
+### 软件介绍
+
+PostgreSQL的架构如[图1](#fig26022387391)所示,主要进程说明如[表1](#table62020913417)所示。
+
+**图 1** PostgreSql架构
+
+
+**表 1** PostgreSql中的主要进程说明
+
+
+ 进程类别
+
+ 进程名称
+
+ 说明
+
+
+
+ 主进程
+
+ Postmaster
+
+ Postmaster是整个数据库实例的总控进程,负责启动和关闭该数据库实例。
+
+
+ 常驻进程
+
+ Postgres(常驻进程)
+
+ 管理后端的常驻进程,也称为“postmaster”。其默认侦听UNIXDomain Socket和TCP/IP(Windows等,一部分的平台只侦听TCP/IP)的5432端口,等待来自前端的连接处理。侦听的端口号可以在PostgreSql的设置文件postgresql.conf中修改。
+
+
+ 子进程
+
+ Postgres(子进程)
+
+ 子进程根据pg_hba.conf定义的安全策略来判断是否允许进行连接,根据策略,会拒绝某些特定的IP及网络,或者也可以只允许某些特定的用户或者对某些数据库进行连接。
+ Postgres会接受前端过来的查询,然后对数据库进行检索,最后把结果返回,有时也会对数据库进行更新。更新的数据同时还会记录在事务日志里面(PostgreSQL称为WAL日志)。这个主要是当停电、服务器宕机、重新启动的时候进行恢复处理的时候使用。另外,把日志归档保存起来,可在需要进行恢复的时候使用。在PostgreSQL 9.0以后,通过把WAL日志传送其他的postgreSQL,可以实时的进行数据库复制,这就是所谓的“数据库复制”功能。
+
+
+ 辅助进程
+
+ SysLogger(系统日志)
+
+ 需要在Postgres.conf中logging_collection设置为on,此时主进程才会启动Syslogger辅助进程。
+
+
+ BgWriter(后台写)
+
+ 把共享内存中的脏页写到磁盘上的进程。主要是为了提高插入、更新和删除数据的性能。
+
+
+ WALWriter(预写式日志)
+
+ 在修改数据之前把修改操作记录到磁盘中,以便后面更新实时数据时就不需要数据持久化到文件中。
+
+
+ PgArch(归档)
+
+ WAL日志会被循环使用,PgArch在归档前会把WAL日志备份出来。通过PITY(Point in Time Recovery)技术,可以在数据库进行一次全量备份后,将全量备份时间点之后的WAL日志通过归档进行备份,然后凭借数据库的全量备份再加上后面产生的WAL日志,即可把数据库向前推到全量备份后的任意一个时间点。
+
+
+ AutoVacuum(系统自动清理)
+
+ 在PostgreSQL数据库中,对表进行DELETE操作后,旧的数据并不会立即被删除,并且,在更新数据时,也并不会在旧的数据上做更新,而是新生成一行数据。旧的数据只是被标识为删除状态,只有在没有并发的其他事务读到这些就数据时,它们才会被清除。这个清除工作就由AutoVacuum进程完成。
+
+
+ PgStat(统计收集)
+
+ 做数据的统计收集工作。主要用于查询优化时的代价估算,包括一个表和索引进行了多少次的插入、更新、删除操作,磁盘块读写的次数、行的读次数。pg_statistic中存储了PgStat收集的各类信息。
+
+
+ CheckPoint(检查点)
+
+ 检查点是系统设置的事务序列点,设置检查点保证检查点前的日志信息刷到磁盘中。
+
+
+
+
+
+### 配置环境
+
+>  **说明:**
+> 以下环境配置仅为参考示例,具体配置视实际需求做配置。
+
+#### 关闭防火墙并取消开机自启动
+
+>  **说明:**
+> 测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。
+
+1. 在root权限下停止防火墙。
+
+ ```shell
+ systemctl stop firewalld
+ ```
+
+2. 在root权限下关闭防火墙。
+
+ ```shell
+ systemctl disable firewalld
+ ```
+
+ >  **说明:**
+ > 执行disable命令关闭防火墙的同时,也取消了开机自启动。
+
+#### 修改SELINUX为disabled
+
+在root权限下修改配置文件。
+
+```shell
+sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
+```
+
+#### 创建组和用户
+
+>  **说明:**
+> 服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。
+
+1. 在root权限下创建PostgreSQL用户(组)。
+
+ ```shell
+ groupadd postgres
+ useradd -g postgres postgres
+ ```
+
+2. 在root权限下设置postgres用户密码(重复输入密码)。
+
+ ```shell
+ passwd postgres
+ ```
+
+#### 搭建数据盘
+
+>  **说明:**
+> 测试极限性能时,建议单独挂载IO性能更优的NVME SSD存储介质创建PostgreSQL测试实例,避免磁盘IO对性能测试结果的影响,本文以单独挂载NVME SSD为例,参考步骤1\~步骤4。
+> 非性能测试时,在root权限下执行以下命令,创建数据目录即可。然后跳过本小节:`mkdir /data`
+
+1. 在root权限下创建文件系统(以xfs为例,根据实际需求创建文件系统),若磁盘之前已做过文件系统,执行此命令会出现报错,可使用-f参数强制创建文件系统。
+
+ ```shell
+ mkfs.xfs /dev/nvme0n1
+ ```
+
+2. 在root权限下创建数据目录。
+
+ ```shell
+ mkdir /data
+ ```
+
+3. 在root权限下挂载磁盘。
+
+ ```shell
+ mount -o noatime,nobarrier /dev/nvme0n1 /data
+ ```
+
+#### 数据目录授权
+
+1. 在root权限下修改目录权限。
+
+ ```shell
+ chown -R postgres:postgres /data/
+ ```
+
+### 安装、运行和卸载
+
+#### 安装
+
+1. 配置本地yum源,详细信息请参考[搭建repo服务器](./configuring-the-repo-server.md)。
+2. 清除缓存。
+
+ ```shell
+ dnf clean all
+ ```
+
+3. 创建缓存。
+
+ ```shell
+ dnf makecache
+ ```
+
+4. 在root权限下安装PostgreSQL服务器。
+
+ ```shell
+ dnf install postgresql-server
+ ```
+
+5. 查看安装后的rpm包。
+
+ ```shell
+ rpm -qa | grep postgresql
+ ```
+
+#### 运行
+
+##### 初始化数据库
+
+>  **须知:**
+> 此步骤在postgres用户下操作。
+
+1. 切换到已创建的PostgreSQL用户。
+
+ ```shell
+ su - postgres
+ ```
+
+2. 初始化数据库,其中命令中的/usr/bin是命令initdb所在的目录。
+
+ ```shell
+ usr/bin/initdb -D /data/
+ ```
+
+##### 启动数据库
+
+1. 启动PostgreSQL数据库。
+
+ ```shell
+ /usr/bin/pg_ctl -D /data/ -l /data/logfile start
+ ```
+
+2. 确认PostgreSQL数据库进程是否正常启动。
+
+ ```shell
+ ps -ef | grep postgres
+ ```
+
+ 命令执行后,打印信息如下图所示,PostgreSQL相关进程已经正常启动了。
+
+ 
+
+##### 登录数据库
+
+1. 登录数据库。
+
+ ```shell
+ /usr/bin/psql -U postgres
+ ```
+
+ 
+
+ >  **说明:**
+ > 初次登录数据库,无需密码。
+
+##### 配置数据库帐号密码
+
+1. 登录后,设置postgres密码。
+
+ ```shell
+ postgres=#alter user postgres with password '123456';
+ ```
+
+ 
+
+##### 退出数据库
+
+1. 执行\\q退出数据库。
+
+ ```shell
+ postgres=#\q
+ ```
+
+##### 停止数据库
+
+1. 停止PostgreSQL数据库。
+
+ ```shell
+ /usr/bin/pg_ctl -D /data/ -l /data/logfile stop
+ ```
+
+#### 卸载
+
+1. 在postgres用户下停止数据库。
+
+ ```shell
+ /usr/bin/pg_ctl -D /data/ -l /data/logfile stop
+ ```
+
+2. 在root用户下执行**dnf remove postgresql-server**卸载PostgreSQL数据库。
+
+ ```shell
+ dnf remove postgresql-server
+ ```
+
+### 管理数据库角色
+
+#### 创建角色
+
+可以使用CREATE ROLE语句或createuser来创建角色。createuser是对CREATE ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
+
+```shell
+CREATE ROLE rolename [ [ WITH ] option [ ... ] ];
+```
+
+```shell
+createuser rolename
+```
+
+其中:
+
+- rolename:角色名。
+- option为参数选项,常用的有:
+ - SUPERUSER | NOSUPERUSER:决定一个新角色是否为"超级用户",若未指定,则默认为NOSUPERUSER,即不是超级用户。
+ - CREATEDB | NOCREATEDB:定义一个角色是否能创建数据库,若未指定,则默认为NOCREATEDB,即不能创建数据库。
+ - CREATEROLE | NOCREATEROLE:决定一个角色是否可以创建新角色,若未指定,则默认为NOCREATEROLE,即不能创建新角色。
+ - INHERIT | NOINHERIT:决定一个角色是否"继承"它所在组的角色的权限。一个带有 INHERIT 属性的角色可以自动使用已经赋与它直接或间接所在组的任何权限。若未指定,则默认为INHERIT。
+ - LOGIN | NOLOGIN:决定一个角色是否可以登录,一个拥有LOGIN属性的角色可以认为是一个用户,若无此属性的角色可以用于管理数据库权限,但是并不是用户,若未指定,则默认为NOLOGIN。但若创建角色是使用的是CREATE USER而不是CREATE ROLE,则默认是LOGIN属性。
+ - \[ ENCRYPTED | UNENCRYPTED \] PASSWORD 'password':设置角色的密码,密码只对那些拥有 LOGIN 属性的角色有意义。ENCRYPTED | UNENCRYPTED表示是否对密码进行加密,若未指定,则默认为ENCRYPTED,即加密。
+ - VALID UNTIL 'timestamp':角色的密码失效的时间戳,若为指定,则表示密码永久有效。
+ - IN ROLE rolename1:列出一个或多个现有的角色,新角色rolename将立即加入这些角色,成为rolename1的成员。
+ - ROLE rolename2:列出一个或多个现有的角色,它们将自动添加为新角色rolename的成员,即新角色为"组"。
+
+要使用这条命令,必须拥有 CREATEROLE 权限或者是数据库超级用户。
+
+##### 示例
+
+创建一个可以登录的角色roleexample1。
+
+```shell
+postgres=# CREATE ROLE roleexample1 LOGIN;
+```
+
+创建一个密码为123456的角色roleexample2。
+
+```shell
+postgres=# CREATE ROLE roleexample2 WITH LOGIN PASSWORD '123456';
+```
+
+创建角色名为roleexample3的角色。
+
+```shell
+[postgres@localhost ~]# createuser roleexample3
+```
+
+#### 查看角色
+
+可以使用SELECT语句或psql的元命令\\du查看角色。
+
+```shell
+SELECT rolename FROM pg_roles;
+```
+
+```shell
+\du
+```
+
+其中:rolename:角色名。
+
+##### 示例
+
+查看roleexample1角色。
+
+```shell
+postgres=# SELECT roleexample1 from pg_roles;
+```
+
+查看现有角色。
+
+```shell
+postgres=# \du
+```
+
+#### 修改角色
+
+##### 修改用户名
+
+可以使用ALTER ROLE语句修改一个已经存在的角色名。
+
+```shell
+ALTER ROLE oldrolername RENAME TO newrolename;
+```
+
+其中:
+
+- oldrolername:旧的角色名。
+- newrolename:新的角色名。
+
+##### 修改用户示例
+
+将角色名roleexample1修改为roleexapme2。
+
+```shell
+postgres=# ALTER ROLE roleexample1 RENAME TO roleexample2;
+```
+
+##### 修改用户密码
+
+可以使用ALTER ROLE语句修改一个角色的登录密码。
+
+```shell
+ALTER ROLE rolename PASSWORD 'password'
+```
+
+其中:
+
+- rolename:角色名。
+- password:密码。
+
+##### 修改角色密码示例
+
+将roleexample1的密码修改为456789。
+
+```shell
+postgres=# ALTER ROLE roleexample1 WITH PASSWORD '456789';
+```
+
+#### 删除角色
+
+可以使用DROP ROLE语句或dropuser来删除角色。dropuser是对DROP ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
+
+```shell
+DROP ROLE rolename;
+```
+
+```shell
+dropuser rolename
+```
+
+其中:rolename为角色名。
+
+##### 示例
+
+删除userexample1角色。
+
+```shell
+postgres=# DROP ROLE userexample1;
+```
+
+删除userexample2角色。
+
+```shell
+[postgres@localhost ~]# dropuser userexample2
+```
+
+#### 角色授权
+
+可以使用GRANT语句来对角色授权。
+
+对角色授予表的操作权限:
+
+```shell
+GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+```
+
+对角色授予序列的操作权限:
+
+```shell
+GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+```
+
+对角色授予数据库的操作权限:
+
+```shell
+GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+```
+
+对角色授予函数的操作权限:
+
+```shell
+GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+```
+
+对角色授予过程语言的操作权限:
+
+```shell
+GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+```
+
+对角色授予模式的操作权限:
+
+```shell
+GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+```
+
+对角色授予表空间的操作权限:
+
+```shell
+GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
+```
+
+将角色rolename1的成员关系赋予角色rolename2:
+
+```shell
+GRANT rolename1 [, ...] TO rolename2 [, ...] [ WITH ADMIN OPTION ]
+```
+
+其中:
+
+- SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL \[ PRIVILEGES \]:用户的操作权限,ALL \[ PRIVILEGES \]表示所有的权限,PRIVILEGES关键字在 PostgreSQL里是可选的,但是严格的SQL 要求有这个关键字。
+- ON字句:用于指定权限授予的对象。
+- tablename:表名。
+- TO字句:用来指定被赋予权限的角色。
+- rolename、rolename1、rolename2:角色名。
+- groupname:角色组名。
+- PUBLIC:表示该权限要赋予所有角色,包括那些以后可能创建的用户。
+- WITH GRANT OPTION:表示权限的接收者也可以将此权限赋予他人,否则就不能授权他人。该选项不能赋予给PUBLIC。
+- sequencename:序列名。
+- databasename:数据库名。
+- funcname \( \[ \[ argmode \] \[ argname \] argtype \[, ...\] \] \):函数名及其参数。
+- langname:过程语言名。
+- schemaname:模式名。
+- tablespacename:表空间名。
+- WITH ADMIN OPTION:表示成员随后就可以将角色的成员关系赋予其他角色,以及撤销其他角色的成员关系。
+
+##### 示例
+
+对userexample授予数据库database1的CREATE权限。
+
+```shell
+postgres=# GRANT CREATE ON DATABASE database1 TO userexample;
+```
+
+对所有用户授予表table1的所有权限。
+
+```shell
+postgres=# GRANT ALL PRIVILEGES ON TABLE table1 TO PUBLIC;
+```
+
+#### 删除用户权限
+
+可以使用REVOKE语句来撤销以前赋予一个或多个角色的权限。
+
+撤销角色对表的操作权限:
+
+```shell
+REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...]
+```
+
+撤销角色对序列的操作权限:
+
+```shell
+REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
+```
+
+撤销角色对数据库的操作权限:
+
+```shell
+REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
+```
+
+撤销角色对函数的操作权限:
+
+```shell
+REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
+```
+
+撤销角色对过程语言的操作权限:
+
+```shell
+REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
+```
+
+撤销角色对模式的操作权限:
+
+```shell
+REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
+```
+
+撤销角色对表空间的操作权限:
+
+```shell
+REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
+```
+
+删除rolename2的rolename1的成员关系:
+
+```shell
+REVOKE [ ADMIN OPTION FOR ] rolename1 [, ...] FROM rolename2 [, ...] [ CASCADE | RESTRICT ]
+```
+
+其中:
+
+- GRANT OPTION FOR:表示只是撤销对该权限的授权的权力,而不是撤销该权限本身。
+- SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL \[ PRIVILEGES \]:用户的操作权限,ALL \[ PRIVILEGES \]表示所有的权限,PRIVILEGES关键字在 PostgreSQL里是可选的,但是严格的SQL 要求有这个关键字。
+- ON字句:用于指定撤销权限的对象。
+- tablename:表名。
+- FROM字句:用来指定被撤销权限的角色。
+- rolename、rolename1、rolename2:角色名。
+- groupname:角色组名。
+- PUBLIC:表示撤销隐含定义的、拥有所有角色的组,但并不意味着所有角色都失去了权限,那些直接得到的权限以及通过一个组得到的权限仍然有效。
+- sequencename:序列名。
+- CASCADE:撤销所有依赖性权限。
+- RESTRICT:不撤销所有依赖性权限。
+- databasename:数据库名。
+- funcname \( \[ \[ argmode \] \[ argname \] argtype \[, ...\] \] \):函数名及其参数。
+- langname:过程语言名。
+- schemaname:模式名。
+- tablespacename:表空间名。
+- ADMIN OPTION FOR:表示传递的授权不会自动收回。
+
+##### 示例
+
+对userexample授予数据库database1的CREATE权限。
+
+```shell
+postgres=# GRANT CREATE ON DATABASE database1 TO userexample;
+```
+
+对所有用户授予表table1的所有权限。
+
+```shell
+postgres=# GRANT ALL PRIVILEGES ON TABLE table1 TO PUBLIC;
+```
+
+### 管理数据库
+
+#### 创建数据库
+
+可以使用CREATE DATABASE语句或createdb来创建数据库。createrdb是对CREATE DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。
+
+```shell
+CREATE DATABASE databasename;
+```
+
+```shell
+createdb databasename
+```
+
+其中:databasename为数据库名。
+
+要使用这条命令,必须拥有CREATEDB权限。
+
+##### 示例
+
+创建一个数据库database1。
+
+```shell
+postgres=# CREATE DATABASE database1;
+```
+
+#### 选择数据库
+
+可以使用\\c语句来选择数据库。
+
+```shell
+\c databasename;
+```
+
+其中:databasename为数据库名称。
+
+##### 示例
+
+选择databaseexample数据库。
+
+```shell
+postgres=# \c databaseexample;
+```
+
+#### 查看数据库
+
+可以使用\\l语句来查看数据库。
+
+```shell
+\l;
+```
+
+##### 示例
+
+查看所有数据库。
+
+```shell
+postgres=# \l;
+```
+
+#### 删除数据库
+
+可以使用DROP DATABASE语句或dropdb来删除数据库。dropdb是对DROP DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。
+
+>  **注意:**
+> 删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
+
+```shell
+DROP DATABASE databasename;
+```
+
+```shell
+dropdb databasename
+```
+
+其中:databasename为数据库名称。
+
+DROP DATABASE会删除数据库的系统目录项并且删除包含数据的文件目录。
+
+DROP DATABASE只能由超级管理员或数据库拥有者执行。
+
+##### 示例
+
+删除databaseexample数据库。
+
+```shell
+postgres=# DROP DATABASE databaseexample;
+```
+
+#### 备份数据库
+
+可以使用pg\_dump命令备份数据库,将数据库转储到一个脚本文件或其他归档文件中。
+
+```shell
+pg_dump [option]... [databasename] > outfile
+```
+
+其中:
+
+- databasename:数据库名称。如果没有声明这个参数,那么使用环境变量 PGDATABASE 。如果那个环境变量也没声明,那么使用发起连接的用户名。
+- outfile:数据库备份的文件。
+- option:pg\_dump命令参数选项,多个参数之间可以使用空格分隔。常用的pg\_dump命令参数选项如下:
+ - -f,\-\-file= _filename_ :指输出到指定的文件。如果忽略,则使用标准输出。
+ - -d,\-\-dbname= _databasename_ :指定转储的数据库。
+ - -h,\-\-host= _hostname_ :指定主机名。
+ - -p,\-\-port= _portnumber_ :指定端口。
+ - -U,\-\-username= _username_ :指定连接的用户名。
+ - -W,\-\-password:强制口令提示(自动)。
+
+##### 示例
+
+备份主机为192.168.202.144,端口为3306,postgres用户下的database1数据库到db1.sql中。
+
+```shell
+[postgres@localhost ~]# pg_dump -h 192.168.202.144 -p 3306 -U postgres -W database1 > db1.sql
+```
+
+#### 恢复数据库
+
+可以使用psql命令恢复数据库。
+
+```shell
+psql [option]... [databasename [username]] < infile
+```
+
+其中:
+
+- databasename:数据库名称。如果没有声明这个参数,那么使用环境变量 PGDATABASE 。如果那个环境变量也没声明,那么使用发起连接的用户名。
+- username:用户名。
+- infile:pg\_dump命令中的outfile参数。
+- option:psql命令参数选项,多个参数之间可以使用空格分隔。常用的psql命令参数选项如下:
+ - -f,--file=filename:指输出到指定的文件。如果忽略,则使用标准输出。
+ - -d,--dbname=databasename:指定转储的数据库。
+ - -h,--host=hostname:指定主机名。
+ - -p,--port=portnumber:指定端口。
+ - -U,--username=username:指定连接的用户名。
+ - -W,--password:强制口令提示(自动)。
+
+psql命令不会自动创建databasename数据库,所以在执行psql恢复数据库之前需要先创建databasename数据库。
+
+##### 示例
+
+将db1.sql脚本文件导入到主机为192.168.202.144,端口为3306,postgres用户下newdb数据库中。
+
+```shell
+[postgres@localhost ~]# createdb newdb
+[postgres@localhost ~]# psql -h 192.168.202.144 -p 3306 -U postgres -W -d newdb < db1.sql
+```
+
+## Mariadb服务器
+
+### 软件介绍
+
+MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品,MariaDB还提供了许多更好的新特性。
+
+MariaDB的架构如[图2](#fig13492418164520)所示。
+
+**图 2** MariaDB逻辑架构
+
+
+当Mariadb接受到Sql语句时,其详细的执行过程如下:
+
+1. 当客户端连接到mariadb的时候,会认证客户端的主机名、用户、密码,认证功能可以做成插件。
+2. 如果登录成功,客户端发送sql命令到服务端。由解析器解析sql语句。
+3. 服务端检查客户端是否有权限去获取它想要的资源。
+4. 如果查询已经存储在query cache当中,那么结果立即返回。
+5. 优化器将会找出最快的执行策略,或者是执行计划,也就是说优化器可以决定什么表将会被读,以及哪些索引会被访问,哪些临时表会被使用,一个好的策略能够减少大量的磁盘访问和排序操作等。
+6. 存储引擎读写数据和索引文件,cache用来加速这些操作,其他的诸如事物和外键特性,都是在存储引擎层处理的。
+
+存储引擎在物理层管控数据,它负责数据文件、数据、索引、cache等的管理,这使得管理和读取数据变得更高效,每一张表,都有一个.frm文件,这些文件包含着表的定义。
+
+每一个存储引擎管理、存储数据的方式都是不同的,所支持的特性和性能也不尽相同。例如:
+
+- MyISAM,适合读多写少的环境,且不支持事务,支持全文索引等。
+- noDB,支持事务,支持行锁和外键等。
+- MEMORY,将数据存储在内存当中。
+- CSV,将数据存储为CSV格式。
+
+### 配置环境
+
+>  **说明:**
+> 以下环境配置仅为参考示例,具体配置视实际需求做配置
+
+#### 关闭防火墙并取消开机自启动
+
+>  **说明:**
+> 测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。
+
+1. 在root权限下停止防火墙。
+
+ ```shell
+ systemctl stop firewalld
+ ```
+
+2. 在root权限下关闭防火墙。
+
+ ```shell
+ systemctl disable firewalld
+ ```
+
+ >  **说明:**
+ > 执行disable命令关闭防火墙的同时,也取消了开机自启动。
+
+#### 修改SELINUX为disabled
+
+1. 在root权限下修改配置文件。
+
+ ```shell
+ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
+ ```
+
+#### 创建组和用户
+
+>  **说明:**
+> 服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。
+
+1. 在root权限下创建MySQL用户(组)。
+
+ ```shell
+ groupadd mysql
+ ```
+
+ ```shell
+ useradd -g mysql mysql
+ ```
+
+2. 在root权限下设置MySQL用户密码。
+
+ ```shell
+ passwd mysql
+ ```
+
+ 重复输入密码(根据实际需求设置密码)。
+
+#### 搭建数据盘
+
+>  **说明:**
+> 进行性能测试时,数据目录使用单独硬盘,需要对硬盘进行格式化并挂载,参考方法一或者方法二。
+> 非性能测试时,在root权限下执行`mkdir /data`创建数据目录即可。然后跳过本小节。
+
+##### 方法一:在root权限下使用fdisk进行磁盘管理
+
+1. 创建分区(以/dev/sdb为例,根据实际情况创建)
+
+ ```shell
+ fdisk /dev/sdb
+ ```
+
+2. 输入n,按回车确认。
+3. 输入p,按回车确认。
+4. 输入1,按回车确认。
+5. 采用默认配置,按回车确认。
+6. 采用默认配置,按回车确认。
+7. 输入w,按回车保存。
+8. 创建文件系统(以xfs为例,根据实际需求创建文件系统)
+
+ ```shell
+ mkfs.xfs /dev/sdb1
+ ```
+
+9. 挂载分区到“/data”以供操作系统使用。
+
+ ```shell
+ mkdir /data
+ ```
+
+ ```shell
+ mount /dev/sdb1 /data
+ ```
+
+10. 执行命令“vi /etc/fstab", 编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
+
+ 其中,/dev/nvme0n1p1为示例,具体名称以实际情况为准。
+
+ 
+
+##### 方法二:在root权限下使用LVM进行磁盘管理
+
+>  **说明:**
+> 此步骤需要安装镜像中的lvm2相关包,步骤如下:
+>(1)配置本地yum源,详细信息请参考[搭建repo服务器](./configuring-the-repo-server.md)。如果已经执行,则可跳过此步。
+>(2)在root权限下执行`yum install lvm2`命令安装lvm2。
+
+1. 创建物理卷(sdb为硬盘名称,具体名字以实际为准)。
+
+ ```shell
+ pvcreate /dev/sdb
+ ```
+
+2. 创建物理卷组(其中datavg为创建的卷组名称,具体名字以实际规划为准)。
+
+ ```shell
+ vgcreate datavg /dev/sdb
+ ```
+
+3. 创建逻辑卷(其中600G为规划的逻辑卷大小,具体大小以实际情况为准;datalv为创建的逻辑卷的名字,具体名称以实际规划为准。)。
+
+ ```shell
+ lvcreate -L 600G -n datalv datavg
+ ```
+
+4. 创建文件系统。
+
+ ```shell
+ mkfs.xfs /dev/datavg/datalv
+ ```
+
+5. 创建数据目录并挂载。
+
+ ```shell
+ mkdir /data
+ mount /dev/datavg/datalv /data
+ ```
+
+6. 执行命令**vi /etc/fstab**,编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
+
+ 其中,/dev/datavg/datalv为示例,具体名称以实际情况为准。
+
+ 
+
+#### 创建数据库目录并且授权
+
+1. 在已创建的数据目录 **/data** 基础上,使用root权限继续创建进程所需的相关目录并授权MySQL用户(组)。
+
+ ```shell
+ mkdir -p /data/mariadb
+ cd /data/mariadb
+ mkdir data tmp run log
+ chown -R mysql:mysql /data
+ ```
+
+### 安装、运行和卸载
+
+#### 安装
+
+1. 配置本地yum源,详细信息请参考[搭建repo服务器](./configuring-the-repo-server.md)。
+2. 清除缓存。
+
+ ```shell
+ dnf clean all
+ ```
+
+3. 创建缓存。
+
+ ```shell
+ dnf makecache
+ ```
+
+4. 在root权限下安装mariadb服务器。
+
+ ```shell
+ dnf install mariadb-server
+ ```
+
+5. 查看安装后的rpm包。
+
+ ```shell
+ rpm -qa | grep mariadb
+ ```
+
+#### 运行
+
+1. 在root权限下开启mariadb服务器。
+
+ ```shell
+ systemctl start mariadb
+ ```
+
+2. 在root权限下初始化数据库。
+
+ ```shell
+ /usr/bin/mysql_secure_installation
+ ```
+
+ 命令执行过程中需要输入数据库的root设置的密码,若没有密码则直接按“Enter”。然后根据提示及实际情况进行设置。
+
+3. 登录数据库。
+
+ ```shell
+ mysql -u root -p
+ ```
+
+ 命令执行后提示输入密码。密码为[2](#li197143190587)中设置的密码。
+
+ >  **说明:**
+ > 执行 **\\q** 或者 **exit** 可退出数据库。
+
+#### 卸载
+
+1. 在root权限下关闭数据库进程。
+
+ ```shell
+ ps -ef | grep mysql
+ kill -9 进程ID
+ ```
+
+2. 在root权限下执行**dnf remove mariadb-server**命令卸载mariadb。
+
+ ```shell
+ dnf remove mariadb-server
+ ```
+
+### 管理数据库用户
+
+#### 创建用户
+
+可以使用CREATE USER语句来创建一个或多个用户,并设置相应的口令。
+
+```shell
+CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';
+```
+
+其中:
+
+- username:用户名。
+- host:主机名,即用户连接数据库时所在的主机的名字。若是本地用户可用localhost,若在创建的过程中,未指定主机名,则主机名默认为“%”,表示一组主机。
+- password:用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器,但从安全的角度而言,不推荐这种做法。
+
+使用CREATE USER语句必须拥有数据库的INSERT权限或全局CREATE USER权限。
+
+使用CREATE USER语句创建一个用户帐号后,会在系统自身的数据库的user表中添加一条新记录。若创建的帐户已经存在,则语句执行时会出现错误。
+
+新创建的用户拥有的权限很少,只允许进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。
+
+##### 示例
+
+创建密码为123456,用户名为userexample1的本地用户。
+
+```shell
+> CREATE USER 'userexample1'@'localhost' IDENTIFIED BY '123456';
+```
+
+创建密码为123456,用户名为userexample2,主机名为192.168.1.100的用户。
+
+```shell
+> CREATE USER 'userexample2'@'192.168.1.100' IDENTIFIED BY '123456';
+```
+
+#### 查看用户
+
+可以使用SHOW GRANTS语句或SELECT语句查看一个或多个用户。
+
+查看特定用户:
+
+```shell
+SHOW GRANTS [FOR 'username'@'hostname'];
+```
+
+```shell
+SELECT USER,HOST,PASSWORD FROM mysql.user WHERE USER='username';
+```
+
+查看所有用户:
+
+```shell
+SELECT USER,HOST,PASSWORD FROM mysql.user;
+```
+
+其中:
+
+- username:用户名。
+- hostname:主机名。
+
+##### 示例
+
+查看userexample1用户。
+
+```shell
+> SHOW GRANTS FOR 'userexample1'@'localhost';
+```
+
+查看mysql数据库中所有用户。
+
+```shell
+> SELECT USER,HOST,PASSWORD FROM mysql.user;
+```
+
+#### 修改用户
+
+##### 修改用户名
+
+可以使用RENAME USER语句修改一个或多个已经存在的用户名。
+
+```shell
+RENAME USER 'oldusername'@'hostname' TO 'newusername'@'hostname';
+```
+
+其中:
+
+- oldusername:旧的用户名。
+- newusername:新的用户名。
+- hostname:主机名。
+
+RENAME USER语句用于对原有的帐号进行重命名。若系统中旧帐号不存在或者新帐号已存在,则该语句执行时会出现错误。
+
+使用RENAME USER语句,必须拥有数据库的UPDATE权限或全局CREATE USER权限。
+
+##### 修改用户示例
+
+将用户名userexample1修改为userexapme2,主机名为locahost。
+
+```shell
+> RENAME USER 'userexample1'@'localhost' TO 'userexample2'@'localhost';
+```
+
+##### 修改用户密码
+
+可以使用SET PASSWORD语句修改一个用户的登录密码。
+
+```shell
+SET PASSWORD FOR 'username'@'hostname' = PASSWORD('newpassword');
+```
+
+其中:
+
+- FOR 'username'@'hostname':FOR字句,可选项,指定欲修改密码的用户名及主机名。
+- PASSWORD\('newpassword'\):表示使用函数PASSWORD\(\)设置新口令,即新口令必须传递到函数PASSWORD\(\)中进行加密。
+
+>  **注意:**
+> PASSWORD\(\)函数为单向加密函数,一旦加密后不能解密出原明文。
+
+在SET PASSWORD语句中,若不加上FOR子句,表示修改当前用户的密码。
+
+FOR字句中必须以'username'@'hostname'的格式给定,username为帐户的用户名,hostname为帐户的主机名。
+
+欲修改密码的帐号必须在系统中存在,否则语句执行时会出现错误。
+
+##### 修改用户密码示例
+
+将用户名为userexample的密码修改为0123456,主机名为locahost。
+
+```shell
+> SET PASSWORD FOR 'userexample'@'localhost' = PASSWORD('0123456') ;
+```
+
+#### 删除用户
+
+可以使用DROP USER语句来删除一个或多个用户帐号以及相关的权限。
+
+```shell
+DROP USER 'username1'@'hostname1' [,'username2'@'hostname2']…;
+```
+
+>  **注意:**
+> 用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,因为数据库并不会记录创建了这些对象的帐号。
+
+DROP USER语句可用于删除一个或多个数据库帐号,并删除其原有权限。
+
+使用DROP USER语句必须拥有数据库的DELETE权限或全局CREATE USER权限。
+
+在DROP USER语句的使用中,若没有明确地给出帐号的主机名,则该主机名默认为“%”。
+
+##### 示例
+
+删除用户名为userexample的本地用户。
+
+```shell
+> DROP USER 'userexample'@'localhost';
+```
+
+#### 用户授权
+
+可以使用GRANT语句来对新建用户的授权。
+
+```shell
+GRANT privileges ON databasename.tablename TO 'username'@'hostname';
+```
+
+其中:
+
+- ON字句:用于指定权限授予的对象和级别。
+- privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所有的权限则使用ALL。
+- databasename:数据库名。
+- tablename:表名。
+- TO字句:用来设定用户密码,以及指定被赋予权限的用户。
+- username:用户名。
+- hostname:主机名。
+
+如果要授予该用户对所有数据库和表的相应操作权限则可用\*表示,如\*.\*。
+
+如果在TO子句中给系统中存在的用户指定密码,则新密码会将原密码覆盖。
+
+如果权限被授予给一个不存在的用户,则会自动执行一条CREATE USER语句来创建这个用户,但同时必须为该用户指定密码。
+
+##### 示例
+
+对本地用户userexample授予SELECT和INSERT权限。
+
+```shell
+> GRANT SELECT,INSERT ON *.* TO 'userexample'@'localhost';
+```
+
+#### 删除用户权限
+
+可以使用REVOKE语句来删除一个用户的权限,但此用户不会被删除。
+
+```shell
+REVOKE privilege ON databasename.tablename FROM 'username'@'hostname';
+```
+
+其中REVOKE语句的参数与GRANT语句的参数含义相同。
+
+要使用 REVOKE 语句,必须拥有数据库的全局CREATE USER权限或UPDATE权限。
+
+##### 示例
+
+删除本地用户userexample的INSERT权限。
+
+```shell
+> REVOKE INSERT ON *.* FROM 'userexample'@'localhost';
+```
+
+### 管理数据库
+
+#### 创建数据库
+
+可以使用CREATE DATABASE语句来创建数据库。
+
+```shell
+CREATE DATABASE databasename;
+```
+
+其中:databasename为数据库名称,且数据库名称不区分大小写。
+
+##### 示例
+
+创建数据库名为databaseexample的数据库。
+
+```shell
+> CREATE DATABASE databaseexample;
+```
+
+#### 查看数据库
+
+可以使用SHOW DATABASES语句来查看数据库。
+
+```shell
+SHOW DATABASES;
+```
+
+##### 示例
+
+查看所有数据库。
+
+```shell
+> SHOW DATABASES;
+```
+
+#### 选择数据库
+
+一般创建表,查询表等操作首先需要选择一个目标数据库。可以使用USE语句来选择数据库。
+
+```shell
+USE databasename;
+```
+
+其中:databasename为数据库名称。
+
+##### 示例
+
+选择databaseexample数据库。
+
+```shell
+> USE databaseexample;
+```
+
+#### 删除数据库
+
+可以使用DROP DATABASE语句来删除数据库。
+
+>  **注意:**
+> 删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
+
+```shell
+DROP DATABASE databasename;
+```
+
+其中:databasename为数据库名称。
+
+DROP DATABASE命令用于删除创建过\(已存在\)的数据库,且会删除数据库中的所有表,但数据库的用户权限不会自动删除。
+
+要使用DROP DATABASE,您需要数据库的DROP权限。
+
+DROP SCHEMA是DROP DATABASE的同义词。
+
+##### 示例
+
+删除databaseexample数据库。
+
+```shell
+> DROP DATABASE databaseexample;
+```
+
+#### 备份数据库
+
+可以在root权限下使用mysqldump命令备份数据库。
+
+备份一个或多个表:
+
+```shell
+mysqldump [options] databasename [tablename ...] > outfile
+```
+
+备份一个或多个库:
+
+```shell
+mysqldump [options] -databases databasename ... > outfile
+```
+
+备份所有库:
+
+```shell
+mysqldump [options] -all-databases > outputfile
+```
+
+其中:
+
+- databasename:数据库名称。
+- tablename:数据表名称。
+- outfile:数据库备份的文件。
+- options:mysqldump命令参数选项,多个参数之间可以使用空格分隔。常用的mysqldump命令参数选项如下:
+ - -u, \-\-user= _username_ :指定用户名。
+ - -p, \-\-password\[= _password_\]:指定密码。
+ - -P, \-\-port= _portnumber_ :指定端口。
+ - -h, \-\-host= _hostname_ :指定主机名。
+ - -r, \-\-result-file= _filename_ :将导出结果保存到指定的文件中,等同于“\>”。
+ - -t:只备份数据。
+ - -d:只备份表结构。
+
+##### 示例
+
+备份主机为192.168.202.144,端口为3306,root用户下的所有数据库到alldb.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --all-databases > alldb.sql
+```
+
+备份主机为192.168.202.144,端口为3306,root用户下的db1数据库到db1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --databases db1 > db1.sql
+```
+
+备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的tb1表到db1tb1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 db1 tb1 > db1tb1.sql
+```
+
+只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的表结构到db1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -d db1 > db1.sql
+```
+
+只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的数据到db1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 > db1.sql
+```
+
+#### 恢复数据库
+
+可以在root权限下使用mysql命令恢复数据库。
+
+恢复一个或多个表:
+
+```shell
+mysql -h hostname -P portnumber -u username -ppassword databasename < infile
+```
+
+其中:
+
+- hostname:主机名。
+- portnumber:端口号。
+- username:用户名。
+- password:密码。
+- databasename:数据库名。
+- infile:mysqldump命令中的outfile参数。
+
+##### 示例
+
+恢复数据库。
+
+```shell
+# mysql -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 < db1.sql
+```
+
+## MySQL服务器
+
+### 软件介绍
+
+MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。MySQL是业界最流行的RDBMS \(Relational Database Management System,关系数据库管理系统\)之一,尤其在WEB应用方面。
+
+关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就加快了速度并提高了灵活性。
+
+MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权模式,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。
+
+### 配置环境
+
+>  **说明:**
+> 以下环境配置仅为参考示例,具体配置视实际需求做配置
+
+#### 关闭防火墙并取消开机自启动
+
+>  **说明:**
+> 测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。
+
+1. 在root权限下停止防火墙。
+
+ ```shell
+ systemctl stop firewalld
+ ```
+
+2. 在root权限下关闭防火墙。
+
+ ```shell
+ systemctl disable firewalld
+ ```
+
+ >  **说明:**
+ > 执行disable命令关闭防火墙的同时,也取消了开机自启动。
+
+#### 修改SELINUX为disabled
+
+1. 在root权限下修改配置文件。
+
+ ```shell
+ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
+ ```
+
+#### 创建组和用户
+
+>  **说明:**
+> 服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。
+
+1. 在root权限下创建MySQL用户(组)。
+
+ ```shell
+ groupadd mysql
+ ```
+
+ ```shell
+ useradd -g mysql mysql
+ ```
+
+2. 在root权限下设置MySQL用户密码。
+
+ ```shell
+ passwd mysql
+ ```
+
+ 重复输入密码(根据实际需求设置密码)。
+
+#### 搭建数据盘
+
+>  **说明:**
+> 进行性能测试时,数据目录使用单独硬盘,需要对硬盘进行格式化并挂载,参考方法一或者方法二。
+> 非性能测试时,在root权限下执行`mkdir /data`创建数据目录即可。然后跳过本小节。
+
+##### 方法一:在root权限下使用fdisk进行磁盘管理
+
+1. 创建分区(以/dev/sdb为例,根据实际情况创建)
+
+ ```shell
+ fdisk /dev/sdb
+ ```
+
+2. 输入n,按回车确认。
+3. 输入p,按回车确认。
+4. 输入1,按回车确认。
+5. 采用默认配置,按回车确认。
+6. 采用默认配置,按回车确认。
+7. 输入w,按回车保存。
+8. 创建文件系统(以xfs为例,根据实际需求创建文件系统)
+
+ ```shell
+ mkfs.xfs /dev/sdb1
+ ```
+
+9. 挂载分区到“/data”以供操作系统使用。
+
+ ```shell
+ mkdir /data
+ ```
+
+ ```shell
+ mount /dev/sdb1 /data
+ ```
+
+10. 执行命令“vi /etc/fstab", 编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
+
+ 其中,/dev/nvme0n1p1为示例,具体名称以实际情况为准。
+
+ 
+
+##### 方法二:在root权限下使用LVM进行磁盘管理
+
+>  **说明:**
+> 此步骤需要安装镜像中的lvm2相关包,步骤如下:
+>(1)配置本地yum源,详细信息请参考[搭建repo服务器](./configuring-the-repo-server.md)。如果已经执行,则可跳过此步。
+>(2)执行`yum install lvm2`安装lvm2。
+
+1. 创建物理卷(sdb为硬盘名称,具体名字以实际为准)。
+
+ ```shell
+ pvcreate /dev/sdb
+ ```
+
+2. 创建物理卷组(其中datavg为创建的卷组名称,具体名字以实际规划为准)。
+
+ ```shell
+ vgcreate datavg /dev/sdb
+ ```
+
+3. 创建逻辑卷(其中600G为规划的逻辑卷大小,具体大小以实际情况为准;datalv为创建的逻辑卷的名字,具体名称以实际规划为准。)。
+
+ ```shell
+ lvcreate -L 600G -n datalv datavg
+ ```
+
+4. 创建文件系统。
+
+ ```shell
+ mkfs.xfs /dev/datavg/datalv
+ ```
+
+5. 创建数据目录并挂载。
+
+ ```shell
+ mkdir /data
+ ```
+
+ ```shell
+ mount /dev/datavg/datalv /data
+ ```
+
+6. 执行命令**vi /etc/fstab**,编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
+
+ 其中,/dev/datavg/datalv为示例,具体名称以实际情况为准。
+
+ 
+
+#### 创建数据库目录并且授权
+
+1. 在已创建的数据目录 **/data** 基础上,使用root权限继续创建进程所需的相关目录并授权MySQL用户(组)。
+
+ ```shell
+ mkdir -p /data/mysql
+ cd /data/mysql
+ mkdir data tmp run log
+ chown -R mysql:mysql /data
+ ```
+
+### 安装、运行和卸载
+
+#### 安装
+
+1. 配置本地yum源,详细信息请参考[搭建repo服务器](./configuring-the-repo-server.md)章节。
+2. 清除缓存。
+
+ ```shell
+ dnf clean all
+ ```
+
+3. 创建缓存。
+
+ ```shell
+ dnf makecache
+ ```
+
+4. 在root权限下安装MySQL服务器。
+
+ ```shell
+ dnf install mysql-server
+ ```
+
+5. 查看安装后的rpm包。
+
+ ```shell
+ rpm -qa | grep mysql-server
+ ```
+
+#### 运行
+
+1. 修改配置文件。
+ 1. 在root权限下创建my.cnf文件,其中文件路径(包括软件安装路径basedir、数据路径datadir等)根据实际情况修改。
+
+ ```shell
+ vi /etc/my.cnf
+ ```
+
+ 编辑my.cnf内容如下:
+
+ ```text
+ [mysqld_safe]
+ log-error=/data/mysql/log/mysql.log
+ pid-file=/data/mysql/run/mysqld.pid
+ [mysqldump]
+ quick
+ [mysql]
+ no-auto-rehash
+ [client]
+ default-character-set=utf8
+ [mysqld]
+ basedir=/usr/local/mysql
+ socket=/data/mysql/run/mysql.sock
+ tmpdir=/data/mysql/tmp
+ datadir=/data/mysql/data
+ default_authentication_plugin=mysql_native_password
+ port=3306
+ user=mysql
+ ```
+
+ 2. 确保my.cnf配置文件修改正确。
+
+ ```shell
+ cat /etc/my.cnf
+ ```
+
+ 
+
+ >  **注意:**
+ > 其中basedir为软件安装路径,请根据实际情况修改。
+
+ 3. 在root权限下修改/etc/my.cnf文件的组和用户为mysql:mysql
+
+ ```shell
+ chown mysql:mysql /etc/my.cnf
+ ```
+
+2. 配置环境变量。
+ 1. 安装完成后,在root权限下将MySQL二进制文件路径到PATH。
+
+ ```shell
+ echo export PATH=$PATH:/usr/local/mysql/bin >> /etc/profile
+ ```
+
+ >  **注意:**
+ > 其中PATH中的“/usr/local/mysql/bin“路径,为MySQL软件安装目录下的bin文件的绝对路径。请根据实际情况修改。
+
+ 2. 在root权限下使环境变量配置生效。
+
+ ```shell
+ source /etc/profile
+ ```
+
+3. 在root权限下初始化数据库。
+
+ >  **说明:**
+ > 本步骤倒数第2行中有初始密码,请注意保存,登录数据库时需要使用。
+
+ ```shell
+ # mysqld --defaults-file=/etc/my.cnf --initialize
+ 2020-03-18T03:27:13.702385Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.17) initializing of server in progress as process 34014
+ 2020-03-18T03:27:24.112453Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: iNat=)#V2tZu
+ 2020-03-18T03:27:28.576003Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.17) initializing of server has completed
+ ```
+
+ 查看打印信息,打印信息中包括“initializing of server has completed”表示初始化数据库完成,且打印信息中“A temporary password is generated for root@localhost: iNat=\)V2tZu”的“iNat=\)V2tZu”为初始密码。
+
+4. 启动数据库。
+
+ >  **注意:**
+ > 如果第一次启动数据库服务,以root用户启动数据库,则启动时会提示缺少mysql.log文件而导致失败。使用mysql用户启动之后,会在/data/mysql/log目录下生成mysql.log文件,再次使用root用户启动则不会报错。
+
+ 1. 在root权限下修改文件权限。
+
+ ```shell
+ chmod 777 /usr/local/mysql/support-files/mysql.server
+ chown mysql:mysql /var/log/mysql/*
+ ```
+
+ 2. 在root权限下启动MySQL。
+
+ ```shell
+ cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
+ chkconfig mysql on
+ ```
+
+ 以mysql用户启动数据库。
+
+ ```shell
+ su - mysql
+ service mysql start
+ ```
+
+5. 登录数据库。
+
+ >  **说明:**
+ > 提示输入密码时,请输入[3](#li15634560582)产生的初始密码。
+ > 如果采用官网RPM安装方式,则mysql文件在/usr/bin目录下。登录数据库的命令根据实际情况修改。
+
+ ```shell
+ # /usr/local/mysql/bin/mysql -uroot -p -S /data/mysql/run/mysql.sock
+ ```
+
+ 
+
+6. 配置数据库帐号密码。
+ 1. 登录数据库以后,修改通过root用户登录数据库的密码。
+
+ ```shell
+ mysql> alter user 'root'@'localhost' identified by "123456";
+ ```
+
+ 2. 创建全域root用户(允许root从其他服务器访问)。
+
+ ```shell
+ mysql> create user 'root'@'%' identified by '123456';
+ ```
+
+ 3. 进行授权。
+
+ ```shell
+ mysql> grant all privileges on *.* to 'root'@'%';
+ mysql> flush privileges;
+ ```
+
+ 
+
+7. 退出数据库。
+
+ 执行 **\\q** 或者 **exit** 退出数据库。
+
+ ```shell
+ mysql> exit
+ ```
+
+ 
+
+#### 卸载
+
+1. 在root权限下关闭数据库进程。
+
+ ```shell
+ ps -ef | grep mysql
+ kill -9 进程ID
+ ```
+
+2. 在root权限下执行**dnf remove mysql**命令卸载MySQL。
+
+ ```shell
+ dnf remove mysql
+ ```
+
+### 管理数据库用户
+
+#### 创建用户
+
+可以使用CREATE USER语句来创建一个或多个用户,并设置相应的口令。
+
+```shell
+CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';
+```
+
+其中:
+
+- username:用户名。
+- host:主机名,即用户连接数据库时所在的主机的名字。若是本地用户可用localhost,若在创建的过程中,未指定主机名,则主机名默认为“%”,表示一组主机。
+- password:用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器,但从安全的角度而言,不推荐这种做法。
+
+使用CREATE USER语句必须拥有数据库的INSERT权限或全局CREATE USER权限。
+
+使用CREATE USER语句创建一个用户帐号后,会在系统自身的数据库的user表中添加一条新记录。若创建的帐户已经存在,则语句执行时会出现错误。
+
+新创建的用户拥有的权限很少,只允许进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。
+
+##### 示例
+
+创建密码为123456,用户名为userexample1的本地用户。
+
+```shell
+> CREATE USER 'userexample1'@'localhost' IDENTIFIED BY '123456';
+```
+
+创建密码为123456,用户名为userexample2,主机名为192.168.1.100的用户。
+
+```shell
+> CREATE USER 'userexample2'@'192.168.1.100' IDENTIFIED BY '123456';
+```
+
+#### 查看用户
+
+可以使用SHOW GRANTS语句或SELECT语句查看一个或多个用户。
+
+查看特定用户:
+
+```shell
+SHOW GRANTS [FOR 'username'@'hostname'];
+```
+
+```shell
+SELECT USER,HOST,PASSWORD FROM mysql.user WHERE USER='username';
+```
+
+查看所有用户:
+
+```shell
+SELECT USER,HOST FROM mysql.user;
+```
+
+其中:
+
+- username:用户名。
+- hostname:主机名。
+
+##### 示例
+
+查看userexample1用户。
+
+```shell
+> SHOW GRANTS FOR 'userexample1'@'localhost';
+```
+
+查看mysql数据库中所有用户。
+
+```shell
+> SELECT USER,HOST FROM mysql.user;
+```
+
+#### 修改用户
+
+##### 修改用户名
+
+可以使用RENAME USER语句修改一个或多个已经存在的用户名。
+
+```shell
+RENAME USER 'oldusername'@'hostname' TO 'newusername'@'hostname';
+```
+
+其中:
+
+- oldusername:旧的用户名。
+- newusername:新的用户名。
+- hostname:主机名。
+
+RENAME USER语句用于对原有的帐号进行重命名。若系统中旧帐号不存在或者新帐号已存在,则该语句执行时会出现错误。
+
+使用RENAME USER语句,必须拥有数据库的UPDATE权限或全局CREATE USER权限。
+
+##### 修改用户示例
+
+将用户名userexample1修改为userexapme2,主机名为locahost。
+
+```shell
+> RENAME USER 'userexample1'@'localhost' TO 'userexample2'@'localhost';
+```
+
+##### 修改用户密码
+
+可以使用SET PASSWORD语句修改一个用户的登录密码。
+
+```shell
+SET PASSWORD FOR 'username'@'hostname' = 'newpassword';
+```
+
+其中:
+
+- FOR 'username'@'hostname':FOR字句,可选项,指定欲修改密码的用户名及主机名。
+- 'newpassword':新密码。
+
+在SET PASSWORD语句中,若不加上FOR子句,表示修改当前用户的密码。
+
+FOR字句中必须以'username'@'hostname'的格式给定,username为帐户的用户名,hostname为帐户的主机名。
+
+欲修改密码的帐号必须在系统中存在,否则语句执行时会出现错误。
+
+##### 修改用户密码示例
+
+将用户名为userexample的密码修改为0123456,主机名为locahost。
+
+```shell
+> SET PASSWORD FOR 'userexample'@'localhost' = '0123456';
+```
+
+#### 删除用户
+
+可以使用DROP USER语句来删除一个或多个用户帐号以及相关的权限。
+
+```shell
+DROP USER 'username1'@'hostname1' [,'username2'@'hostname2']…;
+```
+
+>  **注意:**
+> 用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,因为数据库并不会记录创建了这些对象的帐号。
+
+DROP USER语句可用于删除一个或多个数据库帐号,并删除其原有权限。
+
+使用DROP USER语句必须拥有数据库的DELETE权限或全局CREATE USER权限。
+
+在DROP USER语句的使用中,若没有明确地给出帐号的主机名,则该主机名默认为“%”。
+
+##### 示例
+
+删除用户名为userexample的本地用户。
+
+```shell
+> DROP USER 'userexample'@'localhost';
+```
+
+#### 用户授权
+
+可以使用GRANT语句来对新建用户的授权。
+
+```shell
+GRANT privileges ON databasename.tablename TO 'username'@'hostname';
+```
+
+其中:
+
+- ON字句:用于指定权限授予的对象和级别。
+- privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所有的权限则使用ALL。
+- databasename:数据库名。
+- tablename:表名。
+- TO字句:用来设定用户密码,以及指定被赋予权限的用户。
+- username:用户名。
+- hostname:主机名。
+
+如果要授予该用户对所有数据库和表的相应操作权限则可用\*表示,如\*.\*。
+
+如果在TO子句中给系统中存在的用户指定密码,则新密码会将原密码覆盖。
+
+如果权限被授予给一个不存在的用户,则会自动执行一条CREATE USER语句来创建这个用户,但同时必须为该用户指定密码。
+
+##### 示例
+
+对本地用户userexample授予SELECT和INSERT权限。
+
+```shell
+> GRANT SELECT,INSERT ON *.* TO 'userexample'@'localhost';
+```
+
+#### 删除用户权限
+
+可以使用REVOKE语句来删除一个用户的权限,但此用户不会被删除。
+
+```shell
+REVOKE privilege ON databasename.tablename FROM 'username'@'hostname';
+```
+
+其中REVOKE语句的参数与GRANT语句的参数含义相同。
+
+要使用 REVOKE 语句,必须拥有数据库的全局CREATE USER权限或UPDATE权限。
+
+##### 示例
+
+删除本地用户userexample的INSERT权限。
+
+```shell
+> REVOKE INSERT ON *.* FROM 'userexample'@'localhost';
+```
+
+### 管理数据库
+
+#### 创建数据库
+
+可以使用CREATE DATABASE语句来创建数据库。
+
+```shell
+CREATE DATABASE databasename;
+```
+
+其中:databasename为数据库名称,且数据库名称不区分大小写。
+
+##### 示例
+
+创建数据库名为databaseexample的数据库。
+
+```shell
+> CREATE DATABASE databaseexample;
+```
+
+#### 查看数据库
+
+可以使用SHOW DATABASES语句来查看数据库。
+
+```shell
+SHOW DATABASES;
+```
+
+##### 示例
+
+查看所有数据库。
+
+```shell
+> SHOW DATABASES;
+```
+
+#### 选择数据库
+
+一般创建表,查询表等操作首先需要选择一个目标数据库。可以使用USE语句来选择数据库。
+
+```shell
+USE databasename;
+```
+
+其中:databasename为数据库名称。
+
+##### 示例
+
+选择databaseexample数据库。
+
+```shell
+> USE databaseexample;
+```
+
+#### 删除数据库
+
+可以使用DROP DATABASE语句来删除数据库。
+
+>  **注意:**
+> 删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
+
+```shell
+DROP DATABASE databasename;
+```
+
+其中:databasename为数据库名称。
+
+DROP DATABASE命令用于删除创建过\(已存在\)的数据库,且会删除数据库中的所有表,但数据库的用户权限不会自动删除。
+
+要使用DROP DATABASE,您需要数据库的DROP权限。
+
+DROP SCHEMA是DROP DATABASE的同义词。
+
+##### 示例
+
+删除databaseexample数据库。
+
+```shell
+> DROP DATABASE databaseexample;
+```
+
+#### 备份数据库
+
+可以在root权限下使用mysqldump命令备份数据库。
+
+备份一个或多个表:
+
+```shell
+mysqldump [options] databasename [tablename ...] > outfile
+```
+
+备份一个或多个库:
+
+```shell
+mysqldump [options] -databases databasename ... > outfile
+```
+
+备份所有库:
+
+```shell
+mysqldump [options] -all-databases > outputfile
+```
+
+其中:
+
+- databasename:数据库名称。
+- tablename:数据表名称。
+- outfile:数据库备份的文件。
+- options:mysqldump命令参数选项,多个参数之间可以使用空格分隔。常用的mysqldump命令参数选项如下:
+ - -u, \-\-user= _username_ :指定用户名。
+ - -p, \-\-password\[= _password_\]:指定密码。
+ - -P, \-\-port= _portnumber_ :指定端口。
+ - -h, \-\-host= _hostname_ :指定主机名。
+ - -r, \-\-result-file= _filename_ :将导出结果保存到指定的文件中,等同于“\>”。
+ - -t:只备份数据。
+ - -d:只备份表结构。
+
+##### 示例
+
+备份主机为192.168.202.144,端口为3306,root用户下的所有数据库到alldb.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --all-databases > alldb.sql
+```
+
+备份主机为192.168.202.144,端口为3306,root用户下的db1数据库到db1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --databases db1 > db1.sql
+```
+
+备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的tb1表到db1tb1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 db1 tb1 > db1tb1.sql
+```
+
+只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的表结构到db1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -d db1 > db1.sql
+```
+
+只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的数据到db1.sql中。
+
+```shell
+mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 > db1.sql
+```
+
+#### 恢复数据库
+
+可以在root权限下使用mysql命令恢复数据库。
+
+恢复一个或多个表:
+
+```shell
+mysql -h hostname -P portnumber -u username -ppassword databasename < infile
+```
+
+其中:
+
+- hostname:主机名。
+- portnumber:端口号。
+- username:用户名。
+- password:密码。
+- databasename:数据库名。
+- infile:mysqldump命令中的outfile参数。
+
+##### 示例
+
+恢复数据库。
+
+```shell
+# mysql -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 < db1.sql
+```
diff --git a/docs/en/25.03/Server/Administration/Administrator/user-and-user-group-management.md b/docs/en/25.03/Server/Administration/Administrator/user-and-user-group-management.md
new file mode 100644
index 0000000000000000000000000000000000000000..fb803cd42aa2e98a4cd1d575a97f02de11224b88
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/user-and-user-group-management.md
@@ -0,0 +1,324 @@
+# 管理用户
+
+在Linux中,每个普通用户都有一个帐户,包括用户名、密码和主目录等信息。除此之外,还有一些系统本身创建的特殊用户,它们具有特殊的意义,其中最重要的是管理员帐户,默认用户名是root。同时Linux也提供了用户组,使每一个用户至少属于一个组,从而便于权限管理。
+
+用户和用户组管理是系统安全管理的重要组成部分,本章主要介绍openEuler提供的用户管理和组管理命令,以及为普通用户分配特权的方法。
+
+## 管理用户
+
+### 增加用户
+
+#### useradd命令
+
+在root权限下,通过useradd命令可以为系统添加新用户信息,其中 _options_ 为相关参数, _username_ 为用户名称。
+
+```shell
+useradd [options] username
+```
+
+#### 用户信息文件
+
+与用户帐号信息有关的文件如下:
+
+- /etc/passwd:用户帐号信息文件。
+- /etc/shadow:用户帐号信息加密文件。
+- /etc/group:组信息文件。
+- /etc/default/useradd:定义默认设置文件。
+- /etc/login.defs:系统广义设置文件。
+- /etc/skel:默认的初始配置文件目录。
+
+#### 创建用户实例
+
+例如新建一个用户名为userexample的用户,在root权限下执行如下命令:
+
+```shell
+# useradd userexample
+```
+
+>  **说明:**
+> 没有任何提示,表明用户建立成功。这时并没有设置用户的口令,请使用passwd命令修改用户的密码,没有设置密码的新帐号不能登录系统。
+
+使用id命令查看新建的用户信息,命令如下:
+
+```shell
+# id userexample
+uid=502(userexample) gid=502(userexample) groups=502(userexample)
+```
+
+修改用户userexample的密码:
+
+```shell
+# passwd userexample
+```
+
+建议在修改用户密码时满足密码复杂度要求,密码的复杂度的要求如下:
+
+1. 口令长度至少8个字符。
+2. 口令至少包含大写字母、小写字母、数字和特殊字符中的任意3种。
+3. 口令不能和帐号一样。
+4. 口令不能使用字典词汇。
+ - 查询字典
+ 在已装好的openEuler环境中,可以通过如下命令导出字典库文件dictionary.txt,用户可以查询密码是否在该字典中。
+
+ ```shell
+ cracklib-unpacker /usr/share/cracklib/pw_dict > dictionary.txt
+ ```
+
+ - 修改字典
+ 1. 修改上面导出的字典文件,执行如下命令更新系统字典库。
+
+ ```shell
+ # create-cracklib-dict dictionary.txt
+ ```
+
+ 2. 在原字典库基础上新增其他字典内容custom.txt。
+
+ ```shell
+ # create-cracklib-dict dictionary.txt custom.txt
+ ```
+
+根据提示两次输入新用户的密码,完成密码更改。过程如下:
+
+```shell
+# passwd userexample
+Changing password for user userexample.
+New password:
+Retype new password:
+passwd: all authentication tokens updated successfully.
+```
+
+>  **说明:**
+> 若打印信息中出现“BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic”,表示设置的密码过于简单,建议设置复杂度较高的密码。
+
+### 修改用户帐号
+
+#### 修改密码
+
+普通用户可以用passwd修改自己的密码,只有管理员才能用passwd username为其他用户修改密码。
+
+#### 修改用户shell设置
+
+使用chsh命令可以修改自己的shell,只有管理员才能用chsh username为其他用户修改shell设置。
+
+用户也可以使用usermod命令修改shell信息,在root权限下执行如下命令,其中 _new\_shell\_path_ 为目标shell路径,_username_ 为要修改用户的用户名,请根据实际情况修改:
+
+```shell
+usermod -s new_shell_path username
+```
+
+例如,将用户userexample的shell改为csh,命令如下:
+
+```shell
+# usermod -s /bin/csh userexample
+```
+
+#### 修改主目录
+
+- 修改主目录,可以在root权限下执行如下命令,其中 _new\_home\_directory_ 为已创建的目标主目录的路径,_username_ 为要修改用户的用户名,请根据实际情况修改:
+
+ ```shell
+ usermod -d new_home_directory username
+ ```
+
+- 如果想将现有主目录的内容转移到新的目录,应该使用-m选项,命令如下:
+
+ ```shell
+ usermod -d new_home_directory -m username
+ ```
+
+#### 修改UID
+
+修改用户ID,在root权限下执行如下命令,其中 _UID_ 代表目标用户ID,_username_ 代表用户名,请根据实际情况修改:
+
+```shell
+usermod -u UID username
+```
+
+该用户主目录中所拥有的文件和目录都将自动修改UID设置。但是,对于主目录外所拥有的文件,只能使用chown命令手动修改所有权。
+
+#### 修改帐号的有效期
+
+如果使用了影子口令,则可以在root权限下,执行如下命令来修改一个帐号的有效期,其中 _MM_ 代表月份,_DD_ 代表某天,_YY_ 代表年份,_username_ 代表用户名,请根据实际情况修改:
+
+```shell
+usermod -e MM/DD/YY username
+```
+
+### 删除用户
+
+在root权限下,使用userdel命令可删除现有用户。
+
+例如,删除用户Test,命令如下:
+
+```shell
+# userdel Test
+```
+
+如果想同时删除该用户的主目录以及其中所有内容,要使用-r参数递归删除。
+
+>  **说明:**
+> 不建议直接删除已经进入系统的用户,如果需要强制删除,请使用 userdel -f _Test_ 命令。
+
+### 管理员帐户授权
+
+使用sudo命令可以允许普通用户执行管理员帐户才能执行的命令。
+
+sudo命令允许已经在/etc/sudoers文件中指定的用户运行管理员帐户命令。例如,一个已经获得许可的普通用户可以运行如下命令:
+
+```shell
+sudo /usr/sbin/useradd newuserl
+```
+
+实际上,sudo的配置完全可以指定某个已经列入/etc/sudoers文件的普通用户可以做什么,不可以做什么。
+
+/etc/sudoers的配置行如下所示。
+
+- 空行或注释行(以\#字符打头):无具体功能的行。
+- 可选的主机别名行:用来创建主机列表的简称。必须以Host\_Alias关键词开头,列表中的主机必须用逗号隔开,如:
+
+ ```shell
+ Host_Alias linux=ted1,ted2
+ ```
+
+ 其中ted1和ted2是两个主机名,可使用linux(别名)称呼它们。
+
+- 可选的用户别名行:用来创建用户列表的简称。用户别名行必须以User\_Alias关键词开头,列表中的用户名必须以逗号隔开。其格式同主机别名行。
+- 可选的命令别名行:用来创建命令列表的简称。必须以Cmnd\_Alias开头,列表中的命令必须用逗号隔开。
+- 可选的运行方式别名行:用来创建用户列表的简称。不同的是,使用这样的别名可以告诉sudo程序以列表中某一用户的身份来运行程序。
+- 必要的用户访问说明行。
+
+ 用户访问的说明语法如下:
+
+ ```text
+ user host = [ run as user ] command list
+ ```
+
+ 在user处指定一个真正的用户名或定义过的别名,host也可以是一个真正的主机名或者定义过的主机别名。默认情况下,sudo执行的所有命令都是以root身份执行。如果您想使用其他身份可以指定。command list可以是以逗号分隔的命令列表,也可以是一个已经定义过的别名,如:
+
+ ```text
+ ted1 ted2=/sbin/shutdown
+ ```
+
+ 这一句说明ted1可以在ted2主机上运行关机命令。
+
+ ```text
+ newuser1 ted1=(root) /usr/sbin/useradd,/usr/sbin/userdel
+ ```
+
+ 这一句说明ted1主机上的newuser1具有以root用户权限执行useradd,userdel命令的功能。
+
+ >  **说明:**
+ > 可以在一行定义多个别名,中间用冒号 \(:\) 隔开。
+ > 可在命令或命令别名之前加上感叹号 \(!\),使该命令或命令别名无效。
+ > 有两个关键词:ALL和NOPASSWD。ALL意味着“所有”(所有文件、所有主机或所有命令),NOPASSWD意味着不用密码。
+ > 通过修改用户访问,将普通用户的访问权限修改为同root一样,则可以给普通用户分配特权。
+
+下面是一个sudoers文件的例子:
+
+```text
+#sudoers files
+#User alias specification
+User_Alias ADMIN=ted1:POWERUSER=globus,ted2
+#user privilege specification
+ADMIN ALL=ALL
+POWERUSER ALL=ALL,!/bin/su
+```
+
+其中:
+
+- User\_Alias ADMIN=ted1:POWERUSER=globus,ted2
+
+ 定义了两个别名ADMIN和POWERUSER
+
+- ADMIN ALL=ALL
+
+ 说明在所有主机上,ADMIN用户都可以以root身份执行所有命令
+
+- POWERUSER ALL=ALL,!/bin/su
+
+ 给POWERUSER用户除了运行su命令外等同ADMIN的权限
+
+## 管理用户组
+
+### 增加用户组
+
+#### groupadd命令
+
+在root权限下,通过groupadd命令可以为系统添加新用户组信息,其中 _options_ 为相关参数, _groupname_ 为用户组名称。
+
+```shell
+groupadd [options] groupname
+```
+
+#### 用户组信息文件
+
+与用户组信息有关的文件如下:
+
+- /etc/gshadow:用户组信息加密文件。
+- /etc/group:组信息文件。
+- /etc/login.defs:系统广义设置文件。
+
+#### 创建用户组实例
+
+例如新建一个用户组名为groupexample的用户,在root权限下执行如下命令:
+
+```shell
+# groupadd groupexample
+```
+
+### 修改用户组
+
+#### 修改GID
+
+修改用户组ID,在root权限下执行如下命令,其中 _GID_ 代表目标用户组ID, _groupname_ 代表用户组,请根据实际情况修改:
+
+```shell
+# groupmod -g GID groupname
+```
+
+#### 修改用户组名
+
+修改用户组名,在root权限下执行如下命令,其中 _newgroupname_ 代表新用户组名, _oldgroupname_ 代表已经存在的待修改的用户组名,请根据实际情况修改:
+
+```shell
+# groupmod -n newgroupname oldgroupname
+```
+
+### 删除用户组
+
+在root权限下,使用groupdel命令可删除用户组。
+
+例如,删除用户组Test,命令如下:
+
+```shell
+# groupdel Test
+```
+
+>  **说明:**
+> groupdel不能直接删除用户的主组,如果需要强制删除用户主组,请使用 groupdel -f _Test_ 命令。
+
+### 将用户加入用户组或从用户组中移除
+
+在root权限下,使用gpasswd命令将用户加入用户组或从用户组中移除。
+
+例如,将用户 _userexample_ 加入用户组 _Test_ ,命令如下:
+
+```shell
+# gpasswd -a userexample Test
+```
+
+例如,将用户 _userexample_ 从 _Test_ 用户组中移除,命令如下:
+
+```shell
+# gpasswd -d userexample Test
+```
+
+### 切换用户组
+
+一个用户同时属于多个用户组时,则在用户登录后,使用newgrp命令可以切换到其他用户组,以便具有其他用户组的权限。
+
+例如,将用户 _userexample_ 切换到 _Test_ 用户组,命令如下:
+
+```shell
+newgrp Test
+```
diff --git a/docs/en/25.03/Server/Administration/Administrator/using-dnf-to-manage-software-packages.md b/docs/en/25.03/Server/Administration/Administrator/using-dnf-to-manage-software-packages.md
new file mode 100644
index 0000000000000000000000000000000000000000..b5db583349ca1b61019468c039c4ede7836cab2d
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/using-dnf-to-manage-software-packages.md
@@ -0,0 +1,419 @@
+# 使用DNF管理软件包
+
+DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,以及更新系统到最新可用版本。
+
+>  **说明:**
+> DNF与YUM完全兼容,提供了YUM兼容的命令行以及为扩展和插件提供的API。
+> 使用DNF需要管理员权限,本章所有命令需要在管理员权限下执行。
+
+## 配置DNF
+
+### DNF配置文件
+
+DNF 的主要配置文件是 /etc/dnf/dnf.conf,该文件包含两部分:
+
+- “main”部分保存着DNF的全局设置。
+
+- “repository”部分保存着软件源的设置,可以有零个或多个“repository”。
+
+另外,在/etc/yum.repos.d 目录中保存着零个或多个repo源相关文件,它们也可以定义不同的“repository”。
+
+所以openEuler软件源的配置一般有两种方式,一种是直接配置/etc/dnf/dnf.conf文件中的“repository”部分,另外一种是在/etc/yum.repos.d目录下增加.repo文件。
+
+#### 配置main部分
+
+/etc/dnf/dnf.conf 文件包含的“main”部分,配置示例如下:
+
+```text
+[main]
+gpgcheck=1
+installonly_limit=3
+clean_requirements_on_remove=True
+best=True
+```
+
+常用选项说明:
+
+**表 1** main参数说明
+
+
+ 参数
+
+ 说明
+
+
+
+ cachedir
+
+ 缓存目录,该目录用于存储RPM包和数据库文件。
+
+
+ keepcache
+
+ 可选值是1和0,表示是否要缓存已安装成功的那些RPM包及头文件,缺省值为0,即不缓存。
+
+
+ debuglevel
+
+ 设置dnf生成的debug信息。取值范围:[0-10],数值越大会输出越详细的debug信息。缺省值为2,设置为0表示不输出debug信息。
+
+
+ clean_requirements_on_remove
+
+ 删除在dnf remove期间不再使用的依赖项,如果软件包是通过DNF安装的,而不是通过显式用户请求安装的,则只能通过clean_requirements_on_remove删除软件包,即它是作为依赖项引入的。 缺省值为True。
+
+
+ best
+
+ 升级包时,总是尝试安装其最高版本,如果最高版本无法安装,则提示无法安装的原因并停止安装。缺省值为True。
+
+
+ obsoletes
+
+ 可选值1和0,设置是否允许更新陈旧的RPM包。缺省值为1,表示允许更新。
+
+
+ gpgcheck
+
+ 可选值1和0,设置是否进行gpg校验。缺省值为1,表示需要进行校验。
+
+
+ plugins
+
+ 可选值1和0,表示启用或禁用dnf插件。缺省值为1,表示启用dnf插件。
+
+
+ installonly_limit
+
+ 设置可以同时安装“installonlypkgs”指令列出包的数量。缺省值为3,不建议降低此值。
+
+
+
+
+
+#### 配置repository部分
+
+repository部分允许您定义定制化的openEuler软件源仓库,各个仓库的名称不能相同,否则会引起冲突。配置repository部分有两种方式,一种是直接配置/etc/dnf/dnf.conf文件中的“repository”部分,另外一种是配置/etc/yum.repos.d目录下的.repo文件。
+
+- 直接配置/etc/dnf/dnf.conf文件中的“repository”部分
+
+ 下面是\[repository\]部分的一个最小配置示例:
+
+ ```text
+ [repository]
+ name=repository_name
+ baseurl=repository_url
+ ```
+
+ >  **说明:**
+ > openEuler提供在线的镜像源,地址:[https://repo.openeuler.org/](https://repo.openeuler.org/)。以 openEuler 23.09的aarch64版本为例,baseurl可配置为[https://repo.openeuler.org/openEuler-23.09/OS/aarch64/](https://repo.openeuler.org/openEuler-23.09/OS/aarch64/)。
+
+ 选项说明:
+
+ **表 2** repository参数说明
+ | 参数 | 说明 |
+ |--------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
+ | name=repository_name | 软件仓库(repository )描述的字符串。 |
+ | baseurl=repository_url | 软件仓库(repository )的地址。 使用http协议的网络位置:例如 使用ftp协议的网络位置:例如 本地位置:例如 file://path/to/local/repo |
+
+- 配置/etc/yum.repos.d目录下的.repo文件
+
+ openEuler提供了多种repo源供用户在线使用,各repo源含义可参考[系统安装](../../Releasenotes/Releasenotes/installing-the-os.md)。使用root权限添加openEuler repo源,示例如下:
+
+ ```shell
+ # vi /etc/yum.repos.d/openEuler.repo
+
+ [OS]
+ name=openEuler-$releasever-OS
+ baseurl=https://repo.openeuler.org/openEuler-23.09/OS/$basearch/
+ enabled=1
+ gpgcheck=1
+ gpgkey=https://repo.openeuler.org/openEuler-23.09/OS/$basearch/RPM-GPG-KEY-openEuler
+ ```
+
+ >  **说明:**
+ > enabled为是否启用该软件源仓库,可选值为1和0。缺省值为1,表示启用该软件源仓库。
+ > gpgkey为验证签名用的公钥。
+
+#### 显示当前配置
+
+- 显示当前的配置信息:
+
+ ```shell
+ # dnf config-manager --dump
+ ```
+
+- 显示相应软件源的配置,首先查询repo id:
+
+ ```shell
+ # dnf repolist
+ ```
+
+ 然后执行如下命令,显示对应id的软件源配置,其中 *repository* 为查询得到的repo id:
+
+ ```shell
+ # dnf config-manager --dump repository
+ ```
+
+- 您也可以使用一个全局正则表达式,来显示所有匹配部分的配置:
+
+ ```shell
+ # dnf config-manager --dump glob_expression
+ ```
+
+### 创建本地软件源仓库
+
+要建立一个本地软件源仓库,请按照下列步骤操作。
+
+1. 安装createrepo软件包。
+
+ ```shell
+ # dnf install createrepo
+ ```
+
+2. 将需要的软件包复制到一个目录下,如/mnt/local\_repo/ 。
+
+3. 创建软件源。
+
+ ```shell
+ # createrepo /mnt/local_repo
+ ```
+
+### 添加、启用和禁用软件源
+
+本节将介绍如何通过“dnf config-manager”命令添加、启用和禁用软件源仓库。
+
+#### 添加软件源
+
+要定义一个新的软件源仓库,您可以在 /etc/dnf/dnf.conf 文件中添加“repository”部分,或者在/etc/yum.repos.d/目录下添加“.repo”文件进行说明。建议您通过添加“.repo”的方式,每个软件源都有自己对应的“.repo”文件,以下介绍该方式的操作方法。
+
+要在您的系统中添加一个这样的源,请在root权限下执行如下命令,执行完成之后会在/etc/yum.repos.d/目录下生成对应的repo文件。其中 *repository\_url* 为repo源地址,详情请参见[表2](#zh-cn_topic_0151921080_t7c83ace02ab94e9986c0684f417e3436)。
+
+```shell
+# dnf config-manager --add-repo repository_url
+```
+
+#### 启用软件源
+
+要启用软件源,请在root权限下执行如下命令,其中 *repository* 为新增.repo文件中的repo id(可通过dnf repolist查询):
+
+```shell
+# dnf config-manager --set-enable repository
+```
+
+您也可以使用一个全局正则表达式,来启用所有匹配的软件源。其中 *glob\_expression* 为对应的正则表达式,用于同时匹配多个repo id:
+
+```shell
+# dnf config-manager --set-enable glob_expression
+```
+
+#### 禁用软件源
+
+要禁用软件源,请在root权限下执行如下命令:
+
+```shell
+# dnf config-manager --set-disable repository
+```
+
+同样的,您也可以使用一个全局正则表达式来禁用所有匹配的软件源:
+
+```shell
+# dnf config-manager --set-disable glob_expression
+```
+
+## 管理软件包
+
+使用dnf能够让您方便的进行查询、安装、删除软件包等操作。
+
+### 搜索软件包
+
+您可以使用rpm包名称、缩写或者描述搜索需要的RPM包,使用命令如下:
+
+```shell
+# dnf search httpd (以httpd为例)
+```
+
+### 列出软件包清单
+
+要列出系统中所有已安装的以及可用的RPM包信息,使用命令如下:
+
+```shell
+# dnf list all
+```
+
+要列出系统中特定的RPM包信息,使用命令如下:
+
+```shell
+# dnf list httpd (以httpd为例)
+```
+
+### 显示RPM包信息
+
+要显示一个或者多个RPM包信息,多个包之间以空格分隔,使用命令如下:
+
+```shell
+# dnf info httpd zip (以httpd,zip两个包为例)
+```
+
+### 安装RPM包
+
+要安装一个软件包及其所有未安装的依赖,请在root权限下执行如下命令:
+
+```shell
+# dnf install package_name
+```
+
+您也可以通过添加软件包名字同时安装多个软件包。配置文件/etc/dnf/dnf.conf添加参数strict=False,运行dnf命令参数添加\-\-setopt=strict=0。请在root权限下执行如下命令:
+
+```shell
+# dnf install package_name package_name... --setopt=strict=0
+```
+
+示例如下:
+
+```shell
+# dnf install httpd
+```
+
+>  **说明:**
+> 安装RPM包过程中,若出现安装失败,可参考[安装时出现软件包冲突、文件冲突或缺少软件包导致安装失败](./faqs.md#安装时出现软件包冲突文件冲突或缺少软件包导致安装失败)。
+
+### 下载软件包
+
+使用dnf下载软件包,请在root权限下输入如下命令:
+
+```shell
+# dnf download package_name
+```
+
+如果需要同时下载未安装的依赖,则加上\-\-resolve,使用命令如下:
+
+```shell
+# dnf download --resolve package_name
+```
+
+示例如下:
+
+```shell
+# dnf download --resolve httpd
+```
+
+### 删除软件包
+
+要卸载软件包以及相关的依赖软件包,请在root权限下执行如下命令:
+
+```shell
+# dnf remove package_name...
+```
+
+示例如下:
+
+```shell
+# dnf remove totem
+```
+
+## 管理软件包组
+
+软件包集合是服务于一个共同的目的一组软件包,例如系统工具集等。使用dnf可以对软件包组进行安装/删除等操作,使相关操作更高效。
+
+### 列出软件包组清单
+
+使用summary参数,可以列出系统中所有已安装软件包组、可用的组,可用的环境组的数量,命令如下:
+
+```shell
+# dnf groups summary
+```
+
+要列出所有软件包组和它们的组ID ,命令如下:
+
+```shell
+# dnf group list
+```
+
+### 显示软件包组信息
+
+要列出包含在一个软件包组中必须安装的包和可选包,使用命令如下:
+
+```shell
+# dnf group info glob_expression...
+```
+
+例如显示Development Tools信息,示例如下:
+
+```shell
+# dnf group info "Development Tools"
+```
+
+### 安装软件包组
+
+每一个软件包组都有自己的名称以及相应的ID(groupid),您可以使用软件包组名称或它的ID进行安装。
+
+要安装一个软件包组,请在root权限下执行如下命令:
+
+```shell
+# dnf group install group_name
+# dnf group install groupid
+```
+
+例如安装Development Tools相应的软件包组,命令如下:
+
+```shell
+# dnf group install "Development Tools"
+# dnf group install development
+```
+
+### 删除软件包组
+
+要卸载软件包组,您可以使用软件包组名称或它的ID,在root权限下执行如下命令:
+
+```shell
+# dnf group remove group_name
+# dnf group remove groupid
+```
+
+例如删除Development Tools相应的软件包组,命令如下:
+
+```shell
+# dnf group remove "Development Tools"
+# dnf group remove development
+```
+
+## 检查并更新
+
+dnf可以检查您的系统中是否有软件包需要更新。您可以通过dnf列出需要更新的软件包,并可以选择一次性全部更新或者只对指定包进行更新。
+
+### 检查更新
+
+如果您需要显示当前系统可用的更新,使用命令如下:
+
+```shell
+# dnf check-update
+```
+
+### 升级
+
+如果您需要升级单个软件包,在root权限下执行如下命令:
+
+```shell
+# dnf update package_name
+```
+
+例如升级rpm包,示例如下:
+
+```shell
+# dnf update anaconda-gui.aarch64 (以anaconda-gui包为例)
+```
+
+类似的,如果您需要升级软件包组,在root权限下执行如下命令:
+
+```shell
+# dnf group update group_name
+```
+
+### 更新所有的包和它们的依赖
+
+要更新所有的包和它们的依赖,在root权限下执行如下命令:
+
+```shell
+# dnf update
+```
diff --git a/docs/en/25.03/Server/Administration/Administrator/viewing-system-information.md b/docs/en/25.03/Server/Administration/Administrator/viewing-system-information.md
new file mode 100644
index 0000000000000000000000000000000000000000..87473680384a361ab9f7d8f38f4c3c8c870783d8
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/Administrator/viewing-system-information.md
@@ -0,0 +1,45 @@
+# 查看系统信息
+
+- 查看系统信息,命令如下:
+
+ ```shell
+ cat /etc/os-release
+ ```
+
+ 例如,命令和输出如下:
+
+ ```shell
+ $ cat /etc/os-release
+ NAME="openEuler"
+ VERSION="23.09"
+ ID="openEuler"
+ VERSION_ID="23.09"
+ PRETTY_NAME="openEuler 23.09"
+ ANSI_COLOR="0;31"
+ ```
+
+- 查看系统相关的资源信息。
+
+ 查看CPU信息,命令如下:
+
+ ```shell
+ # lscpu
+ ```
+
+ 查看内存信息,命令如下:
+
+ ```shell
+ free
+ ```
+
+ 查看磁盘信息,命令如下:
+
+ ```shell
+ fdisk -l
+ ```
+
+- 查看系统资源实时信息,命令如下:
+
+ ```shell
+ top
+ ```
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/_menu.md b/docs/en/25.03/Server/Administration/CompaCommand/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..041e2b9858750adda95abe57ed9c204796c5ded2
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/CompaCommand/_menu.md
@@ -0,0 +1,10 @@
+---
+label: '兼容性命令'
+ismanual: 'Y'
+description: '基于 Rust 语言重构的 shell 及 Linux 命令,与 Linux 原生命令兼容'
+children:
+ - label: 'utshell用户指南'
+ href: './utshell_guide.md'
+ - label: 'utsudo用户指南'
+ href: './utsudo_user_guide.md'
+---
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828094539717.png b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828094539717.png
new file mode 100644
index 0000000000000000000000000000000000000000..db620cb37b44ba6cc3c30035ce65a2ef5a18efea
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828094539717.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828094723153.png b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828094723153.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe85725a5748b7405bf0c4ac104158449098403e
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828094723153.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828135001624.png b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828135001624.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b17e0dd49ad6ec34028fc233738581d0fa6e209
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828135001624.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828140355863.png b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828140355863.png
new file mode 100644
index 0000000000000000000000000000000000000000..de9dbabc6e6f8a157a18e23ee8fbeb68ec2630e1
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828140355863.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828140709441.png b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828140709441.png
new file mode 100644
index 0000000000000000000000000000000000000000..9dd87d5c65190428efd9bf81ee18e8809d6cc6d9
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/figures/image-20230828140709441.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/media/media/image1.png b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image1.png
new file mode 100644
index 0000000000000000000000000000000000000000..feff5b7bae51f432b5a8a05828295ace5b2f616d
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image1.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/media/media/image2.png b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image2.png
new file mode 100644
index 0000000000000000000000000000000000000000..c241e9356595daf58732a25a2bb31cd0a75bd027
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image2.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/media/media/image3.png b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image3.png
new file mode 100644
index 0000000000000000000000000000000000000000..f00123d7b8553d8b7c374c7a0becd4269a663084
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image3.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/media/media/image4.png b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image4.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a047ff75fb1144c7df513345acef97357aa82b7
Binary files /dev/null and b/docs/en/25.03/Server/Administration/CompaCommand/media/media/image4.png differ
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/overview.md b/docs/en/25.03/Server/Administration/CompaCommand/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..847b50270f91686278a8fa70b96144c557929ddf
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/CompaCommand/overview.md
@@ -0,0 +1,3 @@
+# 兼容性命令
+
+本文档是介绍基于 Rust 语言重构的 shell 及 Linux 命令,可在 openEuler 系统上使用,与 Linux 原生命令兼容。
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/utshell_guide.md b/docs/en/25.03/Server/Administration/CompaCommand/utshell_guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..65a02a46f73e2e9358d9079ce45716894bf3ba66
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/CompaCommand/utshell_guide.md
@@ -0,0 +1,273 @@
+# utshell 用户手册
+
+## 介绍
+
+utshell 是一个与 bash 兼容的 shell。它实现了基本的内建命令执行和启动外部命令。同时也实现了任务、管道和信号处理等功能。
+
+## 安装和卸载
+
+### 安装
+
+utshell 使用 rpm 命令进行安装,我们假设使用的是欧拉的 2309 系统:
+
+进入命令行界面执行:
+
+
+
+根据提示输入\"y\",即可安装成功。
+
+
+
+### 卸载
+
+在命令行执行`rpm -e utshell`即可卸载 utshell。
+
+```shell
+
+rpm -e utshell
+
+```
+
+
+
+## 使用
+
+### 一般命令
+
+在 utshell 环境下,直接键入命令名即可执行对应的命令。
+
+utshell 支持如下内建命令:
+
+
+
+### 变量定义和使用
+
+#### 变量定义
+
+变量定义直接用\"=\",中间不能有空格。
+
+```shell
+
+var=4
+
+```
+
+#### 变量使用
+
+```shell
+
+echo \${var}
+
+```
+
+### 数组的定义和使用
+
+#### 数组的定义
+
+```shell
+
+distros=(ubuntu fedora suse \"arch linux\")
+
+```
+
+#### 数组的使用
+
+```shell
+
+echo \${distros\[2\]}
+
+```
+
+### 函数定义和使用
+
+#### 函数的定义
+
+```shell
+
+func() { echo \$1; }
+
+```
+
+#### 函数的调用
+
+```shell
+
+func 1
+
+```
+
+#### 给函数传递参数
+
+调用函数时,在函数名后面直接以空格分割参数:
+
+func firstParam secondParam
+
+在函数体中使用\$1,\$2\...\...其中\$1 表示第一个参数,\$2 表示第二个参数,大于 9 的需要用大括号括起来。
+
+```shell
+
+func() {
+
+echo \$1 \${10} \#需要传递 10 个参数
+
+}
+
+\#调用
+
+func 1 2 3 4 5 6 7 8 9 0
+
+```
+
+### 逻辑判断
+
+#### if 语句
+
+语法为:
+
+```shell
+
+if condition; then
+
+do-if-true;
+
+elif second-condition; then
+
+do-else-if-true
+
+elif third-condition; then
+
+do-else-if-third-true
+
+else
+
+do-else-false
+
+fi
+
+```
+
+其中 condition 可以是命令,如:
+
+```shell
+
+if \[ \"\$s\" = \"string\" \]; then
+
+echo \"string is equivalent to \\\$s\"
+
+else
+
+echo \"string is not equivalent to \\\$s\"
+
+fi
+
+```
+
+也可以是测试条件操作符:
+
+下面简单介绍些条件操作符:
+
+```shell
+
+ -f 检查文件是否存在并且它是一个普通文件。
+
+ -d 检查提供的参数是否是目录。
+
+ -h 检查提供的参数是否是符号链接。
+
+ -s 检查文件是否存在且不为空。
+
+ -r 检查文件是否可读。
+
+ -w 检查文件是否可写。
+
+ -x 检查文件是否可执行。
+
+```
+
+如果用于数字比较,可以用如下测试条件操作符:
+
+```shell
+
+ -lt 小于
+
+ -gt 大于
+
+ -ge 大于等于
+
+ -le 小于等于
+
+ -ne 不等于
+
+```
+
+如果用于字符串比较,可以用如下测试条件操作符:
+
+```shell
+
+ == 两个字符串相同
+
+ = 两个字符串相同(同==)
+
+ != 两个字符串不同
+
+ -z 空字符串,返回 true
+
+ -n 长度不是 0,则返回 true
+
+```
+
+### 循环
+
+#### for 循环
+
+```shell
+
+for number in 1 2 3 4 5
+
+do
+
+echo \$number
+
+done
+
+使用列表:
+
+for number in {1..500..2}
+
+do
+
+echo \$number
+
+done
+
+```
+
+其中{1..500..2}表示起始数字为 1,结束数字为 500(包括),步长为 2。
+
+#### until 循环
+
+```shell
+
+until \[condition\]; do
+
+commands
+
+done
+
+```
+
+当条件为真时,执行循环;
+
+#### while 循环
+
+```shell
+
+while \[ condition \]; do
+
+commands
+
+done
+
+```
+
+当条件为真时,执行循环。
diff --git a/docs/en/25.03/Server/Administration/CompaCommand/utsudo_user_guide.md b/docs/en/25.03/Server/Administration/CompaCommand/utsudo_user_guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..3200c0588968a7b10b63650304f158476f276a14
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/CompaCommand/utsudo_user_guide.md
@@ -0,0 +1,83 @@
+# utsudo 使用指南
+
+本文档主要介绍`utsudo`工具的安装和简单使用,帮助用户快速上手。`utsudo`从参数功能到插件使用都是完全兼容`sudo`,大大降低了用户的学习成本,欢迎大家使用。
+
+本文档主要适用于`utsudo`的开发人员、测试人员、以及普通用户。
+
+## utsudo 介绍
+
+utsudo 诞生于 2022 年 6 月份,是一个目前正在进行的使用 Rust 语言重构 Sudo 的项目。utsudo 旨在提供一个更加高效、安全、灵活的提权工具,涉及的模块主要有:通用工具库、整体框架和插件功能等。
+
+## utsudo 安装
+
+在`0.0.1`版本中,`utsudo`与`sudo`还存在部分文件冲突。需要先使用`yum`命令,把`utsudo`的二进制`rpm`包下载到本地,再使用`rpm`命令进行安装 ,以允许与`sudo`的文件冲突。
+
+首先使用`yumdownloader utsudo`命令下载`utsudo`二进制包到本地。
+
+然后使用`sudo rpm -Uvh utsudo-0.0.1-0.01.x86_64.rpm --replacefiles`命令安装`utsudo`,执行过程如下所示。
+
+
+
+安装完成后,使用`rpm -qa | grep utsudo`命令查看`utsudo`是否正常安装,如下图所示。
+
+
+
+由上图可知,`utsudo`已正常安装,安装的版本是`0.0.1-0.01`。
+
+`utsudo`后续还会有版本更新,大家以自己安装的版本为准。
+
+## utsudo使用
+
+下面给大家介绍一下`utsudo`的简单使用。
+
+`utsudo`参数较多,下面简单列出部分参数,详细内容可使用`utsudo -h`列出。
+
+```shell
+
+-e, --edit 编辑文件而非执行命令
+-k, --reset-timestamp 无效的时间戳文件
+-l, --list 列出用户权限或检查某个特定命令;对于长格式,使用两次
+
+```
+
+### `-e` 参数
+
+`-e`参数的功能:编辑文件。
+
+`utsudo -e`相当于`sudoedit`命令,执行时会调用普通用户进行编辑,而位于调用用户可写目录中的文件是无法编辑的,除非该用户是`root`用户。
+
+在当前用户没有可写权限的目录`e`中,存在一个当前用户没有可编辑权限的文件:`test.txt`。使用普通用户编辑`test.txt`文件,会提示没有权限。使用`utsudo -e`后,可以正常编辑。具体执行过程如下图所示。
+
+
+
+由上图可知,成功修改了`test.txt`文件的内容。(其中`utsudo -e is okay !!`,是我们在编辑器中自己添加的。)
+
+### `-k`参数
+
+`-k`参数功能:使时间戳无效。
+
+默认使用`utsudo`执行命令时,第一次是需要输入密码的,短时间内(默认是5分钟)再次执行`sudo`命令则不需要再次输入密码。使用`-k`参数可以强迫使用者在下一次执行`utsudo`时询问密码。
+
+
+
+`utsudo`输入密码后,默认`5`分钟之内不需要输入密码。
+
+但是,由上图可知,`utsudo -k`使得`utsudo`的时间戳失效了。
+
+### `-l`参数
+
+`-l`参数功能:用于显示当前用户可以用`utsudo`执行哪些命令。
+
+执行过程如下所示:
+
+
+
+上图显示了`test`用户,可以运行如下命令:
+
+```shell
+(ALL) ALL
+```
+
+也就是所有命令,说明`/etc/sudoers`文件中,并没有对`test`用户做过多的限制。
+
+`utsudo`的使用,就简单介绍这些,除了上面介绍到的,`utsudo`还有很多其他的功能和参数,此处就不一一列举了。欢迎大家讨论。
diff --git a/docs/en/25.03/Server/Administration/sysMaster/_menu.md b/docs/en/25.03/Server/Administration/sysMaster/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..4d8914c66edeb3c1657daea8e4daf509b4d68363
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/_menu.md
@@ -0,0 +1,22 @@
+---
+label: 'sysMaster用户指南'
+ismanual: 'Y'
+description: '使用 sysMaster 管理服务器和设备'
+children:
+ - label: '概述'
+ href: './overview.md'
+ - label: '服务管理'
+ href: './service_management.md'
+ children:
+ - label: '安装与部署'
+ href: './sysmaster_install_deploy.md'
+ - label: '使用说明'
+ href: './sysmaster_usage.md'
+ - label: '设备管理'
+ href: './device_management.md'
+ children:
+ - label: '安装与部署'
+ href: './devmaster_install_deploy.md'
+ - label: '使用说明'
+ href: './devmaster_usage.md'
+---
diff --git a/docs/en/25.03/Server/Administration/sysMaster/device_management.md b/docs/en/25.03/Server/Administration/sysMaster/device_management.md
new file mode 100644
index 0000000000000000000000000000000000000000..9fa6b496e474b31d090c5ff35a0679fa072b6e93
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/device_management.md
@@ -0,0 +1,14 @@
+# 设备管理
+
+设备管理器作为链接用户态软件与底层物理设备的桥梁,支撑着 `lvm2`、`NetworkManager`等关键基础软件的运作。`devmaster`作为 `sysMaster`的设备管理组件,一方面支撑 `sysMaster`的快速启动以及用户态软件的生态兼容,另一方面通过对 `Linux`生态下主流设备管理方案的现状和优劣进行了总结和思考,从而提供一种分层解耦、可扩展性强、面向通用 `OS`的设备管理能力。
+
+`devmaster`由常驻进程、客户端工具和动态库组成。常驻进程`devmaster`基于内核提供的`netlink`、`inotify`、`sysfs`等机制,监听设备事件并触发规则处理任务;客户端工具`devctl`和动态库`libs`提供一组命令行指令以及公开接口,用于调试规则、控制常驻进程、查询设备状态等等。`devmaster`的总体架构如下图所示:
+
+**图1 devMaster的总体架构**
+
+
+`devmaster`使用 `Rust`语言编写,能够原生消除内存安全类问题。`devmaster`的核心功能如下:
+
+1. 事件驱动:利用队列缓存和 `worker`池机制,满足设备事件高并发的场景,并支持将设备就绪状态动态地通知到用户态进程。
+2. 机制与策略分离:将设备处理逻辑定义在规则中,避免业务硬编码,提供按需定制、灵活组合的能力。
+3. 生态兼容:良好地兼容 `udev`语法和 `udev`用户态广播协议,支持原有业务低成本迁移到 `devmaster`环境。
diff --git a/docs/en/25.03/Server/Administration/sysMaster/devmaster_install_deploy.md b/docs/en/25.03/Server/Administration/sysMaster/devmaster_install_deploy.md
new file mode 100644
index 0000000000000000000000000000000000000000..4c5b602f46062936c73c990747e39aa9da07672c
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/devmaster_install_deploy.md
@@ -0,0 +1,67 @@
+# 安装与部署
+
+`devmaster`目前可应用于虚拟机环境,本章节介绍安装部署的规格约束以及操作流程。
+
+## 软件要求
+
+* 操作系统:`openEuler 23.09`
+
+## 硬件要求
+
+* `x86_64`架构、`aarch64`架构
+
+## 安装部署流程
+
+1. 执行如下命令,使用`yum`工具安装`sysmaster-devmaster`包:
+
+ ```shell
+ # yum install sysmaster-devmaster
+ ```
+
+2. 执行如下命令,创建默认规则文件`/etc/devmaster/rules.d/99-default.rules`和常驻进程的配置文件`/etc/devmaster/config.toml`:
+
+ ```shell
+ # mkdir -p /etc/devmaster/rules.d
+ # mkdir -p /etc/devmaster/network.d
+ # echo "TAG+=\"devmaster\"" > /etc/devmaster/rules.d/99-default.rules
+ # cat << EOF > /etc/devmaster/config.toml
+ log_level = "info"
+ rules_d = ["/etc/devmaster/rules.d"]
+ network_d = ["/etc/devmaster/network.d"]
+ max_workers = 1
+ log_targets = ["console"]
+ EOF
+ ```
+
+3. 执行如下命令启动常驻进程`devmaster`,并将日志导出到`/tmp/devmaster.log`文件中:
+
+ ```shell
+ # /lib/devmaster/devmaster &>> /tmp/devmaster.log &
+ ```
+
+ >  **说明:**
+ > `devmaster`需要以 `root`权限启动,并且不能和 `udev`同时处于运行状态,启动 `devmaster`前需要停止`udev`服务。
+
+ 要停止`udev`服务,`sysmaster`启动环境下,执行以下命令:
+
+ ```shell
+ # sctl stop udevd.service udevd-control.socket udevd-kernel.socket
+ ```
+
+ 要停止`udev`服务,`systemd`启动环境下,执行以下命令:
+
+ ```shell
+ # systemctl stop systemd-udevd.service systemd-udevd systemd-udevd-kernel.socket systemd-udevd-control.socket
+ ```
+
+4. 执行如下命令,使用 `devctl`工具触发设备事件:
+
+ ```shell
+ # devctl trigger
+ ```
+
+5. 查看 `/run/devmaster/data/`目录,如果生成设备数据库,则表示部署成功:
+
+ ```shell
+ # ll /run/devmaster/data/
+ ```
diff --git a/docs/en/25.03/Server/Administration/sysMaster/devmaster_usage.md b/docs/en/25.03/Server/Administration/sysMaster/devmaster_usage.md
new file mode 100644
index 0000000000000000000000000000000000000000..77d56576ac5bfb6c1c6a78932495170c35bbf2ed
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/devmaster_usage.md
@@ -0,0 +1,251 @@
+# 使用说明
+
+本章介绍 `devmaster`的使用方法,包括常驻进程配置、客户端工具、规则使用说明和网卡配置。
+
+## 常驻进程配置
+
+常驻进程 `devmaster`启动后会读取配置文件,并根据配置文件内容,调整日志级别、设置规则加载路径等等。`devmaster`拥有唯一的配置文件,路径为 `/etc/devmaster/config.toml`,文件内容采用 `toml`格式。
+
+### 配置选项
+
+目前 `devmaster`配置文件中支持的配置选项如下:
+
+- `rules_d`: 指定规则加载路径,默认规则中设置为 `["/etc/devmaster/rules.d"]`,未指定时无默认加载路径。`devmaster`当前不支持规则加载优先级,不同规则路径下的同名规则文件不会发生覆盖。规则文件的加载顺序按照 `rules_d`配置项中指定的目录顺序,相同目录下按照规则文件的字典序进行加载。
+- `max_workers`: 指定最大 `worker`线程并发数,未指定时默认为3。
+- `log_level`: 指定日志级别,支持 `debug`和 `info`级别,未指定时默认为 `"info"`。
+- `network_d`: 指定网卡配置加载路径,默认规则中设置为 `["/etc/devmaster/network.d"]`,未指定时无默认加载路径。网卡配置用于控制 `devmaster`的内置命令 `net_setup_link`的行为,具体可参考[网卡配置说明](#网卡配置)。
+
+## 客户端工具
+
+`devctl`是常驻进程 `devmaster`的客户端工具,用来控制 `devmaster`的行为、模拟设备事件、调试规则等等。
+
+ ```shell
+ # devctl --help
+ devmaster 0.5.0
+ parse program arguments
+
+ USAGE:
+ devctl
+
+ OPTIONS:
+ -h, --help Print help information
+ -V, --version Print version information
+
+ SUBCOMMANDS:
+ monitor Monitor device events from kernel and userspace
+ kill Kill all devmaster workers
+ test Send a fake device to devmaster
+ trigger Trigger a fake device action, then the kernel will report an uevent
+ test-builtin Test builtin command on a device
+ help Print this message or the help of the given subcommand(s)
+ ```
+
+选项说明:
+
+ `-h, --help`: 显示帮助信息。
+
+ `-V, --version`: 显示版本信息。
+
+ ``: 选择执行的子命令,包括`monitor`、`trigger`、`test-builtin`等。
+
+接下来介绍三种常用的子命令,分别用于监听设备事件、触发设备事件以及测试内置命令。
+
+### 监听设备事件
+
+监听内核上报的 `uevent`事件和 `devmaster`处理完设备后发出的事件,分别以 `KERNEL`和 `USERSPACE`作为前缀进行区分,执行的命令如下:
+
+ ```shell
+ # devctl monitor [OPTIONS]
+ ```
+
+选项说明:
+
+ `-h, --help`: 显示帮助信息。
+
+### 触发设备事件
+
+模拟一个设备动作,使内核上报对应的uevent事件,用于重放内核初始化过程中的冷插(coldplug)设备事件,执行的命令如下:
+
+ ```shell
+ # devctl trigger [OPTIONS] [DEVICES...]
+ ```
+
+选项说明:
+
+ `-h, --help`: 显示帮助信息。
+
+ `-a, --action `: 指定设备事件的动作类型。
+
+ `-t, --type `: 指定搜索的设备类型,可以是`devices`(设备)或者`subsystems`(子系统)。
+
+ `-v, --verbose`: 打印搜索到的设备。
+
+ `-n, --dry-run`: 不会实际触发设备事件,配合`--verbose`选项使用时,可以查看系统中的设备清单。
+
+ `[DEVICES...]`: 指定若干个需要触发事件的设备,如果为空,则触发系统中所有设备的事件。
+
+### 测试内置命令
+
+测试内置命令在某个设备上的执行效果,执行的命令如下:
+
+ ```shell
+ # devctl test-builtin [OPTIONS]
+ ```
+
+选项说明:
+
+ `-a, --action `: 指定设备事件的动作类型,包括:`add`、`change`、`remove`、`move`、`online`、`offline`、`bind`和 `unbind`。
+
+ `-h, --help`: 显示帮助信息。
+
+ ``: 选择执行的内置命令,目前支持`blkid`、`input_id`、`kmod`、`net_id`、`net_setup_link`、`path_id`、`usb_id`。
+
+ ``: 指定设备的 `sysfs`路径。
+
+## 规则使用说明
+
+`devmaster`的规则由一组规则文件组成,`devmaster`常驻进程启动后会根据配置文件中指定的规则加载目录,按字典序依次加载各个规则文件。
+
+>  **说明:**
+> 增加、删除、修改规则后,均需要重启 `devmaster`使之生效。
+
+### 常用规则案例
+
+以下介绍几种常见的规则应用案例,规则语法详见官方文档中的[devmaster手册](http://sysmaster.online/man/exts/devmaster/devmaster/)。
+
+#### 示例1: 创建块设备软链接
+
+通过 `blkid`内置命令,读取块设备的 `uuid`,并基于 `uuid`创建块设备的软链接。
+
+触发拥有文件系统的某块设备的事件后,在 `/dev/test`目录下生成该设备对应的软链接。
+
+以 `sda1`分区块设备为例,测试规则效果:
+
+1. 创建规则文件 `/etc/devmaster/rules.d/00-persist-storage.rules`,内容如下:
+
+ ```shell
+ SUBSYSTEM!="block", GOTO="end"
+
+ IMPORT{builtin}=="blkid"
+
+ ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="test/$env{ID_FS_UUID_ENC}"
+
+ LABEL="end"
+ ```
+
+2. 触发 `sda1`设备的事件:
+
+ ```shell
+ # devctl trigger /dev/sda1
+ ```
+
+3. 查看 `/dev/test/`目录下存在指向 `sda1`的软链接,表示规则生效:
+
+ ```shell
+ # ll /dev/test/
+ total 0
+ lrwxrwxrwx 1 root root 7 Sep 6 15:35 06771fe1-39da-42d7-ad3c-236a10d08a7d -> ../sda1
+ ```
+
+#### 示例2: 网卡重命名
+
+使用 `net_id`内置命令,获取网卡设备的硬件属性,再使用 `net_setup_link`内置命令,基于网卡配置选择某个硬件属性作为网卡名,最后通过 `NAME`规则重命名网卡。
+
+以 `ens33`网卡为例,测试网卡重命名规则的效果:
+
+1. 创建规则文件 `/etc/devmaster/rules.d/01-netif-rename.rules`,内容如下:
+
+ ```shell
+ SUBSYSTEM!="net", GOTO="end"
+
+ IMPORT{builtin}=="net_id"
+
+ IMPORT{builtin}=="net_setup_link"
+
+ ENV{ID_NET_NAME}=="?*", NAME="$env{ID_NET_NAME}"
+
+ LABEL="end"
+ ```
+
+2. 创建网卡配置`/etc/devmaster/network.d/99-default.link`,内容如下:
+
+ ```shell
+ [Match]
+ OriginalName = "*"
+
+ [Link]
+ NamePolicy = ["database", "onboard", "slot", "path"]
+ ```
+
+3. 先将网卡设备下线:
+
+ ```shell
+ # ip link set ens33 down
+ ```
+
+4. 将网卡名临时命名为 `tmp`:
+
+ ```shell
+ # ip link set ens33 name tmp
+ ```
+
+5. 触发网卡设备的 `add`事件:
+
+ ```shell
+ # devctl trigger /sys/class/net/tmp --action add
+ ```
+
+6. 查看网卡名称,发现重新命名为 `ens33`,表示规则生效:
+
+ ```shell
+ # ll /sys/class/net/| grep ens33
+ lrwxrwxrwx 1 root root 0 Sep 6 11:57 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
+ ```
+
+7. 激活网卡后恢复网络连接:
+
+ ```shell
+ # ip link set ens33 up
+ ```
+
+>  **说明:**
+> 网卡设备处于激活状态下无法重命名,需要先将其下线。另外 `devmaster`仅在网卡设备的 `add`事件下对网卡重命名才会生效。
+
+#### 示例3: 修改设备节点的用户权限
+
+`OPTIONS+="static_node=`规则会使 `devmaster`启动后,立即将本规则行中的用户权限应用在 `/dev/`设备节点上。重启 `devmaster`后立即生效,无需设备事件触发。
+
+1. 创建规则文件`/etc/devmaster/rules.d/02-devnode-privilege.rules`,内容如下:
+
+ ```shell
+ OWNER="root", GROUP="root", MODE="777", OPTIONS+="static_node=tty5"
+ ```
+
+2. 重启 `devmaster`后,观察 `/dev/tty5`的用户、用户组和权限,变更为 `root`、`root`和 `rwxrwxrwx`,表示规则生效:
+
+ ```shell
+ # ll /dev/tty5
+ crwxrwxrwx 1 root root 4, 5 Feb 3 2978748 /dev/tty5
+ ```
+
+## 网卡配置
+
+`devmaster`的网卡重命名功能由内置命令 `net_id`、`net_setup_link`和网卡配置文件配合完成。在规则文件中,通过 `net_id`获取网卡的硬件属性,再使用 `net_setup_link`选择某个网卡属性作为新的网卡名。`net_setup_link`命令基于网卡配置,针对特定网卡设备,控制网卡命名的风格。本章主要介绍网卡配置文件的使用方法,网卡重命名的实施方法可参考[网卡重命名规则案例](#示例2-网卡重命名)。
+
+### 默认网卡配置
+
+`devmaster`提供了如下默认网卡配置:
+
+ ```toml
+ [Match]
+ OriginalName = "*"
+
+ [Link]
+ NamePolicy = ["onboard", "slot", "path"]
+ ```
+
+网卡配置文件中包含 `[Match]`匹配节和 `[Link]`控制节,每节中包含若干配置项。匹配节的配置项用于匹配网卡设备,当网卡满足所有匹配条件时,将控制节中的所有配置项作用在网卡上,比如设置网卡名选取策略、调整网卡参数等等。
+
+以上列举的默认网卡配置表示将该配置作用在所有网卡设备上,并依次检查 `onboard`、`slot`和 `path`风格的网卡命名风格,如果找到一个可用的风格,就以该风格对网卡进行命名。
+
+网卡配置的详细说明可以参考 `sysMaster`官方手册中的[devmaster手册](http://sysmaster.online/man/exts/devmaster/netif_config/#1)。
diff --git a/docs/en/25.03/Server/Administration/sysMaster/figures/devmaster_architecture.png b/docs/en/25.03/Server/Administration/sysMaster/figures/devmaster_architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..c60c9505c570093c78fa5335b590e7da58c7cc7c
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/figures/devmaster_architecture.png differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/figures/sysMaster.png b/docs/en/25.03/Server/Administration/sysMaster/figures/sysMaster.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f4a8d239727c4d22f2b8841946bb12cd4a8d86b
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/figures/sysMaster.png differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/overview.md b/docs/en/25.03/Server/Administration/sysMaster/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..f6e9a47416daf2f6fe4fc45f8f4c1e4ede347042
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/overview.md
@@ -0,0 +1,26 @@
+# sysMaster用户指南
+
+## 概述
+
+`sysMaster`是一套超轻量、高可靠的服务管理程序集合,是对 `1`号进程的全新实现,旨在改进传统的 `init`守护进程。它使用 `Rust`编写,具有故障监测、秒级自愈和快速启动等能力,从而提升操作系统可靠性和业务可用度。
+
+`sysMaster`支持进程、容器和虚拟机的统一管理,其适用于服务器、云计算和嵌入式等多个场景。
+
+`sysMaster`实现思路是将传统 `1`号进程的功能解耦分层,结合使用场景,拆分出 `1+1+N`的架构。
+
+如下面 `sysMaster`系统架构图所示,主要包含三个方面:
+• `sysmaster-init`:新的 `1`号进程提供系统初始化、僵尸进程回收、监控保活等功能,可单独应用于嵌入式场景。
+• `sysmaster-core`:承担原有服务管理的核心功能,引入可靠性框架,使其具备崩溃快速自愈、热升级等能力,保障业务全天在线。
+• `sysmaster-exts`:使原本耦合的各组件功能独立,提供系统关键功能的组件集合(如设备管理 `devMaster`,总线通信 `busMaster`等),各组件可单独使用,可根据不同场景灵活选用。
+
+**图1** sysMaster整体架构图
+
+
+`sysMaster`目前主要由 `sysmaster`和 `devmaster`2部分功能组成,其中 `sysmaster`负责服务的管理,`devmaster`负责设备的管理,下面将对这2部分功能进行说明。
+
+## 读者对象
+
+本文档主要适用于使用 `openEuler`并需要对服务和设备进行管理的用户。用户需要具备以下经验和技能:
+
+* 熟悉 `Linux`基本操作
+* 对服务配置和设备有一定了解
diff --git a/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-caution.gif b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-danger.gif b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-note.gif b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-notice.gif b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-tip.gif b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-warning.gif b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Administration/sysMaster/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Server/Administration/sysMaster/service_management.md b/docs/en/25.03/Server/Administration/sysMaster/service_management.md
new file mode 100644
index 0000000000000000000000000000000000000000..ba8dedd4f178a8048eba05d6d0234c17f76f3fd2
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/service_management.md
@@ -0,0 +1,5 @@
+# 服务管理
+
+在 `Linux`中,有很多在后台运行的程序或进程,如 `Web`服务器、数据库服务器、邮件服务器等。系统启动和运行过程中会启动和停止这些程序。 `sysmaster`对此提供了高效的服务管理的命令及配置,确保系统正常工作。
+
+本文主要介绍 `sysmaster`的安装部署与各个特性说明和使用方法,使用户能够快速了解并使用。
diff --git a/docs/en/25.03/Server/Administration/sysMaster/sysmaster_install_deploy.md b/docs/en/25.03/Server/Administration/sysMaster/sysmaster_install_deploy.md
new file mode 100644
index 0000000000000000000000000000000000000000..19acc7673fc287af4ca341eabd88a0fe809da256
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/sysmaster_install_deploy.md
@@ -0,0 +1,100 @@
+# 安装与部署
+
+`sysmaster`可应用于容器和虚拟机,本文档将以 `aarch64`系统为例说明如何在各场景下进行安装与部署。
+
+## 软件要求
+
+* 操作系统:`openEuler 23.09`
+
+## 硬件要求
+
+* `x86_64`架构、`aarch64`架构
+
+## 容器场景安装与部署
+
+1. 安装 docker
+
+ ```bash
+ yum install -y docker
+ systemctl restart docker
+ ```
+
+2. 加载基础容器镜像
+
+ 下载容器镜像
+
+ ```bash
+ wget https://repo.openeuler.org/openEuler-23.09/docker_img/aarch64/openEuler-docker.aarch64.tar.xz
+ xz -d openEuler-docker.aarch64.tar.xz
+ ```
+
+ 加载容器镜像
+
+ ```bash
+ docker load --input openEuler-docker.aarch64.tar
+ ```
+
+3. 构建容器
+
+ 创建 Dockerfile
+
+ ```bash
+ cat << EOF > Dockerfile
+ FROM openeuler-23.09
+ RUN yum install -y sysmaster
+ CMD ["/usr/lib/sysmaster/init"]
+ EOF
+ ```
+
+ 构建容器
+
+ ```bash
+ docker build -t openeuler-23.09:latest .
+ ```
+
+4. 启动并进入容器
+
+ 启动容器
+
+ ```bash
+ docker run -itd --privileged openeuler-23.09:latest
+ ```
+
+ 获取`CONTAINERID`
+
+ ```bash
+ docker ps
+ ```
+
+ 使用上一步获取到`CONTAINERID`进入容器
+
+ ```bash
+ docker exec -it CONTAINERID /bin/bash
+ ```
+
+## 虚拟机场景安装与部署
+
+1. `initramfs`镜像制作
+ 为了避免 `initrd`阶段 `systemd`的影响,需要制作一个剔除 `systemd`的 `initramfs`镜像,并以该镜像进入 `initrd`流程。使用如下命令:
+
+ ```bash
+ dracut -f --omit "systemd systemd-initrd systemd-networkd dracut-systemd" /boot/initrd_withoutsd.img
+ ```
+
+2. 新增启动项
+
+ 在 `grub.cfg`中增加新的启动项,`aarch64`下的路径为 `/boot/efi/EFI/openEuler/grub.cfg`,`x86_64`下的路径为 `/boot/grub2/grub.cfg`,拷贝一份原有启动项,并做以下几处修改:
+
+ * `menuentry` 项修改启动项名称 `openEuler (6.4.0-5.0.0.13.oe23.09.aarch64) 23.09`为 `openEuler 23.09 withoutsd`
+ * `linux` 项内核启动参数修改 `root=/dev/mapper/openeuler-root ro` 为 `root=/dev/mapper/openeuler-root rw`
+ * `linux` 项内核启动参数修改 `plymouth`,如果环境上安装了 `plymouth`, 需要添加 `plymouth.enable=0` 禁用 `plymouth`
+ * `linux` 项内核启动参数增加 `init=/usr/lib/sysmaster/init`
+ * `initrd` 项修改为 `/initrd_withoutsd.img`
+
+3. 安装 sysmaster
+
+ ```bash
+ yum install sysmaster
+ ```
+
+4. 重启后出现 `openEuler 23.09 withoutsd`启动项表示已成功配置,选择此启动项进入虚拟机
diff --git a/docs/en/25.03/Server/Administration/sysMaster/sysmaster_usage.md b/docs/en/25.03/Server/Administration/sysMaster/sysmaster_usage.md
new file mode 100644
index 0000000000000000000000000000000000000000..b39bef3db4da92c84ccb577a41a7130aac0a138b
--- /dev/null
+++ b/docs/en/25.03/Server/Administration/sysMaster/sysmaster_usage.md
@@ -0,0 +1,102 @@
+# sysmaster使用说明
+
+本章主要通过一些实例来带领用户初步使用 `sysmaster`,例如:
+
+* 如何创建 `service`服务单元配置文件。
+* 如何管理单元服务,例如启动、停止、查看服务。
+
+## 创建单元配置文件
+
+用户可以在 `/usr/lib/sysmaster/system/`目录下创建单元配置文件。
+
+### 单元配置文件的类型
+
+当前 `sysmaster`支持 `target`、`socket`、`service`类型的单元配置文件。
+
+* `target`:封装了一个由 `sysmaster`管理的启动目标,用于将多个单元集中到一个同步点。`sysmaster`提供不同阶段的 `target`单元,例如 `multi-user.target`代表系统已完成启动,用户可以依赖此目标,启动自己的服务。
+* `socket`:封装了一个用于进程间通信的套接字 `socket`, 以支持基于套接字的启动。例如用户可以配置 `service`单元依赖此 `socket`,当此 `socket`有数据写入时,`sysmaster`会拉起对应的 `service`单元。
+* `service`:封装了一个被 `sysmaster`监视与控制的进程。
+
+### 单元配置文件的构成
+
+单元配置文件通常由3块组成:
+
+* `Unit`:单元的公共配置说明,如服务名称、描述、依赖关系等。
+* `Install`:描述如何安装和启动服务。
+* `Service`、`Socket`:各个单元类型的配置。
+
+### 创建service单元配置
+
+`sshd`服务被用来远程登录到服务器,并在远程终端上执行命令和操作。
+使用如下配置项来创建一个 `sshd.service`服务单元配置。
+
+```bash
+[Unit]
+Description="OpenSSH server daemon"
+Documentation="man:sshd(8) man:sshd_config(5)"
+After="sshd-keygen.target"
+Wants="sshd-keygen.target"
+
+[Service]
+Type="notify"
+EnvironmentFile="-/etc/sysconfig/sshd"
+ExecStart="/usr/sbin/sshd -D $OPTIONS"
+ExecReload="/bin/kill -HUP $MAINPID"
+KillMode="process"
+Restart="on-failure"
+RestartSec=42
+
+[Install]
+WantedBy="multi-user.target"
+```
+
+以下是对单元配置文件中选项配置的说明,更多可以查阅[官方手册](http://sysmaster.online/man/all/)。
+
+* `Description`:说明该 `unit`的主要功能。
+* `Documentation`:说明该 `unit`的文档链接。
+* `After`:配置同时启动的单元的先后顺序,`sshd.service`服务将在 `sshd-keygen.target`之后启动。
+* `Wants`:配置一个单元对另一个单元的依赖,启动 `sshd.service`服务,将会自动启动 `sshd-keygen.target`。
+* `Type`:配置 `sysmaster` 如何启动此服务,`notify`表明需要主进程启动完成后发送通知消息。
+* `EnvironmentFile`:设置环境变量的文件读取路径。
+* `ExecStart`:配置服务启动时执行的命令,启动 `sshd.service`服务会执行 `sshd`命令。
+* `ExecReload`:配置重新加载 `sshd.service`的配置时执行的命令。
+* `KillMode`:配置当需要停止服务进程时,杀死服务进程的方法,`process`表示只杀死主进程。
+* `Restart`:配置服务不同情况下退出或终止,是否重新启动服务,`on-failure`表示当服务非正常退出时重新启动服务。
+* `RestartSec`:配置当服务退出时,重新拉起服务的间隔时间。
+* `WantedBy`:配置依赖当前 `sshd.service`服务的单元。
+
+## 管理单元服务
+
+`sctl`是 `sysmaster`的命令行工具,用于检查和控制 `sysmaster`服务端行为和各个服务的状态,它可以启动、停止、重启、检查系统服务。
+
+### 启动服务
+
+使用以下命令可以启动 `sshd`服务和运行 `ExecStart`所配置的命令。
+
+```bash
+sctl start sshd.service
+```
+
+### 停止服务
+
+使用以下命令可以停止 `sshd`服务,杀死 `ExecStart`所运行的进程。
+
+```bash
+sctl stop sshd.service
+```
+
+### 重启服务
+
+使用以下命令可以重启 `sshd`服务,该命令会先停止后启动服务。
+
+```bash
+sctl restart sshd.service
+```
+
+### 查看服务状态
+
+使用以下命令可以查看服务 `sshd`运行状态,用户可以查看服务的状态来获取服务是否正常运行。
+
+```bash
+sctl status sshd.service
+```
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/FAQ.md b/docs/en/25.03/Server/Development/ApplicationDev/FAQ.md
new file mode 100644
index 0000000000000000000000000000000000000000..a84d3a2cb3d5fd7eb7bf2637b97a385ed2222dde
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/FAQ.md
@@ -0,0 +1,19 @@
+# 常见问题与解决方法
+
+## **问题1:部分依赖java-devel的应用程序自编译失败**
+
+### 问题描述
+
+部分依赖java-devel的应用程序会出现使用rpmbuild命令自编译失败的问题。
+
+### 原因分析
+
+为了提供更新的openjdk特性和对广大java应用程序的兼容,openEuler同时提供了openjdk-1.8.0、openjdk-11等多个版本的openjdk。部分应用程序在编译时需要依赖java-devel包,安装java-devel包时系统会默认安装更高版本的java-11-openjdk,从而导致这些应用的编译失败。
+
+### 解决方法
+
+用户需手动使用如下命令安装java-1.8.0-openjdk后再使用rpmbuild命令进行自编译。
+
+```shell
+# yum install java-1.8.0-openjdk
+```
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/_menu.md b/docs/en/25.03/Server/Development/ApplicationDev/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..d7bc58ce51503b0fd705353d5e88f6364e1f8f34
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/_menu.md
@@ -0,0 +1,22 @@
+---
+label: '应用开发指南'
+ismanual: 'Y'
+description: '基于 openEuler 开发应用程序'
+children:
+ - label: '概述'
+ href: './application-development.md'
+ - label: '开发环境准备'
+ href: './preparations-for-development-environment.md'
+ - label: '使用GCC编译'
+ href: './using-gcc-for-compilation.md'
+ - label: '使用Clang编译'
+ href: './using-clang-for-compilation.md'
+ - label: '使用make编译'
+ href: './using-make-for-compilation.md'
+ - label: '使用JDK编译'
+ href: './using-jdk-for-compilation.md'
+ - label: '构建RPM包'
+ href: './building-an-rpm-package.md'
+ - label: '常见问题与解决方法'
+ href: './FAQ.md'
+---
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/application-development.md b/docs/en/25.03/Server/Development/ApplicationDev/application-development.md
new file mode 100644
index 0000000000000000000000000000000000000000..00b1c690c5a3a4dab74536e5f0347697a7c09a5b
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/application-development.md
@@ -0,0 +1,77 @@
+# 应用开发指南
+
+本文档简要介绍应用程序开发需要的常用工具,以指导用户使用openEuler并基于openEuler进行应用程序开发。
+
+## 概述
+
+本文档主要介绍如下四部分内容,以指导用户使用openEuler并基于openEuler进行代码开发。
+
+- 在openEuler系统中安装和使用GCC编译器,并完成一个简单代码的开发、编译和执行。
+- 在openEuler系统中使用JDK自带工具完成代码的编译和执行。
+- 在openEuler系统中安装IntelliJ IDEA进行Java开发。
+- 在本地或使用OBS(Open Build Service)创建RPM(The RPM Package Manager)软件包的方法。
+
+## 读者对象
+
+本文档适用于所有使用openEuler操作系统进行代码开发的用户。用户需要具备如下经验或能力:
+
+- 具备Linux操作系统基础知识
+- 了解Linux命令行的基本使用方法
+
+## 符号约定
+
+在本文中可能出现下列标志,它们所代表的含义如下。
+
+| 符号 |说明 |
+|:--- |:---- |
+| |用于传递设备或环境安全警示信息,若不避免,可能会导致设备损坏、数据丢失、设备性能降低或其他不可预知的结果。 “注意”不涉及人身伤害。|
+| |用于突出重要/关键信息、最佳实践和小窍门等。 “说明”不是安全警示信息,不涉及人身、设备及环境伤害。|
+
+## 命令行格式约定
+
+**表 1** 命令行格式的约定
+
+
+ 格式
+
+ 含义
+
+
+
+ 粗体
+
+ 命令行关键字,即命令中保持不变、必须照输的部分,采用 加粗 字体表示。
+
+
+ 斜体
+
+ 命令行参数,即命令中必须由实际值进行替代的部分,采用 斜体 表示。
+
+
+ [ ]
+
+ 用“[ ]”括起来的部分表示在命令配置时是可选的。
+
+
+ { x | y | ... }
+
+ 表示从两个或多个选项中选取一个。
+
+
+ [ x | y | ... ]
+
+ 表示从两个或多个选项中选取一个或者不选。
+
+
+ { x | y | ... } \*
+
+ 表示从两个或多个选项中选取多个,最少选取一个,最多选取所有选项。
+
+
+ [ x | y | ... ] \*
+
+ 表示从两个或多个选项中选取一个、多个或者不选。
+
+
+
+
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/building-an-rpm-package.md b/docs/en/25.03/Server/Development/ApplicationDev/building-an-rpm-package.md
new file mode 100644
index 0000000000000000000000000000000000000000..676e61fe293bd67277b58376a2ec4bae408e4e6c
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/building-an-rpm-package.md
@@ -0,0 +1,584 @@
+# 构建RPM包
+
+本章介绍通过本地或OBS构建RPM软件包的方法。详见打包规则 。
+
+## 打包说明
+
+### 原理介绍
+
+RPM打包的时候需要编译源码,需要把编译好的配置文件、二进制命令文件等放到合适的位置,还要根据需要对RPM的包进行测试,这些都需要先有一个“工作空间”。rpmbuild命令使用一套标准化的“工作空间”:
+
+```sh
+rpmdev-setuptree
+```
+
+rpmdev-setuptree这个命令就是安装 rpmdevtools 带来的。可以看到运行了这个命令之后,在“/root”目录(非root用户为“/home/用户名”目录)下多了一个 rpmbuild 的文件夹,目录结构如下:
+
+```sh
+# tree rpmbuild
+rpmbuild
+├── BUILD
+├── RPMS
+├── SOURCES
+├── SPECS
+└── SRPMS
+```
+
+内容相关的说明如下:
+
+
+ 目录
+
+ 宏代码
+
+ 名称
+
+ 功能
+
+
+
+ ~/rpmbuild/BUILD
+
+ %_builddir
+
+ 构建目录
+
+ 源码包被解压至此,并在该目录的子目录完成编译
+
+
+ ~/rpmbuild/RPMS
+
+ %_rpmdir
+
+ 标准 RPM 包目录
+
+ 生成/保存二进制 RPM 包
+
+
+ ~/rpmbuild/SOURCES
+
+ %_sourcedir
+
+ 源代码目录
+
+ 保存源码包(如 .tar 包)和所有 patch 补丁
+
+
+ ~/rpmbuild/SPECS
+
+ %_specdir
+
+ Spec 文件目录
+
+ 保存 RPM 包配置(.spec)文件
+
+
+ ~/rpmbuild/SRPMS
+
+ %_srcrpmdir
+
+ 源代码 RPM 包目录
+
+ 生成/保存源码 RPM 包(SRPM)
+
+
+
+
+
+SPECS 下是RPM包的配置文件,是RPM打包的“图纸”,这个文件会告诉rpmbuild命令如何去打包。“宏代码”这一列就可以在SPEC文件中用来代指所对应的目录,类似于编程语言中的宏或全局变量。
+
+### 打包流程
+
+打包的过程主要分为如下步骤:
+
+1. 把源代码放到%\_sourcedir中。
+2. 进行编译,编译的过程是在%\_builddir中完成的,一般情况下,源代码是压缩包格式,需要先进行解压。
+3. 进行“安装”,类似于预先组装软件包,把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到%\_buildrootdir中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在/usr/bin下,那么就在%\_buildrootdir下也按照同样的目录结构放置。
+4. 做一些必要的配置,比如在实际安装前的准备,安装后的清理等等。这些都是通过配置在SPEC文件中来告诉rpmbuild命令。
+5. 检查软件是否正常运行。
+6. 生成的RPM包放置到%\_rpmdir,源码包放置到%\_srcrpmdir下。
+
+在SPEC文件中,各个阶段说明如下:
+
+| 阶段 | 读取的目录 | 写入的目录 | 具体动作 |
+|-------------------|--------------|-----------------|-------------------------------------------|
+| %prep | %_sourcedir | %_builddir | 读取位于 %_sourcedir 目录的源代码和 patch 之后,解压源代码至 %_builddir 的子目录并应用所有 patch。 |
+| %build | %_builddir | %_builddir |编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。|
+| %install | %_builddir | %_buildrootdir |读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。|
+| %check | %_builddir | %_builddir | 检查软件是否正常运行。通过执行类似 make test 的命令实现。|
+| bin | %_buildrootdir | %_rpmdir| 读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。 |
+| src | %_sourcedir | %_srcrpmdir | 创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。 |
+
+### 打包选项
+
+通过rpmbuild命令构建软件包。rpmbuild构建软件包一般可以通过构建SPEC文件、tar文件、source文件实现。
+
+rpmbuild命令格式为:rpmbuild \[_option_...\]
+
+常用的rpmbuild打包选项如下所示。
+
+| option取值 | 说明 |
+|----------|--------------|
+|-bp specfile |从specfile文件的%prep段开始构建(解开源码包并打补丁)。 |
+|-bc specfile |从specfile文件的%build段开始构建。 |
+|-bi specfile |从specfile文件的%install段开始构建。 |
+|-bl specfile |从specfile文件的%files段开始检查。 |
+|-ba specfile |通过specfile文件构建源码包和二进制包。 |
+|-bb specfile |通过specfile文件构建二进制包。 |
+|-bs specfile |通过specfile文件构建源码包。 |
+|-rp sourcefile |从sourcefile文件的%prep段开始构建(解开源码包并打补丁)。 |
+|-rc sourcefile |从sourcefile文件的%build段开始构建。 |
+|-ri sourcefile |从sourcefile文件的%install段开始构建。 |
+|-rl sourcefile |从sourcefile文件的%files段开始检查。 |
+|-ra sourcefile |通过sourcefile文件构建源码包和二进制包。 |
+|-rb sourcefile |通过sourcefile文件构建二进制包。 |
+|-rs sourcefile |通过sourcefile文件构建源码包。 |
+|-tp tarfile |从tarfile文件的%prep段开始构建(解开源码包并打补丁)。 |
+|-tc tarfile |从tarfile文件的%build段开始构建。 |
+|-ti tarfile |从tarfile文件的%install段开始构建。 |
+|-ta tarfile |通过tarfile文件构建源码包和二进制包。 |
+|-tb tarfile |通过tarfile文件构建二进制包。 |
+|-ts tarfile |通过tarfile文件构建源码包。 |
+|--buildroot=DIRECTORY |在构建时,使用DIRECTORY目录覆盖默认的/root目录。 |
+|--clean |完成打包后清除BUILD目录下的文件。 |
+|--nobuild |不执行任何实际的构建步骤。可用于测试spec文件。 |
+|--noclean |不执行spec文件的"%clean"阶段(即使它确实存在)。 |
+|--nocheck |不执行spec文件的"%check"阶段(即使它确实存在)。 |
+|--dbpath DIRECTORY |使用DIRECTORY中的数据库,而不是默认的 /var/lib/rpm。 |
+|--root DIRECTORY |使DIRECTORY为最高级别的路径,默认“/”为最高路径。 |
+|--recompile sourcefile |将安装指定的源代码包sourcefile,然后进行准备、编译、安装。 |
+|--rebuild sourcefile |在\-\-recompile 的基础上额外构建一个新的二进制包。在构建结束时,构建目录、源代码和 spec 文件都将被删除(就好像用了 \-\-clean)。 |
+|-?,--help |打印详细的帮助信息。 |
+|--version |打印详细的版本信息。 |
+
+## 本地构建
+
+本章通过一个简单的示例介绍如何在本地构建RPM软件包的方法。
+
+### 搭建开发环境
+
+#### 前提条件
+
+需要root权限,已设置openEuler的repo软件源。
+
+#### 操作步骤
+
+用户可以直接使用DNF工具安装 rpmdevtools,其中包含 rpm-build 等命令以及相关依赖(例如make、gdb)。使用如下命令:
+
+```sh
+# dnf install rpmdevtools*
+```
+
+### 创建Hello World RPM包
+
+这里以GNU “Hello World” 项目的打包过程作为示例,包含了典型的FOSS(Free and Open Source Software) 软件项目相关的最常用的外围组件,其中包括配置/编译/安装环境、文档、国际化等等。
+
+#### 下载源码
+
+我们直接下载官方例子的源码,使用如下命令:
+
+```sh
+# rpmdev-setuptree
+# cd ~/rpmbuild/SOURCES
+# wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
+```
+
+#### 编辑SPEC文件
+
+在**~/rpmbuild/SPECS**目录下新建spec文件,参考命令如下:
+
+```sh
+# cd ~/rpmbuild/SPECS
+# vi hello.spec
+```
+
+在文件中写入对应内容后保存文件。文件内容示例如下,请根据实际情况修改相应字段。
+
+```Conf
+Name: hello
+Version: 2.10
+Release: 1
+Summary: The "Hello World" program from GNU
+License: GPL-3.0-or-later
+URL: https://ftp.gnu.org/gnu/hello
+Source0: https://ftp.gnu.org/gnu/hello/%{name}-%{version}.tar.gz
+
+BuildRequires: gettext
+
+%description
+The "Hello World" program, done with all bells and whistles of a proper FOSS
+project, including configuration, build, internationalization, help files, etc.
+
+%prep
+%autosetup -p1 -n %{name}-%{version}
+
+%build
+%configure
+%make_build
+
+%install
+%make_install
+%find_lang %{name}
+
+%check
+%make_build check
+
+%files -f %{name}.lang
+%doc AUTHORS ChangeLog NEWS README THANKS TODO
+%license COPYING
+%{_bindir}/hello
+%{_mandir}/man1/hello.1*
+%{_infodir}/hello.info*
+
+%changelog
+* Thu Dec 26 2019 Your Name - 2.10-1
+- Update to 2.10
+
+* Sat Dec 3 2016 Your Name - 2.9-1
+- Update to 2.9
+```
+
+- Name 标签是软件名,Version 标签是版本号,而 Release 标签是发布编号。
+- Summary 标签是简要说明,英文的话第一个字母应大写,以避免 rpmlint 工具(打包检查工具)警告。
+- License 标签说明软件包的协议版本,审查软件的 License 状态是打包者的职责,这可以通过检查源码或 LICENSE 文件,或与作者沟通来完成。
+- Group 标签过去用于按照 /usr/share/doc/rpm-/GROUPS 分类软件包。目前该标记已丢弃,vim的模板还有这一条,删掉即可,不过添加该标记也不会有任何影响。%changelog 标签应包含每个 Release 所做的更改日志,尤其应包含上游的安全/漏洞补丁的说明。%changelog 条目应包含版本字符串,以避免 rpmlint 工具警告。
+- 多行的部分,如 %changelog 或 %description 由指令下一行开始,空行结束。
+- 一些不需要的行 \(如 BuildRequires 和 Requires\) 可在行首使用‘\#’注释。
+- %prep、%build、%install、%files暂时用默认的,未做任何修改。
+
+#### 构建RPM包
+
+构建源码、二进制和包含调试信息的软件包,在spec文件所在目录执行如下命令:
+
+```sh
+rpmbuild -ba hello.spec
+```
+
+执行成功后,查看结果,使用如下命令:
+
+```sh
+# tree ~/rpmbuild/*RPMS
+
+/home/testUser/rpmbuild/RPMS
+└── aarch64
+ ├── hello-2.10-1.aarch64.rpm
+ ├── hello-debuginfo-2.10-1.aarch64.rpm
+ └── hello-debugsource-2.10-1.aarch64.rpm
+/home/testUser/rpmbuild/SRPMS
+└── hello-2.10-1.src.rpm
+```
+
+## 使用OBS构建
+
+本章介绍通过网页和osc构建RPM软件包的方法。主要包括如下两类:
+
+- 修改已有软件包:修改已有软件包源代码,然后将修改后的源代码构建成一个RPM软件包。
+- 新增软件包:从无到有全新开发一个新的软件源文件,并将新开发的源文件构建成一个RPM软件包。
+
+### OBS简介
+
+OBS是基于openSUSE发行版的通用编译框架,用于将源码包构建为RPM软件包或Linux镜像。OBS采用自动化的分布式编译方式,支持多种Linux操作系统发行版(openEuler、SUSE、Debian等)镜像和安装包的编译,且支持在多种架构平台(x86、ARM64等)上编译。
+
+OBS由后端和前端组成,后端实现所有核心功能,前端提供了网页应用和API,用于与后端进行交互。此外,OBS还有一个API命令行客户端osc,osc是在一个单独的存储库中开发的。
+
+OBS使用工程组织软件包。基础的权限控制、相关的存储仓库和构建目标(操作系统和架构)都可以在工程中定义。一个工程可以包含多个子工程,各个子工程可以独立配置,共同完成任务。
+
+### 在线构建软件包
+
+本章介绍通过OBS网页端在线构建RPM软件包的方法。
+
+#### 构建已有软件包
+
+>  **说明:**
+> 若为首次使用,请首先在OBS网页注册个人帐号。
+> 该方法需要拷贝修改后的代码,因此,请在执行下述操作前完成代码修改并提交到正确的代码路径。代码路径会在\_service文件中指定。
+
+使用OBS网页端,修改已有软件的源代码,并将修改后的源文件构建为RPM软件包的操作方法如下:
+
+1. 登录OBS界面,地址为:[https://build.openeuler.openatom.cn](https://build.openeuler.openatom.cn)。
+2. 单击“All Projects”进入所有工程页面。
+3. 单击需要修改的对应工程,进入该工程的详情页面,例如单击“openEuler:Mainline”。
+4. 在工程详情页面的搜索框查找需要修改的软件包,然后单击该软件包包名,进入该软件包详情页面。
+5. 单击“Branch package”,在弹出的确认页面单击“Accept”确认创建子工程,如[图1](#fig77646143214)所示。
+
+ **图 1** Branch Confirmation页面
+ 
+
+6. 单击“\_service”文件进入编辑页面,修改\_service内容后点击“Save”保存该文件。\_service内容示例如下,其中 _userCodeURL_、 _userCommitID_ 分别为用户代码托管路径、用户代码提交版本号或分支。
+
+ ```Conf
+
+
+ git
+ userCodeURL
+ userCommitID
+
+
+ bz2
+ *.tar
+
+
+ ```
+
+ >  **说明:**
+ > 单击“Save”保存\_service文件后,OBS服务会根据\_service文件描述,从指定的url下载源码到OBS对应工程的软件目录下并替换原有文件,例如上述例子中 “openEuler:Mainline”工程的kernel目录。
+
+7. 文件拷贝并替换完成后,OBS会自动开始构建RPM软件包。等待构建完成,并查看右侧状态栏的构建状态。
+ - succeeded:构建成功。用户可以单击“succeeded”查看构建日志,如[图2](#fig10319114217337)所示。
+
+ **图 2** succeeded的页面
+ 
+
+ - failed:构建失败。请单击“failed”查看错误日志进行问题定位后重新构建。
+ - unresolvable:未进行构建,可能由于缺失依赖。
+ - disabled:构建被手动关闭或正在排队构建。
+ - excluded:构建被禁止,可能由于缺少spec文件或者spec文件中禁止了目标架构的编译。
+
+#### 新增软件包
+
+使用OBS网页端,新增一个全新软件包的操作方法如下:
+
+1. 登录OBS界面。
+2. 根据新增软件包的依赖情况,选择合适的工程,即单击“All Projects”选择对应工程,例如“openEuler:Mainline”。
+3. 单击工程下任一软件包,进入该软件包的详情页面。
+4. 单击“Branch package”,在弹出的确认页面单击“Accept”确认创建子工程。
+5. 单击“Delete package”,删除新创建子工程中的软件包,如[图3](#fig18306181103615)所示。
+
+ **图 3** 删除子工程中软件包
+ 
+
+ >  **说明:**
+ > 通过已有软件创建新工程是为了继承环境等依赖,而不需要实际的文件,所以这里需要把这些文件删除。
+
+6. 单击“Create Package”,在弹出的页面输入软件包名称、标题和软件包描述,然后单击“Create”创建软件包,分别如[图4](#fig6762111693811)、[图5](#fig18351153518389)所示。
+
+ **图 4** Create Package页面
+ 
+
+ **图 5** 创建软件包信息填写页面
+ 
+
+7. 在页面中单击“Add file”上传spec文件和需要编译的文件(在spec文件中指定),如[图6](#fig1475845284011)所示。
+
+ **图 6** Add file页面
+ 
+
+8. 文件上传成功后,OBS会自动开始构建RPM软件包。等待构建完成,并查看右侧状态栏的构建状态。
+ - succeeded:构建成功。用户可以单击“succeeded”查看构建日志。
+ - failed:构建失败。请单击“failed”查看错误日志进行问题定位后重新构建。
+ - unresolvable:未进行构建,可能由于缺失依赖。
+ - disabled:构建被手动关闭或正在排队构建。
+ - excluded:构建被禁止,可能由于缺少spec文件或者spec文件中禁止了目标架构的编译。
+
+#### 获取软件包
+
+RPM软件包构建完成后,通过网页端获取对应RPM软件包的方法如下:
+
+1. 登录OBS界面。
+2. 单击“All Projects”找到所需软件包的对应工程,例如“openEuler:Mainline”。
+3. 在工程下单击所需软件包的包名,进入该软件包详情页面。例如上述例子中的kernel页面。
+4. 选择Repositories页签进入软件包的软件仓库管理页面,在Publish Flag中通过单击选择“Enable”开启(状态由变为)对应的RPM软件包下载功能,如[图7](#fig17480830144217)所示。
+
+ **图 7** Repositories页面
+ 
+
+5. 单击Repository列的构建工程名称,进入RPM软件包下载页面,单击RPM软件包右侧的“Download”即可下载对应RPM软件包,如[图8](#fig12152145615438)所示。
+
+ **图 8** RPM软件包下载页面
+ 
+
+### 使用osc构建软件包
+
+本章介绍使用OBS的命令行工具osc创建工程并构建RPM软件包的方法。
+
+#### 安装并配置osc
+
+##### 前提条件
+
+需要root权限,已设置openEuler的repo软件源。
+
+##### 操作步骤
+
+1. 使用root用户安装osc命令行工具及依赖。
+
+ ```sh
+ # dnf install osc build
+ ```
+
+ >  **说明:**
+ > 编译RPM软件包的过程中会依赖build。
+
+2. 配置osc。
+ 1. 打开\~/.oscrc,命令如下:
+
+ ```sh
+ # vi ~/.oscrc
+ ```
+
+ 2. 在\~/.oscrc中添加user和pass字段,如下所示,它们的取值 _userName_ 和 _passWord_ 分别是用户在OBS网页([https://build.openeuler.openatom.cn](https://build.openeuler.openatom.cn))上已经注册的帐号和密码。
+
+ ```sh
+ [general]
+ apiurl = https://build.openeuler.openatom.cn
+ [https://build.openeuler.openatom.cn]
+ user=userName
+ pass=passWord
+ ```
+
+#### 构建已有软件包
+
+创建工程
+
+1. 通过拷贝已有工程,创建属于用户自己的子工程。例如将openEuler:Mainline工程下的zlib软件包添加到新分支,参考命令如下:
+
+ ```sh
+ # osc branch openEuler:Mainline zlib
+ ```
+
+ 回显如下所示,说明在用户testUser下创建了新的分支工程home:testUser:branches:openEuler:Mainline。
+
+ ```text
+ A working copy of the branched package can be checked out with:
+ osc co home:testUser:branches:openEuler:Mainline/zlib
+ ```
+
+2. 将需要修改软件包的相关配置文件(例如\_service)下载到本地当前路径。其中 _testUser_ 为\~/.oscrc配置文件中配置的帐户名称,请根据实际情况修改。
+
+ ```sh
+ # osc co home:testUser:branches:openEuler:Mainline/zlib
+ ```
+
+ 回显如下所示:
+
+ ```text
+ A home:testUser:branches:openEuler:Mainline
+ A home:testUser:branches:openEuler:Mainline/zlib
+ A home:testUser:branches:openEuler:Mainline/zlib/_service
+ ```
+
+3. 进入本地子工程目录,并将软件包远程代码同步到本地。
+
+ ```sh
+ # cd home:testUser:branches:openEuler:Mainline/zlib
+ # osc up -S
+ ```
+
+ 回显如下所示:
+
+ ```text
+ A _service:tar_scm_kernel_repo:0001-Neon-Optimized-hash-chain-rebase.patch
+ A _service:tar_scm_kernel_repo:0002-Porting-optimized-longest_match.patch
+ A _service:tar_scm_kernel_repo:0003-arm64-specific-build-patch.patch
+ A _service:tar_scm_kernel_repo:zlib-1.2.11-optimized-s390.patch
+ A _service:tar_scm_kernel_repo:zlib-1.2.11.tar.xz
+ A _service:tar_scm_kernel_repo:zlib-1.2.5-minizip-fixuncrypt.patch
+ A _service:tar_scm_kernel_repo:zlib.spec
+ ```
+
+构建RPM包
+
+1. 重命名源文件,然后将重命名后的源文件添加到OBS暂存中。
+
+ ```sh
+ # rm -f _service;for file in `ls | grep -v .osc`;do new_file=${file##*:};mv $file $new_file;done
+ # osc addremove *
+ ```
+
+2. 修改源代码和spec文件,并执行如下命令更新文件。
+
+ ```sh
+ # osc up
+ ```
+
+3. 将对应软件包的所有修改同步到OBS服务器。参考命令如下,-m参数后的信息为提交记录。
+
+ ```sh
+ # osc ci -m "commit log"
+ ```
+
+4. 获取当前工程的仓库名称和架构,参考命令如下:
+
+ ```sh
+ # osc repos home:testUser:branches:openEuler:Mainline
+ ```
+
+5. 修改提交成功后,OBS会自动开始编译软件包。可以通过如下命令,查看对应仓库的编译日志,其中 _standard_aarch64_ 、 _aarch64_ 分别为查询所得仓库名称和架构。
+
+ ```sh
+ # osc buildlog standard_aarch64 aarch64
+ ```
+
+ >  **说明:**
+ > 用户也可以通过网页端打开自己创建的对应工程,查看构建日志。
+
+#### 新增软件包
+
+使用OBS的osc工具新增一个全新软件包的操作方法如下:
+
+创建工程
+
+1. 根据新增软件包的依赖情况,基于合适的工程,创建属于用户自己的个人工程。例如基于 _openEuler:Mainline_ 工程的 zlib 创建工程的参考命令如下,zlib 为工程下的任一软件包。
+
+ ```sh
+ # osc branch openEuler:Mainline zlib
+ ```
+
+2. 删除创建工程时新增的无用软件包。例如删除zlib软件包的参考命令如下:
+
+ ```sh
+ # cd home:testUser:branches:openEuler:Mainline
+ # osc rm zlib
+ # osc commit -m "commit log"
+ ```
+
+3. 在个人工程下创建新增的软件包。例如新增软件包 my-first-obs-package命令如下:
+
+ ```sh
+ # mkdir my-first-obs-package
+ # cd my-first-obs-package
+ ```
+
+构建RPM包
+
+1. 添加准备的源文件和spec文件到软件包目录。
+2. 修改源代码和spec文件,并将对应软件包的所有文件上传到OBS服务器。参考命令如下,-m 参数后的信息为提交记录。
+
+ ```sh
+ # cd home:testUser:branches:openEuler:Mainline
+ # osc add my-first-obs-package
+ # osc ci -m "commit log"
+ ```
+
+3. 获取当前工程的仓库名称和架构,参考命令如下:
+
+ ```sh
+ # osc repos home:testUser:branches:openEuler:Mainline
+ ```
+
+4. 修改提交成功后,OBS会自动开始编译软件包。可以通过如下命令,查看对应仓库的编译日志,其中 _standard_aarch64_ 、 _aarch64_ 分别为查询所得仓库名称和架构。
+
+ ```sh
+ # cd home:testUser:branches:openEuler:Mainline/my-first-obs-package
+ # osc buildlog standard_aarch64 aarch64
+ ```
+
+ >  **说明:**
+ > 用户也可以通过网页端打开自己创建的对应工程,查看构建日志。
+
+#### 获取软件包
+
+RPM软件包构建完成后,使用osc获取对应RPM软件包的命令如下:
+
+```sh
+# osc getbinaries home:testUser:branches:openEuler:Mainline my-first-obs-package standard_aarch64 aarch64
+```
+
+命令中的各参数含义如下,请用户根据实际情况修改:
+
+- _home:testUser:branches:openEuler:Mainline_ :软件包所在工程名称
+- _my-first-obs-package_ :软件包名称
+- _standard\_aarch64_ :仓库名称
+- _aarch64_ :仓库架构名称
+
+>  **说明:**
+> 使用osc构建的软件包也可以在网页端获取,获取方式请参见[获取软件包](#获取软件包)。
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/Branch-Confirmationpage.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/Branch-Confirmationpage.png
new file mode 100644
index 0000000000000000000000000000000000000000..e66cbcd22217b74785381b85128ea61895194882
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/Branch-Confirmationpage.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/Create-Packagepage.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/Create-Packagepage.png
new file mode 100644
index 0000000000000000000000000000000000000000..36ea525856d428b6f88a338202e7cb59b2204fc0
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/Create-Packagepage.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/RPM_package_download.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/RPM_package_download.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f32d6c16d344df6951fc4e6aa027d02dfb9ccb5
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/RPM_package_download.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/Repositoriespage.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/Repositoriespage.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7c04eedf9dd32cf4a9d024a05f5c8b294c76934
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/Repositoriespage.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/delete_package.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/delete_package.png
new file mode 100644
index 0000000000000000000000000000000000000000..a365cd1f46bfb8bec094b79477c0168861a5193b
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/delete_package.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/filepage.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/filepage.png
new file mode 100644
index 0000000000000000000000000000000000000000..83f0bfaeeb9227bcbb863a93ab8d3535e2b2bc1d
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/filepage.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/setting_software_info.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/setting_software_info.png
new file mode 100644
index 0000000000000000000000000000000000000000..0144be1f86e2a1d977881355022f7b5a5940cacb
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/setting_software_info.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/succeededpage.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/succeededpage.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f10cd1db8bdc9be1ab8b660ef93e8a481c2d6b8
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/succeededpage.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243671.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243671.png
new file mode 100644
index 0000000000000000000000000000000000000000..a32856aa08e459ed0f51f8fcf4c2f51511c12095
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243671.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243702.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243702.png
new file mode 100644
index 0000000000000000000000000000000000000000..96096879d161f04750a332e5c749a834c49d3173
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243702.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243704.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243704.png
new file mode 100644
index 0000000000000000000000000000000000000000..267bc9508f3a065b5b40c367e745f0d8c3ddb5fa
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243704.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243712.png b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243712.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d5a343524e14d11a3e2a94be4066fbb2d20599e
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/figures/zh-cn_image_0229243712.png differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/preparations-for-development-environment.md b/docs/en/25.03/Server/Development/ApplicationDev/preparations-for-development-environment.md
new file mode 100644
index 0000000000000000000000000000000000000000..6f0cddd2144e645ad6970e45bcb8b9c5039ae1b2
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/preparations-for-development-environment.md
@@ -0,0 +1,414 @@
+# 开发环境准备
+
+## 环境要求
+
+- 若使用的是物理机,则开发环境所需的最小硬件要求如[表1](#table154419352610)所示。
+
+ **表 1** 最小硬件要求
+
+
+ 部件名称
+
+ 最小硬件要求
+
+ 说明
+
+
+
+ 架构
+
+
+
+ 支持Arm的64位架构。 支持Intel的x86_64位架构。
+
+
+ CPU
+
+ 华为鲲鹏920系列CPU Intel ® Xeon ® 处理器
+
+ -
+
+
+ 内存
+
+ 不小于4GB(为了获得更好的应用体验,建议不小于8GB)
+
+ -
+
+
+ 硬盘
+
+ 为了获得更好的应用体验,建议不小于120GB)
+
+ 支持IDE、SATA、SAS等接口的硬盘。
+
+
+
+
+
+- 若使用的是虚拟机,则开发环境所需的最小虚拟化空间要求如[表2](#table780410493819)所示。
+
+ **表 2** 最小虚拟化空间要求
+
+
+ 部件名称
+
+ 最小虚拟化空间要求
+
+ 说明
+
+
+
+ 架构
+
+
+
+ -
+
+
+ CPU
+
+ 2个CPU
+
+ -
+
+
+ 内存
+
+ 不小于4GB(为了获得更好的应用体验,建议不小于8GB)
+
+ -
+
+
+ 硬盘
+
+ 不小于32GB(为了获得更好的应用体验,建议不小于120GB)
+
+ -
+
+
+
+
+
+### 操作系统要求
+
+操作系统要求为openEuler操作系统。
+
+openEuler操作系统具体安装方法请参考[安装指南](../../InstallationUpgrade/Installation/installation.md),其中“软件选择”页面的“已选环境的附加选项”中将“开发工具”勾选。
+
+## 配置openEuler yum源
+
+通过直接获取在线的openEuler repo源配置在线yum源或通过挂载ISO创建本地openEuler repo源配置本地yum源。
+
+### 通过直接获取在线的openEuler repo源配置在线yum源
+
+>  **说明:**
+> openEuler提供了多种repo源供用户在线使用,各repo源含义可参考[系统安装](../../Releasenotes/Releasenotes/installing-the-os.md)。本操作以AArch64架构的OS repo源为例将其配置为yum源。
+
+1. 进入到yum源目录并查看目录下的.repo配置文件。
+
+ ```shell
+ # cd /etc/yum.repos.d
+ # ls
+ openEuler-xxx.repo
+ ```
+
+2. 在root权限下编辑openEuler-xxx.repo文件,将在线的openEuler repo源配置为yum源。
+
+ ```shell
+ # vi openEuler-xxx.repo
+ ```
+
+ 编辑openEuler-xxx.repo文件的内容如下,其中{version}和{arch}请根据实际情况进行替换:
+
+ ```text
+ [osrepo]
+ name=osrepo
+ baseurl=http://repo.openeuler.org/openEuler-{version}/OS/{arch}/
+ enabled=1
+
+ gpgcheck=1
+ gpgkey=http://repo.openeuler.org/openEuler-{version}/OS/{arch}/RPM-GPG-KEY-openEuler
+ ```
+
+ >  **说明:**
+ >
+ > - \[*repoid*\]中的repoid为软件仓库(repository)的ID号,所有.repo配置文件中的各repoid不能重复,必须唯一。示例中repoid设置为**osrepo**。
+ > - name为软件仓库描述的字符串。
+ > - baseurl为软件仓库的地址。
+ > - enabled为是否启用该软件源仓库,可选值为1和0。缺省值为1,表示启用该软件源仓库。
+ > - gpgcheck可设置为1或0,1表示进行gpg(GNU Private Guard)校验,0表示不进行gpg校验,gpgcheck可以确定rpm包的来源是有效和安全的。
+ > - gpgkey为验证签名用的公钥。
+
+### 通过挂载ISO创建本地openEuler repo源配置本地yum源
+
+>  **说明:**
+> openEuler提供了多种ISO发布包,各ISO发布包含义可参考[系统安装](../../Releasenotes/Releasenotes/installing-the-os.md)。本操作中忽略具体的版本号和架构,请根据实际需要的ISO发布包和校验文件进行修改。
+
+1. 下载ISO发布包。
+ - 通过跨平台文件传输工具下载ISO镜像。
+ 1. 登录[openEuler社区](https://openeuler.org/zh/)网站。
+ 2. 单击“下载”。
+ 3. 单击“社区发行版”,显示版本列表。
+ 4. 在版本列表处找到对应的版本号,单击“前往下载”按钮,进入版本下载列表。
+ 5. 在对应的系统下载列表中,可以查看系统镜像架构和应用场景。
+
+ 架构分类如下:
+ AArch64:AArch64架构的ISO。
+ x86\_64:x86\_64架构的ISO。
+ ARM32:嵌入式的Image。
+
+ 场景分类如下:
+ 服务器:服务器场景的ISO。
+ 边缘计算:边缘计算场景的ISO。
+ 云计算:云计算场景的ISO。
+ 嵌入式:嵌入式的Image(只有选择AArch64或ARM32架构时,才可选该场景)。
+
+ 6. 单击“AArch64”,选择AArch64架构。
+ 7. 单击“服务器”,选择服务器场景。
+ 8. 在“软件包类型”栏选择需要的ISO,单击“立即下载”。
+ 9. 单击该ISO对应的完整性校验文件“SHA256”,复制校验值到本地。
+ 10. 登录openEuler操作系统,新建用于存放发布包的目录,如“~/iso”。
+
+ ```shell
+ # mkdir ~/iso
+ ```
+
+ 11. 使用跨平台文件传输工具(如WinSCP)将本地的openEuler发布包上传到openEuler操作系统。
+
+ - 通过wget命令下载ISO镜像。
+ 1. 登录[openEuler社区](https://openeuler.org/zh/)网站。
+ 2. 单击“下载”。
+ 3. 单击“社区发行版”,显示版本列表。
+ 4. 在版本列表处找到对应的版本号,单击“前往下载”按钮,进入版本下载列表。
+ 5. 在对应的系统下载列表中,可以查看系统镜像架构和应用场景。
+
+ 架构分类如下:
+ AArch64:AArch64架构的ISO。
+ x86\_64:x86\_64架构的ISO。
+ ARM32:嵌入式的Image。
+
+ 场景分类如下:
+ 服务器:服务器场景的ISO。
+ 边缘计算:边缘计算场景的ISO。
+ 云计算:云计算场景的ISO。
+ 嵌入式:嵌入式的Image(只有选择AArch64或ARM32架构时,才可选该场景)。
+
+ 6. 单击“AArch64”,选择AArch64架构。
+ 7. 单击“服务器”,选择服务器场景。
+ 8. 在“软件包类型”栏选择需要的ISO,右键单击“立即下载”,单击“复制链接地址”,将openEuler发布包地址记录好。
+ 9. 单击复制该ISO对应的完整性校验文件“SHA256”,将openEuler校验文件记录好。
+ 10. 登录openEuler操作系统,新建用于存放发布包和检验文件的目录,如“~/iso”,并切换到该目录。
+
+ ```shell
+ # mkdir ~/iso
+ # cd ~/iso
+ ```
+
+ 11. 使用**wget**命令远程下载发布包,命令中的 *ipaddriso* 为openEuler发布包地址。
+
+ ```shell
+ # wget ipaddriso
+ ```
+
+2. 发布包完整性校验。
+ 1. 计算openEuler发布包的sha256校验值。
+
+ ```shell
+ sha256sum openEuler-xxx-dvd.iso
+ ```
+
+ 命令执行完成后,输出校验值。
+
+ 2. 对比步骤1和复制的校验值是否一致。
+
+ 如果校验值一致说明iso文件完整性没有被破坏,如果校验值不一致则可以确认文件完整性已被破坏,需要重新获取。
+
+3. 挂载ISO并创建为repo源。
+
+ 在root权限下使用mount命令挂载镜像文件。
+
+ 示例如下:
+
+ ```shell
+ # mount /home/iso/openEuler-xxx-dvd.iso /mnt/
+ ```
+
+ 挂载好的mnt目录如下:
+
+ ```text
+ .
+ │── boot.catalog
+ │── docs
+ │── EFI
+ │── images
+ │── Packages
+ │── repodata
+ │── TRANS.TBL
+ └── RPM-GPG-KEY-openEuler
+ ```
+
+ 其中,Packages为rpm包所在的目录,repodata为repo源元数据所在的目录,RPM-GPG-KEY-openEuler为openEuler的签名公钥。
+
+4. 进入到yum源目录并查看目录下的.repo配置文件。
+
+ ```shell
+ # cd /etc/yum.repos.d
+ # ls
+ openEuler-xxx.repo
+ ```
+
+5. 在root权限下编辑openEuler-xxx.repo文件,将[3](#li6236932222)中创建的repo源配置为本地yum源。
+
+ ```shell
+ # vi openEuler-xxx.repo
+ ```
+
+ 编辑openEuler-xxx.repo文件的内容如下:
+
+ ```text
+ [localosrepo]
+ name=localosrepo
+ baseurl=file:///mnt
+ enabled=1
+ gpgcheck=1
+ gpgkey=file:///mnt/RPM-GPG-KEY-openEuler
+ ```
+
+## 安装软件包
+
+安装开发过程中需要用到的软件。不同的开发需要的软件不一样,但安装方法相同,本章以安装常用的几个软件包(JDK,rpm-build)为例。有些开发软件openEuler操作系统已默认自带,如GCC、GNU make。
+
+### 安装JDK软件包
+
+1. 执行 `dnf list installed | grep jdk` 查询JDK软件是否已安装。
+
+ 查看回显,若回显中包含“jdk”,表示该软件已经安装了,则不需要再安装。若无任何回显,则表示该软件未安装。
+
+2. 执行 `dnf clean all` 清除缓存。
+
+3. 执行 `dnf makecache` 创建缓存。
+
+4. 执行 `dnf search jdk | grep jdk` 查询可安装的JDK软件包。
+
+ 查看回显,选择安装java-{version}-openjdk-devel.aarch64软件包。
+
+5. root权限执行 `dnf install java-{version}-openjdk-devel.aarch64` 安装JDK软件包。
+
+6. 执行 `java -version` 查询JDK软件版本。
+
+ 查看回显,若回显中包含“openjdk version”信息,表示已正确安装。
+
+### 安装rpm-build软件包
+
+1. 执行 `dnf list installed | grep rpm-build` 查询rpm-build软件是否已安装。
+
+ 查看回显,若回显中包含“rpm-build”,表示该软件已经安装了,则不需要再安装。若无任何回显,则表示该软件未安装。
+
+2. 执行 `dnf clean all` 清除缓存。
+
+3. 执行 `dnf makecache` 创建缓存。
+
+4. root权限执行 `dnf install rpm-build` 安装rpm-build软件包。
+
+5. 执行 `rpmbuild --version` 查询rpm-build软件版本。
+
+## 使用IDE进行Java开发
+
+对于小型的Java程序,可以直接参考“使用JDK编译”章节得到可运行Java应用。但是对于大中型Java应用,这种方式已经无法满足开发者的需求。因此您可以参考如下步骤安装IDE并进行使用,以方便您在openEuler系统上的Java开发工作。
+
+### 简介
+
+IntelliJ IDEA是一款非常流行的Java IDE,其社区版可以免费下载使用。目前openEuler支持使用IntelliJ IDEA集成开发环境(IDE)进行Java程序的开发,从而可以提升开发人员的工作效率。
+
+### 使用MobaXterm登录服务器
+
+MobaXterm是一款非常优秀的SSH客户端,其自带X Server,可以轻松解决远程GUI显示问题。
+
+您需要提前下载安装好MobaXterm并打开,然后SSH登录您的服务器并进行以下操作。
+
+### 设置JDK环境
+
+在设置JAVA\_HOME之前您需要先找到JDK的安装路径。在“开发环境准备 \> 安装软件包 \> 安装JDK软件包”章节中您已经学会了如何安装JDK,如果您还没安装好JDK,请提前安装好。
+
+查看java路径,命令如下:
+
+```shell
+# which java
+/usr/bin/java
+```
+
+查看软链接的实际指向目录,命令如下:
+
+```shell
+# ls -la /usr/bin/java
+lrwxrwxrwx. 1 root root 22 Mar 6 20:28 /usr/bin/java -> /etc/alternatives/java
+# ls -la /etc/alternatives/java
+lrwxrwxrwx. 1 root root 83 Mar 6 20:28 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-1.h2.aarch64/jre/bin/java
+```
+
+发现JDK的真实路径为/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-1.h2.aarch64,设置JAVA\_HOME和PATH,命令如下:
+
+```shell
+# export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-1.h2.aarch64
+# export PATH=$JAVA_HOME/bin:$PATH
+```
+
+### 下载安装GTK库
+
+运行如下命令:
+
+```shell
+# dnf list installed | grep gtk
+```
+
+如果显示gtk2或者gtk3,则表示您已安装该库,可以直接跳过进入下一步,否则在root权限下运行如下命令自动下载安装gtk库。
+
+```shell
+# dnf -y install gtk2 libXtst libXrender xauth
+```
+
+### 设置X11 Forwarding
+
+切换到sshd配置目录
+
+```shell
+# cd ~/.ssh
+```
+
+如果该目录不存在,则创建目录后再进行切换,创建目录命令如下:
+
+```shell
+# mkdir ~/.ssh
+```
+
+然后在.ssh目录下编辑config文件并保存:
+
+1. 使用vim打开config文件
+
+ ```shell
+ # vim config
+ ```
+
+2. 将以下内容添加到文件末尾并保存:
+
+ ```text
+ Host *
+ ForwardAgent yes
+ ForwardX11 yes
+ ```
+
+### 下载并运行IntelliJ IDEA
+
+在执行如上环境配置后,您就可以下载使用IntelliJ IDEA了。鉴于最新版的IntelliJ IDEA和openEuler系统在部分功能上有兼容性问题,建议您从此[链接](https://www.jetbrains.com/idea/download/other.html)下载2018版本linux压缩包。下载好后把压缩包移到您想要安装该软件的目录,对压缩包进行解压:
+
+```shell
+# tar -xf ideaIC-2018.3.tar.gz
+```
+
+解压后切换到IntelliJ IDEA的目录下并运行。
+
+```shell
+# cd ./idea-IC-183.4284.148
+# bin/idea.sh &
+```
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-caution.gif b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-caution.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-caution.gif differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-danger.gif b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-danger.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-danger.gif differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-note.gif b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-notice.gif b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-notice.gif
new file mode 100644
index 0000000000000000000000000000000000000000..86024f61b691400bea99e5b1f506d9d9aef36e27
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-notice.gif differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-tip.gif b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-tip.gif
new file mode 100644
index 0000000000000000000000000000000000000000..93aa72053b510e456b149f36a0972703ea9999b7
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-tip.gif differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-warning.gif b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-warning.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6e90d7cfc2193e39e10bb58c38d01a23f045d571
Binary files /dev/null and b/docs/en/25.03/Server/Development/ApplicationDev/public_sys-resources/icon-warning.gif differ
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/using-clang-for-compilation.md b/docs/en/25.03/Server/Development/ApplicationDev/using-clang-for-compilation.md
new file mode 100644
index 0000000000000000000000000000000000000000..2d25fd54df82d76231dd303bae176647b60968fb
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/using-clang-for-compilation.md
@@ -0,0 +1,103 @@
+# 使用LLVM/Clang编译
+
+本章介绍LLVM/Clang编译的一些基本知识,并通过示例进行实际演示。更多Clang使用方法请通过**clang --help**命令查询。
+
+
+- [使用LLVM/Clang编译](#使用llvmclang编译)
+ - [简介](#简介)
+ - [LLVM/Clang安装](#llvmclang安装)
+ - [多版本共存支持](#多版本共存支持)
+ - [示例](#示例)
+
+
+
+## 简介
+
+LLVM是一种涵盖多种编程语言和目标处理器的编译器,使用Clang作为C和C++的编译和驱动程序。Clang不仅仅可以将C, C++程序编译为LLVM中间表示的IR,也会调用所有以代码生成为目标的LLVM优化遍,直到生成最终的二进制文件。
+
+## LLVM/Clang安装
+
+openEuler操作系统中通过yum源安装Clang和LLVM软件包。默认安装llvm-12
+
+```shell
+yum install llvm
+yum install clang
+yum install lld // openEuler yum源中目前没有lld-12版本
+```
+
+验证安装是否成功
+
+```shell
+clang -v
+```
+
+若返回结果中包含clang版本信息,说明安装成功。
+
+## 多版本共存支持
+
+openEuler LLVM/Clang 多版本支持的方式如下:
+
+```text
+yum包名:
+llvm{-*}
+clang{-*}
+lld{-*}
+bolt{-*}
+例如:
+clang15
+llvm15-devel
+
+安装路径:
+/usr/lib64/llvm
+例如:
+/usr/lib64/llvm15
+
+/usr/bin目录下会安装带有-后缀的可执行文件
+例如:
+/usr/bin/clang-15
+/usr/bin/lld-15
+```
+
+目前支持的LLVM/Clang版本有
+
+```text
+llvm //默认llvm12
+llvm-15
+```
+
+通过yum安装其他版本
+
+```shell
+yum install llvm15
+yum install clang15
+yum install lld15
+```
+
+验证安装是否成功
+
+```shell
+clang-15 -v
+```
+
+## 示例
+
+编译运行C/C++程序
+
+```shell
+clang [command line flags] hello.c -o hello.o
+./hello.o
+```
+
+```shell
+clang++ [command line flags] hello.cpp -o hello.o
+./hello.o
+```
+
+指定的链接器为LLVM的lld,若不指定它则使用默认的lld。
+
+```shell
+clang [command line flags] -fuse-ld=lld hello.c -o hello.o
+./hello.o
+```
+
+其他通用信息请参考LLVM的[用户指导](https://llvm.org/docs/UserGuides.html)
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/using-gcc-for-compilation.md b/docs/en/25.03/Server/Development/ApplicationDev/using-gcc-for-compilation.md
new file mode 100644
index 0000000000000000000000000000000000000000..043f6876746f8eafc6cfe05d50e56391524bda16
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/using-gcc-for-compilation.md
@@ -0,0 +1,612 @@
+# 使用GCC编译
+
+本章介绍GCC编译的一些基本知识,并通过示例进行实际演示。更多的GCC知识请通过**man gcc**命令查询。
+
+
+- [使用GCC编译](#使用gcc编译)
+ - [简介](#简介)
+ - [基本规则](#基本规则)
+ - [文件类型](#文件类型)
+ - [编译流程](#编译流程)
+ - [编译选项](#编译选项)
+ - [多源文件编译](#多源文件编译)
+ - [库](#库)
+ - [动态链接库](#动态链接库)
+ - [静态链接库](#静态链接库)
+ - [示例](#示例)
+ - [使用GCC编译C程序示例](#使用gcc编译c程序示例)
+ - [使用GCC创建和使用动态链接库示例](#使用gcc创建和使用动态链接库示例)
+ - [使用GCC创建和使用静态链接库示例](#使用gcc创建和使用静态链接库示例)
+
+
+
+## 简介
+
+GCC(GNU Compiler Collection)是GNU推出的功能强大、性能优越的多平台编译器。GCC编译器能将C、C++语言源程序、汇编程序和目标程序编译、链接成可执行文件。openEuler操作系统中已默认安装了GCC软件包。
+
+## 基本规则
+
+### 文件类型
+
+对于任何给定的输入文件,文件类型决定进行何种编译。GCC常用的文件类型如[表1](#table634145764320)所示。
+
+**表 1** GCC常用的文件类型
+
+
+ 扩展名(后缀)
+
+ 说明
+
+
+
+ .c
+
+ C语言源代码文件。
+
+
+ .C,.cc或.cxx
+
+ C++源代码文件。
+
+
+ .m
+
+ Objective-C源代码文件。
+
+
+ .s
+
+ 汇编语言源代码文件。
+
+
+ .i
+
+ 已经预处理的C源代码文件。
+
+
+ .ii
+
+ 已经预处理的C++源代码文件。
+
+
+ .S
+
+ 已经预处理的汇编语言源代码文件。
+
+
+ .h
+
+ 程序所包含的头文件。
+
+
+ .o
+
+ 编译后的目标文件。
+
+
+ .so
+
+动态链接库 ,它是一种特殊的目标文件。
+
+
+ .a
+
+ 静态链接库。
+
+
+ .out
+
+ 可执行文件,但可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。如果没有给出可执行文件的名字,GCC将生成一个名为a.out的文件。
+
+
+
+
+
+### 编译流程
+
+使用GCC将源代码文件生成可执行文件,需要经过预处理、编译、汇编和链接。
+
+1. 预处理:将源程序(如 **.c** 文件)预处理,生成 **.i** 文件。
+2. 编译:将预处理后的 **.i** 文件编译成为汇编语言,生成 **.s** 文件。
+3. 汇编:将汇编语言文件经过汇编,生成目标文件 **.o** 文件。
+4. 链接:将各个模块的 **.o** 文件链接起来生成一个可执行程序文件。
+
+其中 **.i** 文件、**.s**文件、**.o**文件是中间文件或临时文件,如果使用GCC一次性完成C语言程序的编译,则这些文件会被删除。
+
+### 编译选项
+
+GCC编译的命令格式为:**gcc** \[_options_\] filenames
+
+其中:
+
+_options_ :编译选项。
+
+_filenames_ :文件名称。
+
+GCC是一个功能强大的编译器,其 _options_ 参数取值很多,但大部分并不常用,常用的 _options_ 取值如[表2](#table1342946175212)所示。
+
+**表 2** GCC常用的编译选项
+
+
+ options 取值
+
+ 说明
+
+ 示例
+
+
+
+ -c
+
+ 编译、汇编指定的源文件生成目标文件,但不进行链接。通常用于编译不包含主程序的子程序文件。
+
+#使用 -c选项编译test1.c、test2.c源文件
+ gcc -c test1.c test2.c
+
+
+ -S
+
+ 编译指定的源文件生成以 .s作为后缀的汇编语言文件 ,但不进行汇编。
+
+ #编译器预处理 circle.c,将其翻译成汇编语言,并将结果存储在 circle.s 文件中。
+ gcc -S circle.c
+
+
+ -E
+
+ 预处理指定的源文件,但不进行编译。
+默认情况下,预处理器的输出会被导入到标准输出流(如显示器),可以利用 -o选项把它导入到某个输出文件。
+
+ #预处理的结果导出到 circle.i 文件。
+ gcc -E circle.c -o circle.i
+
+
+ -o file
+
+ 用在生成可执行文件时,生成指定的输出文件 file 。同时该名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
+
+ #将源文件作为输入文件,将可执行文件作为输出文件,也即完整地编译整个程序。
+ gcc main.c func.c -o app.out
+
+
+ -g
+
+ 在可执行程序中包含标准调试信息。
+
+ -
+
+
+ -L library_path
+
+ 在库文件的搜索路径列表中添加 library_path 路径。
+
+ -
+
+
+ -I library
+
+ 链接时搜索指定的函数库 library 。
+使用 GCC 编译和链接程序时,GCC 默认会链接 libc.a 或者 libc.so,但是对于其他的库(例如非标准库、第三方库等),就需要手动添加。
+
+#使用 -l选项,以链接数学库。
+ gcc main.c -o main.out -lm
+ 说明: 数学库的文件名是 libm.a。前缀 lib和后缀 .a是标准的, m是基本名称,GCC 会在 -l选项后紧跟着的基本名称的基础上自动添加这些前缀、后缀,本例中,基本名称为 m。
+
+
+
+ -I head_path
+
+ 在头文件的搜索路径列表中添加 head_path 路径。
+
+ -
+
+
+ -static
+
+ 进行静态编译,及链接静态库,禁止链接动态库。
+
+ -
+
+
+ -shared
+
+ 默认选项,可省略。
+可以生成动态库文件。 进行动态编译,优先链接动态库,只有没有动态库时才会链接同名的静态库。
+
+ -
+
+
+ -fPIC(或-fpic)
+
+ 生成使用相对地址的位置无关的目标代码。通常使用-static选项从该PIC目标文件生成动态库文件。
+
+ -
+
+
+
+
+
+### 多源文件编译
+
+多个源文件的编译方法有2种。
+
+- 多个源文件一起编译。编译时需要所有文件重新编译。
+
+ 示例:将test1.c和test2.c分别编译后链接成test可执行文件。
+
+ ```shell
+ gcc test1.c test2.c -o test
+ ```
+
+- 分别编译各个源文件,之后对编译后输出的目标文件链接。编译时只重新编译修改的文件,未修改的文件不用重新编译。
+
+ 示例:分别编译test1.c,test2.c,再将二者的目标文件test1.o,test2.o链接成test可执行文件。
+
+ ```shell
+ gcc -c test1.c
+ gcc -c test2.c
+ gcc test1.o test2.o -o test
+ ```
+
+## 库
+
+库是写好的、现有的、成熟的、可以复用的代码。每个程序都要依赖很多基础的底层库。
+
+库文件在命名时约定,以lib为前缀,以.so(动态库)或.a(静态库)为后缀,中间为库文件名。如libfoo.so或libfoo.a。由于所有的库文件都遵循了同样的规范,因此当在链接库时,-l 选项指定链接的库文件名时可以省去lib前缀,即GCC 在对-lfoo 进行处理时,会自动去链接名为libfoo.so 或libfoo.a的库文件。而当在创建库时,必须指定完整文件名libfoo.so或libfoo.a。
+
+根据链接时期的不同,库分为静态库和动态库。静态库是在链接阶段,将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中;而动态库是在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。二者有如下差异。
+
+- 资源利用不一样。
+
+ 静态库为生成的可执行文件的一部分,而动态库为单独的文件。所以使用静态库和动态库的可执行文件大小和占用的磁盘空间大小不一样,导致资源利用不一样。
+
+- 扩展性与兼容性不一样
+
+ 静态库中某个函数的实现变了,那么可执行文件必须重新编译,而对于动态链接生成的可执行文件,只需要更新动态库本身即可,不需要重新编译可执行文件。
+
+- 依赖不一样
+
+ 静态库的可执行文件不需要依赖其他的内容即可运行,而动态库的可执行文件必须依赖动态库的存在。所以静态库更方便移植。
+
+- 加载速度不一样
+
+ 静态库在链接时就和可执行文件在一块了,而动态库在加载或者运行时才链接,因此,对于同样的程序,静态链接的要比动态链接加载更快。
+
+### 动态链接库
+
+使用-shared选项 和-fPIC选项,可直接使用源文件、汇编文件或者目标文件创建一个动态库。其中-fPIC 选项作用于编译阶段,在生成目标文件时就需要使用该选项,以生成位置无关的代码。
+
+示例1:从源文件生成动态链接库。
+
+```shell
+gcc -fPIC -shared test.c -o libtest.so
+```
+
+示例2:从目标文件生成动态链接库。
+
+```shell
+gcc -fPIC -c test.c -o test.o
+gcc -shared test.o -o libtest.so
+```
+
+将一个动态库链接到可执行文件,需要在命令行中列出动态库的名称。
+
+示例:将main.c和libtest.so一起编译成 app.out,当 app.out 运行时,会动态地加载链接库 libtest.so。
+
+```shell
+gcc main.c libtest.so -o app.out
+```
+
+这种方式是直接指定使用当前目录下的libtest.so文件。
+
+若使用下面搜索动态库的方式,则为了确保程序在运行时能够链接到动态库,需要通过如下三种方法中的任一种实现。
+
+- 将动态库保存在标准目录下,例如 /usr/lib。
+- 把动态库所在路径libraryDIR增加到环境变量LD\_LIBRARY\_PATH中
+
+ ```sh
+ # export LD\_LIBRARY\_PATH=libraryDIR:$LD\_LIBRARY\_PATH
+ ```
+
+ >  **说明:**
+ > LD\_LIBRARY\_PATH为动态库的环境变量。当运行动态库时,若动态库不在缺省文件夹(/lib 和/usr/lib)下,则需要指定环境变量LD\_LIBRARY\_PATH。
+
+- 把动态库所在路径libraryDIR增加 /etc/ld.so.conf中然后执行ldconfig或者以动态库所在路径libraryDIR为参数执行ldconfig。
+
+```shell
+gcc main.c -L libraryDIR -ltest -o app.out
+export LD_LIBRARY_PATH=libraryDIR:$LD_LIBRARY_PATH
+```
+
+### 静态链接库
+
+创建一个静态链接库,需要先将源文件编译为目标文件,然后再使用ar命令将目标文件打包成静态链接库。
+
+示例:将源文件test1.c,test2.c,test3.c编译并打包成静态库。
+
+```shell
+gcc -c test1.c test2.c test3.c
+ar rcs libtest.a test1.o test2.o test3.o
+```
+
+其中ar是一个备份压缩命令,可以将多个文件打包成一个备份文件(也叫归档文件),也可以从备份文件中提取成员文件。ar最常见的用法是将目标文件打包为静态链接库。
+
+ar将目标文件打包成静态链接库的命令格式为:
+
+ar rcs _Sllfilename_ _Targetfilelist_
+
+- _Sllfilename_ :静态库文件名。
+- _Targetfilelist_ :目标文件列表。
+- r: 替换库中已有的目标文件,或者加入新的目标文件。
+- c: 创建一个库,不管库是否存在,都将创建。
+- s: 创建目标文件索引,在创建较大的库时能提高速度。
+
+示例:创建一个main.c文件来使用静态库
+
+```shell
+gcc main.c -L libraryDIR -ltest -o test.out
+```
+
+其中libraryDIR为libtest.a库的路径。
+
+## 示例
+
+### 使用GCC编译C程序示例
+
+1. cd到代码目录,此处以目录“~/code”进行举例,如下所示:
+
+ ```shell
+ cd ~/code
+ ```
+
+2. 编写Hello World程序,保存为helloworld.c,此处以编译Hello World程序进行举例说明,示例如下:
+
+ ```shell
+ vi helloworld.c
+ ```
+
+ 代码内容示例:
+
+ ```c
+ #include
+ int main()
+ {
+ printf("Hello World!\n");
+ return 0;
+ }
+ ```
+
+3. 在代码目录,执行编译,使用命令:
+
+ ```shell
+ gcc helloworld.c -o helloworld
+ ```
+
+ 编译执行未报错,表明执行通过。
+
+4. 编译完成后,会生成helloworld文件,查看编译结果,示例如下:
+
+ ```shell
+ # ./helloworld
+ Hello World!
+ ```
+
+### 使用GCC创建和使用动态链接库示例
+
+1. cd到代码目录,此处以目录“~/code”进行举例。并在该目录下创建src,lib,include子目录,分别用于存放源文件,动态库文件和头文件。
+
+ ```shell
+ cd ~/code
+ mkdir src lib include
+ ```
+
+2. cd到~/code/src目录,创建2个函数add.c、sub.c,分别实现加、减。
+
+ ```shell
+ cd ~/code/src
+ vi add.c
+ vi sub.c
+ ```
+
+ add.c代码内容示例:
+
+ ```shell
+ #include "math.h"
+ int add(int a, int b)
+ {
+ return a+b;
+ }
+ ```
+
+ sub.c代码内容示例:
+
+ ```c
+ #include "math.h"
+ int sub(int a, int b)
+ {
+ return a-b;
+ }
+ ```
+
+3. 将add.c、sub.c源文件创建为动态库libmath.so,并将该动态库存放在~/code/lib目录。
+
+ ```shell
+ gcc -fPIC -shared add.c sub.c -o ~/code/lib/libmath.so
+ ```
+
+4. cd到~/code/include目录,创建1个头文件math.h,声明函数的头文件。
+
+ ```shell
+ cd ~/code/include
+ vi math.h
+ ```
+
+ math.h代码内容示例:
+
+ ```c
+ #ifndef __MATH_H_
+ #define __MATH_H_
+ int add(int a, int b);
+ int sub(int a, int b);
+ #endif
+ ```
+
+5. cd到~/code/src目录,创建一个调用add\(\)和sub\(\)的main.c函数。
+
+ ```shell
+ cd ~/code/src
+ vi main.c
+ ```
+
+ math.c代码内容示例:
+
+ ```c
+ #include
+ #include "math.h"
+ int main()
+ {
+ int a, b;
+ printf("Please input a and b:\n");
+ scanf("%d %d", &a, &b);
+ printf("The add: %d\n", add(a,b));
+ printf("The sub: %d\n", sub(a,b));
+ return 0;
+ }
+ ```
+
+6. 将main.c和libmath.so一起编译成math.out。
+
+ ```shell
+ gcc main.c -I ~/code/include -L ~/code/lib -lmath -o math.out
+ ```
+
+7. 将动态链接库所在的路径加入到环境变量中。
+
+ ```shell
+ export LD_LIBRARY_PATH=~/code/lib:$LD_LIBRARY_PATH
+ ```
+
+8. 执行math.out。
+
+ ```shell
+ ./math.out
+ ```
+
+ 执行结果如下所示:
+
+ ```text
+ Please input a and b:
+ 9 2
+ The add: 11
+ The sub: 7
+ ```
+
+### 使用GCC创建和使用静态链接库示例
+
+1. cd到代码目录,此处以目录“~/code”进行举例。并在该目录下创建src,lib,include子目录,分别用于存放源文件,静态库文件和头文件。
+
+ ```shell
+ cd ~/code
+ mkdir src lib include
+ ```
+
+2. cd到~/code/src目录,创建2个函数add.c、sub.c,分别实现加、减。
+
+ ```shell
+ cd ~/code/src
+ vi add.c
+ vi sub.c
+ ```
+
+ add.c代码内容示例:
+
+ ```c
+ #include "math.h"
+ int add(int a, int b)
+ {
+ return a+b;
+ }
+ ```
+
+ sub.c代码内容示例:
+
+ ```c
+ #include "math.h"
+ int sub(int a, int b)
+ {
+ return a-b;
+ }
+ ```
+
+3. 将add.c、sub.c源文件编译为目标文件add.o、sub.o。
+
+ ```shell
+ gcc -c add.c sub.c
+ ```
+
+4. 将add.o、sub.o目标文件通过ar命令打包成静态库libmath.a,并将该静态库存放在~/code/lib目录。
+
+ ```shell
+ ar rcs ~/code/lib/libmath.a add.o sub.o
+ ```
+
+5. cd到~/code/include目录,创建1个头文件math.h,声明函数的头文件。
+
+ ```shell
+ cd ~/code/include
+ vi math.h
+ ```
+
+ math.h代码内容示例:
+
+ ```c
+ #ifndef __MATH_H_
+ #define __MATH_H_
+ int add(int a, int b);
+ int sub(int a, int b);
+ #endif
+ ```
+
+6. cd到~/code/src目录,创建一个调用add\(\)和sub\(\)的main.c函数。
+
+ ```shell
+ cd ~/code/src
+ vi main.c
+ ```
+
+ math.c代码内容示例:
+
+ ```c
+ #include
+ #include "math.h"
+ int main()
+ {
+ int a, b;
+ printf("Please input a and b:\n");
+ scanf("%d %d", &a, &b);
+ printf("The add: %d\n", add(a,b));
+ printf("The sub: %d\n", sub(a,b));
+ return 0;
+ }
+ ```
+
+7. 将main.c和libmath.a一起编译成math.out。
+
+ ```shell
+ gcc main.c -I ~/code/include -L ~/code/lib -lmath -o math.out
+ ```
+
+8. 执行math.out。
+
+ ```shell
+ ./math.out
+ ```
+
+ 执行结果如下所示:
+
+ ```text
+ Please input a and b:
+ 9 2
+ The add: 11
+ The sub: 7
+ ```
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/using-jdk-for-compilation.md b/docs/en/25.03/Server/Development/ApplicationDev/using-jdk-for-compilation.md
new file mode 100644
index 0000000000000000000000000000000000000000..a8abf11152d08224a146bb916f47ed7ecc2fcc74
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/using-jdk-for-compilation.md
@@ -0,0 +1,526 @@
+# 使用JDK编译
+
+
+
+- [使用JDK编译](#使用jdk编译)
+ - [简介](#简介)
+ - [基本规则](#基本规则)
+ - [文件类型及工具](#文件类型及工具)
+ - [java程序生成流程](#java程序生成流程)
+ - [JDK常用工具选项](#jdk常用工具选项)
+ - [类库](#类库)
+ - [包的声明](#包的声明)
+ - [包的引用](#包的引用)
+ - [示例](#示例)
+ - [编译不带包的java程序示例](#编译不带包的java程序示例)
+ - [编译带包的java程序示例](#编译带包的java程序示例)
+
+
+
+## 简介
+
+JDK(Java Development Kit)是 Java 开发者进行 Java 开发所必须的软件包,包含 JRE(Java Runtime Environment)和编译、调测工具。openEuler在OpenJDK 的基础上进行了 GC 优化、并发稳定性增强、安全性增强等修改,提高了 Java 应用程序在 ARM 上的性能和稳定性。
+
+## 基本规则
+
+### 文件类型及工具
+
+对于任何给定的输入文件,文件类型决定采用何种工具进行处理。JDK常用的文件类型如[表1](#table634145764320)所示,JDK常用的工具如[表2](#table103504146433)所示。
+
+**表 1** JDK常用的文件类型
+
+
+ 扩展名(后缀)
+
+ 说明
+
+
+
+ .java
+
+ java语言源代码文件。
+
+
+ .class
+
+ java的字节码文件,是一种和任何具体机器环境及操作系统环境无关的中间代码。它是一种二进制文件,是Java 源文件由 Java 编译器编译后生成的目标代码文件。
+
+
+ .jar
+
+ java的jar压缩文件。
+
+
+
+
+
+**表 2** JDK常用的工具
+
+
+ 工具名称
+
+ 说明
+
+
+
+ java
+
+ Java运行工具,用于运行.class字节码文件或.jar文件。
+
+
+ javac
+
+Java编程语言的编译器 ,将.java的源代码文件编译成.class的字节码文件。
+
+
+ jar
+
+创建和管理Jar文件 。
+
+
+
+
+
+### java程序生成流程
+
+通过JDK将java源代码文件生成并运行Java程序,需要经过编译和运行。
+
+1. 编译:是指使用Java编译器(javac)将java源代码文件(.java文件)编译为.class的字节码文件。
+2. 运行:是指在Java虚拟机上执行字节码文件。
+
+### JDK常用工具选项
+
+#### javac编译选项
+
+javac编译的命令格式为:**javac** \[_options_\] \[_sourcefiles_\] \[_classes_\] \[@_argfiles_\]
+
+其中:
+
+_options_ :命令选项。
+
+_sourcefiles_ :一个或多个需要编译的源文件。
+
+_classes_ :一个或多个要为注释处理的类。
+
+@_argfiles_ :一个或多个列出选项和源文件的文件。这些文件中不允许有-J选项。
+
+javac是java编译器,其 _options_ 参数取值很多,但有些大部分并不常用,常用的 _options_ 取值如[表3](#table1342946175212)所示。
+
+**表 3** javac常用的编译选项
+
+
+ options 取值
+
+ 说明
+
+ 示例
+
+
+
+ -d path
+
+指定存放生成的类文件的路径 。
+默认情况下,编译生成的类文件与源文件在同一路径下。使用-d选项可以将类文件输出到指定路径。
+
+#使用 -d选项将所有类文件输出到bin路径下
+ javac /src/*.java -d /bin
+
+
+ -s path
+
+指定存放生成的源文件的路径 。
+
+ -
+
+
+ -cp path 或-classpath path
+
+搜索编译所需的class文件,指出编译所用到的class文件的位置。
+
+ #在Demo中要调用GetStringDemo类中的getLine()方法,而GetStringDemo类编译后的文件,即.class文件在bin目录下。
+ javac -cp bin Demo.java -d bin
+
+
+ -verbose
+
+输出关于编译器正在执行的操作的消息,如加载的类信息和编译的源文件信息。
+
+ #输出关于编译器正在执行的操作的消息。
+ javac -verbose -cp bin Demo.java
+
+
+ -source sourceversion
+
+指定查找输入源文件的位置。
+
+ -
+
+
+ -sourcepath path
+
+ 用于搜索编译所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目录。
+
+ -
+
+
+ -target targetversion
+
+生成特定JVM版本的类文件 。取值为1.1,1.2,1.3,1.4,1.5(或5),1.6(或6),1.7(或7),1.8(或8)。 targetversion 的缺省值与-source选项的 sourceversion 有关。 sourceversion 取值:
+1.2, targetversion 为1.4; 1.3, targetversion 为1.4; 1.5、1.6、1.7、未指定, targetversion 为1.8。 其他值, targetversion 与 sourceversion 取值相同。
+
+ -
+
+
+
+
+
+#### java运行选项
+
+java运行的格式为:
+
+运行类文件:**java** \[_options_\] _classesname_ \[args\]
+
+运行jar文件:**java** \[_options_\] -jar _filename_ \[args\]
+
+其中:
+
+_options_ :命令选项,选项之间用空格分隔。
+
+_classname_ :运行的.class文件名。
+
+_filename_ :运行的.jar文件名。
+
+args:传递给main\(\)函数的参数,参数之间用空格分隔。
+
+java是运行java应用程序的工具,其 _options_ 参数取值很多,但有些大部分并不常用,常用的 _options_ 取值如[表4](#table371918587238)所示。
+
+**表 4** java常用的运行选项
+
+
+ options 取值
+
+ 说明
+
+ 示例
+
+
+
+ -cp path 或-classpath path
+
+ 指定要运行的文件所在的位置以及需要用到的类路径,包括jar、zip和class文件目录。
+ 当路径有多个时,使用“:”分隔。
+
+ -
+
+
+ -verbose
+
+输出关于编译器正在执行的操作的消息,如加载的类信息和编译的源文件信息。
+
+ #输出关于编译器正在执行的操作的消息。
+ java -verbose -cp bin Demo.java
+
+
+
+
+
+#### jar打包选项
+
+jar的命令格式为:**jar** \{c | t | x | u\}\[vfm0M\] \[_jarfile_\] \[_manifest_\] \[-C _dir_\] _file_...
+
+jar命令参数说明如[表5](#table3691718114817)所示。
+
+**表 5** jar命令参数说明
+
+
+ 参数
+
+ 说明
+
+ 示例
+
+
+
+ c
+
+ 创建jar文件包。
+
+ #把当前目录的hello.class文件打包到Hello.jar,且不显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。
+ jar cf Hello.jar hello.class
+
+
+ t
+
+ 列出jar文件包的内容列表。
+
+ #列出Hello.jar包含的文件清单。
+ jar tf Hello.jar
+
+
+ x
+
+ 展开jar文件包的指定文件或者所有文件。
+
+ #解压Hello.jar 到当前目录,不显示任何信息。
+ jar xf Hello.jar
+
+
+ u
+
+ 更新已存在的jar文件包,如添加文件到jar文件包中。
+
+ -
+
+
+ v
+
+ 生成详细报告并打印到标准输出。
+
+ #把当前目录的hello.class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。
+ jar cvf Hello.jar hello.class
+
+
+ f
+
+ 指定jar文件名,通常这个参数是必须的。
+
+ -
+
+
+ m
+
+ 指定需要包含的manifest清单文件。
+
+ -
+
+
+ 0
+
+ 只存储,不压缩,这样产生的jar文件包会比不用该参数产生的体积大,但速度更快。
+
+ -
+
+
+ M
+
+ 不产生所有项的manifest清单文件,此参数会忽略m参数
+
+ #把当前目录的hello.class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。但在创建Hello.jar时不产生manifest 文件。
+ jar cvfM Hello.jar hello.class
+
+
+ jarfile
+
+ .jar文件包,它是f参数的附属参数。
+
+ -
+
+
+ manifest
+
+ .mf的manifest清单文件,它是m参数的附属参数。
+
+ -
+
+
+ -C dir
+
+ 转到指定 dir 下执行jar命令,只能配合参数c、t使用。
+
+ -
+
+
+ file
+
+ 指定文件/路径列表,文件或路径下的所有文件(包括递归路径下的)都会被打入jar文件包中,或解压jar文件到路径下。
+
+ #把当前目录的所有class文件打包到Hello.jar,并显示打包的过程。如果Hello.jar文件还不存在,就创建它,否则首先清空它。
+ jar cvf Hello.jar *.class
+
+
+
+
+
+## 类库
+
+java类库是以包的形式实现的,包是类和接口的集合。java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类之间就有可能发生冲突。java语言中,把一组类和接口封装在一个包内,包可以有效地管理类名空间,位于不同包中的类即使同名也不会冲突,从而解决了同名类之间可能发生的冲突问题,为管理大量的类和接口提供了方便,也有利于类和接口的安全。
+
+除java提供的许多包外,开发者也可以自定义包,把自己编写的类和接口等组成程序包的形式,以便后续使用。
+
+自定义包需要先声明包,然后在使用包。
+
+### 包的声明
+
+包的声明格式为:package pkg1\[.pkg2\[.pkg3...\]\];
+
+为了声明一个包,首先必须建立一个相应的目录结构,子目录与包名一致,然后在需要放入该包的类文件开头声明包,表示该文件的全部类都属于这个包。包声明中的“.”指明了目录的层次。如果源程序文件中没有package语句,则指定为无名包。无名包没有路径,一般情况下,java仍然会把源文件中的类存储在当前工作目录(即存放java源文件的目录)下。
+
+包声明语句必须被加到源程序文件的起始部分,而且前面不能有注释和空格。如果在不同源程序文件中使用相同的包声明语句,就可以将不同源程序文件中的类都包含在相同的包中。
+
+### 包的引用
+
+在 Java 中,为了能使用java提供的包中的公用类,或者使用自定义的包中的类,有两种方法。
+
+- 在要引用的类名前带上包名。
+
+ 如:name.A obj=new name.A \(\);
+
+ 其中,name为包名,A为类名,obj为对象。表示程序中用name包中的A类定义一个对象obj。
+
+ 示例:新建一个example包中Test类的test对象。
+
+ ```shell
+ example.Test test = new example.Test();
+ ```
+
+- 在文件开头使用import来导入包中的类。
+
+ import语句的格式为:import pkg1\[.pkg2\[.pkg3...\]\].\(classname | \*\);
+
+ 其中,pkg1\[.pkg2\[.pkg3...\]\]表明包的层次,classname为所要导入的类。如果要从一个包中导入多个类,则可以使用通配符“\*”来替代。
+
+ 示例:导入example包中的Test类。
+
+ ```java
+ import example.Test;
+ ```
+
+ 示例:将example 整个包导入。
+
+ ```java
+ import example.*;
+ ```
+
+## 示例
+
+### 编译不带包的java程序示例
+
+1. cd到代码目录,此处以用户“~/code”进行举例。如下所示:
+
+ ```shell
+ cd ~/code
+ ```
+
+2. 编写Hello World程序,保存为HelloWorld.java,此处以编译Hello World程序进行举例说明。示例如下:
+
+ ```shell
+ vi HelloWorld.java
+ ```
+
+ 代码内容示例:
+
+ ```java
+ public class HelloWorld {
+ public static void main(String[] args) {
+ System.out.println("Hello World");
+ }
+ }
+ ```
+
+3. 在代码目录,执行编译,使用命令:
+
+ ```shell
+ javac HelloWorld.java
+ ```
+
+ 编译执行未报错,表明执行通过。
+
+4. 编译完成后,会生成 HelloWorld.class 文件,通过java命令可执行查看结果,示例如下:
+
+ ```shell
+ # java HelloWorld
+ Hello World
+ ```
+
+### 编译带包的java程序示例
+
+1. cd到代码目录,此处以用户“~/code”进行举例。并在该目录下创建“~/code/Test/my/example”、“~/code/Hello/world/developers”、“~/code/Hi/openos/openeuler”子目录,分别用于存放源文件。
+
+ ```shell
+ cd ~/code
+ mkdir -p Test/my/example
+ mkdir -p Hello/world/developers
+ mkdir -p Hi/openos/openeuler
+ ```
+
+2. cd到~/code/Test/my/example目录,创建Test.java。
+
+ ```shell
+ cd ~/code/Test/my/example
+ vi Test.java
+ ```
+
+ Test.java代码内容示例:
+
+ ```java
+ package my.example;
+ import world.developers.Hello;
+ import openos.openeuler.Hi;
+ public class Test {
+ public static void main(String[] args) {
+ Hello me = new Hello();
+ me.hello();
+ Hi you = new Hi();
+ you.hi();
+ }
+ }
+ ```
+
+3. cd到~/code/Hello/world/developers目录,创建Hello.java。
+
+ ```shell
+ cd ~/code/Hello/world/developers
+ vi Hello.java
+ ```
+
+ Hello.java代码内容示例:
+
+ ```java
+ package world.developers;
+ public class Hello {
+ public void hello(){
+ System.out.println("Hello, openEuler.");
+ }
+ }
+ ```
+
+4. ~/code/Hi/openos/openeuler目录,创建Hi.java。
+
+ ```shell
+ cd ~/code/Hi/openos/openeuler
+ vi Hi.java
+ ```
+
+ Hi.java代码内容示例:
+
+ ```java
+ package openos.openeuler;
+ public class Hi {
+ public void hi(){
+ System.out.println("Hi, the global developers.");
+ }
+ }
+ ```
+
+5. cd到~/code,使用javac编译源文件。
+
+ ```shell
+ cd ~/code
+ javac -classpath Hello:Hi Test/my/example/Test.java
+ ```
+
+ 执行完命令后,会在“~/code/Test/my/example”、“~/code/Hello/world/developers”、“~/code/Hi/openos/openeuler”目录下分别生成Test.class、Hello.class、Hi.class文件。
+
+6. cd到~/code,使用java运行Test程序。
+
+ ```shell
+ cd ~/code
+ java -classpath Test:Hello:Hi my/example/Test
+ ```
+
+ 执行结果如下所示:
+
+ ```text
+ Hello, openEuler.
+ Hi, the global developers.
+ ```
diff --git a/docs/en/25.03/Server/Development/ApplicationDev/using-make-for-compilation.md b/docs/en/25.03/Server/Development/ApplicationDev/using-make-for-compilation.md
new file mode 100644
index 0000000000000000000000000000000000000000..0e1efbafa7f3ed1dfaba0b060da09964b1be0bd7
--- /dev/null
+++ b/docs/en/25.03/Server/Development/ApplicationDev/using-make-for-compilation.md
@@ -0,0 +1,373 @@
+# 使用make编译
+
+本章介绍make编译的一些基本知识,并通过示例进行实际演示。更多的make选项请通过**man make**命令查询。
+
+
+- [使用make编译](#使用make编译)
+ - [简介](#简介)
+ - [基本规则](#基本规则)
+ - [文件类型](#文件类型)
+ - [make工作流程](#make工作流程)
+ - [make选项](#make选项)
+ - [Makefile](#makefile)
+ - [Makefile结构](#makefile结构)
+ - [Makefile主要内容](#makefile主要内容)
+ - [示例](#示例)
+ - [使用Makefile实现编译的示例](#使用makefile实现编译的示例)
+
+
+
+## 简介
+
+GNU make实用程序(通常缩写为make)是一种用于控制从源文件生成可执行文件的工具。 make会自动确定复杂程序的哪些部分已更改并需要重新编译。 make使用称为Makefiles的配置文件来控制程序的构建方式。
+
+## 基本规则
+
+### 文件类型
+
+makefile文件中可能用到的文件类型如[表1](#table634145764320)所示。
+
+**表 1** 文件类型
+
+
+ 扩展名(后缀)
+
+ 说明
+
+
+
+ .c
+
+ C语言源代码文件。
+
+
+ .C,.cc或.cxx
+
+ C++源代码文件。
+
+
+ .m
+
+ Objective-C源代码文件。
+
+
+ .s
+
+ 汇编语言源代码文件。
+
+
+ .i
+
+ 已经预处理的C源代码文件。
+
+
+ .ii
+
+ 已经预处理的C++源代码文件。
+
+
+ .S
+
+ 已经预处理的汇编语言源代码文件。
+
+
+ .h
+
+ 程序所包含的头文件。
+
+
+ .o
+
+ 编译后的目标文件。
+
+
+ .so
+
+动态链接库 ,它是一种特殊的目标文件。
+
+
+ .a
+
+ 静态链接库。
+
+
+ .out
+
+ 可执行文件,但可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。如果没有给出可执行文件的名字,GCC将生成一个名为a.out的文件。
+
+
+
+
+
+### make工作流程
+
+使用make由源代码文件生成可执行文件,需要经过如下步骤。
+
+1. make命令会读入Makefile文件,包括当前目录下命名为"GNUmakefile" 、"makefile" 、"Makefile"的文件、被include的makefile文件、参数-f、\-\-file、\-\-makefile指定的规则文件。
+2. 初始化变量。
+3. 推导隐含规则,分析依赖关系,并创建依赖关系链。
+4. 根据依赖关系链,决定哪些目标需要重新生成。
+5. 执行生成命令,最终输出终极文件。
+
+### make选项
+
+make命令格式为:**make** \[_option_\]... \[_target_\]...
+
+其中:
+
+_option_ :参数选项。
+
+_target_ :Makefile中指定的目标。
+
+常用make的 _option_ 取值如[表2](#table261872312343)所示。
+
+**表 2** 常用的make选项
+
+
+ options 取值
+
+ 说明
+
+
+
+ -C dir ,--directory= dir
+
+ 指定make在开始运行后的工作目录为 dir 。
+ 当存在多个 -C 选项的时候,make 的最终工作目录是第一个目录的相对路径。
+
+
+ -d
+
+ make在执行的过程中打印出所有的调试信息。使用-d选项可以显示make构造依赖关系链、重建目标过程中的所有信息。
+
+
+ -e,--environment-overrides
+
+ 使用环境变量定义覆盖Makefile中的同名变量定义。
+
+
+ -f file ,--file= file ,
+ --makefile= file
+
+ 指定 file 文件为make 执行的Makefile文件。
+
+
+ -h,--help
+
+ 打印帮助信息。
+
+
+ -i,--ignore-errors
+
+ 执行过程中忽略规则命令执行的错误。
+
+
+ -k,--keep-going
+
+执行命令错误时不终止make的执行,make 尽最大可能执行所有的命令,直至出现致命的错误才终止。
+
+
+ -n,--just-print,--dry-run
+
+ 按实际运行时的执行顺序模拟执行命令(包括用@开头的命令),没有实际执行效果,仅仅用于显示执行过程。
+
+
+ -o file ,--old-file= file ,--assume-old= file
+
+ 指定 file 文件不需要重建,即使它的依赖已经过期,同时不重建此依赖文件的任何目标。
+
+
+ -p,--print-data-base
+
+ 命令执行之前,打印出make读取的Makefile的所有数据,同时打印出 make的版本信息。如果只需要打印这些数据信息,可以使用 “make -qp”命令,查看 make 执行之前预设的规则和变量,可使用命令“make -p -f /dev/null”。
+
+
+ -r,--no-builtin-rules
+
+ 忽略内嵌的隐含规则的使用,同时忽略所有后缀规则的隐含后缀列表。
+
+
+ -R,--no-builtin-variables
+
+ 忽略内嵌的隐含变量。
+
+
+ -s,--silent,--quiet
+
+ 取消命令执行过程中的打印。
+
+
+ -S,--no-keep-going,--stop
+
+ 取消 "-k" 的选项在递归的 make 过程中子 make 通过 "MAKEFLAGS" 变量继承了上层的命令行选项那个。我们可以在子 make 中使用“-S”选项取消上层传递的 "-k" 选项,或者取消系统环境变量 "MAKEFLAGS" 中 "-k"选项。
+
+
+ -t,--touch
+
+ 更新所有的目标文件的时间戳到当前系统时间。防止 make 对所有过时目标文件的重建。
+
+
+ -v,--version
+
+ 查看make的版本信息。
+
+
+
+
+
+## Makefile
+
+make是通过Makefile文件获取如何编译、链接和安装、清理的方法,从而实现将源代码文件生成可执行文件和其他相关文件的工具。因此,Makefile中描述了整个工程的编译和链接等规则,其中包含了哪些文件需要编译,哪些文件不需要编译,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重建等等。Makefile文件让工程编译实现了自动化,不需要每次都手动输入一堆源文件和参数。
+
+本章简单介绍Makefile文件的结构和主要内容,更多Makefile的内容请通过**info make**命令查询
+
+### Makefile结构
+
+Makefile文件结构如下所示:
+
+_targets_:_prereguisites_
+
+_command_
+
+或者是:
+
+_targets_:_prerequisites_;_command_
+
+_command_
+
+其中:
+
+- _targets_ :目标,可以是目标文件、可执行文件或标签。
+- _prerequisites_ :依赖文件,生成targets需要的文件或者是目标。可以是多个,也可以没有。
+- _command_ :make需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。
+- 目标和依赖文件之间要使用“:”分隔,命令的开始一定要按“Tab”。
+
+Makefile文件结构表明了输出的目标,输出目标的依赖对象和生成目标需要执行的命令。
+
+### Makefile主要内容
+
+一个Makefile文件主要由以下内容组成。
+
+- 显式规则
+
+ 明确写出来的依赖关系,如要生成的文件,文件的依赖文件,生成的命令。
+
+- 隐含规则
+
+ 由make自动推导的规则,make命令支持自动推导功能。
+
+- 变量的定义
+- 文件指示
+
+ 文件指示包括三部分:
+
+ - include 其他 Makefile,如include xx.md。
+ - 选择执行,如\#ifdef。
+ - 定义多行命令,如define...endef。\(define ... endef\)
+
+- 注释
+
+ 以 “\#” 开头。
+
+## 示例
+
+### 使用Makefile实现编译的示例
+
+1. cd到代码目录,此处以目录“~/code”进行举例。
+
+ ```shell
+ cd ~/code
+ ```
+
+2. 创建1个头文件hello.h和2个函数hello.c、main.c。
+
+ ```c
+ vi hello.h
+ vi hello.c
+ vi main.c
+ ```
+
+ hello.h代码内容示例:
+
+ ```c
+ #pragma once
+ #include
+ void hello();
+ ```
+
+ hello.c代码内容示例:
+
+ ```c
+ #include "hello.h"
+ void hello()
+ {
+ int i=1;
+ while(i<5)
+ {
+ printf("The %dth say hello.\n", i);
+ i++;
+ }
+ }
+
+ ```
+
+ main.c代码内容示例:
+
+ ```c
+ #include "hello.h"
+ #include
+ int main()
+ {
+ hello();
+ return 0;
+ }
+ ```
+
+3. 创建Makefile文件。
+
+ ```shell
+ vi Makefile
+ ```
+
+ Makefile文件内容示例:
+
+ ```text
+ main:main.o hello.o
+ gcc -o main main.o hello.o
+ main.o:main.c
+ gcc -c main.c
+ hello.o:hello.c
+ gcc -c hello.c
+ clean:
+ rm -f hello.o main.o main
+ ```
+
+4. 执行make命令。
+
+ ```shell
+ make
+ ```
+
+ 命令执行后,会打印Makefile中执行的命令。如果不需要打印该信息,可以在执行make命令时加上参数-s。
+
+ gcc -c main.c
+
+ gcc -c hello.c
+
+ gcc -o main main.o hello.o
+
+5. 执行./main目标。
+
+ ```shell
+ ./main
+ ```
+
+ 命令执行后,打印如下信息:
+
+ The 1th say hello.
+
+ The 2th say hello.
+
+ The 3th say hello.
+
+ The 4th say hello.
diff --git a/docs/en/25.03/Server/Development/GCC/_menu.md b/docs/en/25.03/Server/Development/GCC/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..f6a1c5fdaa2285ed644e012ee9a973689a95fd2b
--- /dev/null
+++ b/docs/en/25.03/Server/Development/GCC/_menu.md
@@ -0,0 +1,16 @@
+---
+label: 'GCC用户指南'
+ismanual: 'Y'
+description: 'GCC for openEuler 编译器基于开源 GCC 开发,聚焦于C、C++、Fortran语言的优化'
+children:
+ - label: '内核反馈优化特性'
+ href: './kernel_FDO_user_guide.md'
+ - label: '链接时优化特性'
+ href: './link-time-optimization-user-guide.md'
+ - label: 'GCC基础性能优化特性'
+ href: './gcc-basic-performance-optimization-user-guide.md'
+ - label: 'GCC14副版本编译工具链'
+ href: './gcc14-sub-version-compilation-toolchain-user-guide.md'
+ - label: 'GCC插件框架特性'
+ href: './plugin-framework-user-guide.md'
+---
diff --git a/docs/en/25.03/Server/Development/GCC/gcc-basic-performance-optimization-user-guide.md b/docs/en/25.03/Server/Development/GCC/gcc-basic-performance-optimization-user-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..9d6302c3a1ab6c7a54925a92352ac45ee3c8769e
--- /dev/null
+++ b/docs/en/25.03/Server/Development/GCC/gcc-basic-performance-optimization-user-guide.md
@@ -0,0 +1,185 @@
+# GCC 基础性能优化用户指南
+
+## 简介
+
+编译器基础性能优化对于提高应用程序的开发效率、运行性能和可维护性都非常重要。它是计算机科学领域的一个重要研究方向,也是软件开发过程中的重要环节之一。GCC for openEuler 在通用编译优化能力的基础上,对中后端性能优化技术进行了增强,包括指令优化、向量化增强、预取增强、数据流分析增强等优化。
+
+## 安装与部署
+
+### 软件要求
+
+操作系统:openEuler 24.09
+
+### 硬件要求
+
+aarch64 架构
+
+### 安装软件
+
+按需安装 GCC 和相关组件即可,以 GCC 为例。
+
+```shell
+yum install gcc
+```
+
+## 使用方法
+
+### CRC优化
+
+#### 说明
+
+识别CRC软件循环代码,生成高效硬件指令。
+
+#### 使用方法
+
+在编译时增加 -floop-crc 选项。
+
+注:`-floop-crc`选项需要和`-O3 -march=armv8.1-a`一起使用。
+
+### If-conversion 增强
+
+#### 说明
+
+增强 If conversion 优化,使用更多的寄存器以减少冲突。
+
+#### 使用方法
+
+本优化是 RTL 优化 if-conversion 的一部分,使用如下编译选项控制优化启用。
+
+`-fifcvt-allow-complicated-cmps`
+
+`--param=ifcvt-allow-register-renaming=[0,1,2]`数字用于控制优化范围。
+
+注:此优化依赖`-O2`优化等级,以及与`--param=max-rtl-if-conversion-unpredictable-cost=48`、`--param=max-rtl-if-conversion-predictable-cost=48`共同使用。
+
+### 乘法计算优化
+
+#### 说明
+
+Arm 相关指令合并优化,实现32位复杂组合的64位整形乘法逻辑的识别,并以高效的64位指令数输出。
+
+#### 使用方法
+
+使用`-fuaddsub-overflow-match-all`和`-fif-conversion-gimple`选项使能优化。
+
+注:此优化需要`-O3`及以上优化等级。
+
+### cmlt 指令生成优化
+
+#### 说明
+
+对一些四则运算生成`cmlt`指令,减少指令数。
+
+#### 使用方法
+
+使用选项`-mcmlt-arith`使能优化。
+
+注:此优化需要`-O3`以上优化等级使用。
+
+### 向量化优化增强
+
+#### 说明
+
+识别并简化向量化过程中生成的冗余指令,允许更短的循环进入向量化。
+
+#### 使用方法
+
+使用参数`--param=vect-alias-flexible-segment-len=1`使能,默认为0。
+
+注:此优化需要`-O3`及以上优化等级。
+
+### min max 和 uzp1/uzp2 指令联合优化
+
+#### 说明
+
+识别 min max 和 uzp1/uzp2 指令联合优化机会,减少指令数从而提升性能。
+
+#### 使用方法
+
+使用`-fconvert-minmax`选项使能`min max`优化,`uzp1/uzp2`指令优化在`-O3`以上等级默认使能。
+
+注:依赖`-O3`及以上优化等级。
+
+### ldp/stp 优化
+
+#### 说明
+
+识别某些性能表现差的 ldp/stp,将其拆分成2个 ldr 和 str。
+
+#### 使用方法
+
+使用`-fsplit-ldp-stp`选项使能优化,使用参数`--param=param-ldp-dependency-search-range=[1,32]`控制搜索范围,默认16。
+
+注:依赖`-O1`及以上优化等级。
+
+### AES指令优化
+
+#### 说明
+
+识别 AES 软件算法指令序列,使用硬件指令加速。
+
+#### 使用方法
+
+使用`-fcrypto-accel-aes`选项使能优化。
+
+注:依赖`-O3`及以上优化等级。
+
+### 间接调用提升
+
+#### 说明
+
+识别和分析程序中的间接调用,尝试将其优化为直接调用。
+
+#### 使用方法
+
+使用选项`-ficp -ficp-speculatively`使能优化。
+
+注:此优化需要和-O2 -flto -flto-partition=one共同使用。
+
+### IPA-prefetch
+
+#### 说明
+
+识别循环中的间接访存,插入预取指令,从而减少间接访存的延迟。
+
+#### 使用方法
+
+通过选项`-fipa-prefetch -fipa-ic`使能优化。
+
+注:此优化需要和-O3 -flto共同使用。
+
+### -fipa-struct-reorg
+
+#### 说明
+
+内存空间布局优化,将结构体成员在内存中的排布进行新的排列组合,来提高cache的命中率。
+
+#### 使用方法
+
+在选项中加入`-O3 -flto -flto-partition=one -fipa-struct-reorg`即可。
+
+注:-fipa-struct-reorg选项,需要在-O3 -flto -flto-partition=one全局同时开启的基础上才使能。
+
+### -fipa-reorder-fields
+
+#### 说明
+
+内存空间布局优化,根据结构体中成员的占用空间大小,将成员从大到小排列,以减少边界对齐引入的padding,来减少结构体整体占用的内存大小,以提高cache的命中率。
+
+#### 使用方法
+
+在选项中加入`-O3 -flto -flto-partition=one -fipa-reorder-fields`即可。
+
+注:-fipa-reorder-fields选项,需要在-O3 -flto -flto-partition=one全局同时开启的基础上才使能。
+
+### -ftree-slp-transpose-vectorize
+
+#### 说明
+
+该选项在循环拆分阶段,增强对存在连续访存读的循环的数据流分析能力,通过插入临时数组拆分循环;SLP矢量化阶段,新增对grouped_stores进行转置的SLP分析。
+
+#### 使用方法
+
+在选项中加入`-O3 -ftree-slp-transpose-vectorize`即可。
+
+注:-ftree-slp-transpose-vectorize选项,需要在-O3开启的基础上才使能。
diff --git a/docs/en/25.03/Server/Development/GCC/gcc14-sub-version-compilation-toolchain-user-guide.md b/docs/en/25.03/Server/Development/GCC/gcc14-sub-version-compilation-toolchain-user-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..1c1bdf80e88d8256af53ab9f0a2071be59c2991d
--- /dev/null
+++ b/docs/en/25.03/Server/Development/GCC/gcc14-sub-version-compilation-toolchain-user-guide.md
@@ -0,0 +1,144 @@
+# 背景介绍
+
+## 简介
+
+为确保操作系统的稳健性,基础软件的选型策略通常倾向于采用经过时间验证、相对稳定的版本,而非最新发布版本。这一策略旨在避免版本更迭带来的潜在不稳定因素,确保在整个长期支持(LTS)周期内,系统版本保持相对稳定。因此,当前 openEuler 在 24.03 LTS 版本整个生命周期都是选择使用 GCC 12.3.1 作为基线进行开发。
+
+这样的选择会带来如下问题。首先,许多的硬件特性需要基础 GCC 工具链的支持,选择非最新版本的 GCC 会导致新特性无法及时在新发布的操作系统上使能。另外,某些用户倾向使用最新版本的编译器使能最新特性,这些特性相较于低版本编译器会带来部分性能提升。
+
+因此,为了使能多样算例新特性,满足不同用户对不同硬件特性支持的需求,在 openEuler 24.09 版本推出 openEuler GCC Toolset 工具链,这是一个专为 openEuler 系统设计的 GCC 多版本编译工具链,该工具链提供一个高于系统主 GCC 版本的副版本 GCC 编译工具链,为用户提供了更加灵活且高效的编译环境选择。通过使用 openEuler GCC Toolset 14 多版本编译工具链,用户可以轻松地在不同版本的 GCC 之间进行切换,以便充分利用新硬件特性,同时享受到 GCC 最新优化所带来的性能提升。
+
+## 方案设计
+
+### 编译工具链功能介绍
+
+GCC 编译工具链是一套由 GNU 开发和维护的开源编译器集合,它是用于将高级语言代码转换为机器语言的工具集,GCC 编译工具链不仅包括GCC编译器本身,还包含一系列辅助工具和库,这些组件共同构成了一个完整的编译环境。
+
+1. GCC 编译器(gcc/g++/gfrotran 等):
+
+ * 作用:GCC 编译器是工具链的核心,负责完成预处理和编译过程,将源代码转换成汇编代码或中间表示。对于 C++ 代码,g++ 是 GCC 的 C++ 编译器前端,除了完成编译工作外,还会自动链接 C++ 标准库。
+
+2. Binutils 工具集:
+
+ * 包含工具:链接器(ld)、汇编器(as)、目标文件格式查看器(readelf)、符号查看器(nm)、目标文件格式转换工具(objcopy)、反汇编工具(objdump)、尺寸查看工具(size)等。
+ * 作用:这些工具在编译过程中起辅助作用,如将汇编代码转换成机器码(汇编器)、将多个目标文件链接成可执行文件(链接器)、查看目标文件或可执行文件的信息(readelf、nm、objdump)等。
+
+3. glibc 库:
+
+ * 作用: glibc 是 GNU C Library 的缩写,是 GNU 组织为 GNU 系统以及 Linux 系统编写的 C 语言标准库。它包含了 C 语言中常用的标准函数,如 printf、malloc 等,是编译 C 语言程序时必不可少的部分。
+
+4. 其他辅助工具:
+
+ * 调试器(gdb):用于调试可执行文件,帮助开发者定位和解决程序中的错误。
+ * 性能分析工具(gprof):用于分析程序的性能,帮助开发者优化代码。
+
+### 工具链选型
+
+在编译过程中,工具链中的软件组件对编译结果具有直接影响。具体而言,GCC、binutils 以及 glibc是其核心要素。glibc 作为 C 语言标准库,其选型通常与操作系统内核版本紧密绑定,不轻易进行更改。本工具链仅包含 GCC 和 binutils 两款软件来满足副版本编译需求。
+
+当前最新的 GCC release 版本为 gcc-14.2.0,因此 openEuler GCC Toolset 工具链选型 的 GCC 的版本为gcc-14.2.0 。
+
+至于 binutils,openEuler 24.09 的默认 binutils 为 2.41 版本,而最新的 GCC-14 官方推荐搭配 binutils-2.42 使用,因此本工具链的 binutils 的版本选择 binutils-2.42 。
+
+基于此考量,openEuler GCC Toolset 副版本工具链引入 gcc-14.2.0 和 binutils-2.42,此举旨在确保编译环境的稳定性和效率,同时避免不必要的复杂性,力求在保障编译结果质量的同时,优化用户的使用体验。后期待 gcc-14.3.0 在上游社区 release 后,同步更新此工具链 GCC 版本。
+
+### 架构设计
+
+为区分于默认工具链安装,并防止 openEuler GCC Toolset 副版本编译工具链安装与默认编译工具链安装之间的依赖库冲突,将此工具链命名为 gcc-toolset-14 ,其软件包名均以前缀`gcc-toolset-14-`开头,后接原有工具链软件包名。同时,考虑到默认编译工具链安装路径为`/usr`,为避免路径重叠,特将 gcc-toolset-14 安装路径设定为`/opt/openEuler/gcc-toolset-14/`。为了与开源 GCC 做出区分,也便于后期合入更多 openEuler 社区特性,gcc-toolset-14-gcc 的版本设置为 14.2.1 。
+
+副版本编译工具链 gcc-toolset-14 提供的应用程序和库不会取代系统默认GCC版本,其包含的应用程序和库旨在与系统默认编译工具链版本并存,而非取代或覆盖它们,亦不会自动设为默认或首选选项。此外,为了实现低成本切换编译工具链版本,便于版本切换与管理,本方案引入 scl-utils 版本切换工具,具体使用和切换方式见下文。
+
+## 安装与部署
+
+### 软件要求
+
+* 操作系统:openEuler 24.09
+
+### 硬件要求
+
+* Aarch64 / X86_64
+
+### 安装方式
+
+默认 GCC 编译器 gcc-12.3.1,安装路径为 /usr :
+
+```shell
+yum install -y gcc gcc-c++
+```
+
+副版本编译工具链 gcc-toolset-14 安装路径为 /opt/openEuler/gcc-toolset-14/root/usr/ :
+
+```shell
+yum install -y gcc-toolset-14-gcc*
+yum install -y gcc-toolset-14-binutils*
+```
+
+## 使用方式
+
+本方案引入 SCL(Software Collections)工具进行不同版本编译工具链的管理。
+
+## scl工具
+
+SCL(Software Collections)是 Linux 系统中一个非常重要的工具,它为用户提供了一种方便、安全的安装和使用应用程序及运行时环境多个版本的方式,同时避免了系统混乱。
+
+SCL 的主要用途包括:
+
+1. 多版本共存:允许用户在同一系统上安装和使用多个版本的软件库、工具和语言运行环境,从而满足不同应用和开发需求。
+2. 避免系统冲突:通过隔离不同版本的软件,避免了新版本软件与系统原有版本之间的冲突。
+3. 提升开发效率:对于开发人员来说,SCL 提供了最新的开发工具链和运行时环境,从而提升了开发效率。
+
+### 版本切换方式
+
+**安装 SCL:**
+
+```shell
+yum install scl-utils scl-utils-build
+```
+
+**注册 gcc-toolset-14:**
+
+```shell
+## 注册 gcc-toolset-14
+scl register /opt/openEuler/gcc-toolset-14/
+
+## 取消注册 gcc-toolset-14
+scl deregister gcc-toolset-14
+```
+
+使用 `scl list-collections` 显示 gcc-toolset-14 已经在 scl 中注册成功;
+
+**切换 gcc-toolset-14:**
+
+```shell
+scl enable gcc-toolset-14 bash
+```
+
+此命令会启动一个新的 bash shell 会话,使用 gcc-toolset-14 内的工具版本,而不是系统默认版本。在新的 bash shell 会话中,无需再显式切换编译器版本和路径。
+如果需要退出 gcc-toolset-14 的编译环境,输入 `exit` 退出 bash shell 会话,此时编译工具链的版本切换成系统默认版本。
+
+SCL工具的本质就是自动设置不同工具版本的环境变量,具体可以参考 `/opt/openEuler/gcc-toolset-14/enable` 文档,gcc-toolset-14 的环境变量均在该文件中设置。若用户系统没有 SCL 工具,则可以使用以下方式进行工具链版本切换:
+
+```shell
+## 方案一:无 SCL 工具,使用脚本切换编译工具链
+source /opt/openEuler/gcc-toolset-14/enable
+
+## 方案二:有 SCL 工具,使用 SCL 工具切换编译工具链并激活运行环境
+scl enable gcc-toolset-14 bash
+```
+
+## 使用约束
+
+### 编译场景
+
+主版本场景:正常编译使用系统默认的 gcc-12.3.1 进行构建;
+
+副版本场景:需要使用 GCC-14 高版本特性构建相关应用,使用 SCL 工具将 bash 环境切换为 gcc-toolset-14 编译工具链的编译环境。
+
+### 副版本GCC-14使用说明
+
+1. openEuler GCC Toolset 14 副版本编译工具链提供如下两种使用方式:
+
+ 1)动态链接:默认场景下会自动添加选项 -lstdc++ 进行动态链接,此时会链接系统库动态库 /usr/lib64/libstdc++.so.6 和 GCC-14 副版本提供的 libstdc++_nonshared.a 静态库,此静态库是 GCC-14 相比于 GCC-12 新增的稳定 C++ 特性;
+ 2)静态链接:用户使用选项 -static 进行静态链接,此时会链接 GCC-14 副版本提供的 libstdc++.a 全量特性静态库,该静态库路径为 `/opt/openEuler/gcc-toolset-14/root/usr/lib/gcc/aarch64-openEuler-linux/14/libstdc++.a`。
+
+2. 用户默认构建使用动态链接,会链接新增的 libstdc++_nonshared.a 静态库,该库为了保持和系统兼容性,仅对 C++ 中正式标准特性进行封装。对于 -fmodules-ts , -fmodule-header 等选项,属于 C++20 的模块特性,而该特性在 C++20 中仍属于实验性质,并未封装在 libstdc++_nonshared.a 中,若用户需要使用此类新增特性,建议直接使用静态链接的方式全量链接 GCC-14 副版本的静态库。
diff --git a/docs/en/25.03/Server/Development/GCC/kernel_FDO_user_guide.md b/docs/en/25.03/Server/Development/GCC/kernel_FDO_user_guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..439dfc86813a151ede9f637cc6d66e26d6e7e937
--- /dev/null
+++ b/docs/en/25.03/Server/Development/GCC/kernel_FDO_user_guide.md
@@ -0,0 +1,68 @@
+# 内核反馈优化特性用户指南
+
+## 简介
+
+内核反馈优化(PGO kernel)特性为内核提供了反馈优化能力的支持,使用户可以为不同的应用程序构建针对性优化的内核,在单应用场景下提高目标应用的性能。同时,该特性一并在openEuler GCC内提供了相应的编译支持,以及在A-FOT中提供了自动优化的功能,使用户能够便捷地使能内核反馈优化特性。
+
+## 安装与部署
+
+### 软件要求
+
+* 操作系统:openEuler 23.09
+
+### 硬件要求
+
+* aarch64架构
+* x86_64架构
+
+### 安装软件
+
+安装内核源码、A-FOT和其他依赖软件包
+
+```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 .
+```
+
+**注意:具体的版本号可能会有变化。**
+
+## 使用方法
+
+用户可以通过A-FOT工具使能内核反馈优化,一键得到优化内核。将opt_mode指定Auto_kernel_PGO则为PGO kernel模式。所有配置选项也可以通过命令行指定,例如./a-fot --pgo_phase 1,另外-s、-n选项只能在命令行指定。PGO kernel相关的选项说明如下表所示。
+
+| 序号 | 选项名称(配置文件) | 选项说明 | 默认值 |
+| ---- | -------------------- | ------------------------------------------------------------ | ------------------------ |
+| 1 | config_file | 配置文件路径;根据此文件内容读取用户的选项配置。 | ${afot_path}/a-fot.ini |
+| 2 | opt_mode | 优化模式;工具将执行的优化模式,必须为AutoFDO、AutoPrefetch、AutoBOLT、Auto_kernel_PGO四者之一;分别代表自动反馈优化、自动预取、自动二进制优化和自动内核反馈优化。 | AutoPrefetch |
+| 3 | pgo_mode | PGO模式;内核的反馈优化模式,GCOV或完整的PGO*,必须为arc或all;分别代表仅使用arc profile和使用arc+value profile。 | all |
+| 4 | pgo_phase | 内核反馈优化的执行阶段;工具根据阶段执行不同的操作,必须为1或2;1代表编译插桩内核的阶段,2代表收集数据、编译优化内核的阶段。 | 1 |
+| 5 | kernel_src | 内核源码目录;指定则工具进入编译内核,否则工具自动下载源码。 | 无(可选) |
+| 6 | kernel_name | 内核构建的本地名;工具将根据阶段添加"-pgoing"或"-pgoed"后缀。 | kernel |
+| 7 | work_path | 脚本工作目录;此目录用于存放日志文件、wrapper和profile。 | /opt(不能在/tmp目录下) |
+| 8 | run_script | 应用执行脚本路径;此脚本为目标应用的执行脚本,需要用户完成编写;工具将后台运行此脚本以执行目标应用。 | /root/run.sh |
+| 9 | gcc_path | GCC路径;工具调用真正编译器GCC的路径。 | /usr |
+| 10 | -s | 安静模式;工具自动重启系统切换内核、执行第二阶段。 | 无 |
+| 11 | -n | 不要让工具来编译内核;适用于执行环境和内核编译环境分离的场景。 | 无 |
+
+配置完编译选项后,可以使用如下命令进行A-FOT自动化优化内核:
+
+```shell
+a-fot --config_file ./a-fot.ini -s
+```
+
+**注意:-s选项会让A-FOT工具自动重启机器切换内核,如果用户不希望自动进行这一项敏感操作,请去掉这一选项。但用户需要在重启后手动执行第二阶段(--pgo_phase 2)。**
+
+**注意:所有路径名请使用绝对路径。**
+
+**注意*:openEuler 23.09版本的内核暂不支持完整的PGO,请修改pgo_mode值为arc。**
+
+## 兼容性说明
+
+此节主要列出当前一些特殊场景下的兼容性问题。本项目持续迭代中,会尽快进行修复,也欢迎广大开发者加入。
+
+* openEuler 23.09版本的内核暂不支持完整的PGO,目前只支持arc模式。
diff --git a/docs/en/25.03/Server/Development/GCC/link-time-optimization-user-guide.md b/docs/en/25.03/Server/Development/GCC/link-time-optimization-user-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..85b4760405a946e2d220c9601816208bec6201d6
--- /dev/null
+++ b/docs/en/25.03/Server/Development/GCC/link-time-optimization-user-guide.md
@@ -0,0 +1,25 @@
+# 链接时优化简介
+
+在传统编译流程中,gcc 将单个源文件(称谓一个编译单元)直接进行编译优化生成包含汇编代码的`.o`目标对象文件,并由链接器对这些`.o`文件进行符号表解析与重定位,链接成可执行文件。在这个过程中,拥有跨文件函数调用信息的链接器由于操作的是汇编代码,难以进行编译优化,而可以执行编译优化的环节,却没有跨文件的全局信息。这样的编译框架,虽然提高了编译效率,每次重新编译只需要编译修改过的少量编译单元,但也丢失了许多跨文件的优化机会。
+
+链接时优化(LTO), 设计的初衷就是希望能够在链接时,拥有跨编译单元的调用信息的时候,进行编译优化,提供更多的优化机会。为了达到这个目的,LTO 需要将编译优化所需的 IR 信息保留到链接时。在链接时,链接器会调用 LTO 插件,执行全程序分析,生成更加有效的优化决策,再经由编译优化生成更高效的IR,进一步转成包含汇编代码的目标对象文件,最后由链接器完成常规的链接工作。
+
+# 版本构建使能
+
+## 背景
+
+为了获得更优的性能与更小的二进制体积,许多海外社区已经在版本构建中使用了链接时优化,链接时优化也正在成为各方寻找编译优化机会的新战场。openEuler 计划从 24.09 创新版本开始,在版本构建中引入 LTO。
+
+## 方案
+
+我们将在 openEuler-rpm-config 的 macro 中所包含的全局编译选项中插入 `-flto -ffat-lto-objects` ,以达到在构建软件包是使能 lto 的效果。其中 `-flto` 用以使能链接时优化,而 `-ffat-lto-objects` 用以生成同时包含 LTO 对象信息和常规链接所需的汇编信息的胖目标对象。在当前构建中,LTO 对象信息会参与 LTO 优化,而由于 LTO 目标对象文件在不同版本的 gcc 之间是不通用的,因此在打包生成对应的 `.rpm` 包之前,我们会将 `.o/.a` 文件中的 LTO 相关字段给消除,仅保留常规链接所需的汇编代码信息,不对静态库本身产生影响。
+
+## 使能范围
+
+由于 LTO 的编译流程与常规的编译流程相差较大,影响较广,为了控制 LTO 对版本质量的冲击,我们当前仅对 500+ 个软件包使能了 lto,你可以在 `/usr/lib/rpm/%{_vendor}/lto_white_list` 中找到这些软件包的清单。这些白名单应用在使能了 LTO 之后构建成功,并通过了自带的测试套。lto 编译选项仅在构建白名单应用时被设置为 `-flto -ffat-lto-objects`,否则置为空。
+
+我们会在后续的创新版本上,联合应用维护者,扩大 LTO 使能的范围。
+
+## 注意事项
+
+当前热补丁机制与 LTO 仍存在不兼容,热补丁在 LTO 开启时会失效。我们已与热补丁团队就解决方式达成一致,会在后续版本中解决该问题。
diff --git a/docs/en/25.03/Server/Development/GCC/overview.md b/docs/en/25.03/Server/Development/GCC/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..84a82e187149c7b4ea3b45529e1b4b25fdfbe9a8
--- /dev/null
+++ b/docs/en/25.03/Server/Development/GCC/overview.md
@@ -0,0 +1,3 @@
+# GCC for openEuler用户指南
+
+GCC for openEuler编译器基于开源GCC(GNU Compiler Collection,GNU编译器套装)开发。开源GCC是一种支持多种编程语言的跨平台开源编译器,采用GPLv3(GNU General Public License, version 3)协议,是Linux系统上目前应用最广泛的C/C++编译器,基本被认为是跨平台编译器的事实标准。而GCC for openEuler在继承了开源GCC能力的基础上,聚焦于C、C++、Fortran语言的优化,增强自动反馈优化、软硬件协同、内存优化、自动向量化等特性,并适配国产硬件平台,如鲲鹏、飞腾、龙芯等,充分释放国产硬件算力。
diff --git a/docs/en/25.03/Server/Development/GCC/plugin-framework-user-guide.md b/docs/en/25.03/Server/Development/GCC/plugin-framework-user-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..1230609cec29a51c8d01e359a19ede260f9abec6
--- /dev/null
+++ b/docs/en/25.03/Server/Development/GCC/plugin-framework-user-guide.md
@@ -0,0 +1,134 @@
+# 安装与部署
+
+## 软件要求
+
+* 操作系统:openEuler 23.03
+
+## 硬件要求
+
+* x86_64架构
+* ARM架构
+
+## 环境准备
+
+* 安装openEuler系统,安装方法参考 《[安装指南](../../InstallationUpgrade/Installation/installation.md)》。
+
+### 安装依赖软件
+
+#### 安装插件框架GCC客户端依赖软件
+
+```shell
+yum install -y grpc
+yum install -y grpc-devel
+yum install -y grpc-plugins
+yum install -y protobuf-devel
+yum install -y jsoncpp
+yum install -y jsoncpp-devel
+yum install -y gcc-plugin-devel
+yum install -y llvm-mlir
+yum install -y llvm-mlir-devel
+yum install -y llvm-devel
+```
+
+#### 安装插件框架服务端依赖软件
+
+```shell
+yum install -y grpc
+yum install -y grpc-devel
+yum install -y grpc-plugins
+yum install -y protobuf-devel
+yum install -y jsoncpp
+yum install -y jsoncpp-devel
+yum install -y llvm-mlir
+yum install -y llvm-mlir-devel
+yum install -y llvm-devel
+```
+
+## 安装Pin
+
+### rpm构建
+
+#### 构建插件框架GCC客户端
+
+```shell
+git clone https://gitee.com/src-openeuler/pin-gcc-client.git
+cd pin-gcc-client
+mkdir -p ~/rpmbuild/SOURCES
+cp *.path pin-gcc-client.tar.gz ~/rpmbuild/SOURCES
+rpmbuild -ba pin-gcc-client.spec
+cd ~/rpmbuild/RPMS
+rpm -ivh pin-gcc-client.rpm
+```
+
+#### 构建插件框架服务端
+
+```shell
+git clone https://gitee.com/src-openeuler/pin-server.git
+cd pin-server
+mkdir -p ~/rpmbuild/SOURCES
+cp *.path pin-server.tar.gz ~/rpmbuild/SOURCES
+rpmbuild -ba pin-server.spec
+cd ~/rpmbuild/RPMS
+rpm -ivh pin-server.rpm
+```
+
+### 编译构建
+
+#### 构建插件框架GCC客户端
+
+```shell
+git clone https://gitee.com/openeuler/pin-gcc-client.git
+cd pin-gcc-client
+mkdir build
+cd build
+cmake ../ -DMLIR_DIR=${MLIR_PATH} -DLLVM_DIR=${LLVM_PATH}
+make
+```
+
+#### 构建插件框架服务端
+
+```shell
+git clone https://gitee.com/openeuler/pin-server.git
+cd pin-server
+mkdir build
+cd build
+cmake ../ -DMLIR_DIR=${MLIR_PATH} -DLLVM_DIR=${LLVM_PATH}
+make
+```
+
+# 使用方法
+
+用户可以通过`-fplugin`和`-fplugin-arg-libpin_xxx`使能插件工具。
+命令如下:
+
+```shell
+$(TARGET): $(OBJS)
+ $(CXX) -fplugin=${CLIENT_PATH}/build/libpin_gcc_client.so \
+ -fplugin-arg-libpin_gcc_client-server_path=${SERVER_PATH}/build/pin_server \
+ -fplugin-arg-libpin_gcc_client-log_level="1" \
+ -fplugin-arg-libpin_gcc_client-arg1="xxx"
+```
+
+为了方便用户使用,可以通过`${INSTALL_PATH}/bin/pin-gcc-client.json`文件,进行插件配置。配置选项如下:
+
+`path` : 配置插件框架服务端可执行文件路径
+
+`sha256file` : 配置插件工具的校验文件`xxx.sha256`路径
+
+`timeout` : 配置跨进程通信超时时间,单位`ms`
+
+编译选项:
+
+`-fplugin`:指定插件客户端.so所在路径
+
+`-fplugin-arg-libpin_gcc_client-server_path`:指定插件服务端可执行程序所在路径
+
+`-fplugin-arg-libpin_gcc_client-log_level`:指定日志系统默认记录等级,取值`0~3`。默认为`1`
+
+`-fplugin-arg-libpin_gcc_client-argN`:用户可以根据插件工具要求,指定其他参数。argN代指插件工具要求的参数字段。
+
+# 兼容性说明
+
+此节主要列出当前一些特殊场景下的兼容性问题。本项目持续迭代中,会尽快进行修复,也欢迎广大开发者加入。
+
+* 插件框架在`-flto`阶段使能时,不支持使用`make -j`多进程编译。建议改用`make -j1`进行编译。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/_menu.md b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..8ebe0c614e14fc0e12e832d75768b15c36397801
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/_menu.md
@@ -0,0 +1,12 @@
+---
+label: 'DPU-OS'
+ismanual: 'Y'
+description: '介绍基于openEuler操作系统裁剪构建DPU-OS镜像的方法以及部署验证方法'
+children:
+ - label: 'DPU-OS背景与需求'
+ href: './dpu-os-background-and-requirements.md'
+ - label: 'DPU-OS裁剪指导'
+ href: './dpu-os-tailoring-guide.md'
+ - label: '验证与部署'
+ href: './verification-and-deployment.md'
+---
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/dpu-os-background-and-requirements.md b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/dpu-os-background-and-requirements.md
new file mode 100644
index 0000000000000000000000000000000000000000..b310da809defb43e6d59dde99e5e2a679b492c4c
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/dpu-os-background-and-requirements.md
@@ -0,0 +1,67 @@
+# DPU-OS背景与需求
+
+## 概述
+
+在数据中心及云场景下,摩尔定律失效,通用处理单元CPU算力增长速率放缓,而网络IO类速率及性能不断攀升,二者增长速率差异形成剪刀差,即当前通用处理器的处理能力无法跟上网络、磁盘等IO处理的需求。传统数据中心下越来越多的通用CPU算力被IO及管理面等处理占用,这部分资源损耗称之为数据中心税(Datacenter Tax)。据AWS统计,数据中心税可能占据数据中心算力的30%以上,部分场景下甚至可能更多。
+
+DPU (Data Processing Unit) 的出现就是为了将这部分算力资源从主机CPU上解放出来,通过将管理面、网络、存储、安全等能力卸载到专有的处理器芯片上进行处理加速,达成降本增效的结果。目前主流云厂商如AWS、阿里云、华为云都通过自研芯片完成管理面及相关数据面的卸载,实现数据中心计算资源100%售卖给客户。
+
+目前DPU发展非常火热,云厂商及大数据在相关场景下对DPU存在较强烈的需求,国内也有很多DPU初创公司推出不同的DPU产品。在这一背景下,云和大数据等厂商需要考虑如何整合使用不同DPU产品,而DPU厂商也面临对不同客户交付时设备驱动适配客户指定操作系统的问题。openEuler作为国内领先的开源开放操作系统,通过基于openEuler构建的DPU-OS,解决DPU厂商及客户之间的适配问题。另外DPU上OS用于承载部分业务加速的需求,需要对DPU-OS进行性能优化加速,可以基于openEuler构建DPU相关加速能力,内置在DPU-OS中,构建DPU相关软件生态。
+
+## DPU-OS需求分析及设计
+
+### DPU现状及对OS需求
+
+DPU普遍具有以下特点和问题:
+
+* DPU通用处理能力资源受限
+
+ 当前DPU仍处在发展早期阶段,硬件上仍在不断演进,而且由于DPU供电限制,当前硬件规格普遍较低。主流DPU中通用处理器CPU核数普遍较少,约8-24CPU,且单核处理能力较弱。内存大小受限,普遍在16-32GB。DPU本地存储空间为几十到几百GB不等。运行于DPU之上的操作系统也需要考虑这些限制。
+
+* DPU-OS安装方式多样
+
+ 当前DPU厂商及产品多种多样,对应操作系统的安装部署方式也不尽相同,包括PXE网络安装、U盘安装或其他自定义安装方式(由HOST下发安装镜像)。
+
+* DPU性能需求
+
+ DPU的应用场景决定其对性能有强烈需求,相比于通用服务器操作系统,DPU-OS可能对内核特性或功能组件有特殊要求,比如用于设备直通热迁移的vDPA特性、厂商特定驱动适配支持、DPU进程的无感卸载特性、定制优化的用户态数据面加速工具如DPDK/SPDK/OVS、DPU管理监控相关的工具类组件。
+
+针对以上DPU现状,提出对DPU-OS的需求如下:
+
+* 极致轻量的DPU-OS安装包
+
+ 通过裁剪openEuler系统镜像,减少非必要安装包的空间占用;通过优化系统服务,减少资源底噪开销。
+
+* 裁剪配置及工具支持
+
+ 提供裁剪配置及裁剪工具支持,客户或DPU厂商可根据各自需求进行定制;openEuler提供ISO参考实现。
+
+* 定制化内核及系统,提供极致性能
+
+ 通过定制内核及相关驱动,提供DPU竞争力内核特性;定制化加速类组件,使能DPU硬件加速能力;优化系统配置提供更优性能;通过DPU相关管理控制工具,方便用户统一管理。
+
+### DPU-OS设计
+
+**图1**DPU-OS整体设计
+
+
+
+如图1所示,DPU-OS分为五层设计:
+
+* 内核层:通过定制内核config,裁剪非必需内核特性及模块,达成内核轻量级效果;使能特定内核特性提供高性能DPU内核能力。
+
+* 驱动层:对openEuler原生驱动进行裁剪定制,选择最小集合;DPU厂商相关底层驱动集成,原生支持部分DPU硬件产品。
+
+* 系统配置层:通过对系统sysctl、proc进行配置,为DPU相关业务提供最优性能。
+
+* 外围包层:对openEuler外围包进行裁剪定制,选择最小集合;提供DPU相关的定制工具集合。
+
+* 系统服务层:通过优化系统原生服务启动项,减少非必要系统服务运行,保证系统运行时底噪最小化。
+
+通过上述五层设计达成轻量化、极致性能DPU-OS的目标。该方案为相对长期设计,且对DPU相关软硬件生态有较强的依赖;当前第一阶段先实现基于openEuler imageTailor进行裁剪。
+
+DPU-OS的裁剪步骤可参考[DPU-OS裁剪指导文档](./dpu-os-tailoring-guide.md),验证与部署可参考[DPU-OS部署验证指导文档](./verification-and-deployment.md)。
+
+> **说明**:
+>
+> 当前阶段DPU-OS先基于openEuler现有内核及外围包,使用镜像裁剪工具imageTailor进行裁剪,提供轻量化OS安装镜像。后续可根据实际诉求,进行相关内核及外围包特性的开发及集成。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/dpu-os-tailoring-guide.md b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/dpu-os-tailoring-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..9f34d577dd9828fd9d226d1f6bf04201835c2c34
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/dpu-os-tailoring-guide.md
@@ -0,0 +1,65 @@
+# DPU-OS裁剪指导
+
+本文档主要介绍`imageTailor`的使用方法并结合[dpu-utilities仓库](https://gitee.com/openeuler/dpu-utilities/tree/master/dpuos)的`dpuos`配置文件裁剪得到`dpuos`的安装镜像,具体步骤如下:
+
+## 准备imageTailor和所需的rpm包
+
+参照[imageTailor使用指导文档](https://docs.openeuler.org/zh/docs/22.03_LTS/docs/TailorCustom/imageTailor%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.html)安装好`imageTailor`工具并将裁剪所要用到的rpm包准备好。
+
+可以使用openEuler提供安装镜像作为镜像裁剪所需要rpm包源,`openEuler-22.03-LTS-everything-debug-aarch64-dvd.iso`中的rpm比较全但是此镜像很大,可以用镜像`openEuler-22.03-LTS-aarch64-dvd.iso`中的rpm包和一个`install-scripts.noarch`实现。
+
+`install-scripts.noarch`包括可以从everything包中获取,或者在系统中通过yum下载:
+
+```bash
+yum install -y --downloadonly --downloaddir=./ install-scripts
+```
+
+## 拷贝dpuos相关的配置文件
+
+`imageTailor`工具默认安装在`/opt/imageTailor`路径下。执行下面的命令将`dpuos`的配置拷贝到对应的路径下,拷贝时选择对应架构目录。当前DPU-OS裁剪配置库支持x86_64和aarch64两种架构。
+
+```bash
+cp -rf custom/cfg_dpuos /opt/imageTailor/custom
+cp -rf kiwi/minios/cfg_dpuos /opt/imageTailor/kiwi/minios/cfg_dpuos
+```
+
+## 修改其他配置文件
+
+* 修改`kiwi/eulerkiwi/product.conf`,增加一行`dpuos`相关配置:
+
+```bash
+dpuos PANGEA EMBEDDED DISK GRUB2 install_mode=install install_media=CD install_repo=CD selinux=0
+```
+
+* 修改`kiwi/eulerkiwi/minios.conf`,增加一行`dpuos`的相关配置:
+
+```bash
+dpuos kiwi/minios/cfg_dpuos yes
+```
+
+* 修改`repos/RepositoryRule.conf`,增加一行`dpuos`的相关配置:
+
+```bash
+dpuos 1 rpm-dir euler_base
+```
+
+## 设置密码
+
+进入到`/opt/imageTailor`子目录下,修改下面3个文件的密码:
+
+* `custom/cfg_dpuos/usr_file/etc/default/grub`
+
+* `custom/cfg_dpuos/rpm.conf`
+
+* `kiwi/minios/cfg_dpuos/rpm.conf`
+
+密码生成及修改方法可详见openEuler imageTailor手册[配置初始密码](https://docs.openeuler.org/zh/docs/22.03_LTS/docs/TailorCustom/imageTailor%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97.html#%E9%85%8D%E7%BD%AE%E5%88%9D%E5%A7%8B%E5%AF%86%E7%A0%81)章节。
+
+## 执行裁剪命令
+
+执行下面的命令进行裁剪,最后裁剪出来的iso在`/opt/imageTailor/result`路径下:
+
+```bash
+cd /opt/imageTailor
+./mkdliso -p dpuos -c custom/cfg_dpuos --sec --minios force
+```
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/figures/dpuos-arch.png b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/figures/dpuos-arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..453370ab07858a13a6c40f8d22e3f608e9ec6b4c
Binary files /dev/null and b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/figures/dpuos-arch.png differ
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/overview.md b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..da40e928858c43a4b6d54e59995ad58897b40f8f
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/overview.md
@@ -0,0 +1,11 @@
+# 概述
+
+本文档介绍DPU-OS的背景需求及整体设计思想,并介绍基于openEuler操作系统裁剪构建DPU-OS镜像的方法以及部署验证方法。该特性基于openEuler生态构建轻量化以及极致性能的DPU-OS,为DPU场景及用户提供DPU-OS参考实现。
+
+本文档适用于使用openEuler系统并希望了解和使用DPU的社区开发者、DPU厂商及客户。使用人员需要具备以下经验和技能:
+
+- 熟悉Linux基本操作。
+
+- 熟悉Linux系统构建及部署的相关基础知识和操作。
+
+- 对openEuler ImageTailor镜像裁剪工具有一定了解。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/public_sys-resources/icon-note.gif b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/verification-and-deployment.md b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/verification-and-deployment.md
new file mode 100644
index 0000000000000000000000000000000000000000..3284d19d7655bfd48cb29e9b57e908e1b8dd3e11
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPU-OS/verification-and-deployment.md
@@ -0,0 +1,38 @@
+# 验证与部署
+
+DPU-OS制作完成后可以安装部署进行验证。由于目前DPU硬件还不成熟,也可以通过VirtualBox拉起虚拟机进行相关部署验证。
+
+## 在VirtualBox上部署DPU-OS
+
+本章节展示了如何在VirtualBox虚拟机管理程序上安装部署DPU-OS。
+
+### 验证准备
+
+在开始部署 DPU-OS 之前,需要做如下准备工作:
+
+- 获取 DPU-OS ISO
+- 安装有VirtualBox的宿主机
+
+### 初步安装与启动
+
+#### 创建虚拟机
+
+通过VirtualBox创建新的虚拟机:
+
+- 选择虚拟机配置,CPU及内存建议2CPU+4GB内存以上
+
+- 创建虚拟机磁盘,磁盘大小建议60GB以上
+
+- 系统扩展属性部分,勾选启动EFI
+
+- 存储设置部分,光驱配置选择本地DPU-OS ISO作为光驱文件
+
+- 其他网络或显示设置可自定义
+
+#### 启动虚拟机
+
+启动新建的虚拟机,启动项选择`Install from ISO`进行DPU-OS安装,安装过程自动进行无需手动干预,安装完成后自动重启。
+
+选择启动项 `Boot From Local Disk`,启动后即可进入DPU-OS。密码为DPU-OS制作时指定的密码。
+
+通过上述步骤,即可完成DPU-OS的本地部署验证。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/_menu.md b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..8fa33f8bf9431224f9e53853d0851d3c0d0954d8
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/_menu.md
@@ -0,0 +1,17 @@
+---
+label: '直连聚合用户指南'
+ismanual: 'Y'
+description: '介绍基于openEuler操作系统的容器管理面DPU无感卸载功能特性及安装部署方法'
+children:
+ - label: '直连聚合环境搭建'
+ href: './libvirt-direct-connection-aggregation-environment-establishment.md'
+ - label: 'qtfs共享文件系统架构'
+ href: './qtfs-architecture-and-usage.md'
+ - label: '容器管理面DPU无感卸载'
+ href: './overview.md'
+ children:
+ - label: '容器管理面无感卸载'
+ href: './imperceptible-container-management-plane-offload.md'
+ - label: '容器管理面无感卸载部署指导'
+ href: './offload-deployment-guide.md'
+---
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/config/rexec.service b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/config/rexec.service
new file mode 100644
index 0000000000000000000000000000000000000000..ee9e5e4895adb5c010e3f8d4db6652cfaed3d355
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/config/rexec.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Rexec_server Service
+After=network.target
+
+[Service]
+Type=simple
+Environment=CMD_NET_ADDR=tcp://0.0.0.0:7777
+ExecStart=/usr/bin/rexec_server
+ExecReload=/bin/kill -s HUP $MAINPID
+KillMode=process
+
+[Install]
+WantedBy=multi-user.target
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/arch.png b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6a7836fd6fab75009e781ac1ed96c73c352f75b
Binary files /dev/null and b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/arch.png differ
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/offload-arch.png b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/offload-arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..944900b42c13091e4ec40c6d51dc3c95088aa1b8
Binary files /dev/null and b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/offload-arch.png differ
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/qtfs-arch.png b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/qtfs-arch.png
new file mode 100644
index 0000000000000000000000000000000000000000..40fd7e28707642801ec0b984690a25c08e092ac4
Binary files /dev/null and b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/figures/qtfs-arch.png differ
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/imperceptible-container-management-plane-offload.md b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/imperceptible-container-management-plane-offload.md
new file mode 100644
index 0000000000000000000000000000000000000000..0eb57b2e40fb8c356f109075842288209052163a
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/imperceptible-container-management-plane-offload.md
@@ -0,0 +1,31 @@
+# 容器管理面无感卸载介绍
+
+## 概述
+
+在数据中心及云场景下,随着摩尔定律失效,通用处理单元CPU算力增长速率放缓,而同时网络IO类速率及性能不断攀升,二者增长速率差异形成的剪刀差,即当前通用处理器的处理能力无法跟上网络、磁盘等IO处理的需求。传统数据中心下越来越多的通用CPU算力被IO及管理面等占用,这部分资源损耗称之为数据中心税(Data-center Tax)。据AWS统计,数据中心税可能占据数据中心算力的30%以上,部分场景下甚至可能更多。
+
+DPU的出现就是为了将这部分算力资源从主机CPU上解放出来,通过将管理面、网络、存储、安全等能力卸载到专有的处理器芯片(DPU)上进行处理加速,达成降本增效的结果。目前主流云厂商如AWS、阿里云、华为云都通过自研芯片完成管理面及相关数据面的卸载,达成数据中心计算资源100%售卖给客户。
+
+管理面进程卸载到DPU可以通过对组件源码进行拆分达成,将源码根据功能逻辑拆分成独立运行的两部分,分别运行在主机和DPU,达成组件卸载的目的。但是这种做法有以下问题:一是影响组件的软件兼容性,组件后续版本升级和维护需要自己维护相关patch,带来一定的维护工作量;二是卸载工作无法被其他组件继承,后续组件卸载后仍需要进行代码逻辑分析和拆分等工作。为解决上述问题,本方案提出DPU的无感卸载,通过OS提供的抽象层,屏蔽应用在主机和DPU间跨主机访问的差异,让业务进程近似0改动达成卸载到DPU运行的目标,且这部分工作属于操作系统通用层,与上层业务无关,其他业务进行DPU卸载时也可以继承。
+
+## 架构介绍
+
+### 容器管理面DPU无感卸载架构
+
+**图1**容器管理面DPU无感卸载架构
+
+
+
+如图1所示,容器管理面卸载后,dockerd、kubelet等管理进程运行在DPU侧,容器进程本身运行在HOST,进程之间的交互关系由系统层提供对应的能力来保证:
+
+* 通信层:DPU和主机之间可能通过PCIe或网络进行通信,需要基于底层物理连接提供通信接口层,为上层业务提供通信接口。
+
+* 内核共享文件系统qtfs:容器管理面组件kubelet、dockerd与容器进程之间的主要交互通过文件系统进行;管理面工具需要为容器进程准备rootfs、volume等数据面路径;还需要在运行时通过proc文件系统、cgroup文件系统等控制和监控容器进程的资源及状态。共享文件系统的详细介绍参考[共享文件系统介绍](qtfs-architecture-and-usage.md)
+
+* 用户态卸载环境:用户态需要使用qtfs为容器管理面准备卸载后的运行时环境,将主机的容器管理及运行时相关目录远程挂载到DPU;另外由于需要挂载proc、sys、cgroup等系统管理文件系统,为防止对DPU原生系统功能的破坏,上述挂载动作都在chroot环境内完成。另外管理面(运行于DPU)和容器进程(运行于主机)之间仍存在调用关系,需要通过远程二进制执行工具(rexec)提供对应功能。
+
+容器管理面无感卸载的操作步骤可参考[部署指导文档](./offload-deployment-guide.md)
+
+> **说明**:
+>
+> 上述操作指导涉及对容器管理面组件的少量改动和rexec工具修改,这些修改基于指定版本,其他版本可基于实际执行环境做适配修改。文档中提供的patch仅供验证指导使用,不具备实际商用的条件。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/libvirt-direct-connection-aggregation-environment-establishment.md b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/libvirt-direct-connection-aggregation-environment-establishment.md
new file mode 100644
index 0000000000000000000000000000000000000000..cade9bd0849591d2ae972cb53f403634c17f643e
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/libvirt-direct-connection-aggregation-environment-establishment.md
@@ -0,0 +1,425 @@
+# **1** 硬件准备
+
+## 测试模式
+
+需准备2台物理机(虚拟机当前未试过),网络互通。
+
+其中一台作为DPU模拟,另一台作为HOST模拟。在本文档中用DPU和HOST指代这两台服务器。
+
+>  **说明:**
+> 测试模式因为会暴露网络端口且不做连接认证,存在网络安全风险,仅能用于内部测试验证,不要用于实际生产环境。
+
+## vsock模式
+
+需要DPU加HOST,且DPU能支持通过virtio提供vsock通信方式。
+
+目前还未基于真实的支持DPU vsock的环境调试过,本文档当前仅描述基于测试模式的方法,下面的内容依然默认使用测试模式。
+
+# **2** libvirt卸载架构图
+
+
+
+# **3** 环境搭建
+
+## **3.1** QTFS文件系统部署
+
+可参考qtfs主页:
+
+QTFS建联需要关闭防火墙。
+
+## **3.2** UDSPROXYD服务部署
+
+### 3.2.1 简介
+
+udsproxyd是一个跨主机的unix domain socket代理服务,需要分别部署在host和dpu上,在host和dpu上的udsproxyd组件是对等的关系,可以实现分布在host与dpu上的2个进程之间的uds通信,通信进程是无感的,也就是说如果这两个进程在同一主机内通过uds正常通信的功能,拉远到host和dpu之间也可以,不需要做代码适配,只需要作为client的一端加一个环境变量`LD_PRELOAD=libudsproxy.so`。udsproxyd作为一个跨主机的unix socket服务,本身可以用LD_PRELOAD=libudsproxy.so的方式对接使用,在qtfs的支持下也可以无感应用,这需要提前做好白名单相关配置,具体有两种方式,将在后面详述。
+
+### 3.2.2 部署方式
+
+首先,在dpu-utilities工程内编译udsproxyd:
+
+```bash
+
+cd qtfs/ipc
+
+make -j UDS_TEST_MODE=1 && make install
+
+```
+
+当前最新版本下,qtfs server侧的engine服务已经整合了udsproxyd的能力,所以server侧若部署了qtfs后不需要再额外启动udsproxyd。client侧则单独拉起udsproxyd服务:
+
+```bash
+
+nohup /usr/bin/udsproxyd 2>&1 &
+
+```
+
+参数解释:
+
+```bash
+
+thread num: 线程数量,目前只支持单线程,填1.
+
+addr: 本机使用的ip
+
+port:本机占用的port
+
+peer addr: udsproxyd对端的ip
+
+peer port: 对端port
+
+```
+
+示例:
+
+```bash
+
+nohup /usr/bin/udsproxyd 1 192.168.10.10 12121 192.168.10.11 12121 2>&1 &
+
+```
+
+如果未拉起qtfs的engine服务,想单独测试udsproxyd,则在server端也对等拉起udsproxyd即可:
+
+```bash
+
+nohup /usr/bin/udsproxyd 1 192.168.10.11 12121 192.168.10.10 12121 2>&1 &
+
+```
+
+### 3.2.3 应用方式
+
+#### 3.2.3.1 独立使用udsproxyd服务
+
+需要在使用uds服务的unix socket应用程序的client端进程启动时添加LD_PRELOAD=libudsproxy.so环境变量,以接管glibc的connect api进行uds对接,在libvirt卸载场景中可以将libudsproxy.so拷贝到libvirt的chroot目录下的/usr/lib64中以提供给libvirtd服务使用,这一步在后面介绍。
+
+#### 3.2.3.2 无感使用udsproxyd服务
+
+首先为qtfs配置uds服务的白名单,这里说的白名单是unix socket的server端bind的sock文件地址,例如libvirt的虚拟机建立的unix socket的服务端文件地址都在/var/lib/libvirt下,则我们需要增加一条白名单路径为/var/lib/libvirt/,提供两种方式供选择:
+
+a) 通过配置工具qtcfg加载,进入qtfs/qtinfo目录编译工具:
+
+在qtfs的client端执行
+
+```bash
+
+make role=client
+make install
+
+```
+
+在qtfs的server端执行
+
+```bash
+
+make role=server
+make install
+
+```
+
+配置工具将会自动安装,然后使用qtcfg命令配置白名单,假设需要增加的白名单为"/var/lib/libvirt/",输入:
+
+```bash
+
+qtcfg -x /var/lib/libvirt/
+
+```
+
+查询白名单为:
+
+```bash
+
+qtcfg -z
+
+```
+
+删除白名单为:
+
+```bash
+
+qtcfg -y 0
+
+```
+
+删除白名单时,参数为查询白名单时列出来的index序号。
+
+b) 通过配置文件增加,这需要在qtfs或qtfs_server内核模块加载前配置,通过内核模块初始化时读取该文件进行白名单配置。
+
+>  **说明:**
+> 白名单是为了防止不相干的unix socket链接也进行远程连接产生错误,或者浪费不必要的资源,所以白名单尽量设置得精确一些,比如本文中针对libvirt场景设置为/var/lib/libvirt/比较好,而直接将/var/lib/或/var/或直接将根目录加入的做法是有较大风险的。
+
+## **3.3** REXEC服务部署
+
+### 3.3.1 简介
+
+rexec是一个用c语言开发的远程执行组件,分为rexec client和rexec server。server端为一个常驻服务进程,client端为一个二进制文件,client端被执行后会基于udsproxyd服务与server端建立uds连接,并由server常驻进程在server端拉起指定程序。在libvirt虚拟化卸载中,libvirtd卸载到DPU上,当它需要在HOST拉起虚拟机qemu进程时调起rexec client进行远程拉起。
+
+### 3.3.2 部署方法
+
+#### 3.3.2.1 配置环境变量与白名单
+
+在host侧配置rexec server的白名单,将文件whitelist放置在/etc/rexec/目录下并修改权限为只读:
+
+```bash
+
+chmod 400 /etc/rexec/whitelist
+
+```
+
+如果想仅用于测试,可以不进行白名单配置,删除此文件重启rexec_server进程后则没有白名单限制。
+
+下载dpu-utilities代码后,进入qtfs/rexec主目录下,执行:`make && make install`即可安装rexec所需全部二进制到/usr/bin目录下,包括了:`rexec、rexec_server`两个二进制可执行文件。
+
+在server端启动rexec_server服务之前,检查是否存在/var/run/rexec目录,没有则创建:
+
+```bash
+
+mkdir /var/run/rexec
+
+```
+
+#### 3.3.2.2 服务方式
+
+server端可以通过两种方式拉起rexec_server服务。
+
+- 方式1:
+
+配置systemd服务
+
+在/usr/lib/systemd/system/下增加rexec.service文件,内容如下:
+
+[rexec.service](./config/rexec.service)
+
+然后通过systemctl管理rexec服务。
+
+首次配置服务时:
+
+```bash
+
+systemctl daemon-reload
+
+systemctl enable --now rexec
+
+```
+
+后续重启新启动服务:
+
+```bash
+
+systemctl stop rexec
+
+systemctl start rexec
+
+```
+
+- 方式2:
+
+手动后台拉起
+
+```bash
+
+nohup /usr/bin/rexec_server 2>&1 &
+
+```
+
+## **3.4** libvirt服务部署
+
+### 3.4.1 HOST侧部署
+
+HOST无需额外部署,只需要安装虚拟机启动环境以及libvirt即可(安装libvirt主要是为了创建对应的目录):
+
+```bash
+
+yum install -y qemu libvirt edk2-aarch64 #(arm环境虚拟机启动需要)
+
+```
+
+HOST需要放置虚拟机镜像,后面通过qtfs挂载到client端共享给libvirt。
+
+### 3.4.2 DPU侧部署
+
+#### 3.4.2.1 创建chroot环境
+
+a) 从openEuler官网下载qcow镜像,例如23.09版本
+
+b) 将qcow2挂载出来:
+
+```bash
+
+cd /root/
+
+mkdir p2 new_root_origin new_root
+
+modprobe nbd maxport=8
+
+qemu-nbd -c /dev/nbd0 xxx.qcow2
+
+mount /dev/nbd0p2 /root/p2
+
+cp -rf /root/p2/* /root/new_root_origin/
+
+umount /root/p2
+
+qemu-nbd -d /dev/nbd0
+
+```
+
+c) 此时new_root_origin有解压出来的镜像根目录,再将new_root绑定挂载到该目录上,作为chroot的根目录挂载点:
+
+```bash
+
+mount --bind /root/new_root_origin /root/new_root
+
+```
+
+#### 3.4.2.2 安装libvirt
+
+此处介绍patch方式源码编译,如果计算提供rpm包则参考计算提供的安装方法。
+
+a) 进入chroot环境,安装编译环境和常用工具:
+
+```bash
+
+yum groupinstall "Development tools" -y
+yum install -y vim meson qemu qemu-img strace edk2-aarch64 tar
+
+```
+
+其中edk2-aarch64是arm环境下虚拟机启动需要的。
+
+b) 安装libvirt编译需要的依赖包:
+
+```bash
+
+yum install -y rpcgen python3-docutils glib2-devel gnutls-devel libxml2-devel libpciaccess-devel libtirpc-devel yajl-devel systemd-devel dmidecode glusterfs-api numactl
+
+```
+
+c) 下载libvirt-x.x.x。源码包:
+
+d) 获取直连聚合libvirt patch:
+
+
+
+e) 将源码包解压到chroot环境下的目录,如/home。将patch打上。
+
+f) 进入libvirt-x.x.x目录。
+
+```bash
+
+meson build --prefix=/usr -Ddriver_remote=enabled -Ddriver_network=enabled -Ddriver_qemu=enabled -Dtests=disabled -Ddocs=enabled -Ddriver_libxl=disabled -Ddriver_esx=disabled -Dsecdriver_selinux=disabled -Dselinux=disabled
+
+```
+
+g) 安装成功
+
+```bash
+
+ninja -C build install
+
+```
+
+#### 3.4.2.3 启动libvirtd服务
+
+libvirt直连聚合卸载模式,需要从chroot内启动libvirtd服务,首先需要把chroot之外的libvirtd服务停掉。
+
+a) 放置虚拟机跳板脚本在chroot环境下的/usr/bin和/usr/libexec下:[qemu-kvm](./scripts/qemu-kvm)。替换原同名二进制,这个跳板脚本就是用于调用rexec拉起远端虚拟机。
+
+>  **说明:**
+> virsh使用的xml中,\下面的\需要填qemu-kvm,如果是填的其他,则需要修改为qemu-kvm,或者将跳板脚本替换\指代的二进制,且跳板脚本内容需要对应地更改。
+
+b) 将udsproxyd编译时附带产生的libudsproxy.so拷贝到本chroot目录下/usr/lib64下,如果配置qtfs的uds白名单方式使用udsproxyd服务,则不需要。
+
+c) 将前面rexec编译产生的rexec二进制放置到本chroot的/usr/bin/目录下。
+
+d) 配置chroot的挂载环境,需要挂载一些目录,使用如下配置脚本:
+
+- [virt_start.sh](./scripts/virt_start.sh)为配置脚本,virt_start.sh脚本中需要手动修改qtfs ko dir为编译的ko位置,host ip address为正确的host地址。
+
+- [virt_umount.sh](./scripts/virt_umount.sh)为消除配置脚本。
+
+e) 脚本中挂载目录位置都是按照本文档前文创建目录位置与名称为准,如果有修改需要同步适配修改脚本。
+
+f) 配置好chroot环境后,进入chroot环境,手动拉起libvirtd。
+
+未配置qtfs使用udsproxyd白名单的拉起方式:
+
+```bash
+
+LD_PRELOAD=/usr/lib64/libudsproxy.so virtlogd -d
+LD_PRELOAD=/usr/lib64/libudsproxy.so libvirtd -d
+
+````
+
+如果已配置qtfs使用udsproxyd白名单,则不需要增加LD_PRELOAD前缀:
+
+```bash
+
+virtlogd -d
+libvirtd -d
+
+```
+
+查看是否已配置白名单的方式,在chroot之外的窗口,执行:
+
+```bash
+
+qtcfg -z
+
+```
+
+查看列举出来的白名单是否包含/var/lib/libvirt/。
+
+## **3.5** 拉起虚拟机
+
+服务部署完成后,即可以在DPU侧进行虚拟机的生命周期管理。
+
+### 3.5.1 虚拟机define
+
+a) 将虚拟机启动镜像放置在HOST侧某目录,例如:
+
+```bash
+
+/home/VMs/Domain_name
+
+```
+
+b) 使用qtfs将这个目录挂载到DPU侧:
+
+```bash
+
+mount -t qtfs /home/VMs /home/VMs
+
+```
+
+c) xml中使用`/home/VMs/Domain_name`作为启动镜像,这样在DPU和HOST侧看到的都是同一个镜像文件(Domain_name是虚拟机domain的名字)。
+
+d) 检查xml中\是否指向了跳板脚本。
+
+e) 执行以下命令。
+
+```bash
+
+virsh define xxx.xml
+
+```
+
+### 3.5.2 虚拟机start
+
+```bash
+
+virsh start domain
+
+```
+
+# **4** 环境重置
+
+由于libvirt在DPU和HOST之间共享了部分目录,卸载环境时需要先将这部分目录全部umount。一般先停掉libvirtd和virtlogd进程,调用virt_umount脚本即可。如果HOST还有虚拟机运行,也需要先杀掉才能umount。
+
+# **5** 部分问题定位思路
+
+1、 libvirt编译失败:检查依赖包安装是否完全,如果chroot挂载了外部目录或者host目录,也可能导致编译失败,需先解除挂载。
+
+2、 QTFS挂载失败:可能server端engine进程没拉起、防火墙没关导致qtfs建联失败。
+
+3、 虚拟机define失败:检查xml里的项目仿真器是否指向跳板脚本、虚拟机镜像是否已经通过qtfs挂载到DPU上可见,且路径与HOST一致。
+
+4、 虚拟机启动失败:libvirtd和virtlogd服务是否拉起、rexec服务是否拉起、跳板进程是否拉起、是否qemu-kvm拉起时报错。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/offload-deployment-guide.md b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/offload-deployment-guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..8363931a67044640282a26bf88b7136d424828ea
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/offload-deployment-guide.md
@@ -0,0 +1,167 @@
+# 容器管理面无感卸载部署指导
+
+> **说明**:
+>
+> 本指导涉及对容器管理面组件的少量改动和rexec工具修改,这些修改基于指定版本,其他版本可基于实际执行环境做适配修改。文档中提供的patch仅供验证指导使用,不具备实际商用的条件。
+> **说明**:
+>
+> 当前共享文件系统之间通信通过网络完成,可通过网络互连的两台物理机器或VM模拟验证。
+>
+> 建议用户验证前先搭建可正常使用的kubernetes集群和容器运行环境,针对其中单个节点的管理面进程进行卸载验证,卸载环境(DPU)可选择一台具备网络连接的物理机或VM。
+
+## 简介
+
+容器管理面,即kubernetes、dockerd、containerd、isulad等容器的管理工具,而容器管理面卸载,即是将容器管理面卸载到与容器所在机器(以下称为HOST)之外的另一台机器(当前场景下是指DPU,一个具备独立运行环境的硬件集合)上运行。
+
+我们使用共享文件系统qtfs将HOST上与容器运行相关的目录挂载到DPU上,使得容器管理面工具(运行在DPU)可以访问到这些目录,并为容器(运行在HOST)准备运行所需要的环境,此处,因为需要挂载远端的proc和sys等特殊文件系统,所以,我们创建了一个专门的rootfs以作为kubernetes、dockerd的运行环境(以下称为`/another_rootfs`)。
+
+并且通过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的改动基于18.09版本。
+
+在containerd中,暂时注释掉了通过hook调用libnetwork-setkey的部分,此处不影响容器的拉起。并且,为了docker load的正常使用,注释掉了在mounter_linux.go 中mount函数中一处错误的返回。
+
+最后,因为在容器管理面的运行环境中,将`/proc`挂在了服务端的proc文件系统,而本地的proc文件系统则挂载在了`/local_proc`,所以,dockerd以及containerd中的对`/proc/self/xxx`或者`/proc/getpid()/xxx`或者相关的文件系统访问的部分,我们统统将`/proc`改为了`/local_proc`。
+
+### containerd相关改动介绍
+
+对于containerd的改动基于containerd-1.2-rc.1版本。
+
+在获取mountinfo时,因为`/proc/self/mountinfo`只能获取到dockerd本身在本地的mountinfo,而无法获取到服务端的mountinfo,所以,将其改为了`/proc/1/mountinfo`,使其通过获取服务端1号进程mountinfo的方式得到服务端的mountinfo。
+
+在contaienrd-shim中,将与containerd通信的unix socket改为了用tcp通信,containerd通过`SHIM_HOST`环境变量获取containerd-shim所运行环境的ip,即服务端ip。用shim的哈希值计算出一个端口号,并以此作为通信的端口,来拉起containerd-shim.
+
+并且,将原来的通过系统调用给contaienr-shim发信号的方式,改为了通过远程调用kill指令的方式向shim发信号,确保了docker杀死容器的行为可以正确的执行。
+
+### kubernetes相关改动介绍
+
+kubelet暂不需要功能性改动,可能会遇到容器QoS管理器首次设置失败的错误,该错误不影响后续Pods拉起流程,暂时忽略该报错。
+
+## 容器管理面卸载操作指南
+
+在服务器端和客户端,都要拉起rexec_server。服务器端拉起rexec_server,主要是用于客户端创建容器时用rexec拉起containerd-shim,而客户端拉起rexec_server,则是为了执行containerd-shim对dockerd和containerd的调用。
+
+### 服务器端
+
+创建容器管理面所需要的文件夹,然后插入qtfs_server.ko,并拉起engine进程。
+
+此外在服务器端,还需要创建rexec脚本/usr/bin/dockerd.
+
+``` shell
+#!/bin/bash
+CMD_NET_ADDR=tcp://<客户端ip>: rexec /usr/bin/dockerd $*
+```
+
+### 客户端
+
+需要准备一个rootfs,作为dockerd与containerd的运行环境,通过如下的脚本,将dockerd、containerd所需要的服务端目录挂载到客户端。并且,需要确保在以下脚本中被挂载的远程目录在服务端和客户端都存在。
+
+``` shell
+#!/bin/bash
+mkdir -p /another_rootfs/var/run/docker/containerd
+iptables -t nat -N DOCKER
+echo "---------insmod qtfs ko----------"
+insmod /YOUR/QTFS/PATH/qtfs.ko qtfs_server_ip=<服务端ip> qtfs_log_level=INFO
+
+# chroot环境内的proc使用DPU的proc共享文件系统替换,需要将本机真实proc文件系统挂载到local_proc下使用
+mount -t proc proc /another_rootfs/local_proc/
+
+# 将chroot内环境与外部环境bind,方便进行配置和运行
+mount --bind /var/run/ /another_rootfs/var/run/
+mount --bind /var/lib/ /another_rootfs/var/lib/
+mount --bind /etc /another_rootfs/etc
+
+mkdir -p /another_rootfs/var/lib/isulad
+
+# 在chroot环境内创建并挂载dev、sys和cgroup文件系统
+mount -t devtmpfs devtmpfs /another_rootfs/dev/
+mount -t sysfs sysfs /another_rootfs/sys
+mkdir -p /another_rootfs/sys/fs/cgroup
+mount -t tmpfs tmpfs /another_rootfs/sys/fs/cgroup
+list="perf_event freezer files net_cls,net_prio hugetlb pids rdma cpu,cpuacct memory devices blkio cpuset"
+for i in $list
+do
+ echo $i
+ mkdir -p /another_rootfs/sys/fs/cgroup/$i
+ mount -t cgroup cgroup -o rw,nosuid,nodev,noexec,relatime,$i /another_rootfs/sys/fs/cgroup/$i
+done
+
+## common system dir
+mount -t qtfs -o proc /proc /another_rootfs/proc
+echo "proc"
+mount -t qtfs /sys /another_rootfs/sys
+echo "cgroup"
+
+# 挂载容器管理面所需要的共享目录
+mount -t qtfs /var/lib/docker/containers /another_rootfs/var/lib/docker/containers
+mount -t qtfs /var/lib/docker/containerd /another_rootfs/var/lib/docker/containerd
+mount -t qtfs /var/lib/docker/overlay2 /another_rootfs/var/lib/docker/overlay2
+mount -t qtfs /var/lib/docker/image /another_rootfs/var/lib/docker/image
+mount -t qtfs /var/lib/docker/tmp /another_rootfs/var/lib/docker/tmp
+mkdir -p /another_rootfs/run/containerd/io.containerd.runtime.v1.linux/
+mount -t qtfs /run/containerd/io.containerd.runtime.v1.linux/ /another_rootfs/run/containerd/io.containerd.runtime.v1.linux/
+mkdir -p /another_rootfs/var/run/docker/containerd
+mount -t qtfs /var/run/docker/containerd /another_rootfs/var/run/docker/containerd
+mount -t qtfs /var/lib/kubelet/pods /another_rootfs/var/lib/kubelet/pods
+```
+
+在/another_rootfs中,需要创建以下脚本,用来支持部分跨主机操作。
+
+* /another_rootfs/usr/local/bin/containerd-shim
+
+``` shell
+#!/bin/bash
+CMD_NET_ADDR=tcp://<服务端ip>: /usr/bin/rexec /usr/bin/containerd-shim $*
+```
+
+* /another_rootfs/usr/local/bin/remote_kill
+
+``` shell
+#!/bin/bash
+CMD_NET_ADDR=tcp://<服务端ip>: /usr/bin/rexec /usr/bin/kill $*
+```
+
+* /another_rootfs/usr/sbin/modprobe
+
+``` shell
+#!/bin/bash
+CMD_NET_ADDR=tcp://<服务端ip>: /usr/bin/rexec /usr/sbin/modprobe $*
+```
+
+在chroot到dockerd和containerd运行所需的rootfs后,用如下的命令拉起dockerd和containerd
+
+* containerd
+
+``` shell
+#!/bin/bash
+SHIM_HOST=<服务端ip> containerd --config /var/run/docker/containerd/containerd.toml --address /var/run/containerd/containerd.sock
+```
+
+* dockerd
+
+``` shell
+#!/bin/bash
+SHIM_HOST=<服务端ip> CMD_NET_ADDR=tcp://<服务端ip>: /usr/bin/dockerd --containerd /var/run/containerd/containerd.sock
+```
+
+* kubelet
+
+在chroot环境内使用原参数拉起kubelet即可。
+
+因为我们已经将/var/run/和/another_rootfs/var/run/绑定在了一起,所以可以在正常的rootfs下,通过docker来访问docker.sock接口进行容器管理。
+
+至此,完成容器管理面卸载到DPU,可以通过docker相关操作进行容器创建、删除等操作,也可以通过kubectl在当前节点进行pods调度和销毁,且实际容器业务进程运行在HOST侧。
+
+> **说明**:
+>
+> 本指导所述操作只涉及容器管理面进程卸载,不包含容器网络和数据卷volume等卸载,如有相关需求,需要通过额外的网络或存储卸载能力支持。本指导支持不带网络和存储的容器跨节点拉起。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/overview.md b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/overview.md
new file mode 100644
index 0000000000000000000000000000000000000000..4f4ee65a44030b0e956c71b4500e53cf8a095847
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/overview.md
@@ -0,0 +1,11 @@
+# 容器管理面DPU无感卸载指南
+
+本文档介绍基于openEuler操作系统的容器管理面DPU无感卸载功能特性及安装部署方法,该特性可以通过操作系统提供的统一抽象层,屏蔽容器管理面跨主机资源访问的差异,实现容器管理面业务无感卸载到DPU上。
+
+本文档适用于使用openEuler系统并希望了解和使用操作系统内核及容器的社区开发者、开源爱好者以及相关合作伙伴。使用人员需要具备以下经验和技能:
+
+- 熟悉Linux基本操作
+
+- 熟悉linux内核文件系统相关基础机制
+
+- 对kubernetes和docker有一定了解,熟悉docker及kubernetes部署及使用。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/public_sys-resources/icon-note.gif b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/public_sys-resources/icon-note.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6314297e45c1de184204098efd4814d6dc8b1cda
Binary files /dev/null and b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/public_sys-resources/icon-note.gif differ
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/qtfs-architecture-and-usage.md b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/qtfs-architecture-and-usage.md
new file mode 100644
index 0000000000000000000000000000000000000000..fc24e9ce06588570651ca3f131e73aea34f61922
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/qtfs-architecture-and-usage.md
@@ -0,0 +1,67 @@
+# qtfs
+
+## 介绍
+
+qtfs是一个共享文件系统项目,可部署在host-dpu的硬件架构上,也可以部署在2台服务器之间。以客户端服务器的模式工作,使客户端能通过qtfs访问服务端的指定文件系统,得到本地文件访问一致的体验。
+
+qtfs的特性:
+
++ 支持挂载点传播;
+
++ 支持proc、sys、cgroup等特殊文件系统的共享;
+
++ 支持远程文件读写的共享;
+
++ 支持在客户端对服务端的文件系统进行远程挂载;
+
++ 支持特殊文件的定制化处理;
+
++ 支持远端fifo、unix-socket等,并且支持epoll,使客户端和服务端像本地通信一样使用这些文件;
+
++ 支持基于host-dpu架构通过PCIe协议底层通信,性能大大优于网络;
+
++ 支持内核模块形式开发,无需对内核进行侵入式修改。
+
+## 软件架构
+
+软件大体框架图:
+
+
+
+## 安装教程
+
+目录说明:
+
++ **qtfs**: 客户端内核模块相关代码,直接在该目录下编译客户端ko。
+
++ **qtfs_server**: 服务端内核模块相关代码,直接在该目录下编译服务端ko和相关程序。
+
++ **qtinfo**: 诊断工具,支持查询文件系统的工作状态以及修改log级别等。
+
++ **demo**、**test**、**doc**: 测试程序、演示程序以及项目资料等。
+
++ 根目录: 客户端与服务端通用的公共模块代码。
+
+首先找两台服务器(或虚拟机)配置内核编译环境:
+
+1. 要求内核版本在5.10或更高版本。
+2. 安装内核开发包:yum install kernel-devel。
+
+服务端安装:
+
+1. cd qtfs_server
+2. make clean && make
+3. insmod qtfs_server.ko qtfs_server_ip=x.x.x.x qtfs_server_port=12345 qtfs_log_level=WARN
+4. ./engine 4096 16
+
+客户端安装:
+
+1. cd qtfs
+2. make clean && make
+3. insmod qtfs.ko qtfs_server_ip=x.x.x.x qtfs_server_port=12345 qtfs_log_level=WARN
+
+## 使用说明
+
+安装完成后,客户端通过挂载把服务端的文件系统让客户端可见,例如:`mount -t qtfs / /root/mnt/`
+
+客户端进入"/root/mnt"后便可查看到server端的所有文件,以及对其进行相关操作。
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/qemu-kvm b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/qemu-kvm
new file mode 100644
index 0000000000000000000000000000000000000000..e869371be109b57f59709fc23bc5b1cb2002cfbf
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/qemu-kvm
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+exec /usr/bin/rexec /usr/bin/qemu-kvm $*
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/virt_start.sh b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/virt_start.sh
new file mode 100644
index 0000000000000000000000000000000000000000..06ca194b7a639a947b6e395f116beeba7c897459
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/virt_start.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+insmod ./qtfs.ko qtfs_server_ip=192.168.10.11 qtfs_log_level=NONE
+
+systemctl stop libvirtd
+
+if [ ! -d "/root/new_root/local_proc" ]; then
+ mkdir -p /root/new_root/local_proc
+fi
+if [ ! -d "/root/new_root/local" ]; then
+ mkdir -p /root/new_root/local
+fi
+mount -t proc proc /root/new_root/local_proc/
+mount -t proc proc /root/new_root/local/proc
+mount -t sysfs sysfs /root/new_root/local/sys
+mount --bind /var/run/ /root/new_root/var/run/
+mount --bind /var/lib/ /root/new_root/var/lib/
+mount --bind /var/cache/ /root/new_root/var/cache
+mount --bind /etc /root/new_root/etc
+
+mkdir -p /root/new_root/home/VMs/
+mount -t qtfs /home/VMs/ /root/new_root/home/VMs/
+
+mount -t qtfs /var/lib/libvirt /root/new_root/var/lib/libvirt
+
+mount -t devtmpfs devtmpfs /root/new_root/dev/
+mount -t hugetlbfs hugetlbfs /root/new_root/dev/hugepages/
+mount -t mqueue mqueue /root/new_root/dev/mqueue/
+mount -t tmpfs tmpfs /root/new_root/dev/shm
+
+mount -t sysfs sysfs /root/new_root/sys
+mkdir -p /root/new_root/sys/fs/cgroup
+mount -t tmpfs tmpfs /root/new_root/sys/fs/cgroup
+list="perf_event freezer files net_cls,net_prio hugetlb pids rdma cpu,cpuacct memory devices blkio cpuset"
+for i in $list
+do
+ echo $i
+ mkdir -p /root/new_root/sys/fs/cgroup/$i
+ mount -t cgroup cgroup -o rw,nosuid,nodev,noexec,relatime,$i /root/new_root/sys/fs/cgroup/$i
+done
+
+## common system dir
+mount -t qtfs -o proc /proc /root/new_root/proc
+echo "proc"
+
+mount -t qtfs /sys /root/new_root/sys
+echo "cgroup"
+mount -t qtfs /dev/pts /root/new_root/dev/pts
+mount -t qtfs /dev/vfio /root/new_root/dev/vfio
diff --git a/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/virt_umount.sh b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/virt_umount.sh
new file mode 100644
index 0000000000000000000000000000000000000000..4adddec913c23069c6bffddec0bf1770f8c5ce71
--- /dev/null
+++ b/docs/en/25.03/Server/DiversifiedComputing/DPUOffload/scripts/virt_umount.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+umount /root/new_root/dev/hugepages
+umount /root/new_root/etc
+umount /root/new_root/home/VMs
+umount /root/new_root/local_proc
+umount /root/new_root/local/proc
+umount /root/new_root/var/lib/libvirt
+umount /root/new_root/var/lib
+umount /root/new_root/*
+umount /root/new_root/dev/pts
+umount /root/new_root/dev/mqueue
+umount /root/new_root/dev/shm
+umount /root/new_root/dev/vfio
+umount /root/new_root/dev
+rmmod qtfs
+
+umount /root/new_root/sys/fs/cgroup/*
+umount /root/new_root/sys/fs/cgroup
+umount /root/new_root/sys
diff --git a/docs/en/25.03/Server/HighAvailability/HA/HA_use_cases.md b/docs/en/25.03/Server/HighAvailability/HA/HA_use_cases.md
new file mode 100644
index 0000000000000000000000000000000000000000..727ec4b40b4515597e437c9c209f73b48841d699
--- /dev/null
+++ b/docs/en/25.03/Server/HighAvailability/HA/HA_use_cases.md
@@ -0,0 +1,248 @@
+# HA使用实例
+
+本章介绍如何快速使用HA高可用集群,以及添加一个实例。若不了解怎么安装,请参考[HA的安装与部署文档](./HAuserguide.md)。
+
+## 快速使用指南
+
+以下操作均以社区新开发的管理平台为例。
+
+### 登录页面
+
+用户名为`hacluster`,密码为该用户在主机上设置的密码。
+
+
+
+### 主页面
+
+登录系统后显示主页面,主页面由四部分组成:侧边导航栏、顶部操作区、资源节点列表区以及节点操作浮动区。
+
+以下将详细介绍这四部分的特点与使用方法。
+
+
+
+#### 导航栏
+
+侧边导航栏由两部分组成:高可用集群软件名称和 logo 以及系统导航。系统导航由三项组成:【系统】、【集群配置】和【工具】。【系统】是默认选项,也是主页面的对应项,主要展示系统中所有资源的相关信息以及操作入口;【集群配置】下设【首选项配置】和【心跳配置】两项;【工具】下设【日志下载】和【集群快捷操作】两项,点击后以弹出框的形式出现。
+
+#### 顶部操作区
+
+登录用户是静态显示,鼠标滑过用户图标,出现操作菜单项,包括【刷新设置】和【退出登录】两项,点击【刷新设置】,弹出【刷新设置】对话框,包含【刷新设置】选项,可以设置系统的自动刷新模式,包括【不自动刷新】、【每 5 秒刷新】和【每 10 秒刷新】三种选择,默认选择【不自动刷新】、【退出登录】即可注销本次登录,系统将自动跳到登录页面,此时,如果希望继续访问系统,则需要重新进行登录。
+
+
+
+#### 资源节点列表区
+
+资源节点列表集中展现系统中所有资源的【资源名】、【状态】、【资源类型】、【服务】、【运行节点】等资源信息,以及系统中所有的节点和节点的运行情况等节点信息。同时提供资源的【添加】、【编辑】、【启动】、【停止】、【清理】、【迁移】、【回迁】、【删除】和【关系】操作。
+
+#### 节点操作浮动区
+
+节点操作浮动区域默认是收起的状态,每当点击资源节点列表表头中的节点时,右侧会弹出节点操作扩展区域,如图所示,该区域由收起按钮、节点名称、停止和备用四个部分组成,提供节点的【停止】和【备用】操作。点击区域左上角的箭头,该区域收起。
+
+### 首选项配置
+
+以下操作均可用命令行配置,现只做简单示例,若想使用更多命令可以使用``pcs --help``进行查询。
+
+- 命令行方式
+
+ ```sh
+ # pcs property set stonith-enabled=false
+ # pcs property set no-quorum-policy=ignore
+ ```
+
+ 执行如下命令,可以查看全部配置。
+
+ ```sh
+ # pcs property
+ ```
+
+ 
+
+- 图形界面方式
+ 点击侧边导航栏中的【首选项配置】按钮,弹出【首选项配置】对话框。将No Quorum Policy和Stonith Enabled由默认状态改为如下对应状态;修改完成后,点击【确定】按钮完成配置。
+
+ 
+
+### 添加资源
+
+#### 添加普通资源
+
+1. 点击【添加普通资源】,弹出【创建资源】对话框。
+ 其中资源的所有必填配置项均在【基本】页面内,选择【基本】页面内的【资源类型】后会进一步给出该类资源的其他必填配置项以及选填配置项。
+
+2. 填写资源配置信息。
+ 对话框右侧会出现灰色文字区域,对当前的配置项进行解释说明。全部必填项配置完毕后,点击【确定】按钮即可创建普通资源,点击【取消】按钮,取消本次添加动作。
+ 【实例属性】、【元属性】或者【操作属性】页面中的选填配置项为选填项,不配置不会影响资源的创建过程,可以根据场景需要可选择修改,否则将按照系统缺省值处理。
+
+下面以Apache为例,分别以命令行方式和图形界面方式介绍添加资源的方法。
+
+- 命令行方式
+
+ ```sh
+ # pcs resource create httpd ocf:heartbeat:apache
+ ```
+
+ 查看资源运行状态
+
+ ```sh
+ # pcs status
+ ```
+
+ 
+
+- 图形界面方式
+
+1. 填写资源名称和资源类型,如下图所示。
+
+ 
+
+2. 回显为如下,则资源添加成功并启动,运行于其中一个节点上,例如ha1。
+
+ 
+3. 访问apache界面成功。
+
+ 
+
+#### 添加组资源
+
+>**须知:**
+> 添加组资源时,集群中需要至少存在一个普通资源。
+
+1. 点击【添加组资源】,弹出【创建资源】对话框。
+ 【基本】页面内均为必填项,填写完毕后,点击【确定】按钮,即可完成资源的添加,点击【取消】按钮,取消本次添加动作。
+
+ 
+
+ > **注意:**
+ > 组资源的启动是按照子资源的顺序启动的,所以选择子资源时需要注意按照顺序选择。
+
+2. 回显如下,资源添加成功。
+
+ 
+
+#### 添加克隆资源
+
+1. 点击【添加克隆资源】,弹出【创建资源】对话框。
+ 【基本】页面内填写克隆对象,资源名称会自动生成,填写完毕后,点击【确定】按钮,即可完成资源的添加,点击【取消】按钮,取消本次添加动作。
+
+ 
+
+2. 回显如下,资源添加成功。
+
+ 
+
+### 编辑资源
+
+- 启动资源:资源节点列表中选中一个目标资源,要求:该资源处于非运行状态。对该资源执行启动动作。
+- 停止资源:资源节点列表中选中一个目标资源,要求:该资源处于运行状态。对该资源执行停止操作。
+- 清理资源:资源节点列表中选中一个目标资源,对该资源执行清理操作。
+- 迁移资源:资源节点列表中选中一个目标资源,要求:该资源为处于运行状态的普通资源或者组资源,执行迁移操作可以将资源迁移到指定节点上运行。
+- 回迁资源:资源节点列表中选中一个目标资源,要求:该资源已经完成迁移动作,执行回迁操作,可以清除该资源的迁移设置,资源重新迁回到原来的节点上运行。(点击按钮后,列表中该资源项的变化状态与启动资源时一致。)
+- 删除资源:资源节点列表中选中一个目标资源,对该资源执行删除操作。
+
+### 设置资源关系
+
+资源关系即为目标资源设定限制条件,资源的限制条件分为三种:资源位置、资源协同和资源顺序。
+
+- 资源位置:设置集群中的节点对于该资源的运行级别,由此确定启动或者切换时资源在哪个节点上运行,运行级别按照从高到低的顺序依次为:Master Node、Slave 1。
+- 资源协同:设置目标资源与集群中的其他资源是否运行在同一节点上,同节点资源表示该资源与目标资源必须运行在相同节点上,互斥节点资源表示该资源与目标资源不能运行在相同的节点上。
+- 资源顺序:设置目标资源与集群中的其他资源启动时的先后顺序,前置资源是指目标资源运行之前,该资源必须已经运行;后置资源是指目标资源运行之后,该资源才能运行。
+
+## 高可用mysql实例配置
+
+### 配置虚拟IP
+
+1. 在首页中点击“添加”,再选择添加普通资源,并按如下进行配置。
+
+ 
+
+2. 资源创建成功并启动,运行于其中一个节点上,例如ha1。
+3. 可以ping通并连接,登录后可正常执行各种操作;资源切换到ha2运行;能够正常访问。如下图所示。
+ 
+
+### 配置NFS存储
+
+另找一台机器作为nfs服务端进行配置,操作步骤如下:
+
+1. 安装软件包
+
+ ```sh
+ # yum install -y nfs-utils rpcbind
+ ```
+
+2. 关闭防火墙
+
+ ```sh
+ # systemctl stop firewalld && systemctl disable firewalld
+ ```
+
+3. 修改/etc/selinux/config文件中SELINUX状态为disabled
+
+ ```Conf
+ SELINUX=disabled
+ ```
+
+4. 启动服务
+
+ ```sh
+ # systemctl start rpcbind && systemctl enable rpcbind
+ # systemctl start nfs-server && systemctl enable nfs-server
+ ```
+
+5. 服务端创建一个共享目录
+
+ ```sh
+ # mkdir -p /test
+ ```
+
+6. 修改NFS配置文件
+
+ ```sh
+ # vim /etc/exports
+ # /test *(rw,no_root_squash)
+ ```
+
+7. 重新加载服务
+
+ ```sh
+ # systemctl reload nfs
+ ```
+
+8. 客户端安装软件包,需要先安装mysql,可以将nfs挂载到mysql数据路径。
+
+ ```sh
+ # yum install -y nfs-utils mariadb-server
+ ```
+
+9. 在首页中依次点击“添加”,“添加普通资源”,并按如下进行配置NFS资源。
+
+ 
+
+10. 资源创建成功并启动,运行于其中一个节点上,例如ha1;nfs成功挂载到`/var/lib/mysql`路径下。资源切换到ha2运行;nfs从ha1节点取消挂载,并自动在ha2节点上挂载成功。如下图所示。
+
+ 
+
+### 配置mysql
+
+1. 在首页中依次点击“添加”,“添加普通资源”,并按如下进行配置mysql资源。
+
+ 
+
+2. 若回显为如下,则资源添加成功。
+
+ 
+
+### 添加上述资源为组资源
+
+1. 按资源启动顺序添加三个资源
+
+ 在首页中依次点击“添加”,“添加组资源”,并按如下进行配置组资源。
+
+ 
+
+2. 组资源创建成功并启动,若回显与上述三个普通资源成功现象一致,则资源添加成功。
+
+ 
+
+3. 将ha1节点备用,成功迁移到ha2节点,运行正常。
+
+ 
diff --git a/docs/en/25.03/Server/HighAvailability/HA/HAuserguide.md b/docs/en/25.03/Server/HighAvailability/HA/HAuserguide.md
new file mode 100644
index 0000000000000000000000000000000000000000..7230f8bd53bae8cff17e3957b7e768a7e0f4c99e
--- /dev/null
+++ b/docs/en/25.03/Server/HighAvailability/HA/HAuserguide.md
@@ -0,0 +1,201 @@
+# HA的安装与部署
+
+本文介绍如何安装和部署HA高可用集群。
+
+## 安装与部署
+
+### 环境准备
+
+需要至少两台安装了openEuler 21.03 的物理机/虚拟机(现以两台为例),安装方法参考《[安装指南](../../InstallationUpgrade/Installation/installation.md)》。
+
+### 修改主机名称及/etc/hosts文件
+
+**注**:两台主机均需要进行以下操作,现以其中一台为例,下文中使用的IP仅供参考。**
+
+在使用HA软件之前,需要确认修改主机名并将所有主机名写入/etc/hosts文件中。
+
+1. 修改主机名
+
+ ```sh
+ # hostnamectl set-hostname ha1
+ ```
+
+2. 编辑`/etc/hosts`文件并写入以下字段
+
+ ```text
+ 172.30.30.65 ha1
+ 172.30.30.66 ha2
+ ```
+
+### 配置yum源
+
+成功安装系统后,会默认配置好yum源,文件位置存放在`/etc/yum.repos.d/openEuler.repo`文件中,HA软件包会用到以下源:
+
+```Conf
+[OS]
+name=OS
+baseurl=http://repo.openeuler.org/openEuler-23.09/OS/$basearch/
+enabled=1
+gpgcheck=1
+gpgkey=http://repo.openeuler.org/openEuler-23.09/OS/$basearch/RPM-GPG-KEY-openEuler
+
+[everything]
+name=everything
+baseurl=http://repo.openeuler.org/openEuler-23.09/everything/$basearch/
+enabled=1
+gpgcheck=1
+gpgkey=http://repo.openeuler.org/openEuler-23.09/everything/$basearch/RPM-GPG-KEY-openEuler
+
+[EPOL]
+name=EPOL
+baseurl=http://repo.openeuler.org/openEuler-23.09/EPOL/$basearch/
+enabled=1
+gpgcheck=1
+gpgkey=http://repo.openeuler.org/openEuler-23.09/OS/$basearch/RPM-GPG-KEY-openEuler
+```
+
+### 安装HA软件包组件
+
+```sh
+# yum install -y corosync pacemaker pcs fence-agents fence-virt corosync-qdevice sbd drbd drbd-utils
+```
+
+### 设置hacluster用户密码
+
+```sh
+# passwd hacluster
+```
+
+### 修改`/etc/corosync/corosync.conf`文件
+
+```Conf
+totem {
+ version: 2
+ cluster_name: hacluster
+ crypto_cipher: none
+ crypto_hash: none
+}
+logging {
+ fileline: off
+ to_stderr: yes
+ to_logfile: yes
+ logfile: /var/log/cluster/corosync.log
+ to_syslog: yes
+ debug: on
+ logger_subsys {
+ subsys: QUORUM
+ debug: on
+ }
+}
+quorum {
+ provider: corosync_votequorum
+ expected_votes: 2
+ two_node: 1
+ }
+nodelist {
+ node {
+ name: ha1
+ nodeid: 1
+ ring0_addr: 172.30.30.65
+ }
+ node {
+ name: ha2
+ nodeid: 2
+ ring0_addr: 172.30.30.66
+ }
+ }
+```
+
+### 管理服务
+
+#### 关闭防火墙
+
+1. 执行如下命令,关闭防火墙。
+
+ ```sh
+ # systemctl stop firewalld
+ ```
+
+2. 修改`/etc/selinux/config`文件中SELINUX状态为disabled。
+
+ ```sh
+ # SELINUX=disabled
+ ```
+
+#### 管理pcs服务
+
+1. 启动pcs服务:
+
+ ```sh
+ # systemctl start pcsd
+ ```
+
+2. 查询pcs服务状态:
+
+ ```sh
+ # systemctl status pcsd
+ ```
+
+ 若回显为如下,则服务启动成功。
+
+ 
+
+#### 管理pacemaker服务
+
+1. 启动pacemaker服务:
+
+ ```sh
+ # systemctl start pacemaker
+ ```
+
+2. 查询pacemaker服务状态:
+
+ ```sh
+ # systemctl status pacemaker
+ ```
+
+ 若回显为如下,则服务启动成功。
+
+ 
+
+#### 管理corosync服务
+
+1. 启动corosync服务:
+
+ ```sh
+ # systemctl start corosync
+ ```
+
+2. 查询corosync服务状态:
+
+ ```sh
+ # systemctl status corosync
+ ```
+
+ 若回显为如下,则服务启动成功。
+
+ 
+
+### 节点鉴权
+
+注:**任选一个节点上执行即可**
+
+```sh
+# pcs host auth ha1 ha2
+```
+
+### 访问前端管理平台
+
+上述服务启动成功后,打开浏览器(建议使用:Chrome,Firefox),在浏览器导航栏中输入`https://localhost:2224`即可。
+
+- 以下界面为原生管理平台
+
+
+
+若安装社区新开发的管理平台请参考文档[https://gitee.com/openeuler/ha-api/blob/master/docs/build.md](https://gitee.com/openeuler/ha-api/blob/master/docs/build.md)
+
+- 以下为社区新开发的管理平台
+
+
+
+想了解如何快速使用HA高可用集群,以及添加一个实例。请参考[HA的使用实例文档](./HA_use_cases.md)。
diff --git a/docs/en/25.03/Server/HighAvailability/HA/_menu.md b/docs/en/25.03/Server/HighAvailability/HA/_menu.md
new file mode 100644
index 0000000000000000000000000000000000000000..9746e29a0782142c2b0325a4dc86a1f34a911f66
--- /dev/null
+++ b/docs/en/25.03/Server/HighAvailability/HA/_menu.md
@@ -0,0 +1,10 @@
+---
+label: 'HA用户指南'
+ismanual: 'Y'
+description: '安装和使用 HA 高可用集群'
+children:
+ - label: 'HA 安装与部署'
+ href: './HAuserguide.md'
+ - label: 'HA 使用实例'
+ href: './HA_use_cases.md'
+---
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-add-resource.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-add-resource.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac24895a1247828d248132f6c789ad8ef51a57e4
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-add-resource.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-apache-show.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-apache-show.png
new file mode 100644
index 0000000000000000000000000000000000000000..c216500910f75f2de1108f6b618c5c08f4df8bae
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-apache-show.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-apache-suc.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-apache-suc.png
new file mode 100644
index 0000000000000000000000000000000000000000..23a7aaa702e3e68190ff7e01a5a673aee2c92409
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-apache-suc.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-api.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-api.png
new file mode 100644
index 0000000000000000000000000000000000000000..f825fe005705d30809d12df97958cff0e5a80135
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-api.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-clone-suc.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-clone-suc.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b6099ccc88d4f6f907a0c4563e729ab2a4dece1
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-clone-suc.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-clone.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-clone.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b09ab73849494f4ffd759fa612ae3c241bd9c1d
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-clone.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-corosync.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-corosync.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4d93242e65c503b6e1b6a457e2517f647984a66
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-corosync.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-firstchoice-cmd.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-firstchoice-cmd.png
new file mode 100644
index 0000000000000000000000000000000000000000..a265bab07f1d8e46d9d965975be180a8de6c9eb2
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-firstchoice-cmd.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-firstchoice.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-firstchoice.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd982ddcea55c629c0257fca86051a9ffa77e7b4
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-firstchoice.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new-suc.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new-suc.png
new file mode 100644
index 0000000000000000000000000000000000000000..437fd01ee83a9a1f65c12838fe56eea8435f6759
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new-suc.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new-suc2.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new-suc2.png
new file mode 100644
index 0000000000000000000000000000000000000000..4fb933bd761f9808de95a324a50226ff041ebd4f
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new-suc2.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c914d0cc2e14f3220fc4346175961f129efb37b
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-new.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-suc.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-suc.png
new file mode 100644
index 0000000000000000000000000000000000000000..2338580343833ebab08627be3a2efbcdb48aef9e
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group-suc.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group.png
new file mode 100644
index 0000000000000000000000000000000000000000..6897817665dee90c0f8c47c6a3cb4bb09db52d78
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-group.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-home-page.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-home-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9a7a82dc412250d4c0984b3876c6f93c6aca789
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-home-page.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-login.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-login.png
new file mode 100644
index 0000000000000000000000000000000000000000..65d0ae11ec810da7574ec72bebf6e1b020c94a0d
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-login.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-mariadb-suc.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-mariadb-suc.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f6756c945121715edc623bd9a848bc48ffeb4ca
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-mariadb-suc.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-mariadb.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-mariadb.png
new file mode 100644
index 0000000000000000000000000000000000000000..d29587c8609b9d6aefeb07170901361b5ef8402d
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-mariadb.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-nfs-suc.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-nfs-suc.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0ea6af79e91649f1ad7d97ab6c2a0069a4f4fb8
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-nfs-suc.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-nfs.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-nfs.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6917938eec2e0431a9891c067475dd0b21c1bd9
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-nfs.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pacemaker.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pacemaker.png
new file mode 100644
index 0000000000000000000000000000000000000000..7681f963f67d2b803fef6fb2c3247384136201f8
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pacemaker.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pcs-status.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pcs-status.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb150fba9f6258658702b35caacf98076d1fd109
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pcs-status.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pcs.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pcs.png
new file mode 100644
index 0000000000000000000000000000000000000000..283670d7c3d0961ee1cb41345c2b2a013d7143b0
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-pcs.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-qdevice.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-qdevice.png
new file mode 100644
index 0000000000000000000000000000000000000000..2964f36c952fc7e62fb7b041fcf6d2de8ead712c
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-qdevice.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-refresh.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-refresh.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2678c0c2945acbabfbeae0d5de8924a216bbf31
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-refresh.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-vip-suc.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-vip-suc.png
new file mode 100644
index 0000000000000000000000000000000000000000..313ce56e14f931c78dad4349ed57ab3fd7907f50
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-vip-suc.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/HA-vip.png b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-vip.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8b417df2e64527d3b29d0289756dfbb01bf66ec
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/HA-vip.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/image.png b/docs/en/25.03/Server/HighAvailability/HA/figures/image.png
new file mode 100644
index 0000000000000000000000000000000000000000..7681f963f67d2b803fef6fb2c3247384136201f8
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/image.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/image3.png b/docs/en/25.03/Server/HighAvailability/HA/figures/image3.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4d93242e65c503b6e1b6a457e2517f647984a66
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/image3.png differ
diff --git a/docs/en/25.03/Server/HighAvailability/HA/figures/image4.png b/docs/en/25.03/Server/HighAvailability/HA/figures/image4.png
new file mode 100644
index 0000000000000000000000000000000000000000..65d0ae11ec810da7574ec72bebf6e1b020c94a0d
Binary files /dev/null and b/docs/en/25.03/Server/HighAvailability/HA/figures/image4.png differ
diff --git a/docs/en/25.03/Server/InstallationUpgrade/Installation/FAQ1.md b/docs/en/25.03/Server/InstallationUpgrade/Installation/FAQ1.md
new file mode 100644
index 0000000000000000000000000000000000000000..4952db34cbfaf732d4c79a1d7ece2aee17673000
--- /dev/null
+++ b/docs/en/25.03/Server/InstallationUpgrade/Installation/FAQ1.md
@@ -0,0 +1,66 @@
+# 常见问题与解决方法
+
+## **问题1:树莓派启动失败**
+
+### 问题现象
+
+将 openEuler 发布的树莓派镜像刷写入 SD 卡后,树莓派启动失败。
+
+### 原因分析
+
+刷写 openEuler 发布的树莓派镜像后,树莓派启动失败,大致有以下几种情况:
+
+1. 下载的镜像文件不完整,请确保该镜像通过完整性校验。
+2. 镜像写入 SD 卡过程中出现问题,多出现在 Windows 环境下使用应用软件刷写镜像到 SD 卡的情况。
+
+### 解决方法
+
+将完整的镜像重新刷写入 SD 卡。
+
+## **问题2:nmcli 命令连接 WIFI 失败**
+
+### 问题现象
+
+执行 `nmcli dev wifi connect SSID password PWD` 命令连接 WIFI 失败。例如提示 `Error: Connection activation failed: (7) Secrets were required, but not provided.` 等错误。
+
+### 原因分析
+
+执行的命令缺少密码。注意,如果密码中包含特殊字符,需要使用单引号将密码括起来。如果使用 nmcli 命令行连接 WIFI 失败,建议使用 nmtui 字符界面进行连接。
+
+### 解决方法
+
+执行 `nmtui` 命令进入到 nmtui 字符界面,按照以下步骤连接 WIFI。
+
+1. 选择 `Edit a connection`,按 `Enter` 进入编辑网络连接窗口。
+2. 按下键盘右方向键选择 `Add`,按 `Enter` 进入新建网络连接窗口。
+3. 连接类型选择 `Wi-Fi` ,然后按下键盘右方向键选择 `Create`,按 `Enter` 进入 WIFI 编辑连接信息的界面。
+4. WIFI 连接信息界面主要需要编辑以下内容,其他信息根据实际情况而定。编辑结束后选择 `OK`,按 `Enter` 完成编辑并回退到编辑网络连接窗口。
+ 1. `Profile name` 栏输入该 WIFI 连接的名称,这里可以使用默认名称,如 `Wi-Fi connection 1`;
+ 2. `Device` 栏输入要使用的无线网卡接口,这里输入 `wlan0`;
+ 3. `SSID` 栏输入要连接的 WIFI 的 SSID;
+ 4. `Security` 栏选择 WIFI 密码加密方式,这里根据实际情况选择,例如选择 `WPA & WPA2 Personal`;
+ 5. `Password` 栏输入 WIFI 密码。
+
+5. 选择 `Back` 回退到最初的 nmtui 字符界面。
+6. 选择 `Activate a connection`,按 `Enter` 进入激活网络连接窗口。
+7. 查看添加的 WIFI 连接是否已激活(已激活的连接名称前有 `*` 标记)。如果未激活,选择该 WIFI 连接,然后按下键盘右方向键选择 `Activate`,按 `Enter` 激活该连接。待激活完成后,选择 `Back`,按 `Enter` 退出该激活界面,回退到最初的 nmtui 字符界面。
+8. 选择 `Quit`,然后按下键盘右方向键选择 `OK`,按 `Enter` 退出 nmtui 字符界面。
+
+## **问题3:tensorflow包及相关包安装失败**
+
+### 问题现象
+
+使用yum安装tensorflow及相关包时失败。
+
+### 原因分析
+
+tensorflow的依赖包暂时未升级至适配tensorflow==2.12.1的版本,因此需要通过pip手动安装其依赖软件。
+
+### 解决方法
+
+1. yumdownloader下载tensorflow的rpm包:yumdownloader python3-tensorflow。
+2. 使用rpm --nodeps安装这个包:rpm -ivh --nodeps python3-tensorflow。
+3. 安装tensorflow依赖包。
+ 1. 使用pip安装依赖:pip3 install tensorflow-estimator==2.12.0 keras==2.12.0 protobuf==3.20.3。
+ 2. 使用yum安装其他依赖软件:yum install python3-termcolor python3-future python3-numpy python3-six python3-astunparse python3-google-pasta python3-opt-einsum python3-typing-extensions python3-wrapt python3-h5py python3-grpcio python3-absl-py python3-flatbuffers python3-gast
+4. 直接用yum下载相关包,例如python-keras-rl2,直接执行yum install python-keras-rl2。
diff --git a/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Guide1.md b/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Guide1.md
new file mode 100644
index 0000000000000000000000000000000000000000..8107613c2a03a79a14f0ded0e9f7fc30c41f41f8
--- /dev/null
+++ b/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Guide1.md
@@ -0,0 +1,177 @@
+# 安装指导
+
+本章介绍将“[树莓派镜像刷写入 SD 卡](./Installation-Modes1.md)”后,启用树莓派的主要过程。
+
+
+
+- [安装指导](#安装指导)
+ - [启动系统](#启动系统)
+ - [登录系统](#登录系统)
+ - [配置系统](#配置系统)
+ - [扩展根目录分区](#扩展根目录分区)
+ - [连接 WIFI](#连接-wifi)
+
+
+
+## 启动系统
+
+将刷写镜像后的 SD 卡插入树莓派,通电启用。
+
+树莓派硬件相关信息请参考[树莓派官网](https://www.raspberrypi.org/)。
+
+## 登录系统
+
+登录树莓派有以下两种方式:
+
+1. 本地登录
+
+ 树莓派连接显示器(树莓派视频输出接口为 Micro HDMI)、键盘、鼠标后,启动树莓派,可以看到树莓派启动日志输出到显示器上。待树莓派启动成功,输入用户名(root)和密码(openeuler)登录。
+
+2. ssh 远程登录
+
+ 树莓派默认采用 DHCP 的方式自动获取 IP。如果树莓派连接已知路由器,可登录路由器查看,新增的 IP 即为树莓派 IP。例如,树莓派对应 IP 为:192.168.31.109,使用命令 `ssh root@192.168.31.109` 后输入密码 `openeuler`,即可远程登录树莓派。
+
+## 配置系统
+
+### 扩展根目录分区
+
+默认根目录分区空间比较小,在使用之前,需要对分区进行扩容。
+
+请按照以下步骤扩展根目录分区:
+
+1. 在 root 权限下执行 `fdisk -l` 命令查看磁盘分区信息。命令和回显如下:
+
+ ```sh
+ # fdisk -l
+ Disk /dev/mmcblk0: 14.86 GiB, 15931539456 bytes, 31116288 sectors
+ Units: sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+ Disklabel type: dos
+ Disk identifier: 0xf2dc3842
+
+ Device Boot Start End Sectors Size Id Type
+ /dev/mmcblk0p1 * 8192 593919 585728 286M c W95 FAT32 (LBA)
+ /dev/mmcblk0p2 593920 1593343 999424 488M 82 Linux swap / Solaris
+ /dev/mmcblk0p3 1593344 5044223 3450880 1.7G 83 Linux
+ ```
+
+ SD 卡对应盘符为 /dev/mmcblk0,包括 3 个分区,分别为
+
+ - /dev/mmcblk0p1:引导分区
+ - /dev/mmcblk0p2:交换分区
+ - /dev/mmcblk0p3:根目录分区
+
+ 这里我们需要将根目录分区 `/dev/mmcblk0p3` 进行扩容。
+
+2. 在 root 权限下执行 `fdisk /dev/mmcblk0` 命令进入到交互式命令行界面,按照以下步骤扩展分区,如[图 1](#zh-cn_topic_0151920806_f6ff7658b349942ea87f4521c0256c315)所示。
+
+ 1. 输入 `p`,查看分区信息。
+
+ 记录分区 `/dev/mmcblk0p3` 的起始扇区号,即 `/dev/mmcblk0p3` 分区信息中 `Start` 列的值,示例中为 `1593344`。
+
+ 2. 输入 `d`,删除分区。
+ 3. 输入 `3` 或直接按 `Enter`,删除序号为 `3` 的分区,即 `/dev/mmcblk0p3` 分区。
+ 4. 输入 `n`,创建新的分区。
+ 5. 输入 `p` 或直接按 `Enter`,创建 `Primary` 类型的分区。
+ 6. 输入 `3` 或直接按 `Enter`,创建序号为 `3` 的分区,即 `/dev/mmcblk0p3` 分区。
+ 7. 输入新分区的起始扇区号,即第 `1` 步中记录的起始扇区号,示例中为 `1593344`。
+
+ >  **须知:**
+ > 请勿直接按“Enter”或使用默认参数。
+
+ 8. 按 `Enter`,使用默认的最后一个扇区号作为新分区的终止扇区号。
+ 9. 输入 `N`,不修改扇区标记。
+ 10. 输入 `w`,保存分区设置并退出交互式命令行界面。
+
+ **图 1** 分区扩容
+ 
+
+3. 在 root 权限下执行 `fdisk -l` 命令查看磁盘分区信息,以确保磁盘分区正确。命令和回显如下:
+
+ ```sh
+ # fdisk -l
+ Disk /dev/mmcblk0: 14.86 GiB, 15931539456 bytes, 31116288 sectors
+ Units: sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+ Disklabel type: dos
+ Disk identifier: 0xf2dc3842
+
+ Device Boot Start End Sectors Size Id Type
+ /dev/mmcblk0p1 * 8192 593919 585728 286M c W95 FAT32 (LBA)
+ /dev/mmcblk0p2 593920 1593343 999424 488M 82 Linux swap / Solaris
+ /dev/mmcblk0p3 1593344 31116287 29522944 14.1G 83 Linux
+ ```
+
+4. 在 root 权限下执行 `resize2fs /dev/mmcblk0p3`,增大未加载的文件系统大小。
+5. 执行 `df -lh` 命令查看磁盘空间信息,以确保根目录分区已扩展。
+
+ >  **须知:**
+ > 如果根目录分区未扩展,可执行 `reboot` 命令重启树莓派之后再在 root 权限下执行 `resize2fs /dev/mmcblk0p3`。
+
+### 连接 WIFI
+
+请按照以下步骤连接 WIFI:
+
+1. 查看 IP 和网卡信息
+
+ `ip a`
+
+ 获取无线网卡 wlan0 信息:
+
+ ```sh
+ 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
+ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+ inet 127.0.0.1/8 scope host lo
+ valid_lft forever preferred_lft forever
+ inet6 ::1/128 scope host
+ valid_lft forever preferred_lft forever
+ 2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000
+ link/ether dc:a6:32:50:de:57 brd ff:ff:ff:ff:ff:ff
+ inet 192.168.31.109/24 brd 192.168.31.255 scope global dynamic noprefixroute eth0
+ valid_lft 41570sec preferred_lft 41570sec
+ inet6 fe80::cd39:a969:e647:3043/64 scope link noprefixroute
+ valid_lft forever preferred_lft forever
+ 3: wlan0: mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
+ link/ether e2:e6:99:89:47:0c brd ff:ff:ff:ff:ff:ff
+ ```
+
+2. 扫描可以连接的 WIFI 信息
+
+ `nmcli dev wifi`
+
+3. 连接 WIFI
+
+ 在 root 权限下执行 `nmcli dev wifi connect SSID password PWD` 命令连接 WIFI。
+
+ 其中,`SSID` 为上一步扫描到的可供连接的 WIFI 的 SSID,`PWD` 为对应 WIFI 的密码。例如,`SSID` 为 `openEuler-wifi`,密码为 `12345678`,则连接该 WIFI 命令为:`nmcli dev wifi connect openEuler-wifi password 12345678`,连接成功:
+
+ ```sh
+ Device 'wlan0' successfully activated with '26becaab-4adc-4c8e-9bf0-1d63cf5fa3f1'.
+ ```
+
+4. 查看 IP 和无线网卡信息
+
+ `ip a`
+
+ ```sh
+ 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
+ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+ inet 127.0.0.1/8 scope host lo
+ valid_lft forever preferred_lft forever
+ inet6 ::1/128 scope host
+ valid_lft forever preferred_lft forever
+ 2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000
+ link/ether dc:a6:32:50:de:57 brd ff:ff:ff:ff:ff:ff
+ inet 192.168.31.109/24 brd 192.168.31.255 scope global dynamic noprefixroute eth0
+ valid_lft 41386sec preferred_lft 41386sec
+ inet6 fe80::cd39:a969:e647:3043/64 scope link noprefixroute
+ valid_lft forever preferred_lft forever
+ 3: wlan0: mtu 1500 qdisc fq_codel state UP group default qlen 1000
+ link/ether dc:a6:32:50:de:58 brd ff:ff:ff:ff:ff:ff
+ inet 192.168.31.110/24 brd 192.168.31.255 scope global dynamic noprefixroute wlan0
+ valid_lft 43094sec preferred_lft 43094sec
+ inet6 fe80::394:d086:27fa:deba/64 scope link noprefixroute
+ valid_lft forever preferred_lft forever
+ ```
diff --git a/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Modes1.md b/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Modes1.md
new file mode 100644
index 0000000000000000000000000000000000000000..f6f1dea16f42e54420c5b78d23bcf4ad80a08762
--- /dev/null
+++ b/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Modes1.md
@@ -0,0 +1,110 @@
+# 安装方式介绍
+
+>  **须知:**
+> 硬件仅支持树莓派 3B/3B+/4B。
+> 采用刷写镜像到 SD 卡方式安装。本章节提供 Windows/Linux/Mac 上刷写镜像的操作方法。
+> 本章节使用的镜像是参考“[安装准备](./Installation-Preparations1.md)”获取 openEuler 的树莓派版本镜像。
+
+
+
+- [安装方式介绍](#安装方式介绍)
+ - [Windows 下刷写镜像](#windows-下刷写镜像)
+ - [格式化 SD 卡](#格式化-sd-卡)
+ - [写入 SD 卡](#写入-sd-卡)
+ - [Linux 下刷写镜像](#linux-下刷写镜像)
+ - [查看磁盘分区信息](#查看磁盘分区信息)
+ - [卸载 SD 卡挂载点](#卸载-sd-卡挂载点)
+ - [写入 SD 卡](#写入-sd-卡-1)
+ - [Mac 下刷写镜像](#mac-下刷写镜像)
+ - [查看磁盘分区信息](#查看磁盘分区信息-1)
+ - [卸载 SD 卡挂载点](#卸载-sd-卡挂载点-1)
+ - [写入 SD 卡](#写入-sd-卡-2)
+
+
+
+## Windows 下刷写镜像
+
+本节以 Windows 10 为例,介绍如何在 Windows 环境下将镜像刷写到 SD 卡。
+
+### 格式化 SD 卡
+
+请按照以下步骤格式化 SD 卡:
+
+1. 下载并安装格式化 SD 卡工具,以下操作以 SD Card Formatter 格式化工具为例。
+2. 打开 SD Card Formatter,在 “Select card” 中选择需要格式化的 SD 卡的盘符。
+
+ 若 SD 卡之前未安装过镜像,盘符只有一个。在 “Select card” 中选择需要格式化的 SD 卡对应盘符。
+
+ 若 SD 卡之前安装过镜像,盘符会有一个或多个。例如,SD 卡对应三个盘符:E、G、H。在 “Select card” 中选择需要格式化的 SD 卡对应 boot 分区盘符 E。
+
+3. 在 “Formatting options” 中选择格式化方式。默认为 “Quick format”。
+4. 单击“Format”开始格式化。界面通过进度条显示格式化进度。
+5. 格式化完成后会弹出 “Formatting was successfully completed” 的提示框,单击“确定”完成格式化。
+
+### 写入 SD 卡
+
+>  **须知:**
+> 如果获取的是压缩后的镜像文件“openEuler-21.09-raspi-aarch64.img.xz”,需要先将压缩文件解压得到 “openEuler-21.09-raspi-aarch64.img”镜像文件。
+
+请按照以下步骤将“openEuler-21.09-raspi-aarch64.img”镜像文件写入 SD 卡:
+
+1. 下载并安装刷写镜像的工具,以下操作以 Win32 Disk Imager 工具为例。
+2. 右键选择“以管理员身份运行”,打开 Win32 Disk Imager。
+3. 在“映像文件”中选择 img 格式的镜像文件路径。
+4. 在“设备”中选择待写入的 SD 卡盘符。
+5. 单击“写入”。界面通过任务进度条显示写入 SD 卡的进度。
+6. 写入完成后会弹出 “写入成功” 的提示框,单击“OK”完成写入。
+
+## Linux 下刷写镜像
+
+本节介绍如何在 Linux 环境下将镜像刷写到SD卡。
+
+### 查看磁盘分区信息
+
+在 root 权限下执行 `fdisk -l` 获取 SD 卡磁盘信息,例如 SD 卡对应磁盘为 /dev/sdb。
+
+### 卸载 SD 卡挂载点
+
+1. 执行 `df -lh` 命令查看当前已挂载的卷。
+2. 如果 SD 卡对应的分区未挂载,则跳过该步骤;如果 SD 卡对应分区已挂载,如 SD 卡对应的两个分区 /dev/sdb1 和 /dev/sdb3 已挂载,则需要卸载对应分区,在 root 权限下执行以下命令:
+
+ `umount /dev/sdb1`
+
+ `umount /dev/sdb3`
+
+### 写入 SD 卡
+
+1. 如果获取的是压缩后的镜像,需要先执行 `xz -d openEuler-21.09-raspi-aarch64.img.xz` 命令将压缩文件解压得到“openEuler-21.09-raspi-aarch64.img”镜像文件;否则,跳过该步骤。
+2. 将镜像 `openEuler-21.09-raspi-aarch64.img` 刷写入 SD 卡,在 root 权限下执行以下命令:
+
+ `dd bs=4M if=openEuler-21.09-raspi-aarch64.img of=/dev/sdb`
+
+ >  **说明:**
+ > 一般情况下,将块大小设置为 4M。如果写入失败或者写入的镜像无法使用,可以尝试将块大小设置为 1M 重新写入,但是设置为 1M 比较耗时。
+
+## Mac 下刷写镜像
+
+本节介绍如何在 Mac 环境下将镜像刷写到SD卡。
+
+### 查看磁盘分区信息
+
+在 root 权限下执行 `diskutil list` 获取 SD 卡磁盘信息,例如 SD 卡对应磁盘为 /dev/disk3。
+
+### 卸载 SD 卡挂载点
+
+1. 执行 `df -lh` 命令查看当前已挂载的卷。
+2. 如果 SD 卡对应的分区未挂载,则跳过该步骤;如果 SD 卡对应分区已挂载,如 SD 卡对应的两个分区 /dev/disk3s1 和 /dev/disk3s3 已挂载,则需要卸载对应分区,在 root 权限下执行以下命令:
+
+ `diskutil umount /dev/disk3s1`
+
+ `diskutil umount /dev/disk3s3`
+
+### 写入 SD 卡
+
+1. 如果获取的是压缩后的镜像,需要先执行 `xz -d openEuler-21.09-raspi-aarch64.img.xz` 命令将压缩文件解压得到“openEuler-21.09-raspi-aarch64.img”镜像文件;否则,跳过该步骤。
+2. 将镜像 `openEuler-21.09-raspi-aarch64.img` 刷入 SD 卡,在 root 权限下执行以下命令:
+
+ `dd bs=4m if=openEuler-21.09-raspi-aarch64.img of=/dev/disk3`
+
+ >  **说明:**
+ > 一般情况下,将块大小设置为 4m。如果写入失败或者写入的镜像无法使用,可以尝试将块大小设置为 1m 重新写入,但是设置为 1m 比较耗时。
diff --git a/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Preparations1.md b/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Preparations1.md
new file mode 100644
index 0000000000000000000000000000000000000000..378f77cbbe5d0d92831d4cc9d76ba9e88b5312f3
--- /dev/null
+++ b/docs/en/25.03/Server/InstallationUpgrade/Installation/Installation-Preparations1.md
@@ -0,0 +1,100 @@
+# 安装准备
+
+介绍安装前需要考虑软硬件兼容性状况,以及相关的配置和准备工作。
+
+## 获取安装源
+
+在安装开始前,您需要获取 openEuler 发布的树莓派镜像及其校验文件。
+
+1. 登录[openEuler Repo](https://repo.openeuler.org/)网站。
+2. 在版本列表单击“openEuler 22.03 LTS SP2”,进入openEuler 22.03 LTS SP2下载列表。
+3. 单击“raspi_img”,进入树莓派镜像的下载列表。
+4. 单击“openEuler-22.03-LTS-SP2-raspi-aarch64.img.xz”,将 openEuler 发布的树莓派镜像下载到本地。
+5. 单击“openEuler-22.03-LTS-SP2-raspi-aarch64.img.xz.sha256sum”,将 openEuler 发布的树莓派镜像的校验文件下载到本地。
+
+## 镜像完整性校验
+
+### 简介
+
+为了防止软件包在传输过程中由于网络原因或者存储设备原因出现下载不完整的问题,在获取到软件包后,需要对软件包的完整性进行校验,通过了校验的软件包才能部署。
+
+这里通过对比校验文件中记录的校验值和手动方式计算的文件校验值,判断软件包是否完整。若两个值相同,说明下载的文件完整,否则,下载的文件完整性被破坏,请重新获取软件包。
+
+### 前提条件
+
+在校验镜像文件的完整性之前,需要准备如下文件:
+
+镜像文件:openEuler-22.03-LTS-SP2-raspi-aarch64.img.xz
+
+校验文件:openEuler-22.03-LTS-SP2-raspi-aarch64.img.xz.sha256sum
+
+### 操作指导
+
+文件完整性校验操作步骤如下:
+
+1. 获取校验文件中的校验值。执行命令如下:
+
+ ```shell
+ cat openEuler-22.03-LTS-SP2-raspi-aarch64.img.xz.sha256sum
+ ```
+
+2. 计算文件的 sha256 校验值。执行命令如下:
+
+ ```shell
+ sha256sum openEuler-22.03-LTS-SP2-raspi-aarch64.img.xz
+ ```
+
+ 命令执行完成后,输出校验值。
+
+3. 对比步骤 1 和步骤 2 计算的校验值是否一致。
+
+ 如果校验值一致说明下载的文件完整性没有被破坏,如果校验值不一致则可以确认文件完整性已被破坏,需要重新获取。
+
+## 安装要求
+
+在树莓派环境上安装 openEuler 操作系统,则树莓派需要满足如下的硬件兼容性和最小硬件要求。
+
+### 硬件兼容支持
+
+openEuler 树莓派版本镜像目前支持树莓派 3B/3B+/4B。
+
+### 最小硬件要求
+
+openEuler 树莓派版本镜像所需的最小硬件要求如[表1](#tff48b99c9bf24b84bb602c53229e2542)所示。
+
+**表 1** 最小硬件要求
+
+
+
+