【Linux日新月异(十)】CentOS 7 文件系统结构深度解剖:从根到叶的完整指南

🌌提供:

  1. Kimi K2 Thinking(网站: 大语言模型(Large Language Model, LLM),是当前人工智能领域的重要技术分支,专注于自然语言处理和生成任务。)【开源】「AL」〖✿✿✿✿✿〗
    🔔说明: 本文内容由Kimi K2生成。AI创作虽经校对,仍难免疏漏或偏颇之处。若您发现错漏、或有任何建议,恳请不吝赐教。您的每一次指正,都是我改进与成长的重要指引。
    📓摘要:
    ...(有好建议的可以留言哦~~~🎀)


📊 一、 第一层:根目录全景图

复制代码
/
├── 📁 bin -> usr/bin          # 基础用户命令(软链接)⚡
├── 📁 boot                     # 启动文件(内核圣地)🔥
├── 📁 dev                      # 设备文件(万物皆文件)🔌
├── 📁 etc                      # 配置文件(系统大脑)🧠
├── 📁 home                     # 用户家目录(私人空间)🏠
├── 📁 lib -> usr/lib          # 共享库文件(系统基石)📦
├── 📁 lib64 -> usr/lib64      # 64位库文件(系统基石)📦
├── 📁 media                    # 可移动媒体挂载点(自动挂载)📀
├── 📁 mnt                      # 临时挂载点(手动挂载)🔩
├── 📁 opt                      # 第三方软件(独立王国)📦
├── 📁 proc                     # 虚拟文件系统(内核窗口)🧠
├── 📁 root                     # root用户家目录(管理员禁区)👑
├── 📁 run                      # 运行时数据(易失性)🏃
├── 📁 sbin -> usr/sbin        # 系统管理命令(特权命令)🔐
├── 📁 srv                      # 服务数据(对外提供)🎯
├── 📁 sys                      # 虚拟文件系统(设备树)🎛️
├── 📁 tmp                      # 临时文件(全局可写)🗑️
├── 📁 usr                      # 用户应用程序(程序仓库)📚
└── 📁 var                      # 可变数据(日志缓存)📈

🔱 二、 根目录 / - 万物之始

2.1 核心特性

  • 作用:整个文件系统的起点,所有目录和文件的祖先
  • 内容特征:仅包含第一层子目录和少数链接文件
  • 黄金法则必须保持最小化,不应存放任何用户数据文件
  • 分区建议:根分区建议独立,且容量不宜过大(50-100GB足够)

2.2 ⚠️ 核心禁忌(🔥🔥🔥高危)

