LinuxでUID、GIDを変更する

Linuxのユーザとグループだが、設計および指示段階の考慮不足から、各サーバのユーザID(UID)とグループID(GID)がぐっちゃぐちゃに。。そこで、UID と GID を変更することにした(ユーザ名、グループ名は変えない)。NFSでマウントする時とか便利だし。
で、作業者みたいな素晴らしいリソースはないので、自分でやることに。むろん“usermod”、“groupmod”コマンドを用いる。例えば、グループ grpabc の GID を 2000 に変更するのであれば、次のコマンドを実行する。

# groupmod -g 2000 grpabc

これで万事OKだと思っていたのが甘すぎた。まずは試しに1ユーザ“usermod -u ”してみて、UID が変わっていることを確認した。不幸だったのは、ホームディレクトリ配下の所有者を確認してしまったこと。残念ながら、既に作られているファイルの UID、GID は変更してくれないらしい。usermod の場合は、ユーザのホームディレクトリ以下のみ、UID を自動で変更する。「なんて中途半端な!」と思ったけど、ホームディレクトリ以下が変わらなかったら、ログインできなくなったりするからか。ちゃんと man を読んでおくんだった。
さぁ、既存のファイルたちの UID と GID を、片っ端から変更していかないとだ。ここからは、GID を頑張って変更したメモを。


まずは、find で、GID に対応するグループが存在しないオブジェクトを検索する。

# find / -nogroup

もぅわんさか出てくる。それもそうさ、10グループくらい変更したから。仕方ないから、簡単な関数を作成した。

####
# 指定したグループIDのオブジェクトを検索し、所有グループを変更する。
#   _gid : 変更されずに残ったグループID
#   _grp : 変更したいグループ名
find_gid_and_chown_group() {
    _gid=${1}
    _grp=${2}

    _buf_ifs=${IFS}
    IFS=

    find / -gid ${_gid} -print | \
    while read _path
    do
        if [ -d ${_path} -o -f ${_path} ]; then
            # ディレクトリ、ファイルの所有グループを変更する
            chown .${_grp} ${_path}
        elif [ -h ${_path} ]; then
            # シンボリックリンク自体の所有グループを変更する
            chown -h .${_grp} ${_path}
        else
            echo "${_path}"
        fi
    done

    IFS=${_buf_ifs}
}


で、root ユーザになってコピペで上記の関数を実行し、次のように GID の変更を行った。これで、GID が 1000 で残ってしまった(対応するグループがなくなってしまった)オブジェクトの所有グループを grpabc に変更できる。

# find_gid_and_chown_group 1000 grpabc

残骸がないかを確認。

# find / -nogroup -a -gid 1000

ふぅ、あせった。