0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

系统讲解Linux目录结构

马哥Linux运维 来源:马哥Linux运维 2026-05-28 16:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

告别迷路:快速上手 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目录结构及文件操作

    Linux目录结构为树状结构,最顶级的目录为根目录/。
    发表于 09-05 10:15 982次阅读

    Linux目录文件结构

    LINUX目录文件结构 /:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件
    发表于 12-01 14:44

    linux目录结构

    目录树的主要部分有root(/)、/USR、/var、/home等等。下面是一个典型的linux目录结构如下: +/ 根目录 +/bin
    发表于 07-03 12:15

    linux目录结构

    目录树的主要部分有root(/)、/USR、/var、/home等等。下面是一个典型的linux目录结构如下: +/ 根目录 +/bin
    发表于 07-09 09:33

    解读Linux的文件系统目录结构

    通过命令ls/可以展示Linux系统目录结构,主要包括以下内容:1. binbin是Binary的缩写, 这个目录存放着最经常使用的命令。2
    发表于 01-09 13:38

    详解Linux目录结构

    /:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放
    发表于 07-25 07:45

    Linux内核源码目录结构

    Linux体系结构Linux内核结构Linux内核源码目录
    发表于 12-30 07:22

    Linux目录结构

    嵌入式Linux系统编程学习之一目录结构文章目录嵌入式Linux
    发表于 11-05 08:00

    Windows和Linux的区别以及Linux系统目录结构

    本文先对 Windows 和 Linux 上面文件系统原理、组织概念进行区分,并给出例子、列举两者的优缺点以具体说明,最后较为详细地介绍了 Linux 系统
    的头像 发表于 06-18 17:37 9904次阅读
    Windows和<b class='flag-5'>Linux</b>的区别以及<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>的<b class='flag-5'>目录</b><b class='flag-5'>结构</b>

    Linux操作系统目录结构

    经常在Windows环境下工作的同学在初次使用Linux操作系统的时候可能有种不知所措的感觉。 Linux操作系统理念是一切皆文件。因此当我们登入L
    的头像 发表于 02-24 10:01 4486次阅读

    嵌入式Linux开发之文件系统目录结构介绍

    前言Linux文件系统,顾名思义:文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统结构,所有
    发表于 11-01 16:31 3次下载
    嵌入式<b class='flag-5'>Linux</b>开发之文件<b class='flag-5'>系统</b><b class='flag-5'>目录</b><b class='flag-5'>结构</b>介绍

    嵌入式Linux系统编程学习之一目录结构

    嵌入式Linux系统编程学习之一目录结构文章目录嵌入式Linux
    发表于 11-02 12:06 9次下载
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>编程学习之一<b class='flag-5'>目录</b><b class='flag-5'>结构</b>

    STM32MP157 Linux系统移植开发篇7:Linux内核目录结构详解

    Linux内核目录结构Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录结构,并
    发表于 12-17 18:29 10次下载
    STM32MP157 <b class='flag-5'>Linux</b><b class='flag-5'>系统</b>移植开发篇7:<b class='flag-5'>Linux</b>内核<b class='flag-5'>目录</b><b class='flag-5'>结构</b>详解

    Linux入门之目录结构

    Linux操作系统的发行版众多,为了统一不同发行版系统中的目录结构,FHS(Filesystem Hierarchy Standard)标准
    的头像 发表于 05-12 15:48 1764次阅读

    Linux系统目录结构全面剖析

    Linux文件系统采用层次化的目录结构,这种设计遵循了Unix哲学中的"一切皆文件"原则。理解Linux
    的头像 发表于 07-21 17:33 1111次阅读