2015年7月29日 星期三

[draft] android 5.0.2 porting note

換到 android 5.0.2 後首先碰到的兩件事, 一個是 debug console 不能用 (在 selinux 為 permissive 或 enforcing 時), 一個就是 selinux 所需要的權限控制.

平臺以 freescale i.mx6 來說.

debug console 在一開始 lunch project 時選擇 -eng 如 sabresd_6dq-eng 這時才能打開, 而且前提是 selinux 是 enforcing 設定的前提下打開. 否則選用 -user project 時 debug console 會被關掉. 使用 lunch sabresd_6dq-user 時 debug console 會被關掉, 而且同時也不能關 selinux, 這個問題目前無解.

前面這段一定有人會有疑問, 直接關掉 selinux 就好了幹麻又要 debug console 又要開 selinux? 是的, 就是為了專程來 debug selinux 的設定. 在講 selinux 相關筆記時再來提個東西. selinux 有兩種運作模式, permissive 跟 enforcing, android 可以在 kernel parameter 中設定:
androidboot.selinux=permissive
androidboot.selinux=disabled
androidboot.selinux=enforcing
三選一. disabled 就是關掉, 關掉後我也沒辦法在 android console 下用 setenforce 再打開...

再來講到幾個設定檔, 目前僅知的有

  1. BoardConfig.mk, 為什麼先提這個? 因為 BOARD_SEPOLICY_DIRS 要在這裡定義, 這個變數定義著您自訂的 sepolicy 要放在哪裡. 一般來說已經 porting 好的 BSP 裡面都還會再有一大票自定義 selinux 條文, 會整理在一個地方, 為了保留原始設定方便改壞掉時還可以回去參考, 建議 copy 出來一份擺到別的地方, 再指過去. 
  2. *.te, te 檔裡定義幾個東西 
    1. 型別, 從 external/sepolicy 裡原本已經定義的幾個型別裡再繼承出來, 不過我用到的只有 sysfs 跟 proc, 其它還沒用過. 如: 
      • type sysfs_led, fs_type, sysfs_type;
    2. 權限. allow 跟 neverallow (絕不放行, 權限在 allow 之上, 編譯時要特別注意錯誤訊息裡有沒有這東西) 哪些類別的 app (init, init_shell, system_app, untrusted_app 等) 可以存取到什麼樣的權限 (read, write, search, ....). 如:
      • allow untrusted_app sysfs_led:file rw_file_perms;
  3. file_contexts, genfs_contexts 以及一些 contexts 相關的, 這個網路上文章很多也抄來抄去, 很好找所以其它沒講的就不提了. file_contexts 是宣告路徑為哪一個型別所有, 這裡沒有定義的, selinux 通常都是封鎖存取權限. 舉個例子: 
    • /sys/devices/soc\.0/gpio-leds\.66/leds/green/brightness u:object_r:sysfs_led:s0
  4. 定義型別 (sysfs_led) 就是前面講的 .te 檔案裡所述, sysfs_led, untrusted_app 這些都是在 .te 檔裡宣告. 

除了這些以外, debug console 下的 ps -Z 與 ls -Z 的 selinux 型別列表, 是非常重要的 debug 工具 (所以前面一直提 selinux 必需要開著 debug console 也要開著, 否則使用 -Z 什麼都不會顯示).

這裡講 file_contexts, file_contexts 有它自己的特殊語法, 我目前找不到它專用特殊語法的任何說明, 就僅知 "." 一定要用 "\." 替代,  否則後續的檔案定義會大亂. 句號是它的保留字,  "+" "[" "]" "^" "?" 這些也都是它的保留字, 但作用我不知道. 引一個例子來說:
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness u:object_r:sysfs_led:s0
你要在 file_contexts 裡寫成:
/sys/devices/soc\.0/gpio-leds\.66/leds/green/brightness u:object_r:sysfs_led:s0
這個樣子, selinux 才可以認的到.
selinux 我不知道怎麼查已經被設定在 sepolicy 裡的規則檔案路徑怎麼敘述, 只知道一件事, file_contexts 設定如果沒有設定正確, 用 ls -Z 會看到
/sys/devices/soc.0/gpio-leds.66/leds/green/brightness 被設定成 u:object_r:sysfs:s0
如果設定正確, 以上 sysfs 字樣會是我們要設定的 sysfs_led

這裡如果沒有設定成功, .te 檔裡 allow 全部的東西也是不能存取, 所以很重要.

如果是一個目錄下所有的東西, 就會是這樣寫:
/sys/devices/soc\.0/gpio-leds\.66/leds/green/(/.*)? u:object_r:sysfs_led:s0
用 ls -Z 就可以看的到底下所有檔案全被設定成 sysfs_gpio.
至於為什麼要有那個句號, 為什麼 "?" 寫後面, 我不知道, 我也沒找到過任何說明, 知道的人可以補充的話我感激不盡.

還有, file_contexts 裡的東西只對實體檔案有效, 對重導向過後的連結不會有作用, 例如 /sys/class/gpio/gpioxx 這種有重導向過的東西就要貼實際路徑, 不能貼連結.

genfs_context 中因為是設定 /proc 下的檔案, 語法跟 file_contexts 有點不同, 例如:
genfscon proc /cpuinfo u:object_r:proc_cpuinfo:s0

  • /cpuinfo 是指 /proc/cpuinfo, 是省略性寫法, 要注意避過.
  • cpuinfo 是 folder, 不是 file, 被指定的 folder 那底下的所有檔案都會被套成 proc_cpuinfo.
file_contexts 可以直接改寫 out/target/ .... /root/file_contexts 這個檔後, 以 cpio 方式打包成 RAMdisk image 透過 u-boot 以 tftp boot 方式載入執行, 可以改到爽後再寫回到 BSP code 裡的設定, 其它的東西我是直接刷掉 system.img 檔案來觀察更改後的結果.

先到這裡, 這篇只是純筆記, 更接近實作的筆記可以參考這篇:
http://blog.csdn.net/yelangjueqi/article/details/46761987
google 寫的說明頁只負責交代定義, 很重要, 但看完背完就可以扔了.

150730: 找到一篇 file_contexts 的語法說明, 雖然還是有些保留字如 '^' 與 '+' 的作用沒說明, 不過已經足夠應付大部份應用. file_contexts 它跟標準 unix/linux 檔名保留語法有很多不同, 看了就知道. 有人需要我再試圖翻這種東西
http://selinuxsymposium.org/2007/slides/03-fcglob.pdf