4、Linux基础命令回顾:文件操作、权限管理、进程管理、网络工具
在嵌入式Linux驱动开发中,熟练使用Linux命令行是基本功。本章将系统回顾文件操作、权限管理、进程管理及网络工具的核心命令,这些命令在后续的交叉编译环境配置、驱动模块加载调试、网络文件系统挂载等场景中会频繁使用。
4.1 文件操作命令
文件操作是驱动开发中最基础的操作,包括文件的创建、查看、复制、移动、删除以及查找。
| 命令 | 功能说明 | 常用示例 |
|---|---|---|
ls |
列出目录内容 | ls -la /dev/ 查看设备文件 |
cd |
切换工作目录 | cd /home/developer/kernel |
pwd |
显示当前绝对路径 | pwd |
cp |
复制文件或目录 | cp -r module_src/ /backup/ |
mv |
移动或重命名 | mv driver.ko driver_v2.ko |
rm |
删除文件或目录 | rm -rf build/ |
mkdir |
创建目录 | mkdir -p arm-buildroot/{bin,lib,etc} |
find |
查找文件 | find / -name "*.ko" 2>/dev/null |
grep |
文本搜索 | grep -rn "module_init" ./drivers/ |
驱动开发提示: 使用
ls -l /dev/ 查看设备文件的主次设备号(major/minor),这是驱动与设备文件关联的关键信息。使用 find /lib/modules/$(uname -r) -name "*.ko" 查找当前内核已安装的内核模块。
4.2 权限管理
Linux的权限模型基于用户(User)、组(Group)和其他(Others)三类角色,每类角色拥有读(r=4)、写(w=2)、执行(x=1)三种权限。驱动开发中,设备文件的权限管理直接影响用户态程序能否访问硬件。
4.2.1 文件权限表示
使用 ls -l 查看文件权限,输出格式如 -rwxr-xr--,共10个字符:
- 第1位: 文件类型(
-普通文件,d目录,c字符设备,b块设备) - 第2-4位: 所有者(User)权限
- 第5-7位: 所属组(Group)权限
- 第8-10位: 其他用户(Others)权限
4.2.2 常用权限管理命令
| 命令 | 功能 | 驱动开发场景示例 |
|---|---|---|
chmod |
修改文件权限 | chmod 666 /dev/mydevice 使所有用户可读写设备 |
chown |
修改文件所有者 | chown root:root /dev/ttyS0 |
umask |
设置默认权限掩码 | umask 0022 新文件默认 644 |
id |
查看当前用户信息 | id 确认UID/GID |
权限陷阱: 驱动设备文件通常需要
root 权限或属于 dialout/plugdev 组才能访问。如果用户态程序无法打开设备文件,请先检查 ls -l /dev/设备名 的权限位,并使用 sudo chmod 666 或添加用户到对应组。
4.2.3 权限管理流程SVG
4.3 进程管理
驱动开发中,进程管理用于监控系统资源、调试驱动行为、杀死异常进程。交叉编译环境中,进程管理也用于管理编译任务和后台服务。
| 命令 | 功能 | 驱动开发场景 |
|---|---|---|
ps |
查看进程快照 | ps aux | grep insmod 查看模块加载进程 |
top |
动态监控进程 | top -p $(pgrep my_driver) 监控驱动进程资源 |
kill |
发送信号终止进程 | kill -9 1234 强制杀死卡死的测试程序 |
pkill |
按名称终止进程 | pkill test_app |
jobs |
查看后台任务 | jobs -l 查看编译任务状态 |
nohup |
后台运行并忽略挂断 | nohup make -j4 & 后台编译内核 |
strace |
跟踪系统调用 | strace -e open,ioctl ./test 调试驱动接口调用 |
调试技巧: 当驱动加载后,使用
ps -eo pid,comm,state | grep -E "(insmod|modprobe)" 查看模块加载进程状态。如果模块加载卡住,使用 cat /proc/模块名/status 查看驱动进程的详细状态信息。
4.4 网络工具
网络工具在嵌入式Linux开发中至关重要,用于配置开发板网络、测试网络连通性、通过SSH远程登录目标板、使用NFS挂载根文件系统等。
4.4.1 ifconfig — 网络接口配置
ifconfig 用于查看和配置网络接口参数。在嵌入式开发中,经常需要为开发板设置静态IP地址。
# 查看所有网络接口
ifconfig -a
# 配置以太网接口 eth0 的 IP 地址
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up
# 配置并激活接口(简写)
sudo ifconfig eth0 192.168.1.100/24 up
# 禁用接口
sudo ifconfig eth0 down
4.4.2 ping — 网络连通性测试
ping 使用ICMP协议测试目标主机是否可达。在交叉编译环境中,用于确认开发板与主机之间的网络连接。
# 测试与主机的连通性(开发板上执行)
ping 192.168.1.10 -c 4
# 测试与开发板的连通性(主机上执行)
ping 192.168.1.100 -c 4
# 持续ping并记录时间戳
ping -D 192.168.1.10
4.4.3 ssh — 远程登录与文件传输
SSH(Secure Shell)是嵌入式开发中最常用的远程管理工具,支持加密登录、远程命令执行和文件传输。
| 命令/工具 | 功能 | 示例 |
|---|---|---|
ssh |
远程登录 | ssh root@192.168.1.100 |
scp |
安全复制文件 | scp driver.ko root@192.168.1.100:/root/ |
rsync |
增量同步文件 | rsync -avz --progress ./rootfs/ root@192.168.1.100:/ |
ssh-keygen |
生成SSH密钥对 | ssh-keygen -t rsa -b 4096 |
ssh-copy-id |
复制公钥到远程主机 | ssh-copy-id root@192.168.1.100 |
免密登录配置: 在主机上执行
ssh-keygen -t rsa 生成密钥对,然后执行 ssh-copy-id root@开发板IP 将公钥复制到开发板。之后 scp 和 ssh 不再需要输入密码,大幅提升开发效率。
4.4.4 网络工具工作流程SVG
4.5 综合实战:驱动开发中的命令组合
以下是一个典型的驱动开发调试流程,展示了上述命令的综合运用:
# 1. 查看当前内核版本,确认与驱动源码匹配
uname -r
# 2. 查找已安装的内核模块
find /lib/modules/$(uname -r) -name "*.ko" | head -10
# 3. 编译驱动模块(后台运行,避免终端占用)
nohup make -j4 > build.log 2>&1 &
# 4. 查看编译进程状态
ps aux | grep make
# 5. 将编译好的驱动模块传输到开发板
scp my_driver.ko root@192.168.1.100:/root/
# 6. SSH登录开发板并加载驱动
ssh root@192.168.1.100 "insmod /root/my_driver.ko"
# 7. 查看驱动加载后的设备文件权限
ssh root@192.168.1.100 "ls -l /dev/my_device"
# 8. 修改设备文件权限,允许普通用户访问
ssh root@192.168.1.100 "chmod 666 /dev/my_device"
# 9. 运行测试程序并跟踪系统调用
strace -e open,ioctl,write ./test_app /dev/my_device
网络故障排查: 如果
1.
2.
3.
4. 检查开发板防火墙:
scp 或 ssh 连接失败,按以下步骤排查:1.
ping 开发板IP — 检查物理连接和IP配置2.
telnet 开发板IP 22 — 检查SSH端口是否开放3.
ssh -vvv root@开发板IP — 查看详细连接日志4. 检查开发板防火墙:
iptables -L -n 或 ufw status
4.6 本章命令速查表
| 类别 | 命令 | 核心参数 | 驱动开发用途 |
|---|---|---|---|
| 文件操作 | find |
-name, -type, -size |
查找内核模块、设备树文件 |
grep |
-r, -n, -l |
搜索驱动源码中的函数定义 | |
tar |
-xzf, -czf |
解压内核源码、工具链 | |
| 权限管理 | chmod |
数字模式, -R |
设置设备文件访问权限 |
chown |
user:group |
修改设备文件所有者 | |
| 进程管理 | kill |
-9, -15, -2 |
终止卡死的驱动测试程序 |
strace |
-e, -p, -o |
跟踪驱动系统调用接口 | |
| 网络工具 | ifconfig |
up, down, netmask |
配置开发板网络接口 |
scp |
-r, -P, -C |
传输驱动模块到开发板 | |
ssh |
-X, -L, -R |
远程登录开发板调试 |