既然“一切皆文件”是 Linux/Unix 的哲学核心思想,那么就让我们从文件的根目录说起吧~
想象一棵树,我们可以从根部出发,到达树上的任意叶节点。
在愉快地欣赏树之前,我们先了解几条命令:
pwd
查看当前所在路径- 用这条命令可以让我们知道身在何处,这样就不会迷路了。
ls
列出目前工作目录所含之文件及子目录- 用这条命令可以让我们查看下一站要前往何方。
cd
命令用于切换当前工作目录至 dirName(目录参数)cd
dirName 前往之地。cd ..
返回当前位置的上一站。cd ~
无论身在何处,瞬间回到自己的家。cd /
无论身在何处,瞬间回到根部。cd -
查看从什么地方来到当前位置。
环境说明:Ubuntu 18 安装在 vmware 虚拟机上。
用 Ctrl+Alt+T
打开终端,1
$ cd / # 回到根目录
1 | $ pwd # 查看当前目录,确定是否在根目录位置 |
1 | $ ls # 列出目前工作目录所含之文件及子目录 |
1 | $ sudo apt-get install tree # 为了方便查看目录结构,安装 tree 工具 |
安装完毕后,
1 | $ tree -L 1 # 只查看当前第一级的目录 |
1 | / # 为了说明当前位置,将 . 改成 / |
为了体验什么叫“一切皆文件”,我们从 proc
目录开始
proc 是进程(process)的缩写。
Linux 会将系统各进程的信息挂载在 /proc
目录下。
验证:
用 Ctrl+Alt+T
打开一个新的终端,
输入命令:
1 | $ ps |
然后我们查看 /proc
目录下会发现一个 2908
的文件夹,
将终端关闭后,重新进入 /proc
目录会发现 2908
的文件夹不见了,
得 /proc
目录中的子目录以系统中的 PID 命名,
子目录中的文件代表的是进程的各种状态。
那么 /proc
会不会是对应硬盘上的某个存储位置(习惯 Windows 系统的人的猜想),
然后当启动一个新进程的时候,就把进程信息写到硬盘上呢?
/proc
目录和硬盘没有任何关系(习惯 Windows 系统的人最需要改变的思维),
Linux 就是将系统进程信息以文件的形式展示出来!
所以,“一切皆文件”
1 | / |
我想你一定会注意到有四个文件为什么会有 ->
1 | / |
1 | file initrd.img # 使用 file 命令查看文件信息 |
符号链接(Symbolic Link)
相对于硬链接,故有时称为软链接,其相当于Windows系统下的快捷方式。
在 /
根目录,右击 initrd.img
选择 Properties
会看到一行 Link target: boot/initrd.img-4.15.0-45-generic
1 | $ cd boot # 切换目录到 boot |
1 | /boot # 为了说明当前位置,将 . 改成 /boot, 以后同理,不再说明 |
也就是说有 ->
是链接文件
,相当于 Windows 系统下的快捷方式。
既然是快捷方式,为了减少噪音,无视之,整理后得:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23/
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc # Linux 将系统中各进程的信息挂载到 proc 目录下
├── root
├── run
├── sbin
├── snap
├── srv
├── swap.img
├── sys
├── tmp
├── usr
└── var
搜索 initrd.img
得:该文件是 Linux 启动的内核文件之类的,
所以:/boot
目录下所保存的数据是用于内核开始执行用户级程序之前使用的东西。
说白了就是跟内核有关的那点东西,引导加载器、内核镜像等。
这里也可能包含备份的主引导扇区信息和扇区映像文件。
操作系统的内核还可以放在根 “/
” 下。
因此猜测,/boot
目录是真实存在硬盘上的。
1 | / |
小结一下:
对于习惯 Windows 系统的同学,基本上看到目录和文件都会习惯性地想到是存在硬盘上的。
然后 Linux 哲学思想且告诉我们从目录和文件不一定要存在硬盘上,还可以逻辑性地代表一些东西。
从本文中,我们可以知道 Linux 的文件系统,可以代表真实在硬盘上的文件,也可以代表系统的进程信息,
那么还没有其他可能性呢,如代表着系统连接到的硬件信息呢?
篇幅关系,下章继续~
参考资料
http://manpages.ubuntu.com/manpages/focal/en/man5/proc.5.html
http://manpages.ubuntu.com/manpages/focal/man7/hier.7.html
http://manpages.ubuntu.com/manpages/bionic/en/man8/service.8.html