systemd常用参数(1)

1. [Unit]字段详解

  • Requires:依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意一个服务启动失败,这个服务也会被终止。
  • After:与 Requires 相似,但会在后面列出的所有模块全部启动完成以后,才会启动当前的服务。
  • Wants:与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功。

2. target 作用

systemd target是systemd众多资源的一个分类,以.target结尾,所代表的意思是unit集合,即.target资源包含了一系列的.service、.target等,运行这个target会运行其包含的所有.service、.target等unit/服务。
其作用就是方便系统管理,根据用户设定,控制系统启动的相关target,达到控制不同service启动的目的。

target配置文件跟上面的service配置文件是一样的,只是target通常只有[Unit]区块(字段定义同上)。常见的target有multi-user.target,日常添加系统服务非特殊情况会放到这个target下。

3. target 与 unit 的关系

Target (逻辑组)
├── Unit A (服务)
├── Unit B (套接字)
└── Target C (子目标)

4. target 与 unit 依赖关系实现

[Unit]
# 当前Unit所属的Target
PartOf=graphical.target

# 当前Unit要加入的Target
WantedBy=multi-user.target

# 依赖的其他Target
After=network.target

5. 配置错误也不影响服务启动

Environment=-/aa/bb,就表示即使/aa/bb文件不存在也不会报错

6. system and service manager

systemd 是 Linux 系统的一套基本构建块。它提供了一个以 PID 1 运行的系统和服务管理器,并启动系统的其余部分。

systemd 提供积极的并行化能力,使用套接字和 D-Bus 激活来启动服务,提供守护进程的按需启动,使用 Linux 控制组跟踪进程,维护挂载和自动挂载点,并实现复杂的基于事务依赖的服务控制逻辑。systemd 支持 SysV 和 LSB init 脚本,可以替代 sysvinit。

其他部分包括日志守护进程、用于控制基本系统配置(如主机名、日期、语言环境)的实用程序、维护登录用户和正在运行的容器和虚拟机的列表、系统帐户、运行时目录和设置,以及用于管理简单网络配置、网络时间同步、日志转发和名称解析的守护进程。

7. 统计各个服务启动所需时间

systemd-analyze plot > boot.svg 

8.  显示远程主机的某个 Unit 状态

systemctl -H remote-ip status docker

9.  显示某个 Unit 的所有底层参数

systemctl show httpd

10.  设置某个 Unit 的指定属性

systemctl set-property http CPUShares=500

 