操作 后果 危险等级
rm -rf /* 系统彻底毁灭 🔥🔥🔥🔥🔥
/下创建文件如/mydata.txt 污染根目录,备份困难 🔥🔥🔥
修改/权限 导致无法登录和启动 🔥🔥🔥🔥
移动系统目录 系统崩溃 🔥🔥🔥🔥

2.3 案例解析

bash 复制代码
# ✅ 正确:在子目录下操作
mkdir /data
touch /data/app.log

# ❌ 错误:在根目录下放文件(大忌!)
touch /app.log  # 污染根目录,违背FHS规范

# ✅ 正确:查看根目录占用
df -h /

# ❌ 危险:查看根目录下所有文件大小(会遍历所有子目录)
du -sh /*  # 可能导致I/O飙升

📂 三、 第二层:一级子目录深度解剖

3.1 /bin/usr/bin - 基础用户命令

3.1.1 核心特性
  • 作用 :存放所有用户(包括普通用户和root)都需要的基础命令
  • 链接关系 :CentOS 7中/bin/usr/bin的符号链接
  • 紧急模式 :单用户模式下只有/bin可用,是系统最后的救命稻草
3.1.2 默认内容(1500+个命令)
bash 复制代码
# 核心命令
ls, cp, mv, rm, cat, mkdir, chmod, chown, grep, sed, awk, tar, gzip

# Shell
bash, sh, dash

# 工具链
echo, printf, date, sleep, whoami, pwd
3.1.3 ⚠️ 核心禁忌
  • 🔥绝对禁止修改:这些命令是系统运行基础,篡改会导致系统崩溃
  • 误删后果 :删除ls会导致无数脚本失效,系统管理瘫痪
  • 典型事故 :2017年某云服务商因替换rm命令导致数千台服务器无法删除文件
3.1.4 案例深度解析
bash 复制代码
# 验证链接关系
ls -ld /bin
# lrwxrwxrwx. 1 root root 7 Nov 15 10:30 /bin -> usr/bin

# 查看命令数量
ls /bin | wc -l
# 输出:约1500个

# 查看命令依赖的库(以ls为例)
ldd /bin/ls
linux-vdso.so.1 =>  (0x00007fffd5d7e000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f5b1a5d5000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f5b1a5d0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5b1a200000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5b1a6f8000)

# 🔥 危险演示:不要尝试!
# rm /bin/ls  # 执行后无法使用ls命令,系统管理极度困难
# 恢复方法:救援模式下从RPM包重新安装coreutils

3.2 /boot - 启动文件专用区

3.2.1 核心特性
  • 作用 :存放系统启动必需的文件,包括内核、引导加载程序
  • 空间要求:建议独立分区,大小500MB-1GB
  • 文件系统 :必须是ext4(不支持XFS做/boot
3.2.2 默认内容详解
bash 复制代码
/boot/
├── grub2/                           # GRUB2引导配置目录
│   ├── grub.cfg                    # 主配置文件(自动生成)
│   ├── grubenv                     # GRUB环境变量
│   ├── fonts/                      # 字体文件
│   └── i386-pc/                    # GRUB模块
├── vmlinuz-3.10.0-1160.el7.x86_64   # Linux内核(压缩镜像)
├── initramfs-3.10.0-1160.el7.x86_64.img  # 初始化RAM磁盘(包含启动脚本和驱动)
├── config-3.10.0-1160.el7.x86_64    # 内核编译配置
└── System.map-3.10.0-1160.el7.x86_64 # 内核符号表(调试用)
3.2.3 ⚠️ 核心禁忌(🔥🔥🔥🔥高危)
操作 后果 修复难度
删除vmlinuz-* 内核丢失,无法启动 需救援模式重装内核
修改grub.cfg 引导配置错误,启动失败 需救援模式重建GRUB
填满/boot 无法安装新内核 清理旧内核
3.2.4 案例深度解析
bash 复制代码
# 查看当前内核版本
uname -r
# 3.10.0-1160.el7.x86_64

# 查看/boot占用情况
du -sh /boot
# 200MB

# 查看所有内核版本(保留几个?)
rpm -qa kernel
kernel-3.10.0-1160.el7.x86_64
kernel-3.10.0-1160.95.1.el7.x86_64

# ✅ 正确清理旧内核(保留当前和最新2个版本)
package-cleanup --oldkernels --count=2
# 或
yum remove $(rpm -qa kernel | grep -v $(uname -r) | grep -v $(rpm -qa kernel | tail -1))

# 🔥 危险:直接删除内核文件(不要这样做!)
# rm /boot/vmlinuz-3.10.0-1160.el7.x86_64  # 系统无法启动

# grub.cfg损坏修复(救援模式)
chroot /mnt/sysimage
grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-install /dev/sda

3.3 /dev - 设备文件目录 ⭐⭐⭐

3.3.1 核心特性
  • 作用 :存放设备文件,Linux"一切皆文件"哲学的极致体现
  • 管理方式:由udev动态管理,重启后重新生成
  • 设备类型
    • 块设备(b):硬盘、光盘(随机访问)
    • 字符设备©:终端、串口(顺序访问)
    • 主/次设备号:标识设备类型和实例
3.3.2 第三层核心子目录
bash 复制代码
/dev/
├── sda, sdb, sdc              # SATA/SCSI硬盘(块设备)
├── sda1, sda2                 # 分区(块设备)
├── sr0                        # 光盘驱动器(块设备)
├── tty, tty[0-63]            # 虚拟终端(字符设备)
├── pts/                       # 伪终端从设备目录
│   └── 0, 1, 2...            # 每个SSH会话对应一个pts设备
├── null                       # 数据黑洞(丢弃一切写入)
├── zero                       # 无穷零字节源
├── random                     # 随机数生成器(阻塞)
├── urandom                    # 随机数生成器(非阻塞)
├── shm/                       # POSIX共享内存(tmpfs)
└── mapper/                    # LVM设备映射
    ├── centos-root           # 根逻辑卷
    └── centos-swap           # 交换逻辑卷
3.3.3 ⚠️ 核心禁忌(🔥🔥🔥🔥🔥高危)
操作 后果 危险等级
dd if=/dev/zero of=/dev/sda 抹除整个硬盘 🔥🔥🔥🔥🔥
误删/dev/null 系统脚本失效 🔥🔥🔥
/dev/sda写文本 破坏文件系统 🔥🔥🔥🔥
手动创建设备文件 udev管理混乱 🔥🔥
3.3.4 案例深度解析
bash 复制代码
# 查看设备文件类型和权限
ls -l /dev/sda
# brw-rw----. 1 root disk 8, 0 Nov 15 10:30 /dev/sda
# b=块设备, 8=主设备号(块设备), 0=次设备号(第一个设备)

ls -l /dev/tty
# crw-rw-rw-. 1 root tty 5, 0 Nov 15 10:30 /dev/tty
# c=字符设备, 5=主设备号, 0=次设备号

# 查看当前终端设备
tty
# /dev/pts/0

# 利用/dev/zero创建大文件(测试磁盘)
dd if=/dev/zero of=/tmp/test.img bs=1M count=1000
# 1000MB测试文件,用于磁盘性能测试

# 利用/dev/null丢弃不需要的输出
find / -name "*.log" 2>/dev/null  # 错误输出丢弃到黑洞

# 🔥 危险演示:向磁盘设备写入数据(不要尝试!)
# echo "test" > /dev/sda  # 会直接写入硬盘MBR,破坏分区表

# 查看/dev/shm共享内存
df -h /dev/shm
# tmpfs         3.9G     0  3.9G   0% /dev/shm
# 默认大小为物理内存的50%

# LVM设备查看
ls -l /dev/mapper/
# centos-root -> ../dm-0
# centos-swap -> ../dm-1

3.4 /etc - 配置文件圣地 ⭐⭐⭐⭐⭐

3.4.1 核心特性
  • 作用 :存放系统级配置文件,Linux系统的"大脑"
  • 重要性:所有服务的配置、用户信息、启动脚本
  • 权限策略:目录755,配置文件644,敏感文件600
3.4.2 第三层核心配置文件详解
/etc/passwd- 用户账户信息 ⭐⭐⭐
bash 复制代码
# 文件格式(7个字段):
用户名:密码占位符:UID:GID:描述:家目录:Shell

# 示例:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
testuser:x:1000:1000:testuser:/home/testuser:/bin/bash

# 权限要求:必须644,否则用户无法登录
ls -l /etc/passwd
# -rw-r--r--. 1 root root 1234 Nov 15 10:30 /etc/passwd

# 案例:修复损坏的passwd文件
# 1. 进入单用户模式
# 2. mount -o remount,rw /
# 3. cp /etc/passwd- /etc/passwd  # 使用备份恢复
/etc/shadow- 用户密码(仅root可读)⭐⭐⭐⭐⭐
bash 复制代码
# 文件格式(9个字段):
用户名:加密密码:最后修改时间:最小修改间隔:密码有效期:警告天数:宽限天数:账号失效日期:保留

# 示例:
root:$6$rounds=656000$...:19874:0:99999:7:::
testuser:$6$...:19874:0:99999:7:::

# 权限要求:必须600,否则重大安全漏洞
ls -l /etc/shadow
# -rw-------. 1 root root 987 Nov 15 10:30 /etc/shadow

# 案例:如果权限被改为644
chmod 644 /etc/shadow
# 普通用户可以通过john等工具暴力破解密码哈希
# 修复:立即改为600
chmod 600 /etc/shadow
/etc/fstab- 静态文件系统信息(🔥高危)⭐⭐⭐⭐⭐
bash 复制代码
# 文件格式(6个字段):
<设备> <挂载点> <文件系统类型> <选项> <dump备份> <fsck顺序>

# 示例:
UUID=a1b2c3d4-e5f6-7890-1234-56789abcdef0  /                       xfs     defaults        0 0
UUID=3b5a3e3c-d4e5-6f7a-8b9c-0d1e2f3a4b5c  /boot                   xfs     defaults        0 0
UUID=5c6d7e8f-9a0b-1c2d-3e4f-5a6b7c8d9e0f  swap                    swap    defaults        0 0
/dev/sdb1                                  /data                   ext4    defaults        0 2

# 🔥 禁忌:编辑错误会导致无法启动
# 常见错误:
# 1. UUID写错:UUID不存在,启动失败
# 2. 挂载点不存在:目录未创建
# 3. 文件系统类型错误:ext4写成xfs
# 4. 选项错误:defaults写成default

# 案例:修复fstab错误(救援模式)
# 1. 启动进入救援模式(从光盘/USB启动)
# 2. 挂载根分区为读写
mount -o remount,rw /mnt/sysimage
# 3. 编辑fstab
nano /mnt/sysimage/etc/fstab
# 4. 注释掉错误的行或修正UUID
# 5. 重启
reboot
/etc/hosts- 静态主机名解析 ⭐⭐
bash 复制代码
# 格式:IP地址 主机名 [别名]
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.100 db-server.example.com db-server
192.168.1.101 web-server.example.com web-server

# 优先级:高于DNS解析
# 适用场景:内网固定IP、测试环境、绕过DNS

# 案例:快速切换测试环境
# 修改/etc/hosts将api.example.com指向测试服务器
echo "192.168.1.200 api.example.com" >> /etc/hosts
# 无需等待DNS生效,立即生效
curl api.example.com  # 直接访问测试服务器
/etc/hostname- 主机名(CentOS 7+)⭐
bash 复制代码
# 内容仅一行:主机名
web01.example.com

# 修改方法(3种):
# 方法1:hostnamectl(推荐)
hostnamectl set-hostname web01

# 方法2:直接修改文件
echo "web01" > /etc/hostname

# 方法3:nmtui图形界面
nmtui

# 注意:修改后需重启或重新登录生效
# 不影响正在运行的网络服务
/etc/resolv.conf- DNS配置 ⭐⭐
bash 复制代码
# 格式:
nameserver 8.8.8.8
nameserver 114.114.114.114
search example.com corp.example.com

# 🔥 重要:CentOS 7由NetworkManager管理时,手动修改会被覆盖
# 如需永久生效,应修改NM配置:
nmcli con mod eth0 ipv4.dns "8.8.8.8 114.114.114.114"

# 案例:临时修改DNS测试
echo "nameserver 8.8.8.8" > /etc/resolv.conf
# 立即生效,但重启NetworkManager后失效
/etc/sysconfig/- 系统服务配置目录 ⭐⭐
bash 复制代码
# 关键子目录:
/etc/sysconfig/
├── network-scripts/      # 传统网络配置(ifcfg-eth0)
├── iptables-config       # iptables配置
├── firewalld             # firewalld配置
├── selinux               # SELinux配置
└── crond                 # cron配置

# 案例:修改静态IP
cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8

# 重启网络
systemctl restart network
/etc/yum.repos.d/- YUM仓库配置 ⭐⭐
bash 复制代码
# 格式:INI风格
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

# 案例:添加阿里云镜像源
wget -O /etc/yum.repos.d/CentOS-aliyun.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 案例:创建本地仓库
cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local Repository
baseurl=file:///mnt/repo
enabled=1
gpgcheck=0
EOF

# 🔥 安全:必须开启gpgcheck=1,防止安装被篡改的包
/etc/systemd/system/- Systemd服务目录 ⭐⭐⭐⭐
bash 复制代码
# 存放用户自定义服务单元和覆盖配置
/etc/systemd/system/
├── myapp.service                    # 自定义服务
├── nginx.service.d/                 # 覆盖配置目录
│   └── override.conf
└── multi-user.target.wants/         # 开机自启链接
    └── nginx.service -> /usr/lib/systemd/system/nginx.service

# 案例:创建自定义服务
vim /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=appuser
ExecStart=/usr/local/myapp/start.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

# 重载配置并启动
systemctl daemon-reload
systemctl enable --now myapp.service
systemctl status myapp.service
/etc/ssh/- SSH服务配置 ⭐⭐⭐⭐⭐
bash 复制代码
/etc/ssh/
├── sshd_config          # SSH服务端配置(最重要)
├── ssh_config           # SSH客户端配置
├── ssh_host_rsa_key     # 主机RSA私钥(600权限)
├── ssh_host_rsa_key.pub # 主机RSA公钥
├── ssh_host_ecdsa_key   # ECDSA私钥
└── moduli               # DH密钥交换参数

# 安全加固最佳实践:
# 1. 修改默认端口
sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config

# 2. 禁用root登录
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# 3. 禁用密码登录,仅密钥认证
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

# 重启SSH服务
systemctl restart sshd

# 🔥 注意:修改前务必保持当前会话不断开,测试新配置
sshd -t  # 测试配置语法
# 新开终端测试连接:ssh -p 2222 user@localhost
/etc/logrotate.d/- 日志轮转配置 ⭐⭐
bash 复制代码
# 防止日志占满磁盘
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily               # 每天轮转
    missingok           # 文件不存在不报错
    rotate 30           # 保留30份
    compress            # 压缩旧日志
    delaycompress       # 延迟一天压缩
    notifempty          # 空文件不轮转
    create 640 nginx nginx  # 新文件权限
    postrotate
        # 轮转后重新打开日志
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

# 测试配置
logrotate -d /etc/logrotate.d/nginx  # 调试模式
logrotate -f /etc/logrotate.d/nginx  # 强制轮转
/etc/sudoers.d/- sudo权限配置(推荐方式)⭐⭐⭐
bash 复制代码
# 替代直接编辑/etc/sudoers,更安全
# 每个用户/组一个独立文件

# 案例:给devuser免密码sudo权限
echo "devuser ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devuser
chmod 440 /etc/sudoers.d/devuser  # 必须440权限!

# 案例:仅允许特定命令
echo "opsuser ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx" > /etc/sudoers.d/opsuser

# 🔥 必须使用visudo检查语法
visudo -c -f /etc/sudoers.d/devuser
/etc/profile.d/- 环境变量脚本 ⭐⭐
bash 复制代码
# 存放以.sh结尾的脚本,登录时自动执行
# 用于设置PATH、别名等

# 案例:为所有用户添加JAVA_HOME
cat > /etc/profile.d/java.sh <<EOF
export JAVA_HOME=/usr/java/jdk1.8.0_361
export PATH=$JAVA_HOME/bin:$PATH
EOF
chmod +x /etc/profile.d/java.sh

# 立即生效
source /etc/profile

3.5 /home - 用户家目录大本营

3.5.1 核心特性
  • 作用 :存放普通用户的个人数据和配置文件
  • 权限:家目录本身755,用户子目录700
  • 磁盘规划强烈建议独立分区,用户数据与系统分离
  • 配额管理 :使用quota限制用户磁盘使用
3.5.2 第三层结构
bash 复制代码
/home/
├── alice/
│   ├── Desktop/          # 桌面(图形环境)
│   ├── Documents/        # 文档
│   ├── Downloads/        # 下载
│   ├── .bashrc           # bash配置(从/etc/skel复制)
│   ├── .bash_history     # 命令历史
│   ├── .ssh/             # SSH配置
│   │   ├── id_rsa        # 私钥(600权限)
│   │   ├── id_rsa.pub    # 公钥
│   │   └── authorized_keys  # 授权公钥
│   └── .local/           # 用户级应用数据
├── bob/
└── charlie/
3.5.3 /etc/skel - 家目录模板
bash 复制代码
# 创建新用户时,自动复制/etc/skel下的文件到用户家目录
ls -la /etc/skel/
# -rw-r--r--. 1 root root  231 .bashrc
# -rw-r--r--. 1 root root  193 .bash_profile
# -rw-r--r--. 1 root root   18 .bash_logout

# 案例:自定义用户默认配置
# 1. 在/etc/skel添加公司标准配置
cp /opt/corp/.bash_aliases /etc/skel/
# 2. 创建新用户自动获得该配置
useradd newuser
ls /home/newuser/.bash_aliases  # 已存在
3.5.4 案例深度解析
bash 复制代码
# ✅ 正确:创建用户并指定家目录
useradd -m -d /home/devuser devuser  # -m创建家目录,-d指定路径

# 🔥 危险:删除用户但保留家目录
userdel devuser  # 家目录残留,后续创建同名用户会冲突

# ✅ 正确:彻底删除用户和家目录
userdel -r devuser  # -r同时删除家目录和邮件

# 设置磁盘配额(需先启用quota)
# 1. 修改/etc/fstab,在/home分区添加usrquota,grpquota
UUID=xxx /home xfs defaults,usrquota,grpquota 0 0

# 2. 重新挂载
mount -o remount /home

# 3. 创建配额数据库
quotacheck -cug /home

# 4. 启用配额
quotaon /home

# 5. 设置用户配额(软限制10G,硬限制12G)
setquota -u devuser 0 10240M 0 0 /home
setquota -u devuser 0 12288M 0 0 /home

# 6. 查看配额
quota -u devuser
# Disk quotas for user devuser (uid 1000):
# Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
# /dev/sda3     2048  10485760 12582960           150       0       0

# 备份所有用户数据(生产环境必备)
tar -czf /backup/home-$(date +%Y%m%d).tar.gz /home/
# 排除临时文件和缓存
tar -czf /backup/home-$(date +%Y%m%d).tar.gz --exclude='*/.cache/*' /home/

3.6 /lib/usr/lib/lib64/usr/lib64 - 系统库文件

3.6.1 核心特性
  • 作用 :存放系统程序共享的动态链接库
  • 关键文件
    • libc.so.6:C标准库(几乎所有程序都依赖
    • libpthread.so.0:线程库
    • libm.so.6:数学库
    • ld-linux-x86-64.so.2:动态链接器
3.6.2 第三层结构
bash 复制代码
/lib/modules/                          # 内核模块(按版本)
└── 3.10.0-1160.el7.x86_64/
    ├── kernel/drivers/               # 硬件驱动
    │   ├── net/                      # 网卡驱动
    │   ├── scsi/                     # SCSI驱动
    │   └── usb/                      # USB驱动
    ├── kernel/fs/                    # 文件系统模块
    │   ├── ext4/
    │   ├── xfs/
    │   └── nfs/
    ├── kernel/net/                   # 网络协议模块
    └── modules.dep                   # 模块依赖关系

/lib64/
├── libc.so.6                        # C标准库(ldd显示几乎所有程序依赖)
├── libssl.so.10                     # OpenSSL库
├── libcrypto.so.10                  # 加密库
├── libselinux.so.1                  # SELinux库
└── libpam.so.0                      # 认证模块
3.6.3 ⚠️ 核心禁忌(🔥🔥🔥🔥🔥高危)
操作 后果 修复难度
删除libc.so.6 所有程序无法执行 需救援模式重装glibc
替换libssl.so.10 所有加密功能失效 需从RPM包恢复
修改库文件权限 程序无法加载库 需救援模式修复
3.6.4 案例深度解析
bash 复制代码
# 查看程序依赖的库
ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fff3b5fe000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f5b1a3a8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f5b1a3a0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5b1a000000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5b1a5d0000)

# 查找库文件
locate libssl.so
find /lib64 -name "libssl.so*"

# 库缓存(ldconfig管理)
ldconfig -p | grep libssl
# 873 libs found in cache `/etc/ld.so.cache`
# libssl.so.10 (libc6,x86-64) => /lib64/libssl.so.10

# 🔥 事故恢复:误删libc.so.6
# 症状:所有命令报错"error while loading shared libraries: libc.so.6: cannot open shared object file"
# 修复步骤:
# 1. 从Live CD启动进入救援模式
# 2. 挂载原系统
mount /dev/mapper/centos-root /mnt/sysimage
mount /dev/sda1 /mnt/sysimage/boot
chroot /mnt/sysimage
# 3. 重装glibc包(从ISO或网络)
rpm -ivh --force glibc-2.17-326.el7_9.x86_64.rpm
# 4. 重建库缓存
ldconfig
# 5. 重启
exit
reboot

3.7 /mnt vs /media - 挂载点对比

目录 用途 管理方式 典型场景
/mnt 手动挂载临时文件系统 系统管理员手动管理 测试新硬盘、临时NFS挂载
/media 自动挂载可移动媒体 udev/hal自动挂载 U盘、光盘的自动挂载
3.7.1 /mnt 实践案例
bash 复制代码
# 挂载NFS共享(生产环境常用)
mkdir -p /mnt/nfs/prod-data
mount -t nfs 192.168.1.100:/data/prod /mnt/nfs/prod-data
# 添加到fstab实现开机挂载
echo "192.168.1.100:/data/prod /mnt/nfs/prod-data nfs defaults 0 0" >> /etc/fstab

# 挂载USB设备
lsblk  # 查看USB设备名(如sdb1)
mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb
# 如果是NTFS格式,需安装ntfs-3g
mount -t ntfs-3g /dev/sdb1 /mnt/usb
3.7.2 /media 实践案例
bash 复制代码
# 现代CentOS 7桌面环境自动挂载到/run/media/用户名/
# 插入U盘后自动创建
ls /run/media/alice/
# Kingston_USB/

# 手动挂载到/media(传统方式)
mount /dev/sr0 /media/cdrom

3.8 /opt - 第三方软件独立王国

3.8.1 核心特性
  • 作用 :存放大型独立软件,如Oracle、WebLogic、第三方应用
  • 结构特点:每个软件一个子目录,自给自足
  • vs /usr/local
    • /opt:完整独立软件包,包含所有文件
    • /usr/local:用户自行编译的软件,符合FHS标准
3.8.2 第三层结构
bash 复制代码
/opt/
├── myapp/                 # 应用1
│   ├── bin/              # 可执行文件
│   ├── lib/              # 库文件
│   ├── etc/              # 配置文件
│   ├── log/              # 日志
│   └── data/             # 数据
├── oracle/               # Oracle数据库
│   └── product/
│       └── 19.0.0/
│           └── dbhome_1/
│               ├── bin/
│               ├── lib/
│               └── network/
└── mysql/                # MySQL(也可放这里)
    └── mysql-8.0/
        ├── bin/
        └── lib/
3.8.3 案例深度解析
bash 复制代码
# 安装大型软件到/opt
tar -xzf myapp-2.0.tar.gz -C /opt/
ln -s /opt/myapp-2.0 /opt/myapp  # 创建软链接便于升级

# 添加环境变量(创建profile.d脚本)
cat > /etc/profile.d/myapp.sh <<EOF
export MYAPP_HOME=/opt/myapp
export PATH=\$MYAPP_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$MYAPP_HOME/lib:\$LD_LIBRARY_PATH
EOF

# 使配置生效
source /etc/profile.d/myapp.sh

# 验证
which myapp
# /opt/myapp/bin/myapp

# 备份(生产环境)
tar -czf /backup/opt-myapp-$(date +%Y%m%d).tar.gz /opt/myapp/

# 🔥 注意:/opt通常需要独立大分区,建议50GB+

3.9 /proc - 虚拟内核文件系统 ⭐⭐⭐⭐⭐

3.9.1 核心特性
  • 作用内存中的虚拟文件系统,提供内核和进程运行时信息
  • 特点
    • 不是真实磁盘,重启后清空
    • 只读为主,部分可写(用于调优)
    • 权限由内核动态控制
3.9.2 第三层核心子目录
/proc/cpuinfo- CPU详细信息
bash 复制代码
cat /proc/cpuinfo
processor       : 0               # CPU编号
vendor_id       : GenuineIntel    # 厂商
model name      : Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz
cpu MHz         : 2300.000
cache size      : 30720 KB
cpu cores       : 12              # 核心数
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ...

# 实用案例:获取CPU核心数
grep -c ^processor /proc/cpuinfo
# 24(逻辑核心数)

grep ^cpu\ cores /proc/cpuinfo | head -1
# cpu cores       : 12(物理核心数)

# 计算总线程数(逻辑核心数)
nproc
# 24
/proc/meminfo- 内存详情
bash 复制代码
cat /proc/meminfo
MemTotal:        8000000 kB   # 总内存
MemFree:         1200000 kB   # 空闲内存
MemAvailable:    5200000 kB   # 可用内存(包含缓存)
Buffers:          150000 kB
Cached:          3500000 kB
SwapTotal:       4194304 kB   # 交换分区
SwapFree:        4000000 kB
...

# 实用案例:内存使用率脚本
#!/bin/bash
TOTAL=$(grep MemTotal /proc/meminfo | awk '{print $2}')
FREE=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
USED=$((TOTAL - FREE))
USAGE=$((USED * 100 / TOTAL))
echo "Memory Usage: ${USAGE}%"

# 99%以上告警
if [ $USAGE -gt 90 ]; then
    echo "WARNING: Memory usage is high!"
fi
/proc/<PID>/ 目录- 进程信息宝库 ⭐⭐⭐⭐⭐
bash 复制代码
# 每个进程一个目录,以PID命名
ls -d /proc/[0-9]*/ | head -5
/proc/1/    # init进程(systemd)
/proc/2/    # kthreadd
/proc/3/    # rcu_gp
...

