新学期である。入学、進学、就職など、新しい道に進む人も、それほど生活がかわらない人も、また(筆者のように) 旧年度の宿題がいまだに終わらない人も、新しい場所で新しい人との出会いが生まれるのがこの季節である。
本特集の最終回を飾る今回、新学期を祝して「世界最小の(?)携帯FreeBSD環境」をとりあげよう。USBフラッシュメモリやハードディスクにFreeBSDをインストールして使ってみるという話題である。このテクニックを使えば、フラッシュメモリひとつ持ち歩くだけで、いつでもどこでもFreeBSDが使えるだけでなく、FreeBSDの用意する魅力的な環境を、簡単に友人と分かち合えるという、実用性たっぷりの便利なテクニックである。
USBデバイスでFreeBSDを使う
フラッシュメモリやハードディスクなど、ストレージデバイスの大容量化と価格低下はとどまることを知らない。これは筆者が専門とする「半導体デバイス」が「ムーアの法則※1 」に従って驚異的なスピードで微細化=大容量化を果たしてきたからである。お蔭で一昔前では高嶺の花であった容量のデバイスが簡単に入手できるようになった。ハードディスク容量の伸びは半導体のそれをさらに上回り、3.5インチのバルクものであれば、1Tバイトでも1万円を切り、2.5インチハードディスクでも500Gバイトで1万円を切るなど、最早「なんでもあり」の世界である。
[1] インテルのゴードン・ムーア氏が40年も前に行った予言で、「 集積度は3年で4倍になる」というもの。数値はともかく、何度も「壁」が囁かれながら「x年でn倍」の右肩上がり成長が40年も持続したことは手放しに素晴しい。
ここで、われらがFreeBSDのインストールに必要なディスク容量を調べてみよう。筆者の調べによると、
「Minimal」でインストールした直後は257Mバイト
「X-user」でインストールした直後は596Mバイト
筆者の最低限のLaTeX環境(OpenOffice含まず)で1.8Gバイト
筆者のFreeBSD常用環境で6.8Gバイト
などと、今となっては驚くに値しないディスク容量しか消費しない。そうとわかれば、4Gバイトのフラッシュメモリを秋葉原の投げ売り価格で750円といった価格で入手できる今、USBストレージにFreeBSDをインストールして使う のが今時のファッショナブルであろう。内蔵ハードディスクを必要としないFreeBSD といえば、嚆矢といえる「floppy-1」をはじめ、1CDで動くFreeBSDとしてイタリアのFreeBSDユーザーズグループ(GUFI)が中心となって開発されている「FreeSBIE」とか、Linux方面では「Knoppix」が有名である※2 。
これらと比較して、USBストレージデバイスでFreeBSDを使う優位点は言うまでもなく、
といった「拡張性」 、さらに
まったく普通の使い方でデータの書き込みができる※3
自分が常用している「俺的環境」を他人に丸ごとコピーしてあげられる
といった「利便性」である。御利益をやかましく言わずとも、MicroSDのような豆粒ほどのデバイスにも完全なFreeBSDがインストールできてしまうのを知ると損得抜きで感動し、「 世界最小(当社比)のUNIXシステムって、cool!」 と言いたくなるものである 。早速手品の種明かしをしよう。
USBメモリでFreeBSD[インストール編]
!警告!
本記事で紹介するやり方は、デバイス名やデバイス番号を間違うと、お使いのPCのデータを壊してしまうおそれがあるので、「 自分の手で打っているコマンドが何をしようとしているのか(自分が何をしたいか、ではないことに注意) 」を1つ1つ指差し点検しながら行うことに注意されたい。環境によって、一字一句コピーしてはならない(臨機応変に読み替えが必要)こともあるので用心が必要だ。
「あとで泣くのはあなたですから」であって、打ち間違えによるデータの紛失には筆者ならびに技術評論社は責任を負いかねるのであらかじめお断りしておく。
今回試したUSBストレージデバイスは、どれも秋葉原で安売りをしていたもので、
Transcend 4Gバイト USBフラッシュメモリ
Kingmax 4Gバイト USBフラッシュメモリ
Kingston 4Gバイト MicroSDカード + MicroSD USB2.0アダプタ
と、
Seagate 500Gバイト 2.5" SATA HDD + センチュリーマイクロ USB 2.0 アダプタ
である。
図1 USBストレージデバイス。容量は全部合わせて512Gバイト!
テストの母艦は筆者手持ちの2台のノートパソコン、2007年秋モデルのLet's Note CF-W7と、2002年限定バージョンのThinkPad X30である。これらのマシンでは、USBストレージを起動デバイスに指定することができる。図2 の写真は、Let's Note CF-W7にUSBメモリをさしこんで起動し、起動画面でF2
を押してBIOS設定画面を表示したところである。起動順位2番目に、USB HDDとして差し込んだTranscend社の4Gバイトメモリが認識されていることが見てとれる。
図2 BIOSではUSB HDDとして認識した
このように、USB HDD(など)としてメモリを認識するPCでは、FreeBSD をUSBストレージデバイスから起動できる可能性が高い※4 。
インストールは「まったく通常の」手順で行えばよい。図2 のように、USB HDDよりもCD(DVD)の方が優先して起動できるようにBIOSを設定しておいて、FreeBSD 7.1-RELEASEのインストールCD-ROMとUSBメモリとを挿入してマシンを起動する。そうすると、USBメモリがおなじみの「da(SCSI Direct Access device driver)」デバイスとして認識され、インストール可能になる。
図3 は「Custom Install」 →「 Pattition Editor」を選択したところで、内蔵ハードディスクが「ad4」として、USBメモリが「da0」として認識されている。ここで「ad4」を選んで下手な操作をしてしまうと最悪の場合※5 既存ハードディスクの内容を壊してしまうことも考えられるので、ここは慎重に下矢印キー(↓)で「da0」をハイライトして「スペースバー」を押す。
図3 「 da0」を選択することに注意すれば、あとは通常のインストール
市販されているUSBメモリは、Windows でおなじみの FAT(File Allocation Table)形式でフォーマットされているので、D
キーを1回押して一旦パーティションを削除した後、A
キーを1回押して全領域をFreeBSDで使うことにする。Q
キーで抜けるときに、ブートマネージャーをどうするか聞かれるので、「 Standard」もしくは「BootMgr」を選択する※6 。
図4 「 FAT」を削除
図5 「BootMgr」または「Standard」を選択
次に、「 Disklabel」である。特に、今回用意したUSBメモリは容量が4Gバイトと小さめ であるので、スライスの切り方には十分注意が必要である。
ディスクの無駄を無くしたいという意味では全ての領域をルートパーティション(da0s1a)に取りたい
ところだが、
ルートパーティション(/)にはSoft Updates※7 がかからないため、全てをルートパーティションに割り当ててしまうと、スピードが低下する
のだ。そこで、ルートパーティションは必要最小限の大きさにして、残りを全て/usrに割り当てる ことにする。/の必要最小量は164Mバイトだが、カーネルの再構築を行う可能性を考えて、500~750Mバイトを割り当てることにする。また、スワップパーティションは今回は作らないので※8 、「 no swap partition」の警告が出ても無視する。以上に注意すれば、あとは「至極普通の」インストールを行えばOKである。
インストール後は、最低限でも以下の3点と、ルートパスワードの設定程度は行っておこう。
「Time Zone」: UTC以外にセット)No) →Japan(JST)
「ネットワーク(特にホスト名)の設定」: 「 DHCP」を試してみるのが妥当だろう。
「マウス」: PCの内蔵マウスの場合、「 Options」に「-3」をセットしておいて「Enable」でマウスカーソルが動くはずである。
USBメモリでFreeBSD[使用編]
まず、利用する母艦マシンに合った、X Window Systems設定ファイルを生成する必要がある。root権限で、
# X -configure
と入力して生成される /root/xorg.conf.newファイルを元に設定する。ほとんど変更点は無いが、日本語キーボードを使っている場合は以下の設定を追加する。
リスト1 X設定ファイルへの追加
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbLayout" "jp"
Option "XkbModel" "jp106"
Option "XkbOptions" "ctrl:ctrl_ac"
EndSection
また、残念ながらCF-W7のビデオチップにはFreeBSD 7.1-RELEASE付属のXサーバは完全には対応していないので、「 Section "Device"」中の1行
Driver "intel"
を、
Driver "vesa"
に変更することで動くようになる。このように、"vesa"ドライバは専用のドライバに比べて性能は劣るものの確実性が高いので、ネイティブのドライバが公開されるまでの「つなぎドライバ」として憶えておくとよい。
図6 が、Transcend社 4GバイトUSBメモリからFreeBSDを起動して、Xを立ち上げ、その上で筆者が常用しているLaTeX環境を実行しているところである。日本語入力はddskk、firefoxなどもばっちり動作する。本例、Transcend 4GバイトUSBの成功にひき続き、Kingmax 4GバイトUSB、Kingston 4GバイトMicroSDの全てについてFreeBSD 7.1-RELEASEをインストールし、Xの起動に成功した。
リスト2 ~/.xinitrc
#!/bin/sh
kterm -sb -km euc &
exec fvwm2
図6 Transcend 4GバイトUSBメモリから起動したFreeBSD
インストールをしてみた感想として、「 メモリの書き込みにかなり時間を取られている」印象がある。たとえばTranscend社の4Gバイトメモリにアプリケーションまでインストールするのに数時間を必要とした他、使用途中にたまにOSが1、2秒ほど反応しなくなることがある。
これは、物理的にフラッシュメモリにデータを転送するところで時間がかかっていることが原因なので、いかんともしがたいところである。/tmpや/var/tmpをメインメモリに展開する※10 とか、/usrパーティションにシンボリックリンクを張って高速化する、などの工夫が役立つだろう。
[10] ただし、ディスクへのスワップ無しで運用していることから、特にメモリ容量が小さいときには無制限に利用できるわけでないことと、/var/tmp/texfonts/以下のLaTeXで自動作成したフォントなど、できれば残しておきたいデータも電源を切ったら消えてしまうことに注意が必要。
# rm -rf /var/tmp
# mkdir /usr/tmp
# chmod 777 /usr/tmp
# ln -s /usr/tmp /var/tmp
USBハードディスクでFreeBSD
(問題なく使えるものの、)ディスクアクセスが遅いので辛抱が必要なUSBフラッシュメモリと比較して断然有利なメディアはやっぱりハードディスクである。となればUSB2.0接続の外付けハードディスクや、手持ちの余ったハードディスクを市販のUSB接続アダプタやケースに収納して接続すればよい。FreeBSDマシンに接続して「da0」デバイスとして認識されれば、そこにインストールすれば完璧である。
…と思いきや、筆者が今回利用したSATA/IDE-USBアダプタでいきなり例外に遭遇した。既に立ち上がっているFreeBSD上では問題なく認識され、認識された後は「da0」として普通に読み書きできるのだが、いざFreeBSDをインストールしようとすると、インストーラが「da0」を見つけてくれないのだ。
umass0: <JMicron USB to ATA/ATAPI Bridge, class 0/0, rev 2.00/1.00, addr 2> on uhub6
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <ST950032 5AS SDM1> Fixed Direct Access SCSI-2 device
da0: 40.000MB/s transfers
da0: 476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)
この現象をよく観察してみると、普通のUSBフラッシュメモリが挿して認識されるまでに1秒とかからないのと比較して、本アダプタは、
ハードディスクが回転しはじめるまでに、8秒
認識結果が表示されるまでに、さらに4秒
と、合計12秒もの時間がかかっている。これが諸悪の根源とわかった。
単純に待ち時間だけの問題なので、インストーラでは、図7 のように「Options」画面で↓キーとスペースキーとを使って、「 Re-scan Devices」を選択し、再度デバイスの検索をかけることで、無事「da0」が選べ、インストールが完了した。
図7 デバイスの再検索をかける
ところが、このハードディスクから起動をしようとしても、残念ながらリセットからデバイス認識までの「12秒」は長すぎるので、ハードディスクを認識する前にPCがOSを読みに行ってしまい、起動ができない。接続ケーブルが二股に分かれているのをよいことに※11 「データ線と電源線を2台のコンピュータに接続するして、電源を別のコンピュータから供給しつづける」という裏技を使うことで見事! 起動には成功した。したのだが、ルートパーティション「da0s1a」のマウントに認識が間に合わず、結局起動に失敗してしまう。
そこで一計を案じて、図8 のように、
USBフラッシュメモリと、USBハードディスクとを2枚挿し、
フラッシュメモリからkernelを起動して、
認識するまで十分(15秒とか)待って/usr、/var、/tmp(と/homeと)はハードディスクのものを利用する
という戦略を試したところ、こんどは完璧に動作した。
図8 USBフラッシュで起動、ユーザランドはUSB HDD
具体的な手順は以下のとおりである。
1. USBフラッシュメモリに、「Minimal」で7.1-RELEASEをインストールする
2. USBハードディスクに、通常使用する(「X-Kern-Developer」等)7.1-RELEASEをインストールする。パッケージもフルインストールする
筆者は、たとえば以下の構成でインストールを行った。
USBフラッシュメモリ
/dev/da0s1a /
512Mバイト(1Gバイトでもよいだろう)
/dev/da0s1d /usr
3.2Gバイト(残り領域。2Gバイト以上あれば概ね十分)
USBハードディスク
/dev/da0s1f /usr
16Gバイト
/dev/da0s1e /tmp
2Gバイト
/dev/da0s1d /var
2Gバイト
/dev/da0s1g /home
440Gバイト
3. USBフラッシュメモリのfstabを書き換える
動いているFreeBSDマシンを用意して、USBフラッシュメモリとUSBハードディスクを順番に挿しこみ、/パーティションをマウントする。たとえばUSBメモリ(先に挿す)を/mntに、ハードディスクを/mnt/mntにマウントしてみよう。
# mount /dev/da0s1a /mnt
# mount /dev/da1s1a /mnt/mnt
続いて、フラッシュメモリ上の/etc/fstab(ここでは/mnt/etc/fstab)に、ハードディスク上のfstab(ここでは/mnt/mnt/etc/fstab)の内容を追記して編集する。くれぐれも、>> が「>2個」であることに注意が必要だ。 さもなくば追記ではなく置き換えになって、前の情報が消えてしまう。
# cat /mnt/mnt/etc/fstab >> /mnt/etc/fstab
# ee /mnt/etc/fstab
フラッシュメモリとハードディスクと、両方の由来のデータがごちゃごちゃして読みにくいが、これを、
フラッシュメモリー(da0s1)からは、/をマウント
ハードディスク(da1s1)からは、/home、/tmp、/usr、/varをマウント
するように書き換える※12 。
リスト3 合成直後、書き換え前の/mnt/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/da0s1a / ufs rw 1 1
/dev/da0s1d /usr ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
# Device Mountpoint FStype Options Dump Pass#
/dev/da0s1b none swap sw 0 0
/dev/da0s1a / ufs rw 1 1
/dev/da0s1g /home ufs rw 2 2
/dev/da0s1e /tmp ufs rw 2 2
/dev/da0s1f /usr ufs rw 2 2
/dev/da0s1d /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
リスト4 書き換え後の/mnt/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
# at USB memory (da0s1)
/dev/da0s1a / ufs rw 1 1
# at USB HDD (da1s1)
/dev/da1 s1g /home ufs rw 2 2
/dev/da1 s1e /tmp ufs rw 2 2
/dev/da1 s1f /usr ufs rw 2 2
/dev/da1 s1d /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
4. フラッシュメモリの/etc/rcに、時間待ち命令を追加
ファイルシステムをマウントする前に、「 15秒(とか20秒とか) 」待つという命令を追加する。
# ee /mnt/etc/rc
システムが起動を待っている間にハードディスクが反応して、デバイス「da1」として認識が完了してくれるという塩梅である※13 。たとえば筆者はリスト5 のような2行を追加した。
リスト5 /mnt/etc/rcに追記する部分
# Run these after determining whether we are booting diskless in order
# to minimize the number of files that are needed on a diskless system,
# and to make the configuration file variables available to rc itself.
#
echo "Waiting for 15 seconds."
sleep 15
. /etc/rc.subr
echo "Loading configuration files."
load_rc_config 'XXX'
5. 再起動
一応礼儀として、手動マウントしたファイルシステムをアンマウントしておいてから、再起動を行う。
# umount /mnt/mnt
# umount /mnt
# shutdown -r now
図9 メモリとHDDの「2枚挿し」でFreeBSD起動
図9 のように、フラッシュメモリからkernelが読み込まれ、デバイスプローブ、続いて15秒の待ち時間の間にハードディスクが認識され、ハードディスクから残りのファイルシステムのマウント、起動プロセスという順番に、無事おなじみのFreeBSDを起動することができた※14 。
[14] ただし、このKingmax製のメモリは若干製造不具合? なのか、ファイルの展開途中などで何回か動かなくなることが見うけられた。内蔵ハードディスクなみの信頼性はまだ無いと割り切って利用する必要があろう。
[おまけ]携帯電話でFreeBSDを起動する
ハードディスク上のFreeBSDを呼び出すために使ったメモリはMicro SDカードなので、携帯電話機「FOMA P-01A」にFreeBSDの入ったMicro SDを差し込んでPCにつなぐとどうなるのだろうか? と思って試してみた。結果は驚くなかれ、「 普通にFreeBSDのファイルシステムとしてマウント利用可能」なだけでなく、「 携帯電話機(のMicroSD)を接続したコンピュータで、携帯電話機(のMicroSD)からFreeBSDが起動できてしまう 」のである。
FOMAは「メニュー」 →「 設定」 →「 その他」 →「 USBモード設定」で、「 microSDモード」にしておくと、FreeBSDに接続したときに「da0」デバイスとして認識してくれる。
umass0: on uhub3
da0 at umass-sim0 bus 0 target 0 lun 0
da0: Removable Direct Access SCSI-4 device
da0: 1.000MB/s transfers
da0: 3780MB (7741440 512 byte sectors: 255H 63S/T 481C)
この状態でFreeBSDを再起動すると、FOMA接続のMicroSDからFreeBSDが起動してくれる。さらに、前章で紹介した「USB HDDとのタンデム起動」にもばっちり成功した。
FOMAでFreeBSD。これがホントの「携帯でFreeBSD」
図11 「 FOMAで金(星) 」と喜ぶ筆者(撮影協力: 天川修平氏)
おわりに
今、出張先のアメリカは真夜中である。今回で22回目を数える「IEEE International Conference on Microelectronic Test Structures 」の委員として、ロサンゼルス近郊のOxnardという町に出張に来ているのだが、スカイライナーや空港のラウンジ、飛行機の中に至る移動時間をフル活用して、さまざまなデバイスにインストールを行ってみた。途中、熱による?暴走やハードディスク非認識の問題に悩まされながらも、本記事で紹介したような、ある程度まとまった形の「結果」を出すことができた。
普通、MicroSDカードにFreeBSDをインストールしよう なんてクレイジーなことはあまり考えないわけで、ふと思いついたアイディアを手軽に試せて、これが意外に新しい実用性にむすびつくかもしれないといった発展をたどるのは、FreeBSDならではと言えよう。
活用方法も知恵次第で無限である。たとえばチューンナップしたFreeBSD携帯環境を用意して、困っている新人君、ハートを射止めたいあの人にプレゼントすると喜ばれるかもしれないし、MicroSDカードのフォーマットを工夫して、前半3.2GバイトをFAT(Windowsでフォーマットする) 、残り512MバイトにFreeBSDをインストールして、BootMgrを入れることで、普段は携帯電話機でSDカードとして使いつつ、イザというときにはパソコンにつないで「ディスクまるごとバックアップ」といったシステムオペレーションをしてヒーローになる、といったことも可能かもしれない。
無限の可能性を秘めたFreeBSDの世界へ、ようこそ。