告别迷路:快速上手 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*"-typef # 查看网络配置文件 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 -typef -execdu -h {} + | sort -rh | head -20
# 找最大的 20 个目录
find /var -typed -execdu -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 # 修改 echo134217728 > /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 调度器 echomq-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 echo10 > /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 -typef -execdu -h {} + | sort -rh | head -10
# 查找过于老旧的临时文件
find /tmp -typef -atime +30 -ls # 30 天未访问的文件
find /tmp -typef -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 / -typef -size +100M -execdu -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"
理解了这个逻辑,即使遇到未知目录或文件,也能根据其所在路径推测出它的用途。目录结构不是靠死记硬背的,理解了逻辑,自然就能推导。
-
Linux
+关注
关注
88文章
11868浏览量
219904 -
目录
+关注
关注
3文章
14浏览量
8521
原文标题:告别迷路:快速上手 Linux 目录结构
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
解读Linux的文件系统与目录结构
Windows和Linux的区别以及Linux系统的目录结构
Linux操作系统的目录结构
STM32MP157 Linux系统移植开发篇7:Linux内核目录结构详解
系统讲解Linux目录结构
评论