web-dev-qa-db-ja.com

すべてのCygwinアプリケーションの起動が本当に遅い

Cygwinアプリケーションの起動には、Windows 8.1 x64では1分以上かかります。 minttyをショートカットから起動するか、cygwin.batまたはls.exeまたはbash.exeをbinフォルダーから起動するかは関係ありません。それらのそれぞれは遅くなります。

Bashまたはminttyが開始された後、それらはかなり迅速に動作しています。

$ time for i in {1..10} ; do bash -c "echo Hello" ; done
Hello
...
Hello

real    0m1.273s
user    0m0.060s
sys     0m1.181s

私が試した手順:

  • CygwinとCygwin64の両方を数回再インストールして試してみました(バージョン2.864)
  • 管理者として開始しました
  • Windows 7互換モードでそれらを実行しようとしました
  • LANの「設定を自動的に検出する」を無効にしました この返信のように
  • ホストに127.0.0.1 localhost cygdrive wpadを追加しました 同じ返信のように
  • ウイルス対策を無効状態に設定する
  • Bash補完がインストールされていないことを確認しました(/etc/bash_completion.dフォルダーなし)
  • デバイスマネージャーですべてのリムーバブルドライブを無効にしました(システムSSDとデータHDDのみが残っています)
  • 空のetc/profile.dフォルダで実行しようとしました
  • 空のetc/bash.bashrcファイルで実行しようとしました

他にどのように根本原因を見つけることができますか?

追伸-Windows 8.1 64ビットを搭載したラップトップとデスクトップの2つの異なるシステムがあります。この問題は、両方で100%再現可能です。

また、ログインしてから数秒後にBashを起動すると、すぐに起動します。

36
Anton Purin

最終的には、この問題の原因を見つけましたが、その理由はまだわかりません。 Cygwinは、同じ環境の他の人々に非常にうまく機能します。

原因:すべてのCygwinアプリケーションの起動時に、etc/nsswitch.confファイルに記述されているとおり、資格情報を取得しようとします。何らかの理由で、アカウントがLDAP経由で複数のActive Directoryドメインコントローラーと通信するため、アカウントに時間がかかります。

解決策1:現在のユーザーとグループをetc/passwdおよびetc/groupファイルに保存し、Cygwinを設定してActive Directoryの前にそれらをチェックできます。

  1. mintty.exeを起動し、開くまで待ちます
  2. mkpasswd -cを実行し、その出力をetc/passwdファイルに保存します(作成する必要があります。出力は1行である必要があります)
  3. mkgroup -cを実行し、その出力をetc/groupファイルに保存します(作成する必要があります。出力は1行である必要があります)
  4. etc/nsswitch.confを開いて書き込みます

nsswitch.confの内容:

passwd: files # db
group:  files # db

これで、Cygwinがすぐに起動するはずです。

解決策2:Cygwinに付属の特別な CygServer アプリケーションがあり、NTサービスまたは単純なプロセス(usr/sbin/cygserver.exeを実行するだけ)として開始できます。資格情報をキャッシュし、次のすべてのCygwinプロセスに伝播しますcygserverの実行中

これをスタートアップに追加するか、Cygwinセッションの前に起動してください。cygserverの起動には時間がかかりますが、次のすべてのCygwinプロセスはすぐに開始されます。

それはあなたのケースですか?私の調査手順を共有したいので、あなたのケースが私のものと同じかどうかを確認できます。

  • 特定のプロセスからのトラフィックを表示できるため、 MS Network Monitor をインストールします。管理者として実行します。
  • 新しいキャプチャタブを作成し、開始をクリックします(フィルタなどを追加する必要はありません)。
  • minttyを起動すると、netmonに接続が表示されます。 netmon-screenshot
  • 左側のツリービューにmintty接続のリストが表示され、右側にTCPとLDAPフレームがあります。これらの接続を選択すると、接続が表示されます。
  • さらに、これらのリモートマシンの名前をIPアドレスで取得できます。コマンドラインでnbtstat -a 8.8.8.8を実行します(8.8.8.8をnetmonのIPアドレスの1つに置き換えます)。

さらに深く:etc/nsswitch.conf ファイルを使ってローカルの資格情報またはキャッシュされた資格情報を取得して、cygserverなしで高速に実行できるようにします。しかし、まだ運はありません。

69
Anton Purin

これが私のために働いたものです。

  1. Cygwinターミナルを起動して、次の2つの文字列を実行します。

    mkpasswd -c > /etc/passwd
    mkgroup -c > /etc/group
    
  2. 「/etc/nsswitch.conf」ファイルを編集して、次の2行を含めます。

    passwd:   files # db
    group:    files # db
    
  3. Cygwinを再起動します。

Cygwinはすぐに開きます。

23
Whifix

大きなADディレクトリを持つネットワーク上にいる場合、mkpasswdには多くの時間がかかります(私の場合は数日)。使用を検討してください:

mkpasswd -c -l > /etc/passwd
mkgroup -c -l > /etc/group

 -l,--local [machine]    Print local user accounts of \"machine\",
                         from local machine if no machine specified.
                         Automatically adding machine prefix for local
                         machine depends on settings in /etc/nsswitch.conf.
7
marius

「C:\ cygwin64\bin」をパスに追加するとうまくいきました。

2
Aaron Carlton