Git 命令

  • 命令速查表

    img


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 auto
git config --global color.diff auto
git config --global color.branch auto
git 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]

  1. 核心流程git init/clonegit addgit commitgit push/pull 是日常开发最常用的基础流程。
  2. 分支管理:创建分支用 git checkout -b,合并用 git merge/cherry-pick,删除用 git branch -d/-D
  3. 版本回退git reset 用于丢弃未提交修改(慎用 –hard),git revert 用于撤销已提交修改(保留历史),git stash 用于临时暂存修改。






Linux基础

🐧核心理念

[!tip]
Linux 中最核心的设计思想之一:“一切皆文件”(所有硬件、进程、网络等资源都以文件形式呈现和管理)。


1. Linux环境

1.1 Ubuntu安装

Ubuntu 系统的具体安装步骤(如镜像下载、虚拟机配置、分区等)可参考网络教程,本文重点记录安装后必备的基础配置。


1.2 共享文件夹配置

  • 前期准备

    1. 打开 VMware → 选中当前 Ubuntu 虚拟机 → 点击「设置」→ 「选项」标签页;

    2. 找到「共享文件夹」→ 选择「总是启用」→ 添加需要共享的 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 核心目录说明

🏠 根目录 /(核心起点)

  • 整个文件系统的唯一根节点,所有目录/文件都挂载于此;

  • 包含系统运行必需的核心组件,禁止随意删除/修改。

🛠️ 系统核心命令/🧩库目录

目录全称/说明核心作用
/binBinaries(二进制文件)存放所有用户可用的基础系统命令(如 lscpmvbash),单用户模式可访问
/sbinSystem Binaries存放系统管理命令(仅root可用),如 ifconfigrebootfdisk
/libLibraries系统核心共享库(.so 文件),为 /bin//sbin 提供运行依赖(类Windows System32)
/lib6464位系统库目录64位系统特有的共享库目录

👤用户/📁应用资源目录