# 关键文件:
/proc/1234/cmdline    # 启动命令(以\0分隔)
/proc/1234/status     # 进程状态(Name, State, PPID等)
/proc/1234/environ    # 环境变量
/proc/1234/fd/        # 文件描述符(软链接)
/proc/1234/io         # I/O统计
/proc/1234/limits     # 资源限制
/proc/1234/task/      # 线程信息

# 实用案例:查看进程打开的文件
ls -l /proc/$$/fd
# lrwx------. 1 root root 64 Nov 15 10:30 0 -> /dev/pts/0
# lrwx------. 1 root root 64 Nov 15 10:30 1 -> /dev/pts/0
# lrwx------. 1 root root 64 Nov 15 10:30 2 -> /dev/pts/0

# 查看进程启动命令(替换\0为空格)
cat /proc/1/cmdline | tr '\0' ' '
# /usr/lib/systemd/systemd --switched-root --system --deserialize 22

# 查看进程环境变量
cat /proc/1234/environ | tr '\0' '\n' | grep PATH
# PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
/proc/sys/- 内核参数调优 ⭐⭐⭐⭐⭐
bash 复制代码
# 可写的内核参数,实时生效
# 相当于sysctl命令的直接接口

/proc/sys/
├── vm/                     # 虚拟内存和交换
│   ├── swappiness         # 交换倾向(0-100)
│   └── dirty_ratio        # 脏页比例
├── net/                    # 网络参数
│   └── ipv4/
│       ├── ip_forward     # IP转发开关
│       ├── tcp_syncookies # SYN Cookies
│       └── tcp_max_syn_backlog
└── kernel/
    ├── panic              # 内核恐慌后重启
    └── print_kern_info    # 内核信息打印

