1. 程式人生 > >linux磁碟與檔案系統管理的那些事兒(2)

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!