Android Selinux 修改使system_app可以打开/dev/videoX(一)

一 查看文件的Selinux属性

    ls -Zd /dev/

drwxr-xr-x root     root              u:object_r:device:s0

    则/dev文件夹在android selinux中的domain是device

    ls -Z /dev/video0                                             
crw-rw---- system   camera            u:object_r:video_device:s0 video0

    则/dev/video0在android selinux中的domain是video_device

 

二 查看自己的app进程的Selinux属性

    ps -Z | grep XXX

u:r:system_app:s0              system    13218 308   xxx.xxx.xxx

    可以看到自己的app进程id为「system」, 在android selinux中的domain是system_app

 

三 查看自己的app在访问/dev/video0时被selinux阻止的规则

    点开自己的app(里面有打开/dev/video0的操作)

    adb shell su root dmesg | grep 'avc: ' 或者直接在logcat中,就可以看到相应的selinux阻止操作的打印

    <14>[  274.162831] type=1400 audit(10202.409:93): avc: denied { getattr } for pid=2233 comm=".xxx.xxx" path="/dev/video2" dev="tmpfs" ino=8650 scontext=u:r:system_app:s0 tcontext=u:object_r:video_device:s0 tclass=chr_file permissive=0


    <14>[  274.162959] type=1400 audit(10202.409:94): avc: denied { read } for pid=2252 comm=".xxx.xxx" name="/" dev="tmpfs" ino=9783 scontext=u:r:system_app:s0 tcontext=u:object_r:device:s0 tclass=dir permissive=0


    我这里有两个操作被阻止了

    1. 对/dev/video2的getattr操作

        denied { getattr }: 表明是getattr操作

        path="/dev/video2": 表明是对/dev/video2的操作

        scontext=u:r:system_app: 表明subject 的domain 是system_app

        tcontext=u:object_r:video_device: 表明 target 的doumain 是 video_device

        tclass=chr_file : 表明 target 的class 是chr_file

    2. 对/dev文件夹的open操作

        分析见上

 

四 那么如何修改sepolicy 使得权限对system_app放开呢

    因为我有boot.img所以直接修改ramdisk里的sepolicy

    1 解压boot.img

    2 使用xda 上提供的工具:selinux-inject修改sepolicy

       a) selinux-inject: http://forum.xda-developers.com/android/software/setools-android-sepolicy-inject-t2977563

       b) 修改规则:

       -s 是subject

       -t 是target

       -c 是class

       -p 是要添加的allow 的规则

       ./sepolicy-inject -s system_app -t video_device -c file -p getattr -P sepolicy2 -o sepolicy2    // 使得system_app对video_device有getattr权限

      ./sepolicy-inject -s system_app -t device -c dir -p open -P sepolicy2 -o sepolicy2     // 使得system_app对/dev有open权限

       sesearch -A -s system_app -t device -c dir sepolicy2

       sesearch -A -s system_app -t video_device -c chr_file sepolicy2    // 用来查看权限是否改成功了

    3 压缩回boot.img

    4 fastboot flash boot new_boot.img

       fastboot reboot

 

 

 


      

转载于:https://www.cnblogs.com/blowing-in-the-wind/p/5684942.html

