今日、LAN ケーブルを抜いた直後に msys2 の cat コマンドを実行したらハングする事に気付いた。
これはまずい。なんかに感染してる。cat コマンドと言いながらどこかインターネットにアクセスしてるんや!
と思って色々調べた。が実は cat コマンド君悪くなかった。すいませんすいません。
一部の記事では /cygdrive/
のアクセスがあるから hosts に cygdrive を足せば良いといった物もあったが、デマっぽかった。以下、調査した最終結果を書いていく。Cygwin や msys2 のコマンドは所有者や権限情報を取得する為に LDAP 経由でアクティブディレクトリに問い合わせを行う。例えば cat foo.txt
と実行した場合であってもファイルの権限を UNIX エミュレーションする為に必要となる。で、このアクティブディレクトリへの問い合わせが LAN が抜けてるとタイムアウト待ちになって遅い。とにかく遅い。
解決策はここに書いてあった。
windows - Startup is really slow for all cygwin applications - Stack Overflow
Eventually I found what causes this issue, but I'm still not sure why. Cygwin works for other people...
http://stackoverflow.com/questions/28410852/startup-is-really-slow-for-all-cygwin-applications
以下はその PC が自分専用である事が前提となる。なぜかというと Cygwin や msys2 上で /etc/passwd
や /etc/group
を生成して SID をローカルにキャッシュさせるため。なので PC に新しいユーザが追加され、その人が作ったファイルをローカルに持ってきた際に本来ならばこれらのファイルを再生成する必要がある。そういった問題点を理解した上で以下を読んで頂きたい。
まず mintty 等のターミナルを開き、以下を実行する。
$ mkpasswd -c -l > /etc/passwd
$ mkgroup -c -l > /etc/group
これにより SID に対する名前やグループ情報が書きだされる。次にネットワークの問い合わせ方法を変更する為に /etc/nsswitch.conf
を修正する。
変更前
# Begin /etc/nsswitch.conf
passwd: files db
group: files db
db_enum: cache builtin
db_home: cygwin desc
db_shell: cygwin desc
db_gecos: cygwin desc
# End /etc/nsswitch.conf
変更後
# Begin /etc/nsswitch.conf
passwd: files # db
group: files # db
db_enum: cache builtin
db_home: cygwin desc
db_shell: cygwin desc
db_gecos: cygwin desc
# End /etc/nsswitch.conf
db をコメントアウトした。これでファイルの権限や所有者を検査するのにアクティブディレクトリに問い合わせしなくなる。よって LAN が抜けても遅くならない。前述の通り、新しいユーザが作ったファイルをローカルにコピーする様な事があるならば /etc/passwd
や /etc/group
を再生成する必要がある。その必要がないのであれば、この設定を行う事で全てのコマンドが少しだけ速くなる。