Fedora: Anaconda 3分クッキング

この記事はLinux Advent Calendar 2015 - Qiitaの第一日目の記事です。

anacondaをハックする場合、ビルド周りで参考になるのは下記の2ページです。

Buildingのページは必要なパッケージのインストールから始まって、rpmの作成の解説です。 Updatesはというと、インストーラに含まれているanacondaにパッチを当てるためのイメージを作成となります。Fedoraインストーラ起動時にカーネルコマンドラインを編集できるのですが、そこでanacondaのための引数を設定することができ、この引数にアップデートイメージのURLを渡すとアップデートイメージをダウンロードして展開し、パッチが当たったanacondaでインストールができるようになります。 anacondaをハックする場合、手軽なのはアップデートイメージを作る方法です。これならインストーラそのものを作りなおす必要もないので簡単です。

では、やってみましょう。 最初にソースを取得します。これはAnacondaのページにgithubリポジトリが書かれているのでそこからcloneしましょう。

masami@kerntest:~ git clone https://github.com/rhinstaller/anaconda.git

次にビルドに必要なパッケージをインストールします。必要なのはlibtoolパッケージと、

masami@kerntest:~/anaconda (master)$ sudo dnf install libtool -y

その他諸々です。BuildingのページのようにBuildRequiresでパッケージを検索するとs390用のパッケージがなくてインストールできないので、これだけ省いてます。

masami@kerntest:~/anaconda (master)$ grep ^BuildRequires: anaconda.spec.in | awk '{print $2}' | grep -v s390 | xargs sudo dnf install -y

必要なものがインストールできたら対象のブランチを決めて、そこを弄りましょうということで、ここではfedora 23のブランチを取得します。

masami@kerntest:~/anaconda (master)$ git branch -r
~略~
origin/f23-branch
~略~
masami@kerntest:~/anaconda (master)$ git checkout -b f23 origin/f23-branch
Branch f23 set up to track remote branch f23-branch from origin.
Switched to a new branch 'f23'

そして、autogen.shを実行してconfigureスクリプト等を生成します。anacondaのソースパッケージを使う場合はこの手順は不要かと思いますが、今回はgitリポジトリからソースを取得したのでこの手順が必要です。

masami@kerntest:~/anaconda (f23)$ ./autogen.sh

終わったらconfigureスクリプトを実行します。autogen.shやconfigureの実行は必要なパッケージが入っていれば問題なく終わると思います。

masami@kerntest:~/anaconda (f23)$ ./configure

ここまでくればあとは適当に弄って、最後にアップデートのイメージを作るだけです。 今回はデフォルトの言語を変えてみます。

変えたのはこんなところです。

masami@kerntest:~/anaconda (f23)$ git commit -m "Change default lang from English to Japanese"
[f23 396a846] Change default lang from English to Japanese
 1 file changed, 2 insertions(+), 2 deletions(-)
masami@kerntest:~/anaconda (f23)$ git diff HEAD^
diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
index df1a171..435ea3a 100644
--- a/pyanaconda/constants.py
+++ b/pyanaconda/constants.py
@@ -61,11 +61,11 @@ INSTALL_TREE = MOUNT_DIR + "/source"
 BASE_REPO_NAME = "anaconda"

 # NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8
-DEFAULT_LANG = "en_US.UTF-8"
+DEFAULT_LANG = "ja_JP.UTF-8"

 DEFAULT_VC_FONT = "eurlatgr"

-DEFAULT_KEYBOARD = "us"
+DEFAULT_KEYBOARD = "jp106"

 DRACUT_SHUTDOWN_EJECT = "/run/initramfs/usr/lib/dracut/hooks/shutdown/99anaconda-eject.sh"

変更したらアップデートのイメージを作りましょう。

masami@kerntest:~/anaconda (f23)$ make updates
Using tag: anaconda-23.19.10-1
BUILDDIR /home/masami/anaconda
Including pyanaconda/constants.py
Including pyanaconda/packaging/dnfpayload.py
88 blocks
<stdin> to <stdout>
updates.img ready

これで完了です。では、実際にパッチを適用してみます。 Fedora23のデスクトップ版をqemuでさくっと起動します。

masami@saga:~/tmp$ qemu-system-x86_64 --enable-kvm -m 4096 -cdrom ../Fedora-Live-Workstation-x86_64-23-10.iso -boot d

ブート画面が出たらtabキーを押してコマンドラインの編集モードに入り、updates=http://10.0.2.2:8000/updates.img を最後に追加して、アップデートイメージのURLを教えてあげます。 f:id:masami256:20151128100959p:plain

起動したらInstall to Hard Driveのほうを選んでインストーラを起動します。

f:id:masami256:20151128101253p:plain

この前後位でupdates.imgを取りにきます。

masami@saga:~/tmp$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 ...
127.0.0.1 - - [28/Nov/2015 09:58:19] "GET /updates.img HTTP/1.1" 200 -

インストーラが起動すると言語が日本語で表示されていて、パッチが適用されているのがわかります( ´∀`)bグッ!

f:id:masami256:20151128101426p:plain

ちなみに、キーボードが変わっていないのはlocaleを見ているからっぽいです。

anaconda/pyanaconda/ui/gui/spokes/welcome.pyを見るとlocaleによってlayoutを設定しているので、ここが効いていそうです。Gnome3のメニューは英語ですし。

        layouts = localization.get_locale_keyboards(locale)
        if layouts:
            # take the first locale (with highest rank) from the list and
            # store it normalized
            new_layouts = [keyboard.normalize_layout_variant(layouts[0])]
            if not langtable.supports_ascii(layouts[0]):
                # does not support typing ASCII chars, append the default layout
                new_layouts.append(DEFAULT_KEYBOARD)
        else:
            log.error("Failed to get layout for chosen locale '%s'", locale)
            new_layouts = [DEFAULT_KEYBOARD]

大まかなディレクトリ構造の説明をしておくと。anacondaは基本的にPythonで書かれたプログラムなのでpyanaconda/以下のファイルを参照するのがメインになると思います。 pyanaconda/直下にあるpythonファイルがUI部分を除いた実際の機能になります。uiに関してはGUI(ライブCD)・TUI(ネットワークインストール、サーバ版)の2個があります。 そして、実際の画面に関するところはui/gui/spokes、ui/tui/spokesにあります。画面構成に関しては.gladeファイルに記述されています。

installclasses/はインストーラのメインクラス的なものでfedorarhelのクラスがあります。これらのクラスはBaseInstallClassを継承しています。

こんな感じで、anacondaに対してアップデートが簡単に作れます(∩´∀`)∩ワーイ 基本的にanacondaは途中でバグに当たるとpythonのデバッガに落ちます。なのでデバッガに落ちたところでデバッグをして原因を調べて、fixやデバッグメッセージの追加をしてアップデートイメージの作成し、再度確認なんてこともできますね。バグにあたっても自分でデバッグしてパッチを適用して自分で解決できるというのが割と簡単にできる親切設計ですネ!

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)