Linux&FreeBSD ハードウェア設定

YAMAMORI Takenori ●yamamori

■マルチブートディスクの交換,中身の移動

ここでは,IDEのハードディスクにVine/FreeBSD/Window95が マルチブート状態でインストールされたものを, そのままSCSIハードディスクに内容を移して, SCSIからブートするようにする方法を例にとって紹介します. この方法を取り上げておくことにより,それに付随するいろいろな要素が ほぼカバーできるのではないかと思います.

なお,ハードディスクの交換では,一度テープ(DDS-3)などに バックアップをとってリストアするのが一般的だとは思いますが, ハードディスクの大容量化にともない, なかなか手頃なバックアップメディアが無く, また,個人でDDS-3ドライブなどを買うのも大げさな感じであるため, ここでは,IDEとSCSIの両ディスクを同時に接続した状態で, ディスクtoディスクで内容をコピーする方法をとります.

○マルチブートディスクの説明

ここでは, 各OSが図(ディスクの説明)のようにインストールされているものとします.

             +---------------------------+-------------------------------+----+
             |           Linux           |           FreeBSD             |DOS |
             +-------------+-------------+---------------+---------------+----+
             |    IDE      |    SCSI     |     IDE       |    SCSI       |    |
+------------+-------------+-------------+---------------+---------------+----+
|MBR         |             |             |               |               |    |
|  LILO or   | /dev/hda    | /dev/sda    | /dev/wd0      | /dev/da0      | -- |
|  Booteasy  |             |             |               |               |    |
+------------+ +-----------+ +-----------+ +-------------+ +-------------+----+
|  DOS       | | /dev/hda1 | | /dev/sda1 | | /dev/wd0s1  | | /dev/da0s1  | C: |
+------------+ +-----------+ +-----------+ +-------------+ +-------------+----+
|  Linux /   | | /dev/hda2 | | /dev/sda2 | | /dev/wd0s2  | | /dev/da0s2  | -- |
+------------+ +-----------+ +-----------+ +-------------+ +-------------+----+
|  FreeBSD   | |/dev/hda3  | |/dev/sda3  | |/dev/wd0s3   | |/dev/da0s3   | -- |
|        /   | | |/dev/hda5| | |/dev/sda5| | |/dev/wd0s3a| | |/dev/da0s3a| -- |
|        swap| | |/dev/hda6| | |/dev/sda6| | |/dev/wd0s3b| | |/dev/da0s3b| -- |
|        /var| | |/dev/hda7| | |/dev/sda7| | |/dev/wd0s3e| | |/dev/da0s3e| -- |
|        /usr| | |/dev/hda8| | |/dev/sda8| | |/dev/wd0s3f| | |/dev/da0s3f| -- |
+------------+ +-----------+ +-----------+ +-------------+ +-------------+----+
| Linux swap | | /dev/hda4 | | /dev/sda4 | | /dev/wd0s4  | | /dev/da0s4  | -- |
+------------+-+-----------+-+-----------+-+-------------+-+-------------+----+
図(マルチブートディスクの説明)
・MBRと各パーティションのブートセクタ

MBRには,LILOまたはBooteasyをインストールして,ブートするOSを切替えます. 各パーティションのブートセクタには,それぞれのOSのブートセクタを書き込みます. MBRと各パーティションのブートセクタのインストール方法を以下に まとめておきます.

さて,ここでLinuxのブートに関する注意が必要です. LILOをMBRにインストールし,これを使ってLinuxをブートする場合, MBR上のLILOは,次の段階として, Linuxがインストールされたパーティションのブートセクタは読まず, 直接/boot以下の必要ファイルを読みに行きます.

このため,Linuxのインストール時に, LILOのインストール先として通常通りMBRを選んでいた場合は, パーティションのブートセクタにはLILOはインストールされていません. したがって,この状態でMBRにBooteasyをインストールしてしまうと, BooteasyからはLinuxが起動できないという状態になります.

そこで,/etc/lilo.conf(MBR用)の他に, /etc/lilop.confというものをもうひとつ作り, これを使ってLILOをパーティションのブートセクタにもインストールして, BooteasyからもLinuxを起動できるようにします. なお,MBRのLILOからも,linuxpというラベルを使って, 両方のLILOを経由したブートもできるようにしました.

以下に,lilo.conflilop.confを示します.

