板子上电

Linux 上电后,大致是这条链路:

硬件上电
  -> Boot ROM / 固件
  -> Bootloader
  -> Linux Kernel
  -> init 进程,通常是 systemd
  -> systemd 启动系统服务
  -> 用户登录后执行 shell 初始化脚本

1. 固件 / Bootloader

机器刚上电时,CPU 先执行固件代码。

常见有:

BIOS / UEFI
Boot ROM
U-Boot
GRUB

嵌入式板子上常见是:

Boot ROM -> U-Boot -> Linux Kernel

这一阶段主要做硬件初始化、选择内核、加载设备树、传内核启动参数。

2. Linux Kernel

Bootloader 把 Linux 内核加载起来后,内核开始执行。

内核会做:

初始化 CPU / 内存 / 中断
加载驱动
挂载根文件系统
启动第一个用户态进程

第一个用户态进程一般是:

/sbin/init

现在多数系统里它实际指向:

/lib/systemd/systemd

可以查看:

ls -l /sbin/init

3. init / systemd

systemd 是 PID 1,是用户态第一个进程。它负责继续启动整个系统。

它会读取 unit 文件,比如:

/etc/systemd/system/
/lib/systemd/system/
/usr/lib/systemd/system/

然后启动 target 和 service。

常见 target:

basic.target
multi-user.target
graphical.target

你可以理解成以前的运行级别:

multi-user.target   类似命令行多用户系统
graphical.target    类似图形界面系统

查看默认 target:

systemctl get-default

查看本次启动启动了什么:

systemd-analyze blame
systemctl list-units --type=service

4. systemd service

上电后真正自动跑的大多数程序,都是 systemd service。

比如网络、日志、SSH、Docker、你自己的业务程序:

systemd-journald.service
NetworkManager.service
ssh.service
docker.service
your_app.service

查看开机自启服务:

systemctl list-unit-files --type=service | grep enabled

一个 service 大概长这样:

[Unit]
Description=My App
After=network.target

[Service]
ExecStart=/usr/bin/my_app
Restart=always

[Install]
WantedBy=multi-user.target

启用开机启动:

systemctl enable my_app.service

启动:

systemctl start my_app.service

5. 传统启动脚本

老系统或兼容层可能还有:

/etc/init.d/
/etc/rc.local

但现代系统一般推荐 systemd。

检查有没有 rc.local

ls -l /etc/rc.local
systemctl status rc-local

6. cron 的开机任务

cron 可以配置开机执行:

@reboot /path/to/script.sh

查看当前用户的:

crontab -l

查看 root 的:

sudo crontab -l

@reboot 依赖 cron 服务本身启动后执行,不如 systemd 可控。

7. 用户登录后执行的文件

这些不是“上电立即执行”,而是“用户登录/打开终端时执行”。

登录 shell 会读:

/etc/profile
/etc/profile.d/*.sh
~/.profile
~/.bash_profile

交互式 bash 会读:

/etc/bash.bashrc
~/.bashrc

所以你前面说的:

/etc/profile.d/ros2_env.sh

作用是:用户登录 shell 时自动设置环境变量。它不是系统上电阶段执行的,也不会自动给 systemd 服务继承。

8. 一句话总结

上电真正负责自动启动程序的是:

systemd service

终端环境变量通常放:

/etc/profile.d/*.sh
~/.bashrc

如果你要 ROS2 程序上电自动跑,建议写 systemd service;如果只是希望手动打开终端后有 ROS2 环境,放 /etc/profile.d/ros2_env.sh~/.bashrc

posted @ 2026-06-11 09:02  墨尔基阿德斯  阅读(10)  评论(0)    收藏  举报