Disklabel は、ディスクとカーネル内のディスクドライバの間に、効率よいインターフェースを提供するようにしようってことでこしらえたのだ。ラベルは、ドライブのジオメトリとか、ファイルシステム情報とか、ディスク関係の情報を含んでいる。そしてこれがブートストラップ・プログラムに使われて、ドライブをロードしたり、ドライブ上のどこにファイルシステムがあるのかを調べたりすることになる。ラベルはまたファイルシステムといっしょに使われて、効率よい環境をつくる。disklabel についてもっと詳しいことは disklabel(5)を読もう。
さらにおまけのメリットとして、disklabel を使うとディスクパーティションのアーキテクチャ的な制約を乗り越えられる。たとえば i386 ではプライマリパーティション(つまり Windows NT や DOS など他の OS に見えるパーティション) は 4 つまでしか持てない。disklabel(8) では、この「プライマリパーティション」を一つ使うだけで、OpenBSDパーティションを全部 (たとえば 'swap', '/', '/usr', '/var')をそこに納められる。それでもほかの OS で使えるパーティションが 3 つも残っている!
OpenBSD インストールでの大きな山場の一つが、ラベルを最初につくるところだ。これは (i386 ユーザなら) fdisk(1)の直後に出てくる。インストール中に、disklabel を使って、マウントポイントごとに別々のラベルをつくる。インストール中に、disllabel(8) の中からマウントポイントを指定することもできるけれど、これはどうしても必要というわけじゃない。あとでどうせプロンプトで、これでいいか確認を求められるから。でも、やっといたほうがインストールがちょっとはスムーズになるかな。
インストール中なら、まだラベルはぜんぜんないはずなので、どうしてもつくる必要がある。最初につくるラベルはラベル 'a' だ。このラベルは絶対に / をマウントするところにしたほうがいい。作った方がいいおすすめパーティションとそのサイズについては、faq4.3 を読もう。サーバの場合、少なくともfaq4.3 に書いてあるラベルは別々にしておくのが望ましい。デスクトップのユーザなら、/ のマウントポイントだけ作っておけば十分だろう。最初に root パーティション ('a' ラベル)をつくるとき、スワップラベル用に多少の空きを残しておくのをお忘れなく。いまので基本は説明したから、以下にインストール中に disklabel を使う例をあげよう。最初の例では、このマシン上には OpenBSD しかなくて、フルインストールをするものとする。
If this disk is shared with other operating systems, those operating systems should have a BIOS partition entry that spans the space they occupy completely. For safety, also make sure all OpenBSD file systems are within the offset and size specified in the 'A6' BIOS partition table. (By default, the disklabel editor will try to enforce this). If you are unsure of how to use multiple partitions properly (ie. seperating /, /usr, /tmp, /var, /usr/local, and other things) just split the space into a root and swap partition for now. # using MBR partition 3: type A6 off 63 (0x3f) size 4991553 (0x4c2a41) Treating sectors 63-16386300 as the OpenBSD portion of the disk. You can use the 'b' command to change this. Initial label editor (enter '?' for help at any prompt) > d a > a a offset: [63] <Enter> size: [16386237] 64M Rounding to nearest cylinder: 131040 FS type: [4.2BSD] <Enter> mount point: [none] / fragment size: [1024] <Enter> block size: [8192] <Enter> cpg: [16] <Enter> > a b offset: [131103] <Enter> size: [16255197] 64M Rounding to nearest cylinder: 131040 FS type: [swap] <Enter>
いまので、64M のroot パーティションが / にマウントされて、64Meg スワップパーティションが作られている。オフセットがセクター 63 から始まるのに注目。これでいいのだ。サイズの話になると、disklabel はセクター単位で表示を行うけれど、でも入力するときは別にセクターで入力しなくていい。上の例でもそうだけれど、64MB なら64M とか、2GBなら2G とすればいい。するとDisklabel はそれをいちばん近いシリンダに丸めてくれる。また上の例では、disklabel は「b」がスワップだと自動的に想定していることにも注目。これは正しい想定で、GENERIC カーネルはラベル「b」にスワップを探しにいくよう設定されている。だからこのガイドラインにしたがって、スワップは 'b' にしておこう。
次の例では、もう二つラベルをこしらえている。これはつまり、完全なインストールではないということだ。これらのサイズは、OpenBSDを完全にインストールするには不十分だから。パーティション全部をつくるのを見せても、繰り返しになるだけだ。
> a d offset: [262143] <Enter> size: [16124157] 64M Rounding to nearest cylinder: 131040 FS type: [4.2BSD] <Enter> mount point: [none] /tmp fragment size: [1024] <Enter> block size: [8192] <Enter> cpg: [16] <Enter> > a e offset: [393183] <Enter> size: [15993117] 64M Rounding to nearest cylinder: 131040 FS type: [4.2BSD] <Enter> mount point: [none] /var fragment size: [1024] <Enter> block size: [8192] <Enter> cpg: [16] <Enter>
上の例では、2つほど気がつく点がある。まず、オフセットが自動的に計算されて、次のところでデフォルトになって待っているということ。この手のインストールをするなら、オフセット変更をぐちゃぐちゃする必要はまったくない。別のちがいとしては、ラベル 'c' はとばされている。これには理由があって、ラベル 'c' はディスク全体をあらわすラベルなのだ。だからラベル 'c' はまったくいじってはけない。
ラベルが全部できたら、あとはそれをディスクに書き込んでインストールを先に進めればいい。全部書いて disklabel を終了するには(そしてインストールを続けるには):
> w > q
*NOTE* - でかいドライブを持っている人へ。もしきみの bios がそのサイズのドライブをサポートできなければ、OpenBSD でもサポートは無理だ。そうでなければ、OpenBSD は問題なくディスクを扱えるはず。もし bios がサポートしていないドライブに直面したら、Maxtor EZ-Drive みたいなオーバーレイ製品を試してみるといい。
いったんシステムのインストールが終わったら、もうあまり disklabel を使うこともないだろう。でもディスクを追加、削除、再構成するときなんかに disklabel を使う場合が出てくる。まず最初にやりべきことは、現状の disklabel を見ることだ。これには以下のようにする:
# disklabel wd0 <----- あるいは見たいデバイスを指定すること # using MBR partition 3: type A6 off 64 (0x40) size 16777152 (0xffffc0) # /dev/rwd0c: type: ESDI disk: label: TOSHIBA MK2720FC flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 2633 total sectors: 2654064 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: 2071440 65583 4.2BSD 1024 8192 16 # (Cyl. 65*- 2120) b: 65520 63 swap # (Cyl. 0*- 65) c: 2654064 0 unused 0 0 # (Cyl. 0 - 2632) j: 512001 2137023 4.2BSD 1024 8192 16 # (Cyl. 2120*- 2627*)
上のコマンドは、単にすでにある disklabel を見せてくれて、ヘタにいじって壊したりすんなよ、と念を入れてくれているわけだ(われわれみんな、たまには忠告もきかないとね)。でももし変更を加えたいなら、disklabel で -E オプションを使わないといけない。:
# disklabel -E wd0
これでプロンプトが出てくる。OpenBSD インストール時にお目にかかったのと同じものだ。このプロンプトでなによりだいじなコマンドは '?' だ。これは disklabel で使える可能なオプション一覧を表示してくれる。disklabel(8) man ページ全部を見るには、 'M' コマンドを使う。このプロンプトから、パーティションの追加、削除、変更すべてを行う。もっと詳しくは disklabel(8)
man ページを読もう。
まず、必ず fdisk のman ページを見よう。 fdisk(8)
Fdisk は、パーティションのメンテナンスを助けてくれるソフトだ。このプログラムはインストール時に使われて、OpenBSD パーティションの設定をする(このパーティションの中に複数のラベルがのって、それぞれがファイルシステムやスワップなんかになる)。ドライブのスペースを区切って、一つをアクティブにできる。プログラムは通常、シングルユーザモードで使われる(つまり boot -s)。Fdisk はまた各種ハードディスクの MBR も設定する。
インストールするには、ほとんどの場合は OpenBSD パーティションが 1 つあればいい。それをさらに区切ってスワップやファイルシステムをつくるには disklabel を使う。
fdisk でパーティションテーブルを見るだけなら、単にこうしよう:
# fdisk fd0
するとこんな感じの出力が出る:
Disk: fd0 geometry: 80/2/18 [2880 sectors] Offset: 0 Signatures: 0xAA55,0x0 Starting Ending #: id cyl hd sec - cyl hd sec [ start - size] ---------------------------------------------------------------------- *0: A6 0 0 1 - 79 1 18 [ 0 - 2880] OpenBSD 1: 00 0 0 0 - 0 0 0 [ 0 - 0] unused 2: A7 0 0 2 - 79 1 18 [ 1 - 2879] NEXTSTEP 3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
この例では、フロッピードライブの fdisk 出力を見ている。OpenBSD パーティション (A6) とそのサイズも見られる。* がついているので、起動パーティションが OpenBSD パーティションだとわかる。
前の例では、情報を見ただけだ。パーティションテーブルを編集したい場合は? うん、そのときには -e フラグを使う。するとコマンドラインプロンプトが出てきて、fdiskを操作できる。
# fdisk -e wd0 Enter 'help' for information fdisk: 1> help help Command help list manual Show entire OpenBSD man page for fdisk reinit Re-initialize loaded MBR (to defaults) disk Edit current drive stats edit Edit given table entry flag Flag given table entry as bootable update Update machine code in loaded MBR select Select extended partition table entry MBR print Print loaded MBR partition table write Write loaded MBR to disk exit Exit edit of current MBR, without saving changes quit Quit edit of current MBR, saving current changes abort Abort program without saving current changes fdisk: 1>
fdiskに入っていろいろ試すのは、まったく危険はない。ただし、変更を保存するかどうかきかれたら絶対に N と答えて、write コマンドは使わないこと。
-e フラグで使えるコマンド一覧を以下に挙げる。
うん、ディスクさえきちんとインストールされたら、あとは fdisk(8) (i386 のみ)と disklabel(8) を使って OpenBSD 用にディスクを設定するだけだ。
i386 の人たちは、fdisk からはじめよう。ほかのアーキテクチャの人は、ここはとばしていいよ。
# fdisk -i sd2
これはディスクの「ほんものの」パーティションを初期化して、OpenBSD 専用に変える。続いてここに disklabel をつくろう。これはちょっとややこしい(訳注:FreeBSD なんかでは、この本物の(DOS で見える)パーティションを「スライス」と呼んで、disklabel のものだけをパーティションという。どっちがわかりやすいかは……人それぞれだけれど、混乱しないように)。
# disklabel -e sd2 (画面が消えて、$EDITOR で指定のエディタがたちあがる) type: SCSI うだうだ…… sectors/track: 63 total sectors: 6185088 うだうだ…… 16 partitions: # size offset fstype [fsize bsize cpg] c: 6185088 0 unused 0 0 # (Cyl. 0 - 6135) d: 1405080 63 4.2BSD 1024 8192 16 # (Cyl. 0*- 1393*) e: 4779945 1405143 4.2BSD 1024 8192 16 # (Cyl. 1393*- 6135)
まず、'c' パーティションは無視ね。必ずあって、disklabelみたいなプログラムが機能するために必要なものだから! ふつうの操作用なら、fsize は必ず 1024で、bsize は必ず 8192, cpg は絶対に 16 だ。Fstype は 4.2BSD。Total sectors は、ディスクの総容量。たとえばこれが 3 GB のディスクだとしよう。ディスクメーカの言い方では、3 GB は 3000 MB だ。そこで 6185088/3000 のわり算をしよう(bc(1)を使うのよ)。答は 2061だ。そこで a, d, e, f, g, ... のパーティションサイズを計算するには、それぞれ X MB の容量がほしければ単に X*2061 のかけ算をしてやればいい。最初の新しいパーティションのオフセットは、さっき disklabel の出力に出てきた「sectors/track」と同じ。ここでは 63 やね。その後の各パーティションのオフセットは、各パーティションサイズと、そのパーティションのオフセットを組み合わせたものになる(ただし C パーティションだけは、いまの式にあてはまるところもないし、無視ね。)
あるいは、ディスク上にパーティション一つだけしかいらないこともある。たとえばディスク全体をWeb保存に使うとか、ホームディレクトリにしたいとかなんとか。この場合には、ディスクの総容量から、トラックあたりのセクター数をひいてやればいい。 6185088-63 = 6185025 だから、きみのパーティションは次のようになる:
d: 6185025 63 4.2BSD 1024 8192 16
これがなんだか無用にややこしいと思ったら、単に disklabel -E を使えば、インストール時と同じパーティション切りモードに入れるよ! そこでなら、96 メガバイトと言いたければ "96M" と指定すればいい(ディスクがでかければ、96G で 96 ギガバイトっちゅーこってすな!)残念なことに、-E モードは本当のディスクジオメトリではなく、BIOS ディスクジオメトリを使っていて、この両者は必ずしも一致しない。この制約を回避するには、 'geometry disk'の略で 'g d' とタイプしよう (その他のオプションとしては、'geometry bios'なら 'g b' で、'g u' とやれば geometry user, つまり disklabel が変更前にどういう内容になっていたかを表示する)
結構山盛りだったね。でもまだ話は終わっちゃいない。最後に、そのディスク上にファイルシステムをつくんなきゃいけない。newfs(8)を使おう。
bsd# newfs wd1a
wd1a のところは、OpenBSD のディスク番号方式できみのディスクの番号に該当するものに置き換えよう (OpenBSD のディスク名称を見たければ dmesg(1) の出力を見よう)
さて、作りたてのこのパーティションをどこにマウントするか考えよう。たとえば /u にマウントしたかったとする。まず、/u ディレクトリをつくる。それからそれをマウントする。
mount /dev/wd1a /u
最後にそれを /etc/fstabに追加。
/dev/wd1a /u ffs rw 1 1
もし /usr/local とか既存のディレクトリを引っ越しさせたかったら? 新しいドライブを /mnt にマウントして、cpio -pdum を使って /usr/local を /mnt ディレクトリにコピーしよう。 /etc/fstab ファイルを編集して、/usr/local パーティションがいまでは /dev/wd1a (いまさっき新規にフォーマットしたパーティション)になるように変更する。たとえば:
/dev/wd1a /usr/local ffs rw 1 1
シングルユーザモードで起動しよう。boot -s 既存の /usr/local を /usr/local-backup に移動する(か、ツキが向いてる気分なら削除しちゃおうか)。そして空のディレクトリ /usr/local をつくる。それからシステムを再起動してみますと、あらふしぎ! ファイルが /usr/local に!
(Note: もし "virtual memory exhausted" エラーがたくさん出ているのでスワップをしようとしているなら、まずはプロセスごとのリミットを上げてみよう。 cshなら unlimit(1)、 shなら ulimit(1)だ。)
OpenBSD 2.5 のリリース後に、 swapctl(8) ができて、スワップデバイスの扱いはずっと簡単になった。もし OpenBSD 2.5 システムを使っているなら、swapctl を swapon と読み替えて、スワップデバイスを一覧表示するには pstat -s を使おう。ファイルへのスワップは、カスタムのカーネルは必要ないけれど、ビルドしなおすこともできる。この FAQ では、どちらの方法でもスワップスペースを追加する方法を示す。
追加のスワップ領域を設定するのに、いちばん簡単ですばやい方法は、ファイルへのスワップをすることだ。これは Softupdates を使っている人は使えない(これはデフォルトでは有効になっていない)。 手始めに、まずいまどのくらいスワップ領域があって、どれくらいスワップを使っているかを調べよう。これには swapctl(8) ユーティリティを使う。こんな具合だ:
ericj@oshibana> swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0
これは、いまスワップに使われているデバイスとその現在の統計を示す。上の例では "swap_device" というデバイス一つしかない。これはディスク上の事前に定義されたスワップ領域だ(disklabel を見るときにはパーティション b として表示される)。上の例でもわかるけれど、このデバイスは目下、あんまし使われていない。でもこの文章では、かりにもう 32M が必要だということにしよう。
ファイルをスワップデバイスとして設定する第一歩は、そのファイルをつくることだ。これは dd(1) ユーティリティでやるのがいちばんいい。以下に大きさ 32M の /var/swap ファイルをつくってやろう。
ericj@oshibana> sudo dd if=/dev/zero of=/var/swap bs=1k count=32768 32768+0 records in 32768+0 records out 33554432 bytes transferred in 20 secs (1677721 bytes/sec)
これができたら、そのデバイスへのスワップを有効にしよう。以下のコマンドを使って、このデバイスへのスワップを有効にする:
ericj@oshibana> sudo chmod 600 /var/swap ericj@oshibana> sudo swapctl -a /var/swap
じゃあ、いまのがスワップデバイスの一覧にちゃんと追加されたかチェックしよう。
ericj@oshibana> swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0 /var/swap 65536 0 65536 0% 0 Total 131056 8 131048 0%
これでファイルが設定されてスワップが行われているので、/etc/fstab ファイルに記入して、次の起動時にもこのファイルが使われるようにしよう。この一行がないと、スワップデバイスが設定されないよ。
ericj@oshibana> cat /etc/fstab /dev/wd0a / ffs rw 1 1 /var/swap /var/swap sw 0 0
これはスワップ領域を追加するもっと恒久的な解決方法だ。ファイルを恒久的にスワップするには、まず vnd0c をスワップにしたカーネルをつくる。カーネルがwd0a を root ファイルシステムにしてあったら、これまでのスワップは wd0b だから、カーネル設定ファイルでこんな行を使おう(わかんなければ、新しいカーネルのコンパイルを参照):
config bsd root on wd0a swap on wd0b and vnd0c dumps on wd0b
これが終わったら、スワップに使うファイルを作らなきゃいけない。これは、上の例と同じコマンドを使えばいい。
ericj@oshibana> sudo dd if=/dev/zero of=/var/swap bs=1k count=32768 32768+0 records in 32768+0 records out 33554432 bytes transferred in 20 secs (1677721 bytes/sec)
さてファイルができたので、そのファイルを /etc/fstab に追加しよう。このデバイスが起動時にスワップデバイスになるための一行はこんな感じだ。
ericj@oshibana> cat /etc/fstab /dev/wd0a / ffs rw 1 1 /dev/vnd0c none swap sw 0 0
この時点でコンピュータを再起動させて、カーネルの変更が反映されるようにしよう。これをやったら、デバイスをスワップとして設定することになる。これには vnconfig(1)を使う。
ericj@oshibana> sudo vnconfig -c -v vnd0 /var/swap vnd0: 33554432 bytes on /var/swap
さて最後の一歩。そのデバイスでスワップを有効にする。これは、上の例とまったく同じように swapctl(8) を使ってやろう。それから、それがスワップの一覧にきちんと追加されたか確認してやる。
ericj@oshibana> sudo swapctl -a /dev/vnd0c ericj@oshibana> swapctl -l Device 512-blocks Used Avail Capacity Priority swap_device 65520 8 65512 0% 0 /dev/vnd0c 65536 0 65536 0% 0 Total 131056 8 131048 0%
過去数年にわたって、Kirk McKusick は"soft updates" なるものの開発を進めている。これは Greg Ganger と Yale Patt が提案したアイデアに基づくもので、バッファキャッシュ操作を部分的に整理してやると、FFSコードからディレクトリのエントリを同期書き込みしなきゃいけないという要件をはずせるじゃないか、というのが考え方だ。そうなると、ディスク書き込み性能はかなり上がる。
Softupdates を有効にするには、以下のオプションが必要だ。
option FFS_SOFTUPDATES
それからシングルユーザモードで起動して、以下のようにする:
boot>boot -s [snip] bsd# tunefs -s enable <raw device> bsd# reboot -n
注: このオプションは、OpenBSD 2.7 のリリース後にデフォルトとなる。だから 2.8 ではデフォルトになっている。でも、相変わらずディスクパーティションごとに有効にしてやる必要はある。
これはきみの MBR (マスターブートレコード) がきちんとインストールされていないか、BIOS の思っているハードディスクのジオメトリが、いまの MBR と互換性がないということだ。これを解決するにはまず OpenBSD のブートブロックをインストールしなおしてみよう。これには fdisk(8) と installboot(8)を使う。
まずはとりあえず起動させることだ。これには起動フロッピーをブートストラップに使わなくてはならない。インストールディスクを入れて、カーネルと ramdisk を読み込む前に、フロッピーディスクからboot> プロンプトが出てくる。ここから、OpenBSD をハードディスクから起動させよう。
booting... OpenBSD boot 1.2.3 probing hd0 fd0... boot> boot hd0a:/bsd
これで起動ができたので、仮にハードディスク丸ごとを OpenBSD で使っているとすれば、MBR をfdisk(8)で初期化しなおそう。 (もしハードディスク上に、OpenBSD 以外の OS のパーティションがあったら、どのみち installboot は使えないので、以下で説明する OS-BS とか、ほかのオプションを使うしかない)。
# fdisk -i wd0
では、またブートブロックを書き直そう。
# cp /usr/mdec/boot /boot # /usr/mdec/installboot -v /boot /usr/mdec/biosboot wd0
最後に、再起動して試してみよう。
もしこれがうまくいかなくても、まだいくつか手口がある。まだ運が尽きてはいないよ。まずは、OS-BS みたいなブートローダを使うことだ。OpenBSD cd の tools ディレクトリに os-bs ブートローダが入っている。CD-ROM を買わなかった人は、OpenBSD ftp サイトならどこからでもダウンロードできる。以下のファイルを取ってこよう:pub/OpenBSD/2.6/tools/osbs135.exe (訳注:2.7、2.8 用のもあるはず。ディレクトリを探してみてほしい)
あと、以下のOS-BS webページにも目を通して置いてほしいな。 http://www.prz.tu-berlin.de/~wolf/os-bs.html
さらにマルチOSブートを可能にするための、商業製品ブートローダや、Linux の lilo なんかも使える。
LILO をシステムに入れる方法の概略は以下の通り:
詳しくは INSTALL.linuxを参照。
RAMDISK イメージ (起動フロッピー) は dmesg ユーティリティを含んでいない。でも、/kern
ファイルシステムはマウントしてある。dmesg 情報をファイルにコピーするには、次のようにする:
# cat /kern/msgbuf >mydmesg
起動ディスクには more もあるから、これで出力を見てやろう:
# more /kern/msgbuf
Also check with section 4.5
古いバージョンの MS-DOS は、1024 シリンダ以下のディスクジオメトリにしか対応していない。最近のディスクはほとんどすべて 1024
シリンダ以上あるので、ほとんどの SCSI BIOS チップ(SCSI コントローラボード上にある)と IDE BIOS (その他 PC BIOS の一部)は、真のディスクジオメトリをMS-DOS が扱えるようなものに「翻訳」するオプション(ときにはこれがデフォルト)がある。でも、BIOS チップの「翻訳」のしかたは必ずしも一致しない。もし BIOS を変えて(マザーボードを換えたとか、SCSI コントローラを換えたとか)、そして新しいやつの使う「翻訳」ディスクジオメトリがちがったら、第二段階ブートローダが読み込めない(つまりカーネルも読み込めない)。(なぜかというと、第一段階ブートローダは/boot の入ったブロック一覧を持っているんだけれど、これが以前の「翻訳」ジオメトリで記述されているからだ。) IDE ディスクを使っていて BIOS 設定を変えたときにも、翻訳を(うっかり)変えてしまう場合がある(ほとんどの IDE BIOS は翻訳の仕方を3通り持っている)。ブートブロックをなおしてふつうにブートできるようにするには、ハードディスクに起動フロッピーを入れて、boot プロンプトで「b hd0a:/bsd」とタイプして、最初のハードディスク(フロッピーではなく)から起動させよう。これでふつうにマシンが起動するはずだ。そうしたら、第一段階ブートローダを更新して、新しいジオメトリが見えるようにしよう(そしてそれに応じたブートブロックに書き換えよう)。
ここでの例では、きみの起動ディスクが sd0 だと想定している(もし IDE なら wd0, 等々..):
# cd /usr/mdec; ./installboot /boot biosboot sd0
もし installboot が、BIOS のジオメトリが読めないよとブーたれるようなら、boot> プロンプトで "machine diskinfo" コマンド (または短く "ma di") コマンドを入れて、必要な情報を表示させよう。 "heads" と "secs" の値をそれぞれ installbootの -h と -s フラグに食わせてやるのだ。こういう形で変更した installboot コマンドはこんな具合:
# cd /usr/mdec; ./installboot -h <heads> -s <secs> /boot biosboot sd0
もしブートブロックのバージョン更新が必要なら、それは自分でコンパイルするしかない。やりかたは簡単だ:
# cd /sys/arch/i386/stand/ # make & make install # cd /usr/mdec; cp ./boot /boot # ./installboot /boot biosboot sd0 (ディスクのデバイスは自分のにあわせて変えてね)
もし、いわば業務用のサーバと称するようなものを走らせようとしているなら、固定ディスクのどれかがイカレたときのために、なんらかのバックアップはとっておこうね。
ここにある情報は、OpenBSD についてくる通常の dump(8)/restore(8) ユーティリティの使い方を説明している。複数のサーバを一本のテープドライブでバックアップするために、もっと高度な「Amanda」というソフトもある。ふつうの環境では dump(8)/restore(8) でじゅうぶんだけれど、複数のマシンを一台のテープにバックアップしたければ、いずれ Amanda を検討するといいだろう。
この文書のデバイス例は、SCSI ディスクとテープを使うような構成のシステムを想定している。業務用環境では、不良ブロックの処理のやりかたから、IDE よりも SCSI が推奨される。だからといって、IDE や別種のテープドライブを使っている人にここの情報が役にたたないわけじゃない。デバイス名だけ変えれば話は同じだ。たとえば SCSI の sd0a は、IDE のシステムなら wd0a になる。
テープへのバックアップは、ファイルシステムがどこにマウントされているかという知識が必須だ。ファイルシステムがどうマウントされているかは、シェルプロンプトから「mount」コマンドを使えばいい。こんな出力が出てくるはずだ:
shell# mount /dev/sd0a on / type ffs (local) /dev/sd0h on /usr type ffs (local)
この例では、root (/) ファイルシステムは物理的には sd0a 上にある。これは SCSI 固定ディスク 0 のパーティション a だ。/usr ファイルシステムは sd0h 上で、これは SCSI 固定ディスク 0 のパーティション hになる。
もっと高度なマウントテーブルの例はこんな感じだ:
shell# mount /dev/sd0a on / type ffs (local) /dev/sd0d on /var type ffs (local) /dev/sd0e on /home type ffs (local) /dev/sd0h on /usr type ffs (local)
このもっと高度な例では、root (/) ファイルシステムは物理的には sd0a 上にある。/var ファイルシステムは sd0d、/home ファイルシステムは sd0e で、/usr は sd0hにある。
マシンのバックアップには、それぞれの固定ディスクパーティション名を dump に指定する必要がある。さっきの、簡単な方のマウントテーブルをバックアップするコマンドはこんな具合だ:
# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h # mt -f /dev/rst0 rewind
もっと複雑なほうのマウントテーブルの例なら、こんな感じだろう:
# /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0d # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0e # /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h # mt -f /dev/rst0 rewind
それぞれのコマンドラインのスイッチが何をするのかは、dump man ページを見るのがいちばん簡単だ。上の例で使ったパラメータをざっと説明しよう:
そして最後に、バックアップするパーティションが記述してある (/dev/rsd0a, etc)
最後に mt コマンドを使って、ドライブを巻き戻している。ほかのオプション(たとえば eject) については mt man ページを見てね。
テープデバイス名がよくわからなければ、dmesg を使って調べよう。たとえば dmesg を使うとこんな感じだ:
st0 at scsibus0 targ 5 lun 0: <ARCHIVE, Python 28388-XXX, 5.28>
バックアップをするときに、デバイス名が dmesg に出てくる「st0」ではなく「nrst0」になっているのに気がついたかな。st0 に nrst0 としてアクセスすると、同じ物理デバイスにアクセスしているのだけれど、ジョブの終了後に巻き戻さないことと、デバイスを raw mode でアクセスすることになる。複数のファイルシステムを一本のテープにバックアップするには、必ず巻き戻さないデバイスを使うこと。もし巻き戻すデバイス (rst0) を使ったら、バックアップごとにテープが巻き戻されて、前のファイルシステムが上書きされてしまう。各種テープドライブについてもっとくわしい説明は dump man ページにある。
"backup" を簡単なスクリプトにするならこういう感じだ:
echo " Starting Full Backup..." /sbin/dump -0au -f /dev/nrst0 /dev/rsd0a /sbin/dump -0au -f /dev/nrst0 /dev/rsd0d /sbin/dump -0au -f /dev/nrst0 /dev/rsd0e /sbin/dump -0au -f /dev/nrst0 /dev/rsd0h echo echo -n " Rewinding Drive, Please wait..." mt -f /dev/rst0 rewind echo "Done." echo
もし毎晩定期的にバックアップしたいなら、cron(8) を使って自動的にバックアップ用スクリプトを起動させよう。
あと、それぞれのファイルシステムがどのくらいのサイズになるかを(紙切れに)書いておくと役に立つ。それぞれのパーティションがどのくらいの容量を使っているか調べるには df -h を使おう。これをやっておくと、ドライブがこわれてパーティションテーブルを新しいドライブに再現するときに便利だ。
データのリストアをすると、ファイルの断片化解消にもなる。ファイル全部を確実にバックアップするには、まず再起動してシングルユーザモードで起動することだ。ファイルシステムは、バックアップするときにマウントしていなくてもいい。シングルユーザモードで起動したら、root (/) r/w をマウントするのは忘れないように。そうしないと、ダンプの日付を書き出そうとするときに dump は失敗する。シングルユーザモードで起動するには、buut> プロンプトで bsd -s を入力しよう。
初めてファイルシステムをバックアップしたら、テープをちょっとテストしてみて、そこのデータが思い通りのところにあるか確認するのがいいだろう。
dump テープ上のファイルのカタログを見るには、以下のような例を使えばいい:
# /sbin/restore -tvs 1 -f /dev/rst0
これで、dump テープの最初のパーティション上にあるファイルのリストが一覧表示される。上の例で追加しておくと、1 というのはroot (/) ファイルシステムだ。
2番目のテープパーティションになにがあるかを見て、その出力をファイルに書き込むにはこんな感じのコマンドを使おう:
# /sbin/restore -tvs 2 -f /dev/rst0 > /home/me/list.txt
さっきの単純なほうのようなマウントテーブルを持っている場合には、2 は /usr で、もし高度なほうのマウントテーブルならば 2 は /var とかほかのファイルシステムになる。シーケンス番号は、ファイルシステムがテープに書き出された順番と一致する。
以下に上げた例題シナリオは、固定ディスクが完全にいかれたときに便利だ。テープからファイル一つだけを復元したいときは、restore man ページを見て、対話型モードの指示をよく読むこと。
もしきちんと準備をしてあれば、ディスクを交換してテープからデータを復元するのはとても手早くできる。標準の OpenBSD インストール/起動フロッピーは、すでに必要な復元ユーティリティもあるし、パーティションを切って新しいドライブを起動可能にするためのバイナリも入っている。ほとんどの場合、このフロッピーと最新の dump テープがあれば、それだけでシステムを立て直せる。
壊れたディスクドライブを物理的に交換したら、データの復元の基本的なステップは以下の通り:
ディスクイメージ (ISO イメージ、dd で作ったディスクイメージなど)を OpenBSD でマウントするには、vnd(4) デバイスを設定する必要がある。たとえば、ISO イメージが /tmp/ISO.image にあるとしたら、マウントするには以下のようにするのだ。
# vnconfig svnd0 /tmp/ISO.image # mount -t cd9660 /dev/svnd0c /mnt
ポイントとしては、このイメージは CD イメージなので、マウントするときにはその種類を cd9660 で指定してやるってことだ。これはどんな種類のイメージでもそうで、たとえばディスクイメージをマウントするなら ffs を使わなきゃいけない。
イメージのアンマウントには以下のコマンドを使おう:
# umount /mnt # vnconfig -u svnd0
lくわしくは vnconfig(8) man pageを参照のこと。
www@openbsd.org 翻訳上の問題はhiyori13@alum.mit.edu
$OpenBSD: faq14.html,v 1.36 2001/03/26 17:14:09 todd Exp $