周末从 18.04 升级到 20.04 后,我遇到了一个奇怪的问题。几乎每次我在终端上执行 sudo 命令时,都需要 2 分钟以上才能完成,有时甚至长达 5 分钟。
我已检查我的主机名是否与 /etc/hosts 中的名称匹配。我运行了一下,strace sudo ls
看看是否能发现任何奇怪的东西,如果我正确读取了输出,就会发现轮询文件描述符 7 时存在巨大的延迟:
15:17:56 poll([{fd=7, events=POLLIN}], 1, 300000) = 1 ([{fd=7, revents=POLLIN|POLLHUP}])
15:19:26 read(7, "", 16) = 0
15:19:26 close(7) = 0
15:19:26 close(8) = 0
15:19:26 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
15:19:26 fstat(9, {st_mode=S_IFREG|0664, st_size=6406312, ...}) = 0
15:19:26 fstat(9, {st_mode=S_IFREG|0664, st_size=6406312, ...}) = 0
15:19:26 getpid() = 57431
15:19:26 socket(AF_UNIX, SOCK_STREAM, 0) = 7
15:19:26 fcntl(7, F_GETFL) = 0x2 (flags O_RDWR)
15:19:26 fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK) = 0
15:19:26 fcntl(7, F_GETFD) = 0
15:19:26 fcntl(7, F_SETFD, FD_CLOEXEC) = 0
15:19:26 connect(7, {sa_family=AF_UNIX, sun_path="/var/lib/sss/pipes/nss"}, 110) = 0
15:19:26 fstat(7, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
15:19:26 poll([{fd=7, events=POLLOUT}], 1, 300000) = 1 ([{fd=7, revents=POLLOUT}])
15:19:26 sendto(7, "\24\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0", 16, MSG_NOSIGNAL, NULL, 0) = 16
15:19:26 poll([{fd=7, events=POLLOUT}], 1, 300000) = 1 ([{fd=7, revents=POLLOUT}])
15:19:26 sendto(7, "\1\0\0\0", 4, MSG_NOSIGNAL, NULL, 0) = 4
15:19:26 poll([{fd=7, events=POLLIN}], 1, 300000) = 1 ([{fd=7, revents=POLLIN}])
15:19:26 read(7, "\24\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0", 16) = 16
15:19:26 poll([{fd=7, events=POLLIN}], 1, 300000) = 1 ([{fd=7, revents=POLLIN}])
15:19:26 read(7, "\1\0\0\0", 4) = 4
15:19:26 poll([{fd=7, events=POLLOUT}], 1, 300000) = 1 ([{fd=7, revents=POLLOUT}])
15:19:26 sendto(7, "\24\0\0\0\"\0\0\0\0\0\0\0\0\0\0\0", 16, MSG_NOSIGNAL, NULL, 0) = 16
15:19:26 poll([{fd=7, events=POLLOUT}], 1, 300000) = 1 ([{fd=7, revents=POLLOUT}])
15:19:26 sendto(7, "\222{\225F", 4, MSG_NOSIGNAL, NULL, 0) = 4
15:19:26 poll([{fd=7, events=POLLIN}], 1, 300000) = 1 ([{fd=7, revents=POLLIN|POLLHUP}])
15:20:56 read(7, "", 16) = 0
15:20:56 close(7)
我运行ls -la /proc/$PID/fd
后发现 fd 7 是一个套接字:
lrwx------ 1 root root 64 Apr 28 15:13 7 -> 'socket:[1208329]'
有人知道是什么原因导致了这么大的延迟吗?或者这个套接字是用来做什么的?
我也遇到一个问题,从锁定屏幕登录需要 3 分钟以上,我怀疑这可能与此有关。
答案1
今天早上我已经知道是什么导致 sudo 卡住了。
我注意到 strace 输出中第一行之前几行POLLIN
有一个对 open 和 read 的调用/etc/sssd/sssd.conf
。
14:53:52 openat(AT_FDCWD, "/etc/sssd/sssd.conf", O_RDONLY) = 4
14:53:52 fstat(4, {st_mode=S_IFREG|0600, st_size=696, ...}) = 0
14:53:52 read(4, "[sssd]\nservices = nss, pam\nconfi"..., 4096) = 696
14:53:52 read(4, "", 4096) = 0
14:53:52 close(4) = 0
14:53:52 getpid() = 48863
14:53:52 fstat(-1, 0x7ffcd69d5850) = -1 EBADF (Bad file descriptor)
我记不起 SSSD 是什么了,于是开始深入研究,发现 SSSD 服务处于不良状态。我还没有弄清楚到底发生了什么,但似乎文件config.ldb
已损坏或读取时出现错误(我找到了一些信息这里)
这也解释了为什么我的登录挂起超过 3 分钟,因为它可能也在尝试使用 SSSD。
由于我现在实际上并没有使用 SSSD,所以解决方案就是简单地将其卸载。
我希望这可以帮助其他人。我仍然不明白为什么 SSSD 故障会导致 sudo 挂起,我认为它应该能够继续运行并忽略该服务的结果,但也许有一些我不理解的要求或交互。