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 を使ったことがなかったので、このことに気づきませんでした。普段からよく使ってるコマンドでも、ちゃんと調べないといけないですね。