* lilo.conf
boot=/dev/hda              ← MBRにインストール
map=/boot/map
install=/boot/boot.b
prompt
timeout=300
image=/boot/vmlinuz-2.0.36-3vl3  ← これは通常の直接ブート用
        label=linux
        root=/dev/hda2
        initrd=/boot/initrd-2.0.36-3vl3.img
        read-only
other=/dev/hda2            ← Linuxであってもother扱いにする
        label=linuxp
        table=/dev/hda
other=/dev/hda3
        label=freebsd
        table=/dev/hda
other=/dev/hda1
        label=dos
        table=/dev/hda

* lilop.conf
boot=/dev/hda2             ← パーティションのブートセクタ
map=/boot/mapp             ← lilo.confのmapとは必ず別にする
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.0.36-3vl3
        label=linux
        root=/dev/hda2
        initrd=/boot/initrd-2.0.36-3vl3.img
        read-only

そして,LILOのインストールは以下のようにします.

# /sbin/lilo -C /etc/lilop.conf  ← こちらを先にすること
# /sbin/lilo

○新しいSCSIディスクをfdiskして,dump | restore する

これからやる作業は,新しいSCSIディスクにfdiskなどで パーティションを作成し,それぞれのパーティションごとに それぞれのOSで,いわゆる「dump | restore」で内容をコピーし, さらにMBRとパーティションブートセクタを書き込むことです.

・まずfdisk

新しいSCSIディスクの,fdiskによるパーティション分けは, 筆者はLinux上で行ないました. 現状のディスクの使用量と,増設の目的などから判断して, 適切なパーティションサイズになるようにします.

  # /sbin/fdisk /dev/sda

各パーティションIDも,それぞれ適切に設定しておきます. なお,LinuxのfdiskはFreeBSDのパーティションIDをBSD/386と表示します.

また,筆者は試していませんが,Linuxのfdisk内の 'b'コマンドを使って, ここでFreeBSDのBSDパーティションを作ってしまう方法も考えられます.

fdiskパーティションが出来たら,以下のようにmkfsmkswapを行ないます.

  # mkfs /dev/sda2    ← /
  # mkswap /dev/sda4  ← swap
・Linuxのファイルシステムのコピー

dump, restore を行なっている間はファイルシステムに変化があってはいけません. そのため,OSはシングルユーザモードで起動します.

(シングルユーザモードで起動)

LILO boot: linux 1

そして以下のように,注意して内容のコピーを行ないます.

  # mkdir /mnt/tmp
  # mount /dev/sda2 /mnt/tmp
  # cd /mnt/tmp
  # dump 0f - / | restore xf -

最後に set owner/mode for '.' ? [y/n] と聞かれます.カレントディレクトリの所有者やパーミッションも リストアするかどうかを聞いていますので,y と答えます.

コピーが終ったら,コピー先のfstabの修正も必要です.

  # vi /mnt/tmp/etc/fstab
    (hdaをすべてsdaに修正する)

同様にlilo.conflilop.confについても, hdaをすべてsdaに修正しますが, さらに以下の修正が必要です.

まず,lilo.confother= の記述のうち,まだコピーされていないOSの分を この時点では'#'でコメントアウトします. そうしないとliloコマンド実行時にエラーが出て, LILOが正しくインストールされません. つぎに,lilo.conflilop.confの先頭に,以下の2行を追加します.

disk=/dev/sda
    bios=0x80

これは,LILOのインストール時点においてSCSIディスクが起動ドライブ (1番目のドライブ)ではないのを,強制的に起動ドライブであるとみなして LILOをインストールするための措置です.

これを忘れると,SCSIからのブートの際に,LILOが"LI"までを表示して, 固まってしまったり,暴走してしまったりという症状が出ます.

LILOは,以下の順でインストールします.

  # lilo -r /mnt/tmp -C /etc/lilop.conf
  # lilo -r /mnt/tmp

あとは,BIOSの設定でSCSIを起動ドライブに変更してブートすれば, 無事立ち上がります. これで,LinuxのSCSIディスクへの移動が完了しました.

※なお,SCSIドライバについては,SCSIカードのインストールの際に すでに initrd にモジュールを組み込む作業 を行なっており,それがそのまま新しいSCSIハードディスクにコピーされたため, ブート時の / のマウントが問題無くできるようになっているということに 注意して下さい.

・FreeBSDのBSDパーティションの作成

次に,FreeBSDの移動作業を行ないますので,再度IDEディスク上の FreeBSDをブートします.

FreeBSD上からは,新しいSCSIディスクのデバイスファイル名は 図(マルチブートディスクの説明)に書かれているようになります.

