
运维CLI【免费下载链接】archinstallArch Linux installer - guided, templates etc.项目地址https://gitcode.com/gh_mirrors/ar/archinstall点击查看免费下载archinstall 提供了一套“发现驱动”discovery-driven的 Python 插件体系允许第三方代码在安装流程的关键节点介入修改 pacstrap 包列表、接管用户创建、覆盖引导装载器安装逻辑等。本文以官方文档 Python Plugins 页 为主体结合 archinstall/lib/plugins.py、archinstall/lib/args.py 与 archinstall/lib/installer.py 的源码实现完整讲清插件的两种加载方式、加载校验细节以及当前版本全部可用的on_*钩子点帮助读者在构建定制 ISO 或自动化装机时编写自己的 archinstall 插件。两种插件加载方式官方文档明确 archinstall 支持两种加载插件的途径二者可并存。方式一--plugin命令行参数以 CLI 工具方式运行 archinstall 时可以通过--plugin参数直接指定一个插件文件路径本地加载或经 URL 远程加载。从 参数解析源码 看实际存在两个参数参数类型说明--pluginPathnargs?本地插件文件路径--plugin-urlstrnargs?远程插件文件 URL二者在 参数处理逻辑 中都会最终调用load_plugin()。其中--plugin-url的处理链路值得注意_fetch_from_url 以User-Agent: ArchInstall发起 HTTP 请求下载插件源码非法 URL 或 HTTP 错误会直接报错退出_write_plugin_to_temp_file 将内容写入以archinstall_plugin_为前缀的临时.py文件deleteFalse安装结束不会自动清理对这个临时文件执行load_plugin()。文档还指出了该方式的一个优点--plugin参数会被存入--conf配置状态中意味着重新运行同一安装时插件会自动再次加载对无人值守的重复安装很有价值。其代价是必须先知道并写死一个初始路径操作上略显笨拙。方式二基于 entry points 的插件发现第二种方式利用 Python 标准的插件发现机制——通过importlib.metadata的 entry points在archinstall.plugin分组下查找已安装的插件。这一逻辑位于 plugins.py 模块顶部# 1: List archinstall.plugin definitions # 2: Load the plugin entrypoint # 3: Initiate the plugin and store it as .name in plugins for plugin_definition in metadata.entry_points().select(grouparchinstall.plugin): plugin_entrypoint plugin_definition.load() try: plugins[plugin_definition.name] plugin_entrypoint() except Exception as err: error( fError: {err}, fThe above error was detected when loading the plugin: {plugin_definition}, )要点archinstall 进程启动时即扫描当前环境Live ISO 或宿主机 Python 环境中所有声明了archinstall.plugin分组的包每个 entry point 被load()后直接调用即指向一个类或工厂函数其实例以 entry point 的名称为键存入全局plugins字典单个插件加载失败只记录错误日志不会中断其余插件的加载。官方文档说明这种方式的优势是可以一次加载多个插件前提是插件必须预先安装在运行 archinstall 的系统中因此主要面向自建 ISO、打包定制环境的用户。此外plugins.py 还提供了一个运行时注册入口def plugin(f: Any, *args: Any, **kwargs: Any) - None: plugins[f.__name__] f通过archinstall.plugin装饰器可以以编程方式把函数直接挂入插件表源码注释说明这对profiles_bck等内部场景有用。插件加载的校验流程load_plugin()--plugin方式最终汇入 load_plugin()它做了三层校验理解这些细节能避免“插件没反应”的排查困难。第一步按路径导入模块_import_via_path。插件文件通过importlib.util.spec_from_file_location动态导入模块命名空间取文件 basename若加载的是__init__.py即包形式则取其父目录名。导入异常会被捕获并记录错误日志同时清理sys.modules中的残留条目。第二步版本兼容检查。若插件模块定义了__archinstall__version__属性archinstall 会将其与自身版本的主次版本号比较version_major_and_minor version.rsplit(., 1)[0] if sys.modules[namespace].__archinstall__version__ float(version_major_and_minor): error(fPlugin {sys.modules[namespace]} does not support the current Archinstall version.)声明了低于当前 archinstall 主次版本的插件会被拒绝并报错。源码注释表明该变量是可选的未定义时的行为交由常规错误处理路径。第三步定位入口类。模块必须暴露一个名为Plugin的类与打包方式下 entry point 的约定一致if hasattr(sys.modules[namespace], Plugin): try: plugins[namespace] sys.modules[namespace].Plugin() info(fPlugin {plugins[namespace]} has been loaded.) except Exception as err: error(...) else: warn(fPlugin {path} is missing a valid entry-point or is corrupt.)实例化成功会打印Plugin ... has been loaded.缺失Plugin类则给出 “missing a valid entry-point or is corrupt” 的告警——这条日志是判断插件是否真正生效的第一手线索。工作原理发现驱动的钩子查询官方文档对机制的概括是archinstall 并不“调用插件的某个固定接口”而是在特定操作点查询每个插件是否拥有某个具名函数存在则调用。文档给出的标准示例是 pacstrap 阶段def on_pacstrap(*packages): ...对应实现位于 Pacman.strap()def strap(self, packages: str | list[str]) - None: self.sync() if isinstance(packages, str): packages [packages] for plugin in plugins.values(): if hasattr(plugin, on_pacstrap): if result : plugin.on_pacstrap(packages): packages result info(fInstalling packages: {packages})行为语义是strap()硬编码地遍历所有插件查找on_pacstrap若存在且插件返回了真值初始包列表会被插件的返回值整体替换然后才执行pacstrap命令。注意“返回真值即生效”这一约定——多数钩子的返回值都有实际语义。文档同时坦承这类钩子“目前还没有很好的动态文档化方式”建议直接在源码中搜索plugin.on_找出所有调用点。基于当前仓库代码检索结果整理如下可作为当前版本的完整钩子清单。当前版本支持的钩子点清单以下清单基于对 archinstall/lib/installer.py 和 archinstall/lib/pacman/pacman.py 中plugin.on_调用的逐一核对比官方文档“自行搜索源码”的建议更进一步钩子调用位置参数返回值语义on_pacstrap(packages)pacman.py#L101-L104包列表返回新列表则替换 pacstrap 安装包集合on_mirrors(mirror_config)installer.py#L569-L572镜像配置返回真值则替换镜像配置live 系统与目标系统设置镜像时均会触发on_genfstab(installer)installer.py#L615-L618Installer 实例返回True表示已自行处理 fstab跳过默认写入首个返回 True 的插件即终止遍历on_timezone(zone)installer.py#L678-L681时区字符串返回真值则替换时区on_service(service)installer.py#L718-L720服务名纯通知钩子服务在目标系统启用后触发on_configure_nic(iface, dhcp, ip, gateway, ...)installer.py#L752-L760网卡配置字段返回真值则替换生成的 systemd 网卡配置内容on_mkinitcpio(installer)installer.py#L831-L835Installer 实例返回真值则完全接管mkinitcpio 处理跳过默认流程on_install(installer)installer.py#L979-L981Installer 实例纯通知钩子安装后处理阶段触发on_add_bootloader(installer)installer.py#L1847-L1852Installer 实例返回真值则接管全部引导装载器安装逻辑源码注释允许安装自定义 bootloaderon_user_create(installer, user)installer.py#L1948-L1953Installer、用户模型返回真值表示用户创建已由插件处理跳过默认useradd密码与组管理仍由 archinstall 接管on_user_created(installer, user)installer.py#L1969-L1972Installer、用户模型用户创建完成后的通知钩子从源码结构看各钩子的介入深度不一on_pacstrap、on_mirrors、on_timezone属于“可改写输入”型on_genfstab、on_mkinitcpio、on_add_bootloader、on_user_create属于“可整体接管”型on_service、on_install、on_user_created则是“只读通知”型。编写插件时应按目标行为选择对应层级。编写自己的插件官方文档给出的起步建议是参考参考实现或社区方案文档中提及torxed/archinstall-aur与phisch/archinstall-aur两个 AUR 打包并在 archinstall 源码中搜索plugin.on_确认可介入点也欢迎通过 PR 扩展支持范围。结合上文load_plugin()的校验要求一个可运行的最小插件骨架如下# my_plugin.py class Plugin: archinstall 插件入口类名称必须是 Plugin。 def on_pacstrap(self, packages): # packages: 当前将写入目标系统的包列表 # 返回新列表即整体替换返回 None/False 则保持原样 return packages [linux-headers, linux-firmware]打包为 Python 包时需要在元数据中注册 entry point与 plugins.py 的扫描逻辑对应[project.entry-points.archinstall.plugin] my_plugin my_package.my_plugin:Plugin加载侧的命令行用法# 本地路径加载插件会写入 --conf 状态重跑安装时自动生效 archinstall --plugin /path/to/my_plugin.py --conf install.json ... # 远程加载下载后写入 archinstall_plugin_*.py 临时文件再执行 archinstall --plugin-url https://example.com/my_plugin.py几个由源码确认的实践要点入口类必须命名为Plugin否则只会得到 “missing a valid entry-point or is corrupt” 告警且钩子全部失效包形式的插件应以__init__.py作为入口文件传入--plugin此时命名空间取包目录名声明__archinstall__version__如__archinstall__version__ 2.9可为插件设置最低兼容版本低于当前 archinstall 主次版本会被拒绝on_user_create即使接管了创建动作密码设置set_user_password与 sudoers 配置仍由 archinstall 完成见 _create_user 实现。小结archinstall 的插件体系用“启动时扫描 entry points 运行时按路径加载”双通道汇入同一个plugins注册表再以统一的hasattr钩子查询模式嵌入安装流程。官方文档描述的on_pacstrap替换包列表只是其中一例对应当前仓库代码核对后实际可用的钩子覆盖镜像、fstab、时区、服务、网卡、mkinitcpio、引导装载器、用户创建与安装后处理等 11 个关键节点足以支撑自建 ISO 场景下的深度定制。若需要持续跟进钩子变化文档建议的“在源码中搜索plugin.on_”依然是最可靠的手段。赞分享运维CLI【免费下载链接】archinstallArch Linux installer - guided, templates etc.项目地址https://gitcode.com/gh_mirrors/ar/archinstall点击查看免费下载相关推荐PMDK开发入门面向初学者的libpmem基础API详解PMDK开发入门面向初学者的libpmem基础API详解 PMDKPersistent Memory Development Kit是一套用于持久化内存编上一篇Ohook免费解锁Microsoft 365完整功能的终极指南下一篇Roc 编译器整数字面量处理管线与快照测试机制解析——以 expr_int_simple 为例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考