ZYNQ系列Debian 9 应用程序开机自启动

    科技2022-07-11  84

    最近在zynq系统平台上要给一个无线网卡移植一个hostpad的程序,最终需要设置开机启动脚本。

    因为ZYNQ系列是PL+PS架构的,PL(FPGA)有时钟就启动,但是PS这边是预装Linux系统,通常系统启动完毕到进入控制台,并输入用户名密码登录,登录进去后是普通用户模式,很多特权命令不能直接运行。

    所以想让自己PS端的程序开机完毕后就进入自动运行:

    要么把登录验证的这一步骤跳掉,直接以root身份进入系统,然后运行用户应用程序启动脚本

    要么将用户应用程序路径加载带启动文件里,系统启动完毕后直接运行,与登录验证身份不冲突

    解决方法

    先说下1,其实1这种方法才是最开始想做的,而且应该是比较正确的做法,但是Ubuntu、Debian、Linaro、Petalinux等分支文件结构是有差异的,就算是在同分支下,不同的版本之间也是有差异的,这就搞的当时在网上查资料的时候,尝试有些博主说的改动方法的时候,对应路径下的文件根本就找不到,或者根本就没有这种路径,在或者,同为Debian 9系统,虚拟机下的文件和移植到开发板的Debian 9系统同路径下的文件都不同,结果越搞越多,越搞越麻烦,干脆尝试第二种方式。

    第2种方式是这样的,一定要先说清楚,只针对Debian 9 stretch,因为就像1说的,差异真的比较大。通常来说,需要自启动的应用程序路径都会添加在/etc/rc.local这个文件里面,然而搞笑的是,在Debian 9 stretch里/etc路径下,根本就没有rc.local这个文件,但是!!!通过systemctl status rc-local却能看到,rc.local这个服务却是存在的。

    看紧贴着红框底部Active状态项,可以看到,此时的rc.local是非活动的服务。为了解决这个问题,我们需要自建rc.local文件。vim /etc/rc.local,然后添加如下代码

    #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. exit 0

    文件保存完毕后,通过chmod +x rc.local给文件加权限,然后移动文件到/etc路径下,reboot系统。

    系统重启完毕后,控制台输入systemctl status rc-local再查看rc.local服务状态,可以看到已经是active了。

    此时说明自建的rc.local文件随系统启动已经没什么问题了,这时,将自己需要开机自动运行的程序路径,写到rc.local文件中的exit 0上方,即可完成自定义应用随系统开机自启动。

    补充

    最后,再说些其他需要注意的事情:

    1.rc.local这个文件最好在哪用就,在哪建立在哪添加文件内容,我的意思是,最好不要在windows端建立rc.local然后添加文档内容,再传给开发板,因为不同系统间文档的编码格式不同,有可能引起rc.local在开发板端没办法正常使用。

    2.关于用户应用程序自启动的调试打印问题,我测试了两个应用程序,一个只做最简单的打印输出,另一个是不停的循环打印。其中,系统启动后,第一个测试程序并没有打印出来调试信息,进入系统后,通过ps指令看不到这个程序,但是通过top指令可以看到程序是正在运行的;第二个测试程序可以正常循环打印,进入系统后,通过ps指令依旧看不到这个程序,但是通过top指令也可以看到程序是正在运行的。还不清楚为什么会这样,但是程序应该都是能够正常开机自启动运行,等明白为什么了以后,会在下面做补充更新。

    其他失败的尝试

    尝试1

    参考dhcp程序

    在/etc/init.d目录下,新建脚本 hostapd在/etc/rc5.d目录下,新建链接文件 S01hostapd rc5.c的5表示启动脚本顺序,5对应启动顺序比较靠后, 脚本S开头,表示开机会执行start操作。

    尝试2

    同样失败告终。

    尝试3

    参考文章

    省略密码验证

    把/etc/passwd中的root❌0:0:root:/root:/bin/bash,改为root::0:0:root:/root:/bin/bash,就可以了,就是去掉了里面的x,这样root用户就不用密码了。其他用户也一样。

    省略输入用户名

    (1)修改/etc/inittab

    在inittab中,有如下配置

    1:2345:respawn:/sbin/agetty tty1 9600 2:2345:respawn:/sbin/agetty tty2 9600 3:2345:respawn:/sbin/agetty tty3 9600 4:2345:respawn:/sbin/agetty tty4 9600 5:2345:respawn:/sbin/agetty tty5 9600 6:2345:respawn:/sbin/agetty tty6 9600

    表示系统可以有六个控制台,可以用ALT+(F1~F6)来切换。而/sbin/agetty就是一个登陆验证程序,执行它,会提示用户输入用户名和密码,然后启动一个指定的shell(在passwd文件中指定的)。

    所以,我们只需将其修改为不执行agettty,而是执行自己编写的一个脚本,就可以跳过用户名和密码的输入。修改如下:

    1:2345:respawn:/root/logintest tty1 9600

    这里我在/root/下放了一个测试脚本,这样系统启动时就会执行那个脚本,脚本内容:

    #!/bin/sh /bin/login -f root

    最终又失败告终。

    Processed: 0.023, SQL: 8