这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Linux 以统一目录树组织所有资源。理解文件类型、目录结构、链接、元数据、时间戳和 inode,是排查“文件删了但磁盘没释放”“目录无法进入”“硬链接和软链接差异”等问题的前提。
3.1 目录结构回顾
/
|-- bin -> usr/bin
|-- boot
|-- dev
|-- etc
|-- home
|-- opt
|-- proc
|-- root
|-- srv
|-- sys
|-- tmp
|-- usr
+-- var
常见目录:
| 目录 | 用途 |
|---|---|
/etc |
配置 |
/home |
普通用户家目录 |
/root |
root 家目录 |
/var/log |
日志 |
/var/lib |
服务状态数据 |
/opt |
第三方软件 |
/srv |
服务数据 |
/tmp |
临时文件 |
/dev |
设备 |
/proc |
进程与内核信息 |
/sys |
设备与内核参数 |
不要把业务大文件随意放在 /root 或 /tmp。/tmp 可能被清理策略影响。
3.2 查看与创建
查看:
pwd
ls -lah
ls -ld /opt/app
stat app.conf
file app.bin
创建与删除:
mkdir deploy
mkdir -p app/conf/app-config
touch app.log
rmdir empty-dir
rm app.log
rm -r old-app
复制与移动:
cp app.conf app.conf.bak
cp -a /opt/app /opt/app.bak
cp -r conf /tmp/conf
mv app.log archive/
mv old.conf new.conf
rename 's/.log$/.old/' *.log
cp -a 会尽量保留权限、属主和时间戳。跨文件系统时行为可能受支持能力影响。
3.3 文件类型
ls -lh /dev/sda
ls -l /etc/nginx/nginx.conf
stat /var/run
首字符含义:
| 字符 | 类型 |
|---|---|
- |
普通文件 |
d |
目录 |
l |
符号链接 |
b |
块设备 |
c |
字符设备 |
s |
socket |
p |
命名管道 |
查看进程打开的 socket:
ss -lntp
lsof -nP -p <pid>
3.4 inode 与文件名
inode 保存文件元数据:
inode
|-- 文件类型与权限
|-- 属主与属组
|-- 大小
|-- 时间戳
|-- 链接计数
|-- 数据块指针
+-- 指向 dir entry 的文件名在目录项中,不在 inode 中
查看 inode:
ls -i app.log
df -ih
stat app.log
典型问题:
| 现象 | 常见原因 |
|---|---|
df -h 有空间,创建文件报错 |
inode 耗尽 |
| 删除大日志后磁盘不释放 | 文件仍被进程打开 |
| 目录有写权限但不能创建 | 目录执行权限缺失或配额限制 |
| 文件名存在但内容异常 | 应用写入方式或路径错误 |
处理被进程占用的已删除文件:
lsof +L1
ls -l /proc/<pid>/fd
处理方式通常是重载或重启对应进程,先评估业务影响。
3.5 链接
软链接示例:
ln -s /opt/app/current /opt/app/latest
ls -l /opt/app/latest
readlink -f /opt/app/latest
硬链接示例:
echo hello > a.txt
ln a.txt b.txt
ls -li a.txt b.txt
rm a.txt
cat b.txt
| 特性 | 硬链接 | 软链接 |
|---|---|---|
| 本质 | 指向同一 inode | 指向路径 |
| 跨文件系统 | 通常不可 | 可以 |
| 链接目录 | 一般不允许 | 可以 |
| 目标删除后 | 数据仍可访问 | 可能悬空 |
| 大小 | 元数据角度相同 | 存路径字符串 |
发布目录常使用软链接:
/opt/app/releases/v1
/opt/app/releases/v2
/opt/app/current -> /opt/app/releases/v2
切换时只切换 current,并确保应用按真实路径解析配置。
3.6 时间戳
stat 常见字段:
| 字段 | 含义 |
|---|---|
| Access | 访问时间 |
| Modify | 内容修改时间 |
| Change | inode 元数据变化时间 |
| Birth | 创建时间,支持情况与文件系统有关 |
示例:
stat app.log
touch -d '2026-08-25 10:00:00' app.log
find /var/log -type f -mtime +7
find /var/log -type f -mmin -60
时间可能受 relatime、挂载选项和文件系统实现影响。审计场景要以审计系统和时间同步策略为准。
3.7 文件与目录权限
drwxr-xr-x
| | | |
| | | +-- others: r-x
| | +----- group : r-x
| +-------- owner : rwx
+---------- directory
普通文件权限:
| 权限 | 对文件 |
|---|---|
| r | 可读内容 |
| w | 可修改内容 |
| x | 可执行 |
目录权限:
| 权限 | 对目录 |
|---|---|
| r | 可列出条目名 |
| w | 可创建、删除、重命名条目 |
| x | 可进入目录并访问 inode |
只给目录读权限时,能看到文件名,但不能读取文件属性和内容。
修改:
chmod 644 app.conf
chmod 750 deploy.sh
chmod u+x deploy.sh
chmod g-w app.conf
chown app:app app.conf
chgrp app app.conf
递归修改要谨慎:
chown -R app:app /opt/app
find /opt/app -type d -exec chmod 750 {} +
find /opt/app -type f -exec chmod 640 {} +
3.8 特殊权限
Set UID:
chmod u+s /usr/bin/passwd
执行者临时获得文件属主权限。系统会严格限制这类程序。
Set GID:
mkdir /srv/share
chgrp app /srv/share
chmod 2775 /srv/share
目录中新文件继承目录属组,便于团队共享。
Sticky Bit:
chmod 1777 /tmp
ls -ld /tmp
常见权限数字:
| 数字 | 含义 |
|---|---|
| 4755 | Set UID + rwxr-xr-x |
| 2775 | Set GID + rwxrwxr-x |
| 1777 | Sticky + rwxrwxrwx |
特殊权限会扩大影响面,业务程序中不应随意使用。
3.9 磁盘占用分析
df -hT
df -ih
du -sh /var/log
du -h --max-depth=2 /var | sort -h
ncdu /var
排查思路:
df 确认文件系统水位
-> du 定位大目录
-> find 定位大文件
-> lsof +L1 检查已删除但被占用文件
-> 确认日志轮转和清理策略
示例:
find /var -xdev -type f -size +100M -printf '%s %p\n' |
sort -nr | head -20
删除日志前确认应用轮转策略:
ls -lh /var/log/nginx
grep -R 'rotate' /etc/logrotate* 2>/dev/null
3.10 压缩与归档
tar -czf app-$(date +%F).tar.gz /opt/app
tar -xzf app-2026-08-25.tar.gz -C /tmp
tar -tf app-2026-08-25.tar.gz | head
gzip app.log
gunzip app.log.gz
zcat app.log.gz | head
bzip2 app.log
xz app.log
zip -r app.zip /opt/app
unzip app.zip -d /tmp/app
常用格式:
| 格式 | 命令 | 特点 |
|---|---|---|
.tar.gz |
tar -czf |
兼容好,常见 |
.tar.xz |
tar -cJf |
压缩率高,耗时更长 |
.tar.bz2 |
tar -cjf |
介于两者之间 |
.zip |
zip |
跨平台常见 |
解包前先查看内容,避免把大量文件直接释放到当前目录。
3.11 生产案例
案例:磁盘满但找不到大文件
现象:
df 显示 95%
du 汇总明显小于 df
排查:
df -hT
du -sh /var/* 2>/dev/null
lsof +L1
dmesg -T | tail
结论:日志文件被删除,但进程仍持有文件描述符。
处理:
- 先确认日志是否仍需要;
- 通过重载日志组件或滚动进程释放;
- 必要时安排业务低峰重启;
- 修复 logrotate 和磁盘告警。
案例:软链接悬空
ls -l /opt/app/current
readlink -f /opt/app/current
test -e /opt/app/current && echo OK || echo BROKEN
发布系统应在切换后立即验证链接目标和服务健康状态。
本章小结
文件系统围绕目录项、inode 和数据块组织。目录权限控制的是条目访问能力,普通文件权限控制的是内容访问能力。软链接适合发布切换,硬链接适合同一文件系统内的多路径引用。磁盘排查要同时看容量和 inode,并注意被进程占用的已删除文件。
思考题
- 为什么删除一个仍在被写入的日志文件,磁盘空间不会立即释放?
- 目录的
r和x权限有什么区别? - 硬链接和软链接分别适合哪些场景?
df -h正常但创建文件失败,还需要检查什么?- 设计一个发布目录结构,支持版本保留和快速回滚。