※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。
こんにちは、梶川です。
「rootディスクを拡張したい」とのお話をたまにいただくのですが、現状のIDCフロンティア クラウドサービス(以下、セルフクラウド)セルフクラウドは基盤側でのディスク拡張をご提供していないため、クラウド側で対応するのは難しい状況です。
ということで、今回は目的のディスクサイズで作成した仮想マシンに、お引っ越しすることで実現したいと思います。結局のところBackup/Restore的な手法を取るわけですが、なるべく簡単に実現する方法を書いてみたいと思います。
今回の手法
バックアップツールにdump/restoreを使いたいと思います。バックアップしたデータのやり取りはsshを利用し、ネットワーク越しに直接dump/restoreを行います。また、新規に作成する目的のディスクサイズを持った仮想マシンはInstall CDで起動します。
dump/restoreからも分かりますが、Linuxかつext2,3,4なファイルシステムしか対応できません。(結局のところファイルをネットワーク越しに持ってこられればいいだけなので、Linuxであればdump/restoreに限らずddやscp,rsyncなどでも代替できると思います。)また、新しい仮想マシンは別のIPアドレスとなり、IPアドレスの引き継ぎはできません。
今回のターゲット(移動元)
今回は単純に「[LATEST] CentOS 6.4 64-bit」のテンプレートから立ち上げた仮想マシンを、rootディスク40GBで作成した仮想マシンへ引っ越ししたいと思います。
ここでターゲットを絞っている理由は、説明上パーティション構成を確定させたいためです。IDCフロンティア セルフクラウドで用意されているテンプレートは、rootディスク15GB、1パーティションとなっています。
移動先の仮想マシンの準備
移動先仮想マシンを作成してください。この時、テンプレートをISOとすることで、rootディスクのサイズを指定して仮想マシンの作成が可能です。
選択するISOは移動元に合わせたOSを選択するのが無難です。今回移動元はCentOS6.4なので「CentOS-6.4-x86_64-bin-DVD1.iso」を選択してください。
移動先の仮想マシンの起動
ISOからの起動となりますので、コンソールでの作業が必要になります。コンソールでの操作は、ご利用ガイドの仮想マシンへのコンソール接続を参照してください。
ISOから起動すると、インストールメニューが表示されますが「Rescue installed system」を選択して起動してください。なお、CentOS5.xで起動した場合は「boot: linux rescue」とすることでRescueで起動することが出来ます。CentOS5も6も、1分程度すると「Install or upgrade an existing system」で自動的に起動してしまいますのでご注意ください。もし既に起動してしまっていた場合は、コンソール画面左上の[Ctrl-Alt-Del]で再起動しましょう。
Rescueモードでの起動に関する詳細は省略させていただきますが、途中で聞かれるネットワークの設定をDHCPで設定し、ネットワークを使えるようにしてください。また最後に既存のシステムをマウントするかどうかを聞かれますが「Skip」を選択するようにしてください。
移動先の仮想マシンの準備
まずはじめに、新しいディスクへパーティションを設定します。ここでは、移動元と同じように、1パーティションで構成します。
※ 1パーティションの例です。詳細は省きますが、通常と違う注意点はbootable flagをたてる必要が有ることです。下記の例ですと、コマンド「a」を入力している部分になります。 # fdisk /dev/sda Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x13168cf4. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First sector (2048-83886079, default 2048): 2048 Last sector, +sectors or +size{K,M,G} (2048-83886079, default 83886079): 83886079 <=ディスクサイズにより数値が異なります。1パーティションであれば、最初(2048)から最後(例だと83886079)までのすべてを指定してください。 Command (m for help): a Partition number (1-4): 1 Command (m for help): p Disk /dev/sda: 42.9 GB, 42949672960 bytes 255 heads, 63 sectors/track, 5221 cylinders, total 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x13168cf4 Device Boot Start End Blocks Id System /dev/sda1 * 2048 83886079 41942016 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. ※ もちろん複数のパーティション構成を取っても問題はありません。
パーティションが作成できたらファイルシステムを構築します。移動元がCentOS6.4ですのでext4でフォーマットします。なお、CentOS5.xであればデフォルトはext3となりますので、ext3でフォーマットしてください。もちろん元の仮想マシンと同じにすることが望ましいですが、dump/restoreのツールの場合、ext2,3,4なファイルシステムのみサポートされています。
# mkfs.ext4 /dev/sda1 mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 2621440 inodes, 10485504 blocks 524275 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=4294967296 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 35 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. ※ 複数パーティションを作成した場合は、すべてをフォーマットしてください。
フォーマットが完了したら、restoreコマンドで書き込めるようにマウントしておきます。
# mkdir /mnt/sda1 # mount /dev/sda1 /mnt/sda1
これで準備完了です。
データ転送はsshを利用するため、この転送先仮想マシン(大きいディスクを接続した仮想マシン)から移動元(小さいディスクの仮想マシン)にsshできるか、ここで確認しておいてください。セルフクラウド標準のテンプレートの場合、sshでの接続は公開鍵認証がデフォルトになっていますので、一時的にパスワード認証を許可しておくと良いと思います。(あくまでも一時的です。作業後はもとに戻してください。)
※ この例では、移動元仮想マシン名は「i-1414-39131-vm」としています。 # ssh i-1414-39131-vm <= 移動元仮想マシンを指定 The authenticity of host 'i-1414-39131-vm (10.2.1.68)' can't be established. RSA key fingerprint is 59:0c:a6:f5:a8:c3:20:ff:e1:0c:8e:ab:a9:88:8a:e1. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'i-1414-39131-vm,10.2.1.68' (RSA) to the list of known hosts. Permission denied (publickey,gssapi-keyex,gssapi-with-mic). [root@i-1414-39131-VM ~]# <= 入れることを確認。 [root@i-1414-39131-VM ~]# exit
データのお引っ越し
それでは移動元をdumpして、移動先にrestoreしてみましょう。以下の通りですが、コレは結構簡単です!
※ この例では、移動元仮想マシン名は「i-1414-39131-vm」としています。
# cd /mnt/sda1
# ssh i-1414-39131-vm "dump -z -0 -f - /dev/sda1" | restore -r -f -
※ restoreコマンドは、カレントディレクトリにファイルを展開しますので、はじめにcdで目的のディレクトリへ移動しておく必要があります。この場合は、新しい大きなディスクをマウントした/mnt/sda1となります。
※ 移動元の仮想マシンは、起動したままデータを取得することになりますので、各サービス(データベース)などは止めておく方が良いでしょう。
※ 複数のパーティションがある場合は、同様の操作を繰り返してくだださい。
sshで目的のサーバーへ入り、dumpコマンドを実行と結果をSTDOUTへ出力、それをパイプでローカルのrestoreコマンドへ渡して、ローカルのディスクへ書き込みます。実にUNIXらしい使い方ですよね!
dump/restoreが終わったら、あともう少しです。ブートローダのインストールと、ディスクが変わったことによるfstab等の修正が必要です。
※ 新しいディスクへchrootします。この時、/devをbind mountしておきます。 # mount --bind /dev /mnt/sda1/dev # chroot /mnt/sda1
※ ディスクが変わったため、ディスクのUUIDが変わっています。fstab,grub.confのディスクUUIDの記述を修正します。 # tune2fs -l /dev/sda1 | grep UUID Filesystem UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx <=今のディスクのUUIDを確認。</span> # vi /etc/fstab <= UUIDを今のディスクのUUIDへ書き換える。 # vi /boot/grub/grub.conf <= UUIDを今のディスクのUUIDへ書き換える。 ※ パーティションを複数作成した場合、構成に合わせて適宜書き換えてください。
※ ネットワークアダプターのマックアドレスが変わるため、こちらの作業も行ってください。これは、CentOS6系では必須作業となります。 # rm -rf /etc/udev/rules.d/70-persistent-net.rules
※ ブートローダー(grub)を新しいディスクへインストールします。 # grub Probing devices to guess BIOS drives. This may take a long time. GNU GRUB version 0.97 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.] grub> root (hd0,0) root (hd0,0) 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)"... 27 sectors are embedded. succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded Done. grub> exit ※ パーティションを複数作成した場合、rootの指定をご注意ください。場合によっては、grub.confの修正も必要になります。
これですべて完了です!!リブートして起動してみましょう!
# exit # umount /mnt/sda1/dev # umount /mnt/sda1 # exit
いかがでしょうか?ちゃんとブートしましたか?ブートできない場合、可能性が高いのはUUIDの指定ミスかと思います。もう一度Rescueでブートし、UUIDを確認してみましょう。
冒頭で「なるべく簡単に」と書いたのですが、dump/restoreのところはUNIXらしい使い方で簡単ですが、新しいディスクの準備やディスクが変わったことによる書き換えの発生などが、結構面倒ですね。もっといいやり方ないかな。(の代わりにddでディスクイメージを転送し、その後resize2fsで拡張とかの方が簡単かもしれませんね。でも転送に時間はかかるかもしれない。)