一、前置核心概念必懂1. 根目录 /Linux 所有文件、目录的唯一顶层入口整颗目录树的根只有一个。路径以/开头 绝对路径从根目录开始定位无论当前在哪结果不变 例cd /etc、ls /home路径不以/开头相对路径从当前所在目录开始定位 例你在/home/ziqi执行cd nfs_share就是进入当前目录下的文件夹2. 家目录~是当前登录用户家目录的简写等价于/home/用户名你的环境ziqi用户 →~ /home/ziqi作用存放用户私人文件、配置、项目普通用户拥有完整读写权限切换回家目录任意方式bash运行cd cd ~ cd /home/ziqi3. 两个特殊目录符号.当前目录..上一级目录父目录实操演示跟着敲bash运行# 现在在 /etc pwd # 查看当前路径输出 /etc cd .. # 回到上一级即根目录 / pwd # 输出 / cd home # 相对路径进入 /home cd ziqi # 进入 /home/ziqi你的家目录 pwd4. 权限简单认知铺垫/、/etc、/bin等系统级目录属于系统 /root 管理员普通用户只能读、执行不能随意修改 / 删除/home/用户名当前用户全权管理可任意新建、删除文件二、Linux标准目录结构详解/etc- 系统配置目录作用存放所有系统级配置文件/etc/ ├── inittab # init进程配置文件定义启动流程 ├── profile # 系统环境变量配置登录时执行 ├── passwd # 用户账户信息 ├── shadow # 用户密码加密 ├── fstab # 文件系统挂载表 ├── hosts # 主机名解析 ├── resolv.conf # DNS配置 ├── network/ # 网络配置 │ └── interfaces # 网络接口配置 ├── init.d/ # 启动脚本目录 │ ├── rcS # 主启动脚本 │ ├── S00devs # 设备节点初始化 │ ├── S01udev # udev设备管理 │ ├── S80network # 网络初始化 │ └── S99myapp # 你的应用启动脚本自定义 └── rc.local # 用户自定义启动脚本最后执行1./etc/inittab作用定义系统开机启动流程指定运行级别、开机自动执行的程序。什么时候要改想让系统开机直接跑你的程序不进登录界面想修改开机控制台 / 串口输出系统启动顺序异常需要调整怎么改vi /etc/inittab典型用法添加一行让你的应用开机自动跑::sysinit:/etc/init.d/S99myapp startBusyBox 专用的/etc/inittab它的核心作用是 定义 BusyBox init 进程在系统启动、运行、关机时要执行哪些程序、在哪个终端上执行、执行的方式是什么。BusyBox inittab 格式详解每一行的格式是id:runlevels:action:process表格字段BusyBox 里的真实作用说明id用来指定控制终端tty内容会直接拼到/dev/后面比如ttyS0就对应/dev/ttyS0如果留空就没有控制终端runlevels完全被 BusyBox init 忽略写啥都没用BusyBox 不支持运行级别这个字段只是占位action定义进程的执行时机和方式比如sysinit、respawn、once等这是最关键的字段决定什么时候跑这个程序process要执行的程序和命令行参数比如/bin/sh就是执行 shell核心字段action详解你最需要懂的文件里提到的有效action有这些我按嵌入式开发最常用的优先级排了action作用典型使用场景sysinit系统启动时第一个执行只执行一次执行系统初始化脚本比如/etc/init.d/rcS挂载文件系统、初始化设备节点once执行一次不等待进程结束一次性的初始化任务比如设置环境变量、写日志wait执行并等待进程结束才继续往下走必须等这个程序跑完才继续启动其他服务比如网络初始化respawn进程退出后会自动重新启动它用来跑你的主应用程序挂了自动重启askfirst先显示 “请按回车激活控制台”用户按回车后再启动 shell串口控制台常用防止启动时乱码ctrlaltdel按下 CtrlAltDel 组合键时执行的命令一般设为重启/sbin/rebootshutdown系统关机时执行的命令比如卸载分区、关闭交换分区restartinit 进程收到重启信号时执行一般用来重启 init 自己::sysinit:/etc/init.d/rcS场景 2设置串口控制台让串口登录 shell用askfirst动作防止启动时乱码ttyS0::askfirst:/bin/sh这样串口启动时会提示 “Please press Enter to activate this console.”按回车后才进入 shell。id是空的 → 没有指定控制终端runlevels空的 → 被忽略action是sysinit→ 系统启动时第一个执行process是/etc/init.d/rcS→ 执行这个初始化脚本你能改什么怎么改嵌入式开发最常用的场景场景 1让你的应用开机自动跑挂了自动重启这是你最可能用到的用respawn动作# 开机启动你的应用挂了自动重启 ttyS0::respawn:/usr/bin/your_appttyS0指定用串口终端/dev/ttyS0作为控制终端可以改成tty1对应屏幕或留空respawn进程退出就重启/usr/bin/your_app你的程序路径1.ttyS0→ 串口串口调试助手对应设备/dev/ttyS0作用程序的打印会输出到串口键盘输入也从串口来你用电脑 USB 转串口连上开发板看到的 log 就是从这里来的2.tty1→ 屏幕HDMI / LCD对应设备/dev/tty1作用程序打印输出到屏幕键盘输入从外接键盘来写法控制终端作用适用场景ttyS0::respawn:/app绑定串口程序打印输出到串口调试、看日志、交互程序tty1::respawn:/app绑定屏幕程序打印输出到 HDMI/LCD带屏幕的设备::respawn:/app无终端后台静默运行场景 3修改 CtrlAltDel 组合键行为::ctrlaltdel:/sbin/reboot按下 CtrlAltDel 时执行/sbin/reboot重启系统这是默认行为你可以改成别的命令。场景 4关机时执行自定义操作::shutdown:/bin/umount -a -r关机时卸载所有挂载的分区防止数据损坏。修改后怎么生效保存文件退出编辑器执行sync把修改写入存储设备防止掉电丢失重启系统reboot或者直接断电重启重启后检查你的程序 / 服务是否按预期执行执行sync→ 系统把内存里的修改写入 Flash2./etc/profile作用系统全局环境变量所有用户登录时都会执行。什么时候要改添加全局 PATH让命令在任何目录都能执行设置全局代理、全局语言、全局库路径怎么改vi /etc/profile末尾加export PATH$PATH:/my/app/path export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/my/lib生效重新登录 或source /etc/profile3./etc/passwd作用存所有用户的基本信息用户名、UID、家目录、默认 shell什么时候要改添加 / 删除系统用户修改用户家目录、默认 shell嵌入式系统里常只有 root 用户怎么改 不要直接 vi 改用命令useradd test # 新增用户 usermod -s /bin/bash test # 修改shell非要手动改vi /etc/passwd4./etc/shadow作用存加密后的用户密码什么时候要改修改 / 重置密码禁用密码、设置密码永不过期怎么改 不要直接编辑用命令passwd root # 修改root密码5./etc/fstab作用开机自动挂载磁盘 / 分区 / U 盘 / SD 卡 / 网络存储什么时候要改插上 U 盘 / SD 卡希望开机自动挂载挂载分区、tmpfs、网络盘NFS系统启动报挂载错误怎么改vi /etc/fstab示例自动挂载 SD 卡/dev/mmcblk0p1 /mnt/sdcard vfat defaults 0 0改完测试mount -a无报错就成功6./etc/hosts作用本地域名解析比 DNS 优先级高什么时候要改不想用 DNS直接把 IP 和域名绑定局域网内机器互相访问比如开发板 - PC解决某些域名无法解析的问题怎么改vi /etc/hosts192.168.1.100 my-pc之后直接ping my-pc就能通7./etc/resolv.conf作用DNS 服务器地址决定你能上网、能解析域名什么时候要改上不了网、ping 域名失败指定公司 / 公共 DNS8.8.8.8、114.114.114.114怎么改vi /etc/resolv.confnameserver 114.114.114.114 nameserver 8.8.8.88./etc/network/interfaces作用静态 IP / DHCP 配置有线网卡什么时候要改设置固定 IP开发板最常用开机自动联网怎么改vi /etc/network/interfaces静态 IP 示例auto eth0 iface eth0 inet static address 192.168.1.10 netmask 255.255.255.0 gateway 192.168.1.1重启网络/etc/init.d/S80network restartIP 电话号码域名 人名DNS/hosts 电话本netmask 子网掩码 小区范围gateway 网关 小区大门9./etc/init.d/目录最重要作用系统所有开机启动服务的脚本目录里面的Sxxxxx表示S Start 启动数字 启动顺序越小越早常见文件用途rcS系统初始化总入口S00devs设备节点初始化不要动S01udev设备热插拔管理U 盘自动识别S80network网络启动S99myapp你自己的应用开机启动最常用什么时候要改想让你的程序开机自动运行想禁用某个开机服务调整启动顺序怎么改 / 添加自启动写一个启动脚本S99myapp放到/etc/init.d/加可执行权限chmod x /etc/init.d/S99myapp脚本内容模板#!/bin/sh case $1 in start) /my/app/myapp ;; stop) killall myapp ;; esac10./etc/rc.local作用最简单的开机自启动方案系统最后执行什么时候要改不想写复杂脚本只想简单加几条开机命令怎么改vi /etc/rc.local在exit 0之前加/my/app/start.sh echo my app started /tmp/myapp.log确保有执行权限chmod x /etc/rc.local超精简总结新手必看文件 / 目录最常用场景/etc/profile加环境变量/etc/fstab开机自动挂载 U 盘 / SD 卡/etc/network/interfaces设置静态 IP/etc/resolv.conf配置 DNS 上网/etc/init.d/程序开机自启动标准方式/etc/rc.local最简单的开机自启/etc/hosts局域网 IP 域名绑定/etc/inittab定制系统启动流程总结改网络→/etc/network/interfacesresolv.conf改开机自启→ 优先用/etc/rc.local正式用/etc/init.d/S99xxx改挂载→/etc/fstab改环境变量→/etc/profile用户 / 密码→ 用useradd/passwd命令不要直接改文件命名规则S??*- 启动脚本S Start数字越小越先执行K??*- 停止脚本K Kill/boot- 启动相关文件作用存放内核、设备树、启动脚本/boot/ ├── uImage # Linux内核镜像 ├── zImage # 压缩的内核镜像 ├── dtb/ # 设备树文件硬件描述 ├── boot.sh # 你的系统应用启动脚本 └── uEnv.txt # U-Boot环境变量注意你的系统把boot.sh放在这里是自定义的不是标准做法。/root- root用户主目录作用root用户的家目录存放用户数据和配置/root/ ├── .profile # 用户环境配置 ├── .bashrc # bash配置 ├── start_app.sh # 你的应用启动脚本 ├── nfs # 你的网络配置脚本 ├── cv610_sample # 你的应用程序 ├── modules/ # 内核模块 └── config/ # 应用配置文件/bin- 基本命令作用存放系统基本命令所有用户都能用/bin/ ├── sh # Shell解释器 ├── ls # 列出文件 ├── cp, mv, rm # 文件操作 ├── cat, grep, sed # 文本处理 ├── mount, umount # 挂载文件系统 └── busybox # 嵌入式系统常用集成多个命令/sbin- 系统管理命令作用存放系统管理员使用的命令/sbin/ ├── init # 第一个用户进程 ├── reboot, halt # 重启、关机 ├── ifconfig # 网络配置 ├── insmod, rmmod # 内核模块管理 └── fdisk # 磁盘分区/usr- 用户程序作用存放用户级应用程序和库/usr/ ├── bin/ # 用户命令非必需 ├── sbin/ # 系统管理命令非必需 ├── lib/ # 共享库 ├── include/ # 头文件开发用 └── share/ # 共享数据文档、配置等/lib- 共享库底层 DLL 驱动作用存放系统运行必需的动态链接库/lib/ ├── libc.so.6 # C标准库 ├── libm.so.6 # 数学库 ├── libpthread.so.0 # 线程库 ├── ld-linux.so.2 # 动态链接器 └── modules/ # 内核模块 └── 4.19.0/ # 内核版本/dev- 设备文件作用设备节点硬件抽象为文件/dev/ ├── null # 空设备丢弃所有写入 ├── zero # 零设备读取全0 ├── console # 控制台 ├── ttyAMA0 # 串口0 ├── mtdblock0-5 # Flash分区 ├── mmcblk0 # SD卡 ├── gpio* # GPIO引脚 └── usb/ # USB设备/proc- 进程信息虚拟文件系统作用内核和进程信息的接口/proc/ ├── cpuinfo # CPU信息 ├── meminfo # 内存信息 ├── version # 内核版本 ├── cmdline # 内核启动参数 ├── [PID]/ # 进程信息目录 │ ├── status # 进程状态 │ ├── cmdline # 启动命令 │ └── maps # 内存映射 └── sys/ # 内核参数可调整/proc 系统的实时仪表盘看 CPU看内存看进程看驱动看硬件状态看网络cpuinfo —— 看 CPU 信息plaintextcat /proc/cpuinfo看核心、架构、频率。meminfo —— 看内存plaintextcat /proc/meminfo总内存、剩余内存、缓存。cmdline —— 内核启动参数plaintextcat /proc/cmdline开机时传给内核的参数。version —— 内核版本plaintextcat /proc/versionuptime —— 系统运行了多久plaintextcat /proc/uptimeloadavg —— 系统负载plaintextcat /proc/loadavgmounts —— 挂载信息plaintextcat /proc/mountsmodules —— 已加载驱动plaintextcat /proc/modulesdevices —— 已注册设备plaintextcat /proc/devicesinterrupts —— 硬件中断plaintextcat /proc/interruptsnet —— 网络状态plaintextcat /proc/net/tcp cat /proc/net/udp cat /proc/net/dev/sys- 系统信息虚拟文件系统作用硬件设备和驱动的接口/sys/ ├── class/ # 设备类 │ ├── gpio/ # GPIO控制 │ ├── net/ # 网络设备 │ └── leds/ # LED控制 ├── devices/ # 设备树 ├── kernel/ # 内核参数 │ └── config/ # USB Gadget配置 └── module/ # 已加载的模块/tmp- 临时文件作用临时文件存储重启后清空/tmp/ └── (各种临时文件)通常挂载为tmpfs内存文件系统/var- 可变数据作用存放运行时变化的数据/var/ ├── log/ # 日志文件 │ ├── messages # 系统日志 │ └── syslog # 系统日志 ├── run/ # 运行时数据PID文件等 ├── tmp/ # 临时文件持久化 └── cache/ # 缓存数据/mnt和/media- 挂载点作用临时挂载外部存储/mnt/ # 手动挂载点 ├── nfs/ # NFS挂载你的配置 ├── usb/ # U盘 └── sdcard/ # SD卡 /media/ # 自动挂载点热插拔设备/home- 普通用户主目录作用普通用户的家目录/home/ ├── user1/ # 用户1的目录 └── user2/ # 用户2的目录/opt - 第三方应用软件安装目录作用标准规范里专门放额外安装的商业软件、自研业务程序。/lostfound- 断电备份作用文件系统异常断电、损坏后系统找回的碎片文件会存在这里正常使用为空。