先日、さくらのVPSがリニューアルしましたが、新プランの恩恵を受けるためには新たにサーバを契約し直す必要があるようです。正確には、旧プランのままでもメモリは増えますが、HDD容量はそのままとなります。
「移行作業めんどくさいし、そのままでも良いかなぁ」なんて思いつつ、しかしどうしてやっぱり、畳と妻とサーバは新しい方がテンション上がるに決まっている! というわけで、この機会に新プランに移行することにしました。
今回、サーバを移行するに当たって、rsyncを使用することにしました。サーバはdebian6(squeeze)です。「さくらのVPS」の512プランから新1Gプランに移行しました。
移行作業
移行作業の手順は以下のような感じです。
- 新・旧両サーバにrsyncをインストールする
- 旧サーバで動いているapacheやpostfixなどのサービスを停止
- rsyncで旧サーバからデータをまるっとコピー
- 新サーバでupdate-grub
- 新サーバ再起動
- DNSを新サーバに向ける
また、コード中、新サーバでの作業は「user@new」、旧サーバでの作業は「user@old」としています。
rsyncをインストール
まず最初に、新・旧両サーバにrsyncをインストールします。ただ単にインストールするだけなので、簡単です。
# apt-get install rsync
旧サーバのサービスを停止する
データのコピーを始める前に、旧サーバで動いているサービスを停止します。apacheとかmysqlとか。うちの場合は、nginx、postfix、mysql、php-fpmと言ったところを停止しました。sshは停止すると接続出来なくなるので、そのままに。
user@old # /etc/init.d/nginx stop
rsyncを実行する
旧サーバでrsyncを実行して、新サーバにファイルをコピーします。コード中の「xxx.xxx.xxx.xxx」は新サーバのIPアドレスに置き換えて下さい。
user@old # rsync -rtlzvogpHAX --delete --exclude /dev/ --exclude /etc/network/ --exclude networks --exclude hosts --exclude /proc/ --exclude /boot/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude ssh_host_* --exclude fstab --block-size=4096 -e ssh / xxx.xxx.xxx.xxx:/
GRUBをアップデート
コピーが完了したら新サーバでupdate-grubを実行します。
user@new # update-grub
新サーバを再起動する
特に説明無し。
user@new # shutdown -r now
DNSのAレコードを新サーバに向ける
これも特に説明無し。
この移行作業によって変わるのは、IPアドレスくらいのものだと思います。アカウントや設定などはほとんど全て、新しいサーバに引き継がれます。
落ち穂拾い
iptablesについて
/etc/network を除外しているので、/etc/network/if-pre-up.d/下にスクリプトを置いてiptablesの自動起動設定を行っている場合は、設定し直す必要があります。設定方法は以下を参照のこと。
iptables-persistent なるパッケージを導入すると、スクリプトを書かなくてもよくなるみたいですぞ。
update-grubについて
ぶっちゃけよくは分かっていないのですが、再起動前に update-grub を実行しなかった場合、「/bin/sh: c: not found」などなどのエラーが出てきて、うまく起動出来ませんでした。
ですが、rsyncを実行する際、オプションに「–exclude /boot/」を追加してbootディレクトリをコピーの対象外にした場合は update-grub を実行しなくてもそのまま起動しました。
以下は、bootディレクトリをコピーの対象外にした場合のコマンドです。
user@old # rsync -rtlzvogpHAX --delete --exclude /dev/ --exclude /etc/network/ --exclude networks --exclude hosts --exclude /boot/ --exclude /proc/ --exclude /boot/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude ssh_host_* --exclude fstab --block-size=4096 -e ssh / xxx.xxx.xxx.xxx:/
「たぶんそういうことなんだろうなぁ」と思うところはあるのですが、うまく説明出来る気がしないので、説明を省略するのであります。