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信息,用 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