跳转到内容
新建笔记

Linux 目录与配置文件:从文件系统到 Bash 启动

Linux 的文件系统以 / 为根,把磁盘文件、设备节点和内核提供的虚拟信息统一挂到同一棵目录树中。理解目录用途,有助于安装软件、查配置、排错和判断哪些数据可以清理。

1. 内核、发行版和 Shell 的边界

跳转到“1. 内核、发行版和 Shell 的边界”

Linux 严格说是内核;Ubuntu、Debian 等发行版把内核、工具、库、包管理器和配置组合成可使用的操作系统。Bash 等 Shell 是用户空间程序。应用通常经库调用或系统调用使用内核服务;库文件与根文件系统都不是内核本身。

查看环境时,区分发行版与内核:

终端窗口
cat /etc/os-release # 发行版标识,很多现代发行版提供
uname -r # 内核版本
uname -m # 机器架构

lsb_release -a 需要安装相应工具;hostnamectl 常见于 systemd 系统。不能仅凭 uname 的内核版本判断 Ubuntu/Debian 的发行版版本。

下面用文字取代容易失效的外链目录截图。目录约定以 FHS 3.0及Linux 的 hier(7) 手册为参考;具体发行版可能采用合并目录或附加路径。

/
├── etc/ 主机配置
├── home/ 普通用户的个人目录
├── root/ root 用户的个人目录
├── usr/ 程序、库、头文件、文档等
│ ├── bin/ 可执行程序
│ ├── sbin/ 系统管理程序
│ ├── lib/ 库及程序内部文件
│ ├── share/ 与体系结构无关的数据
│ └── local/ 本机管理员安装的软件
├── var/ 持久且可变的数据
│ ├── lib/ 应用状态、数据库等
│ ├── log/ 日志
│ └── cache/ 可重建缓存
├── run/ 本次启动期间的运行状态
├── tmp/ 临时文件
├── boot/ 启动相关文件
├── dev/ 设备节点
├── proc/ 进程和内核信息虚拟文件系统
├── sys/ 内核对象、设备与驱动信息
├── opt/ 附加软件包
├── srv/ 本机提供的服务数据
├── media/ 可移动介质挂载点
└── mnt/ 临时挂载点

/bin、/sbin、/lib 在传统布局中分别存放基础命令、管理命令和基础库;现代发行版中可能是指向 /usr 下相应目录的符号链接。/usr 不是用户主目录,用户文档通常位于 /home/<用户名>。

目录名也不是权限规则:普通用户可以运行某些 /sbin 工具,root 也可以运行 /bin 命令。某项操作能否成功取决于文件权限、进程身份、能力及其他安全策略。

3. 常见配置文件应该怎样理解

跳转到“3. 常见配置文件应该怎样理解”
路径用途与边界
/etc/passwd用户账户信息;通常不是密码正文的保存位置
/etc/shadow受限访问的密码散列及账户期限信息;散列不等同于可逆加密
/etc/group组及成员信息
/etc/fstab文件系统及交换空间的静态挂载配置
/etc/mtab当前挂载信息;不少系统把它链接到 /proc 中的挂载视图
/etc/issue、/etc/motd登录前提示和登录消息,实际显示受登录程序配置影响
/etc/profileBourne 兼容 Shell 登录环境的系统级初始化入口
/etc/shells系统认可的登录 Shell 列表,部分工具据此校验
/etc/login.defs账户管理工具使用的默认策略;并非全部认证策略的唯一位置
/etc/magicfile 类型识别规则可能使用的位置,实际数据库路径由发行版决定

原笔记中的 /etc/inittab、/etc/rc.d 主要涉及传统 init 布局;systemd 系统通常使用 unit。/etc/fdprm 是历史软盘参数文件,/etc/printcap 是传统打印配置,/etc/securetty 是否生效取决于登录/认证栈。看到这些路径缺失时,不应直接判断系统损坏。

4. 持久数据、临时数据与虚拟数据

跳转到“4. 持久数据、临时数据与虚拟数据”
  • /var/lib 往往保存服务的真实状态,可能含数据库;体积大不代表可删除。
  • /var/cache 按约定放可再生成的缓存,但清理仍应优先用对应应用或包管理器的方法。
  • /tmp 的保留策略由系统决定;/var/tmp 一般用于需要跨重启保留的临时文件,不能假定两者相同。
  • /run 常见为易失运行目录,PID、套接字等文件可能正被服务使用。
  • /proc、/sys 是虚拟文件系统,展示运行时状态;它们并不简单对应同等大小的磁盘文件。其中部分节点可写,写入会改变系统行为。
  • /dev 里的设备节点是访问设备的接口,并不是设备内容的普通副本。
  • lost+found 常见于 ext 系列文件系统,供文件系统修复时重新连接孤立对象;不是每次异常关机都会自动出现恢复文件。
  • /selinux 是旧布局;现代系统常通过 /sys/fs/selinux 暴露 SELinux 接口,是否存在取决于内核与挂载配置。

5. Bash 的 profile 与 bashrc

跳转到“5. Bash 的 profile 与 bashrc”

需要先判断是 登录 Shell、交互式非登录 Shell,还是脚本使用的 非交互式 Shell。

启动方式Bash 默认读取规则
登录 Shell先读 /etc/profile,再按顺序检查 ~/.bash_profile、~/.bash_login、~/.profile,只读第一个存在且可读的文件
交互式非登录 Shell读取 ~/.bashrc;发行版也可能通过配置加入系统级文件
普通非交互式脚本不按上面两种规则自动读全部配置;可通过 BASH_ENV 指定初始化文件

登录配置可以显式加载 .bashrc,于是一次登录会间接读取两个文件。图形终端、SSH、bash -l 的行为取决于实际启动参数和配置;不能用“打开终端一定读某个文件”来概括。Bash 以 sh 名称运行、POSIX 模式或远程命令场景还有专门规则,见 Bash 启动文件文档。

可用以下只读命令辅助判断当前 Bash:

终端窗口
printf 'shell options: %s\n' "$-" # 含 i 表示交互式
shopt -q login_shell && printf 'login shell\n'
printf 'Bash version: %s\n' "$BASH_VERSION"

需要修改环境变量时,先明确变量应在哪些进程中生效,再选择配置位置;修改文件不会自动改变已经运行的全部进程。

要解决的问题先查看
程序从哪里启动command -v 程序名,再检查符号链接和包归属
配置保存在哪里程序手册、/etc、用户配置目录
磁盘为何增长挂载点占用、应用数据、日志和缓存分别统计
进程/驱动当前状态服务管理器、/proc、/sys 的相应只读信息
登录环境为何与脚本不同Shell 启动类型、初始化文件、环境变量继承

目录层次是定位线索。最终应结合程序配置和实际挂载关系判断文件用途,不能仅凭目录名字决定清理。