NetBSD/Cobaltの導入

とりあえず免責

NetBSD/Cobaltは実験バージョンです (って、私が作ったわけじゃないですが) 。またこの文章も私の覚え書き以上のものではありません。NetBSD/Cobaltを使ったり、この文章に従ってインストールしたりして起こったいかなる問題も、私には一切保証できません。インストールをするためには匡体を開ける必要があり、そのためcobaltの保証がなくなってしまいますが、こっちのほうも私には保証できません。

更新履歴をちょっと

というわけで本文。

用意するもの

転送

CobaltのLinuxにスナップショット (*.tgz + fdisk)、カーネル (netbsd.gz)、disklabelを転送しておきます。

ハードウェアの準備

Qubeを分解し (ねじを覚えておくこと)、HDDをはずします。分解すると保証を受けられなくなりますので、気をつけてください。付属のIDEケーブルをひっこぬいて普通のIDEケーブルを差し、電源ケーブルのさきに分岐ケーブルを付けます。
準備ができたらHDDを2台つないで起動します。新しいほうをSlaveにしてください。電源を入れてもLEDが点滅するばかりで立ち上がらないときは、電源容量が足りないようです。一台のHDDの電源を抜き、もう一台のHDDが廻りはじめたとこで電源を差すようにします。もちろん機械には良くありませんが、背に腹はかえられません。

うまくLinuxは起動しましたか?

NetBSDの仮インストール

まず、ext2fsを作ってNetBSDをインストールします。
fdiskを使ってhdbにパーティションを作ってください。私のおすすめはhdb1(Linux native)、hdb2(Linux swap)、hdb3(NetBSD (パーティションIDはa9))です。なんなら、Linux nativeのみで運用することもできます。hdb1は最低限512MB程度あればいいでしょう。
パーティションを切ったら、mke2fs /dev/hdb1; fsck /dev/hdb1; mount /dev/hdb1 /mntと進みます。mkswapは必要ありません (swapに対してああいう作業をするのはLinuxぐらいでは?)。

ここで、ちょっと面倒ですが、/etc/groupを編集しておくといいでしょう。GID 0 はwheel、かわりにGID 10をroot、GID 5はttyからoperatorに変更します。(あとで戻しておけば問題ないはず。)

次にカーネルを転送します。/mnt/bootディレクトリを造り、そこにnetbsd.gzをコピーします。/mntにもnetbsd (gzip -dしたもの)をコピーします。コピー後、/mnt/bootに移り、ln netbsd.gz vmlinux.gzとしてください。Qubeの BIOSは、第一パーティション(ext2fsでなくてはならない)の/boot/vmlinux.gzをロードします。自分のLinuxの/bootを見てみて、それがvmlinux.gzでなかったとしたら、適宜読み換えてください。

最後にスナップショットを展開します。/mntに移り、tar xzf xxx.tgzという具合に全部のtgzを展開してください。fdiskとdisklabelは/mnt/sbinにコピーします。disklabelはdisklabel.newなどと名前を変えておいておくといいでしょう。
perlが使えるなら perl -e 'while(<パス/*.tgz>){`tar xzf $_`;}'なんてワザも有りかもしれません。

NetBSDの仮設定

リブートの前にNetBSDを設定しておきます。

必要ファイルのコピー

スナップショットの*.tgzを /mnt/root/netbsdあたりにコピーしておきます。ネットワークの設定をしておけば不要、という考えかたもありますが。

リブート

これだけできたら再起動です (/etc/groupを戻すならいまかも)。shutdownして電源を切り、LinuxのほうのHDDを抜き、NetBSDのHDDをマスターに変更します。また、リバースケーブルでPCを繋ぎ、通信ソフトを起動します。通信条件は、115200bps、ハードウェア制御、パリティなし、データ8bit、ストップ1bitぐらいでいいでしょう。
できたら電源を再投入して、通信ソフトを見つめてください。うまくいったなら、NetBSDカーネルのブートメッセージがでます。

NetBSDの起動とログイン

ブートが途中まですすむと、wd0aがないためルートファイルシステムを指定して欲しい旨のプロンプトが出ます。root (wd0a)には wd0e、dumps (wd0b)には wd0f、ファイルシステム (generic)には ext2fsを入力します。ちょっと待つと、Login: のプロンプトが出るはず、です。rootでログインしてください。

