我正在尝试使用 Buildroot,尝试创建一个最小的系统来优化 Python 应用程序(Kivy GUI)的冷启动时间。我选择使用 Busybox init 进程,因为这对于嵌入式系统来说是最佳的。我有一个 Sxx 脚本来/etc/init.d
启动我的应用程序:
#!/bin/sh python myapp.py 2 > errlog.txt &
当我传递loglevel=8
内核命令行时,这有效。系统启动到我的 Kivy 应用程序,我能够 ping/ssh 到 Raspberry Pi2。但是,如果我通过了,loglevel=1
那么 eth0 就不再出现(其他一切都正常)。对启动脚本 S99myapp 进行编号,以便在之后执行它S40network
不会影响结果。我还尝试通过启动 myapp 来给它低优先级,nice -n 19 python myapp.py 2 > errlog.txt &
但这又没有帮助。即使使用最简单的 Kivy 应用程序(Kivy 主页中的“Hello Word”示例),问题仍然存在。
看起来 Kivy 应用程序在某种程度上无法ifup
完成,除非通过将日志消息打印到控制台来赢得足够的时间。有人可以解释一下发生了什么吗?有办法解决这个问题吗?
答案1
我相信我已经查清楚了。运行ifup -a -n
发现首先执行的是/etc/network/if-pre-up.d/wait_iface。这是一个延迟配置的脚本“如果我们有一个缓慢出现的接口(例如 eth-over-USB)”。我正在使用 RPI2,它有“eth-over-USB”。但是,wait_iface
它不会立即执行,因为环境变量IF_WAIT_DELAY
及其IFACE
期望找到的变量不是由默认的 Buildroot 构建设置的。如果我将IFACE=eth0
和IF_WAIT_DELAY=10
直接添加到 中wait_iface
,eth0 会再次可靠地出现。
我认为发生的事情实际上并不是任何东西“阻塞” ifup
,而是存在竞争条件 -eth0
需要在ifup
执行时已经可用。eth0
如果我的应用程序运行得太早,就会延迟可用性。另一方面,大量控制台输出延迟了我的应用程序,足以确保eth0
及时可用。
我遇到了关于如何处理这个问题的其他建议。一种是使用allow-hotplug
在/etc/network/interfaces
.我尝试过但没有成功,但我不知道 Busybox 是否认识到这一点或者我做得是否正确。其他建议是创建一个规则,以便在可用时udev
提出。eth0