この記事は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を教えてあげます。
起動したらInstall to Hard Driveのほうを選んでインストーラを起動します。
この前後位で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グッ!
ちなみに、キーボードが変わっていないのは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/はインストーラのメインクラス的なものでfedoraとrhelのクラスがあります。これらのクラスはBaseInstallClassを継承しています。
こんな感じで、anacondaに対してアップデートが簡単に作れます(∩´∀`)∩ワーイ 基本的にanacondaは途中でバグに当たるとpythonのデバッガに落ちます。なのでデバッガに落ちたところでデバッグをして原因を調べて、fixやデバッグメッセージの追加をしてアップデートイメージの作成し、再度確認なんてこともできますね。バグにあたっても自分でデバッグしてパッチを適用して自分で解決できるというのが割と簡単にできる親切設計ですネ!
パーフェクトPython (PERFECT SERIES 5)
- 作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (29件) を見る