テスト環境を作る

何かのソフトを試す時「このPCでやるのがベストだ。でもこの環境壊すのイヤだ><」というジレンマに陥った事がないだろうか?私はしょっちゅうそういう事がある。

なわけで、その方法を伝授する。なお実際の作業はqemu上で行った。

注意事項

無保証です

OS環境を区画もろとも破壊する可能性があります。もちろんこの事に対する保証はありません。

GRUBでブートするマシンが対象です

GRUBがインストールされていてブートローダはこれ一つのみである事が本テストの前提になっている。WindowsやMac OS X、BTRONのローダー等が入っている場合、そこから起動できるかどうかは私の範囲外になります。

とはいえ、おそらくですがliloなんかでも読み替えのできる知識があればOKでしょう。

行き先と元の構成が食い違ってても全然構わない

元と先の構成の差異?そんなものどうでもいい、コピーできればいいのです。SATAディスクから旧IDE+USBメモリなんて変態区画にコピーした事もあります。まぁ容量だけは気をつけて。

要は ブートローダとOSが読むべきデータに到達できればそれでいい わけなので、後はどうにでもなります。カーネルとGRUBが普通に対応している限りOKです。

作業の実際

コピー先環境の設定

コピー先のストレージを接続し、fdisk等で区画を切りフォーマットしときます。容量や区画の割り当てに注意してください。普通にOSをインストールするつもりでかまいません。

この時点ではGUIでもやれますが、コマンドでやるなら以下のようなものを使うでしょう :D

# fdisk デバイス名
# mkfs.ext3 -c 作った区画名
# mkswap -c 作ったスワップ領域名

PCをシングルユーザモードに。

さあ、いよいよだ。

# init 1

新ディスクをmountする

旧ディスクをsda、新ディスクをsdbと仮定する。こんな感じかな?

# fdisk /dev/sda

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b074b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        2432    19535008+  83  Linux
/dev/sda2            2433        2675     1951897+  82  Linux swap / Solaris
/dev/sda3   *        2676        5107    19535040   83  Linux
/dev/sda4            5108       60801   447362055   83  Linux
$ df                                                             [~]
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda3             19228308   6790728  11460828  38% /
tmpfs                  1038000         0   1038000   0% /lib/init/rw
udev                     10240        88     10152   1% /dev
tmpfs                  1038000    574756    463244  56% /dev/shm
/dev/sda4            447230976 175199044 272031932  40% /home

sdb側はシンプルに、sdb1が / でsdb2がswapとしよう。さぁmount。

# mkdir /mnt/sdb1
# mount -t ext3 /dev/sdb1 /mnt/sdb1

区画コピー

sda側を見てほしい。/ と /home が別になっているがsdbでは全部ひとつである。 こういう場合はどうするんだと言われそうだが全然気にする事はない。 単に 動作時のディレクトリ構成を壊さないようにコピーすればそれでいい のだ。

# cd /
# cp -ax / /mnt/sdb1
# cd /home
# cp -ax . /mnt/sdb1/home

fstabを手直ししよう。

HDDが同一構成の時は不要。違う時はその構成にあわせましょう。

# cd /mnt/sdb1/etc
# vi fstab

grubを新ディスクに書き込みます

起動時にFDDをがりがりやっちゃって待たされる人。それはそれで対策があるんだけど、まぁそれはそれ。あとでdevice.mapでも好きにいじってください :)

# grub
 (grubが起動する。FDDガリガリの環境で「待たされるのがイヤ」という人は --no-floppy でもつけといて、あとでdevice.mapでも触ろう)
grub> root (hd1,0)
grub> setup (hd1)
grub> exit
#

PCを停止、新ディスクの構成にして起動。

shutdownして新ディスクをprimaryにして起動しよう。

上記(grub以前)をまとめた一例。

こんな感じに走らせます。

echo -n "mkswap /dev/sdb2 ... "
mkswap -c /dev/sdb2
echo "Done."
mkfs.ext3 -c /dev/sdb1
mkfs.xfs -f /dev/sdb3
mkfs.xfs -f /dev/sdb4
sync
xfs_check /dev/sdb3
xfs_check /dev/sdb4
sync
Base=/mnt
mount -t ext3 /dev/sdb1 $Base/sdb1
mount -t xfs /dev/sdb3 $Base/sdb3
mount -t xfs /dev/sdb4 $Base/sdb4
cp -ax / /mnt/sdb1
cd /home
cp -ax . /mnt/sdb3
cd /var
cp -ax . /mnt/sdb4
sync

トラブルシューティング

GRUBが「File not Found」という

ドライブ指定(hd0)等がおかしいのでないならば、カーネル等のパスがおかしい事があるようです。私の場合、LVM絡みの時などで、/boot/vmlinuz....でなく boot/vmlinuz... のように相対ディレクトリ構成になっている事がありましたが、これを絶対に変更するとOKだったりしました。