さくらのVPSを自宅サーバ(KVM)へ移植

数年前のVPS全盛期な頃に、さくらやGMOなどで幾つかサーバを借りて運用を始めた。それ以前の専用物理サーバレンタルに比べれば非常に安価だったので、幾つものサーバを作り易かった。しかし、最近のパブリッククラウドにその機能を移植したことによって、私のVPSたちはその役目を終わる事になった。



正直、そのまま捨ててしまってもよかったのだが、永続化されないような形で書き殴ったコードや自分に最適化した形に書き換えたLAMPツールなどが山ほどあったので、一応バックアップを取っておこうと思う。そこで今回はさくらのVPSを自宅サーバのKVMとして移植してみる。

まずはVPSのデータをバックアップする方法だが、バーチャルコンソールでddしてデバイスそのものを書き出す事もできるかもしれない。しかし、今回はパーティションを1つにまとめ、且つ最低限のサイズにシュリンクさせてしまいたいので、この方法は取らず、dumpコマンドを使って論理データを書き出す事にする。



VPSサーバ側でdump後のデータサイズは実データ容量に依存するので、不必要なファイルを削除したり、chattrを使ってdump対象外の設定を加える。私は大体5GB弱の容量まで減らす事が出来た。また、dumpの開始から終了まで論理的な一貫性が取れている方が望ましいので、更新を伴うようなプロセスは止めておく。シビアな一貫性を求めるDB等のミドルウェアは必ず停止させる。

準備ができたらdumpコマンドでデータを書き出す。書き出したデータは、scpなりで自宅サーバへ転送する。

dump -z -0f boot.dmp -h 0 /dev/hda1
dump -z -0f root.dmp -h 0 /dev/hda2
scp *.dmp homeserver:~

ここからは自宅サーバ側の作業。どういう形で仮想サーバ(KVM)を動かすかだが、今回は定常的な稼働でなく、必要になったときだけ起動、且つデータ量も5GB弱なので、ファイルで管理する事に。早速KVM用のデバイスファイルを作成し、ループバックデバイスにマッピングし、ext4のファイルシステムを作成する。

dd if=/dev/zero of=/var/lib/libvirt/images/vps.img bs=1M count=5120
chown qemu:qemu /var/lib/libvirt/images/vps.img
losetup /dev/loop0 /var/lib/libvirt/images/vps.img
parted --script /dev/loop0 'mklabel msdos'
parted --script /dev/loop0 'mkpart primary 0% 100%'
parted --script /dev/loop0 'set 1 boot on'
parted --script /dev/loop0 p
kpartx -av /dev/loop0
mkfs.ext4 /dev/mapper/loop0p1

1パーティションなので、わざわざパーティション切らずともデバイスそのまま使う事も出来るのだが、それだと後述のgrub installが失敗してしまうのでやむなく切っておく。次に作成されたファイルシステムにラベル名を付ける。UUID管理でもいいんだけど面倒なので。。。そしてマウントして書き出したデータをリストアする。

e2label /dev/mapper/loop0p1 /
mkdir /mnt/vps
mount /dev/mapper/loop0p1 /mnt/vps
cd /mnt/vps
restore -rf ~/root.dmp
cd boot
restore -rf ~/boot.dmp

リストアが終わったら、自宅環境用にこの仮想サーバの設定を書き換える。修正する際、相対パスでファイルを指定する事!絶対パスを使うと、ついつい癖でホストサーバ側のファイルを書き換えてしまう恐れが。。。※何度もやりましたw

vi boot/grub/device.map
----
(hd0)     /dev/vda
----
vi boot/grub/grub.conf
----
※さくらVPSはxenだったのでKVM向けのものに修正。
特にパーティション番号の変更や不要パーティションの削除に注意。
----
vi etc/fstab
----
※LABEL=/をマウントするように修正。
この手順だとswapすらないので、そのレコードも削除。
----

他にもIPアドレスなども直しておいた方がよい。修正が終わったら、念のためアンマウントしておく。

umount /mnt/vps
ktpartx -dv /dev/loop0
losetup -d /dev/loop0

最後にgrubのinstallとmkinitrdを行う。何らかの方法で、この構築中のvmを起動する必要があるのだが、今回はvirt-rescueという仮想サーバをレスキューモードで起動できるツールを使う。

yum install -y libguestfs-tools
virt-rescue -a /var/lib/libvirt/images/vps.img

これでrescue kernelのプロンプトに入れる。何故かデバイス名がsdaになってしまうので無理矢理vdaに直した。他によい方法が見つからず。。。他者の作業手順を見ていると、vdaで認識される方が普通ぽいんだけどね。その後、マウントしてchroot、grub-installとmkinitrdを行う。

mv /dev/sda /dev/vda
mv /dev/sda1 /dev/vda1
mount /dev/vda /sysroot
mount --bind /dev /sysroot/dev
mount --bind /dev/pts /sysroot/dev/pts
mount --bind /proc /sysroot/proc
mount --bind /sys /sysroot/sys
chroot /sysroot
grub-install /dev/vda
mv initrd-2.6.xxxx.img _initrd-2.6.xxxx.img
mkinitrd initrd-2.6.xxxx.img 2.6.xxxx

これで準備はほぼ出来たので、KVM用の定義XMLを作成して起動すれば良い。

vi ~/vps.xml
virsh define ~/vps.xml
virsh start --console vps

以上、意外とかったるかったけど、これでVPSたちのバックアップをファイル化できた。めでたしめでたし。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)