3、Linux文件系统与权限管理

聊到Linux,绕不开的就是文件系统。我刚开始接触Linux那会儿,觉得这东西挺玄乎的——不就是存个文件吗?后来线上出过一次事故,才明白文件系统底层那点事,不懂是真不行。

今天咱们就把这块掰开揉碎了讲。从文件系统结构,到inode和block,再到软硬链接,最后是权限管理。嗯,内容不少,但都是干货。

3.1 文件系统结构

Linux文件系统是个树形结构,从根(/)开始。你想想看,不管你有多少块硬盘、多少个分区,最终都挂载到这个树上的某个目录。

常见的目录结构是这样的:

/          —— 根目录,一切从这里开始
/bin       —— 用户二进制命令,比如ls、cp
/sbin      —— 系统管理命令,比如fdisk
/etc       —— 配置文件,我调过最多的就是这里
/var       —— 可变数据,日志、缓存都在这里
/tmp       —— 临时文件,重启就没了
/home      —— 用户家目录
/root      —— root用户的家
/usr       —— 用户程序和数据
/dev       —— 设备文件,硬件抽象成文件
/proc      —— 进程信息,虚拟文件系统

我个人习惯,排查问题时先看 /var/log,再看 /proc。这两个目录能告诉你系统80%的状态。

3.2 inode与block

文件存在硬盘上,但Linux怎么找到它?靠的是inode和block。

inode 是索引节点,存的是文件的元数据——权限、所有者、大小、时间戳,还有指向数据块的指针。但不存文件名。

block 是数据块,存的是文件的实际内容。

我画了一张图,帮你理解它们的关系:

目录项 文件名 + inode号 inode表 权限、大小、时间戳 数据块指针列表 数据块1 数据块2 数据块3 查找文件流程: 文件名 → inode号 → inode表 → 数据块指针 → 文件内容

查看inode信息,用 stat 命令:

stat /etc/passwd

输出里能看到inode号、块大小、权限、时间戳。我在项目中遇到过,磁盘空间没满但写不了文件,一查是inode用完了。小文件太多,把inode表撑爆了。

关键点:

  • inode数量在格式化时固定,用 df -i 查看
  • block大小影响磁盘性能,默认4KB
  • 移动文件在同一分区内,inode不变;跨分区移动,inode会变

3.3 软硬链接

链接是Linux里一个巧妙的设计。说白了,就是给文件起多个名字。

硬链接:多个文件名指向同一个inode。删除一个,其他还在。不能跨分区,不能链接目录。

软链接:一个独立的文件,内容是指向另一个文件的路径。可以跨分区,可以链接目录。原文件删了,软链接就断了。

# 创建硬链接
ln /data/file1 /data/file2

# 创建软链接
ln -s /data/file1 /data/link_to_file1

我记得有一次,同事误删了一个关键日志文件,幸好之前做了硬链接,数据没丢。嗯,硬链接在备份场景下特别好用。

特性 硬链接 软链接
inode 与原文件相同 不同
跨分区 不支持 支持
链接目录 不支持 支持
原文件删除 仍可访问 链接失效

小技巧:ls -li 查看inode号,一眼就能看出哪些是硬链接。软链接用 ls -l 会显示 -> 指向。

3.4 文件权限:ugo/rwx

Linux权限模型,简单说就是三组权限:用户(u)、组(g)、其他人(o)。每组三个权限:读(r)、写(w)、执行(x)。

# 查看权限
ls -l /etc/passwd
# 输出:-rw-r--r-- 1 root root 1234 Jan 1 12:00 /etc/passwd

权限位拆解:

  • 第一位:文件类型(-普通文件,d目录,l链接)
  • 第2-4位:所有者权限(rw-)
  • 第5-7位:所属组权限(r--)
  • 第8-10位:其他人权限(r--)

修改权限用 chmod

# 数字法:r=4, w=2, x=1
chmod 755 script.sh

# 符号法
chmod u+x script.sh
chmod g-w script.sh

我刚开始做运维时,经常搞混数字权限。后来记了个口诀:所有者最高,组次之,其他人最低。755就是所有者全权限,组和他人只读和执行。

注意:目录的执行权限(x)意味着可以进入该目录。没有x权限,即使有r权限也进不去。我曾经遇到过,给目录设了644,结果所有人都进不去,排查了半天。

3.5 ACL:访问控制列表

传统的ugo模型有个局限——只能设一个所有者和一个组。如果想让多个用户或组有不同权限,就得用ACL。

ACL可以给任意用户或组单独设置权限,粒度更细。

# 查看ACL
getfacl /data/project

# 设置ACL
setfacl -m u:zhangsan:rwx /data/project
setfacl -m g:devteam:rx /data/project

# 删除ACL
setfacl -x u:zhangsan /data/project

ls -l 查看时,如果权限位后面有个 +,说明这个文件或目录启用了ACL。

实战场景:我在管理一个共享目录时,需要让A组有读写权限,B组只有读权限,C组完全不能访问。用传统权限做不到,ACL轻松搞定。

3.6 特殊权限:SUID/SGID/Sticky

这三个特殊权限,平时用得不多,但用对了能解决大问题。

SUID(Set UID):执行文件时,临时拥有文件所有者的权限。典型例子是 /usr/bin/passwd,普通用户用它改密码时,临时获得root权限。

SGID(Set GID):对文件,执行时临时拥有文件所属组的权限。对目录,新创建的文件自动继承目录的组。

Sticky Bit:只对目录有效。用户只能删除自己的文件,不能删别人的。典型例子是 /tmp

# 设置SUID
chmod u+s /usr/bin/myapp
# 或 chmod 4755 /usr/bin/myapp

# 设置SGID
chmod g+s /data/shared
# 或 chmod 2755 /data/shared

# 设置Sticky Bit
chmod o+t /tmp
# 或 chmod 1777 /tmp

查看特殊权限:

  • SUID:所有者执行位变成 s(如 -rwsr-xr-x
  • SGID:组执行位变成 s(如 -rwxr-sr-x
  • Sticky:其他人执行位变成 t(如 drwxrwxrwt

安全提醒:SUID权限要慎用。我曾经见过有人给bash设了SUID,结果普通用户直接提权成root,系统被攻破。非必要不设SUID。

好了,文件系统和权限管理这块,核心内容就这些。从inode到block,从软硬链接到ugo权限,再到ACL和特殊权限,每个点都是日常运维中会碰到的。你想想看,搞懂了这些,排查文件相关的问题是不是心里就有底了?


公众号:蓝海资料掘金营,微信deep3321