返回归档
🌑网络与 Linux

Linux 里文件是什么:目录项、inode、/proc

文件名在目录项里,元数据和数据块指针在 inode 里。/proc 不是盘上的目录,是内核用文件接口露出的状态。先认清这两层,再谈权限和进程。

文章目录

先不要从 lsgrep.vimrc 开始。对外能讲清楚的,是这两件事:

  1. 磁盘上的「一个文件」由哪几部分组成
  2. /proc 为什么看起来像目录,却不是一块盘

命令手册可以以后再翻。下面按一次 cat /etc/passwd 的路径走。

目录项、inode、数据块

多数 Linux 文件系统(ext4 仍是这个模型)把一个文件拆成三截:

  • 目录项:文件名 → inode 号。名字只活在这里
  • inode:权限、属主、时间戳、链接数、数据块指针。没有文件名
  • 数据块:内容本身。磁盘上扇区通常 512 字节,文件系统按 block 读写,常见 4 KiB

所以硬链接是「又一个目录项指向同一个 inode」,软链接是「一个文件,内容是另一条路径」。stat 看的是 inode,不是文件名:

$ stat admin-user.yaml
  File: admin-user.yaml
  Size: 382             Blocks: 8          IO Block: 4096   regular file
  Inode: 12900          Links: 1
  Access: (0644/-rw-r--r--)  Uid: (0/root)  Gid: (0/root)
  Access: ...  Modify: ...  Change: ...

三个时间:atime 上次读,mtime 内容上次改,ctime inode 上次改(权限、属主变了也会动)。Change 不是创建时间。

权限串 drwxr-xr-x 第一位是类型(- 文件、d 目录、l 符号链接、b/c 设备),后面九位是 owner / group / other。目录的 x 是「能否进入」,没有它即使有 rcd 不进去。

/etc/passwd 一行一个账户:名字:x:UID:GID:注释:家目录:shell。密码在 /etc/shadow,这里的 x 只是占位。

常见目录各管什么

/ 是根,上面可以有文件(lost+found 就在某些根上)。不是「根下只能放目录」。

路径 放什么
/bin/sbin 基础命令;sbin 更偏管理
/usr 发行版装的用户态程序和库。不是 /user
/etc 配置
/var 会变长的数据,日志、队列
/home 各用户家目录
/boot 内核和引导
/dev 设备节点
/proc/sys 内核接口,不是普通磁盘

/proc 是内核的文件接口

/proc 不占一块真实分区,内容是内核现算的。把它当 API 用:

路径 读到什么
/proc/cpuinfo/proc/meminfo CPU、内存。看可用内存用 MemAvailable,别只看 MemFree
/proc/uptime 两个数:系统已运行秒数,所有 CPU 空闲秒数之和
/proc/<pid>/cmdlinestatusfd/ 某个进程的命令行、状态、打开的描述符
/proc/sys/net/ipv4/ip_forward 读写就是改内核参数,等价于 sysctl

负载看 uptime 里的三个平均数(1 / 5 / 15 分钟)。数值要对照逻辑核数:8 核上 load 1 很闲,load 16 才是在排队。

进程已经退出、父进程还没 wait,会留下僵尸:不占 CPU,占一个 PID。PID 耗尽就 fork 不出新进程。该收的是父进程,杀僵尸本身没有用。

排障时那几条就够

df -h              # 分区还剩多少
du -h -d 1         # 当前目录下一层谁在吃空间
ss -lntu           # 谁在听端口
lsof -i :8080      # 这个端口是哪个进程
ps aux | grep zsh

grep -v 是反向匹配。-r 是递归目录,不是 invert。管道把左边的 stdout 接到右边的 stdin;tee 再分一份写进文件。

块设备怎么切成可扩容的卷,是下一篇 LVM 的事。