🌌提供:
- 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 核心特性
- 权限 :
550或700,严格禁止其他用户访问 - 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(通常挂载到内存)
- 权限 :
1777(rwxrwxrwt)- 粘滞位(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) :
/tmp的1777权限,允许所有用户创建文件,但只能删除自己的文件 - SetUID(s) :
/usr/bin/passwd的4755,普通用户执行时获得root权限 - SetGID(s) :
/usr/bin/wall的2755,执行时获得组权限
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 🌌