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 このコマンドのつづりは umountunmount という単語の 1 つ目の n がないことに 注意してください。 同様にネットワークドライブもアンマウントします。 新しい HD のパーティション 新しい HD のパーティションを作成するには次のコマンドを使います - fdisk /dev/hdb EIDE デバイスは /dev ディレクトリの下で各々 hdahdbhdchdd として認識されます。 各ハードディスクには 1 個 から 16 個の範囲でパーティションを置くことができます。 /dev/hda4 というとハードディスク a (つまり 1 つ 目のEIDE ハードディスク)の、4 つ目のパーティション を指します。 SCSI デバイスは /devの下で各々 sdasdbsdcsddsdesdfsdg として認識されます。 各ハードディスクには同じく 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 ハードディスクの異常ブロック(物理的な破損)をチェックするには オプションを /dev/hdb1 の前に付けます。 新しい HD に 1 つ以上の Linux パーティションがあるのなら他のパーティションも 次のコマンドで mkfs.ext2 /dev/hdb2mkfs.ext2 /dev/hdb3 のようにフォーマットします。 必要なら オプションを付けてください。 Red Hat、Debian、Slackware の古いディストリビューションでは マニュアルに書いてあるにもかかわらず mkfs -t ext2 -c /dev/hdb1 としても異常ブロックをチェックしませんでした。これはいまでは直っています。 スワップ パーティションのフォーマットには次のコマンドを使います - mkswap /dev/hdb1 異常ブロックをチェックする オプションも /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 dfwatch ls -l /new-disk を使うと 2 秒毎に更新された状態を見ることができます - 表示を中止させたいときは Ctrl C を押します。 watch コマンドを使うとコピーの速度が遅くなります。 cp -ax / /new-disk これが 1 番簡単な方法ですが元の Linux システムのパーティションが 1 つの時だけ有効です。 なるべく元のファイル構成と属性を保つため オプションを使います。 は単一のファイルシステムをコピーするために使います - これは /new-disk/proc を コピーさせない ために要ります。 SuSE の場合 この方法に限り新しい HD に /dev/pts を 次のコマンドを使って作っておく必要があります。 mkdir /new-disk/dev/pts cp コマンドの最近のバージョンでは オプションを付けると /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-diskcp コマンドのコピー先でその他のディレクトリはコピー元です。 つまり列挙したすべてのディレクトリを /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 コマンドでは適切なチェックはできません。このような"特別"なファイルの検定方法についてなにかあれば教えてください。 <filename>/new-disk/etc/fstab</filename> の修正 新しい 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 を起動させる <acronym>LILO</acronym> の準備 (この章に関して 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 # デフォルトで 5 秒後に起動させる。 # (単位は 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 オプションは どの設定ファイルを使うかを 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 コマンドの後ろに オプションをつけて異常ブロックをチェックしておきます。 Slackware の場合 /dev/fd0H1440 のかわりに /dev/fd0u1440 を使います。 古いバージョンでは 小文字の h にかえた /dev/fd0h1440 を試してください。 SuSE の場合 /dev/fd0H1440 のかわりに /dev/fd0u1440 を使います。 /boot にある ファイルをすべてフロッピーディスクにコピーします - cp -dp /boot/* /mnt Red Hat の場合 /bootvmlinuxvmlinuz の両方のファイル(最後の文字が違います)が あるときは 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 # デフォルトで 5 秒後に起動させる。 # (単位は 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 オプションはどの設定ファイルを使うかを LILO に指定します。 フロッピーディスクをアンマウントします - umount /mnt 元の HD の取り外し システムをシャットダウンして元の HD を取り外します。 ハードディスクのジャンパと BIOS を 新しい環境にあわせて変更するのを忘れないようにしてください。 システムの再起動と <acronym>LILO</acronym> 設定ファイルの修正 システムを再起動します。もしなにか問題が起きたら先ほど作ったブートディスクを使用します。 このとき 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 # デフォルトで 5 秒後に起動させる。 # (単位は 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)