linux磁碟與檔案系統管理的那些事兒(2)
我們接著第一篇文章講起。
檔案系統掛載與解除安裝
建立完檔案系統,我們需要將新建的檔案系統掛載到根檔案系統上的某個目錄上,進而我們便可以通過該目錄來訪問該檔案系統。建立這種關聯關係的過程稱為掛載,所掛載的目錄稱為掛載點;若解除這種關聯關係,則稱之為解除安裝;
由於在某一目錄下掛在新裝置後,該目錄原有檔案會被臨時隱藏,因此要儘量以空目錄作為掛載點;
mount 將裝置掛載到掛載點(mount point)
用法 ~]# mount 通過讀取/etc/fstab檔案中的資訊,來顯示當前系統已掛載的所有裝置;
~]# mount [option] Device Mount_Point 將檔案系統掛載到根檔案系統的目錄下;
~]# cat /proc/mounts
上述關鍵字進行解讀: Device:掛載裝置,包括: (1)裝置檔案:如/dev/sdb1 (2)卷標:-L LABEL ,例如 -L MYDATA (3)UUID:-U uuid ,例如 -U cc6ed223-ea32-459d-b639-f77e8da35b72 (4)偽檔案系統名稱:proc,sysfs,devtmpfs,configfs
Mount_Point:掛載點,建議使用空目錄
選項
- -t VFS_TYPE 指定Device的檔案系統型別,可省略
- -r 只讀掛載,即 readonly
- -w 讀寫掛載,即 read and write
- -a 自動掛載;所有支援自動掛載的裝置,所謂支援自動掛載,就是定義在/etc/fstab檔案中,且掛載選項中有自動掛載功能
- -n 不更新/etc/fstab,這是由於掛載一個新檔案系統,會在/etc/fstab中新增資訊,解除安裝一個檔案系統,則會刪除掉該檔案中的資訊;
- -L LABEL 以卷標指定Device
- -U UUID 以UUID指定Device
- -B ,–bind 繫結目錄到另一個目錄上
示例: 首先,格式化分割槽/dev/sdb1,檔案系統型別為ext4,block大小為2048b,卷標為MYDATA,為每3個塊建立一個inode;
[[email protected] mysdb1]# mke2fs -t ext4 -b 2048 -L MYDATA -m 3 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=MYDATA
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
131072 inodes, 1048576 blocks
31457 blocks (3.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=269484032
64 block groups
16384 blocks per group, 16384 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[[email protected] mysdb1]# mount /dev/sdb1 /mydata
[[email protected] mysdb1]# mount
……
……
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/sdb1 on /mydata type ext4 (rw,relatime,seclabel,data=ordered)
然後,我們解除安裝了/dev/sdb1
[[email protected] mysdb1]# umount /dev/sdb1
[[email protected] mysdb1]# mount
……
……
……
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
這次,我們根據卷標(-L MYDATA)指定的裝置進行只讀(-r)掛載:
[[email protected] mysdb1]# blkid /dev/sdb1
/dev/sdb1: LABEL="MYDATA" UUID="baff75a8-916c-42d9-b395-7086d3a63f6a" TYPE="ext4"
[[email protected] mysdb1]# mount -L MYDATA -r /mydata
[[email protected] mysdb1]# mount
……
……
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/sdb1 on /mydata type ext4 (ro,relatime,seclabel,data=ordered)
mount還有一個特殊的用法:
~]# mount -o [option] /dev/Dvice Mount_Point
多個選項用逗號,
隔開
option:
- async/sync 指定非同步模式/同步模式;cow 即(Copy on Write)寫時複製,要操作磁碟上的資料時,需要複製一份原資料單獨處理;在同步模式下,處理資料方式是邊寫邊存,所以I/O速度很慢,但可靠性高;在非同步模式下,則會寫完再存,I/O速度相對快一些,但可靠性較低;
- atime/noatime 是否更新檔案訪問時間
- diratime/nodiratime 是否更新目錄的訪問時間(包含於上一選項)
- auto/noauto 是否支援自動掛載
- exec/noexec 是否支援將檔案系統商的應用程式執行為程序
- dev/nodev 是否支援在此檔案系統上使用裝置檔案
- suid/nosuid 是否允許檔案擁有suid許可權
- remount 重新掛載
- ro 只讀掛載
- rw 讀寫掛載
- user/nouser 是否允許普通使用者掛載此裝置
- acl 啟用此檔案系統上的acl功能
在不進行指定時,其預設掛載選項為defaults,即 rw,suid,dev,exec,auto,nouser,async
示例: 重新進行讀寫掛載/dev/sdb1,可以通過指定掛載點重新掛載,也可以指定裝置重新掛載,
[[email protected] mysdb1]# mount -o remount,rw /mydata
[[email protected] mysdb1]# mount
……
……
/dev/sdb1 on /mydata type ext4 (rw,relatime,seclabel,data=ordered)
掛載交換分割槽
swapon 啟用交換分割槽
用法:
~]# swapon [option], Device
選項:
- -a 啟用所有交換分割槽
- -p PRIORITY 指定優先順序
swapoff 禁用交換分割槽
儲存狀態資訊檢視
free 記憶體使用狀態
用法
~]# free [option]
選項
- -m 以MB為單位顯示
- -G 以GB為單位顯示
示例:
[[email protected] mysdb1]# free -m
total used free shared buff/cache available
Mem: 974 633 118 10 222 126
Swap: 2047 298 1749
df 檔案系統空間使用狀態資訊檢視
用法
~]# df [option] 檢視所有文明系統的空間使用狀態
~]# df [option] /dev/Device 檢視指定裝置檔案系統的空間使用狀態
選項
- -h 即 human-readable,以使用者可讀的方式顯示
- -i 顯示inode使用情況(而不是磁碟塊)
- -P 以Posix相容的格式輸出,每條資訊都作為一行顯示,無論該條資訊有多長
示例1:
[[email protected] mysdb1]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 18555904 5184072 13371832 28% /
devtmpfs 483160 0 483160 0% /dev
tmpfs 498972 0 498972 0% /dev/shm
tmpfs 498972 14936 484036 3% /run
tmpfs 498972 0 498972 0% /sys/fs/cgroup
/dev/sda1 303780 193696 110084 64% /boot
tmpfs 99796 36 99760 1% /run/user/1000
/dev/sdb1 1998538 9236 1918196 1% /mydata
示例2:
[[email protected] mysdb1]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 5.0G 13G 28% /
devtmpfs 472M 0 472M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 15M 473M 3% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 297M 190M 108M 64% /boot
tmpfs 98M 36K 98M 1% /run/user/1000
/dev/sdb1 2.0G 9.1M 1.9G 1% /mydata
示例3:
[[email protected] mysdb1]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 9283072 167937 9115135 2% /
devtmpfs 120790 415 120375 1% /dev
tmpfs 124743 1 124742 1% /dev/shm
tmpfs 124743 942 123801 1% /run
tmpfs 124743 16 124727 1% /sys/fs/cgroup
/dev/sda1 153600 338 153262 1% /boot
tmpfs 124743 20 124723 1% /run/user/1000
/dev/sdb1 131072 11 131061 1% /mydata
示例4:
[[email protected] mysdb1]# df -h /dev/sda1
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 297M 190M 108M 64% /boot
du 檢視某目錄下空間使用情況
用法
~]# du [option] Directory
選項
- -h 即 human-readable,同上
- -s 顯示總體空間佔用大小的總和summary
示例1:
[[email protected] mysdb1]# du -h /etc
16K /etc/fonts/conf.d
24K /etc/fonts
12K /etc/pki/rpm-gpg
0 /etc/pki/ca-trust/source/anchors
0 /etc/pki/ca-trust/source/blacklist
4.0K /etc/pki/ca-trust/source
204K /etc/pki/ca-trust/extracted/java
376K /etc/pki/ca-trust/extracted/openssl
568K /etc/pki/ca-trust/extracted/pem
1.2M /etc/pki/ca-trust/extracted
1.2M /etc/pki/ca-trust
0 /etc/pki/java
12K /etc/pki/tls/certs
24K /etc/pki/tls/misc
0 /etc/pki/tls/private
48K /etc/pki/tls
124K /etc/pki/nssdb
……
……
……
示例2:
[[email protected] mysdb1]# du -s /etc
41384 /etc
[[email protected] mysdb1]# du -sh /etc
41M /etc
檔案系統掛載的配置檔案/etc/fstab
檔案系統掛載時,都會在檔案/etc/fstab 中定義一條資訊;在開機時,系統會根據此檔案進行載入,因此,我們若想開機自動載入某個檔案系統,則必須將其寫入/etc/fstab中。
/etc/fstab 中每一條資訊包括以下欄位:
-
要掛載的裝置或偽檔案系統
裝置檔名稱;LABEL(LABEL=" “);UUID(UUID=” ");偽檔案系統名稱(proc,sysfs)
-
掛載點
-
檔案系統型別
-
掛載選項
-
轉儲頻率
0:不做備份 1:每天轉儲 2:每隔一天轉儲
-
自檢次序
0:不自檢 1:首先自檢,一般只有根檔案系統才用1
檔案系統的其他概念
超級塊:儲存整個檔案系統分配的塊組數目、每個塊組中的塊數、已用塊數、空閒塊數等資訊;
GDT:位於每個塊組中,儲存塊組的更為詳細的資訊,如校驗碼、空閒inode等資訊;
Inode:即Index node,索引節點,儲存檔案的元資料;作為地址指標,可為直接指標、間接指標或三級指標;
Inode bitmap:對“位”標識每一個Inode的佔用情況,每一位對應一個Inode;
block:bitmap:對“位”標識每一個block的佔用情況,每一位對應一個block;
目錄:儲存檔名與Inode的對應關係;
下圖為檔案系統及其中塊組的示意圖:
假設我們要找到/var/log/messages: 1,首先預設核心已知根目錄/的Inode號;所以我們可到元資料區的Inode Table中找到根目錄/對應的Inode,根據Inode找到根目錄/中資料所在磁碟塊(block)從而找到根目錄下各子目錄/檔案與其Inode的對應關係;
2,我們在根目錄下找到子目錄/var對應的Inode號,然後再次進入元資料區的Inode Table中查詢目錄/var所在的磁碟塊,然後便找到了/var目錄下各子目錄/檔案與其Inode的對應關係;
3,同理,我們可以找到/var/log下的子目錄或檔案的對應的Inode號,也即找到了messages對應的Inode號,從而在資料區可以找到檔案messages所在的磁碟塊,從而獲得其資料;
硬連結
所謂硬連結,就是指向同一個Inode的不同路徑;但不能對目錄建立硬連結,也不能跨分割槽建立硬連結;一個Inode可能有很多個硬連結,假設某個Inode有5個硬連結,也就是說,有五個不同的路徑都能到達該Inode,刪除其中一個,則路徑就少了一個,那麼硬連結數也會減一;如果刪除5個,則沒有路徑能到達此檔案對應的Inode,硬連結數減為0,就意味著此檔案被刪除了。而此時,Inode bitmap中此Inode的對應位(標識此Inode的使用狀態)會置0,表示此Inode空閒,未被佔用,同樣的,此Inode所管理的多個block也是空閒的,所以,其對應的block bitmap也會被置0。
符號連結(軟連結)
所謂符號連結,也稱軟連線,指向一個"表示路徑的字串",且連結大小即為字串大小;可以對目錄建立符號連結,也可以跨分割槽;
ln 建立連結
用法
~]# ln SRC DEST 建立硬連結
~]# ln -s SRC DEST 建立符號連結
選項
- -v 即 verbose ,顯示過程
示例1: 建立硬連結:首先檢視當前目錄下檔案資訊,hello的硬連結次數為1,hardwares的硬連結次數為3;
[[email protected] work]# ls -l
total 0
drwxr-xr-x. 3 root root 29 Oct 4 23:26 hardwares
-rwxrw-rw-. 1 jeffrey root 0 Sep 10 04:17 hello
由於不能為目錄建立硬連結,因此,我們就為hello建立一個硬連結mylink
[[email protected] work]# ln hello mylink
分別檢視hello的硬連結數為增加為2;
[[email protected] work]# ls -l
total 0
drwxr-xr-x. 3 root root 29 Oct 4 23:26 hardwares
-rwxrw-rw-. 2 jeffrey root 0 Sep 10 04:17 hello
-rwxrw-rw-. 2 jeffrey root 0 Sep 10 04:17 mylink
我們檢視其Inode號,檔案hello的Inode與檔案mylink相同,均為37304325;
[[email protected] work]# ls -i
52092242 hardwares 37304325 hello 37304325 mylink
示例2 為hello建立符號連結symbollink;
[[email protected] work]# ln -s hello symbollink
[[email protected] work]# ls -l
total 8
drwxr-xr-x. 3 root root 29 Oct 4 23:26 hardwares
-rwxrw-rw-. 2 jeffrey root 39 Oct 4 23:33 hello
-rwxrw-rw-. 2 jeffrey root 39 Oct 4 23:33 mylink
lrwxrwxrwx. 1 root root 5 Oct 4 23:40 symbollink -> hello
[[email protected] work]# cat hello
hello world!
hello world!
hello workd!
[[email protected] work]# cat symbollink
hello world!
hello world!
hello workd!