第七章 Linux磁盤與文件系統管理
7.1 Linux文件系統
7.1.1 磁盤組成與分區
文件系統建立在磁盤上
整塊磁盤的組成主要有:
(1)圓形的碟片,主要記錄數據的部分
(2)機械手臂,與在機械手臂上的磁頭,可擦寫碟片上的數據
(3)主軸馬達,可以轉動碟片,讓機械手臂上的磁頭在碟片上讀寫數據
數據存儲於讀取的重點在碟片,碟片的物理組成:
(1)扇區,是最小的物理存儲單位,目前有512B和4KB兩種格式
(2)將扇區組成一個圓,就是柱面
(3)最小分區單位,早期是柱面,現在是扇區,每個扇區有號碼,像自己的 座位號一樣
(4)磁盤分區表,主要有兩種格式,一種是限制較多的MBR分區表,一種是較新且限制較少的GPT分區表
(5)MBR分區表中,第一個扇區最重要,裏面有:主引導記錄MBR(446B)和分區表(64B)
(6)GPT分區表,除了分區數量擴充較多之外,支持的磁盤容量也可以超過2T
物理磁盤的文件名:/dev/sd[a-p]
虛擬磁盤的文件名:/dev/vd[a-p]
/dev/sd[a-p][1-128]
-----是物理磁盤的文件名
/dev/vd[a-p][1-128]
-----是虛擬磁盤的文件名
7.1.2 文件系統特性
格式化:
磁盤分區完畢,需要進行格式化,之後操作系統才能使用這個文件系統。
每種操作系統設置的文件屬性/權限不同,爲了存放這些文件所需的數據,需要將分區進行格式化,以成爲操作系統能使用的文件系統格式。
每種操作系統能夠使用的文件系統並不相同。
一個可被掛載的數據,就是一個文件系統,而非一個分區。
文件系統通常將權限與屬性放置到inode中,至於實際數據則放置到數據區塊中。
(1)超級區塊:記錄此文件系統的整體信息,包括inode與數據區塊的總量、使用量、剩餘量,以及文件系統的格式與相關信息等
(2)inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的區塊號碼
(3)數據區塊:實際記錄文件的內容,若文件太大,會佔多個區塊
碎片整理:
需要碎片整理的原因就是文件寫入的區塊太過於離散,此時文件讀取的性能將會變得很差所致。這時候可以通過碎片整理將同一個文件所屬的區塊集合在一起,這樣數據的讀取比較容易。
索引式文件系統如ext2
不怎麼需要碎片整理,但像U盤等FAT
格式的文件系統需要是不是整理下碎片。
7.1.3 Linux的ext2文件系統(inode)
文件系統中,inode的內容在記錄文件的權限與相關屬性,數據區塊在記錄文件的實際內容。
文件系統一開始就將inode與數據區塊規劃好了,除非重新格式化,或者利用resize2fs
等命令修改其大小,否則inode和數據區塊固定好後就不再動了。
ext2
文件系統格式化的時候基本上是區分爲多個區塊羣組,每個區塊羣組都有獨立的inode、數據區塊、超級區塊系統。一羣一羣的管理。
文件系統最前面有一個啓動扇區,這個啓動扇區可以安裝啓動引導程序。這樣就能夠將不同的啓動引導程序安裝到別的文件系統最前端,而不用覆蓋一整塊磁盤唯一的MBR
,這樣才能製作出多重引導的環境。
每一個區塊羣組的六個主要內容:
(1)數據區塊
- ext2中支持的區塊大小:1K、2K、4K。格式化時區塊的大小確定下來。
- 每個區塊都有編號,方便inode記錄。
- 區塊大小差異,會導致該文件系統能夠支持的最大磁盤容量和最大單一文件容量並不相同。
- 每個區塊內最多隻能夠放置一個文件的數據,文件過大就佔多個區塊,文件過小,那麼單一區塊中剩下的磁盤空間浪費
(2)inode table (inode表)
inode記錄的內容:
- 該文件的讀寫屬性(rwx)
- 該文件的擁有者與用戶組(owner、group)
- 該文件的大小
- 該文件建立或狀態改變的時間(ctime)
- 最近一次的讀取時間(atime)
- 最近修改的時間(mtime)
- 定義文件特性的表示(flag),如SetUID
- 該文件真正內容的指向(pointer)
inode的特點:
- 每個inode大小固定爲128B,新的ext4和xfs可設置爲256B
- 每個文件僅會佔用一個inode
- 承上,
- 文件系統能夠建立的文件數量與inode數量有關
- 系統讀取文件時,要先找到inode,分析inode所記錄的權限與用戶是否符合,若符合才能夠讀取區塊的內容
(3)超級區塊 Superblock
記錄整個文件系統相關信息的地方,沒有超級區塊就沒有文件系統,其記錄的主要信息:
- 數據區塊與inode的總量
- 未使用與已使用的inode與數據區塊數量
- 數據區塊與inode的大小(block爲1k、2k、4k,inode爲128B或256B)
- 文件系統的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤的時間等文件系統的相關信息;
- 一個有效位數值,若此文件系統已被掛載,則有效位爲0,若未被掛載,有效位爲1
其他信息:
- 超級區塊的大小一般爲1024B。
- 每個文件系統僅有一個超級區塊,但是每個區塊羣組都可能含有超級區塊,主要是作爲第一個區塊羣組內超級區塊的備份,方便後面快速恢復。
- 能用
dumpe2fs
來觀察
(4)文件系統描述說明 Filesystem Description
這個區段,可以:
- 描述每個區塊羣組的開始與結束的區塊
- 說明每個區段(超級區塊、對照表、inode對照表、數據區塊)分別介於哪一個區塊之間
- 這部分也能用
dumpe2fs
來觀察
(5)區塊對照表 block bitmap
- 記錄使用和未使用的區塊,便於選擇空塊記錄新文件的數據
- 刪除文件時,要將該區塊號碼的標誌修改成【未使用中】
(6)inode對照表 inode bitmap
記錄使用和未使用的inode
(7)dumpe2fs 查詢ext系列超級區塊信息的命令
xfs文件系統暫時無法使用該命令查詢
dumpe2fs [-bh] 設備文件名
-h 僅列出superblock數據,不列出其他區段內容
blkid 可以顯示出當前系統被格式化的設備
7.1.4 與目錄樹的關係
ls -li 觀察目錄內的文件所佔的inode號碼
7.1.5 ext2/ext3/ext4文件存取 與 日誌式文件系統的功能
ext2/ext3/ext4文件存取 :
(1)先看目錄屬性,是否具備w和x,具備纔有可能新增;
(2)根據inode對照表找到沒有使用的inode號碼,將新文件的權限屬性寫入inode;
(3)根據區塊對照表找到沒有使用的區塊,將文件內容寫入,並更新inode的區塊指向數據;
(4)更新inode對照表和區塊對照表,並更新超級區塊內容。
日誌式文件系統:
爲了記錄和查找數據不一致狀態,使用日誌文件系統。
1(預備)當要寫入一個文件時,先在日誌記錄區塊中記錄某文件準備寫入的信息;
2(實際寫入)開始寫入文件的權限和數據;開始更新metadata的數據;
3(結束)完成數據與metadata更新後,在日誌記錄記錄區塊中完成該文件的記錄。
7.1.6 Linux文件系統的運行
系統將一個文件加載到內存中,如果這個文件未被修改過,標記爲clean,如果修改了,標記爲dirty。系統會不定時地將dirty文件寫回磁盤中。
調用sync
能強制系統將dirty文件寫回磁盤。
正常關機會自動調用sync
保存文件。
突然斷電、宕機等異常關機,可能導致文件系統損壞(磁盤沒壞)。
7.1.7 掛載點的意義
每個文件系統都有獨立的inode、區塊、超級區塊等信息。
這個文件系統要能夠連接到目錄樹才能被使用。
掛載點:/ 和 /boot 和 /home
。
xfs文件系統最頂層的目錄inode一般是128號。
根目錄下的.
和..
與根目錄是相同的東西。
7.1.8 其他Linux支持的文件系統與VFS
ls -l /lib/modules/$(uname -r)/kernel/fs 查看你的Linux支持的文件系統種類
cat /proc/filesystems 查看系統當前已加載到內存中支持的文件系統
整個Linux識別的文件系統其實都是VFS在進行管理,VFS是內核的一個功能,虛擬文件系統選擇。
7.1.9 XFS文件系統簡介
取代ext4,成爲新寵,不在於性能多優秀,而在於文件系統的恢復速度和創建速度快,格式化比ext系列快。
xfs文件系統,在數據分佈上,分爲3塊,數據區,文件系統活動登錄區,實時運行區。
xfs的inode和區塊,是動態產生的,並非一開始就格式化完成配置的,所以格式化操作賊快。
xfs_info 掛載點 | 設備文件名
xfs_info /dev/vda2 觀察這個文件系統
df -T /boot 找出/boot這個掛載點下的文件系統的超級區塊記錄
7.2 文件系統的簡單操作
7.2.1 磁盤與目錄的容量
df 列出文件系統的整體磁盤使用量
df [-ahikHTm] [目錄或文件名]
-a 列出所有文件系統
-k 以kb容量顯示各文件系統
-m 以mb容量顯示各文件系統
-h 以容易閱讀的GB、Mb、Kb格式自行顯示
-i 不用磁盤容量,而以inode數量來顯示
df
df -h
df -h /etc 會顯示這個目錄或文件所在磁盤分區的容量
du 查看文件系統的磁盤使用量(常用在查看目錄所佔磁盤空間)
du [-ahskm] 文件或目錄名稱
-s 僅列出總量,而不列出每個類別的目錄佔用容量(含子目錄容量)
/proc是活在內存中的掛載點,所以不佔用硬盤容量。
7.2.2 硬鏈接與符號鏈接 ln
ln 已有文件 新文件 建立已有文件與新文件的硬鏈接
硬鏈接一般來說不會增加新的開銷,磁盤空間與inode數目不會改變,就是在新文件所在目錄的區塊中多寫入一個指向實際inode節點的inode編號。
刪除一個,另一個還在,還能找回數據。
硬鏈接 不能跨文件系統、不能鏈接目錄。
ln -s 已有文件 新文件 建立軟鏈接
建立一個新的文件,快捷方式,會佔用inode和區塊。
ln [-sf] 源文件 目標文件
-s 如果不加任何參數就是硬鏈接;加-s就是符號鏈接
-f 如果目標文件存在時,就主動將目標文件刪除後再建立
7.3 磁盤的分區、格式化、檢驗與掛載
磁盤管理,新增一塊磁盤,需要做的所有事情。
7.3.1 觀察磁盤分區的狀態
lsblk [-dfimpt] [device]
-i 使用ASCII的字符輸出
-p 列出該設備的完整文件名,而不要去掉前導目錄
lsblk 列出本系統下所有磁盤信息,與磁盤內的分區信息
blkid 可以列出設備的UUID等參數,UUID是全局唯一標識符
parted device_name print
parted /dev/vda print 列出/dev/vda磁盤的相關信息
7.3.2 磁盤分區
MBR分區表使用fdisk分區,GPT分區表使用gdisk分區。
新增分區:
gdisk /dev/sda 進入磁盤分區的操作區
?
n
p
w
更新內核:
改變分區後,並不會立刻更新內核,可以重啓生效,但也可以輸入:
partprobe [-s] 更新Linux內核的分區表信息
查看當前分區
lsblk /dev/sda
或者:
cat /proc/partitions 查看內核的分區記錄
刪除分區:
gdisk /dev/sda
d
千萬不能刪除正在使用中的分區,可以先卸載,再刪除,否則內核很奇怪。
7.3.3 磁盤格式化
xfs:
mkfs.xfs 設備名稱 以默認參數格式化
mkfs.xfs /dev/sda4 格式化成xfs文件系統
partprobe -s 更新內核中的分區信息
blkid /dev/sda4 查看這個文件系統
grep 'processor' /proc/cpuinfo 查看當前到底有多少個CPU可以用
ext4:
mkfs.ext4 [-b size][-L label] 設備名稱
mkfs.ext4 /dev/sda5
dumpe2fs -h /dev/sda5
7.3.4 文件系統檢驗
xfs:
xfs_repair [-fnd] 設備名稱
-f 後面的設備其實是個文件而不是實體設備
-n 單純檢查並不修改文件系統中的任何數據
-d 通常用在單人維護模式下面,針對根目錄進行檢查與修復的操作,很危險!不要隨便用
xfs_repair /dev/sda4 檢查一下剛剛建立的文件系統
xfs_repair /dev/centos/home 檢查一下某個原本就有的文件系統,會出錯,可卸載後再處理
Linux中,根目錄無法被卸載。
如果根目錄有問題,進入單人維護或恢復模式,通過-d選項來處理。
ext4:
fsck.ext4 [-pf] [-b 超級區塊] 設備名稱
dumpe2fs -h /dev/sda5 | grep 'Blocks per group' 找出/dev/sda5的另一塊超級區塊
fsck.ext4 -b 32768 /dev/sda5 以這塊超級區塊爲準,檢查/dev/sda5文件系統
fsck.ext4 /dev/sda5 若文件系統正常,不進入強制檢查,會告訴你係統沒問題
fsck.ext4 -f /dev/sda5 強制檢查/dev/sda5
所有這些被檢查的硬盤分區務必不可掛載到系統上,必須得在卸載狀態才能檢查
7.3.5 文件系統掛載與卸載
mount -a
mount [-l]
mount [-t 文件系統] LABEL='' 掛載點
mount [-t 文件系統] UUID='' 掛載點 推薦的方式!!!
mount [-t 文件系統] 設備文件名 掛載點
將/dev/sda4 掛載到/data/xfs:
blkid /dev/sda4 查看/dev/sda4的UUID
mkdir -p /data/xfs 建立掛載點目錄,-p遞歸創建子文件夾
mount UUID="da4c0459-2ef4-4f2a-baa9-0331955768fd" /data/xfs
df /data/xfs
出現:
文件系統 1K-塊 已用 可用 已用% 掛載點
/dev/sda4 1038336 32992 1005344 4% /data/xfs
將/dev/sda5 掛載到/data/ext4:
blkid /dev/sda5
mkdir /data/ext4
mount UUID="94014304-4331-45cb-ac94-e567008e720e" /data/ext4
df /data/ext4
出現:
文件系統 1K-塊 已用 可用 已用% 掛載點
/dev/sda5 999320 2564 927944 1% /data/ext4
重新掛載根目錄:
mount -o remount,rw,auto /
在符號鏈接不能使用的時候,可以使用額外掛載某個目錄的方法:
mkdir /data/var 新建掛載點
mount --bind /var /data/var 將/var掛載到/data/var
ls -lid /var /data/var 顯示兩個目錄
69 drwxr-xr-x. 20 root root 282 4月 29 21:44 /data/var
69 drwxr-xr-x. 20 root root 282 4月 29 21:44 /var
內容完全一樣,因爲本來就是掛載目錄
umount [-fn] 設備文件名或掛載點
-f 強制卸載
-l 立刻卸載文件系統,比-f還強
-n 不更新/etc/mtab情況下卸載
需要離開該文件系統的掛載點,才能卸載這個掛載點,否則,系統認爲你正在使用這個文件系統。
7.3.6 磁盤/文件系統參數自定義
Linux上的設備也用文件來表示,用文件代表設備,通過文件的主要設備代碼major、次要設備代碼minor數值來替代。
mknod 設備文件名 [bcp] [Major] [Minor]
b 設置設備名稱成爲一個外接存儲設備文件,如磁盤等
c 設置設備名稱成爲一個外接輸入設備文件,如鍵盤鼠標等
p 設置設備名稱成爲一個FIFO文件
創建一個磁盤:
ll /dev/sda* 查看/dev/sda的major和minor 分別爲8和1-5
mknod /dev/sda10 b 8 10 創建一個磁盤10
ll /dev/sda10
rm /dev/sda10 測試完就刪了吧
創建一個FIFO:
mknod /tmp/testpipe p
ll /tmp/testpipe
rm /tmp/testpipe 測試完就刪了吧
xfs_admin [-lu] [-L label] [-U uuid] 文件設備名
-l 列出這個設備的label name;
-u 列出這個設備的UUID
-L 設置這個設備的Label name
-U 設置這個設備的UUID
xfs_admin -L vbird_xfs /dev/sda4 設置/dev/sda4的Label name
xfs_admin -l /dev/sda4 查看/dev/sda4的Label name
利用Label name掛載:
mount LABEL=vbird_xfs /data/xfs 通過Label name進行掛載
umount /dev/sda4 卸載備用
利用UUID掛載:
uuidgen 可以產生新的UUID:
b9297c33-1376-4eab-8d25-98196d01c822
xfs_admin -u /dev/sda4 顯示/dev/sda4的UUID
UUID = da4c0459-2ef4-4f2a-baa9-0331955768fd
xfs_admin -U b9297c33-1376-4eab-8d25-98196d01c822 /dev/sda4 設置UUID
mount UUID=b9297c33-1376-4eab-8d25-98196d01c822 /data/xfs 掛載
ext4:
tune2fs [-l] [-L Label] [-U uuid] 設備文件名
-l 類似 dumpe2fs -h 的功能,將superblock中的數據讀出來
-L 修改Label name
-U 修改UUID
dumpe2fs -h /dev/sda5 | grep name 查看Label name
tune2fs -L vbird_ext4 /dev/sda5 設置Label name
mount LABEL=vbird_ext4 /data/ext4 注意此處LABEL全大寫
7.4 設置啓動掛載
7.4.1 啓動掛載/etc/fstab 及 /etc/mtab
cat /etc/fstab 查看文件內容,顯示的字段如下:非常重要
[設備/UUID/LABEL] [掛載點] [文件系統] [文件系統參數] [dump] [fsck]
設置每次啓動都將/dev/sda4 自動掛載到/data/xfs:
先查看/dev/sda4的UUID:
blkid /dev/sda4
或
xfs_admin -u /dev/sda4
得到:
UUID = b9297c33-1376-4eab-8d25-98196d01c822
nano /etc/fstab 打開文件,並寫入下面一行內容
UUID="b9297c33-1376-4eab-8d25-98196d01c822" /data/xfs xfs defaults 0 0
這裏務必要注意,等號兩端一定不能出現多餘空格,也不能缺少引號
在linux中,nano的保存源和退出: 如果你要保存所做的修改,按下Ctrl+O。
想要退出,按下Ctrl+X。
df 檢查/dev/sda4是否已經掛載
umount /dev/sda4 如果已經被掛載,那麼趕緊卸載
測試一下剛剛寫入/etc/fstab的語法有沒有錯誤,這一點很重要!!!錯了可能無法開機,務必要測試!!!
mount -a 這裏不能報錯,什麼都不輸出纔行
df /data/xfs 這裏掛載點要存在
萬一不幸出錯:
mount -n -o remount,rw /
7.4.2 特殊設備loop掛載(鏡像文件不刻錄就掛載使用)
掛載鏡像文件:
mkdir /data/centos_dvd
mount -o loop /tmp/CentOS.iso /data/centos_dvd 掛載鏡像文件
df /data/centos_dvd
ll /data/centos_dvd
umount /data/centos_dvd
建立大文件並格式化後掛載:
dd if=/dev/zero of=/srv/loopdev bs=1M count=512 在/srv/loopdev建立了一個空文件
mkfs.xfs -f /srv/loopdev 格式化文件,必須-f
blkid /srv/loopdev 查看是否成功了
mount -o loop UUID="35d45a93-315a-444e-9337-285c0f7bac02" /mnt 暫時性掛載
永久掛載:
mkdir /data/file 新建一個目錄作爲掛載點
cat /etc/fstab 將啓動掛載命令寫入文件
/srv/loopdev /data/file xfs defaults,loop 0 0
umount /mnt
mount -a 查驗命令是否有效
df /data/file
7.5 內存交換分區swap的創建
swap分區:
以前內存很小,就將內存中的暫時不用的數據拿到硬盤中暫時存放,這塊存放內存中數據的硬盤空間就是swap內存交換分區。
安裝系統時,一定需要的兩個硬盤分區:一個是根目錄,一個是swap分區。
swap只有在物理內存不足的時候纔會被使用到。
7.5.1 使用物理分區創建內存交換分區
1.磁盤分區
gdisk /dev/sda
n
+512M
8200
w
partprobe -s
lsblk
2.開始創建swap格式
mkswap /dev/sda6
blkid /dev/sda6
3.開始觀察與加載查看
free 查看當前系統內存使用情況,與交換分區使用情況
swapon /dev/sda6 將其設置爲交換分區
free 這次能看到swap增加了不少
swapon -s 查看當前使用的內存交換分區設備有哪些
4.持久化
blkid /dev/sta6 得到UUID
nano /etc/fstab
UUID="c716c895-6286-45f2-8906-bc106bc5dcff" swap swap defaults 0 0
mount -a
7.5.2 使用文件創建內存交換文件
dd if=/dev/zero of=/tmp/swap bs=1M count=128 創建一個128M的文件/tmp/swap
mkswap /tmp/swap 將文件格式化爲內存交換文件的文件格式,要特別小心,寫錯可能會讓系統掛掉!!!
swapon /tmp/swap 使用swapon將/tmp/swap啓動
swapon -s 查看當前所有的swap分區
nano /etc/fstab
/tmp/swap swap swap defaults 0 0 此處務必不能使用UUID,系統會找不到文件的UUID,只會找區塊的UUID
swapoff /tmp/swap /dev/sda6 關閉這兩個swap分區或文件
swapon -s 查看是否關閉成功
swapon -a 讓所有的都生效
swapon -s 查看是否生效成功
7.6 文件系統的特殊觀察與操作
7.6.1 磁盤空間之浪費問題
大磁盤、小磁盤、文件容量損耗
7.6.2 利用GNU的parted進行分區操作
parted [設備] [命令[參數]]
parted /dev/sda print 查看/dev/sda系列
parted /dev/sda mkpart primary fat32 36.0GB 36.5GB 新建分區,這個36.0GB是抄的上一個分區的End
parted /dev/sda print 再次查看
partprobe -s 讓它生效
lsblk /dev/sda7 要確保它真的存在
blkid /dev/sda7 查詢UUID
nano /etc/fstab
UUID="DD87-2ABC" /data/win vfat defaults 0 0
mkdir /data/win
mount -a
df /data/win
如果單純操控gpt文件系統,還是用gdisk最好。
但是如果要寫個腳本,讓分區全部一口氣建立,parted就十分有效,因爲parted不需要和用戶互動,這就是它最大的好處。