Linux入门教程:P9->时间日期类

本文介绍了Linux系统中的时间日期类操作,包括如何使用date命令展示、设置时间和格式化日期,以及通过cal命令查看日历和使用ntpdate同步时间。重点讲解了%d、%Y等格式选项和时间差计算实例。

本系列文章为尚硅谷武晟然老师的Linux入门教程学习笔记,前面的系列文章链接如下
Linux入门教程:P3->Linux文件系统
Linux入门教程:P4->Vim编辑器
Linux入门教程:P5->网络配置
Linux入门教程:P6->系统管理
Linux入门教程:P7->Shell介绍
Linux入门教程:P8->文件目录类

文章目录


一、时间日期类

date

基本语法:date [选项]… [+时间日期格式]
选项说明
-d <时间字符串>:显示指定的“时间字符串”表示的时间,而非当前时间。
-s <日期时间>:设置系统日期时间。
参数说明
<+日期时间格式>:指定显示时使用的日期时间格式
date显示当前时间:
date (功能描述:显示当前时间)
date +%Y (功能描述:显示当前年份)
date +%m (功能描述:显示当前月份)
date +%d (功能描述:显示当前是哪一天)
date "+%Y-%m-%d %H:%M:%S" (功能描述:显示年月日时分秒)
示例: 直接通过date显示当前时间
在这里插入图片描述
在date后面加上%Y%y%m%d等选项,显示当前年、月、日等信息
在这里插入图片描述
通过命令date +%Y-%m-%d-%H:%M:%S来按照年-月-日-时:分:秒的方式来显示当前时间。
在这里插入图片描述
大写S和小写s的区别:S代表当前的秒数,s代表时间戳(显示从1970年1月1日到现在过去了多少秒)。在写系统日志的时候,时间戳是很有用的。
在这里插入图片描述
示例: 通过date -d显示昨天、明天、下个小时等时间。
在这里插入图片描述
示例: 通过date -s修改系统时间。
在这里插入图片描述
可以通过ntpdate 服务器来同步当前时间,会显示时间的差值。
在这里插入图片描述

cat

基本语法: cal [选项] (功能描述:不加选项,显示本月日历)
在这里插入图片描述
选项:
cal -[数字]:显示前后指定月的日历。
在这里插入图片描述
cal -m:将周1放在最前面
在这里插入图片描述
cal [具体年份]:看具体年份的日历
在这里插入图片描述
cal -y:看本年度的日历

