cgroup devices 子系統分析

一.     devices子系統總體結構

cgroup devices子系統通過爲每個cgroup維護一個設備訪問權限鏈表管理和控制cgroup中進程對設備文件讀寫訪問和設備文件節點創建。

從功能角度分析,devices子系統主要分爲三個部分:子系統初始化接口、子系統文件接口和子系統訪問控制接口。

子系統初始化接口在cgroup初始化各個子系統時被調用,功能是繼承或者創建一個設備訪問權限鏈表,標識cgroup中對各個系統設備訪問權限等信息;文件接口的功能是用戶進程修改cgroup目錄下devices子系統配置文件內容後,更新devices子系統的配置;訪問控制接口主要是檢查設備的權限,該類接口提供系統訪問設備文件或創建設備節點時檢查操作的合法性,實現訪問控制。

二.     devices子系統初始化接口

devices子系統爲每個cgroup維護一個設備訪問權限鏈表管理和控制cgroup中進程對設備文件讀寫訪問和設備文件節點創建,初始化接口在cgroup初始化devices子系統時最重要的工作就是繼承或者創建訪問權限鏈表。


2.1  數據結構和接口

devices子系統的核心數據結構是structdev_whitelist_item,具體定義如下。

該數據結構標識一個設備權限的實體,major和minor說明主次設備號,type說明設備類型,而access具體制定了該設備的訪問權限。每個設備的權限實體通過list鏈接成鏈表。

另一個數據結構是struct dev_cgroup,具體定義如下。

該數據結構第一個成員是strcut cgroup_subsys_state類型變量,初始化函數返回該成員的地址。第二個成員即指向設備權限鏈表,通過它開始鏈表的操作。

devices定義了一些函數操作該鏈表。

2.2  初始化流程

devices子系統實現了cgroup子系統接口structcgroup_subsys devices_subsys:

devcgroup_create接口在cgroup初始化devices子系統時完成初始化工作。該函數首先分配一個dev_cgroup,並初始化其中的whitelist鏈表。之後判斷調用devcgroup_create的cgroup是否是最上層的cgroup。如果是,即cgroup->parent爲空,則需要創建新的設備權限鏈表。鏈表只有一個元素,首先分配一個struct dev_whitelist_item,初始化各個變量使其默認該cgroup可以訪問所有設備,並且擁有所有權限,最後將該實體加入到whitelist鏈表上。如果cgroup是一個子cgroup,那麼devcgroup_create僅僅拷貝父cgroup的devices子系統鏈表到whitelist上,不做任何操作。

三.     devices子系統文件接口

在cgroup目錄下有三個文件:devices.allow、devices.deny和devices.list。分別用來啓用、禁用和列出cgroup支持的設備。cgroup中有規定:在樹形結構的cgroup中,如果父cgroup禁用了某設備,那麼子cgroup無權啓用該設備;而子cgroup可以禁用父cgroup支持的設備和權限。devices子系統實現的三個文件接口如下,其實allow和deny是隻寫文件,list是隻讀文件。

3.1 device.allow接口和device.deny接口

用戶進程寫device.allow和device.deny文件內核都是觸發devcgroup_access_write函數。如果寫device.allow文件,即啓用設備,是往whitelist添加設備item;如果寫device.deny文件,即禁用設備,是從whitelist刪除設備的item。

向whitelist上添加item前要檢查該設備是否可以被啓用,即遍歷鏈表看看是否已經有標識該設備權限的item,且權限是禁用。如果是,則操作失敗;如果沒有該設備的item,則添加到whitlelist中。

禁用設備時函數根據主次設備號、設備類型遍歷whitelist查找是否有該設備,如果有就刪除該item。

3.2 device.list接口

用戶進程讀device.list文件觸發函數devcgroup_seq_read,函數遍歷whitlelist並且格式化輸出每個item的主次設備號、類型和訪問權限。

四.     devices子系統訪問控制接口

devices子系統向內核提供訪問控制接口,限制內核對設備的讀寫權限和創建設備節點的功能。核心思想就是在內核驗證設備訪問權限時時候增加判斷,決定操作的成功。提供的接口聲明如下。

devcgroup_inode_permission函數用於判斷設備的讀寫權限,再訪問一個設備文件前執行用於控制內核對設備文件的讀寫操作。devcgroup_inode_mknod函數判斷一個設備是否允許創建設備節點,在虛擬文件系統創建設別文件節點時調用,可以實現對設備節點創建的權限控制。

 


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