diff --git a/ja_JP.eucJP/articles/dialup-firewall/article.sgml b/ja_JP.eucJP/articles/dialup-firewall/article.sgml index 4cbea8fcca..81770a3a76 100644 --- a/ja_JP.eucJP/articles/dialup-firewall/article.sgml +++ b/ja_JP.eucJP/articles/dialup-firewall/article.sgml @@ -1,443 +1,444 @@ %man; ]>
FreeBSD によるダイアルアップ式ファイアウォールの構築 Marc Silver
marcs@draenor.org
$FreeBSD$ この記事は FreeBSD の PPP ダイアルアップと IPFW を用いながらどのようにファイアウォールをセットアップするか、 特に動的に割り当てられた IP アドレスによるダイアルアップ上のファイアウォールについて、 事実を元に詳細に説明します。 なお、前段階である PPP 接続についての設定は触れていません。
序文 FreeBSD によるダイアルアップ式ファイアウォールの構築 この文書はあなたの ISP によって IP アドレスを動的に割り当てられた時、 FreeBSD でファイアウォールをセットアップために 要求される手順を扱うことをめざしたものです。 この文書を可能な限り有益で正確なものにするために努力しているので、 どうぞ意見や提案を marcs@draenor.org に送って下さい。 カーネルオプション 最初になすべきことはカーネルを再コンパイルすることです。 カーネルを再コンパイルする方法についてさらに情報が必要なら、 ハンドブックの カーネルのコンフィグレーションの節から読み始めるのが最適でしょう。 カーネルを以下のオプションをつけてコンパイルする必要があります: options IPFIREWALL カーネルのファイアウォールのコードを有効にします。 options IPFIREWALL_VERBOSE システムの logger へ記録されたパケットを送ります。 options IPFIREWALL_VERBOSE_LIMIT=100 記録されるマッチするエントリの数を制限します。 これはログファイルがたくさんの繰返しのエントリで一杯になるのを抑制します。 100 は使用上無理のない数ですが、 自分の要求に基づいて調整することができます。 options IPDIVERT divertソケット (後述) を有効にします。 更なるセキュリティのために、 カーネルの中に組み込むことのできるオプションが他にいくつかあります。 これらはファイアウォールを動かすためには必要ではありませんが、 セキュリティに猛烈にこだわるユーザは有効にしてかまいません。 options TCP_DROP_SYNFIN このオプションは SYN と FIN のフラグをもった TCP パケットを無視します。 これは マシンの TCP/IP スタックを識別するので - nmap などのようなツールを妨げることができます。 + security/nmap + などのようなツールを妨げることができます。 しかし RFC1644 拡張のサポートに違反しています。 これは現在稼働している web サーバには推奨しません いったんカーネルを再コンパイルしたら再起動しないで下さい。 希望的にも、 ファイアウォールの設置を完了するために一回だけ再起動する必要があります。 ファイアウォールを搭載するように <filename>/etc/rc.conf</filename> を変更する ファイアウォールについて /etc/rc.conf をのことを述べるために、そこにいくつかの変更を行います。 単純に以下の行を加えます: firewall_enable="YES" firewall_script="/etc/firewall/fwrules" natd_enable="YES" natd_interface="tun0" natd_flags="-dynamic" 上記の設定に関するより詳しい情報は /etc/defaults/rc.conf を参照した上で、 &man.rc.conf.5; を読んで下さい。 PPP のネットワークアドレス変換を無効にする もしかすると既に PPP の組込みネットワークアドレス変換 (NAT) を利用しているかも知れません。 それを無効化しなければならない場合であるなら、 &man.natd.8; の例を使い、同じようにして下さい。 既に PPP の自動スタートのエントリのまとまりがあるなら、 多分こんなふうになっているでしょう: ppp_enable="YES" ppp_mode="auto" ppp_nat="YES" ppp_profile="profile" もしそうなら、/etc/rc.conf に (訳注: /etc/defaults/rc.conf で定義されている ppp_nat の初期値は YES なので) ppp_nat="NO" を明示的に設定して無効にする必要があります。 また /etc/ppp/ppp.conf の中の nat enable yes または alias enable yes を削除する必要があるでしょう。 ファイアウォールへのルールセット さて、ほとんどのことをやりおわりました。 残る最後の仕事はファイアウォールのルールを定義することです。 それから再起動すると、ファイアウォールが立ち上がり稼働するはずです。 私はルールベースを定義する段階に達すると、 すべての人が若干異なる何かを求めているのだとと実感しています。 私が努力してきたのは、 ほとんどのダイアルアップユーザに適合したルールセットを書くことです。 あなたは自分の必要のために以下のルールを土台として用いることによって 自分用のルールベースに変更することができます。 まず、閉じたファイアウォールの基礎から始めましょう。 望むのは初期状態ですべてを拒否することです。 それからあなたが本当に必要とすることだけのためにファイアウォールをあけましょう。 ルールはまず許可し、それから拒否するという順番であるべきです。 その前提はあなたの許可のための規則を付加するとういことで、 それから他の全ては拒否されます。:) では /etc/firewall ディレクトリを作成しましょう。 ディレクトリをそこへ変更し、 rc.conf で規定した fwrules ファイルを編集します。 このファイル名を自分が望む任意のものに変更できるということに気をつけてください。 この手引きはファイル名の一例を与えるだけです。 それでは、ファイアウォールファイルの設定例を見てみましょう。 注釈も参考にしてください。 # Firewall rules # Written by Marc Silver (marcs@draenor.org) # http://draenor.org/ipfw # Freely distributable # (/etc/rc.firewall にあるように) 参照を簡単にするためにファイアウォールの # コマンドを定義します。読みやすくするのに役立ちます。 fwcmd="/sbin/ipfw" # 再読込みする前に現在のルールの消去を強制します。 $fwcmd -f flush # トンネルインタフェースを通じてすべてのパケットを divert します。 $fwcmd add divert natd all from any to any via tun0 # 自分のネットワークとローカルホストからのデータをすべて許可します。 # 再起動する前に自分のネットワークカード (私のは fxp0 です) に変更するのを確認しましょう。:) $fwcmd add allow ip from any to any via lo0 $fwcmd add allow ip from any to any via fxp0 # 自分が着手したすべての接続を許可します。 $fwcmd add allow tcp from any to any out xmit tun0 setup # 接続がいったん作成されると、それを許可して開けておきます。 $fwcmd add allow tcp from any to any via tun0 established # 以下のサービスへ接続することをインターネット上のすべての人に許可します。 # この例では ssh と apache への接続を許可します。 $fwcmd add allow tcp from any to any 80 setup $fwcmd add allow tcp from any to any 22 setup # すべての ident パケットに RESET を送ります。 $fwcmd add reset log tcp from any to any 113 in recv tun0 # 規定されたサーバに対して *のみ* 外部 DNS の問い合わせを許可します。 $fwcmd add allow udp from any to x.x.x.x 53 out xmit tun0 # 応答とともに戻ってくることを許可します。:) $fwcmd add allow udp from x.x.x.x 53 to any in recv tun0 # (ping と traceroute を動作させるために) ICMP を許可します。 # これを非許可にしたいと思うかもしれませんが、 # 需要を保ちつづけるには適していると感じています。 $fwcmd add allow icmp from any to any # 残りの全てを拒否します。 $fwcmd add deny log ip from any to any あなたは 22 番と 80 番のポートへの接続を許可し、 それ以外に試みられるすべての接続を記録する 十分に機能的なファイアウォールを手にしました。 では、あなたは安全に再起動することができて、 あなたのファイアウォールはうまく立ち上がるはずです。 もしこれに正しくないことを見つけたら、 もしくは任意の問題を経験したら、 さもなくばこのページを向上させるための任意の提案があるなら、 そのいずれにしても、どうか私に電子メールを下さい。 質問 組込みの &man.ppp.8; フィルタを使ってもよいのに、 なぜ &man.natd.8; と &man.ipfw.8 を使っているのですか? 正直に言うと、 組込みの ppp フィルタの代わりに ipfwnatd を使う決定的な理由はないと言わなければなりません。 いろいろな人と繰り返してきた議論より、 ipfw は確かに ppp フィルタよりもパワフルで設定に融通がきく一方、 それが機能的であるために作り上げたものはカスタマイズの容易さを 失っているということで意見の一致をみたようです。 私がそれを使う理由のひとつはユーザランドのプログラムでするよりも、 カーネルレベルで行うファイアウォールの方を好むからです。 limit 100 reached on entry 2800 のようなメッセージを受け取った後、 ログの中にそれ以上の拒否を全く見なくなりました。 ファイアウォールはまだ動作しているのでしょうか? 単にルールのログカウントが最大値に達したということを意味しています。 ルール自身はまだ機能していますが、 ログカウンタをリセットするまでそれ以上ログを記録しません。 ipfw resetlog コマンドにより、 ログカウンタをリセットすることができます。 また、この限界値を上述の オプションで 変更することもできます。 さらに、この値は (カーネルを再構築して再起動せずに) net.inet.ip.fw.verbose_limit を &man.sysctl.8; で変更することができます。 もし内部で 192.168.0.0 の範囲のようなプライベートアドレスを使用しているなら、 $fwcmd add deny all from any to 192.168.0.0:255.255.0.0 via tun0 のようなコマンドを 内部のマシンへ試みられる外部からの接続を防止するために ファイアウォールのルールに追加してもいいですか? 端的な答えは no です。 この問題に対するその理由は natdtun0 デバイスを通して divert されている あらゆるもの に対してアドレス変換を行っているということです。 それが関係している限り、 入ってくるパケットは動的に割り当てられた IP アドレスに対してのみ話し、 内部ネットワークに対しては話さないのです。 ファイアウォール経由で外へ出て行くホストから あなたの内部ネットワーク上のホストを制限する $fwcmd add deny all from 192.168.0.4:255.255.0.0 to any via tun0 のようなルールを追加することができるということにも気をつけてください。 何か間違っているに違いありません。 私はあなたの説明に文字通り従いましたが、 締め出されてしまいました。 このチュートリアルはあなたが userland-ppp を稼働していて、その結果 tun0 [&man.ppp.8; (またの名を user-ppp) で作られる最初の接続に相当します] インタフェース上で供給されたルールセットが動作していることを想定しています。 さらなる接続は tun1tun2 などを用います。 &man.pppd.8; が ppp0 インタフェースを代わりに用いるということにも注意するすべきです。 よって &man.pppd.8; による接続を始めるなら ppp0 の代わりに tun0 を用いて下さい。 この変更を反映するファイアウォールのルールを 編集する早道は以下に示されています。 元のルールセットは fwrules_tun0 としてバックアップされています。 &prompt.user; cd /etc/firewall /etc/firewall&prompt.user; su Password: /etc/firewall&prompt.root; mv fwrules fwrules_tun0 /etc/firewall&prompt.root; cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules いったん接続が確立したら、 現在 &man.ppp.8; か &man.pppd.8; のどちらを利用しているかを知るために &man.ifconfig.8; の出力で検査することができます。 例として、&man.pppd.8; で作成された接続では、 このようなものが目にするでしょう (関係のあるものだけ示しています)。 &prompt.user; ifconfig (skipped...) ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524 inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xff000000 (skipped...) 他方で、&man.ppp.8; (user-ppp) で作成された接続では、 あなたはこれに似たものを目にするはずです。 &prompt.user; ifconfig (skipped...) ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500 (skipped...) tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1524 (IPv6 stuff skipped...) inet xxx.xxx.xxx.xxx --> xxx.xxx.xxx.xxx netmask 0xffffff00 Opened by PID xxxxx (skipped...)
diff --git a/ja_JP.eucJP/articles/multi-os/article.sgml b/ja_JP.eucJP/articles/multi-os/article.sgml index 34934169e8..779c1e752d 100644 --- a/ja_JP.eucJP/articles/multi-os/article.sgml +++ b/ja_JP.eucJP/articles/multi-os/article.sgml @@ -1,830 +1,841 @@ - + +%ja-authors; + +%authors; +]>
FreeBSD と他の OS を共存させるには Jay Richmond
jayrich@sysc.com
1996 年 8 月 6 日 ここでは、FreeBSD を (Linux、MS-DOS、OS/2、Windows 95 など) 人気のある他の OS とうまく同居させる方法について説明します。 この文章を書くにあたり、 Annelise Anderson andrsn@stanford.edu、 Randall Hopper rhh@ct.picker.com、 - Jordan K. Hubbard jkh@time.cdrom.com - には、特にお世話になりました。 + &a.jkh; には、特にお世話になりました。
概要 大容量のディスクがないと、大半の人は複数の OS を うまく共存させることはできません。そのため、この文書には大容量 EIDE ドライブに関する記述も含まれています。 複数の OS を同居させる場合、ハードディスクの設定や OS の組合せというのは非常にたくさんありますが、 おそらく が最も役に立つ章でしょう。 その章には、複数の OS を使用するために特に必要な コンピュータ設定についての詳細が書かれています。 この文書では、ハードディスクに OS を追加できるだけの空き容量があることを前提としています。 ハードディスクのパーティションを再度切り直すと、 既存のパーティションにあるデータを壊すことになりかねません。 しかし、ハードディスクが完全に DOS で占められているようであれば、 (FreeBSD CDROM の中の \TOOLS ディレクトリ、 あるいは ftp から取得できる) FIPS ユーティリティが役に立つことでしょう。 このツールを使えば、データを破壊することなくハードディスクの パーティションを切り直すことができます。 また、データを破壊せずにパーティションのサイズを変更したり削除できる - Partition Magic という商用のプログラムも出回っています。 + Partition Magic + という商用のプログラムも出回っています。 ブートマネージャの概要 ここでは、おそらくあなたが目にするであろう、 いくつかのブートマネージャについて簡単に説明します。 コンピュータの設定によっては、同じシステム上で 1 つ以上の ブートマネージャを使用した方が便利な場合があります。 Boot Easy これは、FreeBSD で標準に使用されている ブートマネージャです。 大半の OS が起動可能で、 BSD、OS/2 (HPFS)、Windows 95 (FAT および FAT32)、Linux などをサポートします。 ファンクションキーで起動パーティションを選択することができます。 OS/2 Boot Manager - これは、FAT、HPFS、FFS (FreeBSD)、および EXT2 (Linux) - の起動に対応していて、FAT32 パーティションもサポートします。 + これは、FAT、FAT32、HPFS、FFS (FreeBSD)、および EXT2 (Linux) + の起動に対応しています。 パーティション選択は、カーソルキーで行います。 OS/2 Boot Manager は、他のマスターブートレコード (MBR) を 使用するブートマネージャと異なり、 唯一、自分用にひとつパーティションを占有します。 そのため、起動時の問題を避けるために、 第 1024 番目より前のシリンダにインストールしなければいけません。 ブートマネージャが MBR ではなく、起動セクタの一部にある場合は、 LILO を使っている Linux を起動することができます。 OS/2 Boot Manager で Linux を起動させる方法の詳細は、 次のサイト Linux HOWTO を参照してください。 OS-BS これは、Boot Easy に類似したもので、 起動のタイムアウト設定や起動のデフォルトパーティションを決めるといった、 起動プロセスの細かい制御が可能です。 このプログラムのベータ版では、 カーソルキーを用いて起動する OS を選択することができます。 - これは、FreeBSD CD-ROM の \TOOLS ディレクトリ、 + これは、FreeBSD CD-ROM の + \TOOLS ディレクトリ、 あるいは ftp に収録されています。 LILO - LInux LOader これは、動作が限定されたブートマネージャです。 FreeBSD を起動することはできますが、 LILO の設定ファイルを少々編集する必要があります。 FAT32 について FAT32 は FAT ファイルシステムに代わるものです。 これは Microsoft の OEM SR2 ベータ版 (訳注: Windows95 の OEM 版の一つ) に含まれていて、1996 年末へ向けて、Windows 95 がプリインストールされた コンピュータで広く利用され始めました。 Windows 95 は従来の FAT ファイルシステムを変換し、 大容量のハードディスクでより小さなサイズのクラスタを利用可能にします。 また、FAT32 は従来の FAT 起動セクタやアロケーションテーブルを 変更するため、いくつかのブートマネージャは利用できなくなっています。 標準的なインストール では、大容量の EIDE ハードディスクが 2 つあり、 FreeBSD、Linux、Windows 95 を同居させたい、 という場合を考えましょう。 このようなハードディスクを使用した場合の 一例について見てみましょう: /dev/wd0 (1 番目の物理的なハードディスク) /dev/wd1 (2 番目のハードディスク) 両方のディスクとも 1416 シリンダあります。 FDISK.EXE ユーティリティが入っている MS-DOS、あるいは Windows 95 boot ディスクから起動させ、 1 番目のディスク上に 50MB のプライマリパーティション (Windows 95 本体に必要な 35-40MB に、少々余分な空きを加えたもの) を作成します。 また、Windows アプリケーションとデータ用として、 2番目のハードディスク上に大きめのパーティションを作成します。 再起動し、C: パーティション上に Windows 95 をインストールします (一言で終わらせられるほど簡単ではありませんが)。 次に Linux をインストールします。 すべての Linux ディストリビューションについて確認したわけではありませんが、 - 少なくとも slackware には LILO ( 参照) + 少なくとも + Slackware + には LILO ( 参照) が含まれています。Linux の fdisk コマンドを使って、ハードディスクを切り分けるとしたら、 - わたしの場合は最初のドライブ (root パーティションと swap + わたしの場合は最初のドライブ (ルートパーティションとスワップ を合わせてだいたい 300MBくらい) に Linux の全システムを入れるでしょう。 Linux をインストールしてから LILO をインストールするかどうか聞かれた時、 LILO のインストール先は MBR (マスターブートレコード) ではなく - Linux の root パーティション上になっていることを必ず確認して下さい。 + Linux のルートパーティション上になっていることを + 必ず確認して下さい。 残りのハードディスクは、すべて FreeBSD にあてます。 - この時、FreeBSD の root スライスが 1024 シリンダを越えないように + この時、FreeBSD のルートスライスが 1024 シリンダを越えないように 気を付けます (ここで想定している 720MB のディスクの場合、 1024 シリンダは 528MB の位置にあります)。 残りのハードディスク (270MB) は、 - /usr と - / スライスにあてることもできます。 - 2 番目のディスクの残りは、/usr/src + /usr と + / スライスにあてることもできます。 + 2 番目のディスクの残りは、 + /usr/src とスワップ領域に使用します。 この残りの容量は、手順 1) で作成した Windows アプリケーション / データのパーティションに依存します。 Windows 95 fdisk ユーティリティで見た場合、 ハードドライブは次のように見えているはずです。 --------------------------------------------------------------------- 領域情報を表示 現在のハードディスク: 1 領域 状態 種類 ボリュームラベル Mバイト システム 使用 C: 1 A PRI DOS 50 FAT** 7% 2 A Non-DOS (Linux) 300 43% ディスクの総容量は 696 Mバイトです。(1 M バイト = 1048576 バイト) 続けるには Esc キーを押してください。 --------------------------------------------------------------------- 領域情報を表示 現在のハードディスク: 2 領域 状態 種類 ボリュームラベル Mバイト システム 使用 D: 1 A PRI DOS 420 FAT** 60% ディスクの総容量は 696 Mバイトです。(1 Mバイト = 1048576 バイト) 続けるには Esc キーを押してください。 --------------------------------------------------------------------- 注) 最新の OEM SR2 をお使いの場合は、 ** の部分が FAT16、FAT32 と表示されることがあります。 詳しくは をご覧下さい。 FreeBSD をインストールします。 最初のハードディスクが BIOS で NORMAL と設定された状態で起動することを確認します。 そうでない場合は、 起動時に適切なディスクジオメトリ情報を入力しなければなりません (ジオメトリ情報を得るには、Windows 95 を起動して Microsoft Diagnostics (MSD.EXE) で調べるか、 BIOS の機能でチェックして下さい)。 ここでのパラメータ hd0=1416,16,63 は、 1416 はハードディスクのシリンダ数であり、 16 はトラックあたりのヘッド数、 63 はトラックあたりのセクタ数です。 ハードディスクのパーティションを切る時には、 Boot Easy が 1 番目のディスクにインストールされていることを確認します。 2 番目のハードディスクは起動と関係ないので、 こちらについて心配する必要はありません。 再起動すると、Boot Easy が DOS (Windows 95)、 Linux、BSD (FreeBSD) という、 3 つの起動可能パーティションを認識します。 注意と考察 大部分の OS は、自分がハードディスクのどの領域に、 どのように配置しているか、ということを非常に気にします。 Windows 95 や DOS は、1 番目のハードディスクの 基本領域にインストールされる必要がありますが、 OS/2 は例外的に、ハードディスクの 1 番目 と 2 番目、 基本領域と拡張領域をまったく問わずにインストールすることができます。 よく分からなければ、起動可能なパーティションを 1024 シリンダ内に入れるようにして下さい。 BSD システムが存在しているところに Windows 95 を載せると、MBR が 破壊 されてしまいます。 そのため、ブートマネージャの再インストールが必要になります。 - Boot Easy は、CDROM の \TOOLS ディレクトリあるいは + Boot Easy は、CDROM の + \TOOLS ディレクトリあるいは ftp - サイトに含まれる BOOTINST.EXE ユーティリティを用いて、 + サイトに含まれる BOOTINST.EXE ユーティリティを用いて、 再インストールすることが可能です。 また、インストーラのパーティションエディタを使って Boot Easy を再インストールすることもできます。 そこから、FreeBSD パーティションを bootable としてマークをつけ、 Boot Manager を選択します。 変更した情報を MBR に (W)rite out (= 保存) するため、W を入力します。 そして再起動すると、 Boot Easy が Windows 95 を DOS として認識するはずです。 OS/2 は FAT、HPFS パーティションを認識しますが、 FFS (FreeBSD)、EXT2 (Linux) パーティションを認識しないことを覚えておいて下さい。 同様に、Windows 95 は、FAT と FAT32 パーティションしか読み書きすることができません ( を参照)。 FreeBSD は、 ほとんどのファイルシステムを読むことができますが、 現時点で HPFS パーティションの読み込みには対応していません。 Linux では、HPFS パーティションを読むことができますが、 書き込みはできません。 最近の Linux カーネル (2.x) のバージョンでは、 Windows 95 VFAT パーティションに読み書きができます (VFAT は、Windows 95 で長いファイル名を利用可能にするもので、 ほとんど FAT と一緒です)。 つまり Linux は、ほとんどのファイルシステムに読み書きができるわけです。 わかりました? そう期待して…。 (この章はまだまだ手を入れる必要があります。 良い例があったら、 jayrich@sysc.com までメールを送って下さい。) FreeBSD+Win95: Windows 95 の後に FreeBSD を載せた場合は、 Boot Easy メニューの DOS という部分を確認して下さい。 これが Windows 95 になります。 もし、FreeBSD の後に Windows 95 を載せてしまった場合は、 上記の を読んで下さい。 お持ちのハードディスクが 1024 シリンダを越えない場合は、 起動時の問題はありません。 パーティションのうち 1 つでも 1024 を越えたものがあり、 DOS (Windows 95) で invalid system disk と表示されたり、 FreeBSD で起動できない場合には、BIOS の >1024 cylinder support あるいは NORMAL/LBA モードの設定を確認して下さい。 DOS が正常に起動するには、おそらく LBA (Logical Block Addressing) モードが必要になります。 毎回起動時にBIOS の設定を切替える方法をとりたくない場合には、 CD に収録されている FBSDBOOT.EXE ユーティリティを使い、DOS を経由して FreeBSD を起動させる方法もあります (このプログラムは、 FreeBSD パーティションを見付けて、起動します)。 FreeBSD+OS/2+Win95: 特に注意すべきことはありません。 OS/2 のブートマネージャは、これらすべての OS を起動することができますので、問題はないでしょう。 FreeBSD+Linux: 両方の OS を起動するのに、Boot Easy を使うこともできます。 FreeBSD+Linux+Win95: ( を参照) 他の参考となる資料 ハードディスク上に複数の OS を同居させる方法について 取り扱っている Linux HOW-TO は、たくさんあります。 Linux+DOS+Win95+OS2 mini-HOWTO には、 OS/2 ブートマネージャの詳細な設定法が書かれています。また、 Linux+FreeBSD mini-HOWTO も同様に参考となるでしょう。 さらに、Linux-HOWTO というサイトもあります。 NT Loader Hacking Guide には、 Windows NT、Windows 95、DOS を、他の OS とマルチブートする方法についての情報が書かれています。 ]]> Hale Landis の How It Works (動作の仕組み) ドキュメント集には、 あらゆる種類のディスクジオメトリ情報や、起動に関する情報が含まれています。 また、以下のリンク ftp://fission.dt.wdc.com/pub/otherdocs/pc_systems/how_it_works/allhiw.ziphttp://www.cs.yorku.ca/People/frank/docs/ にあるものも参考になるでしょう。 最後に、 配布されているカーネルソース (/usr/src/sys/i386/boot/biosboot/README.386BSD に展開されています) に含まれている、FreeBSD カーネルの文書も見落とさないようにしてください。 技術的な詳細 (Randall Hopper、 rhh@ct.picker.com の寄稿によるものです) この章は、 ハードディスクやハードディスクの起動プロセスに関する基礎知識を提供します。 これは、複数の OS を起動する設定で問題が起こった時、 それを解決するのに役立つでしょう。 最初はごく基本的な用語から始まりますので、 章全体を流し読みして、見慣れない内容が出てくるところから 読み始めても構いません。 ハードディスクの基礎 まず、ハードディスク上のデータの位置を示すのに使われる、 基本となる用語が 3 つあります。それは、シリンダ、ヘッド、セクタです。 これらの用語の関係を知ることが、とりわけ重要と言うわけではありません。 が、これらがディスク上の物理的なデータの位置を示す、 ということは覚えておきましょう。 ハードディスクにはそれぞれ、 固有ののシリンダ数、ヘッド数、シリンダヘッドごとのセクタ数があります (シリンダヘッドはトラックとも呼ばれます)。 この情報は、ハードディスクのディスクジオメトリを定義します。 セクタ数は大抵の場合、1 セクタが 512 バイト、 1 トラックが 63 セクタに対応するようになっていますが、 シリンダとヘッドの数はディスクによってさまざまです。 このように、計算すると、 ディスクに納めることのできるデータのバイト数が分かります: (シリンダ数) × (ヘッド数) × (63 セクタ/トラック) × (512 バイト/セクタ) たとえば Western Digital AC31600 EIDE ハードディスクの場合、次のようになります。 (3148 シリンダ) × (16 ヘッド) × (63 セクタ/トラック) × (512 バイト/セクタ) これを計算すると 1,624,670,208 バイト、 つまり約 1.6 GB になります。 ハードディスクの物理的なディスクジオメトリ情報 (シリンダ数、ヘッド数、トラックあたりのセクタ数) は、 ATAID などのインターネット上にあるプログラムを用いて 調べることができます。おそらくハードディスク自体にも、 こういった情報が付属しているでしょう。 しかし注意して欲しいのですが、BIOS LBA ( 参照) を使用している場合、 物理的なジオメトリ情報を得るためのプログラムはどんなものでも良い、 というわけではありません。 これは、数多くのプログラム (たとえば MSD.EXE や FreeBSD の fdisk) が物理的なディスクジオメトリ情報を認識しないためです。 これらはその代りに、 変換されたジオメトリ (LBA を使った仮想的なセクタ数) を報告します。 この言葉が何を意味しているのかについては、後述します。 これらの用語について役立つこととしては、 与えられた三つの数字—シリンダ数、ヘッダ数、 トラックあたりのセクタ数—は、ハードディスク上の特定のセクタ (データの 512 バイトブロック) を絶対位置で決定します。 シリンダ、ヘッドは 0 から、セクタは 1 から番号付けされます。 さらに詳しい技術情報に興味がある方には、 ディスクジオメトリ、起動セクタ、BIOS などに関する情報は ネット上の至るところで得ることができることをお知らせしておきます。 Lycos、Yahoo などで boot sector (起動セクタ)master boot record (マスターブートレコード) などを検索してみてください。 それらの役立つ情報の中でも、 Hale Landis の How It Works (動作の仕組み) ドキュメント集は参考になります。このドキュメント集に関しては の章を参照してください。 もう用語については十分ですね。 次は起動についてお話します。 起動のプロセス ハードディスクの一番先頭のセクタ上 (シリンダ 0、ヘッド 0、セクタ 1) には、 マスターブートレコード (MBR) が存在します。 MBR には、ハードディスクのマップ情報が含まれていて、 最大 4 つの パーティション を認識することができます。それぞれのパーティションは、 ディスク上の連続したデータ領域の塊です。 FreeBSD では、このパーティションを スライス と呼んでいます。これは、FreeBSD 独自のパーティションと混乱しないようにですが、 ここではスライスという言葉は使いません。 各パーティションには、それぞれ別の OS を入れることができます。 MBR の各パーティションエントリには、 パーティション IDシリンダ/ヘッド/セクタの開始位置シリンダ/ヘッド/セクタの終了位置 があります。パーティション ID は、パーティションの種類 (どの OS を使用しているか) を、 開始位置/終了位置 はパーティションの位置を示します。 に、 良く使われるパーティション ID のリストを示します。 パーティション ID - Partition IDs ID (hex) 説明 01 DOS12 基本領域 (12-bit FAT) 04 DOS16 基本領域 (16-bit FAT) 05 DOS 拡張領域 06 大容量 DOS 基本領域 (> 32MB) 0A OS/2 83 Linux (EXT2FS) A5 FreeBSD、NetBSD、386BSD (UFS)
注: パーティションには、起動ができないものもあります (例えば DOS 拡張領域)。 つまり、できるものもあれば、できないものもあるというわけです。 パーティションが起動可能かどうかは、 各パーティションの先頭に存在する パーティション起動セクタの設定で決まります。 好みのブートマネージャを設定した場合を考えてみます。 ブートマネージャは、接続されているすべてのハードディスクの MBR パーティションテーブルのエントリをリストアップし、 そしてそのリストから、どのエントリを起動するのか 選択できるようにしてくれます。 ブートマネージャは、 起動の際、最初に接続が検出されたハードディスクのマスターブートセクタにある、 特別なプログラムコードによって呼び出されます。 呼び出されたブートマネージャは、選択したパーティションに対応するエントリを MBR パーティションテーブルから調べ、 シリンダ/ヘッド/セクタの開始位置を取得します。 それから、そのジオメトリ情報を使うことでパーティションの起動セクタを読み込み、 制御をそちらに渡します。 読み込まれる起動セクタには、そのパーティション上の OS をロードするために必要な情報が含まれています。 今、かるく触れた内容を理解することは、とても重要です。 ハードディスクには、必ず MBR が存在します。 しかし重要なのは、そのうち BIOS により最初に接続が検出された ハードディスク上にあるものです。 IDE ハードディスクだけを使用しているなら、 最初のIDE ディスクです (例えば、最初のコントローラーのプライマリ側)。 SCSI だけで構成されたシステムの場合も、同じことが言えます。 もし、IDE と SCSI の両方のハードディスクを持っている場合には、 多くの場合、IDE ディスクが先に検出されるため、 1 台目の IDE ディスクが、最初に検出されるハードディスクになります。 先ほど述べたように、インストールするブートマネージャは、 最初に検出されたハードディスク上の MBR に格納されることになります。
起動の制限と注意事項 ここでは、用心しなければならない、興味深い内容についてお話します。 恐怖の 1024 シリンダ制限と BIOS LBA の作用 起動プロセスの最初の部分は、すべて BIOS によって実現されています。 (BIOS とは、コンピュータのためのスタートアップコードを提供する、 システムマザーボードに載っているソフトウェアチップのことです)。 そのため、この最初のプロセスは BIOS インタフェースによって制限を受けます。 このプロセスの間、ハードディスクを読み込むために使用された BIOS インタフェース (INT 13H、Subfunction 2) は、 シリンダ番号へ 10 ビット、ヘッド番号へ 8 ビット、 セクタ番号へ 6 ビット割り当てます。 これがこのインタフェースを使う場合 (例 … ハードディスクの MBR から呼び出されるブートマネージャや、 起動セクタから呼び出される OS ローダーなど) に次のような制限を与えるのです: 最大 1024 シリンダ 最大 256 ヘッド 最大 64 セクタ/トラック (実際には 63 で 0 は利用できません) さて、容量の大きなハードディスクには多くのシリンダがありますが、 ヘッドは多数ありません。 そのため、大容量のハードディスクにおいては、 シリンダ数が 1024 を越えます。 このことや BIOS インタフェースを考慮すると、 ハードディスクのどこからでも起動できるとは限らないのです。 すべての起動可能なパーティションの起動セクタから呼び出されるブートマネージャや OS ローダーは 1024 シリンダより下のシリンダに存在しなければなりません。 実際に、お使いのハードディスクが典型的なものでヘッドが 16 であれば、 次のようになります: 1024 シリンダ/ディスク × 16 ヘッド/ディスク × 63 セクタ/(シリンダ - ヘッド) × 512 バイト/セクタ これが、よく言われる 528MB 制限です。 ここが BIOS LBA (Logical Block Addressing) が入ってくるところです。 BIOS LBA はシリンダを再定義することにより、 BIOS API を呼び出すコードが BIOS インタフェース経由で 1024 シリンダ より上の物理シリンダにアクセスするようにします。 つまり、BIOS を通して見る場合に、実際より少ないシリンダ数、 多いヘッド数として扱われるようにシリンダ数、 ヘッド数を再マップしてくれるのです。 言い替えれば、シリンダ数とヘッド数のバランスを変更することで、 ハードディスクが相対的にヘッドが少なく、 シリンダが多くなるということを利用することにより、 双方の数が上記に述べられている制限 (1024 シリンダ、256 ヘッド) を越えないと言うことになります。 BIOS LBA を用いることで、 ハードディスク容量の制限が仮想的になくなりました (まぁ、8GB まで上がったと言うところでしょうか)。 LBA BIOS を使用している場合は、FreeBSD または 他の OS をどこにでも載せることができ、 1024 のシリンダ制限に引っかかることもありません。 1.6GB Western Digital を再度例として考えてみましょう。 物理的なジオメトリは、次のとおりです: (3148 シリンダ、16 ヘッド、63 セクタ/トラック、512 バイト/セクタ) しかしながら、BIOS LBA は次のように再マッピングを行います: (787 シリンダ、64 ヘッド、63 セクタ/トラック、512 バイト/セクタ) 実際には同じサイズのディスクなのですが、 シリンダとヘッドの計算は BIOS API の範囲内で行われます (偶然にも、私のハードディスクの一つには、 Linux と FreeBSD が物理的なシリンダ 1024 番目より上に載っています。 これらのOS が問題なく起動するのも、BIOS LBA のおかげなのです)。 ブートマネージャとディスクの割り当て ブートマネージャのインストール時、 他に気をつけねばいけないことは、 ブートマネージャ用として領域を割り当てることです。 1 つ、あるいは複数の OS の再インストールを余儀なくされたくないなら、 一番気にしなくてはいけないトピックです。 (MBR のある) マスターブートセクタ、 パーティション起動セクタ、起動プロセス についての の説明を読んだ後は、 自分のハードディスクのどこに、 この気のきくブートマネージャが存在するのか気になるところですね。 それはと言いますと、いくつかのブートマネージャは、 パーティションテーブルの隣の、マスターブートセクタ (シリンダ 0、ヘッド 0、セクタ 1) に納まり切る程に小さいのです。 ブートマネージャによってはもう少し容量が必要なものもあり、 その領域は一般には空いているため、 シリンダ 0 ヘッド 0 セクタ 1 にあるマスターブートセクタを 越えたいくつかのセクタにまで自身を拡張しています。 ありがたいことに (FreeBSD を含む) OS のいくつかは、 必要ならばマスターブートセクタの直後、 シリンダ 0、ヘッド 0、セクタ 2 からパーティションを 起動することができます。 実際に、先頭に空きのある、あるいは全体が空のディスクで FreeBSD の sysinstall を実行すると、デフォルトではその場所から FreeBSD パーティションが始まります (少なくとも私が行った時はそうでした)。 そして、MBR の後にあるいくつかのセクタを消費するような ブートマネージャをインストールする場合、 最初のパーティションのデータの先頭が上書きされます。 FreeBSD の場合は、ディスクラベルが上書きされ、 FreeBSD が起動できなくなります。 このような問題を避ける簡単な方法としては (また、後で異なるブートマネージャを試す柔軟性を持たすためにも)、 パーティションを切る時に、 ハードディスクの最初のトラックを割り当てないまま まるまる残しておくことです。 つまり、シリンダ 0、ヘッド 0、セクタ 2 からシリンダ 0、 ヘッド 0、セクタ 63 までを空けておき、 パーティションをシリンダ 0、ヘッド 1、セクタ 1 から開始するということです。 更に良いことに、ハードディスクの先頭に DOS パーティションを 作成する際、DOS はデフォルトでこの場所を空けておきます (これがブートマネージャのいくつかはその場所が空きだと 仮定するという理由です)。 というわけで、ディスクの先頭に DOS パーティションを作成することで この問題を避けることができるのです。 私はこのやり方が好みで、自分で 1MB の DOS パーティションを先頭に 作成します。そうすると、パーティションを切り直す時、 DOS のドライブ名をずらすことも必要ないのです。 参考として、次のブートマネージャはコードとデータを 記録する際にマスターブートセクタを使用します: OS-BS 1.35 Boot Easy LILO 次のブートマネージャはマスターブートセクタの後にある セクタをいくつか使用します: OS-BS 2.0 Beta 8 (sectors 2-5) OS/2's boot manager マシンが起動しない場合はどうするか? ブートマネージャをインストールした際に、 MBR が起動しない状態にしてしまうことがあります。 あまりないことですが、既にインストールしたブートマネージャが ある状態で FDISK してしまうと起こることがあります。 ハードディスクに起動可能な DOS パーティションがある場合、 DOS フロッピーから起動します。次を実行します: A:\> FDISK /MBR オリジナルに戻すには、シンプルな DOS の起動コードを システムに戻します。そうすると、ハードディスクから DOS (DOS に限る) を起動することができます。 もう一つの手としては、起動可能なフロッピーを使って、 ブートマネージャのインストールプログラムを再度実行します。