Chapter 03 · 树莓派与嵌入式 Linux

Linux 命令基础

SSH 进去只有一个黑框和光标。命令行才是树莓派的主场——学会 20 个命令,你就能自如地导航、编辑、装软件、管进程。

课程进度25%

关键概念

Shell 与终端
Shell 是解释你输入命令的程序,树莓派默认用 Bash。终端(Terminal)是你敲命令、看输出的界面。SSH 登录后看到的 pi@raspberrypi:~ $ 就是 Bash 提示符:~ 表示当前在家目录,$ 表示普通用户(# 表示 root)。
文件系统层级(FHS)
Linux 一切从根目录 / 开始,呈树状。关键目录:/home/pi(你的家目录)、/etc(系统配置文件)、/var/log(日志)、/usr/bin(可执行程序)、/dev(设备文件,GPIO/I2C 都在这)、/proc/sys(内核虚拟文件系统,读硬件信息)。
绝对路径 vs 相对路径
绝对路径从根 / 开始写全,如 /home/pi/project/app.py,在任何位置都指向同一文件。相对路径基于当前目录,如 ./app.py(当前目录)、../data(上级目录)。~ 是家目录的快捷方式(/home/pi)。
权限(rwx)与 chmod
每个文件有读(r=4)/写(w=2)/执行(x=1)三种权限,分别针对 owner/group/others 三类用户。ls -l 显示如 -rwxr-xr-xchmod 755 file 用数字设权限(7=rwx, 5=r-x)。脚本要加执行权限才能 ./run.sh 运行。
sudo 与 root
root 是超级管理员,可以做任何事(也能毁掉系统)。日常用普通用户 pi 更安全。需要管理员权限时(改系统配置、装软件、访问某些硬件)在命令前加 sudo,临时提权执行单条命令,会要求输入密码。
apt 包管理器
Debian/树莓派的软件安装工具。sudo apt install 包名 从官方软件源自动下载并安装软件及其依赖,apt remove 卸载,apt search 搜索。无需手动下载 exe——这是 Linux 装软件的正道,安全且能统一升级。
进程与 PID
每个正在运行的程序是一个进程,有唯一编号 PID。pstop/htop 查看进程,kill PID 结束进程。你的 Python 脚本、Web 服务器、systemd 服务都是进程。看谁占了 CPU 和内存靠这些工具。
管道(|)与重定向(> >>)
管道 | 把前一个命令的输出喂给后一个命令,如 ps aux | grep python(列进程再筛选含 python 的行)。重定向 > 把输出写入文件(覆盖),>> 追加。这是 Linux "组合小工具解决大问题"哲学的核心。

文件系统结构图

理解目录树,才知道配置文件、日志、设备各在哪。下图是树莓派上你最常打交道的目录:

Raspberry Pi OS 文件系统关键路径 ═══════════════════════════════════════════════════════ / (根,一切的起点) ├── home/ │ └── pi/ ← 你的家目录,等于 ~,放个人文件/项目 │ ├── project/ │ └── .bashrc ← 个人 Shell 配置(. 开头=隐藏) ├── etc/ ← 系统配置文件都在这 │ ├── hostname ← 主机名 │ ├── fstab ← 磁盘挂载表 │ └── systemd/ ← 服务配置(第9章) ├── var/ │ └── log/ ← 系统日志(排障看这) ├── dev/设备文件(硬件的入口) │ ├── gpiochip0 ← GPIO │ ├── i2c-1 ← I2C 总线(第5章) │ ├── spidev0.0 ← SPI 设备(第5章) │ └── ttyUSB0 ← USB 串口设备 ├── proc/ sys/ ← 内核虚拟文件系统,读硬件/系统状态 │ └── /sys/class/thermal/... ← 例:读 CPU 温度 ├── usr/bin/ ← 已安装的程序(python3, git...) └── boot/firmware/ ← 启动配置 config.txt(第2章)

导航与文件操作

最高频的一组命令:看在哪、切目录、列文件、增删改。

# === 导航 ===
pwd                     # 打印当前目录(Print Working Directory)
ls                      # 列出当前目录内容
ls -lah                 # -l 详情 -a 含隐藏文件 -h 人类可读的大小
cd /home/pi/project     # 切换到指定目录
cd ..                   # 回到上级目录
cd ~                    # 回到家目录(cd 不带参数也是回家)
cd -                    # 回到上一个待过的目录

# === 文件/目录操作 ===
mkdir myapp             # 新建目录
mkdir -p a/b/c          # -p 递归创建多级目录
touch app.py            # 新建空文件(或更新时间戳)
cp app.py backup.py     # 复制文件
cp -r dir1 dir2         # -r 递归复制整个目录
mv old.py new.py        # 移动/重命名
rm app.py               # 删除文件
rm -r mydir             # 递归删除目录(谨慎!)

# === 查看文件内容 ===
cat config.txt          # 一次性打印全部内容
less bigfile.log        # 分页查看(q 退出,/ 搜索)
head -20 app.log        # 看头 20 行
tail -f app.log         # -f 实时跟踪新增行(看日志神器)
rm -rf 是核弹,务必看清路径

rm -rf 递归强制删除,不会二次确认、不进回收站,删了就没了。经典事故是 rm -rf / path(中间多打一个空格,变成删根目录)。删除前先 ls 确认,永远不要在不确定的路径上用 -rf,涉及系统目录时格外小心。

文本编辑:nano 上手最快

修改配置文件是家常便饭。nano 是新手友好的编辑器(vim 更强大但陡峭)。

# 用 nano 打开/新建文件
nano app.py

# nano 底部快捷键(^ 表示 Ctrl):
#   Ctrl+O  保存(然后回车确认文件名)
#   Ctrl+X  退出
#   Ctrl+W  搜索
#   Ctrl+K  剪切整行   Ctrl+U 粘贴

# 改系统配置文件通常需要 sudo(否则无权保存)
sudo nano /etc/hostname

# vim 极简生存指令(若必须用 vim):
#   i 进入编辑    Esc 退出编辑
#   :wq 保存退出  :q! 不保存强退

权限管理:chmod 与 sudo

ls -l 输出的第一列就是权限。读懂它,才能解决"Permission denied"报错。

ls -l 权限字段解读 ═══════════════════════════════════════════════════ -rwxr-xr-x 1 pi pi 256 Jul 7 10:00 run.sh └┬┘└┬┘└┬┘ └┬┘ └┬┘ │ │ │ owner group │ │ └── others(其他人):r-x = 读+执行 │ └───── group(组) :r-x = 读+执行 └──────── owner(属主) :rwx = 读+写+执行 首字符:- 普通文件 d 目录 l 软链接 数字权限速查(r=4 w=2 x=1,相加): 7 = rwx (4+2+1) 5 = r-x (4+1) 4 = r-- ┌──────────────────────────────────────────────┐ │ chmod 755 run.sh → 属主全权,其他人只读+执行 │ │ chmod 644 doc.txt → 属主读写,其他人只读 │ │ chmod +x run.sh → 给所有人加执行权限 │ └──────────────────────────────────────────────┘
# 给脚本加执行权限,才能用 ./ 运行
chmod +x run.sh
./run.sh

# 用数字精确设权限
chmod 755 run.sh        # rwxr-xr-x
chmod 600 secret.key    # 只有属主可读写(存密钥用)

# 改文件属主(需 sudo)
sudo chown pi:pi myfile

# 遇到 "Permission denied" 通常两种解法:
#   1) 命令前加 sudo(需要管理员权限时)
#   2) chmod 给文件补上相应权限
sudo systemctl restart nginx

apt 包管理

在树莓派上装软件几乎全靠 apt。它自动处理依赖、从可信源下载、支持统一升级。

# 更新软件列表(装任何东西前先跑一次)
sudo apt update

# 搜索软件
apt search htop

# 安装软件(-y 自动确认)
sudo apt install -y htop git python3-pip

# 卸载软件
sudo apt remove htop
sudo apt purge htop     # 连配置文件一起删

# 升级所有已装软件
sudo apt full-upgrade -y

# 清理无用依赖,释放空间
sudo apt autoremove -y

# 查看某软件是否已安装及版本
apt list --installed | grep python3
apt vs pip:装 Python 库用哪个?

apt 装的是系统级软件(含部分 Python 库,如 python3-rpi.gpio);pip 装的是 Python 生态的库。新版 Raspberry Pi OS(bookworm)默认禁止 pip 直接装到系统 Python(防止破坏系统),推荐用虚拟环境python3 -m venv myenv && source myenv/bin/activate,激活后再 pip install。硬件库(gpiozero)系统已预装,直接 import 即可。

进程管理与系统监控

树莓派资源有限,看谁吃 CPU/内存、结束卡死的程序,是日常运维基本功。

# 实时监控(htop 比 top 更友好,需先 apt install htop)
htop                    # F9 结束进程,F10/q 退出
top                     # 系统自带,按 M 按内存排序、P 按 CPU

# 列出进程并筛选
ps aux                  # 列出所有进程
ps aux | grep python    # 只看含 python 的进程(配合管道)

# 结束进程
kill 1234               # 温和结束 PID 1234
kill -9 1234            # 强制杀死(进程卡死时用)
pkill -f app.py         # 按名字杀掉所有匹配的进程

# 系统资源快照
free -h                 # 内存使用
df -h                   # 磁盘(SD 卡)剩余空间
uptime                  # 开机时长与负载
vcgencmd measure_temp   # 树莓派 CPU 温度

管道与重定向:组合的威力

Linux 哲学是"每个工具做好一件事,用管道串起来"。几个高频组合:

# 统计当前目录有多少个 .py 文件
ls *.py | wc -l

# 查找并结束占用 8000 端口的进程
sudo lsof -i :8000
sudo kill $(sudo lsof -t -i :8000)

# 把命令输出写入文件(> 覆盖,>> 追加)
vcgencmd measure_temp > temp.log        # 覆盖写
vcgencmd measure_temp >> temp_history.log # 追加

# 实时监控温度,每 2 秒刷新一次
watch -n 2 vcgencmd measure_temp

# 从大日志里筛错误行,只看最后 20 条
grep -i error /var/log/syslog | tail -20

# 忽略输出(丢进黑洞),只关心命令是否成功
ping -c1 raspberrypi.local > /dev/null 2>&1
效率快捷键

Tab 自动补全命令和路径(最重要,防手误);↑/↓ 翻历史命令;Ctrl+R 搜索历史命令;Ctrl+C 中断当前命令;Ctrl+L 清屏;history 看命令历史。善用 Tab 补全能减少一半的输入和拼写错误。

本章小结

命令行是操控树莓派的日常语言。导航pwd/ls/cd文件操作mkdir/cp/mv/rmrm -rf 是核弹务必看清路径),编辑用 nano(Ctrl+O 存 Ctrl+X 退)。Linux 文件系统从根 / 展开,配置在 /etc、日志在 /var/log硬件设备在 /dev(i2c-1、spidev、gpiochip 都在这,后续章节要用)。权限 rwx 用数字表示(755/644),脚本要 chmod +x 才能运行,需管理员权限时命令前加 sudo。装软件用 aptsudo apt install),Python 库在新系统建议用 venv 虚拟环境。进程用 htop/ps 看、kill 结束。管道 | 串联命令、重定向 >/>> 存输出,是 Linux 组合小工具的精髓。下一章我们终于要碰硬件——用 Python 点亮第一颗 LED。