NetBSD/sandpointをKURO-BOX/HG(玄箱/HG)を使って、実際に試してみた。そのめも。
- はじめにのはじめに
- はじめに
- 方針
- 注意
- U-Boot化 & Debian化
- NetBSD化
- 準備
- NetBSD/i386のカスタムカーネルを作成し、それを使って作業PCを(再)起動する
- NetBSD/i386 -currentのdisklabelコマンドを用意する
- 作業PC上でKURO-BOX/HGのディスクのMBRパーティションをいじって、NetBSDのMBRパーティションを作成する
- 作業PC上でKURO-BOX/HGのディスクにディスクラベルを書く
- 作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をフォーマットする
- 作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をマウントし、NetBSD/sandpointをインストールする
- 作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をマウントし、NetBSD/sandpointの初期設定をする。
- 作業PC上でKURO-BOX/HGのディスクのディスクラベルがNetBSD/sandpointで扱えるように、NetBSD/i386 -currentのdisklabelで書き直す
- KURO-BOX/HGにディスクを取り付け、Linux側をいったん起動し、altbootをLinux側の/boot/altboot.binに置く
- NetBSDが起動できるか試す。問題なければ、常時起動するようにする
- 苦労したところ
- その他
- りんくしゅ
はじめにのはじめに
NetBSD 7で試す場合の注意
この文書は、NetBSD 6で試したものなので、NetBSD 7で試す場合は、以下の注意があります。
手元で試している限りでは、NetBSD 7.0 Releaseのaltboot.binではうまくbootできなかったり、bootにとても時間がかかるようです。NetBSD 6のものだとうまく動いています。NetBSD 6.1.5のaltboot.binは、http://ftp.NetBSD.org/pub/NetBSD/NetBSD-6.1.5/sandpoint/installation/ にあります。
NetBSD 7で試す場合の補足説明
NetBSD 7にもdisklabelコマンドの-Bオプションは入らなかったので、以下の、NetBSD currentのdisklabelコマンドを用意する方法は(残念ながら)有効です。
はじめに
前史
これまで、LinkStationにて、「玄箱でNetBSDを動かす」版(かわうち版)のNetBSD/sandpointを使ってきて、特に困ったことはなく使えていた。
さて、某所で、KURO-BOX/HGが、disk付で格安で売られていて、うっかり買ってしまった。買ったはいいものの、どうしようか考えていたら、めったと流れないport-sandpoint MLで、"Announcing KuroBox support"というメールを見てしまった。ついにNetBSD本家でサポートされたのかー。
そして、そのメールを見たその日に、自宅にKURO-BOX/HGが届いた。
これはやるしかないよね。
しばらくして、"NAS support ready for upcoming releases"というメールがMLで流れた。そして、インストールの方法のページが公開された。
しかし、時間があまりつくれなくて、ほったらかしにしていたら、"All supported NAS models for 6.0"というアナウンスが出たり、dmesgが出たりした。
さぁやるか
2012年10月18日にNetBSD 6.0が出た。6.0が出たのであれば、やらざるをえない。(OSC 2012 Tokyo/Fallに間に合うかな、と思っていたら、間に合わなかった。)
改めて、インストールの方法のページを見ると、シリアルコンソールを出したり、u-boot化したり、かわうち版と比べると、ハードルが高い。
結論として、シリアルコンソール化もせず、u-boot化もしないでインストールする一番簡単な方法は、"NetBSD/sandpoint 6.0 on kurobox"等に書かれているとおり、かわうち版でも使っていた、「ブートローダー(v3)」と「なんちゃってブートセレクタ(タイプ2)」を流用する方法が、一番簡単と思われる。(たぶん、大半の国内ユーザはそうしていると思われる。)
しかし、同じことしてみてもしょうがない(?)ので、ここでは、本家のインストール方法に近い形で行うこととする。
方針
本家のインストールの方法のページのとおり、u-boot化する。
Linux環境を残しておけば、シリアルコンソールは使わないようにできそうなので、そうすることにする。
注意
一般
機種によっては、本家のインストール解説にある情報ではうまくいかないかもしれない。適宜、各種玄箱hackの情報、特に、玄箱そのものの知識(EMモードの変更方法や通常モードへの戻り方、デフォルトのIPアドレス等)、そして、U-Boot化と、他ディストリビューション化(Debian化とか)の情報を調べて、予備知識をつけよう。
# たとえば、rootのパスワードは、KURO-BOX と KURO-BOX/HG とでは違うし、LinkStationは、HDDはそのままではmountできない。
Genbako kernel collectionさんのサイト移転
Genbako kernel collectionさんのサイトが移転している。このページを書き始めた2012年には http://www.genbako.com/ だったが、現在は http://genbako.vodapone.com/ のようだ。
世のたくさんのWebページ(NetBSD本家のリンクも含む)は古いほうを向いているので、ちうい。
以下の文中のリンクは、全て新しい方に向けてある。
U-Boot化 & Debian化
Debian化
Genbako kernel collectionさんのinstall-new-kernel.sjis.txtに書かれているとおりにやる。(「HGの場合はこれも必要」のところまで。)
ようは、玄箱うぉううぉう♪さんの、install_debian_standalone.txtにしたがって、Debian化し、そのあと、install-new-kernel.sjis.txtに書かれている不具合修正を行う、ということである。
(今にして思えば、http://www.genbako.com/debian-2.6.17.3/ を最初から使ってもよかったと思うが、もともと知られた手順どおりに行った。2013年10月に確認した限りでは、玄箱うぉううぉう♪さんは既に消失しており、Genbako kernel collectionさんの配布物を使う以外にない。)
(2017/7/20注:玄箱うぉううぉう♪さんのコンテンツは復活されており、install-new-kernel.sjis.txtの不具合を修正した(ぽい)[1]もの含めて、配布を再開されている。https://dsk.jp/kurobox/)
sarge(3.1)化
/etc/apt/sources.listの変更とupgrade
上記までの状態では、woody(3.0)なので、sarge化する。基本的には、install-new-kernel.sjis.txtに書かれているとおりにやる。(「※カーネル変更」の前まで。)
/etc/apt/sources.listの変更については、install-new-kernel.sjis.txtのとおりに書いても動かない。sargeはずいぶん昔にサポートが打ちきられており、アーカイブサイトにしかない。よって、以下のとおりとする。
deb http://archive.debian.org/debian/ sarge main contrib deb http://archive.debian.org/debian/ sarge-proposed-updates main contrib
/etc/init.d/haltの修正
/etc/init.d/haltの修正は、PATH行の直後に書く。
/etc/kuroevtd/resetpressの修正
/dev/fl* はsarge化で使えなくなるので、変更しておく。(ただ、試した限りでは、こうやっても、うまく動かない。)
#! /bin/sh /usr/sbin/write_ng > /dev/mtdblock2 /sbin/shutdown -h now
/etc/fstabの修正
/dev/hda3はNetBSDに割り当てるので、該当行を消す。(または、コメントアウトする。)
カーネル変更
kernelimageは、kernelimage-2.6.25.1-kuroHG.tgzを使った。install-new-kernel.sjis.txtのとおり、/boot に展開する。
リブート
これも、install-new-kernel.sjis.txtに書いてあるとおりにする。2.6.15ではないけれども、sarge化の際は必要みたい。もちろん、modules-2.6.25.1-kuroHG.tgzを使う。
ぼくの環境では、shutdown -r now や /etc/init.d/reboot すると、次のbootは、一切telnetd(や別途インストールしたsshd)が反応しないという症状になった。(なぜか、pingには反応するが、それ以外は一切ダメ。)困り果てたが、強制的に電源off(=電源ケーブルを引っこ抜く)して、再度起動させたら、telnetdやsshdは反応するようになった。
# この現象は毎回おきる。つまり、一度電源を落としたり、再起動したりすると、次にLinuxを起動するときは、ネットワークの応答がなくなり、強制的に電源offして、再度起動すると、復活する。
Flash ROMのデバイスファイル作成
これもやっておく。sarge化によって、/dev/fl* が使えなくなるのだ。install-new-kernel.sjis.txtの「参考 FLASHを使おう」のとおりである。
U-Boot化
Genbako kernel collectionさんに引き続きお世話になる。
U-Boot化されたkernelimage
http://www.genbako.com/uImage/ からダウンロードしようとすると思うが、2.6.25.1はない。実は、kernelimage-2.6.25.1-kuroHG.tgzの中にすでに入っていたのだ。よって、もうインストールは終わっているはず。
# ls -l /boot/uImage -rw-r--r-- 1 root root 1422555 May 4 2008 /boot/uImage
よって、別途ダウンロードする必要はない。ただし、シンボリックリンクをつくらないと、U-Bootでbootしないので、それだけはつくる必要がある。
# cd /boot # ln -s uImage vmlinux.UBoot
U-Bootの書き込み
http://www.genbako.com/u-boot_loader/ から、U-Boot化されたファームウェアをダウンロードしてくる。注意書きをちゃんと読むこと。
適当なところにダウンロードできたら、md5sumでMD5の値をとって、ダウンロード時に壊れなかったかどうかを確認する。.md5のファイルも一緒にダウンロードして、同じdirに保存しておいて、
# md5sum -c u-boot-hg.flash.md5
とするのが簡単。
次に、いよいよ書き込み。(これを失敗すると、でかい文鎮ができる。)
まず、EMモードで起動する。select_mode.txtのとおり、でいいはず。
telnetはとても遅いので、プロンプトが帰ってこなくても、待つこと。(POWERが点滅していなければ、EMモードか、通常モードか、どっちかで上がっているはず。)
EMモードで上がっていたら、loginして、u-boot-hg.flash.binを保存してある内蔵HDDをmount。そのあと、注意書きどおり、
# cat u-boot-hg.flash.bin > /dev/fl2
しましょう。(ddを使うと死にます。たぶん。)
これで、readme.txtのとおり、netcat(= nc)で待ち受けておけば、u-bootのコンソールがリモートからとれるようになったはず。(ちなみに、NetBSDの場合、netcatは pkgsrcの net/netcat にあるので、インストールしておく。Linuxの各ディストリビューションの場合は、オリジナルのnetcat(= OpenBSD版netcatではない)をインストールしないと、readme.txtどおりのコマンドラインオプションでは動かない。)
KURO-BOX/HGの電源をいったん落とす。
# /usr/bin/write_ok > /dev/fl3 (エラーが出ますが、きにしない) # shutdown -h now
再度起動して、待ち受けていたnetcatにu-bootのコンソールが出ているかどうかを確認する。問題なければ、再度電源を落とす。
NetBSD化
準備
はじめに
KURO-BOX/HGをバラして、ディスクを取り出して、中身が読み書きできる環境として、NetBSD/i386かNetBSD/amd64の環境があることを前提とする。
ここでは、NetBSD/i386をインストールしたNetbook(MSI Wind Notebook U100)を用意した。(以下作業PCと呼ぶ。)
仮想環境(Virtual Box等)でも、できると思うけど、今回は実機があるので、ここでは考えない。
バイトオーダーの問題
対象とするKURO-BOX/HGはPPC系のCPUなので、ビックエンディアンなのだそうだ。対して、i386はリトルエンディアンである。具体的に何が問題になるのかというと、
- ディスクラベル(disklabel)
- *BSDの世界で使われるパーティション情報。PCやLinuxの世界で使われるMBRパーティションとは別にあるもの。
- ファイルシステム
がある。つまり、NetBSD/i386上でディスクラベルを書いたりファイルシステムを作ったりして作業すると、KURO-BOX/HG上のNetBSD/sandpoint(やブートローダであるaltboot)では理解できなくなってしまう。
ファイルシステムの作成(フォーマット)そのものは、newfs(8)には、-B (byte-order)オプションがあり、問題なさそうだ。しかし、それで作成したパーティションは、NetBSD/i386ではmountできないので、カーネルにそれをマウントできるオプションを追加する必要がある。
また、ディスクラベルの方は、NetBSD/i386 -currentのdisklabelコマンドには、-B (byte-order)オプションがあるため、それを用意することにする。
手順の確認
以下のとおり。
- NetBSD/i386のカスタムカーネルを作成し、それを使って作業PCを(再)起動する。
- NetBSD/i386 -currentのdisklabelコマンドを用意する。
- 作業PC上でKURO-BOX/HGのディスクのMBRパーティションをいじって、NetBSDのMBRパーティションを作成する。
- 作業PC上でKURO-BOX/HGのディスクにディスクラベルを書く。
- 作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をフォーマットする。
- -B (byte-order)オプションを使って、ビックエンディアンにする。
- 作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をマウントし、NetBSD/sandpointをインストールする。
- 作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をマウントし、NetBSD/sandpointの初期設定をする。
- 作業PC上でKURO-BOX/HGのディスクのディスクラベルがNetBSD/sandpointで扱えるように、NetBSD/i386 -currentのdisklabelで書き直す。
- -B (byte-order)オプションを使って、ビックエンディアンにする。
- KURO-BOX/HGにディスクを取り付け、Linux側をいったん起動し、altbootをLinux側の/boot/altboot.binに置く。
- NetBSDが起動できるか試す。問題なければ、常時起動するようにする。
NetBSD/i386のカスタムカーネルを作成し、それを使って作業PCを(再)起動する
NetBSD 6系のソースコードが手元にある人はそれを使ってもよい。
ソースコードが手元に無い人で、あなたが、6系をお使いなら、自分が使っているもののソースコードをとってこればよい。6.0なら、
http://ftp.jaist.ac.jp/pub/NetBSD/NetBSD-6.0/source/sets/
などから、とってくる。xsrc.tar.gz以外のものをとりあえずとってきて、展開しよう。デフォルトでは、/ から展開すると、/usr/srcに展開される。
展開できたら、カスタムカーネルを作る。まず、コンフィグファイルを作成する。/usr/src/sys/i386/conf に移動して、GENERICをコピーして、編集する。
# cd /usr/src/sys/arch/i386/conf # cp -p GENERIC FFS_EI
FFS_EI(という名前でなくてももちろんよい)を以下のように編集する。
--- GENERIC 2012-10-05 00:35:16.000000000 +0900 +++ FFS_EI 2013-10-15 01:52:41.000000000 +0900 @@ -184,7 +184,7 @@ # File system options options QUOTA # legacy UFS quotas options QUOTA2 # new, in-filesystem UFS quotas -#options FFS_EI # FFS Endian Independent support +options FFS_EI # FFS Endian Independent support options WAPBL # File system journaling support #options UFS_DIRHASH # UFS Large Directory Hashing - Experimental options NFSSERVER # Network File System server
ようは、FFS_EIの行の先頭の#を取るだけ。
編集できたら、コンパイルする。
# cd /usr/src # ./build.sh -m i386 tools # ./build.sh -m i386 kernel=FFS_EI
kernel= の後はコンフィグファイル名。
しばし待つ(非力なMSI Wind Notebook U100だと、1時間ちょっとくらい)と、コンパイルが終わる。
===> Kernels built from FFS_EI: /usr/src/sys/arch/i386/compile/obj.i386/FFS_EI/netbsd
と、できたカーネルの場所が出ているはずなので、それをつかって、再起動する。
# cp /usr/src/sys/arch/i386/compile/obj.i386/FFS_EI/netbsd /netbsd.ffsei # sync;sync;reboot
起動の途中で、"Drop boot prompt"(この例では、5)を入力し、そのあとのプロンプトで、"boot netbsd.ffsei"と入力するだけである。
# 万一、うまく起動できなかったりしたときは、いったん電源を停止して、再度起動すれば、いままでどおりのカーネルで起動してくるから大丈夫。
NetBSD/i386 -currentのdisklabelコマンドを用意する
残念ながら、現行(NetBSD 6.1)のdisklabelコマンドは、バイトオーダーを変えることはできないが、2013年5月以降のNetBSD -current(開発先端)では、newfsコマンドと同じ、-B (byte-order)オプションが実装されている。これを使うことにする。
まず、cvsで最新のソースコードをとってくる。
# cd /var/tmp # cvs -d anoncvs@anoncvs.netbsd.org:/cvsroot co src/sbin/disklabel
とってこれたら、これをコンパイルする。
# cd src/sbin/disklabel # make USETOOLS=no cleandir dependall
コンパイルが通れば、無事、disklabelコマンドができているはず。
作業PC上でKURO-BOX/HGのディスクのMBRパーティションをいじって、NetBSDのMBRパーティションを作成する
KURO-BOX/HGをバラして、ディスクをとりだし、作業用PCにPATA-USB変換経由で接続。sd1で見えた。
fdiskを使って、一番後ろにあるデータ領域用のLinuxパーティション(Linux用語ではhda3)をNetBSDのMBRパーティションとする。要点は以下の通り、
- fdisk -u sd1で起動。
- "Do you want to change our idea of what BIOS thinks? [n]"はなにも入力しない(単にEnter)
- "Which partition do you want to change?: [none]"は、2と入力
- NetBSDのfdiskでは、先頭から、0, 1, 2, 3。
- sysidは、169を入力
- startとsizeとbootmenuはそのまま(単にEnter)
- "The bootselect code is not installed, do you want to install it now? [n]"もなにも入力しない(単にEnter)
- 入力が戻ってくるので、2番がNetBSDになっていることを確認。"Which partition do you want to change?: [none]"にはなにも入力しない(単にEnter)
- "Update the bootcode from /usr/mdec/mbr? [n]"もなにも入力しない(単にEnter)
- "We haven't written the MBR back to disk yet. This is your last chance."とでて、もう一度、MBRパーティションの情報が出て、"Should we write new partition table? [n]"には、y と入力する。
- もし、ここで、止めておきたければ、n を入力すれば、何も変更されない。(よって、何度でも試すことができる。)
結果、こんな感じ。
% fdisk sd1 Disk: /dev/rsd1d NetBSD disklabel disk geometry: cylinders: 238475, heads: 64, sectors/track: 32 (2048 sectors/cylinder) total sectors: 488397168 BIOS disk geometry: cylinders: 1024, heads: 255, sectors/track: 63 (16065 sectors/cylinder) total sectors: 488397168 Partition table: 0: Linux native (sysid 131) start 63, size 4192902 (2047 MB, Cyls 0-260) PBR is not bootable: All bytes are identical (0x00) 1: Linux swap or Prime or Solaris (sysid 130) start 4192965, size 514080 (251 MB, Cyls 261-292) PBR is not bootable: All bytes are identical (0x00) 2: NetBSD (sysid 169) start 4707045, size 483690123 (236177 MB, Cyls 293-30401/80/63) PBR is not bootable: All bytes are identical (0x00) 3: <UNUSED> No active partition. Drive serial number: 2023426387 (0x789b0953)
作業PC上でKURO-BOX/HGのディスクにディスクラベルを書く
次に、disklabelを書く。下記のようにすることにした。
- a -> NetBSD(システム領域)
- b -> swap(Linuxのswapと兼用, MBRパーティションの1)
- c (使えない)
- d (使わない)
- e -> Linux(システム領域, MBRパーティションの0)
- f -> NetBSD(データ領域)
つまり、
- MBRパーティションの0 -> e
- MBRパーティションの1 -> b
- MBRパーティションの2 -> aとf
にする、ということである。
これにより、diskの先頭から、e -> b -> a -> f の順番である。
bパーティションは、MBRパーティションの1の先頭8セクタだけ使わないようにする。(当然、サイズも8小さくなる。)これは、Linuxがswapと認識するためのデータがかかれている部分を消さないようにするため。
MBRパーティションの2は、aを1GBとして、あとはfにする。
disklabelの設定は、disklabelコマンドを使う。
# disklabel -i -I sd1 Enter '?' for help partition> ? ? print this menu C make partitions contiguous E print disk label and current partition table I change label information L list all known file system types N name the label P print current partition table Q quit R rounding (c)ylinders (s)ectors W write the current partition table [a-p] define named partition
最初に、OSが適当にみつくろってくれるdisklabelを見ておく。
partition> P 7 partitions: # size offset fstype [fsize bsize cpg/sgs] c: 483690123 4707045 unused 0 0 # (Cyl. 2298*- 238475*) d: 488397168 0 unused 0 0 # (Cyl. 0 - 238475*) e: 4192902 63 Linux Ext2 0 0 # (Cyl. 0*- 2047*) f: 514080 4192965 swap # (Cyl. 2047*- 2298*) g: 483690123 4707045 4.2BSD 0 0 0 # (Cyl. 2298*- 238475*)
- MBRパーティションの0が、eになっているようだ。
- MBRパーティションの1が、fになっているようだ。
- MBRパーティションの2が、gになっているようだ。
では、変更していく。まずは、gとfを消す。サイズに0を入力すれば、消える。
partition> g Filesystem type [?] [4.2BSD]: Start offset ('x' to start after partition 'x') [2298.36181640625c, 4707045s, 2298.36181640625M]: 0 Partition size ('$' for all remaining) [236176.81787109375c, 483690123s, 236176.81787109375M]: 0 partition> f Filesystem type [?] [swap]: Start offset ('x' to start after partition 'x') [2047.34619140625c, 4192965s, 2047.34619140625M]: 0 Partition size ('$' for all remaining) [251.015625c, 514080s, 251.015625M]: 0 partition> P 7 partitions: # size offset fstype [fsize bsize cpg/sgs] c: 483690123 4707045 unused 0 0 # (Cyl. 2298*- 238475*) d: 488397168 0 unused 0 0 # (Cyl. 0 - 238475*) e: 4192902 63 Linux Ext2 0 0 # (Cyl. 0*- 2047*)
消せたので、まずは、MBRパーティションの1をbにしよう。
partition> b Filesystem type [?] [unused]: ? Supported file system types: 4.1BSD EFS MINIX FSv3 UDF 4.2BSD Eighth Edition MSDOS unknown 4.4LFS FILECORE NiLFS unused ADOS HFS NTFS Version 6 Apple UFS HPFS RAID Version 7 boot ISO9660 swap vinum ccd jfs System V cgd Linux Ext2 SysVBFS Filesystem type [?] [unused]: swap Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: 4192973 Partition size ('$' for all remaining) [0c, 0s, 0M]: 514072 b: 514072 4192973 swap # (Cyl. 2047*- 2298*) partition> P 7 partitions: # size offset fstype [fsize bsize cpg/sgs] b: 514072 4192973 swap # (Cyl. 2047*- 2298*) c: 483690123 4707045 unused 0 0 # (Cyl. 2298*- 238475*) d: 488397168 0 unused 0 0 # (Cyl. 0 - 238475*) e: 4192902 63 Linux Ext2 0 0 # (Cyl. 0*- 2047*)
次に、aとfを作る。
partition> a Filesystem type [?] [unused]: 4.2BSD Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: b Partition size ('$' for all remaining) [0c, 0s, 0M]: 1024M a: 2097152 4707045 4.2BSD 0 0 0 # (Cyl. 2298*- 3322*) partition> f Filesystem type [?] [swap]: 4.2BSD Start offset ('x' to start after partition 'x') [0c, 0s, 0M]: a Partition size ('$' for all remaining) [0c, 0s, 0M]: $ f: 481592971 6804197 4.2BSD 0 0 0 # (Cyl. 3322*- 238475*) partition> P 7 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 2097152 4707045 4.2BSD 0 0 0 # (Cyl. 2298*- 3322*) b: 514072 4192973 swap # (Cyl. 2047*- 2298*) c: 483690123 4707045 unused 0 0 # (Cyl. 2298*- 238475*) d: 488397168 0 unused 0 0 # (Cyl. 0 - 238475*) e: 4192902 63 Linux Ext2 0 0 # (Cyl. 0*- 2047*) f: 481592971 6804197 4.2BSD 0 0 0 # (Cyl. 3322*- 238475*)
問題ないようなので、disklabelを作成しよう。
partition> ? ? print this menu C make partitions contiguous E print disk label and current partition table I change label information L list all known file system types N name the label P print current partition table Q quit R rounding (c)ylinders (s)ectors W write the current partition table [a-p] define named partition partition> W Label disk [n]? y Label written partition> Q
(もし不安な時は、)"Label disk [n]"のところで、nと入力すれば、一切変更は反映されない。
こんな感じになった。
% disklabel -r sd1 # /dev/rsd1d: type: SCSI disk: 00BB-55RDA0 label: fictitious flags: bytes/sector: 512 sectors/track: 32 tracks/cylinder: 64 sectors/cylinder: 2048 cylinders: 238475 total sectors: 488397168 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 7 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 2097152 4707045 4.2BSD 0 0 0 # (Cyl. 2298*- 3322*) b: 514072 4192973 swap # (Cyl. 2047*- 2298*) c: 483690123 4707045 unused 0 0 # (Cyl. 2298*- 238475*) d: 488397168 0 unused 0 0 # (Cyl. 0 - 238475*) e: 4192902 63 Linux Ext2 0 0 # (Cyl. 0*- 2047*) f: 481592971 6804197 4.2BSD 0 0 0 # (Cyl. 3322*- 238475*)
作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をフォーマットする
NetBSDパーティションは、フツーにnewfsすればよい。-B (byte-order)オプションを忘れないように。
# newfs -B be /dev/rsd1a /dev/rsd1a: 1024.0MB (2097152 sectors) block size 16384, fragment size 2048 using 6 cylinder groups of 170.67MB, 10923 blks, 21504 inodes. super-block backups (for fsck_ffs -b #) at: 32, 349568, 699104, 1048640, 1398176, 1747712, # newfs -B be -O 2 /dev/rsd1f /dev/rsd1f: 235152.8MB (481592968 sectors) block size 32768, fragment size 4096 using 317 cylinder groups of 741.81MB, 23738 blks, 46848 inodes. super-block backups (for fsck_ffs -b #) at: 192, 1519424, 3038656, 4557888, 6077120, 7596352, 9115584, 10634816, 12154048, 13673280, 15192512, 16711744, ....................................................................................................................
-O 2 は、FFSv2(UFS2)にするオプション。
作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をマウントし、NetBSD/sandpointをインストールする
setsの展開
適当なミラーサイト(例:ftp://ftp.jaist.ac.jp/pub/NetBSD/NetBSD-6.0/sandpoint/binary/sets/)から取得する。x で始まる .tgz と、kern-GENERIC.tgz は必要ない。
とってきたら、壊れていないかどうか確認する。NetBSD上だと、cksum で確認できる。
% ls MD5 base.tgz etc.tgz kern-KUROBOX.tgz misc.tgz tests.tgz SHA512 comp.tgz games.tgz man.tgz modules.tgz text.tgz % cat MD5 SHA512 | cksum -c (MD5) xbase.tgz: FAILED (MD5) xcomp.tgz: FAILED (MD5) xetc.tgz: FAILED (MD5) xfont.tgz: FAILED (MD5) xserver.tgz: FAILED (SHA512) xbase.tgz: FAILED (SHA512) xcomp.tgz: FAILED (SHA512) xetc.tgz: FAILED (SHA512) xfont.tgz: FAILED (SHA512) xserver.tgz: FAILED
無いファイルはエラーになるのは問題ない。展開する。
% su - # mount /dev/sd1a /mnt # cd /path/to # for h in *.tgz > do > echo -n "$h: ";tar xzpehf $h -C /mnt; echo $? > done base.tgz: 0 comp.tgz: 0 etc.tgz: 0 games.tgz: 0 kern-KUROBOX.tgz: 0 man.tgz: 0 misc.tgz: 0 modules.tgz: 0 tests.tgz: 0 text.tgz: 0
/kern /proc /dataを作っておく。
# cd /mnt # mkdir kern proc data
あとで、使うので、altboot.bin をコピーしておく。
# cp -p /mnt/usr/mdec/altboot.bin /var/tmp # cd / # umount /mnt
作業PC上でKURO-BOX/HGのディスク(のNetBSDでつかうところ)をマウントし、NetBSD/sandpointの初期設定をする。
事前に設定しておく。(詳細は割愛。)
/etc/fstab
/dev/wd0a / ffs rw,log 1 1 /dev/wd0b none swap sw 0 0 /dev/wd0f /data ffs rw,log 1 1 kernfs /kern kernfs rw ptyfs /dev/pts ptyfs rw procfs /proc procfs rw
/etc/ifconfig.re0
inet IPあどれす netmask さぶねっとますく inet 192.168.11.150 netmask 255.255.255.0 alias
固定IPをつけておく。
KURO-BOX/HGのネットワークインターフェースは、re になる。INSTALL.txtの"NetBSD/sandpoint System Requirements and Supported Devices"参照。
/etc/rc.conf
- rc_configured=YES
- hostname=なにかつけとくとよい
- defaultroute=デフォルトゲートウェイのIPアドレス
- sshd=YES
/etc/ssh/sshd_config
rootでログインできるように、PermitRootLogin yes しておく。(あとで、noに戻すこと。)
オプション
- /etc/passwd
- vipw -d /mnt で設定できる。ハッシュ化された文字列は、pwhashコマンドで作ることができる。
- ログイン後、最初にrootのパスワードをつけるのなら、なにもしなくてもよい。(このままだと、rootのパスワードは空のままである。)
- /etc/resolv.conf
- DNSの設定。あとからしてもよい。
- /etc/hosts
- 必要に応じてどうぞ。
- /etc/localtime
- あとからした方がらく。
- /etc/ttys
- シリアルコンソール化をあとからしたくなった時のために、"115200"のところを、"57600"にしておく。
- /etc/inetd.conf
- 必要に応じてどうぞ。
- telnetを開ける場合は、-a valid がついていると、SRA loginに対応していないtelnetクライアントだと、telnetできないのでちうい。{Net,Free,DragonFly }BSDはOK。OpenBSDやLinuxの各ディストリビューション(Netkit telnet)はNG。WindowsだとRLoginというターミナルエミュレータはいけるらしい。
終わったら、最後に、MAKEDEVして、umountする。
# cd /mnt/dev # ./MAKEDEV all # cd / # umount /mnt
作業PC上でKURO-BOX/HGのディスクのディスクラベルがNetBSD/sandpointで扱えるように、NetBSD/i386 -currentのdisklabelで書き直す
まず、disklabelを書き出す。
# disklabel -r sd1 > /tmp/sd1_label
次に、書き出したラベルを編集し、cパーティションを消し、dパーティションをcパーティションにする。また、label:行の" fictitious"を消す。
# cp /tmp/sd1_label /tmp/sd1_label.new # vi /tmp/sd1_label.new # cat /tmp/sd1_label.new # /dev/rsd1d: type: SCSI disk: 00BB-55RDA0 label: flags: bytes/sector: 512 sectors/track: 32 tracks/cylinder: 64 sectors/cylinder: 2048 cylinders: 238475 total sectors: 488397168 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 7 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 2097152 4707045 4.2BSD 0 0 0 # (Cyl. 2298*- 3322*) b: 514072 4192973 swap # (Cyl. 2047*- 2298*) c: 488397168 0 unused 0 0 # (Cyl. 0 - 238475*) e: 4192902 63 Linux Ext2 0 0 # (Cyl. 0*- 2047*) f: 481592971 6804197 4.2BSD 0 0 0 # (Cyl. 3322*- 238475*)
次に、ディスクラベルを消す。
# disklabel -D sd1 # disklabel -r sd1 disklabel: could not read existing label
次に、NetBSD -currentのdisklabelで書く。
# /var/tmp/src/sbin/disklabel/disklabel -B be -R sd1 /tmp/sd1_label.new disklabel: changing le byteorder to be: Undefined error: 0
エラーが出るが、これで問題ないみたい。
読めるかどうか確認する。
# /var/tmp/src/sbin/disklabel/disklabel -B be -r sd1
読めないことも確認する。
# disklabel -r sd1 disklabel: ignoring byteswapped label at offset 512 from sector 4707045 disklabel: could not read existing label
KURO-BOX/HGにディスクを取り付け、Linux側をいったん起動し、altbootをLinux側の/boot/altboot.binに置く
作業PCの/var/tmp/altboot.bin にとったあったはずなので、コピーしておく。
Linux側の/boot/altboot.bin に保存する。
NetBSDが起動できるか試す。問題なければ、常時起動するようにする
u-bootのリモートコンソールをとって作業する。
作業前に、設定をメモっておく。(出力がくっつく場合は、何度か試すとよい。)
=> printenv printenv bootargs=root=/dev/hda1 bootcmd=run bootcmd1 nfsboot=bootp;run nfsargs;bootm bootdelay=10 baudrate=57600 autoload=no stdin=nc stdout=nc stderr=nc ipaddr=192.168.11.150 netmask=255.255.255.0 serverip=192.168.11.149 ncip=192.168.11.149 netretry=no nc=setenv stdin nc;setenv stdout nc;setenv stderr nc ser=setenv stdin serial;setenv stdout serial;setenv stderr serial ldaddr=800000 hdpart=0:1 hdfile=boot/vmlinux.UBoot hdload=echo Loading ${hdpart}:${hdfile};ext2load ide ${hdpart} ${ldaddr} ${hdfile} boothd=setenv bootargs root=/dev/hda1;bootm ${ldaddr} hdboot=run hdload boothd flboot=setenv bootargs root=/dev/hda1;bootm ffc00000 emboot=setenv bootargs root=/dev/ram0;bootm ffc00000 nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:{hostame}:ff bootretry=30 bootcmd1=run hdboot;run flboot bootcmd2=run flboot bootcmd3=run emboot writeng=protect off fff70000 fff7ffff;era fff70000 fff7ffff;mw.l 800000 4e474e47 1;cp.b 800000 fff70000 4 writeok=protect off fff70000 fff7ffff;era fff70000 fff7ffff;mw.l 800000 4f4b4f4b 1;cp.b 800000 fff70000 4 ubpart=0:3 ubfile=share/u-boot/u-boot-hg.flash.bin ubload=echo Loading ${ubpart}:${ubfile};ext2load ide ${ubpart} ${ldaddr} ${ubfile} ubsaddr=fff00000 ubeaddr=fff2ffff ubflash=protect off ${ubsaddr} ${ubeaddr};era ${ubsaddr} ${ubeaddr};cp.b ${ldaddr} ${ubsaddr} ${filesize};cmp.b ${ldadr ${ubsdr}${ileiz} upgrade=run ubload ubflash ethact=RTL8169#0 Environment size: 1476/65532 bytes
altboot.binで起動するように設定を変更する。
=> ide device ide device IDE device 0: Model: WDC WD2500BB-55RDA0 Firm: 20.00K20 Ser#: WD-WCANKF661037 Type: Hard Disk Supports 48-bit addressing Capacity: 238475.1 MB = 232.8 GB (488397168 x 512) => ide part ide part Partition Map for IDE device 0 -- Partition Type: DOS Partition Start Sector Num Sectors Type 1 63 4192902 83 2 4192965 514080 82 3 4707045 483690123 a9 => ext2ls ide 0:1 / ext2ls ide 0:1 / <DIR> 4096 . <DIR> 4096 .. <DIR> 4096 lost+found <DIR> 4096 bin <DIR> 4096 boot <DIR> 4096 cdrom <DIR> 20480 dev <DIR> 4096 etc <DIR> 4096 floppy <DIR> 4096 home <DIR> 4096 initrd <DIR> 4096 lib <DIR> 4096 mnt <DIR> 4096 opt <DIR> 4096 proc <DIR> 4096 root <DIR> 4096 sbin <DIR> 4096 tmp <DIR> 4096 usr <DIR> 4096 var <DIR> 4096 sys => ext2ls ide 0:1 /boot <DIR> 4096 . <DIR> 4096 .. 30427 .config 695026 System.map 3047558 vmlinux.bin 1422555 uImage <SYM> 6 vmlinux.UBoot 75924 altboot.bin
ちゃんとu-bootからHDDは見えているみたいだ。試しにNetBSDをbootしてみる。
=> ext2load ide 0:1 1000000 boot/altboot.bin 75924 bytes read => go 1000000 wd0a:netbsd ## Starting application at 0x01000000 ... (このあと何も出てこなくなる。これで正しい。シリアルコンソールを出している人はそっちに出ているはず。)
あとは、設定したIPアドレスに、作業PCからpingして応答があれば、rootでsshログインできるはずである。
問題なければ、常時起動するようにする。
せっかくなので、
=> setenv debboothd setenv bootargs root=/dev/hda1\;bootm \${ldaddr} => setenv debboot setenv ldaddr 800000\;setenv hdfile boot/vmlinux.UBoot\;setenv boothd \${debboothd} => setenv nbboothd go \${ldaddr} wd0a:netbsd => setenv nbboot setenv ldaddr 1000000\;setenv hdfile boot/altboot.bin\;setenv boothd \${nbboothd}
としておけば、Linuxに切り替えたい時、
=> run debboot
で、よくなる。また、NetBSDは、
=> run nbboot
で、よくなる。
# u-boot上で手動で起動する時は、run hdbootである。再起動はreset。
自動起動するほうを、設定の上、保存しよう。
=> setenv debboothd setenv bootargs root=/dev/hda1\;bootm \${ldaddr} => setenv debboot setenv ldaddr 800000\;setenv hdfile boot/vmlinux.UBoot\;setenv boothd \${debboothd} => setenv nbboothd go \${ldaddr} wd0a:netbsd => setenv nbboot setenv ldaddr 1000000\;setenv hdfile boot/altboot.bin\;setenv boothd \${nbboothd} => run nbboot => saveenv
再起動して、自動起動するか確認して、おしまい!
=> reset
Linuxパーティションにaltboot.binを置いたことで、(本家が採用している)u-bootのなかにaltboot.binを保存する必要ななくなった。
苦労したところ
バイトオーダーの問題については、ディスクラベルについては、NetBSD/sandpointのツールチェーンを用意し、その中にあるdisklabelコマンド(nbdisklabel-sandpoint)でなんとかなると思っていた。
実際、バイトオーダーは、ビックエンディアンで読み書きできているようで、問題なさげだった。
ところが、とてもとてもとても残念なことに、nbdisklabel-sandpointで書くと、(理由はよくわからなかったが、)ディスクの先頭にディスクラベルを書く。悲しいことに、altbootは全く理解してくれない。
(NetBSD/i386の)disklabelコマンドを使うと、ちゃんと、NetBSDパーティションの先頭に書いてくれるのだが、バイドオーダーは、リトルエンディアンになる。もちろん、これもaltbootは全く理解してくれない。
ここで、ずっと詰んでしまい、しばらく放置していた。
ところが、2013年の5月になって、NetBSD -currnt(開発先端)で、newfsの-Bオプションと同じオプションがdisklabelコマンドにもついた。(以下は、main.cのcvs log。)
date: 2013/05/03 16:05:12; author: matt; state: Exp; lines: +276 -26 Make disklabel a MI tool. It will use MACHINE/MACHINE_ARCH to determine the disklabel params as well as allowing command-line options of -M <machine> and -B {le,be} to specify MACHINE and byteorder to be used.
これに気づいたのが、2013年の9月くらいで、確認したところ、NetBSDパーティションの先頭に書いてくれるようだったので、テストしてみて、ようやく完成した。
もしかして:シリアルコンソールのはんだ付けをする方がかんたんだったかも(笑)。
その他
時刻のズレについて
NetBSDでは、altbootの中で必要な設定が行われている。しかし、この値がよくないので、ntpdを動かしていても間に合わないくらい、結果的にずれが生じることになる。Genbako kernel collectionさんのカーネルは、(arch/ppc/platforms/linkstation.cに)手当てがしてあって、問題が少なくなるようになっている。これと同じことをすればよいようだ。具体的には、sys/arch/sandpoint/stand/altboot/brdsetup.c を以下のように変更する。
--- brdsetup.c.orig 2013-09-29 22:31:09.000000000 +0900 +++ brdsetup.c 2015-10-18 00:52:35.000000000 +0900 @@ -653,9 +653,9 @@ { if (PCI_VENDOR(pcicfgread(pcimaketag(0, 11, 0), PCI_ID_REG)) == 0x10ec) - brd->extclk = 32768000; /* decr 2457600Hz */ + brd->extclk = 32522240; /* {32.768MHz*(100% - 0.75%)} * 4 / 4 */ else - brd->extclk = 32521333; /* decr 2439100Hz */ + brd->extclk = 24391680; /* {24.576MHz*(100% - 0.75%)} * 3 / 4 */ } void
こうすることで、KURO-BOX/HGでは、かなりましになった。
Perlがコンパイルできない
pkgsrcから、あれこれソフトを入れようとすると、Perlがコンパイルできないことでつまづく。これは、swapが足らないせい。swapパーティションを大きくすることはインストール後だと難しいけど、swapファイルをつくって、それを使うようにすることは難しくない。swapctlのマニュアルをみてやってみよう。
ちなみに、自分は2GBくらいのswapファイルを足しています。(なお、ファイルはどんなファイルでもいいので、/dev/zeroとかを使って、つくるとよいです。dd if=/dev/zero of=swapfile bs=1024k count=2048 とか。)
りんくしゅ
あれこれ参考になります。
- Buffalo LinkStation Installation Guide: 本家のインストールガイド。
- Kuro-Box: かわうち版なきあと、もっともよく情報がまとまっているページ。
- [NetBSD]玄箱HG Update (2): 本家のとおりのやり方でインストールしてみえる例。
- 5分で分かるRaspberry PiでNetBSD/evbarm: このあと、シリアルを出そうとされるのであれば、ケーブル側はこのやり方がオススメです。
間違いの指摘や、ご意見などは、FrontPageにある連絡先にメールを下さるとうれしいです。
最終更新時間:2017年07月20日 11時37分18秒