编译中文安装界面的 IPFire 镜像
最近折腾了一次 IPFire 2.x 的定制编译,制作一个对中文用户更友好的安装镜像。从安装器启动、语言选择、安装流程、首次 setup,到安装后的默认语言和时区,都尽量让中文环境开箱可用。IPFire 本身是一套从源码完整构建的防火墙发行版。它的安装器运行在 initramfs 里的文本控制台环境,界面基于 newt。这个环境非常轻量,也意味着中文支持不会像桌面系统那样自然可用:gettext 翻译、locale、控制台 UTF-8 模式、字体、dracut 模块打包,任何一环缺失,最后看到的都可能是方块、乱码或者直接回退到英文。

解决目标

IPFire 安装阶段没有图形界面,也没有完整字体栈。newt 只是负责画窗口和菜单,最终字符还是要由控制台字体显示出来。因此中文安装界面至少需要解决四个问题:
1. 安装器和 setup 要能选择 zh_CN.utf8和 zh_TW.utf8。
2. initramfs 里要包含对应 locale。
3. 控制台必须进入 UTF-8/Unicode 模式。
4. 控制台字体必须包含安装过程中会出现的中文字形。

使用工具

为了顺利完成本次任务,使用了Codex进行辅助,在debian 6.12系统下完成编译构建。

添加中文

安装器的语言菜单中新增了两项:
{ "zh_CN.utf8", "zh", "简体中文 (Chinese Simplified)" },
{ "zh_TW.utf8", "tw", "繁體中文 (Chinese Traditional)" },
把 locale 和 IPFire 内部使用的 language code 拆开处理。locale 用于 setlocale(),例如 zh_CN.utf8;language code 用于 gettext 的 LANGUAGE`环境变量以及 IPFire 自己的配置,例如 zh和 tw。这样做的好处是安装阶段可以正确使用系统 locale,同时安装后的 /var/ipfire/main/settings仍然保存 IPFire Web UI 熟悉的语言代码。安装器在用户选择中文后,会立即切换到对应字体:
if (strcmp(config.language, "zh") == 0) 
    system("/bin/setfont ipfire-setup-zh >/dev/null 2>&1"); 
else if (strcmp(config.language, "tw") == 0) 
    system("/bin/setfont ipfire-setup-tw >/dev/null 2>&1"); 
else 
    system("/bin/setfont latarcyrheb-sun16 >/dev/null 2>&1");
这样语言菜单之后的安装步骤就可以显示中文,而不是只在安装完成后才生效。

添加字体

完整中文CJK 字体非常大,而 Linux console font 又有 512 glyph 的限制。直接把完整中文字体塞进安装环境并不可行,也没有必要。这次新增了一个 make-installer-font.py 脚本,用 Unifont 的 hex 数据生成 PSF2 控制台字体。思路是只收集安装器和 setup 翻译文件中实际出现过的字符,再加上语言菜单里需要显示的字符,然后生成几个小字体文件:
  • ipfire-installer-menu.psfu.gz
  • ipfire-setup-zh.psfu.gz
  • ipfire-setup-tw.psfu.gz
构建脚本会下载并校验 unifont-7.0.03.hex.gz,然后在 lfs/installer和 lfs/setup阶段生成字体。这样既能显示中文,又不会把 initramfs 撑得太大。这一点是整个中文安装器里最关键的部分。翻译文件决定“显示什么”,控制台字体决定“能不能显示出来”。

打包字体

安装器运行在 dracut 生成的 initramfs 里,所以字体和 locale 只安装到最终系统还不够,还必须被 dracut 模块打包进去。这次在 installer 的 dracut module 中加入了:
  • inst_multiple kbd_mode setfont
  • inst /lib/kbd/consolefonts/ipfire-installer-menu.psfu.gz
  • inst /lib/kbd/consolefonts/ipfire-setup-zh.psfu.gz
  • inst /lib/kbd/consolefonts/ipfire-setup-tw.psfu.gz
同时 locale 列表增加了:
zh_CN zh_TW
安装器启动脚本里也提前打开 UTF-8 模式:
printf '\033%%G'
kbd_mode -usetfont 
ipfire-installer-menu || setfont latarcyrheb-sun16
这一步保证语言选择菜单本身就能显示“简体中文”和“繁體中文”。如果只在用户选择中文之后再加载字体,语言菜单第一屏仍然会乱码,所以这里单独生成了一个覆盖语言菜单字符的字体。

默认设置

为了让这次镜像更贴近中文用户的默认使用场景,我把系统默认语言和时区也调整为中文环境:
LANG=zh_CN.UTF-8
LANGUAGE=zhTIME
ZONE=/usr/share/zoneinfo/posix/Asia/Shanghai
安装器写入目标系统配置时,也会同步设置 `/etc/localtime`:
unlink("/harddisk/etc/localtime");
link("/harddisk/usr/share/zoneinfo/posix/Asia/Shanghai", "/harddisk/etc/localtime");
首次启动运行 setup 时,环境变量也改为 zh_CN.utf8,并根据语言加载中文控制台字体。这样安装完成重启后,继续配置网络和密码时仍然是中文体验,不会出现“安装器中文,首次配置又变回英文”的割裂感。

中文界面

IPFire 的 Web UI 翻译主要在 langs/zh 和 langs/tw下。这次也同步更新了简体和繁体语言文件。另外,Web 界面中 HTML escape 的处理也做了一个小修正:在转义前先按 UTF-8 解码,避免非 ASCII 翻译被逐字节 escape,导致中文显示异常。
$s = Encode::decode("UTF-8", 
$s) unless Encode::is_utf8($s);$s = HTML::Entities::encode_entities($s);
return Encode::encode("UTF-8", $s);
这个问题不一定只影响中文,但中文会更容易暴露它。

构建镜像

IPFire 的完整构建由 make.sh 驱动。准备好构建环境和 .config 后,执行:
./make.sh build
为了专注生成安装 ISO,只保留了 cdrom构建,去掉了 flash image 构建:
lfsmake2 cdrom
lfsmake2 core-updates
构建过程中,installer 和 setup 阶段会自动下载 Unifont hex 文件、校验 BLAKE2 摘要,并生成中文控制台字体。最终产物会出现在对应架构的 images_* 输出目录中。如果只是调试中文安装器,不建议每次都从零完整构建。可以优先关注这几个阶段:
./make.sh shell
在构建环境中检查 installer、setup、dracut 模块和字体文件,完整 ISO 仍然需要走 ./make.sh build,因为 initramfs 和安装镜像都要重新生成。

检查验证

本次编译镜像安装配置过程:

1、安装过程

语言选择

键盘映射

文件系统选择

2、配置过程

网络配置菜单

中文web界面

经过多项测试,使用本次编译镜像安装的IPFire的所有功能一切正常,并在官方版本基础之上提供了完整的中文支持。

下载地址

ipfire-2.29-core202-x86_64-中文版

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