9月27號會議內容的補充

會議原內容

會議時間: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 這個倒黴的命令,這兩天學了一些腳本的知識,就正好爲有好奇心的同學充點電。首先就一些概念給出說明:

         管道:根據字面意思,就是一頭進另一頭出,中間是封閉的,專業點解釋就是將一個命令的輸出作爲另一個命令的輸入,| 是其管道線,一般是一些密切相關的命令會使用管道,也就是一個命令需要從另一個命令獲得信息或數據。如catgrep

         重定向:重定向輸出( 符號是>) 是完成對信息進行輸出/ 追加到另一個文件( 沒有替換的概念,可以是新建文件或已存在的文件) ,重定向輸入( 符號是<) 是命令從一個文件中獲取信息,如getline < "/etc/passwd"

         正則表達式:是一種可以用於模式匹配和替換的強有力的工具。其作用如下:測試字符串的某個模式。 例如,可以對一個輸入字符串進行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱爲數據有效性驗證。例如在系統中安裝軟件時會用到正則表達式來匹配需要安裝哪些依賴的包。“^” 定位符規定匹配模式必須出現在目標字符串的開頭

         awk: awk 是一種編程語言,用於在linux/unix 下對文本和數據進行處理。數據可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix 下的一個強大編程工具。它在命令行中使用,但更多是作爲腳本來使用。其吸取了Cbashpython 等語言的優點,語法上很多與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 權限太大一直是一個難題,我查了相關資料,但是知識有限根本看不懂,如果大家在無聊的時候想到什麼好方法的話可以交流一下。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章