# 案例:开启IP转发(临时)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 或
sysctl -w net.ipv4.ip_forward=1

# 永久生效需写入/etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# 案例:调整swap使用倾向(0=尽量不用swap,100=积极使用)
echo 10 > /proc/sys/vm/swappiness
# 内存充足的服务器建议设为10,数据库服务器可设为0

# 查看所有可调整参数
sysctl -a | wc -l  # 约2000个参数
/proc中断点续传
bash 复制代码
# /proc目录也可以用于进程间通信
# 例如,通过/proc/sys/vm/drop_caches清理缓存

# 案例:手动清理缓存(生产环境慎用)
sync  # 先同步数据到磁盘
echo 1 > /proc/sys/vm/drop_caches  # 清理页缓存
echo 2 > /proc/sys/vm/drop_caches  # 清理dentries和inodes
echo 3 > /proc/sys/vm/drop_caches  # 清理所有缓存

# 🔥 警告:清理缓存会导致I/O飙升,生产环境不要随意执行

3.10 /root - root用户家目录 ⭐⭐⭐⭐

3.10.1 核心特性
  • 权限550700严格禁止其他用户访问
  • vs /home
    • 系统管理员专用
    • 通常独立分区(安全考虑)
    • 包含管理员脚本、密钥等敏感信息
3.10.2 第三层结构
bash 复制代码
/root/
├── .bashrc              # root的bash配置
├── .bash_history        # 命令历史(敏感!)
├── .ssh/
│   ├── id_rsa          # root私钥(危险,建议不用)
│   ├── id_rsa.pub
│   └── authorized_keys # 授权登录公钥
├── .vimrc              # vim配置
├── scripts/            # 管理脚本目录
│   ├── backup.sh
│   ├── monitor.sh
│   └── deploy.sh
└── backups/            # 系统备份
    ├── etc-20231115.tar.gz
    └── mysql-20231115.sql
3.10.3 安全最佳实践
bash 复制代码
# 1. 限制root家目录权限(默认已足够严格)
chmod 550 /root

# 2. 不要通过SSH密钥以root身份登录(使用普通用户+sudo)
# 在/etc/ssh/sshd_config中设置PermitRootLogin no

