CD-ROM起動でハードディスクからファイルを救出

 
  YAMAMORI Takenori ●yamamori

●LinuxのインストールCD-ROMを使う方法

LinuxなどのOSのインストールCD-ROMは,実際のインストールだけでなく, ハードディスクからのファイルの救出にも使用することができます. その方法を順に説明します.

○インストーラの途中でシェルに切替え

RedHat系Linuxでは,インストーラの起動後,実際のインストールを行なわずに 仮想コンソールを切替えてシェルの画面を表示することができます. RedHat系Linux以外のOSでも,たいていインストーラの途中でシェルに抜ける手段が 用意されているはずです.

具体的には下図のように,「インストールの種類」の選択画面あたり,または この画面で「カスタム」を選んだあとの「ディスクパーティションの設定」あたりまで インストーラを進め,ここで[Ctrl]+[Alt]+[F2]を押して, シェルの画面に切替えるとよいでしょう.

●図 Linuxのインストーラの途中でシェルの仮想コンソールに切替え
[Ctrl]+[Alt]+[F2]   [Ctrl]+[Alt]+[F7]
inst-cd-shell-s.gif

 シェルの画面に切替え
←←←←←←←←←←←
inst-cd-gui-s.gif

ここではX上で動作する通常のインストーラを起動していますが, ブートローダのプロンプトで「boot: linux text」と入力して テキストモードで起動しても基本的には同じです.

なお,テキスト画面からは[Ctrl]なしで[Alt]+[F2]で仮想コンソールに切替え られますが,[Alt]は左の[Alt]キーしか使えないので注意してください.

○レスキューモードについて

インストーラの途中でシェルに切替えるのではなく, 最初からレスキューモードで起動するという方法もあります. RedHat Linux 9などのLinuxのインストーラの起動時に, ブートローダのプロンプトに対して,

  boot: linux rescue

と入力すると,レスキューモードで起動できます.

レスキューモードでは,[Ctrl]+[Alt]+[F2]で切り替わる仮想コンソール上の シェルだけでなく,[Ctrl]+[Alt]+[F1]のメインのテキスト画面上に 直接シェルが起動します.

レスキューモードでは,さらにネットワークインターフェイスの 設定画面が出たり(RedHat 9の場合),ハードディスク上に存在する Linuxのパーティションを自動的に見つけて/mnt/sysimageにリードオンリで マウントしてくれたりします.

なお,レスキューモードでも言語の選択ができますが,ここで日本語を選ぶと, RedHat 9ではフレームバッファコンソールの動作が遅過ぎ, RedHat 8.0ではインストールCD-ROM自身をマウントできないという問題があるため, ここでは英語モードを使用するのが無難でしょう.いずれにしても, 通常モードでインストーラを起動してシェルの画面に切替える方法を知っていれば, 結局レスキューモードと同様の作業はできるため, とくにレスキューモードでの起動にこだわる必要はないでしょう.

○救出するハードディスクのマウント

シェルの画面になったら,救出するハードディスクのパーティションを リードオンリでマウントします.

・マウントポイントの作成

マウントポイントはどこでも構いませんが,ここでは「mkdir /a」で インストーラのRAMディスク上に/aというマウントポイントを作成することにします. なお,レスキューモードで起動した場合は/mnt/sysimageに, すでに自動的にマウントが行なわれている場合があります.

・デバイスファイルの作成

この時点では,インストーラの進行状況によっては/dev/hda1,/dev/hda2,...などの デバイスファイルがまだ作成されていない可能性があります. 救出するハードディスクのパーティションに対応するデバイスファイルがない場合は, mknodコマンドで作成してください.たとえば/dev/hda3を作成する場合は,

  # mknod /dev/hda3

とします.このmknodコマンドはインストール用の特別なバージョンであり, hda3のようにデバイスファイル名を指定するだけでよく, デバイスのメジャー番号,マイナー番号などを指定する必要はありません.

なお,現在認識されているハードディスクのパーティションの情報は, 「cat /proc/partitions」とコマンド入力して表示することができます.

・ハードディスクのマウント

ハードディスクのパーティションが,Linuxで通常使用するext2またはext3の ファイルシステムならば,

  # mount -r /dev/hda3 /a

としてマウントできます.mountコマンドには「-r」オプションを付けて リードオンリにします.マウントできれば/aディレクトリの下に 救出するべきファイルが見えるはずです.

このほか,WindowsのFATのファイルシステムも,mountコマンドで マウントできます.ファイルシステムタイプは自動判定されますが, 念のため「-t vfat」オプションを付けた方がよいでしょう.

なお,インストールCD-ROMの環境ではFreeBSDやSolarisなどの ファイルシステムのマウントには対応していません.これらのパーティションから ファイルを救出する場合は,後述のように KNOPPIXを使う とよいでしょう.


○別ディスクにセーブ

・別のハードディスクをマウント

ここで,救出するファイルをセーブするための別のハードディスクをマウントします. 同じハードディスクの別パーティションでも可能ですが, できれば別のハードディスクにセーブした方が安全です.

