当前位置: 首页 > news >正文

【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 案例解析

# ✅ 正确:在子目录下操作
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+个命令)
# 核心命令
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 案例深度解析
# 验证链接关系
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 默认内容详解
/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 案例深度解析
# 查看当前内核版本
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 第三层核心子目录
/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 案例深度解析
# 查看设备文件类型和权限
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- 用户账户信息 ⭐⭐⭐
# 文件格式(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可读)⭐⭐⭐⭐⭐
# 文件格式(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- 静态文件系统信息(🔥高危)⭐⭐⭐⭐⭐
# 文件格式(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- 静态主机名解析 ⭐⭐
# 格式: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+)⭐
# 内容仅一行:主机名
web01.example.com# 修改方法(3种):
# 方法1:hostnamectl(推荐)
hostnamectl set-hostname web01# 方法2:直接修改文件
echo "web01" > /etc/hostname# 方法3:nmtui图形界面
nmtui# 注意:修改后需重启或重新登录生效
# 不影响正在运行的网络服务
/etc/resolv.conf- DNS配置 ⭐⭐
# 格式:
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/- 系统服务配置目录 ⭐⭐
# 关键子目录:
/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仓库配置 ⭐⭐
# 格式: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服务目录 ⭐⭐⭐⭐
# 存放用户自定义服务单元和覆盖配置
/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服务配置 ⭐⭐⭐⭐⭐
/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/- 日志轮转配置 ⭐⭐
# 防止日志占满磁盘
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 || trueendscript
}# 测试配置
logrotate -d /etc/logrotate.d/nginx  # 调试模式
logrotate -f /etc/logrotate.d/nginx  # 强制轮转
/etc/sudoers.d/- sudo权限配置(推荐方式)⭐⭐⭐
# 替代直接编辑/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/- 环境变量脚本 ⭐⭐
# 存放以.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 第三层结构
/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 - 家目录模板
# 创建新用户时,自动复制/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 案例深度解析
# ✅ 正确:创建用户并指定家目录
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 第三层结构
/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 案例深度解析
# 查看程序依赖的库
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 实践案例
# 挂载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 实践案例
# 现代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 第三层结构
/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 案例深度解析
# 安装大型软件到/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详细信息
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- 内存详情
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 ]; thenecho "WARNING: Memory usage is high!"
fi
/proc/<PID>/ 目录- 进程信息宝库 ⭐⭐⭐⭐⭐
# 每个进程一个目录,以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/- 内核参数调优 ⭐⭐⭐⭐⭐
# 可写的内核参数,实时生效
# 相当于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中断点续传
# /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 第三层结构
/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 安全最佳实践
# 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 第三层结构
/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 案例解析
# 查看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 默认内容分类
# 磁盘管理
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 案例深度解析
# 查看链接关系
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 第三层结构
/srv/
├── www/                 # Web服务器数据
│   ├── html/           # HTML文档根目录(替代/var/www/html)
│   ├── cgi-bin/        # CGI脚本
│   └── assets/         # 静态资源
├── ftp/                 # FTP服务器数据
│   ├── pub/            # 公共下载区(匿名访问)
│   └── upload/         # 上传区(需权限)
└── samba/               # Samba共享└── share/          # 共享目录
3.13.3 案例深度解析
# 配置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 FollowSymLinksAllowOverride NoneRequire 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 第三层结构
/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 案例深度解析
# 查看网卡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 案例深度解析
# 查看正确的/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 第三层庞大结构
/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 - 本地编译软件最佳实践 ⭐⭐⭐
# 编译安装软件到/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 案例深度解析
# 查看手册页存储位置
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/- 日志文件仓库 ⭐⭐⭐⭐⭐
/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日志(二进制)└── ...

日志轮转机制

# 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

日志分析实战

# 实时监控日志
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/- 应用状态数据(极其重要!)⭐⭐⭐⭐⭐
/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状态

关键数据库保护

# 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/- 任务队列
/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/- 应用缓存
/var/cache/
├── yum/                 # Yum缓存(可清理)
│   └── x86_64/7/
│       ├── base/
│       └── epel/
├── dnf/                 # DNF缓存
└── httpd/               # Apache缓存# 清理缓存
yum clean all
# 清理后空间释放
du -sh /var/cache/yum/
/var/tmp/- 持久临时文件
# 与/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 标准权限矩阵

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

4.2 特殊权限详解

  • 粘滞位(t)/tmp1777权限,允许所有用户创建文件,但只能删除自己的文件
  • SetUID(s)/usr/bin/passwd4755,普通用户执行时获得root权限
  • SetGID(s)/usr/bin/wall2755,执行时获得组权限
# 查看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 kernelpackage-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 高危命令审计

# 记录所有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 数据存放原则(🎓必须遵守)

# ✅ 配置 → /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 磁盘空间规划建议

# 生产环境推荐分区方案
/           : 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 故障排查路径(🚨快速定位)

# 系统无法启动 → /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超时

紧急处理

# 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,系统立即崩溃,所有命令失效

根源分析

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

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

# 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文件被清空,无法查看登录记录

检测与恢复

# 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后重启,系统无法启动,进入紧急模式

救援步骤

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

http://www.dtcms.com/a/618311.html

相关文章:

  • linux服务-rsync+inotify文件同步-ssh
  • 保障房建设网站首页游戏策划
  • 深度学习杂草分割系统1:数据集说明(含下载链接)
  • 超分辨率重建(Super-Resolution, SR)
  • 高端品牌网站建设注意事项制作ppt的基本做法
  • 2025 年 Redis 面试天花板
  • component-富文本实现(WangEditor)
  • 烟台城乡住房建设厅网站网站alt标签
  • win11上使用Workbench备份mysql数据库
  • B站评论数据采集:基于Requests的智能爬虫实战
  • 信息学与容斥
  • 网易云音乐评论数据采集:基于Requests的智能爬虫实战
  • 网站空间登录网站建设模式有哪些内容
  • VSCode 中快捷键的使用:(大小写转换快捷键、自动补全函数注释快捷键、代码和注释自动缩进快捷键)
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 25--数据驱动--参数化处理 Excel 文件 2
  • SpringCloud微服务笔记
  • 广告公司网站官网安徽网站建设流程
  • 华为OD机试真题2025双机位A卷 --【压缩日志查询】(Python C++ JAVA JS GO)
  • 网站编辑怎么做内容分类手机网站 程序
  • 瑞安建设网站成都vr 网站开发
  • C++多线程【数据共享】之互斥锁
  • Java漏洞集合工具
  • JavaScript 正则表达式详解
  • 【CS创世SD NAND征文】高可靠性数控设备:技术方案与行业展望
  • 深入理解Go语言Slice的append操作:从内存分配到扩容机制
  • Linux---文件控制<fcntl.h> (file control, fcntl)
  • 网站放到服务器珠海市 网站建设
  • 农林科技公司网站模板seo研究中心官网
  • 东莞响应式网站哪家好架设网站开发环境
  • 类似淘宝网站建设有哪些模板wordpress文章图片全屏浏览