会议原内容 :
会议时间:2010.9.27 星期一
会议地点:15楼会议室 记录人:王森
参加者:陈老师、刘老师以及陈老师、李老师、刘老师、王老师的研究生
主题:
一、会议开始之前,陈老师先询问大家的学习情况,并根据了解结果提出以下建议:
1、c语言基础薄弱的同学要自己下功夫复习相应的知识。
2、对内核不要有恐惧心里,要知难而进,坚持下去。
3、不能浮躁,要先打好基础,从内核学起,反过来看应用层程序便会更加得心应手。
4、希望大家形成积极讨论共同学习的氛围。
二、由苏师姐带领大家分析globalmen的makefile文件:
苏师姐通过对两个makefile文件(附件)的对比,提醒大家要注意代码的通用性,和可移植
性,具体分析如下:
TARGET= globalmem
ifneq ($(KERNELRELEASE),)
obj-m := $(TARGET).o
$(TARGET)-objs := module.o global_fops.o
else
KERNEL := $(shell uname -r)
KDIR ?= /lib/modules/$(KERNEL)/build
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
install:
@./$(TARGET).sh
remove:
@./clean.sh
endif
第一行是用TARGET这个变量代替了具体的模块名称,这样修改的优点在于,如果要改变模块名称,
只需在makefile中修改这一处,而不必在下面的代码中逐一修改。
super张同学补充了一下下面四个变量赋值符号的区别:
+= :在变量原先的内容上加上要赋值的内容,中间自动用空格隔开。
:= :定义的变量立即展开
= :定义的变量在执行命令时才展开
?= :在此之前没有给该变量赋值才会给该变量赋值
第二行到第8行用了makefile中的 ifneq else endif语句,若我们所写的globalmem.c没有在内核
源码所在的目录下,KERNELRELEASE没有被定义,所以执行else后面的代码,若我们把globalmem.c
和makefile文件拷贝到内核源码路径下的driver目录后,/usr/src/linux/Makefile中就定义了
KERNELRELEASE变量,、
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
/dev/nul为系统垃圾箱,2代表的是标准错误,即执行cat命令不会输出错误信息。我们再看一下
kernel.release的内容:
2.6.32-25-generic
里面放的是内核版本号,现在我们明白了,使用ifneq else endif语句可以让globalmem单独编译,也可以
作为内核的模块编译。
$(KERNEL)的定义同样提高了代码的通用性,当内核版本号改变之后我们不需要修改makefile文件。
下面看看globalmem.sh文件:
#!/bin/sh #这行是shell脚本常用的格式,用来告诉系统执行该脚本的程序
module="globalmem"
device="globalmem"
mode="644" #定义变量
/sbin/insmod ./$module.ko || exit 1 #执行insmod命令
rm -f /dev/${device} #删除/dev/目录下的globalmem设备,避免报错
major=`awk "//$2==/"$module/" {print //$1}" /proc/devices` #反撇号内的内容将被shell解释执行,
#执行结果将赋值给major
#反撇号中命令的意思是比较/proc/devices文件中的第二列与globalmem,如果相等则print devices文件中对应
#于globalmem行的第一列,即globalmem的主设备号。
mknod /dev/${device} c $major 0 #李伟同学讲过的,建立节点
group="su"
grep -q '^su:' /etc/group || group="root"
chgrp $group /dev/${device}
chmod $mode /dev/${device}
陈老师补充了三点:
1、通过对makefile和shell脚本的阅读可以带出许多零碎的知识点,大家要注意积累。
2、对手头常做的事要熟练,熟能生巧嘛。往往看似简单的一个命令也可以玩出很多新的花样。
3、大家可以看看正则表达式。
三、刘老师介绍rbac项目
项目由来:linux系统用户权限要么过高要么过低,不能满足某些实际需求
rbac简介:rbac的意思是基于角色的访问控制,主要利用linux用户组权限实现。
对于系统的访问控制管理,可利用访问控制矩阵来确定角色的权限,当然,如下的访问控制矩阵便精确的定义了
各用户的权限:
file1 file2 file3 file4 ……
进程1
进程2
进程3
……
但是这样的矩阵却难以在linux系统上实现。
再看如下矩阵:
file1 file2 file3 file4 ……
所有者
用户组
其他
该矩阵虽容易实现,但难以满足需求。
基于角色的访问控制矩阵如下:
File1 File2 File3 File4 ……
角色1
角色2
角色3
……
这样的矩阵综合两者的优点,即能最大限度的满足用户需求,又相对容易实现。
由于这块内容并不是针对所有同学,所以在这只是简单的描述了一下,有兴趣的同学可以联系刘老师。
最后,由于能力有限,细节之处还望大家修改和补充。
我的补充内容 :
上次的会议记录,我对于脚本知识一直很纠结,尤其是awk 这个倒霉的命令,这两天学了一些脚本的知识,就正好为有好奇心的同学充点电。首先就一些概念给出说明:
管道:根据字面意思,就是一头进另一头出,中间是封闭的,专业点解释就是将一个命令的输出作为另一个命令的输入,| 是其管道线,一般是一些密切相关的命令会使用管道,也就是一个命令需要从另一个命令获得信息或数据。如cat 和grep 。
重定向:重定向输出( 符号是>) 是完成对信息进行输出/ 追加到另一个文件( 没有替换的概念,可以是新建文件或已存在的文件) ,重定向输入( 符号是<) 是命令从一个文件中获取信息,如getline < "/etc/passwd" 。
正则表达式:是一种可以用于模式匹配和替换的强有力的工具。其作用如下:测试字符串的某个模式。 例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。例如在系统中安装软件时会用到正则表达式来匹配需要安装哪些依赖的包。“^” 定位符规定匹配模式必须出现在目标字符串的开头
awk: awk 是一种编程语言,用于在linux/unix 下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix 下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。其吸取了C 、bash 、python 等语言的优点,语法上很多与C 类似,如运算符、循环语句等,但却相当的灵活,尤其是数组,自定义函数部分更让人头晕。相关概念有:记录,通俗点讲就是一行代表一个记录。字段/ 域:以空格、Tab 、其他自定义分隔符分隔开的内容。主要思想是匹配模式来完成相关操作,如awk /text/ {print $0} test.txt 来匹配test.txt 文件中的text 字段,如果某条记录匹配了test 则打印出这条记录。分析:major=`awk "//$2==/"$module/" {print //$1}" /proc/devices` ,``在脚本中可以看作是一个在命令行中执行的命令,使用反短斜线可以将一个命令的输出作为另一个命令的一个命令行参数( 这是原话,前面的是我自己认为的,也不知道反短斜线是不是指`,也不知道是指一个还是一对) ,$1 、$2 分别指第一个字段和第二个字段,$0 指整条记录,如果单独输awk 命令则可直接用$1, 但这是在.sh 脚本中,引用字段需要用转义字符,如//$2 ,判断是否相等用“==,“ 而脚本中是用“=“ 来判断,同样/" 也是转义符表示",$module 是变量的引用,awk 使用变量是不用定义的,直接拿来用,很神奇。{print //$1} 表示输出第一个字段,要处理的文件放在末尾,就像/proc/devices 。
对于刘老师的项目,我和老师交流了一下,我想到的方法也就是对root 进行监视,将但监视的实现却是很复杂的过程,我们可以编写一个小程序并一直驻留内存中,一开始我想到监视root 的一些关键操作,如修改日志,帐目文件等操作,但操作却是不好监视的,后来想到对关键文件进行监视,可以通过判断用户的uid ,如果root 进入关键文件的目录,则触发程序进行监视root 是否进行写操作,但系统文件非常多,一直不停的扫描比较目录这样效率会非常低,我又想是否可以通过文件句柄来判定是否打开了关键的文件,以此来触发监视程序呢,但文件句柄好像在打开关闭再打开后会变掉。刘老师把另一个Linux 版本中限制root 权限的方法和我讲了一下,也就是分权,它是将root 分成三个大权限的用户,分别完成其相应的职责,如一个专门负责用户的管理,一个负责文件的操作,另一个完成其他操作,但这个项目不想把问题弄的更复杂,最终还是又迷失了方向,对于linux 系统中的root 权限太大一直是一个难题,我查了相关资料,但是知识有限根本看不懂,如果大家在无聊的时候想到什么好方法的话可以交流一下。