先不要从 ls、grep、.vimrc 开始。对外能讲清楚的,是这两件事:
- 磁盘上的「一个文件」由哪几部分组成
/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 是「能否进入」,没有它即使有 r 也 cd 不进去。
/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>/cmdline、status、fd/ |
某个进程的命令行、状态、打开的描述符 |
/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 的事。