# 3. 敏感文件加密存储
# 使用GPG加密备份文件
gpg -c /root/backups/mysql.sql  # 会提示输入密码

# 4. 定期清理bash历史
# 在.bashrc中添加:unset HISTFILE  # 不保存历史
# 或:export HISTSIZE=1000  # 限制历史条数

# 5. 审计root操作
# 启用auditd审计root命令
auditctl -w /root -p rwxa -k root_access

3.11 /run - 运行时变量数据

3.11.1 核心特性
  • 文件系统:tmpfs(内存存储),重启清空
  • 作用:存放进程PID文件、套接字、锁文件等运行时数据
  • 替代 :旧的/var/run(现在是指向/run的链接)
3.11.2 第三层结构
bash 复制代码
/run/
├── systemd/                     # systemd运行时数据
│   ├── system/                 # 系统服务状态
│   └── user/                   # 用户会话状态
├── log/journal/                # journald日志链接
├── lock/                       # 锁文件
│   └── subsys/                # 子系统锁
├── user/                       # 用户运行时数据
│   ├── 0/                      # root用户
│   │   └── systemd/
│   └── 1000/                   # UID=1000的用户
│       └── systemd/
├── sshd.pid                    # SSHD进程ID
├── docker.sock                 # Docker套接字
└── mysql/                      # MySQL运行时数据
    └── mysqld.pid
3.11.3 案例解析
bash 复制代码
# 查看PID文件
cat /run/sshd.pid
# 1234

# 查看用户会话数据
ls /run/user/$UID/
# systemd/  dconf/  keyring/  gvfs/

# 🔥 注意:/run内容重启后丢失,不要存放持久数据
# 错误示例:将日志指向/run/myapp.log

# 正确:使用/var/log存放持久日志

3.12 /sbin/usr/sbin - 系统管理命令

3.12.1 核心特性
  • 作用仅root可用的系统管理命令
  • 链接关系 :CentOS 7中/sbin/usr/sbin的符号链接
  • 单用户模式 :系统修复时只有/sbin可用
3.12.2 默认内容分类
bash 复制代码
# 磁盘管理
fdisk, gdisk, parted, mkfs.xfs, mkfs.ext4, fsck, e2fsck

# 网络管理
ifconfig(过时), ip, route, iptables, firewall-cmd, nmcli

# 系统控制
reboot, halt, poweroff, shutdown, init, telinit

# 内核模块
insmod, rmmod, modprobe, lsmod

# 系统信息
dmesg, lspci, lsusb, dmidecode
3.12.3 案例深度解析
bash 复制代码
# 查看链接关系
ls -ld /sbin
# lrwxrwxrwx. 1 root root 8 Nov 15 10:30 /sbin -> usr/sbin

# 普通用户无法执行大部分命令
which reboot  # /usr/sbin/reboot
reboot        # 需要sudo或root权限

# 查看init进程信息(PID 1)
ls -l /proc/1/exe
# lrwxrwxrwx. 1 root root 0 Dec  1 10:33 /proc/1/exe -> /usr/lib/systemd/systemd

# 🔥 单用户模式修复系统
# 开机时编辑GRUB,在linux16行末尾添加init=/bin/bash
# 系统启动后只有/bin可用,没有网络,用于紧急修复
# mount -o remount,rw /
# passwd  # 修改密码
# exec /sbin/init  # 恢复正常启动

3.13 /srv - 服务数据目录

3.13.1 核心特性
  • 作用 :存放服务提供的数据(Web、FTP等)
  • vs /var:详细对比
目录 用途 数据流向 示例
/srv 服务提供的数据 向外(对外服务) Web站点文件、FTP下载资源
/var 服务产生的数据 向内(日志缓存) 日志、缓存、队列
3.13.2 第三层结构
bash 复制代码
/srv/
├── www/                 # Web服务器数据
│   ├── html/           # HTML文档根目录(替代/var/www/html)
│   ├── cgi-bin/        # CGI脚本
│   └── assets/         # 静态资源
├── ftp/                 # FTP服务器数据
│   ├── pub/            # 公共下载区(匿名访问)
│   └── upload/         # 上传区(需权限)
└── samba/               # Samba共享
    └── share/          # 共享目录
3.13.3 案例深度解析
bash 复制代码
# 配置Apache使用/srv/www
mkdir -p /srv/www/html
chown -R apache:apache /srv/www
chmod -R 755 /srv/www

# 修改Apache主配置
vim /etc/httpd/conf/httpd.conf
DocumentRoot "/srv/www/html"
<Directory "/srv/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# 重启Apache
systemctl restart httpd

# 🔥 权限安全
# 对于/srv/www/upload目录,应限制写入权限
chown apache:apache /srv/www/upload
chmod 775 /srv/www/upload  # 允许同组写入
setfacl -m u:alice:rwx /srv/www/upload  # 给特定用户权限

3.14 /sys - 虚拟内核文件系统(现代化/proc)

3.14.1 核心特性
  • 作用 :提供更结构化的内核数据接口
  • 文件系统:sysfs,按设备层次组织
  • vs /proc
    • /proc:进程和内核运行时信息
    • /sys:设备和驱动层次结构
3.14.2 第三层结构
bash 复制代码
/sys/
├── class/               # 按设备类型组织
│   ├── net/            # 网络接口
│   │   ├── eth0/
│   │   │   ├── address      # MAC地址
│   │   │   ├── carrier      # 连接状态(1=已连接)
│   │   │   ├── mtu          # MTU大小
│   │   │   └── speed        # 协商速度
│   │   └── lo/
│   ├── block/          # 块设备
│   │   ├── sda/
│   │   │   ├── size         # 扇区数
│   │   │   └── queue/
│   │   └── sdb/
│   ├── usb/            # USB设备
│   └── scsi/           # SCSI设备
├── bus/                # 总线类型
│   ├── pci/
│   └── usb/
├── devices/            # 物理设备树
│   └── pci0000:00/
├── module/             # 加载的内核模块
│   └── e1000/
│       └── parameters/    # 模块参数
└── kernel/             # 内核配置
    └── mm/             # 内存管理
        └── transparent_hugepage/
            └── enabled  # 透明大页开关
3.14.3 案例深度解析
bash 复制代码
# 查看网卡MAC地址
cat /sys/class/net/eth0/address
# 00:0c:29:8e:8e:8e

# 查看网卡连接状态
cat /sys/class/net/eth0/carrier
# 1  (0=未连接,1=已连接)

# 查看块设备大小(扇区数)
cat /sys/class/block/sda/size
# 104857600
# 实际大小 = 104857600 * 512 / 1024^3 = 50GB

# 动态调整内核参数(无需重启)
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
# never:禁用, always:启用, madvise:仅建议

# 查看USB设备信息
ls /sys/bus/usb/devices/
# 1-0:1.0  2-0:1.0  3-0:1.0  3-1  3-1:1.0

# 查看USB设备速度
cat /sys/bus/usb/devices/3-1/speed
# 480  (USB 2.0 HighSpeed)

# 查看内核模块参数
cat /sys/module/e1000/parameters/copybreak
# 256

# 修改模块参数(临时)
echo 512 > /sys/module/e1000/parameters/copybreak

# 🔥 注意:/sys参数修改立即生效,但重启后丢失
# 永久生效需写入/etc/rc.local或udev规则

3.15 /tmp - 临时文件

3.15.1 核心特性
  • 作用 :存放临时文件,所有用户可写
  • 文件系统:tmpfs(通常挂载到内存)
  • 权限1777rwxrwxrwt)- 粘滞位(t)防止用户删除他人文件
3.15.2 vs /var/tmp
目录 生命周期 存储位置 适用场景
/tmp 重启清空 内存(tmpfs) 短期临时文件
/var/tmp 重启保留 磁盘 较长期临时文件
3.15.3 ⚠️ 安全注意
  • 🔥粘滞位(t)/tmp权限必须为1777
  • 定期清理 :CentOS 7默认systemd-tmpfiles每天清理10天前的文件
  • 敏感文件 :不要在/tmp存放密码等敏感信息(全局可读)
  • 竞争条件/tmp下创建文件需使用原子操作,防止符号链接攻击
3.15.4 案例深度解析
bash 复制代码
# 查看正确的/tmp权限
ls -ld /tmp
# drwxrwxrwt. 11 root root 4096 Nov 15 17:30 /tmp
# 注意最后的t!