※注意:うまくデバイスファイルができていないと、tty00からでなくdty00からログインしようとしてしまい、結果的にinsecureな端末だと見なされてログインできないことがあります。このときは、Linuxをマスターとして起動してmountしなおし、/mnt/etc/ttysに dty00 none vt100 secureの行を加えて再度挑戦してください。
※注意2:なんらかの手違いでread-onlyでマウントされているときは、mount -u /としてください。

ユーザ登録 (必要なら)

ここからの作業はシリアルに繋いだ端末からやってもいいし、ネットワークの設定ができているなら、ネットワークからやってもいいです。ただし、ネットワークはrootでログインできないのでユーザを登録する必要があります。groupadd、useraddのコマンドがありますのでそれを使ってください。注意点は2つ。GID 0のwheelグループにはいっていないユーザはsuできないこと。パスワードはuseraddでははいらないかもしれませんので、rootで passwd usernameとやって変更しておいてください。パスワードのないユーザは多分ネットワークからログインできません。

デバイスファイル再作成

とりあえず、デバイスファイルを再作成してやります。コピーしておいた/devnに移動、./MAKEDEV allを実行します。できたら/に移動し、mv /dev /devo; mv /devn /dev; rm -rf /devoと実行していきます。心配症のかたはここでリブートしてください。
ext2fsで使えればいいや、ってひとはここまでで、カーネル再構築のつぼ、へすすんでください。

ディスクラベルの作成

NetBSDをffsにインストールするため、ディスクラベル領域 (本来はパーティションですが、混乱しやすいのでdisklabelで設定する領域をディスクラベル領域と呼ぶことにします) を作成します。いまのスナップショット中のdisklabelは正しく動作しないかもしれません。書き込もうとしてエラーがでるときは、ここの (disklabel.newかな) を使ってください。(私のHDDが8GB超だからじゃないよなあ?) ※ 2000/05/30以降のスナップショット (またはバイナリセット)には上手く動くdisklabelがついているようです

disklabel -i wd0で起動。プロンプトがでる。?でメニュー。とりあえず P で現状把握。こんなかんじになっているかな?

partition> P
8 partitions:
#        size   offset     fstype   [fsize bsize   cpg]
  c: 18612720  6817104     unused        0     0         # (Cyl. 6763 - 25227)
  d: 25429824        0     unused        0     0         # (Cyl.    0 - 25227)
  e:  6291873       63 Linux Ext2        0     0         # (Cyl.    0*- 6241)
  f:   525168  6291936       swap                        # (Cyl. 6242 - 6762)
  g: 12320784 13109040     unused        0     0         # (Cyl. 13005 - 25227)
partition> 
お勧めのパーティション分割をしているなら、Liunx Nativeが e (wd0e、以下おなじ)、swapがf、NetBSDが unused で gになっているはずです (cという見かたもありますが)。ちなみにdはディスク全体を表します。
まず、g を押して wd0gを削除します。なぜ削除する必要があるかというと、gの占めている部分にNetBSDのディスクラベル領域を造るためです。いわれるままに、Filesystem typeはunused、Start offsetとPartition sizeはどちらも0を入力します。こんなふうに...
partition> g
Filesystem type [unused]: unused
Start offset [13005c, 13109040s, 6400.9M]: 0
Partition size ('$' for all remaining) [12223c, 12320784s, 6016.01M]: 0
partition>
これで P を使うと wd0gがなくなっているはずです (ディスクラベル領域 gがなくなるだけで、パーティションテーブルから削除されるわけではありません。わけがわからない?まあ拡張領域のようなものだと思ってください)。
gを削除したら、root用にwd0aを造ります。a を押し、Filesystem typeは4.2BSD、Start offsetはwd0f (というか物理的に直前にあるディスクラベル領域) のoffsetにsizeを加えた値を入力。上の例なら 6291936+525168=6817104です。Partition sizeは、まず適当に2048Mなどといれておきます。これだけでもいいのですが、ディスクラベル領域の区切りをシリンダの区切りにあわせるため (だって気持ちわるいでしょう?私が古いのかなあ) 、再び a 、そのままReturn, Returnで、Partition sizeのところにきたら、[ ]内の数字をみて切りのいい c にあわせます。こんなかんじ。
partition> a
Filesystem type [4.2BSD]: 
Start offset [6763c, 6817104s, 3328.66M]: 
Partition size ('$' for all remaining) [4161.02c, 4194304s, 2048M]: 4161c
partition>
ここでは4162.02cだったのを4161cに変更しています。
同様にどんどんディスクラベル領域を作っていきます。でも c, d, e, fには手を加えてはいけません。全部で8個まで造れますが、あんまり細かくしてもしょうがないので私の場合 root用に wd0aと /home用に wd0g だけを作りました。
望みのディスクラベル領域ができたら W で書き込み。確認されるので y をいれ、Q で終了。これでffsで運用できます。

