2010年9月27日月曜日

Linuxでディスク交換

Linuxはほとんど仮想マシンでしか扱わなくなっていますが、仮想ディスクのサイズ設定や構成を後悔したりとか、パーティションの切り方を変えたくなったりした時って、仮想かどうかは関係なく結局「ディスク交換」みたいなことをしなければいけない、というか、すればいいのかなと考えていろいろと試行錯誤してみた。

これはOS等を含んだブートディスクの場合です。ブートディスクでない場合は別に悩むことなくコピーして付け替えればよいと思います。
OSその他を再インストールしてデータ移行すればいいってのはわかるが、それはそれで結構手間がかかるし、ということで。

仮想ディスク絡みだったら、ツールとかもそれなりにいろいろあるのかもしれないけどその辺はあまり調べていない。
あっても結局、仮想ディスクファイルを物理ディスク的に扱うようなものだろうから、結局やりたいことにはならない可能性大と思ったので。

それから試してたLinuxはRed Hat系です。まあ別にこの辺は大して違いはないのだろうと思いますが。

新ディスクのパーティション設定


まずは新しいディスクを用意し追加で接続する。
そしてその新ディスクのパーティション設定を行う。
新ディスクが"/dev/sdb"として接続されている例です。
# fdisk /dev/sdb

対話的に操作できるので、順に設定していく。
使うコマンドはこんな感じでしょうか。
  • p 領域テーブルを表示する
  • n 新たに領域を作成する
  • a ブート可能フラグをつける
  • t 領域のシステム ID を変更する
  •  LVMを使う場合に、IDを"8e"に変更する
  • q 変更を保存せずに終了する
  • w テーブルをディスクに書き込み、終了する

私が試した時は元のディスクが以下のような感じだったので、同じようにパーティションを二つ作成し、一つ目は「ブート可能」に、二つ目はシステムIDをLVMに変更した。
  1. /boot
  2. /dev/VolGroup00
  3.  ※LVMの物理ボリューム、論理ボリュームには / と swap

LVMを使うパーティションについては、さらに物理ボリューム、ボリュームグループ、論理ボリュームの設定を行う。
# pvcreate /dev/sdb2
# vgcreate VolGroup00new /dev/sdb2
# lvcreate -L ????m -n LogVol00 VolGroup00new

「????m」は作成する論理ボリュームのサイズを指定。
lvcreate は新ディスクでやりたいマウントポイントの構成に応じて必要な分だけ実施する。
例えば、旧ディスクは / 以下に全部入れていたのを新ディスクでは /var とか /home を分けたいとかいう場合、それぞれに必要な論理ボリュームを作成する。。

さらにファイルシステムの作成。
# mkfs -t ext3 /dev/VolGroup00new/LogVol00

SWAPパーティションの場合は mkswap しておく。
# mkswap /dev/VolGroup00new/LogVol01


データコピー


旧ディスクから新ディスクにデータをコピーします。
コピー中に元データ変更されるとトラブルになる可能性があるので、シングルユーザモードかSystemRescueCdなどを使って起動してやった方がいいでしょう。
私が試した限りではどっちでも大丈夫そうでしたが、感覚的にはやっぱりSystemRescueCdを使うのが良いと思います。
シングルユーザモードとはいってもコピー元のディスクからOS起動しているわけなので、何かある可能性は高くなるような気がする。
その辺は別に詳しくないので、あくまで「気がする」だけです。

コピーのやり方はいろいろあると思いますが、私はとりあえず今何をしているかをわかりやすくするためにコピー元とコピー先用にマウントポイントを設けてやりました。
コピー先で一部を別パーティションにする場合はdest側に追加で mkdir & mount を必要な分だけ実施。
mountとコピーはコピー元のパーティション分、繰り返します。
# mkdir /mnt/source
# mkdir /mnt/dest

# mount -t ext3 /dev/VolGroup00/LogVol00 /mnt/source
# mount -t ext3 /dev/VolGroup00new/LogVol00 /mnt/dest

# cd /mnt/source
# tar cpf - ./ | tar xpf - -C /mnt/dest

