« PS3にFedora 7とCell SDK 2.1をインストール | トップページ | Cellのmailbox機能 »

PS3用Fedora 7 kernelの再構築

PS3 LinuxをFedora 7に更新して問題なく使えているのですが、shutdown/rebootが途中で停止してしまう既知問題をなんとかしたいと思っています。Yumで一度カーネルの更新を行ったのですが問題は解消しませんでした。

LinuxHQで最新のソースを調べると、PS3用のvideoドライバであるps3fb.cにkernel-2-6-21-git5で修正が行われていることが分かりました。ひょっとしてこの修正パッチを当てると問題が解決しないかと期待したのですが、Fedora 7のkernel source rpmを展開したところ、このパッチは既に取り込み済でした。

そのため、単に最新のパッチをあててカーネルをビルドし直せば問題解決という目論見は崩れ去ったのですが、PS3用のカーネル再構築にトライすることにします。

以下にカーネル再構築の手順を示します。カーネルの再構築を行うような方はそれなりの経験者だと思いますが、ひとつ間違うと、二度とシステムが起動しなくなる場合もありますので、カーネルの再構築を行う場合は十分ご注意ください。

カーネルソースの入手

最初は、最新のカーネルをベースに再構築を行うのがよかろうと思い、kernel-2.6.21-5のソースをLinux Kernel Archivesからダウンロードしたのですが、このソースツリーではconfigをどういじってもkernelをブートすることができませんでした。まったくkernelが起動する気配がないので、ディスクドライバ周りに問題ありかと思い色々と調べてみると、2.6.21-5のソースツリーには、ps3_strage.cというHDDのドライバが入っていないことが分かりました。そのほかにも、snd_ps3.c、gelic_net.cなどPS3に必要なソースコードが欠けているようです。

kernel-2.6.21からPS3のコードが統合されたと思っていたのですが、まだ部分的な統合にとどまるようで、Fedora 7のカーネルは不足分を独自に取り込んでビルドされていることが分かりました。

そのため、PS3用カーネルの再構築のためにはFedora 7のsrc.rpmが必須になります。

src.rpmの入手と展開

src.rpmの展開方法はこちらのサイトを参考にしました。

1. 最新版のsrc.rpmをダウンロードします
    # yumdownloader --source kernel
    kernel-2.6.21-1.3228.fc7. 100% |=========================|  45 MB

2. rpmファイルの展開
    # rpm -Uvh kernel-2.6.21-1.3228.fc7.src.rpm
       以下の警告が出ますが、気にせず進めます
  警告: グループ kojibuilder は存在しません - root を使用します

3. カーネルソースの展開
    rpmbuildを実行するために以下のパッケージをインストール。
  # yum install sparse

    # cd /usr/src/redhat/SPECS/
    # rpmbuild -bp --target $(uname -m) kernel-2.6.spec
    ビルド対象プラットフォーム: ppc64
    ターゲット ppc64 用にビルド中
         (以下略)
/usr/src/redhat/BUILD/kernel-2.6.21/linux-2.6.21.ppc64 にソースが展開されます。/usr/src/redhat/SOURCESに展開されたパッチファイルを見ると、PS3関連で21本のパッチを当てていることが分かります。ディストリビューションとしてまとめる際は、単純にソースツリーを持ってくるだけではなく色々と手を入れているのですね。

4. ソースディレクトリにシンボリックリンクを設定
    # ln -s /usr/src/redhat/BUILD/kernel-2.6.21/linux-2.6.21.ppc64 /usr/src/linux
これからのmake等は、/usr/src/linux をホームに作業を行います。

Makeの準備

1. /usr/src/linux/Makefile に以下の定義を追加
    EXTRAVERSION = -1.3228.ps3
    CROSS_COMPILE   ?= ppu-
     → cell SDKのppu-gccでコンパイルします(多少最適化する?)

2. configファイルの設定
   # cd /usr/src/linux
 # cp /boot/config-2.6.21-1.3228.fc7  .config
 # make menuconfig →  リモートPCから行っているためmenuconfigです

/bootからコピーしたFedora 7のconfig設定が読み込まれた状態になります。オリジナルのconfigはどんなマシン構成にも適合するように、あらゆるドライバーがModuleとして指定されているため、PS3では必要がないモジュールの選択を外してカーネルサイズのダイエットとコンパイル時間の短縮化を図ります。

