usermod -d -m でホームディレクトリを中身ごと変更する

  • Linux
  • CLI

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

既存ユーザーのホームディレクトリを変えるときは、これで中身ごと移せる。

# usermod -d /home/hoge -m hoge

オプションの意味

  • -d /home/hoge(--home): 新しいホームディレクトリのパス。/etc/passwd のホームディレクトリの欄がこの値に書き換わる
  • -m(--move-home): 旧ホームディレクトリの中身を新しいパスへ移動する。-d と一緒に使うオプション
  • 最後の hoge: 対象のユーザー名

-m は -d とセットで意味を持つオプションで、単独では使わない。

-m を付けないとどうなるか

-m なしの usermod -d /home/hoge hoge は、/etc/passwd のパスを書き換えるだけだった。

  • 新しいディレクトリは作らない
  • 旧ホームの中身は移動しない
  • 所有者やパーミッションも触らない

新しいパスのディレクトリがない状態でこれをやると、設定上のホームが存在しない場所を指すことになる。ログインするとホームがないという警告が出て / に落とされるし、.bashrc も .ssh/authorized_keys も旧ホームに置き去りなので、シェルの設定も SSH の鍵認証も効かなくなる。

-m を付けたときの動き

-m を付けると、旧ホームの中身が新しいパスへ移る。同じファイルシステム内ならリネームで済み、別のファイルシステムをまたぐ場合はコピーしてから元を消す動きになるらしい。

移動先のディレクトリがすでに存在しているとエラーになるので、移動先はまだない状態で実行する。

flowchart TD
    A[ホームディレクトリを変更したい] --> B{旧ホームの中身を<br/>新しい場所へ移す?}
    B -- 移す --> C[usermod -d 新パス -m ユーザー名]
    B -- 移さない --> D[新しいディレクトリを用意して<br/>usermod -d 新パス ユーザー名]
    D --> E[chown -R で所有者を修正]

中身を移さず、自分で用意したディレクトリに切り替えるだけなら -m なしでいい。その場合は所有者を自分で直しておく。

# chown -R hoge:hoge /home/hoge

実行前に確認すること

対象ユーザーがログイン中だったりプロセスが動いていたりすると、usermod は user hoge is currently used by process ... のようなエラーで止まる。先にログアウトさせるか、プロセスを止めておく。

# pkill -u hoge

実行後の確認

変更できたかは getent passwd hoge で見られる。6番目のフィールドがホームディレクトリ。

$ getent passwd hoge
hoge:x:1001:1001::/home/hoge:/bin/bash

あわせて新しいホームの中身と所有者も確認しておく。

$ ls -la /home/hoge

SELinux 環境での注意

SELinux が有効な環境(RHEL / CentOS 系)で /home 以外の標準外のパスにした場合は、SELinux のコンテキストが合わず SSH の鍵認証が通らないことがある。semanage fcontext でコンテキストを設定し、restorecon -R で反映させる必要がある。/home 配下のまま名前を変えるだけなら基本的に問題にならないはずだが、この組み合わせは実機未確認。