Solaris下的md5校验
作者 佚名技术
来源 操作系统
浏览
发布时间 2012-06-27
Dtrace + Truss 在 Solaris 10上的实例 这个案例着重于如何使用 Dtrace & truss 来进行 Solaris 的问题跟踪。 Dtrace是Solaris 10的一个特性。 昨天早上,客户打电话来抱怨一个奇怪的Solaris问题。 我在过去6个月里一直支持这个web 2.0领域的客户。 客户发现它不能正确的添加一个新用户。 如果他尝试增加一个新用户,系统会报告错误。 “useradd –m –d /home/test test” 是给/home下增加一个新用户的命令。:对应的错误信息是: " # useradd -m -g getamped -d /home/getamped -c "getamped user." -m -s /bin/bash getamped UX: useradd: ERROR: Unable to change owner of files home directory: No such file or directory. " 于是客户给我打电话寻求帮助。 看起来这是一个简单的Solaris 配置的问题。我们知道Solaris会自动挂接 /home目录。所以通常我们需要把autofs关掉才可以对/home进行操作。 这些都是很简单的工作,而且有很多的文档说明了这些步骤, 于是我们打开/etc/auto_master. 它看起来好像这样: +auto_master /net -hosts -nosuid,nobrowse /home auto_home -nobrowse 根据文档的纪录,我们需要把最后一行注释掉: #/home auto_home -nobrowse 这样就去掉了autofs监管的/home目录。 然后我们重新启动 autofs 服务,让这个配置生效。 按后我们再次运行 “useradd“命令,看看我们现在发现了什么? 有趣的是,这次仍然报告一个错误: " UX: useradd: ERROR: Unable to change owner of files home directory: No such file or directory. " 看来某个地方还有问题. 那么是哪里呢? 按照通常的步骤,我们搜索知识库,但是没发现任何有意义的结果. 现在让我们尝试用”truss “来跟踪一下这个命令. 它到底在作些什么? 他会打印出来应用的每个系统调用和相关参数. 通过这些详细地记录信息我们发现了一点线索: "#truss -f -o /tmp/useradd.out useradd -m -d /home/test test" 下面我们增加一个选项“-f”来继续跟踪子进程的信息,这样fork()的子进程的log也可以被记录下来. 然后我们打开记录的文件/tmp/useradd.out. 它里面记录了useradd运行的所有系统调用: "# truss -f useradd -m -d /home/test7 test7 1710: execve("/usr/sbin/useradd", 0x08047C9C, 0x08047CB4) argc = 5 1710: resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12 1710: resolvepath("/usr/sbin/useradd", "/usr/sbin/useradd", 1023) = 17 1710: sysconfig(_CONFIG_PAGESIZE) = 4096 1710: xstat(2, "/usr/sbin/useradd", 0x08047A88) = 0 1710: open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT ....... ....... " 喔.这个文件看起来至少有10000行. 通过几个小时的艰苦工作,我们找到了一点相关的内容, useradd 会通过 fork()调用产生若干的子进程, 其中一个子进程会意外的退出.这时候的记录信息显示如下: Received signal #18, SIGCLD [caught] 1749: siginfo: SIGCLD CLD_EXITED pid=1755 status=0x0001 当我们比较这个产生错误的记录信息和正常的“useradd”记录信息的时候.我们发现 SIGCLD 没有出现在正常的记录中.在这个信号之后,子进程会退出并让整个进程错误终止.也许这就是一个真正的错误原因? 那么是谁发送了这个CLD信号给我们的useradd呢? 很幸运的是,Solaris 10里面提供了一个强大的系统内核跟踪工具 – Dtrace.它会帮助我们进入Solaris 内核来揭示内部的具体运作.于是我们采用下面的dtrace脚本来看看是谁发送了这个CLD信号. 脚本是下面这样的: #!/usr/sbin/dtrace –qs proc:::signal-send /args[2] == SIGCHLD/ { printf("SIGCLD was sent by %s pid=%d \n", args[1]->pr_fname,args[1]->pr_p |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Solaris下的md5校验的所有评论