Rabbit Slide Show

Tokyo Debian Debian Installer Issue 202307

2023-07-15

Description

Text

Page: 1

Debian Installerの
日本語フォントを
どうにかする話
日本語を選択して
違和感なくインストールしたい
Kentaro Hayashi
ClearCode Inc.
2023年7月 東京エリア・関西合同Debian勉強会

Page: 2

スライドは Rabbit Slide
Showにて公開済みです
Debian Installerの日本語フォントをどうにかする話
https://slide.rabbit-shocker.org/authors/kenhys/
tokyodebian-d-i-font-202307

Page: 3

本日の内容
Debian Installerを改善する試み
日本語を選択してインストールするときの違和感
違和感の正体とその経緯について
どうすればいいのか?
Debian Installerのビルドをして検証してみた

Page: 4

Debian Installerとは
https://www.debian.org/devel/debian-installer/
index.en.html
Debianをインストールするためのイメージを提供
ネットワークインストールしたり、ライブイメージも利
用できる
詳細は https://d-i.debian.org/ 参照

Page: 5

Debian Installerのドキュ
メント
Debian Installer Internationalization and Localization
Guide
https://d-i.debian.org/doc/i18n-guide/
Debian Installation Guide — Development version
https://d-i.debian.org/doc/installation-guide/
Debian Installer internals
https://d-i.debian.org/doc/internals/

Page: 6

インストール中に
違和感を覚える
インストール時に日本語
を選択すると発生
インストールそのものに支障をきたすほどではない

Page: 7

Debian bookwormのイン
ストーラーの画面

Page: 8

間違い探しの答え

Page: 9

どういうことか?
一部の文字がいわゆる中華フォントになる
「新」、「空」、「化」、「戻」、「続」など
フォントが中華フォント臭いなと思いながらもインス
トールをそのまま続行してしまいがち

Page: 10

問題の発生する環境
Debian 8 (jessie) では発生しない
2015/04/25-2018/06/17 EOL, 2020/06/30 EOL LTS
Debian 9 (stretch) 以降で発生する
2017/06/17-2020/07/18 EOL, 2022/07/01 EOL LTS

Page: 11

Debian 9で
何が起こったのか
Proposal: Drop ttf-cjk-compact, get fonts-droid
https://lists.debian.org/debian-boot/2015/07/
msg00304.html
ttf-cjk-compactではなく fonts-androidが採用された
ttf-cjk-compactでは必要な文字を含むコンパクトなフォ
ントを用意していた
~ 160KB程度にまとめていた

Page: 12

fonts-android?
https://wiki.debian.org/DebianInstaller/GUIFonts
CJK向けフォントとしてfonts-androidでは
DroidSansFallbackが採用
結果として特定の文字が中華フォントになる Han
Unification

Page: 13

変更当時から
問題が認識されていた
kmutoさん曰く
- Some Japanese characters look bit funny.
(I believe it is negligible for installer.)
https://lists.debian.org/debian-boot/2015/07/
msg00304.html

Page: 14

Han Unificationに関する
問題の一般的な解説記事
参考: Your Code Displays Japanese Wrong
https://heistak.github.io/your-code-displays-japanese-
wrong/

Page: 15

Your Code Displays
Japanese Wrong
https://heistak.github.io/your-code-displays-japanese-
wrong/

Page: 16

どうするとよいのか
ざっくりいうと
適切なフォントを選んで
言語選択時に変更する

Page: 17

適切なフォントを選ぶ
案1: fonts-androidにフォントを追加する
ソースアーカイブ(MTLc3m.ttf)にのみあり、インストー
ルはされない
MTLc3m.ttfは1.9MBほど(他の日本語フォントと比べると
コンパクト)
fonts-android.udebのみフォントを追加インストールす
るよう変更

Page: 18

適切なフォントを選ぶ (2)
案2: fonts-motoya-l-cedarのudebを用意する
udebを提供するのは理にかなっている

Page: 19

どうするとよいのか
適切なフォントを選んで
fonts-motoya-l-cedarのudebを用意
言語選択時に変更する

Page: 20

udeb?
拡張子が.udebでmicro-debと呼称
d-i専用の容量削減を重視するdebパッケージ
Debian Policyのもろもろには準拠せず
アンインストールや更新は意図されていない
changelogやライセンス、ドキュメント等を省略
See Chapter 3. D-I components or udebs
https://d-i.debian.org/doc/internals/ch03.html

Page: 21

言語選択時に変更する (1)
d-iは各種パッケージから構成される

Page: 22

言語選択時に変更する (2)
cdefconfでGTKのリソースを変更(抜粋)
たぶんもっとよいやりかたはあるはず
static void set_language_specific_font_name(struct frontend *fe)
char * language = cdebconf_gtk_get_text(fe, "debconf/language",
"Current language for installer");
if (language && strcmp(language, "ja") == 0) {
gtk_rc_parse_string('gtk-font-name = "MotoyaLCedar"');
}

Page: 23

どうするとよいのか
適切なフォントを選んで
fonts-motoya-l-cedarのudebを用意
言語選択時に変更する
cdefconfでGTKのリソースを変更
注: もっとよいやりかたはありそう

Page: 24

インストーラーを
ビルドして検証する
Debian Installerのビルド方法を解説

Page: 25

Debian Installerのビルド
方法 (1)
リポジトリのチェックアウト
$ sudo apt install -y myrepos
$ mr bootstrap \
https://salsa.debian.org/installer-team/d-i/raw/master/.mrconfig \
debian-installer

Page: 26

