讨论一下printk

发表于:2007-05-26来源:作者:点击数: 标签:
现在我需要实现一个内核日志,试过直接在内核写二进制文件,但容易在半底panic,现在我就需要利用printk,让它能记到我指定的文件里,看了 linux forum上的讨论,menp99你们的讨论都在printk的实现,这个其实就是象zhanrk说的printk()函数向一个环形的缓冲写

现在我需要实现一个内核日志,试过直接在内核写二进制文件,但容易在半底panic,现在我就需要利用printk,让它能记到我指定的文件里,看了linuxforum上的讨论,menp99你们的讨论都在printk的实现,这个其实就是象zhanrk说的printk()函数向一个环形的缓冲写数据,最终调用控制台的写函数来将其打印出来(这也是为什么printk函数没法打引到远程终端的原因),而这个控制台在主机上就是虚拟控制台,估计是不是在klogd里面做?截获klogd能不能实现我的要求?

 e4gle 回复于:2003-06-10 18:57:01
menp99死到哪里去啦?

 炎舞 回复于:2003-06-11 17:35:07
打倒~鹰哥什么时候能开个我看的懂的帖子?(汗~)

 e4gle 回复于:2003-06-11 18:11:33
呵呵,抱歉,最近一直陷在从内核保护操作系统的实现中,可以形成一个产品,所以最近的东西可能都是关于内核安全的

 mori 回复于:2003-06-12 00:31:15
鹰哥,还记得你提到过把root瓜分为三,最近又听有人说过,现在理解的话,感觉就是在root外又加了个壳,由于不能让软件失控,所以其实还是有个最高控制模块。。。是这样吗?

能不能稍微详细介绍一下这个东西?

 e4gle 回复于:2003-06-12 12:59:23
没有最高控制,如果有最高控制了不就还和原来的自主访问差不多嘛,哈,其实就是三权分立,审计管理员,安全管理员,root,三个特权相互制约管理整个系统,系统里不再有最高特权账户,现在我实现的其他两个管理员的形式不以传统的账户形式出现,而加了我们自己的认证,或者是安全的签名证书,或者是硬件的usb-key等,以后可能还会有更强的认证机制

 mori 回复于:2003-06-12 14:04:11
用安全签名或者硬件。。。呵呵。。好厉害

不会是将传统的取得root最终归为物理安全了吧

 e4gle 回复于:2003-06-12 20:12:22
国家的操作系统5个等级标准你去看看就明白啦

 mori 回复于:2003-06-13 00:37:44
以前看过,不理解。。。今天重新看了一遍。

关于强制访问控制,我仔细想了一下,最让我不理解的还是关于服务这个地方。。。我曾听人说过好像是用在kernel和shell之间增加强制访问控制的方式来做,但是这样来说用户很多正常请求岂不是会受到某些程度的影响?比如setuid,我想是不会通过强制访问控制层的吧?

还有上午的时候,有个问题一直没有弄清楚,还是关于s位程序的。
比如在我运行ping的时候(假如uid 500),我会以root身份运行吗?还是说审计与管理员连这些东西都瓜分掉了?我对系统管理员能理解,系统审计员和安全管理员不理解。

不好意思,我对系统理解太肤浅,而且在网上没有搜索到相关资料(相关的也只是提到了,没有详细解释),还请鹰哥指点。。。

 e4gle 回复于:2003-06-13 11:40:53
其实,你别老是把强制访问控制一定要对抗root上,setuid还是允许它用的,但是对于setuid程序的溢出,我们可以另外再加一个防缓冲溢出的内核模块,这部分我们已经做好了,我们不是对抗root,而是和root分权协调管理系统,因为unix自带的自主访问的文件访问机制有安全上的缺陷,我们加上强制访问的意思就是在文件系统上面,在kernel层进行一道检查,只要我们做的效率好,就不会太增加系统的负荷
当然强制访问控制还能理解到除了文件系统之外的方面,比如保护重要进程不被root杀掉,强制网络访问等等

 JohnBull 回复于:2003-06-13 16:54:31
