IDEのHDDに入ったLinuxをVMWare仮想マシンに変換してみたが…

RedHat ES 4 が入ったサーバの電源が故障してしまい、起動しなくなってしまった。
内蔵HDDのデータは無事のようなので、この際VMWare仮想マシンに変換することにした。
作戦としては
http://d.hatena.ne.jp/mitszo/20080403/p1
を参考にさせていただき(つーかパクり)、

  1. HDDをddコマンドが使えるマシンに接続し、ディスクイメージを抽出
  2. 仮想マシンを作成
  3. CD Linuxから仮想マシンを起動
  4. CD Linux上のddコマンドを使い、仮想マシンのディスクに元環境のディスクイメージを流し込む
  5. 仮想マシンを普通に起動する

といった感じ。

HDDをddコマンドが使えるマシンに接続し、ディスクイメージを抽出

元のマシンから内蔵HDDを取り出した後、こういうやつを使い、Linux等、ddコマンドが利用可能なマシンのUSBポートに接続する。
最初はWindows版のddコマンドを利用しようと思ったのだが、ext3がどうしても見えなかったので諦め、Linux機(Ubuntu 10.04 LTS)を使うことにした。
接続したHDDから、ddコマンドでディスクイメージを抽出する。
HDDは/dev/sdcとして認識された。保存先はSambaで共有されたディレクトリとした。

$ sudo su -
# dd if=/dev/sdc of=/var/smb-share/ide-disk.img

仮想マシンを作成

VMWare ESXi上で仮想マシンを新規作成する。
ディスクのサイズは、変換元HDDのサイズに合わせる。

CD Linuxから仮想マシンを起動

Ubuntu 10.04 LTSのisoイメージがあったため、それを使うことにする。
isoイメージを仮想マシンに接続して起動し、「インストールせずにUbuntuを試す」的な選択肢を選ぶ。

CD Linux上のddコマンドを使い、仮想マシンのディスクに元環境のディスクイメージを流し込む

起動後、先ほどディスクイメージを抽出したディレクトリをsmbfsを使ってマウントし、仮想マシンのディスクにddコマンドで流し込む。(この前にネットワークの設定は必要。)
Ubuntu上のディスクユーティリティで確認したところ、仮想マシンのディスクは/dev/sdaとして認識されているようであった。

$ sudo su -
# apt-get install smbfs
# mkdir /mnt/smb-share
# mount -t smbfs //xxx.xxx.xxx.xxx/smb-share /mnt/smb-share
Password:
# dd if=/mnt/smb-share/ide-disk.img of=/dev/sda

仮想マシンを普通に起動する

デスクトップ上の電源ボタンから再起動を選ぶと、メディアを取り除いてEnterを押すようメッセージが表示されるので、isoイメージを切断し、Enterを押す。
すると、想定通りRedHat ES 4のgrubの画面が出た!
喜び勇んでEnterボタンを押すと、早々とkernel panicになった。
エラーメッセージを読んでみると、「No volume groups found」とある。
ここからが地獄の始まりであった。
initrdがVolumeGroupを認識できないのだろうということは分かるのだが、Ubuntuから起動してvgscanすると普通に見えるし、元のマシンで動いていたときも/はLVMでマウントされていたはずなので、なぜ認識できないのかが分からない。
色々ネットで調べていたところ、
http://chiji.atnifty.com/topics/?p=68
というエントリに当たり、解決した。
考えてみれば当たり前なのだけど、VMWareのディスクはSCSIエミュレーションなので、IDEで動いていた元のマシンとは別のカーネルモジュールを読み込ませてやらないと、カーネルはディスクを認識できない。

/etc/modprobe.confの記述内容の決定

上のエントリで紹介されている方法に従い作業することにする。(手順はほとんど同じなのだが、一応記録しておくことにする。)
まずは/etc/modprobe.confに正しいカーネルモジュールのエントリを記述する必要がある。
これについてはいい方法が思いつかなくて、別の仮想マシンに新規でRedHat ES 4 をインストールし、その/etc/modprobe.confの内容をひかえておくことにした。
ただし、RedHat ES 4 のメディアが既に手元に無い状況だったため、CentOS 4.8で代用することにする。