/usr/src/linux/arch/powerpc/configs/ps3_defconfig がPS3のための最小レベルのconfigになりますが、このconfigではカーネルを起動できませんでした。冒頭に示したps3_strage等の設定が抜けているため追加したのですが、まだ不足があるようです。そのため、Fedora 7のconfigをベースに不要な設定を抜いていきました。

今回のビルドで使用したcofigはこちらです。

Makeとカーネルイメージのコピー

1. Make
   # make
   # make modules_install

2. カーネルイメージのコピー
   # cp -p arch/powerpc/boot/zImage.ps3 /boot/vmlinuz-2.6.21-1.3228.ps3
   # cp -p System.map /boot/System.map-2.6.21-1.3228.ps3
   # mkinitrd -v /boot/initrd-2.6.21-1.3228.ps3.img 2.6.21-1.3228.ps3

3. yaboot.confの編集
/boot/etc/yaboot.confに以下の行(青字の部分)を追加します。

default=2.6.21-1.3228.fc7
image=/vmlinuz-2.6.21-1.3228.fc7 → 起動実績がある旧カーネル
        label=2.6.21-1.3228.fc7
        read-only
        initrd=/initrd-2.6.21-1.3228.fc7.img
        root=/dev/VolGroup00/LogVol00
        append="video=720p"
image=/vmlinuz-2.6.21-1.3228.ps3 → 新規にビルドしたカーネル
        label=2.6.21-1.3228.ps3
        read-only
        initrd=/initrd-2.6.21-1.3228.ps3.img
        root=/dev/VolGroup00/LogVol00
        append="video=720p"

上記のように、必ず起動実績のあるカーネルイメージのエントリを残しして、いざというときは旧イメージで起動できるようにします。

PS3 Linuxのカーネル

このwebページにあるように、PS3のハードウェアはLinuxに対してHypervisorで仮想化されています。HDD/BDはATA接続ですが、HyprevisorとLinuxのドライバ(ps3_strage)を介して、Linux上ではSCSIディスク(/dev/sda)して見えています。そのため、カーネルのconfigでATA関連のドライバを全て無効にしても問題なく動作します。

ネットワークは、gelic_net 、gelic_wireless というPS3専用のドライバが提供されているため、その他のドライバ(intel/realtekなど)は全て無効にできます。

オリジナルFedora 7カーネルと比較して

不要なドライバーの削除をできる限り行ったところ、カーネルのサイズは以下に示すようにかなり小さくなりました。
 7567248  vmlinuz-2.6.21-1.3228.fc7 → オリジナル
 5764512  vmlinuz-2.6.21-1.3228.ps3 → 今回ビルド

しかしながら、ドライバーモジュールは以下のように、サイズが大きくなってしまいました。
   90392   ps3_storage.ko  → オリジナル
 397083 ps3_storage.ko  → 今回ビルド

Fedora7オリジナルのドライバーイメージは圧縮を行っているように思えるのですが、モジュールコンパイル時に圧縮を行うオプションが分からず、ドライバーのサイズを小さくする方法は不明です。ドライバーの数は大幅に削りましたが、合計のディスク占有量では今回ビルド分の方が大きくなってしまいました。

カーネルのサイズ自体は今回ビルドしたカーネルの方が小さいのですが、起動時(runlevel=3で起動)のメモリー量(freeコマンドの結果)を比べるとオリジナルカーネルの方が小さくなりました。
  オリジナルカーネル起動時の空きメモリー      : 146,644
  今回ビルドしたカーネル起動時の空きメモリー: 130,640

オリジナルカーネルは無駄なドライバーが多くメモリー効率が悪いと思っていたのですが意外な結果です。これだと、無理にカーネルを再構築するメリットはないと思います。

ps3fb_shudown問題のパッチ

冒頭の問題に関連しそうなパッチがLinuxppc-devのM/Lアーカイブにありましたが、Fedora 7のソースにはうまくパッチがあたりませんでした。そのため、shutdown時の問題を解消するためのパッチは断念しました。

ということで今回は、Fedora(ディストリビューション)添付のカーネルは結構優れモノであることがよく分かったというのが成果(?)でした。

« PS3にFedora 7とCell SDK 2.1をインストール | トップページ | Cellのmailbox機能 »

Linux」カテゴリの記事

コメント

素晴らしいサイトです。
もし宜しければ、協力をお願いできませんか?

この記事へのコメントは終了しました。

« PS3にFedora 7とCell SDK 2.1をインストール | トップページ | Cellのmailbox機能 »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