02
文件系统与目录结构
Filesystem Hierarchy · FHS
Windows 是"每个盘一根树"(C:、D:、E:),Linux 是"全世界只有一棵树":从根目录 / 出发,所有硬盘、U盘、外接设备全都"挂载"进这棵树里。搞懂目录结构,你就不会在系统里迷路。
念"Linux 一切皆文件"
这句话是 Linux 的哲学。在 Linux 眼里,普通文件是文件、目录是文件、硬盘是文件、键盘和内存也是文件。你想跟设备打交道,很多时候就是去读它对应的那个"文件"(比如 /dev/sda 就是第一块硬盘)。统一了世界,命令自然就统一了。
FHS 标准:这棵树长什么样
所有人约定俗成的目录职责叫 FHS(文件系统层次标准)。不用背,混个眼熟,用到再回来查:
| 目录 | 里面放什么(人话版) |
|---|---|
/ | 根目录,整棵树的起点。没有盘符,一切从这里出发。 |
/bin /sbin | 最基础的命令和管理员命令(ls、cp、shutdown)。现代系统多是指向 /usr/bin 的软链。 |
/etc | 系统和服务的配置文件全在这。改配置先来这翻,比如 /etc/ssh/sshd_config。 |
/home | 每个普通用户的家目录,/home/jianma、/home/bob。放你自己的文档、代码、下载。 |
/root | 超级用户 root 的家目录。注意它不在 /home 里,是个特殊户。 |
/var | "会变"的数据:日志(/var/log)、数据库、网站文件、缓存。服务器出问题先来这看。 |
/usr | 安装的软件和共享资源:/usr/bin(命令)、/usr/lib(库)、/usr/share(文档图标)。像 Windows 的 Program Files。 |
/tmp | 临时文件,重启可能被清空,别往这放重要东西。 |
/opt | "可选软件"的自留地,手动安装的大型第三方软件常放这。 |
/dev | 设备文件:/dev/sda 硬盘、/dev/null "黑洞"、/dev/random 随机数。一切皆文件的最佳展厅。 |
/proc /sys | 内存里的"虚拟文件系统":/proc/cpuinfo 看 CPU、/proc/meminfo 看内存。没占磁盘,是内核实时吐出来的。 |
/mnt /media | 挂载点:U盘、外接硬盘临时挂在这两个目录下。 |
整棵树长这样
/
├── bin -> usr/bin # 基础命令
├── etc/ # 配置文件集中地
│ ├── ssh/sshd_config
│ └── nginx/nginx.conf
├── home/
│ └── jianma/ # 你的家目录
├── var/
│ └── log/ # 日志
├── usr/bin/ # 装的软件
├── tmp/ # 临时,重启可能没
└── proc/ # 内核吐出来的硬件信息
绝对路径 vs 相对路径
绝对路径 → 从根 / 开始写
写法如
/home/jianma/doc/report.txt。不管你现在在哪,这条路径指向同一个文件。什么时候用:写脚本、配置文件里,永远写绝对路径,免得"当前目录变了就找不到"。
相对路径 → 从当前目录出发
. 是当前目录、.. 是上一级、~ 是家目录。比如 ../doc 表示"上一级里的 doc"。什么时候用:手工敲命令时图快。
cd .. 就是回到上一层,每天用几百次。用命令"逛"一遍这棵树
# 我在哪?
pwd
# 看看根目录里都有什么
ls /
# 用绝对路径直接看别人的配置文件
ls /etc/ssh/
# 用相对路径:先回到家,再进 Documents
cd ~
cd Documents
cd .. # .. 表示上一级,回家了
$ pwd
/home/jianma
$ ls /
bin dev etc home lib media mnt opt
proc root run sbin srv sys tmp usr var
$ ls /etc/ssh/
ssh_config sshd_config ssh_host_rsa_key ...
inode:文件名背后的真相
文件实际存哪?每个文件有个 inode(索引节点),里面记着文件大小、权限、属主、数据块位置——唯独不记文件名。文件名只是目录里的一个"指向 inode 的标签"。这解释了两件事:为什么硬链接(第 3 章)改一个另一个也变;为什么 ls -i 能看到 inode 号。
看一眼 inode
# -i 显示 inode 号
ls -i report.txt
stat report.txt
$ ls -i report.txt
132187 report.txt
$ stat report.txt
File: report.txt
Size: 2048 Blocks: 8 IO Block: 4096 regular file
Device: 8,2 Inode: 132187 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ jianma)
坑:把 Windows 的文件习惯搬过来
三个高频水土不服:① Linux 文件名严格区分大小写,Report.txt 和 report.txt 是两个文件;② 路径分隔符是正斜杠 /不是反斜杠;③ Linux 不靠后缀判断类型,file.txt 内容可能是张图片,用 file 命令看真身。
记
本章小结
① Linux 只有一棵树,根是 /;背不住目录没关系,记住 /etc 配置、/var/log 日志、/home 家目录、/proc 看硬件这四个高频区。
② 脚本里写绝对路径保证不出错,手敲用 . .. ~ 图快。
③ 文件 = inode(元数据)+ 数据块;文件名只是个标签,大小写敏感,不用后缀判类型。