目录全称/说明核心作用
/usrUnix System Resources用户级程序核心目录(系统最大目录之一):
/usr/bin:普通用户应用命令
/usr/sbin:非核心管理命令
/usr/lib:应用共享库
/usr/local:手动安装的软件(不被包管理器管理)
/usr/share:文档/手册/图标等共享数据
/home用户家目录普通用户专属目录(如 /home/ubuntu),存放个人文件/配置,仅对自身可读写
/rootroot用户家目录管理员(root)的家目录,独立于 /home
/optOptional Software第三方大型软件安装目录(如Chrome、IDE),软件独立存放(如 /opt/google/chrome

⚙️配置/🧾可变数据目录

目录全称/说明核心作用
/etcEtcetera系统全局配置文件目录(文本格式,可直接编辑):
/etc/passwd:用户信息
/etc/fstab:挂载配置
/etc/ssh/sshd_config:SSH配置
/varVariable Data运行时可变数据目录(内容随系统运行变化):
/var/log:系统/应用日志
/var/lib:数据库/容器运行数据
/var/tmp:临时文件(重启可能保留)
/var/spool:打印/邮件队列
/tmpTemporary全局临时文件目录,所有用户可读写,重启后自动清空
/run运行时数据进程PID/套接字/锁文件等,启动时创建、重启清空(替代旧版 /var/run

🧊系统/🚀硬件交互目录

目录说明核心作用
/boot启动目录系统启动文件(内核 vmlinuz、GRUB配置、initramfs),建议单独分区
/devDevices硬件设备文件目录(一切皆文件):
/dev/sda:硬盘
/dev/cdrom:光驱
/dev/null:空设备(数据黑洞)
/procProcesses(虚拟文件系统)内核/进程实时状态(如 /proc/cpuinfo//proc/meminfo),不占用磁盘空间
/sysSystem(虚拟文件系统)内核与硬件交互目录,结构化管理设备/驱动(比 /proc 更规范)

📦其他常用目录

目录核心作用
./当前目录(代表终端所在位置)
../上级目录(根目录的上级是自身)
/mnt手动挂载临时目录(如挂载U盘/硬盘)
/media可移动设备自动挂载点(U盘/光驱)
/srv服务数据目录(如HTTP/FTP站点数据)
/lost+found文件系统修复后,丢失文件的找回目录(由 fsck 命令生成)
swapfile交换文件(虚拟内存,替代分区形式的swap)
/snapSnap软件包安装目录(Ubuntu专属)

2.2 快速记忆指南

📌核心目录关键词速记

分类目录集合核心关键词
系统命令/bin/sbin可执行、管理员/普通用户
配置文件/etc全局、文本、可编辑
用户数据/home/root家目录、权限隔离
可变数据/var/tmp/run日志、临时、重启清空
应用资源/usr/opt软件、共享库、第三方
系统/硬件/dev/proc/sys虚拟文件、硬件交互

📋易混目录对比

  • /tmp vs /var/tmp:前者重启清空,后者可能保留;
  • /lib vs /usr/lib:前者为系统核心库,后者为应用库;
  • /mnt vs /media:前者手动挂载,后者自动挂载可移动设备;
  • /sbin vs /usr/sbin:前者是核心管理命令,后者是非核心命令

3. Linux 文件类型

Linux 中「一切皆文件」,不同文件类型有明确的标识和用途,核心通过 ls -l 权限位首字符

识别。


3.1 核心文件类型

类型权限位首字符默认终端颜色核心特征 & 典型示例
普通文件-白/黑色最基础类型,存储数据/程序:
✅ 文本文件:README.md/etc/passwd
✅ 二进制:/bin/lsnginx
✅ 媒体文件:photo.jpgvideo.mp4
目录d蓝色用于组织文件的「文件夹」:
/home(用户家目录)、/etc(配置目录)、/var/log(日志目录)
符号链接l青/浅蓝色文件/目录的「快捷方式」,指向原文件:
bin -> usr/binlib -> usr/libpython -> 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 硬链接

  • 标识特征:权限位首字符仍为 -,与普通文件无视觉区别;
  • 核心特性
    1. 多个文件名指向同一个 inode(文件唯一标识),删除任一链接不影响原文件;
    2. 无法跨文件系统创建,也不能链接目录;
  • 创建命令ln 原文件 硬链接名(例:ln /etc/passwd passwd.link)。

3.2.2 软链接

  • 核心定义: 软链接是指向原文件/目录的特殊文件,相当于Windows的「快捷方式」,自身仅存储原文件的路径,不包含实际数据。

  • 核心特性:

    1. 跨文件系统:可链接不同分区 / 磁盘的文件 / 目录(硬链接不支持);
    2. 可链接目录:支持给目录创建软链接(硬链接不支持);
    3. 独立 inode:软链接有自己的 inode,与原文件无关;
    4. 失效性:删除 / 移动原文件后,软链接会变成「死链接」(终端显示红色闪烁);
    5. 权限特征:软链接权限始终显示 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 快速识别技巧

  1. 基础识别:执行 ls -l 文件名,看输出第一个字符(权限位首字符)即可判断类型;
  2. 快捷命令file 文件名 —— 直接输出文件详细类型(例:file /usr/bin/pythonsymbolic link to /usr/bin/python3.8);
  3. 颜色辅助:终端默认颜色可快速区分(如目录蓝、软链接浅蓝、设备文件黄),但需注意:颜色可自定义,仅作辅助。

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 / wwhoami仅看当前用户,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(仅所有者有全部权限)

4.2.3 特殊权限

权限类型符号标识数字前缀核心作用
SUIDs4执行文件时临时拥有所有者权限
例:-rwsr-xr-x = 4755
SGIDs2执行文件临时拥有组权限;
目录下新建文件继承目录组;
例:drwxrwsr-x = 2775
Sticky Bitt1目录内仅文件所有者 /root 可删除;
例:/tmp = drwxrwxrwt = 1777

4.3 权限管理命令

4.3.1 修改权限

  • ==chmod==

    • 符号方式(直观,适合新手)

      1
      2
      3
      4
      chmod 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
      3
      chmod 644 file.txt    # 所有者rw,组/其他r(最常用文件权限)
      chmod 755 script.sh # 所有者rwx,组/其他rx(最常用脚本/目录权限)
      chmod -R 755 dir/ # 递归修改目录及所有子文件/目录权限

4.3.2 修改所有者 / 组

  • ==chown==(需 root 权限)

    1
    2
    3
    4
    sudo 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/bash
      • x:密码占位符,真实密码存于 /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]

🔗三者关联逻辑

  1. /etc/passwd 定义用户基本信息,/etc/group 定义组,通过 GID 关联用户主组;
  2. 密码从 /etc/passwd 分离到 /etc/shadow,提升安全性;
  3. 一个用户 = 1 个主组 + N 个附加组(附加组在 /etc/group 中体现)。

[!warning]

⚠️核心注意事项

  1. 最小权限原则:仅授予必要权限,禁止给文件 / 目录设置 777(所有用户可读写执行);
  2. root 使用规范:日常用普通用户,需提权时用 sudo,避免直接登录 root;
  3. 分组策略:按业务 / 团队分组,批量授权比单独授权更高效;
  4. 敏感文件保护/etc/shadow 权限必须为 600,/etc/passwd//etc/group 禁止设为 777。

5. Linux 变量

Linux 变量分为「全局变量」和「环境变量」,核心区别是作用域不同(是否能被子Shell继承),合理配置变量是系统定制和程序运行的基础。


5.1 变量核心类型

变量类型作用域创建/生效方式典型示例
全局变量仅当前Shell/脚本生效,子Shell不可见直接赋值(如 var=123name="ubuntu"count=5
环境变量当前Shell + 所有子Shell生效export 标记(如 export var=123PATHJAVA_HOMEEDITOR

[!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仅用户登录时加载一次适合个人环境变量(如 PATHJAVA_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 核心注意事项

  1. 生效方式:修改配置文件后,需执行 source 文件名 或重新登录终端,配置才会生效;
  2. PATH 赋值:必须保留原有 $PATH(如 PATH=$PATH:/new/path),否则会覆盖系统默认路径,导致基础命令(ls、cd)失效;
  3. 文件优先级~/.bash_profile 加载优先级高于 ~/.bashrc,登录 Shell 先加载前者,再通过前者加载后者;
  4. 避免重复:环境变量建议写在 ~/.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
    15
    flowchart 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
    6
    flowchart 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 常见问题排查

  • 环境变量不生效

    1. 检查文件路径拼写(如 /etc/.bashrc vs /etc/bash.bashrc,不同系统命名不同);
    2. 确认配置文件有执行权限:chmod +x /etc/profile.d/java.sh
    3. 登录 Shell 需执行 source 或重启终端,非登录 Shell 需执行 source ~/.bashrc
  • 别名不生效

    1. 确认别名定义在 ~/.bashrc 中(而非 ~/.bash_profile);
    2. 执行 source ~/.bashrc 刷新配置;
    3. 避免别名与系统命令重名(如自定义 ls 会覆盖系统默认 ls)。
  • 多配置文件冲突

    1. echo $变量名 查看最终值(如 echo $PATH),定位覆盖点;
    2. 按加载顺序排查:先看 /etc/profile,再看 ~/.bash_profile,最后看 ~/.bashrc
    3. 优先将环境变量写在 ~/.bash_profile,避免在 ~/.bashrc 中重复定义。

2.5 进阶优化:让配置更易维护

2.5.1 模块化管理(推荐)

~/.bashrc 中引入独立配置目录,拆分不同功能的配置:

1
2
3
4
5
6
7
8
9
# 在 ~/.bashrc 末尾添加以下内容
if [ -d ~/.bashrc.d ]; then # 检查目录是否存在
for file in ~/.bashrc.d/*.sh; do # 循环加载所有.sh文件
if [ -r "$file" ]; then # 检查文件是否可读
source "$file" # 加载配置
fi
done
unset file # 清理临时变量
fi
  • 用法:创建 ~/.bashrc.d 目录,将别名、函数拆分为 alias.shfunction.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
2
3
4
5
6
7
8
9
10
11
12
13
# 典型 deb 包目录结构
helloworld_1.0.0-1_amd64/
├── DEBIAN/ # 核心配置目录(必填)
│ ├── control # 包元数据(必填,核心文件)
│ ├── postinst # 安装后脚本(可选)
│ ├── prerm # 卸载前脚本(可选)
│ ├── preinst # 安装前脚本(可选)
│ ├── postrm # 卸载后脚本(可选)
│ ├── copyright # 版权声明(可选)
│ └── changelog # 修改记录(可选)
└── usr/
└── bin/
└── helloworld # 程序可执行文件(按FHS规范放置)

3.2 关键文件说明

3.2.1 control 文件(核心元数据,必填)

字段名示例值含义与规范
Packagehelloworld包名:小写、无空格/特殊字符,唯一标识
Version1.0.0-1版本号:格式 主版本.次版本.修订版-发行版
Architectureamd64架构:amd64/i386/arm64/all(跨架构)
Sectionutils类别:utils(工具)/network(网络)/web(Web)/devel(开发)
Priorityoptional优先级:optional(可选)/required(必需)/important(重要)
MaintainerYour Name <your@email.com>维护者:姓名 <邮箱>
DescriptionA simple hello world program描述:第一行简短描述,后续行详细描述(需缩进2个空格)
Dependsbash依赖:运行所需包,多个用逗号分隔(如 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/helloworld
    • control 元数据文件

      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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash
# 自动化构建 deb 包基础脚本
# 使用方式:./build_deb.sh <包目录> <包名.deb>

version="0.1.2"
author="Emdebfire"
package_name="$2"
package_dir="$1"

# 创建核心目录
mkdir -p ./$package_dir/DEBIAN/

# 写入修改记录
cat <<EOF > ./$package_dir/DEBIAN/changelog
AUTHOR:$author
VERSION:$version
DATE:$(date -R)
EOF

# 写入版权声明
cat <<EOF > ./$package_dir/DEBIAN/copyright
***********************************************************
* @attention
*
* 实验平台:野火 i.MX6ULL开发板
* 公司 :http://www.embedfire.com
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
***********************************************************
EOF

# 写入 control 元数据
cat <<EOF > ./$package_dir/DEBIAN/control
Source:embedfire
Package:${package_name%.*}
Version:$version
Section: debug
Priority: optional
Architecture: amd64
Maintainer:$author
Description: Embedfire Tools
EOF

# 写入安装后脚本
cat <<EOF > ./$package_dir/DEBIAN/postinst
#!/bin/sh
echo "***********************************************************"
echo "welcome to use $package_name!"
echo "***********************************************************"
EOF

# 赋权并打包
sudo chmod 775 ./$package_dir/DEBIAN/postinst
dpkg -b $package_dir $package_name

echo "✅ deb 包构建完成:$package_name"
  • 使用方式

    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. 核心注意事项

  1. 依赖问题:dpkg 不自动解决依赖,安装失败时需用 sudo apt -f install 修复;
  2. 目录规范DEBIAN 目录必须大写,否则打包失败;
  3. 权限问题:脚本文件(postinst/prerm 等)必须添加执行权限(chmod +x);
  4. 架构匹配:构建包的架构需与目标系统一致(如 amd64/arm64),否则无法安装;
  5. 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 查看所有网口IP
ifconfig eth0 192.168.1.10 netmask 255.255.255.0 给网口配置静态IP
ifconfig eth0 up/down 启用/关闭网口
嵌入式开发必用,配置开发板与主机同网段IP,保证网络互通;新系统推荐用ip addr替代ifconfig
ping测试网络连通性ping 192.168.1.2 ping主机IP
ping 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互通即可使用
tftpTFTP文件下载/上传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/unzipzip格式压缩/解压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编译为dtb
dtc -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_setenvLinux下操作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操作注意事项

  1. 嵌入式Linux系统多为busybox裁剪定制,部分高级命令可能不存在,需自行移植或通过busybox调用;
  2. 操作/dev/sys/proc下的内核/设备文件时,必须确认参数正确,避免误操作导致硬件异常、系统崩溃;
  3. 交叉编译的程序必须与开发板CPU架构、内核版本、glibc库版本匹配,否则会出现No such file or directory或无法执行的问题;
  4. 所有高危操作(如rm -rfdd、寄存器写入)必须先确认路径/地址正确,再执行,避免不可逆的系统损坏。






嵌入式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
2
3
4
5
6
7
8
9
10
11
12
13
14
graph TD
Root[Linux发行版关系] --> Debian[Debian]
Root --> Fedora[Fedora]
Root --> SUSE[SUSE]
Root --> Other[其它]

Debian --> Ubuntu[Ubuntu]
Debian --> deepin[deepin]

Fedora --> RHEL[RHEL]
Fedora --> CentOS[CentOS]

SUSE --> SLES[SLES]
SUSE --> openSUSE[openSUSE]

bcdedit /set hypervisorlaunchtype off