在Windows 8.1 x64上启动任何Cygwin应用程序需要超过一分钟。无论是我从快捷方式开始mintty
还是从bin文件夹开始cygwin.bat
或ls.exe
或bash.exe
。他们每个人都会很慢。
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
我试过的步骤:
127.0.0.1 localhost cygdrive wpad
/etc/bash_completion.d
文件夹)etc/profile.d
文件夹etc/bash.bashrc
文件我怎样才能找到根本原因?
P.S。 - 我有两个不同的系统,笔记本电脑和台式机都使用Windows 8.1 64位。这个问题在两者上都是100%可重复的。
另外,如果我在登录后几秒钟启动Bash,它会立即启动。
答案 0 :(得分:67)
最终我找到了导致此问题的原因,但我仍然不确定原因。 Cygwin非常适合同一环境中的其他人。
原因:在每个Cygwin应用程序的开头,它都会尝试获取etc/nsswitch.conf
文件中描述的凭据。出于某种原因,我的帐户需要花费大量时间,因为它通过LDAP与多个Active Directory域控制器联系。
解决方案1:您可以将当前用户和组保存在etc/passwd
和etc/group
文件中,并将Cygwin设置为在Active Directory之前进行检查。
mintty.exe
并等到它打开mkpasswd -c
并将其输出保存到etc/passwd
文件(您必须创建它,输出应该是一行)mkgroup -c
并将其输出保存到etc/group
文件(您必须创建它,输出应该是一行)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进程都会立即启动。
这是你的情况吗?我想分享我的调查步骤,所以你可以检查,如果你的情况与我的相同。
mintty
,您将在netmon中看到它的连接: mintty
个连接列表,右侧看到TCP和LDAP帧。nbtstat -a 8.8.8.8
(用netmon中的一个IP地址替换8.8.8.8)。更深入:我还在使用etc/nsswitch.conf文件来获取本地凭据或缓存的凭据,以便在没有cygserver的情况下运行得更快。但是没有运气。
答案 1 :(得分:23)
这对我有用。
启动Cygwin终端,然后运行以下两个字符串。
mkpasswd -c > /etc/passwd
mkgroup -c > /etc/group
编辑“/etc/nsswitch.conf”文件以包含以下两行。
passwd: files # db
group: files # db
重新启动Cygwin。
Cygwin很快就开始了。
答案 2 :(得分:7)
如果您使用的是具有大型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.
答案 3 :(得分:2)
添加' C:\ cygwin64 \ bin'走向我的道路。