## Hard Disk Upgrade Mini How-To

Yves
Bellefeuille

    yan@storm.ca

Konrad
Hinsen

    hinsen@cnrs-orleans.fr

日本語訳
長岡昭平

    nagaoka@jttk.zaq.ne.jp

v2.11, 13 April 2000

Linux システムをもう 1 つのハードディスクにコピーする方法

## はじめに

この文書では Linux システムを LILO と一緒にそっくりそのまま ハードディスクからハードディスクへ移植する方法について説明します。

以下の説明では `/dev/hda` (1 つ目の IDE ハードディスク) は 元の HD 、 `/dev/hdb` (2 つ目の IDE ハードディスク) は 新しい HD と呼ぶことにします。

元の HD の個々のパーティションは `/dev/hda1`、`/dev/hda2` などの名前で参照されます。新しい HD のそれは `/dev/hdb1`、 `/dev/hdb2` などとなります。

ここでは Red Hat 6.0 に基づいて話を進めますが Debian 2.1、 Slackware 3.5 、SuSE 6.2 でも動作を確認しています。Red Hat 6.0 とこれらのディストリビューションとの相違点は注釈として付けています。

コマンドがうまくはたらかないディストリビューションがあれば教えてください。

## ハードディスクのシステムへの接続

最近のシステムではハードディスクコントローラに EIDE デバイスを 4 台まで接続できます。だから他の EIDE デバイスがあってもハードディスクをさらに 2 台接続するのはなにも問題はないでしょう。 ハードディスクと CD-ROM ドライブが代表的な EIDE デバイスです。フロッピードライブとテープドライブは たいていハードディスクコントローラではなくてフロッピードライブコントローラに接続されています。

SCSI アダプタはさらにゆとりがあって 7 台まで 接続できます。運良く(お金もあって)既に SCSI アダプタを 持っているならこのことは周知のことでしょうしそこにどんなSCSI デバイスが接続しているかもご存じのはずです。でももっと詳しく知りたいときは SCSI How-To を参照してください。

旧式のシステムのハードディスクコントローラにはデバイスが 2 台しか接続 できませんがそれでもハードディスクだけなら 2 台同時に接続できるわけです。 もしハードディスクに加えてたとえば CD-ROM ドライブが接続してあれば元の HD と 新しい HD を同時に接続するためには CD-ROM ドライブを取り外さねばならないと 言うことになります。

ハードディスクについてはジャンパスイッチを操作してマスターと スレーブの設定をする必要があります。設定方法はたいていハードディスクに 書いてありますがそこになければマニュアルを見るかメーカーに問い合わせてください。

次に BIOS に入ってハードディスクを認識させ ジオメトリ を設定します。普通 BIOS 設定プログラムに入るには システムの立上げの時に特定のキーを押します。以下に BIOS 設定プログラム に入る方法を示します -

Acer notebooks

  起動時の自己診断 (Power-On Self-Test:POST) 時に F2 キーを押す。

American Megatrends (AMI)

  POST 時に Del キーを押す。

Award

  Del、または Ctrl Alt Esc

Compaq

  起動して画面右隅に四角形が出てから F10 キーを押す。

Dell

  Ctrl Alt Enter

DTK

  POST 時 Esc キー

Hewlett-Packard Pavilion

  HP のブルーのスプラッシュ画面が表示中に F1 キーを押す。

IBM Aptiva 535

  起動して画面右隅に四角形と波線が表示されているときに F1 キーを押す。 他の Aptiva モデルでも同じなのかどうかはわかりません。

IBM PS/2

  Ctrl Alt Del を押して画面右隅にカーソルが出てきたら Ctrl Alt Ins を押す。

Mr. BIOS

  POST 時 Ctrl Alt S キー

Packard Bell

  2、3 のモデルでは POST 時に F1 キーまたは F2 キーを押す。