※注意:書き込みができないときは、もうひとつのdisklabel (またはdisklabel.new) を使ってください。disklabel -r -Rなんてワザを使うと。きっと後悔します。

NetBSDのインストール

ここまできたら、ext2fsにインストールしたのと手順はほぼ一緒です。newfs wd0a; newfs wd0g; fsck wd0a; fsck wd0g; mount /dev/wd0a /mntときて、カーネルをコピー(/mnt/bootはいらない)、*.tgzを展開、fdiskやdisklabel (使えるほう) をコピーします。
デバイスファイルも作成してください。設定ファイルの編集もほぼおなじ。/etcからコピーしてもいいです。ただし、/mnt/etc/fstabだけは新しいものを。
/dev/wd0a / ffs rw 1 1
/dev/wd0f none swap sw 0 0
/dev/wd0g /home ffs rw 1 2
/kern /kern kernfs rw
none /proc procfs rw 0 0
というところですね。これにあわせて、/kernと/procのディレクトリを作っておくといいです。もっともprocはカーネルの再構築をするまで使えません。また、/tmpと/var/tmpのパーミッションは1777にしておきましょう。
ユーザを移動したいときは、/etcのpasswd, master.passwd, group, pwd.db, spwd.dbを全部コピーして下さい。

これで、NetBSDのインストールは終了です。リブートすると今度は自動でLogin: プロンプトがでるところまでいくはずです。

カーネル再構築のつぼ

詳しくはNetBSDのFAQなどを見てもらうとして、カーネルのソースはNetBSD-currentのtar_files/src/sys.tgzにはいっています (1.5Rではftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-1.5/source/sets/のsyssrc.tgz)。/usr/srcに展開したとすると、/usr/src/sys/arch/cobalt/confに設定ファイル(RAQをコピーして使うのがいいでしょう)がありますので、それを編集して、config RAQ; cd ../compile/RAQ; make depend; makeでnetbsdという名前のカーネルができます。これをwd0aの/と、wd0eの/boot(こちらはgzipで圧縮したもの)にコピーしてください。wd0eの/bootにおいたカーネルはvmlinux.gzへのリンクを作っておくことを忘れないように。

設定ファイルのつぼとしては、

file-system PROCFS
/procを使うため
config netbsd root on ? type ?
この行でブート時のファイルシステムを指定できます。config netbsd root on wd0e type ext2fs dumps on wd0f とすれば、ext2fsのwd0eだけでも自動的に起動して運用することが可能です。
ぐらいでしょうか。安全のためには少しずつ変更していくのがいいでしょう。(さもないとブートしなくなるかも)

その他 tips

