告别迷路:快速上手 Linux 目录结构
刚接触 Linux 的运维工程师,十个有九个被目录结构折磨过。/etc/sysconfig/network-scripts/、/var/log/nginx/、/usr/lib/systemd/system/ 这些路径是什么意思?为什么配置文件在 /etc 而不是 /conf?/proc 里的数字都是什么?磁盘已经填满了,/var/log 里的日志能不能删?这篇文章从运维工程师的实际工作出发,系统讲解 Linux 目录结构,让你告别迷路,能够快速定位文件、理解配置、排查故障。
1. 为什么理解 Linux 目录结构很重要
很多初中级工程师对 Linux 目录结构的认知是碎片化的:知道 /etc 是放配置的,知道 /var/log 是放日志的,但不知道为什么是这样划分的,也不知道某些特定文件应该在哪个目录下。这会导致几个具体问题:
- 想重启某个服务,找不到对应的 systemd unit 文件;
理解目录结构的来历和逻辑,能让你在面对未知问题时推导答案,而不是死记硬背。
2. FHS 标准:目录结构的组织逻辑
Linux 的目录结构不是随意设计的,有一个国际标准叫 FHS(Filesystem Hierarchy Standard),定义了每个目录的用途。目前使用的 FHS 3.0 发布于 2015 年。所有主流 Linux 发行版(CentOS、Ubuntu、Debian)基本都遵循这个标准,所以掌握了这个标准,在任何发行版上都能快速找到目标文件。
FHS 的核心设计思想是把文件按"是否可变"和"是否属于特定系统/应用"两个维度分类:
- 静态内容 vs 动态内容:静态内容(配置文件、命令、库)安装后基本不变;动态内容(日志、数据、缓存)会随着使用不断增长。
- 系统级 vs 用户级:系统级文件所有用户共享;用户级文件属于特定用户。
- 可共享 vs 不可共享:
/usr 下的内容可以共享给其他系统;/etc 是本机专属的。
按这两个维度,得到了常见的目录结构:
/ 根目录,目录树的起点
├── bin 基础系统命令(所有用户可用)
├── sbin 系统管理命令(通常需要 root)
├── boot 启动所需文件
├── dev 设备文件
├── etc 系统配置文件
├── home 普通用户家目录
├── lib, lib64 系统库
├── media 可移动介质挂载点
├── mnt 临时挂载点
├── opt 第三方可选软件
├── proc 内核和进程信息(伪文件系统)
├── root root 用户家目录
├── srv 服务数据目录
├── sys 系统设备和内核信息(伪文件系统)
├── tmp 临时文件
└── var 动态数据(日志、数据库、队列等)
3. /bin 和 /sbin:系统命令
3.1 /bin — 基础用户命令
/bin 存放基础系统命令,这些命令在单用户模式下也必须可用,因为系统启动后第一个挂载的分区就是根分区,/bin 在根分区上。
# /bin 下的典型文件
/bin/ls # 列出目录内容
/bin/cp # 复制文件
/bin/mv # 移动/重命名文件
/bin/rm # 删除文件
/bin/cat # 连接并显示文件内容
/bin/chmod # 修改文件权限
/bin/chown # 修改文件所有者
/bin/date # 显示/设置系统时间
/bin/echo# 输出文本
/bin/pwd# 显示当前目录
/bin/mkdir # 创建目录
/bin/grep # 文本搜索
/bin/find # 文件查找
/bin/tar # 归档工具
/bin/gzip # 压缩工具
/bin/awk # 文本处理
/bin/sed # 文本替换
/bin/sort # 排序
/bin/uniq # 去重
/bin/cut # 剪切字段
/bin/wc # 统计行/词/字符
3.2 /sbin — 系统管理命令
/sbin 存放系统管理命令,通常需要 root 权限才能执行:
/sbin/ifconfig # 配置网络接口(已被 ip 命令取代)
/sbin/route # 路由表管理
/sbin/iptables # 防火墙规则管理
/sbin/fdisk # 磁盘分区
/sbin/mkfs # 创建文件系统
/sbin/fsck # 文件系统检查
/sbin/mount # 挂载文件系统
/sbin/umount # 卸载文件系统
/sbin/modprobe # 内核模块管理
/sbin/lsmod # 查看已加载内核模块
/sbin/insmod # 插入内核模块
/sbin/rmmod # 移除内核模块
/sbin/sysctl # 调整内核参数
/sbin/halt # 关机
/sbin/reboot # 重启
/sbin/shutdown # 优雅关机
/sbin/init # 进程管理器(init 1/3/5)
/sbin/runlevel # 查看当前运行级别
3.3 /usr/bin 和 /usr/sbin
CentOS/RHEL 7+ 中,/bin 和 /sbin 其实是软链接,指向 /usr/bin 和 /usr/sbin:
# 在 CentOS 7 上验证
ls -la /bin
# lrwxrwxrwx 1 root root 7 Jun 3 2020 /bin -> usr/bin
ls -la /sbin
# lrwxrwxrwx 1 root root 7 Jun 3 2020 /sbin -> usr/sbin
这是因为早期 /bin 和 /usr/bin 是分开的(/bin 在根分区,/usr 在独立分区),后来统一合并到 /usr 下,但为了兼容性保留了软链接。新版 FHS 建议所有命令统一放在 /usr/bin 和 /usr/sbin。
运维中的实际意义:
- 某些精简版 Docker 镜像可能没有做这个软链接,如果容器里
which ls 找不到命令,检查是否在 /usr/bin 下。 - 磁盘满了先看
/usr,这个目录通常占用最多空间,因为所有软件包都装在这里。
4. /usr:用户程序
/usr 是 Linux 中最大的目录之一,存放用户安装的应用程序和库。它的设计初衷是"用户相关",但实际上几乎所有用户态程序都在这里。
4.1 /usr 子目录详解
/usr/bin/ # 用户命令(和 /bin 内容基本相同,/bin 是链接)
# 额外存放非基础的系统管理工具
# 如:yum、docker、nginx、mysql 等
/usr/sbin/ # 系统管理命令(和 /sbin 基本相同)
# 如:httpd、named、mysqld 等守护进程
/usr/lib/ # 程序库文件
# 32 位库文件,不同发行版位置不同
/usr/lib64/ # 64 位库文件
/usr/lib/systemd/system/ # systemd unit 文件(服务管理)
# nginx.service、docker.service 等
/usr/local/ # 手动编译安装的软件(重要!)
# 优先级高于 /usr/bin
# /usr/local/bin # 编译安装的命令
# /usr/local/sbin # 编译安装的管理命令
# /usr/local/lib # 编译安装的库
# /usr/local/etc # 编译安装的配置文件
/usr/share/ # 架构无关的共享数据
# /usr/share/doc # 软件文档
# /usr/share/man # man 手册
# /usr/share/zoneinfo # 时区数据
/usr/include/ # C 头文件(编译软件时需要)
/usr/src/ # 内核源码(通常不直接使用)
# /usr/src/kernels/ # 各版本内核头文件
4.2 运维中 /usr 的常见操作
# 查看某个命令属于哪个包(以 nginx 为例)
rpm -qf /usr/sbin/nginx # CentOS/RHEL
dpkg -S /usr/sbin/nginx # Ubuntu/Debian
# 查看 /usr 占用空间
du -sh /usr
# 查找哪些软件占用了最多空间
du -sh /usr/* | sort -rh | head -20
# /usr/local 是手动编译软件的首选目录
# 编译安装 nginx 时默认 prefix=/usr/local/nginx
# 实际文件分布在:
# /usr/local/nginx/conf/ 配置文件
# /usr/local/nginx/logs/ 日志文件(但通常 ln -s 到 /var/log/nginx)
# /usr/local/nginx/html/ 网站文件
# /usr/local/nginx/sbin/ 管理命令
5. /etc:配置文件
/etc 是 Linux 系统中最重要的目录之一,存放系统级配置文件。这个名字来自早期 Unix 的 "etcetera"(其他),后来被运维工程师调侃为 "Editable Text Configuration"(可编辑的文本配置)。
5.1 /etc 子目录结构
/etc/
├── passwd # 用户账户信息(UID、GID、shell)
├── shadow # 用户密码(加密存储,仅 root 可读)
├── group # 用户组信息
├── gshadow # 组密码(通常不用)
├── sudoers # sudo 权限配置(必须用 visudo 编辑)
├── hosts # 静态主机名解析(DNS 被 DNS 服务器接管前使用)
├── hostname # 主机名(CentOS/RHEL 7+)
├── resolv.conf # DNS 解析服务器地址
├── sysconfig/ # CentOS/RHEL 特有的系统配置
│ ├── network # 网络配置(主机名、网关)
│ ├── network-scripts/ # 网卡配置文件(ifcfg-eth0)
│ ├── iptables* # 防火墙规则
│ └── selinux/ # SELinux 配置
├── systemd/ # systemd 配置
│ ├── system/ # 系统级 service 文件
│ ├── user/ # 用户级 service 文件
│ └── systemd.conf # systemd 主配置
├── ssh/ # SSH 服务配置
│ ├── sshd_config # SSH 服务端配置
│ └── ssh_config # SSH 客户端配置
├── nginx/ # Nginx 配置(CentOS/RHEL)
│ ├── nginx.conf
│ ├── conf.d/
│ └── default.d/
├── httpd/ # Apache 配置(CentOS/RHEL)
├── php.ini # PHP 主配置(位置因发行版而异)
├── mysql/ # MySQL 配置
│ └── my.cnf
├── redis/ # Redis 配置
│ └── redis.conf
├── docker/ # Docker 配置
│ └── daemon.json
├── kubernetes/ # K8s 配置
├── apt/ # Ubuntu/Debian 包管理器配置
│ ├── sources.list # apt 源列表
│ └── sources.list.d/
├── yum/ # CentOS/RHEL yum 配置
│ ├── yum.conf
│ └── repos.d/ # yum 源配置
├── cron.d/ # 系统级 cron 任务
├── crontab # crontab 主配置
├── logrotate.d/ # 日志切割配置
│ ├── nginx
│ ├── syslog
│ └── mysql
├── rsyslog.conf # 日志服务配置
├── firewalld/ # firewalld 配置(CentOS/RHEL 7+)
├── iptables/ # iptables 配置(CentOS/RHEL 6)
├── modprobe.d/ # 内核模块加载配置
├── sysctl.conf # 内核参数配置
├── sysctl.d/ # 内核参数配置片段(优先级高于 sysctl.conf)
├── security/ # PAM 配置目录
│ └── pam_env.conf
├── pam.d/ # PAM 模块配置
│ ├── system-auth # 系统认证配置
│ ├── password-auth
│ └── sudo
├── login.defs # 用户账户默认配置(密码策略、UID 范围等)
├── profile.d/ # shell 环境变量脚本(登录时自动执行)
├── bashrc # bash 配置(每次打开 bash 执行)
├── bash_profile # bash 配置(仅登录 shell 执行)
├── cron.deny # 禁止使用 cron 的用户
├── hosts.allow # TCP Wrappers 允许列表
├── hosts.deny # TCP Wrappers 拒绝列表
└── X11/ # X Window 配置(通常不用)
5.2 常见配置文件用途速查
| |
|---|
| /etc/passwd |
| /etc/sysconfig/network-scripts/ifcfg-eth0(CentOS)或 /etc/netplan/(Ubuntu) |
| /etc/hostname 或 hostnamectl set-hostname |
| /etc/resolv.conf |
| /etc/firewalld/zones/ |
| /etc/ssh/sshd_config |
| /etc/systemd/system/multi-user.target.wants/ |
| /etc/sudoers |
| /etc/cron.d/ |
| /etc/logrotate.d/ |
| /etc/localtime |
| /etc/locale.conf |
| /etc/sysctl.conf |
5.3 /etc 的实际运维操作
# 查看某服务(如 nginx)的所有配置文件
find /etc -name "*nginx*" -type f
# 查看网络配置文件
cat /etc/sysconfig/network-scripts/ifcfg-eth0
# 查看 hosts 文件(DNS 污染时可能需要手动修改)
cat /etc/hosts
# 查看 DNS 服务器
cat /etc/resolv.conf
# 查看 SSH 服务配置是否正确(修改后验证)
sshd -t
# 强制所有 SSH 用户使用指定配置(强制策略)
# 在 /etc/ssh/sshd_config 中使用 Match 块
6. /var:变量数据
/var 是 Linux 中增长最快的目录,存放运行时产生的动态数据:日志、数据库、缓存、队列、邮件。如果磁盘快满了,90% 的情况是 /var 太大了。
6.1 /var 子目录详解
/var/
├── log/ # 系统和应用日志(最重要的目录)
│ ├── messages # 系统主日志(CentOS/RHEL)
│ ├── syslog # 系统日志(Ubuntu/Debian)
│ ├── auth.log # 认证日志(Ubuntu/Debian)
│ ├── secure # 安全日志(CentOS/RHEL)
│ ├── dmesg # 内核环形缓冲区日志
│ ├── boot.log # 启动日志
│ ├── cron # cron 任务执行日志
│ ├── nginx/
│ │ ├── access.log
│ │ └── error.log
│ ├── httpd/ # Apache 日志(CentOS/RHEL)
│ ├── mysql/ # MySQL 日志
│ │ ├── error.log
│ │ ├── slow.log
│ │ └── binlog/
│ ├── redis/ # Redis 日志
│ ├── docker/ # Docker 日志
│ ├── kubelet/ # Kubernetes kubelet 日志
│ └── audit/ # 审计日志
│
├── lib/ # 应用运行时数据
│ ├── mysql/ # MySQL 数据文件(InnoDB 数据在此)
│ ├── redis/ # Redis 持久化文件(dump.rdb)
│ ├── docker/ # Docker 镜像/容器存储
│ ├── containerd/ # containerd 存储
│ ├── systemd/ # systemd 运行时数据
│ └── rpm/ # RPM 包数据库
│
├── cache/ # 应用程序缓存
│ ├── yum/ # yum 缓存
│ ├── dnf/ # dnf 缓存(CentOS/RHEL 8+)
│ ├── apt/ # apt 缓存(Ubuntu/Debian)
│ ├── nginx/ # Nginx 缓存(fastcgi_cache/proxy_cache)
│ └── composer/ # Composer 缓存
│
├── spool/ # 队列和待处理任务
│ ├── mail/ # 邮件队列(服务器收到的邮件暂存这里)
│ ├── cron/ # cron 任务队列
│ └── at/ # at 任务队列
│
├── tmp/ # 临时文件(重启后可能保留)
│
├── opt/ # /opt 下软件的动态数据
│
├── run/ # 运行时 PID 文件和状态信息
│ ├── nginx.pid # Nginx 进程 ID
│ ├── sshd.pid # SSH 进程 ID
│ ├── mysqld.pid # MySQL 进程 ID
│ ├── docker.sock
│ └── systemd/
│
├── lock/ # 锁文件(防止资源重复使用)
│
└── local/ # /usr/local 的变量数据
6.2 /var/log 详解
日志是运维工程师排查故障的第一手资料,必须详细了解:
# 查看系统日志
# CentOS/RHEL
tail -f /var/log/messages
# Ubuntu/Debian
tail -f /var/log/syslog
# 查看认证相关日志(登录成功/失败)
# CentOS/RHEL
tail -f /var/log/secure
# Ubuntu/Debian
tail -f /var/log/auth.log
# 查看 nginx 日志
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
# 查看 MySQL 日志
tail -f /var/log/mysql/error.log
tail -f /var/log/mysql/slow.log
# 查看 Docker 日志(containerd 格式)
journalctl -u docker --since "1 hour ago"
docker logs nginx_container --tail 100 -f
# 查看 Kubernetes 日志
kubectl logs -n namespace podname --tail=100 -f
journalctl -u kubelet -n 200
6.3 /var 的磁盘清理
磁盘满了,先看 /var 里谁最大:
# 查看 /var 下各子目录大小
du -sh /var/* | sort -rh
# 查看 /var/log 下各文件大小
du -sh /var/log/* | sort -rh
# 找最大的 20 个文件
find /var -type f -exec du -h {} + | sort -rh | head -20
# 找最大的 20 个目录
find /var -type d -exec du -h {} + | sort -rh | head -20
# 找 7 天以上的旧日志(谨慎删除)
find /var/log -name "*.log.*" -mtime +7 -ls
# 查看当前日志文件(不是 .1, .2.gz 那些)
ls -lhS /var/log/*.log
日志清理风险提醒:
- 不要直接
rm /var/log/nginx/access.log,会破坏 inode,导致 Nginx 无法写入日志。 - 正确做法是
truncate -s 0 /var/log/nginx/access.log 或 > /var/log/nginx/access.log。 - 或者用
logrotate 自动管理(logrotate -f /etc/logrotate.d/nginx)。 - 正在写入的日志文件如果被删除,进程持有的是已删除文件的 fd(文件描述符),磁盘空间不会立即释放,直到进程关闭该 fd。
- 生产环境的日志文件,尤其是 MySQL 的 binlog、中继日志,绝对不能随意删除,要按备份策略处理。
6.4 /var/lib:应用数据
# /var/lib/mysql 是 MySQL 数据目录(innodb 数据文件)
# 默认配置:
# innodb_data_home_dir = /var/lib/mysql
# datadir = /var/lib/mysql
# /var/lib/docker 是 Docker 的存储目录
# 查看 docker 使用了多大空间
docker system df -v
# /var/lib/kubelet 是 Kubernetes kubelet 的数据目录
# 包括 Pod 的 emptyDir 卷、CSI 驱动数据等
# 这个目录通常会很大
du -sh /var/lib/kubelet/pods/*
7. /dev:设备文件
/dev 存放设备文件,是 Linux"一切皆文件"设计思想的典型体现。硬件设备在 /dev 中以文件形式存在,对这些"文件"的读写就是对设备的读写。
7.1 常见设备文件
# 块设备(以块为单位随机访问,如硬盘、U盘)
/dev/sda # 第一块 SCSI/SATA 硬盘
/dev/sda1 # 第一块硬盘的第一个分区
/dev/sdb # 第二块硬盘
/dev/vda # VirtIO 虚拟磁盘(云服务器常见)
/dev/nvme0n1 # NVMe 固态硬盘
/dev/nvme0n1p1 # NVMe 硬盘第一个分区
# 字符设备(以字符流方式访问,如终端、打印机)
/dev/null # 空设备,写入即丢弃,读取即 EOF
/dev/zero # 无限零字节源
/dev/random # 阻塞式随机数生成(高质量但会阻塞)
/dev/urandom # 非阻塞式随机数(速度快但质量稍低)
/dev/loop0 # 循环设备(挂载 ISO 文件等)
/dev/tty1 # 第一个虚拟终端(Ctrl+Alt+F1)
/dev/console # 系统控制台
# 终端设备
/dev/pts/0 # 伪终端(SSH 远程登录产生)
/dev/tty # 当前终端
# 随机访问设备
/dev/sda # 整块磁盘(危险!dd if=/dev/zero of=/dev/sda 会清空磁盘)
7.2 运维中的 /dev 操作
# 查看磁盘分区布局(lsblk 比 fdisk -l 更清晰)
lsblk
# 查看块设备信息
blkid
# 查看所有 SCSI/SATA 设备
lsscsi
# 查看 NVMe 设备
nvme list
# 创建空设备文件(一般不需要手动创建)
mknod /dev/null c 1 3 # 创建设备文件
mknod /dev/zero c 1 5 # 创建零字节设备
# 查看哪个设备是根分区
df -h
# 或
lsblk
7.3 /dev/shm:共享内存设备
# /dev/shm 是 tmpfs 文件系统,默认是物理内存的一半
# 常用于共享内存、Redis 的临时存储
# 查看大小
df -h /dev/shm
# Redis 配置中如果使用 /dev/shm 作为持久化路径(不建议用于生产):
# dir /dev/shm/redis
# 优点是极快,缺点是断电数据丢失
8. /proc 和 /sys:内核接口
/proc 和 /sys 是 Linux 的两个伪文件系统,不占用磁盘空间,是内核向用户空间暴露信息的窗口。读取文件就是读取内核数据,写入文件就是修改内核参数。
8.1 /proc 详解
/proc 目录下以数字命名的子目录是进程 ID(PID),每个数字对应一个运行中的进程:
# /proc/1 是 init/systemd 进程(PID 1)
# 查看 PID 1 的详细信息
ls -la /proc/1
# 查看所有进程的简要信息
ls /proc/ | grep -E "^[0-9]+$"
# 查看系统总体信息
/proc/cpuinfo # CPU 信息
/proc/meminfo # 内存信息(最常用的内存监控来源)
/proc/loadavg # 系统负载(top 命令的来源)
# 格式:1分钟负载 5分钟负载 15分钟负载 运行进程数/总进程数 最近PID
/proc/uptime # 系统运行时间(秒)
/proc/diskstats # 磁盘 I/O 统计
/proc/net/dev # 网络接口流量统计
/proc/net/tcp # TCP 连接状态(十六进制)
/proc/net/udp # UDP 连接状态
/proc/net/sockstat # 套接字统计
/proc/filesystems # 支持的文件系统类型
/proc/mounts # 当前挂载情况
/proc/cmdline # 内核启动参数
/proc/version # 内核版本
/proc/sys/kernel/ # 内核参数(可通过 sysctl 修改)
# /proc/sys/kernel/hostname 主机名
# /proc/sys/kernel/shmmax 共享内存最大字节数
# /proc/sys/vm/swappiness 交换分区使用倾向
/proc/sys/net/ # 网络参数(可通过 sysctl 修改)
# /proc/sys/net/core/rmem_max 接收缓冲区最大值
# /proc/sys/net/core/wmem_max 发送缓冲区最大值
8.2 常用 /proc 命令
# 查看 CPU 型号和核心数
cat /proc/cpuinfo | grep "model name" | head -1
cat /proc/cpuinfo | grep processor | wc -l
# 查看内存总量和使用情况
cat /proc/meminfo | head -5
# 查看系统负载
cat /proc/loadavg
# 查看进程 1234 的内存映射
cat /proc/1234/maps
# 查看进程 1234 的命令行
cat /proc/1234/cmdline | tr '\0'' '
# 查看进程 1234 的文件描述符
ls -la /proc/1234/fd/
# 查看进程 1234 的环境变量
cat /proc/1234/environ | tr '\0''\n'
# 查看某个 PID 对应的进程名
cat /proc/1234/comm
8.3 /sys 详解
/sys 是内核设备和内核属性的接口,比 /proc 更结构化:
/sys/block/ # 所有块设备(如 sda、nvme0n1)
/sys/block/sda/queue/ # 块设备队列参数
# /sys/block/sda/queue/read_ahead_kb 预读块数
# /sys/block/sda/queue/scheduler I/O 调度器
# /sys/block/sda/queue/nr_requests 请求队列长度
/sys/class/net/ # 网络接口
# /sys/class/net/eth0/operstate 接口状态(up/down)
# /sys/class/net/eth0/speed 速率(需 ethtool)
/sys/devices/ # 设备树(内核内部结构)
/sys/module/ # 已加载内核模块
# /sys/module/xt_connlimit/parameters/ 模块参数
/sys/power/ # 电源管理
/sys/kernel/ # 内核参数
# /sys/kernel/mm/hugepages/ 大页内存配置
# /sys/kernel/mm/transparent_hugepage/ THP 配置
8.4 运维中的 /proc 和 /sys 操作
# 动态调整内核参数(临时生效,重启丢失)
# 查看
cat /proc/sys/net/core/rmem_max
# 修改
echo 134217728 > /proc/sys/net/core/rmem_max
# 等价于 sysctl -w net.core.rmem_max=134217728
# 永久修改,在 /etc/sysctl.conf 中添加
# net.core.rmem_max = 134217728
# 然后执行 sysctl -p
# 查看 I/O 调度器(SSD 建议改为 mq-deadline 或 none)
cat /sys/block/sda/queue/scheduler
# 临时修改 I/O 调度器
echo mq-deadline > /sys/block/sda/queue/scheduler
# 永久修改,在 grub 配置中添加内核参数
# 修改 /etc/default/grub
# GRUB_CMDLINE_LINUX="... elevator=mq-deadline"
# 然后 grub2-mkconfig -o /boot/grub2/grub.cfg
# 查看和修改 swappiness
cat /proc/sys/vm/swappiness # 默认 60
echo 10 > /proc/sys/vm/swappiness # 临时修改
# 永久修改:vm.swappiness=10 写到 /etc/sysctl.conf
# 查看透明大页(某些数据库要求关闭)
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
9. /lib 和 /lib64:系统库
/lib 和 /lib64 存放系统运行所需的共享库(.so 文件),类似于 Windows 的 .dll 文件。
# 32 位库目录
/lib/
# 64 位库目录
/lib64/
# /lib 是软链接到 /usr/lib
ls -la /lib -> /usr/lib
ls -la /lib64 -> /usr/lib64
# 库文件的作用
# /lib/modules/$(uname -r)/ 内核模块(.ko 文件)
# /lib/systemd/ systemd 库文件
# /lib64/modules/ 内核模块(64 位)
运维中关于库文件的常见问题:
# 查看某个命令依赖哪些库
ldd /usr/sbin/nginx
# 示例输出:
# linux-vdso.so.1 (0x00007ffd5a9cf000)
# libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8a4c6d5000)
# libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f8a4c4a0000)
# libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f8a4c270000)
# 库文件缺失会导致 "error while loading shared libraries"
# 解决方法:安装对应库或设置 LD_LIBRARY_PATH
# 查看内核模块
lsmod
# 加载内核模块
modprobe ip_vs_rr # 加载 IPVS 负载均衡模块
# 查看模块详细信息
modinfo ip_vs_rr
10. /boot:启动文件
/boot 存放 Linux 内核和引导加载器所需的文件。这是最早被挂载的分区之一,在根分区之前。
/boot/
├── vmlinuz-5.4.0-generic # 内核镜像(压缩的内核)
├── initrd.img-5.4.0-generic # 初始化内存盘(initramfs)
├── System.map-5.4.0-generic # 内核符号表(调试用)
├── config-5.4.0-generic # 内核编译配置
├── grub/ # GRUB2 引导加载器配置
│ └── grub.cfg # GRUB 主配置文件
├── efi/ # UEFI 启动文件
│ └── EFI/
│ └── ubuntu/ # Ubuntu 的 UEFI 启动项
└── memtest86+/ # 内存测试工具
运维中的 /boot 操作:
# 查看已安装的内核版本
ls -la /boot/vmlinuz-*
ls -la /boot/initrd.img-*
# 查看当前使用的内核版本
uname -r
# 清理旧内核(CentOS/RHEL)
package-cleanup --oldkernels --count=2
# 或
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))
# 清理旧内核(Ubuntu)
apt autoremove --purge linux-image-$(uname -r | sed 's/-generic//')-*
# 或
apt-get autoremove -y
# 查看 /boot 分区使用情况
df -h /boot
# /boot 分区太小(默认 500M~1G),新内核装不进去是常见问题
# 清理旧内核即可解决
风险提醒:
- 不要手动删除
/boot 下的内核文件,必须用包管理器(yum/dnf/apt)删除,否则会导致下次内核升级失败。 - 如果 /boot 是独立分区(很多云服务器默认如此),满了会导致内核升级失败、服务器无法启动。
11. /root 和 /home:用户目录
11.1 /root:root 用户家目录
/root 是 root 超级用户的家目录,与普通用户的 /home/username 分离。这样设计的好处是即使 /home 所在的文件系统挂了,root 用户仍然可以登录系统进行修复。
# /root 的典型内容
/root/
├── .bashrc # bash 配置(每次打开 bash 时加载)
├── .bash_profile # bash 配置(登录 shell 时加载)
├── .bash_history # 命令历史记录
├── .ssh/ # SSH 密钥和配置
│ ├── authorized_keys
│ ├── id_rsa # root 的私钥
│ └── id_rsa.pub # root 的公钥
└── anaconda-ks.cfg # Anaconda 安装器生成的应答文件(安装系统时产生)
11.2 /home:普通用户家目录
# /home 下的每个子目录是一个用户
/home/admin_user/
├── .bashrc
├── .bash_history
├── .bash_profile
├── .ssh/
│ └── authorized_keys
├── Documents/
├── Downloads/
└── .config/ # 用户级应用程序配置
# 查看各用户家目录大小
du -sh /home/*
# 查看当前用户
whoami
# 查看用户信息
id
id admin_user
# 修改用户家目录(usermod)
usermod -d /new/home/admin_user admin_user
12. /tmp:临时文件
/tmp 是系统临时文件存放区,所有用户都可以读写。
# /tmp 的典型特征
# - 所有用户可读写
# - 程序创建的临时文件放这里
# - 重启后可能被清空(取决于 systemd tmp.mount 配置)
# - 权限 1777(sticky bit,防止删除他人文件)
# 查看 /tmp 占用
df -h /tmp
du -sh /tmp/*
# 查找 /tmp 下最大的文件
find /tmp -type f -exec du -h {} + | sort -rh | head -10
# 查找过于老旧的临时文件
find /tmp -type f -atime +30 -ls # 30 天未访问的文件
find /tmp -type f -mtime +30 -ls # 30 天未修改的文件
关于 sticky bit:
# /tmp 权限应该是 1777
ls -ld /tmp
# drwxrwxrwt root root /tmp
# t 表示 sticky bit:即使你有权限删除该目录下的文件,也只能删除自己的文件
# 这是为了让多用户共享 /tmp 时不会误删他人文件
13. 其他目录:/srv、/opt、/mnt、/media
13.1 /srv:服务数据
/srv 设计用来存放"服务提供的数据",如 Web 服务器的网站文件、FTP 服务器的文件仓库、Git 服务器的仓库。但实际上这个目录用得不多,很多运维工程师把数据放到了 /var/www 或 /opt 下。
/srv/
├── www/ # 网站数据(Nginx/Apache 默认有时指向这里)
├── ftp/ # FTP 服务数据
├── git/ # Git 服务器仓库
└── vpn/ # VPN 服务数据
13.2 /opt:可选/第三方软件
/opt 是手动安装的"大型"第三方软件的首选目录。特点是软件厂商创建一个与软件名相同的子目录,所有文件放在里面,形成独立的软件环境:
/opt/
├── google/
│ └── chrome/
│ └── ...
├── jetbrains/ # JetBrains IDE
│ └── Toolbox/
│ └── ...
├── vmware/ # VMware 工具
└── docker-desktop/ # Docker Desktop
很多商业软件和部分开源软件会默认安装到 /opt。
13.3 /mnt 和 /media
/mnt/ # 临时挂载点,系统管理员手动挂载用
/media/ # 自动挂载的可移动介质(光盘、U 盘)
运维中的 /mnt 使用场景:
# 临时挂载一个 ISO 文件
mount -o loop /path/to/centos.iso /mnt
ls /mnt
# 临时挂载一块云盘
mount /dev/sdc1 /mnt
# 挂载网络文件系统
mount -t nfs 10.0.0.100:/data /mnt
# 查看所有挂载
df -hT
14. 运维视角:日常操作路径总结
14.1 日常排查的路径清单
| |
|---|
| /var/log/messages(CentOS)、/var/log/syslog(Ubuntu) |
| /var/log/secure(CentOS)、/var/log/auth.log(Ubuntu) |
| /etc/nginx/ |
| /var/log/nginx/ |
| /etc/my.cnf |
| /var/log/mysql/ |
| /etc/redis/ |
| /etc/php.ini |
| /etc/docker/daemon.json |
| /var/lib/docker/ |
| /etc/systemd/system/、/usr/lib/systemd/system/ |
| /etc/firewalld/zones/ |
| /etc/cron.d/ |
| /etc/rc.d/rc.local |
| /etc/sysctl.conf |
| /etc/resolv.conf |
| /etc/sysconfig/network-scripts/(CentOS)、/etc/netplan/(Ubuntu) |
| /etc/passwd |
| /etc/sudoers |
| /etc/ssh/sshd_config |
| /etc/os-release |
| /etc/selinux/config、/var/log/audit/audit.log |
| /lib/modules/$(uname -r)/ |
14.2 常见问题的排查路径
磁盘满了,去哪找大文件?
du -sh /var/* | sort -rh | head -10
find / -type f -size +100M -exec du -h {} \; 2>/dev/null | sort -rh | head -20
MySQL 连接不上,配置文件在哪?
/etc/my.cnf
/etc/mysql/my.cnf
find /etc -name "my.cnf"
某个服务启动失败,日志在哪?
systemctl status nginx
journalctl -u nginx --since "10 minutes ago"
想看某个进程打开了哪些文件?
# 查看 PID 1234 的文件描述符
ls -la /proc/1234/fd/
# 等价于
lsof -p 1234
想看某个端口被哪个进程占用?
ss -tulnp | grep :80
# 或
lsof -i :80
想临时修改内核参数,怎么做?
# 临时(立即生效,重启丢失)
sysctl -w net.ipv4.tcp_tw_reuse=1
# 永久(重启后生效)
echo"net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
sysctl -p
15. 磁盘分区与挂载的关系
理解目录结构和磁盘分区的关系,是理解 Linux 存储模型的关键。
15.1 分区挂载示例
# 查看当前分区和挂载关系
df -h
# 示例输出:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 100G 50G 50G 50% /
# tmpfs 7.8G 0 7.8G 0% /dev/shm
# /dev/sda2 500G 300G 200G 60% /data
# /dev/sdb1 1.0T 800G 200G 80% /backup
# /dev/sdc1 200G 100G 100G 50% /mnt/backup2
这个示例说明:
/dev/sda1 挂载在根目录 /,这是根分区,包含了 /etc、/usr、/var 等所有目录(除非它们有独立分区)/dev/sda2 挂载在 /data,这意味着 /data 目录下的内容存在第二块磁盘上
15.2 常见分区方案
云服务器常见分区(单盘方案):
/ 根分区(所有目录都在根分区)
/boot 如果是独立分区,通常 1G 足够
自建物理服务器常见分区(多盘方案):
/ 根分区(50~100G)
/boot 1G(独立分区)
/var 剩余空间(存放日志和数据,增长最快)
swap 内存的 1~2 倍(内存 > 8G 时,swap 可以 ≤ 内存)
/home 单独分区(用户数据隔离)
数据库服务器分区方案:
/ 根分区(100G)
/boot 1G
swap 内存的 1 倍
/var/lib/mysql 独立大分区(SSD 优先)
/var/log/mysql 独立分区(日志单独存放)
/backup 独立分区(备份盘)
15.3 分区对运维的影响
# 查看某目录所在分区
df -h /var/log/nginx
# 查看某文件的 inode 信息(文件系统的存储位置)
stat /var/log/nginx/access.log
# 查看磁盘分区表
fdisk -l /dev/sda
# 查看 LVM 逻辑卷
lvs
pvs
vgs
# 如果 /var/log 在独立分区,磁盘满了不影响根分区
# 如果 /var/log 和 / 在同一分区,磁盘满了会导致系统无法写入日志
# 严重时会导致应用崩溃
16. 总结
理解 Linux 目录结构的核心是理解 FHS 的设计逻辑:
按"是否变化"分类:
/bin、/sbin、/usr、/etc、/lib — 静态,系统安装后基本不变/var、/tmp、/run — 动态,随使用不断增长
按"共享范围"分类:
/usr、/opt — 可以共享给其他系统(只读)/etc、/var、/run — 本机专属(不可共享)
按"系统层级"分类:
/bin、/sbin、/etc — 系统级,所有用户共享
几个必须记住的关键目录:
| |
|---|
/etc | |
/var/log | |
/var/lib | |
/proc | |
/sys | |
/usr/local | |
/run | |
日常运维三句诀:
- "改内核参数,看
/proc/sys 或 /etc/sysctl.conf"
理解了这个逻辑,即使遇到未知目录或文件,也能根据其所在路径推测出它的用途。目录结构不是靠死记硬背的,理解了逻辑,自然就能推导。