Phoenix

  Ctrl Alt Esc 、 Ctrl Alt S または Ctrl Alt Enter

  旧式のシステムの多くはインストールディスクかリファレンスディスクが要ります。

これ以外にも付け加えた方が良いと思われる BIOS があれば連絡してください。

システムをリブートして root でログインします。`su` コマンドで root になるときは `su -` のようにハイフンのオプションをつけます。

## non-Linux パーティションとネットワークドライブのアンマウント

Linux で使えるように他のオペレーティングシステム(DOS、Windows、OS/2 など) のパーティションをマウントしている場合があります。これらのパーティションはそれぞれの オペレーティングシステムで作成してコピーしなければなりませんので Linux をコピーする前に アンマウントします。 たとえば DOS のパーティションを `/dos` に マウントしているならつぎのコマンドでアンマウントしてください -

    umount /dos

このコマンドのつづりは `umount` で unmount という単語の 1 つ目の n がないことに 注意してください。

同様にネットワークドライブもアンマウントします。

## 新しい HD のパーティション

新しい HD のパーティションを作成するには次のコマンドを使います -

    fdisk /dev/hdb

EIDE デバイスは `/dev` ディレクトリの下で各々 `hda`、 `hdb`、 `hdc`、 `hdd` として認識されます。 各ハードディスクには 1 個 から 16 個の範囲でパーティションを置くことができます。

`/dev/hda4` というとハードディスク a (つまり 1 つ 目のEIDE ハードディスク)の、4 つ目のパーティション を指します。

SCSI デバイスは `/dev`の下で各々 `sda`、 `sdb`、 `sdc`、 `sdd`、 `sde`、 `sdf`、 `sdg` として認識されます。 各ハードディスクには同じく 1 個 から 16 個の範囲でパーティションを置くことができます。

`/dev/sda3`とは 1 つ目の SCSI ハードディスクの、3 つ目のパーティションを意味します。

Linux ファイルシステム ext2 の パーティション ID は 83、スワップパーティション ID は 82 にします。

パーティションの作成については Installation How-To と Partition Mini How-To を参照してください。

新しい HD のシリンダー数が 1024 を超えるときは Large Disk Mini How-To を 参照してください。要するに Linux の起動に必要なファイルはハードディスクのシリンダー数が 1024 以内の 場所にインストールされていなければなりません。1 つの方法としてハードディスクの最初の部分に5Mbかそこらの 小さなパーティションを作って `/boot` ディレクトリ を置くというのがあります。(Slackware ではカーネルを `/boot/vmlinuz` ではなく `/vmlinuz` として置くので `/` と `/boot` の両方をこのパーティションに作ります。)

Linux 以外のシステムのパーティションは Linux の `fdisk` でなくそれ自身の `fdisk` かそれと同じ機能のコマンドを使って作成します。

## 新しい HD のフォーマット

新しい HD の Linux パーティションを ext2 ファイルシステムでフォーマット するには次のコマンドを使います -

    mkfs.ext2 /dev/hdb1

ハードディスクの異常ブロック(物理的な破損)をチェックするには `-c` オプションを `/dev/hdb1` の前に付けます。

新しい HD に 1 つ以上の Linux パーティションがあるのなら他のパーティションも 次のコマンドで `mkfs.ext2 /dev/hdb2`、 `mkfs.ext2 /dev/hdb3` のようにフォーマットします。 必要なら `-c` オプションを付けてください。

Red Hat、Debian、Slackware の古いディストリビューションでは マニュアルに書いてあるにもかかわらず `mkfs -t ext2 -c /dev/hdb1` としても異常ブロックをチェックしませんでした。これはいまでは直っています。

スワップ パーティションのフォーマットには次のコマンドを使います -

    mkswap /dev/hdb1

異常ブロックをチェックする `-c` オプションも `/dev/hdb1` の前に置いて使えます。

## 新しい HD のマウント

