外部ストレージをルートファイルシステムにする手順

1. 概要

このドキュメントでは、ルートファイルシステムを外部のストレージに置く手順について説明します。

Bishop のルートファイルシステム (Debian GNU/Linux 4.0 etch) がプリインストールされる NAND は書き込み速度が遅く、サイズも 128MB であるため、開発時のルートファイルシステムには不向きです。開発中のルートファイルシステムは外部ストレージに置くことをお勧めします。

以下の外部ストレージを対象とします。

  • USB ストレージ (USB メモリ、USB HDD)
  • SD カード
  • NFS マウントしたディレクトリ (NFS-Root)

以降では、作業を行うマシンを「ホスト」、Bishop を「ターゲット」と呼びます。

ホストの環境は Debian GNU/Linux を想定しますが、一般的な Linuxディストリビュージョンであれば手順に大きな違いはありません。

インストールするのは Debian GNU/Linux ベースのルートファイルシステムです。

2. Debian 基本システムの入手

Debian基本システムをダウンロードします。

debootstrap コマンドで作った Debian 基本システムに株式会社パイロンが Bishop 向けに独自の修正を加えたものです。 この Debian 基本システムに関する質問を Debian プロジェクトにすることはご遠慮ください。

3. ストレージの初期化

3.1. USB ストレージの場合

ホストに USB ストレージを接続します。

GNOME や KDE などのデスクトップ環境の場合、フォーマット済の USB ストレージが自動的にマウントされることがあります。自動的にマウントされた場合はアンマウントしてください。

# umount /dev/sda1

USB ストレージのデバイスファイルを /dev/sda とします。それ以外の場合は、適時読み替えてください。

パーティションは以下の構成とします。

sda1ルートファイルシステム
sda2swap

パーティションを作成するツールは色々ありますが、ここでは fdisk コマンドを使った簡単な例を紹介します。

Bishop とは直接関係のない fdisk コマンドの詳細な解説はしません。

# fdisk /dev/sda

Command (m for help):

fdisk は対話形式です。m コマンドを入力するとヘルプが表示されます。

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

ストレージ購入直後の既存パーティションを消して、新たにルートファイルシステムと swap のパーティションを作るのであれば以下のようになります。

既存のパーテションを削除:

Command (m for help): d
Selected partition 1

ルートファイルシステムのパーティションを作成:

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1011, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1011, default 1011): 995

swap パーティションを作成:

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (996-1011, default 996):
Using default value 996
Last cylinder or +size or +sizeM or +sizeK (996-1011, default 1011):
Using default value 1011

swap パーティションのタイプをセット:

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 83

変更を反映:

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks

最後に、ルートファイルシステムのパーティションをフォーマットします。ここでは Bishop のカーネルがデフォルトで対応している ext3 ファイルシステムでフォーマットします。

# mkfs.ext3 /dev/sda1

ここでは fdisk を紹介しましたが、libpartd の GUI フロントエンドであるgpartd (GNOME/Gtk+) や qtpartd (Qt) を試してみることをお勧めします。

gparted:

スクリーンショット

3.2. SD カードの場合

SD カードの場合、USB 変換アダプタを介してホストに接続することがほとんどであると思われます。その場合、ホストからは USB ストレージと同様にSCSI ディスクとして見えます。手順についても USB ストレージの場合と変わりません。

3.3. NFS-Root の場合

NFS ルートの場合、NFS サーバで 対象ディレクトリを export します。NFS サーバの設定については NFS サーバの設定 を参照してください。

4. Debian 基本システムの展開

USB ストレージや SD カードの場合、ルートファイルシステムを任意のディレクトリにマウントします。

# mount /dev/sda1 /ROOTFS

以降では、USB ストレージや SD カードをマウントしたディレクトリや NFS でエクスポートしたディレクトリを /ROOTFS とします。

ダウンロードした Debian 基本システムを /ROOTFS へ展開します。

# tar xjvf etch_arm_bishop-20081215.tar.bz2 -C /ROOTFS

展開した中身をひとつ上の階層に移します。

# mv /ROOTFS/etch_arm_bishop-20081215/* /ROOTFS/

空になったディレクトリ etch_arm_bishop-20081215 を削除します。

# rmdir /ROOTFS/etch_arm_bishop-20081215

5. マウント前の設定

各設定ファイルを編集します。

5.1. /ROOTFS/etc/fstab

