在启动时我的 android phone init .sh 脚本 运行 但不完全
on boot my android phone init .sh script run but not fully
堆栈!
这是我的第一个问题,所以不要对我太苛刻。
我想 运行 在启动我的 android 时使用我自己的 .sh 脚本文件。为此,我重建了内核映像,然后在 init.rc 文件中添加了我自己的服务,该服务在启动完成触发器后启动:
on property:dev.bootcomplete=1
start fota-snoop
start fota-trigger
start startup-prober
start fairnet
服务本身:
service fairnet /system/bin/sh /system/etc/init.fairnet.sh
user root
group root
disabled
oneshot
/system/etc/init.fairnet.sh 的权限设置为 644 像其他 init .sh 脚本一样,所有者是 root:root :
-rw-r--r-- root root 280 2018-01-09 01:03 init.fairnet.sh
init.fairnet.sh:
#!/system/bin/sh
insmod /system/lib/modules/xt_HL.ko
lsmod > /system/etc/curlsmod
/system/bin/iptables -t mangle -L > /system/etc/preiptables
/system/bin/iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set 64
/system/bin/iptables -t mangle -L > /system/etc/postiptables
最有趣的是加载内核模块的命令在启动时也能正常工作,但其他字符串不起作用:输出文件不存在,iptables 的规则没有添加。我不明白为什么 insmod 有效而其他命令却无效。
感谢阅读,对不起我糟糕的英语。
问题已解决!
SELinux 在启动时阻止了 iptables。
dmesg | grep iptables
给我
<36>[ 39.819005] type=1400 audit(1516096993.541:9): avc: denied { create } for pid=2652 comm="iptables" lport=255 scontext=u:r:init_shell:s0 tcontext=u:r:init_shell:s0 tclass=rawip_socket op_res=-13 ppid=2640 pcomm="sh" tgid=2640 tgcomm="sh"
这意味着在当前 /sepolicy 中没有我需要的规则。
为了添加该规则,我对所有拱门使用 sepolicy-inject, for build it need /usr/lib/libsepol.a, libsepol1-dev contains it. Also may use builded binaries(不适合我,我自己构建)。
./sepolicy-inject -s init_shell -t init_shell -c rawip_socket -p getopt,create,setopt -P sepolicy -o sepolicy_new
添加所需的规则并根据设备的旧 sepolicy 创建新的 sepolicy_new。
使用新 boot.img 的新 sepolicy 闪存设备,我使用 AIK 用于 Win。
完成!现在启动后,我的 .sh 脚本会自动运行并完全运行。
感谢阅读,再次为我糟糕的英语感到抱歉。
P.S。我自己的服务我从 init.sony.rc 替换为 init.qcom.rc,也删除了组 root 和禁用,但我这样做只是出于意识形态的原因,并没有解决问题。
P.P.S。将模式从 Enforced 更改为 Permissive 可能会解决问题,但我不想失去 SELinux。
堆栈!
这是我的第一个问题,所以不要对我太苛刻。
我想 运行 在启动我的 android 时使用我自己的 .sh 脚本文件。为此,我重建了内核映像,然后在 init.rc 文件中添加了我自己的服务,该服务在启动完成触发器后启动:
on property:dev.bootcomplete=1
start fota-snoop
start fota-trigger
start startup-prober
start fairnet
服务本身:
service fairnet /system/bin/sh /system/etc/init.fairnet.sh
user root
group root
disabled
oneshot
/system/etc/init.fairnet.sh 的权限设置为 644 像其他 init .sh 脚本一样,所有者是 root:root :
-rw-r--r-- root root 280 2018-01-09 01:03 init.fairnet.sh
init.fairnet.sh:
#!/system/bin/sh
insmod /system/lib/modules/xt_HL.ko
lsmod > /system/etc/curlsmod
/system/bin/iptables -t mangle -L > /system/etc/preiptables
/system/bin/iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set 64
/system/bin/iptables -t mangle -L > /system/etc/postiptables
最有趣的是加载内核模块的命令在启动时也能正常工作,但其他字符串不起作用:输出文件不存在,iptables 的规则没有添加。我不明白为什么 insmod 有效而其他命令却无效。
感谢阅读,对不起我糟糕的英语。
问题已解决!
SELinux 在启动时阻止了 iptables。
dmesg | grep iptables
给我
<36>[ 39.819005] type=1400 audit(1516096993.541:9): avc: denied { create } for pid=2652 comm="iptables" lport=255 scontext=u:r:init_shell:s0 tcontext=u:r:init_shell:s0 tclass=rawip_socket op_res=-13 ppid=2640 pcomm="sh" tgid=2640 tgcomm="sh"
这意味着在当前 /sepolicy 中没有我需要的规则。
为了添加该规则,我对所有拱门使用 sepolicy-inject, for build it need /usr/lib/libsepol.a, libsepol1-dev contains it. Also may use builded binaries(不适合我,我自己构建)。
./sepolicy-inject -s init_shell -t init_shell -c rawip_socket -p getopt,create,setopt -P sepolicy -o sepolicy_new
添加所需的规则并根据设备的旧 sepolicy 创建新的 sepolicy_new。
使用新 boot.img 的新 sepolicy 闪存设备,我使用 AIK 用于 Win。
完成!现在启动后,我的 .sh 脚本会自动运行并完全运行。
感谢阅读,再次为我糟糕的英语感到抱歉。
P.S。我自己的服务我从 init.sony.rc 替换为 init.qcom.rc,也删除了组 root 和禁用,但我这样做只是出于意识形态的原因,并没有解决问题。
P.P.S。将模式从 Enforced 更改为 Permissive 可能会解决问题,但我不想失去 SELinux。