新しい HD をマウントするディレクトリたとえば `/new-disk` を作り そこにマウントします。

    mkdir /new-disk
    mount -t ext2 /dev/hdb1 /new-disk

新しい HD の Linux パーティションが 1 つ以上になるならのちのちのそれと同じ構造になるように `/new-disk` にマウントします。

### 例

新しい HD の 4 つの Linux パーティションを次のように設定するものとします -

    /dev/hdb1:    /
    /dev/hdb2:    /home
    /dev/hdb3:    /var
    /dev/hdb4:    /var/spool

4 つのパーティションを `/new-disk` の下に次のようにマウントします -

    /dev/hdb1:    /new-disk
    /dev/hdb2:    /new-disk/home
    /dev/hdb3:    /new-disk/var
    /dev/hdb4:    /new-disk/var/spool

パーティションをマウントする前に各々の階層ごとに マウントポイントを作ります。

### 例

    mkdir /new-disk                         [1 つ目の階層]
    mount -t ext2 /dev/hdb1 /new-disk

    mkdir /new-disk/home                    [2 つ目の階層]
    mount -t ext2 /dev/hdb2 /new-disk/home

    mkdir /new-disk/var                     [2 つ目の階層]
    mount -t ext2 /dev/hdb3 /new-disk/var

    mkdir /new-disk/var/spool               [3 つ目の階層]
    mount -t ext2 /dev/hdb4 /new-disk/var/spool

`/new-disk/tmp` を マウントポイントとしたときはそのディレクトリにだれでもアクセスできるようにパーミッションを 次のように訂正します -

    chmod 1777 /new-disk/tmp

## 元の HD から新しい HD へのファイルのコピー

ハードディスクをコピーする時はシングルユーザーモードで行います。これはシステムデーモンをシャットダウンし ログの状態を保ち他のユーザーのログインを防ぐためです -

    /sbin/telinit 1

ディレクトリとファイルそれにリンクのすべてをコピーします。

しかし `/new-disk` をコピー する必要はありません。自分自身をコピーすることになるからです。

さらに新しい HD に `/proc` ディレクトリを作りますが内容をコピーする必要はありません - これは 1 種の バーチャル ファイルシステムで実際にはファイルはありませんが稼動中のシステムのプロセス情報 を反映しています。

元の HD を新しい HD にコピーする方法は 3 つあります。ハードディスクが大きかったり メモリが小さかったりすればかなり時間がかかります。コピー速度は 1 分間 10 Mb かもう少し多い ぐらいでしょう。

コピーの進行状況はほかのターミナルから `df` コマンドを使って分かります。 `watch df` か `watch ls -l /new-disk` を使うと 2 秒毎に更新された状態を見ることができます - 表示を中止させたいときは Ctrl C を押します。 `watch` コマンドを使うとコピーの速度が遅くなります。

`cp -ax / /new-disk`

  これが 1 番簡単な方法ですが元の Linux システムのパーティションが 1 つの時だけ有効です。

  なるべく元のファイル構成と属性を保つため `-a` オプションを使います。 `-x` は単一のファイルシステムをコピーするために使います - これは `/new-disk` と `/proc` を コピーさせない ために要ります。

  ### SuSE の場合

  この方法に限り新しい HD に `/dev/pts` を 次のコマンドを使って作っておく必要があります。 `mkdir /new-disk/dev/pts`

  `cp` コマンドの最近のバージョンでは `-x` オプションを付けると `/new-disk/new-disk` と `/new-disk/proc` ができます。ディレクトリの中身はありません。この 2 つができた時は `/new-disk/new-disk` を 消去して `/new-disk/proc` を残しておきます。

`cd / && echo cp -a `/bin/ls -1Ab | egrep -v "^new-disk$|^proc$"` /new-disk | sh`

  ( 1 行で記述してください)

  このコマンドはまずルートディレクトリに入り次に `/new-disk` と `/proc` を除く すべてのファイルとディレクトリを `/new-disk` にコピーします。 ls の後ろの最初のオプションは アルファベットの L ではなく数字の 1 です。

  このコマンドはどんなときでもたぶん有効です。