<think>好的,用户遇到了挂载不成功的问题,我需要帮他分析可能的原因。首先看下他提供的命令和输出: 他执行了`mount -o nolock 192.168.0.5:/usr/src/nfs/zhuliang/new2_6810e_172 /usr/lib`,但挂载没有成功。接下来还运行了些后台进程,比如`/mnt/mtd/app/hsx_system &`,可能和系统服务有关,但关键问题还是在mount命令上。 先考虑NFS服务器的问题。用户使用的是NFS挂载,所以需要确认服务器192.168.0.5是否正常,并且共享路径是否存在。可能服务器没有启动NFS服务,或者防火墙阻挡了连接。需要检查服务器端的exports文件,确认共享目录是否正确配置,并且客户端IP是否有权限访问。 网络连通性也是个常见问题。用户应该用`ping 192.168.0.5`测试是否能到达服务器。如果ping不通,可能是网络配置错误,比如IP地址错误、子网掩码或网关设置不正确。此外,NFS使用的端口可能被防火墙拦截,尤其是在使用较新版本的NFS时,可能需要开放rpcbind和相关端口。 挂载选项和路径是否正确?用户用了`-o nolock`,这是为了避免使用NLM锁,通常在旧版本或某些嵌入式系统中需要。但需要确认是否正确支持。目标路径`/usr/lib`是否存在?如果不存在,需要先创建目录。另外,如果目标目录非空或者已经被挂载,也可能导致失败。可以用`mount`命令查看已挂载的文件系统,确认是否有冲突。 权限问题也不容忽视。NFS服务器导出目录时可能设置了权限限制,比如root squash导致客户端root用户没有权限。可以尝试用`mount -o nolock,vers=3`指定NFS版本,或者检查服务器端的权限设置。 查看系统日志会有帮助。使用`dmesg | tail`或`journalctl -xe`查看相关错误信息,可能会有更具体的报错提示,比如连接超时、权限拒绝等。 另外,用户执行的其他命令,比如启动hsx_systemdev_init,是否影响了挂载?需要确认这些进程是否占用了相关资源或导致冲突,但可能性较低,主要问题还是在NFS配置和网络连接上。 总结可能的解决步骤:首先检查网络连通性,确认NFS服务器配置正确,确保目标目录存在且未被占用,调整挂载选项和版本,最后查看日志获取详细错误信息。用户可能需要逐排查这些方面来解决问题。</think>针对您遇到的挂载问题,以下是逐步排查和解决方案: --- ### **1. 检查NFS服务器状态** - **确认NFS服务是否运行** 在服务器端执行: ```bash systemctl status nfs-server # 查看NFS服务状态 exportfs -v # 检查共享目录是否已正确导出 ``` 若服务未启动,需通过 `systemctl start nfs-server` 启动服务。 - **验证共享路径权限** 确保服务器端 `/usr/src/nfs/zhuliang/new2_6810e_172` 目录的权限允许客户端访问(检查 `/etc/exports` 配置)。 --- ### **2. 检查网络连通性** - **测试IP连通性** 在客户端执行: ```bash ping 192.168.0.5 # 确认是否能到达NFS服务器 telnet 192.168.0.5 2049 # 测试NFS端口是否开放 ``` 若无法连通,需排查: - 防火墙是否拦截(检查 `iptables` 或 `ufw` 规则) - 网络路由是否正确(通过 `route -n` 查看) --- ### **3. 验证挂载参数和路径** - **确认挂载目录存在** ```bash ls -ld /usr/lib # 检查目标挂载点是否存在 mkdir -p /usr/lib # 若不存在则创建(注意原有数据可能被覆盖) ``` - **尝试指定NFS版本** 添加 `vers=3` 或 `vers=4` 参数避免协议不兼容: ```bash mount -o nolock,vers=3 192.168.0.5:/path /usr/lib ``` --- ### **4. 检查客户端NFS支持** - **确认客户端已安装NFS工具** ```bash which mount.nfs # 检查是否存在NFS挂载程序 ``` 若无输出,需安装: ```bash apt-get install nfs-common # Debian/Ubuntu yum install nfs-utils # CentOS/RHEL ``` --- ### **5. 查看日志定位具体错误** - **通过系统日志排查** ```bash dmesg | tail -n 20 # 查看内核日志(重点关注NFS相关错误) cat /var/log/syslog # 查看系统日志 ``` - **常见错误示例**: - `Connection refused`: NFS服务未运行或端口被阻 - `Access denied`: 共享目录权限配置错误 - `No such file or directory`: 挂载点或共享路径不存在 --- ### **6. 其他可能问题** - **检查文件系统冲突** 若 `/usr/lib` 已挂载其他文件系统,需先卸载: ```bash umount /usr/lib ``` - **尝试临时关闭SELinux/AppArmor** ```bash setenforce 0 # 临时关闭SELinux systemctl stop apparmor # 关闭AppArmor(Ubuntu) ``` --- ### **操作总结** 1. 确保NFS服务器正常运行且共享目录已导出。 2. 验证客户端与服务器网络互通。 3. 检查挂载参数和目录权限。 4. 通过日志定位具体错误。 若仍无法解决,请提供 `dmesg` 输出的错误信息,以便进步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值