電話でね!♪ Hm Hm♪ Linux on the Phone!♪2007/03/17 22:59


タイトルのフレーズで曲が頭に浮かんだあなた!よっぽどのOldies好きで無い限り、結構なお年ですな。

WX321Jを購入した理由の一つに挿入したmicroSDがUSBストレージで使えるので、それにLinuxをインストールして電話から立ち上げたかった事が大きい。

単にこのタイトルを謳いたかったっす。

母艦はThinkpad X40、OSはもちろんGentoo Linux。

まず、X40でSDカードの認識をさせる。X40でのSDカードの認識にはmmc_core、sdhci、mmc_blockが必要。kernelのconfigで
MMC/SD Card support  --->
     <M>  MMC support                                                                                                                                        
     <M>  MMC block device driver                                                            
     <M>  Secure Digital Host Controller Interface support (EXPERIMENTAL)
として上記のモジュールを有効にしてkernelを再構築する。もし、モジュールじゃなくてkernelに組み込みたかったら<M>を<*>にする。さらっとググったところによると、モジュールにするとudevのruleを書いても自動でモジュールを読み込んでくれないらしい。スロットは問題無いけど。で、挿入したSDカードを認識させるには、root権限で以下を実行。
modprobe mmc_block
購入したSDカードはmicroSDカードでSD、miniSD両方のアダプタを持ったpqiの1Gのもの。 まずは、パーティション分割して、WX321Jが使う部分とLinux部分を分ける。電話で使うデータは大した事は無いと思うので、電話:128MB、Linux:残り全部にする。電話からはLinux用のパーティションはどうせ見えないので、Linux用のファイルシステムはext3にする。まずは、SDカードのマウントを解除。
xxxxx# umount /mnt/vfat
次にfdiskでの作業。まずはSDのパーティション情報の確認。
xxxxx # fdisk /dev/mmcblk0

このディスクのシリンダ数は 30480 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/mmcblk0: 998 MB, 998768640 bytes
4 heads, 16 sectors/track, 30480 cylinders
Units = シリンダ数 of 64 * 512 = 32768 bytes

  デバイス Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1       30480      975352    6  FAT16

コマンド (m でヘルプ):
次に現在のパーティションを削除して、結果を確認。
コマンド (m でヘルプ): d
Selected partition 1

コマンド (m でヘルプ): p

Disk /dev/mmcblk0: 998 MB, 998768640 bytes
4 heads, 16 sectors/track, 30480 cylinders
Units = シリンダ数 of 64 * 512 = 32768 bytes

  デバイス Boot      Start         End      Blocks   Id  System

コマンド (m でヘルプ):
で、新たなパーティション作成。第一パーティションを電話で使う領域、第二パーティションをLinuxにする。第一領域をFAT16にするのを忘れずに。
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-30480, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-30480, default 30480): +128M

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 2
最初 シリンダ (3908-30480, default 3908):
Using default value 3908
終点 シリンダ または +サイズ または +サイズM または +サイズK (3908-30480, default 30480):
Using default value 30480

コマンド (m でヘルプ): t
領域番号 (1-4): 1
16進数コード (L コマンドでコードリスト表示): 6
領域のシステムタイプを 1 から 6 (FAT16) に変更しました

コマンド (m でヘルプ): p

Disk /dev/mmcblk0: 998 MB, 998768640 bytes
4 heads, 16 sectors/track, 30480 cylinders
Units = シリンダ数 of 64 * 512 = 32768 bytes

  デバイス Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1        3907      125016    6  FAT16
/dev/mmcblk0p2            3908       30480      850336   83  Linux

コマンド (m でヘルプ):
最後に実際に領域を作成。
コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: DOS 6.x 領域を作成、または変更してしまった場合は、
fdisk マニュアルの追加情報ページを参照してください。
ディスクを同期させます。
これで領域が出来たので、次はそれぞれのパーティションにファイルシステムを作成。 それぞれ以下を実行。
xxxxx # mkfs.vfat -F 16 /dev/mmcblk0p1