仮想ディスク上の/etc/modprobe.confを編集した後、initrdを再生成する

こちらも作業にはRedHat ES 4 のメディアのレスキューモードを使いたかったのだけど、CentOS 4.8のisoイメージで代用することにする。
CentOS 4.8のisoイメージを仮想マシンに接続して起動する。
boot: プロンプトでlinux rescueを入力してEnterを押す。
すると、必要なドライバが読み込まれ、勝手に/mnt/sysimageに仮想ディスクのパーティションがマウントされるので、

# vi /mnt/sysimage/etc/modprobe.conf

として、上でひかえたmodprobe.confの内容に書き換える。NICのドライバも当然ながら元環境とは異なっていたため、合わせて記述を変えた。
コメントアウトされているエントリは、元々記述されていた箇所。

#alias eth0 e1000
#alias snd-card-0 snd-intel8x0
#options snd-card-0 index=0
#install snd-intel8x0 /sbin/modprobe --ignore-install snd-intel8x0 && /usr/sbin/alsactl restore >/dev/null 2>&1 || :
#remove snd-intel8x0 { /usr/sbin/alsactl store >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0
#alias usb-controller ehci-hcd
#alias usb-controller1 uhci-hcd
alias eth0 pcnet32
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptscsi
alias scsi_hostadapter2 mptspi
alias scsi_hostadapter3 mptsas
alias scsi_hostadapter4 mptscsih
alias scsi_hostadapter5 ata_piix

そうした上で、initrdを再生成。chrootし、/usr/local/src/initrdで作業することとする。

# chroot /mnt/sysimage
# cd /usr/local/src
# mkdir initrd
# cd initrd
# mkinitrd initrd-2.6.9-5.EL.img 2.6.9-5.EL

しかし、「No module mptscsi found for kernel 2.6.9-5.EL, aborting.」となって怒られる。
この辺りは、RedHat ES 4 とCentOS 4.8の差異が影響しているかもしれない。
仕方がないので、無いと言われるモジュールはコメントアウトして再試行することにする。
最終的なmodprobe.confは下記のようになり、initrdも正常に生成することができた。

#alias eth0 e1000
#alias snd-card-0 snd-intel8x0
#options snd-card-0 index=0
#install snd-intel8x0 /sbin/modprobe --ignore-install snd-intel8x0 && /usr/sbin/alsactl restore >/dev/null 2>&1 || :
#remove snd-intel8x0 { /usr/sbin/alsactl store >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0
#alias usb-controller ehci-hcd
#alias usb-controller1 uhci-hcd
alias eth0 pcnet32
alias scsi_hostadapter mptbase
#alias scsi_hostadapter1 mptscsi
#alias scsi_hostadapter2 mptspi
#alias scsi_hostadapter3 mptsas
alias scsi_hostadapter4 mptscsih
alias scsi_hostadapter5 ata_piix

最後に生成したinitrdを/bootにコピーして再起動する。

# cd /boot
# mv initrd-2.6.9-5.EL.img initrd-2.6.9-5.EL.img.org
# cp /usr/local/src/initrd/initrd-2.6.9-5.EL.img .
# reboot

これで、kernel panicが起こることなく、ログインプロンプトまで流れるようになった。

正直大変だった

最初は手順通りやれば簡単だと思ったのだが、予想外に大変だった。
実際にはgrubの設定いじったり、lvm.confを変えてみたり、的外れなことをたくさんやってたし。(まあ、色々勉強にはなったが…)
よく考えると、VMWare Convertorを使えばもっと簡単にできたのではないだろうか。
最初、Windows版を入れて少し試してみたのだけれども、Windowsからext3が見えないし、物理マシンとしても認識させることができないので、今回の手順の方が簡単と思い、すぐ諦めてしまったのだ。
よく見るとLinux版のConvertorも用意されているようだし、試してみる価値はある。
今後このようなケースに遭遇することを考え、本腰を入れて検証してみようと思う。