我们能不能考虑把i386 CPU中那两个没有使用的硬件优先级利用起来呢?

 mori 回复于:2003-06-14 01:39:01
i386?好像使用的不多吧。。。

如果能亲眼见识一下这个B1(B2?)产品就好了。。。等有机会再去你那,让俺开开眼界吧:)

 e4gle 回复于:2003-06-14 17:13:23
是B1,也就是国家三级

 qjlemon 回复于:2003-06-19 11:41:03
[quote:9829b50724="JohnBull"]我们能不能考虑把i386 CPU中那两个没有使用的硬件优先级利用起来呢?[/quote:9829b50724]     这样会造成不太好移植到别的CPU上吧?有的CPU只有两级? ops:

 fslife 回复于:2003-06-20 08:08:08
[quote:ca37597698="e4gle"]现在我需要实现一个内核日志,试过直接在内核写二进制文件,但容易在半底panic,现在我就需要利用printk,让它能记到我指定的文件里,看了linuxforum上的讨论,menp99你们的讨论都在printk的实现,这个其实就是象zha..........[/quote:ca37597698] 

内核写文件,我用过两种方法:
1.缓冲区方式(copytouser);
2.直接写文件;
最后发现第一种方法存在丢数据现象,而第二种则工作的很好,虽然可能消耗的系统资源比较多一点.

 e4gle 回复于:2003-06-20 13:38:57
嗯,现在我采用的正是直接写文件的方式

 mkill 回复于:2003-07-13 07:29:07
[quote:9c321cdf8e="e4gle"]呵呵,抱歉,最近一直陷在从内核保护操作系统的实现中,可以形成一个产品,所以最近的东西可能都是关于内核安全的[/quote:9c321cdf8e]     

GKR For Linux

 mkill 回复于:2003-07-13 07:32:18
[quote:90900f20d6="e4gle"]没有最高控制,如果有最高控制了不就还和原来的自主访问差不多嘛,哈,其实就是三权分立,审计管理员,安全管理员,root,三个特权相互制约管理整个系统,系统里不再有最高特权账户,现在我实现的其他两个管理员的形..........[/quote:90900f20d6]     

hehe,我也是去年做ISP/ICP项目的时候才接触到的;)
好像还有七种特权相互制约啊:)

 mkill 回复于:2003-07-13 07:49:48
[quote:b10baad817="mori"]用安全签名或者硬件。。。呵呵。。好厉害

不会是将传统的取得root最终归为物理安全了吧[/quote:b10baad817]     

没什么呀,为了照顾原来Linux认证, 没有USB-KEY的时候应该会用原来Linux认证。这时mori就偷它们的Passwd密码。

如果是用USB-KEY加强了用户的身份识别,那也没关系,它USB-KEY应该需要证书中心统一发放Di,偶们mori只要把它证书中心给D掉!就OK了

引用warning3的一句话:被D是很惨的。。。。

要不先借个Radware给你吧:)

 menp9999 回复于:2003-07-15 08:07:07
[quote:d3eac02b73="e4gle"]现在我需要实现一个内核日志,试过直接在内核写二进制文件,但容易在半底panic,现在我就需要利用printk,让它能记到我指定的文件里,看了linuxforum上的讨论,menp99你们的讨论都在printk的实现,这个其实就是象zha..........[/quote:d3eac02b73]     
你说的半底是什么意思?是指的内核的半(bottom half)还指中断的半?但是无论指哪个半,都是在中断文境,直接写文件恐怕是不行的.

 mori 回复于:2003-07-15 13:44:23
[quote:ad428a7856="mkill"]    

没什么呀,为了照顾原来Linux认证, 没有USB-KEY的时候应该会用原来Linux认证。这时mori就偷它们的Passwd密码。

如果是用USB-KEY加强了用户的身份识别,那也没关系,它USB-KEY应该需要证书中心统一发放Di?.........[/quote:ad428a7856]     
嗯。。。前些日子好好研究了一下黄皮书和国家安全等级划分标准,感觉自己的知识严重不足

 e4gle 回复于:2003-07-15 17:52:12