新品のハードディスクの場合は,マウントの前にあらかじめ, 次のようにファイルシステムを作成しておいてください. ここでは,セーブ先としてSCSIのハードディスクを使用するものとします.

  # mknod /dev/sda          ← デバイスファイルが無ければ作る
  # fdisk /dev/sda          ← fdiskコマンド内でsda1のパーティションを作成
  # mknod /dev/sda1         ← デバイスファイルが無ければ作る
  # mke2fs /dev/sda1        ← sda1にext2のファイルシステムを作成

準備ができたら次のようにしてハードディスクをマウントします.

  # mkdir /save             ← マウントポイントを作る
  # mount /dev/sda1 /save   ← セーブ先のハードディスクを読み書き可でマウント
・重要なファイルを個別にセーブ

これでファイル救出の準備は整いました.まずは,最初からファイルシステム全体を コピーするのではなく,その中でもとくに重要なファイルのみを先にセーブするように してください.これは,ハードディスクの一部のセクタが物理的に損傷している 可能性があるためです.損傷したセクタを含むファイルにアクセスすると, 重要なファイルのセーブが終る前に,デバイスドライバレベルでシステムが 固まってしまう危険性があります.

重要なファイルとは,具体的にはシステムの運用状況によって異なりますが, 各ユーザのホームディレクトリ以下,/etc以下の設定ファイル,/var/spool/mailの メールスプール,/var/logのログファイルなどでしょう. 個別のファイルのセーブは,次のようにcpコマンドなどを使って行なえばよいでしょう.

  # cp -p /a/home/username/my_file /save
・ファイルシステム全体のセーブ

次に,ファイルシステム全体をセーブします.これには,いわゆる「tar | tar」や 「dump | restore」コマンドを使うこともできますが,ここではGNU cpに「-ax」 オプションを付けて,次のように簡便にセーブを行なうことにします. (コラム「cp -ax の意味は?」参照)

  # cp -ax /a/. /save

ここで,コピー元のディレクトリを,/aや/a/ではなく, /a/.と,最後にドットを付けて指定していることに注意してください. こうしないと/saveの下にaというディレクトリ自体がコピーされてしまいます.

・セーブ先ディスクのumount

ファイルーのセーブが終ったら,最後にセーブ先のハードディスクを 次のように忘れずにumountしてください.

  # umount /save

このあと,[Ctrl]+[Alt]+[Del]を押してマシンをリセットすることができます.


○ネットワーク経由でセーブ

ファイル救出用の別のハードディスクを用意できない場合は, ネットワーク経由で別のマシンにセーブすることができます. その手順を順に説明します.

・ネットワークインターフェイスの立ち上げ

まずはネットワークインターフェイスを立ち上げる必要があります. これは,インストーラをレスキューモードで起動した場合は, 途中の設定メニューによってすでに完了しているでしょう. それ以外の場合は,

  # ifconfig eth0 192.168.1.250

のようにifconfigコマンドにIPアドレスを指定してネットワークを立ち上げます. eth0に対応するネットワークカード用のモジュールは,自動認識ですでに modules.confに書き込まれているはずです.(インストーラ上では/etc/modules.conf ではなく,/tmp/modules.confとなる場合があります)

デフォルトルートの設定が必要な場合は,

  # route add default gw ルータのIPアドレス

とコマンド入力してください. なお,インストールCD-ROM環境にはnetstatコマンドがないため, ルーティングテーブルを表示する場合は「netstat -rn」の代わりに 「route -n」コマンドを使用してください.

DNSについては/etc/resolv.confを設定すれば使えるようになりますが, 緊急時の使用ということもあり,DNSは設定せず,IPアドレスのじか打ちを基本と 考えた方がよいでしょう.

・重要なファイルを個別にセーブ

ここで,前述の別ディスクへのセーブと同様に,まずは重要なファイルのみを 個別にリモートマシンにセーブします.

これには,ftpまたはscpコマンドが使えます. scpを使う場合は次のようにコマンド入力します.

  # scp -p /a/home/username/my_file username@192.168.1.123:/tmp

この例では,/a/home/username/my_fileというファイルを,192.168.1.123という IPアドレスのマシンの/tmpディレクトリの下にコピーしています. なお,インストールCD-ROMの環境でRSA認証を行なうのは困難であるため, 通常のUNIXパスワードを使った認証を行なうことになります.

・ファイルシステム全体のセーブ

次にファイルシステム全体をセーブします. これにはtarコマンドを使うとよいでしょう. 具体的には次のようにコマンド入力します.

  # cd /a
  # tar clvf - . | ssh username@192.168.1.123 'gzip > /tmp/backup.tar.gz'

この例では,/aにマウントされている救出元のハードディスク全体を tarでアーカイブし,それをsshで192.168.1.123というIPアドレスのマシン上の /tmp/backup.tar.gzというファイルに圧縮してセーブしています. sshでリモートで実行するコマンドは,シングルクォート(' ')でくくる必要があります. セーブ先のリモートマシン側でgzipを使っていますが,圧縮の必要がなければ gzipをcatに変更し,ファイル名は*.tarとしてください.


To『CD-ROM起動でハードディスクからファイルを救出』[index]


このページは、技術評論社 Software Design 2003年8月号、『システムが起動しない!非常時のデータ確保術』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 [Home]
yamamori