5.1.1. USB ストレージ の場合
# <file system> <mount point>  <type> <options>                 <dump>  <pass>
proc            /proc          proc   defaults                    0       0
/dev/sda1       /              ext3   defaults,errors=remount-ro  0       0
/dev/sda2       none           swap   sw                          0       0

/dev/sda1, /dev/sda2 はターゲットのデバイスファイル名です。ホストのデバイスファイル名ではない点に注意してください。ターゲットに接続する USB ストレージがひとつだけであれば sda になります。

5.1.2. SD カードの場合
# <file system> <mount point>  <type> <options>                 <dump>  <pass>
proc            /proc          proc   defaults                    0       0
/dev/mmcblk0p1  /              ext3   defaults,errors=remount-ro  0       0
/dev/mmcblk0p2  none           swap   sw                          0       0
5.1.3. NFS-Root の場合
# <file system> <mount point>  <type> <options>                 <dump>  <pass>
proc            /proc          proc   defaults                    0       0

5.2. /ROOTFS/etc/network/interfaces

auto lo
iface lo inet loopback

# eth0 に DHCP で IP アドレスを割り当てる場合は
# 下の2行のコメントを外してください。
# auto eth0
# iface eth0 inet dhcp

# eth0 に静的 IP アドレスを割り当てる場合は
# 下の7行のコメントを外して、IP アドレス等を
# 設定してください。
# auto eth0
# iface eth0 inet static
#     address <IP アドレス>
#     network <ネットワークアドレス>
#     netmask <ネットマスク>
#     broadcast <ブロードキャスト>
#     gateway <ゲートウェイ>

NFS-Rootの場合、カーネル起動時にIPアドレスが割り当てられます。 /etc/network/interfacesで割り当てないようにしてください

5.3. /ROOTFS/etc/resolv.conf

search
nameserver <ネームサーバの IP アドレス>

DHCPサーバからネームサーバの IPアドレスを取得する場合、nameserver の行は要りません。

設定ファイルの編集が終わったらアンマウントします。

# umount /dev/sda1

6. カーネル起動パラメータの変更

ターゲットとホストをシリアルクロスケーブルで接続して、シリアルコンソールから U-Boot でカーネル起動パラメータを変更します。

シリアルコンソールの設定手順については クイックスタート を参照してください。 U-Boot については U-Boot リファレンスマニュアル を参照してください。

カーネルの起動パラメータ U-Boot の環境変数 bootargs で設定します。

6.1. USB ストレージの場合

Bishop # setenv bootargs root=8:1

root=/dev/sda1 のようにデバイスファイル名で指定することが出来ません。 デバイスのメジャー/マイナー番号で指定してください。理由については 起動パラメータrootについてを参照してください。

6.2. SD カードの場合

Bishop # setenv bootargs root=179:1

USB ストレージと同様、root=/dev/mmcblk0p1 のようにデバイスファイル名で指定することが出来ません。 デバイスのメジャー/マイナー番号で指定してください。理由については 起動パラメータrootについてを参照してください。

6.3. NFS-Root の場合

Bishop # setenv bootargs root=/dev/nfs nfsroot=<NFS サーバ IP>:/ROOTFS/ ip=<IP アドレス>:<サーバのIP><ゲートウェイのIP>:<ネットマスク>:<ホストネーム>:<デバイス>:<autoconf>

ip オプションでネットワーク設定のパラメータを ":" で区切って列挙します。最低限必要なのは IP アドレスです。

IP アドレス: 192.168.1.100/24 の場合:

ip=192.168.1.100:::255.255.255.0:::

ここでは 静的 IP アドレスを割り当てる方法を紹介しましたが、 ip オプションでは、DHCP、BOOTP、RARP などで動的に割り当てることもできます。 詳細はカーネル付属文書 Documentation/nfsroot.txt を参照してください。

7. 起動

7.1. USB ストレージ, SD カードの場合

USB ストレージや SD カードのルートファイルシステムをマウントするためにinitrd が必要になります。出荷状態の Bishop では、NOR の 00330000h に U-Boot 形式の initrd イメージが置かれています。まずはこの initrd イメージを SDRAM の 30800000h にコピーにします。

Bishop # cp 330000 30800000 30000

次に、bootm コマンドで initrd を指定して Linux を起動します。

Bishop # bootm 40000 30800000

各アドレスについてはアドレスマップ を 参照してください。