`cp -a /bin /boot /dev /etc /home /lib /lost+found /mnt /root /sbin /tmp /usr /var /new-disk`

  ( 1 行で記述してください)

  1 番後ろのディレクトリ `/new-disk` は `cp` コマンドのコピー先でその他のディレクトリはコピー元です。 つまり列挙したすべてのディレクトリを `/new-disk` にコピーすることになります。

  この方法ではコピーする必要のあるディレクトリを自分で単にリストアップするだけです。 ここでは `/new-disk` と `/proc` を除いて すべてのディレクトリをリストアップしています。なんらかの理由でほかの方法が使えないときは このコマンドを使ってマニュアルでコピーしたいディレクトリを指定します

  この方法の場合ルートディレクトリ自身になにかファイルがあるときは次のコマンドを使って コピーします。特に Debian と Slackware ではルートディレクトリにファイルを 置くのでその必要があります -

      cp -dp /* /.* /new-disk

この Mini How-To の以前のバージョンではハードディスクをコピーするのに `tar` コマンドも使えると書きましたがこの方法にはバグがあります。その他にも当然いろいろな方法がありますが この 3 つが最も簡単で速くて確かです。

3 つの方法のどれかでコピーした後もし新しい HD に `/proc` ディレクトリが無ければ作成します -

    mkdir /new-disk/proc

ここで必要なら新しい HD のファイル構造を検定します -

    umount /new-disk
    fsck.ext2 -f /dev/hdb1
    mount -t ext2 /dev/hdb1 /new-disk

もし新しい HD に 1 つ以上のパーティションがあるなら `fsck.ext2` を走らせる前に下の階層からアンマウントします - 前に述べた例ではまず 3 層目のパーティションをアンマウントしてつぎに 2 層目 1 層目と続きます。

ファイルが間違いなくコピーされたかどうかを確かめるため2つのハードディスクを照合して おくこともできます -

    find / -path /proc -prune -o -path /new-disk -prune -o -xtype f -exec cmp {} /new-disk{} \;

( 1 行で記述してください)

### Slackware の場合

最小限のファイルだけを含む Slackware の基本インストール("A" シリーズだけ)では `cmp` は含まれて来ないのでこのコマンドは実行できません。 これは "AP1" シリーズには入ってきます。

このコマンドは普通のファイルだけを照合します。 `/dev` ディレクトリにある特殊な キャラクタ デバイス ファイルやブロック デバイス ファイル、ソケットなどは `cmp` コマンドでは適切なチェックはできません。このような"特別"なファイルの検定方法についてなにかあれば教えてください。

## `/new-disk/etc/fstab` の修正

新しい HD が元の HD とパーティションや構成が異なっているときは新しい HD の `/new-disk/etc/fstab` をそれに合うように修正します。

元の HD が取り外されてしまったときにディスクのパーティションの記述(fstab の 1 列目)が新しい HD の構成と一致しているか、また 2 列目に記述されている `/` ディレクトリにパーティションが 1 つマウント されるだけだということを確認してください。

`/etc/fstab` ファイルの書式については Linux System Administrator's Guide の セクション 4 Mounting and unmounting の項を参照してください。

スワップパーティションは次のようにします -

    /dev/hda1   swap    swap    defaults    0  0

## 新しい HD を起動させる LILO の準備

(この章に関して Rick Masters の助言に感謝します)

LILO はハードディスクのマスターブートレコード (MBR) にインストールしてあるものとします。これが最も一般的な設定です。 今は 2 つ目だがいずれは 1 つ目になるハードディスクに LILO をインストールします。

`/new-disk/etc/lilo.conf` を次のように編集します -

    disk=/dev/hdb bios=0x80       # 2 つ目のハードディスクを 1 つ目のハードディスク
                                  # として取り扱うよう LILO に指示する。
                                  # (BIOS ID 0x80).
    boot=/dev/hdb                 # 2 つめのハードディスクに LILO を
                                  # インストールする。
    map=/new-disk/boot/map        # マップファイルの場所
    install=/new-disk/boot/boot.b # このファイルから(LILO ブートレコードを)
                                  # ブートセクタへコピーする。
    prompt                        # "LILO boot:"プロンプトの表示
                                  #
    timeout=50                    # デフォルトで ５ 秒後に起動させる。
                                  # (単位は 1/10 秒)
                                  #
    image=/new-disk/boot/vmlinuz  # Linux カーネルの場所を示す。
                                  # 実際の名称は次のようにバージョンナンバーが
                                  # 入っている。
                                  # "vmlinuz-2.0.35"
        label=linux               # 起動するシステムを識別するラベル
        root=/dev/hda1            # 新しい HD のルートパーティションの場所
                                  # これはハードディスクを入れ替えた後の
                                  # システムに合うように修正する。
                                  # いずれ元の HD は取り外されるので
                                  # 入れ替えたのちのハードディスクの場所を
                                  # 指定する。
        read-only                 # 読み出し専用でまずマウントしファイルシステムの
                                  # チェックをする。

### Slackware の場合

`image=/new-disk/vmlinuz` とします。

もし SCSI ディスクを使っているなら `initrd` がいるかも知れません。今ある `/etc/lilo.conf` を調べてみてください。

新しい HD にLILO をインストールします -

    /sbin/lilo -C /new-disk/etc/lilo.conf

`-C` オプションは どの設定ファイルを使うかを LILO に指定します。

## ブートディスクの作成(オプション)

新しい HD で起動しない場合に備えてブートディスクを作っておくこともできます。

なにも入っていないフロッピーディスクを挿入、フォーマットして、ファイルシステムを作成、 マウントします -

    fdformat /dev/fd0H1440
    mkfs.ext2 /dev/fd0
    mount -t ext2 /dev/fd0 /mnt

### Debian の場合

Debian 2.x では `/dev/fd0H1440` のかわりに `/dev/fd0u1440` を、 Debian 1.x では小文字の h にかえた `/dev/fd0h1440` を使います。

### Debian の場合

Debian 2.x では `fdformat` のかわりに `superformat` を使います。 つぎのエラーが出ますが無視してください。 `mformat: command not found`. Debian 1.x でもし `fdformat` がないとき フロッピーがすでにフォーマットされているならそれを省けます。 この場合は `mkfs.ext2` コマンドの後ろに `-c` オプションをつけて異常ブロックをチェックしておきます。

### Slackware の場合

`/dev/fd0H1440` のかわりに `/dev/fd0u1440` を使います。 古いバージョンでは 小文字の h にかえた `/dev/fd0h1440` を試してください。

### SuSE の場合

`/dev/fd0H1440` のかわりに `/dev/fd0u1440` を使います。

`/boot` にある ファイルをすべてフロッピーディスクにコピーします -

    cp -dp /boot/* /mnt

### Red Hat の場合

`/boot` に `vmlinux` と `vmlinuz` の両方のファイル(最後の文字が違います)が あるときは `vmlinuz` の方だけをコピーします。 これは圧縮されているだけで vmlinux と同じです。

### Slackware の場合

次のコマンドを使って `/vmlinuz` をブートディスクに コピーします - `cp /vmlinuz /mnt`

`/mnt/lilo.conf` を以下のように編集します。

    boot=/dev/fd0                 # フロッピーディスクに LILO をインストールする。
    map=/mnt/map                  # マップファイルの場所
    install=/mnt/boot.b           # このファイルから(LILO ブートレコードを)
                                  # フロッピーディスクのブートセクタへコピーする。
    prompt                        # "LILO boot:"プロンプトの表示
                                  #
    timeout=50                    # デフォルトで ５ 秒後に起動させる。
                                  # (単位は 1/10 秒)
                                  #
    image=/mnt/vmlinuz            # フロッピーディスク上のLinux カーネルの場所を示す。
                                  # 実際の名称は次のようにバージョンナンバーが
                                  # 入っている。
                                  # "vmlinuz-2.0.35"
        label=linux               # 起動するシステムを識別するラベル
        root=/dev/hda1            # 新しい HD のルートパーティションの場所
                                  # これはハードディスクを入れ替えた後の
                                  # システムに合うように修正する。
                                  # いずれ元の HD は取り外されますので
                                  # 入れ替えたのちのハードディスクの場所を
                                  # 指定します。
        read-only                 # 読み出し専用でまずマウントしファイルシステムの
                                  # チェックをする。

ブートディスクに LILO をインストールします -

    /sbin/lilo -C /mnt/lilo.conf

`-C` オプションはどの設定ファイルを使うかを LILO に指定します。

フロッピーディスクをアンマウントします -

    umount /mnt

## 元の HD の取り外し

システムをシャットダウンして元の HD を取り外します。 ハードディスクのジャンパと BIOS を 新しい環境にあわせて変更するのを忘れないようにしてください。

## システムの再起動と LILO 設定ファイルの修正

システムを再起動します。もしなにか問題が起きたら先ほど作ったブートディスクを使用します。 このとき BIOS の起動順序を `A:、 C:` に変更 する必要があるかも知れません。

再度 LILO(/sbin/lilo) を実行する時のために `/etc/lilo.conf` を修正しておきます。 どのようにするかの一例です -

    boot=/dev/hda                 # 1 つ目のハードディスクに LILO をインストールする。
                                  #
    map=/boot/map                 # マップファイルの場所
    install=/boot/boot.b          # このファイルから(LILO ブートレコードを)
                                  # ブートセクタへコピーする。
    prompt                        # "LILO boot:"プロンプトの表示
                                  #
    timeout=50                    # デフォルトで ５ 秒後に起動させる。
                                  # (単位は 1/10 秒)
                                  #
    image=/boot/vmlinuz           # Linux カーネルの場所を示す。
                                  # 実際の名称は次のようにバージョンナンバーが
                                  # 入っている。
                                  # "vmlinuz-2.0.35"
        label=linux               # 起動するシステムを識別するラベル
        root=/dev/hda1            # 新しい HD のルートパーティションの場所
                                  # これは新しいシステムに合うように修正する。
                                  #
        read-only                 # 読み出し専用でまずマウントしファイルシステムの
                                  # チェックをする。

### Slackware の場合

`image=/vmlinuz` を使います。

## 謝辞

以下の方々に感謝いたします。

Scott Christensen、 Frank Damgaard、 Alexandre Fornieles、 David Fullerton、 Igor Furlan、 Jerry Gaines、 Chris Gillespie、 Nicola Girardi、Per Gunnar Hansoe、 Richard Hawes、 Ralph Heimueller、 Gerald Hermant、 Andy Heynderickx、 Paul Koning、 Hannu Liljemark、 Claes Maansson、 Rick Masters、Jason Priebe、 Josh Rabinowitz、 Douglas Rhodes、 Valentijn Sessink、 Kragen Sitaker、 Stephen Thomas、 Gerald Willman

この文書を翻訳する人はそのコピーを Konrad Hinsen hinsen@cnrs-orleans.fr に送ってください。

## 日本語訳について

翻訳につき助言を頂いたつぎの方々に感謝いたします - 武井伸光さん、千旦裕司さん

日本語訳は Linux Japanese FAQ Project が作成しました。 翻訳に関するご意見は JF プロジェクト JF@linux.or.jp 又は、長岡昭平 nagaoka@jttk.zaq.ne.jp 宛に連絡してください。 (翻訳年月日 25 February 2001, v2.11)