実際のコピーですが、なぜか tar を使ってコピーする例があったのでやってみた。
一応問題なく動いているっぽいです。
普通に "cp" とかでもうまくいくんではなかろうかという気はしてます。
# cd /mnt/source
# cp -a ./ /mnt/dest/

ポイントはたぶん "p"オプションで所有者、アクセス権などを引き継がせる事だろう。
cp の "-a" は "-dpR" とmanページに記載があるのでほぼ同様の効果があると思われます。

ブートセクタ設定


ここが色々と苦戦して悩んだところではありますが、普通に grub-install しました。
# mkdir /mnt/boot
# mount -t ext3 /dev/sdb1 /mnt/boot
# grub-install --root-directory=/mnt /dev/sdb

適当に"boot"というディレクトリを作成して、そこに新ディスクの/bootパーティションをマウントする。
grub-install の "--root-directory"オプションではそのマウントポイントの一つ上を指定してやる。上記の例だと "/mnt"。
マウントポイントをそのまま指定するとその下に"boot"ディレクトリが作成されて、さらにその下に"grub"となってしまうので。

あとこんな感じでエラーが出る時がある。
/dev/sdd does not have any corresponding BIOS drive.

これはインストール先にある device.map が関係しているらしいです。
(hd0) /dev/sda

こんな記述になっていたりするので、コピー先のディスクに関する記述を追加してやれば良いようです。
(hd1) /dev/sdb

ただ、ディスク交換後はこの記述は必要ないと思うし、device.map ファイルがなければ接続しているディスク等を probe してインストールしてくれるようなので、/boot パーティションに関しては先に grub-install してからデータコピーをする方が、コピーしたものへの変更作業が少ないので、なんとなく気持ちがいい気がします。
それか少し面倒だけど新ディスクが"/dev/sda"になるように付け替えて、RescueCdから起動して grub-install でもいけますが。

/etc/fstab の確認


新ディスクの"/etc/fstab"を確認して、旧ディスクを外して新ディスクから起動する時に適切にマウントされる設定となるように必要に応じて調整します。
ディスク入れ替え後は新ディスクが"/dev/sda"になると思うので変えなくてよい場合もあると思います。
ここではLVMまわりで多少試行錯誤したところがあって、「"/etc/fstab"もなるべく変更しないで済むようにしよう」とか思って、vgrename でボリュームグループ名を変更とかしてみた。
それでももちろんできましたが、後で考えたらなんか変な感じがした。

"/etc/fstab"でデバイスがLABELで記述されている場合は"e2label"でラベルを付ける。
# e2label /dev/sdb1 /boot

あと、"/boot/grub/grub.conf"の kernel のパラメータも確認しておく必要があると思います。

ディスクを入れ替えて起動


ここまでくればもう大丈夫なはず。
ということで旧ディスクをはずし、新ディスクを先頭に接続して起動します。

OS起動は無事にできても、ログインしようとするとこんなエラーが出る場合がありました。
/etc/X11/xinit/Xsession default を実行できませんでした

これはどうもselinux絡みらしく、"enforcing mode" にしているとこうなる。
"permissive mode"にしておけばログインできますが、当然の如くselinuxの警告出まくりで。

ディスクの追加・交換をした時などは「ファイルのラベル付け」をあらためてやる必要があるようです。
# restorecon -rv /

ああ、なんかこの辺よくわかっていない、、、けど、とりあえずこれで動くようにはなった。

"/.autorelabel"ってファイルを作ってリブートしても同じ効果があるはず。
でも本当にこの影響かどうかもよくわかりませんが、ブート時のメッセージの出方が変わったりとかしている。今のところ実質的な影響はなしですが。

アプリの動作確認とかはそれほどしっかりとはしていないけど、理屈の上では大丈夫なはず、というところですね。

以下、参考にしたサイトなど。


最後のSELinux Policy Editorは試していない。

そういえば、なんか Oracle の11gなんかも、この辺ちゃんと設定しないと動かせないんだけど、面倒なんでとりあえず "permissive mode" にしておく、みたいな笑っちゃう話があった気がするね。
まあ "permissive mode" にして何が引っかかるかを探す、というのは常套手段のようではありますが。
いずれ見なければいけない日が来る、と思います。

0 コメント: