LinuxNotes

第 03 章:文件与目录

zjc 于 2026-01-03 发布

这是《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

结论:日志文件被删除,但进程仍持有文件描述符。

处理:

  1. 先确认日志是否仍需要;
  2. 通过重载日志组件或滚动进程释放;
  3. 必要时安排业务低峰重启;
  4. 修复 logrotate 和磁盘告警。

案例:软链接悬空

ls -l /opt/app/current
readlink -f /opt/app/current
test -e /opt/app/current && echo OK || echo BROKEN

发布系统应在切换后立即验证链接目标和服务健康状态。

本章小结

文件系统围绕目录项、inode 和数据块组织。目录权限控制的是条目访问能力,普通文件权限控制的是内容访问能力。软链接适合发布切换,硬链接适合同一文件系统内的多路径引用。磁盘排查要同时看容量和 inode,并注意被进程占用的已删除文件。

思考题

  1. 为什么删除一个仍在被写入的日志文件,磁盘空间不会立即释放?
  2. 目录的 rx 权限有什么区别?
  3. 硬链接和软链接分别适合哪些场景?
  4. df -h 正常但创建文件失败,还需要检查什么?
  5. 设计一个发布目录结构,支持版本保留和快速回滚。