<think>好的,用户现在想了解如何正确集成Systemd到根文件系统,并通过内核参数指定其路径。首先,我需要回顾之前的对话,确保这次回答连贯。之前已经解释了Systemd在启动流程中的位置,由内核启动,而内核由U-Boot加载。现在用户关注的是具体的集成步骤和内核参数设置。 首先,用户可能正在开发嵌入式系统,使用开发板,可能使用如Yocto或Buildroot这样的工具构建根文件系统。他们需要知道如何将Systemd包含进去,并正确配置内核参数。需要分步骤说明,结构清晰,确保用户能一步步操作。 接下来,需要考虑用户可能的背景。他们可能有一定的嵌入式开发经验,但对Systemd的集成细节不太熟悉。需要详细解释每个步骤,包括构建根文件系统时的配置选项,如何确保Systemd的二进制文件和配置文件正确安装。此外,内核参数的设置是关键,需要举例说明如何在U-Boot中设置bootargs,特别是init参数和根文件系统的路径。 可能还需要提到常见的构建工具,如Yocto和Buildroot,因为它们常用于嵌入式系统的根文件系统构建。在Yocto中,需要在conf文件中启用Systemd,而在Buildroot中需要选择Systemd作为init系统。这些具体步骤对用户来说非常实用。 另外,需要注意用户可能遇到的问题,比如如何验证Systemd是否正确安装,如何检查内核配置是否支持Systemd的依赖项,如cgroups和autofs。还需要提醒用户确保根文件系统的路径正确,避免启动失败的情况。 最后,常见问题部分可以帮助用户解决实际中可能遇到的困难,例如启动时找不到init程序,或者Systemd启动失败的可能原因。需要给出具体的命令和检查步骤,如检查根文件系统挂载,查看内核日志等。 总结来说,回答需要结构清晰,分步骤说明如何集成Systemd到根文件系统,如何配置内核参数,并涵盖验证步骤和常见问题解决。同时,使用用户友好的语言,避免过于技术化的术语,确保用户能够理解和操作。</think>以下是关于在嵌入式系统中正确集成 Systemd 到根文件系统并通过内核参数指定其路径的详细说明: --- ### 一、根文件系统集成 Systemd 的核心步骤 #### 1. **构建根文件系统时启用 Systemd** Systemd 的集成需在**构建根文件系统阶段**完成,常用工具包括 **Yocto**、**Buildroot** 或手动编译安装。 - **方法 1:使用 Yocto** 在 `conf/local.conf` 中设置: ```bash # 选择 Systemd 作为初始化系统 DISTRO_FEATURES:append = " systemd" VIRTUAL-RUNTIME_init_manager = "systemd" # 移除 SysVinit 兼容(可选) DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit" ``` - **方法 2:使用 Buildroot** 在配置界面中启用: ```bash System configuration → Init system → systemd ``` - **方法 3:手动编译** 下载 Systemd 源码并交叉编译,将生成的二进制文件(如 `systemd`、`journalctl`)和配置文件(`.service`, `.target`)复制到根文件系统的对应路径: ```bash # 示例路径 /usr/lib/systemd/ # Systemd 主程序与模块 /etc/systemd/ # 自定义配置文件 /bin/systemd # Systemd 可执行文件(符号链接到 /sbin/init) ``` #### 2. **验证 Systemd 是否集成成功** 挂载根文件系统后检查关键文件: ```bash # 检查 Systemd 可执行文件 ls /usr/lib/systemd/systemd /sbin/init # 检查单元文件(如基本服务) ls /usr/lib/systemd/system/*.service ``` --- ### 二、配置内核参数指定 Systemd 路径 #### 1. **内核启动参数设置** Systemd 的启动依赖内核参数 `init=` 和 `root=`,需通过 **U-Boot** 传递给内核。 - **关键参数**: - `root=...`: 指定根文件系统的设备或分区(如 `/dev/mmcblk0p2`)。 - `init=...`: 显式指定用户空间初始化程序路径(默认为 `/sbin/init`,通常指向 Systemd)。 - **示例 U-Boot 环境变量**: ```bash # 设置内核启动参数 setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw init=/usr/lib/systemd/systemd' # 加载并启动内核 setenv bootcmd 'mmc dev 0; ext4load mmc 0:1 0x80000000 zImage; ext4load mmc 0:1 0x82000000 dtb; bootz 0x80000000 - 0x82000000' saveenv ``` #### 2. **内核配置依赖项** 确保内核编译时启用了 Systemd 所需的功能: ```bash # 必须启用的内核选项(通过 make menuconfig) CONFIG_CGROUPS=y # 控制组支持 CONFIG_AUTOFS4_FS=y # 自动挂载 CONFIG_TMPFS_POSIX_ACL=y # 临时文件系统权限 CONFIG_DEVTMPFS=y # 设备节点管理 ``` --- ### 三、常见问题与调试方法 #### 1. **启动时卡在 "Failed to execute /init"** - **可能原因**: - Systemd 二进制文件未正确安装到根文件系统。 - 内核参数 `root=` 指定的根文件系统路径错误。 - **解决步骤**: ```bash # 检查根文件系统挂载 mount | grep " / " # 验证 Systemd 路径是否存在 ls -l /usr/lib/systemd/systemd ``` #### 2. **Systemd 启动后服务失败** - **调试命令**: ```bash # 查看启动日志 journalctl -b # 检查服务状态 systemctl status <service-name> ``` #### 3. **内核未传递正确的 init 路径** - **验证方法**: 在内核启动参数中添加 `debug`,通过串口查看内核日志: ```bash setenv bootargs '... init=/usr/lib/systemd/systemd debug' ``` --- ### 四、总结与最佳实践 1. **根文件系统集成要点** - 通过构建工具(Yocto/Buildroot)启用 Systemd。 - 确保 Systemd 二进制文件、配置文件和符号链接(如 `/sbin/init → systemd`)正确部署。 2. **内核参数关键配置** - `root=` 必须指向正确的根文件系统分区。 - 若 Systemd 路径非默认(`/sbin/init`),需显式指定 `init=/usr/lib/systemd/systemd`。 3. **验证流程** - 检查根文件系统挂载是否成功。 - 确认 Systemd 进程以 PID 1 运行: ```bash ps aux | grep systemd ``` --- **附:嵌入式系统中 Systemd 集成流程示意图** ```mermaid graph TD A[U-Boot] -->|加载内核与设备树| B[Linux Kernel] B -->|挂载根文件系统| C[根文件系统] C -->|执行 init 程序| D[Systemd] D -->|启动服务| E[用户空间服务] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值