系统讲解Linux目录结构

描述

告别迷路:快速上手 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/group
配置网络 /etc/sysconfig/network-scripts/ifcfg-eth0 (CentOS)或 /etc/netplan/(Ubuntu)
配置主机名 /etc/hostname  或 hostnamectl set-hostname
配置 DNS /etc/resolv.conf
配置防火墙 /etc/firewalld/zones/  或 /etc/iptables/rules.v4
配置 SSH 登录 /etc/ssh/sshd_config
查看启动服务 /etc/systemd/system/multi-user.target.wants/
配置 sudo 权限 /etc/sudoers (必须用 visudo 编辑)
配置定时任务 /etc/cron.d/ 、/etc/crontab
配置日志切割 /etc/logrotate.d/
配置系统时区 /etc/localtime (复制时区文件)
配置语言 /etc/locale.conf
配置内核参数 /etc/sysctl.conf 、/etc/sysctl.d/

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 '�' ' '

# 查看进程 1234 的文件描述符
ls -la /proc/1234/fd/

# 查看进程 1234 的环境变量
cat /proc/1234/environ | tr '�' '
'

# 查看某个 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)
查看 SSH 登录日志 /var/log/secure (CentOS)、/var/log/auth.log(Ubuntu)
查看 Nginx 配置 /etc/nginx/
查看 Nginx 日志 /var/log/nginx/
查看 MySQL 配置 /etc/my.cnf 、/etc/mysql/
查看 MySQL 日志 /var/log/mysql/
查看 Redis 配置 /etc/redis/
查看 PHP 配置 /etc/php.ini 、/etc/php-fpm.d/
查看 Docker 配置 /etc/docker/daemon.json
查看 Docker 数据 /var/lib/docker/
查看 systemd 服务 /etc/systemd/system/ 、/usr/lib/systemd/system/
查看防火墙规则 /etc/firewalld/zones/ 、/etc/iptables/
查看定时任务 /etc/cron.d/ 、/etc/crontab
查看启动项 /etc/rc.d/rc.local 、/etc/systemd/system/
查看内核参数 /etc/sysctl.conf 、/proc/sys/
查看 DNS 配置 /etc/resolv.conf
查看网络接口配置 /etc/sysconfig/network-scripts/ (CentOS)、/etc/netplan/(Ubuntu)
查看用户账户 /etc/passwd 、/etc/shadow
查看 sudo 权限 /etc/sudoers
查看 SSH 配置 /etc/ssh/sshd_config
查看系统版本 /etc/os-release
查看 SELinux 配置 /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 目录下的内容存在第二块磁盘上

/dev/sdb1 挂载在 /backup

/tmpfs 是内存文件系统,不占用磁盘空间

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 — 系统级,所有用户共享

/home/username — 用户级

几个必须记住的关键目录:

目录 必须记住的内容
/etc 所有配置文件,找配置来这里
/var/log 所有日志,排查故障来这里
/var/lib 数据库数据、Docker 存储
/proc 内核和进程信息,只读接口
/sys 内核设备接口,可写参数在这里
/usr/local 手动编译的软件装这里
/run 进程 PID 文件、socket 文件

日常运维三句诀:

"找配置,先看 /etc"

"查日志,先翻 /var/log"

"改内核参数,看 /proc/sys 或 /etc/sysctl.conf"

理解了这个逻辑,即使遇到未知目录或文件,也能根据其所在路径推测出它的用途。目录结构不是靠死记硬背的,理解了逻辑,自然就能推导。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分