最小化 Linux 的启动时间

最小化 Linux 的启动时间

我正在开发一个嵌入式系统。操作系统是 yocto 项目(Ubuntu)。我的目标硬件必须在开机后启动动画应用程序。我将我的动画应用程序作为 basic.target 下的 systemd 服务启动。

但是,一旦我打开电路板电源,屏幕就会闪烁约 500 毫秒,然后光标会闪烁 10 秒,然后我的动画应用程序就会启动。所以我的动画应用程序需要大约 13 秒才能开始显示在屏幕上。

我想消除闪烁的屏幕和光标。我该怎么办?有什么方法可以最大限度地缩短内核启动时间吗?

systemd-analyze blame的结果如下:

      1.065s dev-mmcblk1p1.device
      1.004s launchHMIUSB.service
       518ms launchWeston.service
       437ms node-startup-controller.service
       287ms kmod-static-nodes.service
       286ms systemd-remount-fs.service
       279ms pas-daemon.service
       254ms systemd-modules-load.service
       245ms alsa-restore.service
       219ms systemd-journal-flush.service
       219ms connman.service
       207ms systemd-udev-trigger.service
       202ms dev-hugepages.mount
       190ms systemd-journald.service
       138ms systemd-sysctl.service
       133ms ofono.service
       127ms systemd-vconsole-setup.service
       121ms tmp.mount
       120ms systemd-update-utmp.service
       117ms dev-mqueue.mount
       102ms systemd-logind.service
       101ms node-health-monitor.service
        93ms sys-fs-fuse-connections.mount
        90ms sys-kernel-config.mount
        90ms sys-kernel-debug.mount
        88ms systemd-tmpfiles-setup-dev.service
        74ms [email protected]
        68ms wpa_supplicant.service
        67ms systemd-udevd.service
        60ms nodestatemanager-daemon.service
        53ms systemd-update-utmp-runlevel.service
        31ms systemd-random-seed.service
        31ms systemd-user-sessions.service
        18ms sshd.socket
        16ms systemd-tmpfiles-setup.service
        16ms Data-mnttemp.mount
        15ms var-volatile.mount

答案1

最小化启动时间是第 3 步。第 1 步和第 2 步正在弄清楚什么实际上需要很长时间,为什么

启动过程并不像“电源按钮 → 内核 → 您的应用”那么直接。在前 500 毫秒内,您将获得初始固件;引导加载程序(如果有);以及加载图形驱动程序的 Linux 内核。其余部分是“init”(systemd)启动各种服务,直到它甚至可以开始启动您的应用。

  • 检查系统日志来寻找最明显的故障。
  • 检查 的输出systemd-analyze blamesystemd-analyze critical-chain查看哪些 systemd 单元启动时间最长。找出每个单元启动缓慢的原因,以及是否有必要启动。(大多数单元以并行组的形式启动。有些单元是串行启动的,但有时没有必要。)
  • 使用类似工具引导图表在系统启动期间监控资源。例如,可能是您的存储太慢,或者某个服务占用 CPU 的时间太长。

答案2

通过传递 vt.global_cursor_default=0,光标闪烁已被消除

setenv bootargs 'vt.global_cursor_default=0'
saveenv

相关内容