BSDパーティションに対するデバイスファイルは, 以下に説明するsysinstallによって自動的に作られますが, もし,手動で作成する場合は,以下のようにMAKEDEVを実行します.

  # cd /dev
  # ./MAKEDEV da0s3a
  (da0s3aからda0s3hまでと,rda0s3aからrda0s3hまでが作られる)

ここで,本来ならdisklabelを使ってBSDパーティションを作成する ところでしょうが,/etc/disktab のエントリを使わなければならなかったりとか, (その他dddisklabel コマンドを巧妙に使う方法もあるようですが…) とにかくやりにくかったため,/stand/sysinstallを起動して, インストール時と同じような感じで行なうことにしました.

(sysinstallによるBSDパーティションの作成)
  * /stand/sysinstallを起動する
  * Configure を選ぶ
      図(configure.gif)
  * Fdisk→da0と選び,FreeBSDの領域を確認し,'W'コマンドで書き込む
  * Labelを選び,BSDパーティションを作成し,'W'コマンドで書き込む

なお,実はここでちょっと注意が必要です.BSDパーティションを 作成する際に,必ずマウントポイントを指定しなければならないのですが, 「A=すべてをデフォルトに設定!」を選んで自動的に パーティション分けしようとすると,デフォルトで / swap /var /usr が指定されます.ところが,/ /var /usr など,現在のシステムがマウントしているものと同じマウントポイント名が 用いられてしまうと,'W' コマンドのあと,カーネルがpanicしてしまうのです. (これにはハマりました) そこで,'A'コマンドではなく,手動でパーティションサイズを指定して, かつ,マウントポイントとして,適当なディレクトリ (たとえば /mnt/a /mnt/b /mnt/c)を指定して,回避しました.

なお,ファイルシステムとして使うBSDパーティションに対しては newfsが自動的に実行され,かつ,仮に指定したマウントポイントに マウントまでしてくれます.

・FreeBSDのファイルシステムのコピー

dump|restoreを行なうため,シングルユーザモードで起動し直します.

FreeBSDのブートの最初の方で,

  Hit [Enter] to boot immediately, or any other key for command prompt.

と表示されたところで[Enter]以外を押し, 以下のように入力してシングルユーザモードでブートします.

disk1s3a:> boot -s

シングルユーザモードで立ち上がったら,まず / がリードオンリーで マウントされているのを以下のようにして解除します. これは,dump/tmp に書き込むために必要になります.

  # mount /   ← Read only でマウントされているのを解除

そして以下の手順を注意して行ない,ファイルシステムをコピーします.

  # mount /dev/da0s3a /mnt
  # cd /mnt
  # dump 0f - / | restore xf -
  # cd /
  # umount /mnt

  # mount /dev/da0s3e /mnt
  # cd /mnt
  # dump 0f - /dev/wd0s3e | restore xf -   ← コピー元はマウントせず直接読む
  # cd /
  # umount /mnt

  # mount /dev/da0s3f /mnt
  # cd /mnt
  # dump 0f - /dev/wd0s3f | restore xf -   ← コピー元はマウントせず直接読む
  # cd /
  # umount /mnt

ファイルシステムとして使っているパーティションが3つあるので, dump|restoreの手順を3回繰り返しています.swapパーティションは コピーする必要はありません.

また,Linuxとは異なり(というかLinuxの方が特例)mkswap に相当する作業は必要ありません.

コピーが終ったら再度,新しい / をマウントして,その中のfstabを修正します.

  # mount -a   ← vi を使うため,IDE側の /usr 他もマウントする.
  # mount /dev/da0s3a /mnt
  # vi /mnt/etc/fstab
     (wd0s3をすべてda0s3に修正)

パーティションブートセクタをインストールします.

  # disklabel -B da0   ← da0で指定していますが,実際にはda0s3に書かれます.

MBRをインストールします.

  (bootinst.exeのある場所に移動して)
  # dd if=boot.bin of=/dev/da0 bs=446 count=1

これで,BIOSの設定でSCSIから起動するようにすれば 新しいディスク上のFreeBSDをブートできます.

あとDOSパーティションのコピーも行なえば完了です. こちらはあえて説明は要らないと思いますので,省略します.

以上で,マルチブートディスクのIDEからSCSIへの移設が完了しました.


To「Linux&FreeBSD ハードウェア設定」index


このページは、技術評論社 Linux×BSD HYPER PRESS Vol.2秋号、『もう困らない!Linux&FreeBSD ハードウェア設定テクニック』 の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 Home
yamamori