出现的问题
公司使用树莓派当作开发板,使用ntp服务作为时间同步工具,之前一直运行正常,今天突然不能正常使用,查看状态如下:
绿色字体可以看出服务启动异常,正常应该是acitve(running)
解决方法
查看 /lib 目录的权限,如果是700,则修改为755,再次启动服务,发现可以执行成功。
当然,我这个解决方法不一定适用您遇到的问题,所以我接下来会梳理解决该问题流程,或许对您可以有所启发。
解决问题的流程
-
step1 加日志
修改/etc/ntp.conf文件内容如下,加入日志文件路径。
重启服务sudo service ntp restart
,服务依旧启动失败,打开日志文件内容如下:
可以看见出错原因就是Cannot find user ID 106 -
step 2 查找用户信息
- 使用
id ntp
命令
可以看到ntp服务的user id就是106,此时怀疑是不是保存这些内容的文件有问题 - 查看相关文件信息
文件的权限,及文件内容都正确(这里判断内容正确是因为与其它ntp服务正常运行的开发板输出内容一致)。
到这步,卡了很久。去ntp官网,Stack Overflow,Google都没搜到,于是尝试查看ntp源码,找到报错的原因。
- 使用
-
step 3 查看ntp服务源码
GitHub地址
代码片段如图:
可以看出来,是函数**getpwuid()**返回空指针导致的,接下来就来测试该函数。 -
step 4 测试**getpwuid()**函数
编写的测试代码:
#include <pwd.h>
#include <sys/types.h>
main()
{
struct passwd *user;
user= getpwuid(106);
printf("name:%s\n", user->pw_name);
printf("uid:%d\n", user->pw_uid);
printf("home:%s\n", user->pw_dir);
}
交叉编译之后放到开发板上运行,输出如下:
pi@raspberrypi:~ $ ./testgetpwuid.out
name:ntp
uid:106
home:/home/ntp
居然正确执行了!!!! 难道是用户出问题了?
-
step 5 尝试删除ntp用户,重新添加
userdel ntp
&&useradd ntp
此时,ntp的user id等都发生了变化pi@raspberrypi:~ $ id ntp uid=1001(ntp) gid=1001(ntp) groups=1001(ntp)
重启服务,依然失败!
难道和运行环境有关系? -
step 6 切换到ntp用户下
步骤如下:
pi@raspberrypi:~ $ passwd ntp
passwd: You may not view or modify password information for ntp.
pi@raspberrypi:~ $ sudo passwd ntp
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
pi@raspberrypi:~ $ sudo su ntp
Cannot execute /bin/bash: Permission denied
Cannot execute /bin/bash: Permission denied 解决办法
注意:按照解决办法,修改了/lib权限,从700改为755
ntp@raspberrypi:/home/pi$ sudo service ntp restart
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for ntp:
ntp is not in the sudoers file. This incident will be reported.
ntp is not in the sudoers file 解决办法
root@raspberrypi:~# su - ntp
No directory, logging in with HOME=/
ntp@raspberrypi:/$ sudo mkdir /home/ntp
ntp@raspberrypi:/$ /home/pi/testgetpwuid.out
name:ntp
uid:1001 --> id变了是因为step 5
home:/home/ntp
发现还是执行成功了!
再次重启服务:
AMAZING!!!成功了
step 7 总结
梳理步骤,逐步还原,发现只要/lib目录权限修改为755(或者说让其它用户也有访问权限),服务就可以启动成功,看一下ntp服务的依赖:
可以看见,依赖了/lib目录!!!
思路坎坷,所幸解决了~~~
————————————————
版权声明:本文为CSDN博主「風居住的街道_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27727147/article/details/107496107