[quote:c0ffd2373a="menp9999"]    
你说的半底是什么意思?是指的内核的半(bottom half)还指中断的半?但是无论指哪个半,都是在中断文境,直接写文件恐怕是不行的.[/quote:c0ffd2373a]

对阿,是中断上下文,所以我实现的那个内核的入侵检测,就无法写log了

 menp9999 回复于:2003-07-16 08:06:32
[quote:b9403840a8="e4gle"]

对阿,是中断上下文,所以我实现的那个内核的入侵检测,就无法写log了[/quote:b9403840a8]     
是用动态可加载模块的方法实现的么?干脆自己在程序里设置一块内存做缓冲,然后用线程实现写文件吧.     
E4,你有没有<<Linux kernel programming>>(3rd ED) 
Addison wesley 2002. 
也就是ULK2后面附的那本书. 
谢谢.
发出来一观.

 e4gle 回复于:2003-07-16 13:16:48
你的意思是在lkm中我自己起内核线程来写文件?

 menp9999 回复于:2003-07-16 16:02:58
[quote:ba4448e5f2="e4gle"]你的意思是在lkm中我自己起内核线程来写文件?[/quote:ba4448e5f2]     
嗯,是不是在LKM中不一定,但是我感觉在中断文境写文件可能有问题.因为在中断文境中不能对系统有任何假设.
我的意思这段内存作为LOG文件的缓冲区,也只是为了提高效率.

 e4gle 回复于:2003-07-16 17:25:28
不是可能有问题,在中断上下文写文件一定会panic,你的意思是不是把这段缓冲区推到三层,有一个应用程序负责把这缓冲区写到文件中?
其实这个想法就是printk的实现啊

 menp9999 回复于:2003-07-17 08:08:40
[quote:f7ed564e44="e4gle"]不是可能有问题,在中断上下文写文件一定会panic,你的意思是不是把这段缓冲区推到三层,有一个应用程序负责把这缓冲区写到文件中?
其实这个想法就是printk的实现啊[/quote:f7ed564e44]     
我倒,我是绕了一个圈子,哈哈

 e4gle 回复于:2003-07-17 13:22:02
是啊,又绕回printk的实现了,我也知道它的方法稳定性强,但是不通用,如果在别的unix上实现起来就困难,还有就是我还得再写一个类似syslogd应用程序,工作量大

 menp9999 回复于:2003-09-04 08:13:36
你忙完了吧?我看见你9.2日发了个贴子,哈哈.

 menp9999 回复于:2003-09-04 08:09:58
[quote:21a2897cb4="e4gle"]是啊,又绕回printk的实现了,我也知道它的方法稳定性强,但是不通用,如果在别的unix上实现起来就困难,还有就是我还得再写一个类似syslogd应用程序,工作量大[/quote:21a2897cb4]     
我这么想了一个思路,不知道是否可行:
其实就是把sys_write分开来做,第一步是在普通的进程中打开一个文件,然后通过自己增加的一个系统调用把file 结构传递交到自己设的一个全局变量中,剩下就是抄sys_write后面的代码做一个直接写文件的例程了.

 menp9999 回复于:2003-09-05 12:31:59
172 asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
173 {
174         ssize_t ret;
175         struct file * file;
176 
177         ret = -EBADF;
178         file = fget(fd);
179         if (file) {
180                 if (file->f_mode & FMODE_WRITE) {
181                         struct inode *inode = file->f_dentry->d_inode;
182                         ret = locks_verify_area(FLOCK_VERIFY_WRITE, inode, file,
183                                 file->f_pos, count);
184                         if (!ret) {
185                                 ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
186                                 ret = -EINVAL;
187                                 if (file->f_op && (write = file->f_op->write) != NULL)
188                                         ret = write(file, buf, count, &file->f_pos);
189                         }
190                 }
191                 if (ret > 0)
192                         dnotify_parent(file->f_dentry, DN_MODIFY);
193                 fput(file);
194         }
195         return ret;
196 }
197 
198 




179行以下好象就同进程没有什么联系了,

原文转自:http://www.ltesting.net