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