Linux深入探索12-檔案系統

四月不見發表於2022-01-26

----- 最近更新【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 著 張傑良 譯

相關文章