{"id":25885111,"url":"https://github.com/system233/ll-killer-go","last_synced_at":"2025-03-02T17:28:51.872Z","repository":{"id":279921558,"uuid":"940427156","full_name":"System233/ll-killer-go","owner":"System233","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-28T10:34:31.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-28T14:31:27.755Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/System233.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-28T06:42:33.000Z","updated_at":"2025-02-28T10:34:21.000Z","dependencies_parsed_at":"2025-02-28T14:31:38.097Z","dependency_job_id":"29a4d631-15ae-40e2-959e-41c3313246de","html_url":"https://github.com/System233/ll-killer-go","commit_stats":null,"previous_names":["system233/ll-killer-go"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/System233%2Fll-killer-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/System233%2Fll-killer-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/System233%2Fll-killer-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/System233%2Fll-killer-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/System233","download_url":"https://codeload.github.com/System233/ll-killer-go/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241543976,"owners_count":19979635,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-02T17:28:50.941Z","updated_at":"2025-03-02T17:28:51.843Z","avatar_url":"https://github.com/System233.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ll-killer-go - 玲珑杀手Go\n\n\n## 项目简介\n\n本项目是[Linglong Killer Self-Service (ll-killer 玲珑杀手)](https://github.com/System233/linglong-killer-self-service)的重写版本，去除了构建阶段的shell脚本，全部采用go实现，并添加了一些增强功能。\n\n`ll-killer-go` 是一款专为解决玲珑容器应用构建问题而设计的命令行工具。它帮助开发者快速创建、构建和生成玲珑容器应用项目，同时提供一整套辅助构建与调试功能。使用该工具，用户可以在玲珑容器中获得与传统容器（如 `docker`）类似的构建体验，包括对特权命令的支持和 `apt` 安装等功能，免去了手动解压软件包（如 `deb`）和修复依赖库查找路径的繁琐操作。`ll-killer-go` 通过自动化这些步骤，确保构建过程的一致性与可靠性，极大地提高了开发效率和可维护性。\n\n### 功能概述\n- **创建项目**：自动创建项目所需的配置文件和辅助脚本，初始化项目环境。\n- **构建项目**：进入构建环境，支持以 root 权限执行各种命令。\n- **提交内容**：将构建后的文件提交到玲珑容器，确保文件路径和图标等修复。\n- **辅助构建工具**：包括缺失库检查、符号链接修复、图标文件修复等多种实用功能。\n- **运行与调试**：提供一个一致的运行时环境，支持容器应用的调试和测试。\n\n### 特色功能\n\n- **隔离的 APT 环境**：提供独立的 APT 环境，让你可以轻松查找和安装所需的软件包，而无需担心宿主机环境的干扰和权限问题。\n- **可重用的构建环境**：构建环境在命令执行结束后依然保留，你可以多次进入容器进行调整，直到完全满足需求，避免重复创建环境的麻烦。\n- **root 权限模拟**：尽管在构建环境中能够执行特权命令（如 `apt install`），但无需担心安全问题。工具使用宿主机用户权限进行操作，避免了实际 root 权限的风险。\n- **全局可写容器环境**：在构建环境中，你可以自由修改任何位置，提供灵活的操作空间，方便调试和调整。\n- **自动修复图标和快捷方式**：`build-aux` 工具集内置了多种自动修复脚本，帮助你快速修复常见问题，如图标和快捷方式的更新。\n- **自动检查缺失库**：使用 `ll-killer script build-aux/build-and-check.sh` 命令可以自动检测并修复构建过程中缺失的运行时库，确保容器应用能顺利运行。\n\n## 目录\n\n- [ll-killer-go - 玲珑杀手Go](#ll-killer-go---玲珑杀手go)\n  - [项目简介](#项目简介)\n    - [功能概述](#功能概述)\n    - [特色功能](#特色功能)\n  - [目录](#目录)\n  - [安装与配置](#安装与配置)\n    - [获取 ll-killer](#获取-ll-killer)\n    - [环境要求](#环境要求)\n  - [命令概览](#命令概览)\n  - [各命令详细介绍](#各命令详细介绍)\n    - [1. `apt` — 进入隔离的 APT 环境](#1-apt--进入隔离的-apt-环境)\n    - [2. create — 创建玲珑项目](#2-create--创建玲珑项目)\n      - [从APT元数据创建项目](#从apt元数据创建项目)\n    - [2. `build` — 构建或进入构建环境](#2-build--构建或进入构建环境)\n    - [3. `exec` — 进入运行时环境](#3-exec--进入运行时环境)\n    - [4. `run` — 启动容器](#4-run--启动容器)\n    - [5. `commit` — 提交构建内容](#5-commit--提交构建内容)\n    - [6. `clean` — 清除构建内容](#6-clean--清除构建内容)\n    - [7. `build-aux` — 创建辅助构建脚本](#7-build-aux--创建辅助构建脚本)\n    - [8. `ptrace` — 修正系统调用](#8-ptrace--修正系统调用)\n    - [9. `script` — 执行自定义构建脚本](#9-script--执行自定义构建脚本)\n    - [注意事项](#注意事项)\n  - [挂载相关功能](#挂载相关功能)\n      - [1. 进入运行时环境并挂载文件系统](#1-进入运行时环境并挂载文件系统)\n      - [例 1: 使用 `merge` 合并文件系统](#例-1-使用-merge-合并文件系统)\n      - [例 2: 挂载源路径到目标路径，指定用户和组](#例-2-挂载源路径到目标路径指定用户和组)\n      - [例 3: 使用自定义的 Unix 套接字和合并根目录路径](#例-3-使用自定义的-unix-套接字和合并根目录路径)\n      - [例 4: 使用不同的挂载选项](#例-4-使用不同的挂载选项)\n    - [2. 挂载选项详解](#2-挂载选项详解)\n      - [基本语法](#基本语法)\n      - [支持的挂载标志](#支持的挂载标志)\n      - [合并挂载（Merge Mount）](#合并挂载merge-mount)\n    - [例：使用合并挂载](#例使用合并挂载)\n    - [3. 注意事项](#3-注意事项)\n  - [高级进阶玩法](#高级进阶玩法)\n    - [1. 脱离ll-builder/ll-box构建](#1-脱离ll-builderll-box构建)\n      - [1. 具有Root的玲珑开发环境](#1-具有root的玲珑开发环境)\n      - [2. Rootless的玲珑开发环境](#2-rootless的玲珑开发环境)\n      - [3. 基于Ptrace+Rootless的玲珑开发环境](#3-基于ptracerootless的玲珑开发环境)\n  - [疑难解答](#疑难解答)\n  - [贡献与维护](#贡献与维护)\n  - [许可](#许可)\n\n\n## 安装与配置\n\n### 获取 ll-killer\n\n你可以下载预编译的二进制，或手动编译本项目。\n\n**使用预编译二进制**\n\n在项目 [Release](https://github.com/System233/ll-killer-go/releases) 页下载预编译的二进制文件，一般使用amd64版本，下载后改名为`ll-killer`，并添加执行权限。   \n上述步骤可使用以下命令一键完成：\n```bash\nwget https://github.com/System233/ll-killer-go/releases/latest/download/ll-killer-amd64 -O ll-killer\nchmod +x ll-killer\n\n./ll-killer -h\n```\n\n你可以将命令安装至`~/.local/bin`，以便随时使用。\n```bash\nmkdir -p ~/.local/bin\nmv ./ll-killer ~/.local/bin\n```\n\n**手动编译**\n\n1. 克隆或下载项目源码。  \n   ```sh\n   git clone https://github.com/System233/ll-killer-go.git\n   cd ll-killer-go\n   ```\n1. 安装 Golang 环境。  \n   ```sh\n   sudo apt install golang\n   ```\n2. 使用 `make` 命令编译并生成可执行文件，默认生成主机架构的二进制。\n\n### 环境要求\n- Linux 系统（支持多种发行版）\n- Go 编译环境\n- 主机必须安装 `fuse-overlayfs`/`linglong-bin`\n- 主机可选安装：`apt`/`apt-file`，用于apt相关和依赖查找功能。\n\n## 命令概览\n\n`ll-killer-go` 提供了一些核心命令来帮助构建和管理玲珑容器应用：\n\n- `apt`：进入隔离的 APT 环境。\n- `build`：构建或进入构建环境。\n- `exec`：进入运行时环境。\n- `run`：启动容器，执行应用。\n- `commit`：提交构建内容到玲珑容器。\n- `clean`：清除构建内容。\n- `build-aux`：创建辅助构建脚本。\n- `ptrace`：修正系统调用（目前仅支持 `chown` 调用）。\n- `script`：执行自定义构建流程。\n- `help`：显示帮助信息。\n\n## 各命令详细介绍\n\n### 1. `apt` — 进入隔离的 APT 环境\n\n**应用场景**：此命令用于在构建环境中隔离 APT 操作，确保不会污染宿主机环境。在隔离环境中，你可以使用 `apt-file` 或内置工具（如 `ldd-search.sh`）来查找包依赖。\n\n**用法**：\n```bash\nll-killer apt -- \u003ccommand\u003e [arguments...]\n```\n\n例如：\n```bash\nll-killer apt -- bash\n```\n\n**注意事项**：\n- 当前目录下的 `apt.conf`, `apt.conf.d`, `sources.list`, 和 `sources.list.d` 文件会被挂载到 `/etc` 目录，可以在这些文件中自定义 APT 配置。\n- 隔离环境中的 APT 缓存会被构建容器重用。\n\n\n### 2. create — 创建玲珑项目\n\n**应用场景**：`create` 命令用于创建新的玲珑容器应用项目。你可以通过此命令生成一个基础项目框架，并根据需要自定义项目的构建命令、应用描述、运行时环境等。此命令还支持从APT Package元数据创建项目，并自动生成相关配置，省去手动查找和配置依赖包的麻烦。\n\n用法：\n\n```bash\nll-killer create [flags]\n```\n\n示例：\n\n```bash\nll-killer create --name \"MyApp\" --version \"1.0.0\"\"\n```\n\n#### 从APT元数据创建项目\n\n`ll-killer create` 支持通过`apt show`输出的包元数据创建项目，以下是创建GIMP图像处理应用项目的示例：\n```bash\n# 将 gimp 包的信息保存到 package.info\napt show gimp \u003e package.info\n\n# 从 package.info 提取信息并在当前目录创建玲珑项目\nll-killer create --name \"MyApp\" --version \"1.0.0\" --from \"package.info\"\n```\n该命令会根据 `apt show \u003cpkg\u003e` 输出的元数据创建应用项目，自动填充包名、描述、版本等信息。\n\n**注意事项**\n\n- 使用 `--from` 参数时，可以通过 `apt show \u003cpkg\u003e` 输出的元数据自动生成项目的基础配置信息。这对于从现有的APT包创建容器应用项目非常有用。\n- 默认情况下，`ll-killer create`会在创建项目时自动构建一次。\n- 若指定 `--no-build`，则只会生成项目的基本模板，而不会自动进行构建步骤。您可以手动根据需求运行构建命令。  \n- 在从未对项目进行构建(如`ll-builder build`)的情况下，使用`ll-killer build`时必须关闭严格模式。\n\n### 2. `build` — 构建或进入构建环境\n\n**应用场景**：构建项目的核心命令。此命令可以进入构建环境，执行各种构建任务，确保以 root 权限执行命令，如 `apt` 安装等。你还可以自定义构建命令。\n\n**用法**：\n```bash\nll-killer build [flags] -- \u003cbuild command\u003e [arguments...]\n```\n\n例如：\n```bash\nll-killer build -- make install\n```\n\n**注意事项**：\n- 构建环境在退出后不会消失，你可以多次进入环境进行调整。\n- 使用 `--strict` 标志可以启动严格模式，确保与运行时环境一致，但此模式下不包括开发工具（如 gcc）。\n- 使用 `--strict` 标志启用严格模式时，项目必须至少使用`ll-builder build`构建一次\n- 构建环境会挂载主机根文件系统，也支持临时根目录和自定义 `fuse-overlayfs` 配置。\n- 主机必须安装`fuse-overlayfs`\n\n\n### 3. `exec` — 进入运行时环境\n\n**应用场景**：在项目构建完成后，此命令用于启动和测试容器环境。你可以根据需要进行调试，甚至自定义挂载和权限设置。\n\n**用法**：\n```bash\nll-killer exec [flags]\n```\n\n例如：\n```bash\nll-killer exec -- bash\n```\n\n**挂载选项**：\n- 支持多种挂载选项，例如：`--mount /source:/target:options`，其中 `options` 包括支持的挂载标志（如 `rw`, `nosuid` 等）和文件系统类型。\n- 额外支持 `merge` 挂载类型，用于在无overlayfs支持下的堆叠文件系统。\n- 额外支持 `fuse-overlayfs` 挂载类型，用于支持基于fuse的堆叠文件系统。\n- 当应用运行在不支持fuse的环境中，或fuse-overlayfs不可用时，自动回退merge挂载模式。\n详细信息参见[挂载相关功能](#挂载相关功能)\n\n\n**注意事项**：\n- 你可以使用 `--rootfs` 指定不同的根目录路径，支持合并多个目录。\n- `--uid` 和 `--gid` 可用来指定使用的用户和组 ID。\n- 此命令在`ll-box`容器/`ll-builder run/build`内部使用，你不应该在主机上运行此命令。\n\n### 4. `run` — 启动容器\n\n**应用场景**：启动构建后的容器进行应用的测试和运行。\n\n**用法**：\n```bash\nll-killer run [flags]\n```\n\n此命令等同于 `ll-builder run`，可用于提供一致的CLI体验。\n\n### 5. `commit` — 提交构建内容\n\n**应用场景**：将构建完成的应用提交到玲珑容器中，确保文件复制、快捷方式和图标修复等操作已完成。\n\n**用法**：\n```bash\nll-killer commit [flags]\n```\n\n此命令等同于 `ll-builder build`，可在 `linglong.yaml` 文件中对构建指令进行调整。\n\n**注意事项**：\n- 你可以在项目根目录提供一个`fuse-overlayfs`文件以启用`fuse-overlayfs`挂载模式\n\n### 6. `clean` — 清除构建内容\n\n**应用场景**：用于清除当前项目的构建环境内容，确保后续的构建不会受到先前内容的影响。\n\n**用法**：\n```bash\nll-killer clean [flags]\n```\n\n### 7. `build-aux` — 创建辅助构建脚本\n\n**应用场景**：用于生成一系列辅助构建脚本，帮助开发者修复符号链接、图标路径、依赖问题等。\n\n**用法**：\n```bash\nll-killer build-aux [flags]\n```\n\n**包含的辅助脚本**：\n- `entrypoint.sh`：玲珑容器的入口点。\n- `env.sh`：环境配置脚本。\n- `ldd-check.sh`：检查容器内缺失的库。\n- `ldd-search.sh`：查找缺失库的所在包。\n- `relink.sh`：修复容器内的符号链接。\n- `setup-desktop.sh`：修复桌面文件中的图标和执行指令。\n- `setup-filesystem.sh`：从构建环境复制文件到目标目录。\n- `setup-icon.sh`：将图标文件按尺寸放置到指定位置。\n- `setup.sh`：调用上述工具，将构建环境内容复制到玲珑容器中，并执行相关补丁。\n\n### 8. `ptrace` — 修正系统调用\n\n**应用场景**：此命令用于拦截并修正构建过程中的系统调用，目前仅支持修正 `chown` 调用，避免权限问题。\n\n**用法**：\n```bash\nll-killer ptrace -- \u003ccommand\u003e [arguments...]\n```\n\n例如：\n```bash\nll-killer ptrace -- chown root:root /path/to/file\n```\n\n无论chown设置所有者为谁，都只会设置成自己，以确保该命令成功。  \n此功能用于忽略apt安装某些库过程中可能出现的权限问题。\n\n**注意事项**：\n- 此模式将极大降低目标的性能\n\n\n\n### 9. `script` — 执行自定义构建脚本\n\n**应用场景**：用于执行自定义的构建流程，确保环境能够找到 `ll-killer` 二进制文件。\n\n**用法**：\n```bash\nll-killer script -- \u003cbuild script\u003e [arguments...]\n```\n\n此命令等同于：\n```bash\nKILLER_EXEC=path/to/ll-killer \u003cbuild script\u003e [arguments...]\n```\n\n### 注意事项\n- 使用 `--help` 参数可以查看每个子命令的详细帮助信息。\n- 确保在项目创建和构建阶段，`linglong.yaml` 配置文件已经正确设置。\n- 严格模式下，构建环境中不会包含开发工具，如编译器等，仅包含运行时环境所需的最小工具集。\n\n## 挂载相关功能\n\n`ll-killer` 提供了强大的挂载功能，使你能够灵活地管理和调整容器中的文件系统。通过挂载选项，你可以将主机上的目录或文件与容器内的目录进行绑定、合并或覆盖。本文将详细介绍如何使用 `ll-killer` 的挂载功能以及常见的用法和注意事项。\n\n#### 1. 进入运行时环境并挂载文件系统\n\n你可以使用 `--mount` 参数来挂载主机文件系统到容器内。以下是几个常见的挂载用法示例。\n\n#### 例 1: 使用 `merge` 合并文件系统\n\n在运行时环境中，使用当前用户的 UID 和 GID，合并挂载文件系统并使用 `/myrootfs` 的内容覆盖容器根文件系统。合并文件系统使你能够在没有内核 `overlayfs` 或 `fuse` 模块的支持下，堆叠多个源目录。\n\n```bash\nll-killer exec --mount /+/myrootfs:/::merge -- bash\n```\n\n**解释**：\n- `/+/myrootfs`: 这是合并挂载的源目录。多个源目录使用 `+` 符号分隔。\n- `/`: 这是目标目录，即容器内的根文件系统将会被合并。\n- `::merge`: 指定合并挂载类型。\n\n#### 例 2: 挂载源路径到目标路径，指定用户和组\n\n将主机上的 `/path/to/source` 目录挂载到容器内的 `/path/to/target` 目录，同时指定容器中运行进程的 UID 和 GID。\n\n```bash\nll-killer exec --mount /path/to/source:/path/to/target --uid 2000 --gid 2000 --chroot=false\n```\n\n**解释**：\n- `/path/to/source:/path/to/target`: 源路径与目标路径的映射关系。\n- `--uid 2000 --gid 2000`: 指定容器内进程的 UID 和 GID。\n- `--chroot=false`: 禁用 `chroot` 环境。\n\n#### 例 3: 使用自定义的 Unix 套接字和合并根目录路径\n\n挂载自定义的 Unix 套接字文件和合并根文件系统路径。该命令支持将 `/etc` 目录挂载到容器内。\n\n```bash\nll-killer exec --socket /tmp/myapp.sock --rootfs /tmp/myapp.rootfs --mount /etc:/etc\n```\n\n**解释**：\n- `--socket /tmp/myapp.sock`: 指定自定义的 Unix 套接字文件。\n- `--rootfs /tmp/myapp.rootfs`: 指定合并后的根文件系统路径。\n- `--mount /etc:/etc`: 挂载主机的 `/etc` 目录到容器的 `/etc`。\n\n#### 例 4: 使用不同的挂载选项\n\n你可以为挂载操作指定多个选项，例如读写权限、禁用某些功能等。\n\n```bash\nll-killer exec --mount /data:/data:rw+nosuid --uid 1000 --gid 1000 --rootfs /var/run/myapp.rootfs\n```\n\n**解释**：\n- `--mount /data:/data:rw+nosuid`: 将 `/data` 目录挂载为读写模式，并禁用 `setuid` 位。\n- `--uid 1000 --gid 1000`: 指定 UID 和 GID。\n- `--rootfs /var/run/myapp.rootfs`: 使用自定义根文件系统路径。\n\n### 2. 挂载选项详解\n\n#### 基本语法\n挂载选项使用 `--mount` 参数，语法如下：\n\n```bash\n--mount 源目录:目标目录:挂载标志:文件系统类型:额外数据\n```\n\n- **源目录**：挂载的源目录，支持多个源目录时，使用 `+` 符号分隔。\n- **目标目录**：容器内的目标目录，文件系统将被挂载到此位置。\n- **挂载标志**：类似于系统的 `mount` 命令，支持多种挂载选项（如 `bind`、`rbind` 等）。\n- **文件系统类型**：默认为 `none`，可以指定特定的文件系统类型。\n- **额外数据**：可以指定排除某些目录等附加信息。\n\n#### 支持的挂载标志\n\n`ll-killer` 支持以下挂载标志，具体的标志根据你的需求选择使用：\n\n- **bind**、**rbind**：常用的挂载标志，表示源目录和目标目录的绑定。\n- **noexec**：禁止在挂载的文件系统上执行二进制文件。\n- **nosuid**：禁止设置 `setuid` 位。\n- **rw**、**ro**：指定文件系统的读写模式。\n- **async**、**sync**：指定挂载时的异步或同步操作。\n- **private**、**shared**：指定挂载的共享类型。\n\n具体可以参考 Linux `mount` 命令的挂载标志，`ll-killer` 提供了大部分常见的挂载选项。\n\n#### 合并挂载（Merge Mount）\n\n`ll-killer` 提供了一种特殊的挂载类型——合并挂载（`merge`）。这使你能够将多个目录堆叠在一起，在不依赖内核的 `overlayfs` 或 `fuse` 模块的情况下实现文件系统层叠。\n\n**语法**：\n```bash\n--mount 源目录1+源目录2+源目录N:目标目录:挂载标志:merge:排除目录1+排除目录2+排除目录N\n```\n\n- **源目录**：支持多个源目录，多个源目录之间用 `+` 分隔。\n- **目标目录**：合并文件系统挂载的目标位置。\n- **挂载标志**：指定挂载类型，默认为 `bind` 或 `rbind`。\n- **文件系统类型**：必须为 `merge`。\n- **排除目录**：防止合并特定目录，默认为 `/proc`、`/dev`、`/tmp`、`/run` 等目录。\n\n### 例：使用合并挂载\n\n```bash\nll-killer exec --mount /dir1+/dir2:/mnt/merged:merge\n```\n\n**解释**：\n- `/dir1+/dir2`: 将两个目录合并在一起，`dir2` 中的文件将覆盖 `dir1` 中的冲突文件。\n- `/mnt/merged`: 合并后的文件系统将挂载到这个目标目录。\n\n### 3. 注意事项\n\n- 在进行合并挂载时，文件系统的优先级按从右到左的顺序决定，越靠后的目录优先级越高，后挂载的目录中的冲突文件会覆盖前面挂载的文件。\n- 如果某目录只在一个源目录中出现，它将直接绑定到目标目录。如果该目录是只读的，那么挂载后的文件夹也会保持只读属性。\n- 合并挂载对于没有内核 `overlayfs` 或 `fuse` 模块支持的系统仍然有效，适用于跨平台的使用场景。\n\n通过 `ll-killer` 的挂载功能，你可以灵活地管理容器环境中的文件系统，使得容器的构建和运行更加高效和隔离。\n\n## 高级进阶玩法\n\n### 1. 脱离ll-builder/ll-box构建\n在最新的ll-killer中，可以使用`ll-killer exec`子命令直接启动玲珑容器环境，从而绕过玲珑容器的一系列限制，同时支持root和rootless权限。\n\n#### 1. 具有Root的玲珑开发环境\n此容器中的root具有和宿主机相同的权限，主要用于解决文件系统权限相关的问题，在基于内核的idmap挂载实现之前，不失为一种解决办法。\n```bash\n# 填写玲珑base的存储地址，在这个目录中：~/.cache/linglong-builder/layers/main/中\n# 格式： {BASE名称}/{BASE版本}/{架构}/{binary运行时版本/develop开发版本}\n# export KILLER_DEBUG=1 # ll-killer调试模式\nBASE_DIR=\"/home/uos/.cache/linglong-builder/layers/main/org.deepin.base/23.1.0.2/arm64/binary/files/\"\nCWD=$(pwd)\nFS=\"$CWD/linglong/filesystem\"\nROOTFS=$FS/merged\nmkdir -p $FS/{merged,diff,work}\nll-killer exec \\\n--mount \"overlay:$FS/merged::overlay:lowerdir=$BASE_DIR,upperdir=$FS/diff,workdir=$FS/work\" \\\n--mount \"/proc:$ROOTFS/proc:rbind\" \\\n--mount \"/dev:$ROOTFS/dev:rbind\" \\\n--mount \"/tmp:$ROOTFS/tmp:rbind\" \\\n--mount \"/sys:$ROOTFS/sys:rbind\" \\\n--mount \"/etc/resolv.conf:$ROOTFS/etc/resolv.conf:rbind\" \\\n--rootfs $ROOTFS \\\n--root \\\n-- ${@:-sh}\n\n```\n使用root权限执行上述命令即可获得一个具有真实root权限的玲珑容器运行时环境，你可以在其中安装所需的软件，文件系统差异由overlay文件系统自动捕获到`$FS/diff`中。  \n\n若已在当前项目使用ll-killer创建并初始化玲珑项目，可以直接使用`ll-killer commit`命令打包本应用。\n\n**注意事项**：\n* 此模式下会产生root所属的文件。\n\n\n#### 2. Rootless的玲珑开发环境\n`Rootless`环境中的用户身份仍然是root，但该root不是真实的root，它的权限与运行命令时用户的权限相同。  \n使用非root用户执行之前的shell脚本即可进入rootless玲珑开发环境，可以在环境中正常运行任何不影响文件权限的命令，包括apt安装等，只是一旦应用使用的chown等命令，则会遇到权限问题。\n\n\n**注意事项**：\n* 由于尚未实现内核`idmap`挂载，这个问题请看下一节。\n\n#### 3. 基于Ptrace+Rootless的玲珑开发环境\n在上一个章节中已经讲述了如何启动`rootless`开发环境，但是存在一些权限问题，本章节提供了一种权限问题的缓解办法。\n\n`ll-killer`提供了一个`ptrace`子命令，该命令在`amd64`、`arm64`和`loong64(未测试)`架构上可用。\n该命令可以拦截子命令的`chown`系统调用，使其重定向到当前用户，可以避免出现权限问题。\n\n**示例：**\n在`rootless`容器中执行此命令，可规避`apt install`时出现的chown错误。\n```bash\nll-killer ptrace -- apt install \u003cdeb\u003e\n\n# 即便当前UID不是1234，也没有ROOT权限，此命令也不会错误。\nll-killer ptrace -- chown 1234:1234 test\n\n# 直接进入一个屏蔽chown错误的命令行环境。\nll-killer ptrace -- bash\n```\n\n**注意事项**：\n * 此模式将极大降低程序性能，请仅在开发环境使用。\n\n## 疑难解答\n\n**build环境内使用apt安装出现chown权限问题**  \n 可以添加`--ptrace`参数解决。\n\n**build环境内某些目录写入出现`Permission denied`**  \n 是因为`fuse-overlayfs`有bug所致，需要重新编译：\n ```bash\n git clone https://github.com/containers/fuse-overlayfs.git\n cd fuse-overlayfs\n autoreconf\n automake --add-missing\n autoreconf\n ./configure\n make -j8\n ```\n 复制上述步骤产生的`fuse-overlayfs`文件到项目目录，然后添加build参数`--fuse-overlayfs \"$(pwd)/fuse-overlayfs\"`。\n\n 复制`fuse-overlayfs`到项目目录内时，会自动启用运行时的`fuse-overlayfs`挂载模式（默认为合并挂载），请确保环境内可以运行此主机编译的`fuse-overlayfs`二进制文件，如提示缺少libfuse3，容器内使用命令`apt install fuse3`安装即可。\n\n**使用root模式构建后，ll-killer commit/ll-builder build出现错误**  \n删除linglong文件夹，或`chown -R $(id -u):$(id -g) linglong`将文件所有者改为自己。\n\n**apt安装某些包时总是提示依赖不满足**  \n请确保`sources.list`中列出的源与玲珑`base`兼容。\n\n## 贡献与维护\n\n欢迎对 `ll-killer-go` 提交问题报告、特性请求和贡献代码。请遵循项目的贡献指南来提交你的代码或文档改进。\n\n## 许可\n\n`ll-killer-go` 项目采用 [MIT License](LICENSE) 进行开源。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsystem233%2Fll-killer-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsystem233%2Fll-killer-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsystem233%2Fll-killer-go/lists"}