rsync で UID/GID を保ったまま転送する
Posted on
rsync の挙動を誤解しててミスしそうになったので、忘れないようにメモしておきます。
rsync で UID/GID を保ったまま転送したいときは -a オプションを付ければいいと思っていたのですが、これではうまく行きません。オプションの認識が間違っていました。
-a オプションには -o (--owner) と -g (--group) が含まれていますが、この 2 つのオプションはユーザ名とグループ名で同期します。
例えば、こういうことです。コピー元の hoge ユーザは UID 500、コピー先の hoge ユーザは UID 1000 だとします。このとき hoge ユーザのファイルを -a オプション付きで転送すると、コピー先ではそのファイルの UID が 1000 に変わります。要するに、コピー元とコピー先に同じユーザ名(グループ名)が存在すれば rsync が良しなにマッピングしなおしてくれているのです。
ほとんどの場合はこの挙動で問題ないと思いますが、UID/GID を保ったまま転送したいときは --numeric-ids オプションを付ける必要があります。 man ページに "Don't map uid/gid values by user/group name" とあるように名前のマッピングを行いません。
まとめ
以下の条件に当てはまる場合は、意図した転送ができているか注意が必要です。
- root ユーザで rsync を実行している
- -a (--archive) オプションを付けている
- コピー元とコピー先で UID/GID が異なる
- UID/GID を保ったまま転送したい
これまで一般ユーザでしか rsync を使ったことがなかったので、このことに気づきませんでした。普段からよく使ってるコマンドでも、ちゃんと調べないといけないですね。