# 粘滞位的作用演示
# alice在/tmp创建文件
su - alice -c "touch /tmp/alice-file"
ls -l /tmp/alice-file
# -rw-rw-r--. 1 alice alice 0 Nov 15 17:30 /tmp/alice-file

# bob尝试删除alice的文件(即使有写权限也会失败)
su - bob -c "rm /tmp/alice-file"
# rm: cannot remove '/tmp/alice-file': Operation not permitted

# 安全创建临时文件(避免竞争条件)
mktemp /tmp/myapp.XXXXXXXX
# /tmp/myapp.3k7aB9aZ

# 查看tmpfiles定时清理配置
cat /usr/lib/tmpfiles.d/tmp.conf
# q /tmp 1777 root root 10d  # 10天清理
# q /var/tmp 1777 root root 30d # 30天清理

# 手动触发清理
systemd-tmpfiles --clean

3.16 /usr - 用户应用程序和数据 ⭐⭐⭐⭐

3.16.1 核心特性
  • 作用次要层级,存放用户级程序和数据
  • vs / :系统启动必需的核心文件在//usr可独立分区,甚至网络挂载
  • 挂载选项:可只读挂载(安全加固)
3.16.2 第三层庞大结构
bash 复制代码
/usr/
├── bin/              # 用户命令(约2000+个)
├── sbin/             # 系统管理命令
├── lib/              # 库文件
├── lib64/            # 64位库
├── include/          # C/C++头文件
├── src/              # 源代码
│   └── kernels/      # 内核源码
├── local/            # 本地编译软件(推荐)⭐⭐⭐
│   ├── bin/         # 本地命令
│   ├── lib/         # 本地库
│   ├── etc/         # 本地配置
│   └── share/       # 本地共享数据
└── share/            # 架构无关共享数据
    ├── doc/         # 软件文档
    ├── man/         # 手册页
    ├── zoneinfo/    # 时区数据库
    ├── icons/       # 图标
    └── locale/      # 本地化信息
3.16.3 /usr/local - 本地编译软件最佳实践 ⭐⭐⭐
bash 复制代码
# 编译安装软件到/usr/local
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx-1.24.0 \
            --with-http_ssl_module \
            --with-http_v2_module
make && make install

# 创建软链接便于版本管理
ln -s /usr/local/nginx-1.24.0 /usr/local/nginx

# 添加PATH
echo 'export PATH="/usr/local/nginx/sbin:$PATH"' > /etc/profile.d/nginx.sh

# 升级时只需更改软链接
ln -sf /usr/local/nginx-1.25.0 /usr/local/nginx

# 🔥 优势:与系统包管理隔离,不会yum update冲突
3.16.4 案例深度解析
bash 复制代码
# 查看手册页存储位置
man -w ls
# /usr/share/man/man1/ls.1.gz

# 查看时区文件
ls /usr/share/zoneinfo/Asia/Shanghai
file /usr/share/zoneinfo/Asia/Shanghai

# 查看所有可用locale
ls /usr/share/locale/ | head -10

# 查看已安装软件的文档
ls /usr/share/doc/nginx-1.20.1/
# CHANGES  README  LICENSE

# 查找某个命令的多个版本
ls /usr/bin/python*
# python  python2  python2.7  python3  python3.6

# 查看真实路径
readlink -f /usr/bin/python
# /usr/bin/python2.7

3.17 /var - 可变数据目录 ⭐⭐⭐⭐⭐

3.17.1 核心特性
  • 作用 :存放经常变化的数据(日志、缓存、邮件、队列)
  • 容量特点:持续增长,需要监控
  • 分区建议强烈建议独立分区(20-50GB)
3.17.2 第三层核心子目录详解
/var/log/- 日志文件仓库 ⭐⭐⭐⭐⭐
bash 复制代码
/var/log/
├── messages          # 系统通用日志(rsyslog)
├── secure            # 安全日志(SSH登录等)
├── cron              # 定时任务日志
├── dmesg             # 内核启动日志
├── boot.log          # 系统启动日志
├── yum.log           # 软件包操作日志
├── maillog           # 邮件日志
├── wtmp              # 登录历史(二进制)
├── btmp              # 失败登录尝试(二进制)
├── lastlog           # 最近登录信息(二进制)
├── audit/            # auditd审计日志(安全)
│   └── audit.log
├── httpd/            # Apache日志
│   ├── access_log
│   └── error_log
├── nginx/            # Nginx日志
├── mysql/            # MySQL日志
└── journal/          # systemd日志(二进制)
    └── ...

日志轮转机制

bash 复制代码
# logrotate配置(每天执行)
cat /etc/cron.daily/logrotate

# 日志轮转策略
cat /etc/logrotate.conf
# weekly                    # 默认每周轮转
# rotate 4                  # 保留4份
# create                    # 创建新文件
# dateext                   # 使用日期后缀
# compress                  # 压缩旧日志