Debian Installerのビルド
方法 (2)
必要なパッケージのインストール
パッケージいろいろインストールするのでコンテナ推奨
# apt install -y \
git curl myrepos dpkg-dev \
apt-utils wget bc xsltproc docbook-xml docbook-xsl libbogl-dev \
genext2fs genisoimage dosfstools cpio \
syslinux syslinux-utils isolinux pxelinux syslinux-common \
shim-signed grub-efi-amd64-signed grub-common xorriso tofrodos mtools kmod \
bf-utf-source win32-loader librsvg2-bin fdisk fontconfig

Page: 27

Debian Installerのビルド
方法 (3)
フォントのudebを用意する
debian/control
diff -ur fonts-motoya-l-cedar-1.01.orig/debian/control fonts-motoya-l-cedar-1.01/debian/control
--- fonts-motoya-l-cedar-1.01.orig/debian/control
2019-04-14 22:16:41.000000000 +0900
+++ fonts-motoya-l-cedar-1.01/debian/control 2023-07-03 18:44:45.938298199 +0900
@@ -21,3 +21,14 @@
.
This package provides "MotoyaLCedar W3 mono" - Gothic that images Japanese
cedar, straight and thick tree.
+
+Package: fonts-motoya-l-cedar-udeb
+Package-Type: udeb
+Section: debian-installer
+Architecture: all
+Description: Japanese Truetype font, Motoya L Cedar

Page: 28

Debian Installerのビルド
方法 (4)
MTLc3m.ttfをインストールするための.installを用意
debian/fonts-motoya-l-cedar-1.01/debian/fonts-motoya-
l-cedar-udeb.install
MTLc3m.ttf
usr/share/fonts/truetype/motoya-l-cedar/

Page: 29

Debian Installerのビルド
方法 (5)
udebを参照できるようにする
debian-installer/installer/build/sources.list.udeb.localを
配置する
例: /debianがコンテナにマウントしたdebian-installerディ
レクトリ
deb [trusted=yes] copy:/debian/installer/build localudebs/
deb http://deb.debian.org/debian unstable main/debian-installer

Page: 30

Debian Installerのビルド
方法 (6)
debian-installer/installer/build/localudebsにフォント
のudebを配置する
# ls -1 /debian/installer/build/localudebs/
Packages
Packages.gz
fonts-motoya-l-cedar-udeb_1.01-5.1_all.udeb

Page: 31

Debian Installerのビルド
方法 (7)
installer/build/pkg-lists/gtk-commonのパッケージリ
ストにフォントを追加する
# For Japanese
fonts-motoya-l-cedar-udeb

Page: 32

Debian Installerのビルド
方法 (8)
cdebconfにパッチをあてる
packages/cdebconf/src/modules/frontend/gtk/di.c
diff --git a/src/modules/frontend/gtk/di.c b/src/modules/frontend/gtk/di.c
index 3dc5d38c..e85277a3 100644
--- a/src/modules/frontend/gtk/di.c
+++ b/src/modules/frontend/gtk/di.c
@@ -321,6 +321,30 @@ static GtkTextDirection get_text_direction(struct frontend * fe)
return direction;
}
+/** Set language specific gtk-font-name explicitly
+ *
+ * @param fe
+ */
+static void set_language_specific_font_name(struct frontend *fe)
+{
+ char * language = cdebconf_gtk_get_text(fe, "debconf/language",
+
"Current language for installer");
+ if (language && strcmp(language, "ja") == 0) {
+
/* font-android-udeb is used for CJK, but because of Han unification,
+
* some of font typefaces are rendered as Simplified Chinese, not
+
* Japanese.
+
* This issue is not solved by using DroidSansFallback.ttf
+
* (fonts-android-udeb), thus another font which contains
+
* Japanese font typeface must be used for Japanese.
+
*
+
* MotoyaLCedar is suitable font which can be bundled for
+
* fonts-android-udeb.
+
* [1] https://wiki.debian.org/DebianInstaller/GUIFonts
+
*/
+
gtk_rc_parse_string('gtk-font-name = "MotoyaLCedar"');
+ }
+}
+
/** Update various settings with the current language settings.
*
* @param fe cdebconf frontend
@@ -331,6 +355,9 @@ static void refresh_language(struct frontend * fe)
gtk_rc_reparse_all();
/* Adapt text direction. */
gtk_widget_set_default_direction(get_text_direction(fe));
+
+ /* Override specific font name */
+ set_language_specific_font_name(fe);
}

Page: 33

Debian Installerのビルド
方法 (9)
build/config/commonでLINUX_KERNEL_ABIを環境に
あわせて設定しなおす
linux-image-x.y.z-1が揃っていないと依存するudebをダ
ウンロードできない
# Default kernel ABI version to use. Append a kernel flavour to
# produce KERNELVERSION.
#LINUX_KERNEL_ABI ?= 6.3.0-2
LINUX_KERNEL_ABI ?= 6.1.0-9

Page: 34

Debian Installerのビルド
方法 (10)
buildディレクトリに移動して、build_netboot-gtkを
ビルド
# cd /debian/installer/build/
# make build_netboot-gtk

Page: 35

Debian Installerのビルド
方法 (11)
ビルドが成功するとmini.isoができる
/debian/installer/build/dest/netboot/gtk/mini.iso

Page: 36

手元で修正してみた画面

Page: 37

新旧の比較
中華フォントが修正されている

Page: 38

バグレポート
debian-installer: GUI font for Japanese was incorrectly
rendered
https://bugs.debian.org/cgi-bin/bugreport.cgi?
bug=1037256
Proposal: change Japanese font for GUI installer
https://lists.debian.org/debian-boot/2023/06/
msg00224.html

Page: 39

さいごに
Debian 9以降インストーラーは中華フォント問題
(Han Unification)を抱えている
日本語向けには次の変更で解決できる
フォントを追加インストールする
追加インストールしたフォントを動的に選択可能にする

Other slides

DebConf20 DebConf20
2020-08-25