YellowHearth1/artix-tui-installer
GitHub: YellowHearth1/artix-tui-installer
一款用 Rust 编写的 Artix Linux 终端安装程序,专为 dinit 初始化系统定制,提供双语界面和丰富的磁盘加密、引导与桌面环境配置选项。
Stars: 3 | Forks: 0
# 🐧 Artix TUI 安装程序
**支持双语(乌克兰语/英语)的终端安装程序,用于自定义构建的基于
[dinit](https://davmac.org/projects/dinit/) 初始化系统的 [Artix Linux](https://artixlinux.org)。**
使用 Rust 和 [ratatui](https://ratatui.rs) 编写,设计风格类似于现代图形
安装程序:左侧步骤面板、圆角边框、Artix 蓝色主题、
分段开关以及实时滚动的安装日志。
[](https://www.rust-lang.org/)
[](https://ratatui.rs)
[](https://davmac.org/projects/dinit/)
🇬🇧 **[英文版本 → README.en.md](README.en.md)**
## ✨ 功能特性
- **🌐 双语界面** —— 支持乌克兰语和英语,在首个屏幕进行选择。
- **⚙️ 原生 dinit** —— 专门针对此初始化系统配置自定义 dinit 实例,
对 systemd 没有任何依赖:
- **turnstile** 用于 `seatd`(自定义 PAM 模块,不需要 elogind);
- **userspawn** 用于 `elogind`(标准 Artix 方案);
- `seatd`/`elogind` 会话管理器及自定义 PipeWire 服务。
- **📦 交互式包安装** —— 包通过 `pacman` 在伪终端下安装,因此由*您*来
选择提供商(GPU/Vulkan 驱动、多媒体后端等),而不是静默选择
第一个。来自不同仓库的同名包会自动从 Artix 获取;`[Y/n]` 请求会
自动确认。
- **🔒 LUKS 磁盘加密** —— 仅 `root`,UEFI 下的**包含加密 `/boot` 的
全盘加密**,或 **USB 密钥**(使用 keyfile 只需输入一次密码)。
- **🥾 引导加载程序选择** —— GRUB、rEFInd、Limine 或 **EFISTUB**;对于
GRUB,使用 `os-prober` 检测其他操作系统。在对额外磁盘进行分区之前进行
配置。
- **📦 EFISTUB(无引导加载程序启动)** —— UEFI 固件**直接**加载内核,
无需中间引导加载程序(Artix 内核已构建为 EFI 存根,
`CONFIG_EFI_STUB=y`)。initramfs 和参数通过 `efibootmgr` 条目传递。
**不需要额外安装包或 systemd** —— 不像 UKI 那样需要 `systemd-stub`。
仅限 UEFI;与加密的 `/boot` 不兼容。**支持回滚** —— 内核、initramfs 和
参数保持为独立文件,因此安装程序会注册额外的 UEFI 回滚和急救条目
(可通过固件启动菜单选择)。这是未来实现 Secure Boot 的基础。
- **🗄️ 额外磁盘** —— 挂载其他磁盘或分区(挂载到用户目录、`/mnt` 或
自定义路径),可选择格式化或加密每一个。加密的额外磁盘会在启动时
自动解锁(密钥位于加密的根目录上,通过 dinit 服务),无论根目录
使用何种解锁方式。
- **💾 文件系统选择** —— ext4、btrfs、xfs、f2fs、jfs、ext3、ext2。
- **🌳 带有快照和回滚的 Btrfs** —— 子卷 @/@home/@snapshots/@log/@cache,
在每次 pacman 操作前后自动创建快照(snapper + snap-pac),并支持在任何
引导加载程序上进行 artix-rollback 回滚(在 GRUB/rEFInd/Limine 中作为
图形菜单中的独立条目,在 EFISTUB 中作为固件启动菜单中的独立条目)。
- **🖥️ 桌面环境选择** —— KDE Plasma、LXQt、**Pinnacle**(AwesomeWM 风格的
Wayland 合成器)、XFCE、Cinnamon、MATE、LXDE 或无桌面环境。
- **🎮 GPU 驱动** —— NVIDIA (open-dkms)、NVIDIA 580xx(旧版)、nouveau、
AMD、Intel;选择专有驱动时会自动屏蔽 nouveau。
- **🛟 系统恢复模式** —— 挂载现有安装(如需要则进行 LUKS 解密),
检测引导加载程序并打开 chroot shell 进行修复。
- **🔁 AUR 支持** —— 从源码编译 `paru`(以始终匹配系统 `libalpm`),
随后安装您选择的包。
- **🧩 自动启用 dinit 服务** —— 任何已安装的 `*-dinit` 包都会自动启用
服务,无论它来自仓库还是 AUR。
- **📜 开箱即用的系统日志** —— `syslog-ng` 将所有日志收集到 `/var/log`,
而 `logrotate`(通过 `cronie`)将日志保留**一周**,删除更旧的日志,并
在文件超过 **5GB** 时立即轮转。自定义服务会记录到缓冲区,因此
`dinitctl catlog` 可以立即对它们使用。
- **🔥 现成的防火墙** —— 内置的 nftables 配置开放了 KDE Connect、LocalSend、
Sunshine、RustDesk、Steam Remote Play、Syncthing 和 SSH 的端口。
- **🎨 内置配置** —— kitty (Catppuccin Mocha)、starship 提示符、fastfetch,
对于 Pinnacle 还有 waybar 和 wofi;不需要外部文件。
- **🕹️ 游戏就绪** —— 提升 Wine/Proton fsync 的打开文件数 (`nofile`) 限制,
并可选择自动配置 `auto-cpufreq`。
- **🧳 自给自足** —— 所需的 host 工具(artools、gptfdisk、cryptsetup 等)
会自动安装,因此安装程序甚至可以在 **Artix 官方 ISO** 上运行,而不仅仅是在
自定义镜像上。
- **🏷️ 可自定义**的计算机名称和 UEFI 条目名称。
- **🚦 谨慎启动** —— 磁盘分区仅在“检查并安装”屏幕上明确确认后才会开始,
所需的 host 工具(git、gptfdisk、dosfstools、parted 等)会在连接到
网络后立即在后台加载。
- **⚠️ 分区前警告** —— 在磁盘选择屏幕上,安装程序会进行非阻塞式提醒
(不影响您的选择),如果:选定的磁盘是用于启动安装程序本身的
**可启动介质**(通过 live 镜像的 iso9660 文件系统检测);磁盘**小于 20 GB**
(基本系统可以容纳,但可能没有足够空间容纳完整的桌面环境);或者选定的
**UEFI/BIOS 模式与计算机实际启动的模式不匹配**(这将导致系统无法启动)。
每个警告都是滚动窗口中完整、易懂的句子(在磁盘列表上按 `w` 键);如果您
有意为之,您随时可以继续。
- **🧨 磁盘擦除确认** —— 格式化前的最后一步:单独的窗口直接显示哪个磁盘
(路径、型号、容量)及其**现有分区**将被不可逆地销毁,并要求显式按回车键。
没有这第二次确认,格式化永远不会开始 —— 意外擦除错误磁盘变得更加困难。
- **🪞 快速且稳定的镜像** —— 5 个最近的国家/地区(根据您的时区)按**实际
速度**排名并置于顶部;**世界上所有其他镜像在下方保持激活状态**,从近到远
—— 没有被注释或丢弃。因此,如果在下载期间快速镜像“死机”,pacman 会
直接移至下一个(直到 Artix 主服务器),而不会中断安装。俄罗斯镜像被
完全排除在外。此外,还有带有预编译 AUR 二进制包的可选 Chaotic-AUR。
- **📊 实时进度** —— 实时滚动的安装日志(PgUp/PgDn、Home/End);发生错误后
—— 可以在不丢失已做选择的情况下重新运行。
- **🏁 三种最终选项** —— 重启、关闭计算机或立即 chroot 进入新系统;在所有
情况下,分区都会被安全卸载。
- 📀 通过 **artools** (`buildiso`) 构建为 live ISO 镜像。
## 👁️ 外观

*截图来自图形终端;在纯 TTY 中,颜色更简单(请参阅“屏幕截图”部分的说明)。*
每个屏幕的示意图如下所示:
```
┌───────────┬──────────────────────────────────────────────┐
│ ◆ 01 │ 09 · Диск та розділи │
│ ● 02 │ ┌────────────────────────────────────────┐ │
│ ● … │ │ Режим ● UEFI ○ BIOS │ │
│ ◆ 09 │ │ Диск: /dev/sda 256G │ │
│ ○ 10 │ │ Додати SWAP? [так] [ 4 ГіБ ] │ │
│ ○ … │ │ Файлова система ‹ ext4 › btrfs xfs │ │
│ │ │ ◂ Назад Далі ▸ │ │
│ │ └────────────────────────────────────────┘ │
│ ├──────────────────────────────────────────────┤
│ │ ↑/↓ рух · ←/→ зміна · Enter далі │
└───────────┴──────────────────────────────────────────────┘
```
左侧面板仅显示步骤编号(在活动步骤上会旋转一个小菱形);完整的步骤名称位于
面板标题中。
## ⌨️ 控制
| 按键 | 动作 |
|---|---|
| ↑ / ↓ | 在列表和字段中移动 |
| Enter | 选择 / 下一步 |
| Esc 或 Shift+Tab | 返回;Esc 也会关闭模态窗口 |
| ↑ 在顶部项目上 | 返回上一个屏幕 |
| 空格键 | 标记项目 / 切换开关 |
| ← / → | 更改值:文件系统、SWAP 大小、账户模式、会话 |
| 输入文本 | 列表过滤、搜索包、编辑字段 |
| Tab | “账户”屏幕上的下一个字段 |
| o | 文件系统选项(“磁盘和分区”屏幕) |
| w / s | 在文件系统选项模态窗口中滚动描述 |
| PgUp / PgDn · Home / End | 快速滚动长列表和安装日志 |
| q | 退出安装程序(在安装过程中被锁定) |
| Ctrl+C | 紧急退出 |
活动屏幕的上下文提示始终显示在界面的底行。
## 🔨 构建
```
cd installer
cargo build --release
# → target/release/artix-installer
```
只读步骤(时区、键盘、Wi-Fi、包搜索、磁盘列表)在目标系统之外
缺少其所需工具时会正确降级。实际的安装过程(分区、basestrap、chroot)
需要 root 权限和真实目标,因此**请在虚拟机中进行测试**。
## 🚀 在官方 Artix 上运行
安装程序不一定非要从自定义镜像运行 —— 它可以直接从任何**官方 Artix**
启动:无论是控制台“base”镜像,还是带有桌面环境和图形安装程序 (Calamares)
的社区镜像 —— 只需打开终端并运行此 TUI 来代替 Calamares。它所需的
所有 host 工具(artools、gptfdisk、cryptsetup 等)都会在工作期间自行部署。
### 预编译二进制文件(最简单)
从[发布页面](https://github.com/YellowHearth1/artix-tui-installer)下载已编译的安装程序
并以 root 身份运行:
```
curl -LO https://github.com/YellowHearth1/artix-tui-installer/releases/download/artix-tui-installer/artix-installer
chmod +x artix-installer
sudo ./artix-installer
```
### 从源码构建
`base-devel` 提供了 `cargo` 所需的编译器和链接器:
```
sudo pacman -S --needed git rust base-devel
git clone https://github.com/YellowHearth1/artix-tui-installer
cd artix-tui-installer/installer
cargo build --release
sudo ./target/release/artix-installer
```
几点注意事项:
- 安装程序**必须以 root 身份运行** —— 它会进行磁盘分区,执行 `basestrap`
和 `chroot`。
- 这是一个全屏 TUI:请在真正的控制台 (`Ctrl`+`Alt`+`F2`) 或 live 桌面环境
的终端中运行,尺寸至少为 **80×24**。
- 在 live 镜像上,从源码构建会消耗内存;如果内存不足,请使用上面的预编译
二进制文件,或在另一台 Artix 机器上构建,并将单个文件复制到目标机器上。
- ⚠️ 安装程序会**格式化磁盘** —— 请先在虚拟机中进行测试。
## 🧭 向导步骤
安装程序从选择模式开始:**安装**或**系统恢复**。安装包含 15 个步骤:
1. **语言** —— 乌克兰语/英语;设置界面语言和系统区域设置。
2. **时区** —— 带有搜索过滤的完整 IANA 列表。
3. **Wi-Fi** —— 跳过(有线)、扫描或通过 `nmcli` 连接。
4. **键盘** —— 通过 `localectl` 设置的控制台布局;第一个选择为主布局。
5. **内核** —— linux / lts / zen / hardened。
6. **桌面环境** —— 选择图形环境(或不选择)和会话管理器。
7. **包** —— GPU 驱动 + 从仓库中搜索并进行多选。
8. **AUR** —— 精选的推荐列表和 AUR 实时搜索。
9. **磁盘** —— 启动模式、目标磁盘、SWAP 和根文件系统。
10. **引导加载程序和加密** —— 选择引导加载程序 (GRUB / rEFInd / Limine),检测其他
操作系统(`os-prober`,用于 GRUB)、UEFI 条目名称和磁盘加密:仅 `root`、全盘加密(包含
加密的 `/boot`)或 USB 密钥、容量和密码短语。在额外磁盘**之前**完成,
以便额外磁盘上的密钥有意义。
11. **额外磁盘** —— 对于每个找到的磁盘/分区:格式化(或“数据”)、挂载位置(用户目录 / `/mnt` / 带有文件夹名称的自定义路径)以及独立的加密复选框。在您选择之前,不会进行任何更改。
12. **用户** —— 计算机名称、账户模式、用户名和密码(仅保留在内存中,安装程序不会将其写入磁盘)。
13. **选项** —— 无密码 sudo、Chaotic-AUR 仓库和镜像优化。
14. **安装** —— 概览,然后实时日志逐步执行计划;发生错误时停止,并允许您返回**上一步**。
15. **完成** —— 总结和重启。
各处的导航都是相同的:`↑`/`↓` 移动焦点(在最高项目上按向上箭头返回上一步),
`←`/`→` 更改值,`Enter` —— 下一步,`Esc` —— 关闭窗口或返回。
## 🧱 安装的组织方式
`src/system/install.rs` 构建一个有序的操作列表;安装屏幕执行每一个操作,
实时转换输出。大致如下:
安装 host 工具 → 分区 → 格式化(如需要则进行 LUKS 加密)→ 挂载 → **阶段 1**
`basestrap` 最小的可引导基础系统(内核、固件、dinit + 服务、声音、日志)→
配置仓库和密钥 → **阶段 2** 用于桌面环境、驱动和您的包的交互式 `pacman` →
用户账户 → 区域设置 / 时区 / 键盘布局 / hostname + hosts → 配置 user-dinit
(turnstile 或 userspawn)→ initramfs(加密时带有 `encrypt` 钩子)→ 引导加载程序 →
内置 nftables → 日志轮转 → 启用所有 dinit 服务 → **阶段 3** 通过 `paru` 安装 AUR。
## 🌳 Btrfs:子卷、自动快照和系统回滚
如果在“磁盘和分区”步骤中选择 **btrfs**,文件系统选择下方会出现额外选项
(每个选项在界面中都有直接的“收益/损失”说明):
- **子卷** —— 布局为 `@`(根)、`@home`、`@snapshots` → `/.snapshots`、
`@log` → `/var/log`、`@cache` → `/var/cache`。系统快照不会触及 `/home`,
也不会被日志和缓存膨胀。
- **自动快照(snapper + snap-pac)** —— 在**每次 pacman/paru 事务前后**创建快照;
自动启用子卷(需要 `@snapshots`)。
- **压缩** —— 写入时透明的 `compress=zstd`。
- **SSD 的 TRIM** —— 后台 `discard=async`。
- 对于任何文件系统,单独提供 **noatime** 选项。
根目录始终使用 `rootflags=subvol=@` 挂载 —— 按名称挂载,而不是通过 default 子卷。
安装程序为快照进行的配置:
- **snapper** 通过直接写入 `/etc/snapper/configs/root` 进行配置(因为在 chroot 中
`create-config` 无法工作):`TIMELINE_CREATE=no` —— 快照绑定到 pacman 事件,
而不是时钟;`NUMBER_LIMIT=10` —— 保留最近约 10 个快照。
- **计划清理** —— 通过 cronie 运行 `/etc/cron.d/snapper`(每天 5:30),因为 dinit
没有 systemd 定时器。
- **首次启动的基础快照** —— 一次性后台服务会等待 D-Bus 和 snapper 启动,
创建“clean system (post-install baseline)”快照并自行清理。
回滚**适用于任何引导加载程序**(GRUB、rEFInd、Limine):
- **`sudo artix-rollback [N]`** —— 显示快照列表;选定的快照将成为新的 `@`,
旧根保存为 `@.rollback-<时间>`,重新指向 default 子卷,并从快照中清理过时的
pacman 本地数据库(snap-pac 会在 `db.lck` 下额外创建 PRE 快照)。在应用程序菜单
中也有快捷方式。
- **回滚到系统启动** —— 内核参数 `artix.rollback` 直接从 initramfs 打开快照选择;
mkinitcpio 钩子在 `encrypt` **之后**运行,因此也适用于 LUKS。在 **GRUB** 上,为此
提供了单独的 **System Rollback** 菜单项。
- 经典的 `snapper rollback` 也可以使用。
回滚**不依赖于活动内核**:`/boot` 中包含一对冻结的 `vmlinuz-artix-rescue` +
`initramfs-artix-rescue.img`,pacman 不会触及它们。GRUB、rEFInd 和 Limine 中的
*System Rollback* 条目正是加载这对文件 —— 因此即使更新破坏了内核或 initramfs,
快照选择器仍然可以启动(旁边还有常规的 *rescue kernel* 条目 —— 在备用内核上
启动而无需任何回滚)。这对文件仅在成功正常启动后更新:服务 `artix-rescue-sync`
会在运行时间 30 秒后触发,并首先验证当前运行的正是活动内核(与 `/usr/lib/modules/$(uname -r)/vmlinuz` 进行逐字节比较),因此损坏的内核永远不会污染副本。而在回滚之后立即,
一次性的 `artix-rollback-fixup` 会自动使 `/boot` 与恢复的系统保持一致:从快照的
`/usr/lib/modules` 恢复内核,重新构建 initramfs,更新 GRUB 菜单并冻结新的备用对。
## 📀 ISO 配置文件 (`iso-profile/`, 用于 artools `buildiso`)
- `Packages-Root` / `Packages-Live` —— 用于 live 镜像的包(仅限 dinit)。
- `profile.conf` —— live 会话的自动登录/显示管理器。
- `live-overlay/usr/bin/installer-launch` —— 在 tty1 上为 TUI 提供真正的控制终端
(`setsid -c`),并在失败时提供备用 shell。
- `live-overlay/etc/dinit.d/installer.conf` —— 取代 tty1 上的 getty 的安装程序自动
启动服务。
- `grub-overrides/loopback.cfg` —— 直接启动到安装程序。
将编译好的二进制文件放入 `live-overlay/usr/bin/artix-installer`,然后
执行 `sudo buildiso -p 标签:Artix Linux, Linux安装器, ratatui, Rust, TUI, 可视化界面, 系统工具, 网络流量审计, 通知系统