xxxxx # mkfs.ext3 /dev/mmcblk0p2
WX321JでSDカードを初期化する。メニューから「データフォルダ」→「メニュー」→「microSD初期化」。 で、中身の確認。
xxxxx # mount -t vfat /dev/mmcblk0p1 /mnt/sd
xxxxx # ls /mnt/sd
dcim  private  sd_bind
fat16部分はこれで特にすることは無い。次はいよいよLinuxの準備。使用ディストリビューションは色々考えたが、CD1枚強のスペースがある事から、1CD Knoppixを使う事にする。DL サイトからknoppix_v5.1.1CD_20070104-20070122+IPAFont_AC20070123.isoをget。
このイメージを/mnt/cdromにマウント。
xxxxx # mount -t iso9660 -o loop knoppix_v5.1.1CD_20070104-20070122+PAFont_AC20070123.iso  /mnt/cdrom
xxxxx # ls /mnt/cdrom
Aist     README.install2win.ja  autorun.inf  boot       grub4dos    install2win.bat         version.txt
KNOPPIX  autorun.bat            autorun.pif  cdrom.ico  index.html  ipa-fonts-document.pdf
ここではLinuxパーティションのマウントポイントを仮に/mnt/ext3とする。
xxxxx # mount /dev/mmcblk0p2 /mnt/ext3
必要なファイルを/mnt/cdromから/mnt/ext3にコピー。
xxxxx # cp -a /mnt/cdrom/{boot,KNOPPIX} /mnt/ext3
xxxxx # ls /mnt/ext3
次にgrubのインストール。この状態ではgrubがSDカードを有効なデバイスとして認識しないので、一旦WX321Jに差し戻して、WX321JのUSBストレージ機能を使ってインストールする。
xxxxx # umount  /mnt/ext3
WX321J上でSDカードを初期化した段階からUSBストレージ機能を使って進めても良かったんやけど、一応SDカードでの認識をX40で確認したかったので、ちょっとややこしくなった。で、WX321J上で「USBデータストレージ」を開始して、電話とX40をUSBケーブルで繋ぐ。この状態で電話は/dev/sdaとして認識されている。まずは/boot/grubを/dev/sda2上の/bootにコピーする。
xxxxx # mount /dev/sda2 /mnt/ext3
xxxxx # cp -a /boot/grub /mnt/ext3/boot
xxxxx # ls /mnt/ext3/boot/grub
default        ffs_stage1_5      jfs_stage1_5    pxegrub            stage2           ufs2_stage1_5
device.map     grub.conf         menu.lst        reiserfs_stage1_5  stage2.netboot   vstafs_stage1_5
e2fs_stage1_5  grub.conf.sample  minix_stage1_5  splash.xpm.gz      stage2.old       xfs_stage1_5
fat_stage1_5   iso9660_stage1_5  nbgrub          stage1             stage2_eltorito
xxxxx # umount /mnt/ext3
では、実際にgrubコンソールで、/dev/sda(SDカード)のMBAにgrubをインストールする。grubでは、この場合はsdaはhd1になる。
xxxxx # grub

grub> root (hd1,1)
 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd1)"...  15 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd1) (hd1)1+15 p (hd1,1)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

grub> quit

xxxxx # 
最後に/mnt/ext3/boot/grub/menu.lstの編集。/mnt/ext3/boot/isolinux/isoliunux.cfgを参考に以下のように書き換える。
/mnt/ext3/boot/grub/menu.lst:
timeout 8

title Linux on the Phone (Powered by Knoppix)
root (hd0,1)
kernel /boot/isolinux/linux ramdisk_size=100000 init=/etc/init lang=ja BOOT_IMAGE=knoppix
initrd /boot/isolinux/minirt.gz 
rootがhd0になってるのは、WX321Jが起動ドライブになるため。
で、これでX40を再起動。ブートデバイス選択でWX321Jを含むメニューが出てくるのにちょっと手間取る。ブートデバイスでWX321Jを選ぶと、見事にgrubも立ち上がり、Knoppixも立ち上がる。上の画像がその画面。まーまーストレス少なく使える。

でもね、やっぱりね♪ 電話じゃ物足りない。♪

今後はKnoppixじゃ無くて、やっぱGentooにしようと思う。

※尚、上記の方法は私個人の環境で試しての結果なので、同様の方法で成功する保証はありません。また、上記方法を試してのデータ損失、故障などを被った責任は当方には一切ありません。自己責任でお試しください。