# 查看日志大小
du -sh /var/log/*
# 1.2M    /var/log/messages
# 500K    /var/log/secure
# 2.0G    /var/log/httpd/access_log  # 🔥 需要轮转!

# 手动轮转
logrotate -f /etc/logrotate.d/httpd

日志分析实战

bash 复制代码
# 实时监控日志
tail -f /var/log/messages

# 查看SSH失败登录
grep "Failed password" /var/log/secure | tail -10

# 统计IP访问次数
cut -d' ' -f1 /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -20

# 查看最近登录的5个用户
last -n 5

# 查看登录失败记录
lastb -n 10

# 查看所有日志中的错误
grep -i error /var/log/messages | tail -50

# 🔥 安全:日志被清空检测
# 检查日志大小异常
find /var/log -type f -size +100M -exec ls -lh {} \;
# 检查inode占用
df -i /var
/var/lib/- 应用状态数据(极其重要!)⭐⭐⭐⭐⭐
bash 复制代码
/var/lib/
├── rpm/                # RPM数据库(损坏则yum无法工作)🔥
│   ├── Packages       # 主数据库文件
│   └── Name           # 索引
├── yum/                # Yum缓存和状态
│   ├── history        # 操作历史
│   └── repos/         # 仓库元数据
├── mysql/              # MySQL/MariaDB数据文件(必须备份)🔥
│   ├── ibdata1        # InnoDB系统表空间
│   ├── ib_logfile0    # InnoDB日志
│   └── mysql/         # 系统数据库
├── docker/             # Docker持久化数据(体积大)
│   ├── image/         # 镜像层
│   ├── containers/    # 容器数据
│   └── volumes/       # 命名卷
├── systemd/            # systemd状态
├── NetworkManager/     # 网络状态
└── rpm-state/          # RPM状态

关键数据库保护

bash 复制代码
# RPM数据库损坏修复(症状:yum/rpm命令卡死或报错)
# 1. 备份当前数据库
cp -a /var/lib/rpm /var/lib/rpm.bak

# 2. 删除损坏的缓存
rm -f /var/lib/rpm/__db*  # Berkley DB缓存

# 3. 重建数据库
rpm --rebuilddb

# 4. 验证
rpm -qa | head -10

# 🔥 预防措施:定期备份/var/lib/rpm
tar -czf /backup/rpm-db-$(date +%Y%m%d).tar.gz /var/lib/rpm

# MySQL数据备份(生产环境)
# 物理备份(停机或锁定)
systemctl stop mysql
tar -czf /backup/mysql-$(date +%Y%m%d).tar.gz /var/lib/mysql/
systemctl start mysql

# 逻辑备份(在线)
mysqldump --all-databases --single-transaction --quick | gzip > /backup/mysql-$(date +%Y%m%d).sql.gz
/var/spool/- 任务队列
bash 复制代码
/var/spool/
├── cron/                # 用户cron任务
│   ├── alice           # alice的crontab
│   └── bob
├── mail/                # 用户邮件(传统)
│   ├── root
│   └── alice
├── cups/                # 打印队列
└── lpd/                 # 行打印机队列

# 示例:查看用户的cron任务
cat /var/spool/cron/alice
# * * * * * /home/alice/bin/monitor.sh

# 注意:不要直接编辑,使用crontab -e
crontab -u alice -e
/var/cache/- 应用缓存
bash 复制代码
/var/cache/
├── yum/                 # Yum缓存(可清理)
│   └── x86_64/7/
│       ├── base/
│       └── epel/
├── dnf/                 # DNF缓存
└── httpd/               # Apache缓存

# 清理缓存
yum clean all
# 清理后空间释放
du -sh /var/cache/yum/
/var/tmp/- 持久临时文件
bash 复制代码
# 与/tmp区别:重启不清理,适合存放较长期临时文件

# 使用场景:
# 1. 大型编译临时文件
# 2. 需要跨重启的临时数据

# 🔥 权限同样应为1777
ls -ld /var/tmp
# drwxrwxrwt. 3 root root 4096 Nov 15 10:30 /var/tmp

# 清理策略(通常30天)
cat /usr/lib/tmpfiles.d/tmp.conf
# q /var/tmp 1777 root root 30d

📊 四、 目录权限与安全总览矩阵

4.1 标准权限矩阵

目录 权限 所有者 关键文件权限 风险等级 安全建议
/ 755 root - 🔥🔥🔥 保持干净,禁止创建文件
/boot 755 root 内核600 🔥🔥🔥 独立分区,定期清理旧内核
/etc 755 root 配置644 🔥🔥🔥 修改必备份,语法检查
/etc/shadow - root 600 🔥🔥🔥🔥🔥 绝对不能让其他用户可读
/etc/fstab - root 644 🔥🔥🔥🔥 编辑错误导致无法启动
/home 755 root 用户700 🔥 独立分区,配额管理
/root 550 root 敏感文件600 🔥🔥 禁用root SSH密钥登录
/tmp 1777 root - 🔥 粘滞位必须开启
/var/log 755 root 日志644 🔥🔥 轮转策略,监控空间
/var/lib/mysql 755 mysql 数据660 🔥🔥 定期备份,独立LVM卷
/var/lib/rpm 755 root 数据库644 🔥🔥🔥 不能手动修改,定期备份

4.2 特殊权限详解

  • 粘滞位(t)/tmp1777权限,允许所有用户创建文件,但只能删除自己的文件
  • SetUID(s)/usr/bin/passwd4755,普通用户执行时获得root权限
  • SetGID(s)/usr/bin/wall2755,执行时获得组权限
bash 复制代码
# 查看SetUID程序(潜在危险)
find /usr/bin -perm -4000 -ls
# 645236   32 -rwsr-xr-x   1 root     root        32064 May 11  2019 /usr/bin/passwd

# 🔥 安全审计:多余SetUID程序
# 例如,如果/usr/bin/vim有SetUID,普通用户可编辑任意文件
chmod u-s /usr/bin/vim  # 取消SetUID

# 检查/etc/shadow权限
stat /etc/shadow
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)

# 如果权限被改为644,立即修复并调查
chmod 600 /etc/shadow
ausearch -f /etc/shadow --start recent  # 查看谁修改了

⚠️ 五、 终极禁忌清单(务必背诵!)

5.1 🔥绝对禁止的操作

操作 后果 检测方法 预防措施
rm -rf / 系统彻底毁灭 使用alias rm='rm -i'
rm -rf /etc /boot /lib 核心目录删除 限制root权限,使用sudo
/下创建文件 污染根目录 `ls / grep -v "^d"`
修改/lib/libc.so.6 所有程序崩溃 rpm -V glibc 禁止手动修改系统库
删除/boot/vmlinuz-* 无法启动 rpm -qa kernel package-cleanup自动清理
错误编辑/etc/fstab 启动失败 mount -a测试 修改前备份,救援模式准备
修改/etc/shadow权限 密码泄露 ls -l /etc/shadow 监控文件权限变化
/dev中创建文件 设备混乱 dmesg 禁止手动操作/dev
/dev/sda写数据 硬盘数据毁灭 iostat监控 权限控制,禁止直接访问
dd if=/dev/zero of=/dev/sda 彻底抹除硬盘 dd命令审计 限制dd使用,使用恢复模式

5.2 高危命令审计

bash 复制代码
# 记录所有rm操作
alias rm='rm -i'

# 使用safe-rm替代rm(可配置保护目录)
yum install safe-rm
# 配置/etc/safe-rm.conf添加保护目录
# /
# /etc
# /boot
# /lib
# /lib64
# /var/lib/mysql

# 审计危险命令
auditctl -w /bin/rm -p x -k dangerous_rm

# 查看审计日志
ausearch -k dangerous_rm -ts today

🛠️ 六、 文件系统导航黄金法则

6.1 数据存放原则(🎓必须遵守)

bash 复制代码
# ✅ 配置 → /etc
# 所有服务的配置文件
vim /etc/nginx/nginx.conf

# ✅ 用户数据 → /home
# 个人文件、文档
cp report.xlsx /home/alice/Documents/

# ✅ 服务数据 → /var/lib
# 数据库、应用状态
mysqldump > /var/lib/mysql/backup.sql  # ❌ 错误!不应放在这里
# 正确:mysqldump > /backup/mysql.sql

# ✅ 临时文件 → /tmp
# 短期临时数据
mktemp /tmp/myapp.XXXX

# ✅ 第三方软件 → /opt 或 /usr/local
# 独立软件包
tar -xzf app.tar.gz -C /opt/

# ✅ 日志 → /var/log
# 应用日志
tail -f /var/log/myapp/app.log

# ✅ 可变数据 → /var
# 缓存、队列、邮件
# /var/cache, /var/spool

# ✅ 不变数据 → /usr
# 程序、文档、手册
# /usr/bin, /usr/share/doc

6.2 磁盘空间规划建议

bash 复制代码
# 生产环境推荐分区方案
/           : 50-100GB   # 系统和核心应用
/boot       : 1GB        # 内核(ext4)
/home       : 50%磁盘    # 用户数据(按需)
/var        : 50-100GB   # 日志和服务数据(必须独立)
/tmp        : 5-10GB     # tmpfs(内存,可选独立)
swap        : 8-16GB     # 内存1.5-2倍(或4GB固定)
------------------------------------------------------------
LVM建议:
- 使用LVM管理所有分区(除/boot)
- /var和/home分配大逻辑卷,方便扩展
- 保留10%未分配空间用于紧急扩展

# 查看当前分区使用情况
df -h
# Filesystem           Size  Used Avail Use% Mounted on
# /dev/mapper/centos-root   50G   8G   42G  16% /
# /dev/sda1            1014M  200M  815M  20% /boot
# /dev/mapper/centos-home   100G   10G   90G  10% /home
# /dev/mapper/centos-var    50G   15G   35G  30% /var
# tmpfs                3.9G     0  3.9G   0% /dev/shm

6.3 故障排查路径(🚨快速定位)

bash 复制代码
# 系统无法启动 → /boot, /etc/fstab
journalctl -xb  # 查看启动日志
ls /boot
cat /etc/fstab

# 服务启动失败 → /etc, /var/log
systemctl status nginx
journalctl -u nginx
tail -f /var/log/nginx/error.log
cat /etc/nginx/nginx.conf

# 磁盘空间满 → /var/log, /var/lib, /home
du -sh /var/log/*
du -sh /var/lib/docker/
du -sh /home/* | sort -rh | head -10

# 权限问题 → /home, /root, /etc
ls -ld /home/alice
ls -l /etc/shadow
getenforce  # 检查SELinux

# 库缺失 → /lib, /lib64
ldd /usr/bin/python
yum whatprovides "*/libssl.so.10"

# 设备问题 → /dev, /sys
ls -l /dev/sd*
dmesg | grep -i error
cat /sys/class/net/eth0/carrier

# 内核参数 → /proc, /sys
cat /proc/sys/net/ipv4/ip_forward
sysctl -a | grep tcp

📚 七、 实战案例:文件系统故障排查与恢复

7.1 案例1:根分区空间不足导致系统卡死

现象 :系统提示No space left on device,无法登录,SSH超时

紧急处理

bash 复制代码
# 1. 保持冷静,不要重启!
# 2. 如果还能登录,立即清理
df -h /

