UIDやGIDを別の値に変えたい状況は意外と多くあります。複数サーバー間でUID番号を統一したい、グループ体制を見直してメンバーを再配置したい、NFS共有で所有権がずれている——こうした場面では usermod コマンドを root 権限で実行すれば設定ファイル側の変更は一瞬で終わります。ただし既存ファイルの所有権は自動では追随しない点が最大の落とし穴です。その点を踏まえた手順を順番に解説します。
変更前に済ませる確認事項
対象ユーザーがログイン中の状態で UID を変更すると、セッション中の権限判定が混乱することがあります。まず who または w で確認してください。
who
# または
w
実行結果に対象ユーザーが表示されている場合は、作業前にログアウトさせるか、メンテナンス時間帯に実施します。作業中にアカウントをロックしておくとより安全です。
# アカウントを一時ロック
sudo usermod -L username
# 作業完了後にロック解除
sudo usermod -U username
UIDを変更する
usermod -u で新しい UID を指定します。変更前後に id コマンドで確認するクセをつけておくと、二度手間がなくなります。
# 現在の状態を確認
id tomohiro
# uid=502(tomohiro) gid=503(tomohiro) groups=503(tomohiro)
# UIDを5000に変更(root権限が必要)
sudo usermod -u 5000 tomohiro
# 変更後を確認
id tomohiro
# uid=5000(tomohiro) gid=503(tomohiro) groups=503(tomohiro)
UID 0〜99 はシステム予約領域、100〜999 はシステムアカウント用として多くのディストリビューションが使用しています。一般ユーザーへの割り当ては 1000 以上が通例です。複数サーバー間で番号を統一する場合は、5000 台や 10000 台の範囲を組織内ルールで決めておくと管理しやすくなります。
プライマリグループ(GID)を変更する
usermod -g でプライマリグループを変更します。グループ名と GID 番号のどちらでも指定できますが、グループが存在しない場合はエラーになるため、事前に getent group で確認しておきます。
# グループの存在と番号を確認
getent group webteam
# webteam:x:1001:
# プライマリグループを webteam に変更
sudo usermod -g webteam tomohiro
# 確認
id tomohiro
# uid=5000(tomohiro) gid=1001(webteam) groups=1001(webteam)
グループがまだ存在しない場合は groupadd で先に作成してから実行してください。
補助グループ(サブグループ)を変更する
補助グループの変更には -G(大文字)オプションを使います。-G 単体で指定するとそれまでの補助グループがすべて上書きされます。既存のグループを残したまま追加したい場合は -aG を使います。
# sudo と docker グループを補助グループに「追加」(-a で既存を保持)
sudo usermod -aG sudo,docker tomohiro
# 補助グループを「完全に置き換え」(既存グループはすべて消える)
sudo usermod -G sudo,docker tomohiro
# 確認
id tomohiro
# uid=5000(tomohiro) gid=1001(webteam) groups=1001(webteam),27(sudo),999(docker)
ある運用現場では、-a を付け忘れたまま -G を実行したことで、ユーザーが所属していた sudo グループが削除され、管理者権限を失うトラブルが発生しています。変更前に id username で補助グループを手元にメモしておくと、復旧が楽になります。
ファイル所有権を新しいUID・GIDに合わせる
UID や GID を変更しても、既存ファイルの所有者情報(inode 内の数値)は古い UID のまま残ります。ls -ln で確認すると、所有者名ではなく番号で表示されている状態になります。
# UID変更後に確認すると旧番号のまま
ls -ln /home/tomohiro/
# -rw-r--r-- 1 502 503 ... ← ユーザー名ではなく旧UIDの番号が表示される
find と chown / chgrp を組み合わせて一括更新します。
# ホームディレクトリ以下のファイル所有者を旧UID(502)から新UID(5000)へ変更
sudo find /home/tomohiro -user 502 -exec chown -h 5000 {} \;
# グループ側も同様に(旧GID=503、新GID=1001の場合)
sudo find /home/tomohiro -group 503 -exec chgrp -h 1001 {} \;
-h オプションはシンボリックリンク自体の所有者も変更するためのものです。省略するとシンボリックリンクのリンク先が対象になります。サーバー全体を対象にする場合は -xdev を付けて NFS マウントや procfs を巻き込まないようにします。
# サーバー全体を対象にする場合(マウントポイントをまたがない)
# ※ファイル数が多い本番環境では処理に時間がかかるため深夜帯に実施
sudo find / -xdev -uid 502 -exec chown 5000 {} \;
変更後の最終確認
以下のコマンドで各変更が正しく反映されているかを確認します。
# UID・GID・補助グループの確認
id tomohiro
# /etc/passwd の該当行を確認
grep tomohiro /etc/passwd
# ホームディレクトリの所有権確認(数値ではなくユーザー名で表示されること)
ls -la /home/tomohiro/
/etc/passwd の該当行で UID と GID が新しい値になっていること、ホームディレクトリの所有者表示が番号ではなくユーザー名に戻っていることを確認できれば作業完了です。変更をロールバックしたい場合は同じ手順で元の値に戻すだけですが、変更後にファイルを追記・作成している場合は再度 find と chown が必要になる点に注意してください。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
