嵌入式Linux笔记
Git 命令
命令速查表
1. 基础配置与初始化
| 命令 | 说明 |
|---|---|
git init | 初始化本地 Git 仓库(创建新仓库) |
git config --global user.name "xxx" | 配置全局用户名(提交时显示) |
git config --global user.email "xxx@xxx.com" | 配置全局邮箱(关联 Git 账号) |
git config --global color.ui true | 开启 Git 命令自动着色(status/diff 等) |
git config --global color.status autogit config --global color.diff autogit config --global color.branch autogit config --global color.interactive auto | 细分配置命令行着色规则 |
git config --global --unset http.proxy | 清除 Git 的代理配置 |
2. 仓库操作
| 命令 | 说明 |
|---|---|
git clone git+ssh://git@192.168.53.168/VT.git | 克隆远程仓库(SSH 方式) |
git remote add origin git+ssh://git@192.168.53.168/VT.git | 关联本地仓库到远程仓库(命名为 origin) |
3. 文件暂存与提交
| 命令 | 说明 |
|---|---|
git status | 查看当前工作区状态(文件修改/暂存情况) |
git add xyz | 将指定文件(xyz)添加到暂存区 |
git add . | 将当前目录下所有修改/新增文件添加到暂存区 |
git commit -m 'xxx' | 提交暂存区文件,附带提交说明(xxx) |
git commit --amend -m 'xxx' | 合并上一次提交(修改上一次的提交信息/补充文件) |
git commit -am 'xxx' | 跳过暂存区,直接提交已跟踪文件的修改(等价 add + commit) |
git rm xxx | 删除暂存区中的指定文件(同时删除本地文件) |
git rm -r * | 递归删除暂存区及本地的所有文件 |
git mv README README2 | 重命名文件(Git 会识别为“删除旧文件+新增新文件”) |
4. 版本查看与对比
| 命令 | 说明 |
|---|---|
git log | 查看提交日志(按时间倒序) |
git log -1/git log -5 | 查看最近 1 条/5 条提交日志 |
git log --stat | 显示提交日志 + 每个提交修改的文件统计 |
git log -p -m | 显示提交日志 + 具体修改内容(补丁形式) |
git log --pretty=format:'%h %s' --graph | 以图形化方式显示提交日志(只显示简短哈希和提交信息) |
git show dfb02e6e/git show HEAD/git show v2.0 | 查看指定提交/HEAD/标签的详细修改内容(提交 ID 可简写前几位) |
git show HEAD^/git show HEAD~3 | 查看上 1 个/上 3 个版本的详细内容(^^ 是上两个,^5 是上五个) |
git diff | 对比工作区与暂存区的差异(未 add 的修改) |
git diff --cached | 对比暂存区与本地仓库的差异(已 add 未 commit 的修改) |
git diff HEAD^ | 对比工作区与上一个版本的差异 |
git diff origin/master..master | 对比本地 master 与远程 origin/master 的差异 |
git whatchanged | 显示提交历史对应的文件修改记录 |
git ls-files | 列出暂存区(index)包含的所有文件 |
5. 分支操作
| 命令 | 说明 |
|---|---|
git branch | 查看本地所有分支(当前分支前标 *) |
git branch -a | 查看本地 + 远程所有分支 |
git branch -r | 只查看远程分支 |
git branch --contains 50089 | 查看包含指定提交(50089)的分支 |
git branch --merged | 查看已合并到当前分支的分支 |
git branch --no-merged | 查看未合并到当前分支的分支 |
git branch -m master master_copy | 本地分支重命名(master → master_copy) |
git branch -d hotfixes/BJVEP933 | 删除已合并的分支(安全删除) |
git branch -D hotfixes/BJVEP933 | 强制删除分支(无论是否合并) |
git checkout -b master_copy | 创建新分支 master_copy 并切换到该分支 |
git checkout features/performance | 切换到已存在的分支 |
git checkout --track hotfixes/BJVEP933 | 基于远程分支创建本地跟踪分支并切换 |
git checkout v2.0 | 切换到指定标签(版本) |
git checkout -- README | 撤销工作区中 README 文件的修改(恢复到 HEAD 版本) |
git merge origin/master | 将远程 origin/master 分支合并到当前分支 |
git cherry-pick ff44785 | 单独合并某一个提交的修改(不合并整个分支) |
git rebase | 变基操作(将当前分支的提交“移植”到目标分支顶端,替代 merge 使历史更整洁) |
git show-branch/git show-branch --all | 以图形化方式展示分支历史 |
6. 标签操作
| 命令 | 说明 |
|---|---|
git tag | 查看所有本地标签 |
git tag -a v2.0 -m 'xxx' | 创建带注释的标签 v2.0 |
git show v2.0 | 查看标签 v2.0 的详细信息 |
git log v2.0 | 查看标签 v2.0 对应的提交日志 |
git push --tags | 将所有本地标签推送到远程仓库 |
7. 远程同步
| 命令 | 说明 |
|---|---|
git fetch | 获取远程仓库的最新内容(不合并到本地分支) |
git fetch --prune | 获取远程分支 + 清除本地已失效的远程分支(服务器已删的分支) |
git pull origin master | 拉取远程 master 分支并合并到当前分支(等价 fetch + merge) |
git push origin master | 将当前分支推送到远程 origin 的 master 分支 |
git push origin :hotfixes/BJVEP933 | 删除远程仓库的指定分支(冒号前为空表示删除) |
8. 版本回退与暂存
| 命令 | 说明 |
|---|---|
git reset --hard HEAD | 强制将工作区/暂存区恢复到 HEAD 版本(丢弃所有未提交修改) |
git revert dfb02e6e | 撤销指定提交的修改(生成新提交,保留历史,比 reset 更安全) |
git stash | 暂存当前工作区的修改(恢复到 HEAD 状态,用于临时切换分支) |
git stash list | 查看所有暂存记录 |
git stash show -p stash@{0} | 查看第 0 个暂存的详细修改内容 |
git stash apply stash@{0} | 应用第 0 个暂存(暂存记录不删除) |
git reflog | 查看所有操作记录(包括 reset/rebase 等,用于恢复误删的提交) |
git show HEAD@{5}/git show master@{yesterday} | 查看 HEAD 第 5 次操作前的状态 / master 分支昨天的状态 |
9. 搜索与维护
| 命令 | 说明 |
|---|---|
git grep "delete from" | 在所有跟踪文件中搜索指定文本(delete from) |
git grep -e '#define' --and -e SORT_DIRENT | 多条件搜索(同时包含 #define 和 SORT_DIRENT) |
git gc | 垃圾回收(清理无用的对象,优化仓库) |
git fsck | 检查仓库完整性(修复损坏的 Git 数据库) |
git ls-tree HEAD | 查看 HEAD 对应的文件树(内部命令,调试用) |
git rev-parse v2.0 | 查看标签/分支对应的 SHA1 哈希值(内部命令) |
[!tIP]
- 核心流程:
git init/clone→git add→git commit→git push/pull是日常开发最常用的基础流程。- 分支管理:创建分支用
git checkout -b,合并用git merge/cherry-pick,删除用git branch -d/-D。- 版本回退:
git reset用于丢弃未提交修改(慎用 –hard),git revert用于撤销已提交修改(保留历史),git stash用于临时暂存修改。
Linux基础
🐧核心理念
[!tip]
Linux 中最核心的设计思想之一:“一切皆文件”(所有硬件、进程、网络等资源都以文件形式呈现和管理)。
1. Linux环境
1.1 Ubuntu安装
Ubuntu 系统的具体安装步骤(如镜像下载、虚拟机配置、分区等)可参考网络教程,本文重点记录安装后必备的基础配置。
1.2 共享文件夹配置
前期准备
打开 VMware → 选中当前 Ubuntu 虚拟机 → 点击「设置」→ 「选项」标签页;
找到「共享文件夹」→ 选择「总是启用」→ 添加需要共享的 Windows 文件夹并确认。
安装 VMware 工具(核心依赖)
1
2
3
4# 更新软件源(确保下载最新版本)
$ sudo apt update
# 安装 open-vm-tools
$ sudo apt install -y open-vm-tools open-vm-tools-desktop安装完成后「重启」虚拟机,使工具生效:
1
$ sudo reboot
挂载共享文件夹
临时挂载(重启后失效,适合测试)
1
2
3
4
5
6
7
8
9# 1. 创建挂载目录(-p 确保目录层级不存在时自动创建)
$ sudo mkdir -p /work/hgfs
# 2. 挂载共享文件夹到指定目录
# allow_other:允许非root用户访问;uid/gid:适配当前用户权限
$ sudo vmhgfs-fuse .host:/ /work/hgfs -o allow_other,uid=$(id -u),gid=$(id -g)
# 3. 验证挂载结果(列出共享文件夹内容,能看到即成功)
$ ls /work/hgfs永久挂载(开机自动挂载,推荐)
1
2
3
4
5
6
7
8
9
10# 1. 编辑 fstab 配置文件(系统开机挂载表)
$ sudo vi /etc/fstab
# 2. 在文件末尾添加以下内容(按 i 进入编辑模式)
.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,defaults 0 0
# 3. 保存退出(按 Esc → 输入 :wq → 回车)
# 4. 测试挂载配置(无报错即配置正确)
$ sudo mount -a
[!warning]
⚠️ 若挂载失败,检查:
① VMware 共享文件夹是否启用;
② open-vm-tools 是否安装成功;
③ 挂载目录权限是否正常。
1.3 SSH 服务配置
安装 SSH 服务后,可通过 Xshell、FinalShell 等工具远程连接 Ubuntu,步骤如下:
安装 OpenSSH 服务器
1
$ sudo apt install -y openssh-server
启动并设置开机自启
1
2
3
4
5# 启动 SSH 服务
$ sudo systemctl start ssh
# 设置开机自动启动(避免每次重启后手动启动)
$ sudo systemctl enable ssh验证服务状态
1
$ sudo systemctl status ssh
- 若输出中包含
active (running),说明服务启动成功; - 若需关闭防火墙(可选):
sudo ufw allow ssh。
- 若输出中包含
远程连接
在 Windows 客户端使用以下命令连接:
1
2$ ssh 用户名@Ubuntu的IP地址
# 示例:ssh ubuntu@192.168.1.100或者使用专门的连接工具,这里推荐 MobaX 、Xshell 等
2. Linux 文件目录
Linux 文件系统遵循 Filesystem Hierarchy Standard (FHS) 规范,每个目录有明确的功能分工,核心是「一切皆文件」+「目录职责单一」。
2.1 FHS 核心目录说明
🏠 根目录 /(核心起点)
整个文件系统的唯一根节点,所有目录/文件都挂载于此;
包含系统运行必需的核心组件,禁止随意删除/修改。
🛠️ 系统核心命令/🧩库目录
| 目录 | 全称/说明 | 核心作用 |
|---|---|---|
/bin | Binaries(二进制文件) | 存放所有用户可用的基础系统命令(如 ls、cp、mv、bash),单用户模式可访问 |
/sbin | System Binaries | 存放系统管理命令(仅root可用),如 ifconfig、reboot、fdisk |
/lib | Libraries | 系统核心共享库(.so 文件),为 /bin//sbin 提供运行依赖(类Windows System32) |
/lib64 | 64位系统库目录 | 64位系统特有的共享库目录 |
👤用户/📁应用资源目录
| 目录 | 全称/说明 | 核心作用 |
|---|---|---|
/usr | Unix System Resources | 用户级程序核心目录(系统最大目录之一): ✅ /usr/bin:普通用户应用命令✅ /usr/sbin:非核心管理命令✅ /usr/lib:应用共享库✅ /usr/local:手动安装的软件(不被包管理器管理)✅ /usr/share:文档/手册/图标等共享数据 |
/home | 用户家目录 | 普通用户专属目录(如 /home/ubuntu),存放个人文件/配置,仅对自身可读写 |
/root | root用户家目录 | 管理员(root)的家目录,独立于 /home |
/opt | Optional Software | 第三方大型软件安装目录(如Chrome、IDE),软件独立存放(如 /opt/google/chrome) |
⚙️配置/🧾可变数据目录
| 目录 | 全称/说明 | 核心作用 |
|---|---|---|
/etc | Etcetera | 系统全局配置文件目录(文本格式,可直接编辑): ✅ /etc/passwd:用户信息✅ /etc/fstab:挂载配置✅ /etc/ssh/sshd_config:SSH配置 |
/var | Variable Data | 运行时可变数据目录(内容随系统运行变化): ✅ /var/log:系统/应用日志✅ /var/lib:数据库/容器运行数据✅ /var/tmp:临时文件(重启可能保留)✅ /var/spool:打印/邮件队列 |
/tmp | Temporary | 全局临时文件目录,所有用户可读写,重启后自动清空 |
/run | 运行时数据 | 进程PID/套接字/锁文件等,启动时创建、重启清空(替代旧版 /var/run) |
🧊系统/🚀硬件交互目录
| 目录 | 说明 | 核心作用 |
|---|---|---|
/boot | 启动目录 | 系统启动文件(内核 vmlinuz、GRUB配置、initramfs),建议单独分区 |
/dev | Devices | 硬件设备文件目录(一切皆文件): ✅ /dev/sda:硬盘✅ /dev/cdrom:光驱✅ /dev/null:空设备(数据黑洞) |
/proc | Processes(虚拟文件系统) | 内核/进程实时状态(如 /proc/cpuinfo//proc/meminfo),不占用磁盘空间 |
/sys | System(虚拟文件系统) | 内核与硬件交互目录,结构化管理设备/驱动(比 /proc 更规范) |
📦其他常用目录
| 目录 | 核心作用 |
|---|---|
./ | 当前目录(代表终端所在位置) |
../ | 上级目录(根目录的上级是自身) |
/mnt | 手动挂载临时目录(如挂载U盘/硬盘) |
/media | 可移动设备自动挂载点(U盘/光驱) |
/srv | 服务数据目录(如HTTP/FTP站点数据) |
/lost+found | 文件系统修复后,丢失文件的找回目录(由 fsck 命令生成) |
swapfile | 交换文件(虚拟内存,替代分区形式的swap) |
/snap | Snap软件包安装目录(Ubuntu专属) |
2.2 快速记忆指南
📌核心目录关键词速记
| 分类 | 目录集合 | 核心关键词 |
|---|---|---|
| 系统命令 | /bin、/sbin | 可执行、管理员/普通用户 |
| 配置文件 | /etc | 全局、文本、可编辑 |
| 用户数据 | /home、/root | 家目录、权限隔离 |
| 可变数据 | /var、/tmp、/run | 日志、临时、重启清空 |
| 应用资源 | /usr、/opt | 软件、共享库、第三方 |
| 系统/硬件 | /dev、/proc、/sys | 虚拟文件、硬件交互 |
📋易混目录对比
/tmpvs/var/tmp:前者重启清空,后者可能保留;/libvs/usr/lib:前者为系统核心库,后者为应用库;/mntvs/media:前者手动挂载,后者自动挂载可移动设备;/sbinvs/usr/sbin:前者是核心管理命令,后者是非核心命令
3. Linux 文件类型
Linux 中「一切皆文件」,不同文件类型有明确的标识和用途,核心通过 ls -l 权限位首字符
识别。
3.1 核心文件类型
| 类型 | 权限位首字符 | 默认终端颜色 | 核心特征 & 典型示例 |
|---|---|---|---|
| 普通文件 | - | 白/黑色 | 最基础类型,存储数据/程序: ✅ 文本文件: README.md、/etc/passwd✅ 二进制: /bin/ls、nginx✅ 媒体文件: photo.jpg、video.mp4 |
| 目录 | d | 蓝色 | 用于组织文件的「文件夹」: ✅ /home(用户家目录)、/etc(配置目录)、/var/log(日志目录) |
| 符号链接 | l | 青/浅蓝色 | 文件/目录的「快捷方式」,指向原文件: ✅ bin -> usr/bin、lib -> usr/lib、python -> python3.8 |
| 字符设备 | c | 黄色 | 按字节读写的硬件设备(字符流): ✅ /dev/tty(终端)、/dev/null(空设备)、/dev/zero(零设备) |
| 块设备 | b | 黄色 | 按数据块读写的存储设备: ✅ /dev/sda(硬盘)、/dev/sdb1(硬盘分区)、/dev/cdrom(光驱) |
| 管道文件 | p | 黄色 | 进程间单向通信的FIFO管道: ✅ 通常由 mkfifo命令创建,如 mkfifo mypipe |
| 套接字 | s | 粉色 | 本地进程间网络通信的socket: ✅ /run/sshd.sock(SSH套接字)、/var/run/mysqld/mysqld.sock(MySQL套接字) |
3.2 特殊文件类型
3.2.1 硬链接
- 标识特征:权限位首字符仍为
-,与普通文件无视觉区别; - 核心特性:
- 多个文件名指向同一个 inode(文件唯一标识),删除任一链接不影响原文件;
- 无法跨文件系统创建,也不能链接目录;
- 创建命令:
ln 原文件 硬链接名(例:ln /etc/passwd passwd.link)。
3.2.2 软链接
核心定义: 软链接是指向原文件/目录的特殊文件,相当于Windows的「快捷方式」,自身仅存储原文件的路径,不包含实际数据。
核心特性:
- 跨文件系统:可链接不同分区 / 磁盘的文件 / 目录(硬链接不支持);
- 可链接目录:支持给目录创建软链接(硬链接不支持);
- 独立 inode:软链接有自己的 inode,与原文件无关;
- 失效性:删除 / 移动原文件后,软链接会变成「死链接」(终端显示红色闪烁);
- 权限特征:软链接权限始终显示
rwxrwxrwx,但实际访问权限由原文件决定。
创建命令:
ln -s 原文件/目录 软链接名(例:ln -s /usr/bin/python3.8 /usr/bin/python)[!warning]
⚠️ 避坑提醒
创建时原文件建议用绝对路径,若用相对路径,软链接移动后会变成「死链接」。
3.2.3 软链接 vs 硬链接
| 特性 | 软链接(符号链接) | 硬链接 |
|---|---|---|
| 权限位首字符 | l | -(同普通文件) |
| inode 属性 | 有独立 inode | 与原文件共享 inode |
| 跨文件系统 | 支持 | 不支持 |
| 链接目录 | 支持 | 不支持 |
| 原文件删除 | 软链接失效(死链接) | 不影响(仍可访问数据) |
| 权限显示 | 始终 rwxrwxrwx | 与原文件权限一致 |
| 存储内容 | 原文件的路径 | 与原文件共享数据 |
3.2.4 虚拟文件系统文件
- 存储特征:位于
/proc、/sys目录下,是内核动态生成的虚拟接口,不占用实际磁盘空间; - 核心用途:查看 / 修改系统 / 硬件状态,无需编辑,直接读取即可;
- 典型示例:
/proc/cpuinfo:CPU 硬件信息/proc/meminfo:内存使用状态/sys/class/net/eth0:网卡 eth0 的配置信息/proc/1/status:PID=1 的进程(init/systemd)状态
3.3 快速识别技巧
- 基础识别:执行
ls -l 文件名,看输出第一个字符(权限位首字符)即可判断类型; - 快捷命令:
file 文件名—— 直接输出文件详细类型(例:file /usr/bin/python→symbolic link to /usr/bin/python3.8); - 颜色辅助:终端默认颜色可快速区分(如目录蓝、软链接浅蓝、设备文件黄),但需注意:颜色可自定义,仅作辅助。
4. Linux 用户管理与文件权限
用户和权限是Linux系统安全的核心,核心逻辑是「通过用户/组划分身份,通过权限控制资源访问」。
4.1 用户与组管理
4.1.1 核心概念
| 类别 | 关键说明 |
|---|---|
| 用户 (User) | 系统登录身份,唯一UID标识: ✅ 超级用户 (root):UID=0,唯一且最高权限 ✅ 系统用户 (System User):UID = 1 ~ 999 (Ubuntu/Debian) ✅ 普通用户 (Regular User):UID >= 1000 ✅ 特殊用户 (nobody): UID = 65534 |
| 组 (Group) | 用户集合,唯一GID标识,方便批量授权: ✅ 主组:用户创建时默认归属的组 ✅ 附加组:用户额外加入的组(可多个) |
4.1.2 常用命令
| 操作目标 | 命令示例 | 核心说明 |
|---|---|---|
| 创建用户 | sudo useradd username | 默认不创建家目录 |
| 创建用户(带家目录) | sudo useradd -m username | 自动创建 /home/username 目录 |
| 设置用户密码 | sudo passwd username | 按提示输入密码(无回显) |
| 删除用户 | sudo userdel username | 仅删用户,保留家目录 |
| 删除用户(彻底清理) | sudo userdel -r username | 删除用户+家目录+相关数据 |
| 创建组 | sudo groupadd groupname | 创建新用户组 |
| 删除组 | sudo groupdel groupname | 仅删除组,不影响组内用户 |
| 添加用户到附加组 | sudo usermod -aG groupname username | -a=追加(必加,否则覆盖原有组) |
| 查看用户信息 | id username | 显示UID、GID、所属所有组 |
| 查看当前登录用户 | whoami / who / w | whoami仅看当前用户,w看详细状态 |
4.2 文件权限基础
4.2.1 权限标识
ls -l输出解读1
2
3
4
5
6
7-rw- r-- r-- 1 root root 2927 3月 18 13:53 /etc/passwd
# └┬┘ └┬┘ └┬┘ └─┬─┘ └─┬─┘
# | | | | └─ 文件所属组
# | | | └─ 文件所有者
# | | └─ 其他用户权限
# | └─ 组用户权限
# └─ 所有者权限
4.2.2 权限类型与数字表示
| 权限符号 | 含义 | 数字值 | 说明 |
|---|---|---|---|
r | 读权限 | 4 | 可查看文件内容 / 列出目录 |
w | 写权限 | 2 | 可修改文件 / 增删目录内容 |
x | 执行权限 | 1 | 可运行程序 / 进入目录 |
- | 无权限 | 0 | 无对应权限 |
- 权限数字计算规则
- 三类用户(所有者 / 组 / 其他)权限值相加,形成 3 位数字:
rw-r--r--= 644(6=4+2,4=4,4=4)rwxr-xr-x= 755(7=4+2+1,5=4+1,5=4+1)rwx------= 700(仅所有者有全部权限)
- 三类用户(所有者 / 组 / 其他)权限值相加,形成 3 位数字:
4.2.3 特殊权限
| 权限类型 | 符号标识 | 数字前缀 | 核心作用 |
|---|---|---|---|
| SUID | s | 4 | 执行文件时临时拥有所有者权限 例: -rwsr-xr-x = 4755 |
| SGID | s | 2 | 执行文件临时拥有组权限; 目录下新建文件继承目录组; 例: drwxrwsr-x = 2775 |
| Sticky Bit | t | 1 | 目录内仅文件所有者 /root 可删除; 例: /tmp = drwxrwxrwt = 1777 |
4.3 权限管理命令
4.3.1 修改权限
==chmod==
符号方式(直观,适合新手)
1
2
3
4chmod u+x file.txt # 所有者(u)加执行权限
chmod g-w file.txt # 组用户(g)移除写权限
chmod o=r file.txt # 其他用户(o)仅设读权限
chmod a+rw file.txt # 所有用户(a)加读写权限数字方式(高效,适合熟练使用)
1
2
3chmod 644 file.txt # 所有者rw,组/其他r(最常用文件权限)
chmod 755 script.sh # 所有者rwx,组/其他rx(最常用脚本/目录权限)
chmod -R 755 dir/ # 递归修改目录及所有子文件/目录权限
4.3.2 修改所有者 / 组
==chown==(需 root 权限)
1
2
3
4sudo chown user:group file.txt # 同时改所有者和组
sudo chown user file.txt # 仅改所有者
sudo chown :group file.txt # 仅改组(冒号不可省略)
sudo chown -R user:group dir/ # 递归修改目录及内容
4.3.3 核心区别
目录 vs 文件权限
权限 目录作用 文件作用 x能否进入目录( cd 目录)能否执行程序 / 脚本 w能否在目录内创建 / 删除 / 重命名 能否修改文件内容 r能否列出目录内文件( ls)能否查看文件内容
4.4 典型实操场景
场景 1:让脚本可执行
1
2$ chmod +x myscript.sh # 等价于 chmod a+x myscript.sh
$ ./myscript.sh # 执行脚本(需在脚本所在目录)场景 2:创建团队共享目录
1
2
3
4$ sudo mkdir /share # 创建共享目录
$ sudo chown :team /share # 设置目录所属组为team
$ sudo chmod 2775 /share # SGID+所有者/组rwx,其他rx
# 效果:团队成员可读写编辑,新文件自动继承team组,避免权限混乱场景 3:创建个人私密目录
1
$ chmod 700 ~/private # 仅自己(所有者)rwx,组/其他无任何权限
4.5 核心配置文件
所有文件均位于 /etc 目录,是用户 / 组管理的核心配置:
/etc/passwd—— 用户账户信息文件- 作用:存储所有用户基本信息(无密码),所有用户可读、root 可写(权限通常 644)。
- 格式(冒号分隔):
用户名:密码占位符:UID:GID:描述:家目录:登录Shell - 示例:
ubuntu:x:1000:1000:Ubuntu User:/home/ubuntu:/bin/bashx:密码占位符,真实密码存于/etc/shadow。
/etc/shadow—— 密码安全文件- 作用:存储加密密码 + 密码策略,仅 root 可读写(权限必须 600/000,否则泄露风险)。
- 格式:
用户名:加密密码:最后修改时间:最小修改间隔:最大有效期:警告期:宽限期:过期时间:保留 - 示例:
ubuntu:$6$abc123...:19432:0:99999:7:::- 加密密码:
$6$=SHA-512 加密,*/!表示账号锁定; 99999:密码永不过期。
- 加密密码:
/etc/group—— 用户组信息文件- 作用:存储所有组信息,所有用户可读、root 可写(权限通常 644)。
- 格式:
组名:密码占位符:GID:附加组成员列表 - 示例:
sudo:x:27:ubuntu,admin- 附加组成员:逗号分隔,仅显示附加组(主组在
/etc/passwd中)。
- 附加组成员:逗号分隔,仅显示附加组(主组在
[!note]
🔗三者关联逻辑
/etc/passwd定义用户基本信息,/etc/group定义组,通过 GID 关联用户主组;- 密码从
/etc/passwd分离到/etc/shadow,提升安全性;- 一个用户 = 1 个主组 + N 个附加组(附加组在
/etc/group中体现)。
[!warning]
⚠️核心注意事项
- 最小权限原则:仅授予必要权限,禁止给文件 / 目录设置
777(所有用户可读写执行);- root 使用规范:日常用普通用户,需提权时用
sudo,避免直接登录 root;- 分组策略:按业务 / 团队分组,批量授权比单独授权更高效;
- 敏感文件保护:
/etc/shadow权限必须为 600,/etc/passwd//etc/group禁止设为 777。
5. Linux 变量
Linux 变量分为「全局变量」和「环境变量」,核心区别是作用域不同(是否能被子Shell继承),合理配置变量是系统定制和程序运行的基础。
5.1 变量核心类型
| 变量类型 | 作用域 | 创建/生效方式 | 典型示例 |
|---|---|---|---|
| 全局变量 | 仅当前Shell/脚本生效,子Shell不可见 | 直接赋值(如 var=123) | name="ubuntu"、count=5 |
| 环境变量 | 当前Shell + 所有子Shell生效 | 用 export 标记(如 export var=123) | PATH、JAVA_HOME、EDITOR |
[!tip]
快速区分
全局变量:“局部有效”,仅当前终端/脚本能用;
环境变量:“全局有效”,当前终端及打开的子终端都能用。
5.2 变量常用操作
| 操作目标 | 命令示例 | 核心说明 |
|---|---|---|
| 查看所有环境变量 | env / printenv | 仅列出环境变量(不含全局变量/内置变量),printenv PATH 可只看指定变量 |
| 查看所有变量 | set | 包含全局变量 + 环境变量 + Shell内置变量(输出较多,可加 grep 过滤:`set |
| 取消变量 | unset 变量名 | 全局/环境变量都适用(例:unset JAVA_HOME) |
| 临时设置环境变量 | export PATH=$PATH:/new/path | 仅当前Shell生效,关闭终端/重启系统后失效 |
| 永久设置环境变量 | 写入配置文件(见下文) | 重启Shell/系统后仍生效 |
5.3 永久配置变量:配置文件选择
不同配置文件的作用域和加载时机不同,需根据需求选择,避免配置混乱:
5.3.1 配置文件分类(按作用域)
| 配置范围 | 推荐文件 | 加载时机 | 核心优势 |
|---|---|---|---|
| 全局(所有用户) | /etc/profile.d/*.sh | 所有用户登录时加载 | 集中管理(新建 .sh 文件存放变量),便于卸载,不污染系统核心配置 |
| 全局(所有用户) | /etc/bash.bashrc | 每次终端启动时加载 | 所有用户、所有进程共享,适合全局别名/函数(如 ll='ls -l') |
| 个人(仅当前用户) | ~/.bash_profile | 仅用户登录时加载一次 | 适合个人环境变量(如 PATH、JAVA_HOME),避免重复赋值 |
| 个人(仅当前用户) | ~/.bashrc | 每次终端启动/切换Shell加载 | 适合个人别名、函数、提示符(PS1),修改后即时生效(source ~/.bashrc) |
5.3.2 配置实操步骤(以设置 JAVA_HOME 为例)
场景1:全局生效(所有用户可用)
1
2
3
4
5
6
7
8
9
10
11
12# 1. 创建专属配置文件(推荐方式,避免修改系统原文件)
$ sudo vi /etc/profile.d/java.sh
# 2. 写入变量配置
$ export JAVA_HOME=/usr/local/jdk1.8
$ export PATH=$PATH:$JAVA_HOME/bin
# 3. 赋予执行权限
$ sudo chmod +x /etc/profile.d/java.sh
# 4. 立即生效(无需重启)
$ source /etc/profile.d/java.sh场景 2:仅当前用户生效
1
2
3
4
5
6
7
8
9# 1. 编辑个人配置文件
$ vi ~/.bash_profile
# 2. 写入变量配置
$ export JAVA_HOME=/usr/local/jdk1.8
$ export PATH=$PATH:$JAVA_HOME/bin
# 3. 立即生效
$ source ~/.bash_profile
5.3.3 核心注意事项
- 生效方式:修改配置文件后,需执行
source 文件名或重新登录终端,配置才会生效; - PATH 赋值:必须保留原有
$PATH(如PATH=$PATH:/new/path),否则会覆盖系统默认路径,导致基础命令(ls、cd)失效; - 文件优先级:
~/.bash_profile加载优先级高于~/.bashrc,登录 Shell 先加载前者,再通过前者加载后者; - 避免重复:环境变量建议写在
~/.bash_profile(仅加载一次),别名 / 函数写在~/.bashrc(每次加载)。
5.4 常用内置环境变量
| 变量名 | 含义 | 示例输出 |
|---|---|---|
PATH | 命令搜索路径 | /usr/bin:/bin:/usr/sbin |
HOME | 当前用户家目录 | /home/ubuntu |
USER | 当前登录用户名 | ubuntu |
SHELL | 当前使用的 Shell | /bin/bash |
PWD | 当前工作目录 | /home/ubuntu/work |
PS1 | 终端提示符格式 | \u@\h:\w\$ |
Shell命令
1. Shell是什么?
2. Shell 配置文件
Shell 配置文件决定了终端的环境变量、别名、提示符等核心行为,核心分为「登录式」和「非登录式」两类,理解加载顺序和使用规范是关键。
2.1 核心配置文件清单
| 路径 | 生效级别 | 加载类型 | 核心功能 | 关键说明 |
|---|---|---|---|---|
/etc/profile | 全局 | 登录式 | 设置系统全局环境变量、umask,自动调用 /etc/profile.d/*.sh | 所有用户登录时优先加载 |
~/.bash_profile | 用户 | 登录式 | 个人登录专属配置,通常会调用 ~/.bashrc | 优先级最高,不存在则走备选 |
~/.bash_login | 用户 | 登录式 | 登录配置备选文件 | 仅 ~/.bash_profile 不存在时加载 |
~/.profile | 用户 | 登录式 | 兼容 POSIX 标准的登录配置 | 前两个都不存在时加载 |
/etc/bash.bashrc | 全局 | 非登录式 | 系统级别名、函数、提示符配置(部分系统为 /etc/.bashrc) | 所有用户新开终端时加载 |
~/.bashrc | 用户 | 非登录式 | 个人别名、函数、提示符,每次新开终端均加载 | 最常用的个性化配置文件 |
/etc/profile.d/*.sh | 全局 | 登录式扩展 | 被 /etc/profile 循环加载,集中管理应用环境变量 | 推荐存放全局环境变量(如JDK) |
2.2. 配置文件加载顺序
交互式登录 Shell(SSH连接/系统登录)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15flowchart TD
A[用户登录/SSH连接] --> B[加载系统全局登录配置]
B --> B1[/etc/profile/]
B1 --> B2[执行/etc/profile.d/*.sh<br/>加载应用全局变量]
B2 --> C[加载用户专属登录配置]
C --> C1{存在~/.bash_profile?}
C1 -- 是 --> C2[执行~/.bash_profile]
C1 -- 否 --> C3{存在~/.bash_login?}
C3 -- 是 --> C4[执行~/.bash_login]
C3 -- 否 --> C5[执行~/.profile]
C2 --> D[调用用户非登录配置]
D --> D1[source ~/.bashrc]
D1 --> E[登录会话准备完毕]
C4 --> E
C5 --> E交互式非登录 Shell(新开终端 / 执行 bash)
1
2
3
4
5
6flowchart TD
A[打开新终端/执行bash命令] --> B[加载系统全局非登录配置]
B --> B1[/etc/bash.bashrc/]
B1 --> C[加载用户专属非登录配置]
C --> C1[~/.bashrc]
C1 --> D[终端会话准备完毕]
2.3 最佳实践:配置该写在哪里?
- 配置类型与文件对应
| 配置内容类型 | 推荐存放文件 | 核心原因 |
|---|---|---|
| 全局环境变量(PATH、JAVA_HOME) | /etc/profile.d/*.sh | 模块化管理,便于卸载,所有用户登录后生效,不污染系统核心文件 |
| 用户环境变量(个人 PATH、EDITOR) | ~/.bash_profile | 仅登录时加载一次,避免重复赋值,优先级高且不影响每次终端启动 |
| 别名 / 函数 / 提示符(ll=’ls -l’) | ~/.bashrc | 每次新开终端加载,修改后即时生效,仅对当前用户生效 |
优先级与覆盖规则
加载顺序:系统全局配置 → 用户专属配置(后加载的会覆盖先加载的);
示例:若
/etc/profile设置PATH=/usr/bin,~/.bashrc设置PATH=~/bin:$PATH,最终生效的是~/bin:/usr/bin。修改后生效方法(无需重启系统)
配置文件类型 生效命令 说明 全局登录配置 sudo source /etc/profile仅当前终端生效,新登录用户自动加载最新配置 用户登录配置 source ~/.bash_profile立即生效,无需重启终端 非登录配置(.bashrc) source ~/.bashrc或. ~/.bashrc简写方式更高效,修改别名 / 函数后必执行 切换用户生效 su - 用户名(带横杠)加载目标用户的完整登录配置,不加横杠仅切换身份不加载配置
2.4 常见问题排查
环境变量不生效
- 检查文件路径拼写(如
/etc/.bashrcvs/etc/bash.bashrc,不同系统命名不同); - 确认配置文件有执行权限:
chmod +x /etc/profile.d/java.sh; - 登录 Shell 需执行
source或重启终端,非登录 Shell 需执行source ~/.bashrc。
- 检查文件路径拼写(如
别名不生效
- 确认别名定义在
~/.bashrc中(而非~/.bash_profile); - 执行
source ~/.bashrc刷新配置; - 避免别名与系统命令重名(如自定义
ls会覆盖系统默认ls)。
- 确认别名定义在
多配置文件冲突
- 用
echo $变量名查看最终值(如echo $PATH),定位覆盖点; - 按加载顺序排查:先看
/etc/profile,再看~/.bash_profile,最后看~/.bashrc; - 优先将环境变量写在
~/.bash_profile,避免在~/.bashrc中重复定义。
- 用
2.5 进阶优化:让配置更易维护
2.5.1 模块化管理(推荐)
在 ~/.bashrc 中引入独立配置目录,拆分不同功能的配置:
1 | # 在 ~/.bashrc 末尾添加以下内容 |
- 用法:创建
~/.bashrc.d目录,将别名、函数拆分为alias.sh、function.sh等文件,便于管理。
2.5.2 避免重复加载
- 登录式配置(如 /etc/profile)仅定义环境变量,不写终端交互配置;
- 非登录式配置(如 ~/.bashrc)仅写别名、函数,避免重复定义环境变量。
2.5.3 权限控制
系统全局配置(
/etc目录)需用sudo编辑,权限建议为644;用户配置文件(
~/.bashrc等)权限建议为644,避免777带来的安全风险。
dpkg 工具
dpkg 是 Debian/Ubuntu 系统的底层包管理工具,专注于本地 .deb 包的安装、查询、卸载和构建,是 APT 工具的基础(APT 负责自动解决依赖,dpkg 需手动处理)。
1. 核心概念
- 定位:底层包管理工具,不自动解决依赖,需手动处理;
- 管理范围:本地下载的
.deb包、已安装的系统包; - 适用系统:Debian、Ubuntu 及衍生发行版。
2. 常用命令速查表
| 功能分类 | 命令格式 | 核心说明 | 典型示例 |
|---|---|---|---|
| 安装软件包 | dpkg -i <包名>.deb | 安装本地 deb 包(需手动解决依赖) | dpkg -i nginx_1.24.0-1_amd64.deb |
dpkg --install <包名>.deb | 等同于 -i,完整写法 | dpkg --install mysql.deb | |
| 查看包信息 | dpkg -l [<包名>] | 列出已安装包(不加包名显示所有,加包名精准查询) | dpkg -l nginx |
dpkg -L <包名> | 查看指定包的所有安装文件路径(配置文件、可执行文件等) | dpkg -L vim | |
dpkg -s <包名> | 查看指定包的详细信息(版本、依赖、描述、状态等) | dpkg -s docker | |
dpkg -c <包名>.deb | 查看本地 deb 包内的文件结构(未安装时预览) | dpkg -c redis.deb | |
| 卸载软件包 | dpkg -r <包名> | 卸载软件(保留配置文件,可重新安装恢复配置) | dpkg -r nginx |
dpkg -P <包名> | 彻底卸载(删除软件 + 所有配置文件) | dpkg -P nginx | |
dpkg --purge <包名> | 等同于 -P,完整写法 | dpkg --purge mysql | |
| 修复/检查 | dpkg --configure -a | 修复未配置完成的包(安装失败、依赖缺失后常用) | dpkg --configure -a |
dpkg -C | 检查系统中损坏的包(依赖缺失、配置异常) | dpkg -C | |
| 其他常用 | dpkg -S <文件路径> | 反向查找:指定文件属于哪个已安装包 | dpkg -S /usr/bin/nginx |
dpkg --get-selections | 列出所有已安装包的状态(install/purge/remove) | `dpkg –get-selections | |
| 构建 deb 包 | dpkg -b <包目录> | 将打包目录构建为 deb 包(核心打包命令) | dpkg -b helloworld_1.0.0-1_amd64 |
3. deb 包内部结构(核心)
3.1 核心目录与文件
deb 包解压后核心目录为 DEBIAN/(必须大写),包含包的元数据和生命周期脚本,其余目录遵循 FHS 规范(如 /usr/bin、/etc 等):
1 | # 典型 deb 包目录结构 |
3.2 关键文件说明
3.2.1 control 文件(核心元数据,必填)
| 字段名 | 示例值 | 含义与规范 |
|---|---|---|
Package | helloworld | 包名:小写、无空格/特殊字符,唯一标识 |
Version | 1.0.0-1 | 版本号:格式 主版本.次版本.修订版-发行版 |
Architecture | amd64 | 架构:amd64/i386/arm64/all(跨架构) |
Section | utils | 类别:utils(工具)/network(网络)/web(Web)/devel(开发) |
Priority | optional | 优先级:optional(可选)/required(必需)/important(重要) |
Maintainer | Your Name <your@email.com> | 维护者:姓名 <邮箱> |
Description | A simple hello world program | 描述:第一行简短描述,后续行详细描述(需缩进2个空格) |
Depends | bash | 依赖:运行所需包,多个用逗号分隔(如 bash, coreutils) |
3.2.2 生命周期脚本(可选,钩子函数)
| 脚本文件 | 执行时机 | 作用示例 |
|---|---|---|
preinst | 安装包之前 | 检查系统环境、备份旧配置 |
postinst | 安装包之后 | 启动服务、创建快捷方式、打印安装成功提示 |
prerm | 卸载包之前 | 停止服务、确认卸载操作 |
postrm | 卸载包之后 | 清理残留文件、删除快捷方式 |
3.2.3 辅助文件
copyright:版权声明、开源协议;changelog:版本更新记录、修改内容。
4. 手动构建 deb 包(完整示例)
以构建 helloworld 包为例,全程实操可直接复用:
前置准备:安装打包工具
1
$ sudo apt update && sudo apt install -y dpkg-dev
搭建目录结构
1
2
3
4
5
6
7
8# 创建包根目录(命名规范:包名_版本_架构)
$ mkdir -p helloworld_1.0.0-1_amd64/DEBIAN
# 创建程序安装目录(遵循FHS,可执行文件放/usr/bin)
$ mkdir -p helloworld_1.0.0-1_amd64/usr/bin
# 创建必要脚本文件
$ touch helloworld_1.0.0-1_amd64/DEBIAN/{control,postinst,prerm}
# 赋权(避免打包权限异常)
$ chown -R $USER:$USER helloworld_1.0.0-1_amd64/编写核心文件
程序本体(/usr/bin/helloworld)
1
2
3
4
5
6
7
8$ cat > helloworld_1.0.0-1_amd64/usr/bin/helloworld << 'EOF'
#!/bin/bash
echo "Hello World! 这是自定义 deb 包示例"
echo "当前时间:$(date +%Y-%m-%d\ %H:%M:%S)"
EOF
# 添加执行权限
$ chmod +x helloworld_1.0.0-1_amd64/usr/bin/helloworldcontrol 元数据文件
1
2
3
4
5
6
7
8
9
10
11
12$ cat > helloworld_1.0.0-1_amd64/DEBIAN/control << 'EOF'
Package: helloworld
Version: 1.0.0-1
Architecture: amd64
Section: utils
Priority: optional
Maintainer: Your Name <your@email.com>
Description: A simple hello world program
This is a custom deb package example for learning
it prints hello world and current time.
Depends: bash
EOF安装后脚本(postinst)
1
2
3
4
5$ cat > helloworld_1.0.0-1_amd64/DEBIAN/postinst << 'EOF'
#!/bin/bash
echo "✅ helloworld 安装成功!执行 helloworld 即可运行程序"
EOF
$ chmod +x helloworld_1.0.0-1_amd64/DEBIAN/postinst卸载前脚本(prerm)
1
2
3
4
5
6$ cat > helloworld_1.0.0-1_amd64/DEBIAN/prerm << 'EOF'
#!/bin/bash
echo "⚠️ 即将卸载 helloworld,确认请按回车..."
read -n 1
EOF
$ chmod +x helloworld_1.0.0-1_amd64/DEBIAN/prerm
打包成 deb 包
1
$ dpkg -b helloworld_1.0.0-1_amd64 # 生成 helloworld_1.0.0-1_amd64.deb
安装与验证
1
2
3
4
5
6
7
8
9
10
11
12# 安装包
$ sudo dpkg -i helloworld_1.0.0-1_amd64.deb
# 验证程序运行
$ helloworld
# 输出:
Hello World! 这是自定义 deb 包示例
当前时间:2026-03-18 20:25:54
# 查看包信息
$ dpkg -s helloworld # 查看详细信息
$ dpkg -L helloworld # 查看安装文件路径卸载
1
2
3$ sudo dpkg -r helloworld # 保留配置卸载
# 或
$ sudo dpkg -P helloworld # 彻底卸载(删除所有)
5. 自动化构建 deb 包脚本(复用模板)
以下脚本可快速生成 deb 包的基础结构,只需传入包目录和包名即可:
1 |
|
使用方式
1
2
3
4
5# 1. 赋予脚本执行权限
$ chmod +x build_deb.sh
# 2. 执行脚本(参数1:包目录,参数2:输出包名)
$ ./build_deb.sh myapp_0.1.2_amd64 myapp_0.1.2_amd64.deb
6. 核心注意事项
- 依赖问题:dpkg 不自动解决依赖,安装失败时需用
sudo apt -f install修复; - 目录规范:
DEBIAN目录必须大写,否则打包失败; - 权限问题:脚本文件(postinst/prerm 等)必须添加执行权限(
chmod +x); - 架构匹配:构建包的架构需与目标系统一致(如 amd64/arm64),否则无法安装;
- FHS 规范:程序文件需按 FHS 放置(可执行文件
/usr/bin、配置文件/etc等)。
嵌入式Linux 核心操作速查表
本表专为嵌入式Linux开发量身定制,剔除桌面Linux冗余命令,覆盖入门基础→开发调试→系统运维全流程高频操作,重点标注嵌入式专属场景用法,可直接作为日常开发手册使用。
1. 基础核心:文件与目录操作
| 命令 | 核心功能 | 常用示例 | 嵌入式高频参数&场景提示 |
|---|---|---|---|
pwd | 查看当前工作目录绝对路径 | pwd | 调试脚本、确认挂载路径时必用,避免相对路径操作失误 |
cd | 切换工作目录 | cd /home 进入指定目录cd .. 返回上一级cd ~ 进入用户家目录cd / 进入根目录 | 嵌入式开发中常切换到 /dev(设备文件)、/sys(内核设备树)、/mnt(挂载目录) |
ls | 列出目录内容与文件属性 | ls 列出当前目录文件ls -l 详细列表(权限、大小、用户)ls -lha 显示所有文件(含隐藏)+人性化大小单位 | 嵌入式必用ls -l /dev 查看串口、GPIO等设备节点是否存在、权限是否正常 |
mkdir | 创建目录 | mkdir test 创建单级目录mkdir -p a/b/c 递归创建多级目录 | 挂载U盘/SD卡、创建NFS共享目录时常用-p参数,避免层级报错 |
rm | 删除文件/目录 | rm test.txt 删除文件rm -rf test_dir 递归强制删除目录(含所有内容) | ⚠️ 高危命令!严禁在开发板根目录执行rm -rf /,会直接销毁根文件系统;仅用于删除确定的文件/目录 |
cp | 复制文件/目录 | cp test.txt /mnt/ 复制文件到目标路径cp -r test_dir /home/ 递归复制目录 | 拷贝驱动模块(.ko)、可执行程序到开发板,备份设备树、配置文件必用 |
mv | 移动/重命名文件 | mv old.txt new.txt 重命名mv test.txt /mnt/ 移动文件到目标路径 | 替换系统文件、修改配置文件名、移动固件文件常用 |
touch | 创建空文件/修改文件时间戳 | touch test.c 创建空C语言源码文件 | 快速创建源码、配置文件,调试文件系统读写权限 |
find | 系统内搜索文件 | find / -name "*.ko" 全局搜索驱动模块find /dev -name "tty*" 搜索串口设备节点 | 嵌入式开发中找驱动、设备节点、配置文件的核心命令,解决”文件找不到”问题 |
ln | 创建链接文件 | ln -s /dev/ttyUSB0 /dev/uart0 创建软链接 | 创建设备节点别名、库文件软链接,适配程序固定设备路径需求 |
2. 文件读写:内容查看与编辑
| 命令 | 核心功能 | 常用示例 | 嵌入式高频参数&场景提示 |
|---|---|---|---|
cat | 查看小型文件完整内容 | cat test.c 查看源码cat /proc/cpuinfo 查看CPU信息 | 快速查看短配置文件、内核虚拟文件(/proc、/sys)内容,不适合大文件 |
more/less | 分页查看大文件内容 | more dmesg.log 分页查看日志less /var/log/messages 可上下翻页查看系统日志 | 嵌入式必用less查看内核启动日志、大的编译日志,支持/关键词搜索内容,按q退出 |
head/tail | 查看文件首尾内容 | head -n 20 test.txt 查看前20行tail -n 10 test.txt 查看最后10行tail -f /var/log/messages 实时刷新日志 | 核心用法tail -f 实时监控系统日志、应用运行日志,调试程序崩溃、驱动加载报错必用 |
grep | 文本内容关键词搜索 | grep "error" dmesg.log 搜索日志中的报错`dmesg | grep “tty”` 过滤内核串口相关日志 |
vi/vim | 终端文本编辑器 | vi test.c 新建/打开文件基础操作: i 进入编辑模式ESC 退出编辑模式:wq 保存并退出:q! 强制不保存退出/xxx 向下搜索关键词:%s/old/new/g 全局替换 | ⚠️ 嵌入式裁剪系统默认只有vi,无桌面编辑器,必须掌握基础操作;用于修改启动脚本、网络配置、驱动源码、设备树文件 |
3. 系统管控:权限、进程与资源监控
| 命令 | 核心功能 | 常用示例 | 嵌入式高频参数&场景提示 |
|---|---|---|---|
chmod | 修改文件/目录权限 | chmod 777 test 给所有用户读写执行权限chmod 666 /dev/ttyS0 给串口设备读写权限chmod +x app 给程序添加执行权限 | 嵌入式核心操作,/dev下的设备节点、交叉编译的可执行程序,必须配置正确权限才能访问/运行 |
chown | 修改文件所属用户/用户组 | chown root:root test.ko 把驱动模块归属改为root | 嵌入式系统多为root用户,主要用于修改系统文件、设备节点的归属,避免权限不足 |
su/sudo | 切换用户/提权执行 | su root 切换到root用户sudo ifconfig eth0 up 以root权限执行命令 | 嵌入式系统默认以root登录,多用户场景下用于提权操作硬件、修改系统配置 |
ps | 查看系统进程列表 | ps aux 查看所有进程详细信息`ps | grep app` 过滤指定应用进程 |
top/htop | 实时监控系统资源 | top 实时查看CPU、内存占用、进程状态 | 嵌入式调试核心工具,定位CPU占用过高、内存泄漏问题,裁剪系统可能无htop,默认用top |
kill | 终止进程 | kill 1234 终止PID为1234的进程kill -9 1234 强制终止进程 | 关闭卡死的应用、后台进程,配合ps获取进程PID使用 |
free | 查看系统内存使用情况 | free -h 人性化单位显示内存总量、已用、空闲 | 调试内存泄漏、评估程序内存占用,确认开发板内存是否正常识别 |
uname | 查看系统内核信息 | uname -a 查看完整内核版本、CPU架构、编译时间 | 确认开发板内核版本、CPU架构(arm/aarch64/riscv),匹配交叉编译工具链必用 |
dmesg | 查看内核启动/运行日志 | dmesg 查看完整内核日志`dmesg | grep “error”过滤内核报错<br>dmesg |
df | 查看磁盘/存储分区占用 | df -h 查看所有分区挂载情况、使用率 | 查看EMMC、SD卡、U盘分区是否正常挂载,评估存储剩余空间,避免固件升级空间不足 |
4. 网络通信:开发板与主机交互核心
| 命令 | 核心功能 | 常用示例 | 嵌入式高频参数&场景提示 |
|---|---|---|---|
ifconfig/ip addr | 查看/配置网络接口 | ifconfig 查看所有网口IPifconfig eth0 192.168.1.10 netmask 255.255.255.0 给网口配置静态IPifconfig eth0 up/down 启用/关闭网口 | 嵌入式开发必用,配置开发板与主机同网段IP,保证网络互通;新系统推荐用ip addr替代ifconfig |
ping | 测试网络连通性 | ping 192.168.1.2 ping主机IPping www.baidu.com 测试外网连通 | 调试网络第一命令,排查网口、网线、IP配置、网关问题,确认开发板与主机是否互通 |
ssh | 远程登录开发板/主机 | ssh root@192.168.1.10 远程登录开发板 | 替代串口,通过网络远程控制开发板,传输文件、调试程序,比串口更稳定高效 |
scp | 网络文件传输 | scp app root@192.168.1.10:/home/ 主机传文件到开发板scp root@192.168.1.10:/home/test.ko ./ 开发板拷文件到主机 | 嵌入式开发跨主机传文件最常用命令,无需搭建额外服务,只要ssh互通即可使用 |
tftp | TFTP文件下载/上传 | tftp -g -r app 192.168.1.2 从主机TFTP服务器下载文件到开发板 | U-Boot阶段下载内核、设备树、根文件系统,Linux系统下小文件快速传输,嵌入式开发必备 |
mount(NFS) | 挂载NFS网络文件系统 | mount -t nfs 192.168.1.2:/home/nfs /mnt -o nolock 挂载主机NFS共享目录到开发板/mnt | ⚠️ 嵌入式开发核心技巧!挂载后开发板可直接访问主机文件,无需反复传输,调试驱动、应用时效率拉满 |
netstat/ss | 查看网络端口、连接状态 | netstat -anp 查看所有端口监听情况netstat -rn 查看路由表 | 调试TCP/UDP网络程序,确认端口是否正常监听、网络连接是否建立 |
wget | 网络下载文件 | wget https://xxx.com/test.tar.gz 下载线上源码/固件 | 开发板联网后,直接下载源码包、固件、依赖库,无需中转主机 |
5. 包管理:压缩与解压
嵌入式Linux源码包、固件包基本为tar压缩格式,核心掌握tar命令即可,以下为高频用法:
| 命令 | 核心功能 | 常用示例 | 高频参数说明 |
|---|---|---|---|
tar | 打包/解压tar系列压缩包 | tar -czvf test.tar.gz dir/ 把目录打包为gzip压缩包tar -xzvf test.tar.gz 解压.gz/.tgz包tar -xjvf test.tar.bz2 解压.bz2包tar -xJvf test.tar.xz 解压.xz包 | -c 打包-x 解压-z gzip格式(最常用)-j bz2格式-J xz格式-v 显示过程-f 指定文件名(必须放在参数最后) |
zip/unzip | zip格式压缩/解压 | zip test.zip test.txt 压缩文件unzip test.zip 解压zip包 | 用于解压Windows下传输的zip格式文件,嵌入式系统需提前安装unzip工具 |
6. 嵌入式专属:开发调试核心命令
| 命令 | 核心功能 | 常用示例 | 嵌入式场景说明 |
|---|---|---|---|
minicom/screen | 串口终端调试工具 | minicom -D /dev/ttyUSB0 打开USB串口screen /dev/ttyUSB0 115200 串口连接,波特率115200 | 主机与开发板交互的基础工具,U-Boot调试、内核启动、无网络场景下的唯一控制方式,必配波特率、数据位、停止位、无流控 |
交叉编译工具链(arm-linux-gcc等) | 跨架构编译程序 | arm-linux-gcc hello.c -o hello 编译32位ARM程序aarch64-linux-gnu-gcc hello.c -o hello 编译64位ARM程序 | 嵌入式开发核心!在x86主机上编译出开发板CPU架构可运行的程序,必须和开发板内核、架构、根文件系统匹配 |
insmod/rmmod | 内核驱动模块加载/卸载 | insmod gpio_drv.ko 加载驱动模块rmmod gpio_drv 卸载驱动模块(不加.ko) | 字符设备驱动、GPIO、串口等驱动调试的核心命令,配合dmesg查看驱动加载日志 |
lsmod/modinfo | 查看模块信息 | lsmod 查看所有已加载的内核模块modinfo gpio_drv.ko 查看驱动模块的详细信息 | 确认驱动是否加载成功、查看模块依赖,调试驱动依赖问题 |
dtc | 设备树编译/反编译 | dtc -I dts -O dtb -o test.dtb test.dts dts编译为dtbdtc -I dtb -O dts -o test.dts test.dtb dtb反编译为dts | 设备树开发调试必备,修改设备树后编译,或反编译固件中的dtb文件排查硬件配置问题 |
devmem | 物理内存/寄存器读写 | devmem 0x12345678 32 读取32位寄存器值devmem 0x12345678 32 0x00000001 写入寄存器值 | 硬件调试神器!无需写驱动,直接读写CPU寄存器、GPIO外设寄存器,快速验证硬件功能 |
gpioset/gpioget | 标准GPIO字符设备操作 | gpioget gpiochip0 10 读取GPIO0_10电平gpioset gpiochip0 10=1 设置GPIO0_10输出高电平 | 新内核(4.8+)推荐的GPIO操作方式,替代传统sysfs方式,调试GPIO外设必用 |
mount/umount(存储设备) | 挂载/卸载本地存储 | mount /dev/mmcblk0p1 /mnt 挂载SD卡第一分区mount /dev/sda1 /mnt 挂载U盘mount -o remount,rw / 重新挂载根文件系统为可读写umount /mnt 卸载设备 | 嵌入式系统根文件系统默认只读,修改系统文件必须先重新挂载为可读写;挂载SD卡/U盘拷贝固件、日志 |
fw_printenv/fw_setenv | Linux下操作U-Boot环境变量 | fw_printenv bootargs 查看启动参数fw_setenv bootargs "console=ttyS0,115200" 修改启动参数 | 无需进入U-Boot,直接在Linux系统修改启动参数、开机自启动项,适配不同硬件配置 |
7. Shell快捷键与通用提效技巧
| 快捷键/语法 | 功能 |
|---|---|
Tab | 自动补全命令、文件名、路径,按2次列出所有匹配项,避免手动输入拼写错误 |
Ctrl + C | 强制终止当前正在运行的进程/命令,解决程序卡死、命令执行异常问题 |
Ctrl + L | 快速清屏,替代clear命令 |
Ctrl + D | 退出当前终端/用户登录 |
上下方向键 | 调出历史执行过的命令,无需重复输入 |
! | 执行上一条命令;!gcc 执行最近一条以gcc开头的命令 |
| ` | ` 管道符 |
>/>> 重定向 | > 覆盖输出到文件,例:dmesg > log.txt;>> 追加输出到文件,例:echo "test" >> config.txt |
[!Note]
嵌入式Linux操作注意事项
- 嵌入式Linux系统多为busybox裁剪定制,部分高级命令可能不存在,需自行移植或通过busybox调用;
- 操作
/dev、/sys、/proc下的内核/设备文件时,必须确认参数正确,避免误操作导致硬件异常、系统崩溃;- 交叉编译的程序必须与开发板CPU架构、内核版本、glibc库版本匹配,否则会出现
No such file or directory或无法执行的问题;- 所有高危操作(如
rm -rf、dd、寄存器写入)必须先确认路径/地址正确,再执行,避免不可逆的系统损坏。
嵌入式Linux学习笔记
ARM体系架构
Cortex-A7架构
armx7内核
Cortex-A7 架构?
armv7 内核?
- 指令集是指 cpu 硬件与软件之间的接口描述。
- CISC(复杂指令集):x86
- CISC(精简指令集): 8051、ARM、MIPS、RISC-V
- ARM:ARMV1~ARMV8
- ARMV7: A\R\M
- MIPS:…
- RISC-V:…
- 架构:主要指某一个处理器所使用的具体指令集。
- 处理器 / 内核:指令集是实物化。
- 芯片,多指 soc,由内核 + 其他模块组成。
ARM 的授权方式
指令集/架构授权
内核授权
使用授权
i.MX RT 是什么
1 | graph TD |
bcdedit /set hypervisorlaunchtype off






