跳到主要内容

Linux 文件系统与核心命令速查


一、VFS 虚拟文件系统抽象层

Linux 通过 VFS(Virtual File System) 提供统一的文件操作接口,屏蔽底层具体文件系统(ext4、xfs、tmpfs 等)的差异。

1.1 核心数据结构

结构作用驻留位置
superblock文件系统元信息(块大小、inode 总数等)磁盘 + 内存缓存
inode文件元数据(权限、大小、时间戳、数据块指针)磁盘 + inode cache
dentry目录项,文件名 → inode 的映射仅内存(dentry cache)
file进程打开文件的实例(偏移量、标志位)内核进程表

关键理解:文件名保存在 dentry,而非 inode。硬链接本质是多个 dentry 指向同一 inode;软链接是一个独立 inode,内容为目标路径字符串。

# 查看文件 inode 编号
ls -i /etc/hosts

# 硬链接计数
stat /etc/hosts | grep "Links"

# 创建硬链接(同文件系统)
ln source.txt hard_link.txt

# 创建软链接(跨文件系统可用)
ln -s /etc/nginx/nginx.conf /home/user/nginx.conf

1.2 文件系统挂载

# 查看已挂载文件系统
mount | column -t
df -hT

# 查看文件系统类型与挂载选项
cat /proc/mounts

# 临时挂载 ext4 磁盘
mount -t ext4 /dev/sdb1 /mnt/data

# 永久挂载(写入 /etc/fstab)
# UUID=xxxx /mnt/data ext4 defaults,noatime 0 2

二、目录结构与核心路径

/
├── bin/ → 基础用户命令(ls, cp, mv)
├── sbin/ → 系统管理命令(iptables, fdisk)
├── etc/ → 配置文件
├── var/ → 可变数据(日志、缓存、锁文件)
├── tmp/ → 临时文件(重启清空)
├── home/ → 用户主目录
├── root/ → root 用户主目录
├── proc/ → 进程与内核信息虚拟文件系统
├── sys/ → 内核设备信息(sysfs)
├── dev/ → 设备文件
├── lib/ → 共享库
└── usr/ → 用户程序(/usr/bin, /usr/lib)

/proc 重点文件

路径内容
/proc/cpuinfoCPU 型号、核数、频率
/proc/meminfo内存使用详情
/proc/net/tcpTCP 连接表(16进制)
/proc/sys/net/内核网络参数(可动态调整)
/proc/<pid>/fd/进程打开的文件描述符
/proc/<pid>/maps进程虚拟内存映射
/proc/<pid>/status进程状态、内存占用

三、核心命令深度用法

3.1 文件查找 find

# 查找 7 天内修改的 .log 文件
find /var/log -name "*.log" -mtime -7

# 查找大于 100MB 的文件
find / -size +100M -type f 2>/dev/null

# 查找并批量删除(-exec 效率低,xargs 更快)
find /tmp -name "*.tmp" -mtime +3 | xargs rm -f

# 查找某用户的文件
find /home -user deploy -type f

# 查找有 SUID 位的危险文件(安全审计)
find / -perm -4000 -type f 2>/dev/null

3.2 文本处理三剑客

awk — 列处理引擎

# 打印第 1、3 列(默认空格分隔)
awk '{print $1, $3}' access.log

# 以冒号分隔,打印用户名和 shell
awk -F: '{print $1, $7}' /etc/passwd

# 统计 HTTP 状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn

# 累加某列求和
awk '{sum += $5} END {print "Total:", sum}' data.txt

# 条件过滤:打印响应时间 > 1s 的行
awk '$NF > 1.0' access.log

sed — 流编辑器

# 原地替换(-i 直接修改文件)
sed -i 's/old_string/new_string/g' config.conf

# 删除空行
sed -i '/^$/d' file.txt

# 删除注释行(以 # 开头)
sed -i '/^#/d' file.txt

# 在第 5 行后插入内容
sed -i '5a\new_line_content' file.txt

