<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://zxdd.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Eric</id>
	<title>知行迭代 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://zxdd.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Eric"/>
	<link rel="alternate" type="text/html" href="https://zxdd.com/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Eric"/>
	<updated>2026-06-02T19:17:08Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://zxdd.com/index.php?title=AI%E7%BC%96%E7%A8%8B&amp;diff=1788</id>
		<title>AI编程</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=AI%E7%BC%96%E7%A8%8B&amp;diff=1788"/>
		<updated>2026-05-11T03:08:24Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* UI/UX 设计 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AI编程是利用[[AI]]技术来自动生成、补全、优化代码，提高开发效率。&lt;br /&gt;
&lt;br /&gt;
==工具==&lt;br /&gt;
===AI代码补全与代码助手===&lt;br /&gt;
*GitHub Copilot&lt;br /&gt;
Tabnine&lt;br /&gt;
*Codeium&lt;br /&gt;
&lt;br /&gt;
===AI IDEs===&lt;br /&gt;
* Cursor&lt;br /&gt;
* Trae AI IDE&lt;br /&gt;
&lt;br /&gt;
===AI 编码代理===&lt;br /&gt;
* [[Claude Code]]&lt;br /&gt;
* [[OpenCode]]，开源的AI编码代理工具。&lt;br /&gt;
&lt;br /&gt;
== 编程大模型 ==&lt;br /&gt;
* [[Claude]] &lt;br /&gt;
* [[ChatGPT]]&lt;br /&gt;
* [[DeepSeek]]&lt;br /&gt;
* Qwen&lt;br /&gt;
* Gemini&lt;br /&gt;
&lt;br /&gt;
== AI开发App ==&lt;br /&gt;
=== 想法验证与需求分析 ===&lt;br /&gt;
把模糊的想法变成可执行的文档。明确问题与目标：描述App解决什么痛点、目标用户、核心功能等。&lt;br /&gt;
工具：ChatGPT / DeepsSeek / Claude / Gemini&lt;br /&gt;
操作：向 AI 描述你的初步想法。例如：“我想做一个针对小学生的阅读进度记录 App，需要有勋章系统和家长端。请帮我梳理核心功能点和用户流程图。”&lt;br /&gt;
验证可行性：AI生成市场分析&lt;br /&gt;
产出：PRD（产品需求文档） 和功能清单。&lt;br /&gt;
&lt;br /&gt;
=== UI/UX 设计 ===&lt;br /&gt;
&lt;br /&gt;
产出：UI 设计稿 或 前端交互原型。&lt;br /&gt;
&lt;br /&gt;
==== 直接生成 ====&lt;br /&gt;
直接提示词，搭配skill，直接生成界面。&lt;br /&gt;
*ui-ux-pro-max-skill， https://www.uupm.cc， https://github.com/nextlevelbuilder/ui-ux-pro-max-skill&lt;br /&gt;
&lt;br /&gt;
==== 原型工具 ====&lt;br /&gt;
AI提示词给原型工具，交互式生成UI，再导出编程。&lt;br /&gt;
* google stitch&lt;br /&gt;
* pencil.dev&lt;br /&gt;
* figma&lt;br /&gt;
&lt;br /&gt;
==== 原型图 ====&lt;br /&gt;
先生成图，再给AI还原，或者先给原型工具，再导出。&lt;br /&gt;
* 即梦&lt;br /&gt;
* GPT Image 2&lt;br /&gt;
&lt;br /&gt;
=== 技术选型与架构设计 ===&lt;br /&gt;
&lt;br /&gt;
===开发编码===&lt;br /&gt;
&lt;br /&gt;
===测试===&lt;br /&gt;
用 AI 批量生成测试用例，自动执行和查错。&lt;br /&gt;
&lt;br /&gt;
===构建与部署===&lt;br /&gt;
&lt;br /&gt;
===上线监控与持续迭代===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Samba&amp;diff=1787</id>
		<title>Samba</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Samba&amp;diff=1787"/>
		<updated>2026-05-10T15:28:47Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 服务端配置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Samba是一个开源软件套件，允许Linux和Unix系统与Windows系统共享文件和打印机。它通过SMB/CIFS协议实现互操作性。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
===安装===&lt;br /&gt;
Ubuntu/Debian:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install samba&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Samba===&lt;br /&gt;
Samba的配置文件通常位于/etc/samba/smb.conf。没有新建一个。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; &amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   server string = Samba Server&lt;br /&gt;
   netbios name = linuxserver&lt;br /&gt;
   security = user&lt;br /&gt;
&lt;br /&gt;
[shared] &lt;br /&gt;
   path = /home/username/shared&lt;br /&gt;
   browsable = yes&lt;br /&gt;
   writable = yes&lt;br /&gt;
   guest ok = no&lt;br /&gt;
   read only = no&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
配置说明：&lt;br /&gt;
* [global]：定义全局设置。&lt;br /&gt;
** workgroup：工作组名称，通常与Windows系统的工作组一致。&lt;br /&gt;
** server string：服务器的描述文字。&lt;br /&gt;
** netbios name：服务器的NetBIOS名称。&lt;br /&gt;
** security = user：启用用户级安全认证。&lt;br /&gt;
* [shared]：定义一个共享目录。&lt;br /&gt;
** path：共享目录的路径。&lt;br /&gt;
** browsable：允许客户端浏览此共享。&lt;br /&gt;
** writable：允许写入权限。&lt;br /&gt;
** guest ok：是否允许匿名访问（此处为否）。&lt;br /&gt;
** read only：是否只读（此处为否）。&lt;br /&gt;
&lt;br /&gt;
===创建共享目录===&lt;br /&gt;
创建配置文件中指定的共享目录，并设置适当的权限：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /home/username/shared&lt;br /&gt;
sudo chown -R nobody:nogroup  /home/username/shared&lt;br /&gt;
sudo chmod -R 0700 /home/username/shared&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===添加Samba用户===&lt;br /&gt;
Samba使用独立的密码数据库。需要为系统用户创建Samba账，如username：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 如果还不是系统用户，需要先创建&lt;br /&gt;
# sudo adduser username&lt;br /&gt;
&lt;br /&gt;
sudo smbpasswd -a username&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===启动和启用Samba服务===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo systemctl start smbd&lt;br /&gt;
sudo systemctl enable smbd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===访问共享===&lt;br /&gt;
在Windows系统中，可以通过以下方式访问Samba共享：&lt;br /&gt;
打开“文件资源管理器”，输入\\linuxserver\shared（用服务器的IP地址或NetBIOS名称替换linuxserver）。&lt;br /&gt;
或使用“映射网络驱动器”功能连接到共享。&lt;br /&gt;
&lt;br /&gt;
==服务端配置 ==&lt;br /&gt;
&lt;br /&gt;
=== 创建只能使用samba用户 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt; &lt;br /&gt;
# -m 创建用户主目录&lt;br /&gt;
# -s /sbin/nologin 用户无法通过 SSH、控制台等方式登录系统&lt;br /&gt;
# 有些路径, /usr/sbin/nologin&lt;br /&gt;
sudo useradd -m -s /sbin/nologin user1&lt;br /&gt;
&lt;br /&gt;
# 设置 Samba 密码，独立于系统密码&lt;br /&gt;
sudo smbpasswd -a user1&lt;br /&gt;
&lt;br /&gt;
# 配置 Samba 共享目录&lt;br /&gt;
sudo nano /etc/samba/smb.conf&lt;br /&gt;
&lt;br /&gt;
# 添加下面内容，并保存&lt;br /&gt;
[user1]&lt;br /&gt;
    comment = Data Share&lt;br /&gt;
    path = /home/user1&lt;br /&gt;
    browseable = yes&lt;br /&gt;
    writable = yes&lt;br /&gt;
    valid users = user1&lt;br /&gt;
    create mask = 0755&lt;br /&gt;
    directory mask = 0755&lt;br /&gt;
&lt;br /&gt;
# 重启 Samba 服务&lt;br /&gt;
sudo systemctl restart smbd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==客户端挂载 ==&lt;br /&gt;
===linux挂载===&lt;br /&gt;
图形界面挂载Samba共享：&lt;br /&gt;
*打开文件管理器，点击侧边栏‘网络’，输入服务器地，如&amp;lt;code&amp;gt;smb://192.168.1.100/YourShare&amp;lt;/code&amp;gt;，点击连接。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使用[[mount]]命令行挂载：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 安装 cifs-utils 来支持挂载命令&lt;br /&gt;
sudo apt install cifs-utils -y&lt;br /&gt;
&lt;br /&gt;
# 创建挂载点&lt;br /&gt;
mkdir ~/mysambashare&lt;br /&gt;
&lt;br /&gt;
# 执行挂载，输入密码 (Samba 密码)&lt;br /&gt;
sudo mount -t cifs //192.168.1.100/YourShare ~/mysambashare -o username=your_username&lt;br /&gt;
&lt;br /&gt;
# 使用凭据文件，免每次手动输密码。&lt;br /&gt;
# 1. 创建文件（替换 username 和 password）&lt;br /&gt;
echo -e &amp;quot;username=your_username\npassword=your_password&amp;quot; &amp;gt; ~/.smbcredentials&lt;br /&gt;
# 2. 设置权限（重要：防止泄露）&lt;br /&gt;
chmod 600 ~/.smbcredentials&lt;br /&gt;
# 3. 挂载时引用&lt;br /&gt;
sudo mount -t cifs //192.168.1.100/YourShare ~/mysambashare -o credentials=~/.smbcredentials&lt;br /&gt;
&lt;br /&gt;
# 开机自动挂载&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# 在fstab文件，在末尾添加一行，&lt;br /&gt;
# 为避免报错导致无法开机，强烈建议使用 x-systemd.automount 或 nofail 选项。&lt;br /&gt;
//192.168.1.100/YourShare  /home/your_username/mysambashare  cifs  credentials=/home/your_username/.smbcredentials,uid=你的本地uid,gid=你的本地gid,iocharset=utf8,nofail,x-systemd.automount  0  0&lt;br /&gt;
&lt;br /&gt;
# 测试挂载&lt;br /&gt;
sudo mount -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===windows挂载===&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* Samba官网：https://www.samba.org/&lt;br /&gt;
* Samba Wiki：https://wiki.samba.org/&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
*Ubuntu教程：安装和配置Samba https://ubuntu.com/tutorials/install-and-configure-samba&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=AI%E7%BC%96%E7%A8%8B&amp;diff=1786</id>
		<title>AI编程</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=AI%E7%BC%96%E7%A8%8B&amp;diff=1786"/>
		<updated>2026-05-09T02:52:08Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AI编程是利用[[AI]]技术来自动生成、补全、优化代码，提高开发效率。&lt;br /&gt;
&lt;br /&gt;
==工具==&lt;br /&gt;
===AI代码补全与代码助手===&lt;br /&gt;
*GitHub Copilot&lt;br /&gt;
Tabnine&lt;br /&gt;
*Codeium&lt;br /&gt;
&lt;br /&gt;
===AI IDEs===&lt;br /&gt;
* Cursor&lt;br /&gt;
* Trae AI IDE&lt;br /&gt;
&lt;br /&gt;
===AI 编码代理===&lt;br /&gt;
* [[Claude Code]]&lt;br /&gt;
* [[OpenCode]]，开源的AI编码代理工具。&lt;br /&gt;
&lt;br /&gt;
== 编程大模型 ==&lt;br /&gt;
* [[Claude]] &lt;br /&gt;
* [[ChatGPT]]&lt;br /&gt;
* [[DeepSeek]]&lt;br /&gt;
* Qwen&lt;br /&gt;
* Gemini&lt;br /&gt;
&lt;br /&gt;
== AI开发App ==&lt;br /&gt;
=== 想法验证与需求分析 ===&lt;br /&gt;
把模糊的想法变成可执行的文档。明确问题与目标：描述App解决什么痛点、目标用户、核心功能等。&lt;br /&gt;
工具：ChatGPT / DeepsSeek / Claude / Gemini&lt;br /&gt;
操作：向 AI 描述你的初步想法。例如：“我想做一个针对小学生的阅读进度记录 App，需要有勋章系统和家长端。请帮我梳理核心功能点和用户流程图。”&lt;br /&gt;
验证可行性：AI生成市场分析&lt;br /&gt;
产出：PRD（产品需求文档） 和功能清单。&lt;br /&gt;
&lt;br /&gt;
=== UI/UX 设计 ===&lt;br /&gt;
&lt;br /&gt;
产出：UI 设计稿 或 前端交互原型。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 技术选型与架构设计 ===&lt;br /&gt;
&lt;br /&gt;
===开发编码===&lt;br /&gt;
&lt;br /&gt;
===测试===&lt;br /&gt;
用 AI 批量生成测试用例，自动执行和查错。&lt;br /&gt;
&lt;br /&gt;
===构建与部署===&lt;br /&gt;
&lt;br /&gt;
===上线监控与持续迭代===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Flutter&amp;diff=1785</id>
		<title>Flutter</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Flutter&amp;diff=1785"/>
		<updated>2026-05-08T06:08:51Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flutter 是一个[[Google]]开源的跨平台软件开发工具，支持开发[[Android]]、 [[iOS]] 、 [[web]]、 [[Windows]]、 [[macOS]] 和 [[Linux]] 等应用。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
===安装===&lt;br /&gt;
==== Window上安装 ====&lt;br /&gt;
* 1.下载Flutter SDK最新的Stable版本： https://docs.flutter.dev/release/archive?tab=windows&lt;br /&gt;
* 2.解压缩到某个位置，如D:\flutter。&lt;br /&gt;
* 3.添加到flutter\bin到环境变量path中。搜索框输入env进入设置。&lt;br /&gt;
* 4.国内配置镜像源&lt;br /&gt;
* 5运行&amp;lt;code&amp;gt;flutter doctor&amp;lt;/code&amp;gt; 检查环境。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.flutter.dev/get-started/install/windows Flutter 文档：Windows 安装 Flutter ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== 国内配置镜像源 ====&lt;br /&gt;
&lt;br /&gt;
Window配置：&amp;lt;br /&amp;gt;&lt;br /&gt;
搜索框输入env，点击编辑系统环境变量，将PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL 和其值添加到用户变量中。&lt;br /&gt;
&lt;br /&gt;
Linux配置：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 临时配置&lt;br /&gt;
export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&lt;br /&gt;
export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 长期配置&lt;br /&gt;
echo &#039;export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
====安装后续====&lt;br /&gt;
安装完成后，可以查看版本：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看dart语言版本&lt;br /&gt;
dart --version&lt;br /&gt;
&lt;br /&gt;
# 查看flutter版本，卡住通常是因为网络问题 &lt;br /&gt;
flutter --version&lt;br /&gt;
&lt;br /&gt;
# 禁用 Google Analytics（可选）&lt;br /&gt;
flutter --disable-analytics&lt;br /&gt;
&lt;br /&gt;
# 运行 Flutter Doctor 检查环境&lt;br /&gt;
# Android SDK 是否安装&lt;br /&gt;
# Chrome/Edge 是否可用&lt;br /&gt;
# CMake、ninja等依赖项目&lt;br /&gt;
flutter doctor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Android SDK，地址：https://developer.android.com/tools?hl=zh-cn。Android SDK包含了多个包， 可以使用 sdkmanager 命令行工具来安装和更新每个软件包。sdkmanager在cmdline-tools包括中。&lt;br /&gt;
* 安装 cmdline-tools，参考：https://developer.android.com/tools/sdkmanager?hl=zh-cn。  在 https://developer.android.com/studio?hl=zh-cn#command-line-tools-only 页面下方找到对应平台，如https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip。&lt;br /&gt;
&lt;br /&gt;
*安装最新版SDK工具，如API 级别 36 的 SDK 工具： sdkmanager &amp;quot;platform-tools&amp;quot; &amp;quot;platforms;android-36&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://flutter.cn/community/china Flutter 文档中文版：在中国网络环境下使用 Flutter ]&lt;br /&gt;
|[https://mirrors.tuna.tsinghua.edu.cn/help/flutter/ 清华大学开源软件镜像站：Flutter 镜像安装帮助 ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
===新建flutter项目===&lt;br /&gt;
方法一：在 VS Code 中创建，Ctrl + Shift + P ，在命令面板中输入 flutter，找到并选择 Flutter: New Project，在弹出的选项中选择 Application（创建一个标准 Flutter 应用）&lt;br /&gt;
&lt;br /&gt;
方法二：在终端/命令行中创建。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 以 projects 文件夹为例&lt;br /&gt;
cd ~/projects   &lt;br /&gt;
&lt;br /&gt;
# 当前目录下创建一个名为 my_app 的文件夹&lt;br /&gt;
# 并生成完整的项目代码&lt;br /&gt;
flutter create my_app&lt;br /&gt;
&lt;br /&gt;
# 创建最小化项目（空的 main.dart）&lt;br /&gt;
flutter create --empty my_app&lt;br /&gt;
# 指定支持的平台&lt;br /&gt;
flutter create --platforms=android,ios,web my_app&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://docs.flutter.dev/reference/create-new-app&lt;br /&gt;
&lt;br /&gt;
===项目结构速览===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
my_app/&lt;br /&gt;
├── android/          # Android 原生代码&lt;br /&gt;
├── ios/              # iOS 原生代码&lt;br /&gt;
├── lib/              # 📁 你的 Dart 代码（主要工作区域）&lt;br /&gt;
│   └── main.dart     # 入口文件&lt;br /&gt;
├── test/             # 单元测试代码&lt;br /&gt;
├── pubspec.yaml      # 项目配置文件（依赖、资源等）&lt;br /&gt;
└── ...               # 其他配置文件&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
===运行项目===&lt;br /&gt;
项目创建成功后，在项目目录下执行，然后选择你要运行的设备（模拟器或真机）：&lt;br /&gt;
 flutter run&lt;br /&gt;
或者在scode中点击my_app/lib/main.dart文件，然后点击右上角运行按钮。   &lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* Flutter 官网： https://flutter.dev&lt;br /&gt;
* Flutter 源代码：https://github.com/flutter/flutter&lt;br /&gt;
* Flutter 示例：https://flutter.github.io/samples&lt;br /&gt;
* Material 3 ：https://m3.material.io&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
* Flutter 文档中文版：https://flutter.cn&lt;br /&gt;
* 《Flutter实战·第二版》： https://book.flutterchina.club&lt;br /&gt;
* liujunmin.com 博客分类：https://liujunmin.com/categories/&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Flutter&amp;diff=1784</id>
		<title>Flutter</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Flutter&amp;diff=1784"/>
		<updated>2026-05-08T03:52:50Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flutter 是一个[[Google]]开源的跨平台软件开发工具，支持开发[[Android]]、 [[iOS]] 、 [[web]]、 [[Windows]]、 [[macOS]] 和 [[Linux]] 等应用。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
===安装===&lt;br /&gt;
==== Window上安装 ====&lt;br /&gt;
* 1.下载Flutter SDK最新的Stable版本： https://docs.flutter.dev/release/archive?tab=windows&lt;br /&gt;
* 2.解压缩到某个位置，如D:\flutter。&lt;br /&gt;
* 3.添加到flutter\bin到环境变量path中。搜索框输入env进入设置。&lt;br /&gt;
* 4.国内配置镜像源&lt;br /&gt;
* 5运行&amp;lt;code&amp;gt;flutter doctor&amp;lt;/code&amp;gt; 检查环境。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.flutter.dev/get-started/install/windows Flutter 文档：Windows 安装 Flutter ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== 国内配置镜像源 ====&lt;br /&gt;
&lt;br /&gt;
Window配置：&amp;lt;br /&amp;gt;&lt;br /&gt;
搜索框输入env，点击编辑系统环境变量，将PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL 和其值添加到用户变量中。&lt;br /&gt;
&lt;br /&gt;
Linux配置：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 临时配置&lt;br /&gt;
export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&lt;br /&gt;
export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 长期配置&lt;br /&gt;
echo &#039;export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
====安装后续====&lt;br /&gt;
安装完成后，可以查看版本：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看dart语言版本&lt;br /&gt;
dart --version&lt;br /&gt;
&lt;br /&gt;
# 查看flutter版本，卡住通常是因为网络问题 &lt;br /&gt;
flutter --version&lt;br /&gt;
&lt;br /&gt;
# 禁用 Google Analytics（可选）&lt;br /&gt;
flutter --disable-analytics&lt;br /&gt;
&lt;br /&gt;
# 运行 Flutter Doctor 检查环境&lt;br /&gt;
# Android SDK 是否安装&lt;br /&gt;
# Chrome/Edge 是否可用&lt;br /&gt;
# CMake、ninja等依赖项目&lt;br /&gt;
flutter doctor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Android SDK，地址：https://developer.android.com/tools?hl=zh-cn。Android SDK包含了多个包， 可以使用 sdkmanager 命令行工具来安装和更新每个软件包。sdkmanager在cmdline-tools包括中。&lt;br /&gt;
* 安装 cmdline-tools，参考：https://developer.android.com/tools/sdkmanager?hl=zh-cn。  在 https://developer.android.com/studio?hl=zh-cn#command-line-tools-only 页面下方找到对应平台，如https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip。&lt;br /&gt;
&lt;br /&gt;
*安装最新版SDK工具，如API 级别 36 的 SDK 工具： sdkmanager &amp;quot;platform-tools&amp;quot; &amp;quot;platforms;android-36&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://flutter.cn/community/china Flutter 文档中文版：在中国网络环境下使用 Flutter ]&lt;br /&gt;
|[https://mirrors.tuna.tsinghua.edu.cn/help/flutter/ 清华大学开源软件镜像站：Flutter 镜像安装帮助 ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* Flutter 官网： https://flutter.dev&lt;br /&gt;
* Flutter 源代码：https://github.com/flutter/flutter&lt;br /&gt;
* Flutter 示例：https://flutter.github.io/samples&lt;br /&gt;
* Material 3 ：https://m3.material.io&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
* Flutter 文档中文版：https://flutter.cn&lt;br /&gt;
* 《Flutter实战·第二版》： https://book.flutterchina.club&lt;br /&gt;
* liujunmin.com 博客分类：https://liujunmin.com/categories/&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Flutter&amp;diff=1783</id>
		<title>Flutter</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Flutter&amp;diff=1783"/>
		<updated>2026-05-08T02:20:34Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 安装后续 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flutter 是一个[[Google]]开源的跨平台软件开发工具，支持开发[[Android]]、 [[iOS]] 、 [[web]]、 [[Windows]]、 [[macOS]] 和 [[Linux]] 等应用。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
===安装===&lt;br /&gt;
==== Window上安装 ====&lt;br /&gt;
* 1.下载Flutter SDK最新的Stable版本： https://docs.flutter.dev/release/archive?tab=windows&lt;br /&gt;
* 2.解压缩到某个位置，如D:\flutter。&lt;br /&gt;
* 3.添加到flutter\bin到环境变量path中。搜索框输入env进入设置。&lt;br /&gt;
* 4.国内配置镜像源&lt;br /&gt;
* 5运行&amp;lt;code&amp;gt;flutter doctor&amp;lt;/code&amp;gt; 检查环境。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.flutter.dev/get-started/install/windows Flutter 文档：Windows 安装 Flutter ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== 国内配置镜像源 ====&lt;br /&gt;
&lt;br /&gt;
Window配置：&amp;lt;br /&amp;gt;&lt;br /&gt;
搜索框输入env，点击编辑系统环境变量，将PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL 和其值添加到用户变量中。&lt;br /&gt;
&lt;br /&gt;
Linux配置：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 临时配置&lt;br /&gt;
export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&lt;br /&gt;
export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 长期配置&lt;br /&gt;
echo &#039;export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
====安装后续====&lt;br /&gt;
安装完成后，可以查看版本：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看dart语言版本&lt;br /&gt;
dart --version&lt;br /&gt;
&lt;br /&gt;
# 查看flutter版本，卡住通常是因为网络问题 &lt;br /&gt;
flutter --version&lt;br /&gt;
&lt;br /&gt;
# 禁用 Google Analytics（可选）&lt;br /&gt;
flutter --disable-analytics&lt;br /&gt;
&lt;br /&gt;
# 运行 Flutter Doctor 检查环境&lt;br /&gt;
# Android SDK 是否安装&lt;br /&gt;
# Chrome/Edge 是否可用&lt;br /&gt;
# CMake、ninja等依赖项目&lt;br /&gt;
flutter doctor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Android SDK&lt;br /&gt;
* 地址：https://developer.android.com/tools/releases/platform-tools?hl=zh-cn&lt;br /&gt;
* 直接下载地址：https://dl.google.com/android/repository/platform-tools-latest-linux.zip?hl=zh-cn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://flutter.cn/community/china Flutter 文档中文版：在中国网络环境下使用 Flutter ]&lt;br /&gt;
|[https://mirrors.tuna.tsinghua.edu.cn/help/flutter/ 清华大学开源软件镜像站：Flutter 镜像安装帮助 ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* Flutter 官网： https://flutter.dev&lt;br /&gt;
* Flutter 源代码：https://github.com/flutter/flutter&lt;br /&gt;
* Flutter 示例：https://flutter.github.io/samples&lt;br /&gt;
* Material 3 ：https://m3.material.io&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
* Flutter 文档中文版：https://flutter.cn&lt;br /&gt;
* 《Flutter实战·第二版》： https://book.flutterchina.club&lt;br /&gt;
* liujunmin.com 博客分类：https://liujunmin.com/categories/&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Flutter&amp;diff=1782</id>
		<title>Flutter</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Flutter&amp;diff=1782"/>
		<updated>2026-05-08T02:12:55Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 安装 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flutter 是一个[[Google]]开源的跨平台软件开发工具，支持开发[[Android]]、 [[iOS]] 、 [[web]]、 [[Windows]]、 [[macOS]] 和 [[Linux]] 等应用。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
===安装===&lt;br /&gt;
==== Window上安装 ====&lt;br /&gt;
* 1.下载Flutter SDK最新的Stable版本： https://docs.flutter.dev/release/archive?tab=windows&lt;br /&gt;
* 2.解压缩到某个位置，如D:\flutter。&lt;br /&gt;
* 3.添加到flutter\bin到环境变量path中。搜索框输入env进入设置。&lt;br /&gt;
* 4.国内配置镜像源&lt;br /&gt;
* 5运行&amp;lt;code&amp;gt;flutter doctor&amp;lt;/code&amp;gt; 检查环境。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.flutter.dev/get-started/install/windows Flutter 文档：Windows 安装 Flutter ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== 国内配置镜像源 ====&lt;br /&gt;
&lt;br /&gt;
Window配置：&amp;lt;br /&amp;gt;&lt;br /&gt;
搜索框输入env，点击编辑系统环境变量，将PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL 和其值添加到用户变量中。&lt;br /&gt;
&lt;br /&gt;
Linux配置：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 临时配置&lt;br /&gt;
export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&lt;br /&gt;
export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 长期配置&lt;br /&gt;
echo &#039;export FLUTTER_STORAGE_BASE_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/flutter&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
echo &#039;export PUB_HOSTED_URL=&amp;quot;https://mirrors.tuna.tsinghua.edu.cn/dart-pub&amp;quot;&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
====安装后续====&lt;br /&gt;
安装完成后，可以查看版本：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看dart语言版本&lt;br /&gt;
dart --version&lt;br /&gt;
&lt;br /&gt;
# 查看flutter版本，卡住通常是因为网络问题 &lt;br /&gt;
flutter --version&lt;br /&gt;
&lt;br /&gt;
# 禁用 Google Analytics（可选）&lt;br /&gt;
flutter --disable-analytics&lt;br /&gt;
&lt;br /&gt;
# 运行 Flutter Doctor 检查环境&lt;br /&gt;
# Android SDK 是否安装&lt;br /&gt;
# Chrome/Edge 是否可用&lt;br /&gt;
# CMake、ninja等依赖项目&lt;br /&gt;
flutter doctor&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://flutter.cn/community/china Flutter 文档中文版：在中国网络环境下使用 Flutter ]&lt;br /&gt;
|[https://mirrors.tuna.tsinghua.edu.cn/help/flutter/ 清华大学开源软件镜像站：Flutter 镜像安装帮助 ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* Flutter 官网： https://flutter.dev&lt;br /&gt;
* Flutter 源代码：https://github.com/flutter/flutter&lt;br /&gt;
* Flutter 示例：https://flutter.github.io/samples&lt;br /&gt;
* Material 3 ：https://m3.material.io&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
* Flutter 文档中文版：https://flutter.cn&lt;br /&gt;
* 《Flutter实战·第二版》： https://book.flutterchina.club&lt;br /&gt;
* liujunmin.com 博客分类：https://liujunmin.com/categories/&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1781</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1781"/>
		<updated>2026-05-06T16:15:29Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 显卡直通 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==快照==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; text-align:center;&amp;quot;&lt;br /&gt;
! 对比项&lt;br /&gt;
! 内部快照&lt;br /&gt;
! 外部快照&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 存储方式&lt;br /&gt;
| 存储在原始qcow2文件的&#039;&#039;&#039;内部&#039;&#039;&#039;结构体中 || 存储为独立的&#039;&#039;&#039;qcow2快照文件&#039;&#039;&#039;（通过backing chain关联）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘格式要求&lt;br /&gt;
| 仅支持&#039;&#039;&#039;qcow2&#039;&#039;&#039;格式 || 任意QEMU支持的镜像格式（推荐qcow2）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 创建方式&lt;br /&gt;
| &amp;lt;code&amp;gt;virsh snapshot-create-as&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;（需指定&amp;lt;code&amp;gt;--disk-only&amp;lt;/code&amp;gt;和内存状态参数） || &amp;lt;code&amp;gt;virsh snapshot-create-as --disk-only --atomic&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 是否影响在线状态&lt;br /&gt;
| 影响（通常需要&#039;&#039;&#039;暂停或停机&#039;&#039;&#039;虚拟机） || &#039;&#039;&#039;不影响&#039;&#039;&#039;（在线创建&amp;lt;ref name=&amp;quot;online&amp;quot;&amp;gt;创建磁盘外部快照时虚拟机无需停机，但创建内存快照（&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;）时建议暂停。&amp;lt;/ref&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 内存状态保存&lt;br /&gt;
| 支持（保存CPU/内存/设备状态） || 支持（需单独指定&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;参数）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 回滚能力&lt;br /&gt;
| 完整回滚（磁盘+内存状态一次性恢复） || 仅支持磁盘回滚，内存状态需额外处理&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 删除操作&lt;br /&gt;
| 简单（&amp;lt;code&amp;gt;virsh snapshot-delete&amp;lt;/code&amp;gt;）&amp;lt;br&amp;gt;无需额外操作 || 复杂，Blockcommit或blockpull合并链，然后手动删除文件&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 链式快照支持&lt;br /&gt;
| 不支持（libvirt禁止内部快照嵌套） || 支持（可创建多级backing chain）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 性能开销&lt;br /&gt;
| 创建快照时较高（需遍历磁盘结构） || 创建时极低（仅创建COW文件）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘空间释放&lt;br /&gt;
| 删除快照后自动释放 || 需手动执行blockcommit合并后才释放&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 官方推荐度&lt;br /&gt;
| 不推荐 || 推荐，企业环境标准快照方案&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 使用场景&lt;br /&gt;
| 单文件测试环境&amp;lt;br&amp;gt;快速开发调试 || 生产环境备份&amp;lt;br&amp;gt;虚拟机克隆&amp;lt;br&amp;gt;持续集成环境&amp;lt;br&amp;gt;ARM/UEFI虚拟机&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 支持的架构限制&lt;br /&gt;
| 所有架构（但UEFI启动不支持内存快照） || 所有架构（ARM/aarch64环境唯一可用方案）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 最大数量限制&lt;br /&gt;
| 无硬性限制（但嵌套快照会失败） || 最多199个外部磁盘快照，实际限制取决于宿主机文件系统inode数量和qemu支持。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===内部快照===&lt;br /&gt;
&lt;br /&gt;
===外部快照===&lt;br /&gt;
&lt;br /&gt;
==备份==&lt;br /&gt;
===快照备份===&lt;br /&gt;
&lt;br /&gt;
===复制备份===&lt;br /&gt;
复制备份：&lt;br /&gt;
* 配置文件：/etc/libvirt/qemu/&amp;lt;虚拟机名&amp;gt;.xml&lt;br /&gt;
* VirtIO磁盘：/path/to/xx.qcow2&lt;br /&gt;
* 快照配置文件：/var/lib/libvirt/qemu/snapshot/&amp;lt;虚拟机名&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
恢复：&lt;br /&gt;
* 如果有配置文件，可以注册虚拟机： virsh define /path/to/你的虚拟机配置文件.xml ，修改磁盘映像qcow2位置。&lt;br /&gt;
* 没有配置文件，直接点击新建虚拟机，导入磁盘映像，修改一些其他配置。&lt;br /&gt;
===软件备份===&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==Windows VirtIO 驱动程序==&lt;br /&gt;
安装windows虚拟机，使用有点卡，可以安装Windows VirtIO 驱动程序，类似[[VMware]] Tools，还支持拖拽传文件。绝大多数现代 Linux 发行版的“内核”已经自带了完整的 VirtIO 驱动，所以当你创建 Linux 虚拟机时，只要在配置时将磁盘和网卡的类型选择为 VirtIO，系统通常就能直接识别和使用它们。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ 页面选择最新版本下载，选择一种即可：&lt;br /&gt;
*virtio-win.iso: 在宿主机上下载，挂载到虚拟机，再安装。&lt;br /&gt;
*virtio-win-gt-x64.msi：直接在虚拟机里面下载安装，仅包含核心驱动（如网卡、磁盘、内存 balloon 驱动等）&lt;br /&gt;
*virtio-win-guest-tools.exe：直接在虚拟机里面下载安装，包含核心驱动和EMU Guest Agent。&lt;br /&gt;
&lt;br /&gt;
* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;br /&gt;
* https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers&lt;br /&gt;
==显卡直通==&lt;br /&gt;
要实现KVM显卡直通，核心在于启用IOMMU、配置VFIO-PCI隔离显卡，并使用Libvirt绑定。。主要步骤包括：在GRUB中加入intel_iommu=on或amd_iommu=on，通过dracut或initramfs强制在启动初期加载VFIO驱动，将显卡的PCI ID绑定给vfio-pci，并在Virt-Manager中将显卡及音讯设备添加至虚拟机。&lt;br /&gt;
&lt;br /&gt;
以Ubuntu 26.04的集显和独显主机为例，显示器接主板显示接口上。&lt;br /&gt;
* 启用 IOMMU&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 编辑 GRUB 配置&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
&lt;br /&gt;
# 修改 GRUB_CMDLINE_LINUX_DEFAULT 行（Intel CPU 示例）：&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash intel_iommu=on iommu=pt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 更新 GRUB&lt;br /&gt;
sudo update-grub&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 配置 VFIO 隔离显卡，在 Ubuntu 26.04 以后版本中，可能需要使用 dracut 而非旧的 initramfs-tools。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查找显卡硬件ID&lt;br /&gt;
lspci -nn | grep -i nvidia&lt;br /&gt;
&lt;br /&gt;
# 创建 VFIO 配置文件&lt;br /&gt;
echo &#039;force_drivers+=&amp;quot; vfio_pci vfio vfio_iommu_type1 &amp;quot;&#039; | sudo tee /etc/dracut.conf.d/10-vfio.conf&lt;br /&gt;
echo &#039;options vfio-pci ids=10de:2d04,10de:22eb&#039; | sudo tee /etc/modprobe.d/vfio.conf&lt;br /&gt;
&lt;br /&gt;
# 更新 initramfs&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 检查是否绑定成功&lt;br /&gt;
重启动宿主机，执行 lspci -nnk | grep -A 3 &amp;quot;VGA&amp;quot;，确保显卡显示 Kernel driver in use: vfio-pci。&lt;br /&gt;
&lt;br /&gt;
* 在Virt-Manager中添加&lt;br /&gt;
打开 Virt-Manager，新建虚拟机，概况中固件选UEFI（支持新的独立显卡），选择“添加硬件” -&amp;gt; “PCI 主机设备”。选择显卡的 VGA 设备和 Audio 设备，如PCI 0000:02:00.0和0000:02:00.1。安装[[ubuntu]]系统时，勾选安装显卡驱动，系统安装好后显卡驱动也安装好了，也可以安装系统后安装显卡驱动。&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===权限问题===&lt;br /&gt;
挂载某个分区，如/run/media/xxx 通常 是由 udisks 自动挂载的，默认 ACL 只允许 xxx 用户访问，可以修改权限，或挂载到其他地方。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看分区信息，&lt;br /&gt;
sudo blkid | grep nvme1n1p4&lt;br /&gt;
lsblk -f /dev/nvme1n1p4&lt;br /&gt;
&lt;br /&gt;
# 创建专用目录用于虚拟机存储&lt;br /&gt;
sudo mkdir -p /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 卸载当前挂载&lt;br /&gt;
sudo umount /run/media/xxx/xxxx&lt;br /&gt;
# 重新挂载到新位置&lt;br /&gt;
sudo mount /dev/nvme1n1p4 /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 设置正确的所有者和权限&lt;br /&gt;
sudo chown libvirt-qemu:kvm /var/lib/libvirt/kvm-storage&lt;br /&gt;
sudo chmod 755 /var/lib/libvirt/kvm-storage&lt;br /&gt;
&lt;br /&gt;
#设置开机自动挂载（可选）&lt;br /&gt;
# 获取分区的 UUID&lt;br /&gt;
sudo blkid /dev/nvme1n1p4&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# fstab中添加类似这样的行（用实际的 UUID 替换）&lt;br /&gt;
/dev/disk/by-uuid/xxxx / ext4 defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1780</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1780"/>
		<updated>2026-05-06T16:13:44Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==快照==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; text-align:center;&amp;quot;&lt;br /&gt;
! 对比项&lt;br /&gt;
! 内部快照&lt;br /&gt;
! 外部快照&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 存储方式&lt;br /&gt;
| 存储在原始qcow2文件的&#039;&#039;&#039;内部&#039;&#039;&#039;结构体中 || 存储为独立的&#039;&#039;&#039;qcow2快照文件&#039;&#039;&#039;（通过backing chain关联）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘格式要求&lt;br /&gt;
| 仅支持&#039;&#039;&#039;qcow2&#039;&#039;&#039;格式 || 任意QEMU支持的镜像格式（推荐qcow2）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 创建方式&lt;br /&gt;
| &amp;lt;code&amp;gt;virsh snapshot-create-as&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;（需指定&amp;lt;code&amp;gt;--disk-only&amp;lt;/code&amp;gt;和内存状态参数） || &amp;lt;code&amp;gt;virsh snapshot-create-as --disk-only --atomic&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 是否影响在线状态&lt;br /&gt;
| 影响（通常需要&#039;&#039;&#039;暂停或停机&#039;&#039;&#039;虚拟机） || &#039;&#039;&#039;不影响&#039;&#039;&#039;（在线创建&amp;lt;ref name=&amp;quot;online&amp;quot;&amp;gt;创建磁盘外部快照时虚拟机无需停机，但创建内存快照（&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;）时建议暂停。&amp;lt;/ref&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 内存状态保存&lt;br /&gt;
| 支持（保存CPU/内存/设备状态） || 支持（需单独指定&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;参数）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 回滚能力&lt;br /&gt;
| 完整回滚（磁盘+内存状态一次性恢复） || 仅支持磁盘回滚，内存状态需额外处理&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 删除操作&lt;br /&gt;
| 简单（&amp;lt;code&amp;gt;virsh snapshot-delete&amp;lt;/code&amp;gt;）&amp;lt;br&amp;gt;无需额外操作 || 复杂，Blockcommit或blockpull合并链，然后手动删除文件&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 链式快照支持&lt;br /&gt;
| 不支持（libvirt禁止内部快照嵌套） || 支持（可创建多级backing chain）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 性能开销&lt;br /&gt;
| 创建快照时较高（需遍历磁盘结构） || 创建时极低（仅创建COW文件）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘空间释放&lt;br /&gt;
| 删除快照后自动释放 || 需手动执行blockcommit合并后才释放&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 官方推荐度&lt;br /&gt;
| 不推荐 || 推荐，企业环境标准快照方案&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 使用场景&lt;br /&gt;
| 单文件测试环境&amp;lt;br&amp;gt;快速开发调试 || 生产环境备份&amp;lt;br&amp;gt;虚拟机克隆&amp;lt;br&amp;gt;持续集成环境&amp;lt;br&amp;gt;ARM/UEFI虚拟机&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 支持的架构限制&lt;br /&gt;
| 所有架构（但UEFI启动不支持内存快照） || 所有架构（ARM/aarch64环境唯一可用方案）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 最大数量限制&lt;br /&gt;
| 无硬性限制（但嵌套快照会失败） || 最多199个外部磁盘快照，实际限制取决于宿主机文件系统inode数量和qemu支持。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===内部快照===&lt;br /&gt;
&lt;br /&gt;
===外部快照===&lt;br /&gt;
&lt;br /&gt;
==备份==&lt;br /&gt;
===快照备份===&lt;br /&gt;
&lt;br /&gt;
===复制备份===&lt;br /&gt;
复制备份：&lt;br /&gt;
* 配置文件：/etc/libvirt/qemu/&amp;lt;虚拟机名&amp;gt;.xml&lt;br /&gt;
* VirtIO磁盘：/path/to/xx.qcow2&lt;br /&gt;
* 快照配置文件：/var/lib/libvirt/qemu/snapshot/&amp;lt;虚拟机名&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
恢复：&lt;br /&gt;
* 如果有配置文件，可以注册虚拟机： virsh define /path/to/你的虚拟机配置文件.xml ，修改磁盘映像qcow2位置。&lt;br /&gt;
* 没有配置文件，直接点击新建虚拟机，导入磁盘映像，修改一些其他配置。&lt;br /&gt;
===软件备份===&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==Windows VirtIO 驱动程序==&lt;br /&gt;
安装windows虚拟机，使用有点卡，可以安装Windows VirtIO 驱动程序，类似[[VMware]] Tools，还支持拖拽传文件。绝大多数现代 Linux 发行版的“内核”已经自带了完整的 VirtIO 驱动，所以当你创建 Linux 虚拟机时，只要在配置时将磁盘和网卡的类型选择为 VirtIO，系统通常就能直接识别和使用它们。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ 页面选择最新版本下载，选择一种即可：&lt;br /&gt;
*virtio-win.iso: 在宿主机上下载，挂载到虚拟机，再安装。&lt;br /&gt;
*virtio-win-gt-x64.msi：直接在虚拟机里面下载安装，仅包含核心驱动（如网卡、磁盘、内存 balloon 驱动等）&lt;br /&gt;
*virtio-win-guest-tools.exe：直接在虚拟机里面下载安装，包含核心驱动和EMU Guest Agent。&lt;br /&gt;
&lt;br /&gt;
* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;br /&gt;
* https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers&lt;br /&gt;
==显卡直通==&lt;br /&gt;
要实现KVM显卡直通，核心在于启用IOMMU、配置VFIO-PCI隔离显卡，并使用Libvirt绑定。。主要步骤包括：在GRUB中加入intel_iommu=on或amd_iommu=on，通过dracut或initramfs强制在启动初期加载VFIO驱动，将显卡的PCI ID绑定给vfio-pci，并在Virt-Manager中将显卡及音讯设备添加至虚拟机。&lt;br /&gt;
&lt;br /&gt;
以Ubuntu 26.04的集显和独显主机为例，显示器接主板显示接口上。&lt;br /&gt;
* 启用 IOMMU&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 编辑 GRUB 配置&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
&lt;br /&gt;
# 修改 GRUB_CMDLINE_LINUX_DEFAULT 行（Intel CPU 示例）：&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash intel_iommu=on iommu=pt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 更新 GRUB&lt;br /&gt;
sudo update-grub&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 配置 VFIO 隔离显卡，在 Ubuntu 26.04 以后版本中，可能需要使用 dracut 而非旧的 initramfs-tools。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查找显卡硬件ID&lt;br /&gt;
lspci -nns | grep NVIDIA&lt;br /&gt;
&lt;br /&gt;
# 创建 VFIO 配置文件&lt;br /&gt;
echo &#039;force_drivers+=&amp;quot; vfio_pci vfio vfio_iommu_type1 &amp;quot;&#039; | sudo tee /etc/dracut.conf.d/10-vfio.conf&lt;br /&gt;
echo &#039;options vfio-pci ids=10de:2d04,10de:22eb&#039; | sudo tee /etc/modprobe.d/vfio.conf&lt;br /&gt;
&lt;br /&gt;
# 更新 initramfs&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 检查是否绑定成功&lt;br /&gt;
重启动宿主机，执行 lspci -nnk | grep -A 3 &amp;quot;VGA&amp;quot;，确保显卡显示 Kernel driver in use: vfio-pci。&lt;br /&gt;
&lt;br /&gt;
* 在Virt-Manager中添加&lt;br /&gt;
打开 Virt-Manager，新建虚拟机，概况中固件选UEFI（支持新的独立显卡），选择“添加硬件” -&amp;gt; “PCI 主机设备”。选择显卡的 VGA 设备和 Audio 设备，如PCI 0000:02:00.0和0000:02:00.1。安装[[ubuntu]]系统时，勾选安装显卡驱动，系统安装好后显卡驱动也安装好了，也可以安装系统后安装显卡驱动。&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===权限问题===&lt;br /&gt;
挂载某个分区，如/run/media/xxx 通常 是由 udisks 自动挂载的，默认 ACL 只允许 xxx 用户访问，可以修改权限，或挂载到其他地方。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看分区信息，&lt;br /&gt;
sudo blkid | grep nvme1n1p4&lt;br /&gt;
lsblk -f /dev/nvme1n1p4&lt;br /&gt;
&lt;br /&gt;
# 创建专用目录用于虚拟机存储&lt;br /&gt;
sudo mkdir -p /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 卸载当前挂载&lt;br /&gt;
sudo umount /run/media/xxx/xxxx&lt;br /&gt;
# 重新挂载到新位置&lt;br /&gt;
sudo mount /dev/nvme1n1p4 /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 设置正确的所有者和权限&lt;br /&gt;
sudo chown libvirt-qemu:kvm /var/lib/libvirt/kvm-storage&lt;br /&gt;
sudo chmod 755 /var/lib/libvirt/kvm-storage&lt;br /&gt;
&lt;br /&gt;
#设置开机自动挂载（可选）&lt;br /&gt;
# 获取分区的 UUID&lt;br /&gt;
sudo blkid /dev/nvme1n1p4&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# fstab中添加类似这样的行（用实际的 UUID 替换）&lt;br /&gt;
/dev/disk/by-uuid/xxxx / ext4 defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1779</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1779"/>
		<updated>2026-05-06T15:55:43Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 显卡直通 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==快照==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; text-align:center;&amp;quot;&lt;br /&gt;
! 对比项&lt;br /&gt;
! 内部快照&lt;br /&gt;
! 外部快照&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 存储方式&lt;br /&gt;
| 存储在原始qcow2文件的&#039;&#039;&#039;内部&#039;&#039;&#039;结构体中 || 存储为独立的&#039;&#039;&#039;qcow2快照文件&#039;&#039;&#039;（通过backing chain关联）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘格式要求&lt;br /&gt;
| 仅支持&#039;&#039;&#039;qcow2&#039;&#039;&#039;格式 || 任意QEMU支持的镜像格式（推荐qcow2）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 创建方式&lt;br /&gt;
| &amp;lt;code&amp;gt;virsh snapshot-create-as&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;（需指定&amp;lt;code&amp;gt;--disk-only&amp;lt;/code&amp;gt;和内存状态参数） || &amp;lt;code&amp;gt;virsh snapshot-create-as --disk-only --atomic&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 是否影响在线状态&lt;br /&gt;
| 影响（通常需要&#039;&#039;&#039;暂停或停机&#039;&#039;&#039;虚拟机） || &#039;&#039;&#039;不影响&#039;&#039;&#039;（在线创建&amp;lt;ref name=&amp;quot;online&amp;quot;&amp;gt;创建磁盘外部快照时虚拟机无需停机，但创建内存快照（&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;）时建议暂停。&amp;lt;/ref&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 内存状态保存&lt;br /&gt;
| 支持（保存CPU/内存/设备状态） || 支持（需单独指定&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;参数）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 回滚能力&lt;br /&gt;
| 完整回滚（磁盘+内存状态一次性恢复） || 仅支持磁盘回滚，内存状态需额外处理&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 删除操作&lt;br /&gt;
| 简单（&amp;lt;code&amp;gt;virsh snapshot-delete&amp;lt;/code&amp;gt;）&amp;lt;br&amp;gt;无需额外操作 || 复杂，Blockcommit或blockpull合并链，然后手动删除文件&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 链式快照支持&lt;br /&gt;
| 不支持（libvirt禁止内部快照嵌套） || 支持（可创建多级backing chain）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 性能开销&lt;br /&gt;
| 创建快照时较高（需遍历磁盘结构） || 创建时极低（仅创建COW文件）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘空间释放&lt;br /&gt;
| 删除快照后自动释放 || 需手动执行blockcommit合并后才释放&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 官方推荐度&lt;br /&gt;
| 不推荐 || 推荐，企业环境标准快照方案&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 使用场景&lt;br /&gt;
| 单文件测试环境&amp;lt;br&amp;gt;快速开发调试 || 生产环境备份&amp;lt;br&amp;gt;虚拟机克隆&amp;lt;br&amp;gt;持续集成环境&amp;lt;br&amp;gt;ARM/UEFI虚拟机&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 支持的架构限制&lt;br /&gt;
| 所有架构（但UEFI启动不支持内存快照） || 所有架构（ARM/aarch64环境唯一可用方案）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 最大数量限制&lt;br /&gt;
| 无硬性限制（但嵌套快照会失败） || 最多199个外部磁盘快照，实际限制取决于宿主机文件系统inode数量和qemu支持。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===内部快照===&lt;br /&gt;
&lt;br /&gt;
===外部快照===&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==Windows VirtIO 驱动程序==&lt;br /&gt;
安装windows虚拟机，使用有点卡，可以安装Windows VirtIO 驱动程序，类似[[VMware]] Tools，还支持拖拽传文件。绝大多数现代 Linux 发行版的“内核”已经自带了完整的 VirtIO 驱动，所以当你创建 Linux 虚拟机时，只要在配置时将磁盘和网卡的类型选择为 VirtIO，系统通常就能直接识别和使用它们。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ 页面选择最新版本下载，选择一种即可：&lt;br /&gt;
*virtio-win.iso: 在宿主机上下载，挂载到虚拟机，再安装。&lt;br /&gt;
*virtio-win-gt-x64.msi：直接在虚拟机里面下载安装，仅包含核心驱动（如网卡、磁盘、内存 balloon 驱动等）&lt;br /&gt;
*virtio-win-guest-tools.exe：直接在虚拟机里面下载安装，包含核心驱动和EMU Guest Agent。&lt;br /&gt;
&lt;br /&gt;
* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;br /&gt;
* https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers&lt;br /&gt;
==显卡直通==&lt;br /&gt;
要实现KVM显卡直通，核心在于启用IOMMU、配置VFIO-PCI隔离显卡，并使用Libvirt绑定。。主要步骤包括：在GRUB中加入intel_iommu=on或amd_iommu=on，通过dracut或initramfs强制在启动初期加载VFIO驱动，将显卡的PCI ID绑定给vfio-pci，并在Virt-Manager中将显卡及音讯设备添加至虚拟机。&lt;br /&gt;
&lt;br /&gt;
以Ubuntu 26.04的集显和独显主机为例，显示器接主板显示接口上。&lt;br /&gt;
* 启用 IOMMU&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 编辑 GRUB 配置&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
&lt;br /&gt;
# 修改 GRUB_CMDLINE_LINUX_DEFAULT 行（Intel CPU 示例）：&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash intel_iommu=on iommu=pt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 更新 GRUB&lt;br /&gt;
sudo update-grub&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 配置 VFIO 隔离显卡，在 Ubuntu 26.04 以后版本中，可能需要使用 dracut 而非旧的 initramfs-tools。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查找显卡硬件ID&lt;br /&gt;
lspci -nns | grep NVIDIA&lt;br /&gt;
&lt;br /&gt;
# 创建 VFIO 配置文件&lt;br /&gt;
echo &#039;force_drivers+=&amp;quot; vfio_pci vfio vfio_iommu_type1 &amp;quot;&#039; | sudo tee /etc/dracut.conf.d/10-vfio.conf&lt;br /&gt;
echo &#039;options vfio-pci ids=10de:2d04,10de:22eb&#039; | sudo tee /etc/modprobe.d/vfio.conf&lt;br /&gt;
&lt;br /&gt;
# 更新 initramfs&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 检查是否绑定成功&lt;br /&gt;
重启动宿主机，执行 lspci -nnk | grep -A 3 &amp;quot;VGA&amp;quot;，确保显卡显示 Kernel driver in use: vfio-pci。&lt;br /&gt;
&lt;br /&gt;
* 在Virt-Manager中添加&lt;br /&gt;
打开 Virt-Manager，新建虚拟机，概况中固件选UEFI（支持新的独立显卡），选择“添加硬件” -&amp;gt; “PCI 主机设备”。选择显卡的 VGA 设备和 Audio 设备，如PCI 0000:02:00.0和0000:02:00.1。安装[[ubuntu]]系统时，勾选安装显卡驱动，系统安装好后显卡驱动也安装好了，也可以安装系统后安装显卡驱动。&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===权限问题===&lt;br /&gt;
挂载某个分区，如/run/media/xxx 通常 是由 udisks 自动挂载的，默认 ACL 只允许 xxx 用户访问，可以修改权限，或挂载到其他地方。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看分区信息，&lt;br /&gt;
sudo blkid | grep nvme1n1p4&lt;br /&gt;
lsblk -f /dev/nvme1n1p4&lt;br /&gt;
&lt;br /&gt;
# 创建专用目录用于虚拟机存储&lt;br /&gt;
sudo mkdir -p /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 卸载当前挂载&lt;br /&gt;
sudo umount /run/media/xxx/xxxx&lt;br /&gt;
# 重新挂载到新位置&lt;br /&gt;
sudo mount /dev/nvme1n1p4 /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 设置正确的所有者和权限&lt;br /&gt;
sudo chown libvirt-qemu:kvm /var/lib/libvirt/kvm-storage&lt;br /&gt;
sudo chmod 755 /var/lib/libvirt/kvm-storage&lt;br /&gt;
&lt;br /&gt;
#设置开机自动挂载（可选）&lt;br /&gt;
# 获取分区的 UUID&lt;br /&gt;
sudo blkid /dev/nvme1n1p4&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# fstab中添加类似这样的行（用实际的 UUID 替换）&lt;br /&gt;
/dev/disk/by-uuid/xxxx / ext4 defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1778</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1778"/>
		<updated>2026-05-06T11:51:42Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==快照==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; text-align:center;&amp;quot;&lt;br /&gt;
! 对比项&lt;br /&gt;
! 内部快照&lt;br /&gt;
! 外部快照&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 存储方式&lt;br /&gt;
| 存储在原始qcow2文件的&#039;&#039;&#039;内部&#039;&#039;&#039;结构体中 || 存储为独立的&#039;&#039;&#039;qcow2快照文件&#039;&#039;&#039;（通过backing chain关联）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘格式要求&lt;br /&gt;
| 仅支持&#039;&#039;&#039;qcow2&#039;&#039;&#039;格式 || 任意QEMU支持的镜像格式（推荐qcow2）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 创建方式&lt;br /&gt;
| &amp;lt;code&amp;gt;virsh snapshot-create-as&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;（需指定&amp;lt;code&amp;gt;--disk-only&amp;lt;/code&amp;gt;和内存状态参数） || &amp;lt;code&amp;gt;virsh snapshot-create-as --disk-only --atomic&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 是否影响在线状态&lt;br /&gt;
| 影响（通常需要&#039;&#039;&#039;暂停或停机&#039;&#039;&#039;虚拟机） || &#039;&#039;&#039;不影响&#039;&#039;&#039;（在线创建&amp;lt;ref name=&amp;quot;online&amp;quot;&amp;gt;创建磁盘外部快照时虚拟机无需停机，但创建内存快照（&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;）时建议暂停。&amp;lt;/ref&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 内存状态保存&lt;br /&gt;
| 支持（保存CPU/内存/设备状态） || 支持（需单独指定&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;参数）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 回滚能力&lt;br /&gt;
| 完整回滚（磁盘+内存状态一次性恢复） || 仅支持磁盘回滚，内存状态需额外处理&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 删除操作&lt;br /&gt;
| 简单（&amp;lt;code&amp;gt;virsh snapshot-delete&amp;lt;/code&amp;gt;）&amp;lt;br&amp;gt;无需额外操作 || 复杂，Blockcommit或blockpull合并链，然后手动删除文件&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 链式快照支持&lt;br /&gt;
| 不支持（libvirt禁止内部快照嵌套） || 支持（可创建多级backing chain）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 性能开销&lt;br /&gt;
| 创建快照时较高（需遍历磁盘结构） || 创建时极低（仅创建COW文件）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘空间释放&lt;br /&gt;
| 删除快照后自动释放 || 需手动执行blockcommit合并后才释放&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 官方推荐度&lt;br /&gt;
| 不推荐 || 推荐，企业环境标准快照方案&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 使用场景&lt;br /&gt;
| 单文件测试环境&amp;lt;br&amp;gt;快速开发调试 || 生产环境备份&amp;lt;br&amp;gt;虚拟机克隆&amp;lt;br&amp;gt;持续集成环境&amp;lt;br&amp;gt;ARM/UEFI虚拟机&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 支持的架构限制&lt;br /&gt;
| 所有架构（但UEFI启动不支持内存快照） || 所有架构（ARM/aarch64环境唯一可用方案）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 最大数量限制&lt;br /&gt;
| 无硬性限制（但嵌套快照会失败） || 最多199个外部磁盘快照，实际限制取决于宿主机文件系统inode数量和qemu支持。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===内部快照===&lt;br /&gt;
&lt;br /&gt;
===外部快照===&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==Windows VirtIO 驱动程序==&lt;br /&gt;
安装windows虚拟机，使用有点卡，可以安装Windows VirtIO 驱动程序，类似[[VMware]] Tools，还支持拖拽传文件。绝大多数现代 Linux 发行版的“内核”已经自带了完整的 VirtIO 驱动，所以当你创建 Linux 虚拟机时，只要在配置时将磁盘和网卡的类型选择为 VirtIO，系统通常就能直接识别和使用它们。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ 页面选择最新版本下载，选择一种即可：&lt;br /&gt;
*virtio-win.iso: 在宿主机上下载，挂载到虚拟机，再安装。&lt;br /&gt;
*virtio-win-gt-x64.msi：直接在虚拟机里面下载安装，仅包含核心驱动（如网卡、磁盘、内存 balloon 驱动等）&lt;br /&gt;
*virtio-win-guest-tools.exe：直接在虚拟机里面下载安装，包含核心驱动和EMU Guest Agent。&lt;br /&gt;
&lt;br /&gt;
* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;br /&gt;
* https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers&lt;br /&gt;
==显卡直通==&lt;br /&gt;
要实现KVM显卡直通，核心在于启用IOMMU、配置VFIO-PCI隔离显卡，并使用Libvirt绑定。。主要步骤包括：在GRUB中加入intel_iommu=on或amd_iommu=on，通过dracut或initramfs强制在启动初期加载VFIO驱动，将显卡的PCI ID绑定给vfio-pci，并在Virt-Manager中将显卡及音讯设备添加至虚拟机。&lt;br /&gt;
&lt;br /&gt;
以Ubuntu 26.04的集显和独显主机为例，显示器接主板显示接口上。&lt;br /&gt;
* 启用 IOMMU&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 编辑 GRUB 配置&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
&lt;br /&gt;
# 修改 GRUB_CMDLINE_LINUX_DEFAULT 行（Intel CPU 示例）：&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash intel_iommu=on iommu=pt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 更新 GRUB&lt;br /&gt;
sudo update-grub&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 配置 VFIO 隔离显卡，在 Ubuntu 26.04 以后版本中，可能需要使用 dracut 而非旧的 initramfs-tools。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查找显卡硬件ID&lt;br /&gt;
lspci -nns | grep NVIDIA&lt;br /&gt;
&lt;br /&gt;
# 创建 VFIO 配置文件&lt;br /&gt;
echo &#039;force_drivers+=&amp;quot; vfio_pci vfio vfio_iommu_type1 &amp;quot;&#039; | sudo tee /etc/dracut.conf.d/10-vfio.conf&lt;br /&gt;
echo &#039;options vfio-pci ids=10de:2d04,10de:22eb&#039; | sudo tee /etc/modprobe.d/vfio.conf&lt;br /&gt;
&lt;br /&gt;
# 更新 initramfs&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* 检查是否绑定成功&lt;br /&gt;
重启动宿主机，执行 lspci -nnk | grep -A 3 &amp;quot;VGA&amp;quot;，确保显卡显示 Kernel driver in use: vfio-pci。&lt;br /&gt;
&lt;br /&gt;
* 在Virt-Manager中添加&lt;br /&gt;
打开 Virt-Manager，在虚拟机的硬件配置中，选择“添加硬件” -&amp;gt; “PCI 主机设备”。选择显卡的 VGA 设备和 Audio 设备。确保虚拟机配置了 UEFI (OVMF)。&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===权限问题===&lt;br /&gt;
挂载某个分区，如/run/media/xxx 通常 是由 udisks 自动挂载的，默认 ACL 只允许 xxx 用户访问，可以修改权限，或挂载到其他地方。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看分区信息，&lt;br /&gt;
sudo blkid | grep nvme1n1p4&lt;br /&gt;
lsblk -f /dev/nvme1n1p4&lt;br /&gt;
&lt;br /&gt;
# 创建专用目录用于虚拟机存储&lt;br /&gt;
sudo mkdir -p /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 卸载当前挂载&lt;br /&gt;
sudo umount /run/media/xxx/xxxx&lt;br /&gt;
# 重新挂载到新位置&lt;br /&gt;
sudo mount /dev/nvme1n1p4 /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 设置正确的所有者和权限&lt;br /&gt;
sudo chown libvirt-qemu:kvm /var/lib/libvirt/kvm-storage&lt;br /&gt;
sudo chmod 755 /var/lib/libvirt/kvm-storage&lt;br /&gt;
&lt;br /&gt;
#设置开机自动挂载（可选）&lt;br /&gt;
# 获取分区的 UUID&lt;br /&gt;
sudo blkid /dev/nvme1n1p4&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# fstab中添加类似这样的行（用实际的 UUID 替换）&lt;br /&gt;
/dev/disk/by-uuid/xxxx / ext4 defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1777</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1777"/>
		<updated>2026-05-06T02:43:58Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==快照==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; text-align:center;&amp;quot;&lt;br /&gt;
! 对比项&lt;br /&gt;
! 内部快照&lt;br /&gt;
! 外部快照&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 存储方式&lt;br /&gt;
| 存储在原始qcow2文件的&#039;&#039;&#039;内部&#039;&#039;&#039;结构体中 || 存储为独立的&#039;&#039;&#039;qcow2快照文件&#039;&#039;&#039;（通过backing chain关联）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘格式要求&lt;br /&gt;
| 仅支持&#039;&#039;&#039;qcow2&#039;&#039;&#039;格式 || 任意QEMU支持的镜像格式（推荐qcow2）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 创建方式&lt;br /&gt;
| &amp;lt;code&amp;gt;virsh snapshot-create-as&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;（需指定&amp;lt;code&amp;gt;--disk-only&amp;lt;/code&amp;gt;和内存状态参数） || &amp;lt;code&amp;gt;virsh snapshot-create-as --disk-only --atomic&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 是否影响在线状态&lt;br /&gt;
| 影响（通常需要&#039;&#039;&#039;暂停或停机&#039;&#039;&#039;虚拟机） || &#039;&#039;&#039;不影响&#039;&#039;&#039;（在线创建&amp;lt;ref name=&amp;quot;online&amp;quot;&amp;gt;创建磁盘外部快照时虚拟机无需停机，但创建内存快照（&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;）时建议暂停。&amp;lt;/ref&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 内存状态保存&lt;br /&gt;
| 支持（保存CPU/内存/设备状态） || 支持（需单独指定&amp;lt;code&amp;gt;--memspec&amp;lt;/code&amp;gt;参数）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 回滚能力&lt;br /&gt;
| 完整回滚（磁盘+内存状态一次性恢复） || 仅支持磁盘回滚，内存状态需额外处理&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 删除操作&lt;br /&gt;
| 简单（&amp;lt;code&amp;gt;virsh snapshot-delete&amp;lt;/code&amp;gt;）&amp;lt;br&amp;gt;无需额外操作 || 复杂，Blockcommit或blockpull合并链，然后手动删除文件&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 链式快照支持&lt;br /&gt;
| 不支持（libvirt禁止内部快照嵌套） || 支持（可创建多级backing chain）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 性能开销&lt;br /&gt;
| 创建快照时较高（需遍历磁盘结构） || 创建时极低（仅创建COW文件）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 磁盘空间释放&lt;br /&gt;
| 删除快照后自动释放 || 需手动执行blockcommit合并后才释放&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 官方推荐度&lt;br /&gt;
| 不推荐 || 推荐，企业环境标准快照方案&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 使用场景&lt;br /&gt;
| 单文件测试环境&amp;lt;br&amp;gt;快速开发调试 || 生产环境备份&amp;lt;br&amp;gt;虚拟机克隆&amp;lt;br&amp;gt;持续集成环境&amp;lt;br&amp;gt;ARM/UEFI虚拟机&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 支持的架构限制&lt;br /&gt;
| 所有架构（但UEFI启动不支持内存快照） || 所有架构（ARM/aarch64环境唯一可用方案）&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! 最大数量限制&lt;br /&gt;
| 无硬性限制（但嵌套快照会失败） || 最多199个外部磁盘快照，实际限制取决于宿主机文件系统inode数量和qemu支持。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===内部快照===&lt;br /&gt;
&lt;br /&gt;
===外部快照===&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==Windows VirtIO 驱动程序==&lt;br /&gt;
安装windows虚拟机，使用有点卡，可以安装Windows VirtIO 驱动程序，类似[[VMware]] Tools，还支持拖拽传文件。绝大多数现代 Linux 发行版的“内核”已经自带了完整的 VirtIO 驱动，所以当你创建 Linux 虚拟机时，只要在配置时将磁盘和网卡的类型选择为 VirtIO，系统通常就能直接识别和使用它们。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ 页面选择最新版本下载，选择一种即可：&lt;br /&gt;
*virtio-win.iso: 在宿主机上下载，挂载到虚拟机，再安装。&lt;br /&gt;
*virtio-win-gt-x64.msi：直接在虚拟机里面下载安装，仅包含核心驱动（如网卡、磁盘、内存 balloon 驱动等）&lt;br /&gt;
*virtio-win-guest-tools.exe：直接在虚拟机里面下载安装，包含核心驱动和EMU Guest Agent。&lt;br /&gt;
&lt;br /&gt;
* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;br /&gt;
* https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===权限问题===&lt;br /&gt;
挂载某个分区，如/run/media/xxx 通常 是由 udisks 自动挂载的，默认 ACL 只允许 xxx 用户访问，可以修改权限，或挂载到其他地方。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看分区信息，&lt;br /&gt;
sudo blkid | grep nvme1n1p4&lt;br /&gt;
lsblk -f /dev/nvme1n1p4&lt;br /&gt;
&lt;br /&gt;
# 创建专用目录用于虚拟机存储&lt;br /&gt;
sudo mkdir -p /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 卸载当前挂载&lt;br /&gt;
sudo umount /run/media/xxx/xxxx&lt;br /&gt;
# 重新挂载到新位置&lt;br /&gt;
sudo mount /dev/nvme1n1p4 /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 设置正确的所有者和权限&lt;br /&gt;
sudo chown libvirt-qemu:kvm /var/lib/libvirt/kvm-storage&lt;br /&gt;
sudo chmod 755 /var/lib/libvirt/kvm-storage&lt;br /&gt;
&lt;br /&gt;
#设置开机自动挂载（可选）&lt;br /&gt;
# 获取分区的 UUID&lt;br /&gt;
sudo blkid /dev/nvme1n1p4&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# fstab中添加类似这样的行（用实际的 UUID 替换）&lt;br /&gt;
/dev/disk/by-uuid/xxxx / ext4 defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Ubuntu&amp;diff=1776</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Ubuntu&amp;diff=1776"/>
		<updated>2026-05-05T13:08:07Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 启动慢 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ubuntu是一个[[Linux]]的发行版，由Canonical公司发布并提供商业支持。Ubuntu项目公开承诺开源软件开发的原则；鼓励人们使用自由软件，研究它的运作原理，改进和分发。Ubuntu是著名的[[Linux]]发行版之一，基于[[Debian]]发行版和GNOME桌面环境。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2004年10月20日，马克·舍特尔沃斯创立并发布Ubuntu第一个版本Ubuntu 4.10，它以Debian为开发蓝本。 &lt;br /&gt;
*2005年7月8日，马克·舍特尔沃斯与Canonical有限公司宣布成立Ubuntu基金会，并提供1千万美元作为启始营运资金。但直至2006年，此基金会仍未投入运作。马克·舍特尔沃斯形容此基金会是在Canonical有限公司出现财务危机时的紧急营运资金。&lt;br /&gt;
&lt;br /&gt;
===版本===&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====制作启动U盘====&lt;br /&gt;
Ubuntu官网下载ISO镜像。&lt;br /&gt;
&lt;br /&gt;
linux中制作启动U盘：&lt;br /&gt;
方法一：使用dd命令，一定要注意看清楚哪个盘，不然可能格式化错盘。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 插入u盘，查看所有块设备：&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd命令写入ISO到U盘，如u盘为sdx：&lt;br /&gt;
sudo dd if=/path/to/ubuntu.iso of=/dev/sdx bs=4M status=progress&lt;br /&gt;
&lt;br /&gt;
# 安全移除U盘&lt;br /&gt;
sudo eject /dev/sdx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
windows中制作启动U盘：&lt;br /&gt;
方法一，Ubuntu官方教程使用[[Rufus]]软件制作启动U盘，下面使用[[UltraISO]]软件制作启动U盘，只是写启动盘可以用试用版。&lt;br /&gt;
*打开UltraISO，选择下载好的Ubuntu系统&lt;br /&gt;
*点击菜单栏‘启动’》‘写入硬盘映像’&lt;br /&gt;
*在对话框的‘硬盘驱动器’处选择要刻录的U盘&lt;br /&gt;
*然后点击‘写入’，注意U盘会被格式化所有资料都没有&lt;br /&gt;
*启动U盘制作完成，可以用它在任何电脑安装Ubuntu&lt;br /&gt;
&lt;br /&gt;
方法二，也可以使用&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;xcopy&amp;lt;/code&amp;gt;命令行制作ubuntu的启动U盘，在如下：&lt;br /&gt;
* 搜索框输入&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;，打开命令提示符。 &lt;br /&gt;
* 在cmd中输入&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt; ， 打开磁盘管理。&lt;br /&gt;
* &amp;lt;code&amp;gt;list disk&amp;lt;/code&amp;gt;，查看所有磁盘信息。&lt;br /&gt;
* &amp;lt;code&amp;gt;select disk 2&amp;lt;/code&amp;gt;，选择U盘，示例U盘为disk 2。&lt;br /&gt;
* &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;，清除U盘。&lt;br /&gt;
* &amp;lt;code&amp;gt;create partition primary&amp;lt;/code&amp;gt;，创建分区。&lt;br /&gt;
* &amp;lt;code&amp;gt;select partition 1&amp;lt;/code&amp;gt;，选择分区1。&lt;br /&gt;
* &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;，将当前分区标记为活动。&lt;br /&gt;
* &amp;lt;code&amp;gt;format fs=ntfs quick&amp;lt;/code&amp;gt;，格式化分区为ntfs格式。&lt;br /&gt;
* &amp;lt;code&amp;gt;assign&amp;lt;/code&amp;gt;，分配盘符。&lt;br /&gt;
* &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;，退出。&lt;br /&gt;
* 选择下载好的iso文件，右键点击装载。查看装载后的盘符，如&amp;lt;code&amp;gt;G：&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;xcopy G:\*.* /e /h /f H:\&amp;lt;/code&amp;gt;，复制所有文件到U盘。其中&amp;lt;code&amp;gt;H:&amp;lt;/code&amp;gt;为U盘的盘符。&amp;lt;code&amp;gt;/e&amp;lt;/code&amp;gt;复制所有子目录，即使它们是空的。&amp;lt;code&amp;gt;/h&amp;lt;/code&amp;gt;复制具有隐藏文件和系统文件属性的文件。 &amp;lt;code&amp;gt;/f&amp;lt;/code&amp;gt;复制时显示源文件名和目标文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-windows#1-overview Ubuntu 教程：Windows上制作启动U盘]&lt;br /&gt;
|[https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/xcopy Windows Server文档：xcopy]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====安装到电脑====&lt;br /&gt;
&lt;br /&gt;
====安装到U盘====&lt;br /&gt;
&lt;br /&gt;
====分区方案====&lt;br /&gt;
{{Linux分区方案}}&lt;br /&gt;
==技巧==&lt;br /&gt;
*创建某个目录在桌面快捷方式&lt;br /&gt;
点击某个目录，按住Ctrl + Shift，拖动到桌面目录(文件打开)里，注意不能直接拖动到桌面。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
===软件安装===&lt;br /&gt;
====apt====&lt;br /&gt;
&lt;br /&gt;
====deb====&lt;br /&gt;
&lt;br /&gt;
====AppImage====&lt;br /&gt;
是Linux上的一种应用打包格式，将程序所有文件打包成一个AppImage，可以在不同Linux发行版上运行。直接运行，不需要安装运行库。&lt;br /&gt;
&lt;br /&gt;
运行AppImage格式程序&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
#  进入AppImage 文件所在目录，为文件添加可执行权限&lt;br /&gt;
cd /path/to/directory&lt;br /&gt;
chmod +x example.AppImage&lt;br /&gt;
&lt;br /&gt;
# 直接运行文件&lt;br /&gt;
./example.AppImage&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===快捷方式===&lt;br /&gt;
应用程序和桌面创建快捷方式。.desktop 文件是 Linux 桌面环境中用于定义应用程序启动器、菜单项或快捷方式的配置文件。常用文件内容如下：&lt;br /&gt;
*Name：应用程序的显示名称（必填）。&lt;br /&gt;
*Exec：启动应用程序的命令（必填），路径使用绝对路径。&lt;br /&gt;
*Type：定义文件类型，常见值：Application：应用程序，Link：快捷方式，Directory：目录&lt;br /&gt;
*Icon：Ubuntu支持的图标格式包括 PNG、SVG、XPM。注意路径最后面不要有空格，否则图标不会显示。图标可以在提取文件里找&amp;lt;code&amp;gt;./example.AppImage --appimage-extract&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 创建 .desktop 文件&lt;br /&gt;
vim ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 编辑 .desktop 文件内容&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Example App&lt;br /&gt;
Exec=/path/to/example.AppImage&lt;br /&gt;
Type=Application&lt;br /&gt;
Terminal=false&lt;br /&gt;
Icon=/path/to/icon.png&lt;br /&gt;
Comment=Example App Shortcut&lt;br /&gt;
Categories=Utility;&lt;br /&gt;
&lt;br /&gt;
# 保存并赋予权限&lt;br /&gt;
chmod +x ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 复制到桌面&lt;br /&gt;
# 桌面上点击图标，右键，点击允许运行&lt;br /&gt;
cp ~/.local/share/applications/example.desktop ~/Desktop/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Edge多个用户启动====&lt;br /&gt;
Edge地址栏输入并访问 edge://version/，找到 &amp;quot;个人资料路径&amp;quot; 这一栏。路径末尾的 Default 就是你的默认用户的目录名。第二个用户通常名为 Profile 1、Profile 2，或是你自定义的名称。示例，创建不同的 .desktop 文件，启动时指定不同Edge用户：&lt;br /&gt;
 nano ~/.local/share/applications/edge-profile1.desktop&lt;br /&gt;
输入如下内容，ctrl+o保存，ctrl+x退出：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Type=Application&lt;br /&gt;
Name=Edge 用户1&lt;br /&gt;
Exec=/usr/bin/microsoft-edge --profile-directory=&amp;quot;Profile 1&amp;quot;&lt;br /&gt;
# 或者Icon=/path/to/microsoft-edge.Profile1.png&lt;br /&gt;
Icon=microsoft-edge&lt;br /&gt;
Terminal=false&lt;br /&gt;
Comment=使用个人资料1打开Microsoft Edge&lt;br /&gt;
# Categories=Network;&lt;br /&gt;
# StartupWMClass=edge-profile1   # 用于区分窗口&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
点击系统菜单，显示所有应用，找到刚才命名的名字“Edge - 用户1”，右键点击它的图标，选择“添加到收藏夹”或“添加到Dock”。&lt;br /&gt;
&lt;br /&gt;
===常用软件===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| [[KVM]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[VLC]]&lt;br /&gt;
| VLC是一款开源的、免费的多平台视频播放器，支持MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3等格式。 安装命令：sudo apt install vlc     &lt;br /&gt;
| [https://www.videolan.org/vlc/ 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[VMware Workstation]]&lt;br /&gt;
| &lt;br /&gt;
| [https://www.vmware.com/products/workstation-pro.html 官网] [https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载]&lt;br /&gt;
|- &lt;br /&gt;
| WPS&lt;br /&gt;
| 金山办公套装软件,支持多人在线协作编辑Word、Excel和PPT文档。&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;   &amp;lt;br \&amp;gt;常见问题： &amp;lt;br \&amp;gt;*缺少系统字体：Symbol、Wingdings 1、Wingdings 2、Wingdings 3、Webdings、MT Extra， WPS无法正确地显示某些符号公式。因为这些字体是 Microsoft Windows 系统中的专有字体，而 Ubuntu 默认并未包含它们。&amp;lt;br \&amp;gt;解决方法：&amp;lt;br \&amp;gt;1.下载字体，从windows中复制字体C:\Windows\Fonts，或者web上搜索字体下载，或者从https://github.com/dv-anomaly/ttf-wps-fonts。 &amp;lt;br \&amp;gt;2.安在到系统中，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/fonts/wps-office &lt;br /&gt;
cd ~/Downloads/ttf-wps-fonts-master  # 进入下载好的目录&lt;br /&gt;
sudo cp mtextra.ttf symbol.ttf wingding.ttf WINGDNG3.ttf WEBDINGS.TTF  WINGDNG2.ttf /usr/share/fonts/wps-office/  &lt;br /&gt;
sudo fc-cache -fv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|[https://platform.wps.cn/ 下载]&lt;br /&gt;
|- &lt;br /&gt;
| [[IBus]]&lt;br /&gt;
| Ubuntu 24.04及其他各大[[Linux]]发行版的默认的多语输入平台。支持用户词典、用户lua脚本。&lt;br /&gt;
| [https://github.com/ibus/ibus/wiki 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[搜狗输入法]] &lt;br /&gt;
| 有自定义短语功能，支持多行空格等。Windows上有广告弹窗，安装其他软件。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;1.安装fcitx。&amp;lt;code&amp;gt;sudo apt-get install fcitx&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;2.添加中文语言支持 &amp;lt;br \&amp;gt;3.下载安装搜狗输入法。&amp;lt;code&amp;gt;sudo dpkg -i sogoupinyin_版本号_amd64.deb&amp;lt;/code&amp;gt; 。如果安装过程提示缺少依赖&amp;lt;code&amp;gt;sudo apt -f install&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;设置为默认输入法，点击桌面右上角键盘图标-&amp;gt;设置(Configure)-&amp;gt;Input Method将sougoupinyin移动到最上边。&lt;br /&gt;
| [https://pinyin.sogou.com/linux/ 官网] [https://pinyin.sogou.com/linux/help.php 安装指南]&lt;br /&gt;
|- &lt;br /&gt;
| 网易音乐&lt;br /&gt;
| 安装：&amp;lt;br \&amp;gt;1.点击下载客户端，其他操作系统客户端，Linux版 &amp;lt;br \&amp;gt;2.双击下载的deb文件安装&lt;br /&gt;
| [https://music.163.com/ 官网] [https://music.163.com/#/download 下载]&lt;br /&gt;
|- &lt;br /&gt;
| qq音乐&lt;br /&gt;
| &lt;br /&gt;
| [https://y.qq.com/download/download.html 下载]&lt;br /&gt;
|-&lt;br /&gt;
| [[Conky]]&lt;br /&gt;
| 桌面环境的系统监控工具。免费开源，高度可定制。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;code&amp;gt;sudo apt-get install conky&amp;lt;/code&amp;gt;&lt;br /&gt;
| [https://github.com/brndnmtthws/conky 官网]&lt;br /&gt;
|-&lt;br /&gt;
| btop&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==用户管理==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==网络设置==&lt;br /&gt;
===防火墙设置===&lt;br /&gt;
&lt;br /&gt;
==安装驱动==&lt;br /&gt;
===显卡驱动===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu软件库安装&lt;br /&gt;
| 推荐方法，简单快捷可更新。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装步骤：&amp;lt;br \&amp;gt;1.更新软件库 &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt;2.查找相关驱动 &amp;lt;code&amp;gt;sudo ubuntu-drivers devices&amp;lt;/code&amp;gt; ，后面带recommend是系统推荐版本&amp;lt;br \&amp;gt;3.安装驱动，安装指定版本如&amp;lt;code&amp;gt;sudo apt-get install nvidia-driver-470&amp;lt;/code&amp;gt;，直接安装系统推荐版本 &amp;lt;code&amp;gt;sudo ubuntu-drivers install&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;4.如果UEFI模式，需要导入签名。 &amp;lt;br \&amp;gt;5.重启系统 &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt;，验证是否安装成功 &amp;lt;code&amp;gt;sudo nvidia-smi&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| NVIDIA官网驱动安装&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.itzgeek.com/post/how-to-install-nvidia-drivers-on-ubuntu-20-04-ubuntu-18-04.html itzgeek.com：如何在 Ubuntu 20.04 和 Ubuntu 18.04 安装NVIDIA驱动]&lt;br /&gt;
|[https://ubuntu.com/blog/how-to-sign-things-for-secure-boot Ubuntu 博客：Secure Boot模式下如何签名]&lt;br /&gt;
|[https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled askubuntu.com：Secure Boot模式下如何安装NVIDIA驱动]&lt;br /&gt;
|[https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules/762255#762255 askubuntu.com：https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==安全==&lt;br /&gt;
===安全软件===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Ubuntu 常用安全软件对比&lt;br /&gt;
! 软件名称 !! 类别 !! 描述 !! 安装&lt;br /&gt;
|-&lt;br /&gt;
| [[UFW]] || 防火墙 || Uncomplicated Firewall，Ubuntu 默认的前端防火墙工具，简化 iptables 配置，基于“默认拒绝”策略控制网络访问 || 通常预装&lt;br /&gt;
|-&lt;br /&gt;
| [[iptables]] || 防火墙 || Linux 内核原生防火墙框架，通过规则链（表/链）对数据包进行过滤、转发和地址转换（NAT），是 UFW 的底层实现 || 通常预装&lt;br /&gt;
|-&lt;br /&gt;
| [[AppArmor]] || 强制访问控制 || Linux 安全模块（LSM），为每个程序配置访问权限“白名单”，限制其对文件、网络、能力的访问，实现最小权限原则 ||  通常预装&lt;br /&gt;
|-&lt;br /&gt;
| Fail2ban || 入侵防御 || 监控服务日志（如 SSH、Apache），通过正则匹配识别恶意行为（如反复失败登录），自动调用防火墙封禁源 IP || &amp;lt;code&amp;gt;sudo apt install fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ClamAV || 反病毒扫描 || 开源杀毒引擎，检测病毒、木马、恶意软件及其他威胁，支持多线程扫描和定期数据库更新 || &amp;lt;code&amp;gt;sudo apt install clamav clamav-daemon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Firejail || 沙盒隔离 || 轻量级容器化工具，通过命名空间和 seccomp 限制程序访问文件系统、网络、进程等资源，实现应用级隔离。运行不安全代码，在Firejail也不安全。|| &amp;lt;code&amp;gt;sudo apt install firejail firejail-profiles&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenSnitch]] || 应用层防火墙 || GNU/Linux 交互式应用防火墙，灵感来自 macOS 的 Little Snitch。监控并控制每个进程的传出连接，首次连接时弹出提示让用户决定允许或拒绝，可基于进程路径、目标 IP、域名、端口等条件创建精细规则 || Ubuntu 23.04 及以上：&amp;lt;code&amp;gt;sudo apt install opensnitch&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ubuntu 22.04 及更低版本：从 GitHub Releases 下载 &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; 包安装&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===禁止软件联网===&lt;br /&gt;
* 使用Firejail&lt;br /&gt;
&lt;br /&gt;
* 使用AppArmor&lt;br /&gt;
&lt;br /&gt;
===常见问题===&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/sda2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;&lt;br /&gt;
printf &amp;quot;RESUME=UUID=$(blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;)\n&amp;quot; | sudo tee /etc/initramfs-tools/conf.d/resume&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues askubuntu.com：]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 备份与还原 ==&lt;br /&gt;
=== 使用dd备份还原 ===&lt;br /&gt;
关机，插入ubuntu安装u盘，进入试用系统，dd命令镜像硬盘，配合gzip压缩文件，多核cpu可以使用pigz并行压缩更快。一般备份&amp;lt;code&amp;gt;/boot/efi&amp;lt;/code&amp;gt;、&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; 、&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; 所在分区。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
测试环境：系统盘在Samsung SSD 980 1TB，备份位置在西部2TB黑盘7200转（WD2003FZEX），&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 不使用压缩，分区多大，生成文件就多大。&lt;br /&gt;
sudo dd if=/dev/nvme0n1p1 of=/media/ubuntu/newpan/nvme0n1p1.img bs=64M status=progress&lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz&lt;br /&gt;
# nvme0n1p2为ssd硬盘分区，保存分区newpan为HDD硬盘，12核cpu使用pigz压缩&lt;br /&gt;
# /分区 100G，压缩后6.5G，总用时152s，速度约为673MB/s， 测试bs=128M用时还多27s。&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | pigz -3 -p 12 &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250101.img.gz &lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# 速度比pigz慢10多倍，大约50MB/s&lt;br /&gt;
 sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | gzip -c &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250102.img.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
还原&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# img.gz文件大小10.8G，块大小100G，用时327s，速度约306MB/s&lt;br /&gt;
sudo gzip -d -c nvme0n1p2.20250101.img.gz | sudo dd of=/dev/nvme0n1p2 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz，速度与gzip差不多，&lt;br /&gt;
# 15.3G 82G 276s 296MB/s&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo pigz -d -c -p 12 nvme0n1p5.20250101.img.gz | sudo dd of=/dev/nvme0n1p5 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 备份软件 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 接口&lt;br /&gt;
! 级别&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| Déjà Dup  &lt;br /&gt;
| 图形界面&lt;br /&gt;
| 文件&lt;br /&gt;
| Ubuntu的默认桌面备份管理器，桌面左上角点击Activities，搜索&amp;lt;code&amp;gt;backups&amp;lt;/code&amp;gt;可以找到。&lt;br /&gt;
| [https://wiki.gnome.org/Apps/DejaDup gnome]&lt;br /&gt;
|- &lt;br /&gt;
| tar&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| rsync&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| dd&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 使用dd镜像硬盘，配合gzip压缩文件。不能使用dd备份当前正在使用的块存储设备，会导致文件系统上的不一致。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[clonezilla]]&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[partclone]]&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。clonezilla开发，clonezilla也默认使用partclone备份。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| TimeShift&lt;br /&gt;
| 图形界面&lt;br /&gt;
| &lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| systemback&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://help.ubuntu.com/community/BackupYourSystem Ubuntu 社区wiki：备份你的系统]&lt;br /&gt;
|[https://en.wikipedia.org/wiki/List_of_backup_software 维基百科：备份软件列表]&lt;br /&gt;
|[https://www.dell.com/support/kbdoc/zh-cn/000152034/如何使用Ubuntu Linux备份实用程序备份戴尔PC ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===显示问题===&lt;br /&gt;
1.屏幕偶尔几秒黑屏一下。&lt;br /&gt;
&lt;br /&gt;
2.黑屏后无法唤起。&lt;br /&gt;
&lt;br /&gt;
===声音问题===&lt;br /&gt;
1.USB耳机或音响没声音&lt;br /&gt;
设置》声音》选择输出设备，如果3.5mm接口输出，选择线缆输出built-in Audio。&lt;br /&gt;
&lt;br /&gt;
或者&lt;br /&gt;
*在终端输入&amp;lt;code&amp;gt;alsamixer&amp;lt;/code&amp;gt;命令，打开AlsaMixer&lt;br /&gt;
*按F6选择声卡&lt;br /&gt;
*查看声音设备的id：&amp;lt;code&amp;gt;cat /proc/asound/cards&amp;lt;/code&amp;gt;&lt;br /&gt;
*打开&amp;lt;code&amp;gt;sudo gpedit /etc/asound.conf&amp;lt;/code&amp;gt;，根据声卡id设置默认声卡。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
defaults.ctl.card 2&lt;br /&gt;
defaults.pcm.card 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/447718/no-sound-on-usb-headset-how-to-manage-soundcards-and-audio-devices askubuntu.com：USB耳机上没有声音，如何管理声卡和音频设备？]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===系统程序出现问题===&lt;br /&gt;
桌面版，有时会弹出”检测到系统程序出现问题“面板。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 列出存储系统或应用程序崩溃时生成的崩溃报告&lt;br /&gt;
ls -al /var/crash/&lt;br /&gt;
&lt;br /&gt;
# 查看崩溃报告内容，如_bin_brltty.0.crash&lt;br /&gt;
less /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 修复导致崩溃的问题&lt;br /&gt;
# 1.更新系统&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
# 2.检查具体程序，删除或者重新安装，比如brltty盲文显示器程序&lt;br /&gt;
sudo apt remove brltty  # 删除brltty&lt;br /&gt;
sudo apt install --reinstall brltty   # 如果brltty需要重新安装brltty &lt;br /&gt;
# 查看系统日志，获取更多信息，搜索相关内容&lt;br /&gt;
journalctl -p err &lt;br /&gt;
grep -i error /var/log/syslog&lt;br /&gt;
&lt;br /&gt;
# 删除崩溃报告&lt;br /&gt;
sudo rm /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 提交给Ubuntu的开发者&lt;br /&gt;
apport-cli /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
如果崩溃仍然存在，而且不需要提醒，可以禁用Apport。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo vim /etc/default/apport&lt;br /&gt;
&lt;br /&gt;
# 将配置文件enabled=1 改为enabled=0，并保存&lt;br /&gt;
&lt;br /&gt;
# 重启电脑&lt;br /&gt;
sudo reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
* 崩溃报告可能包含敏感信息，因此在提交之前请确保你了解报告的内容。&lt;br /&gt;
* 如果你经常遇到某个应用程序崩溃，建议检查是否有更新版本可用，或者查看相关的支持论坛以获取帮助。&lt;br /&gt;
&lt;br /&gt;
===启动慢===&lt;br /&gt;
使用 systemd-analyze 查看详细耗时：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
systemd-analyze time               # 总时间&lt;br /&gt;
systemd-analyze blame              # 按耗时排序的服务&lt;br /&gt;
systemd-analyze critical-chain     # 关键依赖链&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
移除 quiet splash 可看到详细启动日志，观察卡在哪：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
# 暂时去掉 quiet splash&lt;br /&gt;
# GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;   &lt;br /&gt;
&lt;br /&gt;
sudo update-grub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*启动时，NetworkManager-wait-online.service，这里卡了很久。&lt;br /&gt;
NetworkManager-wait-online.service 这个服务本身不做什么具体工作，它只是在启动时“等待”网络连接就绪，好让那些依赖网络的服务（比如需要挂载网络硬盘、自动更新等）能正常工作。方法一，直接禁用：sudo systemctl disable NetworkManager-wait-online.service 。&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Ubuntu 官网：https://ubuntu.com/ &lt;br /&gt;
*Ubuntu 文档：https://help.ubuntu.com/&lt;br /&gt;
*Ubuntu 社区wiki：https://help.ubuntu.com/community/CommunityHelpWiki&lt;br /&gt;
*Ubuntu 桌面指南：https://help.ubuntu.com/stable/ubuntu-help/index.html.zh-CN&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/zh-cn/Ubuntu 维基百科：Ubuntu]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:系统软件]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Mount&amp;diff=1775</id>
		<title>Mount</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Mount&amp;diff=1775"/>
		<updated>2026-04-30T12:17:31Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 永久挂载 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mount是一个UNIX/[[Linux]]系统上的命令，用于挂载[[文件系统]]。Linux系统中所有可访问文件都根目录（&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;）及其子孙目录，但这些文件可以位于不同的设备上。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==用法==&lt;br /&gt;
&lt;br /&gt;
==参数==&lt;br /&gt;
&lt;br /&gt;
==永久挂载==&lt;br /&gt;
永久挂载是在系统重启后不会失效。安装系统时进行的分区挂载是永久挂载，如把第一块磁盘的第二个分区（&amp;lt;code&amp;gt;/dev/sda2&amp;lt;/code&amp;gt;）永久挂载到&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;目录，则&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;目录下所有文件都位于该分区。可以使用命令&amp;lt;code&amp;gt;cat /etc/fstab&amp;lt;/code&amp;gt;查看该配置文件。&lt;br /&gt;
&lt;br /&gt;
要设置永久挂载，编辑配置文件&amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;即可。文件中的每行都定义文件系统的挂载点，分6个字段，使用空格分开。示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看挂载的分区及其 UUID 或设备名称。&lt;br /&gt;
sudo blkid&lt;br /&gt;
&lt;br /&gt;
# 创建挂载点。通常放在 /mnt 或 /media 目录下。&lt;br /&gt;
sudo mkdir /media/mydisk&lt;br /&gt;
&lt;br /&gt;
# 编辑 /etc/fstab 文件，使用nano 或 vim等编辑&lt;br /&gt;
sudo vim /etc/fstab&lt;br /&gt;
&lt;br /&gt;
# 在文件末尾添加一行，格式如下：&lt;br /&gt;
# UUID=&amp;lt;分区UUID&amp;gt;  &amp;lt;挂载点&amp;gt;  &amp;lt;文件系统类型&amp;gt;  &amp;lt;挂载选项&amp;gt;  &amp;lt;dump&amp;gt;  &amp;lt;fsck&amp;gt;&lt;br /&gt;
UUID=your-uuid  /media/mydisk  ext4  defaults  0  2&lt;br /&gt;
# 对于ntfs，可以ntfs-3g模拟权限管理&lt;br /&gt;
UUID=your-uuid /media/mydisk ntfs-3g uid=1000,gid=1000,permissions 0 0&lt;br /&gt;
# 对于ntfs，可以ntfs-3g模拟权限管理，&lt;br /&gt;
# 固定目录权限为755（dmask=022），文件权限为644（fmask=133）&lt;br /&gt;
UUID=your-uuid /media/mydisk ntfs-3g uid=1000,gid=1000,dmask=022,fmask=133 0 0&lt;br /&gt;
&lt;br /&gt;
# 先重新加载 systemd 配置&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
# 挂载所有 fstab 中未挂载的条目&lt;br /&gt;
sudo mount -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
下表为&amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;文件6个字段详细解释。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 序号&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 块设备&amp;lt;br \&amp;gt;file system&lt;br /&gt;
| UUID或/dev/路径。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;UUID是存储设备在系统中唯一标识字符串，建议使用这种方式，不会因为加载顺序而改变。查看所有硬盘的uuid：&amp;lt;code&amp;gt;ls -l /dev/disk/by-uuid&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt; &amp;lt;br \&amp;gt;/dev/路径&lt;br /&gt;
| &amp;lt;code&amp;gt;UUID=e9320e9c-1b60-4082-b341-bca05d00d4df&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;/dev/sdc2&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| 2&lt;br /&gt;
| 挂载点&amp;lt;br \&amp;gt;mount point&lt;br /&gt;
| 通常放在 /mnt 或 /media 目录下。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 3&lt;br /&gt;
| 文件系统类型&amp;lt;br \&amp;gt;type&lt;br /&gt;
| Linux支持多种文件系统：ext4, xfs, btrfs, f2fs, vfat, ntfs, hfsplus, tmpfs, sysfs, proc, iso9660, udf, squashfs, nfs, cifs等。&lt;br /&gt;
| &amp;lt;code&amp;gt;ext4&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;ntfs&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| 4&lt;br /&gt;
| 选项&amp;lt;br \&amp;gt;options&lt;br /&gt;
|  通常使用 defaults，表示默认选项。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 5&lt;br /&gt;
| dump&lt;br /&gt;
| 备份工具 dump 使用的标志，通常设置为 0&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 6&lt;br /&gt;
| pass&lt;br /&gt;
| 文件系统检查顺序，根分区为 1，其他分区为 2，不检查为 0&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==卸载==&lt;br /&gt;
&lt;br /&gt;
基本卸载命令&lt;br /&gt;
 sudo umount /mnt/nas&lt;br /&gt;
&lt;br /&gt;
懒卸载 (lazy unmount),让文件系统立即从目录树中分离，等不再使用时再真正卸载。&lt;br /&gt;
 sudo umount -l /mnt/nas&lt;br /&gt;
&lt;br /&gt;
强制卸载&lt;br /&gt;
 sudo umount -f /mnt/nas&lt;br /&gt;
&lt;br /&gt;
常见问题及解决方法:&lt;br /&gt;
* 目标正忙 (target is busy)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 查看&lt;br /&gt;
sudo fuser -v /mnt/nas&lt;br /&gt;
# 或者&lt;br /&gt;
sudo lsof | grep /mnt/nas&lt;br /&gt;
&lt;br /&gt;
# 强制结束使用该目录的进程&lt;br /&gt;
sudo fuser -km /mnt/nas&lt;br /&gt;
&lt;br /&gt;
# 然后重新卸载&lt;br /&gt;
sudo umount /mnt/nas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://man7.org/linux/man-pages/man5/fstab.5.html man7.org：fstab(5)]&lt;br /&gt;
|[https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/managing_file_systems/assembly_persistently-mounting-file-systems_managing-file-systems Red Hat 文档：Red Hat Enterprise Linux 8 - 第 16 章 永久挂载文件系统]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===相关网站===&lt;br /&gt;
*[https://man7.org/linux/man-pages/man8/mount.8.html man7.org：mount(8) ]&lt;br /&gt;
*[https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/managing_file_systems/assembly_mounting-file-systems_managing-file-systems Red Hat 文档：Red Hat Enterprise Linux 8 - 第 14 章 挂载文件系统]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/Mount_(Unix) 维基百科：mount (Unix)]&lt;br /&gt;
&lt;br /&gt;
[[分类:命令行程序]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=OpenSnitch&amp;diff=1774</id>
		<title>OpenSnitch</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=OpenSnitch&amp;diff=1774"/>
		<updated>2026-04-30T02:46:52Z</updated>

		<summary type="html">&lt;p&gt;Eric：​创建页面，内容为“OpenSnitch 是 Linux 上一款的交互式应用防火墙，灵感来自 macOS 上的 Little Snitch。它最特别的地方在于能监控并拦截应用程序发起的对外网络连接，  == 简介 == === 核心组件 ===  OpenSnitch 主要由两个核心部分组成，理解这两部分有助于后续的操作：  * &amp;#039;&amp;#039;&amp;#039;守护进程 (opensnitchd)&amp;#039;&amp;#039;&amp;#039;：这是运行在后台的核心服务，负责实际拦截网络连接并根据规则进行匹配。需要将…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenSnitch 是 Linux 上一款的交互式应用防火墙，灵感来自 macOS 上的 Little Snitch。它最特别的地方在于能监控并拦截应用程序发起的对外网络连接，&lt;br /&gt;
&lt;br /&gt;
== 简介 ==&lt;br /&gt;
=== 核心组件 ===&lt;br /&gt;
&lt;br /&gt;
OpenSnitch 主要由两个核心部分组成，理解这两部分有助于后续的操作：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;守护进程 (opensnitchd)&#039;&#039;&#039;：这是运行在后台的核心服务，负责实际拦截网络连接并根据规则进行匹配。需要将其设置为系统服务，以实现开机自启。&lt;br /&gt;
* &#039;&#039;&#039;用户界面 (opensnitch-ui)&#039;&#039;&#039;：这是一个图形界面程序，用于显示网络请求弹窗、管理防火墙规则以及查看网络统计信息。它会在系统托盘区显示图标。&lt;br /&gt;
&lt;br /&gt;
当某个尚未配置规则的进程尝试建立网络连接时，守护进程会拦截该连接，并向用户弹出一个对话框询问如何处理（允许或拒绝）。用户做出的选择会被保存为一条新规则，此后同一进程再次尝试连接时，规则将自动生效。&lt;br /&gt;
&lt;br /&gt;
== 安装 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Debian / Ubuntu 及衍生版 ===&lt;br /&gt;
Ubuntu 23.04 及以上，直接使用apt安装。&lt;br /&gt;
 sudo apt install opensnitch&lt;br /&gt;
Ubuntu 22.04 及更低版本：从 GitHub Releases 下载 &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; 软件包。访问 OpenSnitch 的 [https://github.com/evilsocket/opensnitch/releases GitHub Releases 页面]，下载最新版本。&lt;br /&gt;
&lt;br /&gt;
安装完成后，启动并启用守护进程服务：&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 sudo systemctl enable --now opensnitch&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 其他发行版 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Fedora / RHEL 系&#039;&#039;&#039;：在 [https://github.com/evilsocket/opensnitch/releases Releases 页面] 下载 &amp;lt;code&amp;gt;.rpm&amp;lt;/code&amp;gt; 软件包，并使用 &amp;lt;code&amp;gt;sudo dnf install&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;sudo rpm -ivh&amp;lt;/code&amp;gt; 命令进行安装。&lt;br /&gt;
* &#039;&#039;&#039;Arch Linux&#039;&#039;&#039;：可通过 AUR 安装，例如使用 &amp;lt;code&amp;gt;yay -S opensnitch&amp;lt;/code&amp;gt; 命令。&lt;br /&gt;
* &#039;&#039;&#039;NixOS&#039;&#039;&#039;：在 &amp;lt;code&amp;gt;configuration.nix&amp;lt;/code&amp;gt; 配置文件中添加 &amp;lt;code&amp;gt;services.opensnitch.enable = true;&amp;lt;/code&amp;gt; 并重建系统。&lt;br /&gt;
&lt;br /&gt;
== 基本使用方法 ==&lt;br /&gt;
&lt;br /&gt;
=== 首次启动与初始设置 ===&lt;br /&gt;
&lt;br /&gt;
# 在应用菜单中找到并启动 “OpenSnitch UI”。程序窗口可能不会直接打开，但会在系统托盘区域出现一个图标。&lt;br /&gt;
# 右键点击系统托盘图标，选择 &#039;&#039;&#039;“Open main window”&#039;&#039;&#039;（打开主窗口）。&lt;br /&gt;
# 官方建议的策略是：在新系统上，先将默认动作设为“允许”，让 OpenSnitch 运行几天以学习正常的网络行为并记录规则。之后再切换至更严格的模式，手动审查并调整规则。&lt;br /&gt;
&lt;br /&gt;
=== 处理弹窗与创建规则 ===&lt;br /&gt;
&lt;br /&gt;
这是 OpenSnitch 最核心的交互方式。当某个尚未配置规则的应用发起网络连接时，会弹出如下的配置对话框：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;动作 (Action)&#039;&#039;&#039;：选择 &#039;&#039;&#039;Allow&#039;&#039;&#039;（允许）或 &#039;&#039;&#039;Deny&#039;&#039;&#039;（拒绝）。&lt;br /&gt;
* &#039;&#039;&#039;持续时间 (Duration)&#039;&#039;&#039;：&lt;br /&gt;
 ** &#039;&#039;&#039;Until restart&#039;&#039;&#039;：仅对本次会话有效，重启后失效。&lt;br /&gt;
 ** &#039;&#039;&#039;For a session&#039;&#039;&#039;：在用户登出之前有效。&lt;br /&gt;
 ** &#039;&#039;&#039;Always&#039;&#039;&#039;：创建永久规则，这是最常用的选项。&lt;br /&gt;
* &#039;&#039;&#039;范围 (Scope)&#039;&#039;&#039;：可以选择此规则仅应用于当前应用程序、该应用程序及其所有子进程，或是全局生效。&lt;br /&gt;
&lt;br /&gt;
=== 使用主窗口管理规则 ===&lt;br /&gt;
&lt;br /&gt;
主窗口是管理防火墙规则的控制中心。&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Events（事件）&#039;&#039;&#039;标签页：实时显示所有被拦截或允许的连接历史记录，可以清晰地查看哪个应用连接到了哪个 IP 地址和端口。&lt;br /&gt;
* &#039;&#039;&#039;Applications（应用）&#039;&#039;&#039;标签页：列出所有已配置规则的应用程序。在此可以双击某条规则进行修改，或点击左上角的 &#039;&#039;&#039;“+”&#039;&#039;&#039; 按钮手动添加新规则。&lt;br /&gt;
* &#039;&#039;&#039;Hosts（主机）&#039;&#039;&#039;标签页：按域名或 IP 地址聚合统计连接情况。&lt;br /&gt;
&lt;br /&gt;
==== 手动创建规则示例 ====&lt;br /&gt;
&lt;br /&gt;
假设需要永久阻止对 &amp;lt;code&amp;gt;www.example.org&amp;lt;/code&amp;gt; 的所有访问，可以按以下步骤操作：&lt;br /&gt;
&lt;br /&gt;
# 在主窗口点击 &#039;&#039;&#039;“+”&#039;&#039;&#039; 按钮。&lt;br /&gt;
# 为规则命名，例如 &amp;lt;code&amp;gt;Block Example&amp;lt;/code&amp;gt;。&lt;br /&gt;
# 将 &#039;&#039;&#039;Action&#039;&#039;&#039; 设置为 &amp;lt;code&amp;gt;Deny&amp;lt;/code&amp;gt;，&#039;&#039;&#039;Duration&#039;&#039;&#039; 设置为 &amp;lt;code&amp;gt;Always&amp;lt;/code&amp;gt;。&lt;br /&gt;
# 切换到 &#039;&#039;&#039;Network&#039;&#039;&#039; 标签页，在 &#039;&#039;&#039;“To this host”&#039;&#039;&#039; 字段中输入 &amp;lt;code&amp;gt;www.example.org&amp;lt;/code&amp;gt;。&lt;br /&gt;
# 点击 &#039;&#039;&#039;Save&#039;&#039;&#039; 保存规则。&lt;br /&gt;
&lt;br /&gt;
== 高级配置与技巧 ==&lt;br /&gt;
&lt;br /&gt;
=== 配置文件位置 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;守护进程规则存储路径&#039;&#039;&#039;：&amp;lt;code&amp;gt;/etc/opensnitchd/rules/&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;守护进程配置文件&#039;&#039;&#039;：&amp;lt;code&amp;gt;/etc/opensnitchd/default-config.json&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;系统防火墙规则（用于绕过 OpenSnitch）&#039;&#039;&#039;：&amp;lt;code&amp;gt;/etc/opensnitchd/system-fw.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以通过编辑上述 &amp;lt;code&amp;gt;.json&amp;lt;/code&amp;gt; 文件来批量导入或备份规则。例如，一条允许 &amp;lt;code&amp;gt;tor&amp;lt;/code&amp;gt; 进程的规则示例如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;tor&amp;quot;: {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;tor&amp;quot;,&lt;br /&gt;
    &amp;quot;enabled&amp;quot;: true,&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;allow&amp;quot;,&lt;br /&gt;
    &amp;quot;duration&amp;quot;: &amp;quot;always&amp;quot;,&lt;br /&gt;
    &amp;quot;operator&amp;quot;: {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;simple&amp;quot;,&lt;br /&gt;
      &amp;quot;sensitive&amp;quot;: false,&lt;br /&gt;
      &amp;quot;operand&amp;quot;: &amp;quot;process.path&amp;quot;,&lt;br /&gt;
      &amp;quot;data&amp;quot;: &amp;quot;/nix/store/.../bin/tor&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 进程监控方式 ===&lt;br /&gt;
&lt;br /&gt;
OpenSnitch 支持三种监控进程发起连接的方式，可以在配置文件中进行调整：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;ebpf&amp;lt;/code&amp;gt;（推荐）&#039;&#039;&#039;：性能最佳，功能最强，能够拦截由内核发起的连接。需要 Linux 内核版本 5.5 或更高。&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;audit&amp;lt;/code&amp;gt;&#039;&#039;&#039;：利用 Linux 审计子系统，性能较好。&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;proc&amp;lt;/code&amp;gt;&#039;&#039;&#039;：通过读取 &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; 文件系统获取信息，作为备选方案。&lt;br /&gt;
&lt;br /&gt;
=== 避免干扰（VPN 或信任服务） ===&lt;br /&gt;
&lt;br /&gt;
如果希望某些流量完全不被 OpenSnitch 处理（例如 VPN 的守护进程），可以将其加入“系统防火墙规则”中。编辑 &amp;lt;code&amp;gt;/etc/opensnitchd/system-fw.json&amp;lt;/code&amp;gt; 文件，添加相应的 iptables 或 nftables 规则。这样做可以提升性能并避免潜在的配置冲突。&lt;br /&gt;
&lt;br /&gt;
== 故障排除 ==&lt;br /&gt;
&lt;br /&gt;
=== 没有弹窗，应用直接被阻止？ ===&lt;br /&gt;
&lt;br /&gt;
* 这可能是因为之前创建了静默规则但已忘记。请检查组件中的规则列表。&lt;br /&gt;
* 也可以尝试在图形界面的 &#039;&#039;&#039;Preferences -&amp;gt; Nodes&#039;&#039;&#039; 选项中，启用 &#039;&#039;&#039;“Debug invalid connections”&#039;&#039;&#039; 功能。这能让未匹配到规则的连接也弹出提示，便于调试。&lt;br /&gt;
&lt;br /&gt;
=== 如何调试启动问题？ ===&lt;br /&gt;
&lt;br /&gt;
# 先停止后台服务：&amp;lt;code&amp;gt;sudo systemctl stop opensnitch&amp;lt;/code&amp;gt;。&lt;br /&gt;
# 在前台手动启动守护进程并开启调试输出，以便查看具体错误信息：&amp;lt;code&amp;gt;sudo /usr/bin/opensnitchd -debug&amp;lt;/code&amp;gt;。&lt;br /&gt;
# 如果图形界面崩溃，可以在终端中直接输入 &amp;lt;code&amp;gt;opensnitch-ui&amp;lt;/code&amp;gt; 命令，并观察输出的错误信息。&lt;br /&gt;
&lt;br /&gt;
=== 图形界面显示异常（如出现黑块）？ ===&lt;br /&gt;
&lt;br /&gt;
如果在使用 Wayland 显示服务器或某些窗口管理器时遇到界面渲染问题，可以尝试在启动图形界面之前设置以下环境变量：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export QT_QPA_PLATFORM=xcb&lt;br /&gt;
opensnitch-ui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Ubuntu&amp;diff=1773</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Ubuntu&amp;diff=1773"/>
		<updated>2026-04-30T02:30:08Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 安全软件 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ubuntu是一个[[Linux]]的发行版，由Canonical公司发布并提供商业支持。Ubuntu项目公开承诺开源软件开发的原则；鼓励人们使用自由软件，研究它的运作原理，改进和分发。Ubuntu是著名的[[Linux]]发行版之一，基于[[Debian]]发行版和GNOME桌面环境。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2004年10月20日，马克·舍特尔沃斯创立并发布Ubuntu第一个版本Ubuntu 4.10，它以Debian为开发蓝本。 &lt;br /&gt;
*2005年7月8日，马克·舍特尔沃斯与Canonical有限公司宣布成立Ubuntu基金会，并提供1千万美元作为启始营运资金。但直至2006年，此基金会仍未投入运作。马克·舍特尔沃斯形容此基金会是在Canonical有限公司出现财务危机时的紧急营运资金。&lt;br /&gt;
&lt;br /&gt;
===版本===&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====制作启动U盘====&lt;br /&gt;
Ubuntu官网下载ISO镜像。&lt;br /&gt;
&lt;br /&gt;
linux中制作启动U盘：&lt;br /&gt;
方法一：使用dd命令，一定要注意看清楚哪个盘，不然可能格式化错盘。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 插入u盘，查看所有块设备：&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd命令写入ISO到U盘，如u盘为sdx：&lt;br /&gt;
sudo dd if=/path/to/ubuntu.iso of=/dev/sdx bs=4M status=progress&lt;br /&gt;
&lt;br /&gt;
# 安全移除U盘&lt;br /&gt;
sudo eject /dev/sdx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
windows中制作启动U盘：&lt;br /&gt;
方法一，Ubuntu官方教程使用[[Rufus]]软件制作启动U盘，下面使用[[UltraISO]]软件制作启动U盘，只是写启动盘可以用试用版。&lt;br /&gt;
*打开UltraISO，选择下载好的Ubuntu系统&lt;br /&gt;
*点击菜单栏‘启动’》‘写入硬盘映像’&lt;br /&gt;
*在对话框的‘硬盘驱动器’处选择要刻录的U盘&lt;br /&gt;
*然后点击‘写入’，注意U盘会被格式化所有资料都没有&lt;br /&gt;
*启动U盘制作完成，可以用它在任何电脑安装Ubuntu&lt;br /&gt;
&lt;br /&gt;
方法二，也可以使用&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;xcopy&amp;lt;/code&amp;gt;命令行制作ubuntu的启动U盘，在如下：&lt;br /&gt;
* 搜索框输入&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;，打开命令提示符。 &lt;br /&gt;
* 在cmd中输入&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt; ， 打开磁盘管理。&lt;br /&gt;
* &amp;lt;code&amp;gt;list disk&amp;lt;/code&amp;gt;，查看所有磁盘信息。&lt;br /&gt;
* &amp;lt;code&amp;gt;select disk 2&amp;lt;/code&amp;gt;，选择U盘，示例U盘为disk 2。&lt;br /&gt;
* &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;，清除U盘。&lt;br /&gt;
* &amp;lt;code&amp;gt;create partition primary&amp;lt;/code&amp;gt;，创建分区。&lt;br /&gt;
* &amp;lt;code&amp;gt;select partition 1&amp;lt;/code&amp;gt;，选择分区1。&lt;br /&gt;
* &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;，将当前分区标记为活动。&lt;br /&gt;
* &amp;lt;code&amp;gt;format fs=ntfs quick&amp;lt;/code&amp;gt;，格式化分区为ntfs格式。&lt;br /&gt;
* &amp;lt;code&amp;gt;assign&amp;lt;/code&amp;gt;，分配盘符。&lt;br /&gt;
* &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;，退出。&lt;br /&gt;
* 选择下载好的iso文件，右键点击装载。查看装载后的盘符，如&amp;lt;code&amp;gt;G：&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;xcopy G:\*.* /e /h /f H:\&amp;lt;/code&amp;gt;，复制所有文件到U盘。其中&amp;lt;code&amp;gt;H:&amp;lt;/code&amp;gt;为U盘的盘符。&amp;lt;code&amp;gt;/e&amp;lt;/code&amp;gt;复制所有子目录，即使它们是空的。&amp;lt;code&amp;gt;/h&amp;lt;/code&amp;gt;复制具有隐藏文件和系统文件属性的文件。 &amp;lt;code&amp;gt;/f&amp;lt;/code&amp;gt;复制时显示源文件名和目标文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-windows#1-overview Ubuntu 教程：Windows上制作启动U盘]&lt;br /&gt;
|[https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/xcopy Windows Server文档：xcopy]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====安装到电脑====&lt;br /&gt;
&lt;br /&gt;
====安装到U盘====&lt;br /&gt;
&lt;br /&gt;
====分区方案====&lt;br /&gt;
{{Linux分区方案}}&lt;br /&gt;
==技巧==&lt;br /&gt;
*创建某个目录在桌面快捷方式&lt;br /&gt;
点击某个目录，按住Ctrl + Shift，拖动到桌面目录(文件打开)里，注意不能直接拖动到桌面。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
===软件安装===&lt;br /&gt;
====apt====&lt;br /&gt;
&lt;br /&gt;
====deb====&lt;br /&gt;
&lt;br /&gt;
====AppImage====&lt;br /&gt;
是Linux上的一种应用打包格式，将程序所有文件打包成一个AppImage，可以在不同Linux发行版上运行。直接运行，不需要安装运行库。&lt;br /&gt;
&lt;br /&gt;
运行AppImage格式程序&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
#  进入AppImage 文件所在目录，为文件添加可执行权限&lt;br /&gt;
cd /path/to/directory&lt;br /&gt;
chmod +x example.AppImage&lt;br /&gt;
&lt;br /&gt;
# 直接运行文件&lt;br /&gt;
./example.AppImage&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===快捷方式===&lt;br /&gt;
应用程序和桌面创建快捷方式。.desktop 文件是 Linux 桌面环境中用于定义应用程序启动器、菜单项或快捷方式的配置文件。常用文件内容如下：&lt;br /&gt;
*Name：应用程序的显示名称（必填）。&lt;br /&gt;
*Exec：启动应用程序的命令（必填），路径使用绝对路径。&lt;br /&gt;
*Type：定义文件类型，常见值：Application：应用程序，Link：快捷方式，Directory：目录&lt;br /&gt;
*Icon：Ubuntu支持的图标格式包括 PNG、SVG、XPM。注意路径最后面不要有空格，否则图标不会显示。图标可以在提取文件里找&amp;lt;code&amp;gt;./example.AppImage --appimage-extract&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 创建 .desktop 文件&lt;br /&gt;
vim ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 编辑 .desktop 文件内容&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Example App&lt;br /&gt;
Exec=/path/to/example.AppImage&lt;br /&gt;
Type=Application&lt;br /&gt;
Terminal=false&lt;br /&gt;
Icon=/path/to/icon.png&lt;br /&gt;
Comment=Example App Shortcut&lt;br /&gt;
Categories=Utility;&lt;br /&gt;
&lt;br /&gt;
# 保存并赋予权限&lt;br /&gt;
chmod +x ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 复制到桌面&lt;br /&gt;
# 桌面上点击图标，右键，点击允许运行&lt;br /&gt;
cp ~/.local/share/applications/example.desktop ~/Desktop/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Edge多个用户启动====&lt;br /&gt;
Edge地址栏输入并访问 edge://version/，找到 &amp;quot;个人资料路径&amp;quot; 这一栏。路径末尾的 Default 就是你的默认用户的目录名。第二个用户通常名为 Profile 1、Profile 2，或是你自定义的名称。示例，创建不同的 .desktop 文件，启动时指定不同Edge用户：&lt;br /&gt;
 nano ~/.local/share/applications/edge-profile1.desktop&lt;br /&gt;
输入如下内容，ctrl+o保存，ctrl+x退出：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Type=Application&lt;br /&gt;
Name=Edge 用户1&lt;br /&gt;
Exec=/usr/bin/microsoft-edge --profile-directory=&amp;quot;Profile 1&amp;quot;&lt;br /&gt;
# 或者Icon=/path/to/microsoft-edge.Profile1.png&lt;br /&gt;
Icon=microsoft-edge&lt;br /&gt;
Terminal=false&lt;br /&gt;
Comment=使用个人资料1打开Microsoft Edge&lt;br /&gt;
# Categories=Network;&lt;br /&gt;
# StartupWMClass=edge-profile1   # 用于区分窗口&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
点击系统菜单，显示所有应用，找到刚才命名的名字“Edge - 用户1”，右键点击它的图标，选择“添加到收藏夹”或“添加到Dock”。&lt;br /&gt;
&lt;br /&gt;
===常用软件===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| [[KVM]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[VLC]]&lt;br /&gt;
| VLC是一款开源的、免费的多平台视频播放器，支持MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3等格式。 安装命令：sudo apt install vlc     &lt;br /&gt;
| [https://www.videolan.org/vlc/ 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[VMware Workstation]]&lt;br /&gt;
| &lt;br /&gt;
| [https://www.vmware.com/products/workstation-pro.html 官网] [https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载]&lt;br /&gt;
|- &lt;br /&gt;
| WPS&lt;br /&gt;
| 金山办公套装软件,支持多人在线协作编辑Word、Excel和PPT文档。&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;   &amp;lt;br \&amp;gt;常见问题： &amp;lt;br \&amp;gt;*缺少系统字体：Symbol、Wingdings 1、Wingdings 2、Wingdings 3、Webdings、MT Extra， WPS无法正确地显示某些符号公式。因为这些字体是 Microsoft Windows 系统中的专有字体，而 Ubuntu 默认并未包含它们。&amp;lt;br \&amp;gt;解决方法：&amp;lt;br \&amp;gt;1.下载字体，从windows中复制字体C:\Windows\Fonts，或者web上搜索字体下载，或者从https://github.com/dv-anomaly/ttf-wps-fonts。 &amp;lt;br \&amp;gt;2.安在到系统中，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/fonts/wps-office &lt;br /&gt;
cd ~/Downloads/ttf-wps-fonts-master  # 进入下载好的目录&lt;br /&gt;
sudo cp mtextra.ttf symbol.ttf wingding.ttf WINGDNG3.ttf WEBDINGS.TTF  WINGDNG2.ttf /usr/share/fonts/wps-office/  &lt;br /&gt;
sudo fc-cache -fv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|[https://platform.wps.cn/ 下载]&lt;br /&gt;
|- &lt;br /&gt;
| [[IBus]]&lt;br /&gt;
| Ubuntu 24.04及其他各大[[Linux]]发行版的默认的多语输入平台。支持用户词典、用户lua脚本。&lt;br /&gt;
| [https://github.com/ibus/ibus/wiki 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[搜狗输入法]] &lt;br /&gt;
| 有自定义短语功能，支持多行空格等。Windows上有广告弹窗，安装其他软件。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;1.安装fcitx。&amp;lt;code&amp;gt;sudo apt-get install fcitx&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;2.添加中文语言支持 &amp;lt;br \&amp;gt;3.下载安装搜狗输入法。&amp;lt;code&amp;gt;sudo dpkg -i sogoupinyin_版本号_amd64.deb&amp;lt;/code&amp;gt; 。如果安装过程提示缺少依赖&amp;lt;code&amp;gt;sudo apt -f install&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;设置为默认输入法，点击桌面右上角键盘图标-&amp;gt;设置(Configure)-&amp;gt;Input Method将sougoupinyin移动到最上边。&lt;br /&gt;
| [https://pinyin.sogou.com/linux/ 官网] [https://pinyin.sogou.com/linux/help.php 安装指南]&lt;br /&gt;
|- &lt;br /&gt;
| 网易音乐&lt;br /&gt;
| 安装：&amp;lt;br \&amp;gt;1.点击下载客户端，其他操作系统客户端，Linux版 &amp;lt;br \&amp;gt;2.双击下载的deb文件安装&lt;br /&gt;
| [https://music.163.com/ 官网] [https://music.163.com/#/download 下载]&lt;br /&gt;
|- &lt;br /&gt;
| qq音乐&lt;br /&gt;
| &lt;br /&gt;
| [https://y.qq.com/download/download.html 下载]&lt;br /&gt;
|-&lt;br /&gt;
| [[Conky]]&lt;br /&gt;
| 桌面环境的系统监控工具。免费开源，高度可定制。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;code&amp;gt;sudo apt-get install conky&amp;lt;/code&amp;gt;&lt;br /&gt;
| [https://github.com/brndnmtthws/conky 官网]&lt;br /&gt;
|-&lt;br /&gt;
| btop&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==用户管理==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==网络设置==&lt;br /&gt;
===防火墙设置===&lt;br /&gt;
&lt;br /&gt;
==安装驱动==&lt;br /&gt;
===显卡驱动===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu软件库安装&lt;br /&gt;
| 推荐方法，简单快捷可更新。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装步骤：&amp;lt;br \&amp;gt;1.更新软件库 &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt;2.查找相关驱动 &amp;lt;code&amp;gt;sudo ubuntu-drivers devices&amp;lt;/code&amp;gt; ，后面带recommend是系统推荐版本&amp;lt;br \&amp;gt;3.安装驱动，安装指定版本如&amp;lt;code&amp;gt;sudo apt-get install nvidia-driver-470&amp;lt;/code&amp;gt;，直接安装系统推荐版本 &amp;lt;code&amp;gt;sudo ubuntu-drivers install&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;4.如果UEFI模式，需要导入签名。 &amp;lt;br \&amp;gt;5.重启系统 &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt;，验证是否安装成功 &amp;lt;code&amp;gt;sudo nvidia-smi&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| NVIDIA官网驱动安装&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.itzgeek.com/post/how-to-install-nvidia-drivers-on-ubuntu-20-04-ubuntu-18-04.html itzgeek.com：如何在 Ubuntu 20.04 和 Ubuntu 18.04 安装NVIDIA驱动]&lt;br /&gt;
|[https://ubuntu.com/blog/how-to-sign-things-for-secure-boot Ubuntu 博客：Secure Boot模式下如何签名]&lt;br /&gt;
|[https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled askubuntu.com：Secure Boot模式下如何安装NVIDIA驱动]&lt;br /&gt;
|[https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules/762255#762255 askubuntu.com：https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==安全==&lt;br /&gt;
===安全软件===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Ubuntu 常用安全软件对比&lt;br /&gt;
! 软件名称 !! 类别 !! 描述 !! 安装&lt;br /&gt;
|-&lt;br /&gt;
| [[UFW]] || 防火墙 || Uncomplicated Firewall，Ubuntu 默认的前端防火墙工具，简化 iptables 配置，基于“默认拒绝”策略控制网络访问 || 通常预装&lt;br /&gt;
|-&lt;br /&gt;
| [[iptables]] || 防火墙 || Linux 内核原生防火墙框架，通过规则链（表/链）对数据包进行过滤、转发和地址转换（NAT），是 UFW 的底层实现 || 通常预装&lt;br /&gt;
|-&lt;br /&gt;
| [[AppArmor]] || 强制访问控制 || Linux 安全模块（LSM），为每个程序配置访问权限“白名单”，限制其对文件、网络、能力的访问，实现最小权限原则 ||  通常预装&lt;br /&gt;
|-&lt;br /&gt;
| Fail2ban || 入侵防御 || 监控服务日志（如 SSH、Apache），通过正则匹配识别恶意行为（如反复失败登录），自动调用防火墙封禁源 IP || &amp;lt;code&amp;gt;sudo apt install fail2ban&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ClamAV || 反病毒扫描 || 开源杀毒引擎，检测病毒、木马、恶意软件及其他威胁，支持多线程扫描和定期数据库更新 || &amp;lt;code&amp;gt;sudo apt install clamav clamav-daemon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Firejail || 沙盒隔离 || 轻量级容器化工具，通过命名空间和 seccomp 限制程序访问文件系统、网络、进程等资源，实现应用级隔离。运行不安全代码，在Firejail也不安全。|| &amp;lt;code&amp;gt;sudo apt install firejail firejail-profiles&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[OpenSnitch]] || 应用层防火墙 || GNU/Linux 交互式应用防火墙，灵感来自 macOS 的 Little Snitch。监控并控制每个进程的传出连接，首次连接时弹出提示让用户决定允许或拒绝，可基于进程路径、目标 IP、域名、端口等条件创建精细规则 || Ubuntu 23.04 及以上：&amp;lt;code&amp;gt;sudo apt install opensnitch&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ubuntu 22.04 及更低版本：从 GitHub Releases 下载 &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; 包安装&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===禁止软件联网===&lt;br /&gt;
* 使用Firejail&lt;br /&gt;
&lt;br /&gt;
* 使用AppArmor&lt;br /&gt;
&lt;br /&gt;
===常见问题===&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/sda2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;&lt;br /&gt;
printf &amp;quot;RESUME=UUID=$(blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;)\n&amp;quot; | sudo tee /etc/initramfs-tools/conf.d/resume&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues askubuntu.com：]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 备份与还原 ==&lt;br /&gt;
=== 使用dd备份还原 ===&lt;br /&gt;
关机，插入ubuntu安装u盘，进入试用系统，dd命令镜像硬盘，配合gzip压缩文件，多核cpu可以使用pigz并行压缩更快。一般备份&amp;lt;code&amp;gt;/boot/efi&amp;lt;/code&amp;gt;、&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; 、&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; 所在分区。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
测试环境：系统盘在Samsung SSD 980 1TB，备份位置在西部2TB黑盘7200转（WD2003FZEX），&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 不使用压缩，分区多大，生成文件就多大。&lt;br /&gt;
sudo dd if=/dev/nvme0n1p1 of=/media/ubuntu/newpan/nvme0n1p1.img bs=64M status=progress&lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz&lt;br /&gt;
# nvme0n1p2为ssd硬盘分区，保存分区newpan为HDD硬盘，12核cpu使用pigz压缩&lt;br /&gt;
# /分区 100G，压缩后6.5G，总用时152s，速度约为673MB/s， 测试bs=128M用时还多27s。&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | pigz -3 -p 12 &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250101.img.gz &lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# 速度比pigz慢10多倍，大约50MB/s&lt;br /&gt;
 sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | gzip -c &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250102.img.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
还原&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# img.gz文件大小10.8G，块大小100G，用时327s，速度约306MB/s&lt;br /&gt;
sudo gzip -d -c nvme0n1p2.20250101.img.gz | sudo dd of=/dev/nvme0n1p2 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz，速度与gzip差不多，&lt;br /&gt;
# 15.3G 82G 276s 296MB/s&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo pigz -d -c -p 12 nvme0n1p5.20250101.img.gz | sudo dd of=/dev/nvme0n1p5 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 备份软件 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 接口&lt;br /&gt;
! 级别&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| Déjà Dup  &lt;br /&gt;
| 图形界面&lt;br /&gt;
| 文件&lt;br /&gt;
| Ubuntu的默认桌面备份管理器，桌面左上角点击Activities，搜索&amp;lt;code&amp;gt;backups&amp;lt;/code&amp;gt;可以找到。&lt;br /&gt;
| [https://wiki.gnome.org/Apps/DejaDup gnome]&lt;br /&gt;
|- &lt;br /&gt;
| tar&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| rsync&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| dd&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 使用dd镜像硬盘，配合gzip压缩文件。不能使用dd备份当前正在使用的块存储设备，会导致文件系统上的不一致。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[clonezilla]]&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[partclone]]&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。clonezilla开发，clonezilla也默认使用partclone备份。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| TimeShift&lt;br /&gt;
| 图形界面&lt;br /&gt;
| &lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| systemback&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://help.ubuntu.com/community/BackupYourSystem Ubuntu 社区wiki：备份你的系统]&lt;br /&gt;
|[https://en.wikipedia.org/wiki/List_of_backup_software 维基百科：备份软件列表]&lt;br /&gt;
|[https://www.dell.com/support/kbdoc/zh-cn/000152034/如何使用Ubuntu Linux备份实用程序备份戴尔PC ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===显示问题===&lt;br /&gt;
1.屏幕偶尔几秒黑屏一下。&lt;br /&gt;
&lt;br /&gt;
2.黑屏后无法唤起。&lt;br /&gt;
&lt;br /&gt;
===声音问题===&lt;br /&gt;
1.USB耳机或音响没声音&lt;br /&gt;
设置》声音》选择输出设备，如果3.5mm接口输出，选择线缆输出built-in Audio。&lt;br /&gt;
&lt;br /&gt;
或者&lt;br /&gt;
*在终端输入&amp;lt;code&amp;gt;alsamixer&amp;lt;/code&amp;gt;命令，打开AlsaMixer&lt;br /&gt;
*按F6选择声卡&lt;br /&gt;
*查看声音设备的id：&amp;lt;code&amp;gt;cat /proc/asound/cards&amp;lt;/code&amp;gt;&lt;br /&gt;
*打开&amp;lt;code&amp;gt;sudo gpedit /etc/asound.conf&amp;lt;/code&amp;gt;，根据声卡id设置默认声卡。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
defaults.ctl.card 2&lt;br /&gt;
defaults.pcm.card 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/447718/no-sound-on-usb-headset-how-to-manage-soundcards-and-audio-devices askubuntu.com：USB耳机上没有声音，如何管理声卡和音频设备？]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===系统程序出现问题===&lt;br /&gt;
桌面版，有时会弹出”检测到系统程序出现问题“面板。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 列出存储系统或应用程序崩溃时生成的崩溃报告&lt;br /&gt;
ls -al /var/crash/&lt;br /&gt;
&lt;br /&gt;
# 查看崩溃报告内容，如_bin_brltty.0.crash&lt;br /&gt;
less /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 修复导致崩溃的问题&lt;br /&gt;
# 1.更新系统&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
# 2.检查具体程序，删除或者重新安装，比如brltty盲文显示器程序&lt;br /&gt;
sudo apt remove brltty  # 删除brltty&lt;br /&gt;
sudo apt install --reinstall brltty   # 如果brltty需要重新安装brltty &lt;br /&gt;
# 查看系统日志，获取更多信息，搜索相关内容&lt;br /&gt;
journalctl -p err &lt;br /&gt;
grep -i error /var/log/syslog&lt;br /&gt;
&lt;br /&gt;
# 删除崩溃报告&lt;br /&gt;
sudo rm /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 提交给Ubuntu的开发者&lt;br /&gt;
apport-cli /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
如果崩溃仍然存在，而且不需要提醒，可以禁用Apport。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo vim /etc/default/apport&lt;br /&gt;
&lt;br /&gt;
# 将配置文件enabled=1 改为enabled=0，并保存&lt;br /&gt;
&lt;br /&gt;
# 重启电脑&lt;br /&gt;
sudo reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
* 崩溃报告可能包含敏感信息，因此在提交之前请确保你了解报告的内容。&lt;br /&gt;
* 如果你经常遇到某个应用程序崩溃，建议检查是否有更新版本可用，或者查看相关的支持论坛以获取帮助。&lt;br /&gt;
&lt;br /&gt;
===启动慢===&lt;br /&gt;
使用 systemd-analyze 查看详细耗时：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
systemd-analyze time               # 总时间&lt;br /&gt;
systemd-analyze blame              # 按耗时排序的服务&lt;br /&gt;
systemd-analyze critical-chain     # 关键依赖链&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
移除 quiet splash 可看到详细启动日志，观察卡在哪：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
# 暂时去掉 quiet splash&lt;br /&gt;
# GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;   &lt;br /&gt;
&lt;br /&gt;
sudo update-grub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Ubuntu 官网：https://ubuntu.com/ &lt;br /&gt;
*Ubuntu 文档：https://help.ubuntu.com/&lt;br /&gt;
*Ubuntu 社区wiki：https://help.ubuntu.com/community/CommunityHelpWiki&lt;br /&gt;
*Ubuntu 桌面指南：https://help.ubuntu.com/stable/ubuntu-help/index.html.zh-CN&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/zh-cn/Ubuntu 维基百科：Ubuntu]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:系统软件]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=AppArmor&amp;diff=1772</id>
		<title>AppArmor</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=AppArmor&amp;diff=1772"/>
		<updated>2026-04-30T02:22:41Z</updated>

		<summary type="html">&lt;p&gt;Eric：​创建页面，内容为“AppArmor 是一个易于使用的 Linux 安全模块，它通过为每个程序设置配置文件，来限制程序的具体能力，从而实现强制访问控制（MAC）。它与 SELinux 类似，但主要优势在于配置相对简单，适合初学者和安全运维。   ==快速入门== ===AppArmor核心概念=== 模式 (Modes) *Enforce (强制模式)：严格禁止超出权限的行为，并记录违规日志。 *Complain (记录模式)：不实际…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AppArmor 是一个易于使用的 Linux 安全模块，它通过为每个程序设置配置文件，来限制程序的具体能力，从而实现强制访问控制（MAC）。它与 [[SELinux]] 类似，但主要优势在于配置相对简单，适合初学者和安全运维。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
===AppArmor核心概念===&lt;br /&gt;
模式 (Modes)&lt;br /&gt;
*Enforce (强制模式)：严格禁止超出权限的行为，并记录违规日志。&lt;br /&gt;
*Complain (记录模式)：不实际拦截，只记录“如果执行此操作会违规”的日志。非常适合测试和开发新规则。&lt;br /&gt;
&lt;br /&gt;
配置文件 (Profiles)&lt;br /&gt;
*纯文本文件，通常位于 /etc/apparmor.d/。&lt;br /&gt;
*命名规则：将程序路径中的 / 替换为 .（例如，/bin/ping 的配置文件是 /etc/apparmor.d/bin.ping）。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Ubuntu&amp;diff=1771</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Ubuntu&amp;diff=1771"/>
		<updated>2026-04-30T01:58:58Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 安全设置 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ubuntu是一个[[Linux]]的发行版，由Canonical公司发布并提供商业支持。Ubuntu项目公开承诺开源软件开发的原则；鼓励人们使用自由软件，研究它的运作原理，改进和分发。Ubuntu是著名的[[Linux]]发行版之一，基于[[Debian]]发行版和GNOME桌面环境。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2004年10月20日，马克·舍特尔沃斯创立并发布Ubuntu第一个版本Ubuntu 4.10，它以Debian为开发蓝本。 &lt;br /&gt;
*2005年7月8日，马克·舍特尔沃斯与Canonical有限公司宣布成立Ubuntu基金会，并提供1千万美元作为启始营运资金。但直至2006年，此基金会仍未投入运作。马克·舍特尔沃斯形容此基金会是在Canonical有限公司出现财务危机时的紧急营运资金。&lt;br /&gt;
&lt;br /&gt;
===版本===&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====制作启动U盘====&lt;br /&gt;
Ubuntu官网下载ISO镜像。&lt;br /&gt;
&lt;br /&gt;
linux中制作启动U盘：&lt;br /&gt;
方法一：使用dd命令，一定要注意看清楚哪个盘，不然可能格式化错盘。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 插入u盘，查看所有块设备：&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd命令写入ISO到U盘，如u盘为sdx：&lt;br /&gt;
sudo dd if=/path/to/ubuntu.iso of=/dev/sdx bs=4M status=progress&lt;br /&gt;
&lt;br /&gt;
# 安全移除U盘&lt;br /&gt;
sudo eject /dev/sdx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
windows中制作启动U盘：&lt;br /&gt;
方法一，Ubuntu官方教程使用[[Rufus]]软件制作启动U盘，下面使用[[UltraISO]]软件制作启动U盘，只是写启动盘可以用试用版。&lt;br /&gt;
*打开UltraISO，选择下载好的Ubuntu系统&lt;br /&gt;
*点击菜单栏‘启动’》‘写入硬盘映像’&lt;br /&gt;
*在对话框的‘硬盘驱动器’处选择要刻录的U盘&lt;br /&gt;
*然后点击‘写入’，注意U盘会被格式化所有资料都没有&lt;br /&gt;
*启动U盘制作完成，可以用它在任何电脑安装Ubuntu&lt;br /&gt;
&lt;br /&gt;
方法二，也可以使用&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;xcopy&amp;lt;/code&amp;gt;命令行制作ubuntu的启动U盘，在如下：&lt;br /&gt;
* 搜索框输入&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;，打开命令提示符。 &lt;br /&gt;
* 在cmd中输入&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt; ， 打开磁盘管理。&lt;br /&gt;
* &amp;lt;code&amp;gt;list disk&amp;lt;/code&amp;gt;，查看所有磁盘信息。&lt;br /&gt;
* &amp;lt;code&amp;gt;select disk 2&amp;lt;/code&amp;gt;，选择U盘，示例U盘为disk 2。&lt;br /&gt;
* &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;，清除U盘。&lt;br /&gt;
* &amp;lt;code&amp;gt;create partition primary&amp;lt;/code&amp;gt;，创建分区。&lt;br /&gt;
* &amp;lt;code&amp;gt;select partition 1&amp;lt;/code&amp;gt;，选择分区1。&lt;br /&gt;
* &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;，将当前分区标记为活动。&lt;br /&gt;
* &amp;lt;code&amp;gt;format fs=ntfs quick&amp;lt;/code&amp;gt;，格式化分区为ntfs格式。&lt;br /&gt;
* &amp;lt;code&amp;gt;assign&amp;lt;/code&amp;gt;，分配盘符。&lt;br /&gt;
* &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;，退出。&lt;br /&gt;
* 选择下载好的iso文件，右键点击装载。查看装载后的盘符，如&amp;lt;code&amp;gt;G：&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;xcopy G:\*.* /e /h /f H:\&amp;lt;/code&amp;gt;，复制所有文件到U盘。其中&amp;lt;code&amp;gt;H:&amp;lt;/code&amp;gt;为U盘的盘符。&amp;lt;code&amp;gt;/e&amp;lt;/code&amp;gt;复制所有子目录，即使它们是空的。&amp;lt;code&amp;gt;/h&amp;lt;/code&amp;gt;复制具有隐藏文件和系统文件属性的文件。 &amp;lt;code&amp;gt;/f&amp;lt;/code&amp;gt;复制时显示源文件名和目标文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-windows#1-overview Ubuntu 教程：Windows上制作启动U盘]&lt;br /&gt;
|[https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/xcopy Windows Server文档：xcopy]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====安装到电脑====&lt;br /&gt;
&lt;br /&gt;
====安装到U盘====&lt;br /&gt;
&lt;br /&gt;
====分区方案====&lt;br /&gt;
{{Linux分区方案}}&lt;br /&gt;
==技巧==&lt;br /&gt;
*创建某个目录在桌面快捷方式&lt;br /&gt;
点击某个目录，按住Ctrl + Shift，拖动到桌面目录(文件打开)里，注意不能直接拖动到桌面。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
===软件安装===&lt;br /&gt;
====apt====&lt;br /&gt;
&lt;br /&gt;
====deb====&lt;br /&gt;
&lt;br /&gt;
====AppImage====&lt;br /&gt;
是Linux上的一种应用打包格式，将程序所有文件打包成一个AppImage，可以在不同Linux发行版上运行。直接运行，不需要安装运行库。&lt;br /&gt;
&lt;br /&gt;
运行AppImage格式程序&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
#  进入AppImage 文件所在目录，为文件添加可执行权限&lt;br /&gt;
cd /path/to/directory&lt;br /&gt;
chmod +x example.AppImage&lt;br /&gt;
&lt;br /&gt;
# 直接运行文件&lt;br /&gt;
./example.AppImage&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===快捷方式===&lt;br /&gt;
应用程序和桌面创建快捷方式。.desktop 文件是 Linux 桌面环境中用于定义应用程序启动器、菜单项或快捷方式的配置文件。常用文件内容如下：&lt;br /&gt;
*Name：应用程序的显示名称（必填）。&lt;br /&gt;
*Exec：启动应用程序的命令（必填），路径使用绝对路径。&lt;br /&gt;
*Type：定义文件类型，常见值：Application：应用程序，Link：快捷方式，Directory：目录&lt;br /&gt;
*Icon：Ubuntu支持的图标格式包括 PNG、SVG、XPM。注意路径最后面不要有空格，否则图标不会显示。图标可以在提取文件里找&amp;lt;code&amp;gt;./example.AppImage --appimage-extract&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 创建 .desktop 文件&lt;br /&gt;
vim ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 编辑 .desktop 文件内容&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Example App&lt;br /&gt;
Exec=/path/to/example.AppImage&lt;br /&gt;
Type=Application&lt;br /&gt;
Terminal=false&lt;br /&gt;
Icon=/path/to/icon.png&lt;br /&gt;
Comment=Example App Shortcut&lt;br /&gt;
Categories=Utility;&lt;br /&gt;
&lt;br /&gt;
# 保存并赋予权限&lt;br /&gt;
chmod +x ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 复制到桌面&lt;br /&gt;
# 桌面上点击图标，右键，点击允许运行&lt;br /&gt;
cp ~/.local/share/applications/example.desktop ~/Desktop/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Edge多个用户启动====&lt;br /&gt;
Edge地址栏输入并访问 edge://version/，找到 &amp;quot;个人资料路径&amp;quot; 这一栏。路径末尾的 Default 就是你的默认用户的目录名。第二个用户通常名为 Profile 1、Profile 2，或是你自定义的名称。示例，创建不同的 .desktop 文件，启动时指定不同Edge用户：&lt;br /&gt;
 nano ~/.local/share/applications/edge-profile1.desktop&lt;br /&gt;
输入如下内容，ctrl+o保存，ctrl+x退出：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Type=Application&lt;br /&gt;
Name=Edge 用户1&lt;br /&gt;
Exec=/usr/bin/microsoft-edge --profile-directory=&amp;quot;Profile 1&amp;quot;&lt;br /&gt;
# 或者Icon=/path/to/microsoft-edge.Profile1.png&lt;br /&gt;
Icon=microsoft-edge&lt;br /&gt;
Terminal=false&lt;br /&gt;
Comment=使用个人资料1打开Microsoft Edge&lt;br /&gt;
# Categories=Network;&lt;br /&gt;
# StartupWMClass=edge-profile1   # 用于区分窗口&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
点击系统菜单，显示所有应用，找到刚才命名的名字“Edge - 用户1”，右键点击它的图标，选择“添加到收藏夹”或“添加到Dock”。&lt;br /&gt;
&lt;br /&gt;
===常用软件===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| [[KVM]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[VLC]]&lt;br /&gt;
| VLC是一款开源的、免费的多平台视频播放器，支持MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3等格式。 安装命令：sudo apt install vlc     &lt;br /&gt;
| [https://www.videolan.org/vlc/ 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[VMware Workstation]]&lt;br /&gt;
| &lt;br /&gt;
| [https://www.vmware.com/products/workstation-pro.html 官网] [https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载]&lt;br /&gt;
|- &lt;br /&gt;
| WPS&lt;br /&gt;
| 金山办公套装软件,支持多人在线协作编辑Word、Excel和PPT文档。&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;   &amp;lt;br \&amp;gt;常见问题： &amp;lt;br \&amp;gt;*缺少系统字体：Symbol、Wingdings 1、Wingdings 2、Wingdings 3、Webdings、MT Extra， WPS无法正确地显示某些符号公式。因为这些字体是 Microsoft Windows 系统中的专有字体，而 Ubuntu 默认并未包含它们。&amp;lt;br \&amp;gt;解决方法：&amp;lt;br \&amp;gt;1.下载字体，从windows中复制字体C:\Windows\Fonts，或者web上搜索字体下载，或者从https://github.com/dv-anomaly/ttf-wps-fonts。 &amp;lt;br \&amp;gt;2.安在到系统中，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/fonts/wps-office &lt;br /&gt;
cd ~/Downloads/ttf-wps-fonts-master  # 进入下载好的目录&lt;br /&gt;
sudo cp mtextra.ttf symbol.ttf wingding.ttf WINGDNG3.ttf WEBDINGS.TTF  WINGDNG2.ttf /usr/share/fonts/wps-office/  &lt;br /&gt;
sudo fc-cache -fv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|[https://platform.wps.cn/ 下载]&lt;br /&gt;
|- &lt;br /&gt;
| [[IBus]]&lt;br /&gt;
| Ubuntu 24.04及其他各大[[Linux]]发行版的默认的多语输入平台。支持用户词典、用户lua脚本。&lt;br /&gt;
| [https://github.com/ibus/ibus/wiki 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[搜狗输入法]] &lt;br /&gt;
| 有自定义短语功能，支持多行空格等。Windows上有广告弹窗，安装其他软件。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;1.安装fcitx。&amp;lt;code&amp;gt;sudo apt-get install fcitx&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;2.添加中文语言支持 &amp;lt;br \&amp;gt;3.下载安装搜狗输入法。&amp;lt;code&amp;gt;sudo dpkg -i sogoupinyin_版本号_amd64.deb&amp;lt;/code&amp;gt; 。如果安装过程提示缺少依赖&amp;lt;code&amp;gt;sudo apt -f install&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;设置为默认输入法，点击桌面右上角键盘图标-&amp;gt;设置(Configure)-&amp;gt;Input Method将sougoupinyin移动到最上边。&lt;br /&gt;
| [https://pinyin.sogou.com/linux/ 官网] [https://pinyin.sogou.com/linux/help.php 安装指南]&lt;br /&gt;
|- &lt;br /&gt;
| 网易音乐&lt;br /&gt;
| 安装：&amp;lt;br \&amp;gt;1.点击下载客户端，其他操作系统客户端，Linux版 &amp;lt;br \&amp;gt;2.双击下载的deb文件安装&lt;br /&gt;
| [https://music.163.com/ 官网] [https://music.163.com/#/download 下载]&lt;br /&gt;
|- &lt;br /&gt;
| qq音乐&lt;br /&gt;
| &lt;br /&gt;
| [https://y.qq.com/download/download.html 下载]&lt;br /&gt;
|-&lt;br /&gt;
| [[Conky]]&lt;br /&gt;
| 桌面环境的系统监控工具。免费开源，高度可定制。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;code&amp;gt;sudo apt-get install conky&amp;lt;/code&amp;gt;&lt;br /&gt;
| [https://github.com/brndnmtthws/conky 官网]&lt;br /&gt;
|-&lt;br /&gt;
| btop&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==用户管理==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==网络设置==&lt;br /&gt;
===防火墙设置===&lt;br /&gt;
&lt;br /&gt;
==安装驱动==&lt;br /&gt;
===显卡驱动===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu软件库安装&lt;br /&gt;
| 推荐方法，简单快捷可更新。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装步骤：&amp;lt;br \&amp;gt;1.更新软件库 &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt;2.查找相关驱动 &amp;lt;code&amp;gt;sudo ubuntu-drivers devices&amp;lt;/code&amp;gt; ，后面带recommend是系统推荐版本&amp;lt;br \&amp;gt;3.安装驱动，安装指定版本如&amp;lt;code&amp;gt;sudo apt-get install nvidia-driver-470&amp;lt;/code&amp;gt;，直接安装系统推荐版本 &amp;lt;code&amp;gt;sudo ubuntu-drivers install&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;4.如果UEFI模式，需要导入签名。 &amp;lt;br \&amp;gt;5.重启系统 &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt;，验证是否安装成功 &amp;lt;code&amp;gt;sudo nvidia-smi&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| NVIDIA官网驱动安装&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.itzgeek.com/post/how-to-install-nvidia-drivers-on-ubuntu-20-04-ubuntu-18-04.html itzgeek.com：如何在 Ubuntu 20.04 和 Ubuntu 18.04 安装NVIDIA驱动]&lt;br /&gt;
|[https://ubuntu.com/blog/how-to-sign-things-for-secure-boot Ubuntu 博客：Secure Boot模式下如何签名]&lt;br /&gt;
|[https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled askubuntu.com：Secure Boot模式下如何安装NVIDIA驱动]&lt;br /&gt;
|[https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules/762255#762255 askubuntu.com：https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==安全==&lt;br /&gt;
===安全软件===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Ubuntu 常用安全软件对比&lt;br /&gt;
! 软件名称 !! 类别 !! 描述 !! 安装/启用方式&lt;br /&gt;
|-&lt;br /&gt;
| [[UFW]] || 防火墙 || Uncomplicated Firewall，Ubuntu 默认的前端防火墙工具，简化 iptables 配置，基于“默认拒绝”策略控制网络访问 || 通常预装&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo ufw enable&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[iptables]] || 防火墙 || Linux 内核原生防火墙框架，通过规则链（表/链）对数据包进行过滤、转发和地址转换（NAT），是 UFW 的底层实现 || 通常预装&amp;lt;br&amp;gt;直接编辑规则：&amp;lt;code&amp;gt;sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[AppArmor]] || 强制访问控制 || Linux 安全模块（LSM），为每个程序配置访问权限“白名单”，限制其对文件、网络、能力的访问，实现最小权限原则 ||  通常预装，通过sudo aa-status查看状态&lt;br /&gt;
|-&lt;br /&gt;
| Fail2ban || 入侵防御 || 监控服务日志（如 SSH、Apache），通过正则匹配识别恶意行为（如反复失败登录），自动调用防火墙封禁源 IP || &amp;lt;code&amp;gt;sudo apt install fail2ban&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;配置监狱：&amp;lt;code&amp;gt;sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;sudo systemctl enable fail2ban --now&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ClamAV || 反病毒扫描 || 开源杀毒引擎，检测病毒、木马、恶意软件及其他威胁，支持多线程扫描和定期数据库更新 || &amp;lt;code&amp;gt;sudo apt install clamav clamav-daemon&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;更新病毒库：&amp;lt;code&amp;gt;sudo freshclam&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;扫描目录：&amp;lt;code&amp;gt;clamscan -r /home&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Firejail || 沙盒隔离 || 轻量级容器化工具，通过命名空间和 seccomp 限制程序访问文件系统、网络、进程等资源，实现应用级隔离 || &amp;lt;code&amp;gt;sudo apt install firejail firejail-profiles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;运行沙盒：&amp;lt;code&amp;gt;firejail firefox&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;私有目录：&amp;lt;code&amp;gt;firejail --private ~/sandbox bash&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
===禁止软件联网===&lt;br /&gt;
* 使用Firejail&lt;br /&gt;
&lt;br /&gt;
* 使用AppArmor&lt;br /&gt;
&lt;br /&gt;
===常见问题===&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/sda2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;&lt;br /&gt;
printf &amp;quot;RESUME=UUID=$(blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;)\n&amp;quot; | sudo tee /etc/initramfs-tools/conf.d/resume&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues askubuntu.com：]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 备份与还原 ==&lt;br /&gt;
=== 使用dd备份还原 ===&lt;br /&gt;
关机，插入ubuntu安装u盘，进入试用系统，dd命令镜像硬盘，配合gzip压缩文件，多核cpu可以使用pigz并行压缩更快。一般备份&amp;lt;code&amp;gt;/boot/efi&amp;lt;/code&amp;gt;、&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; 、&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; 所在分区。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
测试环境：系统盘在Samsung SSD 980 1TB，备份位置在西部2TB黑盘7200转（WD2003FZEX），&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 不使用压缩，分区多大，生成文件就多大。&lt;br /&gt;
sudo dd if=/dev/nvme0n1p1 of=/media/ubuntu/newpan/nvme0n1p1.img bs=64M status=progress&lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz&lt;br /&gt;
# nvme0n1p2为ssd硬盘分区，保存分区newpan为HDD硬盘，12核cpu使用pigz压缩&lt;br /&gt;
# /分区 100G，压缩后6.5G，总用时152s，速度约为673MB/s， 测试bs=128M用时还多27s。&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | pigz -3 -p 12 &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250101.img.gz &lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# 速度比pigz慢10多倍，大约50MB/s&lt;br /&gt;
 sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | gzip -c &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250102.img.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
还原&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# img.gz文件大小10.8G，块大小100G，用时327s，速度约306MB/s&lt;br /&gt;
sudo gzip -d -c nvme0n1p2.20250101.img.gz | sudo dd of=/dev/nvme0n1p2 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz，速度与gzip差不多，&lt;br /&gt;
# 15.3G 82G 276s 296MB/s&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo pigz -d -c -p 12 nvme0n1p5.20250101.img.gz | sudo dd of=/dev/nvme0n1p5 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 备份软件 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 接口&lt;br /&gt;
! 级别&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| Déjà Dup  &lt;br /&gt;
| 图形界面&lt;br /&gt;
| 文件&lt;br /&gt;
| Ubuntu的默认桌面备份管理器，桌面左上角点击Activities，搜索&amp;lt;code&amp;gt;backups&amp;lt;/code&amp;gt;可以找到。&lt;br /&gt;
| [https://wiki.gnome.org/Apps/DejaDup gnome]&lt;br /&gt;
|- &lt;br /&gt;
| tar&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| rsync&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| dd&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 使用dd镜像硬盘，配合gzip压缩文件。不能使用dd备份当前正在使用的块存储设备，会导致文件系统上的不一致。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[clonezilla]]&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[partclone]]&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。clonezilla开发，clonezilla也默认使用partclone备份。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| TimeShift&lt;br /&gt;
| 图形界面&lt;br /&gt;
| &lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| systemback&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://help.ubuntu.com/community/BackupYourSystem Ubuntu 社区wiki：备份你的系统]&lt;br /&gt;
|[https://en.wikipedia.org/wiki/List_of_backup_software 维基百科：备份软件列表]&lt;br /&gt;
|[https://www.dell.com/support/kbdoc/zh-cn/000152034/如何使用Ubuntu Linux备份实用程序备份戴尔PC ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===显示问题===&lt;br /&gt;
1.屏幕偶尔几秒黑屏一下。&lt;br /&gt;
&lt;br /&gt;
2.黑屏后无法唤起。&lt;br /&gt;
&lt;br /&gt;
===声音问题===&lt;br /&gt;
1.USB耳机或音响没声音&lt;br /&gt;
设置》声音》选择输出设备，如果3.5mm接口输出，选择线缆输出built-in Audio。&lt;br /&gt;
&lt;br /&gt;
或者&lt;br /&gt;
*在终端输入&amp;lt;code&amp;gt;alsamixer&amp;lt;/code&amp;gt;命令，打开AlsaMixer&lt;br /&gt;
*按F6选择声卡&lt;br /&gt;
*查看声音设备的id：&amp;lt;code&amp;gt;cat /proc/asound/cards&amp;lt;/code&amp;gt;&lt;br /&gt;
*打开&amp;lt;code&amp;gt;sudo gpedit /etc/asound.conf&amp;lt;/code&amp;gt;，根据声卡id设置默认声卡。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
defaults.ctl.card 2&lt;br /&gt;
defaults.pcm.card 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/447718/no-sound-on-usb-headset-how-to-manage-soundcards-and-audio-devices askubuntu.com：USB耳机上没有声音，如何管理声卡和音频设备？]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===系统程序出现问题===&lt;br /&gt;
桌面版，有时会弹出”检测到系统程序出现问题“面板。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 列出存储系统或应用程序崩溃时生成的崩溃报告&lt;br /&gt;
ls -al /var/crash/&lt;br /&gt;
&lt;br /&gt;
# 查看崩溃报告内容，如_bin_brltty.0.crash&lt;br /&gt;
less /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 修复导致崩溃的问题&lt;br /&gt;
# 1.更新系统&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
# 2.检查具体程序，删除或者重新安装，比如brltty盲文显示器程序&lt;br /&gt;
sudo apt remove brltty  # 删除brltty&lt;br /&gt;
sudo apt install --reinstall brltty   # 如果brltty需要重新安装brltty &lt;br /&gt;
# 查看系统日志，获取更多信息，搜索相关内容&lt;br /&gt;
journalctl -p err &lt;br /&gt;
grep -i error /var/log/syslog&lt;br /&gt;
&lt;br /&gt;
# 删除崩溃报告&lt;br /&gt;
sudo rm /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 提交给Ubuntu的开发者&lt;br /&gt;
apport-cli /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
如果崩溃仍然存在，而且不需要提醒，可以禁用Apport。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo vim /etc/default/apport&lt;br /&gt;
&lt;br /&gt;
# 将配置文件enabled=1 改为enabled=0，并保存&lt;br /&gt;
&lt;br /&gt;
# 重启电脑&lt;br /&gt;
sudo reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
* 崩溃报告可能包含敏感信息，因此在提交之前请确保你了解报告的内容。&lt;br /&gt;
* 如果你经常遇到某个应用程序崩溃，建议检查是否有更新版本可用，或者查看相关的支持论坛以获取帮助。&lt;br /&gt;
&lt;br /&gt;
===启动慢===&lt;br /&gt;
使用 systemd-analyze 查看详细耗时：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
systemd-analyze time               # 总时间&lt;br /&gt;
systemd-analyze blame              # 按耗时排序的服务&lt;br /&gt;
systemd-analyze critical-chain     # 关键依赖链&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
移除 quiet splash 可看到详细启动日志，观察卡在哪：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
# 暂时去掉 quiet splash&lt;br /&gt;
# GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;   &lt;br /&gt;
&lt;br /&gt;
sudo update-grub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Ubuntu 官网：https://ubuntu.com/ &lt;br /&gt;
*Ubuntu 文档：https://help.ubuntu.com/&lt;br /&gt;
*Ubuntu 社区wiki：https://help.ubuntu.com/community/CommunityHelpWiki&lt;br /&gt;
*Ubuntu 桌面指南：https://help.ubuntu.com/stable/ubuntu-help/index.html.zh-CN&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/zh-cn/Ubuntu 维基百科：Ubuntu]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:系统软件]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Samba&amp;diff=1770</id>
		<title>Samba</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Samba&amp;diff=1770"/>
		<updated>2026-04-30T01:12:32Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* linux挂载 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Samba是一个开源软件套件，允许Linux和Unix系统与Windows系统共享文件和打印机。它通过SMB/CIFS协议实现互操作性。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
===安装===&lt;br /&gt;
Ubuntu/Debian:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install samba&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Samba===&lt;br /&gt;
Samba的配置文件通常位于/etc/samba/smb.conf。没有新建一个。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; &amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   server string = Samba Server&lt;br /&gt;
   netbios name = linuxserver&lt;br /&gt;
   security = user&lt;br /&gt;
&lt;br /&gt;
[shared] &lt;br /&gt;
   path = /home/username/shared&lt;br /&gt;
   browsable = yes&lt;br /&gt;
   writable = yes&lt;br /&gt;
   guest ok = no&lt;br /&gt;
   read only = no&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
配置说明：&lt;br /&gt;
* [global]：定义全局设置。&lt;br /&gt;
** workgroup：工作组名称，通常与Windows系统的工作组一致。&lt;br /&gt;
** server string：服务器的描述文字。&lt;br /&gt;
** netbios name：服务器的NetBIOS名称。&lt;br /&gt;
** security = user：启用用户级安全认证。&lt;br /&gt;
* [shared]：定义一个共享目录。&lt;br /&gt;
** path：共享目录的路径。&lt;br /&gt;
** browsable：允许客户端浏览此共享。&lt;br /&gt;
** writable：允许写入权限。&lt;br /&gt;
** guest ok：是否允许匿名访问（此处为否）。&lt;br /&gt;
** read only：是否只读（此处为否）。&lt;br /&gt;
&lt;br /&gt;
===创建共享目录===&lt;br /&gt;
创建配置文件中指定的共享目录，并设置适当的权限：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /home/username/shared&lt;br /&gt;
sudo chown -R nobody:nogroup  /home/username/shared&lt;br /&gt;
sudo chmod -R 0700 /home/username/shared&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===添加Samba用户===&lt;br /&gt;
Samba使用独立的密码数据库。需要为系统用户创建Samba账，如username：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 如果还不是系统用户，需要先创建&lt;br /&gt;
# sudo adduser username&lt;br /&gt;
&lt;br /&gt;
sudo smbpasswd -a username&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===启动和启用Samba服务===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo systemctl start smbd&lt;br /&gt;
sudo systemctl enable smbd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===访问共享===&lt;br /&gt;
在Windows系统中，可以通过以下方式访问Samba共享：&lt;br /&gt;
打开“文件资源管理器”，输入\\linuxserver\shared（用服务器的IP地址或NetBIOS名称替换linuxserver）。&lt;br /&gt;
或使用“映射网络驱动器”功能连接到共享。&lt;br /&gt;
&lt;br /&gt;
==服务端配置 ==&lt;br /&gt;
==客户端挂载 ==&lt;br /&gt;
===linux挂载===&lt;br /&gt;
图形界面挂载Samba共享：&lt;br /&gt;
*打开文件管理器，点击侧边栏‘网络’，输入服务器地，如&amp;lt;code&amp;gt;smb://192.168.1.100/YourShare&amp;lt;/code&amp;gt;，点击连接。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使用[[mount]]命令行挂载：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 安装 cifs-utils 来支持挂载命令&lt;br /&gt;
sudo apt install cifs-utils -y&lt;br /&gt;
&lt;br /&gt;
# 创建挂载点&lt;br /&gt;
mkdir ~/mysambashare&lt;br /&gt;
&lt;br /&gt;
# 执行挂载，输入密码 (Samba 密码)&lt;br /&gt;
sudo mount -t cifs //192.168.1.100/YourShare ~/mysambashare -o username=your_username&lt;br /&gt;
&lt;br /&gt;
# 使用凭据文件，免每次手动输密码。&lt;br /&gt;
# 1. 创建文件（替换 username 和 password）&lt;br /&gt;
echo -e &amp;quot;username=your_username\npassword=your_password&amp;quot; &amp;gt; ~/.smbcredentials&lt;br /&gt;
# 2. 设置权限（重要：防止泄露）&lt;br /&gt;
chmod 600 ~/.smbcredentials&lt;br /&gt;
# 3. 挂载时引用&lt;br /&gt;
sudo mount -t cifs //192.168.1.100/YourShare ~/mysambashare -o credentials=~/.smbcredentials&lt;br /&gt;
&lt;br /&gt;
# 开机自动挂载&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# 在fstab文件，在末尾添加一行，&lt;br /&gt;
# 为避免报错导致无法开机，强烈建议使用 x-systemd.automount 或 nofail 选项。&lt;br /&gt;
//192.168.1.100/YourShare  /home/your_username/mysambashare  cifs  credentials=/home/your_username/.smbcredentials,uid=你的本地uid,gid=你的本地gid,iocharset=utf8,nofail,x-systemd.automount  0  0&lt;br /&gt;
&lt;br /&gt;
# 测试挂载&lt;br /&gt;
sudo mount -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===windows挂载===&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* Samba官网：https://www.samba.org/&lt;br /&gt;
* Samba Wiki：https://wiki.samba.org/&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
*Ubuntu教程：安装和配置Samba https://ubuntu.com/tutorials/install-and-configure-samba&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Mount&amp;diff=1769</id>
		<title>Mount</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Mount&amp;diff=1769"/>
		<updated>2026-04-30T01:11:42Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;mount是一个UNIX/[[Linux]]系统上的命令，用于挂载[[文件系统]]。Linux系统中所有可访问文件都根目录（&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;）及其子孙目录，但这些文件可以位于不同的设备上。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==用法==&lt;br /&gt;
&lt;br /&gt;
==参数==&lt;br /&gt;
&lt;br /&gt;
==永久挂载==&lt;br /&gt;
永久挂载是在系统重启后不会失效。安装系统时进行的分区挂载是永久挂载，如把第一块磁盘的第二个分区（&amp;lt;code&amp;gt;/dev/sda2&amp;lt;/code&amp;gt;）永久挂载到&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;目录，则&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;目录下所有文件都位于该分区。可以使用命令&amp;lt;code&amp;gt;cat /etc/fstab&amp;lt;/code&amp;gt;查看该配置文件。&lt;br /&gt;
&lt;br /&gt;
要设置永久挂载，编辑配置文件&amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;即可。文件中的每行都定义文件系统的挂载点，分6个字段，使用空格分开。示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看挂载的分区及其 UUID 或设备名称。&lt;br /&gt;
sudo blkid&lt;br /&gt;
&lt;br /&gt;
# 创建挂载点。通常放在 /mnt 或 /media 目录下。&lt;br /&gt;
sudo mkdir /media/mydisk&lt;br /&gt;
&lt;br /&gt;
# 编辑 /etc/fstab 文件，使用nano 或 vim等编辑&lt;br /&gt;
sudo vim /etc/fstab&lt;br /&gt;
&lt;br /&gt;
# 在文件末尾添加一行，格式如下：&lt;br /&gt;
# UUID=&amp;lt;分区UUID&amp;gt;  &amp;lt;挂载点&amp;gt;  &amp;lt;文件系统类型&amp;gt;  &amp;lt;挂载选项&amp;gt;  &amp;lt;dump&amp;gt;  &amp;lt;fsck&amp;gt;&lt;br /&gt;
UUID=your-uuid  /media/mydisk  ext4  defaults  0  2&lt;br /&gt;
# 对于ntfs，可以ntfs-3g模拟权限管理&lt;br /&gt;
UUID=your-uuid /media/mydisk ntfs-3g uid=1000,gid=1000,permissions 0 0&lt;br /&gt;
# 对于ntfs，可以ntfs-3g模拟权限管理，&lt;br /&gt;
# 固定目录权限为755（dmask=022），文件权限为644（fmask=133）&lt;br /&gt;
UUID=your-uuid /media/mydisk ntfs-3g uid=1000,gid=1000,dmask=022,fmask=133 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
下表为&amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;文件6个字段详细解释。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 序号&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 块设备&amp;lt;br \&amp;gt;file system&lt;br /&gt;
| UUID或/dev/路径。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;UUID是存储设备在系统中唯一标识字符串，建议使用这种方式，不会因为加载顺序而改变。查看所有硬盘的uuid：&amp;lt;code&amp;gt;ls -l /dev/disk/by-uuid&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt; &amp;lt;br \&amp;gt;/dev/路径&lt;br /&gt;
| &amp;lt;code&amp;gt;UUID=e9320e9c-1b60-4082-b341-bca05d00d4df&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;/dev/sdc2&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| 2&lt;br /&gt;
| 挂载点&amp;lt;br \&amp;gt;mount point&lt;br /&gt;
| 通常放在 /mnt 或 /media 目录下。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 3&lt;br /&gt;
| 文件系统类型&amp;lt;br \&amp;gt;type&lt;br /&gt;
| Linux支持多种文件系统：ext4, xfs, btrfs, f2fs, vfat, ntfs, hfsplus, tmpfs, sysfs, proc, iso9660, udf, squashfs, nfs, cifs等。&lt;br /&gt;
| &amp;lt;code&amp;gt;ext4&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;ntfs&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| 4&lt;br /&gt;
| 选项&amp;lt;br \&amp;gt;options&lt;br /&gt;
|  通常使用 defaults，表示默认选项。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 5&lt;br /&gt;
| dump&lt;br /&gt;
| 备份工具 dump 使用的标志，通常设置为 0&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 6&lt;br /&gt;
| pass&lt;br /&gt;
| 文件系统检查顺序，根分区为 1，其他分区为 2，不检查为 0&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==卸载==&lt;br /&gt;
&lt;br /&gt;
基本卸载命令&lt;br /&gt;
 sudo umount /mnt/nas&lt;br /&gt;
&lt;br /&gt;
懒卸载 (lazy unmount),让文件系统立即从目录树中分离，等不再使用时再真正卸载。&lt;br /&gt;
 sudo umount -l /mnt/nas&lt;br /&gt;
&lt;br /&gt;
强制卸载&lt;br /&gt;
 sudo umount -f /mnt/nas&lt;br /&gt;
&lt;br /&gt;
常见问题及解决方法:&lt;br /&gt;
* 目标正忙 (target is busy)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 查看&lt;br /&gt;
sudo fuser -v /mnt/nas&lt;br /&gt;
# 或者&lt;br /&gt;
sudo lsof | grep /mnt/nas&lt;br /&gt;
&lt;br /&gt;
# 强制结束使用该目录的进程&lt;br /&gt;
sudo fuser -km /mnt/nas&lt;br /&gt;
&lt;br /&gt;
# 然后重新卸载&lt;br /&gt;
sudo umount /mnt/nas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://man7.org/linux/man-pages/man5/fstab.5.html man7.org：fstab(5)]&lt;br /&gt;
|[https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/managing_file_systems/assembly_persistently-mounting-file-systems_managing-file-systems Red Hat 文档：Red Hat Enterprise Linux 8 - 第 16 章 永久挂载文件系统]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===相关网站===&lt;br /&gt;
*[https://man7.org/linux/man-pages/man8/mount.8.html man7.org：mount(8) ]&lt;br /&gt;
*[https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/managing_file_systems/assembly_mounting-file-systems_managing-file-systems Red Hat 文档：Red Hat Enterprise Linux 8 - 第 14 章 挂载文件系统]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/Mount_(Unix) 维基百科：mount (Unix)]&lt;br /&gt;
&lt;br /&gt;
[[分类:命令行程序]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Samba&amp;diff=1768</id>
		<title>Samba</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Samba&amp;diff=1768"/>
		<updated>2026-04-30T00:47:18Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Samba是一个开源软件套件，允许Linux和Unix系统与Windows系统共享文件和打印机。它通过SMB/CIFS协议实现互操作性。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
===安装===&lt;br /&gt;
Ubuntu/Debian:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install samba&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===配置Samba===&lt;br /&gt;
Samba的配置文件通常位于/etc/samba/smb.conf。没有新建一个。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot; &amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   server string = Samba Server&lt;br /&gt;
   netbios name = linuxserver&lt;br /&gt;
   security = user&lt;br /&gt;
&lt;br /&gt;
[shared] &lt;br /&gt;
   path = /home/username/shared&lt;br /&gt;
   browsable = yes&lt;br /&gt;
   writable = yes&lt;br /&gt;
   guest ok = no&lt;br /&gt;
   read only = no&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
配置说明：&lt;br /&gt;
* [global]：定义全局设置。&lt;br /&gt;
** workgroup：工作组名称，通常与Windows系统的工作组一致。&lt;br /&gt;
** server string：服务器的描述文字。&lt;br /&gt;
** netbios name：服务器的NetBIOS名称。&lt;br /&gt;
** security = user：启用用户级安全认证。&lt;br /&gt;
* [shared]：定义一个共享目录。&lt;br /&gt;
** path：共享目录的路径。&lt;br /&gt;
** browsable：允许客户端浏览此共享。&lt;br /&gt;
** writable：允许写入权限。&lt;br /&gt;
** guest ok：是否允许匿名访问（此处为否）。&lt;br /&gt;
** read only：是否只读（此处为否）。&lt;br /&gt;
&lt;br /&gt;
===创建共享目录===&lt;br /&gt;
创建配置文件中指定的共享目录，并设置适当的权限：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /home/username/shared&lt;br /&gt;
sudo chown -R nobody:nogroup  /home/username/shared&lt;br /&gt;
sudo chmod -R 0700 /home/username/shared&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===添加Samba用户===&lt;br /&gt;
Samba使用独立的密码数据库。需要为系统用户创建Samba账，如username：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 如果还不是系统用户，需要先创建&lt;br /&gt;
# sudo adduser username&lt;br /&gt;
&lt;br /&gt;
sudo smbpasswd -a username&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===启动和启用Samba服务===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo systemctl start smbd&lt;br /&gt;
sudo systemctl enable smbd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===访问共享===&lt;br /&gt;
在Windows系统中，可以通过以下方式访问Samba共享：&lt;br /&gt;
打开“文件资源管理器”，输入\\linuxserver\shared（用服务器的IP地址或NetBIOS名称替换linuxserver）。&lt;br /&gt;
或使用“映射网络驱动器”功能连接到共享。&lt;br /&gt;
&lt;br /&gt;
==服务端配置 ==&lt;br /&gt;
==客户端挂载 ==&lt;br /&gt;
===linux挂载===&lt;br /&gt;
图形界面挂载Samba共享：&lt;br /&gt;
*打开文件管理器，点击侧边栏‘网络’，输入服务器地，如&amp;lt;code&amp;gt;smb://192.168.1.100/YourShare&amp;lt;/code&amp;gt;，点击连接。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
命令行挂载：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 安装 cifs-utils 来支持挂载命令&lt;br /&gt;
sudo apt install cifs-utils -y&lt;br /&gt;
&lt;br /&gt;
# 创建挂载点&lt;br /&gt;
mkdir ~/mysambashare&lt;br /&gt;
&lt;br /&gt;
# 执行挂载，输入密码 (Samba 密码)&lt;br /&gt;
sudo mount -t cifs //192.168.1.100/YourShare ~/mysambashare -o username=your_username&lt;br /&gt;
&lt;br /&gt;
# 使用凭据文件，免每次手动输密码。&lt;br /&gt;
# 1. 创建文件（替换 username 和 password）&lt;br /&gt;
echo -e &amp;quot;username=your_username\npassword=your_password&amp;quot; &amp;gt; ~/.smbcredentials&lt;br /&gt;
# 2. 设置权限（重要：防止泄露）&lt;br /&gt;
chmod 600 ~/.smbcredentials&lt;br /&gt;
# 3. 挂载时引用&lt;br /&gt;
sudo mount -t cifs //192.168.1.100/YourShare ~/mysambashare -o credentials=~/.smbcredentials&lt;br /&gt;
&lt;br /&gt;
# 开机自动挂载&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# 在fstab文件，在末尾添加一行，&lt;br /&gt;
# 为避免报错导致无法开机，强烈建议使用 x-systemd.automount 或 nofail 选项。&lt;br /&gt;
//192.168.1.100/YourShare  /home/your_username/mysambashare  cifs  credentials=/home/your_username/.smbcredentials,uid=你的本地uid,gid=你的本地gid,iocharset=utf8,nofail,x-systemd.automount  0  0&lt;br /&gt;
&lt;br /&gt;
# 测试挂载&lt;br /&gt;
sudo mount -a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===windows挂载===&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* Samba官网：https://www.samba.org/&lt;br /&gt;
* Samba Wiki：https://wiki.samba.org/&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
*Ubuntu教程：安装和配置Samba https://ubuntu.com/tutorials/install-and-configure-samba&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1767</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1767"/>
		<updated>2026-04-29T13:56:22Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==Windows VirtIO 驱动程序==&lt;br /&gt;
安装windows虚拟机，使用有点卡，可以安装Windows VirtIO 驱动程序，类似[[VMware]] Tools，还支持拖拽传文件。绝大多数现代 Linux 发行版的“内核”已经自带了完整的 VirtIO 驱动，所以当你创建 Linux 虚拟机时，只要在配置时将磁盘和网卡的类型选择为 VirtIO，系统通常就能直接识别和使用它们。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ 页面选择最新版本下载，选择一种即可：&lt;br /&gt;
*virtio-win.iso: 在宿主机上下载，挂载到虚拟机，再安装。&lt;br /&gt;
*virtio-win-gt-x64.msi：直接在虚拟机里面下载安装，仅包含核心驱动（如网卡、磁盘、内存 balloon 驱动等）&lt;br /&gt;
*virtio-win-guest-tools.exe：直接在虚拟机里面下载安装，包含核心驱动和EMU Guest Agent。&lt;br /&gt;
&lt;br /&gt;
* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;br /&gt;
* https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===权限问题===&lt;br /&gt;
挂载某个分区，如/run/media/xxx 通常 是由 udisks 自动挂载的，默认 ACL 只允许 xxx 用户访问，可以修改权限，或挂载到其他地方。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看分区信息，&lt;br /&gt;
sudo blkid | grep nvme1n1p4&lt;br /&gt;
lsblk -f /dev/nvme1n1p4&lt;br /&gt;
&lt;br /&gt;
# 创建专用目录用于虚拟机存储&lt;br /&gt;
sudo mkdir -p /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 卸载当前挂载&lt;br /&gt;
sudo umount /run/media/xxx/xxxx&lt;br /&gt;
# 重新挂载到新位置&lt;br /&gt;
sudo mount /dev/nvme1n1p4 /var/lib/libvirt/kvm-storage&lt;br /&gt;
# 设置正确的所有者和权限&lt;br /&gt;
sudo chown libvirt-qemu:kvm /var/lib/libvirt/kvm-storage&lt;br /&gt;
sudo chmod 755 /var/lib/libvirt/kvm-storage&lt;br /&gt;
&lt;br /&gt;
#设置开机自动挂载（可选）&lt;br /&gt;
# 获取分区的 UUID&lt;br /&gt;
sudo blkid /dev/nvme1n1p4&lt;br /&gt;
# 编辑 fstab&lt;br /&gt;
sudo nano /etc/fstab&lt;br /&gt;
# fstab中添加类似这样的行（用实际的 UUID 替换）&lt;br /&gt;
/dev/disk/by-uuid/xxxx / ext4 defaults 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1766</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1766"/>
		<updated>2026-04-29T12:10:27Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==Windows VirtIO 驱动程序==&lt;br /&gt;
安装windows虚拟机，使用有点卡，可以安装Windows VirtIO 驱动程序，类似[[VMware]] Tools，还支持拖拽传文件。绝大多数现代 Linux 发行版的“内核”已经自带了完整的 VirtIO 驱动，所以当你创建 Linux 虚拟机时，只要在配置时将磁盘和网卡的类型选择为 VirtIO，系统通常就能直接识别和使用它们。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ 页面选择最新版本下载，选择一种即可：&lt;br /&gt;
*virtio-win.iso: 在宿主机上下载，挂载到虚拟机，再安装。&lt;br /&gt;
*virtio-win-gt-x64.msi：直接在虚拟机里面下载安装，仅包含核心驱动（如网卡、磁盘、内存 balloon 驱动等）&lt;br /&gt;
*virtio-win-guest-tools.exe：直接在虚拟机里面下载安装，包含核心驱动和EMU Guest Agent。&lt;br /&gt;
&lt;br /&gt;
* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/&lt;br /&gt;
* https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Ubuntu&amp;diff=1765</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Ubuntu&amp;diff=1765"/>
		<updated>2026-04-29T06:53:33Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 常见问题 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ubuntu是一个[[Linux]]的发行版，由Canonical公司发布并提供商业支持。Ubuntu项目公开承诺开源软件开发的原则；鼓励人们使用自由软件，研究它的运作原理，改进和分发。Ubuntu是著名的[[Linux]]发行版之一，基于[[Debian]]发行版和GNOME桌面环境。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2004年10月20日，马克·舍特尔沃斯创立并发布Ubuntu第一个版本Ubuntu 4.10，它以Debian为开发蓝本。 &lt;br /&gt;
*2005年7月8日，马克·舍特尔沃斯与Canonical有限公司宣布成立Ubuntu基金会，并提供1千万美元作为启始营运资金。但直至2006年，此基金会仍未投入运作。马克·舍特尔沃斯形容此基金会是在Canonical有限公司出现财务危机时的紧急营运资金。&lt;br /&gt;
&lt;br /&gt;
===版本===&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====制作启动U盘====&lt;br /&gt;
Ubuntu官网下载ISO镜像。&lt;br /&gt;
&lt;br /&gt;
linux中制作启动U盘：&lt;br /&gt;
方法一：使用dd命令，一定要注意看清楚哪个盘，不然可能格式化错盘。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 插入u盘，查看所有块设备：&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd命令写入ISO到U盘，如u盘为sdx：&lt;br /&gt;
sudo dd if=/path/to/ubuntu.iso of=/dev/sdx bs=4M status=progress&lt;br /&gt;
&lt;br /&gt;
# 安全移除U盘&lt;br /&gt;
sudo eject /dev/sdx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
windows中制作启动U盘：&lt;br /&gt;
方法一，Ubuntu官方教程使用[[Rufus]]软件制作启动U盘，下面使用[[UltraISO]]软件制作启动U盘，只是写启动盘可以用试用版。&lt;br /&gt;
*打开UltraISO，选择下载好的Ubuntu系统&lt;br /&gt;
*点击菜单栏‘启动’》‘写入硬盘映像’&lt;br /&gt;
*在对话框的‘硬盘驱动器’处选择要刻录的U盘&lt;br /&gt;
*然后点击‘写入’，注意U盘会被格式化所有资料都没有&lt;br /&gt;
*启动U盘制作完成，可以用它在任何电脑安装Ubuntu&lt;br /&gt;
&lt;br /&gt;
方法二，也可以使用&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;xcopy&amp;lt;/code&amp;gt;命令行制作ubuntu的启动U盘，在如下：&lt;br /&gt;
* 搜索框输入&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;，打开命令提示符。 &lt;br /&gt;
* 在cmd中输入&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt; ， 打开磁盘管理。&lt;br /&gt;
* &amp;lt;code&amp;gt;list disk&amp;lt;/code&amp;gt;，查看所有磁盘信息。&lt;br /&gt;
* &amp;lt;code&amp;gt;select disk 2&amp;lt;/code&amp;gt;，选择U盘，示例U盘为disk 2。&lt;br /&gt;
* &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;，清除U盘。&lt;br /&gt;
* &amp;lt;code&amp;gt;create partition primary&amp;lt;/code&amp;gt;，创建分区。&lt;br /&gt;
* &amp;lt;code&amp;gt;select partition 1&amp;lt;/code&amp;gt;，选择分区1。&lt;br /&gt;
* &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;，将当前分区标记为活动。&lt;br /&gt;
* &amp;lt;code&amp;gt;format fs=ntfs quick&amp;lt;/code&amp;gt;，格式化分区为ntfs格式。&lt;br /&gt;
* &amp;lt;code&amp;gt;assign&amp;lt;/code&amp;gt;，分配盘符。&lt;br /&gt;
* &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;，退出。&lt;br /&gt;
* 选择下载好的iso文件，右键点击装载。查看装载后的盘符，如&amp;lt;code&amp;gt;G：&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;xcopy G:\*.* /e /h /f H:\&amp;lt;/code&amp;gt;，复制所有文件到U盘。其中&amp;lt;code&amp;gt;H:&amp;lt;/code&amp;gt;为U盘的盘符。&amp;lt;code&amp;gt;/e&amp;lt;/code&amp;gt;复制所有子目录，即使它们是空的。&amp;lt;code&amp;gt;/h&amp;lt;/code&amp;gt;复制具有隐藏文件和系统文件属性的文件。 &amp;lt;code&amp;gt;/f&amp;lt;/code&amp;gt;复制时显示源文件名和目标文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-windows#1-overview Ubuntu 教程：Windows上制作启动U盘]&lt;br /&gt;
|[https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/xcopy Windows Server文档：xcopy]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====安装到电脑====&lt;br /&gt;
&lt;br /&gt;
====安装到U盘====&lt;br /&gt;
&lt;br /&gt;
====分区方案====&lt;br /&gt;
{{Linux分区方案}}&lt;br /&gt;
==技巧==&lt;br /&gt;
*创建某个目录在桌面快捷方式&lt;br /&gt;
点击某个目录，按住Ctrl + Shift，拖动到桌面目录(文件打开)里，注意不能直接拖动到桌面。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
===软件安装===&lt;br /&gt;
====apt====&lt;br /&gt;
&lt;br /&gt;
====deb====&lt;br /&gt;
&lt;br /&gt;
====AppImage====&lt;br /&gt;
是Linux上的一种应用打包格式，将程序所有文件打包成一个AppImage，可以在不同Linux发行版上运行。直接运行，不需要安装运行库。&lt;br /&gt;
&lt;br /&gt;
运行AppImage格式程序&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
#  进入AppImage 文件所在目录，为文件添加可执行权限&lt;br /&gt;
cd /path/to/directory&lt;br /&gt;
chmod +x example.AppImage&lt;br /&gt;
&lt;br /&gt;
# 直接运行文件&lt;br /&gt;
./example.AppImage&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===快捷方式===&lt;br /&gt;
应用程序和桌面创建快捷方式。.desktop 文件是 Linux 桌面环境中用于定义应用程序启动器、菜单项或快捷方式的配置文件。常用文件内容如下：&lt;br /&gt;
*Name：应用程序的显示名称（必填）。&lt;br /&gt;
*Exec：启动应用程序的命令（必填），路径使用绝对路径。&lt;br /&gt;
*Type：定义文件类型，常见值：Application：应用程序，Link：快捷方式，Directory：目录&lt;br /&gt;
*Icon：Ubuntu支持的图标格式包括 PNG、SVG、XPM。注意路径最后面不要有空格，否则图标不会显示。图标可以在提取文件里找&amp;lt;code&amp;gt;./example.AppImage --appimage-extract&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 创建 .desktop 文件&lt;br /&gt;
vim ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 编辑 .desktop 文件内容&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Example App&lt;br /&gt;
Exec=/path/to/example.AppImage&lt;br /&gt;
Type=Application&lt;br /&gt;
Terminal=false&lt;br /&gt;
Icon=/path/to/icon.png&lt;br /&gt;
Comment=Example App Shortcut&lt;br /&gt;
Categories=Utility;&lt;br /&gt;
&lt;br /&gt;
# 保存并赋予权限&lt;br /&gt;
chmod +x ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 复制到桌面&lt;br /&gt;
# 桌面上点击图标，右键，点击允许运行&lt;br /&gt;
cp ~/.local/share/applications/example.desktop ~/Desktop/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Edge多个用户启动====&lt;br /&gt;
Edge地址栏输入并访问 edge://version/，找到 &amp;quot;个人资料路径&amp;quot; 这一栏。路径末尾的 Default 就是你的默认用户的目录名。第二个用户通常名为 Profile 1、Profile 2，或是你自定义的名称。示例，创建不同的 .desktop 文件，启动时指定不同Edge用户：&lt;br /&gt;
 nano ~/.local/share/applications/edge-profile1.desktop&lt;br /&gt;
输入如下内容，ctrl+o保存，ctrl+x退出：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Type=Application&lt;br /&gt;
Name=Edge 用户1&lt;br /&gt;
Exec=/usr/bin/microsoft-edge --profile-directory=&amp;quot;Profile 1&amp;quot;&lt;br /&gt;
# 或者Icon=/path/to/microsoft-edge.Profile1.png&lt;br /&gt;
Icon=microsoft-edge&lt;br /&gt;
Terminal=false&lt;br /&gt;
Comment=使用个人资料1打开Microsoft Edge&lt;br /&gt;
# Categories=Network;&lt;br /&gt;
# StartupWMClass=edge-profile1   # 用于区分窗口&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
点击系统菜单，显示所有应用，找到刚才命名的名字“Edge - 用户1”，右键点击它的图标，选择“添加到收藏夹”或“添加到Dock”。&lt;br /&gt;
&lt;br /&gt;
===常用软件===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| [[KVM]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[VLC]]&lt;br /&gt;
| VLC是一款开源的、免费的多平台视频播放器，支持MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3等格式。 安装命令：sudo apt install vlc     &lt;br /&gt;
| [https://www.videolan.org/vlc/ 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[VMware Workstation]]&lt;br /&gt;
| &lt;br /&gt;
| [https://www.vmware.com/products/workstation-pro.html 官网] [https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载]&lt;br /&gt;
|- &lt;br /&gt;
| WPS&lt;br /&gt;
| 金山办公套装软件,支持多人在线协作编辑Word、Excel和PPT文档。&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;   &amp;lt;br \&amp;gt;常见问题： &amp;lt;br \&amp;gt;*缺少系统字体：Symbol、Wingdings 1、Wingdings 2、Wingdings 3、Webdings、MT Extra， WPS无法正确地显示某些符号公式。因为这些字体是 Microsoft Windows 系统中的专有字体，而 Ubuntu 默认并未包含它们。&amp;lt;br \&amp;gt;解决方法：&amp;lt;br \&amp;gt;1.下载字体，从windows中复制字体C:\Windows\Fonts，或者web上搜索字体下载，或者从https://github.com/dv-anomaly/ttf-wps-fonts。 &amp;lt;br \&amp;gt;2.安在到系统中，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/fonts/wps-office &lt;br /&gt;
cd ~/Downloads/ttf-wps-fonts-master  # 进入下载好的目录&lt;br /&gt;
sudo cp mtextra.ttf symbol.ttf wingding.ttf WINGDNG3.ttf WEBDINGS.TTF  WINGDNG2.ttf /usr/share/fonts/wps-office/  &lt;br /&gt;
sudo fc-cache -fv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|[https://platform.wps.cn/ 下载]&lt;br /&gt;
|- &lt;br /&gt;
| [[IBus]]&lt;br /&gt;
| Ubuntu 24.04及其他各大[[Linux]]发行版的默认的多语输入平台。支持用户词典、用户lua脚本。&lt;br /&gt;
| [https://github.com/ibus/ibus/wiki 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[搜狗输入法]] &lt;br /&gt;
| 有自定义短语功能，支持多行空格等。Windows上有广告弹窗，安装其他软件。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;1.安装fcitx。&amp;lt;code&amp;gt;sudo apt-get install fcitx&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;2.添加中文语言支持 &amp;lt;br \&amp;gt;3.下载安装搜狗输入法。&amp;lt;code&amp;gt;sudo dpkg -i sogoupinyin_版本号_amd64.deb&amp;lt;/code&amp;gt; 。如果安装过程提示缺少依赖&amp;lt;code&amp;gt;sudo apt -f install&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;设置为默认输入法，点击桌面右上角键盘图标-&amp;gt;设置(Configure)-&amp;gt;Input Method将sougoupinyin移动到最上边。&lt;br /&gt;
| [https://pinyin.sogou.com/linux/ 官网] [https://pinyin.sogou.com/linux/help.php 安装指南]&lt;br /&gt;
|- &lt;br /&gt;
| 网易音乐&lt;br /&gt;
| 安装：&amp;lt;br \&amp;gt;1.点击下载客户端，其他操作系统客户端，Linux版 &amp;lt;br \&amp;gt;2.双击下载的deb文件安装&lt;br /&gt;
| [https://music.163.com/ 官网] [https://music.163.com/#/download 下载]&lt;br /&gt;
|- &lt;br /&gt;
| qq音乐&lt;br /&gt;
| &lt;br /&gt;
| [https://y.qq.com/download/download.html 下载]&lt;br /&gt;
|-&lt;br /&gt;
| [[Conky]]&lt;br /&gt;
| 桌面环境的系统监控工具。免费开源，高度可定制。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;code&amp;gt;sudo apt-get install conky&amp;lt;/code&amp;gt;&lt;br /&gt;
| [https://github.com/brndnmtthws/conky 官网]&lt;br /&gt;
|-&lt;br /&gt;
| btop&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==用户管理==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==网络设置==&lt;br /&gt;
===防火墙设置===&lt;br /&gt;
&lt;br /&gt;
==安装驱动==&lt;br /&gt;
===显卡驱动===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu软件库安装&lt;br /&gt;
| 推荐方法，简单快捷可更新。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装步骤：&amp;lt;br \&amp;gt;1.更新软件库 &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt;2.查找相关驱动 &amp;lt;code&amp;gt;sudo ubuntu-drivers devices&amp;lt;/code&amp;gt; ，后面带recommend是系统推荐版本&amp;lt;br \&amp;gt;3.安装驱动，安装指定版本如&amp;lt;code&amp;gt;sudo apt-get install nvidia-driver-470&amp;lt;/code&amp;gt;，直接安装系统推荐版本 &amp;lt;code&amp;gt;sudo ubuntu-drivers install&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;4.如果UEFI模式，需要导入签名。 &amp;lt;br \&amp;gt;5.重启系统 &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt;，验证是否安装成功 &amp;lt;code&amp;gt;sudo nvidia-smi&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| NVIDIA官网驱动安装&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.itzgeek.com/post/how-to-install-nvidia-drivers-on-ubuntu-20-04-ubuntu-18-04.html itzgeek.com：如何在 Ubuntu 20.04 和 Ubuntu 18.04 安装NVIDIA驱动]&lt;br /&gt;
|[https://ubuntu.com/blog/how-to-sign-things-for-secure-boot Ubuntu 博客：Secure Boot模式下如何签名]&lt;br /&gt;
|[https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled askubuntu.com：Secure Boot模式下如何安装NVIDIA驱动]&lt;br /&gt;
|[https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules/762255#762255 askubuntu.com：https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==安全设置==&lt;br /&gt;
&lt;br /&gt;
====常见问题====&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/sda2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;&lt;br /&gt;
printf &amp;quot;RESUME=UUID=$(blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;)\n&amp;quot; | sudo tee /etc/initramfs-tools/conf.d/resume&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues askubuntu.com：]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 备份与还原 ==&lt;br /&gt;
=== 使用dd备份还原 ===&lt;br /&gt;
关机，插入ubuntu安装u盘，进入试用系统，dd命令镜像硬盘，配合gzip压缩文件，多核cpu可以使用pigz并行压缩更快。一般备份&amp;lt;code&amp;gt;/boot/efi&amp;lt;/code&amp;gt;、&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; 、&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; 所在分区。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
测试环境：系统盘在Samsung SSD 980 1TB，备份位置在西部2TB黑盘7200转（WD2003FZEX），&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 不使用压缩，分区多大，生成文件就多大。&lt;br /&gt;
sudo dd if=/dev/nvme0n1p1 of=/media/ubuntu/newpan/nvme0n1p1.img bs=64M status=progress&lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz&lt;br /&gt;
# nvme0n1p2为ssd硬盘分区，保存分区newpan为HDD硬盘，12核cpu使用pigz压缩&lt;br /&gt;
# /分区 100G，压缩后6.5G，总用时152s，速度约为673MB/s， 测试bs=128M用时还多27s。&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | pigz -3 -p 12 &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250101.img.gz &lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# 速度比pigz慢10多倍，大约50MB/s&lt;br /&gt;
 sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | gzip -c &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250102.img.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
还原&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# img.gz文件大小10.8G，块大小100G，用时327s，速度约306MB/s&lt;br /&gt;
sudo gzip -d -c nvme0n1p2.20250101.img.gz | sudo dd of=/dev/nvme0n1p2 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz，速度与gzip差不多，&lt;br /&gt;
# 15.3G 82G 276s 296MB/s&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo pigz -d -c -p 12 nvme0n1p5.20250101.img.gz | sudo dd of=/dev/nvme0n1p5 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 备份软件 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 接口&lt;br /&gt;
! 级别&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| Déjà Dup  &lt;br /&gt;
| 图形界面&lt;br /&gt;
| 文件&lt;br /&gt;
| Ubuntu的默认桌面备份管理器，桌面左上角点击Activities，搜索&amp;lt;code&amp;gt;backups&amp;lt;/code&amp;gt;可以找到。&lt;br /&gt;
| [https://wiki.gnome.org/Apps/DejaDup gnome]&lt;br /&gt;
|- &lt;br /&gt;
| tar&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| rsync&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| dd&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 使用dd镜像硬盘，配合gzip压缩文件。不能使用dd备份当前正在使用的块存储设备，会导致文件系统上的不一致。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[clonezilla]]&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[partclone]]&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。clonezilla开发，clonezilla也默认使用partclone备份。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| TimeShift&lt;br /&gt;
| 图形界面&lt;br /&gt;
| &lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| systemback&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://help.ubuntu.com/community/BackupYourSystem Ubuntu 社区wiki：备份你的系统]&lt;br /&gt;
|[https://en.wikipedia.org/wiki/List_of_backup_software 维基百科：备份软件列表]&lt;br /&gt;
|[https://www.dell.com/support/kbdoc/zh-cn/000152034/如何使用Ubuntu Linux备份实用程序备份戴尔PC ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===显示问题===&lt;br /&gt;
1.屏幕偶尔几秒黑屏一下。&lt;br /&gt;
&lt;br /&gt;
2.黑屏后无法唤起。&lt;br /&gt;
&lt;br /&gt;
===声音问题===&lt;br /&gt;
1.USB耳机或音响没声音&lt;br /&gt;
设置》声音》选择输出设备，如果3.5mm接口输出，选择线缆输出built-in Audio。&lt;br /&gt;
&lt;br /&gt;
或者&lt;br /&gt;
*在终端输入&amp;lt;code&amp;gt;alsamixer&amp;lt;/code&amp;gt;命令，打开AlsaMixer&lt;br /&gt;
*按F6选择声卡&lt;br /&gt;
*查看声音设备的id：&amp;lt;code&amp;gt;cat /proc/asound/cards&amp;lt;/code&amp;gt;&lt;br /&gt;
*打开&amp;lt;code&amp;gt;sudo gpedit /etc/asound.conf&amp;lt;/code&amp;gt;，根据声卡id设置默认声卡。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
defaults.ctl.card 2&lt;br /&gt;
defaults.pcm.card 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/447718/no-sound-on-usb-headset-how-to-manage-soundcards-and-audio-devices askubuntu.com：USB耳机上没有声音，如何管理声卡和音频设备？]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===系统程序出现问题===&lt;br /&gt;
桌面版，有时会弹出”检测到系统程序出现问题“面板。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 列出存储系统或应用程序崩溃时生成的崩溃报告&lt;br /&gt;
ls -al /var/crash/&lt;br /&gt;
&lt;br /&gt;
# 查看崩溃报告内容，如_bin_brltty.0.crash&lt;br /&gt;
less /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 修复导致崩溃的问题&lt;br /&gt;
# 1.更新系统&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
# 2.检查具体程序，删除或者重新安装，比如brltty盲文显示器程序&lt;br /&gt;
sudo apt remove brltty  # 删除brltty&lt;br /&gt;
sudo apt install --reinstall brltty   # 如果brltty需要重新安装brltty &lt;br /&gt;
# 查看系统日志，获取更多信息，搜索相关内容&lt;br /&gt;
journalctl -p err &lt;br /&gt;
grep -i error /var/log/syslog&lt;br /&gt;
&lt;br /&gt;
# 删除崩溃报告&lt;br /&gt;
sudo rm /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 提交给Ubuntu的开发者&lt;br /&gt;
apport-cli /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
如果崩溃仍然存在，而且不需要提醒，可以禁用Apport。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo vim /etc/default/apport&lt;br /&gt;
&lt;br /&gt;
# 将配置文件enabled=1 改为enabled=0，并保存&lt;br /&gt;
&lt;br /&gt;
# 重启电脑&lt;br /&gt;
sudo reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
* 崩溃报告可能包含敏感信息，因此在提交之前请确保你了解报告的内容。&lt;br /&gt;
* 如果你经常遇到某个应用程序崩溃，建议检查是否有更新版本可用，或者查看相关的支持论坛以获取帮助。&lt;br /&gt;
&lt;br /&gt;
===启动慢===&lt;br /&gt;
使用 systemd-analyze 查看详细耗时：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
systemd-analyze time               # 总时间&lt;br /&gt;
systemd-analyze blame              # 按耗时排序的服务&lt;br /&gt;
systemd-analyze critical-chain     # 关键依赖链&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
移除 quiet splash 可看到详细启动日志，观察卡在哪：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo nano /etc/default/grub&lt;br /&gt;
# 暂时去掉 quiet splash&lt;br /&gt;
# GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;   &lt;br /&gt;
&lt;br /&gt;
sudo update-grub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Ubuntu 官网：https://ubuntu.com/ &lt;br /&gt;
*Ubuntu 文档：https://help.ubuntu.com/&lt;br /&gt;
*Ubuntu 社区wiki：https://help.ubuntu.com/community/CommunityHelpWiki&lt;br /&gt;
*Ubuntu 桌面指南：https://help.ubuntu.com/stable/ubuntu-help/index.html.zh-CN&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/zh-cn/Ubuntu 维基百科：Ubuntu]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:系统软件]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Ubuntu&amp;diff=1764</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Ubuntu&amp;diff=1764"/>
		<updated>2026-04-27T15:47:53Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 快捷方式 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ubuntu是一个[[Linux]]的发行版，由Canonical公司发布并提供商业支持。Ubuntu项目公开承诺开源软件开发的原则；鼓励人们使用自由软件，研究它的运作原理，改进和分发。Ubuntu是著名的[[Linux]]发行版之一，基于[[Debian]]发行版和GNOME桌面环境。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2004年10月20日，马克·舍特尔沃斯创立并发布Ubuntu第一个版本Ubuntu 4.10，它以Debian为开发蓝本。 &lt;br /&gt;
*2005年7月8日，马克·舍特尔沃斯与Canonical有限公司宣布成立Ubuntu基金会，并提供1千万美元作为启始营运资金。但直至2006年，此基金会仍未投入运作。马克·舍特尔沃斯形容此基金会是在Canonical有限公司出现财务危机时的紧急营运资金。&lt;br /&gt;
&lt;br /&gt;
===版本===&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====制作启动U盘====&lt;br /&gt;
Ubuntu官网下载ISO镜像。&lt;br /&gt;
&lt;br /&gt;
linux中制作启动U盘：&lt;br /&gt;
方法一：使用dd命令，一定要注意看清楚哪个盘，不然可能格式化错盘。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 插入u盘，查看所有块设备：&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd命令写入ISO到U盘，如u盘为sdx：&lt;br /&gt;
sudo dd if=/path/to/ubuntu.iso of=/dev/sdx bs=4M status=progress&lt;br /&gt;
&lt;br /&gt;
# 安全移除U盘&lt;br /&gt;
sudo eject /dev/sdx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
windows中制作启动U盘：&lt;br /&gt;
方法一，Ubuntu官方教程使用[[Rufus]]软件制作启动U盘，下面使用[[UltraISO]]软件制作启动U盘，只是写启动盘可以用试用版。&lt;br /&gt;
*打开UltraISO，选择下载好的Ubuntu系统&lt;br /&gt;
*点击菜单栏‘启动’》‘写入硬盘映像’&lt;br /&gt;
*在对话框的‘硬盘驱动器’处选择要刻录的U盘&lt;br /&gt;
*然后点击‘写入’，注意U盘会被格式化所有资料都没有&lt;br /&gt;
*启动U盘制作完成，可以用它在任何电脑安装Ubuntu&lt;br /&gt;
&lt;br /&gt;
方法二，也可以使用&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;xcopy&amp;lt;/code&amp;gt;命令行制作ubuntu的启动U盘，在如下：&lt;br /&gt;
* 搜索框输入&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;，打开命令提示符。 &lt;br /&gt;
* 在cmd中输入&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt; ， 打开磁盘管理。&lt;br /&gt;
* &amp;lt;code&amp;gt;list disk&amp;lt;/code&amp;gt;，查看所有磁盘信息。&lt;br /&gt;
* &amp;lt;code&amp;gt;select disk 2&amp;lt;/code&amp;gt;，选择U盘，示例U盘为disk 2。&lt;br /&gt;
* &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;，清除U盘。&lt;br /&gt;
* &amp;lt;code&amp;gt;create partition primary&amp;lt;/code&amp;gt;，创建分区。&lt;br /&gt;
* &amp;lt;code&amp;gt;select partition 1&amp;lt;/code&amp;gt;，选择分区1。&lt;br /&gt;
* &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;，将当前分区标记为活动。&lt;br /&gt;
* &amp;lt;code&amp;gt;format fs=ntfs quick&amp;lt;/code&amp;gt;，格式化分区为ntfs格式。&lt;br /&gt;
* &amp;lt;code&amp;gt;assign&amp;lt;/code&amp;gt;，分配盘符。&lt;br /&gt;
* &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;，退出。&lt;br /&gt;
* 选择下载好的iso文件，右键点击装载。查看装载后的盘符，如&amp;lt;code&amp;gt;G：&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;xcopy G:\*.* /e /h /f H:\&amp;lt;/code&amp;gt;，复制所有文件到U盘。其中&amp;lt;code&amp;gt;H:&amp;lt;/code&amp;gt;为U盘的盘符。&amp;lt;code&amp;gt;/e&amp;lt;/code&amp;gt;复制所有子目录，即使它们是空的。&amp;lt;code&amp;gt;/h&amp;lt;/code&amp;gt;复制具有隐藏文件和系统文件属性的文件。 &amp;lt;code&amp;gt;/f&amp;lt;/code&amp;gt;复制时显示源文件名和目标文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-windows#1-overview Ubuntu 教程：Windows上制作启动U盘]&lt;br /&gt;
|[https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/xcopy Windows Server文档：xcopy]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====安装到电脑====&lt;br /&gt;
&lt;br /&gt;
====安装到U盘====&lt;br /&gt;
&lt;br /&gt;
====分区方案====&lt;br /&gt;
{{Linux分区方案}}&lt;br /&gt;
==技巧==&lt;br /&gt;
*创建某个目录在桌面快捷方式&lt;br /&gt;
点击某个目录，按住Ctrl + Shift，拖动到桌面目录(文件打开)里，注意不能直接拖动到桌面。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
===软件安装===&lt;br /&gt;
====apt====&lt;br /&gt;
&lt;br /&gt;
====deb====&lt;br /&gt;
&lt;br /&gt;
====AppImage====&lt;br /&gt;
是Linux上的一种应用打包格式，将程序所有文件打包成一个AppImage，可以在不同Linux发行版上运行。直接运行，不需要安装运行库。&lt;br /&gt;
&lt;br /&gt;
运行AppImage格式程序&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
#  进入AppImage 文件所在目录，为文件添加可执行权限&lt;br /&gt;
cd /path/to/directory&lt;br /&gt;
chmod +x example.AppImage&lt;br /&gt;
&lt;br /&gt;
# 直接运行文件&lt;br /&gt;
./example.AppImage&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===快捷方式===&lt;br /&gt;
应用程序和桌面创建快捷方式。.desktop 文件是 Linux 桌面环境中用于定义应用程序启动器、菜单项或快捷方式的配置文件。常用文件内容如下：&lt;br /&gt;
*Name：应用程序的显示名称（必填）。&lt;br /&gt;
*Exec：启动应用程序的命令（必填），路径使用绝对路径。&lt;br /&gt;
*Type：定义文件类型，常见值：Application：应用程序，Link：快捷方式，Directory：目录&lt;br /&gt;
*Icon：Ubuntu支持的图标格式包括 PNG、SVG、XPM。注意路径最后面不要有空格，否则图标不会显示。图标可以在提取文件里找&amp;lt;code&amp;gt;./example.AppImage --appimage-extract&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 创建 .desktop 文件&lt;br /&gt;
vim ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 编辑 .desktop 文件内容&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Example App&lt;br /&gt;
Exec=/path/to/example.AppImage&lt;br /&gt;
Type=Application&lt;br /&gt;
Terminal=false&lt;br /&gt;
Icon=/path/to/icon.png&lt;br /&gt;
Comment=Example App Shortcut&lt;br /&gt;
Categories=Utility;&lt;br /&gt;
&lt;br /&gt;
# 保存并赋予权限&lt;br /&gt;
chmod +x ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 复制到桌面&lt;br /&gt;
# 桌面上点击图标，右键，点击允许运行&lt;br /&gt;
cp ~/.local/share/applications/example.desktop ~/Desktop/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Edge多个用户启动====&lt;br /&gt;
Edge地址栏输入并访问 edge://version/，找到 &amp;quot;个人资料路径&amp;quot; 这一栏。路径末尾的 Default 就是你的默认用户的目录名。第二个用户通常名为 Profile 1、Profile 2，或是你自定义的名称。示例，创建不同的 .desktop 文件，启动时指定不同Edge用户：&lt;br /&gt;
 nano ~/.local/share/applications/edge-profile1.desktop&lt;br /&gt;
输入如下内容，ctrl+o保存，ctrl+x退出：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Type=Application&lt;br /&gt;
Name=Edge 用户1&lt;br /&gt;
Exec=/usr/bin/microsoft-edge --profile-directory=&amp;quot;Profile 1&amp;quot;&lt;br /&gt;
# 或者Icon=/path/to/microsoft-edge.Profile1.png&lt;br /&gt;
Icon=microsoft-edge&lt;br /&gt;
Terminal=false&lt;br /&gt;
Comment=使用个人资料1打开Microsoft Edge&lt;br /&gt;
# Categories=Network;&lt;br /&gt;
# StartupWMClass=edge-profile1   # 用于区分窗口&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
点击系统菜单，显示所有应用，找到刚才命名的名字“Edge - 用户1”，右键点击它的图标，选择“添加到收藏夹”或“添加到Dock”。&lt;br /&gt;
&lt;br /&gt;
===常用软件===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| [[KVM]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[VLC]]&lt;br /&gt;
| VLC是一款开源的、免费的多平台视频播放器，支持MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3等格式。 安装命令：sudo apt install vlc     &lt;br /&gt;
| [https://www.videolan.org/vlc/ 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[VMware Workstation]]&lt;br /&gt;
| &lt;br /&gt;
| [https://www.vmware.com/products/workstation-pro.html 官网] [https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载]&lt;br /&gt;
|- &lt;br /&gt;
| WPS&lt;br /&gt;
| 金山办公套装软件,支持多人在线协作编辑Word、Excel和PPT文档。&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;   &amp;lt;br \&amp;gt;常见问题： &amp;lt;br \&amp;gt;*缺少系统字体：Symbol、Wingdings 1、Wingdings 2、Wingdings 3、Webdings、MT Extra， WPS无法正确地显示某些符号公式。因为这些字体是 Microsoft Windows 系统中的专有字体，而 Ubuntu 默认并未包含它们。&amp;lt;br \&amp;gt;解决方法：&amp;lt;br \&amp;gt;1.下载字体，从windows中复制字体C:\Windows\Fonts，或者web上搜索字体下载，或者从https://github.com/dv-anomaly/ttf-wps-fonts。 &amp;lt;br \&amp;gt;2.安在到系统中，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/fonts/wps-office &lt;br /&gt;
cd ~/Downloads/ttf-wps-fonts-master  # 进入下载好的目录&lt;br /&gt;
sudo cp mtextra.ttf symbol.ttf wingding.ttf WINGDNG3.ttf WEBDINGS.TTF  WINGDNG2.ttf /usr/share/fonts/wps-office/  &lt;br /&gt;
sudo fc-cache -fv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|[https://platform.wps.cn/ 下载]&lt;br /&gt;
|- &lt;br /&gt;
| [[IBus]]&lt;br /&gt;
| Ubuntu 24.04及其他各大[[Linux]]发行版的默认的多语输入平台。支持用户词典、用户lua脚本。&lt;br /&gt;
| [https://github.com/ibus/ibus/wiki 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[搜狗输入法]] &lt;br /&gt;
| 有自定义短语功能，支持多行空格等。Windows上有广告弹窗，安装其他软件。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;1.安装fcitx。&amp;lt;code&amp;gt;sudo apt-get install fcitx&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;2.添加中文语言支持 &amp;lt;br \&amp;gt;3.下载安装搜狗输入法。&amp;lt;code&amp;gt;sudo dpkg -i sogoupinyin_版本号_amd64.deb&amp;lt;/code&amp;gt; 。如果安装过程提示缺少依赖&amp;lt;code&amp;gt;sudo apt -f install&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;设置为默认输入法，点击桌面右上角键盘图标-&amp;gt;设置(Configure)-&amp;gt;Input Method将sougoupinyin移动到最上边。&lt;br /&gt;
| [https://pinyin.sogou.com/linux/ 官网] [https://pinyin.sogou.com/linux/help.php 安装指南]&lt;br /&gt;
|- &lt;br /&gt;
| 网易音乐&lt;br /&gt;
| 安装：&amp;lt;br \&amp;gt;1.点击下载客户端，其他操作系统客户端，Linux版 &amp;lt;br \&amp;gt;2.双击下载的deb文件安装&lt;br /&gt;
| [https://music.163.com/ 官网] [https://music.163.com/#/download 下载]&lt;br /&gt;
|- &lt;br /&gt;
| qq音乐&lt;br /&gt;
| &lt;br /&gt;
| [https://y.qq.com/download/download.html 下载]&lt;br /&gt;
|-&lt;br /&gt;
| [[Conky]]&lt;br /&gt;
| 桌面环境的系统监控工具。免费开源，高度可定制。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;code&amp;gt;sudo apt-get install conky&amp;lt;/code&amp;gt;&lt;br /&gt;
| [https://github.com/brndnmtthws/conky 官网]&lt;br /&gt;
|-&lt;br /&gt;
| btop&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==用户管理==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==网络设置==&lt;br /&gt;
===防火墙设置===&lt;br /&gt;
&lt;br /&gt;
==安装驱动==&lt;br /&gt;
===显卡驱动===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu软件库安装&lt;br /&gt;
| 推荐方法，简单快捷可更新。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装步骤：&amp;lt;br \&amp;gt;1.更新软件库 &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt;2.查找相关驱动 &amp;lt;code&amp;gt;sudo ubuntu-drivers devices&amp;lt;/code&amp;gt; ，后面带recommend是系统推荐版本&amp;lt;br \&amp;gt;3.安装驱动，安装指定版本如&amp;lt;code&amp;gt;sudo apt-get install nvidia-driver-470&amp;lt;/code&amp;gt;，直接安装系统推荐版本 &amp;lt;code&amp;gt;sudo ubuntu-drivers install&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;4.如果UEFI模式，需要导入签名。 &amp;lt;br \&amp;gt;5.重启系统 &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt;，验证是否安装成功 &amp;lt;code&amp;gt;sudo nvidia-smi&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| NVIDIA官网驱动安装&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.itzgeek.com/post/how-to-install-nvidia-drivers-on-ubuntu-20-04-ubuntu-18-04.html itzgeek.com：如何在 Ubuntu 20.04 和 Ubuntu 18.04 安装NVIDIA驱动]&lt;br /&gt;
|[https://ubuntu.com/blog/how-to-sign-things-for-secure-boot Ubuntu 博客：Secure Boot模式下如何签名]&lt;br /&gt;
|[https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled askubuntu.com：Secure Boot模式下如何安装NVIDIA驱动]&lt;br /&gt;
|[https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules/762255#762255 askubuntu.com：https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==安全设置==&lt;br /&gt;
&lt;br /&gt;
====常见问题====&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/sda2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;&lt;br /&gt;
printf &amp;quot;RESUME=UUID=$(blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;)\n&amp;quot; | sudo tee /etc/initramfs-tools/conf.d/resume&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues askubuntu.com：]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 备份与还原 ==&lt;br /&gt;
=== 使用dd备份还原 ===&lt;br /&gt;
关机，插入ubuntu安装u盘，进入试用系统，dd命令镜像硬盘，配合gzip压缩文件，多核cpu可以使用pigz并行压缩更快。一般备份&amp;lt;code&amp;gt;/boot/efi&amp;lt;/code&amp;gt;、&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; 、&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; 所在分区。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
测试环境：系统盘在Samsung SSD 980 1TB，备份位置在西部2TB黑盘7200转（WD2003FZEX），&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 不使用压缩，分区多大，生成文件就多大。&lt;br /&gt;
sudo dd if=/dev/nvme0n1p1 of=/media/ubuntu/newpan/nvme0n1p1.img bs=64M status=progress&lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz&lt;br /&gt;
# nvme0n1p2为ssd硬盘分区，保存分区newpan为HDD硬盘，12核cpu使用pigz压缩&lt;br /&gt;
# /分区 100G，压缩后6.5G，总用时152s，速度约为673MB/s， 测试bs=128M用时还多27s。&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | pigz -3 -p 12 &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250101.img.gz &lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# 速度比pigz慢10多倍，大约50MB/s&lt;br /&gt;
 sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | gzip -c &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250102.img.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
还原&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# img.gz文件大小10.8G，块大小100G，用时327s，速度约306MB/s&lt;br /&gt;
sudo gzip -d -c nvme0n1p2.20250101.img.gz | sudo dd of=/dev/nvme0n1p2 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz，速度与gzip差不多，&lt;br /&gt;
# 15.3G 82G 276s 296MB/s&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo pigz -d -c -p 12 nvme0n1p5.20250101.img.gz | sudo dd of=/dev/nvme0n1p5 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 备份软件 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 接口&lt;br /&gt;
! 级别&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| Déjà Dup  &lt;br /&gt;
| 图形界面&lt;br /&gt;
| 文件&lt;br /&gt;
| Ubuntu的默认桌面备份管理器，桌面左上角点击Activities，搜索&amp;lt;code&amp;gt;backups&amp;lt;/code&amp;gt;可以找到。&lt;br /&gt;
| [https://wiki.gnome.org/Apps/DejaDup gnome]&lt;br /&gt;
|- &lt;br /&gt;
| tar&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| rsync&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| dd&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 使用dd镜像硬盘，配合gzip压缩文件。不能使用dd备份当前正在使用的块存储设备，会导致文件系统上的不一致。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[clonezilla]]&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[partclone]]&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。clonezilla开发，clonezilla也默认使用partclone备份。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| TimeShift&lt;br /&gt;
| 图形界面&lt;br /&gt;
| &lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| systemback&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://help.ubuntu.com/community/BackupYourSystem Ubuntu 社区wiki：备份你的系统]&lt;br /&gt;
|[https://en.wikipedia.org/wiki/List_of_backup_software 维基百科：备份软件列表]&lt;br /&gt;
|[https://www.dell.com/support/kbdoc/zh-cn/000152034/如何使用Ubuntu Linux备份实用程序备份戴尔PC ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===显示问题===&lt;br /&gt;
1.屏幕偶尔几秒黑屏一下。&lt;br /&gt;
&lt;br /&gt;
2.黑屏后无法唤起。&lt;br /&gt;
&lt;br /&gt;
===声音问题===&lt;br /&gt;
1.USB耳机或音响没声音&lt;br /&gt;
设置》声音》选择输出设备，如果3.5mm接口输出，选择线缆输出built-in Audio。&lt;br /&gt;
&lt;br /&gt;
或者&lt;br /&gt;
*在终端输入&amp;lt;code&amp;gt;alsamixer&amp;lt;/code&amp;gt;命令，打开AlsaMixer&lt;br /&gt;
*按F6选择声卡&lt;br /&gt;
*查看声音设备的id：&amp;lt;code&amp;gt;cat /proc/asound/cards&amp;lt;/code&amp;gt;&lt;br /&gt;
*打开&amp;lt;code&amp;gt;sudo gpedit /etc/asound.conf&amp;lt;/code&amp;gt;，根据声卡id设置默认声卡。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
defaults.ctl.card 2&lt;br /&gt;
defaults.pcm.card 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/447718/no-sound-on-usb-headset-how-to-manage-soundcards-and-audio-devices askubuntu.com：USB耳机上没有声音，如何管理声卡和音频设备？]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===系统程序出现问题===&lt;br /&gt;
桌面版，有时会弹出”检测到系统程序出现问题“面板。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 列出存储系统或应用程序崩溃时生成的崩溃报告&lt;br /&gt;
ls -al /var/crash/&lt;br /&gt;
&lt;br /&gt;
# 查看崩溃报告内容，如_bin_brltty.0.crash&lt;br /&gt;
less /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 修复导致崩溃的问题&lt;br /&gt;
# 1.更新系统&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
# 2.检查具体程序，删除或者重新安装，比如brltty盲文显示器程序&lt;br /&gt;
sudo apt remove brltty  # 删除brltty&lt;br /&gt;
sudo apt install --reinstall brltty   # 如果brltty需要重新安装brltty &lt;br /&gt;
# 查看系统日志，获取更多信息，搜索相关内容&lt;br /&gt;
journalctl -p err &lt;br /&gt;
grep -i error /var/log/syslog&lt;br /&gt;
&lt;br /&gt;
# 删除崩溃报告&lt;br /&gt;
sudo rm /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 提交给Ubuntu的开发者&lt;br /&gt;
apport-cli /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
如果崩溃仍然存在，而且不需要提醒，可以禁用Apport。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo vim /etc/default/apport&lt;br /&gt;
&lt;br /&gt;
# 将配置文件enabled=1 改为enabled=0，并保存&lt;br /&gt;
&lt;br /&gt;
# 重启电脑&lt;br /&gt;
sudo reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
* 崩溃报告可能包含敏感信息，因此在提交之前请确保你了解报告的内容。&lt;br /&gt;
* 如果你经常遇到某个应用程序崩溃，建议检查是否有更新版本可用，或者查看相关的支持论坛以获取帮助。&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Ubuntu 官网：https://ubuntu.com/ &lt;br /&gt;
*Ubuntu 文档：https://help.ubuntu.com/&lt;br /&gt;
*Ubuntu 社区wiki：https://help.ubuntu.com/community/CommunityHelpWiki&lt;br /&gt;
*Ubuntu 桌面指南：https://help.ubuntu.com/stable/ubuntu-help/index.html.zh-CN&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/zh-cn/Ubuntu 维基百科：Ubuntu]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:系统软件]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Ubuntu&amp;diff=1763</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Ubuntu&amp;diff=1763"/>
		<updated>2026-04-27T15:00:46Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 软件 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ubuntu是一个[[Linux]]的发行版，由Canonical公司发布并提供商业支持。Ubuntu项目公开承诺开源软件开发的原则；鼓励人们使用自由软件，研究它的运作原理，改进和分发。Ubuntu是著名的[[Linux]]发行版之一，基于[[Debian]]发行版和GNOME桌面环境。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2004年10月20日，马克·舍特尔沃斯创立并发布Ubuntu第一个版本Ubuntu 4.10，它以Debian为开发蓝本。 &lt;br /&gt;
*2005年7月8日，马克·舍特尔沃斯与Canonical有限公司宣布成立Ubuntu基金会，并提供1千万美元作为启始营运资金。但直至2006年，此基金会仍未投入运作。马克·舍特尔沃斯形容此基金会是在Canonical有限公司出现财务危机时的紧急营运资金。&lt;br /&gt;
&lt;br /&gt;
===版本===&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====制作启动U盘====&lt;br /&gt;
Ubuntu官网下载ISO镜像。&lt;br /&gt;
&lt;br /&gt;
linux中制作启动U盘：&lt;br /&gt;
方法一：使用dd命令，一定要注意看清楚哪个盘，不然可能格式化错盘。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 插入u盘，查看所有块设备：&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd命令写入ISO到U盘，如u盘为sdx：&lt;br /&gt;
sudo dd if=/path/to/ubuntu.iso of=/dev/sdx bs=4M status=progress&lt;br /&gt;
&lt;br /&gt;
# 安全移除U盘&lt;br /&gt;
sudo eject /dev/sdx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
windows中制作启动U盘：&lt;br /&gt;
方法一，Ubuntu官方教程使用[[Rufus]]软件制作启动U盘，下面使用[[UltraISO]]软件制作启动U盘，只是写启动盘可以用试用版。&lt;br /&gt;
*打开UltraISO，选择下载好的Ubuntu系统&lt;br /&gt;
*点击菜单栏‘启动’》‘写入硬盘映像’&lt;br /&gt;
*在对话框的‘硬盘驱动器’处选择要刻录的U盘&lt;br /&gt;
*然后点击‘写入’，注意U盘会被格式化所有资料都没有&lt;br /&gt;
*启动U盘制作完成，可以用它在任何电脑安装Ubuntu&lt;br /&gt;
&lt;br /&gt;
方法二，也可以使用&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;xcopy&amp;lt;/code&amp;gt;命令行制作ubuntu的启动U盘，在如下：&lt;br /&gt;
* 搜索框输入&amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt;，打开命令提示符。 &lt;br /&gt;
* 在cmd中输入&amp;lt;code&amp;gt;diskpart&amp;lt;/code&amp;gt; ， 打开磁盘管理。&lt;br /&gt;
* &amp;lt;code&amp;gt;list disk&amp;lt;/code&amp;gt;，查看所有磁盘信息。&lt;br /&gt;
* &amp;lt;code&amp;gt;select disk 2&amp;lt;/code&amp;gt;，选择U盘，示例U盘为disk 2。&lt;br /&gt;
* &amp;lt;code&amp;gt;clean&amp;lt;/code&amp;gt;，清除U盘。&lt;br /&gt;
* &amp;lt;code&amp;gt;create partition primary&amp;lt;/code&amp;gt;，创建分区。&lt;br /&gt;
* &amp;lt;code&amp;gt;select partition 1&amp;lt;/code&amp;gt;，选择分区1。&lt;br /&gt;
* &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;，将当前分区标记为活动。&lt;br /&gt;
* &amp;lt;code&amp;gt;format fs=ntfs quick&amp;lt;/code&amp;gt;，格式化分区为ntfs格式。&lt;br /&gt;
* &amp;lt;code&amp;gt;assign&amp;lt;/code&amp;gt;，分配盘符。&lt;br /&gt;
* &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;，退出。&lt;br /&gt;
* 选择下载好的iso文件，右键点击装载。查看装载后的盘符，如&amp;lt;code&amp;gt;G：&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;xcopy G:\*.* /e /h /f H:\&amp;lt;/code&amp;gt;，复制所有文件到U盘。其中&amp;lt;code&amp;gt;H:&amp;lt;/code&amp;gt;为U盘的盘符。&amp;lt;code&amp;gt;/e&amp;lt;/code&amp;gt;复制所有子目录，即使它们是空的。&amp;lt;code&amp;gt;/h&amp;lt;/code&amp;gt;复制具有隐藏文件和系统文件属性的文件。 &amp;lt;code&amp;gt;/f&amp;lt;/code&amp;gt;复制时显示源文件名和目标文件名。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/tutorials/tutorial-create-a-usb-stick-on-windows#1-overview Ubuntu 教程：Windows上制作启动U盘]&lt;br /&gt;
|[https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/xcopy Windows Server文档：xcopy]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====安装到电脑====&lt;br /&gt;
&lt;br /&gt;
====安装到U盘====&lt;br /&gt;
&lt;br /&gt;
====分区方案====&lt;br /&gt;
{{Linux分区方案}}&lt;br /&gt;
==技巧==&lt;br /&gt;
*创建某个目录在桌面快捷方式&lt;br /&gt;
点击某个目录，按住Ctrl + Shift，拖动到桌面目录(文件打开)里，注意不能直接拖动到桌面。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
===软件安装===&lt;br /&gt;
====apt====&lt;br /&gt;
&lt;br /&gt;
====deb====&lt;br /&gt;
&lt;br /&gt;
====AppImage====&lt;br /&gt;
是Linux上的一种应用打包格式，将程序所有文件打包成一个AppImage，可以在不同Linux发行版上运行。直接运行，不需要安装运行库。&lt;br /&gt;
&lt;br /&gt;
运行AppImage格式程序&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
#  进入AppImage 文件所在目录，为文件添加可执行权限&lt;br /&gt;
cd /path/to/directory&lt;br /&gt;
chmod +x example.AppImage&lt;br /&gt;
&lt;br /&gt;
# 直接运行文件&lt;br /&gt;
./example.AppImage&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===快捷方式===&lt;br /&gt;
应用程序和桌面创建快捷方式。.desktop 文件是 Linux 桌面环境中用于定义应用程序启动器、菜单项或快捷方式的配置文件。常用文件内容如下：&lt;br /&gt;
*Name：应用程序的显示名称（必填）。&lt;br /&gt;
*Exec：启动应用程序的命令（必填），路径使用绝对路径。&lt;br /&gt;
*Type：定义文件类型，常见值：Application：应用程序，Link：快捷方式，Directory：目录&lt;br /&gt;
*Icon：Ubuntu支持的图标格式包括 PNG、SVG、XPM。注意路径最后面不要有空格，否则图标不会显示。图标可以在提取文件里找&amp;lt;code&amp;gt;./example.AppImage --appimage-extract&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 创建 .desktop 文件&lt;br /&gt;
vim ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 编辑 .desktop 文件内容&lt;br /&gt;
[Desktop Entry]&lt;br /&gt;
Name=Example App&lt;br /&gt;
Exec=/path/to/example.AppImage&lt;br /&gt;
Type=Application&lt;br /&gt;
Terminal=false&lt;br /&gt;
Icon=/path/to/icon.png&lt;br /&gt;
Comment=Example App Shortcut&lt;br /&gt;
Categories=Utility;&lt;br /&gt;
&lt;br /&gt;
# 保存并赋予权限&lt;br /&gt;
chmod +x ~/.local/share/applications/example.desktop&lt;br /&gt;
&lt;br /&gt;
# 复制到桌面&lt;br /&gt;
# 桌面上点击图标，右键，点击允许运行&lt;br /&gt;
cp ~/.local/share/applications/example.desktop ~/Desktop/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===常用软件===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| [[KVM]]&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[VLC]]&lt;br /&gt;
| VLC是一款开源的、免费的多平台视频播放器，支持MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3等格式。 安装命令：sudo apt install vlc     &lt;br /&gt;
| [https://www.videolan.org/vlc/ 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[VMware Workstation]]&lt;br /&gt;
| &lt;br /&gt;
| [https://www.vmware.com/products/workstation-pro.html 官网] [https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载]&lt;br /&gt;
|- &lt;br /&gt;
| WPS&lt;br /&gt;
| 金山办公套装软件,支持多人在线协作编辑Word、Excel和PPT文档。&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;   &amp;lt;br \&amp;gt;常见问题： &amp;lt;br \&amp;gt;*缺少系统字体：Symbol、Wingdings 1、Wingdings 2、Wingdings 3、Webdings、MT Extra， WPS无法正确地显示某些符号公式。因为这些字体是 Microsoft Windows 系统中的专有字体，而 Ubuntu 默认并未包含它们。&amp;lt;br \&amp;gt;解决方法：&amp;lt;br \&amp;gt;1.下载字体，从windows中复制字体C:\Windows\Fonts，或者web上搜索字体下载，或者从https://github.com/dv-anomaly/ttf-wps-fonts。 &amp;lt;br \&amp;gt;2.安在到系统中，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo mkdir -p /usr/share/fonts/wps-office &lt;br /&gt;
cd ~/Downloads/ttf-wps-fonts-master  # 进入下载好的目录&lt;br /&gt;
sudo cp mtextra.ttf symbol.ttf wingding.ttf WINGDNG3.ttf WEBDINGS.TTF  WINGDNG2.ttf /usr/share/fonts/wps-office/  &lt;br /&gt;
sudo fc-cache -fv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|[https://platform.wps.cn/ 下载]&lt;br /&gt;
|- &lt;br /&gt;
| [[IBus]]&lt;br /&gt;
| Ubuntu 24.04及其他各大[[Linux]]发行版的默认的多语输入平台。支持用户词典、用户lua脚本。&lt;br /&gt;
| [https://github.com/ibus/ibus/wiki 官网]&lt;br /&gt;
|- &lt;br /&gt;
| [[搜狗输入法]] &lt;br /&gt;
| 有自定义短语功能，支持多行空格等。Windows上有广告弹窗，安装其他软件。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;br \&amp;gt;1.安装fcitx。&amp;lt;code&amp;gt;sudo apt-get install fcitx&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;2.添加中文语言支持 &amp;lt;br \&amp;gt;3.下载安装搜狗输入法。&amp;lt;code&amp;gt;sudo dpkg -i sogoupinyin_版本号_amd64.deb&amp;lt;/code&amp;gt; 。如果安装过程提示缺少依赖&amp;lt;code&amp;gt;sudo apt -f install&amp;lt;/code&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;设置为默认输入法，点击桌面右上角键盘图标-&amp;gt;设置(Configure)-&amp;gt;Input Method将sougoupinyin移动到最上边。&lt;br /&gt;
| [https://pinyin.sogou.com/linux/ 官网] [https://pinyin.sogou.com/linux/help.php 安装指南]&lt;br /&gt;
|- &lt;br /&gt;
| 网易音乐&lt;br /&gt;
| 安装：&amp;lt;br \&amp;gt;1.点击下载客户端，其他操作系统客户端，Linux版 &amp;lt;br \&amp;gt;2.双击下载的deb文件安装&lt;br /&gt;
| [https://music.163.com/ 官网] [https://music.163.com/#/download 下载]&lt;br /&gt;
|- &lt;br /&gt;
| qq音乐&lt;br /&gt;
| &lt;br /&gt;
| [https://y.qq.com/download/download.html 下载]&lt;br /&gt;
|-&lt;br /&gt;
| [[Conky]]&lt;br /&gt;
| 桌面环境的系统监控工具。免费开源，高度可定制。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装：&amp;lt;code&amp;gt;sudo apt-get install conky&amp;lt;/code&amp;gt;&lt;br /&gt;
| [https://github.com/brndnmtthws/conky 官网]&lt;br /&gt;
|-&lt;br /&gt;
| btop&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==用户管理==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==网络设置==&lt;br /&gt;
===防火墙设置===&lt;br /&gt;
&lt;br /&gt;
==安装驱动==&lt;br /&gt;
===显卡驱动===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu软件库安装&lt;br /&gt;
| 推荐方法，简单快捷可更新。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;安装步骤：&amp;lt;br \&amp;gt;1.更新软件库 &amp;lt;code&amp;gt;sudo apt-get update&amp;lt;/code&amp;gt;  &amp;lt;br \&amp;gt;2.查找相关驱动 &amp;lt;code&amp;gt;sudo ubuntu-drivers devices&amp;lt;/code&amp;gt; ，后面带recommend是系统推荐版本&amp;lt;br \&amp;gt;3.安装驱动，安装指定版本如&amp;lt;code&amp;gt;sudo apt-get install nvidia-driver-470&amp;lt;/code&amp;gt;，直接安装系统推荐版本 &amp;lt;code&amp;gt;sudo ubuntu-drivers install&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;4.如果UEFI模式，需要导入签名。 &amp;lt;br \&amp;gt;5.重启系统 &amp;lt;code&amp;gt;reboot&amp;lt;/code&amp;gt;，验证是否安装成功 &amp;lt;code&amp;gt;sudo nvidia-smi&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| NVIDIA官网驱动安装&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.itzgeek.com/post/how-to-install-nvidia-drivers-on-ubuntu-20-04-ubuntu-18-04.html itzgeek.com：如何在 Ubuntu 20.04 和 Ubuntu 18.04 安装NVIDIA驱动]&lt;br /&gt;
|[https://ubuntu.com/blog/how-to-sign-things-for-secure-boot Ubuntu 博客：Secure Boot模式下如何签名]&lt;br /&gt;
|[https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled askubuntu.com：Secure Boot模式下如何安装NVIDIA驱动]&lt;br /&gt;
|[https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules/762255#762255 askubuntu.com：https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==安全设置==&lt;br /&gt;
&lt;br /&gt;
====常见问题====&lt;br /&gt;
I: The initramfs will attempt to resume from /dev/sda2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;&lt;br /&gt;
printf &amp;quot;RESUME=UUID=$(blkid | awk -F\&amp;quot; &#039;/swap/ {print $2}&#039;)\n&amp;quot; | sudo tee /etc/initramfs-tools/conf.d/resume&lt;br /&gt;
sudo update-initramfs -u -k all&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/1116778/how-to-set-the-resume-variable-to-override-these-issues askubuntu.com：]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 备份与还原 ==&lt;br /&gt;
=== 使用dd备份还原 ===&lt;br /&gt;
关机，插入ubuntu安装u盘，进入试用系统，dd命令镜像硬盘，配合gzip压缩文件，多核cpu可以使用pigz并行压缩更快。一般备份&amp;lt;code&amp;gt;/boot/efi&amp;lt;/code&amp;gt;、&lt;br /&gt;
&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; 、&amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt; 所在分区。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
测试环境：系统盘在Samsung SSD 980 1TB，备份位置在西部2TB黑盘7200转（WD2003FZEX），&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 不使用压缩，分区多大，生成文件就多大。&lt;br /&gt;
sudo dd if=/dev/nvme0n1p1 of=/media/ubuntu/newpan/nvme0n1p1.img bs=64M status=progress&lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz&lt;br /&gt;
# nvme0n1p2为ssd硬盘分区，保存分区newpan为HDD硬盘，12核cpu使用pigz压缩&lt;br /&gt;
# /分区 100G，压缩后6.5G，总用时152s，速度约为673MB/s， 测试bs=128M用时还多27s。&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | pigz -3 -p 12 &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250101.img.gz &lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# 速度比pigz慢10多倍，大约50MB/s&lt;br /&gt;
 sudo  dd if=/dev/nvme0n1p2 bs=64M status=progress | gzip -c &amp;gt; /media/ubuntu/newpan/nvme0n1p2.20250102.img.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
还原&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 查看磁盘和分区，确定目标&lt;br /&gt;
lsblk&lt;br /&gt;
&lt;br /&gt;
# 使用dd和gzip&lt;br /&gt;
# img.gz文件大小10.8G，块大小100G，用时327s，速度约306MB/s&lt;br /&gt;
sudo gzip -d -c nvme0n1p2.20250101.img.gz | sudo dd of=/dev/nvme0n1p2 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&lt;br /&gt;
# 使用dd和pigz，速度与gzip差不多，&lt;br /&gt;
# 15.3G 82G 276s 296MB/s&lt;br /&gt;
sudo apt install pigz&lt;br /&gt;
sudo pigz -d -c -p 12 nvme0n1p5.20250101.img.gz | sudo dd of=/dev/nvme0n1p5 bs=64M status=progress&lt;br /&gt;
# 确保所有数据写入磁盘&lt;br /&gt;
sudo sync &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 备份软件 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 名称&lt;br /&gt;
! 接口&lt;br /&gt;
! 级别&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| Déjà Dup  &lt;br /&gt;
| 图形界面&lt;br /&gt;
| 文件&lt;br /&gt;
| Ubuntu的默认桌面备份管理器，桌面左上角点击Activities，搜索&amp;lt;code&amp;gt;backups&amp;lt;/code&amp;gt;可以找到。&lt;br /&gt;
| [https://wiki.gnome.org/Apps/DejaDup gnome]&lt;br /&gt;
|- &lt;br /&gt;
| tar&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| rsync&lt;br /&gt;
| 命令行&lt;br /&gt;
| 文件&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
| dd&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 使用dd镜像硬盘，配合gzip压缩文件。不能使用dd备份当前正在使用的块存储设备，会导致文件系统上的不一致。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[clonezilla]]&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [[partclone]]&lt;br /&gt;
| 命令行&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。clonezilla开发，clonezilla也默认使用partclone备份。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| TimeShift&lt;br /&gt;
| 图形界面&lt;br /&gt;
| &lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| systemback&lt;br /&gt;
| 图形界面&lt;br /&gt;
| 硬盘&lt;br /&gt;
| 系统备份还原软件。&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://help.ubuntu.com/community/BackupYourSystem Ubuntu 社区wiki：备份你的系统]&lt;br /&gt;
|[https://en.wikipedia.org/wiki/List_of_backup_software 维基百科：备份软件列表]&lt;br /&gt;
|[https://www.dell.com/support/kbdoc/zh-cn/000152034/如何使用Ubuntu Linux备份实用程序备份戴尔PC ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
===显示问题===&lt;br /&gt;
1.屏幕偶尔几秒黑屏一下。&lt;br /&gt;
&lt;br /&gt;
2.黑屏后无法唤起。&lt;br /&gt;
&lt;br /&gt;
===声音问题===&lt;br /&gt;
1.USB耳机或音响没声音&lt;br /&gt;
设置》声音》选择输出设备，如果3.5mm接口输出，选择线缆输出built-in Audio。&lt;br /&gt;
&lt;br /&gt;
或者&lt;br /&gt;
*在终端输入&amp;lt;code&amp;gt;alsamixer&amp;lt;/code&amp;gt;命令，打开AlsaMixer&lt;br /&gt;
*按F6选择声卡&lt;br /&gt;
*查看声音设备的id：&amp;lt;code&amp;gt;cat /proc/asound/cards&amp;lt;/code&amp;gt;&lt;br /&gt;
*打开&amp;lt;code&amp;gt;sudo gpedit /etc/asound.conf&amp;lt;/code&amp;gt;，根据声卡id设置默认声卡。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
defaults.ctl.card 2&lt;br /&gt;
defaults.pcm.card 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://askubuntu.com/questions/447718/no-sound-on-usb-headset-how-to-manage-soundcards-and-audio-devices askubuntu.com：USB耳机上没有声音，如何管理声卡和音频设备？]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===系统程序出现问题===&lt;br /&gt;
桌面版，有时会弹出”检测到系统程序出现问题“面板。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 列出存储系统或应用程序崩溃时生成的崩溃报告&lt;br /&gt;
ls -al /var/crash/&lt;br /&gt;
&lt;br /&gt;
# 查看崩溃报告内容，如_bin_brltty.0.crash&lt;br /&gt;
less /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 修复导致崩溃的问题&lt;br /&gt;
# 1.更新系统&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;br /&gt;
# 2.检查具体程序，删除或者重新安装，比如brltty盲文显示器程序&lt;br /&gt;
sudo apt remove brltty  # 删除brltty&lt;br /&gt;
sudo apt install --reinstall brltty   # 如果brltty需要重新安装brltty &lt;br /&gt;
# 查看系统日志，获取更多信息，搜索相关内容&lt;br /&gt;
journalctl -p err &lt;br /&gt;
grep -i error /var/log/syslog&lt;br /&gt;
&lt;br /&gt;
# 删除崩溃报告&lt;br /&gt;
sudo rm /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&lt;br /&gt;
# 提交给Ubuntu的开发者&lt;br /&gt;
apport-cli /var/crash/_bin_brltty.0.crash&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
如果崩溃仍然存在，而且不需要提醒，可以禁用Apport。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo vim /etc/default/apport&lt;br /&gt;
&lt;br /&gt;
# 将配置文件enabled=1 改为enabled=0，并保存&lt;br /&gt;
&lt;br /&gt;
# 重启电脑&lt;br /&gt;
sudo reboot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
* 崩溃报告可能包含敏感信息，因此在提交之前请确保你了解报告的内容。&lt;br /&gt;
* 如果你经常遇到某个应用程序崩溃，建议检查是否有更新版本可用，或者查看相关的支持论坛以获取帮助。&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Ubuntu 官网：https://ubuntu.com/ &lt;br /&gt;
*Ubuntu 文档：https://help.ubuntu.com/&lt;br /&gt;
*Ubuntu 社区wiki：https://help.ubuntu.com/community/CommunityHelpWiki&lt;br /&gt;
*Ubuntu 桌面指南：https://help.ubuntu.com/stable/ubuntu-help/index.html.zh-CN&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/zh-cn/Ubuntu 维基百科：Ubuntu]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:系统软件]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1762</id>
		<title>KVM虚拟机</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=KVM%E8%99%9A%E6%8B%9F%E6%9C%BA&amp;diff=1762"/>
		<updated>2026-04-27T14:41:04Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 配置桥接网路 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;KVM的全称是Kernel-based Virtual Machine（基于内核的[[虚拟机]]），是一种内建于[[Linux]]中的开源[[虚拟化]]技术。[[Linux内核]] 2.6.20 及更新版包含 KVM。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2006年，Avi Kivity 在Qumranet初创公司开始了KVM的研发工作。&lt;br /&gt;
*2006年10月19日，Avi Kivity 首次公布KVM。&lt;br /&gt;
*2007年2月5日，KVM被包含到Linux 2.6.20核心中。&lt;br /&gt;
*2008年，红帽公司（Red Hat）收购Qumranet公司。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://zh.wikipedia.org/wiki/基于内核的虚拟机#历史 维基百科：基于内核的虚拟机#历史]&lt;br /&gt;
|[https://lwn.net/Articles/705160/ lwn.net：KVM 十周年]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
以[[Ubuntu]]安装为例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 确保你的 CPU 支持虚拟化（Intel VT-x 或 AMD-V）&lt;br /&gt;
# 输出大于 0 表示支持。&lt;br /&gt;
# 确认 BIOS/UEFI 中已启用虚拟化（通常叫 Intel VT-x / AMD-V）。&lt;br /&gt;
egrep -c &#039;(vmx|svm)&#039; /proc/cpuinfo&lt;br /&gt;
&lt;br /&gt;
# 安装需要的软件包&lt;br /&gt;
sudo apt update  # 更新软件源&lt;br /&gt;
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* qemu-kvm：提供 KVM 虚拟化后端&lt;br /&gt;
* libvirt-*：管理虚拟机的守护进程和工具&lt;br /&gt;
* virt-manager：图形化虚拟机管理器（可选但推荐）&lt;br /&gt;
* virtinst：命令行创建虚拟机工具（如 virt-install）&lt;br /&gt;
&lt;br /&gt;
将当前用户加入相关组（避免每次用 sudo）：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo usermod -aG libvirt $USER&lt;br /&gt;
sudo usermod -aG kvm $USER&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;br /&gt;
|[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
}}&lt;br /&gt;
== 安装系统 ==&lt;br /&gt;
===图形化界面===&lt;br /&gt;
* 官网下载系统镜像，如Windows 11 ISO。&lt;br /&gt;
* 启动 Virtual Machine Manager&lt;br /&gt;
* 点击左上角 “新建虚拟机”（Create a new virtual machine）&lt;br /&gt;
* 选择 “本地安装介质（ISO）”，点击“前进”&lt;br /&gt;
&lt;br /&gt;
== 虚拟化管理软件==&lt;br /&gt;
为了方便管理操作，需要安装一个图形化虚拟化管理软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 网站&lt;br /&gt;
|-&lt;br /&gt;
| virt-manager&lt;br /&gt;
|virt-manager应用程序是一个桌面用户界面，用于通过 libvirt 管理虚拟机。不同系统安装命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
yum install virt-manager (Fedora)&lt;br /&gt;
apt-get install virt-manager (Debian)&lt;br /&gt;
emerge virt-manager (Gentoo)&lt;br /&gt;
pkg_add virt-manager (OpenBSD)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| https://virt-manager.org/&lt;br /&gt;
|-&lt;br /&gt;
| Multipass&lt;br /&gt;
| Ubuntu 发行商 Canonical 推出的虚拟机管理工具。&lt;br /&gt;
| https://multipass.run&lt;br /&gt;
|-&lt;br /&gt;
| OpenStack&lt;br /&gt;
| &lt;br /&gt;
| https://ubuntu.com/openstack/what-is-openstack&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 配置桥接网路 ==&lt;br /&gt;
KVM虚拟机的默认网络NAT，共享主机ip上网，对外部网络不可见。而网络桥接（bridge）可以让虚拟机（VM）像物理主机一样直接接入外部网络，从主机外访问虚拟机。&lt;br /&gt;
示例，主机Ubuntu创建网桥，配置虚拟机windows使用网桥：&lt;br /&gt;
* 主机创建网桥接口&lt;br /&gt;
Ubuntu24.04桌面版，使用NetworkManager管理网络，使用 NetworkManager 的命令行工具 nmcli 来直接创建和管理网桥，不用手动修改 Netplan 文件。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看是否NetworkManager管理，物理网卡会显示connected。&lt;br /&gt;
nmcli device status&lt;br /&gt;
nmcli con show&lt;br /&gt;
&lt;br /&gt;
# 创建网桥接口（br0）&lt;br /&gt;
sudo nmcli con add ifname br0 type bridge con-name br0&lt;br /&gt;
&lt;br /&gt;
# 将物理接口（enp5s0）添加为网桥的从接口&lt;br /&gt;
sudo nmcli con add type bridge-slave ifname enp5s0 master br0&lt;br /&gt;
&lt;br /&gt;
# 禁用 STP（生成树协议，以减少延迟；可选但推荐）&lt;br /&gt;
sudo nmcli con mod br0 bridge.stp no&lt;br /&gt;
&lt;br /&gt;
# 配置网桥使用 DHCP&lt;br /&gt;
sudo nmcli con mod br0 ipv4.method auto ipv6.method ignore&lt;br /&gt;
&lt;br /&gt;
# 关闭原物理连接（防止冲突）&lt;br /&gt;
sudo nmcli con down &amp;quot;netplan-enp5s0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 激活网桥&lt;br /&gt;
sudo nmcli con up br0&lt;br /&gt;
&lt;br /&gt;
# 现在，运行 ip addr show 或 nmcli device show 检查：br0 应该有 IP 地址（从 DHCP 获取），enp5s0 应该显示为 br0 的从接口，无独立 IP。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法2，修改netplan配置文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前网络接口&lt;br /&gt;
# 假设你的主网卡是 enp3s0（有线）或 eth0&lt;br /&gt;
ip a &lt;br /&gt;
&lt;br /&gt;
# 编辑 Netplan 配置文件&lt;br /&gt;
# 通常位于 /etc/netplan/，如&lt;br /&gt;
# 可以先备份一个配置文件，便于恢复。&lt;br /&gt;
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak&lt;br /&gt;
sudo vim /etc/netplan/01-netcfg.yaml&lt;br /&gt;
&lt;br /&gt;
# 配置文件添加或修改内容为：&lt;br /&gt;
# 注意缩进！YAML 对格式敏感。&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  renderer: networkd     # 或 NetworkManager，根据系统选择&lt;br /&gt;
  ethernets:&lt;br /&gt;
    enp0s3:  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: no&lt;br /&gt;
  bridges:&lt;br /&gt;
    br0:&lt;br /&gt;
      interfaces: [enp0s3]  # 替换为您的物理接口&lt;br /&gt;
      dhcp4: yes  # 或手动配置：addresses: [192.168.1.100/24], gateway4: 192.168.1.1&lt;br /&gt;
      parameters:&lt;br /&gt;
        stp: false  # 可选，关闭生成树协议以减少延迟&lt;br /&gt;
&lt;br /&gt;
# 应用配置&lt;br /&gt;
sudo netplan generate&lt;br /&gt;
sudo netplan apply&lt;br /&gt;
&lt;br /&gt;
# 验证&lt;br /&gt;
ip a show br0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
方法3，创建临时网桥，测试用，重启失效。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 使用 ip 命令临时创建网桥（名为 br0）&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set dev br0 up&lt;br /&gt;
&lt;br /&gt;
# 将物理接口添加到网桥&lt;br /&gt;
sudo ip addr flush dev enp0s3  # 移除物理接口上的 IP 配置&lt;br /&gt;
sudo ip link set dev enp0s3 master br0&lt;br /&gt;
sudo ip link set dev enp0s3 up&lt;br /&gt;
&lt;br /&gt;
# 将原物理接口的 IP 配置转移到 br0 上。例如，如果原 IP 是 192.168.1.100/24：&lt;br /&gt;
sudo ip addr add 192.168.1.100/24 dev br0&lt;br /&gt;
sudo ip route add default via 192.168.1.1 dev br0  # 替换为您的网关&lt;br /&gt;
&lt;br /&gt;
# 方案2&lt;br /&gt;
sudo ip link add name br0 type bridge&lt;br /&gt;
sudo ip link set enp3s0 master br0&lt;br /&gt;
sudo dhclient br0&lt;br /&gt;
sudo ip link set br0 up&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 配置虚拟机，使用网桥&lt;br /&gt;
方法1，使用virt-manager界面配置。创建或编辑虚拟机，在网络设置中选择：Source mode选Bridge，Network source选一个，Device name填br0。&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*KVM官网：https://www.linux-kvm.org/&lt;br /&gt;
&lt;br /&gt;
=== 教程 ===&lt;br /&gt;
*[https://ubuntu.com/server/docs/virtualization-introduction Ubuntu 服务器文档：虚拟化]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization Red Hat 主题：虚拟化]&lt;br /&gt;
&lt;br /&gt;
===相关文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/基于内核的虚拟机 维基百科：基于内核的虚拟机]&lt;br /&gt;
*[https://www.redhat.com/zh/topics/virtualization/what-is-KVM Red Hat：LINUX虚拟化 - 什么是KVM？]&lt;br /&gt;
*[https://ubuntu.com/blog/kvm-hyphervisor Ubuntu 博客：Tytus Kurek - KVM 虚拟机管理程序：初学者指南]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Git&amp;diff=1761</id>
		<title>Git</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Git&amp;diff=1761"/>
		<updated>2026-04-21T03:40:58Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;git是一个分布式版本控制软件，最初由[[林纳斯·托瓦兹]]创作，于2005年以GPL发布。最初目的是为更好地管理[[Linux]]内核开发而设计。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
*2002年，林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。&lt;br /&gt;
*2005年，Andrew Tridgell违反的BitKeeper使用原则，进行逆向工程，导致无偿使用BitKeeper的许可被收回。 林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper，以十天的时间编写出git第一个版本。&lt;br /&gt;
*2005年07月11日，发布git 0.99 版&lt;br /&gt;
*2005年12月21日，发布git 1.0 版&lt;br /&gt;
*2014年05年28日，发布git 2.0 版&lt;br /&gt;
*2020年03月23日，发布git 2.26 版&lt;br /&gt;
&lt;br /&gt;
=== 仓库托管服务 ===&lt;br /&gt;
很多公司提供了Git仓库的托管服务。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 公司&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| [[GitHub]]&lt;br /&gt;
| 微软&lt;br /&gt;
| 提供付费账户和免费账户，都可以建立公开或私有的代码仓。。截止2023年，Github是世界上最大的代码托管网站和开源社区。&lt;br /&gt;
|-&lt;br /&gt;
| [[CODING]]&lt;br /&gt;
| 腾讯&lt;br /&gt;
| 提供付费账户和免费账户&lt;br /&gt;
|-&lt;br /&gt;
| [[GitLab]]&lt;br /&gt;
| GitLab &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Gitee&lt;br /&gt;
| OSCHINA&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 安装 ===&lt;br /&gt;
Linux中一般默认已经按照git， Windows中安装如下；&lt;br /&gt;
*1.下载安装程序，https://git-scm.com/download/win&lt;br /&gt;
*2.点击安装&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git 《Pro Git》 中文版V2：1.5 起步 - 安装 Git]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 快速入门 ==&lt;br /&gt;
=== 基本原理 ===&lt;br /&gt;
{{#drawio:git工作原理}}&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/起步-Git-是什么？ 《Pro Git》 中文版V2：起步-Git-是什么？]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 使用示例 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 设置一次Git的全局用户名和邮箱&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email yourname@example.com&lt;br /&gt;
&lt;br /&gt;
# 在一个目录下，初始化git仓库&lt;br /&gt;
# 会在该目录自动生成一个.git目录&lt;br /&gt;
git init&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== .git 目录 === &lt;br /&gt;
所有git工作目录下都有个&amp;lt;code&amp;gt;.git&amp;lt;/code&amp;gt;目录，该目录包含几乎所有git操作和数据内容。当使用&amp;lt;code&amp;gt;git init&amp;lt;/code&amp;gt;初始化目录会自动生成该文件夹。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| config&lt;br /&gt;
| 该项目的特有配置，&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/Git-内部原理-底层命令与上层命令 《Pro Git》 中文版V2：10.1 Git 内部原理 - 底层命令与上层命令]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==命令==&lt;br /&gt;
===配置===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
|查看配置&lt;br /&gt;
|&amp;lt;code&amp;gt;git config --list&amp;lt;/code&amp;gt;查看所有配置信息&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;git config user.name&amp;lt;/code&amp;gt; 查看某一项配置 &amp;lt;br /&amp;gt;  &amp;lt;code&amp;gt;git config --list --show-origin&amp;lt;/code&amp;gt; 查看所有的配置以及它们所在的文件 &amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|设置用户信息&lt;br /&gt;
|配置全局用户名称和邮箱，&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
git config --global user.email yourname@example.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
如果某个项目想要使用不同的用户名称与邮件地址时，在项目目录，使用不带&amp;lt;code&amp;gt;--global&amp;lt;/code&amp;gt;设置用户信息。&lt;br /&gt;
|}&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/附录-C:-Git-命令-设置与配置《Pro Git》 中文版V2：附录 C: Git 命令 - 设置与配置]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===创建仓库===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| git init&lt;br /&gt;
| 初始化一个Git仓库&lt;br /&gt;
| &amp;lt;code&amp;gt;git init myproject&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| git clone&lt;br /&gt;
| 克隆一个Git仓库到本地&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;git clone https://github.com/git/git.git&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===快照===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| git add&lt;br /&gt;
| 添加文件到暂存区&lt;br /&gt;
| &amp;lt;code&amp;gt;git add README.md&amp;lt;/code&amp;gt;   &amp;lt;/br&amp;gt; &amp;lt;code&amp;gt;git add .&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| git commit&lt;br /&gt;
| 提交更新到本地仓库&lt;br /&gt;
| &amp;lt;code&amp;gt;git commit -m &amp;quot;Update README&amp;quot;&amp;lt;/code&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| git status&lt;br /&gt;
| 查看文件状态&lt;br /&gt;
| git status&lt;br /&gt;
|-&lt;br /&gt;
| git diff&lt;br /&gt;
| 比较工作区和暂存区差异&lt;br /&gt;
| git diff&lt;br /&gt;
|-&lt;br /&gt;
| [https://git-scm.com/docs/git-reset/zh_HANS-CN git reset]&lt;br /&gt;
| 重置当前HEAD到指定状态。可以使用&amp;lt;code&amp;gt;git log --oneline&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;git reflog&amp;lt;/code&amp;gt;查看要回滚的版本。  &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;参数：&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;--soft&amp;lt;/code&amp;gt;：本地仓库回滚，但是暂存区和工作区保持不变。&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;--mixed&amp;lt;/code&amp;gt;：本地仓和暂存区回滚，默认参数，等同于git reset。&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;--hard&amp;lt;/code&amp;gt;：本地仓、暂存区和工作区都回滚。注意，如果工作区有没有提交的代码就找不回。&lt;br /&gt;
|&amp;lt;code&amp;gt;git reset --soft HEAD~1&amp;lt;/code&amp;gt;   &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;git reset HEAD~1&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;git reset --hard HEAD~1&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;git reset --hard cba9527&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| git rm&lt;br /&gt;
| 从暂存区和工作区删除文件&lt;br /&gt;
| git rm README.md&lt;br /&gt;
|-&lt;br /&gt;
| git mv&lt;br /&gt;
| 移动或重命名文件、目录&lt;br /&gt;
| git mv file.txt file2.txt&lt;br /&gt;
|-&lt;br /&gt;
| [https://git-scm.com/docs/git-clean/zh_HANS-CN git clean]&lt;br /&gt;
| 删除工作区未跟踪文件。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;常用参数：&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt;  &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt;直接删除。&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;-i&amp;lt;/code&amp;gt;交互模式，显示会做什么，并以交互方式清理文件。&lt;br /&gt;
| &amp;lt;code&amp;gt;git clean -i&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;git clean -di&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;git clean -df&amp;lt;/code&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/附录-C:-Git-命令-快照基础《Pro Git》 中文版V2：附录 C: Git 命令 - 快照基础]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===分支管理===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| git branch&lt;br /&gt;
| 列出/创建/删除分支&lt;br /&gt;
|&amp;lt;code&amp;gt;git branch&amp;lt;/code&amp;gt;列出所有分支 &amp;lt;/br&amp;gt; &amp;lt;code&amp;gt;git branch -v&amp;lt;/code&amp;gt;  &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;git branch dev&amp;lt;/code&amp;gt;创建名称为dev分支&lt;br /&gt;
|-&lt;br /&gt;
| git checkout&lt;br /&gt;
| 切换分支，或者检出内容到工作目录。&lt;br /&gt;
| &amp;lt;code&amp;gt;git checkout dev&amp;lt;/code&amp;gt;切换到dev分支  &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;git checkout -b main&amp;lt;/code&amp;gt; 创建一个新的 main 分支并立即切换到该分支。 &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
git checkout -b main&lt;br /&gt;
git push origin main&lt;br /&gt;
git branch -d master&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; 将master分支重命名为main分支。1.创建 main 分支。2.main 分支推送到远程存储库，并覆盖旧的 master 分支。3.删除旧的 master 分支&lt;br /&gt;
|-&lt;br /&gt;
| git log&lt;br /&gt;
| 查看提交历史记录&lt;br /&gt;
|&amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;  &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;git log --oneline&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| git tag&lt;br /&gt;
| 打标签，创建、列出、删除标签。&lt;br /&gt;
| &amp;lt;code&amp;gt;git tag&amp;lt;/code&amp;gt;列出标签 &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;git tag -l &amp;quot;v2.3.5*&amp;quot;&amp;lt;/code&amp;gt;列出v2.3.5开头标签&lt;br /&gt;
|-&lt;br /&gt;
| git merge&lt;br /&gt;
| 合并一个或者多个分支&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| git mergetool&lt;br /&gt;
| 解决合并冲突&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| git stash&lt;br /&gt;
| 暂存当前工作目录状态&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/附录-C:-Git-命令-分支与合并《Pro Git》 中文版V2：附录 C: Git 命令 - 分支与合并]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===远程===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
|git clone&lt;br /&gt;
|克隆远程仓库&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|git remote -v&lt;br /&gt;
|查看远程仓库列表。用于查看当前仓库已经配置的远程仓库列表，以及它们的URL。&lt;br /&gt;
|&amp;lt;code&amp;gt;git remote -v&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|git remote show &amp;lt;远程仓库名&amp;gt;  &lt;br /&gt;
|查看特定远程仓库的详细信息。默认情况下，有一个 origin 的远程仓库名，它是 Git 的默认远程仓库名称。多个远程仓库时，可以使用不同的名称来管理。&lt;br /&gt;
| &amp;lt;code&amp;gt;git remote show origin&amp;lt;/code&amp;gt; 显示origin远程仓库的信息，包括远程仓库地址，分支等信息。&lt;br /&gt;
|-&lt;br /&gt;
| git remote add &amp;lt;远程仓库名&amp;gt; &amp;lt;URL&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| git fetch &amp;lt;远程仓库名&amp;gt;  &lt;br /&gt;
| 获取远程代码&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|git pull &amp;lt;远程仓库名&amp;gt; &amp;lt;分支名&amp;gt;&lt;br /&gt;
| 拉取远程代码及立即合并，相当于git fetch后执行git mergin。&lt;br /&gt;
| &amp;lt;code&amp;gt;git pull origin main&amp;lt;/code&amp;gt; 从远程的&amp;quot;origin&amp;quot;仓库的&amp;quot;main&amp;quot;分支中拉取最新的更改并将其合并到你的本地分支中。&lt;br /&gt;
|-&lt;br /&gt;
| git push &amp;lt;远程仓库名&amp;gt; &amp;lt;本地分支名&amp;gt;:&amp;lt;远程分支名&amp;gt;&lt;br /&gt;
|推送本地更改&lt;br /&gt;
| &amp;lt;code&amp;gt;git push origin main&amp;lt;/code&amp;gt; 将本地当前分支推送到远程origin仓库的main分支。 &amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;git push origin --delete test&amp;lt;/code&amp;gt;删除远程名称为test的分支，注意先备份数据。&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==SSH + 裸仓库==&lt;br /&gt;
=== 服务端配置 ===&lt;br /&gt;
以局域网建立建立git仓库示例，外网使用还需要更多安全设置，如改端口、密钥认证、fail2ban，git-shell 限制等。&lt;br /&gt;
以ubuntu示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 安装git，已安装跳过&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install git -y&lt;br /&gt;
&lt;br /&gt;
# 创建一个专门用于 Git 服务的系统用户&lt;br /&gt;
sudo useradd -m -s /bin/bash git&lt;br /&gt;
# 设置密码（可选）&lt;br /&gt;
sudo passwd git&lt;br /&gt;
&lt;br /&gt;
# 可选配置 git-shell 限制&lt;br /&gt;
# 限制 git 用户只能执行 git 相关命令，不能登录 shell&lt;br /&gt;
sudo chsh git -s $(which git-shell)&lt;br /&gt;
&lt;br /&gt;
# 切换到git用户&lt;br /&gt;
sudo su - git&lt;br /&gt;
# 初始化裸仓库&lt;br /&gt;
git init --bare project.git&lt;br /&gt;
# 可选：设置默认分支为 main&lt;br /&gt;
git config --global init.defaultBranch main&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 客户端使用 ===&lt;br /&gt;
假设服务器ip为192.168.1.100，配置[[SSH]]密钥，就不用输入密码。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 克隆仓库&lt;br /&gt;
git clone git@192.168.1.100:project.git&lt;br /&gt;
&lt;br /&gt;
# 推送本地已有项目&lt;br /&gt;
git remote add origin git@192.168.1.100:project.git&lt;br /&gt;
git push -u origin main&lt;br /&gt;
&lt;br /&gt;
# 日常协作命令&lt;br /&gt;
git pull origin main   # 拉取更新&lt;br /&gt;
git push origin main   # 推送更新&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hooks 钩子==&lt;br /&gt;
Git 钩子（Hooks ）用于在特定的重要动作发生时触发自定义脚本。分为客户端的和服务器端的。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90 中文版V2：8.3 自定义 Git - Git 钩子 ]&lt;br /&gt;
}}&lt;br /&gt;
===快速入门===&lt;br /&gt;
钩子默认位于Git目录下&amp;lt;code&amp;gt;.git/hooks&amp;lt;/code&amp;gt;目录中，文件名为钩子名称(没有扩展名)，如&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt;，该文件将在commit前运行。初始化git项目时，hooks目录下有很多示例脚本，都是以&amp;lt;code&amp;gt;.sample&amp;lt;/code&amp;gt;结尾，如果要启用去掉这个后缀。&lt;br /&gt;
&lt;br /&gt;
以下示例使用&amp;lt;code&amp;gt;post-commit&amp;lt;/code&amp;gt;钩子在每次提交时将最新的 commit ID 写入一个 version.txt 文件。&lt;br /&gt;
*创建钩子：&amp;lt;code&amp;gt;touch .git/hooks/post-commit&amp;lt;/code&amp;gt;。&lt;br /&gt;
*编辑钩子：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# 获取最新的短 commit ID&lt;br /&gt;
COMMIT_ID=$(git rev-parse --short HEAD)&lt;br /&gt;
&lt;br /&gt;
# 将 commit ID 写入临时文件&lt;br /&gt;
echo $COMMIT_ID &amp;gt; version.txt.tmp&lt;br /&gt;
&lt;br /&gt;
# 如果 version.txt 不存在或内容不同于临时文件，才更新 version.txt&lt;br /&gt;
if [ ! -f version.txt ] || ! cmp -s version.txt.tmp version.txt; then&lt;br /&gt;
    mv version.txt.tmp version.txt&lt;br /&gt;
    git add version.txt&lt;br /&gt;
    git commit --amend --no-edit --allow-empty&lt;br /&gt;
else&lt;br /&gt;
    rm version.txt.tmp&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 使 post-commit 钩子可执行：&amp;lt;code&amp;gt;chmod +x .git/hooks/post-commit&amp;lt;/code&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90 中文版V2：8.3 自定义 Git - Git 钩子 ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==设置==&lt;br /&gt;
=== Linux终端显示当前Git分支 ===&lt;br /&gt;
进入用户的Home目录，编辑.bashrc文件&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~  &lt;br /&gt;
vim .bashrc   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
将下面代码加入.bashrc文件末尾，并保存：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
function git_branch {&lt;br /&gt;
   branch=&amp;quot;`git branch 2&amp;gt;/dev/null | grep &amp;quot;^\*&amp;quot; | sed -e &amp;quot;s/^\*\ //&amp;quot;`&amp;quot;&lt;br /&gt;
   if [ &amp;quot;${branch}&amp;quot; != &amp;quot;&amp;quot; ];then&lt;br /&gt;
       if [ &amp;quot;${branch}&amp;quot; = &amp;quot;(no branch)&amp;quot; ];then&lt;br /&gt;
           branch=&amp;quot;(`git rev-parse --short HEAD`...)&amp;quot;&lt;br /&gt;
       fi&lt;br /&gt;
       echo &amp;quot; ($branch)&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
}&lt;br /&gt;
export PS1=&#039;\u@\h \[\033[01;36m\]\W\[\033[01;32m\]$(git_branch)\[\033[00m\] \$ &#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
保存并退出，执行加载命令&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
source ./.bashrc&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Git 官网：https://git-scm.com/ &lt;br /&gt;
*Git 文档：https://git-scm.com/doc &lt;br /&gt;
* Git 文档 参考 https://git-scm.com/docs&lt;br /&gt;
*Git 文档：书籍《Pro Git》中文版 ：https://git-scm.com/book/zh/v2 &lt;br /&gt;
&lt;br /&gt;
===文章===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/Git 维基百科：git]&lt;br /&gt;
&lt;br /&gt;
[[分类:编程工具]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Piper_TTS&amp;diff=1760</id>
		<title>Piper TTS</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Piper_TTS&amp;diff=1760"/>
		<updated>2026-04-20T01:46:07Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 中文 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Piper TTS是一个快速、本地运行的神经网络文本转语音（TTS）引擎，基于 VITS 模型，使用 ONNX 格式运行。它支持多种语言（包括中文），模型体积小、速度快，即使在低端硬件（如 Raspberry Pi）上也能实时合成高质量、自然的语音，完全离线隐私安全。注意：原 rhasspy/piper 仓库已归档，开发迁移到 OHF-Voice/piper1-gpl（GPL 许可）。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
==中文==&lt;br /&gt;
对于离线，可以先在Hugging Face下载需要的模型和安装需要的包：&lt;br /&gt;
*piper-voices中文模型： https://huggingface.co/rhasspy/piper-voices/tree/main/zh/zh_CN&lt;br /&gt;
*g2pW模型：默认路径download_dir / &amp;quot;g2pW&amp;quot;，其中 download_dir 默认是 当前工作目录（即你运行 Python 脚本或 piper 命令时的目录）。&lt;br /&gt;
*bert-base-chinese模型：G2PWConverter 在初始化时调用了 BertTokenizer.from_pretrained(self.model_source)，而 model_source 默认是 &amp;quot;bert-base-chinese&amp;quot;。地址：https://huggingface.co/google-bert/bert-base-chinese/tree/main。&lt;br /&gt;
*Sentence Stream包：安装 &amp;lt;code&amp;gt;pip install sentence-stream&amp;lt;/code&amp;gt;。 这个模块是 OHF-Voice 自己维护的一个小型句子分割器（sentence splitter），专门用于把长文本按句子切分后再做 phonemization。&lt;br /&gt;
&lt;br /&gt;
文件结构如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
/path/to/project/&lt;br /&gt;
├── voices/    &lt;br /&gt;
│   ├── zh_CN-chaowen-medium.onnx&lt;br /&gt;
│   ├── zh_CN-chaowen-medium.onnx.json&lt;br /&gt;
     └── ... （其他模型）&lt;br /&gt;
├── g2pW/                &lt;br /&gt;
│   ├── g2pw.onnx         &lt;br /&gt;
│   ├── config.json       &lt;br /&gt;
│   └── ...                &lt;br /&gt;
├── bert-base-chinese/    &lt;br /&gt;
│   ├── config.json&lt;br /&gt;
│   ├── tokenizer_config.json   &lt;br /&gt;
│   ├── vocab.txt&lt;br /&gt;
│   ├── pytorch_model.bin       （或 model.safetensors）&lt;br /&gt;
│   ├── tokenizer.json&lt;br /&gt;
│   └── ... （其他必要文件）&lt;br /&gt;
└── test.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
简单测试test.py：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import wave&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import piper&lt;br /&gt;
&lt;br /&gt;
# 完全离线设置（防止任何网络尝试）&lt;br /&gt;
os.environ[&amp;quot;TRANSFORMERS_OFFLINE&amp;quot;] = &amp;quot;1&amp;quot;&lt;br /&gt;
os.environ[&amp;quot;HF_HUB_OFFLINE&amp;quot;] = &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
model_path = Path(&amp;quot;/path/to/project/voices/zh_CN-chaowen-medium.onnx&amp;quot;)&lt;br /&gt;
download_dir = Path(&amp;quot;/path/to/project/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
voice = piper.PiperVoice.load(model_path=model_path, download_dir=download_dir)&lt;br /&gt;
&lt;br /&gt;
# 运行一次自定义 phonemizer，指定bert-base-chinese位置。&lt;br /&gt;
from piper.phonemize_chinese import ChinesePhonemizer&lt;br /&gt;
from g2pw import G2PWConverter&lt;br /&gt;
&lt;br /&gt;
class OfflineChinesePhonemizer(ChinesePhonemizer):&lt;br /&gt;
    def __init__(self, model_dir: Path):&lt;br /&gt;
        super().__init__(model_dir)  # 先让它找到 g2pw.onnx&lt;br /&gt;
        # 重新初始化 g2p，使用本地 bert-base-chinese&lt;br /&gt;
        bert_path = download_dir / &amp;quot;bert-base-chinese&amp;quot;&lt;br /&gt;
        self.g2p = G2PWConverter(&lt;br /&gt;
            model_dir=str(model_dir),&lt;br /&gt;
            model_source=str(bert_path),   # 本地 bert 路径&lt;br /&gt;
            style=&amp;quot;pinyin&amp;quot;,&lt;br /&gt;
            enable_non_tradional_chinese=True&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
# 替换 phonemizer&lt;br /&gt;
voice._chinese_phonemizer = OfflineChinesePhonemizer(download_dir / &amp;quot;g2pW&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 合成语音&lt;br /&gt;
out_file = &amp;quot;test.wav&amp;quot;&lt;br /&gt;
text = &amp;quot;你好，树莓派。&amp;quot;&lt;br /&gt;
print(&amp;quot;正在合成:&amp;quot;, text)&lt;br /&gt;
&lt;br /&gt;
with wave.open(out_file, &amp;quot;wb&amp;quot;) as wav_file:&lt;br /&gt;
    voice.synthesize_wav(text, wav_file)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;✅ 成功生成 test.wav, 地址：{Path(out_file).resolve()}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
&lt;br /&gt;
===文章===&lt;br /&gt;
* https://calbryant.uk/blog/training-a-new-ai-voice-for-piper-tts-with-only-4-words&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Piper_TTS&amp;diff=1759</id>
		<title>Piper TTS</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Piper_TTS&amp;diff=1759"/>
		<updated>2026-04-19T16:46:38Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Piper TTS是一个快速、本地运行的神经网络文本转语音（TTS）引擎，基于 VITS 模型，使用 ONNX 格式运行。它支持多种语言（包括中文），模型体积小、速度快，即使在低端硬件（如 Raspberry Pi）上也能实时合成高质量、自然的语音，完全离线隐私安全。注意：原 rhasspy/piper 仓库已归档，开发迁移到 OHF-Voice/piper1-gpl（GPL 许可）。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
==中文==&lt;br /&gt;
对于离线，可以先在Hugging Face下载需要的模型和安装需要的包：&lt;br /&gt;
*piper-voices中文模型： https://huggingface.co/rhasspy/piper-voices/tree/main/zh/zh_CN&lt;br /&gt;
*g2pW模型：默认路径download_dir / &amp;quot;g2pW&amp;quot;，其中 download_dir 默认是 当前工作目录（即你运行 Python 脚本或 piper 命令时的目录）。&lt;br /&gt;
*bert-base-chinese模型：G2PWConverter 在初始化时调用了 BertTokenizer.from_pretrained(self.model_source)，而 model_source 默认是 &amp;quot;bert-base-chinese&amp;quot;。地址：https://huggingface.co/google-bert/bert-base-chinese/tree/main。&lt;br /&gt;
*Sentence Stream包：安装 &amp;lt;code&amp;gt;pip install sentence-stream&amp;lt;/code&amp;gt;。 这个模块是 OHF-Voice 自己维护的一个小型句子分割器（sentence splitter），专门用于把长文本按句子切分后再做 phonemization。&lt;br /&gt;
&lt;br /&gt;
文件结构如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
/path/to/project/&lt;br /&gt;
├── voices/    &lt;br /&gt;
│   ├── zh_CN-chaowen-medium.onnx&lt;br /&gt;
│   ├── zh_CN-chaowen-medium.onnx.json&lt;br /&gt;
     └── ... （其他模型）&lt;br /&gt;
├── g2pW/                &lt;br /&gt;
│   ├── g2pw.onnx         &lt;br /&gt;
│   ├── config.json       &lt;br /&gt;
│   └── ...                &lt;br /&gt;
├── bert-base-chinese/    &lt;br /&gt;
│   ├── config.json&lt;br /&gt;
│   ├── tokenizer_config.json   &lt;br /&gt;
│   ├── vocab.txt&lt;br /&gt;
│   ├── pytorch_model.bin       （或 model.safetensors）&lt;br /&gt;
│   ├── tokenizer.json&lt;br /&gt;
│   └── ... （其他必要文件）&lt;br /&gt;
└── test.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
简单测试test.py：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import wave&lt;br /&gt;
from piper import PiperVoice&lt;br /&gt;
&lt;br /&gt;
# 相对路径或绝对路径&lt;br /&gt;
model_path = &amp;quot;/path/to/project/voices/zh_CN-chaowen-medium.onnx&amp;quot;&lt;br /&gt;
download_dir = &amp;quot;/path/to/project/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 加载语音&lt;br /&gt;
voice = PiperVoice.load(model_path, download_dir=download_dir)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with wave.open(&amp;quot;test.wav&amp;quot;, &amp;quot;wb&amp;quot;) as wav_file:&lt;br /&gt;
    voice.synthesize_wav(&amp;quot;你好，树莓派。&amp;quot;, wav_file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
&lt;br /&gt;
===文章===&lt;br /&gt;
* https://calbryant.uk/blog/training-a-new-ai-voice-for-piper-tts-with-only-4-words&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Piper_TTS&amp;diff=1758</id>
		<title>Piper TTS</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Piper_TTS&amp;diff=1758"/>
		<updated>2026-04-19T16:14:51Z</updated>

		<summary type="html">&lt;p&gt;Eric：​创建页面，内容为“Piper TTS是一个快速、本地运行的神经网络文本转语音（TTS）引擎，基于 VITS 模型，使用 ONNX 格式运行。它支持多种语言（包括中文），模型体积小、速度快，即使在低端硬件（如 Raspberry Pi）上也能实时合成高质量、自然的语音，完全离线隐私安全。注意：原 rhasspy/piper 仓库已归档，开发迁移到 OHF-Voice/piper1-gpl（GPL 许可）。  ==简介== ===时间轴===  ==安…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Piper TTS是一个快速、本地运行的神经网络文本转语音（TTS）引擎，基于 VITS 模型，使用 ONNX 格式运行。它支持多种语言（包括中文），模型体积小、速度快，即使在低端硬件（如 Raspberry Pi）上也能实时合成高质量、自然的语音，完全离线隐私安全。注意：原 rhasspy/piper 仓库已归档，开发迁移到 OHF-Voice/piper1-gpl（GPL 许可）。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
&lt;br /&gt;
===文章===&lt;br /&gt;
* https://calbryant.uk/blog/training-a-new-ai-voice-for-piper-tts-with-only-4-words&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CosyVoice&amp;diff=1757</id>
		<title>CosyVoice</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CosyVoice&amp;diff=1757"/>
		<updated>2026-04-19T03:00:40Z</updated>

		<summary type="html">&lt;p&gt;Eric：​创建页面，内容为“CosyVoice是一款开源的文本转语音（TTS）系统。支持多语言，中文支持18种方言口音。   ==简介== ===时间轴===  ==快速入门==  ==资源== ===官网=== * https://github.com/FunAudioLLM/CosyVoice * https://funaudiollm.github.io/cosyvoice3  ===网站===”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CosyVoice是一款开源的文本转语音（TTS）系统。支持多语言，中文支持18种方言口音。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
* https://github.com/FunAudioLLM/CosyVoice&lt;br /&gt;
* https://funaudiollm.github.io/cosyvoice3&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Docker&amp;diff=1756</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Docker&amp;diff=1756"/>
		<updated>2026-04-18T15:45:15Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 常用仓库 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker 是一个开源软件的容器引擎软件。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
* 2013年3月13日，发布初始版本。&lt;br /&gt;
&lt;br /&gt;
===虚拟机与容器===&lt;br /&gt;
[[虚拟机]]可以在一种操作系统里面运行另一种操作系统，但虚拟机，资源占用多，启动慢。&lt;br /&gt;
&lt;br /&gt;
容器是操作系统层虚拟化，容器化的优势在于占用服务器空间少，通常几秒内即可引导。&lt;br /&gt;
&lt;br /&gt;
Docker 是一种容器的管理方式。下文的容器主要指Docker的容器。&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====CentOS====&lt;br /&gt;
官网建议安装在[[CentOS]] 7及以上的系统。如果之前有安装docker，先卸载之前版本。三种安装方法：&lt;br /&gt;
*添加Docker源进行安装，安装和升级方便，这是推荐的方法。&lt;br /&gt;
*下载RPM软件包，手动安装。&lt;br /&gt;
*官方一键安装脚本，一些测试和开发用户会选择这种方法。&lt;br /&gt;
&lt;br /&gt;
方法一，添加Docker源进行安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#安装所需的软件包&lt;br /&gt;
sudo yum install -y yum-utils device-mapper-persistent-data lvm2&lt;br /&gt;
&lt;br /&gt;
#安装containerd.io软件包，不然会报错requires containerd.io &amp;gt;= 1.2.2-3&lt;br /&gt;
sudo yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#设置官网的稳定版仓库源&lt;br /&gt;
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo&lt;br /&gt;
&lt;br /&gt;
#可选，体验版和测试版默认是关闭的，可以通过命令打开，详细见文档。&lt;br /&gt;
&lt;br /&gt;
#安装最新版本的docker CE&lt;br /&gt;
sudo yum install docker-ce&lt;br /&gt;
&lt;br /&gt;
#启动守护进程&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
也可以使用dnf命令安装，dnf为下一代yum命令。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo dnf -y install dnf-plugins-core&lt;br /&gt;
sudo dnf install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm&lt;br /&gt;
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo&lt;br /&gt;
sudo dnf install docker-ce&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
方法二，下载RPM包，离线安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#在联网的计算机下载RPM软件包，从官网地址选一个版本下载：https://download.docker.com/linux/fedora/&lt;br /&gt;
#比如：docker-ce-cli-19.03.4-3.fc31.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#复制到计算机的某个目录，执行安装&lt;br /&gt;
sudo dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#启动守护进程&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
方法三，使用脚本安装：&lt;br /&gt;
Docker提供脚本安装方式，快捷安装。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#下载脚本&lt;br /&gt;
curl -fsSL https://get.docker.com -o get-docker.sh&lt;br /&gt;
#运行脚本安装&lt;br /&gt;
sudo sh get-docker.sh&lt;br /&gt;
&lt;br /&gt;
#如果以非root用户使用docker（推荐）， 需要添加一个用户到&#039;docker&#039;用户组中&lt;br /&gt;
#查看是否添加成功，如果添加当前登录的用户，需要重新登录，组权限才会生效。&lt;br /&gt;
sudo usermod -aG docker your-user-name&lt;br /&gt;
&lt;br /&gt;
#查看是否安装成功&lt;br /&gt;
docker --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Ubuntu====&lt;br /&gt;
[[Ubuntu]]安装Docker也有三种方法，与[[CentOS]]安装docker类似。&lt;br /&gt;
&lt;br /&gt;
方法一，添加Docker源进行安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#获取apt可用最新列表&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
#使用apt安装下列软件包&lt;br /&gt;
sudo apt-get install \&lt;br /&gt;
    apt-transport-https \&lt;br /&gt;
    ca-certificates \&lt;br /&gt;
    curl \&lt;br /&gt;
    gnupg-agent \&lt;br /&gt;
    software-properties-common&lt;br /&gt;
#添加docker官方GPG密钥，验证密钥指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88&lt;br /&gt;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br /&gt;
sudo apt-key fingerprint 0EBFCD88&lt;br /&gt;
#添加docker的稳定源&lt;br /&gt;
sudo add-apt-repository \&lt;br /&gt;
   &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \&lt;br /&gt;
   $(lsb_release -cs) \&lt;br /&gt;
   stable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#获取apt可用最新列表&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
#安装最新版的Docker CE&lt;br /&gt;
sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;br /&gt;
&lt;br /&gt;
#检验是否安装成功&lt;br /&gt;
sudo docker run hello-world&lt;br /&gt;
#使用非root用户使用docker，可以将用户添加到docker组：&lt;br /&gt;
sudo gpasswd -a ${USER} docker  #将当前用户添加到docker组，重新登录后生效&lt;br /&gt;
sudo usermod -aG docker your-user  #将其他用户添加到docker组&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/install/linux/docker-ce/ubuntu/ Docker文档-Ubuntu安装Docker CE]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==镜像==&lt;br /&gt;
镜像(Image)是只读文件，容器是运行在镜像之上，运行容器时会复制镜像然后启动。镜像的一些属性：&lt;br /&gt;
*REPOSITORY：表示镜像的仓库源&lt;br /&gt;
*TAG：镜像的标签&lt;br /&gt;
*IMAGE ID：镜像ID&lt;br /&gt;
*CREATED：镜像创建时间&lt;br /&gt;
*SIZE：镜像大小&lt;br /&gt;
&lt;br /&gt;
当运行容器时，使用的镜像如果在本地中不存在，docker 就会自动从 docker 镜像仓库中下载，默认是从 Docker Hub 公共镜像源下载。&lt;br /&gt;
&lt;br /&gt;
===镜像使用===&lt;br /&gt;
可以命令行输入&amp;lt;code&amp;gt;命令 --help&amp;lt;/code&amp;gt;查看帮助，如在命令行输入&amp;lt;code&amp;gt;docker search --help&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/image_ls/ docker image ls] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;[https://docs.docker.com/engine/reference/commandline/images/ docker images]&lt;br /&gt;
| &#039;&#039;&#039;查看镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;列出本地主机上的镜像&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image ls&amp;lt;/code&amp;gt;查看本地镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker images -a &amp;lt;/code&amp;gt;列出本地主机上的镜像，包括默认隐藏的中间镜像。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/tag/ docker tag] &amp;lt;br /&amp;gt;docker image tag&lt;br /&gt;
| &#039;&#039;&#039;创建引用标签&#039;&#039;&#039; &amp;lt;br /&amp;gt;为镜像创建新标签，方便使用。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker tag 0e1234567893 ubuntu:V20&amp;lt;/code&amp;gt;为ID：0e1234567893的镜像加多个标签ubuntu:V20 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker tag ubuntu:18.04 mytest/ubuntu:18&amp;lt;/code&amp;gt;为ubuntu:18.04镜像添加标签mytest/ubuntu:18&lt;br /&gt;
|- &lt;br /&gt;
| docker image rm &amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;docker rmi&lt;br /&gt;
| &#039;&#039;&#039;删除镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;删除镜像正在使用的镜像会报错&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image rm Ubuntu&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker rmi Ubuntu&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| docker image prune&lt;br /&gt;
| &#039;&#039;&#039;清理镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;删除未使用的镜像&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image prune&amp;lt;/code&amp;gt;删除未使用的镜像&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/image_pull/ docker pull]&lt;br /&gt;
| &#039;&#039;&#039;下载镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker pull ubuntu&amp;lt;/code&amp;gt;默认下载tag: latest的版本 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker pull ubuntu:18.04&amp;lt;/code&amp;gt;指定镜像版本&lt;br /&gt;
|- &lt;br /&gt;
| docker search&lt;br /&gt;
| &#039;&#039;&#039;搜索镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。&amp;lt;br /&amp;gt;输出结果说明：&amp;lt;br /&amp;gt;NAME: 镜像仓库源的名称&amp;lt;br /&amp;gt;DESCRIPTION: 镜像的描述&amp;lt;br /&amp;gt;OFFICIAL: 是否docker官方发布&amp;lt;br /&amp;gt;START: 表示点赞数量&amp;lt;br /&amp;gt;AUTOMATED: 自动构建&lt;br /&gt;
| &amp;lt;code&amp;gt;docker search nginx&amp;lt;/code&amp;gt;搜索nginx软件的镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker search --filter=is-offical=true mysql&amp;lt;/code&amp;gt;搜索mysql软件的镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker search --filter=stars=100 mysql&amp;lt;/code&amp;gt;搜索star超过100的mysql镜像&lt;br /&gt;
|-&lt;br /&gt;
|docker push&lt;br /&gt;
|&#039;&#039;&#039;上传镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认上传到Docker镜像仓库[https://hub.docker.com/ Docker Hub]，公共仓库为免费，私有仓库需要付费使用。先注册一个免费Docker 账号，接下来可以在终端操作。&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#登录使用docker login，再输入账号密码&lt;br /&gt;
docker login&lt;br /&gt;
&lt;br /&gt;
#上传镜像使用docker push，需要登录再使用。username为个人的账户名&lt;br /&gt;
docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
#退出使用docker logout&lt;br /&gt;
docker logout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| docker history&lt;br /&gt;
| &#039;&#039;&#039;镜像历史&#039;&#039;&#039; &amp;lt;br /&amp;gt;查看制作镜像的命令 &amp;lt;br /&amp;gt;格式：&amp;lt;code&amp;gt;docker history [参数] 镜像&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;docker history nginx&amp;lt;/code&amp;gt;查看nginx镜像制作的历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/image/ Docker 参考：docker image]&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/images/ Docker 参考：docker images]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===常用镜像===&lt;br /&gt;
====操作系统基础镜像====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 镜像名称&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| busybox&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| alpine&lt;br /&gt;
| 5 MB&lt;br /&gt;
| Alpine Linux是一个面向安全的轻型的Linux发行版。Alpine不包含 bash 因此进入某个alpine docker容器，可以使用sh命令，如：&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -it container_name sh&amp;lt;/code&amp;gt;进入某个容器并运行sh。 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker run -it -v data_volume:/data alpine:3.16.9 sh&amp;lt;/code&amp;gt;启动一个容器，挂在data_volume卷到容器的/data目录。&lt;br /&gt;
| 官网：https://www.alpinelinux.org/ &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/alpine/&lt;br /&gt;
|-&lt;br /&gt;
| ubuntu&lt;br /&gt;
| 30 MB&lt;br /&gt;
| &lt;br /&gt;
|官网：http://www.ubuntu.com/  &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/ubuntu/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====编程语言基础镜像====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 镜像名称&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| python&lt;br /&gt;
| 50 MB &amp;lt;br /&amp;gt;350 MB &amp;lt;br /&amp;gt;2.64G&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;br /&amp;gt;镜像： https://hub.docker.com/_/python/&lt;br /&gt;
|-&lt;br /&gt;
| node&lt;br /&gt;
|&lt;br /&gt;
| Node.js是一个基于JavaScript的平台，用于服务器端和网络应用程序。&lt;br /&gt;
| &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/node/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===制作镜像===&lt;br /&gt;
当docker镜像仓库没有想要的镜像，可以通过以下两种方式制作镜像。&lt;br /&gt;
*在已有容器中修改，再提交保存为新镜像。&lt;br /&gt;
*使用Dockerfile文件，从头创建一个新的镜像。&lt;br /&gt;
&lt;br /&gt;
====容器打包为镜像====&lt;br /&gt;
修改容器，通过命令 docker commit 将容器打包为新镜像。如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#启动一个名称ubuntu-18为容器，并进入容器终端&lt;br /&gt;
docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash&lt;br /&gt;
&lt;br /&gt;
#在容器内修改，如更新软件，&lt;br /&gt;
apt-get update &lt;br /&gt;
&lt;br /&gt;
#退出这个容器&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
#提交打包镜像&lt;br /&gt;
docker commit ubuntu-18 ubuntu-updated &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Dockerfile创建镜像====&lt;br /&gt;
Docker可以自动读取Dockerfile文件里的指令生成一个镜像。Dockerfile是一个文本文件，都是一些关于组装镜像的指令。通过docker build命令来生成一个镜像。&lt;br /&gt;
&lt;br /&gt;
====Dockerfile语法====&lt;br /&gt;
Dockerfile文件格式如下：&lt;br /&gt;
 # Comment 注释&lt;br /&gt;
 INSTRUCTION arguments&lt;br /&gt;
&lt;br /&gt;
注释使用#号，指令不区分大小写，但一般指令使用大写，这样容易和后面参数区分开来。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Dockerfile指令====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
!指令!!格式!!描述!!示例&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#from FROM]&lt;br /&gt;
|FROM [--platform=&amp;lt;platform&amp;gt;] &amp;lt;image&amp;gt;[:&amp;lt;tag&amp;gt;] [AS &amp;lt;name&amp;gt;]&lt;br /&gt;
|初始化，设置基准镜像。这个指令必须放开头。&lt;br /&gt;
|FROM debian:buster-slim&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#run RUN]&lt;br /&gt;
|RUN &amp;lt;command&amp;gt; 或 RUN [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]&lt;br /&gt;
|执行命令&lt;br /&gt;
|RUN /bin/bash -c &#039;source $HOME/.bashrc; echo $HOME&#039;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#cmd CMD]&lt;br /&gt;
|CMD [&amp;quot;param1&amp;quot;,&amp;quot;param2&amp;quot;]&amp;lt;br \&amp;gt; CMD command param1 param2 &amp;lt;br \&amp;gt;  CMD [&amp;quot;executable&amp;quot;,&amp;quot;param1&amp;quot;,&amp;quot;param2&amp;quot;] &lt;br /&gt;
|容器启动时执行的命令。该指令只能有一个，当有多个RUN指令只会执行最后一个&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#label LABEL]&lt;br /&gt;
|LABEL &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; ...&lt;br /&gt;
|给镜像添加元数据。如添加一些作者信息，版本信息等。可以使用docker image inspect命令查看镜像所有信息，包括标签。&lt;br /&gt;
|LABEL maintainer=&amp;quot;yourname@domain.com&amp;quot; version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#expose EXPOSE]&lt;br /&gt;
|EXPOSE &amp;lt;port&amp;gt; [&amp;lt;port&amp;gt;/&amp;lt;protocol&amp;gt;...]&lt;br /&gt;
|开放容器某个端口，默认协议为TCP。运行主机可以通过docker run命令增加-p参数来对接这个端口。&lt;br /&gt;
|EXPOSE 80/udp&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#env ENV]&lt;br /&gt;
|ENV &amp;lt;key&amp;gt; &amp;lt;value&amp;gt; &amp;lt;br \&amp;gt;ENV &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; ...&lt;br /&gt;
|设置环境变量&lt;br /&gt;
|ENV myName John Doe&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#add ADD]&lt;br /&gt;
|ADD [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt; &amp;lt;br \&amp;gt;ADD [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] [&amp;quot;&amp;lt;src&amp;gt;&amp;quot;,... &amp;quot;&amp;lt;dest&amp;gt;&amp;quot;]&lt;br /&gt;
|复制文件、目录或URLs到镜像中。src的路径支持Go语言的filepath.Match规则。&lt;br /&gt;
|ADD test.txt /etc/test/ &amp;lt;br \&amp;gt;拷贝主机的test.txt文件到镜像/etc/test/目录中&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#copy COPY]&lt;br /&gt;
|COPY [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt;  &amp;lt;br \&amp;gt;COPY [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] [&amp;quot;&amp;lt;src&amp;gt;&amp;quot;,... &amp;quot;&amp;lt;dest&amp;gt;&amp;quot;]&lt;br /&gt;
|复制文件或目录到镜像中。src的路径支持Go语言的filepath.Match规则。&lt;br /&gt;
|COPY test.txt /etc/test/ &amp;lt;br \&amp;gt;拷贝主机的test.txt文件到镜像/etc/test/目录中&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#entrypoint ENTRYPOINT]&lt;br /&gt;
|ENTRYPOINT [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]  &amp;lt;br \&amp;gt;ENTRYPOINT command param1 param2&lt;br /&gt;
|容器启动时执行的命令。&lt;br /&gt;
|ENTRYPOINT [&amp;quot;top&amp;quot;, &amp;quot;-b&amp;quot;]&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#volume VOLUME]&lt;br /&gt;
|VOLUME [&amp;quot;/data&amp;quot;]&lt;br /&gt;
|创建挂载点&lt;br /&gt;
|VOLUME /myvol&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#user USER]&lt;br /&gt;
|USER &amp;lt;user&amp;gt;[:&amp;lt;group&amp;gt;] &amp;lt;br \&amp;gt;USER &amp;lt;UID&amp;gt;[:&amp;lt;GID&amp;gt;]&lt;br /&gt;
|设置启动容器的用户，可以是用户名或UID。&lt;br /&gt;
|USER username&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#workdir WORKDIR]&lt;br /&gt;
|WORKDIR /path/to/workdir&lt;br /&gt;
|设置工作目录，对RUN, CMD, ENTRYPOINT, COPY 和 ADD指令有效。&lt;br /&gt;
|WORKDIR /home/foo/work&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#arg ARG]&lt;br /&gt;
|ARG &amp;lt;name&amp;gt;[=&amp;lt;default value&amp;gt;]&lt;br /&gt;
|设置构建镜像时变量，构建docker build时使用--build-arg &amp;lt;varname&amp;gt;=&amp;lt;value&amp;gt;传递变量值。&lt;br /&gt;
|ARG user1=someuser&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#onbuild ONBUILD]&lt;br /&gt;
|ONBUILD &amp;lt;INSTRUCTION&amp;gt;&lt;br /&gt;
|设置触发指令，当该镜像作为基准镜像，构建时执行。&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#stopsignal STOPSIGNAL]&lt;br /&gt;
|STOPSIGNAL signal&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#healthcheck HEALTHCHECK]&lt;br /&gt;
|HEALTHCHECK [OPTIONS] CMD command &amp;lt;br \&amp;gt;HEALTHCHECK NONE&lt;br /&gt;
|告诉dockers该镜像的容器正常工作状况&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#shell SHELL]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====docker build构建镜像====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
| [https://docs.docker.com/engine/reference/builder/ Docker参考：Dockerfile]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 容器 ==&lt;br /&gt;
容器（Container）是运行在镜像之上，运行容器时会复制镜像然后启动。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/run/ docker run]&lt;br /&gt;
| &#039;&#039;&#039;运行容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;docker run [参数] 镜像 [COMMAND] [ARG...]&amp;lt;br /&amp;gt;从镜像启动一个新容器。该命令会检查本地是否有镜像，没有就从docker仓库中下载。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--name&amp;lt;/code&amp;gt; 容器命名，如&amp;lt;code&amp;gt;--name test&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--restart&amp;lt;/code&amp;gt; 重启策略，如停止后自动重启：&amp;lt;code&amp;gt;--restart=always&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-P&amp;lt;/code&amp;gt; 绑定端口  &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt; 挂载&lt;br /&gt;
| &amp;lt;code&amp;gt;docker run -it ubuntu&amp;lt;/code&amp;gt;使用 ubuntu 镜像启动一个容器 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker run -it ubuntu /bin/bash&amp;lt;/code&amp;gt;启动一个ubuntu容器，并进入终端。要退出容器里的终端输入exit。&amp;lt;code&amp;gt;docker run -itd --name ubuntu-test ubuntu /bin/bash&amp;lt;/code&amp;gt;启动一个名称ubuntu-test为容器，并后台运行。参数-d表示后台运行。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/update/ docker update] &lt;br /&gt;
| &#039;&#039;&#039;更新容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;动态更新容器配置。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--memory&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; 内存限制 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--restart&amp;lt;/code&amp;gt; 重启策略&lt;br /&gt;
| &amp;lt;code&amp;gt;docker update --restart=unless-stopped mynginx&amp;lt;/code&amp;gt; 配置mynginx容器重启策略为unless-stopped&lt;br /&gt;
|-&lt;br /&gt;
| docker start&lt;br /&gt;
| &#039;&#039;&#039;启动容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;启动已经停止的容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker start dw3342531d3&amp;lt;/code&amp;gt; 启动一个容器id为dw3342531d3的容器。&lt;br /&gt;
|- &lt;br /&gt;
| docker restart&lt;br /&gt;
|&#039;&#039;&#039;重启容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;重启正在运行的容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker restart ubuntu-test&amp;lt;/code&amp;gt; 重启容器ubuntu-test。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/ps/ docker ps]&lt;br /&gt;
|&#039;&#039;&#039;查看本地容器列表&#039;&#039;&#039; &amp;lt;br /&amp;gt;重启正在运行的容器。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--no-trunc&amp;lt;/code&amp;gt; 显示完整内容，不截断。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker ps&amp;lt;/code&amp;gt;查看正在运行的容器&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker ps -a&amp;lt;/code&amp;gt;查看所用容器，包括停止的 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker ps --no-trunc&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/inspect/ docker inspect]&lt;br /&gt;
|&#039;&#039;&#039;查看容器信息&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-f, --format &amp;lt;/code&amp;gt; 使用Go语言template格式化输出。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker inspect ubuntu-test&amp;lt;/code&amp;gt; 查看ubuntu-test容器信息 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect --format=&#039;{{.NetworkSettings.IPAddress}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器ip &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{.Name}} - {{range .NetworkSettings.Networks }} {{.IPAddress}} {{end}}&#039; $(docker ps -aq)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看所有容器ip地址。 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器MAC &amp;lt;br \&amp;gt; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect --format=&#039;{{.LogPath}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器的log地址 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{.Config.Image}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器的镜像名称 &lt;br /&gt;
|- &lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/stats/ docker stats]&lt;br /&gt;
|&#039;&#039;&#039;实时统计容器使用资源&#039;&#039;&#039; &amp;lt;br \&amp;gt;统计容器使用主机CUP、内存的百分比，通过网络发送和接收的数据量，从主机上的块设备读取和写入的数据量。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker stats&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/logs/ docker logs]&lt;br /&gt;
|&#039;&#039;&#039;查看容器日志&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器内部的标准输出。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker logs ubuntu-test&amp;lt;/code&amp;gt;查看ubuntu-test容器内部的标准输出 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker logs -f ubuntu-test&amp;lt;/code&amp;gt;跟踪日志输出&lt;br /&gt;
|-&lt;br /&gt;
| docker top&lt;br /&gt;
|&#039;&#039;&#039;查看容器进程&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器内部运行的进程&lt;br /&gt;
| &amp;lt;code&amp;gt;docker top static_web&amp;lt;/code&amp;gt; 查看static_web容器内部运行的进程&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/exec/ docker exec]&lt;br /&gt;
|&#039;&#039;&#039;运行命令&#039;&#039;&#039;&amp;lt;br /&amp;gt;在容器中运行命令。该命令退出容器终端，容器不会停止。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker exec ubuntu-test ls&amp;lt;/code&amp;gt;在ubuntu-test容器工作目录运行ls命令 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -it ubuntu-test bash&amp;lt;/code&amp;gt;进入ubuntu-test容器交互式终端 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -u 0 -it test bash&amp;lt;/code&amp;gt;以root用户进入名称为test的容器&lt;br /&gt;
|-&lt;br /&gt;
| docker attach&lt;br /&gt;
|&#039;&#039;&#039;附着终端&#039;&#039;&#039;&amp;lt;br /&amp;gt;将本地终端标准输入、输出和错误流连接到运行的容器中。该命令退出容器终端，容器会停止，推荐使用&amp;lt;code&amp;gt;docker exec -it&amp;lt;/code&amp;gt;。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker attach ubuntu-test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker stop&lt;br /&gt;
|&#039;&#039;&#039;停止容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;停止运行中的容器&lt;br /&gt;
|&amp;lt;code&amp;gt;docker stop dw3342531d3&amp;lt;/code&amp;gt; #停止一个id为dw3342531d3的容器 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker stop $(docker ps -a -q)&amp;lt;/code&amp;gt;停止所有运行中的容器&lt;br /&gt;
|-&lt;br /&gt;
|docker rm &lt;br /&gt;
|&#039;&#039;&#039;删除容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;删除容器，需要容器停止运行。参数-f表示强制删除，可以不用等容器停止后再删除。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker rm ubuntu-test&amp;lt;/code&amp;gt;删除ubuntu-test容器&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker rm -f ubuntu-test&amp;lt;/code&amp;gt;强制删除ubuntu-test容器&amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker rm -f $(docker ps -a -q)&amp;lt;/code&amp;gt;&#039;&#039;&#039;注意，该命令会强制删除所有容器&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|docker container prune&lt;br /&gt;
|&#039;&#039;&#039;清理容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;删除所有停止的容器。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker container prune&amp;lt;/code&amp;gt;删除所有停止的容器。&lt;br /&gt;
|-&lt;br /&gt;
|docker commit &lt;br /&gt;
|&#039;&#039;&#039;容器构建镜像&#039;&#039;&#039;&amp;lt;br /&amp;gt;将容器打包为一个镜像。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker commit ubuntu-test ubuntu-updated&amp;lt;/code&amp;gt;#将ubuntu-test容器打包为一个名称为ubuntu-updated镜像。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 仓库 ==&lt;br /&gt;
仓库（Repository）是集中存放镜像的地方。 Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub]，公共仓库为免费，私有仓库需要付费使用。&lt;br /&gt;
&lt;br /&gt;
===Docker Hub===&lt;br /&gt;
大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#登录使用docker login，再输入账号密码&lt;br /&gt;
docker login&lt;br /&gt;
&lt;br /&gt;
#在Docker Hub仓库中搜索使用docker search，这命令可以不登录。&lt;br /&gt;
docker search ubuntu&lt;br /&gt;
&lt;br /&gt;
#下载镜像使用docker pull，这命令可以不登录。&lt;br /&gt;
docker pull ubuntu&lt;br /&gt;
&lt;br /&gt;
#上传镜像使用docker push，需要登录再使用。username为个人的账户名&lt;br /&gt;
docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
#退出使用docker logout&lt;br /&gt;
docker logout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
可能出现问题：&lt;br /&gt;
*登录时出现：Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`&lt;br /&gt;
执行下面命令即可：sudo apt install gnupg2 pass&lt;br /&gt;
&lt;br /&gt;
*docker push报错：denied: requested access to the resource is denied&lt;br /&gt;
镜像名和用户名不匹配，使用tag将镜像名改为username/镜像名，username为个人的用户名，然后再推送，如：&lt;br /&gt;
 docker tag ubuntu:18.04 username/ubuntu:18.04&lt;br /&gt;
 docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
===其他公有镜像仓库===&lt;br /&gt;
==== 常用仓库 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 提供方&lt;br /&gt;
! 仓库地址&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|- &lt;br /&gt;
| 毫秒镜像&lt;br /&gt;
| https://docker.1ms.run&lt;br /&gt;
| 免费不需要登录，速度慢。付费12个月10元50G。&lt;br /&gt;
|https://1ms.run/&lt;br /&gt;
|-&lt;br /&gt;
| 阿里云&lt;br /&gt;
| https://xxxxxxxx.mirror.aliyuncs.com&lt;br /&gt;
| 需要注册阿里云，在镜像加速器可以看到仓库地址。&lt;br /&gt;
| [https://cr.console.aliyun.com/ 官网] [https://developer.aliyun.com/article/110806 文档]&lt;br /&gt;
|- &lt;br /&gt;
| 网易&lt;br /&gt;
| https://hub.c.163.com&lt;br /&gt;
| &lt;br /&gt;
| [https://sf.163.com/help/documents/56918246390157312 文档]&lt;br /&gt;
|- &lt;br /&gt;
| 百度云&lt;br /&gt;
| https://mirror.baidubce.com&lt;br /&gt;
| &lt;br /&gt;
|[https://cloud.baidu.com/doc/CCE/s/Yjxppt74z#如何使用dockerhub镜像加速器 文档]&lt;br /&gt;
|- &lt;br /&gt;
| Google&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|[https://cloud.google.com/container-registry/docs/pulling-cached-images 文档]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 使用方法 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 拉取时指定仓库&lt;br /&gt;
| 单次有效 &amp;lt;br \&amp;gt;仓库地址不包含协议(如&amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;)，公有镜像仓库一般使用&amp;lt;code&amp;gt;library&amp;lt;/code&amp;gt;。&amp;lt;br \&amp;gt;如指定阿里镜像仓库拉取ubuntu： &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker pull xxxxxxxx.mirror.aliyuncs.com/library/ubuntu&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| 编辑配置文件&lt;br /&gt;
| 永久有效 &amp;lt;br \&amp;gt;步骤：&amp;lt;br \&amp;gt;1.编辑配置文件，&amp;lt;code&amp;gt;sudo vim /etc/docker/daemon.json&amp;lt;/code&amp;gt;，输入如下内容&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;registry-mirrors&amp;quot;: [&lt;br /&gt;
    &amp;quot;https://hub-mirror.c.163.com&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2.重启docker服务，&amp;lt;code&amp;gt;sudo service docker restart&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;3.查看是否成功，&amp;lt;code&amp;gt;docker info&amp;lt;/code&amp;gt; 输出含有Registry Mirrors&lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===搭建私有镜像仓库===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 运行一个本地仓库&lt;br /&gt;
docker run -d -p 5000:5000 --restart always --name registry registry:3&lt;br /&gt;
&lt;br /&gt;
# 现在，在Docker里使用，如推送，拉取&lt;br /&gt;
docker pull ubuntu&lt;br /&gt;
docker tag ubuntu localhost:5000/ubuntu&lt;br /&gt;
docker push localhost:5000/ubuntu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*https://hub.docker.com/_/registry&lt;br /&gt;
*https://distribution.github.io/distribution/&lt;br /&gt;
===镜像dockehub镜像仓库===&lt;br /&gt;
使用 Docker 启动 Registry 镜像加速服务&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo docker run -d \&lt;br /&gt;
  --name dockerhub \&lt;br /&gt;
  --restart=always \&lt;br /&gt;
  -p 443:5000 \&lt;br /&gt;
  -v /data/docker-registry:/var/lib/registry \&lt;br /&gt;
  -v /your/domain/certs:/certs \&lt;br /&gt;
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.cer \&lt;br /&gt;
  -e REGISTRY_HTTP_TLS_KEY=/certs/docker.yourdomain.com.key \&lt;br /&gt;
  -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \&lt;br /&gt;
  registry:3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在其他电脑测试拉取镜像：&lt;br /&gt;
 sudo docker pull yourdomain.com/library/hello-world&lt;br /&gt;
&lt;br /&gt;
成功拉取后，可以配置 Docker 的默认镜像地址方便使用，没有成功查看运行日志&amp;lt;code&amp;gt;sudo docker logs dockerhub&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
进阶版本，使用registry + Nginx + HTTPS进行镜像加速。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*https://hub.docker.com/_/registry&lt;br /&gt;
*https://distribution.github.io/distribution/&lt;br /&gt;
&lt;br /&gt;
==网络==&lt;br /&gt;
===概览===&lt;br /&gt;
Docker的网络是可拔插的子系统，使用驱动程序。docker内置了几个驱动程序，提供了核心网络功能。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 网络模式&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 桥接模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/bridge/ bridge]&lt;br /&gt;
| bridge是默认的桥接网络，当没有指定网络驱动，新启动的容器会连接到这个名称为bridge的bridge网络。也可以自定义一个网桥，只有连接到该网络的容器才能相互通信，从而起到隔离效果。自定义的网桥可以动态的连接或断开。&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;创建自定义网桥：&amp;lt;code&amp;gt;docker network create 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;删除自定义网桥：&amp;lt;code&amp;gt;docker network rm 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;查看网桥详细信息：&amp;lt;code&amp;gt;docker network inspect 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;容器启动时连接到网桥：&amp;lt;code&amp;gt;--network 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;运行中的容器连接到网桥：&amp;lt;code&amp;gt;docker network connect 网桥名称 容器名称&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;断开容器与网桥：&amp;lt;code&amp;gt;docker network disconnect 网桥名称 容器名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; 注意：默认网桥bridge的&amp;lt;code&amp;gt;--link&amp;lt;/code&amp;gt;命令已不建议使用，后面版本可能会被删除。默认网桥bridge内容器只能通过ip地址通信，需要添加&amp;lt;code&amp;gt;--link&amp;lt;/code&amp;gt; 来添加名称，而自定义网桥可以使用容器名称或设置别名来通信。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker network rm my-net&amp;lt;/code&amp;gt;创建自定义网桥my-net &amp;lt;br /&amp;gt;  &lt;br /&gt;
|- &lt;br /&gt;
| 主机模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/host/ host]&lt;br /&gt;
| 当使用host网络模式，容器共享主机的网络命名空间，而且容器不会分配自己的 IP 地址。如果容器中某个程序绑定到端口，直接访问主机的该端口即可。该模式端口全部暴露，端口映射不生效，即-p、--publish、-P和--publish-all选项都将被忽略。主机模式网络可用于优化性能，并且在容器需要处理大量端口的情况下，因为它不需要网络地址转换 (NAT)，并且没有为每个端口创建“用户空间代理”。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;容器启动时设置：&amp;lt;code&amp;gt;--network host&amp;lt;/code&amp;gt;或 &amp;lt;code&amp;gt;--net=host&amp;lt;/code&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 覆盖模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/overlay/ overlay]&lt;br /&gt;
| 跨主机的分布式网络。该模式允许连接到它的容器（包括群服务容器）通过加密安全地通信。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/network/macvlan/ macvlan]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/network/ipvlan/ ipvlan]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 禁用网络 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/none/ none]&lt;br /&gt;
| 禁用容器的网络。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;容器启动时设置：&amp;lt;code&amp;gt;--network none&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 网络插件 [https://docs.docker.com/engine/extend/plugins_services/#network-plugins Network plugins]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/network/ Docker 文档：网络概览]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==数据==&lt;br /&gt;
===概览===&lt;br /&gt;
默认情况下，所有文件将会存储在容器里的可写的容器层（container layer）。意味着：&lt;br /&gt;
* 数据与容器为一体。当容器删除时，数据会一起被删除。&lt;br /&gt;
* 该容器与其他程序（容器）数据交换难。&lt;br /&gt;
* 由于容器的写入层是与宿主机器紧紧耦合，所以难以移动数据到其他机器。&lt;br /&gt;
* 容器的写入层的是通过 存储驱动（storage driver） 管理文件系统。存储驱动会使用Linux内核的 链合文件系统（union filesystem）进行挂载。相比起直接操作于宿主机器文件系统的 数据卷（data volumes），这额外的抽象层将会降低性能。&lt;br /&gt;
&lt;br /&gt;
Docker提供两种将数据存储在宿主机的方法：&#039;&#039;&#039;数据卷（volumes）&#039;&#039;&#039;和 &#039;&#039;&#039;绑定挂载（bind mounts）&#039;&#039;&#039;。另外，Linux用户还可使用&#039;&#039;&#039;tmpfs 挂载&#039;&#039;&#039;；window用户还可以使用 命名管道（named pipe）。可用参数 &amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;--mount &amp;lt;/code&amp;gt;来使用数据卷或绑定挂载，一般推荐--mount，更明确和详细。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/ Docker 文档：Docker上管理数据]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 数据存储类型 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 类型&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 数据卷 &amp;lt;br /&amp;gt; [https://docs.docker.com/storage/volumes/ volumes]&lt;br /&gt;
| Docker 推荐的容器数据持久化方法，volumes完全由 Docker 管理。分为命名卷和匿名卷， 匿名卷在容器删除时会被 Docker 引擎删除，或者启动容器时加入--rm时，容器退出匿名卷会自动删除。&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;创建数据卷：&amp;lt;code&amp;gt;docker volume create 卷名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;列出数据卷： &amp;lt;code&amp;gt;docker volume ls&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;数据卷详细信息：&amp;lt;code&amp;gt;docker volume inspect 卷名称 &amp;lt;/code&amp;gt;  &amp;lt;br /&amp;gt;启动容器时连接卷（不存在卷会自动创建）：&amp;lt;code&amp;gt;--mount source=卷名称,target=/容器的/目录&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 卷名称:/容器的/目录 &amp;lt;/code&amp;gt;  &amp;lt;br /&amp;gt;启动容器时连接匿名卷：&amp;lt;code&amp;gt;-v /容器的/目录&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;删除卷：&amp;lt;code&amp;gt;docker volume rm 卷名称&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;清理没有使用的卷：&amp;lt;code&amp;gt;docker volume prune&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 绑定挂载&amp;lt;br /&amp;gt; [https://docs.docker.com/storage/bind-mounts/ bind mounts]&lt;br /&gt;
| 将主机上的文件或目录挂载到容器中。主机的路径可以是相对路径。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;启动容器时绑定挂载：&amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;只读绑定挂载：&amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录,readonly&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录:ro&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|tmpfs 挂载 &amp;lt;br /&amp;gt;[https://docs.docker.com/storage/tmpfs/ tmpfs mounts]&lt;br /&gt;
|tmpfs挂载是临时的，仅保留在主机内存中。当容器停止时，tmpfs挂载被移除，写入的文件不会被持久化。这对于临时存储您不想保留在主机或容器可写层中的敏感文件很有用。&amp;lt;br /&amp;gt;可用命令 &amp;lt;code&amp;gt;-tmpfs &amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;--mount &amp;lt;/code&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/ Docker 文档：Docker上管理数据]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== -v和--mount 参数 ===&lt;br /&gt;
使用命令 &amp;lt;code&amp;gt;docker inspect 容器名称&amp;lt;/code&amp;gt; 可以查看容器详情，其中Mounts部分可以看到容器的挂载详细情况。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 参数&lt;br /&gt;
! -v 或 --volume&lt;br /&gt;
! --mount&lt;br /&gt;
|-&lt;br /&gt;
! 特点&lt;br /&gt;
| 简洁，但有时出现混乱。&lt;br /&gt;
| 类型指定明确，推荐写法。&lt;br /&gt;
|-&lt;br /&gt;
! 支持类型 &lt;br /&gt;
| &amp;lt;code&amp;gt;volumes&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;bind mounts&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;volumes&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;bind mounts&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;tmpfs&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! volumes&lt;br /&gt;
| &amp;lt;code&amp;gt;-v 卷名称:/容器的/目录 &amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount source=卷名称,target=/容器的/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! bind mounts&lt;br /&gt;
| &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! tmpfs mounts&lt;br /&gt;
| 不支持&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount type=tmpfs,destination=/app&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/volumes/  Docker 文档：Use volumes]&lt;br /&gt;
|[https://docs.docker.com/storage/bind-mounts/  Docker 文档：Use bind mounts]&lt;br /&gt;
|[https://docs.docker.com/storage/tmpfs/ Docker 文档：Use tmpfs mounts]&lt;br /&gt;
}}&lt;br /&gt;
== 命令行 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/system/ docker system]&lt;br /&gt;
| 管理docker 。 如使用docker system prune能清理docker占用的磁盘空间，包括不使用的空间，构建镜像时的缓存等。&lt;br /&gt;
| docker system prune -a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/cli/ Docker 文档：使用 Docker 命令行]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Compose==&lt;br /&gt;
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose，您可以使用[[YML]]文件来配置应用程序需要的所有服务。然后，使用一个命令，就可以从[[YML]]文件配置中创建并启动所有服务。 &lt;br /&gt;
=== 安装===&lt;br /&gt;
====版本====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Compose 旧版&lt;br /&gt;
| docker-compose&lt;br /&gt;
| Compose 旧版为独立版，下载可执行文件使用。&lt;br /&gt;
|-&lt;br /&gt;
| Compose V2&lt;br /&gt;
| docker compose&lt;br /&gt;
| Compose V2也叫Compose插件版，作为插件和docker集成，安装升级方便。新版也提供更多的功能。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/ Docker Compose 文档]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Compose V2安装====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# Ubuntu and Debian 安装&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install docker-compose-plugin&lt;br /&gt;
&lt;br /&gt;
# RPM-based distros 安装&lt;br /&gt;
sudo yum update&lt;br /&gt;
sudo yum install docker-compose-plugin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/install/ Docker 文档：安装Docker Compose]&lt;br /&gt;
}}&lt;br /&gt;
====Compose 旧版安装====&lt;br /&gt;
以Linux系统为例，使用&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;命令在终端从GitHub上下载[https://github.com/docker/compose/releases Docker Compose]二进制文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
# 查看系统类型&lt;br /&gt;
echo $(uname -s)-$(uname -m)&lt;br /&gt;
&lt;br /&gt;
# GitHub上右键复制系统对应版本，如linux-x86_64。 如下载当前最新版compose 2.2.2 &lt;br /&gt;
sudo curl -L &amp;quot;https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64&amp;quot; -o /usr/local/bin/docker-compose&lt;br /&gt;
&lt;br /&gt;
# 为compose程序文件添加执行权限&lt;br /&gt;
sudo chmod +x /usr/local/bin/docker-compose&lt;br /&gt;
&lt;br /&gt;
# 查看compose版本，验证是否安装成功&lt;br /&gt;
docker-compose --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/install/other/ Docker 文档：安装 Compose 独立版]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 快速入门 ===&lt;br /&gt;
&lt;br /&gt;
===Compose 命令===&lt;br /&gt;
进入&amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;配置文件所在目录，执再行命令。 &lt;br /&gt;
常用选项：&lt;br /&gt;
* -f, --file 指定其他名称配置文件。 如：&amp;lt;code&amp;gt;docker compose -f docker-compose.prod.yml up&amp;lt;/code&amp;gt;&lt;br /&gt;
*-p, --project-name 制定项目名称。如：&amp;lt;code&amp;gt;docker compose -p myproject up&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compose 常用命令：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/compose_up/ up]&lt;br /&gt;
| 自动执行一些列操作：构建镜像、创建服务、启动服务和关联服务相关容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose up&amp;lt;/code&amp;gt;   &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker compose -f docker-compose.dev.yml up --build &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| stop&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| logs&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;logs&amp;lt;/code&amp;gt;默认以不同颜色显示服务内容器的日志。&lt;br /&gt;
|-&lt;br /&gt;
|  config&lt;br /&gt;
| 显示 Docker Compose 配置，包括环境变量。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose config&amp;lt;/code&amp;gt; 查看当前目录docker-compose.yml配置  &amp;lt;code&amp;gt;docker-compose -f docker-compose.dev.yml config&amp;lt;/code&amp;gt; 查看当前docker-compose.dev.yml配置&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| rm&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose rm -f&amp;lt;/code&amp;gt; 强制删除服务内容器。 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker rm -f $(docker compose ps -a -q)&amp;lt;/code&amp;gt; 删除服务内所有容器。&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/reference/ Docker 文档：docker compose CLI ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Swarm Mode==&lt;br /&gt;
Swarm Mode是Docker集群管理工具，从Docker1.2开始Docker Swarm内置到Docker中为Swarm Mode。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/swarm/ Docker文档-Swarm mode]&lt;br /&gt;
}}&lt;br /&gt;
==安全==&lt;br /&gt;
&lt;br /&gt;
==国内加速==&lt;br /&gt;
=== Docker CE镜像 ===&lt;br /&gt;
用于安装docker社区版软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 中国科学技术大学 USTC&lt;br /&gt;
| 手动安装时把 download.docker.com 地址换成 mirrors.ustc.edu.cn/docker-ce 即可 。&amp;lt;br /&amp;gt; 地址：https://mirrors.ustc.edu.cn/docker-ce/ &amp;lt;br /&amp;gt;文档：https://mirrors.ustc.edu.cn/help/docker-ce.html&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
=== Docker Hub镜像 ===&lt;br /&gt;
&lt;br /&gt;
=== 周边加速 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfile中apt更换软件源&lt;br /&gt;
| Debian换阿里源： &amp;lt;code&amp;gt;RUN  sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Github镜像网站&lt;br /&gt;
| kgithub.com ： 将Dockerfile中的github.com换成kgithub.com&lt;br /&gt;
|-&lt;br /&gt;
| 设置DNS&lt;br /&gt;
| echo &amp;quot;nameserver 8.8.8.8&amp;quot; | sudo tee /etc/resolv.conf &amp;gt; /dev/null&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实例==&lt;br /&gt;
====Docker安装Nginx====&lt;br /&gt;
&lt;br /&gt;
====Docker安装Flask====&lt;br /&gt;
[[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像，并启动。 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#创建一个文件夹来保存项目&lt;br /&gt;
mkdir hello_flask&lt;br /&gt;
#利用 cd 命令切换到这个目录&lt;br /&gt;
cd hello_flask &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;接下来使用vim app.py命令创建一个app.py文件，内容如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from flask import Flask&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&#039;/&#039;)&lt;br /&gt;
def hello_world():&lt;br /&gt;
    return &#039;Hello, World!&#039;&lt;br /&gt;
&lt;br /&gt;
if __name__==&#039;__main__&#039;:&lt;br /&gt;
    app.run(debug=True, host=&#039;0.0.0.0&#039;) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;然后使用vim Dockerfile命令创建一个Dockerfile文件，内容如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
FROM python:alpine&lt;br /&gt;
&lt;br /&gt;
COPY . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
RUN pip install Flask&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;python&amp;quot;]&lt;br /&gt;
CMD [&amp;quot;app.py&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;现在hello_flask文件夹下有两个文件app.py和Dockerfile，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#在hello_flask文件夹下使用docker build命令生成镜像&lt;br /&gt;
docker build -t flask:1.1.1-min .&lt;br /&gt;
&lt;br /&gt;
#使用 docker run 命令运行刚刚创建的镜像：&lt;br /&gt;
docker run --name flask -d -p 8080:5000 flask:1.1.1-min&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
现在在浏览器打开ip;10000,可以看到Hello, World!&lt;br /&gt;
&lt;br /&gt;
可以使用-v命令，把当前路径挂载到容器的/app目录，$PWD表示当前目录，比如现在的hello_flask。&lt;br /&gt;
 docker run --name flask2 -d -p 8080:5000 -v $PWD:/app flask:1.1.1-min&lt;br /&gt;
在浏览器打开ip:8080可以看到“Hello, World!”，挂载后在主机中的hello_flask修改app.py，刷新网页就会看到更新的内容。修改文件时候要使用root权限不然会报错，sudo vim app.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Docker安装Mediawiki====&lt;br /&gt;
[[Mediawiki]]全球最著名的开源wiki程序，维基百科也使用该软件。&lt;br /&gt;
&lt;br /&gt;
方法一：利用Docker Hub上现成镜像&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#运行mediawiki镜像，没有就从docker hub下载mediawiki再运行&lt;br /&gt;
docker run --name some-mediawiki -p 8080:80 -d mediawiki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;{{了解更多&lt;br /&gt;
|[https://hub.docker.com/_/mediawiki Docker Hub：Mediawiki ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Docker 官网：https://www.docker.com&lt;br /&gt;
*Docker Hub：https://hub.docker.com/&lt;br /&gt;
*Docker 文档：https://docs.docker.com&lt;br /&gt;
*Docker 文档 &amp;gt; 参考：https://docs.docker.com/reference &lt;br /&gt;
*Docker 文档 &amp;gt; 示例：https://docs.docker.com/samples&lt;br /&gt;
*Docker CE 的 Github：https://github.com/docker/docker-ce&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/Docker 维基百科：Docker]&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/操作系统层虚拟化 维基百科：操作系统层虚拟化]&lt;br /&gt;
&lt;br /&gt;
[[分类:编程工具]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Docker&amp;diff=1755</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Docker&amp;diff=1755"/>
		<updated>2026-04-18T15:44:12Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 常用仓库 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker 是一个开源软件的容器引擎软件。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
* 2013年3月13日，发布初始版本。&lt;br /&gt;
&lt;br /&gt;
===虚拟机与容器===&lt;br /&gt;
[[虚拟机]]可以在一种操作系统里面运行另一种操作系统，但虚拟机，资源占用多，启动慢。&lt;br /&gt;
&lt;br /&gt;
容器是操作系统层虚拟化，容器化的优势在于占用服务器空间少，通常几秒内即可引导。&lt;br /&gt;
&lt;br /&gt;
Docker 是一种容器的管理方式。下文的容器主要指Docker的容器。&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====CentOS====&lt;br /&gt;
官网建议安装在[[CentOS]] 7及以上的系统。如果之前有安装docker，先卸载之前版本。三种安装方法：&lt;br /&gt;
*添加Docker源进行安装，安装和升级方便，这是推荐的方法。&lt;br /&gt;
*下载RPM软件包，手动安装。&lt;br /&gt;
*官方一键安装脚本，一些测试和开发用户会选择这种方法。&lt;br /&gt;
&lt;br /&gt;
方法一，添加Docker源进行安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#安装所需的软件包&lt;br /&gt;
sudo yum install -y yum-utils device-mapper-persistent-data lvm2&lt;br /&gt;
&lt;br /&gt;
#安装containerd.io软件包，不然会报错requires containerd.io &amp;gt;= 1.2.2-3&lt;br /&gt;
sudo yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#设置官网的稳定版仓库源&lt;br /&gt;
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo&lt;br /&gt;
&lt;br /&gt;
#可选，体验版和测试版默认是关闭的，可以通过命令打开，详细见文档。&lt;br /&gt;
&lt;br /&gt;
#安装最新版本的docker CE&lt;br /&gt;
sudo yum install docker-ce&lt;br /&gt;
&lt;br /&gt;
#启动守护进程&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
也可以使用dnf命令安装，dnf为下一代yum命令。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo dnf -y install dnf-plugins-core&lt;br /&gt;
sudo dnf install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm&lt;br /&gt;
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo&lt;br /&gt;
sudo dnf install docker-ce&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
方法二，下载RPM包，离线安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#在联网的计算机下载RPM软件包，从官网地址选一个版本下载：https://download.docker.com/linux/fedora/&lt;br /&gt;
#比如：docker-ce-cli-19.03.4-3.fc31.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#复制到计算机的某个目录，执行安装&lt;br /&gt;
sudo dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#启动守护进程&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
方法三，使用脚本安装：&lt;br /&gt;
Docker提供脚本安装方式，快捷安装。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#下载脚本&lt;br /&gt;
curl -fsSL https://get.docker.com -o get-docker.sh&lt;br /&gt;
#运行脚本安装&lt;br /&gt;
sudo sh get-docker.sh&lt;br /&gt;
&lt;br /&gt;
#如果以非root用户使用docker（推荐）， 需要添加一个用户到&#039;docker&#039;用户组中&lt;br /&gt;
#查看是否添加成功，如果添加当前登录的用户，需要重新登录，组权限才会生效。&lt;br /&gt;
sudo usermod -aG docker your-user-name&lt;br /&gt;
&lt;br /&gt;
#查看是否安装成功&lt;br /&gt;
docker --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Ubuntu====&lt;br /&gt;
[[Ubuntu]]安装Docker也有三种方法，与[[CentOS]]安装docker类似。&lt;br /&gt;
&lt;br /&gt;
方法一，添加Docker源进行安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#获取apt可用最新列表&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
#使用apt安装下列软件包&lt;br /&gt;
sudo apt-get install \&lt;br /&gt;
    apt-transport-https \&lt;br /&gt;
    ca-certificates \&lt;br /&gt;
    curl \&lt;br /&gt;
    gnupg-agent \&lt;br /&gt;
    software-properties-common&lt;br /&gt;
#添加docker官方GPG密钥，验证密钥指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88&lt;br /&gt;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br /&gt;
sudo apt-key fingerprint 0EBFCD88&lt;br /&gt;
#添加docker的稳定源&lt;br /&gt;
sudo add-apt-repository \&lt;br /&gt;
   &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \&lt;br /&gt;
   $(lsb_release -cs) \&lt;br /&gt;
   stable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#获取apt可用最新列表&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
#安装最新版的Docker CE&lt;br /&gt;
sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;br /&gt;
&lt;br /&gt;
#检验是否安装成功&lt;br /&gt;
sudo docker run hello-world&lt;br /&gt;
#使用非root用户使用docker，可以将用户添加到docker组：&lt;br /&gt;
sudo gpasswd -a ${USER} docker  #将当前用户添加到docker组，重新登录后生效&lt;br /&gt;
sudo usermod -aG docker your-user  #将其他用户添加到docker组&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/install/linux/docker-ce/ubuntu/ Docker文档-Ubuntu安装Docker CE]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==镜像==&lt;br /&gt;
镜像(Image)是只读文件，容器是运行在镜像之上，运行容器时会复制镜像然后启动。镜像的一些属性：&lt;br /&gt;
*REPOSITORY：表示镜像的仓库源&lt;br /&gt;
*TAG：镜像的标签&lt;br /&gt;
*IMAGE ID：镜像ID&lt;br /&gt;
*CREATED：镜像创建时间&lt;br /&gt;
*SIZE：镜像大小&lt;br /&gt;
&lt;br /&gt;
当运行容器时，使用的镜像如果在本地中不存在，docker 就会自动从 docker 镜像仓库中下载，默认是从 Docker Hub 公共镜像源下载。&lt;br /&gt;
&lt;br /&gt;
===镜像使用===&lt;br /&gt;
可以命令行输入&amp;lt;code&amp;gt;命令 --help&amp;lt;/code&amp;gt;查看帮助，如在命令行输入&amp;lt;code&amp;gt;docker search --help&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/image_ls/ docker image ls] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;[https://docs.docker.com/engine/reference/commandline/images/ docker images]&lt;br /&gt;
| &#039;&#039;&#039;查看镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;列出本地主机上的镜像&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image ls&amp;lt;/code&amp;gt;查看本地镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker images -a &amp;lt;/code&amp;gt;列出本地主机上的镜像，包括默认隐藏的中间镜像。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/tag/ docker tag] &amp;lt;br /&amp;gt;docker image tag&lt;br /&gt;
| &#039;&#039;&#039;创建引用标签&#039;&#039;&#039; &amp;lt;br /&amp;gt;为镜像创建新标签，方便使用。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker tag 0e1234567893 ubuntu:V20&amp;lt;/code&amp;gt;为ID：0e1234567893的镜像加多个标签ubuntu:V20 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker tag ubuntu:18.04 mytest/ubuntu:18&amp;lt;/code&amp;gt;为ubuntu:18.04镜像添加标签mytest/ubuntu:18&lt;br /&gt;
|- &lt;br /&gt;
| docker image rm &amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;docker rmi&lt;br /&gt;
| &#039;&#039;&#039;删除镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;删除镜像正在使用的镜像会报错&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image rm Ubuntu&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker rmi Ubuntu&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| docker image prune&lt;br /&gt;
| &#039;&#039;&#039;清理镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;删除未使用的镜像&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image prune&amp;lt;/code&amp;gt;删除未使用的镜像&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/image_pull/ docker pull]&lt;br /&gt;
| &#039;&#039;&#039;下载镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker pull ubuntu&amp;lt;/code&amp;gt;默认下载tag: latest的版本 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker pull ubuntu:18.04&amp;lt;/code&amp;gt;指定镜像版本&lt;br /&gt;
|- &lt;br /&gt;
| docker search&lt;br /&gt;
| &#039;&#039;&#039;搜索镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。&amp;lt;br /&amp;gt;输出结果说明：&amp;lt;br /&amp;gt;NAME: 镜像仓库源的名称&amp;lt;br /&amp;gt;DESCRIPTION: 镜像的描述&amp;lt;br /&amp;gt;OFFICIAL: 是否docker官方发布&amp;lt;br /&amp;gt;START: 表示点赞数量&amp;lt;br /&amp;gt;AUTOMATED: 自动构建&lt;br /&gt;
| &amp;lt;code&amp;gt;docker search nginx&amp;lt;/code&amp;gt;搜索nginx软件的镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker search --filter=is-offical=true mysql&amp;lt;/code&amp;gt;搜索mysql软件的镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker search --filter=stars=100 mysql&amp;lt;/code&amp;gt;搜索star超过100的mysql镜像&lt;br /&gt;
|-&lt;br /&gt;
|docker push&lt;br /&gt;
|&#039;&#039;&#039;上传镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认上传到Docker镜像仓库[https://hub.docker.com/ Docker Hub]，公共仓库为免费，私有仓库需要付费使用。先注册一个免费Docker 账号，接下来可以在终端操作。&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#登录使用docker login，再输入账号密码&lt;br /&gt;
docker login&lt;br /&gt;
&lt;br /&gt;
#上传镜像使用docker push，需要登录再使用。username为个人的账户名&lt;br /&gt;
docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
#退出使用docker logout&lt;br /&gt;
docker logout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| docker history&lt;br /&gt;
| &#039;&#039;&#039;镜像历史&#039;&#039;&#039; &amp;lt;br /&amp;gt;查看制作镜像的命令 &amp;lt;br /&amp;gt;格式：&amp;lt;code&amp;gt;docker history [参数] 镜像&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;docker history nginx&amp;lt;/code&amp;gt;查看nginx镜像制作的历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/image/ Docker 参考：docker image]&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/images/ Docker 参考：docker images]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===常用镜像===&lt;br /&gt;
====操作系统基础镜像====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 镜像名称&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| busybox&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| alpine&lt;br /&gt;
| 5 MB&lt;br /&gt;
| Alpine Linux是一个面向安全的轻型的Linux发行版。Alpine不包含 bash 因此进入某个alpine docker容器，可以使用sh命令，如：&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -it container_name sh&amp;lt;/code&amp;gt;进入某个容器并运行sh。 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker run -it -v data_volume:/data alpine:3.16.9 sh&amp;lt;/code&amp;gt;启动一个容器，挂在data_volume卷到容器的/data目录。&lt;br /&gt;
| 官网：https://www.alpinelinux.org/ &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/alpine/&lt;br /&gt;
|-&lt;br /&gt;
| ubuntu&lt;br /&gt;
| 30 MB&lt;br /&gt;
| &lt;br /&gt;
|官网：http://www.ubuntu.com/  &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/ubuntu/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====编程语言基础镜像====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 镜像名称&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| python&lt;br /&gt;
| 50 MB &amp;lt;br /&amp;gt;350 MB &amp;lt;br /&amp;gt;2.64G&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;br /&amp;gt;镜像： https://hub.docker.com/_/python/&lt;br /&gt;
|-&lt;br /&gt;
| node&lt;br /&gt;
|&lt;br /&gt;
| Node.js是一个基于JavaScript的平台，用于服务器端和网络应用程序。&lt;br /&gt;
| &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/node/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===制作镜像===&lt;br /&gt;
当docker镜像仓库没有想要的镜像，可以通过以下两种方式制作镜像。&lt;br /&gt;
*在已有容器中修改，再提交保存为新镜像。&lt;br /&gt;
*使用Dockerfile文件，从头创建一个新的镜像。&lt;br /&gt;
&lt;br /&gt;
====容器打包为镜像====&lt;br /&gt;
修改容器，通过命令 docker commit 将容器打包为新镜像。如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#启动一个名称ubuntu-18为容器，并进入容器终端&lt;br /&gt;
docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash&lt;br /&gt;
&lt;br /&gt;
#在容器内修改，如更新软件，&lt;br /&gt;
apt-get update &lt;br /&gt;
&lt;br /&gt;
#退出这个容器&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
#提交打包镜像&lt;br /&gt;
docker commit ubuntu-18 ubuntu-updated &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Dockerfile创建镜像====&lt;br /&gt;
Docker可以自动读取Dockerfile文件里的指令生成一个镜像。Dockerfile是一个文本文件，都是一些关于组装镜像的指令。通过docker build命令来生成一个镜像。&lt;br /&gt;
&lt;br /&gt;
====Dockerfile语法====&lt;br /&gt;
Dockerfile文件格式如下：&lt;br /&gt;
 # Comment 注释&lt;br /&gt;
 INSTRUCTION arguments&lt;br /&gt;
&lt;br /&gt;
注释使用#号，指令不区分大小写，但一般指令使用大写，这样容易和后面参数区分开来。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Dockerfile指令====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
!指令!!格式!!描述!!示例&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#from FROM]&lt;br /&gt;
|FROM [--platform=&amp;lt;platform&amp;gt;] &amp;lt;image&amp;gt;[:&amp;lt;tag&amp;gt;] [AS &amp;lt;name&amp;gt;]&lt;br /&gt;
|初始化，设置基准镜像。这个指令必须放开头。&lt;br /&gt;
|FROM debian:buster-slim&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#run RUN]&lt;br /&gt;
|RUN &amp;lt;command&amp;gt; 或 RUN [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]&lt;br /&gt;
|执行命令&lt;br /&gt;
|RUN /bin/bash -c &#039;source $HOME/.bashrc; echo $HOME&#039;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#cmd CMD]&lt;br /&gt;
|CMD [&amp;quot;param1&amp;quot;,&amp;quot;param2&amp;quot;]&amp;lt;br \&amp;gt; CMD command param1 param2 &amp;lt;br \&amp;gt;  CMD [&amp;quot;executable&amp;quot;,&amp;quot;param1&amp;quot;,&amp;quot;param2&amp;quot;] &lt;br /&gt;
|容器启动时执行的命令。该指令只能有一个，当有多个RUN指令只会执行最后一个&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#label LABEL]&lt;br /&gt;
|LABEL &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; ...&lt;br /&gt;
|给镜像添加元数据。如添加一些作者信息，版本信息等。可以使用docker image inspect命令查看镜像所有信息，包括标签。&lt;br /&gt;
|LABEL maintainer=&amp;quot;yourname@domain.com&amp;quot; version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#expose EXPOSE]&lt;br /&gt;
|EXPOSE &amp;lt;port&amp;gt; [&amp;lt;port&amp;gt;/&amp;lt;protocol&amp;gt;...]&lt;br /&gt;
|开放容器某个端口，默认协议为TCP。运行主机可以通过docker run命令增加-p参数来对接这个端口。&lt;br /&gt;
|EXPOSE 80/udp&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#env ENV]&lt;br /&gt;
|ENV &amp;lt;key&amp;gt; &amp;lt;value&amp;gt; &amp;lt;br \&amp;gt;ENV &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; ...&lt;br /&gt;
|设置环境变量&lt;br /&gt;
|ENV myName John Doe&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#add ADD]&lt;br /&gt;
|ADD [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt; &amp;lt;br \&amp;gt;ADD [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] [&amp;quot;&amp;lt;src&amp;gt;&amp;quot;,... &amp;quot;&amp;lt;dest&amp;gt;&amp;quot;]&lt;br /&gt;
|复制文件、目录或URLs到镜像中。src的路径支持Go语言的filepath.Match规则。&lt;br /&gt;
|ADD test.txt /etc/test/ &amp;lt;br \&amp;gt;拷贝主机的test.txt文件到镜像/etc/test/目录中&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#copy COPY]&lt;br /&gt;
|COPY [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt;  &amp;lt;br \&amp;gt;COPY [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] [&amp;quot;&amp;lt;src&amp;gt;&amp;quot;,... &amp;quot;&amp;lt;dest&amp;gt;&amp;quot;]&lt;br /&gt;
|复制文件或目录到镜像中。src的路径支持Go语言的filepath.Match规则。&lt;br /&gt;
|COPY test.txt /etc/test/ &amp;lt;br \&amp;gt;拷贝主机的test.txt文件到镜像/etc/test/目录中&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#entrypoint ENTRYPOINT]&lt;br /&gt;
|ENTRYPOINT [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]  &amp;lt;br \&amp;gt;ENTRYPOINT command param1 param2&lt;br /&gt;
|容器启动时执行的命令。&lt;br /&gt;
|ENTRYPOINT [&amp;quot;top&amp;quot;, &amp;quot;-b&amp;quot;]&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#volume VOLUME]&lt;br /&gt;
|VOLUME [&amp;quot;/data&amp;quot;]&lt;br /&gt;
|创建挂载点&lt;br /&gt;
|VOLUME /myvol&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#user USER]&lt;br /&gt;
|USER &amp;lt;user&amp;gt;[:&amp;lt;group&amp;gt;] &amp;lt;br \&amp;gt;USER &amp;lt;UID&amp;gt;[:&amp;lt;GID&amp;gt;]&lt;br /&gt;
|设置启动容器的用户，可以是用户名或UID。&lt;br /&gt;
|USER username&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#workdir WORKDIR]&lt;br /&gt;
|WORKDIR /path/to/workdir&lt;br /&gt;
|设置工作目录，对RUN, CMD, ENTRYPOINT, COPY 和 ADD指令有效。&lt;br /&gt;
|WORKDIR /home/foo/work&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#arg ARG]&lt;br /&gt;
|ARG &amp;lt;name&amp;gt;[=&amp;lt;default value&amp;gt;]&lt;br /&gt;
|设置构建镜像时变量，构建docker build时使用--build-arg &amp;lt;varname&amp;gt;=&amp;lt;value&amp;gt;传递变量值。&lt;br /&gt;
|ARG user1=someuser&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#onbuild ONBUILD]&lt;br /&gt;
|ONBUILD &amp;lt;INSTRUCTION&amp;gt;&lt;br /&gt;
|设置触发指令，当该镜像作为基准镜像，构建时执行。&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#stopsignal STOPSIGNAL]&lt;br /&gt;
|STOPSIGNAL signal&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#healthcheck HEALTHCHECK]&lt;br /&gt;
|HEALTHCHECK [OPTIONS] CMD command &amp;lt;br \&amp;gt;HEALTHCHECK NONE&lt;br /&gt;
|告诉dockers该镜像的容器正常工作状况&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#shell SHELL]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====docker build构建镜像====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
| [https://docs.docker.com/engine/reference/builder/ Docker参考：Dockerfile]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 容器 ==&lt;br /&gt;
容器（Container）是运行在镜像之上，运行容器时会复制镜像然后启动。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/run/ docker run]&lt;br /&gt;
| &#039;&#039;&#039;运行容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;docker run [参数] 镜像 [COMMAND] [ARG...]&amp;lt;br /&amp;gt;从镜像启动一个新容器。该命令会检查本地是否有镜像，没有就从docker仓库中下载。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--name&amp;lt;/code&amp;gt; 容器命名，如&amp;lt;code&amp;gt;--name test&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--restart&amp;lt;/code&amp;gt; 重启策略，如停止后自动重启：&amp;lt;code&amp;gt;--restart=always&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-P&amp;lt;/code&amp;gt; 绑定端口  &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt; 挂载&lt;br /&gt;
| &amp;lt;code&amp;gt;docker run -it ubuntu&amp;lt;/code&amp;gt;使用 ubuntu 镜像启动一个容器 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker run -it ubuntu /bin/bash&amp;lt;/code&amp;gt;启动一个ubuntu容器，并进入终端。要退出容器里的终端输入exit。&amp;lt;code&amp;gt;docker run -itd --name ubuntu-test ubuntu /bin/bash&amp;lt;/code&amp;gt;启动一个名称ubuntu-test为容器，并后台运行。参数-d表示后台运行。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/update/ docker update] &lt;br /&gt;
| &#039;&#039;&#039;更新容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;动态更新容器配置。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--memory&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; 内存限制 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--restart&amp;lt;/code&amp;gt; 重启策略&lt;br /&gt;
| &amp;lt;code&amp;gt;docker update --restart=unless-stopped mynginx&amp;lt;/code&amp;gt; 配置mynginx容器重启策略为unless-stopped&lt;br /&gt;
|-&lt;br /&gt;
| docker start&lt;br /&gt;
| &#039;&#039;&#039;启动容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;启动已经停止的容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker start dw3342531d3&amp;lt;/code&amp;gt; 启动一个容器id为dw3342531d3的容器。&lt;br /&gt;
|- &lt;br /&gt;
| docker restart&lt;br /&gt;
|&#039;&#039;&#039;重启容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;重启正在运行的容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker restart ubuntu-test&amp;lt;/code&amp;gt; 重启容器ubuntu-test。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/ps/ docker ps]&lt;br /&gt;
|&#039;&#039;&#039;查看本地容器列表&#039;&#039;&#039; &amp;lt;br /&amp;gt;重启正在运行的容器。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--no-trunc&amp;lt;/code&amp;gt; 显示完整内容，不截断。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker ps&amp;lt;/code&amp;gt;查看正在运行的容器&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker ps -a&amp;lt;/code&amp;gt;查看所用容器，包括停止的 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker ps --no-trunc&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/inspect/ docker inspect]&lt;br /&gt;
|&#039;&#039;&#039;查看容器信息&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-f, --format &amp;lt;/code&amp;gt; 使用Go语言template格式化输出。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker inspect ubuntu-test&amp;lt;/code&amp;gt; 查看ubuntu-test容器信息 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect --format=&#039;{{.NetworkSettings.IPAddress}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器ip &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{.Name}} - {{range .NetworkSettings.Networks }} {{.IPAddress}} {{end}}&#039; $(docker ps -aq)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看所有容器ip地址。 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器MAC &amp;lt;br \&amp;gt; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect --format=&#039;{{.LogPath}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器的log地址 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{.Config.Image}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器的镜像名称 &lt;br /&gt;
|- &lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/stats/ docker stats]&lt;br /&gt;
|&#039;&#039;&#039;实时统计容器使用资源&#039;&#039;&#039; &amp;lt;br \&amp;gt;统计容器使用主机CUP、内存的百分比，通过网络发送和接收的数据量，从主机上的块设备读取和写入的数据量。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker stats&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/logs/ docker logs]&lt;br /&gt;
|&#039;&#039;&#039;查看容器日志&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器内部的标准输出。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker logs ubuntu-test&amp;lt;/code&amp;gt;查看ubuntu-test容器内部的标准输出 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker logs -f ubuntu-test&amp;lt;/code&amp;gt;跟踪日志输出&lt;br /&gt;
|-&lt;br /&gt;
| docker top&lt;br /&gt;
|&#039;&#039;&#039;查看容器进程&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器内部运行的进程&lt;br /&gt;
| &amp;lt;code&amp;gt;docker top static_web&amp;lt;/code&amp;gt; 查看static_web容器内部运行的进程&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/exec/ docker exec]&lt;br /&gt;
|&#039;&#039;&#039;运行命令&#039;&#039;&#039;&amp;lt;br /&amp;gt;在容器中运行命令。该命令退出容器终端，容器不会停止。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker exec ubuntu-test ls&amp;lt;/code&amp;gt;在ubuntu-test容器工作目录运行ls命令 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -it ubuntu-test bash&amp;lt;/code&amp;gt;进入ubuntu-test容器交互式终端 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -u 0 -it test bash&amp;lt;/code&amp;gt;以root用户进入名称为test的容器&lt;br /&gt;
|-&lt;br /&gt;
| docker attach&lt;br /&gt;
|&#039;&#039;&#039;附着终端&#039;&#039;&#039;&amp;lt;br /&amp;gt;将本地终端标准输入、输出和错误流连接到运行的容器中。该命令退出容器终端，容器会停止，推荐使用&amp;lt;code&amp;gt;docker exec -it&amp;lt;/code&amp;gt;。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker attach ubuntu-test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker stop&lt;br /&gt;
|&#039;&#039;&#039;停止容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;停止运行中的容器&lt;br /&gt;
|&amp;lt;code&amp;gt;docker stop dw3342531d3&amp;lt;/code&amp;gt; #停止一个id为dw3342531d3的容器 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker stop $(docker ps -a -q)&amp;lt;/code&amp;gt;停止所有运行中的容器&lt;br /&gt;
|-&lt;br /&gt;
|docker rm &lt;br /&gt;
|&#039;&#039;&#039;删除容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;删除容器，需要容器停止运行。参数-f表示强制删除，可以不用等容器停止后再删除。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker rm ubuntu-test&amp;lt;/code&amp;gt;删除ubuntu-test容器&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker rm -f ubuntu-test&amp;lt;/code&amp;gt;强制删除ubuntu-test容器&amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker rm -f $(docker ps -a -q)&amp;lt;/code&amp;gt;&#039;&#039;&#039;注意，该命令会强制删除所有容器&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|docker container prune&lt;br /&gt;
|&#039;&#039;&#039;清理容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;删除所有停止的容器。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker container prune&amp;lt;/code&amp;gt;删除所有停止的容器。&lt;br /&gt;
|-&lt;br /&gt;
|docker commit &lt;br /&gt;
|&#039;&#039;&#039;容器构建镜像&#039;&#039;&#039;&amp;lt;br /&amp;gt;将容器打包为一个镜像。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker commit ubuntu-test ubuntu-updated&amp;lt;/code&amp;gt;#将ubuntu-test容器打包为一个名称为ubuntu-updated镜像。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 仓库 ==&lt;br /&gt;
仓库（Repository）是集中存放镜像的地方。 Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub]，公共仓库为免费，私有仓库需要付费使用。&lt;br /&gt;
&lt;br /&gt;
===Docker Hub===&lt;br /&gt;
大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#登录使用docker login，再输入账号密码&lt;br /&gt;
docker login&lt;br /&gt;
&lt;br /&gt;
#在Docker Hub仓库中搜索使用docker search，这命令可以不登录。&lt;br /&gt;
docker search ubuntu&lt;br /&gt;
&lt;br /&gt;
#下载镜像使用docker pull，这命令可以不登录。&lt;br /&gt;
docker pull ubuntu&lt;br /&gt;
&lt;br /&gt;
#上传镜像使用docker push，需要登录再使用。username为个人的账户名&lt;br /&gt;
docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
#退出使用docker logout&lt;br /&gt;
docker logout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
可能出现问题：&lt;br /&gt;
*登录时出现：Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`&lt;br /&gt;
执行下面命令即可：sudo apt install gnupg2 pass&lt;br /&gt;
&lt;br /&gt;
*docker push报错：denied: requested access to the resource is denied&lt;br /&gt;
镜像名和用户名不匹配，使用tag将镜像名改为username/镜像名，username为个人的用户名，然后再推送，如：&lt;br /&gt;
 docker tag ubuntu:18.04 username/ubuntu:18.04&lt;br /&gt;
 docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
===其他公有镜像仓库===&lt;br /&gt;
==== 常用仓库 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 提供方&lt;br /&gt;
! 仓库地址&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|- &lt;br /&gt;
| 毫秒镜像&lt;br /&gt;
| docker.1ms.run&lt;br /&gt;
| 免费不需要登录，速度慢。付费12个月10元50G。&lt;br /&gt;
|https://1ms.run/&lt;br /&gt;
|-&lt;br /&gt;
| 阿里云&lt;br /&gt;
| https://xxxxxxxx.mirror.aliyuncs.com&lt;br /&gt;
| 需要注册阿里云，在镜像加速器可以看到仓库地址。&lt;br /&gt;
| [https://cr.console.aliyun.com/ 官网] [https://developer.aliyun.com/article/110806 文档]&lt;br /&gt;
|- &lt;br /&gt;
| 网易&lt;br /&gt;
| https://hub.c.163.com&lt;br /&gt;
| &lt;br /&gt;
| [https://sf.163.com/help/documents/56918246390157312 文档]&lt;br /&gt;
|- &lt;br /&gt;
| 百度云&lt;br /&gt;
| https://mirror.baidubce.com&lt;br /&gt;
| &lt;br /&gt;
|[https://cloud.baidu.com/doc/CCE/s/Yjxppt74z#如何使用dockerhub镜像加速器 文档]&lt;br /&gt;
|- &lt;br /&gt;
| Google&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|[https://cloud.google.com/container-registry/docs/pulling-cached-images 文档]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 使用方法 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 拉取时指定仓库&lt;br /&gt;
| 单次有效 &amp;lt;br \&amp;gt;仓库地址不包含协议(如&amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;)，公有镜像仓库一般使用&amp;lt;code&amp;gt;library&amp;lt;/code&amp;gt;。&amp;lt;br \&amp;gt;如指定阿里镜像仓库拉取ubuntu： &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker pull xxxxxxxx.mirror.aliyuncs.com/library/ubuntu&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| 编辑配置文件&lt;br /&gt;
| 永久有效 &amp;lt;br \&amp;gt;步骤：&amp;lt;br \&amp;gt;1.编辑配置文件，&amp;lt;code&amp;gt;sudo vim /etc/docker/daemon.json&amp;lt;/code&amp;gt;，输入如下内容&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;registry-mirrors&amp;quot;: [&lt;br /&gt;
    &amp;quot;https://hub-mirror.c.163.com&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2.重启docker服务，&amp;lt;code&amp;gt;sudo service docker restart&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;3.查看是否成功，&amp;lt;code&amp;gt;docker info&amp;lt;/code&amp;gt; 输出含有Registry Mirrors&lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===搭建私有镜像仓库===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 运行一个本地仓库&lt;br /&gt;
docker run -d -p 5000:5000 --restart always --name registry registry:3&lt;br /&gt;
&lt;br /&gt;
# 现在，在Docker里使用，如推送，拉取&lt;br /&gt;
docker pull ubuntu&lt;br /&gt;
docker tag ubuntu localhost:5000/ubuntu&lt;br /&gt;
docker push localhost:5000/ubuntu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*https://hub.docker.com/_/registry&lt;br /&gt;
*https://distribution.github.io/distribution/&lt;br /&gt;
===镜像dockehub镜像仓库===&lt;br /&gt;
使用 Docker 启动 Registry 镜像加速服务&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo docker run -d \&lt;br /&gt;
  --name dockerhub \&lt;br /&gt;
  --restart=always \&lt;br /&gt;
  -p 443:5000 \&lt;br /&gt;
  -v /data/docker-registry:/var/lib/registry \&lt;br /&gt;
  -v /your/domain/certs:/certs \&lt;br /&gt;
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.cer \&lt;br /&gt;
  -e REGISTRY_HTTP_TLS_KEY=/certs/docker.yourdomain.com.key \&lt;br /&gt;
  -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \&lt;br /&gt;
  registry:3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在其他电脑测试拉取镜像：&lt;br /&gt;
 sudo docker pull yourdomain.com/library/hello-world&lt;br /&gt;
&lt;br /&gt;
成功拉取后，可以配置 Docker 的默认镜像地址方便使用，没有成功查看运行日志&amp;lt;code&amp;gt;sudo docker logs dockerhub&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
进阶版本，使用registry + Nginx + HTTPS进行镜像加速。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*https://hub.docker.com/_/registry&lt;br /&gt;
*https://distribution.github.io/distribution/&lt;br /&gt;
&lt;br /&gt;
==网络==&lt;br /&gt;
===概览===&lt;br /&gt;
Docker的网络是可拔插的子系统，使用驱动程序。docker内置了几个驱动程序，提供了核心网络功能。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 网络模式&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 桥接模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/bridge/ bridge]&lt;br /&gt;
| bridge是默认的桥接网络，当没有指定网络驱动，新启动的容器会连接到这个名称为bridge的bridge网络。也可以自定义一个网桥，只有连接到该网络的容器才能相互通信，从而起到隔离效果。自定义的网桥可以动态的连接或断开。&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;创建自定义网桥：&amp;lt;code&amp;gt;docker network create 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;删除自定义网桥：&amp;lt;code&amp;gt;docker network rm 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;查看网桥详细信息：&amp;lt;code&amp;gt;docker network inspect 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;容器启动时连接到网桥：&amp;lt;code&amp;gt;--network 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;运行中的容器连接到网桥：&amp;lt;code&amp;gt;docker network connect 网桥名称 容器名称&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;断开容器与网桥：&amp;lt;code&amp;gt;docker network disconnect 网桥名称 容器名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; 注意：默认网桥bridge的&amp;lt;code&amp;gt;--link&amp;lt;/code&amp;gt;命令已不建议使用，后面版本可能会被删除。默认网桥bridge内容器只能通过ip地址通信，需要添加&amp;lt;code&amp;gt;--link&amp;lt;/code&amp;gt; 来添加名称，而自定义网桥可以使用容器名称或设置别名来通信。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker network rm my-net&amp;lt;/code&amp;gt;创建自定义网桥my-net &amp;lt;br /&amp;gt;  &lt;br /&gt;
|- &lt;br /&gt;
| 主机模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/host/ host]&lt;br /&gt;
| 当使用host网络模式，容器共享主机的网络命名空间，而且容器不会分配自己的 IP 地址。如果容器中某个程序绑定到端口，直接访问主机的该端口即可。该模式端口全部暴露，端口映射不生效，即-p、--publish、-P和--publish-all选项都将被忽略。主机模式网络可用于优化性能，并且在容器需要处理大量端口的情况下，因为它不需要网络地址转换 (NAT)，并且没有为每个端口创建“用户空间代理”。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;容器启动时设置：&amp;lt;code&amp;gt;--network host&amp;lt;/code&amp;gt;或 &amp;lt;code&amp;gt;--net=host&amp;lt;/code&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 覆盖模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/overlay/ overlay]&lt;br /&gt;
| 跨主机的分布式网络。该模式允许连接到它的容器（包括群服务容器）通过加密安全地通信。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/network/macvlan/ macvlan]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/network/ipvlan/ ipvlan]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 禁用网络 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/none/ none]&lt;br /&gt;
| 禁用容器的网络。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;容器启动时设置：&amp;lt;code&amp;gt;--network none&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 网络插件 [https://docs.docker.com/engine/extend/plugins_services/#network-plugins Network plugins]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/network/ Docker 文档：网络概览]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==数据==&lt;br /&gt;
===概览===&lt;br /&gt;
默认情况下，所有文件将会存储在容器里的可写的容器层（container layer）。意味着：&lt;br /&gt;
* 数据与容器为一体。当容器删除时，数据会一起被删除。&lt;br /&gt;
* 该容器与其他程序（容器）数据交换难。&lt;br /&gt;
* 由于容器的写入层是与宿主机器紧紧耦合，所以难以移动数据到其他机器。&lt;br /&gt;
* 容器的写入层的是通过 存储驱动（storage driver） 管理文件系统。存储驱动会使用Linux内核的 链合文件系统（union filesystem）进行挂载。相比起直接操作于宿主机器文件系统的 数据卷（data volumes），这额外的抽象层将会降低性能。&lt;br /&gt;
&lt;br /&gt;
Docker提供两种将数据存储在宿主机的方法：&#039;&#039;&#039;数据卷（volumes）&#039;&#039;&#039;和 &#039;&#039;&#039;绑定挂载（bind mounts）&#039;&#039;&#039;。另外，Linux用户还可使用&#039;&#039;&#039;tmpfs 挂载&#039;&#039;&#039;；window用户还可以使用 命名管道（named pipe）。可用参数 &amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;--mount &amp;lt;/code&amp;gt;来使用数据卷或绑定挂载，一般推荐--mount，更明确和详细。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/ Docker 文档：Docker上管理数据]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 数据存储类型 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 类型&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 数据卷 &amp;lt;br /&amp;gt; [https://docs.docker.com/storage/volumes/ volumes]&lt;br /&gt;
| Docker 推荐的容器数据持久化方法，volumes完全由 Docker 管理。分为命名卷和匿名卷， 匿名卷在容器删除时会被 Docker 引擎删除，或者启动容器时加入--rm时，容器退出匿名卷会自动删除。&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;创建数据卷：&amp;lt;code&amp;gt;docker volume create 卷名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;列出数据卷： &amp;lt;code&amp;gt;docker volume ls&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;数据卷详细信息：&amp;lt;code&amp;gt;docker volume inspect 卷名称 &amp;lt;/code&amp;gt;  &amp;lt;br /&amp;gt;启动容器时连接卷（不存在卷会自动创建）：&amp;lt;code&amp;gt;--mount source=卷名称,target=/容器的/目录&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 卷名称:/容器的/目录 &amp;lt;/code&amp;gt;  &amp;lt;br /&amp;gt;启动容器时连接匿名卷：&amp;lt;code&amp;gt;-v /容器的/目录&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;删除卷：&amp;lt;code&amp;gt;docker volume rm 卷名称&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;清理没有使用的卷：&amp;lt;code&amp;gt;docker volume prune&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 绑定挂载&amp;lt;br /&amp;gt; [https://docs.docker.com/storage/bind-mounts/ bind mounts]&lt;br /&gt;
| 将主机上的文件或目录挂载到容器中。主机的路径可以是相对路径。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;启动容器时绑定挂载：&amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;只读绑定挂载：&amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录,readonly&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录:ro&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|tmpfs 挂载 &amp;lt;br /&amp;gt;[https://docs.docker.com/storage/tmpfs/ tmpfs mounts]&lt;br /&gt;
|tmpfs挂载是临时的，仅保留在主机内存中。当容器停止时，tmpfs挂载被移除，写入的文件不会被持久化。这对于临时存储您不想保留在主机或容器可写层中的敏感文件很有用。&amp;lt;br /&amp;gt;可用命令 &amp;lt;code&amp;gt;-tmpfs &amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;--mount &amp;lt;/code&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/ Docker 文档：Docker上管理数据]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== -v和--mount 参数 ===&lt;br /&gt;
使用命令 &amp;lt;code&amp;gt;docker inspect 容器名称&amp;lt;/code&amp;gt; 可以查看容器详情，其中Mounts部分可以看到容器的挂载详细情况。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 参数&lt;br /&gt;
! -v 或 --volume&lt;br /&gt;
! --mount&lt;br /&gt;
|-&lt;br /&gt;
! 特点&lt;br /&gt;
| 简洁，但有时出现混乱。&lt;br /&gt;
| 类型指定明确，推荐写法。&lt;br /&gt;
|-&lt;br /&gt;
! 支持类型 &lt;br /&gt;
| &amp;lt;code&amp;gt;volumes&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;bind mounts&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;volumes&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;bind mounts&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;tmpfs&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! volumes&lt;br /&gt;
| &amp;lt;code&amp;gt;-v 卷名称:/容器的/目录 &amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount source=卷名称,target=/容器的/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! bind mounts&lt;br /&gt;
| &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! tmpfs mounts&lt;br /&gt;
| 不支持&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount type=tmpfs,destination=/app&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/volumes/  Docker 文档：Use volumes]&lt;br /&gt;
|[https://docs.docker.com/storage/bind-mounts/  Docker 文档：Use bind mounts]&lt;br /&gt;
|[https://docs.docker.com/storage/tmpfs/ Docker 文档：Use tmpfs mounts]&lt;br /&gt;
}}&lt;br /&gt;
== 命令行 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/system/ docker system]&lt;br /&gt;
| 管理docker 。 如使用docker system prune能清理docker占用的磁盘空间，包括不使用的空间，构建镜像时的缓存等。&lt;br /&gt;
| docker system prune -a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/cli/ Docker 文档：使用 Docker 命令行]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Compose==&lt;br /&gt;
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose，您可以使用[[YML]]文件来配置应用程序需要的所有服务。然后，使用一个命令，就可以从[[YML]]文件配置中创建并启动所有服务。 &lt;br /&gt;
=== 安装===&lt;br /&gt;
====版本====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Compose 旧版&lt;br /&gt;
| docker-compose&lt;br /&gt;
| Compose 旧版为独立版，下载可执行文件使用。&lt;br /&gt;
|-&lt;br /&gt;
| Compose V2&lt;br /&gt;
| docker compose&lt;br /&gt;
| Compose V2也叫Compose插件版，作为插件和docker集成，安装升级方便。新版也提供更多的功能。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/ Docker Compose 文档]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Compose V2安装====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# Ubuntu and Debian 安装&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install docker-compose-plugin&lt;br /&gt;
&lt;br /&gt;
# RPM-based distros 安装&lt;br /&gt;
sudo yum update&lt;br /&gt;
sudo yum install docker-compose-plugin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/install/ Docker 文档：安装Docker Compose]&lt;br /&gt;
}}&lt;br /&gt;
====Compose 旧版安装====&lt;br /&gt;
以Linux系统为例，使用&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;命令在终端从GitHub上下载[https://github.com/docker/compose/releases Docker Compose]二进制文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
# 查看系统类型&lt;br /&gt;
echo $(uname -s)-$(uname -m)&lt;br /&gt;
&lt;br /&gt;
# GitHub上右键复制系统对应版本，如linux-x86_64。 如下载当前最新版compose 2.2.2 &lt;br /&gt;
sudo curl -L &amp;quot;https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64&amp;quot; -o /usr/local/bin/docker-compose&lt;br /&gt;
&lt;br /&gt;
# 为compose程序文件添加执行权限&lt;br /&gt;
sudo chmod +x /usr/local/bin/docker-compose&lt;br /&gt;
&lt;br /&gt;
# 查看compose版本，验证是否安装成功&lt;br /&gt;
docker-compose --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/install/other/ Docker 文档：安装 Compose 独立版]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 快速入门 ===&lt;br /&gt;
&lt;br /&gt;
===Compose 命令===&lt;br /&gt;
进入&amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;配置文件所在目录，执再行命令。 &lt;br /&gt;
常用选项：&lt;br /&gt;
* -f, --file 指定其他名称配置文件。 如：&amp;lt;code&amp;gt;docker compose -f docker-compose.prod.yml up&amp;lt;/code&amp;gt;&lt;br /&gt;
*-p, --project-name 制定项目名称。如：&amp;lt;code&amp;gt;docker compose -p myproject up&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compose 常用命令：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/compose_up/ up]&lt;br /&gt;
| 自动执行一些列操作：构建镜像、创建服务、启动服务和关联服务相关容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose up&amp;lt;/code&amp;gt;   &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker compose -f docker-compose.dev.yml up --build &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| stop&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| logs&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;logs&amp;lt;/code&amp;gt;默认以不同颜色显示服务内容器的日志。&lt;br /&gt;
|-&lt;br /&gt;
|  config&lt;br /&gt;
| 显示 Docker Compose 配置，包括环境变量。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose config&amp;lt;/code&amp;gt; 查看当前目录docker-compose.yml配置  &amp;lt;code&amp;gt;docker-compose -f docker-compose.dev.yml config&amp;lt;/code&amp;gt; 查看当前docker-compose.dev.yml配置&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| rm&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose rm -f&amp;lt;/code&amp;gt; 强制删除服务内容器。 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker rm -f $(docker compose ps -a -q)&amp;lt;/code&amp;gt; 删除服务内所有容器。&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/reference/ Docker 文档：docker compose CLI ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Swarm Mode==&lt;br /&gt;
Swarm Mode是Docker集群管理工具，从Docker1.2开始Docker Swarm内置到Docker中为Swarm Mode。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/swarm/ Docker文档-Swarm mode]&lt;br /&gt;
}}&lt;br /&gt;
==安全==&lt;br /&gt;
&lt;br /&gt;
==国内加速==&lt;br /&gt;
=== Docker CE镜像 ===&lt;br /&gt;
用于安装docker社区版软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 中国科学技术大学 USTC&lt;br /&gt;
| 手动安装时把 download.docker.com 地址换成 mirrors.ustc.edu.cn/docker-ce 即可 。&amp;lt;br /&amp;gt; 地址：https://mirrors.ustc.edu.cn/docker-ce/ &amp;lt;br /&amp;gt;文档：https://mirrors.ustc.edu.cn/help/docker-ce.html&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
=== Docker Hub镜像 ===&lt;br /&gt;
&lt;br /&gt;
=== 周边加速 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfile中apt更换软件源&lt;br /&gt;
| Debian换阿里源： &amp;lt;code&amp;gt;RUN  sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Github镜像网站&lt;br /&gt;
| kgithub.com ： 将Dockerfile中的github.com换成kgithub.com&lt;br /&gt;
|-&lt;br /&gt;
| 设置DNS&lt;br /&gt;
| echo &amp;quot;nameserver 8.8.8.8&amp;quot; | sudo tee /etc/resolv.conf &amp;gt; /dev/null&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实例==&lt;br /&gt;
====Docker安装Nginx====&lt;br /&gt;
&lt;br /&gt;
====Docker安装Flask====&lt;br /&gt;
[[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像，并启动。 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#创建一个文件夹来保存项目&lt;br /&gt;
mkdir hello_flask&lt;br /&gt;
#利用 cd 命令切换到这个目录&lt;br /&gt;
cd hello_flask &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;接下来使用vim app.py命令创建一个app.py文件，内容如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from flask import Flask&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&#039;/&#039;)&lt;br /&gt;
def hello_world():&lt;br /&gt;
    return &#039;Hello, World!&#039;&lt;br /&gt;
&lt;br /&gt;
if __name__==&#039;__main__&#039;:&lt;br /&gt;
    app.run(debug=True, host=&#039;0.0.0.0&#039;) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;然后使用vim Dockerfile命令创建一个Dockerfile文件，内容如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
FROM python:alpine&lt;br /&gt;
&lt;br /&gt;
COPY . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
RUN pip install Flask&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;python&amp;quot;]&lt;br /&gt;
CMD [&amp;quot;app.py&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;现在hello_flask文件夹下有两个文件app.py和Dockerfile，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#在hello_flask文件夹下使用docker build命令生成镜像&lt;br /&gt;
docker build -t flask:1.1.1-min .&lt;br /&gt;
&lt;br /&gt;
#使用 docker run 命令运行刚刚创建的镜像：&lt;br /&gt;
docker run --name flask -d -p 8080:5000 flask:1.1.1-min&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
现在在浏览器打开ip;10000,可以看到Hello, World!&lt;br /&gt;
&lt;br /&gt;
可以使用-v命令，把当前路径挂载到容器的/app目录，$PWD表示当前目录，比如现在的hello_flask。&lt;br /&gt;
 docker run --name flask2 -d -p 8080:5000 -v $PWD:/app flask:1.1.1-min&lt;br /&gt;
在浏览器打开ip:8080可以看到“Hello, World!”，挂载后在主机中的hello_flask修改app.py，刷新网页就会看到更新的内容。修改文件时候要使用root权限不然会报错，sudo vim app.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Docker安装Mediawiki====&lt;br /&gt;
[[Mediawiki]]全球最著名的开源wiki程序，维基百科也使用该软件。&lt;br /&gt;
&lt;br /&gt;
方法一：利用Docker Hub上现成镜像&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#运行mediawiki镜像，没有就从docker hub下载mediawiki再运行&lt;br /&gt;
docker run --name some-mediawiki -p 8080:80 -d mediawiki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;{{了解更多&lt;br /&gt;
|[https://hub.docker.com/_/mediawiki Docker Hub：Mediawiki ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Docker 官网：https://www.docker.com&lt;br /&gt;
*Docker Hub：https://hub.docker.com/&lt;br /&gt;
*Docker 文档：https://docs.docker.com&lt;br /&gt;
*Docker 文档 &amp;gt; 参考：https://docs.docker.com/reference &lt;br /&gt;
*Docker 文档 &amp;gt; 示例：https://docs.docker.com/samples&lt;br /&gt;
*Docker CE 的 Github：https://github.com/docker/docker-ce&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/Docker 维基百科：Docker]&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/操作系统层虚拟化 维基百科：操作系统层虚拟化]&lt;br /&gt;
&lt;br /&gt;
[[分类:编程工具]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Nameslio&amp;diff=1754</id>
		<title>Nameslio</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Nameslio&amp;diff=1754"/>
		<updated>2026-04-17T12:18:42Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 使用API示例 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nameslio是一家[[域名]]注册商和网络托管公司。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API==&lt;br /&gt;
* https://www.namesilo.com/api-reference#domains/register-domain&lt;br /&gt;
&lt;br /&gt;
===使用API示例===&lt;br /&gt;
使用python，添加或修改域名主机的A记录，如abc.abc.com设置ip为x.x.x.x:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import urllib.request&lt;br /&gt;
import urllib.parse&lt;br /&gt;
import json&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;https://www.namesilo.com/api/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ========== 辅助函数 ==========&lt;br /&gt;
def load_dotenv(filepath=&amp;quot;.env&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;手动解析 .env 文件&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not os.path.exists(filepath):&lt;br /&gt;
        return&lt;br /&gt;
    with open(filepath, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        for line in f:&lt;br /&gt;
            line = line.strip()&lt;br /&gt;
            if not line or line.startswith(&amp;quot;#&amp;quot;):&lt;br /&gt;
                continue&lt;br /&gt;
            if &amp;quot;=&amp;quot; in line:&lt;br /&gt;
                key, value = line.split(&amp;quot;=&amp;quot;, 1)&lt;br /&gt;
                os.environ[key.strip()] = value.strip().strip(&amp;quot;\&amp;quot;&#039;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def check_success(res):&lt;br /&gt;
    code = res.get(&amp;quot;reply&amp;quot;, {}).get(&amp;quot;code&amp;quot;)&lt;br /&gt;
    if code != 300:&lt;br /&gt;
        raise Exception(f&amp;quot;API失败: code={code}, res={res}&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        # print(f&#039;成功返回：{res[&amp;quot;reply&amp;quot;].get(&amp;quot;resource_record&amp;quot;, [])}&#039;)&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
def _request(endpoint, params):&lt;br /&gt;
    api_key = os.getenv(&amp;quot;NAMESILO_API_KEY&amp;quot;)&lt;br /&gt;
    if not api_key:&lt;br /&gt;
        raise ValueError(&amp;quot;请在 .env 中设置 NAMESILO_API_KEY&amp;quot;)    &lt;br /&gt;
    params.update({&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;json&amp;quot;,  # 推荐用 json，比 xml 好处理&lt;br /&gt;
        &amp;quot;key&amp;quot;: api_key&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    url = BASE_URL + endpoint + &amp;quot;?&amp;quot; + urllib.parse.urlencode(params)&lt;br /&gt;
    # 测试使用，链接含有APIkey&lt;br /&gt;
    # print(f&amp;quot;正在请求：{url}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    req = urllib.request.Request(&lt;br /&gt;
        url,&lt;br /&gt;
        headers={&lt;br /&gt;
            &amp;quot;User-Agent&amp;quot;: &amp;quot;Mozilla/5.0&amp;quot;  # 关键！&lt;br /&gt;
        }&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    with urllib.request.urlopen(req) as resp:&lt;br /&gt;
        return json.loads(resp.read().decode())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def upsert_a_record(domain, host, ip, ttl=3600):&lt;br /&gt;
&lt;br /&gt;
    # 1️⃣ 查询记录&lt;br /&gt;
    res = _request(&amp;quot;dnsListRecords&amp;quot;, {&lt;br /&gt;
        &amp;quot;domain&amp;quot;: domain&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    check_success(res)&lt;br /&gt;
&lt;br /&gt;
    records = res[&amp;quot;reply&amp;quot;].get(&amp;quot;resource_record&amp;quot;, [])&lt;br /&gt;
    if isinstance(records, dict):  # 只有一条时会是 dict&lt;br /&gt;
        records = [records]&lt;br /&gt;
&lt;br /&gt;
    record_id = None&lt;br /&gt;
&lt;br /&gt;
    # 2️⃣ 查找已有记录&lt;br /&gt;
    for r in records:&lt;br /&gt;
        if r[&amp;quot;type&amp;quot;] == &amp;quot;A&amp;quot; and r[&amp;quot;host&amp;quot;] == host:&lt;br /&gt;
            if r[&amp;quot;value&amp;quot;] == ip:&lt;br /&gt;
                print(&amp;quot;记录已存在, 无需更新&amp;quot;)&lt;br /&gt;
                return True &lt;br /&gt;
            record_id = r[&amp;quot;record_id&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
    # 3️⃣ 更新&lt;br /&gt;
    if record_id:&lt;br /&gt;
        res = _request(&amp;quot;dnsUpdateRecord&amp;quot;, {&lt;br /&gt;
            &amp;quot;domain&amp;quot;: domain,&lt;br /&gt;
            &amp;quot;rrid&amp;quot;: record_id,&lt;br /&gt;
            &amp;quot;rrhost&amp;quot;: host,&lt;br /&gt;
            &amp;quot;rrvalue&amp;quot;: ip,&lt;br /&gt;
            &amp;quot;rrttl&amp;quot;: ttl&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        check_success(res)&lt;br /&gt;
&lt;br /&gt;
    # 4️⃣ 新增&lt;br /&gt;
    else:&lt;br /&gt;
        res = _request(&amp;quot;dnsAddRecord&amp;quot;, {&lt;br /&gt;
            &amp;quot;domain&amp;quot;: domain,&lt;br /&gt;
            &amp;quot;rrtype&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
            &amp;quot;rrhost&amp;quot;: host,&lt;br /&gt;
            &amp;quot;rrvalue&amp;quot;: ip,&lt;br /&gt;
            &amp;quot;rrttl&amp;quot;: ttl&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        check_success(res)&lt;br /&gt;
&lt;br /&gt;
# ========== 使用示例 ==========&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # 加载 .env 文件&lt;br /&gt;
    load_dotenv()&lt;br /&gt;
&lt;br /&gt;
    upsert_a_record(&lt;br /&gt;
        domain=os.getenv(&amp;quot;DOMAIN&amp;quot;),   # 如: example.com&lt;br /&gt;
        host=os.getenv(&amp;quot;SUBDOMAIN&amp;quot;),  # 如: www&lt;br /&gt;
        ip=os.getenv(&amp;quot;IP_ADDRESS&amp;quot;),   # 如: 100.100.100.100 &lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
密钥不放程序文件里，放.env文件：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
NAMESILO_API_KEY=xxx&lt;br /&gt;
DOMAIN=xxx&lt;br /&gt;
SUBDOMAIN=xxx&lt;br /&gt;
IP_ADDRESS=xxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Nameslio&amp;diff=1753</id>
		<title>Nameslio</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Nameslio&amp;diff=1753"/>
		<updated>2026-04-17T11:51:17Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nameslio是一家[[域名]]注册商和网络托管公司。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API==&lt;br /&gt;
* https://www.namesilo.com/api-reference#domains/register-domain&lt;br /&gt;
&lt;br /&gt;
===使用API示例===&lt;br /&gt;
使用python，添加或修改域名主机的A记录，如abc.abc.com设置ip为x.x.x.x:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import urllib.request&lt;br /&gt;
import urllib.parse&lt;br /&gt;
import json&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;https://www.namesilo.com/api/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ========== 辅助函数 ==========&lt;br /&gt;
def load_dotenv(filepath=&amp;quot;.env&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;手动解析 .env 文件&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not os.path.exists(filepath):&lt;br /&gt;
        return&lt;br /&gt;
    with open(filepath, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        for line in f:&lt;br /&gt;
            line = line.strip()&lt;br /&gt;
            if not line or line.startswith(&amp;quot;#&amp;quot;):&lt;br /&gt;
                continue&lt;br /&gt;
            if &amp;quot;=&amp;quot; in line:&lt;br /&gt;
                key, value = line.split(&amp;quot;=&amp;quot;, 1)&lt;br /&gt;
                os.environ[key.strip()] = value.strip().strip(&amp;quot;\&amp;quot;&#039;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def check_success(res):&lt;br /&gt;
    code = res.get(&amp;quot;reply&amp;quot;, {}).get(&amp;quot;code&amp;quot;)&lt;br /&gt;
    if code != 300:&lt;br /&gt;
        raise Exception(f&amp;quot;API失败: code={code}, res={res}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def _request(endpoint, params):&lt;br /&gt;
    api_key = os.getenv(&amp;quot;NAMESILO_API_KEY&amp;quot;)&lt;br /&gt;
    if not api_key:&lt;br /&gt;
        raise ValueError(&amp;quot;请在 .env 中设置 NAMESILO_API_KEY&amp;quot;)    &lt;br /&gt;
    params.update({&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;json&amp;quot;,  # 推荐用 json，比 xml 好处理&lt;br /&gt;
        &amp;quot;key&amp;quot;: api_key&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    url = BASE_URL + endpoint + &amp;quot;?&amp;quot; + urllib.parse.urlencode(params)&lt;br /&gt;
    print(f&amp;quot;正在请求：{url}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    req = urllib.request.Request(&lt;br /&gt;
        url,&lt;br /&gt;
        headers={&lt;br /&gt;
            &amp;quot;User-Agent&amp;quot;: &amp;quot;Mozilla/5.0&amp;quot;  # 不加请求头，namesilo会拒绝&lt;br /&gt;
        }&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    with urllib.request.urlopen(req) as resp:&lt;br /&gt;
        return json.loads(resp.read().decode())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def upsert_a_record(domain, host, ip, ttl=3600):&lt;br /&gt;
    full_host = f&amp;quot;{host}.{domain}&amp;quot; if host != &amp;quot;@&amp;quot; else domain&lt;br /&gt;
&lt;br /&gt;
    # 1️⃣ 查询记录&lt;br /&gt;
    res = _request(&amp;quot;dnsListRecords&amp;quot;, {&lt;br /&gt;
        &amp;quot;domain&amp;quot;: domain&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    check_success(res)&lt;br /&gt;
&lt;br /&gt;
    records = res[&amp;quot;reply&amp;quot;].get(&amp;quot;resource_record&amp;quot;, [])&lt;br /&gt;
    if isinstance(records, dict):  # 只有一条时会是 dict&lt;br /&gt;
        records = [records]&lt;br /&gt;
&lt;br /&gt;
    record_id = None&lt;br /&gt;
&lt;br /&gt;
    # 2️⃣ 查找已有记录&lt;br /&gt;
    for r in records:&lt;br /&gt;
        if r[&amp;quot;type&amp;quot;] == &amp;quot;A&amp;quot; and r[&amp;quot;host&amp;quot;] == full_host:&lt;br /&gt;
            record_id = r[&amp;quot;record_id&amp;quot;]&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
    # 3️⃣ 更新&lt;br /&gt;
    if record_id:&lt;br /&gt;
        res = _request(&amp;quot;dnsUpdateRecord&amp;quot;, {&lt;br /&gt;
            &amp;quot;domain&amp;quot;: domain,&lt;br /&gt;
            &amp;quot;rrid&amp;quot;: record_id,&lt;br /&gt;
            &amp;quot;rrhost&amp;quot;: host,&lt;br /&gt;
            &amp;quot;rrvalue&amp;quot;: ip,&lt;br /&gt;
            &amp;quot;rrttl&amp;quot;: ttl&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        check_success(res)&lt;br /&gt;
&lt;br /&gt;
    # 4️⃣ 新增&lt;br /&gt;
    else:&lt;br /&gt;
        res = _request(&amp;quot;dnsAddRecord&amp;quot;, {&lt;br /&gt;
            &amp;quot;domain&amp;quot;: domain,&lt;br /&gt;
            &amp;quot;rrtype&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
            &amp;quot;rrhost&amp;quot;: host,&lt;br /&gt;
            &amp;quot;rrvalue&amp;quot;: ip,&lt;br /&gt;
            &amp;quot;rrttl&amp;quot;: ttl&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        check_success(res)&lt;br /&gt;
&lt;br /&gt;
# ========== 使用示例 ==========&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # 加载 .env 文件&lt;br /&gt;
    load_dotenv()&lt;br /&gt;
    &lt;br /&gt;
    # 配置参数&lt;br /&gt;
    DOMAIN = os.getenv(&amp;quot;DOMAIN&amp;quot;)&lt;br /&gt;
    SUBDOMAIN = os.getenv(&amp;quot;SUBDOMAIN&amp;quot;)&lt;br /&gt;
    IP_ADDRESS = os.getenv(&amp;quot;IP_ADDRESS&amp;quot;)  &lt;br /&gt;
&lt;br /&gt;
    upsert_a_record(&lt;br /&gt;
        domain=DOMAIN,&lt;br /&gt;
        host=SUBDOMAIN,&lt;br /&gt;
        ip=IP_ADDRESS&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
密钥不放程序文件里，放.env文件：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
NAMESILO_API_KEY=xxx&lt;br /&gt;
DOMAIN=xxx&lt;br /&gt;
SUBDOMAIN=xxx&lt;br /&gt;
IP_ADDRESS=xxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Nameslio&amp;diff=1752</id>
		<title>Nameslio</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Nameslio&amp;diff=1752"/>
		<updated>2026-04-17T11:49:51Z</updated>

		<summary type="html">&lt;p&gt;Eric：​创建页面，内容为“Nameslio是一家域名注册商和网络托管公司。   ==API== ===使用API示例=== 使用python，添加或修改域名主机的A记录，如abc.abc.com设置ip为x.x.x.x: &amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt; import urllib.request import urllib.parse import json import os  BASE_URL = &amp;quot;https://www.namesilo.com/api/&amp;quot;  # ========== 辅助函数 ========== def load_dotenv(filepath=&amp;quot;.env&amp;quot;):     &amp;quot;&amp;quot;&amp;quot;手动解析 .env 文件&amp;quot;&amp;quot;&amp;quot;     if not os.path.exists(filepath)…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nameslio是一家[[域名]]注册商和网络托管公司。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API==&lt;br /&gt;
===使用API示例===&lt;br /&gt;
使用python，添加或修改域名主机的A记录，如abc.abc.com设置ip为x.x.x.x:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import urllib.request&lt;br /&gt;
import urllib.parse&lt;br /&gt;
import json&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
BASE_URL = &amp;quot;https://www.namesilo.com/api/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ========== 辅助函数 ==========&lt;br /&gt;
def load_dotenv(filepath=&amp;quot;.env&amp;quot;):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;手动解析 .env 文件&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not os.path.exists(filepath):&lt;br /&gt;
        return&lt;br /&gt;
    with open(filepath, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        for line in f:&lt;br /&gt;
            line = line.strip()&lt;br /&gt;
            if not line or line.startswith(&amp;quot;#&amp;quot;):&lt;br /&gt;
                continue&lt;br /&gt;
            if &amp;quot;=&amp;quot; in line:&lt;br /&gt;
                key, value = line.split(&amp;quot;=&amp;quot;, 1)&lt;br /&gt;
                os.environ[key.strip()] = value.strip().strip(&amp;quot;\&amp;quot;&#039;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def check_success(res):&lt;br /&gt;
    code = res.get(&amp;quot;reply&amp;quot;, {}).get(&amp;quot;code&amp;quot;)&lt;br /&gt;
    if code != 300:&lt;br /&gt;
        raise Exception(f&amp;quot;API失败: code={code}, res={res}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def _request(endpoint, params):&lt;br /&gt;
    api_key = os.getenv(&amp;quot;NAMESILO_API_KEY&amp;quot;)&lt;br /&gt;
    if not api_key:&lt;br /&gt;
        raise ValueError(&amp;quot;请在 .env 中设置 NAMESILO_API_KEY&amp;quot;)    &lt;br /&gt;
    params.update({&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;json&amp;quot;,  # 推荐用 json，比 xml 好处理&lt;br /&gt;
        &amp;quot;key&amp;quot;: api_key&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    url = BASE_URL + endpoint + &amp;quot;?&amp;quot; + urllib.parse.urlencode(params)&lt;br /&gt;
    print(f&amp;quot;正在请求：{url}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    req = urllib.request.Request(&lt;br /&gt;
        url,&lt;br /&gt;
        headers={&lt;br /&gt;
            &amp;quot;User-Agent&amp;quot;: &amp;quot;Mozilla/5.0&amp;quot;  # 不加请求头，namesilo会拒绝&lt;br /&gt;
        }&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    with urllib.request.urlopen(req) as resp:&lt;br /&gt;
        return json.loads(resp.read().decode())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def upsert_a_record(domain, host, ip, ttl=3600):&lt;br /&gt;
    full_host = f&amp;quot;{host}.{domain}&amp;quot; if host != &amp;quot;@&amp;quot; else domain&lt;br /&gt;
&lt;br /&gt;
    # 1️⃣ 查询记录&lt;br /&gt;
    res = _request(&amp;quot;dnsListRecords&amp;quot;, {&lt;br /&gt;
        &amp;quot;domain&amp;quot;: domain&lt;br /&gt;
    })&lt;br /&gt;
&lt;br /&gt;
    check_success(res)&lt;br /&gt;
&lt;br /&gt;
    records = res[&amp;quot;reply&amp;quot;].get(&amp;quot;resource_record&amp;quot;, [])&lt;br /&gt;
    if isinstance(records, dict):  # 只有一条时会是 dict&lt;br /&gt;
        records = [records]&lt;br /&gt;
&lt;br /&gt;
    record_id = None&lt;br /&gt;
&lt;br /&gt;
    # 2️⃣ 查找已有记录&lt;br /&gt;
    for r in records:&lt;br /&gt;
        if r[&amp;quot;type&amp;quot;] == &amp;quot;A&amp;quot; and r[&amp;quot;host&amp;quot;] == full_host:&lt;br /&gt;
            record_id = r[&amp;quot;record_id&amp;quot;]&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
    # 3️⃣ 更新&lt;br /&gt;
    if record_id:&lt;br /&gt;
        res = _request(&amp;quot;dnsUpdateRecord&amp;quot;, {&lt;br /&gt;
            &amp;quot;domain&amp;quot;: domain,&lt;br /&gt;
            &amp;quot;rrid&amp;quot;: record_id,&lt;br /&gt;
            &amp;quot;rrhost&amp;quot;: host,&lt;br /&gt;
            &amp;quot;rrvalue&amp;quot;: ip,&lt;br /&gt;
            &amp;quot;rrttl&amp;quot;: ttl&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        check_success(res)&lt;br /&gt;
&lt;br /&gt;
    # 4️⃣ 新增&lt;br /&gt;
    else:&lt;br /&gt;
        res = _request(&amp;quot;dnsAddRecord&amp;quot;, {&lt;br /&gt;
            &amp;quot;domain&amp;quot;: domain,&lt;br /&gt;
            &amp;quot;rrtype&amp;quot;: &amp;quot;A&amp;quot;,&lt;br /&gt;
            &amp;quot;rrhost&amp;quot;: host,&lt;br /&gt;
            &amp;quot;rrvalue&amp;quot;: ip,&lt;br /&gt;
            &amp;quot;rrttl&amp;quot;: ttl&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
        check_success(res)&lt;br /&gt;
&lt;br /&gt;
# ========== 使用示例 ==========&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # 加载 .env 文件&lt;br /&gt;
    load_dotenv()&lt;br /&gt;
    &lt;br /&gt;
    # 配置参数&lt;br /&gt;
    DOMAIN = os.getenv(&amp;quot;DOMAIN&amp;quot;)&lt;br /&gt;
    SUBDOMAIN = os.getenv(&amp;quot;SUBDOMAIN&amp;quot;)&lt;br /&gt;
    IP_ADDRESS = os.getenv(&amp;quot;IP_ADDRESS&amp;quot;)  &lt;br /&gt;
&lt;br /&gt;
    upsert_a_record(&lt;br /&gt;
        domain=DOMAIN,&lt;br /&gt;
        host=SUBDOMAIN,&lt;br /&gt;
        ip=IP_ADDRESS&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
密钥不放程序文件里，放.env文件：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
NAMESILO_API_KEY=xxx&lt;br /&gt;
DOMAIN=xxx&lt;br /&gt;
SUBDOMAIN=xxx&lt;br /&gt;
IP_ADDRESS=xxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=Docker&amp;diff=1751</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=Docker&amp;diff=1751"/>
		<updated>2026-04-17T05:16:56Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 仓库 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker 是一个开源软件的容器引擎软件。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
* 2013年3月13日，发布初始版本。&lt;br /&gt;
&lt;br /&gt;
===虚拟机与容器===&lt;br /&gt;
[[虚拟机]]可以在一种操作系统里面运行另一种操作系统，但虚拟机，资源占用多，启动慢。&lt;br /&gt;
&lt;br /&gt;
容器是操作系统层虚拟化，容器化的优势在于占用服务器空间少，通常几秒内即可引导。&lt;br /&gt;
&lt;br /&gt;
Docker 是一种容器的管理方式。下文的容器主要指Docker的容器。&lt;br /&gt;
&lt;br /&gt;
===安装===&lt;br /&gt;
====CentOS====&lt;br /&gt;
官网建议安装在[[CentOS]] 7及以上的系统。如果之前有安装docker，先卸载之前版本。三种安装方法：&lt;br /&gt;
*添加Docker源进行安装，安装和升级方便，这是推荐的方法。&lt;br /&gt;
*下载RPM软件包，手动安装。&lt;br /&gt;
*官方一键安装脚本，一些测试和开发用户会选择这种方法。&lt;br /&gt;
&lt;br /&gt;
方法一，添加Docker源进行安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#安装所需的软件包&lt;br /&gt;
sudo yum install -y yum-utils device-mapper-persistent-data lvm2&lt;br /&gt;
&lt;br /&gt;
#安装containerd.io软件包，不然会报错requires containerd.io &amp;gt;= 1.2.2-3&lt;br /&gt;
sudo yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#设置官网的稳定版仓库源&lt;br /&gt;
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo&lt;br /&gt;
&lt;br /&gt;
#可选，体验版和测试版默认是关闭的，可以通过命令打开，详细见文档。&lt;br /&gt;
&lt;br /&gt;
#安装最新版本的docker CE&lt;br /&gt;
sudo yum install docker-ce&lt;br /&gt;
&lt;br /&gt;
#启动守护进程&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
也可以使用dnf命令安装，dnf为下一代yum命令。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo dnf -y install dnf-plugins-core&lt;br /&gt;
sudo dnf install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm&lt;br /&gt;
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo&lt;br /&gt;
sudo dnf install docker-ce&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
方法二，下载RPM包，离线安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#在联网的计算机下载RPM软件包，从官网地址选一个版本下载：https://download.docker.com/linux/fedora/&lt;br /&gt;
#比如：docker-ce-cli-19.03.4-3.fc31.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#复制到计算机的某个目录，执行安装&lt;br /&gt;
sudo dnf -y install docker-ce-cli-19.03.4-3.fc31.x86_64.rpm&lt;br /&gt;
&lt;br /&gt;
#启动守护进程&lt;br /&gt;
sudo systemctl start docker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
方法三，使用脚本安装：&lt;br /&gt;
Docker提供脚本安装方式，快捷安装。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#下载脚本&lt;br /&gt;
curl -fsSL https://get.docker.com -o get-docker.sh&lt;br /&gt;
#运行脚本安装&lt;br /&gt;
sudo sh get-docker.sh&lt;br /&gt;
&lt;br /&gt;
#如果以非root用户使用docker（推荐）， 需要添加一个用户到&#039;docker&#039;用户组中&lt;br /&gt;
#查看是否添加成功，如果添加当前登录的用户，需要重新登录，组权限才会生效。&lt;br /&gt;
sudo usermod -aG docker your-user-name&lt;br /&gt;
&lt;br /&gt;
#查看是否安装成功&lt;br /&gt;
docker --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/install/centos/ Docker文档-centos安装Docker引擎]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Ubuntu====&lt;br /&gt;
[[Ubuntu]]安装Docker也有三种方法，与[[CentOS]]安装docker类似。&lt;br /&gt;
&lt;br /&gt;
方法一，添加Docker源进行安装：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#获取apt可用最新列表&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
#使用apt安装下列软件包&lt;br /&gt;
sudo apt-get install \&lt;br /&gt;
    apt-transport-https \&lt;br /&gt;
    ca-certificates \&lt;br /&gt;
    curl \&lt;br /&gt;
    gnupg-agent \&lt;br /&gt;
    software-properties-common&lt;br /&gt;
#添加docker官方GPG密钥，验证密钥指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88&lt;br /&gt;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br /&gt;
sudo apt-key fingerprint 0EBFCD88&lt;br /&gt;
#添加docker的稳定源&lt;br /&gt;
sudo add-apt-repository \&lt;br /&gt;
   &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \&lt;br /&gt;
   $(lsb_release -cs) \&lt;br /&gt;
   stable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#获取apt可用最新列表&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
#安装最新版的Docker CE&lt;br /&gt;
sudo apt-get install docker-ce docker-ce-cli containerd.io&lt;br /&gt;
&lt;br /&gt;
#检验是否安装成功&lt;br /&gt;
sudo docker run hello-world&lt;br /&gt;
#使用非root用户使用docker，可以将用户添加到docker组：&lt;br /&gt;
sudo gpasswd -a ${USER} docker  #将当前用户添加到docker组，重新登录后生效&lt;br /&gt;
sudo usermod -aG docker your-user  #将其他用户添加到docker组&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/install/linux/docker-ce/ubuntu/ Docker文档-Ubuntu安装Docker CE]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==镜像==&lt;br /&gt;
镜像(Image)是只读文件，容器是运行在镜像之上，运行容器时会复制镜像然后启动。镜像的一些属性：&lt;br /&gt;
*REPOSITORY：表示镜像的仓库源&lt;br /&gt;
*TAG：镜像的标签&lt;br /&gt;
*IMAGE ID：镜像ID&lt;br /&gt;
*CREATED：镜像创建时间&lt;br /&gt;
*SIZE：镜像大小&lt;br /&gt;
&lt;br /&gt;
当运行容器时，使用的镜像如果在本地中不存在，docker 就会自动从 docker 镜像仓库中下载，默认是从 Docker Hub 公共镜像源下载。&lt;br /&gt;
&lt;br /&gt;
===镜像使用===&lt;br /&gt;
可以命令行输入&amp;lt;code&amp;gt;命令 --help&amp;lt;/code&amp;gt;查看帮助，如在命令行输入&amp;lt;code&amp;gt;docker search --help&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/image_ls/ docker image ls] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;[https://docs.docker.com/engine/reference/commandline/images/ docker images]&lt;br /&gt;
| &#039;&#039;&#039;查看镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;列出本地主机上的镜像&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image ls&amp;lt;/code&amp;gt;查看本地镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker images -a &amp;lt;/code&amp;gt;列出本地主机上的镜像，包括默认隐藏的中间镜像。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/tag/ docker tag] &amp;lt;br /&amp;gt;docker image tag&lt;br /&gt;
| &#039;&#039;&#039;创建引用标签&#039;&#039;&#039; &amp;lt;br /&amp;gt;为镜像创建新标签，方便使用。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker tag 0e1234567893 ubuntu:V20&amp;lt;/code&amp;gt;为ID：0e1234567893的镜像加多个标签ubuntu:V20 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker tag ubuntu:18.04 mytest/ubuntu:18&amp;lt;/code&amp;gt;为ubuntu:18.04镜像添加标签mytest/ubuntu:18&lt;br /&gt;
|- &lt;br /&gt;
| docker image rm &amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;docker rmi&lt;br /&gt;
| &#039;&#039;&#039;删除镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;删除镜像正在使用的镜像会报错&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image rm Ubuntu&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker rmi Ubuntu&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| docker image prune&lt;br /&gt;
| &#039;&#039;&#039;清理镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;删除未使用的镜像&lt;br /&gt;
| &amp;lt;code&amp;gt;docker image prune&amp;lt;/code&amp;gt;删除未使用的镜像&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/image_pull/ docker pull]&lt;br /&gt;
| &#039;&#039;&#039;下载镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上下载。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker pull ubuntu&amp;lt;/code&amp;gt;默认下载tag: latest的版本 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker pull ubuntu:18.04&amp;lt;/code&amp;gt;指定镜像版本&lt;br /&gt;
|- &lt;br /&gt;
| docker search&lt;br /&gt;
| &#039;&#039;&#039;搜索镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认从Docker镜像仓库[https://hub.docker.com/ Docker Hub]上搜索。&amp;lt;br /&amp;gt;输出结果说明：&amp;lt;br /&amp;gt;NAME: 镜像仓库源的名称&amp;lt;br /&amp;gt;DESCRIPTION: 镜像的描述&amp;lt;br /&amp;gt;OFFICIAL: 是否docker官方发布&amp;lt;br /&amp;gt;START: 表示点赞数量&amp;lt;br /&amp;gt;AUTOMATED: 自动构建&lt;br /&gt;
| &amp;lt;code&amp;gt;docker search nginx&amp;lt;/code&amp;gt;搜索nginx软件的镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker search --filter=is-offical=true mysql&amp;lt;/code&amp;gt;搜索mysql软件的镜像 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker search --filter=stars=100 mysql&amp;lt;/code&amp;gt;搜索star超过100的mysql镜像&lt;br /&gt;
|-&lt;br /&gt;
|docker push&lt;br /&gt;
|&#039;&#039;&#039;上传镜像&#039;&#039;&#039; &amp;lt;br /&amp;gt;默认上传到Docker镜像仓库[https://hub.docker.com/ Docker Hub]，公共仓库为免费，私有仓库需要付费使用。先注册一个免费Docker 账号，接下来可以在终端操作。&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#登录使用docker login，再输入账号密码&lt;br /&gt;
docker login&lt;br /&gt;
&lt;br /&gt;
#上传镜像使用docker push，需要登录再使用。username为个人的账户名&lt;br /&gt;
docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
#退出使用docker logout&lt;br /&gt;
docker logout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| docker history&lt;br /&gt;
| &#039;&#039;&#039;镜像历史&#039;&#039;&#039; &amp;lt;br /&amp;gt;查看制作镜像的命令 &amp;lt;br /&amp;gt;格式：&amp;lt;code&amp;gt;docker history [参数] 镜像&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;docker history nginx&amp;lt;/code&amp;gt;查看nginx镜像制作的历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/image/ Docker 参考：docker image]&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/images/ Docker 参考：docker images]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===常用镜像===&lt;br /&gt;
====操作系统基础镜像====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 镜像名称&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| busybox&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| alpine&lt;br /&gt;
| 5 MB&lt;br /&gt;
| Alpine Linux是一个面向安全的轻型的Linux发行版。Alpine不包含 bash 因此进入某个alpine docker容器，可以使用sh命令，如：&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -it container_name sh&amp;lt;/code&amp;gt;进入某个容器并运行sh。 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker run -it -v data_volume:/data alpine:3.16.9 sh&amp;lt;/code&amp;gt;启动一个容器，挂在data_volume卷到容器的/data目录。&lt;br /&gt;
| 官网：https://www.alpinelinux.org/ &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/alpine/&lt;br /&gt;
|-&lt;br /&gt;
| ubuntu&lt;br /&gt;
| 30 MB&lt;br /&gt;
| &lt;br /&gt;
|官网：http://www.ubuntu.com/  &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/ubuntu/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====编程语言基础镜像====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 镜像名称&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| python&lt;br /&gt;
| 50 MB &amp;lt;br /&amp;gt;350 MB &amp;lt;br /&amp;gt;2.64G&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;br /&amp;gt;镜像： https://hub.docker.com/_/python/&lt;br /&gt;
|-&lt;br /&gt;
| node&lt;br /&gt;
|&lt;br /&gt;
| Node.js是一个基于JavaScript的平台，用于服务器端和网络应用程序。&lt;br /&gt;
| &amp;lt;br /&amp;gt;镜像：https://hub.docker.com/_/node/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===制作镜像===&lt;br /&gt;
当docker镜像仓库没有想要的镜像，可以通过以下两种方式制作镜像。&lt;br /&gt;
*在已有容器中修改，再提交保存为新镜像。&lt;br /&gt;
*使用Dockerfile文件，从头创建一个新的镜像。&lt;br /&gt;
&lt;br /&gt;
====容器打包为镜像====&lt;br /&gt;
修改容器，通过命令 docker commit 将容器打包为新镜像。如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#启动一个名称ubuntu-18为容器，并进入容器终端&lt;br /&gt;
docker run --name ubuntu-18 -it ubuntu:18.04 /bin/bash&lt;br /&gt;
&lt;br /&gt;
#在容器内修改，如更新软件，&lt;br /&gt;
apt-get update &lt;br /&gt;
&lt;br /&gt;
#退出这个容器&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
#提交打包镜像&lt;br /&gt;
docker commit ubuntu-18 ubuntu-updated &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Dockerfile创建镜像====&lt;br /&gt;
Docker可以自动读取Dockerfile文件里的指令生成一个镜像。Dockerfile是一个文本文件，都是一些关于组装镜像的指令。通过docker build命令来生成一个镜像。&lt;br /&gt;
&lt;br /&gt;
====Dockerfile语法====&lt;br /&gt;
Dockerfile文件格式如下：&lt;br /&gt;
 # Comment 注释&lt;br /&gt;
 INSTRUCTION arguments&lt;br /&gt;
&lt;br /&gt;
注释使用#号，指令不区分大小写，但一般指令使用大写，这样容易和后面参数区分开来。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Dockerfile指令====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
!指令!!格式!!描述!!示例&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#from FROM]&lt;br /&gt;
|FROM [--platform=&amp;lt;platform&amp;gt;] &amp;lt;image&amp;gt;[:&amp;lt;tag&amp;gt;] [AS &amp;lt;name&amp;gt;]&lt;br /&gt;
|初始化，设置基准镜像。这个指令必须放开头。&lt;br /&gt;
|FROM debian:buster-slim&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#run RUN]&lt;br /&gt;
|RUN &amp;lt;command&amp;gt; 或 RUN [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]&lt;br /&gt;
|执行命令&lt;br /&gt;
|RUN /bin/bash -c &#039;source $HOME/.bashrc; echo $HOME&#039;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#cmd CMD]&lt;br /&gt;
|CMD [&amp;quot;param1&amp;quot;,&amp;quot;param2&amp;quot;]&amp;lt;br \&amp;gt; CMD command param1 param2 &amp;lt;br \&amp;gt;  CMD [&amp;quot;executable&amp;quot;,&amp;quot;param1&amp;quot;,&amp;quot;param2&amp;quot;] &lt;br /&gt;
|容器启动时执行的命令。该指令只能有一个，当有多个RUN指令只会执行最后一个&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#label LABEL]&lt;br /&gt;
|LABEL &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; ...&lt;br /&gt;
|给镜像添加元数据。如添加一些作者信息，版本信息等。可以使用docker image inspect命令查看镜像所有信息，包括标签。&lt;br /&gt;
|LABEL maintainer=&amp;quot;yourname@domain.com&amp;quot; version=&amp;quot;1.0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#expose EXPOSE]&lt;br /&gt;
|EXPOSE &amp;lt;port&amp;gt; [&amp;lt;port&amp;gt;/&amp;lt;protocol&amp;gt;...]&lt;br /&gt;
|开放容器某个端口，默认协议为TCP。运行主机可以通过docker run命令增加-p参数来对接这个端口。&lt;br /&gt;
|EXPOSE 80/udp&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#env ENV]&lt;br /&gt;
|ENV &amp;lt;key&amp;gt; &amp;lt;value&amp;gt; &amp;lt;br \&amp;gt;ENV &amp;lt;key&amp;gt;=&amp;lt;value&amp;gt; ...&lt;br /&gt;
|设置环境变量&lt;br /&gt;
|ENV myName John Doe&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#add ADD]&lt;br /&gt;
|ADD [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt; &amp;lt;br \&amp;gt;ADD [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] [&amp;quot;&amp;lt;src&amp;gt;&amp;quot;,... &amp;quot;&amp;lt;dest&amp;gt;&amp;quot;]&lt;br /&gt;
|复制文件、目录或URLs到镜像中。src的路径支持Go语言的filepath.Match规则。&lt;br /&gt;
|ADD test.txt /etc/test/ &amp;lt;br \&amp;gt;拷贝主机的test.txt文件到镜像/etc/test/目录中&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#copy COPY]&lt;br /&gt;
|COPY [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] &amp;lt;src&amp;gt;... &amp;lt;dest&amp;gt;  &amp;lt;br \&amp;gt;COPY [--chown=&amp;lt;user&amp;gt;:&amp;lt;group&amp;gt;] [&amp;quot;&amp;lt;src&amp;gt;&amp;quot;,... &amp;quot;&amp;lt;dest&amp;gt;&amp;quot;]&lt;br /&gt;
|复制文件或目录到镜像中。src的路径支持Go语言的filepath.Match规则。&lt;br /&gt;
|COPY test.txt /etc/test/ &amp;lt;br \&amp;gt;拷贝主机的test.txt文件到镜像/etc/test/目录中&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#entrypoint ENTRYPOINT]&lt;br /&gt;
|ENTRYPOINT [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]  &amp;lt;br \&amp;gt;ENTRYPOINT command param1 param2&lt;br /&gt;
|容器启动时执行的命令。&lt;br /&gt;
|ENTRYPOINT [&amp;quot;top&amp;quot;, &amp;quot;-b&amp;quot;]&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#volume VOLUME]&lt;br /&gt;
|VOLUME [&amp;quot;/data&amp;quot;]&lt;br /&gt;
|创建挂载点&lt;br /&gt;
|VOLUME /myvol&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#user USER]&lt;br /&gt;
|USER &amp;lt;user&amp;gt;[:&amp;lt;group&amp;gt;] &amp;lt;br \&amp;gt;USER &amp;lt;UID&amp;gt;[:&amp;lt;GID&amp;gt;]&lt;br /&gt;
|设置启动容器的用户，可以是用户名或UID。&lt;br /&gt;
|USER username&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#workdir WORKDIR]&lt;br /&gt;
|WORKDIR /path/to/workdir&lt;br /&gt;
|设置工作目录，对RUN, CMD, ENTRYPOINT, COPY 和 ADD指令有效。&lt;br /&gt;
|WORKDIR /home/foo/work&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#arg ARG]&lt;br /&gt;
|ARG &amp;lt;name&amp;gt;[=&amp;lt;default value&amp;gt;]&lt;br /&gt;
|设置构建镜像时变量，构建docker build时使用--build-arg &amp;lt;varname&amp;gt;=&amp;lt;value&amp;gt;传递变量值。&lt;br /&gt;
|ARG user1=someuser&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#onbuild ONBUILD]&lt;br /&gt;
|ONBUILD &amp;lt;INSTRUCTION&amp;gt;&lt;br /&gt;
|设置触发指令，当该镜像作为基准镜像，构建时执行。&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#stopsignal STOPSIGNAL]&lt;br /&gt;
|STOPSIGNAL signal&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#healthcheck HEALTHCHECK]&lt;br /&gt;
|HEALTHCHECK [OPTIONS] CMD command &amp;lt;br \&amp;gt;HEALTHCHECK NONE&lt;br /&gt;
|告诉dockers该镜像的容器正常工作状况&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/builder/#shell SHELL]&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====docker build构建镜像====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
| [https://docs.docker.com/engine/reference/builder/ Docker参考：Dockerfile]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 容器 ==&lt;br /&gt;
容器（Container）是运行在镜像之上，运行容器时会复制镜像然后启动。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/run/ docker run]&lt;br /&gt;
| &#039;&#039;&#039;运行容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;docker run [参数] 镜像 [COMMAND] [ARG...]&amp;lt;br /&amp;gt;从镜像启动一个新容器。该命令会检查本地是否有镜像，没有就从docker仓库中下载。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--name&amp;lt;/code&amp;gt; 容器命名，如&amp;lt;code&amp;gt;--name test&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--restart&amp;lt;/code&amp;gt; 重启策略，如停止后自动重启：&amp;lt;code&amp;gt;--restart=always&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-P&amp;lt;/code&amp;gt; 绑定端口  &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt; 挂载&lt;br /&gt;
| &amp;lt;code&amp;gt;docker run -it ubuntu&amp;lt;/code&amp;gt;使用 ubuntu 镜像启动一个容器 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker run -it ubuntu /bin/bash&amp;lt;/code&amp;gt;启动一个ubuntu容器，并进入终端。要退出容器里的终端输入exit。&amp;lt;code&amp;gt;docker run -itd --name ubuntu-test ubuntu /bin/bash&amp;lt;/code&amp;gt;启动一个名称ubuntu-test为容器，并后台运行。参数-d表示后台运行。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/update/ docker update] &lt;br /&gt;
| &#039;&#039;&#039;更新容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;动态更新容器配置。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--memory&amp;lt;/code&amp;gt; , &amp;lt;code&amp;gt;-m&amp;lt;/code&amp;gt; 内存限制 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--restart&amp;lt;/code&amp;gt; 重启策略&lt;br /&gt;
| &amp;lt;code&amp;gt;docker update --restart=unless-stopped mynginx&amp;lt;/code&amp;gt; 配置mynginx容器重启策略为unless-stopped&lt;br /&gt;
|-&lt;br /&gt;
| docker start&lt;br /&gt;
| &#039;&#039;&#039;启动容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;启动已经停止的容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker start dw3342531d3&amp;lt;/code&amp;gt; 启动一个容器id为dw3342531d3的容器。&lt;br /&gt;
|- &lt;br /&gt;
| docker restart&lt;br /&gt;
|&#039;&#039;&#039;重启容器&#039;&#039;&#039; &amp;lt;br /&amp;gt;重启正在运行的容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker restart ubuntu-test&amp;lt;/code&amp;gt; 重启容器ubuntu-test。&lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/ps/ docker ps]&lt;br /&gt;
|&#039;&#039;&#039;查看本地容器列表&#039;&#039;&#039; &amp;lt;br /&amp;gt;重启正在运行的容器。&amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;--no-trunc&amp;lt;/code&amp;gt; 显示完整内容，不截断。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker ps&amp;lt;/code&amp;gt;查看正在运行的容器&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker ps -a&amp;lt;/code&amp;gt;查看所用容器，包括停止的 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker ps --no-trunc&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/inspect/ docker inspect]&lt;br /&gt;
|&#039;&#039;&#039;查看容器信息&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。 &amp;lt;br \&amp;gt;&amp;lt;br \&amp;gt;常用参数：&amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;-f, --format &amp;lt;/code&amp;gt; 使用Go语言template格式化输出。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker inspect ubuntu-test&amp;lt;/code&amp;gt; 查看ubuntu-test容器信息 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect --format=&#039;{{.NetworkSettings.IPAddress}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器ip &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{.Name}} - {{range .NetworkSettings.Networks }} {{.IPAddress}} {{end}}&#039; $(docker ps -aq)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看所有容器ip地址。 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器MAC &amp;lt;br \&amp;gt; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect --format=&#039;{{.LogPath}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器的log地址 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;docker inspect -f &#039;{{.Config.Image}}&#039; test2&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 查看test2容器的镜像名称 &lt;br /&gt;
|- &lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/stats/ docker stats]&lt;br /&gt;
|&#039;&#039;&#039;实时统计容器使用资源&#039;&#039;&#039; &amp;lt;br \&amp;gt;统计容器使用主机CUP、内存的百分比，通过网络发送和接收的数据量，从主机上的块设备读取和写入的数据量。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker stats&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/logs/ docker logs]&lt;br /&gt;
|&#039;&#039;&#039;查看容器日志&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器内部的标准输出。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker logs ubuntu-test&amp;lt;/code&amp;gt;查看ubuntu-test容器内部的标准输出 &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker logs -f ubuntu-test&amp;lt;/code&amp;gt;跟踪日志输出&lt;br /&gt;
|-&lt;br /&gt;
| docker top&lt;br /&gt;
|&#039;&#039;&#039;查看容器进程&#039;&#039;&#039;&amp;lt;br /&amp;gt;查看容器内部运行的进程&lt;br /&gt;
| &amp;lt;code&amp;gt;docker top static_web&amp;lt;/code&amp;gt; 查看static_web容器内部运行的进程&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/exec/ docker exec]&lt;br /&gt;
|&#039;&#039;&#039;运行命令&#039;&#039;&#039;&amp;lt;br /&amp;gt;在容器中运行命令。该命令退出容器终端，容器不会停止。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker exec ubuntu-test ls&amp;lt;/code&amp;gt;在ubuntu-test容器工作目录运行ls命令 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -it ubuntu-test bash&amp;lt;/code&amp;gt;进入ubuntu-test容器交互式终端 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker exec -u 0 -it test bash&amp;lt;/code&amp;gt;以root用户进入名称为test的容器&lt;br /&gt;
|-&lt;br /&gt;
| docker attach&lt;br /&gt;
|&#039;&#039;&#039;附着终端&#039;&#039;&#039;&amp;lt;br /&amp;gt;将本地终端标准输入、输出和错误流连接到运行的容器中。该命令退出容器终端，容器会停止，推荐使用&amp;lt;code&amp;gt;docker exec -it&amp;lt;/code&amp;gt;。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker attach ubuntu-test&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|docker stop&lt;br /&gt;
|&#039;&#039;&#039;停止容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;停止运行中的容器&lt;br /&gt;
|&amp;lt;code&amp;gt;docker stop dw3342531d3&amp;lt;/code&amp;gt; #停止一个id为dw3342531d3的容器 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker stop $(docker ps -a -q)&amp;lt;/code&amp;gt;停止所有运行中的容器&lt;br /&gt;
|-&lt;br /&gt;
|docker rm &lt;br /&gt;
|&#039;&#039;&#039;删除容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;删除容器，需要容器停止运行。参数-f表示强制删除，可以不用等容器停止后再删除。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker rm ubuntu-test&amp;lt;/code&amp;gt;删除ubuntu-test容器&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker rm -f ubuntu-test&amp;lt;/code&amp;gt;强制删除ubuntu-test容器&amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker rm -f $(docker ps -a -q)&amp;lt;/code&amp;gt;&#039;&#039;&#039;注意，该命令会强制删除所有容器&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|docker container prune&lt;br /&gt;
|&#039;&#039;&#039;清理容器&#039;&#039;&#039;&amp;lt;br /&amp;gt;删除所有停止的容器。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker container prune&amp;lt;/code&amp;gt;删除所有停止的容器。&lt;br /&gt;
|-&lt;br /&gt;
|docker commit &lt;br /&gt;
|&#039;&#039;&#039;容器构建镜像&#039;&#039;&#039;&amp;lt;br /&amp;gt;将容器打包为一个镜像。&lt;br /&gt;
|&amp;lt;code&amp;gt;docker commit ubuntu-test ubuntu-updated&amp;lt;/code&amp;gt;#将ubuntu-test容器打包为一个名称为ubuntu-updated镜像。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 仓库 ==&lt;br /&gt;
仓库（Repository）是集中存放镜像的地方。 Docker的官方镜像仓库为[https://hub.docker.com/ Docker Hub]，公共仓库为免费，私有仓库需要付费使用。&lt;br /&gt;
&lt;br /&gt;
===Docker Hub===&lt;br /&gt;
大部分需求都可以通过在Docker Hub中直接下载镜像来实现。在[https://hub.docker.com https://hub.docker.com]免费注册一个 Docker 账号。接下来可以在终端操作&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#登录使用docker login，再输入账号密码&lt;br /&gt;
docker login&lt;br /&gt;
&lt;br /&gt;
#在Docker Hub仓库中搜索使用docker search，这命令可以不登录。&lt;br /&gt;
docker search ubuntu&lt;br /&gt;
&lt;br /&gt;
#下载镜像使用docker pull，这命令可以不登录。&lt;br /&gt;
docker pull ubuntu&lt;br /&gt;
&lt;br /&gt;
#上传镜像使用docker push，需要登录再使用。username为个人的账户名&lt;br /&gt;
docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
#退出使用docker logout&lt;br /&gt;
docker logout&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
可能出现问题：&lt;br /&gt;
*登录时出现：Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`&lt;br /&gt;
执行下面命令即可：sudo apt install gnupg2 pass&lt;br /&gt;
&lt;br /&gt;
*docker push报错：denied: requested access to the resource is denied&lt;br /&gt;
镜像名和用户名不匹配，使用tag将镜像名改为username/镜像名，username为个人的用户名，然后再推送，如：&lt;br /&gt;
 docker tag ubuntu:18.04 username/ubuntu:18.04&lt;br /&gt;
 docker push username/ubuntu:18.04&lt;br /&gt;
&lt;br /&gt;
===其他公有镜像仓库===&lt;br /&gt;
==== 常用仓库 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 提供方&lt;br /&gt;
! 仓库地址&lt;br /&gt;
! 描述&lt;br /&gt;
! 网址&lt;br /&gt;
|-&lt;br /&gt;
| 阿里云&lt;br /&gt;
| https://xxxxxxxx.mirror.aliyuncs.com&lt;br /&gt;
| 需要注册阿里云，在镜像加速器可以看到仓库地址。&lt;br /&gt;
| [https://cr.console.aliyun.com/ 官网] [https://developer.aliyun.com/article/110806 文档]&lt;br /&gt;
|- &lt;br /&gt;
| 网易&lt;br /&gt;
| https://hub.c.163.com&lt;br /&gt;
| &lt;br /&gt;
| [https://sf.163.com/help/documents/56918246390157312 文档]&lt;br /&gt;
|- &lt;br /&gt;
| 百度云&lt;br /&gt;
| https://mirror.baidubce.com&lt;br /&gt;
| &lt;br /&gt;
|[https://cloud.baidu.com/doc/CCE/s/Yjxppt74z#如何使用dockerhub镜像加速器 文档]&lt;br /&gt;
|- &lt;br /&gt;
| Google&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|[https://cloud.google.com/container-registry/docs/pulling-cached-images 文档]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 使用方法 ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 方法&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 拉取时指定仓库&lt;br /&gt;
| 单次有效 &amp;lt;br \&amp;gt;仓库地址不包含协议(如&amp;lt;code&amp;gt;https://&amp;lt;/code&amp;gt;)，公有镜像仓库一般使用&amp;lt;code&amp;gt;library&amp;lt;/code&amp;gt;。&amp;lt;br \&amp;gt;如指定阿里镜像仓库拉取ubuntu： &amp;lt;br \&amp;gt;&amp;lt;code&amp;gt;docker pull xxxxxxxx.mirror.aliyuncs.com/library/ubuntu&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| 编辑配置文件&lt;br /&gt;
| 永久有效 &amp;lt;br \&amp;gt;步骤：&amp;lt;br \&amp;gt;1.编辑配置文件，&amp;lt;code&amp;gt;sudo vim /etc/docker/daemon.json&amp;lt;/code&amp;gt;，输入如下内容&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;registry-mirrors&amp;quot;: [&lt;br /&gt;
    &amp;quot;https://hub-mirror.c.163.com&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2.重启docker服务，&amp;lt;code&amp;gt;sudo service docker restart&amp;lt;/code&amp;gt; &amp;lt;br \&amp;gt;3.查看是否成功，&amp;lt;code&amp;gt;docker info&amp;lt;/code&amp;gt; 输出含有Registry Mirrors&lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===搭建私有镜像仓库===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# 运行一个本地仓库&lt;br /&gt;
docker run -d -p 5000:5000 --restart always --name registry registry:3&lt;br /&gt;
&lt;br /&gt;
# 现在，在Docker里使用，如推送，拉取&lt;br /&gt;
docker pull ubuntu&lt;br /&gt;
docker tag ubuntu localhost:5000/ubuntu&lt;br /&gt;
docker push localhost:5000/ubuntu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*https://hub.docker.com/_/registry&lt;br /&gt;
*https://distribution.github.io/distribution/&lt;br /&gt;
===镜像dockehub镜像仓库===&lt;br /&gt;
使用 Docker 启动 Registry 镜像加速服务&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo docker run -d \&lt;br /&gt;
  --name dockerhub \&lt;br /&gt;
  --restart=always \&lt;br /&gt;
  -p 443:5000 \&lt;br /&gt;
  -v /data/docker-registry:/var/lib/registry \&lt;br /&gt;
  -v /your/domain/certs:/certs \&lt;br /&gt;
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.cer \&lt;br /&gt;
  -e REGISTRY_HTTP_TLS_KEY=/certs/docker.yourdomain.com.key \&lt;br /&gt;
  -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \&lt;br /&gt;
  registry:3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在其他电脑测试拉取镜像：&lt;br /&gt;
 sudo docker pull yourdomain.com/library/hello-world&lt;br /&gt;
&lt;br /&gt;
成功拉取后，可以配置 Docker 的默认镜像地址方便使用，没有成功查看运行日志&amp;lt;code&amp;gt;sudo docker logs dockerhub&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
进阶版本，使用registry + Nginx + HTTPS进行镜像加速。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*https://hub.docker.com/_/registry&lt;br /&gt;
*https://distribution.github.io/distribution/&lt;br /&gt;
&lt;br /&gt;
==网络==&lt;br /&gt;
===概览===&lt;br /&gt;
Docker的网络是可拔插的子系统，使用驱动程序。docker内置了几个驱动程序，提供了核心网络功能。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 网络模式&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 桥接模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/bridge/ bridge]&lt;br /&gt;
| bridge是默认的桥接网络，当没有指定网络驱动，新启动的容器会连接到这个名称为bridge的bridge网络。也可以自定义一个网桥，只有连接到该网络的容器才能相互通信，从而起到隔离效果。自定义的网桥可以动态的连接或断开。&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;创建自定义网桥：&amp;lt;code&amp;gt;docker network create 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;删除自定义网桥：&amp;lt;code&amp;gt;docker network rm 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;查看网桥详细信息：&amp;lt;code&amp;gt;docker network inspect 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;容器启动时连接到网桥：&amp;lt;code&amp;gt;--network 网桥名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;运行中的容器连接到网桥：&amp;lt;code&amp;gt;docker network connect 网桥名称 容器名称&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;断开容器与网桥：&amp;lt;code&amp;gt;docker network disconnect 网桥名称 容器名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt; 注意：默认网桥bridge的&amp;lt;code&amp;gt;--link&amp;lt;/code&amp;gt;命令已不建议使用，后面版本可能会被删除。默认网桥bridge内容器只能通过ip地址通信，需要添加&amp;lt;code&amp;gt;--link&amp;lt;/code&amp;gt; 来添加名称，而自定义网桥可以使用容器名称或设置别名来通信。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker network rm my-net&amp;lt;/code&amp;gt;创建自定义网桥my-net &amp;lt;br /&amp;gt;  &lt;br /&gt;
|- &lt;br /&gt;
| 主机模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/host/ host]&lt;br /&gt;
| 当使用host网络模式，容器共享主机的网络命名空间，而且容器不会分配自己的 IP 地址。如果容器中某个程序绑定到端口，直接访问主机的该端口即可。该模式端口全部暴露，端口映射不生效，即-p、--publish、-P和--publish-all选项都将被忽略。主机模式网络可用于优化性能，并且在容器需要处理大量端口的情况下，因为它不需要网络地址转换 (NAT)，并且没有为每个端口创建“用户空间代理”。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;容器启动时设置：&amp;lt;code&amp;gt;--network host&amp;lt;/code&amp;gt;或 &amp;lt;code&amp;gt;--net=host&amp;lt;/code&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 覆盖模式 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/overlay/ overlay]&lt;br /&gt;
| 跨主机的分布式网络。该模式允许连接到它的容器（包括群服务容器）通过加密安全地通信。&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/network/macvlan/ macvlan]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| [https://docs.docker.com/network/ipvlan/ ipvlan]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 禁用网络 &amp;lt;br /&amp;gt;[https://docs.docker.com/network/none/ none]&lt;br /&gt;
| 禁用容器的网络。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;容器启动时设置：&amp;lt;code&amp;gt;--network none&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 网络插件 [https://docs.docker.com/engine/extend/plugins_services/#network-plugins Network plugins]&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/network/ Docker 文档：网络概览]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==数据==&lt;br /&gt;
===概览===&lt;br /&gt;
默认情况下，所有文件将会存储在容器里的可写的容器层（container layer）。意味着：&lt;br /&gt;
* 数据与容器为一体。当容器删除时，数据会一起被删除。&lt;br /&gt;
* 该容器与其他程序（容器）数据交换难。&lt;br /&gt;
* 由于容器的写入层是与宿主机器紧紧耦合，所以难以移动数据到其他机器。&lt;br /&gt;
* 容器的写入层的是通过 存储驱动（storage driver） 管理文件系统。存储驱动会使用Linux内核的 链合文件系统（union filesystem）进行挂载。相比起直接操作于宿主机器文件系统的 数据卷（data volumes），这额外的抽象层将会降低性能。&lt;br /&gt;
&lt;br /&gt;
Docker提供两种将数据存储在宿主机的方法：&#039;&#039;&#039;数据卷（volumes）&#039;&#039;&#039;和 &#039;&#039;&#039;绑定挂载（bind mounts）&#039;&#039;&#039;。另外，Linux用户还可使用&#039;&#039;&#039;tmpfs 挂载&#039;&#039;&#039;；window用户还可以使用 命名管道（named pipe）。可用参数 &amp;lt;code&amp;gt;-v&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;--mount &amp;lt;/code&amp;gt;来使用数据卷或绑定挂载，一般推荐--mount，更明确和详细。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/ Docker 文档：Docker上管理数据]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 数据存储类型 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 类型&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| 数据卷 &amp;lt;br /&amp;gt; [https://docs.docker.com/storage/volumes/ volumes]&lt;br /&gt;
| Docker 推荐的容器数据持久化方法，volumes完全由 Docker 管理。分为命名卷和匿名卷， 匿名卷在容器删除时会被 Docker 引擎删除，或者启动容器时加入--rm时，容器退出匿名卷会自动删除。&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;创建数据卷：&amp;lt;code&amp;gt;docker volume create 卷名称&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;列出数据卷： &amp;lt;code&amp;gt;docker volume ls&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;数据卷详细信息：&amp;lt;code&amp;gt;docker volume inspect 卷名称 &amp;lt;/code&amp;gt;  &amp;lt;br /&amp;gt;启动容器时连接卷（不存在卷会自动创建）：&amp;lt;code&amp;gt;--mount source=卷名称,target=/容器的/目录&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 卷名称:/容器的/目录 &amp;lt;/code&amp;gt;  &amp;lt;br /&amp;gt;启动容器时连接匿名卷：&amp;lt;code&amp;gt;-v /容器的/目录&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;删除卷：&amp;lt;code&amp;gt;docker volume rm 卷名称&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;清理没有使用的卷：&amp;lt;code&amp;gt;docker volume prune&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|- &lt;br /&gt;
| 绑定挂载&amp;lt;br /&amp;gt; [https://docs.docker.com/storage/bind-mounts/ bind mounts]&lt;br /&gt;
| 将主机上的文件或目录挂载到容器中。主机的路径可以是相对路径。 &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;启动容器时绑定挂载：&amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt;只读绑定挂载：&amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录,readonly&amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录:ro&amp;lt;/code&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|tmpfs 挂载 &amp;lt;br /&amp;gt;[https://docs.docker.com/storage/tmpfs/ tmpfs mounts]&lt;br /&gt;
|tmpfs挂载是临时的，仅保留在主机内存中。当容器停止时，tmpfs挂载被移除，写入的文件不会被持久化。这对于临时存储您不想保留在主机或容器可写层中的敏感文件很有用。&amp;lt;br /&amp;gt;可用命令 &amp;lt;code&amp;gt;-tmpfs &amp;lt;/code&amp;gt; 或 &amp;lt;code&amp;gt;--mount &amp;lt;/code&amp;gt; &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/ Docker 文档：Docker上管理数据]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== -v和--mount 参数 ===&lt;br /&gt;
使用命令 &amp;lt;code&amp;gt;docker inspect 容器名称&amp;lt;/code&amp;gt; 可以查看容器详情，其中Mounts部分可以看到容器的挂载详细情况。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;width: 100%;&lt;br /&gt;
! 参数&lt;br /&gt;
! -v 或 --volume&lt;br /&gt;
! --mount&lt;br /&gt;
|-&lt;br /&gt;
! 特点&lt;br /&gt;
| 简洁，但有时出现混乱。&lt;br /&gt;
| 类型指定明确，推荐写法。&lt;br /&gt;
|-&lt;br /&gt;
! 支持类型 &lt;br /&gt;
| &amp;lt;code&amp;gt;volumes&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;bind mounts&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;volumes&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;bind mounts&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;tmpfs&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! volumes&lt;br /&gt;
| &amp;lt;code&amp;gt;-v 卷名称:/容器的/目录 &amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount source=卷名称,target=/容器的/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! bind mounts&lt;br /&gt;
| &amp;lt;code&amp;gt;-v 主机/目录:/容器/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount type=bind,source=主机/目录,target=/容器/目录&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
! tmpfs mounts&lt;br /&gt;
| 不支持&lt;br /&gt;
| &amp;lt;code&amp;gt;--mount type=tmpfs,destination=/app&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/storage/volumes/  Docker 文档：Use volumes]&lt;br /&gt;
|[https://docs.docker.com/storage/bind-mounts/  Docker 文档：Use bind mounts]&lt;br /&gt;
|[https://docs.docker.com/storage/tmpfs/ Docker 文档：Use tmpfs mounts]&lt;br /&gt;
}}&lt;br /&gt;
== 命令行 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/system/ docker system]&lt;br /&gt;
| 管理docker 。 如使用docker system prune能清理docker占用的磁盘空间，包括不使用的空间，构建镜像时的缓存等。&lt;br /&gt;
| docker system prune -a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/reference/commandline/cli/ Docker 文档：使用 Docker 命令行]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Compose==&lt;br /&gt;
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose，您可以使用[[YML]]文件来配置应用程序需要的所有服务。然后，使用一个命令，就可以从[[YML]]文件配置中创建并启动所有服务。 &lt;br /&gt;
=== 安装===&lt;br /&gt;
====版本====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Compose 旧版&lt;br /&gt;
| docker-compose&lt;br /&gt;
| Compose 旧版为独立版，下载可执行文件使用。&lt;br /&gt;
|-&lt;br /&gt;
| Compose V2&lt;br /&gt;
| docker compose&lt;br /&gt;
| Compose V2也叫Compose插件版，作为插件和docker集成，安装升级方便。新版也提供更多的功能。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/ Docker Compose 文档]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Compose V2安装====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
# Ubuntu and Debian 安装&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install docker-compose-plugin&lt;br /&gt;
&lt;br /&gt;
# RPM-based distros 安装&lt;br /&gt;
sudo yum update&lt;br /&gt;
sudo yum install docker-compose-plugin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/install/ Docker 文档：安装Docker Compose]&lt;br /&gt;
}}&lt;br /&gt;
====Compose 旧版安装====&lt;br /&gt;
以Linux系统为例，使用&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;命令在终端从GitHub上下载[https://github.com/docker/compose/releases Docker Compose]二进制文件。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line=&#039;line&#039;&amp;gt;&lt;br /&gt;
# 查看系统类型&lt;br /&gt;
echo $(uname -s)-$(uname -m)&lt;br /&gt;
&lt;br /&gt;
# GitHub上右键复制系统对应版本，如linux-x86_64。 如下载当前最新版compose 2.2.2 &lt;br /&gt;
sudo curl -L &amp;quot;https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64&amp;quot; -o /usr/local/bin/docker-compose&lt;br /&gt;
&lt;br /&gt;
# 为compose程序文件添加执行权限&lt;br /&gt;
sudo chmod +x /usr/local/bin/docker-compose&lt;br /&gt;
&lt;br /&gt;
# 查看compose版本，验证是否安装成功&lt;br /&gt;
docker-compose --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/install/other/ Docker 文档：安装 Compose 独立版]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 快速入门 ===&lt;br /&gt;
&lt;br /&gt;
===Compose 命令===&lt;br /&gt;
进入&amp;lt;code&amp;gt;docker-compose.yml&amp;lt;/code&amp;gt;配置文件所在目录，执再行命令。 &lt;br /&gt;
常用选项：&lt;br /&gt;
* -f, --file 指定其他名称配置文件。 如：&amp;lt;code&amp;gt;docker compose -f docker-compose.prod.yml up&amp;lt;/code&amp;gt;&lt;br /&gt;
*-p, --project-name 制定项目名称。如：&amp;lt;code&amp;gt;docker compose -p myproject up&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compose 常用命令：&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 命令&lt;br /&gt;
! 描述&lt;br /&gt;
! 示例&lt;br /&gt;
|-&lt;br /&gt;
| [https://docs.docker.com/engine/reference/commandline/compose_up/ up]&lt;br /&gt;
| 自动执行一些列操作：构建镜像、创建服务、启动服务和关联服务相关容器。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose up&amp;lt;/code&amp;gt;   &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker compose up -d&amp;lt;/code&amp;gt; &amp;lt;br /&amp;gt; &amp;lt;code&amp;gt;docker compose -f docker-compose.dev.yml up --build &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| stop&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| logs&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;logs&amp;lt;/code&amp;gt;默认以不同颜色显示服务内容器的日志。&lt;br /&gt;
|-&lt;br /&gt;
|  config&lt;br /&gt;
| 显示 Docker Compose 配置，包括环境变量。&lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose config&amp;lt;/code&amp;gt; 查看当前目录docker-compose.yml配置  &amp;lt;code&amp;gt;docker-compose -f docker-compose.dev.yml config&amp;lt;/code&amp;gt; 查看当前docker-compose.dev.yml配置&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| rm&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;code&amp;gt;docker compose rm -f&amp;lt;/code&amp;gt; 强制删除服务内容器。 &amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;docker rm -f $(docker compose ps -a -q)&amp;lt;/code&amp;gt; 删除服务内所有容器。&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/compose/reference/ Docker 文档：docker compose CLI ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Swarm Mode==&lt;br /&gt;
Swarm Mode是Docker集群管理工具，从Docker1.2开始Docker Swarm内置到Docker中为Swarm Mode。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://docs.docker.com/engine/swarm/ Docker文档-Swarm mode]&lt;br /&gt;
}}&lt;br /&gt;
==安全==&lt;br /&gt;
&lt;br /&gt;
==国内加速==&lt;br /&gt;
=== Docker CE镜像 ===&lt;br /&gt;
用于安装docker社区版软件。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 中国科学技术大学 USTC&lt;br /&gt;
| 手动安装时把 download.docker.com 地址换成 mirrors.ustc.edu.cn/docker-ce 即可 。&amp;lt;br /&amp;gt; 地址：https://mirrors.ustc.edu.cn/docker-ce/ &amp;lt;br /&amp;gt;文档：https://mirrors.ustc.edu.cn/help/docker-ce.html&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
=== Docker Hub镜像 ===&lt;br /&gt;
&lt;br /&gt;
=== 周边加速 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Dockerfile中apt更换软件源&lt;br /&gt;
| Debian换阿里源： &amp;lt;code&amp;gt;RUN  sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Github镜像网站&lt;br /&gt;
| kgithub.com ： 将Dockerfile中的github.com换成kgithub.com&lt;br /&gt;
|-&lt;br /&gt;
| 设置DNS&lt;br /&gt;
| echo &amp;quot;nameserver 8.8.8.8&amp;quot; | sudo tee /etc/resolv.conf &amp;gt; /dev/null&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==实例==&lt;br /&gt;
====Docker安装Nginx====&lt;br /&gt;
&lt;br /&gt;
====Docker安装Flask====&lt;br /&gt;
[[Flask]]是一个使用[[Python]]编写的轻量级Web应用框架。下面使用Dockerfile生成一个简单flask镜像，并启动。 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#创建一个文件夹来保存项目&lt;br /&gt;
mkdir hello_flask&lt;br /&gt;
#利用 cd 命令切换到这个目录&lt;br /&gt;
cd hello_flask &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;接下来使用vim app.py命令创建一个app.py文件，内容如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from flask import Flask&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&#039;/&#039;)&lt;br /&gt;
def hello_world():&lt;br /&gt;
    return &#039;Hello, World!&#039;&lt;br /&gt;
&lt;br /&gt;
if __name__==&#039;__main__&#039;:&lt;br /&gt;
    app.run(debug=True, host=&#039;0.0.0.0&#039;) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;然后使用vim Dockerfile命令创建一个Dockerfile文件，内容如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
FROM python:alpine&lt;br /&gt;
&lt;br /&gt;
COPY . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
RUN pip install Flask&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;python&amp;quot;]&lt;br /&gt;
CMD [&amp;quot;app.py&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;现在hello_flask文件夹下有两个文件app.py和Dockerfile，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#在hello_flask文件夹下使用docker build命令生成镜像&lt;br /&gt;
docker build -t flask:1.1.1-min .&lt;br /&gt;
&lt;br /&gt;
#使用 docker run 命令运行刚刚创建的镜像：&lt;br /&gt;
docker run --name flask -d -p 8080:5000 flask:1.1.1-min&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
现在在浏览器打开ip;10000,可以看到Hello, World!&lt;br /&gt;
&lt;br /&gt;
可以使用-v命令，把当前路径挂载到容器的/app目录，$PWD表示当前目录，比如现在的hello_flask。&lt;br /&gt;
 docker run --name flask2 -d -p 8080:5000 -v $PWD:/app flask:1.1.1-min&lt;br /&gt;
在浏览器打开ip:8080可以看到“Hello, World!”，挂载后在主机中的hello_flask修改app.py，刷新网页就会看到更新的内容。修改文件时候要使用root权限不然会报错，sudo vim app.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Docker安装Mediawiki====&lt;br /&gt;
[[Mediawiki]]全球最著名的开源wiki程序，维基百科也使用该软件。&lt;br /&gt;
&lt;br /&gt;
方法一：利用Docker Hub上现成镜像&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#运行mediawiki镜像，没有就从docker hub下载mediawiki再运行&lt;br /&gt;
docker run --name some-mediawiki -p 8080:80 -d mediawiki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;{{了解更多&lt;br /&gt;
|[https://hub.docker.com/_/mediawiki Docker Hub：Mediawiki ]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*Docker 官网：https://www.docker.com&lt;br /&gt;
*Docker Hub：https://hub.docker.com/&lt;br /&gt;
*Docker 文档：https://docs.docker.com&lt;br /&gt;
*Docker 文档 &amp;gt; 参考：https://docs.docker.com/reference &lt;br /&gt;
*Docker 文档 &amp;gt; 示例：https://docs.docker.com/samples&lt;br /&gt;
*Docker CE 的 Github：https://github.com/docker/docker-ce&lt;br /&gt;
&lt;br /&gt;
===相关网页===&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/Docker 维基百科：Docker]&lt;br /&gt;
*[https://zh.wikipedia.org/wiki/操作系统层虚拟化 维基百科：操作系统层虚拟化]&lt;br /&gt;
&lt;br /&gt;
[[分类:编程工具]]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=%E6%99%BA%E8%83%BD%E9%9F%B3%E7%AE%B1&amp;diff=1750</id>
		<title>智能音箱</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=%E6%99%BA%E8%83%BD%E9%9F%B3%E7%AE%B1&amp;diff=1750"/>
		<updated>2026-04-15T16:18:12Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 文本转语音 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能音箱是一种内置语音助手的智能音响，可以接收语音指令，进行播放音乐、对话问答，控制家庭设备等。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==常见产品==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 产品&lt;br /&gt;
! 虚拟助手&lt;br /&gt;
! 公司&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 天猫精灵 &lt;br /&gt;
| [https://www.aligenie.com/ AliGenie] &lt;br /&gt;
| 阿里巴巴&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 小度&lt;br /&gt;
| [https://dueros.baidu.com/open DuerOS]&lt;br /&gt;
| 百度&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 小爱同学&lt;br /&gt;
| [https://developers.xiaoai.mi.com/ 小爱同学]&lt;br /&gt;
| 小米&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Echo&lt;br /&gt;
| [https://www.alexa.com/ Alexa]&lt;br /&gt;
| 亚马逊&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HomePod&lt;br /&gt;
| Siri	&lt;br /&gt;
| 苹果&lt;br /&gt;
|  &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 硬件 ==&lt;br /&gt;
&lt;br /&gt;
== 技术 ==&lt;br /&gt;
=== 语音前端处理 ===&lt;br /&gt;
语音前端处理（Audio Processing） &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 唤醒 ===&lt;br /&gt;
唤醒，也称Keyword Spotting (KWS)， 即关键词检测。当录音识别到关键词（如设置&#039;天猫精灵&#039;，&#039;hey Siri&#039;），就开始录制后面的语音，进行分析处理。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| [[microWakeWord]] &lt;br /&gt;
| 开源唤醒词引擎，支持低功耗设备如esp32。https://github.com/OHF-Voice/micro-wake-word&lt;br /&gt;
|-&lt;br /&gt;
| [[openWakeWord]]&lt;br /&gt;
| 开源唤醒词引擎。 https://github.com/dscripka/openWakeWord&lt;br /&gt;
|-&lt;br /&gt;
| [[Picovoice#Porcupine | Porcupine]]&lt;br /&gt;
| 是一款离线轻量级的唤醒词引擎，支持多语言，多平台。免费账号每个月只支持3个用户和3个唤醒词训练。&lt;br /&gt;
|-&lt;br /&gt;
| SnowBoy&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 讯飞语音唤醒&lt;br /&gt;
| 免费版10个用户90天试用期。&amp;lt;br /&amp;gt;官网：https://www.xfyun.cn/service/awaken?type=awaken &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===语音转文本===&lt;br /&gt;
语音识别（Automatic Speech Recognition, ASR），也称语音转文本（Speech To Text，STT）。 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 开发者&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| whisper&lt;br /&gt;
| OpenAI&lt;br /&gt;
| 是OpenAI在2022年9月开源的语音识别 （ASR）软件。可以用于本地离线识别，或安装在服务器上提供API。&amp;lt;br /&amp;gt;支持语言：中文、英语、法语、德语、俄语、日语等几十种语言。 &amp;lt;br /&amp;gt;价格：免费。 &amp;lt;br /&amp;gt;官网：https://openai.com/index/whisper/  &amp;lt;br /&amp;gt;源代码：https://github.com/openai/whisper&lt;br /&gt;
|-&lt;br /&gt;
|OpenAI&amp;lt;br /&amp;gt;语音识别API&lt;br /&gt;
| OpenAI&lt;br /&gt;
| 基于开源 large-v2 Whisper 模型。&amp;lt;br /&amp;gt;支持语言：中文、英语、法语、德语、俄语、日语等几十种语言。 &amp;lt;br /&amp;gt;价格：收费 &amp;lt;br /&amp;gt;官网：https://platform.openai.com/docs/guides/speech-to-text/speech-to-text&lt;br /&gt;
|-&lt;br /&gt;
| PaddleSpeech &lt;br /&gt;
| 百度&lt;br /&gt;
| 百度开源的语音方向的开源模型库，基于百度飞桨 PaddlePaddle。支持声音分类、语音识别（ASR）、语音翻译（英译中）、语音合成（TTS）和声纹验证。&amp;lt;br /&amp;gt;支持语言： &amp;lt;br /&amp;gt;源代码：https://github.com/PaddlePaddle/PaddleSpeech&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===自然语言理解===&lt;br /&gt;
自然语言理解 (Natural Language Understanding, NLU)&lt;br /&gt;
&lt;br /&gt;
===文本转语音===&lt;br /&gt;
文本转语音（TTS），也称语音合成。&lt;br /&gt;
&lt;br /&gt;
==项目==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Mycroft&lt;br /&gt;
| https://github.com/MycroftAI/mycroft-core&lt;br /&gt;
|-&lt;br /&gt;
| wukong-robot&lt;br /&gt;
| 是一个开源的中文语音对话机器人/智能音箱项目。 https://wukong.hahack.com/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===网站===&lt;br /&gt;
&lt;br /&gt;
===文章===&lt;br /&gt;
*[https://github.com/voice-engine/make-a-smart-speaker/blob/master/zh.md Github：voice-engine/make-a-smart-speaker DIY智能音箱]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=%E6%99%BA%E8%83%BD%E9%9F%B3%E7%AE%B1&amp;diff=1749</id>
		<title>智能音箱</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=%E6%99%BA%E8%83%BD%E9%9F%B3%E7%AE%B1&amp;diff=1749"/>
		<updated>2026-04-15T13:51:20Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 唤醒 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;智能音箱是一种内置语音助手的智能音响，可以接收语音指令，进行播放音乐、对话问答，控制家庭设备等。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==常见产品==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 产品&lt;br /&gt;
! 虚拟助手&lt;br /&gt;
! 公司&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 天猫精灵 &lt;br /&gt;
| [https://www.aligenie.com/ AliGenie] &lt;br /&gt;
| 阿里巴巴&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 小度&lt;br /&gt;
| [https://dueros.baidu.com/open DuerOS]&lt;br /&gt;
| 百度&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 小爱同学&lt;br /&gt;
| [https://developers.xiaoai.mi.com/ 小爱同学]&lt;br /&gt;
| 小米&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Echo&lt;br /&gt;
| [https://www.alexa.com/ Alexa]&lt;br /&gt;
| 亚马逊&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| HomePod&lt;br /&gt;
| Siri	&lt;br /&gt;
| 苹果&lt;br /&gt;
|  &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 硬件 ==&lt;br /&gt;
&lt;br /&gt;
== 技术 ==&lt;br /&gt;
=== 语音前端处理 ===&lt;br /&gt;
语音前端处理（Audio Processing） &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 唤醒 ===&lt;br /&gt;
唤醒，也称Keyword Spotting (KWS)， 即关键词检测。当录音识别到关键词（如设置&#039;天猫精灵&#039;，&#039;hey Siri&#039;），就开始录制后面的语音，进行分析处理。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| [[microWakeWord]] &lt;br /&gt;
| 开源唤醒词引擎，支持低功耗设备如esp32。https://github.com/OHF-Voice/micro-wake-word&lt;br /&gt;
|-&lt;br /&gt;
| [[openWakeWord]]&lt;br /&gt;
| 开源唤醒词引擎。 https://github.com/dscripka/openWakeWord&lt;br /&gt;
|-&lt;br /&gt;
| [[Picovoice#Porcupine | Porcupine]]&lt;br /&gt;
| 是一款离线轻量级的唤醒词引擎，支持多语言，多平台。免费账号每个月只支持3个用户和3个唤醒词训练。&lt;br /&gt;
|-&lt;br /&gt;
| SnowBoy&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 讯飞语音唤醒&lt;br /&gt;
| 免费版10个用户90天试用期。&amp;lt;br /&amp;gt;官网：https://www.xfyun.cn/service/awaken?type=awaken &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===语音转文本===&lt;br /&gt;
语音识别（Automatic Speech Recognition, ASR），也称语音转文本（Speech To Text，STT）。 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 开发者&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| whisper&lt;br /&gt;
| OpenAI&lt;br /&gt;
| 是OpenAI在2022年9月开源的语音识别 （ASR）软件。可以用于本地离线识别，或安装在服务器上提供API。&amp;lt;br /&amp;gt;支持语言：中文、英语、法语、德语、俄语、日语等几十种语言。 &amp;lt;br /&amp;gt;价格：免费。 &amp;lt;br /&amp;gt;官网：https://openai.com/index/whisper/  &amp;lt;br /&amp;gt;源代码：https://github.com/openai/whisper&lt;br /&gt;
|-&lt;br /&gt;
|OpenAI&amp;lt;br /&amp;gt;语音识别API&lt;br /&gt;
| OpenAI&lt;br /&gt;
| 基于开源 large-v2 Whisper 模型。&amp;lt;br /&amp;gt;支持语言：中文、英语、法语、德语、俄语、日语等几十种语言。 &amp;lt;br /&amp;gt;价格：收费 &amp;lt;br /&amp;gt;官网：https://platform.openai.com/docs/guides/speech-to-text/speech-to-text&lt;br /&gt;
|-&lt;br /&gt;
| PaddleSpeech &lt;br /&gt;
| 百度&lt;br /&gt;
| 百度开源的语音方向的开源模型库，基于百度飞桨 PaddlePaddle。支持声音分类、语音识别（ASR）、语音翻译（英译中）、语音合成（TTS）和声纹验证。&amp;lt;br /&amp;gt;支持语言： &amp;lt;br /&amp;gt;源代码：https://github.com/PaddlePaddle/PaddleSpeech&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===自然语言理解===&lt;br /&gt;
自然语言理解 (Natural Language Understanding, NLU)&lt;br /&gt;
&lt;br /&gt;
===文本转语音===&lt;br /&gt;
语音合成，&lt;br /&gt;
&lt;br /&gt;
==项目==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! 名称&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| Mycroft&lt;br /&gt;
| https://github.com/MycroftAI/mycroft-core&lt;br /&gt;
|-&lt;br /&gt;
| wukong-robot&lt;br /&gt;
| 是一个开源的中文语音对话机器人/智能音箱项目。 https://wukong.hahack.com/&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===网站===&lt;br /&gt;
&lt;br /&gt;
===文章===&lt;br /&gt;
*[https://github.com/voice-engine/make-a-smart-speaker/blob/master/zh.md Github：voice-engine/make-a-smart-speaker DIY智能音箱]&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=OpenCode&amp;diff=1748</id>
		<title>OpenCode</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=OpenCode&amp;diff=1748"/>
		<updated>2026-04-13T06:18:39Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OpenCode是一个开源的AI代理编程工具。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
=== 使用脚本安装 ===&lt;br /&gt;
 curl -fsSL https://opencode.ai/install | bash&lt;br /&gt;
&lt;br /&gt;
=== 使用包管理器安装 ===&lt;br /&gt;
# 安装 Node.js，[[npm]]包含在其中。https://nodejs.org/zh-cn/download&lt;br /&gt;
# 使用[[npm]]安装opencode。 npm install -g opencode-ai&lt;br /&gt;
&lt;br /&gt;
安装完成后，运行 opencode --version 验证是否成功&lt;br /&gt;
&lt;br /&gt;
*https://opencode.ai/docs#install&lt;br /&gt;
*https://opencode.ai/download&lt;br /&gt;
*https://github.com/anomalyco/opencode/releases&lt;br /&gt;
&lt;br /&gt;
==快速入门==&lt;br /&gt;
* 终端配置：opencode auth login&lt;br /&gt;
* 会提示选择一个模型，输入API KEY&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==指令==&lt;br /&gt;
===内置指令===&lt;br /&gt;
&lt;br /&gt;
===自定义指令===&lt;br /&gt;
&lt;br /&gt;
==技能==&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*opencode官网： https://opencode.ai/&lt;br /&gt;
*opencode源码： https://github.com/anomalyco/opencode&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=%E6%A0%91%E8%8E%93%E6%B4%BE&amp;diff=1747</id>
		<title>树莓派</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=%E6%A0%91%E8%8E%93%E6%B4%BE&amp;diff=1747"/>
		<updated>2026-04-04T04:47:03Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;树莓派（Raspberry Pi）&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
* 2023年10月10日，发布的Bookworm树莓派操作系统。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.raspberrypi.com/news/bookworm-the-new-version-of-raspberry-pi-os/ 树莓派News：新树莓派操作系统版本bookworm ]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
树莓派5，NVMe固态硬盘安装树莓派系统。&lt;br /&gt;
&lt;br /&gt;
方法一：使用U盘连接到电脑写入系统，再插入树莓派安装，安装后使用dd复制到固态硬盘，调整硬盘大小。移除U盘。&lt;br /&gt;
&lt;br /&gt;
方法二：将固态硬盘连接到电脑写入系统，再插入树莓派安装。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
安装中文输入法，以Google拼音输入法示例。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo apt udpate&lt;br /&gt;
sudo apt install fcitx fcitx-googlepinyin&lt;br /&gt;
&lt;br /&gt;
# 安装后重启&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
添加Google拼音，点击树莓派图标 -&amp;gt; Preference -&amp;gt; Fcitx Configuration，添加Google Pinyin 谷歌拼音输入法。可以使用&amp;lt;code&amp;gt;Ctrl + 空格&amp;lt;/code&amp;gt;来切换输入法。&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
* 任务栏消失了。&lt;br /&gt;
为了匹配树莓派5硬件，树莓派新版操作系统，基于Debian 12 “Bookworm”。现在使用wf-panel-pi应用程序管理系统面板，删除用户目录下.config目录中的wf-panel-pi所有文件即可重置。在终端输入：&amp;lt;code&amp;gt;rm -rf ~/.config/wf-panel-pi.ini*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==GPIO==&lt;br /&gt;
&lt;br /&gt;
===Python===&lt;br /&gt;
使用[[Python]]语言编程，可以使用默认安装在树莓派系统的[[gpiozero]]库，是一个开源的树莓派GPIO设备接口库，简单易用。&lt;br /&gt;
&lt;br /&gt;
以下示例将一个LED灯串联电阻后接到最后两个引脚Pin39（GND），Pin40（GPIO21），使其闪烁。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
from gpiozero import LED&lt;br /&gt;
from time import sleep&lt;br /&gt;
&lt;br /&gt;
led = LED(21)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    led.on()&lt;br /&gt;
    sleep(1)&lt;br /&gt;
    led.off()&lt;br /&gt;
    sleep(1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在Python虚拟环境(venv)中运行程序， 使用pip安装gpiozero后使用GPIO出现问题&amp;lt;code&amp;gt;gpiozero.exc.BadPinFactory: Unable to load any default pin factory!&amp;lt;/code&amp;gt;，可以修改venv配置文件&amp;lt;code&amp;gt;pyvenv.cfg&amp;lt;/code&amp;gt;内容&amp;lt;code&amp;gt;include-system-site-packages = true&amp;lt;/code&amp;gt;，其默认值为false，然后重新运行程序即可。&lt;br /&gt;
&lt;br /&gt;
灯还是不亮，看看是不是引脚图看错方向了，pin02(5V供电)是在板子的角落。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.raspberrypi.com/documentation/computers/raspberry-pi.html 树莓派文档：树莓派硬件]&lt;br /&gt;
|[https://projects.raspberrypi.org/en/projects/physical-computing/0 树莓派项目：使用Python物理计算] &lt;br /&gt;
|[https://github.com/gpiozero/gpiozero/ GitHub：gpiozero/gpiozero]&lt;br /&gt;
|[https://learn.adafruit.com/python-virtual-environment-usage-on-raspberry-pi Adafruit.com：树莓派上使用Python虚拟环境]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==远程连接==&lt;br /&gt;
=== SSH ===&lt;br /&gt;
&lt;br /&gt;
=== VNC远程桌面 ===&lt;br /&gt;
* 开启树莓派VNC服务&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo raspi-config&lt;br /&gt;
# 选择Interfacing Options -&amp;gt; VNC -&amp;gt; Yes -&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 连接网络，查看IP地址&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
ifconfig &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 远程主机安装VNC客户端，如RealVNC或TigerVNC。&lt;br /&gt;
* 打开VNC客户端，输入树莓派IP地址连接。&lt;br /&gt;
&lt;br /&gt;
=== RDP远程桌面 ===&lt;br /&gt;
* 树莓派上安装 xrdp&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo apt-get install xrdp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在 Windows 上使用内置的远程桌面连接工具&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*树莓派官网：https://www.raspberrypi.org/&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
*树莓派Pinout：https://pinout.vvzero.com/&lt;br /&gt;
===文章===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=%E6%A0%91%E8%8E%93%E6%B4%BE&amp;diff=1746</id>
		<title>树莓派</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=%E6%A0%91%E8%8E%93%E6%B4%BE&amp;diff=1746"/>
		<updated>2026-04-04T04:35:53Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;树莓派（Raspberry Pi）&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
* 2023年10月10日，发布的Bookworm树莓派操作系统。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.raspberrypi.com/news/bookworm-the-new-version-of-raspberry-pi-os/ 树莓派News：新树莓派操作系统版本bookworm ]&lt;br /&gt;
}}&lt;br /&gt;
===安装===&lt;br /&gt;
树莓派5，NVMe固态硬盘安装树莓派系统。&lt;br /&gt;
&lt;br /&gt;
方法一：使用U盘连接到电脑写入系统，再插入树莓派安装，安装后使用dd复制到固态硬盘，调整硬盘大小。移除U盘。&lt;br /&gt;
&lt;br /&gt;
方法二：将固态硬盘连接到电脑写入系统，再插入树莓派安装。&lt;br /&gt;
&lt;br /&gt;
==软件==&lt;br /&gt;
安装中文输入法，以Google拼音输入法示例。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo apt udpate&lt;br /&gt;
sudo apt install fcitx fcitx-googlepinyin&lt;br /&gt;
&lt;br /&gt;
# 安装后重启&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
添加Google拼音，点击树莓派图标 -&amp;gt; Preference -&amp;gt; Fcitx Configuration，添加Google Pinyin 谷歌拼音输入法。可以使用&amp;lt;code&amp;gt;Ctrl + 空格&amp;lt;/code&amp;gt;来切换输入法。&lt;br /&gt;
&lt;br /&gt;
==常见问题==&lt;br /&gt;
* 任务栏消失了。&lt;br /&gt;
为了匹配树莓派5硬件，树莓派新版操作系统，基于Debian 12 “Bookworm”。现在使用wf-panel-pi应用程序管理系统面板，删除用户目录下.config目录中的wf-panel-pi所有文件即可重置。在终端输入：&amp;lt;code&amp;gt;rm -rf ~/.config/wf-panel-pi.ini*&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==GPIO==&lt;br /&gt;
&lt;br /&gt;
===Python===&lt;br /&gt;
使用[[Python]]语言编程，可以使用默认安装在树莓派系统的[[gpiozero]]库，是一个开源的树莓派GPIO设备接口库，简单易用。&lt;br /&gt;
&lt;br /&gt;
以下示例将一个LED灯串联电阻后接到最后两个引脚Pin39（GND），Pin40（GPIO21），使其闪烁。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
from gpiozero import LED&lt;br /&gt;
from time import sleep&lt;br /&gt;
&lt;br /&gt;
led = LED(21)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    led.on()&lt;br /&gt;
    sleep(1)&lt;br /&gt;
    led.off()&lt;br /&gt;
    sleep(1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在Python虚拟环境(venv)中运行程序， 使用pip安装gpiozero后使用GPIO出现问题&amp;lt;code&amp;gt;gpiozero.exc.BadPinFactory: Unable to load any default pin factory!&amp;lt;/code&amp;gt;，可以修改venv配置文件&amp;lt;code&amp;gt;pyvenv.cfg&amp;lt;/code&amp;gt;内容&amp;lt;code&amp;gt;include-system-site-packages = true&amp;lt;/code&amp;gt;，其默认值为false，然后重新运行程序即可。&lt;br /&gt;
&lt;br /&gt;
{{了解更多&lt;br /&gt;
|[https://www.raspberrypi.com/documentation/computers/raspberry-pi.html 树莓派文档：树莓派硬件]&lt;br /&gt;
|[https://projects.raspberrypi.org/en/projects/physical-computing/0 树莓派项目：使用Python物理计算] &lt;br /&gt;
|[https://github.com/gpiozero/gpiozero/ GitHub：gpiozero/gpiozero]&lt;br /&gt;
|[https://learn.adafruit.com/python-virtual-environment-usage-on-raspberry-pi Adafruit.com：树莓派上使用Python虚拟环境]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==远程连接==&lt;br /&gt;
=== SSH ===&lt;br /&gt;
&lt;br /&gt;
=== VNC远程桌面 ===&lt;br /&gt;
* 开启树莓派VNC服务&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo raspi-config&lt;br /&gt;
# 选择Interfacing Options -&amp;gt; VNC -&amp;gt; Yes -&amp;gt; Finish&lt;br /&gt;
&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 连接网络，查看IP地址&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
ifconfig &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 远程主机安装VNC客户端，如RealVNC或TigerVNC。&lt;br /&gt;
* 打开VNC客户端，输入树莓派IP地址连接。&lt;br /&gt;
&lt;br /&gt;
=== RDP远程桌面 ===&lt;br /&gt;
* 树莓派上安装 xrdp&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; &amp;gt;&lt;br /&gt;
sudo apt-get install xrdp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 在 Windows 上使用内置的远程桌面连接工具&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
*树莓派官网：https://www.raspberrypi.org/&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;br /&gt;
*树莓派Pinout：https://pinout.vvzero.com/&lt;br /&gt;
===文章===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CadQuery&amp;diff=1745</id>
		<title>CadQuery</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CadQuery&amp;diff=1745"/>
		<updated>2026-04-02T02:30:26Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 3D 操作（无需活动工作平面） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CadQuery 是一个基于 [[Python]] 的参数化 3D CAD 库，底层使用 OpenCascade（OCCT）内核。支持输出STL、STEP、AMF和3MF的CAD格式。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
最简单方式使用CQ-Editor（官方的 GUI 编辑器），或者使用常用的编辑器+插件，如VS Code编辑器和OCP CAD Viewer插件。&lt;br /&gt;
===CQ-Editor===&lt;br /&gt;
安装CQ-editor编辑器，会自动安装cadquery，通过pip安装：&lt;br /&gt;
 pip install CQ-editor&lt;br /&gt;
安装后，通过命令行启动：&lt;br /&gt;
 CQ-editor&lt;br /&gt;
&lt;br /&gt;
https://github.com/CadQuery/CQ-editor/wiki/Installation&lt;br /&gt;
&lt;br /&gt;
===VS Code===&lt;br /&gt;
VS Code中，先安装cadquery，在安装OCP CAD Viewer插件。&lt;br /&gt;
 pip install cadquery&lt;br /&gt;
安装cadquery后，在[[VS Code]]插件中查找OCP CAD Viewer安装，方便在VS Code查看模型，安装后在VS Code运行查看下。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import cadquery as cq&lt;br /&gt;
from ocp_vscode import show, show_object&lt;br /&gt;
&lt;br /&gt;
result = cq.Workplane(&amp;quot;XY&amp;quot;).box(2,2,2).shell(0.2)&lt;br /&gt;
show_object(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
如果出现错误，不显示模型，在VS Code左侧栏点击OCP图标，在点击ocp_vscode行右侧的Open viewer按钮，就会显示RUNNING并运行，再次运行代码即可。&lt;br /&gt;
&lt;br /&gt;
https://cadquery.readthedocs.io/en/latest/installation.html&lt;br /&gt;
https://github.com/bernhard-42/vscode-ocp-cad-viewer&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
== 核心概念 ==&lt;br /&gt;
CadQuery 是一个基于 Python 的 3D CAD 建模库，其底层是 OpenCascade 几何内核。&lt;br /&gt;
&lt;br /&gt;
=== BREP 拓扑 ===&lt;br /&gt;
CadQuery 使用&#039;&#039;&#039;边界表示法（BREP）&#039;&#039;&#039;来定义 3D 物体，即物体由其表面来定义。基本的拓扑元素从简单到复杂依次为：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;顶点 (Vertex)&#039;&#039;&#039;：空间中的一个点&lt;br /&gt;
* &#039;&#039;&#039;边 (Edge)&#039;&#039;&#039;：连接两个或多个顶点的曲线段&lt;br /&gt;
* &#039;&#039;&#039;线框 (Wire)&#039;&#039;&#039;：一组相互连接的边&lt;br /&gt;
* &#039;&#039;&#039;面 (Face)&#039;&#039;&#039;：由线框围成的平面或曲面&lt;br /&gt;
* &#039;&#039;&#039;实体 (Solid)&#039;&#039;&#039;：由面围成的封闭三维体&lt;br /&gt;
* &#039;&#039;&#039;复合体 (Compound)&#039;&#039;&#039;：多个实体的集合&lt;br /&gt;
&lt;br /&gt;
=== API 层次结构 ===&lt;br /&gt;
CadQuery 提供了三个层次的 API，从上到下越来越灵活，但也越来越复杂。&lt;br /&gt;
==== 流畅 API ====&lt;br /&gt;
流畅 API是通过链式调用进行建模的接口，入门首选，简单易用。主要分为2类&lt;br /&gt;
* Workplane类，传统 3D 建模，最常用。 示例：&amp;lt;code&amp;gt;part = Workplane(&amp;quot;XY&amp;quot;).box(1,2,3).faces(&amp;quot;&amp;gt;Z&amp;quot;).circle(0.5).cutThruAll()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Sketch类，二维草图专用，更符合传统 CAD 绘图习惯，CadQuery 2.x版本引入。&lt;br /&gt;
&lt;br /&gt;
两者可以协同工作，如从二维草图开始创建三维模型Sketch → Workplane.placeSketch() → .extrude()，在现有模型上添加特征Workplane → 选面 → .sketch() → 修改 → .cutBlind()。典型工作流示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 创建一个带孔和圆角的平板&lt;br /&gt;
sketch_base = Sketch().rect(20, 15).constrain().solve()        # 底板轮廓&lt;br /&gt;
base = Workplane().placeSketch(sketch_base).extrude(3)         # 拉伸底板&lt;br /&gt;
&lt;br /&gt;
# 在底板上表面画圆孔&lt;br /&gt;
hole_sketch = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).sketch().circle(2).constrain().solve()&lt;br /&gt;
result = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).placeSketch(hole_sketch).cutBlind(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sketch 和 Workplane 的 2D 操作区别：&lt;br /&gt;
*Workplane 的 2D 操作：过程式建模，按顺序执行命令：画圆 → 移动 → 画矩形，尺寸硬编码数值，适用简单、固定的轮廓场景。&lt;br /&gt;
*Sketch ：约束驱动建模，定义几何约束如圆与矩形同心、相切等，尺寸约束 + 变量控制，适用复杂、参数化、需要设计意图的轮廓。&lt;br /&gt;
传统 CAD 中，设计意图（如&amp;quot;这个孔始终与板的中心对齐&amp;quot;）是通过约束实现的。Workplane 的过程式方式需要手动计算位置，参数变化时容易出错。Sketch约束后自动计算。当轮廓包含多个相互关联的图形时（如齿轮轮廓、法兰盘），约束系统能保证所有元素的关系正确。&lt;br /&gt;
&lt;br /&gt;
==== 直接 API ====&lt;br /&gt;
* 当流畅 API 不够用时使用，直接操作拓扑元素（顶点、边、面等）。&lt;br /&gt;
* 可以“自底向上”构建几何体，控制更精细。&lt;br /&gt;
* 示例：`wire = Wire.makeCircle(10); face = Face.makeFromWires(wire, [])`&lt;br /&gt;
&lt;br /&gt;
==== OCCT API ====&lt;br /&gt;
* 最底层，直接调用 OpenCascade 的 C++ 函数（通过 Python 绑定 `OCP`）。&lt;br /&gt;
* 极其强大但也极其繁琐，适合需要完全控制的场景。&lt;br /&gt;
* 示例：`from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox`&lt;br /&gt;
&lt;br /&gt;
=== 在 API 之间切换 ===&lt;br /&gt;
你可以根据需要混合使用不同层次的 API：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;从流畅 API 获取直接 API 对象&#039;&#039;&#039;：使用 `.val()` 或 `.findSolid()` 方法。&lt;br /&gt;
* &#039;&#039;&#039;从直接 API 对象回到流畅 API&#039;&#039;&#039;：将直接 API 对象作为参数传入新的 `Workplane`。&lt;br /&gt;
* &#039;&#039;&#039;获取底层的 OCCT 对象&#039;&#039;&#039;：直接 API 对象通过 `.wrapped` 属性即可获得。&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
选择器用于在已有模型上快速定位特征，相当于传统 CAD 中的鼠标选取。你可以通过字符串表达式选择面、边、顶点等。&lt;br /&gt;
* 例如：`faces(&amp;quot;&amp;gt;Z&amp;quot;)` 选择最上方的面，`edges(&amp;quot;&amp;gt;X&amp;quot;)` 选择 X 轴正方向的边。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API 参考==&lt;br /&gt;
=== 草图初始化 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch(parent, locs, obj)&amp;lt;/code&amp;gt; || 2D 草图，用于构建二维几何形状 || &amp;lt;code&amp;gt;s = Sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的 2D 草图对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 导入 DXF 文件并构建面 || &amp;lt;code&amp;gt;sketch = Sketch.importDXF(&amp;quot;profile.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入几何图形并创建草图&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sketch()&amp;lt;/code&amp;gt; || 初始化并返回一个草图 || &amp;lt;code&amp;gt;s = Workplane().sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;初始化一个新草图，通常在创建后自动调用&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.finalize()&amp;lt;/code&amp;gt; || 完成草图构造并返回父对象 || &amp;lt;code&amp;gt;result = sketch.finalize()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;完成草图编辑，返回父对象（通常用于链式调用）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.copy()&amp;lt;/code&amp;gt; || 创建草图的局部副本 || &amp;lt;code&amp;gt;s2 = s.copy()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图 s 的一个独立副本，用于后续修改而不影响原草图。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.located(loc)&amp;lt;/code&amp;gt; || 创建带有新位置的草图局部副本 || &amp;lt;code&amp;gt;sketch.located(Location(Vector(10, 0, 0)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图副本并平移到新位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.moved(....)&amp;lt;/code&amp;gt; || 创建移动后的面的草图局部副本 ||&amp;lt;code&amp;gt;sketch.moved(Vector(5, 5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将草图中的面移动后创建新副本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 草图选择 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.tag(name)&amp;lt;/code&amp;gt; || 为当前选择添加标签 || &amp;lt;code&amp;gt;sketch.rect(10, 10).tag(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形并为其添加标签 &amp;quot;outer&amp;quot;，便于后续选择&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.select(tag)&amp;lt;/code&amp;gt; || 根据标签选择元素 || &amp;lt;code&amp;gt;sketch.select(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择之前标记为 &amp;quot;outer&amp;quot; 的几何元素&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.reset()&amp;lt;/code&amp;gt; || 重置当前选择状态 || &amp;lt;code&amp;gt;sketch.reset()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;清除所有当前选中的元素，恢复到初始未选择状态&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.delete([mode])&amp;lt;/code&amp;gt; || 删除选中的对象 || &amp;lt;code&amp;gt;sketch.circle(5).tag(&amp;quot;hole&amp;quot;).delete()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆形后标记并删除它&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.faces([selector])&amp;lt;/code&amp;gt; || 选择面元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).faces().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形面并添加圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edges([selector])&amp;lt;/code&amp;gt; || 选择边元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).edges().chamfer(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有边并添加倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.vertices([selector])&amp;lt;/code&amp;gt; || 选择顶点元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).vertices().fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有顶点并添加圆角&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于面的草图绘制 ===&lt;br /&gt;
; Sketch Mode 类型说明&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;a&#039;&amp;lt;/code&amp;gt; - Add (添加) - 添加区域到草图 - 默认模式，创建实体区域&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;s&#039;&amp;lt;/code&amp;gt; - Subtract (减去) - 从现有区域中减去 - 创建孔洞或凹陷&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;i&#039;&amp;lt;/code&amp;gt; - Intersect (相交) - 保留与现有区域的交集 - 创建重叠部分&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;c&#039;&amp;lt;/code&amp;gt; - Construction (构造) - 创建辅助几何 - 辅助线/圆，不参与实体&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;g&#039;&amp;lt;/code&amp;gt; - Guide (引导) - 引导线 - 用于扫掠等操作&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.face(b[, angle, mode, tag, ...])&amp;lt;/code&amp;gt; || 从线框或边构建一个面 || &amp;lt;code&amp;gt;s = Sketch().face(wire, mode=&#039;a&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从闭合线框创建一个面，使用 ADD 模式添加到现有图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rect(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个矩形面 || &amp;lt;code&amp;gt;cq.Sketch().rect(10, 20).rect(5, 10, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x20 矩形，然后在其中减去一个 5x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.circle(r[, mode, tag])&amp;lt;/code&amp;gt; || 构建一个圆形面 || &amp;lt;code&amp;gt;s = cq.Sketch().circle(5).circle(3,mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个半径 5 的圆，然后在中心减去一个半径 3 的圆（形成环形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.ellipse(a1, a2[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个椭圆面 || &amp;lt;code&amp;gt;s = Sketch().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个长半轴 10、短半轴 5 的椭圆面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.trapezoid(w, h, a1[, a2, angle, ...])&amp;lt;/code&amp;gt; || 构建一个梯形面 || &amp;lt;code&amp;gt;s = Sketch().trapezoid(10, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个顶宽 10、高 5、顶部偏移 2 的梯形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.slot(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个槽形面 || &amp;lt;code&amp;gt;s = Sketch().slot(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制一个长度20、宽度5的槽形面（带圆角）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.regularPolygon(r, n[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个正多边形面 || &amp;lt;code&amp;gt;s = Sketch().regularPolygon(5, 6)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个外接圆半径 5、6 条边的正六边形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.polygon(pts[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个多边形面 || &amp;lt;code&amp;gt;s = Sketch().polygon([(0,0), (10,0), (5,8)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个由三个点构成的三角形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rarray(xs, ys, nx, ny)&amp;lt;/code&amp;gt; || 生成一个矩形位置阵列 || &amp;lt;code&amp;gt;s = cq.Sketch().rect(50, 40).rarray(4, 3, 12, 10).circle(2, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 3x3 矩形，然后在创建12x10的孔阵列。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.parray(r, a1, da, n[, rotate])&amp;lt;/code&amp;gt; || 生成极坐标阵列位置 || &amp;lt;code&amp;gt;sketch.parray(20, 0, 360, 8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建围绕中心、半径 20、从 0 度到 360 度均匀分布的 8 个极坐标阵列位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.distribute(n[, start, stop, rotate])&amp;lt;/code&amp;gt; || 沿选中的边或线框分布位置 || &amp;lt;code&amp;gt;sketch.rect(20, 10).edges().distribute(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿矩形选中边均匀分布 5 个位置点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.each(callback[, mode, tag, ...])&amp;lt;/code&amp;gt; || 对所有适用实体应用回调函数 || &amp;lt;code&amp;gt;sketch.rarray(5, 5, 3, 2).each(lambda loc: Sketch().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个阵列位置点执行回调，绘制半径为 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.push(locs[, tag])&amp;lt;/code&amp;gt; || 将当前选择设置为给定位置或点 || &amp;lt;code&amp;gt;sketch.push([Vector(0,0), Vector(10,10), Vector(20,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将三个位置点推入当前选择栈，作为后续操作的基准点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.hull([mode, tag])&amp;lt;/code&amp;gt; || 从当前选择或所有对象生成凸包 || &amp;lt;code&amp;gt;s = Sketch().circle(3).circle(5, (10,0)).hull()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建两个圆，然后生成包含它们的最小凸包面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.offset(d[, mode, tag])&amp;lt;/code&amp;gt; || 偏移选定的线框或边 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).offset(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后向外偏移 1 单位（形成更大的矩形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.fillet(r)&amp;lt;/code&amp;gt; || 基于当前选择添加圆角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加半径 1 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.chamfer(d)&amp;lt;/code&amp;gt; || 基于当前选择添加倒角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().chamfer(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加距离 1 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.clean()&amp;lt;/code&amp;gt; || 移除内部线。 || &amp;lt;code&amp;gt;sketch.clean()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;清理草图中内部的非边界线段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于边和约束的草图绘制 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edge(val[, tag, forConstruction])&amp;lt;/code&amp;gt; || 向草图中添加一条边 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;s = Sketch().edge(&amp;quot;|&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加一条水平线作为构造线（用于约束）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.segment(p1, p2)&amp;lt;/code&amp;gt; || 构建一条线段 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 (0,0) 到 (10,0) 添加一条线段&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.arc(p1, p2, p3)&amp;lt;/code&amp;gt; || 构建一条弧线 || &amp;lt;code&amp;gt;s = Sketch().arc((0,0), (5,5), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;通过三点添加一条圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.spline(pts)&amp;lt;/code&amp;gt; || 构造样条曲线边 || &amp;lt;code&amp;gt;sketch.spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过给定点的样条曲线边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.close()&amp;lt;/code&amp;gt; || 将最后一条边连接到第一条边 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0)).segment((10,0), (10,10)).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加两条垂直边后闭合，形成 L 形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.assemble([mode, tag])&amp;lt;/code&amp;gt; || 将边组合成面 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10, mode=Mode.PRIVATE).assemble()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建私有矩形边，然后组合成一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.constrain(constraint)&amp;lt;/code&amp;gt; || 添加一个约束 || &amp;lt;code&amp;gt;s = Sketch().circle(5).constrain((&amp;quot;distance&amp;quot;, &amp;quot;origin&amp;quot;, 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆，然后添加约束使其圆心距离原点 2 单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.solve()&amp;lt;/code&amp;gt; || 求解当前约束并更新边位置 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).constrain((&amp;quot;coincident&amp;quot;, &amp;quot;vertex0&amp;quot;, &amp;quot;vertex1&amp;quot;)).solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加重合约束后求解，更新几何位置&lt;br /&gt;
|}&lt;br /&gt;
=== Workplane初始化及其他 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane(, obj)&amp;lt;/code&amp;gt; || 在空间中定义一个坐标系，可用于2D坐标操作。 || &amp;lt;code&amp;gt;Workplane()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;创建一个新的Workplane对象，默认在XY平面原点。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tag(name)&amp;lt;/code&amp;gt; || 为当前栈顶对象添加标签，便于后续引用 || &amp;lt;code&amp;gt;wp = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().tag(&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;为立方体上表面创建的工作平面添加 &amp;quot;top&amp;quot; 标签，便于后续通过标签引用该工作平面  &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;cq.Workplane(&amp;quot;XY&amp;quot;).polygon(3, 5).extrude(4).tag(&amp;quot;prism&amp;quot;).sphere(10).faces(&amp;quot;&amp;lt;X&amp;quot;, tag=&amp;quot;prism&amp;quot;).workplane().circle(1).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;Tags也可以与大多数选择器一起使用。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.workplaneFromTagged(tag)&amp;lt;/code&amp;gt; || 从之前标记的标签恢复/复制工作平面 || &amp;lt;code&amp;gt;result = wp.workplaneFromTagged(&amp;quot;top&amp;quot;).circle(5).extrude(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从名为 &amp;quot;top&amp;quot; 的标签处恢复工作平面，在该平面上绘制半径为 5 的圆并拉伸 10 个单位（常用于多次从同一面挤出，避免选择器失效）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.copyWorkplane(other)&amp;lt;/code&amp;gt; || 复制另一个 Workplane 的平面信息到当前对象 || &amp;lt;code&amp;gt;new_wp = cq.Workplane().copyWorkplane(other_wp)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建新的工作平面，并将另一个工作平面 other_wp 的坐标系信息复制到新对象上&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2D 操作 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.center(x, y)&amp;lt;/code&amp;gt; || 将局部坐标移动到指定位置 || &amp;lt;code&amp;gt;result = cq.Workplane().center(5, 5).rect(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将工作平面中心移动到 (5,5) 后创建 10x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.lineTo(x, y[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点到指定点绘制一条线 || &amp;lt;code&amp;gt;result = cq.Workplane().moveTo(0,0).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从原点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.line(xDist, yDist[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制相对直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).line(5, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点相对移动 (5,5) 并绘制直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点垂直向上绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLineTo(yCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线到指定 Y 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;垂直绘制到 Y=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLineTo(xCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线到指定 X 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制到 X=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLine(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点按角度和长度绘制直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLine(10, 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;以 45 度角绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLineTo(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点绘制极坐标直线到指定位置 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLineTo(10, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到极坐标 (10, 90°) 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.moveTo(x, y)&amp;lt;/code&amp;gt; || 移动到指定点（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().moveTo(5, 5).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前点移动到 (5,5)（不绘制），然后从该点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.move([xDist, yDist])&amp;lt;/code&amp;gt; || 相对移动指定距离（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().move(3, 4).line(5, 0)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;相对移动 (3,4)（不绘制），然后水平绘制长度 5 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.spline(listOfXYTuple[, tangents, ...])&amp;lt;/code&amp;gt; || 创建通过给定点的样条曲线（2D或3D） || &amp;lt;code&amp;gt;cq.Workplane().spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过三个点的平滑样条曲线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricCurve(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲线 || &amp;lt;code&amp;gt;cq.Workplane().parametricCurve(lambda t: (t, t**2), N=50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲线 y=x² 的逼近样条，使用 50 个采样点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricSurface(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲面 || &amp;lt;code&amp;gt;cq.Workplane().parametricSurface(lambda u,v: (u, v, u*v))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲面 z=xy 的逼近曲面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.threePointArc(point1, point2[, ...])&amp;lt;/code&amp;gt; || 通过三个点绘制圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).threePointArc((5,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点通过 (5,0) 到 (10,0) 绘制圆弧（形成半圆）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sagittaArc(endPoint, sag[, ...])&amp;lt;/code&amp;gt; || 使用矢高（sagitta）定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).sagittaArc((10,0), 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、矢高 2 的圆弧（拱形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.radiusArc(endPoint, radius[, ...])&amp;lt;/code&amp;gt; || 使用半径定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).radiusArc((10,0), 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、半径 5 的圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tangentArcPoint(endPoint)&amp;lt;/code&amp;gt; || 从当前边末端绘制切线圆弧到指定点 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(5,0).tangentArcPoint((10,5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;先绘制水平线，然后绘制与前一条边相切的圆弧到 (10,5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorY()&amp;lt;/code&amp;gt; || 沿 Y 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorY()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 Y 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorX()&amp;lt;/code&amp;gt; || 沿 X 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorX()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 X 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wire([forConstruction])&amp;lt;/code&amp;gt; || 将所有待定边连接成线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).wire()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两条边连接成 L 形线框对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rect(xLen, yLen[, centered, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造矩形 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制 10x20 的矩形（默认 centered=True）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.circle(radius[, forConstruction])&amp;lt;/code&amp;gt; || 为栈上每个项构造圆 || &amp;lt;code&amp;gt;cq.Workplane().circle(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制半径 5 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipse(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造椭圆 || &amp;lt;code&amp;gt;cq.Workplane().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制长轴 10、短轴 5 的椭圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipseArc(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 绘制椭圆弧 || &amp;lt;code&amp;gt;cq.Workplane().ellipseArc(10, 5, 0, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制从 0° 到 90° 的椭圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polyline(listOfXYTuple[, ...])&amp;lt;/code&amp;gt; || 从点列表创建折线 || &amp;lt;code&amp;gt;cq.Workplane().polyline([(0,0), (10,0), (10,10)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制连接三个点的折线（L 形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.close()&amp;lt;/code&amp;gt; || 结束构建并尝试创建封闭线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;闭合当前绘制的轮廓，形成封闭矩形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rarray(xSpacing, ySpacing, xCount, ...)&amp;lt;/code&amp;gt; || 创建矩形阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().rarray(10, 10, 3, 2).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 3 列 2 行、间距 10 的矩形阵列点，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarArray(radius, startAngle, ...)&amp;lt;/code&amp;gt; || 创建极坐标阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().polarArray(20, 0, 360, 8).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 8 个点的 360° 极坐标阵列，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.slot2D(length, diameter[, angle])&amp;lt;/code&amp;gt; || 创建带圆角的槽形 || &amp;lt;code&amp;gt;cq.Workplane().slot2D(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点创建长度 20、宽度 5 的跑道形槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.offset2D(d[, kind, forConstruction])&amp;lt;/code&amp;gt; || 创建 2D 偏移线框 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).offset2D(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x10 矩形线框向外偏移 2 个单位，生成更大的矩形。&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;cq.Workplane().box(4, 2, 0.5).faces(&amp;quot;&amp;gt;Z&amp;quot;).edges().toPending().offset2D(-0.25, forConstruction=True).vertices().cboreHole(0.125, 0.25, 0.125, depth=None)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在顶面向里偏离0.25，再在四个顶点打螺栓孔。&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.placeSketch(sketch)&amp;lt;/code&amp;gt; || 根据栈上项放置草图 || &amp;lt;code&amp;gt;cq.Workplane().placeSketch(mySketch).extrude(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Sketch 对象放置到当前 Workplane 位置，然后拉伸 5 个单位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（需要活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cboreHole(diameter, cboreDiameter, cboreDepth[, depth, clean])&amp;lt;/code&amp;gt; || 创建沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cboreHole(5, 10, 3, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、沉头直径 10、沉头深度 3、总深 8 的沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cskHole(diameter, cskDiameter, cskAngle[, depth, clean])&amp;lt;/code&amp;gt; || 创建锥形沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cskHole(5, 10, 90, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、锥头直径 10、锥角 90° 的锥形沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hole(diameter[, depth, clean])&amp;lt;/code&amp;gt; || 创建通孔或盲孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、深度 8 的盲孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.extrude(until[, combine, clean, both, taper])&amp;lt;/code&amp;gt; || 将线框挤出为棱柱体，可以给定数值，或&#039;next&#039;,&#039;last &#039;,或输入一个对象的Face。 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).extrude(30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x20 矩形沿法线方向挤出高度 30 的实体&amp;lt;br/&amp;gt; &amp;lt;code&amp;gt;result = cq.Workplane(origin=(20, 0, 0)).circle(2).revolve(180, (-20, 0, 0), (-20, -1, 0)).center(-20, 0).workplane().rect(10, 4).extrude(&amp;quot;last&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cut(toCut[, clean, tol])&amp;lt;/code&amp;gt; || 从当前实体切除另一个实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 10).cut(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从盒子中减去半径为 8 的球体（布尔差集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutBlind(until[, clean, both, taper])&amp;lt;/code&amp;gt; || 盲切（有限深度挤出切除） || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutBlind(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓沿法线方向挤出切除深度 15 的槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutThruAll([clean, taper])&amp;lt;/code&amp;gt; || 贯穿切除 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓贯穿整个实体进行切除&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.box(length, width, height[, centered, combine])&amp;lt;/code&amp;gt; || 创建立方体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 20, 30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建长 10、宽 20、高 30 的长方体（默认 centered=True，中心位于原点）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sphere(radius[, direct, angle1, angle2, combine])&amp;lt;/code&amp;gt; || 创建球体 || &amp;lt;code&amp;gt;result = cq.Workplane().sphere(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在当前工作平面位置创建半径 10 的球体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wedge(dx, dy, dz, xmin, zmin, xmax, zmax[, combine])&amp;lt;/code&amp;gt; || 创建楔形体 || &amp;lt;code&amp;gt;result = cq.Workplane().wedge(10, 20, 30, 0, 0, 10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建指定尺寸的楔形实体（类似三棱柱形状）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cylinder(height, radius[, direct, angle, combine])&amp;lt;/code&amp;gt; || 创建圆柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().cylinder(30, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建高度 30、半径 10 的圆柱体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.union([toUnion, clean, glue, tol])&amp;lt;/code&amp;gt; || 合并实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将球体与当前实体合并（布尔并集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.combine([clean, glue, tol])&amp;lt;/code&amp;gt; || 合并栈上所有实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5)).combine()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前栈中的多个实体合并为一个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.intersect(toIntersect[, clean, tol])&amp;lt;/code&amp;gt; || 与当前实体进行布尔交集运算 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).intersect(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10x10 的立方体，然后与半径 8 的球体进行布尔交集，保留两者重叠的部分&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.loft([ruled, combine, clean])&amp;lt;/code&amp;gt; || 放样多个截面 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 10).workplane(offset=5).rect(5, 5).loft()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两个不同尺寸的矩形截面放样成 3D 实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sweep(path[, multisection, transition, combine, clean])&amp;lt;/code&amp;gt; || 沿路径扫掠截面 || &amp;lt;code&amp;gt;path = cq.Workplane().spline([(0,0,0), (0,0,10)])&amp;lt;br/&amp;gt;result = cq.Workplane().circle(2).sweep(path)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿样条曲线路径扫掠圆形截面，生成弯曲管道&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.twistExtrude(distance, angleDegrees)&amp;lt;/code&amp;gt; || 在拉伸的同时扭转指定角度 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 5).twistExtrude(20, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 5x5 矩形沿法线方向拉伸 20 个单位，同时从底部到顶部扭转 90°&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.revolve([angleDegrees, axisStart, axisEnd, combine, clean])&amp;lt;/code&amp;gt; || 绕轴旋转生成实体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 10).revolve(360, (0,0), (0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形轮廓绕 Y 轴旋转 360° 生成回转体（类似圆环体或圆柱）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.text(txt, fontsize, distance[, ...])&amp;lt;/code&amp;gt; || 返回 3D 文本实体 || &amp;lt;code&amp;gt;result = cq.Workplane().text(&amp;quot;CadQuery&amp;quot;, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建内容为 &amp;quot;CadQuery&amp;quot;、字体高度 5、拉伸深度 2 的 3D 文本实体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（无需活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shell(thickness[, kind])&amp;lt;/code&amp;gt; || 移除选定的面以创建指定厚度的壳体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 5).faces(&amp;quot;&amp;gt;Z&amp;quot;).shell(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个盒子，移除顶面后形成壁厚 0.5 的壳体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.fillet(radius)&amp;lt;/code&amp;gt; || 在选定的边上添加圆角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加半径 2 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.chamfer(length[, length2])&amp;lt;/code&amp;gt; || 在选定的边上添加倒角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).chamfer(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加距离 2 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotate(axisStartPoint, axisEndPoint, angleDegrees)&amp;lt;/code&amp;gt; || 返回旋转后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotate((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绕 X 轴旋转立方体 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotateAboutCenter(axisEndPoint, ...)&amp;lt;/code&amp;gt; || 绕指定轴旋转栈中所有项 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotateAboutCenter((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 10x10x10 立方体，然后绕 X 轴（通过原点沿 X 方向）旋转 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.translate(vec)&amp;lt;/code&amp;gt; || 返回平移后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).translate((5, 0, 0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将立方体沿 X 轴平移 5 个单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirror([mirrorPlane, ...])&amp;lt;/code&amp;gt; || 镜像单个 CQ 对象 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).mirror(&amp;quot;YZ&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后，以 YZ 平面为镜像平面进行镜像&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.split(plane[, keepTop, keepBottom])&amp;lt;/code&amp;gt; || 将栈上的实体按平面或分割器分割成两部分，可选择保留顶部、底部或两者。 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 50).faces(&amp;quot;&amp;gt;Y&amp;quot;).workplane(-10).split(keepTop=True)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用工作平面将盒子沿 Y 方向在偏移 -10 的位置分割，只保留上半部分。&amp;lt;code&amp;gt;keepTop=True&amp;lt;/code&amp;gt; 保留法线方向一侧，&amp;lt;code&amp;gt;keepBottom=True&amp;lt;/code&amp;gt; 保留另一侧，&amp;lt;code&amp;gt;keepBoth=True&amp;lt;/code&amp;gt; 同时保留两部分并返回元组&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 迭代方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.each(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 对栈中的每个值运行提供的函数，并将返回值收集到新的 CQ 对象中 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).each(lambda loc: cq.Workplane().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在矩形阵列的每个位置点执行回调函数，在每个点处创建半径为 2 的圆，并收集所有结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.eachpoint(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 与 each() 类似，但回调函数的参数会根据栈中位置进行平移 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).eachpoint(lambda pos: cq.Workplane().circle(2).translate(pos))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个位置点处创建圆，回调函数接收位置向量作为参数，便于创建相对于每个点的几何体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 栈与选择器方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.all()&amp;lt;/code&amp;gt; || 返回栈中所有 CQ 对象的列表 || &amp;lt;code&amp;gt;objects = cq.Workplane().box(10, 10, 10).faces().all()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体所有面的列表，返回包含每个面对象的列表&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.size()&amp;lt;/code&amp;gt; || 返回栈中当前对象的数量 || &amp;lt;code&amp;gt;count = cq.Workplane().box(10, 10, 10).faces().size()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体面的数量（返回 6）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vals()&amp;lt;/code&amp;gt; || 获取当前列表中的值 || &amp;lt;code&amp;gt;values = cq.Workplane().box(10, 10, 10).faces().vals()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取所有面对象的原始值（TopoDS_Shape 列表）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.add(obj)&amp;lt;/code&amp;gt; || 向栈中添加一个对象或对象列表 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后添加球体到栈中，栈中现在包含两个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.val()&amp;lt;/code&amp;gt; || 返回栈中的第一个值 || &amp;lt;code&amp;gt;first = cq.Workplane().box(10, 10, 10).faces().val()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.first()&amp;lt;/code&amp;gt; || 返回栈中的第一个项 || &amp;lt;code&amp;gt;first_item = cq.Workplane().box(10, 10, 10).faces().first()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面（与 val() 类似）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.item(i)&amp;lt;/code&amp;gt; || 返回栈中的第 i 个项 || &amp;lt;code&amp;gt;third_face = cq.Workplane().box(10, 10, 10).faces().item(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第三个面（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.last()&amp;lt;/code&amp;gt; || 返回栈中的最后一个项 || &amp;lt;code&amp;gt;last_face = cq.Workplane().box(10, 10, 10).faces().last()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的最后一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.end([n])&amp;lt;/code&amp;gt; || 返回此 CQ 元素的第 n 级父对象 || &amp;lt;code&amp;gt;parent = cq.Workplane().box(10, 10, 10).faces().vertices().end(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从顶点选择返回两级父对象（返回到实体层级）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vertices([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的顶点，可选择过滤 || &amp;lt;code&amp;gt;vertices = cq.Workplane().box(10, 10, 10).vertices()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体的所有 8 个顶点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.faces([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的面，可选择过滤 || &amp;lt;code&amp;gt;top_face = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体上表面（法线方向为正 Z 的面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.edges([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的边，可选择过滤 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vertical_edges = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体所有垂直边（平行于 Z 轴）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wires([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的线框，可选择过滤 || &amp;lt;code&amp;gt;wires = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).wires()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体顶面的外轮廓线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.solids([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的实体，可选择过滤 || &amp;lt;code&amp;gt;solids = cq.Workplane().box(10, 10, 10).solids()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体实体（通常只有一个）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shells([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的壳体，可选择过滤 || &amp;lt;code&amp;gt;shells = cq.Workplane().box(10, 10, 10).shell(0.5).shells()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建壳体后选择壳体对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.compounds([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中的复合体，可选择过滤 || &amp;lt;code&amp;gt;compounds = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5)).compounds()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;合并立方体和球体后，选择复合体对象&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NearestToPointSelector(pnt)&amp;lt;/code&amp;gt; || 选择离指定点最近的对象 || &amp;lt;code&amp;gt;nearest = cq.Workplane().box(10, 10, 10).faces(NearestToPointSelector((0,0,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择距离点 (0,0,5) 最近的面（通常为上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BoxSelector(point0, point1[, boundingbox])&amp;lt;/code&amp;gt; || 选择由两点定义的 3D 框内的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(BoxSelector((-5,-5,-5), (5,5,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择位于立方体边界框内的所有面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BaseDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 基于单个方向向量进行选择的基础选择器 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(BaseDirSelector((0,0,1), 0.01))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择方向与 Z 轴对齐的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ParallelDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向平行的对象 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(ParallelDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的边（即所有垂直边）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向对齐的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(DirectionSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向为 Z 轴方向的面（上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionNthSelector(vector, n[, ...])&amp;lt;/code&amp;gt; || 过滤与指定方向平行（或垂直）的对象，返回第 N 个 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(DirectionNthSelector((0,0,1), 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的第 3 条边（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LengthNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个长度的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(LengthNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择长度最短的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AreaNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个面积的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(AreaNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择面积最小的面（10x10 的面中最小为 100）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RadiusNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个半径的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().cylinder(10, 5).edges(RadiusNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择半径最小的边（圆柱体上下圆边半径 5）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PerpendicularDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向垂直的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(PerpendicularDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向与 Z 轴垂直的面（四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypeSelector(typeString)&amp;lt;/code&amp;gt; || 选择具有指定几何类型的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(TypeSelector(&amp;quot;PLANE&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有平面类型的面（立方体所有面都是平面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionMinMaxSelector(vector, minOrMax)&amp;lt;/code&amp;gt; || 选择在指定方向上最近或最远的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(DirectionMinMaxSelector((0,0,1), &amp;quot;MAX&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择在 Z 轴方向上最远的面（即上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CenterNthSelector(vector, n[, directionMax, ...])&amp;lt;/code&amp;gt; || 按中心在指定方向上投影的距离排序，选择第 N 个对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(CenterNthSelector((0,0,1), 1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;按面中心在 Z 轴投影距离排序，选择第 2 个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AndSelector(left, right)&amp;lt;/code&amp;gt; || 交集选择器（同时满足两个选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(AndSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向的平面（即上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SumSelector(left, right)&amp;lt;/code&amp;gt; || 并集选择器（满足任一选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SumSelector(DirectionSelector((0,0,1)), DirectionSelector((1,0,0))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴或 X 轴方向的面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SubtractSelector(left, right)&amp;lt;/code&amp;gt; || 差集选择器（满足 left 但不满足 right） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SubtractSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向但非平面的面（立方体中无结果）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;InverseSelector(selector)&amp;lt;/code&amp;gt; || 反转给定选择器的选择结果 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(InverseSelector(DirectionSelector((0,0,1))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有法线方向不是 Z 轴的面（即四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringSyntaxSelector(selectorString)&amp;lt;/code&amp;gt; || 使用简单字符串语法过滤对象列表 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(StringSyntaxSelector(&amp;quot;&amp;gt;Z&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用字符串语法选择法线方向为正 Z 的面（等价于 &amp;quot;&amp;gt;Z&amp;quot;）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 装配体 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly([obj, loc, name, color, material, ...])&amp;lt;/code&amp;gt; || 嵌套的 Workplane 和 Shape 对象装配体，定义它们的相对位置 || &amp;lt;code&amp;gt;assy = cq.Assembly()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的装配体对象，用于组织和定位多个零件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.add(obj[, loc, name, color, ...])&amp;lt;/code&amp;gt; || 向当前装配体添加子装配体或零件 || &amp;lt;code&amp;gt;assy.add(cq.Workplane().box(10, 10, 5), name=&amp;quot;base&amp;quot;)&amp;lt;br/&amp;gt;assy.add(cq.Workplane().sphere(3), loc=cq.Location((0,0,5)), name=&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;向装配体添加底座（立方体）和顶部球体，并指定位置和名称&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.save(path[, exportType, mode, ...])&amp;lt;/code&amp;gt; || 将装配体保存到文件 || &amp;lt;code&amp;gt;assy.save(&amp;quot;assembly.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将装配体保存为 STEP 文件，支持 STEP、STL、VRML 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.constrain(constraint)&amp;lt;/code&amp;gt; || 定义一个新的约束 || &amp;lt;code&amp;gt;assy.constrain(&amp;quot;base&amp;quot;, &amp;quot;top&amp;quot;, &amp;quot;Axis&amp;quot;, (0,0,1), (0,0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;约束底座和顶部的 Z 轴对齐，使球体位于底座正上方&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.solve([verbosity])&amp;lt;/code&amp;gt; || 求解所有已定义的约束 || &amp;lt;code&amp;gt;assy.solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;求解所有约束，自动调整零件位置以满足约束条件，verbosity=1 可输出求解详情&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Color(r, g, b[, a])&amp;lt;/code&amp;gt; || OCCT 颜色对象 Quantity_ColorRGBA 的包装器 || &amp;lt;code&amp;gt;red = cq.Color(1, 0, 0)&amp;lt;br/&amp;gt;assy.add(part, color=red)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建红色颜色对象，并将其应用于装配体中的零件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 导出与导入 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.toSvg([opts])&amp;lt;/code&amp;gt; || 返回表示栈中第一个项的 SVG 文本 || &amp;lt;code&amp;gt;svg_text = cq.Workplane().rect(10, 10).toSvg()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并将其转换为 SVG 文本字符串，可用于网页显示或保存&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.exportSvg(fileName)&amp;lt;/code&amp;gt; || 将栈中第一个项导出为 SVG 文件 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).exportSvg(&amp;quot;rectangle.svg&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并导出为 &amp;quot;rectangle.svg&amp;quot; 文件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importStep(fileName)&amp;lt;/code&amp;gt; || 加载 STEP 文件到 CadQuery Workplane || &amp;lt;code&amp;gt;part = cq.importers.importStep(&amp;quot;model.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 &amp;quot;model.step&amp;quot; 文件导入 3D 模型，返回 Workplane 对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 加载 DXF 文件到 Workplane || &amp;lt;code&amp;gt;sketch = cq.importers.importDXF(&amp;quot;profile.dxf&amp;quot;, tol=0.01)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入 2D 轮廓，容差设为 0.01&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exporters.export(w, fname[, exportType, ...])&amp;lt;/code&amp;gt; || 将 Workplane 或 Shape 导出到文件 || &amp;lt;code&amp;gt;cq.exporters.export(part, &amp;quot;output.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Workplane 对象导出为 STEP 文件，支持 STL、STEP、SVG 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;occ_impl.exporters.dxf.DxfDocument([...])&amp;lt;/code&amp;gt; || 从 CadQuery 对象创建 DXF 文档 || &amp;lt;code&amp;gt;doc = cq.occ_impl.exporters.dxf.DxfDocument()&amp;lt;br/&amp;gt;doc.addShape(sketch)&amp;lt;br/&amp;gt;doc.save(&amp;quot;output.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 DXF 文档对象，添加几何形状后保存为 DXF 文件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CadQuery&amp;diff=1744</id>
		<title>CadQuery</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CadQuery&amp;diff=1744"/>
		<updated>2026-04-02T02:25:04Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* Workplane初始化及其他 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CadQuery 是一个基于 [[Python]] 的参数化 3D CAD 库，底层使用 OpenCascade（OCCT）内核。支持输出STL、STEP、AMF和3MF的CAD格式。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
最简单方式使用CQ-Editor（官方的 GUI 编辑器），或者使用常用的编辑器+插件，如VS Code编辑器和OCP CAD Viewer插件。&lt;br /&gt;
===CQ-Editor===&lt;br /&gt;
安装CQ-editor编辑器，会自动安装cadquery，通过pip安装：&lt;br /&gt;
 pip install CQ-editor&lt;br /&gt;
安装后，通过命令行启动：&lt;br /&gt;
 CQ-editor&lt;br /&gt;
&lt;br /&gt;
https://github.com/CadQuery/CQ-editor/wiki/Installation&lt;br /&gt;
&lt;br /&gt;
===VS Code===&lt;br /&gt;
VS Code中，先安装cadquery，在安装OCP CAD Viewer插件。&lt;br /&gt;
 pip install cadquery&lt;br /&gt;
安装cadquery后，在[[VS Code]]插件中查找OCP CAD Viewer安装，方便在VS Code查看模型，安装后在VS Code运行查看下。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import cadquery as cq&lt;br /&gt;
from ocp_vscode import show, show_object&lt;br /&gt;
&lt;br /&gt;
result = cq.Workplane(&amp;quot;XY&amp;quot;).box(2,2,2).shell(0.2)&lt;br /&gt;
show_object(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
如果出现错误，不显示模型，在VS Code左侧栏点击OCP图标，在点击ocp_vscode行右侧的Open viewer按钮，就会显示RUNNING并运行，再次运行代码即可。&lt;br /&gt;
&lt;br /&gt;
https://cadquery.readthedocs.io/en/latest/installation.html&lt;br /&gt;
https://github.com/bernhard-42/vscode-ocp-cad-viewer&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
== 核心概念 ==&lt;br /&gt;
CadQuery 是一个基于 Python 的 3D CAD 建模库，其底层是 OpenCascade 几何内核。&lt;br /&gt;
&lt;br /&gt;
=== BREP 拓扑 ===&lt;br /&gt;
CadQuery 使用&#039;&#039;&#039;边界表示法（BREP）&#039;&#039;&#039;来定义 3D 物体，即物体由其表面来定义。基本的拓扑元素从简单到复杂依次为：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;顶点 (Vertex)&#039;&#039;&#039;：空间中的一个点&lt;br /&gt;
* &#039;&#039;&#039;边 (Edge)&#039;&#039;&#039;：连接两个或多个顶点的曲线段&lt;br /&gt;
* &#039;&#039;&#039;线框 (Wire)&#039;&#039;&#039;：一组相互连接的边&lt;br /&gt;
* &#039;&#039;&#039;面 (Face)&#039;&#039;&#039;：由线框围成的平面或曲面&lt;br /&gt;
* &#039;&#039;&#039;实体 (Solid)&#039;&#039;&#039;：由面围成的封闭三维体&lt;br /&gt;
* &#039;&#039;&#039;复合体 (Compound)&#039;&#039;&#039;：多个实体的集合&lt;br /&gt;
&lt;br /&gt;
=== API 层次结构 ===&lt;br /&gt;
CadQuery 提供了三个层次的 API，从上到下越来越灵活，但也越来越复杂。&lt;br /&gt;
==== 流畅 API ====&lt;br /&gt;
流畅 API是通过链式调用进行建模的接口，入门首选，简单易用。主要分为2类&lt;br /&gt;
* Workplane类，传统 3D 建模，最常用。 示例：&amp;lt;code&amp;gt;part = Workplane(&amp;quot;XY&amp;quot;).box(1,2,3).faces(&amp;quot;&amp;gt;Z&amp;quot;).circle(0.5).cutThruAll()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Sketch类，二维草图专用，更符合传统 CAD 绘图习惯，CadQuery 2.x版本引入。&lt;br /&gt;
&lt;br /&gt;
两者可以协同工作，如从二维草图开始创建三维模型Sketch → Workplane.placeSketch() → .extrude()，在现有模型上添加特征Workplane → 选面 → .sketch() → 修改 → .cutBlind()。典型工作流示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 创建一个带孔和圆角的平板&lt;br /&gt;
sketch_base = Sketch().rect(20, 15).constrain().solve()        # 底板轮廓&lt;br /&gt;
base = Workplane().placeSketch(sketch_base).extrude(3)         # 拉伸底板&lt;br /&gt;
&lt;br /&gt;
# 在底板上表面画圆孔&lt;br /&gt;
hole_sketch = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).sketch().circle(2).constrain().solve()&lt;br /&gt;
result = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).placeSketch(hole_sketch).cutBlind(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sketch 和 Workplane 的 2D 操作区别：&lt;br /&gt;
*Workplane 的 2D 操作：过程式建模，按顺序执行命令：画圆 → 移动 → 画矩形，尺寸硬编码数值，适用简单、固定的轮廓场景。&lt;br /&gt;
*Sketch ：约束驱动建模，定义几何约束如圆与矩形同心、相切等，尺寸约束 + 变量控制，适用复杂、参数化、需要设计意图的轮廓。&lt;br /&gt;
传统 CAD 中，设计意图（如&amp;quot;这个孔始终与板的中心对齐&amp;quot;）是通过约束实现的。Workplane 的过程式方式需要手动计算位置，参数变化时容易出错。Sketch约束后自动计算。当轮廓包含多个相互关联的图形时（如齿轮轮廓、法兰盘），约束系统能保证所有元素的关系正确。&lt;br /&gt;
&lt;br /&gt;
==== 直接 API ====&lt;br /&gt;
* 当流畅 API 不够用时使用，直接操作拓扑元素（顶点、边、面等）。&lt;br /&gt;
* 可以“自底向上”构建几何体，控制更精细。&lt;br /&gt;
* 示例：`wire = Wire.makeCircle(10); face = Face.makeFromWires(wire, [])`&lt;br /&gt;
&lt;br /&gt;
==== OCCT API ====&lt;br /&gt;
* 最底层，直接调用 OpenCascade 的 C++ 函数（通过 Python 绑定 `OCP`）。&lt;br /&gt;
* 极其强大但也极其繁琐，适合需要完全控制的场景。&lt;br /&gt;
* 示例：`from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox`&lt;br /&gt;
&lt;br /&gt;
=== 在 API 之间切换 ===&lt;br /&gt;
你可以根据需要混合使用不同层次的 API：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;从流畅 API 获取直接 API 对象&#039;&#039;&#039;：使用 `.val()` 或 `.findSolid()` 方法。&lt;br /&gt;
* &#039;&#039;&#039;从直接 API 对象回到流畅 API&#039;&#039;&#039;：将直接 API 对象作为参数传入新的 `Workplane`。&lt;br /&gt;
* &#039;&#039;&#039;获取底层的 OCCT 对象&#039;&#039;&#039;：直接 API 对象通过 `.wrapped` 属性即可获得。&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
选择器用于在已有模型上快速定位特征，相当于传统 CAD 中的鼠标选取。你可以通过字符串表达式选择面、边、顶点等。&lt;br /&gt;
* 例如：`faces(&amp;quot;&amp;gt;Z&amp;quot;)` 选择最上方的面，`edges(&amp;quot;&amp;gt;X&amp;quot;)` 选择 X 轴正方向的边。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API 参考==&lt;br /&gt;
=== 草图初始化 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch(parent, locs, obj)&amp;lt;/code&amp;gt; || 2D 草图，用于构建二维几何形状 || &amp;lt;code&amp;gt;s = Sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的 2D 草图对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 导入 DXF 文件并构建面 || &amp;lt;code&amp;gt;sketch = Sketch.importDXF(&amp;quot;profile.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入几何图形并创建草图&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sketch()&amp;lt;/code&amp;gt; || 初始化并返回一个草图 || &amp;lt;code&amp;gt;s = Workplane().sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;初始化一个新草图，通常在创建后自动调用&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.finalize()&amp;lt;/code&amp;gt; || 完成草图构造并返回父对象 || &amp;lt;code&amp;gt;result = sketch.finalize()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;完成草图编辑，返回父对象（通常用于链式调用）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.copy()&amp;lt;/code&amp;gt; || 创建草图的局部副本 || &amp;lt;code&amp;gt;s2 = s.copy()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图 s 的一个独立副本，用于后续修改而不影响原草图。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.located(loc)&amp;lt;/code&amp;gt; || 创建带有新位置的草图局部副本 || &amp;lt;code&amp;gt;sketch.located(Location(Vector(10, 0, 0)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图副本并平移到新位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.moved(....)&amp;lt;/code&amp;gt; || 创建移动后的面的草图局部副本 ||&amp;lt;code&amp;gt;sketch.moved(Vector(5, 5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将草图中的面移动后创建新副本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 草图选择 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.tag(name)&amp;lt;/code&amp;gt; || 为当前选择添加标签 || &amp;lt;code&amp;gt;sketch.rect(10, 10).tag(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形并为其添加标签 &amp;quot;outer&amp;quot;，便于后续选择&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.select(tag)&amp;lt;/code&amp;gt; || 根据标签选择元素 || &amp;lt;code&amp;gt;sketch.select(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择之前标记为 &amp;quot;outer&amp;quot; 的几何元素&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.reset()&amp;lt;/code&amp;gt; || 重置当前选择状态 || &amp;lt;code&amp;gt;sketch.reset()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;清除所有当前选中的元素，恢复到初始未选择状态&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.delete([mode])&amp;lt;/code&amp;gt; || 删除选中的对象 || &amp;lt;code&amp;gt;sketch.circle(5).tag(&amp;quot;hole&amp;quot;).delete()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆形后标记并删除它&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.faces([selector])&amp;lt;/code&amp;gt; || 选择面元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).faces().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形面并添加圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edges([selector])&amp;lt;/code&amp;gt; || 选择边元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).edges().chamfer(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有边并添加倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.vertices([selector])&amp;lt;/code&amp;gt; || 选择顶点元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).vertices().fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有顶点并添加圆角&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于面的草图绘制 ===&lt;br /&gt;
; Sketch Mode 类型说明&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;a&#039;&amp;lt;/code&amp;gt; - Add (添加) - 添加区域到草图 - 默认模式，创建实体区域&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;s&#039;&amp;lt;/code&amp;gt; - Subtract (减去) - 从现有区域中减去 - 创建孔洞或凹陷&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;i&#039;&amp;lt;/code&amp;gt; - Intersect (相交) - 保留与现有区域的交集 - 创建重叠部分&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;c&#039;&amp;lt;/code&amp;gt; - Construction (构造) - 创建辅助几何 - 辅助线/圆，不参与实体&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;g&#039;&amp;lt;/code&amp;gt; - Guide (引导) - 引导线 - 用于扫掠等操作&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.face(b[, angle, mode, tag, ...])&amp;lt;/code&amp;gt; || 从线框或边构建一个面 || &amp;lt;code&amp;gt;s = Sketch().face(wire, mode=&#039;a&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从闭合线框创建一个面，使用 ADD 模式添加到现有图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rect(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个矩形面 || &amp;lt;code&amp;gt;cq.Sketch().rect(10, 20).rect(5, 10, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x20 矩形，然后在其中减去一个 5x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.circle(r[, mode, tag])&amp;lt;/code&amp;gt; || 构建一个圆形面 || &amp;lt;code&amp;gt;s = cq.Sketch().circle(5).circle(3,mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个半径 5 的圆，然后在中心减去一个半径 3 的圆（形成环形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.ellipse(a1, a2[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个椭圆面 || &amp;lt;code&amp;gt;s = Sketch().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个长半轴 10、短半轴 5 的椭圆面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.trapezoid(w, h, a1[, a2, angle, ...])&amp;lt;/code&amp;gt; || 构建一个梯形面 || &amp;lt;code&amp;gt;s = Sketch().trapezoid(10, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个顶宽 10、高 5、顶部偏移 2 的梯形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.slot(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个槽形面 || &amp;lt;code&amp;gt;s = Sketch().slot(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制一个长度20、宽度5的槽形面（带圆角）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.regularPolygon(r, n[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个正多边形面 || &amp;lt;code&amp;gt;s = Sketch().regularPolygon(5, 6)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个外接圆半径 5、6 条边的正六边形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.polygon(pts[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个多边形面 || &amp;lt;code&amp;gt;s = Sketch().polygon([(0,0), (10,0), (5,8)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个由三个点构成的三角形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rarray(xs, ys, nx, ny)&amp;lt;/code&amp;gt; || 生成一个矩形位置阵列 || &amp;lt;code&amp;gt;s = cq.Sketch().rect(50, 40).rarray(4, 3, 12, 10).circle(2, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 3x3 矩形，然后在创建12x10的孔阵列。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.parray(r, a1, da, n[, rotate])&amp;lt;/code&amp;gt; || 生成极坐标阵列位置 || &amp;lt;code&amp;gt;sketch.parray(20, 0, 360, 8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建围绕中心、半径 20、从 0 度到 360 度均匀分布的 8 个极坐标阵列位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.distribute(n[, start, stop, rotate])&amp;lt;/code&amp;gt; || 沿选中的边或线框分布位置 || &amp;lt;code&amp;gt;sketch.rect(20, 10).edges().distribute(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿矩形选中边均匀分布 5 个位置点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.each(callback[, mode, tag, ...])&amp;lt;/code&amp;gt; || 对所有适用实体应用回调函数 || &amp;lt;code&amp;gt;sketch.rarray(5, 5, 3, 2).each(lambda loc: Sketch().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个阵列位置点执行回调，绘制半径为 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.push(locs[, tag])&amp;lt;/code&amp;gt; || 将当前选择设置为给定位置或点 || &amp;lt;code&amp;gt;sketch.push([Vector(0,0), Vector(10,10), Vector(20,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将三个位置点推入当前选择栈，作为后续操作的基准点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.hull([mode, tag])&amp;lt;/code&amp;gt; || 从当前选择或所有对象生成凸包 || &amp;lt;code&amp;gt;s = Sketch().circle(3).circle(5, (10,0)).hull()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建两个圆，然后生成包含它们的最小凸包面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.offset(d[, mode, tag])&amp;lt;/code&amp;gt; || 偏移选定的线框或边 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).offset(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后向外偏移 1 单位（形成更大的矩形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.fillet(r)&amp;lt;/code&amp;gt; || 基于当前选择添加圆角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加半径 1 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.chamfer(d)&amp;lt;/code&amp;gt; || 基于当前选择添加倒角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().chamfer(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加距离 1 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.clean()&amp;lt;/code&amp;gt; || 移除内部线。 || &amp;lt;code&amp;gt;sketch.clean()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;清理草图中内部的非边界线段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于边和约束的草图绘制 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edge(val[, tag, forConstruction])&amp;lt;/code&amp;gt; || 向草图中添加一条边 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;s = Sketch().edge(&amp;quot;|&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加一条水平线作为构造线（用于约束）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.segment(p1, p2)&amp;lt;/code&amp;gt; || 构建一条线段 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 (0,0) 到 (10,0) 添加一条线段&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.arc(p1, p2, p3)&amp;lt;/code&amp;gt; || 构建一条弧线 || &amp;lt;code&amp;gt;s = Sketch().arc((0,0), (5,5), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;通过三点添加一条圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.spline(pts)&amp;lt;/code&amp;gt; || 构造样条曲线边 || &amp;lt;code&amp;gt;sketch.spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过给定点的样条曲线边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.close()&amp;lt;/code&amp;gt; || 将最后一条边连接到第一条边 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0)).segment((10,0), (10,10)).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加两条垂直边后闭合，形成 L 形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.assemble([mode, tag])&amp;lt;/code&amp;gt; || 将边组合成面 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10, mode=Mode.PRIVATE).assemble()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建私有矩形边，然后组合成一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.constrain(constraint)&amp;lt;/code&amp;gt; || 添加一个约束 || &amp;lt;code&amp;gt;s = Sketch().circle(5).constrain((&amp;quot;distance&amp;quot;, &amp;quot;origin&amp;quot;, 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆，然后添加约束使其圆心距离原点 2 单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.solve()&amp;lt;/code&amp;gt; || 求解当前约束并更新边位置 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).constrain((&amp;quot;coincident&amp;quot;, &amp;quot;vertex0&amp;quot;, &amp;quot;vertex1&amp;quot;)).solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加重合约束后求解，更新几何位置&lt;br /&gt;
|}&lt;br /&gt;
=== Workplane初始化及其他 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane(, obj)&amp;lt;/code&amp;gt; || 在空间中定义一个坐标系，可用于2D坐标操作。 || &amp;lt;code&amp;gt;Workplane()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;创建一个新的Workplane对象，默认在XY平面原点。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tag(name)&amp;lt;/code&amp;gt; || 为当前栈顶对象添加标签，便于后续引用 || &amp;lt;code&amp;gt;wp = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().tag(&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;为立方体上表面创建的工作平面添加 &amp;quot;top&amp;quot; 标签，便于后续通过标签引用该工作平面  &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;cq.Workplane(&amp;quot;XY&amp;quot;).polygon(3, 5).extrude(4).tag(&amp;quot;prism&amp;quot;).sphere(10).faces(&amp;quot;&amp;lt;X&amp;quot;, tag=&amp;quot;prism&amp;quot;).workplane().circle(1).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;Tags也可以与大多数选择器一起使用。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.workplaneFromTagged(tag)&amp;lt;/code&amp;gt; || 从之前标记的标签恢复/复制工作平面 || &amp;lt;code&amp;gt;result = wp.workplaneFromTagged(&amp;quot;top&amp;quot;).circle(5).extrude(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从名为 &amp;quot;top&amp;quot; 的标签处恢复工作平面，在该平面上绘制半径为 5 的圆并拉伸 10 个单位（常用于多次从同一面挤出，避免选择器失效）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.copyWorkplane(other)&amp;lt;/code&amp;gt; || 复制另一个 Workplane 的平面信息到当前对象 || &amp;lt;code&amp;gt;new_wp = cq.Workplane().copyWorkplane(other_wp)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建新的工作平面，并将另一个工作平面 other_wp 的坐标系信息复制到新对象上&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2D 操作 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.center(x, y)&amp;lt;/code&amp;gt; || 将局部坐标移动到指定位置 || &amp;lt;code&amp;gt;result = cq.Workplane().center(5, 5).rect(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将工作平面中心移动到 (5,5) 后创建 10x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.lineTo(x, y[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点到指定点绘制一条线 || &amp;lt;code&amp;gt;result = cq.Workplane().moveTo(0,0).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从原点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.line(xDist, yDist[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制相对直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).line(5, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点相对移动 (5,5) 并绘制直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点垂直向上绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLineTo(yCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线到指定 Y 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;垂直绘制到 Y=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLineTo(xCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线到指定 X 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制到 X=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLine(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点按角度和长度绘制直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLine(10, 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;以 45 度角绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLineTo(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点绘制极坐标直线到指定位置 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLineTo(10, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到极坐标 (10, 90°) 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.moveTo(x, y)&amp;lt;/code&amp;gt; || 移动到指定点（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().moveTo(5, 5).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前点移动到 (5,5)（不绘制），然后从该点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.move([xDist, yDist])&amp;lt;/code&amp;gt; || 相对移动指定距离（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().move(3, 4).line(5, 0)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;相对移动 (3,4)（不绘制），然后水平绘制长度 5 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.spline(listOfXYTuple[, tangents, ...])&amp;lt;/code&amp;gt; || 创建通过给定点的样条曲线（2D或3D） || &amp;lt;code&amp;gt;cq.Workplane().spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过三个点的平滑样条曲线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricCurve(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲线 || &amp;lt;code&amp;gt;cq.Workplane().parametricCurve(lambda t: (t, t**2), N=50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲线 y=x² 的逼近样条，使用 50 个采样点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricSurface(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲面 || &amp;lt;code&amp;gt;cq.Workplane().parametricSurface(lambda u,v: (u, v, u*v))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲面 z=xy 的逼近曲面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.threePointArc(point1, point2[, ...])&amp;lt;/code&amp;gt; || 通过三个点绘制圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).threePointArc((5,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点通过 (5,0) 到 (10,0) 绘制圆弧（形成半圆）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sagittaArc(endPoint, sag[, ...])&amp;lt;/code&amp;gt; || 使用矢高（sagitta）定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).sagittaArc((10,0), 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、矢高 2 的圆弧（拱形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.radiusArc(endPoint, radius[, ...])&amp;lt;/code&amp;gt; || 使用半径定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).radiusArc((10,0), 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、半径 5 的圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tangentArcPoint(endPoint)&amp;lt;/code&amp;gt; || 从当前边末端绘制切线圆弧到指定点 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(5,0).tangentArcPoint((10,5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;先绘制水平线，然后绘制与前一条边相切的圆弧到 (10,5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorY()&amp;lt;/code&amp;gt; || 沿 Y 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorY()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 Y 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorX()&amp;lt;/code&amp;gt; || 沿 X 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorX()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 X 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wire([forConstruction])&amp;lt;/code&amp;gt; || 将所有待定边连接成线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).wire()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两条边连接成 L 形线框对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rect(xLen, yLen[, centered, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造矩形 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制 10x20 的矩形（默认 centered=True）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.circle(radius[, forConstruction])&amp;lt;/code&amp;gt; || 为栈上每个项构造圆 || &amp;lt;code&amp;gt;cq.Workplane().circle(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制半径 5 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipse(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造椭圆 || &amp;lt;code&amp;gt;cq.Workplane().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制长轴 10、短轴 5 的椭圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipseArc(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 绘制椭圆弧 || &amp;lt;code&amp;gt;cq.Workplane().ellipseArc(10, 5, 0, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制从 0° 到 90° 的椭圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polyline(listOfXYTuple[, ...])&amp;lt;/code&amp;gt; || 从点列表创建折线 || &amp;lt;code&amp;gt;cq.Workplane().polyline([(0,0), (10,0), (10,10)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制连接三个点的折线（L 形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.close()&amp;lt;/code&amp;gt; || 结束构建并尝试创建封闭线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;闭合当前绘制的轮廓，形成封闭矩形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rarray(xSpacing, ySpacing, xCount, ...)&amp;lt;/code&amp;gt; || 创建矩形阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().rarray(10, 10, 3, 2).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 3 列 2 行、间距 10 的矩形阵列点，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarArray(radius, startAngle, ...)&amp;lt;/code&amp;gt; || 创建极坐标阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().polarArray(20, 0, 360, 8).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 8 个点的 360° 极坐标阵列，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.slot2D(length, diameter[, angle])&amp;lt;/code&amp;gt; || 创建带圆角的槽形 || &amp;lt;code&amp;gt;cq.Workplane().slot2D(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点创建长度 20、宽度 5 的跑道形槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.offset2D(d[, kind, forConstruction])&amp;lt;/code&amp;gt; || 创建 2D 偏移线框 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).offset2D(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x10 矩形线框向外偏移 2 个单位，生成更大的矩形。&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;cq.Workplane().box(4, 2, 0.5).faces(&amp;quot;&amp;gt;Z&amp;quot;).edges().toPending().offset2D(-0.25, forConstruction=True).vertices().cboreHole(0.125, 0.25, 0.125, depth=None)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在顶面向里偏离0.25，再在四个顶点打螺栓孔。&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.placeSketch(sketch)&amp;lt;/code&amp;gt; || 根据栈上项放置草图 || &amp;lt;code&amp;gt;cq.Workplane().placeSketch(mySketch).extrude(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Sketch 对象放置到当前 Workplane 位置，然后拉伸 5 个单位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（需要活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cboreHole(diameter, cboreDiameter, cboreDepth[, depth, clean])&amp;lt;/code&amp;gt; || 创建沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cboreHole(5, 10, 3, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、沉头直径 10、沉头深度 3、总深 8 的沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cskHole(diameter, cskDiameter, cskAngle[, depth, clean])&amp;lt;/code&amp;gt; || 创建锥形沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cskHole(5, 10, 90, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、锥头直径 10、锥角 90° 的锥形沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hole(diameter[, depth, clean])&amp;lt;/code&amp;gt; || 创建通孔或盲孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、深度 8 的盲孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.extrude(until[, combine, clean, both, taper])&amp;lt;/code&amp;gt; || 将线框挤出为棱柱体，可以给定数值，或&#039;next&#039;,&#039;last &#039;,或输入一个对象的Face。 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).extrude(30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x20 矩形沿法线方向挤出高度 30 的实体&amp;lt;br/&amp;gt; &amp;lt;code&amp;gt;result = cq.Workplane(origin=(20, 0, 0)).circle(2).revolve(180, (-20, 0, 0), (-20, -1, 0)).center(-20, 0).workplane().rect(10, 4).extrude(&amp;quot;last&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cut(toCut[, clean, tol])&amp;lt;/code&amp;gt; || 从当前实体切除另一个实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 10).cut(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从盒子中减去半径为 8 的球体（布尔差集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutBlind(until[, clean, both, taper])&amp;lt;/code&amp;gt; || 盲切（有限深度挤出切除） || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutBlind(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓沿法线方向挤出切除深度 15 的槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutThruAll([clean, taper])&amp;lt;/code&amp;gt; || 贯穿切除 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓贯穿整个实体进行切除&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.box(length, width, height[, centered, combine])&amp;lt;/code&amp;gt; || 创建立方体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 20, 30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建长 10、宽 20、高 30 的长方体（默认 centered=True，中心位于原点）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sphere(radius[, direct, angle1, angle2, combine])&amp;lt;/code&amp;gt; || 创建球体 || &amp;lt;code&amp;gt;result = cq.Workplane().sphere(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在当前工作平面位置创建半径 10 的球体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wedge(dx, dy, dz, xmin, zmin, xmax, zmax[, combine])&amp;lt;/code&amp;gt; || 创建楔形体 || &amp;lt;code&amp;gt;result = cq.Workplane().wedge(10, 20, 30, 0, 0, 10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建指定尺寸的楔形实体（类似三棱柱形状）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cylinder(height, radius[, direct, angle, combine])&amp;lt;/code&amp;gt; || 创建圆柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().cylinder(30, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建高度 30、半径 10 的圆柱体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.union([toUnion, clean, glue, tol])&amp;lt;/code&amp;gt; || 合并实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将球体与当前实体合并（布尔并集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.combine([clean, glue, tol])&amp;lt;/code&amp;gt; || 合并栈上所有实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5)).combine()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前栈中的多个实体合并为一个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.intersect(toIntersect[, clean, tol])&amp;lt;/code&amp;gt; || 与当前实体进行布尔交集运算 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).intersect(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10x10 的立方体，然后与半径 8 的球体进行布尔交集，保留两者重叠的部分&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.loft([ruled, combine, clean])&amp;lt;/code&amp;gt; || 放样多个截面 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 10).workplane(offset=5).rect(5, 5).loft()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两个不同尺寸的矩形截面放样成 3D 实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sweep(path[, multisection, transition, combine, clean])&amp;lt;/code&amp;gt; || 沿路径扫掠截面 || &amp;lt;code&amp;gt;path = cq.Workplane().spline([(0,0,0), (0,0,10)])&amp;lt;br/&amp;gt;result = cq.Workplane().circle(2).sweep(path)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿样条曲线路径扫掠圆形截面，生成弯曲管道&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.twistExtrude(distance, angleDegrees)&amp;lt;/code&amp;gt; || 在拉伸的同时扭转指定角度 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 5).twistExtrude(20, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 5x5 矩形沿法线方向拉伸 20 个单位，同时从底部到顶部扭转 90°&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.revolve([angleDegrees, axisStart, axisEnd, combine, clean])&amp;lt;/code&amp;gt; || 绕轴旋转生成实体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 10).revolve(360, (0,0), (0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形轮廓绕 Y 轴旋转 360° 生成回转体（类似圆环体或圆柱）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.text(txt, fontsize, distance[, ...])&amp;lt;/code&amp;gt; || 返回 3D 文本实体 || &amp;lt;code&amp;gt;result = cq.Workplane().text(&amp;quot;CadQuery&amp;quot;, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建内容为 &amp;quot;CadQuery&amp;quot;、字体高度 5、拉伸深度 2 的 3D 文本实体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（无需活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shell(thickness[, kind])&amp;lt;/code&amp;gt; || 移除选定的面以创建指定厚度的壳体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 5).faces(&amp;quot;&amp;gt;Z&amp;quot;).shell(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个盒子，移除顶面后形成壁厚 0.5 的壳体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.fillet(radius)&amp;lt;/code&amp;gt; || 在选定的边上添加圆角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加半径 2 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.chamfer(length[, length2])&amp;lt;/code&amp;gt; || 在选定的边上添加倒角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).chamfer(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加距离 2 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotate(axisStartPoint, axisEndPoint, angleDegrees)&amp;lt;/code&amp;gt; || 返回旋转后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotate((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绕 X 轴旋转立方体 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotateAboutCenter(axisEndPoint, ...)&amp;lt;/code&amp;gt; || 绕指定轴旋转栈中所有项 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotateAboutCenter((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 10x10x10 立方体，然后绕 X 轴（通过原点沿 X 方向）旋转 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.translate(vec)&amp;lt;/code&amp;gt; || 返回平移后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).translate((5, 0, 0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将立方体沿 X 轴平移 5 个单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirror([mirrorPlane, ...])&amp;lt;/code&amp;gt; || 镜像单个 CQ 对象 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).mirror(&amp;quot;YZ&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后，以 YZ 平面为镜像平面进行镜像&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 迭代方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.each(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 对栈中的每个值运行提供的函数，并将返回值收集到新的 CQ 对象中 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).each(lambda loc: cq.Workplane().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在矩形阵列的每个位置点执行回调函数，在每个点处创建半径为 2 的圆，并收集所有结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.eachpoint(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 与 each() 类似，但回调函数的参数会根据栈中位置进行平移 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).eachpoint(lambda pos: cq.Workplane().circle(2).translate(pos))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个位置点处创建圆，回调函数接收位置向量作为参数，便于创建相对于每个点的几何体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 栈与选择器方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.all()&amp;lt;/code&amp;gt; || 返回栈中所有 CQ 对象的列表 || &amp;lt;code&amp;gt;objects = cq.Workplane().box(10, 10, 10).faces().all()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体所有面的列表，返回包含每个面对象的列表&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.size()&amp;lt;/code&amp;gt; || 返回栈中当前对象的数量 || &amp;lt;code&amp;gt;count = cq.Workplane().box(10, 10, 10).faces().size()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体面的数量（返回 6）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vals()&amp;lt;/code&amp;gt; || 获取当前列表中的值 || &amp;lt;code&amp;gt;values = cq.Workplane().box(10, 10, 10).faces().vals()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取所有面对象的原始值（TopoDS_Shape 列表）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.add(obj)&amp;lt;/code&amp;gt; || 向栈中添加一个对象或对象列表 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后添加球体到栈中，栈中现在包含两个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.val()&amp;lt;/code&amp;gt; || 返回栈中的第一个值 || &amp;lt;code&amp;gt;first = cq.Workplane().box(10, 10, 10).faces().val()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.first()&amp;lt;/code&amp;gt; || 返回栈中的第一个项 || &amp;lt;code&amp;gt;first_item = cq.Workplane().box(10, 10, 10).faces().first()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面（与 val() 类似）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.item(i)&amp;lt;/code&amp;gt; || 返回栈中的第 i 个项 || &amp;lt;code&amp;gt;third_face = cq.Workplane().box(10, 10, 10).faces().item(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第三个面（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.last()&amp;lt;/code&amp;gt; || 返回栈中的最后一个项 || &amp;lt;code&amp;gt;last_face = cq.Workplane().box(10, 10, 10).faces().last()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的最后一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.end([n])&amp;lt;/code&amp;gt; || 返回此 CQ 元素的第 n 级父对象 || &amp;lt;code&amp;gt;parent = cq.Workplane().box(10, 10, 10).faces().vertices().end(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从顶点选择返回两级父对象（返回到实体层级）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vertices([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的顶点，可选择过滤 || &amp;lt;code&amp;gt;vertices = cq.Workplane().box(10, 10, 10).vertices()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体的所有 8 个顶点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.faces([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的面，可选择过滤 || &amp;lt;code&amp;gt;top_face = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体上表面（法线方向为正 Z 的面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.edges([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的边，可选择过滤 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vertical_edges = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体所有垂直边（平行于 Z 轴）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wires([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的线框，可选择过滤 || &amp;lt;code&amp;gt;wires = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).wires()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体顶面的外轮廓线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.solids([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的实体，可选择过滤 || &amp;lt;code&amp;gt;solids = cq.Workplane().box(10, 10, 10).solids()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体实体（通常只有一个）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shells([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的壳体，可选择过滤 || &amp;lt;code&amp;gt;shells = cq.Workplane().box(10, 10, 10).shell(0.5).shells()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建壳体后选择壳体对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.compounds([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中的复合体，可选择过滤 || &amp;lt;code&amp;gt;compounds = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5)).compounds()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;合并立方体和球体后，选择复合体对象&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NearestToPointSelector(pnt)&amp;lt;/code&amp;gt; || 选择离指定点最近的对象 || &amp;lt;code&amp;gt;nearest = cq.Workplane().box(10, 10, 10).faces(NearestToPointSelector((0,0,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择距离点 (0,0,5) 最近的面（通常为上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BoxSelector(point0, point1[, boundingbox])&amp;lt;/code&amp;gt; || 选择由两点定义的 3D 框内的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(BoxSelector((-5,-5,-5), (5,5,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择位于立方体边界框内的所有面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BaseDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 基于单个方向向量进行选择的基础选择器 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(BaseDirSelector((0,0,1), 0.01))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择方向与 Z 轴对齐的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ParallelDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向平行的对象 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(ParallelDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的边（即所有垂直边）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向对齐的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(DirectionSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向为 Z 轴方向的面（上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionNthSelector(vector, n[, ...])&amp;lt;/code&amp;gt; || 过滤与指定方向平行（或垂直）的对象，返回第 N 个 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(DirectionNthSelector((0,0,1), 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的第 3 条边（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LengthNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个长度的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(LengthNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择长度最短的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AreaNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个面积的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(AreaNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择面积最小的面（10x10 的面中最小为 100）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RadiusNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个半径的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().cylinder(10, 5).edges(RadiusNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择半径最小的边（圆柱体上下圆边半径 5）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PerpendicularDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向垂直的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(PerpendicularDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向与 Z 轴垂直的面（四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypeSelector(typeString)&amp;lt;/code&amp;gt; || 选择具有指定几何类型的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(TypeSelector(&amp;quot;PLANE&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有平面类型的面（立方体所有面都是平面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionMinMaxSelector(vector, minOrMax)&amp;lt;/code&amp;gt; || 选择在指定方向上最近或最远的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(DirectionMinMaxSelector((0,0,1), &amp;quot;MAX&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择在 Z 轴方向上最远的面（即上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CenterNthSelector(vector, n[, directionMax, ...])&amp;lt;/code&amp;gt; || 按中心在指定方向上投影的距离排序，选择第 N 个对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(CenterNthSelector((0,0,1), 1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;按面中心在 Z 轴投影距离排序，选择第 2 个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AndSelector(left, right)&amp;lt;/code&amp;gt; || 交集选择器（同时满足两个选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(AndSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向的平面（即上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SumSelector(left, right)&amp;lt;/code&amp;gt; || 并集选择器（满足任一选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SumSelector(DirectionSelector((0,0,1)), DirectionSelector((1,0,0))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴或 X 轴方向的面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SubtractSelector(left, right)&amp;lt;/code&amp;gt; || 差集选择器（满足 left 但不满足 right） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SubtractSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向但非平面的面（立方体中无结果）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;InverseSelector(selector)&amp;lt;/code&amp;gt; || 反转给定选择器的选择结果 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(InverseSelector(DirectionSelector((0,0,1))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有法线方向不是 Z 轴的面（即四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringSyntaxSelector(selectorString)&amp;lt;/code&amp;gt; || 使用简单字符串语法过滤对象列表 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(StringSyntaxSelector(&amp;quot;&amp;gt;Z&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用字符串语法选择法线方向为正 Z 的面（等价于 &amp;quot;&amp;gt;Z&amp;quot;）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 装配体 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly([obj, loc, name, color, material, ...])&amp;lt;/code&amp;gt; || 嵌套的 Workplane 和 Shape 对象装配体，定义它们的相对位置 || &amp;lt;code&amp;gt;assy = cq.Assembly()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的装配体对象，用于组织和定位多个零件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.add(obj[, loc, name, color, ...])&amp;lt;/code&amp;gt; || 向当前装配体添加子装配体或零件 || &amp;lt;code&amp;gt;assy.add(cq.Workplane().box(10, 10, 5), name=&amp;quot;base&amp;quot;)&amp;lt;br/&amp;gt;assy.add(cq.Workplane().sphere(3), loc=cq.Location((0,0,5)), name=&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;向装配体添加底座（立方体）和顶部球体，并指定位置和名称&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.save(path[, exportType, mode, ...])&amp;lt;/code&amp;gt; || 将装配体保存到文件 || &amp;lt;code&amp;gt;assy.save(&amp;quot;assembly.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将装配体保存为 STEP 文件，支持 STEP、STL、VRML 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.constrain(constraint)&amp;lt;/code&amp;gt; || 定义一个新的约束 || &amp;lt;code&amp;gt;assy.constrain(&amp;quot;base&amp;quot;, &amp;quot;top&amp;quot;, &amp;quot;Axis&amp;quot;, (0,0,1), (0,0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;约束底座和顶部的 Z 轴对齐，使球体位于底座正上方&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.solve([verbosity])&amp;lt;/code&amp;gt; || 求解所有已定义的约束 || &amp;lt;code&amp;gt;assy.solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;求解所有约束，自动调整零件位置以满足约束条件，verbosity=1 可输出求解详情&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Color(r, g, b[, a])&amp;lt;/code&amp;gt; || OCCT 颜色对象 Quantity_ColorRGBA 的包装器 || &amp;lt;code&amp;gt;red = cq.Color(1, 0, 0)&amp;lt;br/&amp;gt;assy.add(part, color=red)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建红色颜色对象，并将其应用于装配体中的零件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 导出与导入 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.toSvg([opts])&amp;lt;/code&amp;gt; || 返回表示栈中第一个项的 SVG 文本 || &amp;lt;code&amp;gt;svg_text = cq.Workplane().rect(10, 10).toSvg()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并将其转换为 SVG 文本字符串，可用于网页显示或保存&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.exportSvg(fileName)&amp;lt;/code&amp;gt; || 将栈中第一个项导出为 SVG 文件 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).exportSvg(&amp;quot;rectangle.svg&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并导出为 &amp;quot;rectangle.svg&amp;quot; 文件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importStep(fileName)&amp;lt;/code&amp;gt; || 加载 STEP 文件到 CadQuery Workplane || &amp;lt;code&amp;gt;part = cq.importers.importStep(&amp;quot;model.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 &amp;quot;model.step&amp;quot; 文件导入 3D 模型，返回 Workplane 对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 加载 DXF 文件到 Workplane || &amp;lt;code&amp;gt;sketch = cq.importers.importDXF(&amp;quot;profile.dxf&amp;quot;, tol=0.01)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入 2D 轮廓，容差设为 0.01&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exporters.export(w, fname[, exportType, ...])&amp;lt;/code&amp;gt; || 将 Workplane 或 Shape 导出到文件 || &amp;lt;code&amp;gt;cq.exporters.export(part, &amp;quot;output.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Workplane 对象导出为 STEP 文件，支持 STL、STEP、SVG 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;occ_impl.exporters.dxf.DxfDocument([...])&amp;lt;/code&amp;gt; || 从 CadQuery 对象创建 DXF 文档 || &amp;lt;code&amp;gt;doc = cq.occ_impl.exporters.dxf.DxfDocument()&amp;lt;br/&amp;gt;doc.addShape(sketch)&amp;lt;br/&amp;gt;doc.save(&amp;quot;output.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 DXF 文档对象，添加几何形状后保存为 DXF 文件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CadQuery&amp;diff=1743</id>
		<title>CadQuery</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CadQuery&amp;diff=1743"/>
		<updated>2026-04-02T02:18:14Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* Workplane 初始化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CadQuery 是一个基于 [[Python]] 的参数化 3D CAD 库，底层使用 OpenCascade（OCCT）内核。支持输出STL、STEP、AMF和3MF的CAD格式。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
最简单方式使用CQ-Editor（官方的 GUI 编辑器），或者使用常用的编辑器+插件，如VS Code编辑器和OCP CAD Viewer插件。&lt;br /&gt;
===CQ-Editor===&lt;br /&gt;
安装CQ-editor编辑器，会自动安装cadquery，通过pip安装：&lt;br /&gt;
 pip install CQ-editor&lt;br /&gt;
安装后，通过命令行启动：&lt;br /&gt;
 CQ-editor&lt;br /&gt;
&lt;br /&gt;
https://github.com/CadQuery/CQ-editor/wiki/Installation&lt;br /&gt;
&lt;br /&gt;
===VS Code===&lt;br /&gt;
VS Code中，先安装cadquery，在安装OCP CAD Viewer插件。&lt;br /&gt;
 pip install cadquery&lt;br /&gt;
安装cadquery后，在[[VS Code]]插件中查找OCP CAD Viewer安装，方便在VS Code查看模型，安装后在VS Code运行查看下。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import cadquery as cq&lt;br /&gt;
from ocp_vscode import show, show_object&lt;br /&gt;
&lt;br /&gt;
result = cq.Workplane(&amp;quot;XY&amp;quot;).box(2,2,2).shell(0.2)&lt;br /&gt;
show_object(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
如果出现错误，不显示模型，在VS Code左侧栏点击OCP图标，在点击ocp_vscode行右侧的Open viewer按钮，就会显示RUNNING并运行，再次运行代码即可。&lt;br /&gt;
&lt;br /&gt;
https://cadquery.readthedocs.io/en/latest/installation.html&lt;br /&gt;
https://github.com/bernhard-42/vscode-ocp-cad-viewer&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
== 核心概念 ==&lt;br /&gt;
CadQuery 是一个基于 Python 的 3D CAD 建模库，其底层是 OpenCascade 几何内核。&lt;br /&gt;
&lt;br /&gt;
=== BREP 拓扑 ===&lt;br /&gt;
CadQuery 使用&#039;&#039;&#039;边界表示法（BREP）&#039;&#039;&#039;来定义 3D 物体，即物体由其表面来定义。基本的拓扑元素从简单到复杂依次为：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;顶点 (Vertex)&#039;&#039;&#039;：空间中的一个点&lt;br /&gt;
* &#039;&#039;&#039;边 (Edge)&#039;&#039;&#039;：连接两个或多个顶点的曲线段&lt;br /&gt;
* &#039;&#039;&#039;线框 (Wire)&#039;&#039;&#039;：一组相互连接的边&lt;br /&gt;
* &#039;&#039;&#039;面 (Face)&#039;&#039;&#039;：由线框围成的平面或曲面&lt;br /&gt;
* &#039;&#039;&#039;实体 (Solid)&#039;&#039;&#039;：由面围成的封闭三维体&lt;br /&gt;
* &#039;&#039;&#039;复合体 (Compound)&#039;&#039;&#039;：多个实体的集合&lt;br /&gt;
&lt;br /&gt;
=== API 层次结构 ===&lt;br /&gt;
CadQuery 提供了三个层次的 API，从上到下越来越灵活，但也越来越复杂。&lt;br /&gt;
==== 流畅 API ====&lt;br /&gt;
流畅 API是通过链式调用进行建模的接口，入门首选，简单易用。主要分为2类&lt;br /&gt;
* Workplane类，传统 3D 建模，最常用。 示例：&amp;lt;code&amp;gt;part = Workplane(&amp;quot;XY&amp;quot;).box(1,2,3).faces(&amp;quot;&amp;gt;Z&amp;quot;).circle(0.5).cutThruAll()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Sketch类，二维草图专用，更符合传统 CAD 绘图习惯，CadQuery 2.x版本引入。&lt;br /&gt;
&lt;br /&gt;
两者可以协同工作，如从二维草图开始创建三维模型Sketch → Workplane.placeSketch() → .extrude()，在现有模型上添加特征Workplane → 选面 → .sketch() → 修改 → .cutBlind()。典型工作流示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 创建一个带孔和圆角的平板&lt;br /&gt;
sketch_base = Sketch().rect(20, 15).constrain().solve()        # 底板轮廓&lt;br /&gt;
base = Workplane().placeSketch(sketch_base).extrude(3)         # 拉伸底板&lt;br /&gt;
&lt;br /&gt;
# 在底板上表面画圆孔&lt;br /&gt;
hole_sketch = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).sketch().circle(2).constrain().solve()&lt;br /&gt;
result = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).placeSketch(hole_sketch).cutBlind(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sketch 和 Workplane 的 2D 操作区别：&lt;br /&gt;
*Workplane 的 2D 操作：过程式建模，按顺序执行命令：画圆 → 移动 → 画矩形，尺寸硬编码数值，适用简单、固定的轮廓场景。&lt;br /&gt;
*Sketch ：约束驱动建模，定义几何约束如圆与矩形同心、相切等，尺寸约束 + 变量控制，适用复杂、参数化、需要设计意图的轮廓。&lt;br /&gt;
传统 CAD 中，设计意图（如&amp;quot;这个孔始终与板的中心对齐&amp;quot;）是通过约束实现的。Workplane 的过程式方式需要手动计算位置，参数变化时容易出错。Sketch约束后自动计算。当轮廓包含多个相互关联的图形时（如齿轮轮廓、法兰盘），约束系统能保证所有元素的关系正确。&lt;br /&gt;
&lt;br /&gt;
==== 直接 API ====&lt;br /&gt;
* 当流畅 API 不够用时使用，直接操作拓扑元素（顶点、边、面等）。&lt;br /&gt;
* 可以“自底向上”构建几何体，控制更精细。&lt;br /&gt;
* 示例：`wire = Wire.makeCircle(10); face = Face.makeFromWires(wire, [])`&lt;br /&gt;
&lt;br /&gt;
==== OCCT API ====&lt;br /&gt;
* 最底层，直接调用 OpenCascade 的 C++ 函数（通过 Python 绑定 `OCP`）。&lt;br /&gt;
* 极其强大但也极其繁琐，适合需要完全控制的场景。&lt;br /&gt;
* 示例：`from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox`&lt;br /&gt;
&lt;br /&gt;
=== 在 API 之间切换 ===&lt;br /&gt;
你可以根据需要混合使用不同层次的 API：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;从流畅 API 获取直接 API 对象&#039;&#039;&#039;：使用 `.val()` 或 `.findSolid()` 方法。&lt;br /&gt;
* &#039;&#039;&#039;从直接 API 对象回到流畅 API&#039;&#039;&#039;：将直接 API 对象作为参数传入新的 `Workplane`。&lt;br /&gt;
* &#039;&#039;&#039;获取底层的 OCCT 对象&#039;&#039;&#039;：直接 API 对象通过 `.wrapped` 属性即可获得。&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
选择器用于在已有模型上快速定位特征，相当于传统 CAD 中的鼠标选取。你可以通过字符串表达式选择面、边、顶点等。&lt;br /&gt;
* 例如：`faces(&amp;quot;&amp;gt;Z&amp;quot;)` 选择最上方的面，`edges(&amp;quot;&amp;gt;X&amp;quot;)` 选择 X 轴正方向的边。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API 参考==&lt;br /&gt;
=== 草图初始化 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch(parent, locs, obj)&amp;lt;/code&amp;gt; || 2D 草图，用于构建二维几何形状 || &amp;lt;code&amp;gt;s = Sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的 2D 草图对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 导入 DXF 文件并构建面 || &amp;lt;code&amp;gt;sketch = Sketch.importDXF(&amp;quot;profile.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入几何图形并创建草图&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sketch()&amp;lt;/code&amp;gt; || 初始化并返回一个草图 || &amp;lt;code&amp;gt;s = Workplane().sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;初始化一个新草图，通常在创建后自动调用&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.finalize()&amp;lt;/code&amp;gt; || 完成草图构造并返回父对象 || &amp;lt;code&amp;gt;result = sketch.finalize()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;完成草图编辑，返回父对象（通常用于链式调用）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.copy()&amp;lt;/code&amp;gt; || 创建草图的局部副本 || &amp;lt;code&amp;gt;s2 = s.copy()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图 s 的一个独立副本，用于后续修改而不影响原草图。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.located(loc)&amp;lt;/code&amp;gt; || 创建带有新位置的草图局部副本 || &amp;lt;code&amp;gt;sketch.located(Location(Vector(10, 0, 0)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图副本并平移到新位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.moved(....)&amp;lt;/code&amp;gt; || 创建移动后的面的草图局部副本 ||&amp;lt;code&amp;gt;sketch.moved(Vector(5, 5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将草图中的面移动后创建新副本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 草图选择 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.tag(name)&amp;lt;/code&amp;gt; || 为当前选择添加标签 || &amp;lt;code&amp;gt;sketch.rect(10, 10).tag(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形并为其添加标签 &amp;quot;outer&amp;quot;，便于后续选择&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.select(tag)&amp;lt;/code&amp;gt; || 根据标签选择元素 || &amp;lt;code&amp;gt;sketch.select(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择之前标记为 &amp;quot;outer&amp;quot; 的几何元素&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.reset()&amp;lt;/code&amp;gt; || 重置当前选择状态 || &amp;lt;code&amp;gt;sketch.reset()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;清除所有当前选中的元素，恢复到初始未选择状态&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.delete([mode])&amp;lt;/code&amp;gt; || 删除选中的对象 || &amp;lt;code&amp;gt;sketch.circle(5).tag(&amp;quot;hole&amp;quot;).delete()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆形后标记并删除它&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.faces([selector])&amp;lt;/code&amp;gt; || 选择面元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).faces().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形面并添加圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edges([selector])&amp;lt;/code&amp;gt; || 选择边元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).edges().chamfer(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有边并添加倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.vertices([selector])&amp;lt;/code&amp;gt; || 选择顶点元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).vertices().fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有顶点并添加圆角&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于面的草图绘制 ===&lt;br /&gt;
; Sketch Mode 类型说明&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;a&#039;&amp;lt;/code&amp;gt; - Add (添加) - 添加区域到草图 - 默认模式，创建实体区域&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;s&#039;&amp;lt;/code&amp;gt; - Subtract (减去) - 从现有区域中减去 - 创建孔洞或凹陷&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;i&#039;&amp;lt;/code&amp;gt; - Intersect (相交) - 保留与现有区域的交集 - 创建重叠部分&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;c&#039;&amp;lt;/code&amp;gt; - Construction (构造) - 创建辅助几何 - 辅助线/圆，不参与实体&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;g&#039;&amp;lt;/code&amp;gt; - Guide (引导) - 引导线 - 用于扫掠等操作&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.face(b[, angle, mode, tag, ...])&amp;lt;/code&amp;gt; || 从线框或边构建一个面 || &amp;lt;code&amp;gt;s = Sketch().face(wire, mode=&#039;a&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从闭合线框创建一个面，使用 ADD 模式添加到现有图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rect(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个矩形面 || &amp;lt;code&amp;gt;cq.Sketch().rect(10, 20).rect(5, 10, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x20 矩形，然后在其中减去一个 5x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.circle(r[, mode, tag])&amp;lt;/code&amp;gt; || 构建一个圆形面 || &amp;lt;code&amp;gt;s = cq.Sketch().circle(5).circle(3,mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个半径 5 的圆，然后在中心减去一个半径 3 的圆（形成环形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.ellipse(a1, a2[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个椭圆面 || &amp;lt;code&amp;gt;s = Sketch().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个长半轴 10、短半轴 5 的椭圆面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.trapezoid(w, h, a1[, a2, angle, ...])&amp;lt;/code&amp;gt; || 构建一个梯形面 || &amp;lt;code&amp;gt;s = Sketch().trapezoid(10, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个顶宽 10、高 5、顶部偏移 2 的梯形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.slot(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个槽形面 || &amp;lt;code&amp;gt;s = Sketch().slot(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制一个长度20、宽度5的槽形面（带圆角）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.regularPolygon(r, n[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个正多边形面 || &amp;lt;code&amp;gt;s = Sketch().regularPolygon(5, 6)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个外接圆半径 5、6 条边的正六边形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.polygon(pts[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个多边形面 || &amp;lt;code&amp;gt;s = Sketch().polygon([(0,0), (10,0), (5,8)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个由三个点构成的三角形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rarray(xs, ys, nx, ny)&amp;lt;/code&amp;gt; || 生成一个矩形位置阵列 || &amp;lt;code&amp;gt;s = cq.Sketch().rect(50, 40).rarray(4, 3, 12, 10).circle(2, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 3x3 矩形，然后在创建12x10的孔阵列。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.parray(r, a1, da, n[, rotate])&amp;lt;/code&amp;gt; || 生成极坐标阵列位置 || &amp;lt;code&amp;gt;sketch.parray(20, 0, 360, 8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建围绕中心、半径 20、从 0 度到 360 度均匀分布的 8 个极坐标阵列位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.distribute(n[, start, stop, rotate])&amp;lt;/code&amp;gt; || 沿选中的边或线框分布位置 || &amp;lt;code&amp;gt;sketch.rect(20, 10).edges().distribute(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿矩形选中边均匀分布 5 个位置点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.each(callback[, mode, tag, ...])&amp;lt;/code&amp;gt; || 对所有适用实体应用回调函数 || &amp;lt;code&amp;gt;sketch.rarray(5, 5, 3, 2).each(lambda loc: Sketch().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个阵列位置点执行回调，绘制半径为 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.push(locs[, tag])&amp;lt;/code&amp;gt; || 将当前选择设置为给定位置或点 || &amp;lt;code&amp;gt;sketch.push([Vector(0,0), Vector(10,10), Vector(20,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将三个位置点推入当前选择栈，作为后续操作的基准点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.hull([mode, tag])&amp;lt;/code&amp;gt; || 从当前选择或所有对象生成凸包 || &amp;lt;code&amp;gt;s = Sketch().circle(3).circle(5, (10,0)).hull()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建两个圆，然后生成包含它们的最小凸包面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.offset(d[, mode, tag])&amp;lt;/code&amp;gt; || 偏移选定的线框或边 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).offset(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后向外偏移 1 单位（形成更大的矩形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.fillet(r)&amp;lt;/code&amp;gt; || 基于当前选择添加圆角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加半径 1 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.chamfer(d)&amp;lt;/code&amp;gt; || 基于当前选择添加倒角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().chamfer(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加距离 1 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.clean()&amp;lt;/code&amp;gt; || 移除内部线。 || &amp;lt;code&amp;gt;sketch.clean()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;清理草图中内部的非边界线段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于边和约束的草图绘制 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edge(val[, tag, forConstruction])&amp;lt;/code&amp;gt; || 向草图中添加一条边 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;s = Sketch().edge(&amp;quot;|&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加一条水平线作为构造线（用于约束）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.segment(p1, p2)&amp;lt;/code&amp;gt; || 构建一条线段 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 (0,0) 到 (10,0) 添加一条线段&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.arc(p1, p2, p3)&amp;lt;/code&amp;gt; || 构建一条弧线 || &amp;lt;code&amp;gt;s = Sketch().arc((0,0), (5,5), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;通过三点添加一条圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.spline(pts)&amp;lt;/code&amp;gt; || 构造样条曲线边 || &amp;lt;code&amp;gt;sketch.spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过给定点的样条曲线边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.close()&amp;lt;/code&amp;gt; || 将最后一条边连接到第一条边 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0)).segment((10,0), (10,10)).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加两条垂直边后闭合，形成 L 形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.assemble([mode, tag])&amp;lt;/code&amp;gt; || 将边组合成面 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10, mode=Mode.PRIVATE).assemble()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建私有矩形边，然后组合成一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.constrain(constraint)&amp;lt;/code&amp;gt; || 添加一个约束 || &amp;lt;code&amp;gt;s = Sketch().circle(5).constrain((&amp;quot;distance&amp;quot;, &amp;quot;origin&amp;quot;, 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆，然后添加约束使其圆心距离原点 2 单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.solve()&amp;lt;/code&amp;gt; || 求解当前约束并更新边位置 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).constrain((&amp;quot;coincident&amp;quot;, &amp;quot;vertex0&amp;quot;, &amp;quot;vertex1&amp;quot;)).solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加重合约束后求解，更新几何位置&lt;br /&gt;
|}&lt;br /&gt;
=== Workplane初始化及其他 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane(, obj)&amp;lt;/code&amp;gt; || 在空间中定义一个坐标系，可用于2D坐标操作。 || &amp;lt;code&amp;gt;Workplane()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;创建一个新的Workplane对象，默认在XY平面原点。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tag(name)&amp;lt;/code&amp;gt; || 为当前栈顶对象添加标签，便于后续引用 || &amp;lt;code&amp;gt;wp = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().tag(&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;为立方体上表面创建的工作平面添加 &amp;quot;top&amp;quot; 标签，便于后续通过标签引用该工作平面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.workplaneFromTagged(tag)&amp;lt;/code&amp;gt; || 从之前标记的标签恢复/复制工作平面 || &amp;lt;code&amp;gt;result = wp.workplaneFromTagged(&amp;quot;top&amp;quot;).circle(5).extrude(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从名为 &amp;quot;top&amp;quot; 的标签处恢复工作平面，在该平面上绘制半径为 5 的圆并拉伸 10 个单位（常用于多次从同一面挤出，避免选择器失效）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.copyWorkplane(other)&amp;lt;/code&amp;gt; || 复制另一个 Workplane 的平面信息到当前对象 || &amp;lt;code&amp;gt;new_wp = cq.Workplane().copyWorkplane(other_wp)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建新的工作平面，并将另一个工作平面 other_wp 的坐标系信息复制到新对象上&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2D 操作 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.center(x, y)&amp;lt;/code&amp;gt; || 将局部坐标移动到指定位置 || &amp;lt;code&amp;gt;result = cq.Workplane().center(5, 5).rect(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将工作平面中心移动到 (5,5) 后创建 10x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.lineTo(x, y[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点到指定点绘制一条线 || &amp;lt;code&amp;gt;result = cq.Workplane().moveTo(0,0).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从原点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.line(xDist, yDist[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制相对直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).line(5, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点相对移动 (5,5) 并绘制直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点垂直向上绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLineTo(yCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线到指定 Y 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;垂直绘制到 Y=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLineTo(xCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线到指定 X 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制到 X=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLine(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点按角度和长度绘制直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLine(10, 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;以 45 度角绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLineTo(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点绘制极坐标直线到指定位置 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLineTo(10, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到极坐标 (10, 90°) 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.moveTo(x, y)&amp;lt;/code&amp;gt; || 移动到指定点（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().moveTo(5, 5).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前点移动到 (5,5)（不绘制），然后从该点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.move([xDist, yDist])&amp;lt;/code&amp;gt; || 相对移动指定距离（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().move(3, 4).line(5, 0)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;相对移动 (3,4)（不绘制），然后水平绘制长度 5 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.spline(listOfXYTuple[, tangents, ...])&amp;lt;/code&amp;gt; || 创建通过给定点的样条曲线（2D或3D） || &amp;lt;code&amp;gt;cq.Workplane().spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过三个点的平滑样条曲线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricCurve(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲线 || &amp;lt;code&amp;gt;cq.Workplane().parametricCurve(lambda t: (t, t**2), N=50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲线 y=x² 的逼近样条，使用 50 个采样点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricSurface(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲面 || &amp;lt;code&amp;gt;cq.Workplane().parametricSurface(lambda u,v: (u, v, u*v))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲面 z=xy 的逼近曲面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.threePointArc(point1, point2[, ...])&amp;lt;/code&amp;gt; || 通过三个点绘制圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).threePointArc((5,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点通过 (5,0) 到 (10,0) 绘制圆弧（形成半圆）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sagittaArc(endPoint, sag[, ...])&amp;lt;/code&amp;gt; || 使用矢高（sagitta）定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).sagittaArc((10,0), 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、矢高 2 的圆弧（拱形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.radiusArc(endPoint, radius[, ...])&amp;lt;/code&amp;gt; || 使用半径定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).radiusArc((10,0), 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、半径 5 的圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tangentArcPoint(endPoint)&amp;lt;/code&amp;gt; || 从当前边末端绘制切线圆弧到指定点 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(5,0).tangentArcPoint((10,5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;先绘制水平线，然后绘制与前一条边相切的圆弧到 (10,5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorY()&amp;lt;/code&amp;gt; || 沿 Y 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorY()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 Y 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorX()&amp;lt;/code&amp;gt; || 沿 X 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorX()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 X 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wire([forConstruction])&amp;lt;/code&amp;gt; || 将所有待定边连接成线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).wire()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两条边连接成 L 形线框对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rect(xLen, yLen[, centered, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造矩形 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制 10x20 的矩形（默认 centered=True）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.circle(radius[, forConstruction])&amp;lt;/code&amp;gt; || 为栈上每个项构造圆 || &amp;lt;code&amp;gt;cq.Workplane().circle(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制半径 5 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipse(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造椭圆 || &amp;lt;code&amp;gt;cq.Workplane().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制长轴 10、短轴 5 的椭圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipseArc(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 绘制椭圆弧 || &amp;lt;code&amp;gt;cq.Workplane().ellipseArc(10, 5, 0, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制从 0° 到 90° 的椭圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polyline(listOfXYTuple[, ...])&amp;lt;/code&amp;gt; || 从点列表创建折线 || &amp;lt;code&amp;gt;cq.Workplane().polyline([(0,0), (10,0), (10,10)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制连接三个点的折线（L 形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.close()&amp;lt;/code&amp;gt; || 结束构建并尝试创建封闭线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;闭合当前绘制的轮廓，形成封闭矩形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rarray(xSpacing, ySpacing, xCount, ...)&amp;lt;/code&amp;gt; || 创建矩形阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().rarray(10, 10, 3, 2).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 3 列 2 行、间距 10 的矩形阵列点，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarArray(radius, startAngle, ...)&amp;lt;/code&amp;gt; || 创建极坐标阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().polarArray(20, 0, 360, 8).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 8 个点的 360° 极坐标阵列，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.slot2D(length, diameter[, angle])&amp;lt;/code&amp;gt; || 创建带圆角的槽形 || &amp;lt;code&amp;gt;cq.Workplane().slot2D(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点创建长度 20、宽度 5 的跑道形槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.offset2D(d[, kind, forConstruction])&amp;lt;/code&amp;gt; || 创建 2D 偏移线框 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).offset2D(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x10 矩形线框向外偏移 2 个单位，生成更大的矩形。&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;cq.Workplane().box(4, 2, 0.5).faces(&amp;quot;&amp;gt;Z&amp;quot;).edges().toPending().offset2D(-0.25, forConstruction=True).vertices().cboreHole(0.125, 0.25, 0.125, depth=None)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在顶面向里偏离0.25，再在四个顶点打螺栓孔。&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.placeSketch(sketch)&amp;lt;/code&amp;gt; || 根据栈上项放置草图 || &amp;lt;code&amp;gt;cq.Workplane().placeSketch(mySketch).extrude(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Sketch 对象放置到当前 Workplane 位置，然后拉伸 5 个单位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（需要活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cboreHole(diameter, cboreDiameter, cboreDepth[, depth, clean])&amp;lt;/code&amp;gt; || 创建沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cboreHole(5, 10, 3, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、沉头直径 10、沉头深度 3、总深 8 的沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cskHole(diameter, cskDiameter, cskAngle[, depth, clean])&amp;lt;/code&amp;gt; || 创建锥形沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cskHole(5, 10, 90, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、锥头直径 10、锥角 90° 的锥形沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hole(diameter[, depth, clean])&amp;lt;/code&amp;gt; || 创建通孔或盲孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、深度 8 的盲孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.extrude(until[, combine, clean, both, taper])&amp;lt;/code&amp;gt; || 将线框挤出为棱柱体，可以给定数值，或&#039;next&#039;,&#039;last &#039;,或输入一个对象的Face。 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).extrude(30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x20 矩形沿法线方向挤出高度 30 的实体&amp;lt;br/&amp;gt; &amp;lt;code&amp;gt;result = cq.Workplane(origin=(20, 0, 0)).circle(2).revolve(180, (-20, 0, 0), (-20, -1, 0)).center(-20, 0).workplane().rect(10, 4).extrude(&amp;quot;last&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cut(toCut[, clean, tol])&amp;lt;/code&amp;gt; || 从当前实体切除另一个实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 10).cut(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从盒子中减去半径为 8 的球体（布尔差集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutBlind(until[, clean, both, taper])&amp;lt;/code&amp;gt; || 盲切（有限深度挤出切除） || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutBlind(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓沿法线方向挤出切除深度 15 的槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutThruAll([clean, taper])&amp;lt;/code&amp;gt; || 贯穿切除 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓贯穿整个实体进行切除&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.box(length, width, height[, centered, combine])&amp;lt;/code&amp;gt; || 创建立方体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 20, 30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建长 10、宽 20、高 30 的长方体（默认 centered=True，中心位于原点）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sphere(radius[, direct, angle1, angle2, combine])&amp;lt;/code&amp;gt; || 创建球体 || &amp;lt;code&amp;gt;result = cq.Workplane().sphere(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在当前工作平面位置创建半径 10 的球体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wedge(dx, dy, dz, xmin, zmin, xmax, zmax[, combine])&amp;lt;/code&amp;gt; || 创建楔形体 || &amp;lt;code&amp;gt;result = cq.Workplane().wedge(10, 20, 30, 0, 0, 10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建指定尺寸的楔形实体（类似三棱柱形状）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cylinder(height, radius[, direct, angle, combine])&amp;lt;/code&amp;gt; || 创建圆柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().cylinder(30, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建高度 30、半径 10 的圆柱体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.union([toUnion, clean, glue, tol])&amp;lt;/code&amp;gt; || 合并实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将球体与当前实体合并（布尔并集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.combine([clean, glue, tol])&amp;lt;/code&amp;gt; || 合并栈上所有实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5)).combine()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前栈中的多个实体合并为一个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.intersect(toIntersect[, clean, tol])&amp;lt;/code&amp;gt; || 与当前实体进行布尔交集运算 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).intersect(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10x10 的立方体，然后与半径 8 的球体进行布尔交集，保留两者重叠的部分&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.loft([ruled, combine, clean])&amp;lt;/code&amp;gt; || 放样多个截面 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 10).workplane(offset=5).rect(5, 5).loft()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两个不同尺寸的矩形截面放样成 3D 实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sweep(path[, multisection, transition, combine, clean])&amp;lt;/code&amp;gt; || 沿路径扫掠截面 || &amp;lt;code&amp;gt;path = cq.Workplane().spline([(0,0,0), (0,0,10)])&amp;lt;br/&amp;gt;result = cq.Workplane().circle(2).sweep(path)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿样条曲线路径扫掠圆形截面，生成弯曲管道&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.twistExtrude(distance, angleDegrees)&amp;lt;/code&amp;gt; || 在拉伸的同时扭转指定角度 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 5).twistExtrude(20, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 5x5 矩形沿法线方向拉伸 20 个单位，同时从底部到顶部扭转 90°&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.revolve([angleDegrees, axisStart, axisEnd, combine, clean])&amp;lt;/code&amp;gt; || 绕轴旋转生成实体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 10).revolve(360, (0,0), (0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形轮廓绕 Y 轴旋转 360° 生成回转体（类似圆环体或圆柱）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.text(txt, fontsize, distance[, ...])&amp;lt;/code&amp;gt; || 返回 3D 文本实体 || &amp;lt;code&amp;gt;result = cq.Workplane().text(&amp;quot;CadQuery&amp;quot;, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建内容为 &amp;quot;CadQuery&amp;quot;、字体高度 5、拉伸深度 2 的 3D 文本实体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（无需活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shell(thickness[, kind])&amp;lt;/code&amp;gt; || 移除选定的面以创建指定厚度的壳体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 5).faces(&amp;quot;&amp;gt;Z&amp;quot;).shell(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个盒子，移除顶面后形成壁厚 0.5 的壳体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.fillet(radius)&amp;lt;/code&amp;gt; || 在选定的边上添加圆角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加半径 2 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.chamfer(length[, length2])&amp;lt;/code&amp;gt; || 在选定的边上添加倒角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).chamfer(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加距离 2 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotate(axisStartPoint, axisEndPoint, angleDegrees)&amp;lt;/code&amp;gt; || 返回旋转后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotate((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绕 X 轴旋转立方体 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotateAboutCenter(axisEndPoint, ...)&amp;lt;/code&amp;gt; || 绕指定轴旋转栈中所有项 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotateAboutCenter((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 10x10x10 立方体，然后绕 X 轴（通过原点沿 X 方向）旋转 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.translate(vec)&amp;lt;/code&amp;gt; || 返回平移后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).translate((5, 0, 0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将立方体沿 X 轴平移 5 个单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirror([mirrorPlane, ...])&amp;lt;/code&amp;gt; || 镜像单个 CQ 对象 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).mirror(&amp;quot;YZ&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后，以 YZ 平面为镜像平面进行镜像&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 迭代方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.each(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 对栈中的每个值运行提供的函数，并将返回值收集到新的 CQ 对象中 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).each(lambda loc: cq.Workplane().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在矩形阵列的每个位置点执行回调函数，在每个点处创建半径为 2 的圆，并收集所有结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.eachpoint(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 与 each() 类似，但回调函数的参数会根据栈中位置进行平移 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).eachpoint(lambda pos: cq.Workplane().circle(2).translate(pos))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个位置点处创建圆，回调函数接收位置向量作为参数，便于创建相对于每个点的几何体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 栈与选择器方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.all()&amp;lt;/code&amp;gt; || 返回栈中所有 CQ 对象的列表 || &amp;lt;code&amp;gt;objects = cq.Workplane().box(10, 10, 10).faces().all()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体所有面的列表，返回包含每个面对象的列表&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.size()&amp;lt;/code&amp;gt; || 返回栈中当前对象的数量 || &amp;lt;code&amp;gt;count = cq.Workplane().box(10, 10, 10).faces().size()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体面的数量（返回 6）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vals()&amp;lt;/code&amp;gt; || 获取当前列表中的值 || &amp;lt;code&amp;gt;values = cq.Workplane().box(10, 10, 10).faces().vals()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取所有面对象的原始值（TopoDS_Shape 列表）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.add(obj)&amp;lt;/code&amp;gt; || 向栈中添加一个对象或对象列表 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后添加球体到栈中，栈中现在包含两个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.val()&amp;lt;/code&amp;gt; || 返回栈中的第一个值 || &amp;lt;code&amp;gt;first = cq.Workplane().box(10, 10, 10).faces().val()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.first()&amp;lt;/code&amp;gt; || 返回栈中的第一个项 || &amp;lt;code&amp;gt;first_item = cq.Workplane().box(10, 10, 10).faces().first()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面（与 val() 类似）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.item(i)&amp;lt;/code&amp;gt; || 返回栈中的第 i 个项 || &amp;lt;code&amp;gt;third_face = cq.Workplane().box(10, 10, 10).faces().item(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第三个面（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.last()&amp;lt;/code&amp;gt; || 返回栈中的最后一个项 || &amp;lt;code&amp;gt;last_face = cq.Workplane().box(10, 10, 10).faces().last()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的最后一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.end([n])&amp;lt;/code&amp;gt; || 返回此 CQ 元素的第 n 级父对象 || &amp;lt;code&amp;gt;parent = cq.Workplane().box(10, 10, 10).faces().vertices().end(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从顶点选择返回两级父对象（返回到实体层级）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vertices([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的顶点，可选择过滤 || &amp;lt;code&amp;gt;vertices = cq.Workplane().box(10, 10, 10).vertices()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体的所有 8 个顶点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.faces([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的面，可选择过滤 || &amp;lt;code&amp;gt;top_face = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体上表面（法线方向为正 Z 的面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.edges([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的边，可选择过滤 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vertical_edges = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体所有垂直边（平行于 Z 轴）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wires([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的线框，可选择过滤 || &amp;lt;code&amp;gt;wires = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).wires()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体顶面的外轮廓线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.solids([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的实体，可选择过滤 || &amp;lt;code&amp;gt;solids = cq.Workplane().box(10, 10, 10).solids()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体实体（通常只有一个）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shells([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的壳体，可选择过滤 || &amp;lt;code&amp;gt;shells = cq.Workplane().box(10, 10, 10).shell(0.5).shells()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建壳体后选择壳体对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.compounds([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中的复合体，可选择过滤 || &amp;lt;code&amp;gt;compounds = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5)).compounds()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;合并立方体和球体后，选择复合体对象&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NearestToPointSelector(pnt)&amp;lt;/code&amp;gt; || 选择离指定点最近的对象 || &amp;lt;code&amp;gt;nearest = cq.Workplane().box(10, 10, 10).faces(NearestToPointSelector((0,0,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择距离点 (0,0,5) 最近的面（通常为上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BoxSelector(point0, point1[, boundingbox])&amp;lt;/code&amp;gt; || 选择由两点定义的 3D 框内的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(BoxSelector((-5,-5,-5), (5,5,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择位于立方体边界框内的所有面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BaseDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 基于单个方向向量进行选择的基础选择器 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(BaseDirSelector((0,0,1), 0.01))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择方向与 Z 轴对齐的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ParallelDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向平行的对象 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(ParallelDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的边（即所有垂直边）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向对齐的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(DirectionSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向为 Z 轴方向的面（上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionNthSelector(vector, n[, ...])&amp;lt;/code&amp;gt; || 过滤与指定方向平行（或垂直）的对象，返回第 N 个 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(DirectionNthSelector((0,0,1), 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的第 3 条边（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LengthNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个长度的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(LengthNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择长度最短的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AreaNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个面积的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(AreaNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择面积最小的面（10x10 的面中最小为 100）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RadiusNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个半径的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().cylinder(10, 5).edges(RadiusNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择半径最小的边（圆柱体上下圆边半径 5）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PerpendicularDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向垂直的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(PerpendicularDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向与 Z 轴垂直的面（四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypeSelector(typeString)&amp;lt;/code&amp;gt; || 选择具有指定几何类型的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(TypeSelector(&amp;quot;PLANE&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有平面类型的面（立方体所有面都是平面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionMinMaxSelector(vector, minOrMax)&amp;lt;/code&amp;gt; || 选择在指定方向上最近或最远的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(DirectionMinMaxSelector((0,0,1), &amp;quot;MAX&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择在 Z 轴方向上最远的面（即上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CenterNthSelector(vector, n[, directionMax, ...])&amp;lt;/code&amp;gt; || 按中心在指定方向上投影的距离排序，选择第 N 个对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(CenterNthSelector((0,0,1), 1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;按面中心在 Z 轴投影距离排序，选择第 2 个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AndSelector(left, right)&amp;lt;/code&amp;gt; || 交集选择器（同时满足两个选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(AndSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向的平面（即上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SumSelector(left, right)&amp;lt;/code&amp;gt; || 并集选择器（满足任一选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SumSelector(DirectionSelector((0,0,1)), DirectionSelector((1,0,0))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴或 X 轴方向的面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SubtractSelector(left, right)&amp;lt;/code&amp;gt; || 差集选择器（满足 left 但不满足 right） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SubtractSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向但非平面的面（立方体中无结果）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;InverseSelector(selector)&amp;lt;/code&amp;gt; || 反转给定选择器的选择结果 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(InverseSelector(DirectionSelector((0,0,1))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有法线方向不是 Z 轴的面（即四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringSyntaxSelector(selectorString)&amp;lt;/code&amp;gt; || 使用简单字符串语法过滤对象列表 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(StringSyntaxSelector(&amp;quot;&amp;gt;Z&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用字符串语法选择法线方向为正 Z 的面（等价于 &amp;quot;&amp;gt;Z&amp;quot;）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 装配体 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly([obj, loc, name, color, material, ...])&amp;lt;/code&amp;gt; || 嵌套的 Workplane 和 Shape 对象装配体，定义它们的相对位置 || &amp;lt;code&amp;gt;assy = cq.Assembly()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的装配体对象，用于组织和定位多个零件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.add(obj[, loc, name, color, ...])&amp;lt;/code&amp;gt; || 向当前装配体添加子装配体或零件 || &amp;lt;code&amp;gt;assy.add(cq.Workplane().box(10, 10, 5), name=&amp;quot;base&amp;quot;)&amp;lt;br/&amp;gt;assy.add(cq.Workplane().sphere(3), loc=cq.Location((0,0,5)), name=&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;向装配体添加底座（立方体）和顶部球体，并指定位置和名称&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.save(path[, exportType, mode, ...])&amp;lt;/code&amp;gt; || 将装配体保存到文件 || &amp;lt;code&amp;gt;assy.save(&amp;quot;assembly.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将装配体保存为 STEP 文件，支持 STEP、STL、VRML 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.constrain(constraint)&amp;lt;/code&amp;gt; || 定义一个新的约束 || &amp;lt;code&amp;gt;assy.constrain(&amp;quot;base&amp;quot;, &amp;quot;top&amp;quot;, &amp;quot;Axis&amp;quot;, (0,0,1), (0,0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;约束底座和顶部的 Z 轴对齐，使球体位于底座正上方&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.solve([verbosity])&amp;lt;/code&amp;gt; || 求解所有已定义的约束 || &amp;lt;code&amp;gt;assy.solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;求解所有约束，自动调整零件位置以满足约束条件，verbosity=1 可输出求解详情&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Color(r, g, b[, a])&amp;lt;/code&amp;gt; || OCCT 颜色对象 Quantity_ColorRGBA 的包装器 || &amp;lt;code&amp;gt;red = cq.Color(1, 0, 0)&amp;lt;br/&amp;gt;assy.add(part, color=red)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建红色颜色对象，并将其应用于装配体中的零件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 导出与导入 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.toSvg([opts])&amp;lt;/code&amp;gt; || 返回表示栈中第一个项的 SVG 文本 || &amp;lt;code&amp;gt;svg_text = cq.Workplane().rect(10, 10).toSvg()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并将其转换为 SVG 文本字符串，可用于网页显示或保存&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.exportSvg(fileName)&amp;lt;/code&amp;gt; || 将栈中第一个项导出为 SVG 文件 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).exportSvg(&amp;quot;rectangle.svg&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并导出为 &amp;quot;rectangle.svg&amp;quot; 文件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importStep(fileName)&amp;lt;/code&amp;gt; || 加载 STEP 文件到 CadQuery Workplane || &amp;lt;code&amp;gt;part = cq.importers.importStep(&amp;quot;model.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 &amp;quot;model.step&amp;quot; 文件导入 3D 模型，返回 Workplane 对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 加载 DXF 文件到 Workplane || &amp;lt;code&amp;gt;sketch = cq.importers.importDXF(&amp;quot;profile.dxf&amp;quot;, tol=0.01)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入 2D 轮廓，容差设为 0.01&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exporters.export(w, fname[, exportType, ...])&amp;lt;/code&amp;gt; || 将 Workplane 或 Shape 导出到文件 || &amp;lt;code&amp;gt;cq.exporters.export(part, &amp;quot;output.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Workplane 对象导出为 STEP 文件，支持 STL、STEP、SVG 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;occ_impl.exporters.dxf.DxfDocument([...])&amp;lt;/code&amp;gt; || 从 CadQuery 对象创建 DXF 文档 || &amp;lt;code&amp;gt;doc = cq.occ_impl.exporters.dxf.DxfDocument()&amp;lt;br/&amp;gt;doc.addShape(sketch)&amp;lt;br/&amp;gt;doc.save(&amp;quot;output.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 DXF 文档对象，添加几何形状后保存为 DXF 文件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CadQuery&amp;diff=1742</id>
		<title>CadQuery</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CadQuery&amp;diff=1742"/>
		<updated>2026-04-02T02:07:10Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 2D 操作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CadQuery 是一个基于 [[Python]] 的参数化 3D CAD 库，底层使用 OpenCascade（OCCT）内核。支持输出STL、STEP、AMF和3MF的CAD格式。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
最简单方式使用CQ-Editor（官方的 GUI 编辑器），或者使用常用的编辑器+插件，如VS Code编辑器和OCP CAD Viewer插件。&lt;br /&gt;
===CQ-Editor===&lt;br /&gt;
安装CQ-editor编辑器，会自动安装cadquery，通过pip安装：&lt;br /&gt;
 pip install CQ-editor&lt;br /&gt;
安装后，通过命令行启动：&lt;br /&gt;
 CQ-editor&lt;br /&gt;
&lt;br /&gt;
https://github.com/CadQuery/CQ-editor/wiki/Installation&lt;br /&gt;
&lt;br /&gt;
===VS Code===&lt;br /&gt;
VS Code中，先安装cadquery，在安装OCP CAD Viewer插件。&lt;br /&gt;
 pip install cadquery&lt;br /&gt;
安装cadquery后，在[[VS Code]]插件中查找OCP CAD Viewer安装，方便在VS Code查看模型，安装后在VS Code运行查看下。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import cadquery as cq&lt;br /&gt;
from ocp_vscode import show, show_object&lt;br /&gt;
&lt;br /&gt;
result = cq.Workplane(&amp;quot;XY&amp;quot;).box(2,2,2).shell(0.2)&lt;br /&gt;
show_object(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
如果出现错误，不显示模型，在VS Code左侧栏点击OCP图标，在点击ocp_vscode行右侧的Open viewer按钮，就会显示RUNNING并运行，再次运行代码即可。&lt;br /&gt;
&lt;br /&gt;
https://cadquery.readthedocs.io/en/latest/installation.html&lt;br /&gt;
https://github.com/bernhard-42/vscode-ocp-cad-viewer&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
== 核心概念 ==&lt;br /&gt;
CadQuery 是一个基于 Python 的 3D CAD 建模库，其底层是 OpenCascade 几何内核。&lt;br /&gt;
&lt;br /&gt;
=== BREP 拓扑 ===&lt;br /&gt;
CadQuery 使用&#039;&#039;&#039;边界表示法（BREP）&#039;&#039;&#039;来定义 3D 物体，即物体由其表面来定义。基本的拓扑元素从简单到复杂依次为：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;顶点 (Vertex)&#039;&#039;&#039;：空间中的一个点&lt;br /&gt;
* &#039;&#039;&#039;边 (Edge)&#039;&#039;&#039;：连接两个或多个顶点的曲线段&lt;br /&gt;
* &#039;&#039;&#039;线框 (Wire)&#039;&#039;&#039;：一组相互连接的边&lt;br /&gt;
* &#039;&#039;&#039;面 (Face)&#039;&#039;&#039;：由线框围成的平面或曲面&lt;br /&gt;
* &#039;&#039;&#039;实体 (Solid)&#039;&#039;&#039;：由面围成的封闭三维体&lt;br /&gt;
* &#039;&#039;&#039;复合体 (Compound)&#039;&#039;&#039;：多个实体的集合&lt;br /&gt;
&lt;br /&gt;
=== API 层次结构 ===&lt;br /&gt;
CadQuery 提供了三个层次的 API，从上到下越来越灵活，但也越来越复杂。&lt;br /&gt;
==== 流畅 API ====&lt;br /&gt;
流畅 API是通过链式调用进行建模的接口，入门首选，简单易用。主要分为2类&lt;br /&gt;
* Workplane类，传统 3D 建模，最常用。 示例：&amp;lt;code&amp;gt;part = Workplane(&amp;quot;XY&amp;quot;).box(1,2,3).faces(&amp;quot;&amp;gt;Z&amp;quot;).circle(0.5).cutThruAll()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Sketch类，二维草图专用，更符合传统 CAD 绘图习惯，CadQuery 2.x版本引入。&lt;br /&gt;
&lt;br /&gt;
两者可以协同工作，如从二维草图开始创建三维模型Sketch → Workplane.placeSketch() → .extrude()，在现有模型上添加特征Workplane → 选面 → .sketch() → 修改 → .cutBlind()。典型工作流示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 创建一个带孔和圆角的平板&lt;br /&gt;
sketch_base = Sketch().rect(20, 15).constrain().solve()        # 底板轮廓&lt;br /&gt;
base = Workplane().placeSketch(sketch_base).extrude(3)         # 拉伸底板&lt;br /&gt;
&lt;br /&gt;
# 在底板上表面画圆孔&lt;br /&gt;
hole_sketch = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).sketch().circle(2).constrain().solve()&lt;br /&gt;
result = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).placeSketch(hole_sketch).cutBlind(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sketch 和 Workplane 的 2D 操作区别：&lt;br /&gt;
*Workplane 的 2D 操作：过程式建模，按顺序执行命令：画圆 → 移动 → 画矩形，尺寸硬编码数值，适用简单、固定的轮廓场景。&lt;br /&gt;
*Sketch ：约束驱动建模，定义几何约束如圆与矩形同心、相切等，尺寸约束 + 变量控制，适用复杂、参数化、需要设计意图的轮廓。&lt;br /&gt;
传统 CAD 中，设计意图（如&amp;quot;这个孔始终与板的中心对齐&amp;quot;）是通过约束实现的。Workplane 的过程式方式需要手动计算位置，参数变化时容易出错。Sketch约束后自动计算。当轮廓包含多个相互关联的图形时（如齿轮轮廓、法兰盘），约束系统能保证所有元素的关系正确。&lt;br /&gt;
&lt;br /&gt;
==== 直接 API ====&lt;br /&gt;
* 当流畅 API 不够用时使用，直接操作拓扑元素（顶点、边、面等）。&lt;br /&gt;
* 可以“自底向上”构建几何体，控制更精细。&lt;br /&gt;
* 示例：`wire = Wire.makeCircle(10); face = Face.makeFromWires(wire, [])`&lt;br /&gt;
&lt;br /&gt;
==== OCCT API ====&lt;br /&gt;
* 最底层，直接调用 OpenCascade 的 C++ 函数（通过 Python 绑定 `OCP`）。&lt;br /&gt;
* 极其强大但也极其繁琐，适合需要完全控制的场景。&lt;br /&gt;
* 示例：`from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox`&lt;br /&gt;
&lt;br /&gt;
=== 在 API 之间切换 ===&lt;br /&gt;
你可以根据需要混合使用不同层次的 API：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;从流畅 API 获取直接 API 对象&#039;&#039;&#039;：使用 `.val()` 或 `.findSolid()` 方法。&lt;br /&gt;
* &#039;&#039;&#039;从直接 API 对象回到流畅 API&#039;&#039;&#039;：将直接 API 对象作为参数传入新的 `Workplane`。&lt;br /&gt;
* &#039;&#039;&#039;获取底层的 OCCT 对象&#039;&#039;&#039;：直接 API 对象通过 `.wrapped` 属性即可获得。&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
选择器用于在已有模型上快速定位特征，相当于传统 CAD 中的鼠标选取。你可以通过字符串表达式选择面、边、顶点等。&lt;br /&gt;
* 例如：`faces(&amp;quot;&amp;gt;Z&amp;quot;)` 选择最上方的面，`edges(&amp;quot;&amp;gt;X&amp;quot;)` 选择 X 轴正方向的边。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API 参考==&lt;br /&gt;
=== 草图初始化 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch(parent, locs, obj)&amp;lt;/code&amp;gt; || 2D 草图，用于构建二维几何形状 || &amp;lt;code&amp;gt;s = Sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的 2D 草图对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 导入 DXF 文件并构建面 || &amp;lt;code&amp;gt;sketch = Sketch.importDXF(&amp;quot;profile.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入几何图形并创建草图&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sketch()&amp;lt;/code&amp;gt; || 初始化并返回一个草图 || &amp;lt;code&amp;gt;s = Workplane().sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;初始化一个新草图，通常在创建后自动调用&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.finalize()&amp;lt;/code&amp;gt; || 完成草图构造并返回父对象 || &amp;lt;code&amp;gt;result = sketch.finalize()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;完成草图编辑，返回父对象（通常用于链式调用）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.copy()&amp;lt;/code&amp;gt; || 创建草图的局部副本 || &amp;lt;code&amp;gt;s2 = s.copy()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图 s 的一个独立副本，用于后续修改而不影响原草图。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.located(loc)&amp;lt;/code&amp;gt; || 创建带有新位置的草图局部副本 || &amp;lt;code&amp;gt;sketch.located(Location(Vector(10, 0, 0)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图副本并平移到新位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.moved(....)&amp;lt;/code&amp;gt; || 创建移动后的面的草图局部副本 ||&amp;lt;code&amp;gt;sketch.moved(Vector(5, 5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将草图中的面移动后创建新副本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 草图选择 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.tag(name)&amp;lt;/code&amp;gt; || 为当前选择添加标签 || &amp;lt;code&amp;gt;sketch.rect(10, 10).tag(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形并为其添加标签 &amp;quot;outer&amp;quot;，便于后续选择&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.select(tag)&amp;lt;/code&amp;gt; || 根据标签选择元素 || &amp;lt;code&amp;gt;sketch.select(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择之前标记为 &amp;quot;outer&amp;quot; 的几何元素&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.reset()&amp;lt;/code&amp;gt; || 重置当前选择状态 || &amp;lt;code&amp;gt;sketch.reset()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;清除所有当前选中的元素，恢复到初始未选择状态&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.delete([mode])&amp;lt;/code&amp;gt; || 删除选中的对象 || &amp;lt;code&amp;gt;sketch.circle(5).tag(&amp;quot;hole&amp;quot;).delete()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆形后标记并删除它&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.faces([selector])&amp;lt;/code&amp;gt; || 选择面元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).faces().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形面并添加圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edges([selector])&amp;lt;/code&amp;gt; || 选择边元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).edges().chamfer(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有边并添加倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.vertices([selector])&amp;lt;/code&amp;gt; || 选择顶点元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).vertices().fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有顶点并添加圆角&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于面的草图绘制 ===&lt;br /&gt;
; Sketch Mode 类型说明&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;a&#039;&amp;lt;/code&amp;gt; - Add (添加) - 添加区域到草图 - 默认模式，创建实体区域&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;s&#039;&amp;lt;/code&amp;gt; - Subtract (减去) - 从现有区域中减去 - 创建孔洞或凹陷&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;i&#039;&amp;lt;/code&amp;gt; - Intersect (相交) - 保留与现有区域的交集 - 创建重叠部分&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;c&#039;&amp;lt;/code&amp;gt; - Construction (构造) - 创建辅助几何 - 辅助线/圆，不参与实体&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;g&#039;&amp;lt;/code&amp;gt; - Guide (引导) - 引导线 - 用于扫掠等操作&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.face(b[, angle, mode, tag, ...])&amp;lt;/code&amp;gt; || 从线框或边构建一个面 || &amp;lt;code&amp;gt;s = Sketch().face(wire, mode=&#039;a&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从闭合线框创建一个面，使用 ADD 模式添加到现有图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rect(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个矩形面 || &amp;lt;code&amp;gt;cq.Sketch().rect(10, 20).rect(5, 10, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x20 矩形，然后在其中减去一个 5x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.circle(r[, mode, tag])&amp;lt;/code&amp;gt; || 构建一个圆形面 || &amp;lt;code&amp;gt;s = cq.Sketch().circle(5).circle(3,mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个半径 5 的圆，然后在中心减去一个半径 3 的圆（形成环形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.ellipse(a1, a2[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个椭圆面 || &amp;lt;code&amp;gt;s = Sketch().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个长半轴 10、短半轴 5 的椭圆面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.trapezoid(w, h, a1[, a2, angle, ...])&amp;lt;/code&amp;gt; || 构建一个梯形面 || &amp;lt;code&amp;gt;s = Sketch().trapezoid(10, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个顶宽 10、高 5、顶部偏移 2 的梯形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.slot(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个槽形面 || &amp;lt;code&amp;gt;s = Sketch().slot(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制一个长度20、宽度5的槽形面（带圆角）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.regularPolygon(r, n[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个正多边形面 || &amp;lt;code&amp;gt;s = Sketch().regularPolygon(5, 6)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个外接圆半径 5、6 条边的正六边形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.polygon(pts[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个多边形面 || &amp;lt;code&amp;gt;s = Sketch().polygon([(0,0), (10,0), (5,8)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个由三个点构成的三角形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rarray(xs, ys, nx, ny)&amp;lt;/code&amp;gt; || 生成一个矩形位置阵列 || &amp;lt;code&amp;gt;s = cq.Sketch().rect(50, 40).rarray(4, 3, 12, 10).circle(2, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 3x3 矩形，然后在创建12x10的孔阵列。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.parray(r, a1, da, n[, rotate])&amp;lt;/code&amp;gt; || 生成极坐标阵列位置 || &amp;lt;code&amp;gt;sketch.parray(20, 0, 360, 8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建围绕中心、半径 20、从 0 度到 360 度均匀分布的 8 个极坐标阵列位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.distribute(n[, start, stop, rotate])&amp;lt;/code&amp;gt; || 沿选中的边或线框分布位置 || &amp;lt;code&amp;gt;sketch.rect(20, 10).edges().distribute(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿矩形选中边均匀分布 5 个位置点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.each(callback[, mode, tag, ...])&amp;lt;/code&amp;gt; || 对所有适用实体应用回调函数 || &amp;lt;code&amp;gt;sketch.rarray(5, 5, 3, 2).each(lambda loc: Sketch().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个阵列位置点执行回调，绘制半径为 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.push(locs[, tag])&amp;lt;/code&amp;gt; || 将当前选择设置为给定位置或点 || &amp;lt;code&amp;gt;sketch.push([Vector(0,0), Vector(10,10), Vector(20,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将三个位置点推入当前选择栈，作为后续操作的基准点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.hull([mode, tag])&amp;lt;/code&amp;gt; || 从当前选择或所有对象生成凸包 || &amp;lt;code&amp;gt;s = Sketch().circle(3).circle(5, (10,0)).hull()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建两个圆，然后生成包含它们的最小凸包面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.offset(d[, mode, tag])&amp;lt;/code&amp;gt; || 偏移选定的线框或边 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).offset(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后向外偏移 1 单位（形成更大的矩形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.fillet(r)&amp;lt;/code&amp;gt; || 基于当前选择添加圆角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加半径 1 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.chamfer(d)&amp;lt;/code&amp;gt; || 基于当前选择添加倒角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().chamfer(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加距离 1 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.clean()&amp;lt;/code&amp;gt; || 移除内部线。 || &amp;lt;code&amp;gt;sketch.clean()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;清理草图中内部的非边界线段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于边和约束的草图绘制 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edge(val[, tag, forConstruction])&amp;lt;/code&amp;gt; || 向草图中添加一条边 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;s = Sketch().edge(&amp;quot;|&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加一条水平线作为构造线（用于约束）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.segment(p1, p2)&amp;lt;/code&amp;gt; || 构建一条线段 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 (0,0) 到 (10,0) 添加一条线段&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.arc(p1, p2, p3)&amp;lt;/code&amp;gt; || 构建一条弧线 || &amp;lt;code&amp;gt;s = Sketch().arc((0,0), (5,5), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;通过三点添加一条圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.spline(pts)&amp;lt;/code&amp;gt; || 构造样条曲线边 || &amp;lt;code&amp;gt;sketch.spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过给定点的样条曲线边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.close()&amp;lt;/code&amp;gt; || 将最后一条边连接到第一条边 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0)).segment((10,0), (10,10)).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加两条垂直边后闭合，形成 L 形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.assemble([mode, tag])&amp;lt;/code&amp;gt; || 将边组合成面 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10, mode=Mode.PRIVATE).assemble()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建私有矩形边，然后组合成一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.constrain(constraint)&amp;lt;/code&amp;gt; || 添加一个约束 || &amp;lt;code&amp;gt;s = Sketch().circle(5).constrain((&amp;quot;distance&amp;quot;, &amp;quot;origin&amp;quot;, 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆，然后添加约束使其圆心距离原点 2 单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.solve()&amp;lt;/code&amp;gt; || 求解当前约束并更新边位置 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).constrain((&amp;quot;coincident&amp;quot;, &amp;quot;vertex0&amp;quot;, &amp;quot;vertex1&amp;quot;)).solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加重合约束后求解，更新几何位置&lt;br /&gt;
|}&lt;br /&gt;
=== Workplane 初始化 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane(, obj)&amp;lt;/code&amp;gt; || 在空间中定义一个坐标系，可用于2D坐标操作。 || &amp;lt;code&amp;gt;Workplane()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;创建一个新的Workplane对象，默认在XY平面原点。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2D 操作 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.center(x, y)&amp;lt;/code&amp;gt; || 将局部坐标移动到指定位置 || &amp;lt;code&amp;gt;result = cq.Workplane().center(5, 5).rect(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将工作平面中心移动到 (5,5) 后创建 10x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.lineTo(x, y[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点到指定点绘制一条线 || &amp;lt;code&amp;gt;result = cq.Workplane().moveTo(0,0).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从原点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.line(xDist, yDist[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制相对直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).line(5, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点相对移动 (5,5) 并绘制直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点垂直向上绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLineTo(yCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线到指定 Y 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;垂直绘制到 Y=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLineTo(xCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线到指定 X 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制到 X=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLine(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点按角度和长度绘制直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLine(10, 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;以 45 度角绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLineTo(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点绘制极坐标直线到指定位置 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLineTo(10, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到极坐标 (10, 90°) 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.moveTo(x, y)&amp;lt;/code&amp;gt; || 移动到指定点（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().moveTo(5, 5).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前点移动到 (5,5)（不绘制），然后从该点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.move([xDist, yDist])&amp;lt;/code&amp;gt; || 相对移动指定距离（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().move(3, 4).line(5, 0)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;相对移动 (3,4)（不绘制），然后水平绘制长度 5 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.spline(listOfXYTuple[, tangents, ...])&amp;lt;/code&amp;gt; || 创建通过给定点的样条曲线（2D或3D） || &amp;lt;code&amp;gt;cq.Workplane().spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过三个点的平滑样条曲线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricCurve(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲线 || &amp;lt;code&amp;gt;cq.Workplane().parametricCurve(lambda t: (t, t**2), N=50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲线 y=x² 的逼近样条，使用 50 个采样点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricSurface(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲面 || &amp;lt;code&amp;gt;cq.Workplane().parametricSurface(lambda u,v: (u, v, u*v))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲面 z=xy 的逼近曲面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.threePointArc(point1, point2[, ...])&amp;lt;/code&amp;gt; || 通过三个点绘制圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).threePointArc((5,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点通过 (5,0) 到 (10,0) 绘制圆弧（形成半圆）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sagittaArc(endPoint, sag[, ...])&amp;lt;/code&amp;gt; || 使用矢高（sagitta）定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).sagittaArc((10,0), 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、矢高 2 的圆弧（拱形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.radiusArc(endPoint, radius[, ...])&amp;lt;/code&amp;gt; || 使用半径定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).radiusArc((10,0), 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、半径 5 的圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tangentArcPoint(endPoint)&amp;lt;/code&amp;gt; || 从当前边末端绘制切线圆弧到指定点 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(5,0).tangentArcPoint((10,5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;先绘制水平线，然后绘制与前一条边相切的圆弧到 (10,5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorY()&amp;lt;/code&amp;gt; || 沿 Y 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorY()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 Y 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorX()&amp;lt;/code&amp;gt; || 沿 X 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorX()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 X 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wire([forConstruction])&amp;lt;/code&amp;gt; || 将所有待定边连接成线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).wire()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两条边连接成 L 形线框对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rect(xLen, yLen[, centered, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造矩形 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制 10x20 的矩形（默认 centered=True）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.circle(radius[, forConstruction])&amp;lt;/code&amp;gt; || 为栈上每个项构造圆 || &amp;lt;code&amp;gt;cq.Workplane().circle(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制半径 5 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipse(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造椭圆 || &amp;lt;code&amp;gt;cq.Workplane().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制长轴 10、短轴 5 的椭圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipseArc(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 绘制椭圆弧 || &amp;lt;code&amp;gt;cq.Workplane().ellipseArc(10, 5, 0, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制从 0° 到 90° 的椭圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polyline(listOfXYTuple[, ...])&amp;lt;/code&amp;gt; || 从点列表创建折线 || &amp;lt;code&amp;gt;cq.Workplane().polyline([(0,0), (10,0), (10,10)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制连接三个点的折线（L 形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.close()&amp;lt;/code&amp;gt; || 结束构建并尝试创建封闭线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;闭合当前绘制的轮廓，形成封闭矩形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rarray(xSpacing, ySpacing, xCount, ...)&amp;lt;/code&amp;gt; || 创建矩形阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().rarray(10, 10, 3, 2).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 3 列 2 行、间距 10 的矩形阵列点，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarArray(radius, startAngle, ...)&amp;lt;/code&amp;gt; || 创建极坐标阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().polarArray(20, 0, 360, 8).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 8 个点的 360° 极坐标阵列，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.slot2D(length, diameter[, angle])&amp;lt;/code&amp;gt; || 创建带圆角的槽形 || &amp;lt;code&amp;gt;cq.Workplane().slot2D(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点创建长度 20、宽度 5 的跑道形槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.offset2D(d[, kind, forConstruction])&amp;lt;/code&amp;gt; || 创建 2D 偏移线框 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).offset2D(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x10 矩形线框向外偏移 2 个单位，生成更大的矩形。&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;cq.Workplane().box(4, 2, 0.5).faces(&amp;quot;&amp;gt;Z&amp;quot;).edges().toPending().offset2D(-0.25, forConstruction=True).vertices().cboreHole(0.125, 0.25, 0.125, depth=None)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在顶面向里偏离0.25，再在四个顶点打螺栓孔。&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.placeSketch(sketch)&amp;lt;/code&amp;gt; || 根据栈上项放置草图 || &amp;lt;code&amp;gt;cq.Workplane().placeSketch(mySketch).extrude(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Sketch 对象放置到当前 Workplane 位置，然后拉伸 5 个单位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（需要活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cboreHole(diameter, cboreDiameter, cboreDepth[, depth, clean])&amp;lt;/code&amp;gt; || 创建沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cboreHole(5, 10, 3, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、沉头直径 10、沉头深度 3、总深 8 的沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cskHole(diameter, cskDiameter, cskAngle[, depth, clean])&amp;lt;/code&amp;gt; || 创建锥形沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cskHole(5, 10, 90, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、锥头直径 10、锥角 90° 的锥形沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hole(diameter[, depth, clean])&amp;lt;/code&amp;gt; || 创建通孔或盲孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、深度 8 的盲孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.extrude(until[, combine, clean, both, taper])&amp;lt;/code&amp;gt; || 将线框挤出为棱柱体，可以给定数值，或&#039;next&#039;,&#039;last &#039;,或输入一个对象的Face。 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).extrude(30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x20 矩形沿法线方向挤出高度 30 的实体&amp;lt;br/&amp;gt; &amp;lt;code&amp;gt;result = cq.Workplane(origin=(20, 0, 0)).circle(2).revolve(180, (-20, 0, 0), (-20, -1, 0)).center(-20, 0).workplane().rect(10, 4).extrude(&amp;quot;last&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cut(toCut[, clean, tol])&amp;lt;/code&amp;gt; || 从当前实体切除另一个实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 10).cut(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从盒子中减去半径为 8 的球体（布尔差集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutBlind(until[, clean, both, taper])&amp;lt;/code&amp;gt; || 盲切（有限深度挤出切除） || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutBlind(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓沿法线方向挤出切除深度 15 的槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutThruAll([clean, taper])&amp;lt;/code&amp;gt; || 贯穿切除 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓贯穿整个实体进行切除&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.box(length, width, height[, centered, combine])&amp;lt;/code&amp;gt; || 创建立方体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 20, 30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建长 10、宽 20、高 30 的长方体（默认 centered=True，中心位于原点）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sphere(radius[, direct, angle1, angle2, combine])&amp;lt;/code&amp;gt; || 创建球体 || &amp;lt;code&amp;gt;result = cq.Workplane().sphere(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在当前工作平面位置创建半径 10 的球体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wedge(dx, dy, dz, xmin, zmin, xmax, zmax[, combine])&amp;lt;/code&amp;gt; || 创建楔形体 || &amp;lt;code&amp;gt;result = cq.Workplane().wedge(10, 20, 30, 0, 0, 10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建指定尺寸的楔形实体（类似三棱柱形状）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cylinder(height, radius[, direct, angle, combine])&amp;lt;/code&amp;gt; || 创建圆柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().cylinder(30, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建高度 30、半径 10 的圆柱体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.union([toUnion, clean, glue, tol])&amp;lt;/code&amp;gt; || 合并实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将球体与当前实体合并（布尔并集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.combine([clean, glue, tol])&amp;lt;/code&amp;gt; || 合并栈上所有实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5)).combine()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前栈中的多个实体合并为一个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.intersect(toIntersect[, clean, tol])&amp;lt;/code&amp;gt; || 与当前实体进行布尔交集运算 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).intersect(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10x10 的立方体，然后与半径 8 的球体进行布尔交集，保留两者重叠的部分&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.loft([ruled, combine, clean])&amp;lt;/code&amp;gt; || 放样多个截面 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 10).workplane(offset=5).rect(5, 5).loft()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两个不同尺寸的矩形截面放样成 3D 实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sweep(path[, multisection, transition, combine, clean])&amp;lt;/code&amp;gt; || 沿路径扫掠截面 || &amp;lt;code&amp;gt;path = cq.Workplane().spline([(0,0,0), (0,0,10)])&amp;lt;br/&amp;gt;result = cq.Workplane().circle(2).sweep(path)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿样条曲线路径扫掠圆形截面，生成弯曲管道&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.twistExtrude(distance, angleDegrees)&amp;lt;/code&amp;gt; || 在拉伸的同时扭转指定角度 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 5).twistExtrude(20, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 5x5 矩形沿法线方向拉伸 20 个单位，同时从底部到顶部扭转 90°&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.revolve([angleDegrees, axisStart, axisEnd, combine, clean])&amp;lt;/code&amp;gt; || 绕轴旋转生成实体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 10).revolve(360, (0,0), (0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形轮廓绕 Y 轴旋转 360° 生成回转体（类似圆环体或圆柱）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.text(txt, fontsize, distance[, ...])&amp;lt;/code&amp;gt; || 返回 3D 文本实体 || &amp;lt;code&amp;gt;result = cq.Workplane().text(&amp;quot;CadQuery&amp;quot;, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建内容为 &amp;quot;CadQuery&amp;quot;、字体高度 5、拉伸深度 2 的 3D 文本实体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（无需活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shell(thickness[, kind])&amp;lt;/code&amp;gt; || 移除选定的面以创建指定厚度的壳体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 5).faces(&amp;quot;&amp;gt;Z&amp;quot;).shell(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个盒子，移除顶面后形成壁厚 0.5 的壳体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.fillet(radius)&amp;lt;/code&amp;gt; || 在选定的边上添加圆角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加半径 2 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.chamfer(length[, length2])&amp;lt;/code&amp;gt; || 在选定的边上添加倒角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).chamfer(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加距离 2 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotate(axisStartPoint, axisEndPoint, angleDegrees)&amp;lt;/code&amp;gt; || 返回旋转后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotate((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绕 X 轴旋转立方体 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotateAboutCenter(axisEndPoint, ...)&amp;lt;/code&amp;gt; || 绕指定轴旋转栈中所有项 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotateAboutCenter((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 10x10x10 立方体，然后绕 X 轴（通过原点沿 X 方向）旋转 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.translate(vec)&amp;lt;/code&amp;gt; || 返回平移后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).translate((5, 0, 0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将立方体沿 X 轴平移 5 个单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirror([mirrorPlane, ...])&amp;lt;/code&amp;gt; || 镜像单个 CQ 对象 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).mirror(&amp;quot;YZ&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后，以 YZ 平面为镜像平面进行镜像&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 迭代方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.each(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 对栈中的每个值运行提供的函数，并将返回值收集到新的 CQ 对象中 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).each(lambda loc: cq.Workplane().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在矩形阵列的每个位置点执行回调函数，在每个点处创建半径为 2 的圆，并收集所有结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.eachpoint(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 与 each() 类似，但回调函数的参数会根据栈中位置进行平移 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).eachpoint(lambda pos: cq.Workplane().circle(2).translate(pos))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个位置点处创建圆，回调函数接收位置向量作为参数，便于创建相对于每个点的几何体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 栈与选择器方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.all()&amp;lt;/code&amp;gt; || 返回栈中所有 CQ 对象的列表 || &amp;lt;code&amp;gt;objects = cq.Workplane().box(10, 10, 10).faces().all()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体所有面的列表，返回包含每个面对象的列表&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.size()&amp;lt;/code&amp;gt; || 返回栈中当前对象的数量 || &amp;lt;code&amp;gt;count = cq.Workplane().box(10, 10, 10).faces().size()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体面的数量（返回 6）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vals()&amp;lt;/code&amp;gt; || 获取当前列表中的值 || &amp;lt;code&amp;gt;values = cq.Workplane().box(10, 10, 10).faces().vals()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取所有面对象的原始值（TopoDS_Shape 列表）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.add(obj)&amp;lt;/code&amp;gt; || 向栈中添加一个对象或对象列表 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后添加球体到栈中，栈中现在包含两个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.val()&amp;lt;/code&amp;gt; || 返回栈中的第一个值 || &amp;lt;code&amp;gt;first = cq.Workplane().box(10, 10, 10).faces().val()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.first()&amp;lt;/code&amp;gt; || 返回栈中的第一个项 || &amp;lt;code&amp;gt;first_item = cq.Workplane().box(10, 10, 10).faces().first()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面（与 val() 类似）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.item(i)&amp;lt;/code&amp;gt; || 返回栈中的第 i 个项 || &amp;lt;code&amp;gt;third_face = cq.Workplane().box(10, 10, 10).faces().item(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第三个面（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.last()&amp;lt;/code&amp;gt; || 返回栈中的最后一个项 || &amp;lt;code&amp;gt;last_face = cq.Workplane().box(10, 10, 10).faces().last()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的最后一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.end([n])&amp;lt;/code&amp;gt; || 返回此 CQ 元素的第 n 级父对象 || &amp;lt;code&amp;gt;parent = cq.Workplane().box(10, 10, 10).faces().vertices().end(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从顶点选择返回两级父对象（返回到实体层级）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vertices([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的顶点，可选择过滤 || &amp;lt;code&amp;gt;vertices = cq.Workplane().box(10, 10, 10).vertices()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体的所有 8 个顶点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.faces([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的面，可选择过滤 || &amp;lt;code&amp;gt;top_face = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体上表面（法线方向为正 Z 的面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.edges([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的边，可选择过滤 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vertical_edges = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体所有垂直边（平行于 Z 轴）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wires([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的线框，可选择过滤 || &amp;lt;code&amp;gt;wires = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).wires()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体顶面的外轮廓线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.solids([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的实体，可选择过滤 || &amp;lt;code&amp;gt;solids = cq.Workplane().box(10, 10, 10).solids()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体实体（通常只有一个）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shells([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的壳体，可选择过滤 || &amp;lt;code&amp;gt;shells = cq.Workplane().box(10, 10, 10).shell(0.5).shells()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建壳体后选择壳体对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.compounds([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中的复合体，可选择过滤 || &amp;lt;code&amp;gt;compounds = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5)).compounds()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;合并立方体和球体后，选择复合体对象&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NearestToPointSelector(pnt)&amp;lt;/code&amp;gt; || 选择离指定点最近的对象 || &amp;lt;code&amp;gt;nearest = cq.Workplane().box(10, 10, 10).faces(NearestToPointSelector((0,0,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择距离点 (0,0,5) 最近的面（通常为上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BoxSelector(point0, point1[, boundingbox])&amp;lt;/code&amp;gt; || 选择由两点定义的 3D 框内的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(BoxSelector((-5,-5,-5), (5,5,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择位于立方体边界框内的所有面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BaseDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 基于单个方向向量进行选择的基础选择器 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(BaseDirSelector((0,0,1), 0.01))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择方向与 Z 轴对齐的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ParallelDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向平行的对象 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(ParallelDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的边（即所有垂直边）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向对齐的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(DirectionSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向为 Z 轴方向的面（上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionNthSelector(vector, n[, ...])&amp;lt;/code&amp;gt; || 过滤与指定方向平行（或垂直）的对象，返回第 N 个 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(DirectionNthSelector((0,0,1), 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的第 3 条边（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LengthNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个长度的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(LengthNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择长度最短的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AreaNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个面积的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(AreaNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择面积最小的面（10x10 的面中最小为 100）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RadiusNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个半径的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().cylinder(10, 5).edges(RadiusNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择半径最小的边（圆柱体上下圆边半径 5）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PerpendicularDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向垂直的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(PerpendicularDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向与 Z 轴垂直的面（四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypeSelector(typeString)&amp;lt;/code&amp;gt; || 选择具有指定几何类型的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(TypeSelector(&amp;quot;PLANE&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有平面类型的面（立方体所有面都是平面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionMinMaxSelector(vector, minOrMax)&amp;lt;/code&amp;gt; || 选择在指定方向上最近或最远的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(DirectionMinMaxSelector((0,0,1), &amp;quot;MAX&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择在 Z 轴方向上最远的面（即上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CenterNthSelector(vector, n[, directionMax, ...])&amp;lt;/code&amp;gt; || 按中心在指定方向上投影的距离排序，选择第 N 个对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(CenterNthSelector((0,0,1), 1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;按面中心在 Z 轴投影距离排序，选择第 2 个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AndSelector(left, right)&amp;lt;/code&amp;gt; || 交集选择器（同时满足两个选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(AndSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向的平面（即上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SumSelector(left, right)&amp;lt;/code&amp;gt; || 并集选择器（满足任一选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SumSelector(DirectionSelector((0,0,1)), DirectionSelector((1,0,0))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴或 X 轴方向的面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SubtractSelector(left, right)&amp;lt;/code&amp;gt; || 差集选择器（满足 left 但不满足 right） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SubtractSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向但非平面的面（立方体中无结果）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;InverseSelector(selector)&amp;lt;/code&amp;gt; || 反转给定选择器的选择结果 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(InverseSelector(DirectionSelector((0,0,1))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有法线方向不是 Z 轴的面（即四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringSyntaxSelector(selectorString)&amp;lt;/code&amp;gt; || 使用简单字符串语法过滤对象列表 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(StringSyntaxSelector(&amp;quot;&amp;gt;Z&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用字符串语法选择法线方向为正 Z 的面（等价于 &amp;quot;&amp;gt;Z&amp;quot;）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 装配体 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly([obj, loc, name, color, material, ...])&amp;lt;/code&amp;gt; || 嵌套的 Workplane 和 Shape 对象装配体，定义它们的相对位置 || &amp;lt;code&amp;gt;assy = cq.Assembly()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的装配体对象，用于组织和定位多个零件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.add(obj[, loc, name, color, ...])&amp;lt;/code&amp;gt; || 向当前装配体添加子装配体或零件 || &amp;lt;code&amp;gt;assy.add(cq.Workplane().box(10, 10, 5), name=&amp;quot;base&amp;quot;)&amp;lt;br/&amp;gt;assy.add(cq.Workplane().sphere(3), loc=cq.Location((0,0,5)), name=&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;向装配体添加底座（立方体）和顶部球体，并指定位置和名称&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.save(path[, exportType, mode, ...])&amp;lt;/code&amp;gt; || 将装配体保存到文件 || &amp;lt;code&amp;gt;assy.save(&amp;quot;assembly.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将装配体保存为 STEP 文件，支持 STEP、STL、VRML 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.constrain(constraint)&amp;lt;/code&amp;gt; || 定义一个新的约束 || &amp;lt;code&amp;gt;assy.constrain(&amp;quot;base&amp;quot;, &amp;quot;top&amp;quot;, &amp;quot;Axis&amp;quot;, (0,0,1), (0,0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;约束底座和顶部的 Z 轴对齐，使球体位于底座正上方&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.solve([verbosity])&amp;lt;/code&amp;gt; || 求解所有已定义的约束 || &amp;lt;code&amp;gt;assy.solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;求解所有约束，自动调整零件位置以满足约束条件，verbosity=1 可输出求解详情&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Color(r, g, b[, a])&amp;lt;/code&amp;gt; || OCCT 颜色对象 Quantity_ColorRGBA 的包装器 || &amp;lt;code&amp;gt;red = cq.Color(1, 0, 0)&amp;lt;br/&amp;gt;assy.add(part, color=red)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建红色颜色对象，并将其应用于装配体中的零件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 导出与导入 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.toSvg([opts])&amp;lt;/code&amp;gt; || 返回表示栈中第一个项的 SVG 文本 || &amp;lt;code&amp;gt;svg_text = cq.Workplane().rect(10, 10).toSvg()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并将其转换为 SVG 文本字符串，可用于网页显示或保存&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.exportSvg(fileName)&amp;lt;/code&amp;gt; || 将栈中第一个项导出为 SVG 文件 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).exportSvg(&amp;quot;rectangle.svg&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并导出为 &amp;quot;rectangle.svg&amp;quot; 文件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importStep(fileName)&amp;lt;/code&amp;gt; || 加载 STEP 文件到 CadQuery Workplane || &amp;lt;code&amp;gt;part = cq.importers.importStep(&amp;quot;model.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 &amp;quot;model.step&amp;quot; 文件导入 3D 模型，返回 Workplane 对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 加载 DXF 文件到 Workplane || &amp;lt;code&amp;gt;sketch = cq.importers.importDXF(&amp;quot;profile.dxf&amp;quot;, tol=0.01)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入 2D 轮廓，容差设为 0.01&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exporters.export(w, fname[, exportType, ...])&amp;lt;/code&amp;gt; || 将 Workplane 或 Shape 导出到文件 || &amp;lt;code&amp;gt;cq.exporters.export(part, &amp;quot;output.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Workplane 对象导出为 STEP 文件，支持 STL、STEP、SVG 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;occ_impl.exporters.dxf.DxfDocument([...])&amp;lt;/code&amp;gt; || 从 CadQuery 对象创建 DXF 文档 || &amp;lt;code&amp;gt;doc = cq.occ_impl.exporters.dxf.DxfDocument()&amp;lt;br/&amp;gt;doc.addShape(sketch)&amp;lt;br/&amp;gt;doc.save(&amp;quot;output.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 DXF 文档对象，添加几何形状后保存为 DXF 文件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CadQuery&amp;diff=1741</id>
		<title>CadQuery</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CadQuery&amp;diff=1741"/>
		<updated>2026-04-02T01:51:22Z</updated>

		<summary type="html">&lt;p&gt;Eric：​/* 3D 操作（需要活动工作平面） */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CadQuery 是一个基于 [[Python]] 的参数化 3D CAD 库，底层使用 OpenCascade（OCCT）内核。支持输出STL、STEP、AMF和3MF的CAD格式。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
最简单方式使用CQ-Editor（官方的 GUI 编辑器），或者使用常用的编辑器+插件，如VS Code编辑器和OCP CAD Viewer插件。&lt;br /&gt;
===CQ-Editor===&lt;br /&gt;
安装CQ-editor编辑器，会自动安装cadquery，通过pip安装：&lt;br /&gt;
 pip install CQ-editor&lt;br /&gt;
安装后，通过命令行启动：&lt;br /&gt;
 CQ-editor&lt;br /&gt;
&lt;br /&gt;
https://github.com/CadQuery/CQ-editor/wiki/Installation&lt;br /&gt;
&lt;br /&gt;
===VS Code===&lt;br /&gt;
VS Code中，先安装cadquery，在安装OCP CAD Viewer插件。&lt;br /&gt;
 pip install cadquery&lt;br /&gt;
安装cadquery后，在[[VS Code]]插件中查找OCP CAD Viewer安装，方便在VS Code查看模型，安装后在VS Code运行查看下。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import cadquery as cq&lt;br /&gt;
from ocp_vscode import show, show_object&lt;br /&gt;
&lt;br /&gt;
result = cq.Workplane(&amp;quot;XY&amp;quot;).box(2,2,2).shell(0.2)&lt;br /&gt;
show_object(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
如果出现错误，不显示模型，在VS Code左侧栏点击OCP图标，在点击ocp_vscode行右侧的Open viewer按钮，就会显示RUNNING并运行，再次运行代码即可。&lt;br /&gt;
&lt;br /&gt;
https://cadquery.readthedocs.io/en/latest/installation.html&lt;br /&gt;
https://github.com/bernhard-42/vscode-ocp-cad-viewer&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
== 核心概念 ==&lt;br /&gt;
CadQuery 是一个基于 Python 的 3D CAD 建模库，其底层是 OpenCascade 几何内核。&lt;br /&gt;
&lt;br /&gt;
=== BREP 拓扑 ===&lt;br /&gt;
CadQuery 使用&#039;&#039;&#039;边界表示法（BREP）&#039;&#039;&#039;来定义 3D 物体，即物体由其表面来定义。基本的拓扑元素从简单到复杂依次为：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;顶点 (Vertex)&#039;&#039;&#039;：空间中的一个点&lt;br /&gt;
* &#039;&#039;&#039;边 (Edge)&#039;&#039;&#039;：连接两个或多个顶点的曲线段&lt;br /&gt;
* &#039;&#039;&#039;线框 (Wire)&#039;&#039;&#039;：一组相互连接的边&lt;br /&gt;
* &#039;&#039;&#039;面 (Face)&#039;&#039;&#039;：由线框围成的平面或曲面&lt;br /&gt;
* &#039;&#039;&#039;实体 (Solid)&#039;&#039;&#039;：由面围成的封闭三维体&lt;br /&gt;
* &#039;&#039;&#039;复合体 (Compound)&#039;&#039;&#039;：多个实体的集合&lt;br /&gt;
&lt;br /&gt;
=== API 层次结构 ===&lt;br /&gt;
CadQuery 提供了三个层次的 API，从上到下越来越灵活，但也越来越复杂。&lt;br /&gt;
==== 流畅 API ====&lt;br /&gt;
流畅 API是通过链式调用进行建模的接口，入门首选，简单易用。主要分为2类&lt;br /&gt;
* Workplane类，传统 3D 建模，最常用。 示例：&amp;lt;code&amp;gt;part = Workplane(&amp;quot;XY&amp;quot;).box(1,2,3).faces(&amp;quot;&amp;gt;Z&amp;quot;).circle(0.5).cutThruAll()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Sketch类，二维草图专用，更符合传统 CAD 绘图习惯，CadQuery 2.x版本引入。&lt;br /&gt;
&lt;br /&gt;
两者可以协同工作，如从二维草图开始创建三维模型Sketch → Workplane.placeSketch() → .extrude()，在现有模型上添加特征Workplane → 选面 → .sketch() → 修改 → .cutBlind()。典型工作流示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 创建一个带孔和圆角的平板&lt;br /&gt;
sketch_base = Sketch().rect(20, 15).constrain().solve()        # 底板轮廓&lt;br /&gt;
base = Workplane().placeSketch(sketch_base).extrude(3)         # 拉伸底板&lt;br /&gt;
&lt;br /&gt;
# 在底板上表面画圆孔&lt;br /&gt;
hole_sketch = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).sketch().circle(2).constrain().solve()&lt;br /&gt;
result = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).placeSketch(hole_sketch).cutBlind(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sketch 和 Workplane 的 2D 操作区别：&lt;br /&gt;
*Workplane 的 2D 操作：过程式建模，按顺序执行命令：画圆 → 移动 → 画矩形，尺寸硬编码数值，适用简单、固定的轮廓场景。&lt;br /&gt;
*Sketch ：约束驱动建模，定义几何约束如圆与矩形同心、相切等，尺寸约束 + 变量控制，适用复杂、参数化、需要设计意图的轮廓。&lt;br /&gt;
传统 CAD 中，设计意图（如&amp;quot;这个孔始终与板的中心对齐&amp;quot;）是通过约束实现的。Workplane 的过程式方式需要手动计算位置，参数变化时容易出错。Sketch约束后自动计算。当轮廓包含多个相互关联的图形时（如齿轮轮廓、法兰盘），约束系统能保证所有元素的关系正确。&lt;br /&gt;
&lt;br /&gt;
==== 直接 API ====&lt;br /&gt;
* 当流畅 API 不够用时使用，直接操作拓扑元素（顶点、边、面等）。&lt;br /&gt;
* 可以“自底向上”构建几何体，控制更精细。&lt;br /&gt;
* 示例：`wire = Wire.makeCircle(10); face = Face.makeFromWires(wire, [])`&lt;br /&gt;
&lt;br /&gt;
==== OCCT API ====&lt;br /&gt;
* 最底层，直接调用 OpenCascade 的 C++ 函数（通过 Python 绑定 `OCP`）。&lt;br /&gt;
* 极其强大但也极其繁琐，适合需要完全控制的场景。&lt;br /&gt;
* 示例：`from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox`&lt;br /&gt;
&lt;br /&gt;
=== 在 API 之间切换 ===&lt;br /&gt;
你可以根据需要混合使用不同层次的 API：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;从流畅 API 获取直接 API 对象&#039;&#039;&#039;：使用 `.val()` 或 `.findSolid()` 方法。&lt;br /&gt;
* &#039;&#039;&#039;从直接 API 对象回到流畅 API&#039;&#039;&#039;：将直接 API 对象作为参数传入新的 `Workplane`。&lt;br /&gt;
* &#039;&#039;&#039;获取底层的 OCCT 对象&#039;&#039;&#039;：直接 API 对象通过 `.wrapped` 属性即可获得。&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
选择器用于在已有模型上快速定位特征，相当于传统 CAD 中的鼠标选取。你可以通过字符串表达式选择面、边、顶点等。&lt;br /&gt;
* 例如：`faces(&amp;quot;&amp;gt;Z&amp;quot;)` 选择最上方的面，`edges(&amp;quot;&amp;gt;X&amp;quot;)` 选择 X 轴正方向的边。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API 参考==&lt;br /&gt;
=== 草图初始化 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch(parent, locs, obj)&amp;lt;/code&amp;gt; || 2D 草图，用于构建二维几何形状 || &amp;lt;code&amp;gt;s = Sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的 2D 草图对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 导入 DXF 文件并构建面 || &amp;lt;code&amp;gt;sketch = Sketch.importDXF(&amp;quot;profile.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入几何图形并创建草图&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sketch()&amp;lt;/code&amp;gt; || 初始化并返回一个草图 || &amp;lt;code&amp;gt;s = Workplane().sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;初始化一个新草图，通常在创建后自动调用&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.finalize()&amp;lt;/code&amp;gt; || 完成草图构造并返回父对象 || &amp;lt;code&amp;gt;result = sketch.finalize()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;完成草图编辑，返回父对象（通常用于链式调用）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.copy()&amp;lt;/code&amp;gt; || 创建草图的局部副本 || &amp;lt;code&amp;gt;s2 = s.copy()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图 s 的一个独立副本，用于后续修改而不影响原草图。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.located(loc)&amp;lt;/code&amp;gt; || 创建带有新位置的草图局部副本 || &amp;lt;code&amp;gt;sketch.located(Location(Vector(10, 0, 0)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图副本并平移到新位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.moved(....)&amp;lt;/code&amp;gt; || 创建移动后的面的草图局部副本 ||&amp;lt;code&amp;gt;sketch.moved(Vector(5, 5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将草图中的面移动后创建新副本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 草图选择 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.tag(name)&amp;lt;/code&amp;gt; || 为当前选择添加标签 || &amp;lt;code&amp;gt;sketch.rect(10, 10).tag(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形并为其添加标签 &amp;quot;outer&amp;quot;，便于后续选择&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.select(tag)&amp;lt;/code&amp;gt; || 根据标签选择元素 || &amp;lt;code&amp;gt;sketch.select(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择之前标记为 &amp;quot;outer&amp;quot; 的几何元素&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.reset()&amp;lt;/code&amp;gt; || 重置当前选择状态 || &amp;lt;code&amp;gt;sketch.reset()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;清除所有当前选中的元素，恢复到初始未选择状态&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.delete([mode])&amp;lt;/code&amp;gt; || 删除选中的对象 || &amp;lt;code&amp;gt;sketch.circle(5).tag(&amp;quot;hole&amp;quot;).delete()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆形后标记并删除它&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.faces([selector])&amp;lt;/code&amp;gt; || 选择面元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).faces().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形面并添加圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edges([selector])&amp;lt;/code&amp;gt; || 选择边元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).edges().chamfer(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有边并添加倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.vertices([selector])&amp;lt;/code&amp;gt; || 选择顶点元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).vertices().fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有顶点并添加圆角&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于面的草图绘制 ===&lt;br /&gt;
; Sketch Mode 类型说明&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;a&#039;&amp;lt;/code&amp;gt; - Add (添加) - 添加区域到草图 - 默认模式，创建实体区域&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;s&#039;&amp;lt;/code&amp;gt; - Subtract (减去) - 从现有区域中减去 - 创建孔洞或凹陷&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;i&#039;&amp;lt;/code&amp;gt; - Intersect (相交) - 保留与现有区域的交集 - 创建重叠部分&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;c&#039;&amp;lt;/code&amp;gt; - Construction (构造) - 创建辅助几何 - 辅助线/圆，不参与实体&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;g&#039;&amp;lt;/code&amp;gt; - Guide (引导) - 引导线 - 用于扫掠等操作&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.face(b[, angle, mode, tag, ...])&amp;lt;/code&amp;gt; || 从线框或边构建一个面 || &amp;lt;code&amp;gt;s = Sketch().face(wire, mode=&#039;a&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从闭合线框创建一个面，使用 ADD 模式添加到现有图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rect(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个矩形面 || &amp;lt;code&amp;gt;cq.Sketch().rect(10, 20).rect(5, 10, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x20 矩形，然后在其中减去一个 5x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.circle(r[, mode, tag])&amp;lt;/code&amp;gt; || 构建一个圆形面 || &amp;lt;code&amp;gt;s = cq.Sketch().circle(5).circle(3,mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个半径 5 的圆，然后在中心减去一个半径 3 的圆（形成环形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.ellipse(a1, a2[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个椭圆面 || &amp;lt;code&amp;gt;s = Sketch().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个长半轴 10、短半轴 5 的椭圆面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.trapezoid(w, h, a1[, a2, angle, ...])&amp;lt;/code&amp;gt; || 构建一个梯形面 || &amp;lt;code&amp;gt;s = Sketch().trapezoid(10, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个顶宽 10、高 5、顶部偏移 2 的梯形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.slot(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个槽形面 || &amp;lt;code&amp;gt;s = Sketch().slot(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制一个长度20、宽度5的槽形面（带圆角）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.regularPolygon(r, n[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个正多边形面 || &amp;lt;code&amp;gt;s = Sketch().regularPolygon(5, 6)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个外接圆半径 5、6 条边的正六边形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.polygon(pts[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个多边形面 || &amp;lt;code&amp;gt;s = Sketch().polygon([(0,0), (10,0), (5,8)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个由三个点构成的三角形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rarray(xs, ys, nx, ny)&amp;lt;/code&amp;gt; || 生成一个矩形位置阵列 || &amp;lt;code&amp;gt;s = cq.Sketch().rect(50, 40).rarray(4, 3, 12, 10).circle(2, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 3x3 矩形，然后在创建12x10的孔阵列。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.parray(r, a1, da, n[, rotate])&amp;lt;/code&amp;gt; || 生成极坐标阵列位置 || &amp;lt;code&amp;gt;sketch.parray(20, 0, 360, 8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建围绕中心、半径 20、从 0 度到 360 度均匀分布的 8 个极坐标阵列位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.distribute(n[, start, stop, rotate])&amp;lt;/code&amp;gt; || 沿选中的边或线框分布位置 || &amp;lt;code&amp;gt;sketch.rect(20, 10).edges().distribute(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿矩形选中边均匀分布 5 个位置点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.each(callback[, mode, tag, ...])&amp;lt;/code&amp;gt; || 对所有适用实体应用回调函数 || &amp;lt;code&amp;gt;sketch.rarray(5, 5, 3, 2).each(lambda loc: Sketch().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个阵列位置点执行回调，绘制半径为 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.push(locs[, tag])&amp;lt;/code&amp;gt; || 将当前选择设置为给定位置或点 || &amp;lt;code&amp;gt;sketch.push([Vector(0,0), Vector(10,10), Vector(20,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将三个位置点推入当前选择栈，作为后续操作的基准点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.hull([mode, tag])&amp;lt;/code&amp;gt; || 从当前选择或所有对象生成凸包 || &amp;lt;code&amp;gt;s = Sketch().circle(3).circle(5, (10,0)).hull()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建两个圆，然后生成包含它们的最小凸包面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.offset(d[, mode, tag])&amp;lt;/code&amp;gt; || 偏移选定的线框或边 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).offset(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后向外偏移 1 单位（形成更大的矩形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.fillet(r)&amp;lt;/code&amp;gt; || 基于当前选择添加圆角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加半径 1 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.chamfer(d)&amp;lt;/code&amp;gt; || 基于当前选择添加倒角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().chamfer(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加距离 1 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.clean()&amp;lt;/code&amp;gt; || 移除内部线。 || &amp;lt;code&amp;gt;sketch.clean()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;清理草图中内部的非边界线段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于边和约束的草图绘制 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edge(val[, tag, forConstruction])&amp;lt;/code&amp;gt; || 向草图中添加一条边 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;s = Sketch().edge(&amp;quot;|&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加一条水平线作为构造线（用于约束）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.segment(p1, p2)&amp;lt;/code&amp;gt; || 构建一条线段 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 (0,0) 到 (10,0) 添加一条线段&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.arc(p1, p2, p3)&amp;lt;/code&amp;gt; || 构建一条弧线 || &amp;lt;code&amp;gt;s = Sketch().arc((0,0), (5,5), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;通过三点添加一条圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.spline(pts)&amp;lt;/code&amp;gt; || 构造样条曲线边 || &amp;lt;code&amp;gt;sketch.spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过给定点的样条曲线边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.close()&amp;lt;/code&amp;gt; || 将最后一条边连接到第一条边 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0)).segment((10,0), (10,10)).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加两条垂直边后闭合，形成 L 形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.assemble([mode, tag])&amp;lt;/code&amp;gt; || 将边组合成面 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10, mode=Mode.PRIVATE).assemble()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建私有矩形边，然后组合成一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.constrain(constraint)&amp;lt;/code&amp;gt; || 添加一个约束 || &amp;lt;code&amp;gt;s = Sketch().circle(5).constrain((&amp;quot;distance&amp;quot;, &amp;quot;origin&amp;quot;, 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆，然后添加约束使其圆心距离原点 2 单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.solve()&amp;lt;/code&amp;gt; || 求解当前约束并更新边位置 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).constrain((&amp;quot;coincident&amp;quot;, &amp;quot;vertex0&amp;quot;, &amp;quot;vertex1&amp;quot;)).solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加重合约束后求解，更新几何位置&lt;br /&gt;
|}&lt;br /&gt;
=== Workplane 初始化 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane(, obj)&amp;lt;/code&amp;gt; || 在空间中定义一个坐标系，可用于2D坐标操作。 || &amp;lt;code&amp;gt;Workplane()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;创建一个新的Workplane对象，默认在XY平面原点。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2D 操作 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.center(x, y)&amp;lt;/code&amp;gt; || 将局部坐标移动到指定位置 || &amp;lt;code&amp;gt;result = cq.Workplane().center(5, 5).rect(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将工作平面中心移动到 (5,5) 后创建 10x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.lineTo(x, y[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点到指定点绘制一条线 || &amp;lt;code&amp;gt;result = cq.Workplane().moveTo(0,0).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从原点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.line(xDist, yDist[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制相对直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).line(5, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点相对移动 (5,5) 并绘制直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点垂直向上绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLineTo(yCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线到指定 Y 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;垂直绘制到 Y=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLineTo(xCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线到指定 X 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制到 X=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLine(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点按角度和长度绘制直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLine(10, 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;以 45 度角绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLineTo(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点绘制极坐标直线到指定位置 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLineTo(10, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到极坐标 (10, 90°) 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.moveTo(x, y)&amp;lt;/code&amp;gt; || 移动到指定点（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().moveTo(5, 5).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前点移动到 (5,5)（不绘制），然后从该点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.move([xDist, yDist])&amp;lt;/code&amp;gt; || 相对移动指定距离（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().move(3, 4).line(5, 0)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;相对移动 (3,4)（不绘制），然后水平绘制长度 5 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.spline(listOfXYTuple[, tangents, ...])&amp;lt;/code&amp;gt; || 创建通过给定点的样条曲线（2D或3D） || &amp;lt;code&amp;gt;cq.Workplane().spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过三个点的平滑样条曲线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricCurve(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲线 || &amp;lt;code&amp;gt;cq.Workplane().parametricCurve(lambda t: (t, t**2), N=50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲线 y=x² 的逼近样条，使用 50 个采样点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricSurface(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲面 || &amp;lt;code&amp;gt;cq.Workplane().parametricSurface(lambda u,v: (u, v, u*v))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲面 z=xy 的逼近曲面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.threePointArc(point1, point2[, ...])&amp;lt;/code&amp;gt; || 通过三个点绘制圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).threePointArc((5,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点通过 (5,0) 到 (10,0) 绘制圆弧（形成半圆）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sagittaArc(endPoint, sag[, ...])&amp;lt;/code&amp;gt; || 使用矢高（sagitta）定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).sagittaArc((10,0), 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、矢高 2 的圆弧（拱形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.radiusArc(endPoint, radius[, ...])&amp;lt;/code&amp;gt; || 使用半径定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).radiusArc((10,0), 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、半径 5 的圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tangentArcPoint(endPoint)&amp;lt;/code&amp;gt; || 从当前边末端绘制切线圆弧到指定点 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(5,0).tangentArcPoint((10,5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;先绘制水平线，然后绘制与前一条边相切的圆弧到 (10,5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorY()&amp;lt;/code&amp;gt; || 沿 Y 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorY()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 Y 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorX()&amp;lt;/code&amp;gt; || 沿 X 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorX()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 X 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wire([forConstruction])&amp;lt;/code&amp;gt; || 将所有待定边连接成线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).wire()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两条边连接成 L 形线框对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rect(xLen, yLen[, centered, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造矩形 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制 10x20 的矩形（默认 centered=True）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.circle(radius[, forConstruction])&amp;lt;/code&amp;gt; || 为栈上每个项构造圆 || &amp;lt;code&amp;gt;cq.Workplane().circle(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制半径 5 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipse(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造椭圆 || &amp;lt;code&amp;gt;cq.Workplane().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制长轴 10、短轴 5 的椭圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipseArc(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 绘制椭圆弧 || &amp;lt;code&amp;gt;cq.Workplane().ellipseArc(10, 5, 0, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制从 0° 到 90° 的椭圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polyline(listOfXYTuple[, ...])&amp;lt;/code&amp;gt; || 从点列表创建折线 || &amp;lt;code&amp;gt;cq.Workplane().polyline([(0,0), (10,0), (10,10)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制连接三个点的折线（L 形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.close()&amp;lt;/code&amp;gt; || 结束构建并尝试创建封闭线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;闭合当前绘制的轮廓，形成封闭矩形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rarray(xSpacing, ySpacing, xCount, ...)&amp;lt;/code&amp;gt; || 创建矩形阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().rarray(10, 10, 3, 2).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 3 列 2 行、间距 10 的矩形阵列点，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarArray(radius, startAngle, ...)&amp;lt;/code&amp;gt; || 创建极坐标阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().polarArray(20, 0, 360, 8).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 8 个点的 360° 极坐标阵列，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.slot2D(length, diameter[, angle])&amp;lt;/code&amp;gt; || 创建带圆角的槽形 || &amp;lt;code&amp;gt;cq.Workplane().slot2D(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点创建长度 20、宽度 5 的跑道形槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.offset2D(d[, kind, forConstruction])&amp;lt;/code&amp;gt; || 创建 2D 偏移线框 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).offset2D(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x10 矩形线框向外偏移 2 个单位，生成更大的矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.placeSketch(sketch)&amp;lt;/code&amp;gt; || 根据栈上项放置草图 || &amp;lt;code&amp;gt;cq.Workplane().placeSketch(mySketch).extrude(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Sketch 对象放置到当前 Workplane 位置，然后拉伸 5 个单位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（需要活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cboreHole(diameter, cboreDiameter, cboreDepth[, depth, clean])&amp;lt;/code&amp;gt; || 创建沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cboreHole(5, 10, 3, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、沉头直径 10、沉头深度 3、总深 8 的沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cskHole(diameter, cskDiameter, cskAngle[, depth, clean])&amp;lt;/code&amp;gt; || 创建锥形沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cskHole(5, 10, 90, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、锥头直径 10、锥角 90° 的锥形沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hole(diameter[, depth, clean])&amp;lt;/code&amp;gt; || 创建通孔或盲孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、深度 8 的盲孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.extrude(until[, combine, clean, both, taper])&amp;lt;/code&amp;gt; || 将线框挤出为棱柱体，可以给定数值，或&#039;next&#039;,&#039;last &#039;,或输入一个对象的Face。 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).extrude(30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x20 矩形沿法线方向挤出高度 30 的实体&amp;lt;br/&amp;gt; &amp;lt;code&amp;gt;result = cq.Workplane(origin=(20, 0, 0)).circle(2).revolve(180, (-20, 0, 0), (-20, -1, 0)).center(-20, 0).workplane().rect(10, 4).extrude(&amp;quot;last&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cut(toCut[, clean, tol])&amp;lt;/code&amp;gt; || 从当前实体切除另一个实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 10).cut(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从盒子中减去半径为 8 的球体（布尔差集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutBlind(until[, clean, both, taper])&amp;lt;/code&amp;gt; || 盲切（有限深度挤出切除） || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutBlind(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓沿法线方向挤出切除深度 15 的槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutThruAll([clean, taper])&amp;lt;/code&amp;gt; || 贯穿切除 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓贯穿整个实体进行切除&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.box(length, width, height[, centered, combine])&amp;lt;/code&amp;gt; || 创建立方体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 20, 30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建长 10、宽 20、高 30 的长方体（默认 centered=True，中心位于原点）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sphere(radius[, direct, angle1, angle2, combine])&amp;lt;/code&amp;gt; || 创建球体 || &amp;lt;code&amp;gt;result = cq.Workplane().sphere(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在当前工作平面位置创建半径 10 的球体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wedge(dx, dy, dz, xmin, zmin, xmax, zmax[, combine])&amp;lt;/code&amp;gt; || 创建楔形体 || &amp;lt;code&amp;gt;result = cq.Workplane().wedge(10, 20, 30, 0, 0, 10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建指定尺寸的楔形实体（类似三棱柱形状）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cylinder(height, radius[, direct, angle, combine])&amp;lt;/code&amp;gt; || 创建圆柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().cylinder(30, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建高度 30、半径 10 的圆柱体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.union([toUnion, clean, glue, tol])&amp;lt;/code&amp;gt; || 合并实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将球体与当前实体合并（布尔并集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.combine([clean, glue, tol])&amp;lt;/code&amp;gt; || 合并栈上所有实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5)).combine()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前栈中的多个实体合并为一个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.intersect(toIntersect[, clean, tol])&amp;lt;/code&amp;gt; || 与当前实体进行布尔交集运算 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).intersect(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10x10 的立方体，然后与半径 8 的球体进行布尔交集，保留两者重叠的部分&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.loft([ruled, combine, clean])&amp;lt;/code&amp;gt; || 放样多个截面 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 10).workplane(offset=5).rect(5, 5).loft()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两个不同尺寸的矩形截面放样成 3D 实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sweep(path[, multisection, transition, combine, clean])&amp;lt;/code&amp;gt; || 沿路径扫掠截面 || &amp;lt;code&amp;gt;path = cq.Workplane().spline([(0,0,0), (0,0,10)])&amp;lt;br/&amp;gt;result = cq.Workplane().circle(2).sweep(path)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿样条曲线路径扫掠圆形截面，生成弯曲管道&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.twistExtrude(distance, angleDegrees)&amp;lt;/code&amp;gt; || 在拉伸的同时扭转指定角度 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 5).twistExtrude(20, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 5x5 矩形沿法线方向拉伸 20 个单位，同时从底部到顶部扭转 90°&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.revolve([angleDegrees, axisStart, axisEnd, combine, clean])&amp;lt;/code&amp;gt; || 绕轴旋转生成实体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 10).revolve(360, (0,0), (0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形轮廓绕 Y 轴旋转 360° 生成回转体（类似圆环体或圆柱）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.text(txt, fontsize, distance[, ...])&amp;lt;/code&amp;gt; || 返回 3D 文本实体 || &amp;lt;code&amp;gt;result = cq.Workplane().text(&amp;quot;CadQuery&amp;quot;, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建内容为 &amp;quot;CadQuery&amp;quot;、字体高度 5、拉伸深度 2 的 3D 文本实体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（无需活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shell(thickness[, kind])&amp;lt;/code&amp;gt; || 移除选定的面以创建指定厚度的壳体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 5).faces(&amp;quot;&amp;gt;Z&amp;quot;).shell(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个盒子，移除顶面后形成壁厚 0.5 的壳体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.fillet(radius)&amp;lt;/code&amp;gt; || 在选定的边上添加圆角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加半径 2 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.chamfer(length[, length2])&amp;lt;/code&amp;gt; || 在选定的边上添加倒角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).chamfer(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加距离 2 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotate(axisStartPoint, axisEndPoint, angleDegrees)&amp;lt;/code&amp;gt; || 返回旋转后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotate((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绕 X 轴旋转立方体 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotateAboutCenter(axisEndPoint, ...)&amp;lt;/code&amp;gt; || 绕指定轴旋转栈中所有项 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotateAboutCenter((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 10x10x10 立方体，然后绕 X 轴（通过原点沿 X 方向）旋转 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.translate(vec)&amp;lt;/code&amp;gt; || 返回平移后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).translate((5, 0, 0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将立方体沿 X 轴平移 5 个单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirror([mirrorPlane, ...])&amp;lt;/code&amp;gt; || 镜像单个 CQ 对象 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).mirror(&amp;quot;YZ&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后，以 YZ 平面为镜像平面进行镜像&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 迭代方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.each(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 对栈中的每个值运行提供的函数，并将返回值收集到新的 CQ 对象中 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).each(lambda loc: cq.Workplane().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在矩形阵列的每个位置点执行回调函数，在每个点处创建半径为 2 的圆，并收集所有结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.eachpoint(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 与 each() 类似，但回调函数的参数会根据栈中位置进行平移 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).eachpoint(lambda pos: cq.Workplane().circle(2).translate(pos))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个位置点处创建圆，回调函数接收位置向量作为参数，便于创建相对于每个点的几何体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 栈与选择器方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.all()&amp;lt;/code&amp;gt; || 返回栈中所有 CQ 对象的列表 || &amp;lt;code&amp;gt;objects = cq.Workplane().box(10, 10, 10).faces().all()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体所有面的列表，返回包含每个面对象的列表&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.size()&amp;lt;/code&amp;gt; || 返回栈中当前对象的数量 || &amp;lt;code&amp;gt;count = cq.Workplane().box(10, 10, 10).faces().size()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体面的数量（返回 6）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vals()&amp;lt;/code&amp;gt; || 获取当前列表中的值 || &amp;lt;code&amp;gt;values = cq.Workplane().box(10, 10, 10).faces().vals()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取所有面对象的原始值（TopoDS_Shape 列表）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.add(obj)&amp;lt;/code&amp;gt; || 向栈中添加一个对象或对象列表 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后添加球体到栈中，栈中现在包含两个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.val()&amp;lt;/code&amp;gt; || 返回栈中的第一个值 || &amp;lt;code&amp;gt;first = cq.Workplane().box(10, 10, 10).faces().val()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.first()&amp;lt;/code&amp;gt; || 返回栈中的第一个项 || &amp;lt;code&amp;gt;first_item = cq.Workplane().box(10, 10, 10).faces().first()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面（与 val() 类似）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.item(i)&amp;lt;/code&amp;gt; || 返回栈中的第 i 个项 || &amp;lt;code&amp;gt;third_face = cq.Workplane().box(10, 10, 10).faces().item(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第三个面（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.last()&amp;lt;/code&amp;gt; || 返回栈中的最后一个项 || &amp;lt;code&amp;gt;last_face = cq.Workplane().box(10, 10, 10).faces().last()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的最后一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.end([n])&amp;lt;/code&amp;gt; || 返回此 CQ 元素的第 n 级父对象 || &amp;lt;code&amp;gt;parent = cq.Workplane().box(10, 10, 10).faces().vertices().end(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从顶点选择返回两级父对象（返回到实体层级）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vertices([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的顶点，可选择过滤 || &amp;lt;code&amp;gt;vertices = cq.Workplane().box(10, 10, 10).vertices()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体的所有 8 个顶点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.faces([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的面，可选择过滤 || &amp;lt;code&amp;gt;top_face = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体上表面（法线方向为正 Z 的面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.edges([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的边，可选择过滤 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vertical_edges = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体所有垂直边（平行于 Z 轴）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wires([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的线框，可选择过滤 || &amp;lt;code&amp;gt;wires = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).wires()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体顶面的外轮廓线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.solids([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的实体，可选择过滤 || &amp;lt;code&amp;gt;solids = cq.Workplane().box(10, 10, 10).solids()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体实体（通常只有一个）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shells([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的壳体，可选择过滤 || &amp;lt;code&amp;gt;shells = cq.Workplane().box(10, 10, 10).shell(0.5).shells()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建壳体后选择壳体对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.compounds([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中的复合体，可选择过滤 || &amp;lt;code&amp;gt;compounds = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5)).compounds()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;合并立方体和球体后，选择复合体对象&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NearestToPointSelector(pnt)&amp;lt;/code&amp;gt; || 选择离指定点最近的对象 || &amp;lt;code&amp;gt;nearest = cq.Workplane().box(10, 10, 10).faces(NearestToPointSelector((0,0,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择距离点 (0,0,5) 最近的面（通常为上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BoxSelector(point0, point1[, boundingbox])&amp;lt;/code&amp;gt; || 选择由两点定义的 3D 框内的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(BoxSelector((-5,-5,-5), (5,5,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择位于立方体边界框内的所有面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BaseDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 基于单个方向向量进行选择的基础选择器 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(BaseDirSelector((0,0,1), 0.01))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择方向与 Z 轴对齐的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ParallelDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向平行的对象 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(ParallelDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的边（即所有垂直边）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向对齐的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(DirectionSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向为 Z 轴方向的面（上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionNthSelector(vector, n[, ...])&amp;lt;/code&amp;gt; || 过滤与指定方向平行（或垂直）的对象，返回第 N 个 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(DirectionNthSelector((0,0,1), 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的第 3 条边（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LengthNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个长度的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(LengthNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择长度最短的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AreaNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个面积的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(AreaNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择面积最小的面（10x10 的面中最小为 100）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RadiusNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个半径的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().cylinder(10, 5).edges(RadiusNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择半径最小的边（圆柱体上下圆边半径 5）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PerpendicularDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向垂直的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(PerpendicularDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向与 Z 轴垂直的面（四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypeSelector(typeString)&amp;lt;/code&amp;gt; || 选择具有指定几何类型的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(TypeSelector(&amp;quot;PLANE&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有平面类型的面（立方体所有面都是平面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionMinMaxSelector(vector, minOrMax)&amp;lt;/code&amp;gt; || 选择在指定方向上最近或最远的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(DirectionMinMaxSelector((0,0,1), &amp;quot;MAX&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择在 Z 轴方向上最远的面（即上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CenterNthSelector(vector, n[, directionMax, ...])&amp;lt;/code&amp;gt; || 按中心在指定方向上投影的距离排序，选择第 N 个对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(CenterNthSelector((0,0,1), 1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;按面中心在 Z 轴投影距离排序，选择第 2 个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AndSelector(left, right)&amp;lt;/code&amp;gt; || 交集选择器（同时满足两个选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(AndSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向的平面（即上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SumSelector(left, right)&amp;lt;/code&amp;gt; || 并集选择器（满足任一选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SumSelector(DirectionSelector((0,0,1)), DirectionSelector((1,0,0))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴或 X 轴方向的面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SubtractSelector(left, right)&amp;lt;/code&amp;gt; || 差集选择器（满足 left 但不满足 right） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SubtractSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向但非平面的面（立方体中无结果）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;InverseSelector(selector)&amp;lt;/code&amp;gt; || 反转给定选择器的选择结果 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(InverseSelector(DirectionSelector((0,0,1))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有法线方向不是 Z 轴的面（即四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringSyntaxSelector(selectorString)&amp;lt;/code&amp;gt; || 使用简单字符串语法过滤对象列表 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(StringSyntaxSelector(&amp;quot;&amp;gt;Z&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用字符串语法选择法线方向为正 Z 的面（等价于 &amp;quot;&amp;gt;Z&amp;quot;）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 装配体 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly([obj, loc, name, color, material, ...])&amp;lt;/code&amp;gt; || 嵌套的 Workplane 和 Shape 对象装配体，定义它们的相对位置 || &amp;lt;code&amp;gt;assy = cq.Assembly()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的装配体对象，用于组织和定位多个零件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.add(obj[, loc, name, color, ...])&amp;lt;/code&amp;gt; || 向当前装配体添加子装配体或零件 || &amp;lt;code&amp;gt;assy.add(cq.Workplane().box(10, 10, 5), name=&amp;quot;base&amp;quot;)&amp;lt;br/&amp;gt;assy.add(cq.Workplane().sphere(3), loc=cq.Location((0,0,5)), name=&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;向装配体添加底座（立方体）和顶部球体，并指定位置和名称&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.save(path[, exportType, mode, ...])&amp;lt;/code&amp;gt; || 将装配体保存到文件 || &amp;lt;code&amp;gt;assy.save(&amp;quot;assembly.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将装配体保存为 STEP 文件，支持 STEP、STL、VRML 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.constrain(constraint)&amp;lt;/code&amp;gt; || 定义一个新的约束 || &amp;lt;code&amp;gt;assy.constrain(&amp;quot;base&amp;quot;, &amp;quot;top&amp;quot;, &amp;quot;Axis&amp;quot;, (0,0,1), (0,0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;约束底座和顶部的 Z 轴对齐，使球体位于底座正上方&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.solve([verbosity])&amp;lt;/code&amp;gt; || 求解所有已定义的约束 || &amp;lt;code&amp;gt;assy.solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;求解所有约束，自动调整零件位置以满足约束条件，verbosity=1 可输出求解详情&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Color(r, g, b[, a])&amp;lt;/code&amp;gt; || OCCT 颜色对象 Quantity_ColorRGBA 的包装器 || &amp;lt;code&amp;gt;red = cq.Color(1, 0, 0)&amp;lt;br/&amp;gt;assy.add(part, color=red)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建红色颜色对象，并将其应用于装配体中的零件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 导出与导入 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.toSvg([opts])&amp;lt;/code&amp;gt; || 返回表示栈中第一个项的 SVG 文本 || &amp;lt;code&amp;gt;svg_text = cq.Workplane().rect(10, 10).toSvg()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并将其转换为 SVG 文本字符串，可用于网页显示或保存&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.exportSvg(fileName)&amp;lt;/code&amp;gt; || 将栈中第一个项导出为 SVG 文件 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).exportSvg(&amp;quot;rectangle.svg&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并导出为 &amp;quot;rectangle.svg&amp;quot; 文件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importStep(fileName)&amp;lt;/code&amp;gt; || 加载 STEP 文件到 CadQuery Workplane || &amp;lt;code&amp;gt;part = cq.importers.importStep(&amp;quot;model.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 &amp;quot;model.step&amp;quot; 文件导入 3D 模型，返回 Workplane 对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 加载 DXF 文件到 Workplane || &amp;lt;code&amp;gt;sketch = cq.importers.importDXF(&amp;quot;profile.dxf&amp;quot;, tol=0.01)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入 2D 轮廓，容差设为 0.01&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exporters.export(w, fname[, exportType, ...])&amp;lt;/code&amp;gt; || 将 Workplane 或 Shape 导出到文件 || &amp;lt;code&amp;gt;cq.exporters.export(part, &amp;quot;output.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Workplane 对象导出为 STEP 文件，支持 STL、STEP、SVG 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;occ_impl.exporters.dxf.DxfDocument([...])&amp;lt;/code&amp;gt; || 从 CadQuery 对象创建 DXF 文档 || &amp;lt;code&amp;gt;doc = cq.occ_impl.exporters.dxf.DxfDocument()&amp;lt;br/&amp;gt;doc.addShape(sketch)&amp;lt;br/&amp;gt;doc.save(&amp;quot;output.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 DXF 文档对象，添加几何形状后保存为 DXF 文件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CadQuery&amp;diff=1740</id>
		<title>CadQuery</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CadQuery&amp;diff=1740"/>
		<updated>2026-04-02T01:30:59Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CadQuery 是一个基于 [[Python]] 的参数化 3D CAD 库，底层使用 OpenCascade（OCCT）内核。支持输出STL、STEP、AMF和3MF的CAD格式。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
最简单方式使用CQ-Editor（官方的 GUI 编辑器），或者使用常用的编辑器+插件，如VS Code编辑器和OCP CAD Viewer插件。&lt;br /&gt;
===CQ-Editor===&lt;br /&gt;
安装CQ-editor编辑器，会自动安装cadquery，通过pip安装：&lt;br /&gt;
 pip install CQ-editor&lt;br /&gt;
安装后，通过命令行启动：&lt;br /&gt;
 CQ-editor&lt;br /&gt;
&lt;br /&gt;
https://github.com/CadQuery/CQ-editor/wiki/Installation&lt;br /&gt;
&lt;br /&gt;
===VS Code===&lt;br /&gt;
VS Code中，先安装cadquery，在安装OCP CAD Viewer插件。&lt;br /&gt;
 pip install cadquery&lt;br /&gt;
安装cadquery后，在[[VS Code]]插件中查找OCP CAD Viewer安装，方便在VS Code查看模型，安装后在VS Code运行查看下。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import cadquery as cq&lt;br /&gt;
from ocp_vscode import show, show_object&lt;br /&gt;
&lt;br /&gt;
result = cq.Workplane(&amp;quot;XY&amp;quot;).box(2,2,2).shell(0.2)&lt;br /&gt;
show_object(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
如果出现错误，不显示模型，在VS Code左侧栏点击OCP图标，在点击ocp_vscode行右侧的Open viewer按钮，就会显示RUNNING并运行，再次运行代码即可。&lt;br /&gt;
&lt;br /&gt;
https://cadquery.readthedocs.io/en/latest/installation.html&lt;br /&gt;
https://github.com/bernhard-42/vscode-ocp-cad-viewer&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
== 核心概念 ==&lt;br /&gt;
CadQuery 是一个基于 Python 的 3D CAD 建模库，其底层是 OpenCascade 几何内核。&lt;br /&gt;
&lt;br /&gt;
=== BREP 拓扑 ===&lt;br /&gt;
CadQuery 使用&#039;&#039;&#039;边界表示法（BREP）&#039;&#039;&#039;来定义 3D 物体，即物体由其表面来定义。基本的拓扑元素从简单到复杂依次为：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;顶点 (Vertex)&#039;&#039;&#039;：空间中的一个点&lt;br /&gt;
* &#039;&#039;&#039;边 (Edge)&#039;&#039;&#039;：连接两个或多个顶点的曲线段&lt;br /&gt;
* &#039;&#039;&#039;线框 (Wire)&#039;&#039;&#039;：一组相互连接的边&lt;br /&gt;
* &#039;&#039;&#039;面 (Face)&#039;&#039;&#039;：由线框围成的平面或曲面&lt;br /&gt;
* &#039;&#039;&#039;实体 (Solid)&#039;&#039;&#039;：由面围成的封闭三维体&lt;br /&gt;
* &#039;&#039;&#039;复合体 (Compound)&#039;&#039;&#039;：多个实体的集合&lt;br /&gt;
&lt;br /&gt;
=== API 层次结构 ===&lt;br /&gt;
CadQuery 提供了三个层次的 API，从上到下越来越灵活，但也越来越复杂。&lt;br /&gt;
==== 流畅 API ====&lt;br /&gt;
流畅 API是通过链式调用进行建模的接口，入门首选，简单易用。主要分为2类&lt;br /&gt;
* Workplane类，传统 3D 建模，最常用。 示例：&amp;lt;code&amp;gt;part = Workplane(&amp;quot;XY&amp;quot;).box(1,2,3).faces(&amp;quot;&amp;gt;Z&amp;quot;).circle(0.5).cutThruAll()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Sketch类，二维草图专用，更符合传统 CAD 绘图习惯，CadQuery 2.x版本引入。&lt;br /&gt;
&lt;br /&gt;
两者可以协同工作，如从二维草图开始创建三维模型Sketch → Workplane.placeSketch() → .extrude()，在现有模型上添加特征Workplane → 选面 → .sketch() → 修改 → .cutBlind()。典型工作流示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 创建一个带孔和圆角的平板&lt;br /&gt;
sketch_base = Sketch().rect(20, 15).constrain().solve()        # 底板轮廓&lt;br /&gt;
base = Workplane().placeSketch(sketch_base).extrude(3)         # 拉伸底板&lt;br /&gt;
&lt;br /&gt;
# 在底板上表面画圆孔&lt;br /&gt;
hole_sketch = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).sketch().circle(2).constrain().solve()&lt;br /&gt;
result = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).placeSketch(hole_sketch).cutBlind(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sketch 和 Workplane 的 2D 操作区别：&lt;br /&gt;
*Workplane 的 2D 操作：过程式建模，按顺序执行命令：画圆 → 移动 → 画矩形，尺寸硬编码数值，适用简单、固定的轮廓场景。&lt;br /&gt;
*Sketch ：约束驱动建模，定义几何约束如圆与矩形同心、相切等，尺寸约束 + 变量控制，适用复杂、参数化、需要设计意图的轮廓。&lt;br /&gt;
传统 CAD 中，设计意图（如&amp;quot;这个孔始终与板的中心对齐&amp;quot;）是通过约束实现的。Workplane 的过程式方式需要手动计算位置，参数变化时容易出错。Sketch约束后自动计算。当轮廓包含多个相互关联的图形时（如齿轮轮廓、法兰盘），约束系统能保证所有元素的关系正确。&lt;br /&gt;
&lt;br /&gt;
==== 直接 API ====&lt;br /&gt;
* 当流畅 API 不够用时使用，直接操作拓扑元素（顶点、边、面等）。&lt;br /&gt;
* 可以“自底向上”构建几何体，控制更精细。&lt;br /&gt;
* 示例：`wire = Wire.makeCircle(10); face = Face.makeFromWires(wire, [])`&lt;br /&gt;
&lt;br /&gt;
==== OCCT API ====&lt;br /&gt;
* 最底层，直接调用 OpenCascade 的 C++ 函数（通过 Python 绑定 `OCP`）。&lt;br /&gt;
* 极其强大但也极其繁琐，适合需要完全控制的场景。&lt;br /&gt;
* 示例：`from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox`&lt;br /&gt;
&lt;br /&gt;
=== 在 API 之间切换 ===&lt;br /&gt;
你可以根据需要混合使用不同层次的 API：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;从流畅 API 获取直接 API 对象&#039;&#039;&#039;：使用 `.val()` 或 `.findSolid()` 方法。&lt;br /&gt;
* &#039;&#039;&#039;从直接 API 对象回到流畅 API&#039;&#039;&#039;：将直接 API 对象作为参数传入新的 `Workplane`。&lt;br /&gt;
* &#039;&#039;&#039;获取底层的 OCCT 对象&#039;&#039;&#039;：直接 API 对象通过 `.wrapped` 属性即可获得。&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
选择器用于在已有模型上快速定位特征，相当于传统 CAD 中的鼠标选取。你可以通过字符串表达式选择面、边、顶点等。&lt;br /&gt;
* 例如：`faces(&amp;quot;&amp;gt;Z&amp;quot;)` 选择最上方的面，`edges(&amp;quot;&amp;gt;X&amp;quot;)` 选择 X 轴正方向的边。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API 参考==&lt;br /&gt;
=== 草图初始化 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch(parent, locs, obj)&amp;lt;/code&amp;gt; || 2D 草图，用于构建二维几何形状 || &amp;lt;code&amp;gt;s = Sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的 2D 草图对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 导入 DXF 文件并构建面 || &amp;lt;code&amp;gt;sketch = Sketch.importDXF(&amp;quot;profile.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入几何图形并创建草图&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sketch()&amp;lt;/code&amp;gt; || 初始化并返回一个草图 || &amp;lt;code&amp;gt;s = Workplane().sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;初始化一个新草图，通常在创建后自动调用&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.finalize()&amp;lt;/code&amp;gt; || 完成草图构造并返回父对象 || &amp;lt;code&amp;gt;result = sketch.finalize()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;完成草图编辑，返回父对象（通常用于链式调用）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.copy()&amp;lt;/code&amp;gt; || 创建草图的局部副本 || &amp;lt;code&amp;gt;s2 = s.copy()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图 s 的一个独立副本，用于后续修改而不影响原草图。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.located(loc)&amp;lt;/code&amp;gt; || 创建带有新位置的草图局部副本 || &amp;lt;code&amp;gt;sketch.located(Location(Vector(10, 0, 0)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图副本并平移到新位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.moved(....)&amp;lt;/code&amp;gt; || 创建移动后的面的草图局部副本 ||&amp;lt;code&amp;gt;sketch.moved(Vector(5, 5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将草图中的面移动后创建新副本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 草图选择 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.tag(name)&amp;lt;/code&amp;gt; || 为当前选择添加标签 || &amp;lt;code&amp;gt;sketch.rect(10, 10).tag(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形并为其添加标签 &amp;quot;outer&amp;quot;，便于后续选择&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.select(tag)&amp;lt;/code&amp;gt; || 根据标签选择元素 || &amp;lt;code&amp;gt;sketch.select(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择之前标记为 &amp;quot;outer&amp;quot; 的几何元素&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.reset()&amp;lt;/code&amp;gt; || 重置当前选择状态 || &amp;lt;code&amp;gt;sketch.reset()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;清除所有当前选中的元素，恢复到初始未选择状态&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.delete([mode])&amp;lt;/code&amp;gt; || 删除选中的对象 || &amp;lt;code&amp;gt;sketch.circle(5).tag(&amp;quot;hole&amp;quot;).delete()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆形后标记并删除它&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.faces([selector])&amp;lt;/code&amp;gt; || 选择面元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).faces().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形面并添加圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edges([selector])&amp;lt;/code&amp;gt; || 选择边元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).edges().chamfer(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有边并添加倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.vertices([selector])&amp;lt;/code&amp;gt; || 选择顶点元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).vertices().fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有顶点并添加圆角&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于面的草图绘制 ===&lt;br /&gt;
; Sketch Mode 类型说明&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;a&#039;&amp;lt;/code&amp;gt; - Add (添加) - 添加区域到草图 - 默认模式，创建实体区域&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;s&#039;&amp;lt;/code&amp;gt; - Subtract (减去) - 从现有区域中减去 - 创建孔洞或凹陷&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;i&#039;&amp;lt;/code&amp;gt; - Intersect (相交) - 保留与现有区域的交集 - 创建重叠部分&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;c&#039;&amp;lt;/code&amp;gt; - Construction (构造) - 创建辅助几何 - 辅助线/圆，不参与实体&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;g&#039;&amp;lt;/code&amp;gt; - Guide (引导) - 引导线 - 用于扫掠等操作&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.face(b[, angle, mode, tag, ...])&amp;lt;/code&amp;gt; || 从线框或边构建一个面 || &amp;lt;code&amp;gt;s = Sketch().face(wire, mode=&#039;a&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从闭合线框创建一个面，使用 ADD 模式添加到现有图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rect(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个矩形面 || &amp;lt;code&amp;gt;cq.Sketch().rect(10, 20).rect(5, 10, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x20 矩形，然后在其中减去一个 5x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.circle(r[, mode, tag])&amp;lt;/code&amp;gt; || 构建一个圆形面 || &amp;lt;code&amp;gt;s = cq.Sketch().circle(5).circle(3,mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个半径 5 的圆，然后在中心减去一个半径 3 的圆（形成环形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.ellipse(a1, a2[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个椭圆面 || &amp;lt;code&amp;gt;s = Sketch().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个长半轴 10、短半轴 5 的椭圆面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.trapezoid(w, h, a1[, a2, angle, ...])&amp;lt;/code&amp;gt; || 构建一个梯形面 || &amp;lt;code&amp;gt;s = Sketch().trapezoid(10, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个顶宽 10、高 5、顶部偏移 2 的梯形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.slot(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个槽形面 || &amp;lt;code&amp;gt;s = Sketch().slot(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制一个长度20、宽度5的槽形面（带圆角）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.regularPolygon(r, n[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个正多边形面 || &amp;lt;code&amp;gt;s = Sketch().regularPolygon(5, 6)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个外接圆半径 5、6 条边的正六边形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.polygon(pts[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个多边形面 || &amp;lt;code&amp;gt;s = Sketch().polygon([(0,0), (10,0), (5,8)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个由三个点构成的三角形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rarray(xs, ys, nx, ny)&amp;lt;/code&amp;gt; || 生成一个矩形位置阵列 || &amp;lt;code&amp;gt;s = cq.Sketch().rect(50, 40).rarray(4, 3, 12, 10).circle(2, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 3x3 矩形，然后在创建12x10的孔阵列。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.parray(r, a1, da, n[, rotate])&amp;lt;/code&amp;gt; || 生成极坐标阵列位置 || &amp;lt;code&amp;gt;sketch.parray(20, 0, 360, 8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建围绕中心、半径 20、从 0 度到 360 度均匀分布的 8 个极坐标阵列位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.distribute(n[, start, stop, rotate])&amp;lt;/code&amp;gt; || 沿选中的边或线框分布位置 || &amp;lt;code&amp;gt;sketch.rect(20, 10).edges().distribute(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿矩形选中边均匀分布 5 个位置点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.each(callback[, mode, tag, ...])&amp;lt;/code&amp;gt; || 对所有适用实体应用回调函数 || &amp;lt;code&amp;gt;sketch.rarray(5, 5, 3, 2).each(lambda loc: Sketch().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个阵列位置点执行回调，绘制半径为 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.push(locs[, tag])&amp;lt;/code&amp;gt; || 将当前选择设置为给定位置或点 || &amp;lt;code&amp;gt;sketch.push([Vector(0,0), Vector(10,10), Vector(20,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将三个位置点推入当前选择栈，作为后续操作的基准点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.hull([mode, tag])&amp;lt;/code&amp;gt; || 从当前选择或所有对象生成凸包 || &amp;lt;code&amp;gt;s = Sketch().circle(3).circle(5, (10,0)).hull()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建两个圆，然后生成包含它们的最小凸包面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.offset(d[, mode, tag])&amp;lt;/code&amp;gt; || 偏移选定的线框或边 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).offset(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后向外偏移 1 单位（形成更大的矩形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.fillet(r)&amp;lt;/code&amp;gt; || 基于当前选择添加圆角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加半径 1 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.chamfer(d)&amp;lt;/code&amp;gt; || 基于当前选择添加倒角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().chamfer(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加距离 1 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.clean()&amp;lt;/code&amp;gt; || 移除内部线。 || &amp;lt;code&amp;gt;sketch.clean()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;清理草图中内部的非边界线段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于边和约束的草图绘制 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edge(val[, tag, forConstruction])&amp;lt;/code&amp;gt; || 向草图中添加一条边 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;s = Sketch().edge(&amp;quot;|&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加一条水平线作为构造线（用于约束）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.segment(p1, p2)&amp;lt;/code&amp;gt; || 构建一条线段 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 (0,0) 到 (10,0) 添加一条线段&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.arc(p1, p2, p3)&amp;lt;/code&amp;gt; || 构建一条弧线 || &amp;lt;code&amp;gt;s = Sketch().arc((0,0), (5,5), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;通过三点添加一条圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.spline(pts)&amp;lt;/code&amp;gt; || 构造样条曲线边 || &amp;lt;code&amp;gt;sketch.spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过给定点的样条曲线边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.close()&amp;lt;/code&amp;gt; || 将最后一条边连接到第一条边 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0)).segment((10,0), (10,10)).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加两条垂直边后闭合，形成 L 形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.assemble([mode, tag])&amp;lt;/code&amp;gt; || 将边组合成面 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10, mode=Mode.PRIVATE).assemble()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建私有矩形边，然后组合成一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.constrain(constraint)&amp;lt;/code&amp;gt; || 添加一个约束 || &amp;lt;code&amp;gt;s = Sketch().circle(5).constrain((&amp;quot;distance&amp;quot;, &amp;quot;origin&amp;quot;, 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆，然后添加约束使其圆心距离原点 2 单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.solve()&amp;lt;/code&amp;gt; || 求解当前约束并更新边位置 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).constrain((&amp;quot;coincident&amp;quot;, &amp;quot;vertex0&amp;quot;, &amp;quot;vertex1&amp;quot;)).solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加重合约束后求解，更新几何位置&lt;br /&gt;
|}&lt;br /&gt;
=== Workplane 初始化 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane(, obj)&amp;lt;/code&amp;gt; || 在空间中定义一个坐标系，可用于2D坐标操作。 || &amp;lt;code&amp;gt;Workplane()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;创建一个新的Workplane对象，默认在XY平面原点。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2D 操作 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.center(x, y)&amp;lt;/code&amp;gt; || 将局部坐标移动到指定位置 || &amp;lt;code&amp;gt;result = cq.Workplane().center(5, 5).rect(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将工作平面中心移动到 (5,5) 后创建 10x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.lineTo(x, y[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点到指定点绘制一条线 || &amp;lt;code&amp;gt;result = cq.Workplane().moveTo(0,0).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从原点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.line(xDist, yDist[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制相对直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).line(5, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点相对移动 (5,5) 并绘制直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点垂直向上绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLineTo(yCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线到指定 Y 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;垂直绘制到 Y=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLineTo(xCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线到指定 X 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制到 X=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLine(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点按角度和长度绘制直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLine(10, 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;以 45 度角绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLineTo(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点绘制极坐标直线到指定位置 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLineTo(10, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到极坐标 (10, 90°) 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.moveTo(x, y)&amp;lt;/code&amp;gt; || 移动到指定点（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().moveTo(5, 5).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前点移动到 (5,5)（不绘制），然后从该点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.move([xDist, yDist])&amp;lt;/code&amp;gt; || 相对移动指定距离（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().move(3, 4).line(5, 0)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;相对移动 (3,4)（不绘制），然后水平绘制长度 5 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.spline(listOfXYTuple[, tangents, ...])&amp;lt;/code&amp;gt; || 创建通过给定点的样条曲线（2D或3D） || &amp;lt;code&amp;gt;cq.Workplane().spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过三个点的平滑样条曲线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricCurve(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲线 || &amp;lt;code&amp;gt;cq.Workplane().parametricCurve(lambda t: (t, t**2), N=50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲线 y=x² 的逼近样条，使用 50 个采样点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricSurface(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲面 || &amp;lt;code&amp;gt;cq.Workplane().parametricSurface(lambda u,v: (u, v, u*v))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲面 z=xy 的逼近曲面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.threePointArc(point1, point2[, ...])&amp;lt;/code&amp;gt; || 通过三个点绘制圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).threePointArc((5,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点通过 (5,0) 到 (10,0) 绘制圆弧（形成半圆）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sagittaArc(endPoint, sag[, ...])&amp;lt;/code&amp;gt; || 使用矢高（sagitta）定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).sagittaArc((10,0), 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、矢高 2 的圆弧（拱形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.radiusArc(endPoint, radius[, ...])&amp;lt;/code&amp;gt; || 使用半径定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).radiusArc((10,0), 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、半径 5 的圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tangentArcPoint(endPoint)&amp;lt;/code&amp;gt; || 从当前边末端绘制切线圆弧到指定点 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(5,0).tangentArcPoint((10,5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;先绘制水平线，然后绘制与前一条边相切的圆弧到 (10,5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorY()&amp;lt;/code&amp;gt; || 沿 Y 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorY()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 Y 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorX()&amp;lt;/code&amp;gt; || 沿 X 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorX()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 X 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wire([forConstruction])&amp;lt;/code&amp;gt; || 将所有待定边连接成线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).wire()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两条边连接成 L 形线框对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rect(xLen, yLen[, centered, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造矩形 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制 10x20 的矩形（默认 centered=True）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.circle(radius[, forConstruction])&amp;lt;/code&amp;gt; || 为栈上每个项构造圆 || &amp;lt;code&amp;gt;cq.Workplane().circle(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制半径 5 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipse(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造椭圆 || &amp;lt;code&amp;gt;cq.Workplane().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制长轴 10、短轴 5 的椭圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipseArc(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 绘制椭圆弧 || &amp;lt;code&amp;gt;cq.Workplane().ellipseArc(10, 5, 0, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制从 0° 到 90° 的椭圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polyline(listOfXYTuple[, ...])&amp;lt;/code&amp;gt; || 从点列表创建折线 || &amp;lt;code&amp;gt;cq.Workplane().polyline([(0,0), (10,0), (10,10)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制连接三个点的折线（L 形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.close()&amp;lt;/code&amp;gt; || 结束构建并尝试创建封闭线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;闭合当前绘制的轮廓，形成封闭矩形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rarray(xSpacing, ySpacing, xCount, ...)&amp;lt;/code&amp;gt; || 创建矩形阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().rarray(10, 10, 3, 2).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 3 列 2 行、间距 10 的矩形阵列点，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarArray(radius, startAngle, ...)&amp;lt;/code&amp;gt; || 创建极坐标阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().polarArray(20, 0, 360, 8).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 8 个点的 360° 极坐标阵列，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.slot2D(length, diameter[, angle])&amp;lt;/code&amp;gt; || 创建带圆角的槽形 || &amp;lt;code&amp;gt;cq.Workplane().slot2D(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点创建长度 20、宽度 5 的跑道形槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.offset2D(d[, kind, forConstruction])&amp;lt;/code&amp;gt; || 创建 2D 偏移线框 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).offset2D(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x10 矩形线框向外偏移 2 个单位，生成更大的矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.placeSketch(sketch)&amp;lt;/code&amp;gt; || 根据栈上项放置草图 || &amp;lt;code&amp;gt;cq.Workplane().placeSketch(mySketch).extrude(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Sketch 对象放置到当前 Workplane 位置，然后拉伸 5 个单位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（需要活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cboreHole(diameter, cboreDiameter, cboreDepth[, depth, clean])&amp;lt;/code&amp;gt; || 创建沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cboreHole(5, 10, 3, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、沉头直径 10、沉头深度 3、总深 8 的沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cskHole(diameter, cskDiameter, cskAngle[, depth, clean])&amp;lt;/code&amp;gt; || 创建锥形沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cskHole(5, 10, 90, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、锥头直径 10、锥角 90° 的锥形沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hole(diameter[, depth, clean])&amp;lt;/code&amp;gt; || 创建通孔或盲孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、深度 8 的盲孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.extrude(until[, combine, clean, both, taper])&amp;lt;/code&amp;gt; || 将线框挤出为棱柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).extrude(30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x20 矩形沿法线方向挤出高度 30 的实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cut(toCut[, clean, tol])&amp;lt;/code&amp;gt; || 从当前实体切除另一个实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 10).cut(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从盒子中减去半径为 8 的球体（布尔差集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutBlind(until[, clean, both, taper])&amp;lt;/code&amp;gt; || 盲切（有限深度挤出切除） || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutBlind(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓沿法线方向挤出切除深度 15 的槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutThruAll([clean, taper])&amp;lt;/code&amp;gt; || 贯穿切除 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓贯穿整个实体进行切除&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.box(length, width, height[, centered, combine])&amp;lt;/code&amp;gt; || 创建立方体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 20, 30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建长 10、宽 20、高 30 的长方体（默认 centered=True，中心位于原点）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sphere(radius[, direct, angle1, angle2, combine])&amp;lt;/code&amp;gt; || 创建球体 || &amp;lt;code&amp;gt;result = cq.Workplane().sphere(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在当前工作平面位置创建半径 10 的球体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wedge(dx, dy, dz, xmin, zmin, xmax, zmax[, combine])&amp;lt;/code&amp;gt; || 创建楔形体 || &amp;lt;code&amp;gt;result = cq.Workplane().wedge(10, 20, 30, 0, 0, 10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建指定尺寸的楔形实体（类似三棱柱形状）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cylinder(height, radius[, direct, angle, combine])&amp;lt;/code&amp;gt; || 创建圆柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().cylinder(30, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建高度 30、半径 10 的圆柱体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.union([toUnion, clean, glue, tol])&amp;lt;/code&amp;gt; || 合并实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将球体与当前实体合并（布尔并集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.combine([clean, glue, tol])&amp;lt;/code&amp;gt; || 合并栈上所有实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5)).combine()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前栈中的多个实体合并为一个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.intersect(toIntersect[, clean, tol])&amp;lt;/code&amp;gt; || 与当前实体进行布尔交集运算 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).intersect(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10x10 的立方体，然后与半径 8 的球体进行布尔交集，保留两者重叠的部分&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.loft([ruled, combine, clean])&amp;lt;/code&amp;gt; || 放样多个截面 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 10).workplane(offset=5).rect(5, 5).loft()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两个不同尺寸的矩形截面放样成 3D 实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sweep(path[, multisection, transition, combine, clean])&amp;lt;/code&amp;gt; || 沿路径扫掠截面 || &amp;lt;code&amp;gt;path = cq.Workplane().spline([(0,0,0), (0,0,10)])&amp;lt;br/&amp;gt;result = cq.Workplane().circle(2).sweep(path)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿样条曲线路径扫掠圆形截面，生成弯曲管道&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.twistExtrude(distance, angleDegrees)&amp;lt;/code&amp;gt; || 在拉伸的同时扭转指定角度 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 5).twistExtrude(20, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 5x5 矩形沿法线方向拉伸 20 个单位，同时从底部到顶部扭转 90°&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.revolve([angleDegrees, axisStart, axisEnd, combine, clean])&amp;lt;/code&amp;gt; || 绕轴旋转生成实体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 10).revolve(360, (0,0), (0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形轮廓绕 Y 轴旋转 360° 生成回转体（类似圆环体或圆柱）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.text(txt, fontsize, distance[, ...])&amp;lt;/code&amp;gt; || 返回 3D 文本实体 || &amp;lt;code&amp;gt;result = cq.Workplane().text(&amp;quot;CadQuery&amp;quot;, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建内容为 &amp;quot;CadQuery&amp;quot;、字体高度 5、拉伸深度 2 的 3D 文本实体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（无需活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shell(thickness[, kind])&amp;lt;/code&amp;gt; || 移除选定的面以创建指定厚度的壳体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 5).faces(&amp;quot;&amp;gt;Z&amp;quot;).shell(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个盒子，移除顶面后形成壁厚 0.5 的壳体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.fillet(radius)&amp;lt;/code&amp;gt; || 在选定的边上添加圆角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加半径 2 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.chamfer(length[, length2])&amp;lt;/code&amp;gt; || 在选定的边上添加倒角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).chamfer(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加距离 2 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotate(axisStartPoint, axisEndPoint, angleDegrees)&amp;lt;/code&amp;gt; || 返回旋转后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotate((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绕 X 轴旋转立方体 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotateAboutCenter(axisEndPoint, ...)&amp;lt;/code&amp;gt; || 绕指定轴旋转栈中所有项 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotateAboutCenter((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 10x10x10 立方体，然后绕 X 轴（通过原点沿 X 方向）旋转 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.translate(vec)&amp;lt;/code&amp;gt; || 返回平移后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).translate((5, 0, 0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将立方体沿 X 轴平移 5 个单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirror([mirrorPlane, ...])&amp;lt;/code&amp;gt; || 镜像单个 CQ 对象 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).mirror(&amp;quot;YZ&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后，以 YZ 平面为镜像平面进行镜像&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 迭代方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.each(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 对栈中的每个值运行提供的函数，并将返回值收集到新的 CQ 对象中 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).each(lambda loc: cq.Workplane().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在矩形阵列的每个位置点执行回调函数，在每个点处创建半径为 2 的圆，并收集所有结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.eachpoint(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 与 each() 类似，但回调函数的参数会根据栈中位置进行平移 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).eachpoint(lambda pos: cq.Workplane().circle(2).translate(pos))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个位置点处创建圆，回调函数接收位置向量作为参数，便于创建相对于每个点的几何体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 栈与选择器方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.all()&amp;lt;/code&amp;gt; || 返回栈中所有 CQ 对象的列表 || &amp;lt;code&amp;gt;objects = cq.Workplane().box(10, 10, 10).faces().all()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体所有面的列表，返回包含每个面对象的列表&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.size()&amp;lt;/code&amp;gt; || 返回栈中当前对象的数量 || &amp;lt;code&amp;gt;count = cq.Workplane().box(10, 10, 10).faces().size()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体面的数量（返回 6）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vals()&amp;lt;/code&amp;gt; || 获取当前列表中的值 || &amp;lt;code&amp;gt;values = cq.Workplane().box(10, 10, 10).faces().vals()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取所有面对象的原始值（TopoDS_Shape 列表）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.add(obj)&amp;lt;/code&amp;gt; || 向栈中添加一个对象或对象列表 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后添加球体到栈中，栈中现在包含两个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.val()&amp;lt;/code&amp;gt; || 返回栈中的第一个值 || &amp;lt;code&amp;gt;first = cq.Workplane().box(10, 10, 10).faces().val()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.first()&amp;lt;/code&amp;gt; || 返回栈中的第一个项 || &amp;lt;code&amp;gt;first_item = cq.Workplane().box(10, 10, 10).faces().first()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面（与 val() 类似）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.item(i)&amp;lt;/code&amp;gt; || 返回栈中的第 i 个项 || &amp;lt;code&amp;gt;third_face = cq.Workplane().box(10, 10, 10).faces().item(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第三个面（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.last()&amp;lt;/code&amp;gt; || 返回栈中的最后一个项 || &amp;lt;code&amp;gt;last_face = cq.Workplane().box(10, 10, 10).faces().last()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的最后一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.end([n])&amp;lt;/code&amp;gt; || 返回此 CQ 元素的第 n 级父对象 || &amp;lt;code&amp;gt;parent = cq.Workplane().box(10, 10, 10).faces().vertices().end(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从顶点选择返回两级父对象（返回到实体层级）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vertices([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的顶点，可选择过滤 || &amp;lt;code&amp;gt;vertices = cq.Workplane().box(10, 10, 10).vertices()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体的所有 8 个顶点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.faces([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的面，可选择过滤 || &amp;lt;code&amp;gt;top_face = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体上表面（法线方向为正 Z 的面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.edges([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的边，可选择过滤 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vertical_edges = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体所有垂直边（平行于 Z 轴）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wires([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的线框，可选择过滤 || &amp;lt;code&amp;gt;wires = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).wires()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体顶面的外轮廓线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.solids([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的实体，可选择过滤 || &amp;lt;code&amp;gt;solids = cq.Workplane().box(10, 10, 10).solids()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体实体（通常只有一个）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shells([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的壳体，可选择过滤 || &amp;lt;code&amp;gt;shells = cq.Workplane().box(10, 10, 10).shell(0.5).shells()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建壳体后选择壳体对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.compounds([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中的复合体，可选择过滤 || &amp;lt;code&amp;gt;compounds = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5)).compounds()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;合并立方体和球体后，选择复合体对象&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NearestToPointSelector(pnt)&amp;lt;/code&amp;gt; || 选择离指定点最近的对象 || &amp;lt;code&amp;gt;nearest = cq.Workplane().box(10, 10, 10).faces(NearestToPointSelector((0,0,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择距离点 (0,0,5) 最近的面（通常为上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BoxSelector(point0, point1[, boundingbox])&amp;lt;/code&amp;gt; || 选择由两点定义的 3D 框内的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(BoxSelector((-5,-5,-5), (5,5,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择位于立方体边界框内的所有面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BaseDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 基于单个方向向量进行选择的基础选择器 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(BaseDirSelector((0,0,1), 0.01))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择方向与 Z 轴对齐的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ParallelDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向平行的对象 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(ParallelDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的边（即所有垂直边）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向对齐的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(DirectionSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向为 Z 轴方向的面（上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionNthSelector(vector, n[, ...])&amp;lt;/code&amp;gt; || 过滤与指定方向平行（或垂直）的对象，返回第 N 个 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(DirectionNthSelector((0,0,1), 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的第 3 条边（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LengthNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个长度的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(LengthNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择长度最短的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AreaNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个面积的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(AreaNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择面积最小的面（10x10 的面中最小为 100）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RadiusNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个半径的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().cylinder(10, 5).edges(RadiusNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择半径最小的边（圆柱体上下圆边半径 5）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PerpendicularDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向垂直的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(PerpendicularDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向与 Z 轴垂直的面（四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypeSelector(typeString)&amp;lt;/code&amp;gt; || 选择具有指定几何类型的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(TypeSelector(&amp;quot;PLANE&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有平面类型的面（立方体所有面都是平面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionMinMaxSelector(vector, minOrMax)&amp;lt;/code&amp;gt; || 选择在指定方向上最近或最远的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(DirectionMinMaxSelector((0,0,1), &amp;quot;MAX&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择在 Z 轴方向上最远的面（即上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CenterNthSelector(vector, n[, directionMax, ...])&amp;lt;/code&amp;gt; || 按中心在指定方向上投影的距离排序，选择第 N 个对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(CenterNthSelector((0,0,1), 1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;按面中心在 Z 轴投影距离排序，选择第 2 个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AndSelector(left, right)&amp;lt;/code&amp;gt; || 交集选择器（同时满足两个选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(AndSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向的平面（即上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SumSelector(left, right)&amp;lt;/code&amp;gt; || 并集选择器（满足任一选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SumSelector(DirectionSelector((0,0,1)), DirectionSelector((1,0,0))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴或 X 轴方向的面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SubtractSelector(left, right)&amp;lt;/code&amp;gt; || 差集选择器（满足 left 但不满足 right） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SubtractSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向但非平面的面（立方体中无结果）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;InverseSelector(selector)&amp;lt;/code&amp;gt; || 反转给定选择器的选择结果 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(InverseSelector(DirectionSelector((0,0,1))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有法线方向不是 Z 轴的面（即四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringSyntaxSelector(selectorString)&amp;lt;/code&amp;gt; || 使用简单字符串语法过滤对象列表 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(StringSyntaxSelector(&amp;quot;&amp;gt;Z&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用字符串语法选择法线方向为正 Z 的面（等价于 &amp;quot;&amp;gt;Z&amp;quot;）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 装配体 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly([obj, loc, name, color, material, ...])&amp;lt;/code&amp;gt; || 嵌套的 Workplane 和 Shape 对象装配体，定义它们的相对位置 || &amp;lt;code&amp;gt;assy = cq.Assembly()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的装配体对象，用于组织和定位多个零件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.add(obj[, loc, name, color, ...])&amp;lt;/code&amp;gt; || 向当前装配体添加子装配体或零件 || &amp;lt;code&amp;gt;assy.add(cq.Workplane().box(10, 10, 5), name=&amp;quot;base&amp;quot;)&amp;lt;br/&amp;gt;assy.add(cq.Workplane().sphere(3), loc=cq.Location((0,0,5)), name=&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;向装配体添加底座（立方体）和顶部球体，并指定位置和名称&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.save(path[, exportType, mode, ...])&amp;lt;/code&amp;gt; || 将装配体保存到文件 || &amp;lt;code&amp;gt;assy.save(&amp;quot;assembly.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将装配体保存为 STEP 文件，支持 STEP、STL、VRML 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.constrain(constraint)&amp;lt;/code&amp;gt; || 定义一个新的约束 || &amp;lt;code&amp;gt;assy.constrain(&amp;quot;base&amp;quot;, &amp;quot;top&amp;quot;, &amp;quot;Axis&amp;quot;, (0,0,1), (0,0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;约束底座和顶部的 Z 轴对齐，使球体位于底座正上方&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.solve([verbosity])&amp;lt;/code&amp;gt; || 求解所有已定义的约束 || &amp;lt;code&amp;gt;assy.solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;求解所有约束，自动调整零件位置以满足约束条件，verbosity=1 可输出求解详情&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Color(r, g, b[, a])&amp;lt;/code&amp;gt; || OCCT 颜色对象 Quantity_ColorRGBA 的包装器 || &amp;lt;code&amp;gt;red = cq.Color(1, 0, 0)&amp;lt;br/&amp;gt;assy.add(part, color=red)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建红色颜色对象，并将其应用于装配体中的零件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 导出与导入 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.toSvg([opts])&amp;lt;/code&amp;gt; || 返回表示栈中第一个项的 SVG 文本 || &amp;lt;code&amp;gt;svg_text = cq.Workplane().rect(10, 10).toSvg()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并将其转换为 SVG 文本字符串，可用于网页显示或保存&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.exportSvg(fileName)&amp;lt;/code&amp;gt; || 将栈中第一个项导出为 SVG 文件 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).exportSvg(&amp;quot;rectangle.svg&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并导出为 &amp;quot;rectangle.svg&amp;quot; 文件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importStep(fileName)&amp;lt;/code&amp;gt; || 加载 STEP 文件到 CadQuery Workplane || &amp;lt;code&amp;gt;part = cq.importers.importStep(&amp;quot;model.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 &amp;quot;model.step&amp;quot; 文件导入 3D 模型，返回 Workplane 对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 加载 DXF 文件到 Workplane || &amp;lt;code&amp;gt;sketch = cq.importers.importDXF(&amp;quot;profile.dxf&amp;quot;, tol=0.01)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入 2D 轮廓，容差设为 0.01&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exporters.export(w, fname[, exportType, ...])&amp;lt;/code&amp;gt; || 将 Workplane 或 Shape 导出到文件 || &amp;lt;code&amp;gt;cq.exporters.export(part, &amp;quot;output.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Workplane 对象导出为 STEP 文件，支持 STL、STEP、SVG 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;occ_impl.exporters.dxf.DxfDocument([...])&amp;lt;/code&amp;gt; || 从 CadQuery 对象创建 DXF 文档 || &amp;lt;code&amp;gt;doc = cq.occ_impl.exporters.dxf.DxfDocument()&amp;lt;br/&amp;gt;doc.addShape(sketch)&amp;lt;br/&amp;gt;doc.save(&amp;quot;output.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 DXF 文档对象，添加几何形状后保存为 DXF 文件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
	<entry>
		<id>https://zxdd.com/index.php?title=CadQuery&amp;diff=1739</id>
		<title>CadQuery</title>
		<link rel="alternate" type="text/html" href="https://zxdd.com/index.php?title=CadQuery&amp;diff=1739"/>
		<updated>2026-04-02T01:15:12Z</updated>

		<summary type="html">&lt;p&gt;Eric：​&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CadQuery 是一个基于 [[Python]] 的参数化 3D CAD 库，底层使用 OpenCascade（OCCT）内核。支持输出STL、STEP、AMF和3MF的CAD格式。&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
===时间轴===&lt;br /&gt;
&lt;br /&gt;
==安装==&lt;br /&gt;
最简单方式使用CQ-Editor（官方的 GUI 编辑器），或者使用常用的编辑器+插件，如VS Code编辑器和OCP CAD Viewer插件。&lt;br /&gt;
===CQ-Editor===&lt;br /&gt;
安装CQ-editor编辑器，会自动安装cadquery，通过pip安装：&lt;br /&gt;
 pip install CQ-editor&lt;br /&gt;
安装后，通过命令行启动：&lt;br /&gt;
 CQ-editor&lt;br /&gt;
&lt;br /&gt;
https://github.com/CadQuery/CQ-editor/wiki/Installation&lt;br /&gt;
&lt;br /&gt;
===VS Code===&lt;br /&gt;
VS Code中，先安装cadquery，在安装OCP CAD Viewer插件。&lt;br /&gt;
 pip install cadquery&lt;br /&gt;
安装cadquery后，在[[VS Code]]插件中查找OCP CAD Viewer安装，方便在VS Code查看模型，安装后在VS Code运行查看下。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
import cadquery as cq&lt;br /&gt;
from ocp_vscode import show, show_object&lt;br /&gt;
&lt;br /&gt;
result = cq.Workplane(&amp;quot;XY&amp;quot;).box(2,2,2).shell(0.2)&lt;br /&gt;
show_object(result)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://cadquery.readthedocs.io/en/latest/installation.html&lt;br /&gt;
https://github.com/bernhard-42/vscode-ocp-cad-viewer&lt;br /&gt;
==快速入门==&lt;br /&gt;
&lt;br /&gt;
== 核心概念 ==&lt;br /&gt;
CadQuery 是一个基于 Python 的 3D CAD 建模库，其底层是 OpenCascade 几何内核。&lt;br /&gt;
&lt;br /&gt;
=== BREP 拓扑 ===&lt;br /&gt;
CadQuery 使用&#039;&#039;&#039;边界表示法（BREP）&#039;&#039;&#039;来定义 3D 物体，即物体由其表面来定义。基本的拓扑元素从简单到复杂依次为：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;顶点 (Vertex)&#039;&#039;&#039;：空间中的一个点&lt;br /&gt;
* &#039;&#039;&#039;边 (Edge)&#039;&#039;&#039;：连接两个或多个顶点的曲线段&lt;br /&gt;
* &#039;&#039;&#039;线框 (Wire)&#039;&#039;&#039;：一组相互连接的边&lt;br /&gt;
* &#039;&#039;&#039;面 (Face)&#039;&#039;&#039;：由线框围成的平面或曲面&lt;br /&gt;
* &#039;&#039;&#039;实体 (Solid)&#039;&#039;&#039;：由面围成的封闭三维体&lt;br /&gt;
* &#039;&#039;&#039;复合体 (Compound)&#039;&#039;&#039;：多个实体的集合&lt;br /&gt;
&lt;br /&gt;
=== API 层次结构 ===&lt;br /&gt;
CadQuery 提供了三个层次的 API，从上到下越来越灵活，但也越来越复杂。&lt;br /&gt;
==== 流畅 API ====&lt;br /&gt;
流畅 API是通过链式调用进行建模的接口，入门首选，简单易用。主要分为2类&lt;br /&gt;
* Workplane类，传统 3D 建模，最常用。 示例：&amp;lt;code&amp;gt;part = Workplane(&amp;quot;XY&amp;quot;).box(1,2,3).faces(&amp;quot;&amp;gt;Z&amp;quot;).circle(0.5).cutThruAll()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Sketch类，二维草图专用，更符合传统 CAD 绘图习惯，CadQuery 2.x版本引入。&lt;br /&gt;
&lt;br /&gt;
两者可以协同工作，如从二维草图开始创建三维模型Sketch → Workplane.placeSketch() → .extrude()，在现有模型上添加特征Workplane → 选面 → .sketch() → 修改 → .cutBlind()。典型工作流示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; &amp;gt;&lt;br /&gt;
# 创建一个带孔和圆角的平板&lt;br /&gt;
sketch_base = Sketch().rect(20, 15).constrain().solve()        # 底板轮廓&lt;br /&gt;
base = Workplane().placeSketch(sketch_base).extrude(3)         # 拉伸底板&lt;br /&gt;
&lt;br /&gt;
# 在底板上表面画圆孔&lt;br /&gt;
hole_sketch = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).sketch().circle(2).constrain().solve()&lt;br /&gt;
result = base.faces(&amp;quot;&amp;gt;Z&amp;quot;).placeSketch(hole_sketch).cutBlind(2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sketch 和 Workplane 的 2D 操作区别：&lt;br /&gt;
*Workplane 的 2D 操作：过程式建模，按顺序执行命令：画圆 → 移动 → 画矩形，尺寸硬编码数值，适用简单、固定的轮廓场景。&lt;br /&gt;
*Sketch ：约束驱动建模，定义几何约束如圆与矩形同心、相切等，尺寸约束 + 变量控制，适用复杂、参数化、需要设计意图的轮廓。&lt;br /&gt;
传统 CAD 中，设计意图（如&amp;quot;这个孔始终与板的中心对齐&amp;quot;）是通过约束实现的。Workplane 的过程式方式需要手动计算位置，参数变化时容易出错。Sketch约束后自动计算。当轮廓包含多个相互关联的图形时（如齿轮轮廓、法兰盘），约束系统能保证所有元素的关系正确。&lt;br /&gt;
&lt;br /&gt;
==== 直接 API ====&lt;br /&gt;
* 当流畅 API 不够用时使用，直接操作拓扑元素（顶点、边、面等）。&lt;br /&gt;
* 可以“自底向上”构建几何体，控制更精细。&lt;br /&gt;
* 示例：`wire = Wire.makeCircle(10); face = Face.makeFromWires(wire, [])`&lt;br /&gt;
&lt;br /&gt;
==== OCCT API ====&lt;br /&gt;
* 最底层，直接调用 OpenCascade 的 C++ 函数（通过 Python 绑定 `OCP`）。&lt;br /&gt;
* 极其强大但也极其繁琐，适合需要完全控制的场景。&lt;br /&gt;
* 示例：`from OCP.BRepPrimAPI import BRepPrimAPI_MakeBox`&lt;br /&gt;
&lt;br /&gt;
=== 在 API 之间切换 ===&lt;br /&gt;
你可以根据需要混合使用不同层次的 API：&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;从流畅 API 获取直接 API 对象&#039;&#039;&#039;：使用 `.val()` 或 `.findSolid()` 方法。&lt;br /&gt;
* &#039;&#039;&#039;从直接 API 对象回到流畅 API&#039;&#039;&#039;：将直接 API 对象作为参数传入新的 `Workplane`。&lt;br /&gt;
* &#039;&#039;&#039;获取底层的 OCCT 对象&#039;&#039;&#039;：直接 API 对象通过 `.wrapped` 属性即可获得。&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
选择器用于在已有模型上快速定位特征，相当于传统 CAD 中的鼠标选取。你可以通过字符串表达式选择面、边、顶点等。&lt;br /&gt;
* 例如：`faces(&amp;quot;&amp;gt;Z&amp;quot;)` 选择最上方的面，`edges(&amp;quot;&amp;gt;X&amp;quot;)` 选择 X 轴正方向的边。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==API 参考==&lt;br /&gt;
=== 草图初始化 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch(parent, locs, obj)&amp;lt;/code&amp;gt; || 2D 草图，用于构建二维几何形状 || &amp;lt;code&amp;gt;s = Sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的 2D 草图对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 导入 DXF 文件并构建面 || &amp;lt;code&amp;gt;sketch = Sketch.importDXF(&amp;quot;profile.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入几何图形并创建草图&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sketch()&amp;lt;/code&amp;gt; || 初始化并返回一个草图 || &amp;lt;code&amp;gt;s = Workplane().sketch()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;初始化一个新草图，通常在创建后自动调用&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.finalize()&amp;lt;/code&amp;gt; || 完成草图构造并返回父对象 || &amp;lt;code&amp;gt;result = sketch.finalize()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;完成草图编辑，返回父对象（通常用于链式调用）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.copy()&amp;lt;/code&amp;gt; || 创建草图的局部副本 || &amp;lt;code&amp;gt;s2 = s.copy()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图 s 的一个独立副本，用于后续修改而不影响原草图。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.located(loc)&amp;lt;/code&amp;gt; || 创建带有新位置的草图局部副本 || &amp;lt;code&amp;gt;sketch.located(Location(Vector(10, 0, 0)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建草图副本并平移到新位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.moved(....)&amp;lt;/code&amp;gt; || 创建移动后的面的草图局部副本 ||&amp;lt;code&amp;gt;sketch.moved(Vector(5, 5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将草图中的面移动后创建新副本&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 草图选择 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.tag(name)&amp;lt;/code&amp;gt; || 为当前选择添加标签 || &amp;lt;code&amp;gt;sketch.rect(10, 10).tag(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形并为其添加标签 &amp;quot;outer&amp;quot;，便于后续选择&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.select(tag)&amp;lt;/code&amp;gt; || 根据标签选择元素 || &amp;lt;code&amp;gt;sketch.select(&amp;quot;outer&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择之前标记为 &amp;quot;outer&amp;quot; 的几何元素&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.reset()&amp;lt;/code&amp;gt; || 重置当前选择状态 || &amp;lt;code&amp;gt;sketch.reset()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;清除所有当前选中的元素，恢复到初始未选择状态&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.delete([mode])&amp;lt;/code&amp;gt; || 删除选中的对象 || &amp;lt;code&amp;gt;sketch.circle(5).tag(&amp;quot;hole&amp;quot;).delete()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆形后标记并删除它&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.faces([selector])&amp;lt;/code&amp;gt; || 选择面元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).faces().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形面并添加圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edges([selector])&amp;lt;/code&amp;gt; || 选择边元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).edges().chamfer(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有边并添加倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.vertices([selector])&amp;lt;/code&amp;gt; || 选择顶点元素 || &amp;lt;code&amp;gt;sketch.rect(10, 10).vertices().fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择矩形所有顶点并添加圆角&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于面的草图绘制 ===&lt;br /&gt;
; Sketch Mode 类型说明&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;a&#039;&amp;lt;/code&amp;gt; - Add (添加) - 添加区域到草图 - 默认模式，创建实体区域&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;s&#039;&amp;lt;/code&amp;gt; - Subtract (减去) - 从现有区域中减去 - 创建孔洞或凹陷&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;i&#039;&amp;lt;/code&amp;gt; - Intersect (相交) - 保留与现有区域的交集 - 创建重叠部分&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;c&#039;&amp;lt;/code&amp;gt; - Construction (构造) - 创建辅助几何 - 辅助线/圆，不参与实体&lt;br /&gt;
* &amp;lt;code&amp;gt;&#039;g&#039;&amp;lt;/code&amp;gt; - Guide (引导) - 引导线 - 用于扫掠等操作&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.face(b[, angle, mode, tag, ...])&amp;lt;/code&amp;gt; || 从线框或边构建一个面 || &amp;lt;code&amp;gt;s = Sketch().face(wire, mode=&#039;a&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从闭合线框创建一个面，使用 ADD 模式添加到现有图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rect(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个矩形面 || &amp;lt;code&amp;gt;cq.Sketch().rect(10, 20).rect(5, 10, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x20 矩形，然后在其中减去一个 5x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.circle(r[, mode, tag])&amp;lt;/code&amp;gt; || 构建一个圆形面 || &amp;lt;code&amp;gt;s = cq.Sketch().circle(5).circle(3,mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个半径 5 的圆，然后在中心减去一个半径 3 的圆（形成环形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.ellipse(a1, a2[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个椭圆面 || &amp;lt;code&amp;gt;s = Sketch().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个长半轴 10、短半轴 5 的椭圆面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.trapezoid(w, h, a1[, a2, angle, ...])&amp;lt;/code&amp;gt; || 构建一个梯形面 || &amp;lt;code&amp;gt;s = Sketch().trapezoid(10, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个顶宽 10、高 5、顶部偏移 2 的梯形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.slot(w, h[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个槽形面 || &amp;lt;code&amp;gt;s = Sketch().slot(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制一个长度20、宽度5的槽形面（带圆角）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.regularPolygon(r, n[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个正多边形面 || &amp;lt;code&amp;gt;s = Sketch().regularPolygon(5, 6)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个外接圆半径 5、6 条边的正六边形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.polygon(pts[, angle, mode, tag])&amp;lt;/code&amp;gt; || 构建一个多边形面 || &amp;lt;code&amp;gt;s = Sketch().polygon([(0,0), (10,0), (5,8)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个由三个点构成的三角形面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.rarray(xs, ys, nx, ny)&amp;lt;/code&amp;gt; || 生成一个矩形位置阵列 || &amp;lt;code&amp;gt;s = cq.Sketch().rect(50, 40).rarray(4, 3, 12, 10).circle(2, mode=&#039;s&#039;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 3x3 矩形，然后在创建12x10的孔阵列。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.parray(r, a1, da, n[, rotate])&amp;lt;/code&amp;gt; || 生成极坐标阵列位置 || &amp;lt;code&amp;gt;sketch.parray(20, 0, 360, 8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建围绕中心、半径 20、从 0 度到 360 度均匀分布的 8 个极坐标阵列位置&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.distribute(n[, start, stop, rotate])&amp;lt;/code&amp;gt; || 沿选中的边或线框分布位置 || &amp;lt;code&amp;gt;sketch.rect(20, 10).edges().distribute(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿矩形选中边均匀分布 5 个位置点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.each(callback[, mode, tag, ...])&amp;lt;/code&amp;gt; || 对所有适用实体应用回调函数 || &amp;lt;code&amp;gt;sketch.rarray(5, 5, 3, 2).each(lambda loc: Sketch().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个阵列位置点执行回调，绘制半径为 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.push(locs[, tag])&amp;lt;/code&amp;gt; || 将当前选择设置为给定位置或点 || &amp;lt;code&amp;gt;sketch.push([Vector(0,0), Vector(10,10), Vector(20,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将三个位置点推入当前选择栈，作为后续操作的基准点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.hull([mode, tag])&amp;lt;/code&amp;gt; || 从当前选择或所有对象生成凸包 || &amp;lt;code&amp;gt;s = Sketch().circle(3).circle(5, (10,0)).hull()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建两个圆，然后生成包含它们的最小凸包面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.offset(d[, mode, tag])&amp;lt;/code&amp;gt; || 偏移选定的线框或边 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).offset(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后向外偏移 1 单位（形成更大的矩形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.fillet(r)&amp;lt;/code&amp;gt; || 基于当前选择添加圆角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().fillet(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加半径 1 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.chamfer(d)&amp;lt;/code&amp;gt; || 基于当前选择添加倒角 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).vertices().chamfer(1)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10 矩形，然后对所有顶点添加距离 1 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.clean()&amp;lt;/code&amp;gt; || 移除内部线。 || &amp;lt;code&amp;gt;sketch.clean()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;清理草图中内部的非边界线段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 基于边和约束的草图绘制 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.edge(val[, tag, forConstruction])&amp;lt;/code&amp;gt; || 向草图中添加一条边 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;s = Sketch().edge(&amp;quot;|&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加一条水平线作为构造线（用于约束）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.segment(p1, p2)&amp;lt;/code&amp;gt; || 构建一条线段 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 (0,0) 到 (10,0) 添加一条线段&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.arc(p1, p2, p3)&amp;lt;/code&amp;gt; || 构建一条弧线 || &amp;lt;code&amp;gt;s = Sketch().arc((0,0), (5,5), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;通过三点添加一条圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.spline(pts)&amp;lt;/code&amp;gt; || 构造样条曲线边 || &amp;lt;code&amp;gt;sketch.spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过给定点的样条曲线边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.close()&amp;lt;/code&amp;gt; || 将最后一条边连接到第一条边 || &amp;lt;code&amp;gt;s = Sketch().segment((0,0), (10,0)).segment((10,0), (10,10)).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加两条垂直边后闭合，形成 L 形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.assemble([mode, tag])&amp;lt;/code&amp;gt; || 将边组合成面 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10, mode=Mode.PRIVATE).assemble()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建私有矩形边，然后组合成一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.constrain(constraint)&amp;lt;/code&amp;gt; || 添加一个约束 || &amp;lt;code&amp;gt;s = Sketch().circle(5).constrain((&amp;quot;distance&amp;quot;, &amp;quot;origin&amp;quot;, 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个圆，然后添加约束使其圆心距离原点 2 单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Sketch.solve()&amp;lt;/code&amp;gt; || 求解当前约束并更新边位置 || &amp;lt;code&amp;gt;s = Sketch().rect(10, 10).constrain((&amp;quot;coincident&amp;quot;, &amp;quot;vertex0&amp;quot;, &amp;quot;vertex1&amp;quot;)).solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;添加重合约束后求解，更新几何位置&lt;br /&gt;
|}&lt;br /&gt;
=== Workplane 初始化 ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane(, obj)&amp;lt;/code&amp;gt; || 在空间中定义一个坐标系，可用于2D坐标操作。 || &amp;lt;code&amp;gt;Workplane()&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;创建一个新的Workplane对象，默认在XY平面原点。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2D 操作 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.center(x, y)&amp;lt;/code&amp;gt; || 将局部坐标移动到指定位置 || &amp;lt;code&amp;gt;result = cq.Workplane().center(5, 5).rect(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将工作平面中心移动到 (5,5) 后创建 10x10 矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.lineTo(x, y[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点到指定点绘制一条线 || &amp;lt;code&amp;gt;result = cq.Workplane().moveTo(0,0).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从原点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.line(xDist, yDist[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制相对直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).line(5, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点相对移动 (5,5) 并绘制直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点垂直向上绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vLineTo(yCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制垂直直线到指定 Y 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).vLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;垂直绘制到 Y=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLine(distance[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLine(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hLineTo(xCoord[, forConstruction])&amp;lt;/code&amp;gt; || 从当前点绘制水平直线到指定 X 坐标 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).hLineTo(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;水平绘制到 X=15 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLine(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点按角度和长度绘制直线 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLine(10, 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;以 45 度角绘制长度 10 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarLineTo(distance, angle[, ...])&amp;lt;/code&amp;gt; || 从当前点绘制极坐标直线到指定位置 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).polarLineTo(10, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到极坐标 (10, 90°) 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.moveTo(x, y)&amp;lt;/code&amp;gt; || 移动到指定点（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().moveTo(5, 5).lineTo(10, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前点移动到 (5,5)（不绘制），然后从该点画线到 (10,10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.move([xDist, yDist])&amp;lt;/code&amp;gt; || 相对移动指定距离（不绘制） || &amp;lt;code&amp;gt;cq.Workplane().move(3, 4).line(5, 0)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;相对移动 (3,4)（不绘制），然后水平绘制长度 5 的直线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.spline(listOfXYTuple[, tangents, ...])&amp;lt;/code&amp;gt; || 创建通过给定点的样条曲线（2D或3D） || &amp;lt;code&amp;gt;cq.Workplane().spline([(0,0), (5,10), (10,0)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制通过三个点的平滑样条曲线&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricCurve(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲线 || &amp;lt;code&amp;gt;cq.Workplane().parametricCurve(lambda t: (t, t**2), N=50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲线 y=x² 的逼近样条，使用 50 个采样点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.parametricSurface(func[, N, start, ...])&amp;lt;/code&amp;gt; || 创建逼近给定函数的样条曲面 || &amp;lt;code&amp;gt;cq.Workplane().parametricSurface(lambda u,v: (u, v, u*v))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制参数曲面 z=xy 的逼近曲面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.threePointArc(point1, point2[, ...])&amp;lt;/code&amp;gt; || 通过三个点绘制圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).threePointArc((5,0), (10,0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从当前点通过 (5,0) 到 (10,0) 绘制圆弧（形成半圆）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sagittaArc(endPoint, sag[, ...])&amp;lt;/code&amp;gt; || 使用矢高（sagitta）定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).sagittaArc((10,0), 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、矢高 2 的圆弧（拱形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.radiusArc(endPoint, radius[, ...])&amp;lt;/code&amp;gt; || 使用半径定义的圆弧 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).radiusArc((10,0), 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制到 (10,0)、半径 5 的圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.tangentArcPoint(endPoint)&amp;lt;/code&amp;gt; || 从当前边末端绘制切线圆弧到指定点 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(5,0).tangentArcPoint((10,5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;先绘制水平线，然后绘制与前一条边相切的圆弧到 (10,5)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorY()&amp;lt;/code&amp;gt; || 沿 Y 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorY()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 Y 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirrorX()&amp;lt;/code&amp;gt; || 沿 X 轴镜像实体 || &amp;lt;code&amp;gt;cq.Workplane().rect(5, 10).mirrorX()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形沿 X 轴镜像，生成对称图形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wire([forConstruction])&amp;lt;/code&amp;gt; || 将所有待定边连接成线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).wire()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两条边连接成 L 形线框对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rect(xLen, yLen[, centered, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造矩形 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制 10x20 的矩形（默认 centered=True）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.circle(radius[, forConstruction])&amp;lt;/code&amp;gt; || 为栈上每个项构造圆 || &amp;lt;code&amp;gt;cq.Workplane().circle(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制半径 5 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipse(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 为栈上每个项构造椭圆 || &amp;lt;code&amp;gt;cq.Workplane().ellipse(10, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制长轴 10、短轴 5 的椭圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.ellipseArc(x_radius, y_radius[, ...])&amp;lt;/code&amp;gt; || 绘制椭圆弧 || &amp;lt;code&amp;gt;cq.Workplane().ellipseArc(10, 5, 0, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点绘制从 0° 到 90° 的椭圆弧&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polyline(listOfXYTuple[, ...])&amp;lt;/code&amp;gt; || 从点列表创建折线 || &amp;lt;code&amp;gt;cq.Workplane().polyline([(0,0), (10,0), (10,10)])&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绘制连接三个点的折线（L 形）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.close()&amp;lt;/code&amp;gt; || 结束构建并尝试创建封闭线框 || &amp;lt;code&amp;gt;cq.Workplane().moveTo(0,0).lineTo(10,0).lineTo(10,10).close()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;闭合当前绘制的轮廓，形成封闭矩形线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rarray(xSpacing, ySpacing, xCount, ...)&amp;lt;/code&amp;gt; || 创建矩形阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().rarray(10, 10, 3, 2).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 3 列 2 行、间距 10 的矩形阵列点，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.polarArray(radius, startAngle, ...)&amp;lt;/code&amp;gt; || 创建极坐标阵列点并推入栈 || &amp;lt;code&amp;gt;cq.Workplane().polarArray(20, 0, 360, 8).circle(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 8 个点的 360° 极坐标阵列，并在每个点绘制半径 2 的圆&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.slot2D(length, diameter[, angle])&amp;lt;/code&amp;gt; || 创建带圆角的槽形 || &amp;lt;code&amp;gt;cq.Workplane().slot2D(20, 5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在工作平面原点创建长度 20、宽度 5 的跑道形槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.offset2D(d[, kind, forConstruction])&amp;lt;/code&amp;gt; || 创建 2D 偏移线框 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).offset2D(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x10 矩形线框向外偏移 2 个单位，生成更大的矩形&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.placeSketch(sketch)&amp;lt;/code&amp;gt; || 根据栈上项放置草图 || &amp;lt;code&amp;gt;cq.Workplane().placeSketch(mySketch).extrude(5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Sketch 对象放置到当前 Workplane 位置，然后拉伸 5 个单位&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（需要活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cboreHole(diameter, cboreDiameter, cboreDepth[, depth, clean])&amp;lt;/code&amp;gt; || 创建沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cboreHole(5, 10, 3, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、沉头直径 10、沉头深度 3、总深 8 的沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cskHole(diameter, cskDiameter, cskAngle[, depth, clean])&amp;lt;/code&amp;gt; || 创建锥形沉头孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().cskHole(5, 10, 90, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、锥头直径 10、锥角 90° 的锥形沉头孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.hole(diameter[, depth, clean])&amp;lt;/code&amp;gt; || 创建通孔或盲孔 || &amp;lt;code&amp;gt;cq.Workplane().box(50, 50, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).workplane().hole(5, depth=8)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在盒子顶面上创建直径 5、深度 8 的盲孔&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.extrude(until[, combine, clean, both, taper])&amp;lt;/code&amp;gt; || 将线框挤出为棱柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).extrude(30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 10x20 矩形沿法线方向挤出高度 30 的实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cut(toCut[, clean, tol])&amp;lt;/code&amp;gt; || 从当前实体切除另一个实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(50, 50, 10).cut(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从盒子中减去半径为 8 的球体（布尔差集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutBlind(until[, clean, both, taper])&amp;lt;/code&amp;gt; || 盲切（有限深度挤出切除） || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutBlind(15)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓沿法线方向挤出切除深度 15 的槽&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cutThruAll([clean, taper])&amp;lt;/code&amp;gt; || 贯穿切除 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 20).cutThruAll()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前轮廓贯穿整个实体进行切除&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.box(length, width, height[, centered, combine])&amp;lt;/code&amp;gt; || 创建立方体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 20, 30)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建长 10、宽 20、高 30 的长方体（默认 centered=True，中心位于原点）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sphere(radius[, direct, angle1, angle2, combine])&amp;lt;/code&amp;gt; || 创建球体 || &amp;lt;code&amp;gt;result = cq.Workplane().sphere(10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在当前工作平面位置创建半径 10 的球体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wedge(dx, dy, dz, xmin, zmin, xmax, zmax[, combine])&amp;lt;/code&amp;gt; || 创建楔形体 || &amp;lt;code&amp;gt;result = cq.Workplane().wedge(10, 20, 30, 0, 0, 10, 20)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建指定尺寸的楔形实体（类似三棱柱形状）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.cylinder(height, radius[, direct, angle, combine])&amp;lt;/code&amp;gt; || 创建圆柱体 || &amp;lt;code&amp;gt;result = cq.Workplane().cylinder(30, 10)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建高度 30、半径 10 的圆柱体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.union([toUnion, clean, glue, tol])&amp;lt;/code&amp;gt; || 合并实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将球体与当前实体合并（布尔并集运算）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.combine([clean, glue, tol])&amp;lt;/code&amp;gt; || 合并栈上所有实体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5)).combine()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将当前栈中的多个实体合并为一个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.intersect(toIntersect[, clean, tol])&amp;lt;/code&amp;gt; || 与当前实体进行布尔交集运算 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).intersect(cq.Workplane().sphere(8))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个 10x10x10 的立方体，然后与半径 8 的球体进行布尔交集，保留两者重叠的部分&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.loft([ruled, combine, clean])&amp;lt;/code&amp;gt; || 放样多个截面 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(10, 10).workplane(offset=5).rect(5, 5).loft()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将两个不同尺寸的矩形截面放样成 3D 实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.sweep(path[, multisection, transition, combine, clean])&amp;lt;/code&amp;gt; || 沿路径扫掠截面 || &amp;lt;code&amp;gt;path = cq.Workplane().spline([(0,0,0), (0,0,10)])&amp;lt;br/&amp;gt;result = cq.Workplane().circle(2).sweep(path)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;沿样条曲线路径扫掠圆形截面，生成弯曲管道&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.twistExtrude(distance, angleDegrees)&amp;lt;/code&amp;gt; || 在拉伸的同时扭转指定角度 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 5).twistExtrude(20, 90)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 5x5 矩形沿法线方向拉伸 20 个单位，同时从底部到顶部扭转 90°&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.revolve([angleDegrees, axisStart, axisEnd, combine, clean])&amp;lt;/code&amp;gt; || 绕轴旋转生成实体 || &amp;lt;code&amp;gt;result = cq.Workplane().rect(5, 10).revolve(360, (0,0), (0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将矩形轮廓绕 Y 轴旋转 360° 生成回转体（类似圆环体或圆柱）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.text(txt, fontsize, distance[, ...])&amp;lt;/code&amp;gt; || 返回 3D 文本实体 || &amp;lt;code&amp;gt;result = cq.Workplane().text(&amp;quot;CadQuery&amp;quot;, 5, 2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建内容为 &amp;quot;CadQuery&amp;quot;、字体高度 5、拉伸深度 2 的 3D 文本实体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3D 操作（无需活动工作平面） ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shell(thickness[, kind])&amp;lt;/code&amp;gt; || 移除选定的面以创建指定厚度的壳体 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 5).faces(&amp;quot;&amp;gt;Z&amp;quot;).shell(0.5)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个盒子，移除顶面后形成壁厚 0.5 的壳体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.fillet(radius)&amp;lt;/code&amp;gt; || 在选定的边上添加圆角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).fillet(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加半径 2 的圆角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.chamfer(length[, length2])&amp;lt;/code&amp;gt; || 在选定的边上添加倒角 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;).chamfer(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在立方体所有垂直边上添加距离 2 的倒角&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotate(axisStartPoint, axisEndPoint, angleDegrees)&amp;lt;/code&amp;gt; || 返回旋转后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotate((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;绕 X 轴旋转立方体 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.rotateAboutCenter(axisEndPoint, ...)&amp;lt;/code&amp;gt; || 绕指定轴旋转栈中所有项 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).rotateAboutCenter((0,0,0), (1,0,0), 45)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 10x10x10 立方体，然后绕 X 轴（通过原点沿 X 方向）旋转 45 度&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.translate(vec)&amp;lt;/code&amp;gt; || 返回平移后的所有项的副本 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).translate((5, 0, 0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将立方体沿 X 轴平移 5 个单位&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.mirror([mirrorPlane, ...])&amp;lt;/code&amp;gt; || 镜像单个 CQ 对象 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).mirror(&amp;quot;YZ&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后，以 YZ 平面为镜像平面进行镜像&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 迭代方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.each(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 对栈中的每个值运行提供的函数，并将返回值收集到新的 CQ 对象中 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).each(lambda loc: cq.Workplane().circle(2).moved(loc))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在矩形阵列的每个位置点执行回调函数，在每个点处创建半径为 2 的圆，并收集所有结果&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.eachpoint(callback[, useLocalCoordinates, ...])&amp;lt;/code&amp;gt; || 与 each() 类似，但回调函数的参数会根据栈中位置进行平移 || &amp;lt;code&amp;gt;result = cq.Workplane().rarray(10, 10, 3, 2).eachpoint(lambda pos: cq.Workplane().circle(2).translate(pos))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;在每个位置点处创建圆，回调函数接收位置向量作为参数，便于创建相对于每个点的几何体&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 栈与选择器方法 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.all()&amp;lt;/code&amp;gt; || 返回栈中所有 CQ 对象的列表 || &amp;lt;code&amp;gt;objects = cq.Workplane().box(10, 10, 10).faces().all()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体所有面的列表，返回包含每个面对象的列表&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.size()&amp;lt;/code&amp;gt; || 返回栈中当前对象的数量 || &amp;lt;code&amp;gt;count = cq.Workplane().box(10, 10, 10).faces().size()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体面的数量（返回 6）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vals()&amp;lt;/code&amp;gt; || 获取当前列表中的值 || &amp;lt;code&amp;gt;values = cq.Workplane().box(10, 10, 10).faces().vals()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取所有面对象的原始值（TopoDS_Shape 列表）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.add(obj)&amp;lt;/code&amp;gt; || 向栈中添加一个对象或对象列表 || &amp;lt;code&amp;gt;result = cq.Workplane().box(10, 10, 10).add(cq.Workplane().sphere(5))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建立方体后添加球体到栈中，栈中现在包含两个实体&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.val()&amp;lt;/code&amp;gt; || 返回栈中的第一个值 || &amp;lt;code&amp;gt;first = cq.Workplane().box(10, 10, 10).faces().val()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.first()&amp;lt;/code&amp;gt; || 返回栈中的第一个项 || &amp;lt;code&amp;gt;first_item = cq.Workplane().box(10, 10, 10).faces().first()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第一个面（与 val() 类似）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.item(i)&amp;lt;/code&amp;gt; || 返回栈中的第 i 个项 || &amp;lt;code&amp;gt;third_face = cq.Workplane().box(10, 10, 10).faces().item(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的第三个面（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.last()&amp;lt;/code&amp;gt; || 返回栈中的最后一个项 || &amp;lt;code&amp;gt;last_face = cq.Workplane().box(10, 10, 10).faces().last()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;获取立方体的最后一个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.end([n])&amp;lt;/code&amp;gt; || 返回此 CQ 元素的第 n 级父对象 || &amp;lt;code&amp;gt;parent = cq.Workplane().box(10, 10, 10).faces().vertices().end(2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从顶点选择返回两级父对象（返回到实体层级）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.vertices([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的顶点，可选择过滤 || &amp;lt;code&amp;gt;vertices = cq.Workplane().box(10, 10, 10).vertices()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体的所有 8 个顶点&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.faces([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的面，可选择过滤 || &amp;lt;code&amp;gt;top_face = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体上表面（法线方向为正 Z 的面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.edges([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的边，可选择过滤 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;vertical_edges = cq.Workplane().box(10, 10, 10).edges(&amp;quot;|Z&amp;quot;)&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体所有垂直边（平行于 Z 轴）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.wires([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的线框，可选择过滤 || &amp;lt;code&amp;gt;wires = cq.Workplane().box(10, 10, 10).faces(&amp;quot;&amp;gt;Z&amp;quot;).wires()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体顶面的外轮廓线框&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.solids([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的实体，可选择过滤 || &amp;lt;code&amp;gt;solids = cq.Workplane().box(10, 10, 10).solids()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择立方体实体（通常只有一个）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.shells([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中对象的壳体，可选择过滤 || &amp;lt;code&amp;gt;shells = cq.Workplane().box(10, 10, 10).shell(0.5).shells()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建壳体后选择壳体对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.compounds([selector, tag])&amp;lt;/code&amp;gt; || 选择栈中的复合体，可选择过滤 || &amp;lt;code&amp;gt;compounds = cq.Workplane().box(10, 10, 10).union(cq.Workplane().sphere(5)).compounds()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;合并立方体和球体后，选择复合体对象&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 选择器 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NearestToPointSelector(pnt)&amp;lt;/code&amp;gt; || 选择离指定点最近的对象 || &amp;lt;code&amp;gt;nearest = cq.Workplane().box(10, 10, 10).faces(NearestToPointSelector((0,0,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择距离点 (0,0,5) 最近的面（通常为上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BoxSelector(point0, point1[, boundingbox])&amp;lt;/code&amp;gt; || 选择由两点定义的 3D 框内的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(BoxSelector((-5,-5,-5), (5,5,5)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择位于立方体边界框内的所有面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BaseDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 基于单个方向向量进行选择的基础选择器 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(BaseDirSelector((0,0,1), 0.01))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择方向与 Z 轴对齐的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ParallelDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向平行的对象 || &amp;lt;code&amp;gt;edges = cq.Workplane().box(10, 10, 10).edges(ParallelDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的边（即所有垂直边）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向对齐的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(DirectionSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向为 Z 轴方向的面（上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionNthSelector(vector, n[, ...])&amp;lt;/code&amp;gt; || 过滤与指定方向平行（或垂直）的对象，返回第 N 个 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(DirectionNthSelector((0,0,1), 2))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择平行于 Z 轴的第 3 条边（索引从 0 开始）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LengthNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个长度的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().box(10, 10, 10).edges(LengthNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择长度最短的边&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AreaNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个面积的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(AreaNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择面积最小的面（10x10 的面中最小为 100）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RadiusNthSelector(n[, directionMax, tolerance])&amp;lt;/code&amp;gt; || 选择第 N 个半径的对象 || &amp;lt;code&amp;gt;edge = cq.Workplane().cylinder(10, 5).edges(RadiusNthSelector(0))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择半径最小的边（圆柱体上下圆边半径 5）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PerpendicularDirSelector(vector[, tolerance])&amp;lt;/code&amp;gt; || 选择与指定方向垂直的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(PerpendicularDirSelector((0,0,1)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线方向与 Z 轴垂直的面（四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TypeSelector(typeString)&amp;lt;/code&amp;gt; || 选择具有指定几何类型的对象 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(TypeSelector(&amp;quot;PLANE&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有平面类型的面（立方体所有面都是平面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DirectionMinMaxSelector(vector, minOrMax)&amp;lt;/code&amp;gt; || 选择在指定方向上最近或最远的对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(DirectionMinMaxSelector((0,0,1), &amp;quot;MAX&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择在 Z 轴方向上最远的面（即上表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CenterNthSelector(vector, n[, directionMax, ...])&amp;lt;/code&amp;gt; || 按中心在指定方向上投影的距离排序，选择第 N 个对象 || &amp;lt;code&amp;gt;face = cq.Workplane().box(10, 10, 10).faces(CenterNthSelector((0,0,1), 1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;按面中心在 Z 轴投影距离排序，选择第 2 个面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AndSelector(left, right)&amp;lt;/code&amp;gt; || 交集选择器（同时满足两个选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(AndSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向的平面（即上表面和下表面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SumSelector(left, right)&amp;lt;/code&amp;gt; || 并集选择器（满足任一选择器） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SumSelector(DirectionSelector((0,0,1)), DirectionSelector((1,0,0))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴或 X 轴方向的面&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SubtractSelector(left, right)&amp;lt;/code&amp;gt; || 差集选择器（满足 left 但不满足 right） || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(SubtractSelector(DirectionSelector((0,0,1)), TypeSelector(&amp;quot;PLANE&amp;quot;)))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择法线为 Z 轴方向但非平面的面（立方体中无结果）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;InverseSelector(selector)&amp;lt;/code&amp;gt; || 反转给定选择器的选择结果 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(InverseSelector(DirectionSelector((0,0,1))))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;选择所有法线方向不是 Z 轴的面（即四个侧面）&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringSyntaxSelector(selectorString)&amp;lt;/code&amp;gt; || 使用简单字符串语法过滤对象列表 || &amp;lt;code&amp;gt;faces = cq.Workplane().box(10, 10, 10).faces(StringSyntaxSelector(&amp;quot;&amp;gt;Z&amp;quot;))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;使用字符串语法选择法线方向为正 Z 的面（等价于 &amp;quot;&amp;gt;Z&amp;quot;）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 装配体 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly([obj, loc, name, color, material, ...])&amp;lt;/code&amp;gt; || 嵌套的 Workplane 和 Shape 对象装配体，定义它们的相对位置 || &amp;lt;code&amp;gt;assy = cq.Assembly()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建一个空的装配体对象，用于组织和定位多个零件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.add(obj[, loc, name, color, ...])&amp;lt;/code&amp;gt; || 向当前装配体添加子装配体或零件 || &amp;lt;code&amp;gt;assy.add(cq.Workplane().box(10, 10, 5), name=&amp;quot;base&amp;quot;)&amp;lt;br/&amp;gt;assy.add(cq.Workplane().sphere(3), loc=cq.Location((0,0,5)), name=&amp;quot;top&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;向装配体添加底座（立方体）和顶部球体，并指定位置和名称&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.save(path[, exportType, mode, ...])&amp;lt;/code&amp;gt; || 将装配体保存到文件 || &amp;lt;code&amp;gt;assy.save(&amp;quot;assembly.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将装配体保存为 STEP 文件，支持 STEP、STL、VRML 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.constrain(constraint)&amp;lt;/code&amp;gt; || 定义一个新的约束 || &amp;lt;code&amp;gt;assy.constrain(&amp;quot;base&amp;quot;, &amp;quot;top&amp;quot;, &amp;quot;Axis&amp;quot;, (0,0,1), (0,0,1))&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;约束底座和顶部的 Z 轴对齐，使球体位于底座正上方&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Assembly.solve([verbosity])&amp;lt;/code&amp;gt; || 求解所有已定义的约束 || &amp;lt;code&amp;gt;assy.solve()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;求解所有约束，自动调整零件位置以满足约束条件，verbosity=1 可输出求解详情&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Color(r, g, b[, a])&amp;lt;/code&amp;gt; || OCCT 颜色对象 Quantity_ColorRGBA 的包装器 || &amp;lt;code&amp;gt;red = cq.Color(1, 0, 0)&amp;lt;br/&amp;gt;assy.add(part, color=red)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建红色颜色对象，并将其应用于装配体中的零件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 导出与导入 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 内容 !! 描述 !! 示例&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.toSvg([opts])&amp;lt;/code&amp;gt; || 返回表示栈中第一个项的 SVG 文本 || &amp;lt;code&amp;gt;svg_text = cq.Workplane().rect(10, 10).toSvg()&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并将其转换为 SVG 文本字符串，可用于网页显示或保存&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Workplane.exportSvg(fileName)&amp;lt;/code&amp;gt; || 将栈中第一个项导出为 SVG 文件 || &amp;lt;code&amp;gt;cq.Workplane().rect(10, 10).exportSvg(&amp;quot;rectangle.svg&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建矩形并导出为 &amp;quot;rectangle.svg&amp;quot; 文件&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importStep(fileName)&amp;lt;/code&amp;gt; || 加载 STEP 文件到 CadQuery Workplane || &amp;lt;code&amp;gt;part = cq.importers.importStep(&amp;quot;model.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 &amp;quot;model.step&amp;quot; 文件导入 3D 模型，返回 Workplane 对象&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importers.importDXF(filename[, tol, exclude, ...])&amp;lt;/code&amp;gt; || 加载 DXF 文件到 Workplane || &amp;lt;code&amp;gt;sketch = cq.importers.importDXF(&amp;quot;profile.dxf&amp;quot;, tol=0.01)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;从 DXF 文件导入 2D 轮廓，容差设为 0.01&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exporters.export(w, fname[, exportType, ...])&amp;lt;/code&amp;gt; || 将 Workplane 或 Shape 导出到文件 || &amp;lt;code&amp;gt;cq.exporters.export(part, &amp;quot;output.step&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;将 Workplane 对象导出为 STEP 文件，支持 STL、STEP、SVG 等格式&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;occ_impl.exporters.dxf.DxfDocument([...])&amp;lt;/code&amp;gt; || 从 CadQuery 对象创建 DXF 文档 || &amp;lt;code&amp;gt;doc = cq.occ_impl.exporters.dxf.DxfDocument()&amp;lt;br/&amp;gt;doc.addShape(sketch)&amp;lt;br/&amp;gt;doc.save(&amp;quot;output.dxf&amp;quot;)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;创建 DXF 文档对象，添加几何形状后保存为 DXF 文件&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==资源==&lt;br /&gt;
===官网===&lt;br /&gt;
&lt;br /&gt;
===网站===&lt;/div&gt;</summary>
		<author><name>Eric</name></author>
	</entry>
</feed>