7.2. NFS-Root の場合

NFS-Root の場合は initrd は必要ありません。NOR 上のカーネルを起動するだけです。

Bishop # bootm 40000

8. ログイン

起動後にログインできるユーザは root です。初期状態ではパスワードは必要ありません。

シリアルコンソール (ttySAC0) と本体のコンソール (ttyS) からログインできます。

9. 起動後の設定

9.1. root のパスワード

bishop:~# passwd
Enter new UNIX password: ←パスワードを入力
Retype new UNIX password: ←もう一度パスワードを入力
passwd: password updated successfully

9.2. APT の設定

必要であれば、/etc/apt/sources.list を編集します。

デフォルトの sources.list:

deb http://ftp.jp.debian.org/debian etch main

取得可能なパッケージの一覧を更新します。

aptitude update

9.3. タイムゾーンの設定

タイムゾーンの設定をします。

以下は Asia/Tokyo の場合です。

bishop:~# tzconfig
Your current time zone is set to Unknown
Do you want to change that? [n]: y

Please enter the number of the geographic area in which you live:


        1) Africa                       7) Australia

        2) America                      8) Europe

        3) US time zones                9) Indian Ocean

        4) Canada time zones            10) Pacific Ocean

        5) Asia                         11) Use System V style time zones

        6) Atlantic Ocean               12) None of the above


Then you will be shown a list of cities which represent the time zone
in which they are located. You should choose a city in your time zone.

Number: 5  ← Asia の 5

Aden Almaty Amman Anadyr Aqtau Aqtobe Ashgabat Ashkhabad Baghdad Bahrain
Baku Bangkok Beirut Bishkek Brunei Calcutta Choibalsan Chongqing Chungking
Colombo Dacca Damascus Dhaka Dili Dubai Dushanbe Gaza Harbin Hong_Kong
Hovd Irkutsk Istanbul Jakarta Jayapura Jerusalem Kabul Kamchatka Karachi
Kashgar Katmandu Krasnoyarsk Kuala_Lumpur Kuching Kuwait Macao Macau
Magadan Makassar Manila Muscat Nicosia Novosibirsk Omsk Oral Phnom_Penh
Pontianak Pyongyang Qatar Qyzylorda Rangoon Riyadh Riyadh87 Riyadh88
Riyadh89 Saigon Sakhalin Samarkand Seoul Shanghai Singapore Taipei
Tashkent Tbilisi Tehran Tel_Aviv Thimbu Thimphu Tokyo Ujung_Pandang
Ulaanbaatar Ulan_Bator Urumqi Vientiane Vladivostok Yakutsk Yekaterinburg
Yerevan

Please enter the name of one of these cities or zones
You just need to type enough letters to resolve ambiguities
Press Enter to view all of them again
Name: [] Tokyo
Your default time zone is set to 'Asia/Tokyo'.
Local time is now:      Thu Aug 16 23:00:18 JST 2007.
Universal Time is now:  Thu Aug 16 14:00:18 UTC 2007.

9.4. キーボードの配列

キーボードの配列 (keymap) を設定します。

bishop:~# aptitude install console-common console-data

インストール中に表示されるパッケージ設定画面からキーボードの配列を設定できます。日本語の USB キーボードを使う場合は以下の順で選択すればいいでしょう。

  • "Select keymap from arch list"
  • qwerty
  • Japanese
  • Standard

9.5. mtd-tools

Bishop 上で NOR や NAND の消去・書き込みを行う場合、mtd-tools をインストールします。

bishop:~# aptitude install mtd-tools

9.6. udev

udev をインストールします。

bishop:~# aptitude install udev

udev の RTC は /dev/rtc0 ですが、hwclock コマンドは/dev/rtc を開こうとするため、RTC にアクセスできません。これを回避するためには /etc/udev/links.conf に以下の行を追加してください。

L rtc /dev/rtc0

10. Tips

10.1. 起動の自動化

U-Boot のコマンドを環境変数 bootcmd に保存すれば起動を自動化できます。

USB ストレージの場合:

Bishop # setenv bootargs root=8:1
Bishop # setenv bootcmd cp 330000 30800000 30000 \; bootm 40000 30800000
Bishop # saveenv

bootcmd に複数のコマンドを設定する場合、コマンドの区切り文字は "\;" になります。";" はコマンドの終端で、"\" はエスケープ文字です。

cc