# 打印第 10-20 行
sed -n '10,20p' large_file.log

grep — 正则搜索

# 递归搜索,显示行号,忽略大小写
grep -rni "NullPointerException" /var/log/app/

# 排除目录
grep -r "error" /var/log --exclude-dir={.git,node_modules}

# 显示匹配行的前后 3 行(上下文)
grep -A 3 -B 3 "OutOfMemoryError" app.log

# 统计匹配行数
grep -c "ERROR" app.log

# 使用扩展正则(ERE)
grep -E "ERROR|FATAL|WARN" app.log

3.3 xargs 高效批处理

# 将 find 结果传给 grep(并行执行)
find . -name "*.java" | xargs grep -l "ThreadLocal"

# 限制每次传入参数数量
echo "a b c d e" | xargs -n 2 echo

# 并行执行(-P 4 使用 4 个并发进程)
cat urls.txt | xargs -P 4 -I {} curl -s {}

# 处理含空格的文件名(配合 -print0)
find . -name "*.log" -print0 | xargs -0 rm

3.4 磁盘与空间

# 查看磁盘空间(人类可读)
df -h

# 查看目录占用大小(按大小排序)
du -sh /* 2>/dev/null | sort -rh | head -20

# 查看指定目录下各子目录大小
du -h --max-depth=1 /var/log

# 查找磁盘占用最大的文件
find / -type f -printf '%s %p\n' 2>/dev/null | sort -rn | head -10

四、Shell 脚本实战

4.1 脚本基础模板

#!/bin/bash
set -euo pipefail # 遇错退出(-e)、未声明变量报错(-u)、管道错误传播(-o pipefail)

# 日志函数
log() { echo "[$(date '+%F %T')] INFO $*"; }
warn() { echo "[$(date '+%F %T')] WARN $*" >&2; }
die() { echo "[$(date '+%F %T')] ERROR $*" >&2; exit 1; }

# 参数校验
[[ $# -lt 1 ]] && die "用法: $0 <config_file>"
CONFIG="$1"
[[ -f "$CONFIG" ]] || die "配置文件不存在: $CONFIG"

log "开始处理: $CONFIG"

4.2 常用模式

# 检查进程是否运行
is_running() {
pgrep -f "$1" > /dev/null 2>&1
}

# 带超时的循环等待
wait_for_port() {
local host=$1 port=$2 timeout=${3:-30}
for i in $(seq 1 $timeout); do
nc -z "$host" "$port" 2>/dev/null && return 0
sleep 1
done
die "端口 $host:$port 在 ${timeout}s 内未就绪"
}

# 安全的临时目录(脚本退出自动清理)
TMPDIR=$(mktemp -d)
trap "rm -rf $TMPDIR" EXIT

五、文件权限深度解析

5.1 rwx 权限位

-rwxr-xr-- 1 user group 1024 Jan 1 00:00 script.sh
│└┬┘└┬┘└┬┘
│ │ │ └── other: r-- (4)
│ │ └───── group: r-x (5)
│ └──────── owner: rwx (7)
└────────── 文件类型: - 普通文件 d 目录 l 软链接

5.2 特殊权限位

权限数值文件效果目录效果
setuid4000以文件所有者身份执行(如 /usr/bin/passwd无效
setgid2000以文件所属组身份执行新建文件继承目录组
sticky1000只有文件所有者可删除(如 /tmp
# 设置 setuid
chmod u+s /usr/local/bin/my_tool
# 等价于
chmod 4755 /usr/local/bin/my_tool

# 设置目录 sticky bit(共享目录保护)
chmod +t /tmp/shared

5.3 ACL 细粒度权限

# 查看 ACL
getfacl /var/www/html

# 给特定用户加写权限(不改变原有权限)
setfacl -m u:deploy:rw /var/www/html/index.html

# 给特定组加执行权限
setfacl -m g:devops:rx /opt/scripts/

# 删除 ACL
setfacl -x u:deploy /var/www/html/index.html