いままで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な領域に分割します。
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に、起動時にロードさせたい名前を記入します。
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実機でのカーネルコンパイルはおそろしく時間がかかりそうなので試していません。
また、次のようなログがシステムに出力されているため、原因についても少し追い掛けてみようと思っています。
[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 件のコメント:
コメントを投稿