# 3. 查找大文件(快速定位)
du -sh /* 2>/dev/null | sort -rh | head -10
# 重点关注:
# /var/log/
# /var/lib/docker/
# /var/cache/
# /home/

# 4. 清理日志(最常见原因)
# 清理systemd日志
journalctl --vacuum-size=100M
# 或清理15天前日志
journalctl --vacuum-time=15d

# 5. 强制轮转日志
logrotate -f /etc/logrotate.conf

# 6. 清理yum缓存
yum clean all

# 7. 清理临时文件
find /tmp -type f -atime +10 -delete
find /var/tmp -type f -atime +30 -delete

# 8. 如果无法登录,进入单用户模式
# 重启,在GRUB界面按e,在linux16行末尾添加rw init=/bin/bash
# mount -o remount,rw /
# 执行上述清理操作
# exec /sbin/init

# 🔥 长期解决方案
# 1. /var独立分区
# 2. logrotate配置优化
# 3. 设置磁盘空间告警(80%警告,90%严重)

7.2 案例2:误删/lib目录导致系统无法启动

现象 :误执行rm -rf /lib,系统立即崩溃,所有命令失效

根源分析

bash 复制代码
# libc.so.6被删除后,任何依赖它的命令都无法执行
# 包括:ls, cp, mv, rm, bash等
# 系统进入"死亡状态"

救援流程(需要CentOS 7安装介质):

bash 复制代码
# 1. 从CentOS 7安装U盘/DVD启动
# 2. 选择"Troubleshooting" → "Rescue a CentOS system"
# 3. 选择语言和键盘
# 4. 救援模式自动挂载原系统到/mnt/sysimage
# 5. 进入Shell
chroot /mnt/sysimage

# 6. 如果/lib只是被部分删除,从备份恢复
# 如果有完整备份:
cd /mnt/sysimage
tar -xzf /backup/lib-backup.tar.gz

# 7. 如果没有备份,从RPM包重装
# 查找glibc包(包含libc.so.6)
rpm -qf /lib64/libc.so.6  # glibc-2.17-326.el7_9.x86_64

# 从ISO或网络重装
rpm -ivh --force /run/media/CentOS/Packages/glibc-2.17-326.el7_9.x86_64.rpm

# 8. 重建符号链接(CentOS 7)
cd /mnt/sysimage
ln -s usr/lib lib
ln -s usr/lib64 lib64

# 9. 重建库缓存
ldconfig

# 10. 退出并重启
exit
reboot

# 🔥 预防措施
# 1. 使用alias rm='rm -i'
# 2. 使用safe-rm
# 3. 启用文件系统快照(LVM或Btrfs)
# 4. 重要目录定期备份

7.3 案例3:/var/log日志被恶意清空

现象:/var/log/secure文件被清空,无法查看登录记录

检测与恢复

bash 复制代码
# 1. 检查是否启用auditd
systemctl status auditd
# 如果运行,audit.log会记录谁访问了日志

# 2. 查看audit日志
ausearch -f /var/log/secure --start recent
# 显示访问记录,包括进程名、PID、用户

# 3. 如果auditd未启用,检查文件状态
stat /var/log/secure
# 查看最近修改时间

# 4. 检查最近重启记录
last reboot

# 5. 从备份恢复
# 如果有logrotate轮转备份:
ls /var/log/secure-*
# secure-20231114.gz
gzip -d /var/log/secure-20231114.gz
cp /var/log/secure-20231114 /var/log/secure

# 如果没有备份,只能从journal恢复部分
journalctl -u sshd --since "2023-11-14 00:00:00" > /var/log/secure

# 6. 加强日志保护
# 添加不可变属性(防止删除,但logrotate也会失效)
chattr +a /var/log/secure  # 仅追加模式

# 更好的方案:远程日志服务器
# 配置rsyslog转发到远程日志服务器
cat >> /etc/rsyslog.conf <<EOF
*.* @@192.168.1.200:514  # TCP转发
EOF
systemctl restart rsyslog

# 7. 调查入侵迹象
# 检查可疑进程
ps aux | grep -v grep

# 检查网络连接
netstat -tunap | grep ESTABLISHED

# 检查定时任务
for user in $(getent passwd | cut -f1 -d:); do crontab -u $user -l; done

# 检查系统完整性
rpm -Va | grep "^..5"  # 检查被修改的系统文件

# 🔥 严重情况:如果已rootkit入侵,建议重装系统
# 隔离网络,备份数据,重装

7.4 案例4:/etc/fstab配置错误导致启动失败

现象:修改fstab后重启,系统无法启动,进入紧急模式

救援步骤

bash 复制代码
# 1. 系统提示"Give root password for maintenance"或进入dracut紧急模式
# 2. 输入root密码

# 3. 根分区以只读挂载,需重新挂载为读写
mount -o remount,rw /

# 4. 编辑fstab,注释掉错误的行或修正
nano /etc/fstab
# # UUID=错误 /data xfs defaults 0 0

# 5. 如果不知道正确UUID,查看
ls -l /dev/disk/by-uuid/

# 6. 测试挂载
mount -a  # 无输出表示正确

# 7. 重启
reboot

# 🔥 最佳实践
# 1. 修改fstab后必须执行mount -a测试
# 2. 保持当前会话不断开,测试新挂载
# 3. UUID比设备名更可靠(设备名可能变化)
# 4. NFS挂载添加nofail选项,网络不可用时不影响启动
echo "192.168.1.100:/data /mnt/nfs nfs defaults,nofail 0 0" >> /etc/fstab

# 5. 保留备份
cp /etc/fstab /etc/fstab.bak

🎓 八、 最佳实践总结与Checklist

8.1 系统安装阶段

  • /var/home/boot必须独立分区
  • 使用LVM管理,保留10%未分配空间
  • xfs文件系统(/boot用ext4)
  • 设置swap=内存1.5倍(或4GB固定)
  • 启用SELinux(enforcing模式)

8.2 日常运维

  • 修改/etc前必备份:cp file.conf{,.bak}
  • 测试配置:nginx -t,apache2ctl configtest
  • 监控磁盘空间(80%/90%告警)
  • 配置logrotate,清理旧日志
  • 使用visudo编辑sudo配置
  • 定期备份/var/lib/mysql、/var/lib/rpm
  • 使用safe-rm或rm别名
  • 关键目录设置不可变属性(chattr +i)

8.3 安全加固

  • /etc/shadow权限600
  • /tmp权限1777
  • /root权限550
  • SSH禁用root登录(PermitRootLogin no)
  • SSH修改默认端口
  • 配置远程日志服务器
  • 使用auditd审计关键文件访问
  • 定期rpm -Va检查文件完整性

8.4 故障预案

  • 制作CentOS 7救援U盘
  • 关键配置文件/etc备份到远程
  • 创建LVM快照脚本
  • 编写应急联系手册

🎯 结语:尊重结构,驾驭系统

记住:目录结构是Linux的灵魂,破坏结构就是破坏系统!

每个目录都承载着30年Unix/Linux的设计哲学和历史使命:

  • /etc 是系统的"大脑",修改需谨慎
  • /bin/lib是系统的"心脏",绝不可触碰
  • /var是系统的"肠胃",需要定期清理
  • /home是用户的"家园",需要独立和保护
  • /proc/sys是内核的"窗口",只读浏览

掌握这些结构,你将能在Linux世界中:

  • 🔧 快速定位故障根源
  • 🛡️ 避免毁灭性操作
  • 📈 合理规划磁盘资源
  • 🚨 及时预警潜在风险
  • 🎓 深入理解系统本质

记住黄金法则:在不确定时,先备份,再测试,最后应用!


🎉希望这份指南能帮助你深入理解CentOS 7文件系统的精髓!掌握这些结构,你将能在Linux世界中游刃有余。有任何疑问,随时欢迎交流探讨!



📖原文: 不要太过在意别人的目光,你只要记得,你不是为别人而活着,你为的,是你自己。 -- 《斗破苍穹》

⌛怡然 : ...



🪁 LuminKu looks forward to seeing you again 🌌


相关推荐
大白菜13243 小时前
进程的信号
linux
XH-hui3 小时前
【打靶日记】群内靶机Secure
linux·网络安全
Shingmc33 小时前
【Linux】进程控制
linux·服务器·算法
视觉装置在笑7133 小时前
Shell 变量基础与进阶知识
linux·运维
Web极客码4 小时前
如何通过命令行工具检查 Linux 版本信息
linux·运维·服务器
Lynnxiaowen4 小时前
今天我们继续学习Kubernetes内容pod资源对象
运维·学习·容器·kubernetes·云计算
欢鸽儿4 小时前
Vitis】Linux 下彻底清除启动界面 Recent Workspaces 历史路径
linux·嵌入式硬件·fpga
繁华似锦respect5 小时前
C++ 智能指针底层实现深度解析
linux·开发语言·c++·设计模式·代理模式
远程软件小帮手5 小时前
云电脑挂机功能上线!边上班摸鱼边游戏多开教程
运维·服务器
hweiyu006 小时前
Linux 命令:dd
linux