Linux深入探索12-文件系统
----- 最近更新【2022-01-20】-----
本文目录结构预览:
- 一、简介
1、简单意义上的定义
2、Unix 中的定义 - 二、文件系统
1、主目录:根目录
2、挂载文件系统
3、查看文件系统
4、常见的文件系统
5、挂载点:/mnt 与 /media - 三、文件类型
1、普通文件
2、目录
3、伪文件 - 四、根目录介绍
1、常见根目录的目录结构
2、顶级目录介绍
3、程序相关目录:bin、lib、sbin - 五、特殊文件
1、查看特殊文件
2、硬件
3、终端 - 六、proc 文件
- 七、参考
一、简介
Unix 文件系统,即操作系统中通过存储及组织系统中的全部数据而为用户和程序提供服务的那一部分。
1、简单意义上的定义
从简单意义上讲,文件就是一个有名称的数据集合。大多数时候,文件储存在数字介质上:硬盘、CD、DVD、软盘、闪存存储卡等。
2、Unix 中的定义
在 Unix 中,文件的定义更为广泛。文件是任何源,有一个名称,可以可以从中读取数据;或者是任何目标,有一个名称,可以向其中写入数据。例如,键盘(一种输入源)、显示器(一种输出目标)都可以作为文件被访问。另外还有不存在所谓的物理实体的文件,它们也接收输入或者产生输出,从而提供具体的服务。
以这种方式定义文件拥有重大意义:它意味着 Unix 程序可以使用简单的过程从任意的输入源读取数据,或者向任意的输出目标写入数据。
二、文件系统
文件系统的任务就是存储和组织数据,并向用户和程序提供数据的访问功能。
Unix 和 Linux 系统中包含大量的文件,典型的 Unix 包含大约 10000 至 20000 个文件,众多的文件组织成了一颗非常大的树。
尽管文件数量和文件类型众多,但大部分 Linux 系统采用的都是树形结构文件系统,并且也都大部分采纳了一个 Linux 目录结构标准——文件系统结构标准(Filesystem Hierarchy Standard, FHS)。
1、主目录:根目录
在树形结构中,我们称树的主节点为根。因此,我们将 Linux 文件系统中的主目录称为根目录,用“/
”来表示。
以超级用户的身份运行以下命令,可以估计系统中文件和目录的总数量,如下:
[nosee@instance-4 ~]$ sudo ls -R / | wc -l
158732
而基于 GUI 的系统,文件数量则更多:
nosee@nosee-virtual-machine:~/Desktop$ sudo ls -R / | wc -l
855069
注:在文件名的开头,“/
”代表根目录。在文件名的中间,“/
”充当定界符。
2、挂载文件系统
在大多数情况下,并不是所有的文件都存储在同一个物理设备上。更准确地说,文件存储在不同类型的设备上,包括多个磁盘分区(每个磁盘分区被当作一个单独的设备)。
每个存储设备都有自己的本地文件系统,其目录和子目录近按照标准 Unix 方式组织成树。但是,在访问本地文件系统时,它的树必须附加到主树上,这可以通过将小型文件系统的根目录连接到主文件系统中的特定目录上来实现。通过这种方式来连接小型文件系统时,我们称为挂载(mount)该文件系统,小型文件系统在主树中附加到的目录则称为挂载点(mount point)。最后,当断开文件系统时,称之为卸载(umount)文件系统。
作为启动过程的一部分,Unix 每次启动时,都会自动挂载一些本地文件系统。因此,当系统启动完毕以后,主文件系统已经添加了几个其它文件系统。
当我们需要手动挂载一个设备时,使用的是mount
程序(mount a filesystem),手动卸载则需要使用umount
程序(unmount file systems)。
例:挂载设备/dev/fd0
中的软盘驱动器文件系统,并将其附加在主树中的/media/floppy
位置上。
mount /dev/fdo /media/floppy
挂载成功后,用户就可以通过/media/floppy
目录访问软盘上的文件。
3、查看文件系统
如你所知,Linux 支持非常多的文件系统,例如 ext4、ext3、ext2、sysfs、securityfs、FAT16、FAT32、NTFS 等等,当前被使用最多的文件系统是 ext4(Fourth extended filesystem,第四代扩展文件系统)。
1)mount
mount 被用来在类 Unix 系统中挂载本地或远程的文件系统。
使用命令mount
本身可以显示当前挂载到系统上的所有文件系统列表,如下。
[nosee@instance-4 ~]$ mount | head
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=2011124k,nr_inodes=502781,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=404084k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,discard,errors=remount-ro)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
2)df - report file system disk space usage
使用命令df -T
可以查看已经挂载的分区和文件系统类型,如下。
[nosee@instance-4 ~]$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 395M 40M 355M 11% /run
/dev/sda1 ext4 9.7G 2.2G 7.0G 25% /
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda15 vfat 124M 5.7M 119M 5% /boot/efi
tmpfs tmpfs 395M 0 395M 0% /run/user/1001
注:
df 命令被用来报告文件系统的磁盘空间使用情况。
使用-h
(human-readable)选项,将显示人类易读的大小单位。
3)findmnt - find a filesystem
不带参数的 findmnt 命令可以列出所有已挂载的文件系统,如下。(和不带参数的mount
输出结果相似,但更直观)
[nosee@instance-4 ~]$ findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1 ext4 rw,relatime,discard,errors=remount-ro
├─/sys sysfs sysfs rw,nosuid,nodev,noexec,relatime
│ ├─/sys/kernel/security securityfs securityfs rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/cgroup tmpfs tmpfs ro,nosuid,nodev,noexec,mode=755
│ │ ├─/sys/fs/cgroup/unified cgroup2 cgroup2 rw,nosuid,nodev,noexec,relatime,nsdelegate
│ │ ├─/sys/fs/cgroup/systemd cgroup cgroup rw,nosuid,nodev,noexec,relatime,xattr,name=systemd
│ │ ├─/sys/fs/cgroup/blkio cgroup cgroup rw,nosuid,nodev,noexec,relatime,blkio
│ │ ├─/sys/fs/cgroup/pids cgroup cgroup rw,nosuid,nodev,noexec,relatime,pids
│ │ ├─/sys/fs/cgroup/net_cls,net_prio cgroup cgroup rw,nosuid,nodev,noexec,relatime,net_cls,net_prio
│ │ ├─/sys/fs/cgroup/cpuset cgroup cgroup rw,nosuid,nodev,noexec,relatime,cpuset
│ │ ├─/sys/fs/cgroup/rdma cgroup cgroup rw,nosuid,nodev,noexec,relatime,rdma
│ │ ├─/sys/fs/cgroup/cpu,cpuacct cgroup cgroup rw,nosuid,nodev,noexec,relatime,cpu,cpuacct
│ │ ├─/sys/fs/cgroup/memory cgroup cgroup rw,nosuid,nodev,noexec,relatime,memory
│ │ ├─/sys/fs/cgroup/perf_event cgroup cgroup rw,nosuid,nodev,noexec,relatime,perf_event
│ │ ├─/sys/fs/cgroup/devices cgroup cgroup rw,nosuid,nodev,noexec,relatime,devices
│ │ └─/sys/fs/cgroup/freezer cgroup cgroup rw,nosuid,nodev,noexec,relatime,freezer
│ ├─/sys/fs/pstore pstore pstore rw,nosuid,nodev,noexec,relatime
│ ├─/sys/firmware/efi/efivars efivarfs efivarfs rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/bpf bpf bpf rw,nosuid,nodev,noexec,relatime,mode=700
│ └─/sys/kernel/debug debugfs debugfs rw,relatime
│ └─/sys/kernel/debug/tracing tracefs tracefs rw,relatime
├─/proc proc proc rw,nosuid,nodev,noexec,relatime
│ └─/proc/sys/fs/binfmt_misc systemd-1 autofs rw,relatime,fd=35,pgrp=1,timeout=0,minproto=5,maxproto...
│ └─/proc/sys/fs/binfmt_misc binfmt_misc binfmt_misc rw,relatime
├─/dev udev devtmpfs rw,nosuid,relatime,size=2011124k,nr_inodes=502781,mode=755
│ ├─/dev/pts devpts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000
│ ├─/dev/shm tmpfs tmpfs rw,nosuid,nodev
│ ├─/dev/mqueue mqueue mqueue rw,relatime
│ └─/dev/hugepages hugetlbfs hugetlbfs rw,relatime,pagesize=2M
├─/run tmpfs tmpfs rw,nosuid,noexec,relatime,size=404084k,mode=755
│ ├─/run/lock tmpfs tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k
│ └─/run/user/1001 tmpfs tmpfs rw,nosuid,nodev,relatime,size=404080k,mode=700,uid=1001...
└─/boot/efi /dev/sda15 vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharse...
findmnt 程序展示出了目标挂载点(TARGET)、源设备(SOURCE)、文件系统类型(FSTYPE)以及相关的挂载选项(OPTIONS)。
从上面的3个例子中,都可以看出该案例系统的主文件系统是 ext4。而其它文件系统,都是挂载到主文件系统的某个特定目录下的。
4、常见的文件系统
文件系统 | 说明 |
---|---|
基于磁盘的文件系统 | —— |
ext3 | 第3代扩展文件系统(Linux) |
ext4 | 第4代扩展文件系统(Linux) |
FAT32 | 32位文件分配表文件系统(Microsoft Windows) |
HFS+ | 层次式文件系统(Macintosh) |
ISO 9660 | ISO 9660 标准文件系统(CD-ROM) |
NTFS | NT 文件系统(Microsoft Windows) |
UDF | 通用磁盘格式文件系统(可重写CD和DVD) |
UFS2 | Unix 文件系统(BSD、Solaris) |
网络文件系统 | —— |
NFS | 网络文件系统(广泛使用) |
SMB | 服务器信息块(Windows网络) |
特殊用途文件系统 | —— |
devpts | 伪终端的设备界面(PTY) |
procfs | proc 文件系统 |
sysfs | 系统数据文件系统(设备与驱动器) |
tmpfs | 临时存储文件系统 |
基于磁盘的文件系统在硬盘、CD、DVD或其它设备上存储数据;网络文件系统支持通过网络共享资源;特殊用途文件系统提供对系统资源的访问(如伪文件)。
5、挂载点:/mnt 与 /media
广义地讲,存储设备有两种类型。固定介质永久附属于计算机中,例如硬盘、驱动器。可移动介质在系统运行时可以改变,例如 CD、DVD、软盘、闪存等。
该区别非常重要,因为文件系统存在消失的可能性,Unix 系统必须确保恰当地管理该文件系统。例如,在允许弹出CD之前,Unix 必须确保所有的输出操作都已经完成。
基于这一原因,文件系统层次结构需求使用特定的目录挂载文件系统。对于没有挂载在其它位置的固定介质(如额外的硬盘)来说,指定目录是 /mnt;对于可移动介质来说,目录是 /media。
三、文件类型
Unix 文件有许多不同的类型,但是它们都可以分成 3 类:普通文件、目录和伪文件。
1、普通文件
普通文件(ordinary)或常规文件(regular)是大多数人在使用的单词“文件”时所指的文件。普通文件包含数据,位于某种类型的存储设备上。
广义的讲,普通文件有两种类型:文件文件和二进制文件。
文本文件用于存储文本数据:纯文本、shell 脚本、源程序、配置文件等。
二进制文件包含非文本数据,常见的二进制文件:执行程序、对象文件、图像、音乐文件、视频文件、字处理文档、电子表格、数据库等。
2、目录
和普通程序相似,目录文件也驻留在某种类型的存储设备上。但是目录不存放常规数据,而是用来组织、访问其它文件。从概念上讲,目录“包含”其它文件。
我们使用目录将文件组织成一个类似于树的层次系统。具体组织时,将文件组合成组,再将每组文件存储在各自的目录中。由于目录本身就是文件,所以目录还可以包含其它目录,从而形成层次结构。
实际上,目录并不存放实际文件,它只是包含文件 Unix 定位文件所需的信息。
3、伪文件
与普通文件和目录不同,伪文件并不用来存储数据,所以这些文件本身不占用任何空间。
伪文件的目的是提供一种服务,这种服采取和常规文件相同的访问方式进行访问。在大多数情况下,伪文件用来访问内核提供服务的。
最重要的伪文件类型是特殊文件,有时也称为设备文件。特殊文件是物理设备的内部表示,例如键盘、显示器、打印机、磁盘驱动器都可以当作特殊文件来访问。(实际上,包括计算机或者网络中的每个设备)
命名管道是管道功能的一个扩展,它能够将一个程序的输出连接到另一个程序的输入上。
proc 文件允许访问内核中的信息。少数几种特定情况下,甚至还可以使用 proc 文件修改内核中的数据。
四、根目录介绍
理解计算机文件系统最快捷的方式就是查看根目录,并检查所有子目录。
1、常见根目录的目录结构
目录 | 内容 |
---|---|
/ | 根目录 |
/bin | 基本程序 |
/boot | 启动系统时所需的文件 |
/dev | 设备文件 (后面会详细介绍) |
/etc | 配置文件 |
/home | 用户的 home 目录 |
/lib | 基本共享库,内核模块 |
/lost+found | 由 fsck 恢复的受损文件 |
/media | 可移动介质的挂载点(如USB驱动器、CD-ROMs等) |
/mnt | 不能挂载在其他位置上的固定介质的挂载点(如额外的硬盘) |
/opt | 用来安装“可选的”第三方应用软件(主要是商业软件产品) |
/proc | proc文件 (后面会详细介绍) |
/root | 超级用户的 home 目录 |
/sbin | 由超级用户运行的基本系统管理程序 |
/srv | 本地系统所提供服务的数据 |
/tmp | 临时文件 |
/usr | 静态数据使用的辅助文件系统 |
/var | 可变数据使用的辅助文件系统 |
一般我们把根目录下的所有子目录称为顶级目录。使用ls -l /
查看顶级目录,如下:
[nosee@instance-4 ~]$ ls -l /
total 60
lrwxrwxrwx 1 root root 7 Dec 9 20:59 bin -> usr/bin
drwxr-xr-x 4 root root 4096 Dec 9 21:03 boot
drwxr-xr-x 14 root root 2900 Jan 14 00:06 dev
drwxr-xr-x 75 root root 4096 Jan 19 16:18 etc
drwxr-xr-x 5 root root 4096 Jan 5 02:40 home
lrwxrwxrwx 1 root root 7 Dec 9 20:59 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Dec 9 20:59 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Dec 9 20:59 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Dec 9 20:59 libx32 -> usr/libx32
drwx------ 2 root root 16384 Dec 9 20:59 lost+found
drwxr-xr-x 2 root root 4096 Dec 9 20:59 media
drwxr-xr-x 2 root root 4096 Dec 9 20:59 mnt
drwxr-xr-x 2 root root 4096 Dec 9 20:59 opt
dr-xr-xr-x 130 root root 0 Jan 14 00:05 proc
drwx------ 9 root root 4096 Jan 14 04:05 root
drwxr-xr-x 20 root root 640 Jan 19 12:47 run
lrwxrwxrwx 1 root root 8 Dec 9 20:59 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Dec 9 20:59 srv
dr-xr-xr-x 13 root root 0 Jan 14 04:59 sys
drwxrwxrwt 9 root root 4096 Jan 19 16:09 tmp
drwxr-xr-x 13 root root 4096 Dec 9 20:59 usr
drwxr-xr-x 12 root root 4096 Jan 2 01:00 var
2、顶级目录介绍
1)/bin
这个目录存放最重要的系统,即系统管理员在单用户模式下管理系统所需的基本工具。这些工具都是可执行文件,因此该目录命名为 bin (binary 二进制),即存放二进制文件的位置。该目录的一些程序也可以由常规用户使用。
查看/bin目录下的前十个程序,如:
[nosee@instance-4 ~]$ ls /bin | head
[
aa-enabled
aa-exec
ab
addpart
anthoscli
apropos
apt
apt-cache
apt-cdrom
2)/boot
这是系统存放引导过程中所需全部文件的位置。内核必须位于这个目录或者根目录中。
如下可以看出,文件initrd.img-4.19.0-18-cloud-amd64
就是该系统的内核文件。如果升级过系统,则会在该目录中发现不止一个版本的内核。
[nosee@instance-4 ~]$ ls -l /boot/
total 21236
-rw-r--r-- 1 root root 2925615 Sep 29 18:53 System.map-4.19.0-18-cloud-amd64
-rw-r--r-- 1 root root 91019 Sep 29 18:53 config-4.19.0-18-cloud-amd64
drwxr-xr-x 3 root root 16384 Jan 1 1970 efi
drwxr-xr-x 6 root root 4096 Dec 9 21:03 grub
-rw-r--r-- 1 root root 14037410 Dec 9 21:03 initrd.img-4.19.0-18-cloud-amd64
-rw-r--r-- 1 root root 4659968 Sep 29 18:53 vmlinuz-4.19.0-18-cloud-amd64
3)/dev
所有特殊文件都位于这个目录中,包括物理设备和伪设备。(后面还会详细介绍)
4)/etc
这个目录包含的是配置文件。配置文件是某程序启动时处理的文本文件,其中包含有影响程序操作的命令或信息。
5)/home
当创建用户时,管理员会为用户标识赋予一个 home 目录,命名如:/home/用户标识
6)/lib
当程序运行时,经常要调用库,即已经存在的数据和代码模块。Unix 提供大量的库,以允许程序访问操作系统提供的服务。这个目录包含运行/bin和/sbin目录中的程序所需的基本库和内核模块。
7)/lost+found
如果 Unix 没有正常地关机,那么那些仅完成部分写入的文件将受到损坏。Unix 下次启动时,一个叫 fsck(filesystem check 文件系统检查)的程序将自动运行,检查文件系统并修复问题。/lost+found 目录就用于保存由 fsck 恢复的受损文件。
8)/sbin
名称 /sbin 代表“system binaries 系统二进制文件”,这个目录中存放用于系统管理的程序,通常这个目录中的程序必须由超级用户运行。
9)/srv
储存为本地系统所提供服务的数据(service,因此命名为/srv)。在这里存储数据的典型服务包括 cgi、Web、ftp、cvs、rsync等。
10)/tmp
这个目录用于临时存储。任何人都可以在这个目录存储文件,但是最终 /tmp 的内容将自动移除。
11)/usr
这个目录是辅助文件系统的根,包含有辅助文件系统的重要子目录。(集成到主文件系统中来的单独文件系统的挂载点)
/usr 的目的是用来存放静态数据,即没有管理员干涉不会改变的数据。根据其特性,静态数据不会随时间改变。这就允许 /usr 驻留于自己的设备,该设备甚至有可能是诸如 CD-ROM 之类的只读设备。(后面还会详细介绍)
12)/var
这个目录的名称意味着“variable 可变”。像 /usr 一样,这个目录是辅助文件系统的根,包含有辅助文件系统的重要子目录。区别是,/var 存放的是可变数据,如web网站文件、日志文件、打印文件、电子邮件消息等。像 /usr 一样,/var 文件系统通常驻留于自己的设备。
这其中比较重要的一个目录就是/var/log
,里面包含各种系统活动的记录,还有各种程序的日志文件。
3、程序相关目录:bin、lib、sbin
目录 | 内容 |
---|---|
通用程序 | —— |
/bin | 基本程序 |
/usr/bin | 非基本程序 |
/usr/local/bin | 本地安装程序 |
系统管理程序 | —— |
/sbin | 由超级用户运行的基本系统管理程序 |
/usr/sbin | 由超级用户运行的非基本系统管理程序 |
/usr/local/sbin | 本地安装的系统程序 |
第三方应用程序 | —— |
/opt/xxx | 应用程序xxx的静态数据,包括程序 |
/var/opt/xxx | 应用程序xxx的可变数据 |
查看 /usr
目录,如下:
[nosee@instance-4 ~]$ ls -l /usr/
total 68
drwxr-xr-x 2 root root 20480 Jan 14 03:19 bin
drwxr-xr-x 2 root root 4096 Oct 3 09:00 games
drwxr-xr-x 3 root root 4096 Jan 1 08:23 include
drwxr-xr-x 55 root root 4096 Jan 5 02:31 lib
drwxr-xr-x 2 root root 4096 Dec 9 20:59 lib32
drwxr-xr-x 2 root root 4096 Dec 9 20:59 lib64
drwxr-xr-x 2 root root 4096 Dec 9 20:59 libx32
drwxr-xr-x 10 root root 4096 Dec 9 20:59 local
drwxr-xr-x 2 root root 12288 Jan 6 06:07 sbin
drwxr-xr-x 87 root root 4096 Jan 5 02:31 share
drwxr-xr-x 2 root root 4096 Oct 3 09:00 src
可以看到 /usr
目录下的子目录有几个是与根目录/
下的顶级目录名字相同。(如/usr/bin
与/bin
、/usr/lib
与/lib
等)
按照以前的规定/bin
是存放基本程序的目录,/usr/bin
是存放非基本程序(大多数用户程序)的目录。/lib
存放基本共享库,而/usr/lib
存放非基本共享库。/sbin
存放由超级用户运行的基本系统管理程序,/usr/sbin
存放由超级用户运行的非基本系统管理程序。
其实把以上这些程序分别存放在两个类似的目录中,是由历史原因造成的。现在,存储设备已经十分快速,而且容量也更大了。所以现在很多 Unix 系统已经把这些同类的程序都存到了同一个目录中,但是以前的目录结构还是保留下来。如下可知:
[nosee@instance-4 ~]$ ls -la /bin /lib /sbin
lrwxrwxrwx 1 root root 7 Dec 9 20:59 /bin -> usr/bin
lrwxrwxrwx 1 root root 7 Dec 9 20:59 /lib -> usr/lib
lrwxrwxrwx 1 root root 8 Dec 9 20:59 /sbin -> usr/sbin
五、特殊文件
特殊文件是表示物理设备的伪文件,Unix 将所有的特殊文件存放在/dev
(device 设备)目录中。
1、查看特殊文件
使用命令ls /dev/
可以显示系统上特殊文件的名称。
[nosee@instance-4 ~]$ ls /dev/
autofs mqueue tty0 tty30 tty52 vcs3
block net tty1 tty31 tty53 vcs4
bsg network_latency tty10 tty32 tty54 vcs5
btrfs-control network_throughput tty11 tty33 tty55 vcs6
char null tty12 tty34 tty56 vcsa
console psaux tty13 tty35 tty57 vcsa1
core ptmx tty14 tty36 tty58 vcsa2
cpu_dma_latency pts tty15 tty37 tty59 vcsa3
cuse random tty16 tty38 tty6 vcsa4
disk rtc tty17 tty39 tty60 vcsa5
fd rtc0 tty18 tty4 tty61 vcsa6
full sda tty19 tty40 tty62 vcsu
fuse sda1 tty2 tty41 tty63 vcsu1
hpet sda14 tty20 tty42 tty7 vcsu2
hugepages sda15 tty21 tty43 tty8 vcsu3
hwrng sg0 tty22 tty44 tty9 vcsu4
initctl shm tty23 tty45 ttyS0 vcsu5
input snapshot tty24 tty46 ttyS1 vcsu6
kmsg stderr tty25 tty47 ttyS2 vfio
log stdin tty26 tty48 ttyS3 vga_arbiter
loop-control stdout tty27 tty49 urandom vhost-net
mapper tpm0 tty28 tty5 vcs vhost-vsock
mem tpmrm0 tty29 tty50 vcs1 zero
memory_bandwidth tty tty3 tty51 vcs2
其中,大多数名称是平时极少数需要使用到的。因为大部分特殊文件是由系统程序使用的。
下表可将常见的特殊文件分为3组:硬件、终端和伪设备。
特殊文件 | 说明 |
---|---|
-----硬件----- | 所有连接到计算机上的设备 |
/dev/fd0 | 软盘 |
/dev/hda | 硬盘 |
/dev/hda1 | 硬盘:第1分区 |
/dev/sda | SCSI 硬盘 |
/dev/sda1 | SCSI 硬盘:第1分区 |
/dev/sda1 | USB 闪存卡(被视为可移除的SCSI 硬盘) |
/dev/lp0 | 打印机 |
/dev/usb/lp0 | USB 打印机 |
-----终端----- | 可以把终端分为实际终端(独立的物理设备)和伪终端(终端仿真程序) |
/dev/tty | 当前终端 |
/dev/tty1 | 控制台/虚拟控制台 |
/dev/pts/0 | 伪终端 |
/dev/ttyp0 | 伪终端 |
----伪设备---- | 一个充当输入源或输出目标的文件,但并不对应实际设备(真实的或仿真的)。 |
/dev/null | 放弃输出,输入不返回内容(eof) |
/dev/zero | 放弃输出,输入返回 null(0) |
/dev/random | 随机数生成器 |
/dev/urandom | 随机数生成器 |
2、硬件
所有连接到计算机上的设备都通过特殊文件访问。
如/dev/fd0
表示第一个软盘驱动器,/dev/lp0
表示第一台打印机。(后面的数字指的是一个具体的设备,计算机程序通常从0开始计数)
硬盘的处理有点不同。如,第一块 IDE 硬盘称为 /dev/hda
,第二块称为/dev/hdb
,等等。
硬盘还被划分为一个或多个分区,分区可以作为单独的设备。第一块硬盘的第一个分区称为/dev/hda1
,如果有第二个分区则为/dev/hda2
。
3、终端
我们可以把终端分为实际终端(独立的物理设备)和伪终端(终端仿真程序)。
使用命令tty
可以查看当前使用的终端名称。(tty - print the file name of the terminal connected to standard input)
1)实际终端
充当硬件设备的终端使用的是/dev/tty
命名约定,如/dev/tty1
。在桌面环境使用虚拟控制台时,它也充当一个实际终端。默认情况下,Linux 支持6个这样的控制台,分别由特殊文件/dev/tty1
至/dev/tty6
表示。
如:
[nosee ~]$ tty
/dev/tty3
2)伪终端
当在窗口使用GUI运行终端仿真程序时,因为没有实际终端,所以 Unix 创建所谓的伪终端(pseudo terminal,pty)来模拟终端。由于有两种不同的系统来创建伪终端,因此可以看到两种类型的名称。
一种是/dev/ttyp0
、/dev/ttyp1
...这类名称;另外一种则是/dev/pts0
、/dev/pts1
...
如:
[nosee@instance-4 ~]$ tty
/dev/pts/2
3)其它
为了方便起见,特殊文件/dev/tty
表示当前正在使用的终端。例如,你在使用虚拟控制台#3,那么/dev/tty
与/dev/pts/3
相同。
还可以这样玩:
六、proc 文件
proc 文件是那些提供一种简单的途径来检查多种类型的系统信息的伪文件, proc 文件直接从内核获取信息,而不是使用复杂的程序搜出数据。(原始的 proc 文件系统是为了提取进程的信息而开发的)
所有的 proc 文件都存放在 /proc
目录中。在这个目录中,可以发现系统中每个进程对应一个子目录。子目录的名称非常简单,就是各种进程的进程ID。ps(process status 进程状态)程序也是通过读取合适的 proc 文件来收集所需数据的。
查看/proc
目录如下
[nosee@instance-4 ~]$ ls -F /proc
1/ 197/ 25182/ 383/ 517/ devices kpageflags swaps
10/ 198/ 26/ 384/ 518/ diskstats loadavg sys/
11/ 2/ 27/ 395/ 577/ driver/ locks sysrq-trigger
12/ 20/ 28/ 4/ 579/ execdomains meminfo sysvipc/
134/ 209/ 29/ 400/ 587/ filesystems misc thread-self@
135/ 21/ 29053/ 401/ 6/ fs/ modules timer_list
1363/ 22/ 2989/ 403/ 61/ interrupts mounts@ tty/
1364/ 23/ 3/ 406/ 8/ iomem mtrr uptime
1365/ 230/ 30/ 413/ 9/ ioports net@ version
14/ 23077/ 31/ 426/ acpi/ irq/ pagetypeinfo vmallocinfo
15/ 23078/ 31414/ 430/ buddyinfo kallsyms partitions vmstat
16/ 24/ 32/ 454/ bus/ kcore sched_debug zoneinfo
166/ 243/ 320/ 458/ cgroups key-users schedstat
167/ 25/ 321/ 459/ cmdline keys self@
17/ 25102/ 32617/ 49/ consoles kmsg slabinfo
19/ 25175/ 33/ 50/ cpuinfo kpagecgroup softirqs
195/ 25181/ 381/ 512/ crypto kpagecount stat
现代的 Linux 系统使用该目录来存放许多其它伪文件,提供众多内核数据访问功能。如文件/proc/cpuinfo
显示了有关处理器的信息。
常见的 proc 文件:
proc | 相关信息 |
---|---|
/proc/xxx/ | 进程#xxx |
/proc/cmdline | 内核选项 |
/proc/cpuinfo | 处理器 |
/proc/decixes | 设备 |
/proc/diskstats | 逻辑磁盘设备 |
/proc/filesystems | 文件系统 |
/proc/meminfo | 内存管理 |
/proc/modules | 内核模块 |
/proc/mounts | 已挂载设备 |
/proc/partitions | 磁盘分区 |
/proc/scsi | SCSI 和 RAID 设备 |
/proc/swaps | 交换分区 |
/proc/uptime | 内核运行时间(秒)和内核运行时间(秒) |
/proc/version | 内核版本、分发、gcc 编辑器(用来构建内核) |
通常,除非是系统管理员,否则永远不需要查看这些 proc 文件的。
例1:查看我的 Debian 云主机的内核版本信息
[nosee@instance-4 ~]$ cat /proc/version
Linux version 4.19.0-18-cloud-amd64 (debian-kernel@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.208-1 (2021-09-29)
例2:查看我的虚拟 Ubuntu 主机的内核版本信息
nosee@nosee-virtual-machine:~/Desktop$ cat /proc/version
Linux version 5.11.0-43-generic (buildd@lcy02-amd64-036) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #47~20.04.2-Ubuntu SMP Mon Dec 13 11:06:56 UTC 2021
例3:查看内存管理信息(第一行的MemTotal:4040812 kB
表示内存总大小约为4G)
[nosee@instance-4 ~]$ head /proc/meminfo
MemTotal: 4040812 kB
MemFree: 2863036 kB
MemAvailable: 3232504 kB
Buffers: 123204 kB
Cached: 450864 kB
SwapCached: 0 kB
Active: 758276 kB
Inactive: 252388 kB
Active(anon): 443428 kB
Inactive(anon): 30948 kB
七、参考
书箱:《Unix & Linux 大学教程》第二十三章 (美)Harley Hahn 著 张杰良 译