[OpenBSD]English

14.0 - ディスクの設定


Table of Contents


14.1 - OpenBSDの Disklabelを使う

Table of Contents

disklabel(8)とはなんぞや?

 Disklabel は、ディスクとカーネル内のディスクドライバの間に、効率よいインターフェースを提供するようにしようってことでこしらえたのだ。ラベルは、ドライブのジオメトリとか、ファイルシステム情報とか、ディスク関係の情報を含んでいる。そしてこれがブートストラップ・プログラムに使われて、ドライブをロードしたり、ドライブ上のどこにファイルシステムがあるのかを調べたりすることになる。ラベルはまたファイルシステムといっしょに使われて、効率よい環境をつくる。disklabel についてもっと詳しいことは disklabel(5)を読もう。

 さらにおまけのメリットとして、disklabel を使うとディスクパーティションのアーキテクチャ的な制約を乗り越えられる。たとえば i386 ではプライマリパーティション(つまり Windows NT や DOS など他の OS に見えるパーティション) は 4 つまでしか持てない。disklabel(8) では、この「プライマリパーティション」を一つ使うだけで、OpenBSDパーティションを全部 (たとえば 'swap', '/', '/usr', '/var')をそこに納められる。それでもほかの OS で使えるパーティションが 3 つも残っている!

OpenBSDインストール時のDisklabel(8)

 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(8)の使い方

 いったんシステムのインストールが終わったら、もうあまり 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 ページを読もう。


14.2 - OpenBSDの fdiskを使う

 まず、必ず 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 フラグで使えるコマンド一覧を以下に挙げる。

14.3 - OpenBSDでディスクを追加する

 うん、ディスクさえきちんとインストールされたら、あとは 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 に!

14.4 - ファイルのスワップ

(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

vnode デバイス経由でスワップ

 これはスワップ領域を追加するもっと恒久的な解決方法だ。ファイルを恒久的にスワップするには、まず 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%

14.5 - Soft-updates

 過去数年にわたって、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 ではデフォルトになっている。でも、相変わらずディスクパーティションごとに有効にしてやる必要はある。

14.6 - OpenBSD/i386 をインストールして起動すると"Using partition 3 id 0"で止まるんですけど

 これはきみの 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を参照。

14.7 - 起動フロッピーで dmesg を出すのはどうするの?

 RAMDISK イメージ (起動フロッピー) は dmesg ユーティリティを含んでいない。でも、/kern ファイルシステムはマウントしてある。dmesg 情報をファイルにコピーするには、次のようにする:

# cat /kern/msgbuf >mydmesg

 起動ディスクには more もあるから、これで出力を見てやろう:

# more /kern/msgbuf

Also check with section 4.5

14.8 - Bootblockのインストール - i386 のみ

 古いバージョンの 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 (ディスクのデバイスは自分のにあわせて変えてね)

14.9 - トラブルにそなえよう: テープへのバックアップと復元

はじめに:

 もし、いわば業務用のサーバと称するようなものを走らせようとしているなら、固定ディスクのどれかがイカレたときのために、なんらかのバックアップはとっておこうね。

 ここにある情報は、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 テープの中身を見る:

 初めてファイルシステムをバックアップしたら、テープをちょっとテストしてみて、そこのデータが思い通りのところにあるか確認するのがいいだろう。

 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 テープがあれば、それだけでシステムを立て直せる。

 壊れたディスクドライブを物理的に交換したら、データの復元の基本的なステップは以下の通り:

14.10 - OpenBSD でディスクイメージをマウントする

 ディスクイメージ (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を参照のこと。

[FAQ トップへ] [13.0 - IPsec]


OpenBSD Valid XHTML 1.0!

www@openbsd.org 翻訳上の問題はhiyori13@alum.mit.edu $OpenBSD: faq14.html,v 1.36 2001/03/26 17:14:09 todd Exp $