1.5 Releaseにupdateしたらどこか変です
自分でコンパイルしたものがcoreを吐くようになったからでしょう。原因は不明です (もしかするとCOMPAT_14が有効になっていないからかもしれません)。中には大丈夫なものもありますし、/usr/pkgのものは大丈夫です。あきらめて再コンパイルしてください。
passwordを変更しようとすると失敗します (1.5Releaseで直る)
いつのまにか私のところでも "passwd: failed to get credentials: Cannot contact any KDC for requested realm"なるエラーがでるようになってしまいました (otpのせいか?)。しかしpasswordの変更自体は、ちょっと面倒ですがroot権限があればできます。
まず、暗号化されたパスワードを生成します。NetBSD/CobaltのパスワードはDESですので、cryptを使えば簡単に生成できます。cryptを使うにはperlを使うのが簡単です。packageのperlをインストールしてシェルから、
perl -e 'print crypt("password", "ZZ");'
と入力してください。passwordの部分にはパスワード (8文字まで)、ZZの部分にはソルトといわれる暗号化のための種になる文字列 (2文字) を入れます。ソルトにはなんでも好きな文字列を使ってください。英数以外の文字をパスワードに使うときには"\"をまえに置いてエスケープしておくのがよいでしょう("test\^222"など)。すると"ZZKRwXSu3tt8s"といった文字列が表示されると思います。これが暗号化されたパスワードです。
つぎにrootになってvipwを実行します。そこでは
ユーザ名:暗号化パスワード:ユーザID:....
という構文でユーザ情報が記載されていますので、暗号化パスワードの部分をあたらしいものといれかえ、保存終了します。これでパスワードが新しくなっているはずです。
ps、topなどが使えない (現在では修正されています)
libkvmとそれぞれのコマンドを再作成する必要があります。詳しくはFAQを。もしかするとPROCFSが使えるようになった時点でpsは使えるかもしれません。
コンパイルできない (現在では修正されています)
ヘッダがないせいでしょう。NetBSD-currentのsrc/sys/arch/cobalt/includeからすべてのヘッダを持ってきて、/usr/include/cobaltにおいてください。あとmipsのところにあるsrc/sys/arch/mips/include/endian_machdep.hも必要です。/usr/include/mipsに置いてください。
日本語は使えるの?
私のところではmnews 1.22とか日本語mutt 1.2.5iとかjvim 3.0+2.1jとかnvi-m17nとか日本語化pine 3.96とかがちゃんと動いています。ログインして読み書きするぶんには問題ないレベルだと思いますが...
ちなみにlinuxのglibc2のような立派なlocaleはありませんので、アプリケーションが個別に日本語に対応している必要があります。
バイナリパッケージはないの?
ftp://ftp.jp.netbsd.org/pub/NetBSD/packages/1.4U/cobalt/などにあります (1.5Rではftp://ftp.jp.netbsd.org/pub/NetBSD/packages/1.5/cobalt/にあります)。インストールするには、rootになってpkg_add パッケージ.tgzです。パッケージは/usr/pkgにはいります。パッケージのプログラムを使うには、PATHに/usr/pkg/binを忘れずに。
カーネルを変更したら起動しなくなったので、古いカーネルで起動したい。
HDDをとりだして、Linuxで起動してからmount、リンクのはりなおしをしてください。リンクの張りなおしだけなら、i386の機械でもできます。実はインストールもi386の機械からできるそうです。
カーネルを変更したら起動しなくなったので、古いカーネルで起動したい。(2)
本当は、新カーネルがうまくできているか確認してから入れかえるのが賢い方法です。PC等であれば新カーネルをFDにいれてそこからブートすればよいのですが、Qubeではもちろんその方法は使えません。しかし、同様の手段が2つほどあります。
ext2fsで使っているのですが、シャットダウンせずに電源を切ったらたちあがらなくなりました。
おそらくfsckで止っているものと思われます。シリアルコンソールを繋いで (私はいつもHP200LXを繋いでいます)、Ctrl+Cを入れてください。シングルユーザモードで立ち上がると思います。そこで、fsck -t ext2fs -p (多分)して、reboot -nしてください。
シリアルコンソールにdb>とでているのですが
どこかがおかしいです。カーネルデバッガが立ち上がっています。ディスクラベルの情報が壊れてしまったのかもしれません。一度か二度rebootと入力すればrebootします。rebootしたところで電源を切って... でもやれることはあまりありません。再起動してなんともないから忘れましょう。駄目ならあきらめましょう。
時間の表示が変なのですが。
BIOSの時間はGMTにして/etc/localtimeを/usr/share/zoneinfo/Japanへのシンボリックリンクにしておくといいでしょう。JMTが表示されます。それがいやならカーネルコンパイルが必要になります。
(あんまり関係ないのですが) locate情報が古いようです。
locate dbの更新は週一です。毎日造りなおしたいなら、/etcのweekly, weekly.confをみて、daily, daily.confを修正しましょう。
(あんまり関係ないのですが) tcpdははいっていないの?
tcpdはinetdに組み込みです。/etc/hosts.allowと/etc/hosts.denyを用意すれば使えます。
ブートシーケンスは?
おおまかにいうと、まず/etc/rcが動きますが、これは/etc/rc.dの中身を順に実行するだけです。そのあとに/etc/rc.localが実行されます。/etc/rc.confが設定ファイルです。
ほかの情報源は?
とりあえずports cobaltです。日本語サイトはここ。ほかにあったら教えて下さい。
うまくいかないのですが。
NetBSD/Cobaltは実験バージョンです。責任は自分でとってください。
こわれてしまいました。
お気の毒ですが、NetBSD/Cobaltは実験バージョンです。責任は自分でとってください。
もう、匡体をもとに戻してもいいですか?
どうぞどうぞ。でも新カーネルを試すつもりなら、その後のほうがいいと思いますよ。

作者など

大野哲二 : azure@fan.gr.jp

文書の所在 http://www.fan.gr.jp/~azure/docs/nbsdcoba.html
※間違いをみつけたら教えてください。