rsyncコマンドを使用して/homeディレクトリをデータ移行してみた

# はじめに
rsyncコマンドを実務で使用することになったため、
rsyncコマンドを使用して/homeディレクトリをデータ移行してみました。

※この記事は移行元(旧サーバ)　移行先(新サーバ)と記載しております。

### rsyncとcpの違い
rsyncは、旧サーバから新サーバへデータを移行する際によく使用されるコマンドです。

cp コマンドを使用する場合、コピーするフォルダ名やファイル名を明示的に指定する必要があり、すべてのデータがコピーされます。一方、rsync は変更があった部分のみをコピーするため、**大量のデータを扱う際には rsync の方が効率的です。**

### 前提条件
AWS EC2 2台を構築済み

### 注意点：OSが異なる場合のrsyncによるデータ移行
旧サーバと新サーバでOSが異なる場合、rsyncを使用してミドルウェアの設定ファイルや/etcフォルダを移行元と完全に一致させると、必要な設定ファイルが新サーバから削除されてしまい、サービスが正常に起動しない可能性があります。上記の場合は完全一致のrsyncはしないようにする。

## /homeディレクトリを移行

### 事前準備
#### 新サーバーで作業　ユーザ登録
ユーザー登録については、/home ディレクトリを移行する前に、旧サーバと同じユーザーを新サーバにも登録します。旧サーバにあるユーザを新サーバに登録する。

以下は例です。
```
$ sudo su -
# useradd test1
# useradd test2
```
#### 新サーバーで作業　事前にアーカイブを取得
デフォルトユーザ(ec2-userとssm-userのフォルダ)が消えない様にアーカイブを取得する
**データ同期する際は事前にアーカイブを取得することで消えてしまったファイルを復元可能です。**
tarコマンドは絶対パスについて自動的に削除されて相対パスとしてアーカイブしてくれます。
念のため、-Cオプションを付ける事でより安全になります。
絶対パスでアーカイブされた場合は、tarコマンドを解凍後、実フォルダ/homeが上書きされてしまいます。
```
$ sudo su -
# tar cvzf  /root/home_20250208.tar.gz -C / home
```
以下の記事を参考にさせていただきました。

https://zenn.dev/mqn22/articles/14f200994335c7

アーカイブできていることを確認する。
```
[root@ip-10-0-15-148 ~]# tar tvf home_20250208.tar.gz
drwxr-xr-x root/root         0 2025-02-24 14:14 home/
drwx------ ec2-user/ec2-user 0 2025-02-24 13:52 home/ec2-user/
-rw-r--r-- ec2-user/ec2-user 18 2023-01-28 22:29 home/ec2-user/.bash_logout
-rw-r--r-- ec2-user/ec2-user 141 2023-01-28 22:29 home/ec2-user/.bash_profile
-rw-r--r-- ec2-user/ec2-user 492 2023-01-28 22:29 home/ec2-user/.bashrc
drwx------ ec2-user/ec2-user   0 2025-02-24 13:52 home/ec2-user/.ssh/
-rw------- ec2-user/ec2-user 104 2025-02-24 13:52 home/ec2-user/.ssh/authorized_keys
drwx------ test1/test1         0 2025-02-24 14:14 home/test1/
-rw-r--r-- test1/test1        18 2023-01-28 22:29 home/test1/.bash_logout
-rw-r--r-- test1/test1       141 2023-01-28 22:29 home/test1/.bash_profile
-rw-r--r-- test1/test1       492 2023-01-28 22:29 home/test1/.bashrc
drwx------ test2/test2         0 2025-02-24 14:14 home/test2/
-rw-r--r-- test2/test2        18 2023-01-28 22:29 home/test2/.bash_logout
-rw-r--r-- test2/test2       141 2023-01-28 22:29 home/test2/.bash_profile
-rw-r--r-- test2/test2       492 2023-01-28 22:29 home/test2/.bashrc
[root@ip-10-0-15-148 ~]#
```


※おまけ　nginxでtarコマンドを実行する場合
```
# tar cvzf /root/nginx.tar.gz -C /etc nginx
```

#### 新サーバーで作業　rootユーザでログイン設定
rsyncコマンドについて新サーバのrootユーザにSSH接続して実行します。
一般ユーザの場合は権限不足でrsyncが途中で失敗したことがあります。

この記事ではrootユーザはec2-userと同じ秘密鍵でSSH接続する設定をします。
ec2-user の秘密鍵を使用できるようにするため、root のホームディレクトリに ec2-user の公開鍵を登録します。
```
# cat ~ec2-user/.ssh/authorized_keys >> authorized_keys
```
rootユーザで接続許可を設定する
```
# cat sshd_config | grep -v ^$ | grep -i root
#PermitRootLogin prohibit-password
PermitRootLogin yes ←ここの設定をする
# the setting of "PermitRootLogin without-password".
#ChrootDirectory none
```
#### 旧サーバーで作業　SSH接続確認
旧サーバにてrootに昇格後、
/rootフォルダに移動して.sshフォルダに新サーバの秘密鍵を格納します。
```
rootに昇格する
$ sudo su -
# ssh -i 秘密鍵.pem" root@<新サーバのプライベートIPアドレス>
```
#### 新サーバで作業 authorized_keysを修正
SSH接続したら「Please login as the user "ec2-user" rather than the user "root".」が出力して
失敗します。
新サーバのauthorized_keysを修正する必要があります。
以下の記事が参考になりました。
https://qiita.com/xusaku_/items/9f80f7b27c94ab237b46
### 移行元(旧サーバ)の/homeを移行先(新サーバ)にrsyncする
rsyncコマンドは以下になります。
https://atmarkit.itmedia.co.jp/ait/articles/1702/02/news031.html
```
rsyncコマンド オプション 移行元　移行先
```
**旧サーバ(移行元)のサーバにSSH接続する**
```
$ ssh -i 秘密鍵.pem"　ec2-user@旧サーバのIPアドレス
```
旧サーバから新サーバに/homeディレクトリを移行
**注意 必ず移行先(新サーバ)のIPアドレスであることを確認する**

```
# rsync -avz --delete -e "ssh -i /root/.ssh/新サーバの秘密鍵.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
```
# まとめ
rsync コマンドを使用する際、移行元と移行先を誤ると重大な事故につながる可能性があります。
そのため、まずは移行元のサーバーにSSH接続し、rsync コマンドの移行先が正しく設定されていることを確認してください。

また、すべての設定ファイルをそのまま移行すればよいわけではありません。
必要なファイルを適宜選別しながら移行することが重要です。

さらに、rsync コマンドを実行する前に、誤って重要なファイルを消してしまうリスクを考慮し、
復元用の tar アーカイブを取得しておくことをおすすめします。