【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 🌌


相关推荐
大锦终2 小时前
【Linux】高级IO
linux·服务器·网络·c++
LCG元3 小时前
Linux 下高效开发环境搭建:VSCode Remote + 容器开发
linux
哈里谢顿3 小时前
深入理解 Linux 系统 PATH 目录:从理论到实践
linux
可可苏饼干3 小时前
TOMCAT
java·运维·学习·tomcat
刘延林.4 小时前
树莓派 5 上 Ubuntu 24.04 LTS 自带 RDP 远程桌面重启密码就变
linux·运维·ubuntu
我不是醉忧4 小时前
RedHat系统搭建DNS主从服务器
linux·运维·服务器
大神的风范4 小时前
linux之ubuntu qt界面开发开发点菜系统
linux·qt·ubuntu
正在努力的小河4 小时前
Linux SPI 驱动实验
linux·运维·服务器
adnyting4 小时前
【Linux日新月异(九)】CentOS 7其他常用命令大全:系统操作与管理必备技巧
linux·运维·centos