运维CLI【免费下载链接】archinstallArch Linux installer - guided, templates etc.项目地址https://gitcode.com/gh_mirrors/ar/archinstall点击查看免费下载本文围绕 archinstall 的custom_commands配置项展开讲解它如何让你在基础系统安装完成后、生成 fstab 之前以arch-chroot方式在已安装的目标系统内执行任意自定义命令。读完本文你不仅能正确编写该配置项还能从源码层面理解命令的解析、执行时机与执行机制从而放心地把“改主机名、克隆 AUR helper、给用户加入 docker 组”等收尾操作纳入自动化安装流程。custom_commands 是什么custom_commands是 archinstall 配置文件中的一个列表型条目允许用户在安装完成后执行自定义命令。根据官方文档 docs/cli_parameters/config/custom_commands.rst 的说明命令不是运行在 ISO 环境中而是通过arch-chroot在基础系统安装完成之后、位于目标系统内部执行该配置项接收一个字符串列表每个字符串是一条完整的 shell 命令在 配置参数一览 中它被描述为 Custom commands that will be run post-install chrooted inside the installed system安装后 chroot 进入已安装系统内执行的自定义命令且属于可选参数无默认值。它的典型用途是处理那些不属于安装器标准步骤、但属于装机收尾的操作例如{ custom_commands: [ hostname new-hostname ] }官方文档给出的这个例子会修改已安装系统的主机名。文档特别强调示例只是用来说明命令不在 ISO 中运行而是在基础系统装好之后运行在已安装系统里——这是理解custom_commands语义的关键。完整配置示例仓库中的 examples/custom-command-sample.json 提供了一个可直接参考的完整示例。节选其中的关键部分{ dry_run: true, bootloader: systemd-bootctl, hostname: development-box, kernels: [linux], keyboard-layout: us, mirror-region: Worldwide, network_config: { type: nm }, ntp: true, packages: [docker, git, wget, zsh], services: [docker], profile: gnome, custom_commands: [ cd /home/devel; git clone https://aur.archlinux.org/paru.git, chown -R devel:devel /home/devel/paru, usermod -aG docker devel ] }这个示例展示了三类常见用法复合命令cd /home/devel; git clone ...——由于每条命令最终交给bash执行可以用;串联多条命令依赖用户存在chown -R devel:devel ...依赖安装流程中先创建了devel用户依赖已安装软件包usermod -aG docker devel把用户加入docker组而docker包由同文件中的packages字段提前装入目标系统。另外schema.json 对这一字段的 JSON Schema 定义为custom_commands类型为array元素类型为string描述为 Custom commands to be run post install安装后执行的自定义命令。源码级解析配置如何被读取custom_commands在配置模型中的定义位于 archinstall/lib/args.py字段定义args.py#L174ArchConfig数据类中声明为custom_commands: list[str] field(default_factorylist)即一个字符串列表默认值为空列表——不写该配置项就不会执行任何自定义命令。配置解析args.py#L375-L376ArchConfig.from_config()从用户提供的 JSON 配置字典中提取该字段if custom_commands : args_config.get(custom_commands, []): arch_config.custom_commands custom_commands注意这里用if做真值判断传入空列表[]与不传该字段等价都不会进入后续执行逻辑。配置序列化args.py#L218plain_cfg()会把ArchConfigType.CUSTOM_COMMANDS一并写入导出的用户配置 JSON因此安装结束保存的user_configuration.json中会包含你设置的所有自定义命令便于复用同一份配置重复装机。执行时机在整个安装流程中的位置custom_commands的调用点在 archinstall/scripts/guided.py 的perform_installation()中guided.py#L180-L184# If the user provided custom commands to be run post-installation, execute them now. if cc : config.custom_commands: run_custom_user_commands(cc, installation) installation.genfstab()从这段代码的上下文可以看到完整的安装顺序磁盘挂载与格式化 → 最小化安装 → 引导加载器 → 网络配置 → 创建用户与 root 密码 → 应用程序/桌面 Profile → 额外软件包 → 时区与 NTP → Profile 的post_install/provision→ 启用services→执行custom_commands→genfstab()→ 进入安装后的选择菜单重启 / 进入 chroot / 退出。这个执行时机对编写命令很重要此时用户、软件包、服务单元、Profile 的 post_install 都已完成所以命令可以安全地引用已创建的用户和已安装的软件包如示例中的docker组、git命令此时尚未执行genfstab()如果你的命令修改了挂载布局需要自行保证一致性命令在Installer上下文内、目标系统仍以只读基础环境挂载时运行命令看到的是一个装好但还没生成最终 fstab、还没启动任何服务的系统。执行机制每条命令如何运行在目标系统内真正的执行逻辑在 archinstall/lib/installer.py 的run_custom_user_commands()中installer.py#L2127-L2137def run_custom_user_commands(commands: list[str], installation: Installer) - None: for index, command in enumerate(commands): script_path LPath(f/var/tmp/user-command.{index}.sh) chroot_path installation.target / script_path.relative_to_root() info(fExecuting custom command {command} ...) chroot_path.write_text(command) SysCommand(farch-chroot -S {installation.target} bash {script_path}) chroot_path.unlink()从源码结构看每条自定义命令的执行流程是编号落盘第index条命令被原样写入目标系统内的/var/tmp/user-command.{index}.sh例如第 0 条写入/var/tmp/user-command.0.sh。这里通过LPath定义于 archinstall/lib/linux_path.py 的Path子类把 chroot 内路径映射回宿主机上的实际挂载位置installation.target / var/tmp/...chroot 执行通过SysCommand调用arch-chroot -S 挂载点 bash 脚本路径即命令在挂载好的目标系统根环境内由bash解释执行。这也解释了为什么;、管道、重定向等 bash 语法都可用清理现场执行后立即unlink()删除该脚本文件目标系统不会残留临时脚本。另外两点值得注意顺序执行列表按索引顺序逐条执行前一条命令完成脚本删除后才会执行下一条。像示例中git clone→chown→usermod这样的依赖链必须按此顺序书写日志可追溯每条命令执行前会打印Executing custom command 命令 ...安装日志中可以直接看到执行顺序与内容。编写自定义命令的实践建议结合文档说明与源码实现使用custom_commands时建议明确系统视角命令运行在已安装系统里路径都是目标系统的绝对路径如/home/devel而不是 ISO 环境的路径利用已有的安装结果packages中声明的包、创建的用户、启用的服务在命令执行时都已就绪命令可以放心依赖它们无需在命令里重复pacman -S单条命令即一个脚本每条字符串就是一个完整的bash脚本内容多步操作用;、串联或写成多行脚本字符串避免依赖运行中的服务执行阶段目标系统尚未启动无systemctl start语义需要开机自动生效的行为应改用services配置项声明单元custom_commands只负责写入配置、安装文件这类静态准备工作配合dry_run验证配置像 examples/custom-command-sample.json 那样设置dry_run: true可以先验证配置能否被正确解析而不真正落盘执行。参考路径文档docs/cli_parameters/config/custom_commands.rst配置示例examples/custom-command-sample.json更多自动安装示例见 examples 目录字段定义与解析archinstall/lib/args.py执行时机archinstall/scripts/guided.py执行实现archinstall/lib/installer.py字段 Schemaschema.json配置项清单docs/cli_parameters/config/config_options.csv赞分享运维CLI【免费下载链接】archinstallArch Linux installer - guided, templates etc.项目地址https://gitcode.com/gh_mirrors/ar/archinstall点击查看免费下载相关推荐图异常检测评估指标PyGOD中metric模块完全指南图异常检测评估指标PyGOD中metric模块完全指南 PyGODPython Library for Graph Outlier Detection是一Qinglong 如何通过 extra.sh 在面板启动时自动执行自定义命令Qinglong 如何通过 extra.sh 在面板启动时自动执行自定义命令 Qinglong青龙面板启动后除了加载你已配置的定时任务外还支持在每次启动时任务调度后端前端Arch Linux自动化安装工具archinstall完全指南还在为Arch Linux复杂的安装流程头疼面对繁琐的分区、引导配置和软件包选择感到无从下手archinstall的出现彻底改变了这一现状让Arch Li运维CLI上一篇终端画布用WezTerm打造你的数字工作坊下一篇MinIO开源版本与商业版本的区别及正确安装方式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