otal 0 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 a7s_boot_a -> /dev/block/mmcblk0p18 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 a7s_boot_b -> /dev/block/mmcblk0p19 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 a7s_dtb_a -> /dev/block/mmcblk0p20 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 a7s_dtb_b -> /dev/block/mmcblk0p21 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 a7s_root_a -> /dev/block/mmcblk0p22 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 a7s_root_b -> /dev/block/mmcblk0p23 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 boot_a -> /dev/block/mmcblk0p2 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 boot_b -> /dev/block/mmcblk0p3 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 cache -> /dev/block/mmcblk0p7 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 dtb_a -> /dev/block/mmcblk0p9 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 dtb_b -> /dev/block/mmcblk0p10 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 dtb_rec -> /dev/block/mmcblk0p17 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 dtbo_a -> /dev/block/mmcblk0p24 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 dtbo_b -> /dev/block/mmcblk0p25 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 env -> /dev/block/mmcblk0p6 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 hazens -> /dev/block/mmcblk0p28 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 misc -> /dev/block/mmcblk0p12 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 ota -> /dev/block/mmcblk0p27 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 recovery -> /dev/block/mmcblk0p8 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 secure -> /dev/block/mmcblk0p1 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 sest -> /dev/block/mmcblk0p16 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 splash -> /dev/block/mmcblk0p11 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 system_a -> /dev/block/mmcblk0p4 lrwxrwxrwx 1 root root 20 2014-03-27 17:30 system_b -> /dev/block/mmcblk0p5 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 tcc -> /dev/block/mmcblk0p13 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 userdata -> /dev/block/mmcblk0p29 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 vendor_a -> /dev/block/mmcblk0p14 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 vendor_b -> /dev/block/mmcblk0p15 lrwxrwxrwx 1 root root 21 2014-03-27 17:30 voice -> /dev/block/mmcblk0p26
最新发布
07-29
<think>我们正在讨论嵌入式系统(特别是车机系统)的分区结构。根据引用[1],嵌入式系统通常分为四个分区:bootloader、para、kernel和根分区(根文件系统)。这与标准Linux分区不同,嵌入式系统没有swap分区,且bootloader、para、kernel这三个分区在系统启动后不可见。 引用[2]详细描述了启动过程:Bootloader(如GRUB)从引导分区加载内核,并传递根文件系统的位置信息。内核启动后挂载根文件系统,并启动初始化程序。 引用[3]和[4]则提供了具体参数示例,如`root=/dev/mmcblk0p2`,其中`mmcblk0`表示SD卡,`p2`表示第二个分区(即根文件系统分区)。参数`rootwait`用于等待设备初始化完成,`rw`表示以读写方式挂载。 现在,用户希望了解设备的分区链接关系,特别是启动、内核和根文件系统相关的分区。我们将基于引用内容进行分析。 ### 分析设备分区链接关系 #### 1. **嵌入式系统典型分区结构(基于引用[1])** - **bootloader分区**:存储启动代码(如U-Boot)。这是设备上电后运行的第一个程序,负责初始化硬件并加载内核。 - **para分区**:存储启动参数(如内核命令行参数)。bootloader从该分区读取参数(如根文件系统位置、挂载选项等)并传递给内核。 - **kernel分区**:存储内核镜像(如`zImage`或`uImage`)。bootloader将内核加载到内存并跳转执行。 - **根分区(根文件系统)**:存储完整的文件系统(如`ext4`或`squashfs`)。内核挂载该分区作为根目录(`/`),并从中加载用户空间程序和配置文件。 这些分区的链接关系如下图所示: ```mermaid graph LR A[上电] --> B[bootloader分区] B --> C[读取para分区的参数] C --> D[加载kernel分区的内核] D --> E[根据参数挂载根分区] E --> F[启动用户空间] ``` #### 2. **分区在存储设备上的物理布局(以eMMC/SD卡为例)** 根据引用[3][4],存储设备(如eMMC或SD卡)的分区命名规则如下: - `mmcblk0`:第一个存储设备(如SD卡)。 - `mmcblk1`:第二个存储设备(如eMMC)。 - 分区通过`p<编号>`后缀标识,例如: - `mmcblk0p1`:SD卡的第一个分区(可能是bootloader分区)。 - `mmcblk0p2`:SD卡的第二个分区(可能是根文件系统分区)。 典型嵌入式系统的分区表可能如下: | 设备节点 | 分区类型 | 内容描述 | |----------------|----------------|------------------------------| | `/dev/mmcblk0p1` | bootloader分区 | U-Boot镜像 | | `/dev/mmcblk0p2` | para分区 | 内核命令行参数(如`root=...`) | | `/dev/mmcblk0p3` | kernel分区 | 压缩的内核镜像 | | `/dev/mmcblk0p4` | 根分区 | 根文件系统(`ext4`格式) | #### 3. **启动过程中的分区交互(基于引用[2][4])** - **步骤1**:bootloader(位于`/dev/mmcblk0p1`)从para分区(`/dev/mmcblk0p2`)读取参数,例如: - `root=/dev/mmcblk0p4`:指定根文件系统在第四个分区。 - `rootwait`:等待设备初始化完成。 - `rw`:以读写模式挂载。 - **步骤2**:bootloader从kernel分区(`/dev/mmcblk0p3`)加载内核到内存。 - **步骤3**:内核启动后,根据`root`参数挂载`/dev/mmcblk0p4`作为根文件系统。 - **步骤4**:内核从根文件系统中执行初始化程序(如`/sbin/init`)。 #### 4. **查看分区链接关系的实践方法** - **在Linux系统中**:使用命令`lsblk`或`fdisk -l`查看存储设备分区表。 - 例如,输入`fdisk -l /dev/mmcblk0`可能输出: ``` Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 2048 34815 32768 16M c W95 FAT32 (LBA) # bootloader分区 /dev/mmcblk0p2 34816 40959 6144 3M 83 Linux # para分区 /dev/mmcblk0p3 40960 266239 225280 110M 83 Linux # kernel分区 /dev/mmcblk0p4 266240 1540095 1273856 622M 83 Linux # 根分区 ``` - **在U-Boot中**:使用`mmc part`命令查看eMMC/SD卡分区,或`printenv`查看启动参数(如`bootargs`包含`root=`信息)。 ### 总结 嵌入式系统的启动依赖于严格的分区链接关系: 1. **bootloader分区**提供初始引导代码。 2. **para分区**提供内核启动参数(尤其是根文件系统位置)。 3. **kernel分区**提供操作系统核心。 4. **根分区**提供用户空间环境。 这些分区通过设备节点(如`/dev/mmcblk0pX`)关联,并由bootloader和内核按顺序处理[^1][^2][^3][^4]。 §§相关问题§§ 1. 如何修改嵌入式系统的内核启动参数? 2. 嵌入式系统中根文件系统损坏如何修复? 3. 不同存储介质(eMMC vs SD卡)对分区结构有何影响? 4. 为什么嵌入式系统不需要swap分区?</think>### 设备分区链接关系分析(基于嵌入式系统设计) 根据引用内容,嵌入式系统(如车机)的分区结构严格按功能划分,与启动、内核和根文件系统的链接关系如下: --- #### 1. **核心分区结构及链接关系** ```mermaid graph LR A[存储设备] --> B[bootloader分区] A --> C[para分区] A --> D[kernel分区] A --> E[根分区] B -->|加载并传递参数| D C -->|提供启动参数| B D -->|挂载| E ``` ##### 关键分区说明: 1. **bootloader分区** - **功能**:存储启动代码(如U-Boot/GRUB),负责初始化硬件并加载内核[^1][^2]。 - **设备节点**:通常为 `/dev/mmcblkXp1`(X为存储设备序号,如eMMC为`mmcblk1`,SD卡为`mmcblk0`)[^3]。 - **依赖关系**:读取para分区的参数,决定内核加载位置和启动配置[^2]。 2. **para分区** - **功能**:存储内核启动参数(如根文件系统位置、挂载选项)[^1][^4]。 - **关键参数示例**: - `root=/dev/mmcblk1p2`:指定根文件系统在eMMC的第2分区[^3]。 - `rootwait`:等待存储设备初始化完成再挂载[^4]。 - `rw`:以读写模式挂载根分区[^4]。 3. **kernel分区** - **功能**:存储内核镜像(如`zImage`),由bootloader加载到内存[^1][^2]。 - **设备节点**:如 `/dev/mmcblkXp3`。 - **依赖关系**:启动后根据para分区的参数挂载根文件系统[^2]。 4. **根分区(根文件系统)** - **功能**:存储完整的文件系统结构(包含 `/etc`, `/usr`, `/bin` 等目录)[^1][^2]。 - **设备节点**:如 `/dev/mmcblkXp4`(对应参数 `root=/dev/mmcblkXp4`)[^3][^4]。 - **特性**: - 不可创建 `/boot` 目录(该目录功能由bootloader/kernel分区承担)[^1]。 - 系统启动后,用户空间程序(如车机应用)完全运行在此分区[^1]。 --- #### 2. **启动流程中的分区协作** ```mermaid sequenceDiagram Bootloader->>+Para分区: 读取启动参数(如root=位置) Bootloader->>+Kernel分区: 加载内核镜像到内存 Kernel->>+根分区: 根据参数挂载文件系统 Kernel->>+根分区: 执行初始化程序(如systemd) 根分区-->>-用户空间: 启动完整系统 ``` 1. **阶段1:Bootloader主导** - 从 **para分区** 获取 `root=/dev/mmcblk1p2` 等参数[^3][^4]。 - 从 **kernel分区** 加载内核到内存[^2]。 2. **阶段2:内核接管** - 根据 `root=` 参数找到 **根分区** 位置[^2][^4]。 - 以 `rw`(读写)或 `ro`(只读)模式挂载根文件系统[^4]。 3. **阶段3:用户空间启动** - 从根分区的 `/sbin/init` 或 `/lib/systemd/systemd` 启动初始化进程[^2]。 - 所有应用程序(如车机UI)均在根分区运行[^1]。 --- #### 3. **特殊设计要点** 1. **分区可见性**: - 系统运行时 **仅根分区可见**,bootloader/para/kernel分区被隐藏(通过地址区分,非文件系统目录)[^1]。 2. **存储介质差异**: - eMMC设备:节点名为 `mmcblk1`(如 `/dev/mmcblk1p2`)[^3]。 - SD卡设备:节点名为 `mmcblk0`(如 `/dev/mmcblk0p2`)[^3]。 3. **与标准Linux的区别**: - **无swap分区**:嵌入式系统直接使用物理内存[^1]。 - **无独立/boot分区**:bootloader/kernel/para分区共同承担其功能[^1]。 --- ### 总结 嵌入式系统的分区链接是严格的单向依赖链: **bootloader →(依赖para参数)→ kernel →(挂载)→ 根分区** 这种设计确保了启动过程的可靠性和安全性,各分区职责明确: - **boot/para/kernel分区**:仅引导阶段使用(类似Windows的引导扇区)。 - **根分区**:承载全部运行时功能(类似Windows的C盘)[^1][^2][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知初与修一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值