2010/04/25

BeagleboardのDebian lennyを入れたSDカードでnilfs2を試す

いままでSDカード全体をext3でフォーマットしていたのですが、一部のディレクトリで書き込みができなくなってしまったので、他のSDカードでパーティションを増やし、 nilfs2を使うことにしました。

いきなりnilfs2の領域を作成してインストールすることはできないので、まずは普通にext2/ext3でフォーマットしたSDカードにdebian lenny環境を構築しておきます。 ここからは別のSDカードにnilfs2の領域を作成して、引っ越した時の状況をメモしておきます。

進め方

すでにSDカード上にdebian lennyが導入されているので、待ち受け側のSDカードにnilfs2用のパーティションを追加してファイルをコピーするだけです。

ただし、カーネルがnilfs2をサポートしているか確認が必要です。 手元の2.6.32.6-x6.2ではnilfs2.koがないのですが、2.6.32.11-x13には含まれています。 できるだけ安定している最新のカーネルを使うべきでしょう。

配布されているカーネルではnilfs2はカーネルモジュールなので、起動時のパーティションには引き続きext2/ext3が必要です。

SDカードのパーティショニング

いま稼働しているSDカードは2GBのもので、次のようなパーティションに分かれています。 /dev/mmcblk0p3をext3な最小限の部分と、残りをnilfs2な領域に分割します。

稼働中SDカードのパーティション

Disk /dev/sdg: 2014 MB, 2014838784 bytes
64 heads, 63 sectors/track, 976 cylinders
Units = シリンダ数 of 4032 * 512 = 2064384 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1         125      251968+   6  FAT16
/dev/mmcblk0p2             126         250      252000   82  Linux swap / Solaris
/dev/mmcblk0p3             251         976     1463616   83  Linux

次のようなSDカードを別に準備しました。

nilfs2をロードするまでに必要となる/sbin, /bin, /lib, /etcなどはext2/ext3な領域に配置する必要があります。 今回は/dev/mmcblk0p4をnilfs2にフォーマットし、/usr, /var, /homeを配置することにしました。

移動先カードのパーティション

Disk /dev/mmcblk0: 2021 MB, 2021654528 bytes
20 heads, 19 sectors/track, 10390 cylinders
Units = cylinders of 380 * 512 = 194560 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1               1         659      125200+   6  FAT16
/dev/mmcblk0p2             660        1976      250230   82  Linux swap / Solaris
/dev/mmcblk0p3            1977        3293      250230   83  Linux
/dev/mmcblk0p4            3294       10390     1348430   83  Linux

ちなみに /dev/mmcblk0p1 は、USBカードリーダを通して普通のPCでmountすると/dev/sdg1のようになります。 "mmcblk0"が"sdg"、"mmcblk0p1"が"sdg1"のようになる感覚です。

'w'コマンドでfdiskを終了してから、各パーティションをフォーマットします。

フォーマット

各パーティションに合った

$ sudo mkfs.vfat /dev/sdg1
$ sudo mkswap /dev/sdg2
$ sudo mke2fs -j /dev/sdg3
$ sudo mkfs.nilfs2 /dev/sdg4

もし必要ならfsckが走らないようにtune2fsで/dev/sdg3の設定を変更しておきます。

$ tune2fs -c 0 -i 0 /dev/sdg3

Debian lenny x86_64版でのファイルの引っ越し

beagleboardにUSB経由でSDカードアダプタを接続しようとしましたが、I/O負荷が高くなった時にUSBポートが安定的に稼働するか自信がなかったので、VMWare上のdebian lennyでカーネルを作業を行ないました。

Debian lenny x86_64版でのnilfs2の有効化

対応するモジュールが準備されているので、それを導入します。

$ sudo apt-get install nilfs2-modules-$(uname -r)
$ sudo apt-get install nilfs2-tools
オリジナルSDカードからのバックアップの作成

まずはオリジナルのSDカードの各パーティションの内容をtar形式でバックアップを作成しておきます。 あらかじめ$ sudo mkdir /mnt/sdで/mnt以下にマウントポイントを作成しておきます。

$ sudo mount /dev/sdg1 /mnt/sd
$ cd /mnt/sd
$ sudo tar czf ~/mmcblk0p1.tar.gz .

あとは同じようにmmcblk0p3.tar.gzを作成します。

待ち受け先SDカードの準備作業

nilfs2が有効になったdebian lennyにSDカードを認識させて、fdiskでパーティションを切っていきます。

それから各パーティションをマウントして、バックアップからファイルシステムを戻していきますが、"/dev/mmcblk0p3"は'/'(root)にマウントし、"/dev/mmcblk0p4"は'/nilfs2'にマウントします。

その上で次のようにシンボリックリンクを使い、'/usr', '/var', '/home'を準備しておきます。

$ tree .

マウントポイントからみたディレクトリ構造

.
|-- home -> nilfs2/root.home
|-- lost+found
|-- nilfs2
|   |-- root.home
|   |-- root.usr
|   `-- root.var
|-- usr -> nilfs2/root.usr
`-- var -> nilfs2/root.var

これでバックアップを展開すれば'/usr', '/var', '/home'などは自動的に/nilfs2以下にファイルが作成されます。

"/dev/mmcblk0p1"はFAT領域で、単純にバックアップからtarで戻せばOKです。

起動時にnilfs2モジュールをロードする

起動時にカーネルモジュールをロードする方法は、ディストリビューションによって違いがあります。

Debianでは/etc/modulesに、起動時にロードさせたい名前を記入します。

/etc/modulesファイルの内容 (コメント、空行は除く)

loop
nilfs2

beagleboardでの稼働

基本的にはここで作成したSDカードをbeagleboardに差し込んでうまく動いています。

ただしbeagleboardではカーネルに統合されたnilfs2ドライバを使っているため、nilfs2本家のFAQにあるようにapt-getで入手できるnilfs2-toolsパッケージとは互換性がありません。

そこでlscpなどのnilfs2に固有のコマンドはnilfs-utils-2.0.18をコンパイルして使っています。 xstowを使うために--prefixオプションでインストール先を変更しましたが、/etc/nilfs_cleanerd.conf, /sbin/mkfs.nilfs2などのコマンドのインストール先は標準では変更することができないようになっています。

これらのファイルは手動で配置しています。独自にパッケージを作成するのであれば、既存のnilfs2-toolsのソースファイルを展開して参考にするのが良いでしょう。

さいごに

ext2/ext3のようにあらかじめカーネルに組み込まれていれば良いんですが、 ARM用にカーネルの再構築を試していないのと、beagleboard実機でのカーネルコンパイルはおそろしく時間がかかりそうなので試していません。

また、次のようなログがシステムに出力されているため、原因についても少し追い掛けてみようと思っています。

現在dmesgに出力されているエラーメッセージ

[56527.452941] NILFS error (device mmcblk0p4): nilfs_check_page: bad entry in directory #14570: unaligned directory entry - offset=0, inode=134777631, rec_len=770, name_len=99
[56527.478210] NILFS error (device mmcblk0p4): nilfs_readdir: bad page in #14570
[73378.520874] NILFS error (device mmcblk0p4): nilfs_readdir: bad page in #14570

0 件のコメント: