Maのエッセイへ

クインチュプルブート

「quintuple」……5倍の,五重の

 平成3年頃,使っていたコンピューターと言えば,
・ちょっとしたプログラミングはEPSONのHC-20(小さいながらプリンターとマイクロカセットテープ(外部記憶媒体)と液晶ディスプレーとフルサイズのキーボードがA4サイズにまとまっていてよい機械でした。処分するんじゃなかった……。)
・プログラミングもしたけどもっぱらゲーム機だったApple IIcとPlus化されたDynaMac
・完全ゲーム機だったEPSONのPC-286C,それに当たり前だけどファミコン,ゲームボーイ
・コンピューター通信というかワープロ通信にソニーのproduceってワープロ ってところでした。
 そこに「中古でワークステーションが手に入る」という話があって,
 NEWS1250を確か28万円で買ったのかな。
 それでプログラミングとか文章書くとかコンピューター通信やるつもりでいろいろしていたんだけど……。
 ワープロの方がまだ手軽だったのと,やはり机に置くにはでかすぎるので,
 自然にプログラミングにしか使わなくなり……
 やがて確かEのキーがチャタリングとか起こし始めたので,だんだん触らなくなってしまいました。

 以来「ワークステーション」の復活は私にとっての夢となり,なんとかUNIX系OSをインストールしてというのを目指していたのですが……。(ここで手段と目的が入れ替わっているという冷静な指摘はしないように(笑))
 他の所でも書いたとおり,日本語処理に難があったり,余計なプログラムがたくさん入っていて,簡単なシステムになっていなかったりで,結局「windows機でやっちゃう」状態が続いておりました。
 「UNIX系OSでwindowsも動かせるようにすればある種のゲームができる」「それ以外の通信やプログラミング,文書作成をCUIなシステムでできるようにする」の2本立てで試行錯誤を続けてきたわけです。

 転機になったのはUbuntuのインストールが簡単で,かつそのままで日本語が読み書きできて,ブラウザも動いて,UNIX系だからプログラミングもすぐできるということの実体験でした。で,以前から温めていたアイデアを一気に実現することにしたのです。
 すなわち……
・日本語処理に難があるけど簡単なシステムの最短距離ではないかと踏んでいるminix ・日本語に苦労が必要そうだけど割とCUIにしやすくてminixの次くらいに簡単なシステムに近くできるFreeBSDとgentoo linux ・windowsを使わずにある種のゲームができることが実現しそうなUbuntu (linux)+wine ・Ubuntu+wineでも動かないゲームのために必要なwindowsXp を1台のコンピューターの中に入れてしまおうというものです。

問題点の把握

 HDD1台に5つOS入れようという人はなかなかいないわな。(笑)
 私は元々原理原則で考えてまして,
 「HDDを4つのパーティションに分けられるのであれば,4つのOSは入るんじゃないの?」
 「だけど5つは無理でしょう。」
と思っていたのです。でもインターネットで検索かけると,入れる順番が関係してくるなんてことが結構書かれているし,実際私がやってみても「簡単なインストールだと細かい指定ができずにしかも先に入れたのが動かなくなる」なんてことがあったわけで,結局「あの機械にはこれとこれ,別の機械には別のこれとこれ。」みたいになっていました。
 この疑問をきれいに解決してくれたのが,http://wikiwiki.jp/disklessfun/?multiplebootの「マルチブートするなら2段階ブート方式に統一しよう」でした。
 しかも私の最初の直感は外れてはいなかったのです。拡張領域がよくわかっていなかったんで「5つは入らない」と思っていたのが間違いだってことで,4つに分けたら4つは入るはずだし,自由に選んで起動できるはずだという点は正解。そして本当の正解は「お手軽にインストールするだけでもそのOSのインストーラーが対応している限りいくらでも入る」なのです。

 いくらでも入る理由,言い換えればいくらでも領域が作れる理由についての詳細は,たとえばhttp://nobumasa-web.hp.infoseek.co.jp/partition/partition.htmlの「パーティションとその切り方」を見てください。イメージとしては……HDDの記憶領域を1列に並べてしまいましょうか。先頭から順番に番号を振っていく。そして1番のスペースには電源投入後最初にHDDにアクセスした時に動かすプログラムと4つのパーティションの先頭の番号を書いておくことにするのです。
例えば……
1番 最初に動かすプログラム,ちなみに第1領域は2番から,第2領域は10番から,第3領域は20番から,第4領域は30番から
2番〜9番 第1領域
10番〜19番 第2領域
20番〜29番 第3領域
30番〜最後 第4領域
という感じですね。
で,ここまでは実は基本(プライマリー)領域も拡張(エクステンド)領域も違いはありません。
基本領域と拡張領域の違いというのは,「4つの領域」という制限を取り払うことにあるのです。
1番に入っている情報はプログラムと4つの領域のいわば目次でした。そして,この目次が直接の位置を示す必要があるとなるともし4つではなく10個の領域であれば10個の目次スペースを用意しなきゃいけない。でも直接示さなくてもいいじゃないか,「第3領域の中の何番目」という指定でもいいじゃないか,そういう指定だと必要な情報にたどりつくのに直行できずに間接的になって時間かかるんだけど,それでもたくさんの領域があれば幸せになるじゃないかという場合にそれを可能にしようというのが拡張領域なんですね。
拡張領域の中はどうなっているかというと,その中の1番はやはりその領域内で電源投入後最初にHDDにアクセスした時に動かすプログラムとパーティションの先頭の番号を4つ分書いておくことにするのです。でも……違うのはここから先で4つの目次のうち使うのは2つだけで,残り2つは使いません。そして目次2番目で指す先はやはり「1番目と2番目以降があるよ」って約束にするのです。
例えば
1番 最初に動かすプログラム,ちなみに第1領域は2番から,第2領域は10番から,第3領域は20番から,第4領域は拡張で30番から
2番〜9番 第1領域
10番〜19番 第2領域
20番〜29番 第3領域
30番 1番最初に動かすプログラム,ちなみに第1領域は31番から,第2領域は40番から
31番〜39番 第4領域の中の第1領域
40番 1番最初に動かすプログラム,ちなみに第1領域は41番から,第2領域は50番から
41番〜49番 第4領域の中の第2領域の中の第1領域
50番 1番最初に動かすプログラム,ちなみに第1領域は51番から
51番〜最後 第4領域の中の第2領域の中の第2領域の中の第1領域


余談なのですが,この構造,私に言わせればlispにおけるリストの内部構造のまんまです。
セルを (xxx . xxx) で表現するときに
(xxx . (yyy . (zzz . uuu) ) )ってやればいくらでも長くできるでしょ……って話と一緒。
minixでi-nodeがブロックを指すのに直接ブロックを指定するとファイルの大きさが限られるから,大きいファイルにも適用できるように直接ブロックは指定せず,ブロックを指定したブロックを指定するという間接的な指定をすれば,アクセスの手間は増えるけど,結果的にたくさんのブロックを指定できて,大きいファイルも扱えるようになる……というのも一緒ですな。
(余談終了)

 この時に「第4領域の中の第1領域」「第4領域の中の第2領域の中の第1領域」「第4領域の中の第2領域の中の第2領域の中の第1領域」なんて区別するのは大変だから,概念としては「拡張領域の中では同レベル」と見て「論理領域」として「第4領域の中の第1論理領域」「第4領域の中の第2論理領域」「第4領域の中の第3論理領域」とやりましょうというのが論理領域なわけだ。


これまた余談
(xxx . (yyy . (zzz . uuu) ) )は面倒だから
(xxx yyy zzz . uuu)って書きましょうというlispとここでも同じ話。
(余談終了)

 そうだとすると,コンピューターは実際のアクセスの際,基本領域や拡張領域自身は「4つの目次」に直接書いているからすぐ区別つくけど「第4領域の中の第3論理領域」については4つの目次のうちの4つめだとはすぐわかるけど,そこから先は実際にたぐってみなきゃわからない。「第4領域の中の第2領域の中の第2領域の中の第1領域」というようにたぐってみて,ようやく「これが結局「第4領域の中の第3論理領域」なんだな」とわかることになるのです。


さらに余談
結局どこまでいってもlispと同じ筋。
(xxx yyy zzz . uuu)のuuuが4番目だというのは,人間だと一目でわかるかもしれないけど,コンピューターは一目見てというわけにいかないから(xxx . (yyy . (zzz . uuu) ) )だとして最初から数えて探していくって話です。もっとも人間だって本質的には1番から数えているわけで,それが証拠に例えば国語辞典で「150番目の見出し語」って言われたら1から数えていくしかないわけでしょ?ページ数という目次をつけておけば「p24」みたいな指定に対していきなりp24をひけるけど。(とはいえ,一発でそこに行ける人間はやはり少ない。たいていは多少ずれてページをめくりなおす。)
加えて,(xxx yyy zzz . uuu)でzzzを削っちゃうとuuuは3番目になるわな。たぐっていってzzzがなければ。windowsでいうドライブレターがたぐっていって順にDEF……なんだとすれば,領域削ったり増やすと場合によってドライブレターも変わっちゃう場合が出てくるのが自然だよね。
(余談終了)

 ここまでの話だと「それじゃあ4つとも拡張領域にしてしまえば無限に作れるんじゃない?」ということになるし,実際そう。
 ただ……ものがAT互換機なだけにPC-ATを作ったIBMは,おそらく技術的に楽になるために,
「最初に動かすプログラムがない場合にはactiveな領域にある最初に動かすプログラムを動かす」
「activeな領域は1つしか設定できない」
「activeな領域は基本領域に限り,論理領域や拡張領域自体には設定できない」
という制限を課したんですね。
 だけどこれはHDDの本質ではないから,それなりのプログラムを用意すれば,なんとでもなるんですよ。
 HDDの先頭に「どの領域に行くか」選択する(だけの)プログラムを用意し,その領域ごとに同様に「どのプログラムを起動するか」を書いておけば……自由自在。
……長い前ふりがようやく終わった……。
  ……本編すぐ終わっちゃうかも……(泣)

 さて,OSによってはさらに妙な制限や挙動を示します。

 まずwindows。
 windowsは基本的に「OSは自分しか入ってないはずだぜ。仮に複数あってもそのうちの1つに全ての情報を集中させるぜ」という思い込みで動きます。なもんで,新規インストールすると,たいていMBR書き換えるし(確か95系(98,Me)と2000は同居できたはず),しかもNT,2000及びXp以降のいわゆるNT系は,「NT系入ってます」という情報まで書き込む。加えて,新規じゃなきゃ,その書き込んだ情報のチェックの結果おかしければ起動を止めて「いいんですか?」と聞いてきたんだけど,vista以降では「いいんですか?」だけじゃすまなくて「直さないと嫌!直すまで動かない!」となり,加えて直す時に「そのうちの1つに全ての情報を集中させるぜ」とやらかしてしまうのです。
 もっともたいていの人のたいていの使い方だとこの方が便利なんだろうけど……。
 このことから,マルチブートではたいてい「最初にwindows」と言われて来たところ。
(ちなみにもう1つの理由として,いわゆるHDDの壁が言われる場合,windowsはその壁の手前でしか起動できないというのもあった。でもこれ,問題のねっこは一緒だな。)
 でも幸いなことに,vistaや7は確認していないけど,Xpまでだと書き換えたところで「初期化」のはずで,「1番見なくても普通に動くよ」って話のはず。1番にあるプログラムを無視するわけじゃないから,1番にプログラムを書き込んじゃえばいい。万が一消されてもまた入れればいい。
 ちなみにここで1番に書き込むプログラムは「どの領域に行くか」を選択するプログラムを入れれば一番便利なはずで,その1つがmbmだったりします。私個人はFreeBSDが希望によりインストールしてくれるboot0の方がシンプルで好きなのですが,拡張領域からの起動がいまいちわかりにくいので,今のところmbmを使っています。この種のプログラムを「ブートマネージャー」と言います。(でもマイクロソフトのブートマネージャーは選択ができなかったり,OSをある程度動かして,その中のプログラムで選択させる方式だったりする。こうなると「どこまでがブートマネージャーか」って定義の問題になっちゃう。)
 言い換えるとwindowsの場合,「OSは自分しかいない」と思い込む癖はあるけど,先にまともなブートマネージャーが動けば,それを無視するわけではないので(というか別のブートマネージャーから呼ばれたって,マイクロソフト謹製のブートマネージャーから呼ばれたと思い込んでくれるから)ブートマネージャーだけなんとかすることで問題は解消できるのです。

 次にlinuxというかgrub。
 多機能なんで人気高いけど,もしインストールの時にgrubが自動的に入り設定も自動でやってくれていると,えてして,「1番に書き込んで,そこに入りきらないから,特定の場所に飛んで動作を続ける」なんてことになってしまう。
 その特定の場所がなくなってしまうと……,他の領域のプログラムも動かないってことになるのです。
 http://wikiwiki.jp/disklessfun/の作者が主張する2段階ブートの徹底というのは,「ブートマネージャーはどの領域に行くかだけの仕事をして,行った先の領域でプログラムを起動するのはそれぞれの領域のプログラムにまかせた方が,OSの入れ替え,アップデートなどに柔軟に対処できる。」ということだと私は理解しています。
 よってlinuxについてはgrubをなんとかする。grubには自分の領域のことだけやってもらうようにする。

 これらの点で融通がきくのが,FreeBSDとminixです。各領域に入るとあまり複雑なことをせずに動き始めてしまう点はwindowsにも共通するし,それでいてwindowsみたいな思い込みもない。(あえていえばFreeBSDだと複数のバージョンを別領域に入れる時に注意が必要か。でも「やり方を忘れるくらい簡単なやり方」で簡単にクリアできちゃった。)
 ただし,融通がきかない点もあって,標準的インストーラーは論理領域にはインストールしてくれない……。

具体的な手順

1 まずmbm(http://elm-chan.org/fsw/mbm/mbm.html)を準備します。
2 次にwindowsXpをインストールします。(第1基本領域)
3 インストール後mbmをインストールします。
4 次にFreeBSDやminix(第2や第3の基本領域)やgentoo linux(拡張領域の中の第1論理領域)をインストールします。
5 最後にUbuntuを(第2論理領域)インストールします。
  最終的なインストールの確認の時に「拡張」ボタンを押して,ブートマネージャーのインストール先をubuntuの区画を示すHDD名に変更するのを忘れないように

 windowsのインストールの後にmbmのインストールをするってことだけ間違えなければ,別に冒頭でなくてもかまいません。とはいえ私はHDDのパーティションを切るのに(あれだけfdiskが好きってさんざん言っておきながら)設定→コントロールパネル→コンピューターの管理→ディスクの管理を多用したので,最初に持ってきました。
 この順でインストールすると,gentooはgrubなどの設定をしていないので,mbmからは動きません。しかし後述するようにubuntuを入れると「mbmでubuntuを指定し,ubuntuのgrubでgentooからの起動も可」設定になるので,gentooのgrubをきちんと設定できるようになるまで,(2段階ブートの原則は崩れるけど,暫定ということで許してもらって)しのげるのです。  Ubuntuを最後にしたのも本質的ではなく,インストールする領域の指定が「1番最後にインストールする場合にとても楽」ということと,grubがgentooの起動も含めてくれるため,当座楽だということにすぎません。

 ということで,今MS-1058では5つのOSが起動可能になっているという話なのでした。

(2009.12.21.)

Maのエッセイへ