by Marc Espie -- espie@cvs.OpenBSD.org
Linux と OpenBSD を同じディスクに同居させるのはなんの無理もない。 これの執筆時点では、 (OpenBSD 2.5 & linux 2.2.3), どちらも相手の パーティションを読み書きできている。ただしLinux の BSD ファイルシステムの 処理はまだ実験段階ではあるけれど。2.0 linux カーネルと、ほとんどの 2.1 カーネルは OpenBSD パーティションが処理できない(ほかの BSD パーティションはタイプA5 で、タイプA6のOpenBSD パーティションとはかなりちがう)。
OpenBSD を ext2fs パーティションからインストールすることだってできる (「ディスクからのインストール」を選ぼう……ext2fs というのは選択肢には 出てこないけれど、それが「デフォルト」なのだ)。
なにもない状態から始めるなら、まず Linux から先にインストールしたほうが いい。複数の OS を使うんだから、マルチブートする方法が必要で、これには Linuxの lilo がじゅうぶんに適役だ。
重要:この lilo のことはお忘れなく。このディスクから linux を削除するとき には、まず MBR をliloなしの状態に戻して、OpenBSD がデフォルトで起動する ことを確実・絶対・まちがいなしに確認してからにしないとダメだ。
Windows/DOS パーティション用にスペースを確保したければ fipsを使おう。Fips20 は FAT32 もわかるので、windows 95 もいまでは問題にならない。
ほかの情報源は、特に同じ BSD 系のものは十分に注意して読むこと。OpenBSD は まちがいなく以下の点でちがっている:
もし新しいマシンで最初からやろうとしているなら、インストールしたものを 全部捨てる覚悟はしておくこと。ふつうは、マシンにインストールして、それか ら一週間か一ヶ月かそこら遊んでから、やっぱこの設定は気に入らないとわかって 最初からやりなおすことになる。
最初のインストールのときにわかった、面白い情報は全部メモっておこう。 最初の一ヶ月くらいは、あまりマシンでいろいろやりすぎないほうがいい。どうせ 再インストールの時にすてることになる。ただしバックアップのやりかた次第では その限りに非ず。
ところであなた、ホントにデュアルブートのマシンなんかいるの? ほとんどの 人は Linux と OpenBSD の両方なんかいらないのだ。OpenBSD で満足したら、Linux のほうはあっさり消したくなっちゃうかも……
自分に必要なのがずばりなんなのかを考えてみよう。隣り合っているとサイズが変わりそうなパーティションはなるべく遠くに配置するように。中身がだいじじゃないパーティション(あるいはいつも最新のバックアップのあるパーティション)を、OpenBSD と Linuxの境目に置いておこう。たとえば、スワップを増減できるような位置に配置するのは、ふつうはいい考え方だ。例外的な利用(とても巨大で一時的なスワップ)は OpenBSD (svnd) でも Linux.でも、パーティションではなく一時ファイルがつかえることをお忘れなく。
OpenBSD は起動に MBR パーティション (マスター・ブート・レコードにマッピングされたパーティション)だけを使うわけじゃない。MBR を見たあとは、disklabel という bsd 固有の情報を参照する。こいつはあなたのハードディスクについて、また完全に別個の記述だ。これは通常の DOS パーティション情報とマッチしている必要さえない。 [OpenBSD は、起動にはプライマリ MBR パーティションが必要で、それ以外のものはどれも公式にはサポートされていない。]
この文書を通じて必要に応じて MBR パーティションと disklabel パーティションは区別するようにする。
いちばん安全なやり口というのは、プライマリMBR パーティションを一つ、OpenBSD 用の A6 タイプに割り当てて、それをさらに disklabelでパーティションしていくことだ。
できるなら、ディスク一つ丸ごと OpenBSDに使わせたほうがいい。これで、まちがいの可能性も限られてくる。確かにこれが使えない場合もある(ぼくのマシンはラップトップだから、手持ちのハードディスク一つでなんとかしなきゃならない)し、あるいはこれだと遅くなる場合もある(SCSI ディスク設定は、スワップをディスク中にインターリーブさせたほうがスループットが上がる。
大原則:必ずその OS についてくるディスクパーティションツールを使うこと。そのOS 内部の仕組みについては、きみよりそのツールのほうがよく知っている。だから Linux パーティションには linux fdisk
を使って、でもそのときは OpenBSD のdisklabel は絶対にいじらせないこと。そしてその逆も真なり。
歴史的な事故のおかげで、きみのマシンの常駐「OS」またの名を BIOS は、最大シリンダー 1024までしかハードディスクにアクセスできない。これをだまくらかすのに、いろんな手口が使われていて、だからふつうは BIOS からディスク全体がアクセスできるようにはなっている(ただし8Gbを超えるでかいディスクはまた別だ)。
fdisk はふつうは、信用できる情報をくれる。シリンダー 1024より手前にあるものは、なんでも BIOS経由でアクセスできる。
最初に OpenBSD を起動すると、カーネルはハードウェアを検出して以下のようなメッセージを出す:
wd0 at wdc0 drive 0: <TOSHIBA MK4006MAV> wd0: 3909MB, 7944 cyl, 16 head, 63 sec, 512 bytes/sec, 8007552 sec total wd0: using 16-sector 16-bit pio transfers, lba addressing
パニくらないように。これはただの、本当のディスクジオメトリ。この件ではfdiskを信用すること。
fdisk が 1024 シリンダ以上を表示するようなら、OpenBSD
はその 1024 の範囲内におしこめなきゃいけない。実は、起動に使われる disklabel パーティション(a:)さえ最初の 1024 シリンダ内にあればよいのだ。だから
OpenBSD パーティションが最初の 1024 シリンダ内から始められないなら、a: を小さくしておけばだいじょうぶ(ちなみに a: は 20Mb
をちょっと切るくらいでもやっていける。そこに /bin /sbin, カーネルと /etcがおさまればいい)。
まず Linux からはじめて、パーティションの感覚をつかもう。df を使って、どれがどれかを調べてから、fdisk で実際にディスクを設定していこう。
セットアップを紙切れに書いておくこと。あとでまちがいをしでかしたときに、こいつが役にたつことがある。
Disk /dev/hda: 128 heads, 63 sectors, 993 cylinders Units = cylinders of 8064 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 1 211 850720+ 6 DOS 16-bit >=32M /dev/hda2 212 273 249984 83 Linux native /dev/hda3 274 992 2899008 a6 OpenBSD
DOS の行のブロック数末尾の + は、linux のfdisk が腐ってて、出力を 1024-サイズのかたまりで書きたがるせいで出てきた。だからこれは`850720 ブロック半'ということ。
古い linux fdisk は a6 を OpenBSDだと認識してくれない。
ごらんのように、ぼくの linux セットアップはかなり小さい。Linux で gcc とかがどう動くか調べられるだけのものはあるけれど、ぼくのマシンはまちがいなく OpenBSD 開発者のマシンなのだ。
u を使ってセクターを表示させよう。そしてこれに対応した情報もメモっておくのだ:
Disk /dev/hda: 128 heads, 63 sectors, 993 cylinders Units = sectors of 1 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 63 1701503 850720+ 6 DOS 16-bit >=32M /dev/hda2 1701504 2201471 249984 83 Linux native /dev/hda3 2201472 7999487 2899008 a6 OpenBSD --
オッケー、最後にエキスパートモードに切り替えて、これまた対応するデータを書いておこう。
Disk /dev/hda: 128 heads, 63 sectors, 993 cylinders Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID 1 00 1 1 0 127 63 210 63 1701441 06 2 00 0 1 211 127 63 272 1701504 499968 83 3 00 0 1 273 127 63 991 2201472 5798016 a6 4 00 0 0 0 0 0 0 0 0 00
これでも、データとしては最初のと同じだ、ということに注意。よいところは、これが OpenBSD のfdiskでふつうに表示されるものとほとんど同じだ、ということ(通常は!)(たぶん、すっごく異様なケースでこれが一致しない場合もあると思う)。
それでもまだちがいはあって、そのほとんどは Linux fdisk がなんか混乱を招くようなやりかたを選んでるせいだ:
linux スワップパーティションが見あたらないのに気がついたかな? ぼくの linux セットアップは、いまは OpenBSD のスワップ領域を使う。
OpenBSD のインストールを始める前に、いまこそ INSTALL.pt ドキュメントをチェックしておこう……特に、パーティションのアラインメント制限に注意(パーティションの最初のセクターはシリンダーのヘッド 0, セクター 1 でなくてはならない)。これは Linux のfdiskが強制するものだ。
もう一つの注意点は、拡張パーティションは実はリンクリストだということ。これはOpenBSD のfdiskであらわれる。
OpenBSD は、ハードウェアクロックがuniversal time になっているものと想定して、現地時間はタイムゾーンを使って計算する。Linux の場合、必ずしもそうとは限らない……ほとんどのディストリビューションは、hwclock という小さなプログラムを使って、起動時にハードウェアクロックをもとにしてシステム時間を設定する……ハードウェアクロックが universal time に指定してあれば --utc オプションを使えばいいけれど、これは必ずしもデフォルトではない。
たとえば redhat 5.2 までは、これは /etc/rc.d/rc.sysinit で処理されていて、/etc/sysconfig/clock をロードしてきてこいつが UTC という変数を定義してから hwclockを呼びに行く。
ふつうは、これは Linux のインストールプログラムが選ばせてくれる。ハードウェアクロックを GMT にあわせる、というのがそれだ。
むかしの Linuxの rcには問題があった: シングルユーザモードでも、ファイルシステムを全部マウントしてしまう。2.2 カーネルはこれをお手軽に解決している。MBR に記録されたパーティションが disklabel がないかスキャンされて、もしあったら ! マークがつく。それから残りのディスクがスキャンされて、そのあとに disklabel そのものに戻ってくる。こうすれば OpenBSD のdisklabel を変えても、残りのディスクの設定には影響しない。
とにかく、disklabel のことを知らない Linux カーネルでもちゃんとブートできることを確かめておいたほうがいいだろう。長期的な解決策としては、
inittab と rc スクリプトを確認して、シングルユーザモードでのブートがきちんと動くように、ずぇぇぇぇぇぇぇったいに確実にしておくことだ――ディスクマウントをマルチユーザモードに移しておくのがいちばんいいだろう。
もしディスクが空いているなら、ext2fs パーティションから OpenBSD のインストールができる。ぼくもこれを大昔にやった。当時はその他世界とは slip 接続していて、OpenBSD インストールフロッピーは slipが入っていなかったから。
インストールするまえに、ディスク上のだいじなデータは全部バックアップしとけよ!
ではまず cp floppy*.fs /dev/fd0 をやって、そのフロッピーで起動しよう。
まずブートローダがロードされて、それからブートプロンプトが出てくる。その5秒後に、カーネルとラムディスクのイメージが読み込まれて、カーネルが実行される。しばらくすると、プロンプトがいくつか出てから、fdisk にたどりついて、MBR に新しいパーティションを入れられる。
変更したあとで、ぼくの fdisk ダンプをとるとこんな感じ:
Disk: wd0 geometry: 992/128/63 [7999488 sectors] Offset: 0 Signatures: 0xAA55,0x0 Starting Ending #: id cyl hd sec - cyl hd sec [ start - size] ------------------------------------------------------------------------- 0: 06 0 1 1 - 210 127 63 [ 63 - 1701441] DOS > 32MB 1: 83 211 0 1 - 272 127 63 [ 1701504 - 499968] Linux files* 2: A6 273 0 1 - 991 127 63 [ 2201472 - 5798016] OpenBSD 3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
fdisk ジオメトリによればシリンダー 1024 のことは心配しなくていいようだ。これは linux fdisk の言うこととほぼ一致している。
拡張パーティションを持っていたら、ちょいとばかりむずかしくなる。select を使って拡張パーティションリンクを追いかけて、必要なものをめもってから OpenBSD パーティションを MBR に記入して思い通りの形にしてからすべてを保存する。
パーティション #1 の最後の * は、システムが通常はLinux で起動するという意味だ。実際には lilo が仕切ってこれは完全に無視される。
fdisk が終わるとおもしろいところだ: disklabel そのもの。すべてがうまくいけば、OpenBSD は ext2fs も含め、ディスクから推定できる範囲できれいな disklabel をでっちあげてくれる。
こまごました面倒がほんの少々:
編集が終わったあとで、ぼくの disklabel はこんな感じだ:
# editing # using MBR partition 2: type A6 off 2201472 (0x219780) size 5798016 (0x587880) # /dev/rwd0c: type: ESDI disk: label: TOSHIBA MK4006M flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 7944 total sectors: 8007552 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # milliseconds track-to-track seek: 0 # milliseconds drivedata: 0 16 partitions: # size offset fstype [fsize bsize cpg] a: 104832 2201472 4.2BSD 1024 8192 16 # (Cyl. 2184 - 2287) b: 274176 2306304 swap # (Cyl. 2288 - 2559) c: 8007552 0 unused 0 0 # (Cyl. 0 - 7943) d: 613872 2580480 4.2BSD 1024 8192 16 # (Cyl. 2560 - 3168) e: 920304 4846464 4.2BSD 1024 8192 16 # (Cyl. 4808 - 5720) f: 628992 4217472 4.2BSD 1024 8192 16 # (Cyl. 4184 - 4807) g: 204624 5766768 4.2BSD 1024 8192 16 # (Cyl. 5721 - 5923) h: 1073520 5971392 4.2BSD 1024 8192 16 # (Cyl. 5924 - 6988) i: 962640 7044912 4.2BSD 1024 8192 16 # (Cyl. 6989 - 7943) j: 1701441 63 MSDOS # (Cyl. 0*- 1687) k: 499968 1701504 ext2fs # (Cyl. 1688 - 2183) l: 1023120 3194352 4.2BSD 1024 8192 16 # (Cyl. 3169 - 4183)
おおむね見てすぐチェックできるもの:
そして対応する /etc/fstabはこんな具合:
/dev/wd0a / ffs rw 1 1 /dev/wd0d /usr ffs ro 1 2 /dev/wd0l /usr/local ffs ro 1 2 /dev/wd0e /home ffs rw 1 2 /dev/wd0g /var ffs rw 1 2 /dev/wd0h /big ffs ro 1 2 /dev/wd0f /usr/obj ffs rw 1 2 /dev/wd0i /vbig ffs rw 1 2 /dev/wd0j /dos msdos rw 1 2 /dev/wd0k /linux ext2fs rw /dev/wd0b /tmp mfs rw
ちょいとばかり面倒なポイントとして、disklabel -E モード(あなたがいま使っているヤツ)はパーティションをあちこち動かして、すべての定義されたパーティションが連続しているようにするってことだ。このせいで、b 0 * を使わずにすむんならそれにこしたことはない。さもないと穴をなくすのにパーティションがあちこち動かされて、きびしい MBR パーティションが無視されることになりかねない。 ext2fs と DOS パーティションは、すべてうまくいけば自動的に認識されて配置されるはず。
disklabel がディスクに書き込まれてしまえば、インストールはいつも通りにつづく。
ext2fs パーティションは、OpenBSD 側からなんの問題もなく使える。
初めてシステムを再起動したら、期待通りに OpenBSD に入ってくれなかった……マスターブート領域に Lilo をインストールしたのをすっかり忘れていて、lilo はアクティブパーティションのフラグを無視するもんね。この修正はごく簡単で、Linux システムのほうで /etc/lilo.conf を編集して OpenBSD のエントリを加えるだけだ
boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=500 other=/dev/hda3 label=bsd table=/dev/hda image=/boot/vmlinuz-2.2.3 label=linux vga=4 root=/dev/hda2 read-only image=/boot/vmlinuz-2.0.36-0.7 label=linux.orig root=/dev/hda2 read-only other=/dev/hda1 label=dos table=/dev/hda
ちょっと細かい話。ぼくは心配性なのでもとの redhat インストールのカーネルを vmlinuz-2.0.36 という名前でとってあるけれど、本当のセットアップは bsd, linux, dosしか使ってない。
編集を終えたら lilo を実行しなおそう(これを絶対に忘れないこと)。/sbin/lilo だ。これであーら不思議、OpenBSD が起動しますよ!
2.2 カーネルは、ぼくのパッチを採用してくれていて OpenBSD パーティションをきちんと扱ってはくれる。たぶん BSD の disklabel を認識させるには、Linux カーネルを設定し直して再構築しなきゃダメだろう……ぼくのマシンだとこんな感じで表示される:
Partition check: hda: hda1 hda2 hda3! < hda5 hda6 hda7 hda8 hda9 hda10 hda11 hda12 hda13 hda14 hda15 >
そしてぼくの linux fstabはこんな具合:
/dev/hda2 / ext2 defaults 1 1 /dev/hda6 swap swap defaults 0 0 /dev/hda5 /bsd ufs ufstype=44bsd 1 2 /dev/hda7 /bsd/usr ufs ufstype=44bsd 1 2 /dev/hda8 /home ufs ufstype=44bsd 1 2 /dev/hda9 /bsd/usr/obj ufs ufstype=44bsd 1 2 /dev/hda1 /dos vfat defaults 1 2 /dev/fd0 /mnt/floppy ext2 noauto 0 0 /dev/cdrom /mnt/cdrom iso9660 noauto,ro
2.2 カーネルには、まともに動く UFS も入っているけれど、ufs パーティションに書き込むときには問題が起きるかもしれない。ufstype=44bsd というのに注目。これを mount で忘れると失敗してくれる。インストールの方法によって、これは失敗しましたというメッセージを表示するか、あるいは/var/log/ を掘り返してエラーメッセージを探すことになる。
これには単に BSD カーネルを COMPAT_LINUX つきでコンパイルしなおして、compat_linux(1)の説明にしたがって /emul/linux を設定すればいい。GENERIC カーネルを使っているなら、コンパイルしなおす必要もない。すでにデフォルトで入っているから。
Linux ファイルシステムのマウントポイントは別のところにしておいて、シンボリックリンクを張ろう。そうすれば何が使われるかを厳密にコントロールできる。
完全な linux システムがあるんだから、ports の emul/linux_lib にはさわらなくてよろし。linux_lib は、動く Linux システムがない人のための Linux ライブラリ集なんだから。
問題になるかもしれないちょっとしたこと: uname は Linux 互換で走らせているときでも、相変わらず `OpenBSD' を名乗る。なぜこうするかというと、netscape に自分が Linux マシンで走っていると知られたくないからだ。OpenBSD のもとで動いてるんだから。
一部のプログラム、たとえば maple は、uname が `Linux' と答えてくれる必要がある。maple の場合、これはすぐなおせる。/usr/local/maple/bin/maple.system.type をいじって、OpenBSD を Linux と同じくらすに入れてチェックすればいい。
同じようなシェルスクリプトも簡単になおせる。 suid で走らないバイナリは LD_PRELOADでだまくらかせる。
原則として、これはプログラムごとに解決するものだ。ネットワークプログラムで、自分が OpenBSD 上で動いていると名乗っているものが増えればふえるほどめでたいのである!
さっきラップトップの linux 側を、redhat 5.2 でインストールしなおしたんだけれど、この
CD ってば、linux パーティションが2 つないとダメとか言いやがんの:root パーティションとスワップパーティションと(メモリ 32 Mb あるから、インストールには十分なのにね)。カーネルは 2.0.36 なので、BSD
disklabel は扱えないときた。だからスワップ領域を使えと指定できない(ディストリビューションに標準で付属してくる 2.2 の起動用カーネルも、どうせBSD disklabel
が扱えなくなってるんじゃないかという悪い予感がするね)。だから最後の OpenBSD パーティションをバックアップして、fdisk 設定をいじくって最後のシリンダーをスワップパーティションにして、この腐りきったインストール CD に喰わせてやんなきゃならなかた。それから最新カーネルソースを
linux 側にもってきて、コンパイルしなおしてまともに機能する linux をセットアップ。最後に、fdisk/disklabel をふつうの状態に戻してやって、バックアップしておいたパーティションをふつうの場所に復帰させてあげた。
この文書の一つ前のバージョンは、もっとアヤシイ細部にまで入り込んだ説明をして、まあどうみても危険きわまるインストールの指示なんかまで書いてあったのだった。
とはいうものの、ここまで読んでくれば、OpenBSD disklabel がハードディスクの記述の一つにすぎないことはわかっただろう。これは MBR の記述とはほぼ完全に独立している (ブートプロセスに見つけてもらえるようなセクターにさえあればいいだけ)。でも情報がマッチしないと、困ったことになる場合もある。だから MBR パーティションの中で暮らせるようにしておいてあげてね。もちろん、自分のやってることが完全にわかっているならそうしなくてもいいけど、問題がおきても、そこから抜け出す手伝いがあるとは期待しないどくれ。きみの設定がどうしようもなく異様なものなら、だれも助けてあげられないよ。
boot プロセスに関する限り、lilo は拡張パーティションも含め、MBRに記録されているどのパーティションからでもブートできるはずだと思う。唯一の制約は、次のステージのブートストラップが絶対にすべて BIOS から見て、ディスクの最初の 1024 シリンダー内で起こらなくてはならないということ。OpenBSD のMBR パーティションでシリンダー 1024 以降にまで広がるものは特に問題にならない。disklabel のroot (a) パーティションさえ、シリンダー1024をこえて広がっていない限り。
Windows, OpenBSD, linux はすべてその制約を受けるから、いちばん簡単なのはまず Windows パーティションからはじめて(全体が最初の 1024 シリンダーにおさまるようにして)、その次に linux boot パーティション(これも最初の 1024 シリンダーにおさめる)、そしてそれから OpenBSD 領域 (これは上限さえ守れば、1024 シリンダの境目をまたがってもいい)、そしてその後に残りのlinux パーティション、という具合にすることだ。
もっと異様な設定をしても、保証はなにもないからね。同じディスクにbsd系を複数のせるのは、不可能ではないかもしれないけれど、でも扱いはむずかしくなる。
最後に、そもそもどれだけディスクが空いてるわけ? ホントにそんなにいっぱいOSを一つのディスクに押し込めないとダメ? 別のディスクにのせたほうがいいよ。こんなことまでするようになるくらいなら、Linuxカーネルをハックしていくつかディスクラベルを認識するようにするとか、あるいはおおむね自分が何やってるかくらいは、わかってないとダメだからね。
www@openbsd.org
$OpenBSD: INSTALL.linux,v 1.3 2000/05/17 09:57:51 espie Exp $