我为我的一个I2C设备创建了内核驱动程序作为可加载模块。驱动程序通过new_device文件(/sys/devices/i2c/i2c-0/0-0008/)
使用实例化在I2C对应文件夹(/sys/devices/i2c/i2c-0/new_device)
下创建少量sysfs文件。
Lollipop强制执行SELinux,因此我需要为需要访问设备的sysfs文件的应用程序创建规则。主要是系统应用程序(它们属于Android SELinux中platform_app的定义)。问题是不允许任何应用程序域中的应用程序写入sysfs文件:
neverallow { appdomain -bluetooth -nfc }
sysfs:dir_file_class_set write;
所以我决定专门为我的设备创建文件上下文:
file_context:
/sys/devices/i2c-0/0-0008(/.*)? u:object_r:sysfs_mydeviceic:s0
结果很有意思:默认驱动程序文件和文件夹(如name和uevent等)获取正确的上下文,但不是由I2C驱动程序的sysfs部分创建的文件:
root@android:/sys/devices/i2c-0/0-0008 # ls -Z
--w--w--w- root root u:object_r:sysfs:s0 data
lrwxrwxrwx root root u:object_r:sysfs_mydeviceic:s0 driver -> ../../../bus/i2c/drivers/mydevice
-rw-rw-rw- root root u:object_r:sysfs:s0 locked
-r--r--r-- root root u:object_r:sysfs_mydeviceic:s0 modalias
-r--r--r-- root root u:object_r:sysfs_mydeviceic:s0 name
drwxr-xr-x root root u:object_r:sysfs_mydeviceic:s0 power
-rw-rw-rw- root root u:object_r:sysfs:s0 protection
-rw-rw-rw- root root u:object_r:sysfs:s0 state
lrwxrwxrwx root root u:object_r:sysfs_mydeviceic:s0 subsystem -> ../../../bus/i2c
-rw-r--r-- root root u:object_r:sysfs_mydeviceic:s0 uevent
我正在寻求帮助如何解决此问题:如果我仍想将sysfs上下文转换为sysfs_mydeviceic以获取其余文件,那么如何执行此操作?或者是否有其他方法可以让应用程序写入sysfs文件?
答案 0 :(得分:0)
在将一些驱动程序移植到Android 5时遇到了同样的问题。似乎并非所有sysfs文件都被放入正确的selinux上下文中。对于通过new_device
动态实例化的设备,似乎只会发生这种情况。
我的解决方案是使用restorecon(8)
触发selinux恢复文件上下文。
在用于实例化设备的同一脚本中,执行以下命令:
restorecon -r /sys/devices/i2c-2/
-r
标志告诉restorecon
递归工作。如果您愿意,还可以单独列出每个文件。
如果您使用Android初始化脚本(例如/init.rc
),则可以使用另一个命令:
restorecon_recursive /sys/devices/i2c-2/
同样,有restorecon
命令只恢复单个文件。
有关详细信息,请参阅SEAndroid documentation。