前言
Linux 系統(tǒng)中一切都是文件拌汇。
不僅普通的文件和目錄,就連塊設備弊决、管道噪舀、socket 等,也都是統(tǒng)一交給文件系統(tǒng)管理的飘诗。
根(/)
Linux 系統(tǒng)中的一切文件都是從“根(/)”目錄開始的与倡,并按照文件系統(tǒng)層次化標準(FHS)采用樹形結構來存放文件,以及定義了常見目錄的用途昆稿。另外纺座,Linux系統(tǒng)中的文件和目錄名稱是嚴格區(qū)分大小寫的。
根目錄文件結構
PC:/$ tree -L 1
.
├── bin //存放單用戶模式下還可以操作的命令
├── boot //開機所需文件—內核溉潭、開機菜單以及所需配置文件等
├── cdrom //光驅掛載
├── dev //以文件形式存放任何設備與接口
├── etc //配置文件
├── home //用戶主目錄
├── lib //開機時用到的函數(shù)庫净响,以及/bin 與/sbin 下面的命令要調用的函數(shù)
├── lost+found //當文件系統(tǒng)發(fā)生錯誤時,將一些丟失的文件片段存放在這里
├── media //用于掛載設備文件的目錄
├── root //系統(tǒng)管理員的主目錄
├── srv //一些網絡服務的數(shù)據(jù)文件目錄
├── tmp //任何人均可使用的“共享”臨時目錄
├── usr/local //用戶自行安裝的軟件
├── usr/sbin //Linux 系統(tǒng)開機時不會使用到的軟件/命令/腳本
├── usr/share //幫助與說明文件岛抄,也可放置共享文件
├── var //主要存放經常變化的文件别惦,如日志
...
物理設備命名
在 Linux 系統(tǒng)中一切都是文件狈茉,硬件設備也不例外夫椭。既然是文件,就必須有文件名稱氯庆。系統(tǒng)內核中的 udev 設備管理器會自動把硬件名稱規(guī)范起來蹭秋,目的是讓用戶通過設備文件的名字可以猜出設備大致的屬性以及分區(qū)信息等;這對于陌生的設備來說特別方便堤撵。另外仁讨,udev設備管理器的服務會一直以守護進程的形式運行并偵聽內核發(fā)出的信號來管理/dev 目錄下的設備文件。
常見硬件設備及其文件名稱
設備文件名舉例:/dev/sda5
- dev:代表硬件設備文件所在的目錄
- sd:代表SCSI存儲設備
- a:代表硬盤的順序號
- 5:代表擴展分區(qū)的順序號
文件系統(tǒng)
文件系統(tǒng)種類
用戶在硬件存儲設備中執(zhí)行的文件建立实昨、寫入洞豁、讀取、修改、轉存與控制等操作都是依靠文件系統(tǒng)來完成的丈挟。文件系統(tǒng)的作用是合理規(guī)劃硬盤刁卜,以保證用戶正常的使用需求。Linux系統(tǒng)支持數(shù)十種的文件系統(tǒng)曙咽。常見的文件系統(tǒng)如下:
Ext3
能夠在系統(tǒng)異常宕機時避免文件系統(tǒng)資料丟失蛔趴,并能自動修復數(shù)據(jù)的不一致與錯誤。然而例朱,當硬盤容量較大時孝情,所需的修復時間也會很長,而且也不能百分之百地保證資料不會丟失洒嗤。它會把整個磁盤的每個寫入動作的細節(jié)都預先記錄下來箫荡,以便在發(fā)生異常宕機后能回溯追蹤到被中斷的部分,然后嘗試進行修復烁竭。
Ext4
Android操作系統(tǒng)依托于Linux菲茬,所以主要的文件系統(tǒng)也是從Linux中發(fā)展而來,包括exFAT派撕、ext3婉弹、ext4等,目前大多數(shù)手機仍使用Ext4终吼,但相對于手機上使用的閃存設備來說镀赌,Ext4這一基于Linux的文件系統(tǒng)還有很大的優(yōu)化空間。
F2FS
F2FS “Flash Friendly File System”际跪,一種專門為閃存而生的文件系統(tǒng)商佛,其優(yōu)勢就是小文件的傳輸速率更快。近年來不斷的有旗艦機采用這一文件系統(tǒng)姆打,華為良姆、OnePlus、三星等幔戏,也使得這一文件系統(tǒng)在高端機上得到普及玛追,促進了它的不斷優(yōu)化和兼容性。
inode和block
文件系統(tǒng)通常會將 文件權限(rwx)與文件屬性(擁有者闲延、群組痊剖、時間參數(shù)等)這部份的數(shù)據(jù)放置到 inode 中,至于實際數(shù)據(jù)則放置到 data block 區(qū)塊中垒玲。 另外陆馁,還有一個超級區(qū)塊 (superblock) 會記錄整個文件系統(tǒng)的整體信息,包括 inode 與 block 的總量合愈、使用量叮贩、剩余量等击狮。
每個 inode 與 block 都有編號,至于這三個數(shù)據(jù)的意義可以簡略說明如下:
- superblock:記錄此 filesystem 的整體信息益老,包括inode/block的總量帘不、使用量、剩余量杨箭, 以及文件系統(tǒng)的格式與相關信息等寞焙;
- inode:記錄文件的屬性,一個文件占用一個inode互婿,同時記錄此文件的數(shù)據(jù)所在的 block 號碼捣郊;
- block:實際記錄文件的內容,若文件太大時慈参,會占用多個 block 呛牲。
如下圖所示,文件系統(tǒng)先格式化出 inode 與 block 的區(qū)塊驮配,假設某一個文件的屬性與權限數(shù)據(jù)是放置到 inode 4 號(下圖較小方格內)娘扩,而這個 inode 記錄了文件數(shù)據(jù)的實際放置點為 2, 7, 13, 15 這四個 block 號碼,此時我們的操作系統(tǒng)就能夠據(jù)此來排列磁盤的讀取順序壮锻。 那么數(shù)據(jù)的讀取就如同下圖中的箭頭所指定的模樣了琐旁。
這種數(shù)據(jù)存取的方法我們稱為索引式文件系統(tǒng)(indexed allocation)。
虛擬文件系統(tǒng)
文件系統(tǒng)的種類眾多猜绣,而操作系統(tǒng)希望對用戶提供一個統(tǒng)一的接口灰殴,于是在用戶層與文件系統(tǒng)層引入了中間層,這個中間層就稱為虛擬文件系統(tǒng)(Virtual File System掰邢,VFS)牺陶。
VFS 定義了一組所有文件系統(tǒng)都支持的數(shù)據(jù)結構和標準接口,這樣程序員不需要了解文件系統(tǒng)的工作原理辣之,只需要了解 VFS 提供的統(tǒng)一接口即可掰伸。
掛載設備
什么是掛載? 當用戶需要使用硬盤設備或分區(qū)中的數(shù)據(jù)時怀估,需要先將其與一個已存在的目錄文件進行關聯(lián)狮鸭,這個關聯(lián)動作就是“掛載”。將一個文件系統(tǒng)的頂層目錄掛到另一個文件系統(tǒng)的子目錄上奏夫,使它們成為一個整體怕篷,稱為掛載历筝。把該子目錄稱為掛載點酗昼。
mount命令沒有建立掛載點的功能,因此你應該確保執(zhí)行mount命令時梳猪,掛載點已經存在麻削。(就是說要把文件系統(tǒng)掛載到哪蒸痹,首先要保證目錄存在)
mount命令
mount /dev/sdb2 /backup
將設備 /dev/sdb2 掛載到 /backup 目錄
系統(tǒng)重啟后掛載就會失效,linux提供了/etc/fstab配置文件可以在重啟后自動掛載呛哟。
如果想讓這個某個設備文件的掛載永久有效叠荠,則需要把掛載的信息寫入到配置文件中。
他的格式是:
設備文件 掛載目錄 格式類型 權限選項 自檢 優(yōu)先級
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/nvme0n1p3 during installation
UUID=a181a5a3-34b0-452a-8aa6-afd60efef515 / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=2497-B2DC /boot/efi vfat umask=0077 0 1
# /home was on /dev/sdb1 during installation
UUID=22e1e864-578a-460e-94ea-e03a6b890178 /home ext4 defaults 0 2
# /home/data was on /dev/sda1 during installation
UUID=e1eafdad-5310-4dc5-a3ae-44c2aadd1949 /home/data ext4 auto,nouser,rw 0 2
# swap was on /dev/nvme0n1p2 during installation
UUID=f7ce45d5-ba45-4932-a48d-b08dba88cb26 none swap sw 0 0
unmount命令
unmount /dev/sdb2 撤銷掛載的設備文件
du命令
du [選項] [文件]
du的英文原義為“disk usage”扫责,含義為顯示磁盤空間的使用情況榛鼎,統(tǒng)計目錄(或文件)所占磁盤空間的大小
例如:du -sh /*命令來查看在 Linux 系統(tǒng)根目錄下所有一級目錄分別占用的空間大小。
PC:/$ sudo du -sh /*
13M /bin
122M /boot
4.0K /cdrom
0 /dev
15M /etc
軟鏈接和硬鏈接
在 Linux 系統(tǒng)中存在硬鏈接和軟連接兩種文件鳖孤。
- 硬鏈接(hard link):可以將它理解為一個“指向原始文件 inode 的指針”者娱,系統(tǒng)不為它分配獨立的 inode 和文件。所以苏揣,硬鏈接文件與原始文件其實是同一個文件黄鳍,只是名字不同。我們每添加一個硬鏈接平匈,該文件的 inode 連接數(shù)就會增加 1框沟;而且只有當該文件的 inode 連接數(shù)為 0 時,才算徹底將它刪除增炭。換言之忍燥,由于硬鏈接實際上是指向原文件 inode 的指針,因此即便原始文件被刪除隙姿,依然可以通過硬鏈接文件來訪問灾前。需要注意的是,由于技術的局限性孟辑,我們不能跨分區(qū)對目錄文件進行鏈接哎甲。
- 軟鏈接(也稱為符號鏈接[symbolic link]):僅僅包含所鏈接文件的路徑名,因此能鏈接目錄文件饲嗽,也可以跨越文件系統(tǒng)進行鏈接炭玫。但是,當原始文件被刪除后貌虾,鏈接文件也將失效吞加,從這一點上來說與 Windows 系統(tǒng)中的“快捷方式”具有一樣的性質。
ln命令
ln 命令用于創(chuàng)建鏈接文件尽狠,格式為“l(fā)n [選項] 目標”
[圖片上傳失敗...(image-6ebbcd-1627393728391)]
創(chuàng)建軟鏈接:
PC:~/DEBUG$ echo "HelloWorld!" > readme.txt
PC:~/DEBUG$ ln -s readme.txt link.txt
PC:~/DEBUG$ cat readme.txt
HelloWorld!
PC:~/DEBUG$ cat link.txt
HelloWorld!
PC:~/DEBUG$ rm -rf readme.txt
PC:~/DEBUG$ cat link.txt
cat: link.txt: 沒有那個文件或目錄
軟鏈接的原始文件刪除后衔憨,鏈接也失效了
創(chuàng)建硬鏈接:
PC:~/DEBUG$ echo "HelloWorld!" > readme.txt
PC:~/DEBUG$ ln readme.txt hardlink.txt
PC:~/DEBUG$ cat readme.txt
HelloWorld!
PC:~/DEBUG$ rm -rf readme.txt
PC:~/DEBUG$ cat hardlink.txt
HelloWorld!
硬鏈接的原始文件刪除后,仍然可以通過硬鏈接文件來訪問