且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Linux深入探索12-文件系统

更新时间:2021-07-26 17:36:56

Linux深入探索12-文件系统

Linux深入探索12-文件系统

本文目录结构预览:

  • 一、简介
    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 类:普通文件、目录和伪文件。

Linux深入探索12-文件系统

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相同。

还可以这样玩:

Linux深入探索12-文件系统

六、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 著 张杰良 译

作者:四月不见

出处:https://www.cnblogs.com/nosee/p/15842546.html