はじめに
実務でrsyncをよく使うことが増えたためハンズオンしようと思いました。
rsyncとcpの違い
rsyncは、旧サーバから新サーバへデータを移行する際によく使用されるコマンドです。例えば、/home ディレクトリを新しいサーバに移行する際に活用されます。
cp コマンドを使用する場合、コピーするフォルダ名やファイル名を明示的に指定する必要があり、すべてのデータがコピーされます。一方、rsync は変更があった部分のみをコピーするため、大量のデータを扱う際には rsync の方が効率的です。
前提条件
AWS EC2 2台を構築済み
注意点:OSが異なる場合のrsyncによるデータ移行
旧サーバと新サーバでOSが異なる場合、rsync を使用してミドルウェアの設定ファイルや/etcフォルダを移行元と完全に一致させると、必要な設定ファイルが新サーバから削除されてしまい、サービスが正常に起動しない可能性があります。
/homeディレクトリを移行
新サーバーで作業
ユーザー登録については、/home ディレクトリを移行する前に、旧サーバと同じユーザーを新サーバにも登録します。
旧サーバにあるユーザを新サーバに登録する。
# useradd test1
# useradd test2
デフォルトユーザ(ec2-userのフォルダ)が消えない様にアーカイブを取得する。
データ同期する際は事前にアーカイブとることで消えてしまったファイルを復元可能です。
$ sudo su -
# tar cvzf /root/home_20250208.tar.gz /home
今回は、root ユーザーでも ec2-user の秘密鍵を使用できるようにするため、root のホームディレクトリに ec2-user の公開鍵を登録します。
# cat ~ec2-user/.ssh/authorized_keys >> authorized_keys
旧サーバーで作業
※旧サーバにSSH接続されていることを確認する。
rsync前に旧サーバから新サーバにSSH接続できることを確認する
# ssh -i 秘密鍵.pem" root@<新サーバのプライベートIPアドレス>
※rootユーザにSSH接続する場合は新サーバのauthorized_keysを修正する必要があります。
またsshd_configファイルにてrootユーザの接続を許可する必要があります。
以下の記事が参考になりました。
https://qiita.com/xusaku_/items/9f80f7b27c94ab237b46
旧サーバ(移行元)のサーバにSSH接続する
# ssh -i 秘密鍵.pem" ec2-user@旧サーバのIPアドレス
旧サーバから新サーバに/homeディレクトリを移行
※新サーバのIPアドレスであることを確認する
# rsync -avz --delete -e "ssh -i 秘密鍵.pem" /home/ root@<新サーバのプライベートIPアドレス>:/home/
※--delete オプションは完全一致させるために移行元にないフォルダや設定ファイルは削除されるため、ミドルウェアの設定ファイルの移行の場合は--deleteをつけないことをお勧めします。
注意 rsync で /home ディレクトリを指定する際、意図しない場所にフォルダが作成されるのを防ぐために、必ず /home/ のように末尾にスラッシュ / を付けて記載してください。
新サーバーで作業
アーカイブファイルを復元しました。
cd /root
# tar xvzf /root/home_20250208.tar.gz
cd /root/homeに展開されました。
移行前のec2-userの設定ファイルを完全に/home/ec2-userに同期させる。
# rsync -avz --delete /root/home/ec2-user/ /home/ec2-user/
sending incremental file list
ec2-user/
ec2-user/.bash_history
ec2-user/.bash_logout
ec2-user/.bash_profile
ec2-user/.bashrc
ec2-user/.ssh/
ec2-user/.ssh/authorized_keys
sent 938 bytes received 127 bytes 2,130.00 bytes/sec
total size is 784 speedup is 0.74
再度 test3ユーザを旧サーバに登録して新サーバにホームディレクトリをrsyncした
※ 検証用のため、本記事内に記載されている IP アドレスは一時的なものです。検証完了後、対象のサーバは削除予定です。
旧サーバ「10.0.9.100」から新規サーバのIPアドレス「10.0.3.128」に同期
事前に旧サーバー(移行元)にSSH接続する
旧サーバー(移行元)「10.0.9.100」にSSH接続していることを確認する。
[root@ip-10-0-9-100 .ssh]#rsync -avz --delete -e "ssh -i 秘密鍵.pem" /home/ root@10.0.3.128:/home/
sending incremental file list
./
※旧サーバにec2-userが存在するため、新サーバからec2-userが削除されています。
deleting ec2-user/.bash_history
ec2-user/
ec2-user/.bash_logout
ec2-user/.bash_profile
ec2-user/.bashrc
ec2-user/.ssh/
ec2-user/.ssh/authorized_keys
ec2-user/.ssh/known_hosts
ec2-user/.ssh/test-秘密鍵.pem
※先ほど旧サーバに登録したtest3ユーザのホームディレクトリが新サーバにコピーされています。
test3/
test3/.bash_logout
test3/.bash_profile
test3/.bashrc
sent 2,095 bytes received 258 bytes 4,706.00 bytes/sec
total size is 2,421 speedup is 1.03
新規サーバではtest3ユーザが作成されています。
[ec2-user@ip-10-0-3-128 home]$ pwd
/home
drwx------. 2 1001 1001 62 Feb 7 23:36 test1
drwx------. 2 1002 1002 62 Feb 7 23:36 test2
drwx------. 3 ec2-user ec2-user 74 Feb 7 23:47 ec2-user
drwx------. 2 1003 1003 62 Feb 8 01:11 test3 ※test3ユーザ
※ユーザのホームディレクトリをコピーしただけではユーザ情報は移行されません。
その後、test3ユーザをuseraddでホームディレクリを作成なしの設定で登録する必要があります。
まとめ
rsync コマンドを使用する際、移行元と移行先を誤ると重大な事故につながる可能性があります。
そのため、まずは移行元のサーバーにSSH接続し、rsync コマンドの移行先が正しく設定されていることを確認してください。
また、すべての設定ファイルをそのまま移行すればよいわけではありません。
必要なファイルを適宜選別しながら移行することが重要です。
さらに、rsync コマンドを実行する前に、誤って重要なファイルを消してしまうリスクを考慮し、
復元用の tar アーカイブを取得しておくことをおすすめします。