CentOS/LVMの起動中ディスクをSSDに複製し交換する
目次 |
LVMのボリュームを含む起動中の HDD 全データを、HDD より容量の小さな SSD に複製し、SSD から起動させるようにする手順。
複製先の SSD だけでも起動できるよう、ブートローダの設定も行う。
Acronis を使うと簡単にディスクの複製をすることができるが、Acronis は LVM ボリュームをセクター単位で複製するため、使用領域のみ複製することができない。 例えば、200GB の LVM ボリュームのうち 10GB しか使っていなくても、Acronis だと 200GB コピーしてしまう。 |
大まかな手順
元ディスクには変更を加えずに作業する。
- 新ディスクにパーティションを作成。
- 新ディスクをフォーマット。
- 新ディスクをマウントし、rsync で複製。
- 新ディスクにブートローダをインストール。
- 新ディスクの fstab, grub.conf を修正。
パーティション作成
元ディスク(HDD)は 250 GB あり、下記のようにパーティションが作成されている。
Disk /dev/sda: 250.1 GB, 250059350016 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux /dev/sda2 64 30402 243685376 8e Linux LVM
- /dev/sda1 は /boot
- /dev/sda2 は /, /home, swap の 3つの論理ボリュームに分けられている。
- 容量 250 GB のうち、/boot, /, /home の合計で 8 GB 使用中で、swap が 2 GB 使用している。
元ディスク(HDD)の使用状況から、複製先の新ディスク(SSD)を下記のようにパーティションを切る。
Disk /dev/sdb: 32.0 GB, 32000000000 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 262 2104483+ 82 Linux スワップ / Solaris /dev/sdb2 263 3890 29141910 83 Linux
- swap 用パーティションを 2 GB 作成。
- 残りを通常の Linux パーティションで作成。
フォーマット(ファイルシステム作成)
/dev/sdb1 は swap として利用するため、mkswap
コマンドで swap 用にフォーマットする。
作成時に表示される UUID をメモしておく。
[shell]# mkswap /dev/sdb1 スワップ空間バージョン1を設定します、サイズ = 2104476 KiB ラベルはありません, UUID=74362c7b-7a23-4549-8c7f-577f9e795853
/dev/sdb2 に ext4 ファイルシステムを作成する。このパーティションをルート / として使用する。
[shell]# mkfs -t ext4 /dev/sdb2
/dev/sdb2 の UUID をメモしておく。
[shell]# tune2fs -l /dev/sdb2 | grep UUID Filesystem UUID: cce688dc-4d43-4ca7-8771-b2768213a2c5
マウントして rsync で複製する
/dev/sdb2 をルートにするので、/dev/sdb2 をマウントし、全データを rsync でコピーする。
/dev/sdb2 を /mnt にマウントする。
[shell]# mount /dev/sdb2 /mnt
rsync
で、全データを /mnt に複製する。
[shell]# rsync -aHx / /mnt [shell]# rsync -aHx /home /mnt [shell]# rsync -aHx /boot /mnt
|
ブートローダーのインストール
GRUB シェル起動を起動し、ブートローダーを /dev/sdb にインストールする。一連の複製作業が完了すると、/dev/sdb は /dev/sda として起動ディスクになるので、GRUB で指定するディスク番号に注意する。
GRUB シェルを起動する。
[shell]# grub
grub> device (hd0) /dev/sdb device (hd0) /dev/sdb grub> root (hd0,1) root (hd0,1) Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 26 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+26 p (hd0,1)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded Done. grub> quit quit
device (hd0) /dev/sdb
root (hd0,1)
setup (hd0)
quit
GRUB は 1 からではなく 0 からカウントする。 |
GRUB シェルでの操作中、(hd0) を /dev/sdb として扱うようにする。
|
ブートパーティションを指定する。ブートパーティションとは /boot ディレクトリの存在するパーティション。
/dev/sdb の 1 番目のパーティションを swap、2 番目を / としたため、2 番目のパーティションに /boot ディレクトリが存在する。つまり、ブートパーティションは、1 番目のディスクの 2 番目のパーティションになるため、root (hd0,1) と指定することになる。
(hd0) の MBR (マスターブートレコード) にブートローダーをインストールする。
GRUB シェルを終了する。
fstab, grub.conf の修正
複製先の fstab と grub.conf を修正する。
fstab の修正ポイント
[shell]# vi /mnt/etc/fstab
デバイス名ではなく UUID か LABEL で指定することで、ディスクの入れ替えによるトラブルを防ぐことができる。
fstab の記述例
UUID=cce688dc-4d43-4ca7-8771-b2768213a2c5 / ext4 defaults 1 1 UUID=74362c7b-7a23-4549-8c7f-577f9e795853 swap swap defaults 0 0
grub.conf の修正ポイント
[shell]# vi /mnt/boot/grub/grub.conf
- (hd0,0) はブートパーティションを指定する。ブートパーティションとは /boot ディレクトリのあるパーティションの事で、(hd0,0) だと 1 番目のディスクの 1 番目のパーティションとなり、(hd0,1) だと 1 番目のディスクの 2 番目のパーティションになる。
- splashimage, kernel, initrd でファイルを指定する部分(/grub/splash.xpm.gz などの部分)は、ブートパーティション内のファイルパスを指定することになる。/boot を別パーティションにしている構成では、/grub/splash.xpm.gz のように指定することになるが、/boot ディレクトリが / と同じパーティション内にある場合は /boot/grub/splash.xpm.gz のように /boot を付ける必要がある。
- kernel の起動オプションで、複製先ディスクでは LVM を使用しないため、rd_NO_LVM を追記する。[1]
元ディスク /boot/grub/grub.conf
splashimage=(hd0,0)/grub/splash.xpm.gz root (hd0,0) kernel /vmlinuz-2.6.32-71.el6.i686 ro \ root=/dev/mapper/vg_sl6-lv_root \ rd_LVM_LV=vg_sl6/lv_root \ rd_LVM_LV=vg_sl6/lv_swap \ rd_NO_LUKS \ rd_NO_MD \ rd_NO_DM \ LANG=ja_JP.UTF-8 \ KEYBOARDTYPE=pc \ KEYTABLE=jp106 \ crashkernel=auto rhgb quiet initrd /initramfs-2.6.32-71.el6.i686.img
複製先ディスク /mnt/boot/grub/grub.conf
splashimage=(hd0,1)/boot/grub/splash.xpm.gz root (hd0,1) kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro \ root=UUID=cce688dc-4d43-4ca7-8771-b2768213a2c5 \ rd_NO_LUKS \ rd_NO_MD \ rd_NO_DM \ rd_NO_LVM \ LANG=ja_JP.UTF-8 \ KEYBOARDTYPE=pc \ KEYTABLE=jp106 \ crashkernel=auto rhgb quiet initrd /boot/initramfs-2.6.32-71.el6.i686.img
トラブルシュート
SELinux が有効になっていると、正常に起動できない
SELinux を無効にするか、SELinux のラベルを再設定(再作成)することで正常に起動できるようになる。
複製先ディスクから起動する前に下記のいずれかの対処をするか、複製先ディスクから起動している場合は、シングルユーザーモードで起動し下記のいずれかの対処をすればよい。
対処法 1
/etc/sysconfig/selinix を編集し、SELinux を disable にする。詳しくは、『SELinuxの動作モードを変更する』を参照。
対処法 2
ルートディレクトリに 空のファイル .autorelabel を作成し再起動することで、再起動時に SELinux のラベルが再設定される。
touch /.autorelabel
対処法 3
起動時の GRUB のカーネルパラメーターで selinux=0 を追記し、SELinux を無効にする。
脚注
- ↑
man dracut