【Linux】Linux 磁盘与文件系统管理命令
來自《鳥哥的 Linux 私房菜》,重復只是加深自己的印象。
本篇結構:
- 文件系統的簡單操作
- 磁盤的分區、格式化、檢驗與掛載
- 設置開機掛載
- 內存交換空間(swap)之創建
- 補充
一、文件系統的簡單操作
1.1、磁盤與目錄的容量
磁盤的整體數據是在 superblock 區塊中,但是每個各別文件的容量則在 inode
當中記載的。在命令行下面該如何叫出這幾個數據呢?
- df:列出文件系統的整體磁盤使用量;
- du:評估文件系統的磁盤使用量(常用在推估目錄所占容量)
1.1.1、 df
df [-ahikHTm] [目錄或文件名]選項與參數:
- -a :列出所有的文件系統,包括系統特有的 /proc 等文件系統;
- -k :以 KBytes 的容量顯示各文件系統;
- -m :以 MBytes 的容量顯示各文件系統;
- -h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示;
- -H :以 M=1000K 取代 M=1024K 的進位方式;
- -T :連同該 partition 的 filesystem 名稱 (例如 xfs) 也列出;
- -i :不用磁盤容量,而以 inode 的數量來顯示
在 Linux 下面如果 df 沒有加任何選項,那么默認會將系統內所有的,(不含特殊內存內的文件系統與 swap) 都以 1 KBytes 的容量來列出來!
所輸出的結果信息:
- Filesystem:代表該文件系統是在哪個 partition ,所以列出設備名稱;
- 1k-blocks:說明下面的數字單位是 1KB!可利用 -h 或 -m 來改變容量;
- Used:顧名思義,就是使用掉的磁盤空間;
- Available:也就是剩下的磁盤空間大小;
- Use%:就是磁盤的使用率啦!如果使用率高達 90% 以上時, 最好需要注意一下了,免得容量不足造成系統問題;
- Mounted on:就是磁盤掛載的目錄所在。
范例一:將系統內的所有特殊文件格式及名稱都列出來
范例二:將 /etc 下面的可用的磁盤容量以易讀的容量格式顯示
范例三:將目前各個 partition 當中可用的 inode 數量列出
root@master:~# df -ih Filesystem Inodes IUsed IFree IUse% Mounted on udev 7.9M 419 7.9M 1% /dev tmpfs 7.9M 861 7.9M 1% /run /dev/mapper/ubuntu--vg-root 31M 402K 30M 2% / tmpfs 7.9M 4 7.9M 1% /dev/shm tmpfs 7.9M 4 7.9M 1% /run/lock tmpfs 7.9M 16 7.9M 1% /sys/fs/cgroup /dev/sda1 122K 310 122K 1% /boot tmpfs 7.9M 4 7.9M 1% /run/user/0 tmpfs 7.9M 4 7.9M 1% /run/user/1000由于 df 主要讀取的數據幾乎都是針對一整個文件系統,因此讀取的范圍主要是在 Superblock 內的信息, 所以這個指令顯示結果的速度非常的快速!在顯示的結果中需要特別留意的是根目錄的剩余容量! 因為所有的數據都是由根目錄衍生出來的,因此當根目錄的剩余容量剩下 0 時,那 Linux 可能就問題很大了。
需要注意的是,如果使用 -a 這個參數時,系統會出現 /proc 這個掛載點,但是里面的東西都是 0 ,不要緊張! /proc 的東西都是 Linux 系統所需要載入的系統數據,而且是掛載在“內存當中”的, 所以當然沒有占任何的磁盤空間。
/dev/shm/ 目錄,其實是利用內存虛擬出來的磁盤空間,通常是總實體內存的一半!由于是通過內存仿真出來的磁盤,因此你在這個目錄下面創建任何數據文件時,存取速度是非常快速的!(在內存內工作) 不過,也由于他是內存仿真出來的,因此這個文件系統的大小在每部主機上都不一樣,而且創建的東西在下次開機時就消失了! 因為是在內存中!
1.1.2、du
du [-ahskm] 文件或目錄名稱選項與參數:
- -a :列出所有的文件與目錄容量,因為默認僅統計目錄下面的文件量而已;
- -h :以人們較易讀的容量格式 (G/M) 顯示;
- -s :列出總量而已,而不列出每個各別的目錄占用容量;
- -S :不包括子目錄下的總計,與 -s 有點差別。
- -k :以 KBytes 列出容量顯示;
- -m :以 MBytes 列出容量顯示。
直接輸入 du 沒有加任何選項時,則 du 會分析“目前所在目錄”的文件與目錄所占用的磁盤空間。但是,實際顯示時,僅會顯示目錄容量(不含文件),因此 . 目錄有很多文件沒有被列出來,所以全部的目錄相加不會等于 . 的容量。此外,輸出的數值數據為 1K 大小的容量單位。加上參數 -a 則可以將文件容量也顯示出來。
范例一:檢查根目錄下面每個目錄所占用的容量
du -sm /*16 /bin 108 /boot ... 省略 ... du: cannot access '/proc/104399/fd/4': No such file or directory du: cannot access '/proc/104399/fdinfo/4': No such file or directory ... 省略 ... 1692 /tmp 9607 /usr 41054 /var這是個很常被使用的功能,利用萬用字符 * 來代表每個目錄,如果想要檢查某個目錄下,哪個次目錄占用最大的容量,可以用這個方法找出來。至于 /proc 里頭會列出一堆“No such file or directory” 的錯誤,因為是內存內的程序,程序執行結束就會消失,因此會有些目錄找不到,是正確的!
與 df 不一樣的是,du 這個指令其實會直接到文件系統內去搜尋所有的文件數據,所以指令的運行會執行一小段時間。此外,在默認的情況下,容量的輸出是以 KB 來設計的, 如果想要知道目錄占了多少 MB ,那么就使用 -m 這個參數即可,如果只想要知道該目錄占了多少容量的話,使用 -s 就可以。
至于 -S 這個選項部分,由于 du 默認會將所有文件的大小均列出,因此假設在 /etc 下面使用 du 時, 所有的文件大小,包括 /etc 下面的次目錄容量也會被計算一次。然后最終的容量(/etc) 也會加總一次, 因此很多朋友都會誤會 du 分析的結果不太對勁。如果想要列出某目錄下的全部數據, 或許也可以加上 -S 的選項,減少次目錄的加總。
1.2、實體鏈接與符號鏈接: ln
1.2.1、Hard Link (實體鏈接, 硬式鏈接或實際鏈接)
- 每個文件都會占用一個 inode ,文件內容由 inode 的記錄來指向;
- 想要讀取該文件,必須要經過目錄記錄的文件名來指向到正確的 inode 號碼才能讀取。
也就是說,其實文件名只與目錄有關,但是文件內容則與 inode 有關。那么想一想, 有沒有可能有多個文件名對應到同一個 inode 號碼呢?有的!那就是 hard link 的由來。
簡單說:hard link 只是在某個目錄下新增一筆文件名鏈接到某 inode 號碼的關連記錄而已。
如圖,有個 /root/crontab 是 /etc/crontab 的實體鏈接,這兩個文件名鏈接到同一個 inode :
使用 hard link 設置鏈接文件時,磁盤的空間與 inode 的數目都不會改變, hard link 只是在某個目錄下的 block 多寫入一個關連數據而已,既不會增加 inode 也不會耗用 block 數量(其實還是可能會改變系統的 block 的,那就是當新增這筆數據卻剛好將目錄的 block 填滿時,就可能會新加一個 block 來記錄文件名關連性,而導致磁盤空間的變化)。
由圖也可知,事實上 hard link 應該僅能在單一文件系統中進行的,應該是不能夠跨文件系統,所以 hard link 是有限制的:
- 不能跨 Filesystem;
- 不能 link 目錄。
因為如果使用 hard link 鏈接到目錄時, 鏈接的數據需要連同被鏈接目錄下面的所有數據都創建鏈接。
1.2.2、Symbolic Link (符號鏈接,亦即是捷徑)
相對于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的文件名!由于只是利用文件來做為指向的動作, 所以,當來源文件被刪除之后,symbolic link 的文件會“開不了”, 會一直說“無法打開某文件!”。實際上就是找不到原始“文件名”而已。
如圖:
由 1 號 inode 讀取到鏈接文件的內容僅有文件名,根據文件名鏈接到正確的目錄去取得目標文件的 inode , 最終就能夠讀取到正確的數據了。可以發現的是,如果目標文件(/etc/crontab)被刪除了,那么整個環節就會無法繼續進行下去, 所以就會發生無法通過鏈接文件讀取的問題了!
這個 Symbolic Link 與 Windows 的捷徑可以給他劃上等號,由 Symbolic link 所創建的文件為一個獨立的新的文件,所以會占用掉 inode 與 block 。
1.2.3、指令
ln [-sf] 來源文件 目標文件選項與參數:
- -s :如果不加任何參數就進行鏈接,那就是hard link,至于 -s 就是symbolic link;
- -f :如果 目標文件 存在時,就主動的將目標文件直接移除后再創建!
關于目錄的 link 數量:
一個“空目錄”里面至少會存在 . 與 … 這兩個目錄。那么,當創建一個新目錄名稱為 /tmp/testing 時,基本上會有三個東西,那就是:
- /tmp/testing
- /tmp/testing/.
- /tmp/testing/…
而其中 /tmp/testing 與 /tmp/testing/. 其實是一樣的!都代表該目錄,而 /tmp/testing/… 則代表 /tmp 這個目錄。所以說,當創建一個新的目錄時, “新的目錄的 link 數為 2 ,而上層目錄的 link 數則會增加 1。
二、磁盤的分區、格式化、檢驗與掛載
想要在系統里面新增一顆磁盤時,應該有如下動作需要做:
2.1、觀察磁盤分區狀態
目前磁盤分區主要有 MBR 以及 GPT 兩種格式,這兩種格式所使用的分區工具不太一樣,因此分區前要去找一下目前系統有的磁盤有哪些, 這些磁盤是 MBR 還是 GPT 等等。
2.1.1、lsblk 列出系統上的所有磁盤列表
lsblk 可以看成“ list block device ”的縮寫,就是列出所有儲存設備的意思。
lsblk [-dfimpt] [device]選項與參數:
- -d :僅列出磁盤本身,并不會列出該磁盤的分區數據
- -f :同時列出該磁盤內的文件系統名稱
- -i :使用 ASCII 的線段輸出,不要使用復雜的編碼 (再某些環境下很有用)
- -m :同時輸出該設備在 /dev 下面的權限數據 (rwx 的數據)
- -p :列出該設備的完整文件名!而不是僅列出最后的名字而已
- -t :列出該磁盤設備的詳細數據,包括磁盤佇列機制、預讀寫的數據量大小等
范例一:列出本系統下的所有磁盤與磁盤內的分區信息
root@master:/dev# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 500G 0 disk ├─sda1 8:1 0 487M 0 part /boot ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 499.5G 0 part ├─ubuntu--vg-root 252:0 0 483.5G 0 lvm /└─ubuntu--vg-swap_1 252:1 0 16G 0 lvm [SWAP] sr0 11:0 1 1024M 0 rom系統主要有個 sr0 以及一個 sda 的設備,而 sda 的設備下面又有三個分區, 其中 sda5 甚至還有因為 LVM 產生的文件系統。
- NAME:就是設備的文件名!會省略 /dev 等前導目錄;
- MAJ:MIN:其實核心認識的設備都是通過這兩個代碼來熟悉的!分別是主要:次要設備代碼;
- RM:是否為可卸載設備 (removable device),如光盤、USB 磁盤等等;
- SIZE:當然就是容量;
- RO:是否為只讀設備的意思;
- TYPE:是磁盤 (disk)、分區 (partition) 還是只讀存儲器 (rom) 等輸出;
- MOUTPOINT:掛載點!
范例二:僅列出 /dev/sda 設備內的所有數據的完整文件名
root@master:/dev# lsblk -ip /dev/sda NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT /dev/sda 8:0 0 500G 0 disk |-/dev/sda1 8:1 0 487M 0 part /boot |-/dev/sda2 8:2 0 1K 0 part `-/dev/sda5 8:5 0 499.5G 0 part |-/dev/mapper/ubuntu--vg-root 252:0 0 483.5G 0 lvm /`-/dev/mapper/ubuntu--vg-swap_1 252:1 0 16G 0 lvm [SWAP]2.1.2、blkid 列出設備的 UUID 等參數
lsblk 可以使用 -f 也可以來列出文件系統與設備的 UUID 數據。
UUID 是全域單一識別碼 (universally unique identifier),Linux 會將系統內所有的設備都給予一個獨一無二的識別碼, 這個識別碼就可以拿來作為掛載或者是使用這個設備/文件系統之用。
root@master:/dev# blkid /dev/sda1: UUID="4ed77cbc-f446-4918-90ca-4e6b6fc7d97c" TYPE="ext2" PARTUUID="863f83f3-01" /dev/sda5: UUID="lYIIQX-XyCX-1hpS-bLSR-yXX7-SdqL-6Swqvq" TYPE="LVM2_member" PARTUUID="863f83f3-05" /dev/mapper/ubuntu--vg-root: UUID="4eb8d680-6565-494a-bf6e-3c15e48eda1b" TYPE="ext4" /dev/mapper/ubuntu--vg-swap_1: UUID="b2d65ad5-9053-4315-83ae-ddba10e59f57" TYPE="swap"每一行代表一個文件系統,主要列出設備名稱、UUID 名稱以及文件系統的類型。
2.1.3、parted 列出磁盤的分區表類型與分區信息
parted device_name print范例一:列出 /dev/sda 磁盤的相關數據
root@master:/dev# parted /dev/sda print Model: VMware Virtual disk (scsi) # 磁盤的模塊名稱(廠商) Disk /dev/sda: 537GB # 磁盤的總容量 Sector size (logical/physical): 512B/512B # 磁盤的每個邏輯/物理扇區容量 Partition Table: msdos # 分區表的格式 (MBR/GPT) Disk Flags: # 下面才是分區數據 Number Start End Size Type File system Flags1 1049kB 512MB 511MB primary ext2 boot2 513MB 537GB 536GB extended5 513MB 537GB 536GB logical lvm2.2、磁盤分區: gdisk/fdisk
MBR 分區表請使用 fdisk 分區, GPT 分區表請使用 gdisk 分區,否則會分區失敗。
所以先通過 lsblk 或 blkid 先找到磁盤,再用 parted /dev/xxx print 來找出內部的分區表類型,之后才用 gdisk 或 fdisk 來操作系統。
2.2.1、gdisk
先看看 gdisk。
gdisk 設備名稱范例:觀察該磁盤的分區與相關數據(鳥哥書上的代碼,我的設備是 MBR 分區表)
gdisk /dev/vda # 仔細看,不要加上數字喔!GPT fdisk (gdisk) version 0.8.6 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. # 找到了 GPT 的分區表! Command (? for help)# 這里可以讓你輸入指令動作,可以按問號 (?) 來查看可用指令 Command (? for help): ? b back up GPT data to a file c change a partition's name d delete a partition # 刪除一個分區 i show detailed information on a partition l list known partition types n add a new partition # 增加一個分區 o create a new empty GUID partition table (GPT) p print the partition table # 印出分區表 (常用) q quit without saving changes # 不儲存分區就直接離開 gdisk r recovery and transformation options (experts only) s sort partitions t change a partition's type code v verify disk w write table to disk and exit # 儲存分區操作后離開 gdisk x extra functionality (experts only) ? print this menu Command (? for help):先來看看分區表信息。
Command (? for help): p # 這里可以輸出目前磁盤的狀態 Disk /dev/vda: 83886080 sectors, 40.0 GiB # 磁盤文件名/扇區數與總容量 Logical sector size: 512 Bytes # 單一扇區大小為 512 Bytes Disk identifier (GUID): A4C3C813-62AF-4BFE-BAC9-112EBD87A483 # 磁盤的 GPT 識別碼 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 83886046 Partitions will be aligned on 2048-sector boundaries Total free space is 18862013 sectors (9.0 GiB) Number Start (sector) End (sector) Size Code Name # 下面為完整的分區信息了! 1 2048 6143 2.0 MiB EF02 # 第一個分區數據 2 6144 2103295 1024.0 MiB 0700 3 2103296 65026047 30.0 GiB 8E00 # 分區編號 開始扇區號碼 結束扇區號碼 容量大小 Command (? for help): q # 想要不儲存離開嗎?按下 q 就對了!不要隨便按 w 啊!使用“ p ”可以列出目前這顆磁盤的分區表信息,這個信息的上半部在顯示整體磁盤的狀態。下半部的分區表信息主要在列出每個分區的個別信息項目。每個項目的意義為:
- Number:分區編號,1 號指的是 /dev/vda1 這樣計算;
- Start (sector):每一個分區的開始扇區號碼位置;
- End (sector):每一個分區的結束扇區號碼位置,與 start 之間可以算出分區的總容量;
- Size:就是分區的容量了;
- Code:在分區內的可能的文件系統類型。Linux 為 8300,swap 為 8200。不過這個項目只是一個提示而已,不見得真的代表此分區內的文件系統;
- Name:文件系統的名稱等等。
具體新增分區的操作見《鳥哥的 Linux 私房菜》378 頁。
2.2.2、partprobe 更新 Linux 核心的分區表信息
partprobe [-s] # 可以不要加 -s !那么屏幕不會出現信息!partprobe -s # 不過還是建議加上 -s 比較清晰!2.2.3、fdisk
雖然 MBR 分區表在未來應該會慢慢的被淘汰,畢竟現在磁盤容量隨便都大于 2T 以上了,不過依舊有些舊的系統,以及虛擬機的使用上面,還是有小磁盤存在的空間!這時處理 MBR 分區表, 就得要使用 fdisk。
fdisk 跟 gdisk 使用的方式幾乎一樣,只是一個使用 ? 作為指令提示數據,一個使用 m 作為提示這樣而已。此外,fdisk 有時會使用柱面 (cylinder) 作為分區的最小單位,與 gdisk 默認使用 sector 不太一樣。
2.3、磁盤格式化(創建文件系統)
格式化的指令非常的簡單,那就是“make filesystem, mkfs” 這個指令!這個指令其實是個綜合的指令,他會去調用正確的文件系統格式化工具軟件!
我們常聽到的“格式化”其實應該稱為“創建文件系統 (make filesystem)”才對,使用的指令是 mkfs 。
2.3.1、EXT4 文件系統 mkfs.ext4
想要格式化為 ext4 的傳統 Linux 文件系統的話,可以使用 mkfs.ext4 這個指令。
mkfs.ext4 [-b size] [-L label] 設備名稱選項與參數:
- -b :設置 block 的大小,有 1K, 2K, 4K 的容量
- -L :后面接這個設備的標頭名稱。
范例:將 /dev/vda5 格式化為 ext4 文件系統
mkfs.ext4 /dev/vda52.3.2、XFS 文件系統 mkfs.xfs
mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \ [-r parms] 設備名稱選項與參數:
- 關於單位:下面只要談到“數值”時,沒有加單位則為 Bytes 值,可以用 k,m,g,t,p (小寫)等來解釋,比較特殊的是 s 這個單位,它指的是 sector 的“個數”;
- -b :后面接的是 block 容量,可由 512 到 64k,不過最大容量限制為 Linux 的 4k ;
- -d :后面接的是重要的 data section 的相關參數值,主要的值有:
- agcount=數值 :設置需要幾個儲存群組的意思(AG),通常與 CPU 有關;
- agsize=數值 :每個 AG 設置為多少容量的意思,通常 agcount/agsize 只選一個設置即可;
- file :指的是“格式化的設備是個文件而不是個設備”的意思!(例如虛擬磁盤);
- size=數值 :data section 的容量,亦即你可以不將全部的設備容量用完的意思;
- su=數值 :當有 RAID 時,那個 stripe 數值的意思,與下面的 sw 搭配使用;
- sw=數值 :當有 RAID 時,用于儲存數據的磁盤數量(須扣除備份碟與備用碟);
- sunit=數值 :與 su 相當,不過單位使用的是“幾個 sector(512Bytes大小)”的意思;
- swidth=數值 :就是 su*sw 的數值,但是以“幾個 sector(512Bytes大小)”來設置
- -f :如果設備內已經有文件系統,則需要使用這個 -f 來強制格式化才行;
- -i :與 inode 有較相關的設置,主要的設置值有:
- size=數值 :最小是 256Bytes 最大是 2k,一般保留 256 就足夠使用了;
- internal=[0|1]:log 設備是否為內置?默認為 1 內置,如果要用外部設備,使用下面設置;
- logdev=device :log 設備為后面接的那個設備上頭的意思,需設置 internal=0 才可;
- size=數值 :指定這塊登錄區的容量,通常最小得要有 512 個 block,大約 2M 以上才行!
- -L :后面接這個文件系統的標頭名稱 Label name 的意思;
- -r :指定 realtime section 的相關設置值,常見的有:
- extsize=數值 :就是那個重要的 extent 數值,一般不須設置,但有 RAID 時,最好設置與 swidth 的數值相同較佳!最小為 4K 最大為 1G 。
2.3.3、其他文件系統 mkfs
mkfs 其實是個綜合指令而已,當使用 mkfs -t xfs 時,它就會跑去找 mkfs.xfs 相關的參數,如果想要知道系統還支持哪種文件系統的格式化功能,直接按 [tabl] 就很清楚。
mkfs[tab][tab] mkfs mkfs.bfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev mkfs.fat mkfs.minix mkfs.msdos mkfs.ntfs mkfs.vfat mkfs.xfs2.4、文件系統檢驗
文件系統運行時會有磁盤與內存數據非同步的狀況發生,因此莫名其妙的死機非常可能導致文件系統的錯亂。
2.4.1、xfs_repair 處理 XFS 文件系統
xfs_repair [-fnd] 設備名稱選項與參數:
- -f :后面的設備其實是個文件而不是實體設備
- -n :單純檢查并不修改文件系統的任何數據 (檢查而已)
- -d :通常用在單人維護模式下面,針對根目錄 (/) 進行檢查與修復的動作!很危險!不要隨便使用
范例一:檢查一下剛剛創建的 /dev/vda4 文件系統
[root@study ~]# xfs_repair /dev/vda4 Phase 1 - find and verify superblock... Phase 2 - using internal log Phase 3 - for each AG... Phase 4 - check for duplicate blocks... Phase 5 - rebuild AG headers and trees... Phase 6 - check inode connectivity... Phase 7 - verify and correct link counts... done # 共有 7 個重要的檢查流程!詳細的流程介紹可以 man xfs_repair 即可!范例二:檢查一下系統原本就有的 /dev/centos/home 文件系統
[root@study ~]# xfs_repair /dev/centos/home xfs_repair: /dev/centos/home contains a mounted filesystem xfs_repair: /dev/centos/home contains a mounted and writable filesystem fatal error -- couldn't initialize XFS libraryxfs_repair 可以檢查/修復文件系統,不過,因為修復文件系統是個很龐大的任務!因此,修復時該文件系統不能被掛載! 所以,檢查與修復 /dev/vda4 沒啥問題,但是修復/dev/centos/home 這個已經掛載的文件系統時,就出現上述的問題了! 沒關系,若可以卸載,卸載后再處理即可。
Linux 系統有個設備無法被卸載,那就是根目錄!如果你的根目錄有問題怎辦?這時得要進入單人維護或救援模式,然后通過 -d 這個選項來處理! 加入 -d 這個選項后,系統會強制檢驗該設備,檢驗完畢后就會自動重新開機!
2.4.2、fsck.ext4 處理 EXT4 文件系統
fsck 是個綜合指令,如果是針對 ext4 的話,建議直接使用 fsck.ext4 來檢測比較妥當。
fsck.ext4 [-pf] [-b superblock] 設備名稱選項與參數:
- -p :當文件系統在修復時,若有需要回復 y 的動作時,自動回復 y 來繼續進行修復動作;
- -f :強制檢查!一般來說,如果 fsck 沒有發現任何 unclean 的旗標,不會主動進入細部檢查的,如果您想要強制 fsck 進入細部檢查,就得加上 -f 旗標;
- -D :針對文件系統下的目錄進行最優化配置;
- -b :后面接 superblock 的位置!一般來說這個選項用不到。但是如果 superblock 因故損毀時,通過這個參數即可利用文件系統內備份的 superblock 來嘗試救援。一般來說,superblock 備份在:1K block 放在 8193, 2K block 放在 16384, 4K block 放在 32768。
2.5、文件系統掛載與卸載
進行掛載前,最好先確定幾件事:
- 單一文件系統不應該被重復掛載在不同的掛載點(目錄)中;
- 單一目錄不應該重復掛載多個文件系統;
- 要作為掛載點的目錄,理論上應該都是空目錄才是。
選項與參數:
- -a :依照配置文件 /etc/fstab 的數據將所有未掛載的磁盤都掛載上來;
- -l :單純的輸入 mount 會顯示目前掛載的信息。加上 -l 可增列 Label 名稱;
- -t :可以加上文件系統種類來指定欲掛載的類型。常見的 Linux 支持類型有:xfs, ext3, ext4,reiserfs, vfat, iso9660(光盤格式), nfs, cifs, smbfs (后三種為網絡文件系統類型);
- -n :在默認的情況下,系統會將實際掛載的情況實時寫入 /etc/mtab 中,以利其他程序的運行,但在某些情況下(例如單人維護模式)為了避免問題會刻意不寫入。此時就得要使用 -n 選項;
- -o :后面可以接一些掛載時額外加上的參數!比方說帳號、密碼、讀寫權限等:
- async, sync: 此文件系統是否使用同步寫入 (sync) 或非同步 (async) 的內存機制默認為 async;
- atime,noatime: 是否修訂文件的讀取時間(atime)。為了性能,某些時刻可使用 noatime;
- ro, rw: 掛載文件系統成為只讀(ro) 或可讀寫(rw)
- auto, noauto: 允許此 filesystem 被以 mount -a 自動掛載(auto);
- dev, nodev: 是否允許此 filesystem 上,可創建設備文件? dev 為可允許;
- suid, nosuid: 是否允許此 filesystem 含有 suid/sgid 的文件格式?
- exec, noexec: 是否允許此 filesystem 上擁有可執行 binary 文件?
- user, nouser: 是否允許此 filesystem 讓任何使用者執行 mount ?一般來說,mount 僅有 root 可以進行,但下達 user 參數,則可讓一般 user 也能夠對此 partition 進行 mount ;
- defaults: 默認值為:rw, suid, dev, exec, auto, nouser, and async;
- remount: 重新掛載,這在系統出錯,或重新更新參數時,很有用!
2.5.1、掛載 xfs/ext4/vfat 等文件系統
范例一:找出 /dev/vda4 的 UUID 后,用該 UUID 來掛載文件系統到 /data/xfs 內
[root@study ~]# blkid /dev/vda4 /dev/vda4: UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" TYPE="xfs" [root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs mount: mount point /data/xfs does not exist # 非正規目錄!所以手動創建它! [root@study ~]# mkdir -p /data/xfs [root@study ~]# mount UUID="e0a6af55-26e7-4cb7-a515-826a8bd29e90" /data/xfs [root@study ~]# df /data/xfs Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda4 1038336 32864 1005472 4% /data/xfs范例二:使用相同的方式,將 /dev/vda5 掛載于 /data/ext4
[root@study ~]# blkid /dev/vda5 /dev/vda5: UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" TYPE="ext4" [root@study ~]# mkdir /data/ext4 [root@study ~]# mount UUID="899b755b-1da4-4d1d-9b1c-f762adb798e1" /data/ext4 [root@study ~]# df /data/ext4 Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda5 999320 2564 927944 1% /data/ext42.5.2、重新掛載根目錄與掛載不特定目錄
整個目錄樹最重要的地方就是根目錄了,所以根目錄根本就不能夠被卸載的。如果掛載參數要改變, 或者是根目錄出現“只讀”狀態時,如何重新掛載呢?最可能的處理方式就是重新開機 (reboot)!
不過也可以這樣做:
范例:將 / 重新掛載,并加入參數為 rw 與 auto
[root@study ~]# mount -o remount,rw,auto /另外,也可以利用 mount 來將某個目錄掛載到另外一個目錄去!這并不是掛載文件系統,而是額外掛載某個目錄的方法! 雖然下面的方法也可以使用 symbolic link 來鏈接,不過在某些不支持符號鏈接的程序運行中,還是得要通過這樣的方法才行。
范例:將 /var 這個目錄暫時掛載到 /data/var 下面
[root@study ~]# mkdir /data/var [root@study ~]# mount --bind /var /data/var [root@study ~]# ls -lid /var /data/var 16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /data/var 16777346 drwxr-xr-x. 22 root root 4096 Jun 15 23:43 /var# 內容完全一模一樣啊!因為掛載目錄的緣故!2.6、umount (將設備文件卸載)
umount [-fn] 設備文件名或掛載點選項與參數:
- -f :強制卸載!可用在類似網絡文件系統 (NFS) 無法讀取到的情況下;
- -l :立刻卸載文件系統,比 -f 還強;
- -n :不更新 /etc/mtab 情況下卸載。
三、設置開機掛載
但是掛載是臨時的,系統重啟后需要重新掛載,如果希望下次啟動時,自動掛載,需要按照下述操作。
3.1、開機掛載 /etc/fstab 及 /etc/mtab
先查閱一下 /etc/fstab 這個文件的內容。
[root@study ~]# cat /etc/fstab Device Mount point filesystem parameters dump fsck /dev/mapper/centos-root / xfs defaults 0 0 UUID=94ac5f77-cb8a-495e-a65b-2ef7442b837c /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0/etc/fstab (filesystem table) 就是將利用 mount 指令進行掛載時, 將所有的選項與參數寫入到這個文件中。除此之外, /etc/fstab 還加入了 dump 這個備份用指令的支持! 與開機時是否進行文件系統檢驗 fsck 等指令有關。
這個文件的內容共有六個字段,各個字段的總結數據與詳細數據如下:
[設備/UUID等] [掛載點] [文件系統] [文件系統參數] [dump] [fsck]第一欄:磁盤設備文件名/UUID/LABEL name:
這個字段可以填寫的數據主要有三個項目:
- 文件系統或磁盤的設備文件名,如 /dev/vda2 等
- 文件系統的 UUID 名稱,如 UUID=xxx
- 文件系統的 LABEL 名稱,例如 LABEL=xxx
第二欄:掛載點 (mount point):
就是掛載的目錄。
第三欄:磁盤分區的文件系統:
在手動掛載時可以讓系統自動測試掛載,但在這個文件當中我們必須要手動寫入文件系統才行! 包括 xfs, ext4, vfat, reiserfs, nfs 等等。
第四欄:文件系統參數:
| async/sync | 設置磁盤是否以非同步方式運行!默認為 async(性能較佳) |
| auto/noauto | 當下達 mount -a 時,此文件系統是否會被主動測試掛載。默認為 auto。 |
| rw/ro | 讓該分區以可讀寫或者是只讀的型態掛載上來,如果你想要分享的數據 是不給使用者隨意變更的, 這里也能夠設置為只讀。則不論在此文件系 統的文件是否設置 w 權限,都無法寫入! |
| exec/noexec | 限制在此文件系統內是否可以進行“執行”的工作?如果是純粹用來儲存數 據的目錄, 那么可以設置為 noexec 會比較安全。不過,這個參數也不 能隨便使用,因為你不知道該目錄下是否默認會有可執行文件。舉例來 說,如果你將 noexec 設置在 /var ,當某些軟件將一些可執行文件放置 于 /var 下時,那就會產生很大的問題! 因此,建議這個 noexec 最多 僅設置于你自訂或分享的一般數據目錄。 |
| user/nouser | 是否允許使用者使用 mount指令來掛載呢?一般而言,我們當然不希望 一般身份的 user 能使用 mount 啰,因為太不安全了,因此這里應該要設 置為 nouser! |
| suid/nosuid | 該文件系統是否允許 SUID 的存在?如果不是可執行文件放置目錄,也 可以設置為 nosuid 來取消這個功能! |
| defaults | 同時具有 rw, suid, dev, exec, auto, nouser, async 等參數。 基本上, 默認情況使用 defaults 設置即可! |
第五欄:能否被 dump 備份指令作用:
dump 是一個用來做為備份的指令,不過現在有太多的備份方案了,所以這個項目可以不要理會!直接輸入 0 就好了!
第六欄:是否以 fsck 檢驗扇區:
早期開機的流程中,會有一段時間去檢驗本機的文件系統,看看文件系統是否完整
(clean)。 不過這個方式使用的主要是通過 fsck 去做的,我們現在用的 xfs 文件系統就沒有辦法適用,因為 xfs 會自己進行檢驗,不需要額外進行這個動作!所以直接填 0 就好了。
例題:假設我們要將 /dev/vda4 每次開機都自動掛載到 /data/xfs ,該如何進行?
# 首先,請用 nano 將下面這一行寫入 /etc/fstab 最后面中;[root@study ~]# nano /etc/fstab UUID="e0fa7252-b374-4a06-987a-3cb14f415488" /data/xfs xfs defaults 0 0# 再來看看 /dev/vda4 是否已經掛載,如果掛載了,請務必卸載再說! [root@study ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda4 1038336 32864 1005472 4% /data/xfs # 竟然不知道何時被掛載了?趕緊給他卸載先! # **因為,如果要被掛載的文件系統已經被掛載了(無論掛載在哪個目錄),那測試就不會進行喔!** [root@study ~]# umount /dev/vda4# 最后測試一下剛剛我們寫入 /etc/fstab 的語法有沒有錯誤!這點很重要!因為這個文件如果寫錯了, 則你的 Linux 很可能將無法順利開機完成!所以請務必要測試測試! [root@study ~]# mount -a [root@study ~]# df /data/xfs最終有看到 /dev/vda4 被掛載起來的信息才是成功的掛載了!而且以后每次開機都會順利的將此文件系統掛載起來的!
3.2、特殊設備 loop 掛載
如果有光盤鏡像文件,或者是使用文件作為磁盤的方式時,那就得要使用特別的方法來將他掛載起來,不需要燒錄!
3.2.1、掛載光盤/DVD鏡像文件
如果下載了 Linux 或者是其他所需光盤/DVD的鏡像文件后, 難道一定需要燒錄成為光盤才能夠使用該文件里面的數據嗎?當然不是!我們可以通過 loop 設備來掛
載的!
四、內存交換空間(swap)之創建
以前的年代因為內存不足,因此那個可以暫時將內存的程序拿到硬盤中暫放的內存交換空間(swap) 就顯的非常的重要! 否則,如果突然間某支程序用掉你大部分的內存,那你的系統恐怕有損毀的情況發生。
一般來說,如果硬件的配備資源足夠的話,那么 swap 應該不會被系統所使用到,swap 會被利用到的時刻通常就是實體內存不足的情況了。 CPU 所讀取的數據都來自于內存, 那當內存不足的時候,為了讓后續的程序可以順利的運行,因此在內存中暫不使用的程序與數據就會被挪到 swap 中了。 此時內存就會空出來給需要執行的程序載入。由于 swap 是用磁盤來暫時放置內存中的信息,所以用到 swap 時,主機磁盤燈就會開始閃個不停!
4.1、使用實體分區創建swap
創建 swap 分區的方式也是非常的簡單的!通過下面幾個步驟就搞定:
具體操作:
4.2、使用文件創建swap
如果是在實體分區無法支持的環境下,此時前一小節提到的 loop 設備創建方法就派的上用場,與實體分區不一樣的,這個方法只是利用 dd 去創建一個大文件而已。
swap 在目前的桌面電腦來講,存在的意義已經不大了!這是因為目前的 x86 主機所含的內存實在都太大了 (一般入門級至少也都有 4GB 了),所以, Linux 系統大概都用不到 swap 這個玩意兒的。不過, 如果是針對服務器或者是工作站這些常年上線的系統來說的話,那么,無論如何,swap 還是需要創建的。
五、補充
5.1、利用 GNU 的 parted 進行分區行為(Optional)
gdisk/fdisk 很快速的將分區切割妥當,不過 gdisk 主要針對 GPT 而 fdisk 主要支持 MBR ,對 GPT 的支持還不夠! 所以使用不同的分區時,得要先查詢到正確的分區表才能用適合的指令,好麻煩!有沒有同時支持的指令呢?有的!那就是 parted。
parted 可以直接在一行命令行就完成分區,是一個非常好用的指令!它常用的語法如下:
parted [設備] [指令 [參數]]選項與參數:
指令功能:
- 新增分區:mkpart [primary|logical|extended] [ext4|vfat|xfs] 開始 結束
- 顯示分區:print
- 刪除分區:rm [partition]
范例一:以 parted 列出目前本機的分區表數據
[root@study ~]# parted /dev/vda print Model: Virtio Block Device (virtblk) <==磁盤接口與型號 Disk /dev/vda: 42.9GB <==磁盤文件名與容量 Sector size (logical/physical): 512B/512B <==每個扇區的大小 Partition Table: gpt <==是 GPT 還是 MBR 分區 Disk Flags: pmbr_boot Number Start End Size File system Name Flags 1 1049kB 3146kB 2097kB bios_grub 2 3146kB 1077MB 1074MB xfs 3 1077MB 33.3GB 32.2GB lvm 4 33.3GB 34.4GB 1074MB xfs Linux filesystem 5 34.4GB 35.4GB 1074MB ext4 Microsoft basic data 6 35.4GB 36.0GB 537MB linux-swap(v1) Linux swap [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]范例二:將 /dev/sda 這個原本的 MBR 分區表變成 GPT 分區表!(危險!危險!勿亂搞!無法復原!)
[root@study ~]# parted /dev/sda print Model: ATA QEMU HARDDISK (scsi) Disk /dev/sda: 2148MB Sector size (logical/physical): 512B/512B Partition Table: msdos # 確實顯示的是 MBR 的 msdos 格式喔! [root@study ~]# parted /dev/sda mklabel gpt Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue? Yes/No? y [root@study ~]# parted /dev/sda print# 你應該就會看到變成 gpt 的模樣!只是...后續的分區就全部都死掉了!范例三:創建一個約為 512MB 容量的分區
[root@study ~]# parted /dev/vda print .....(前面省略)..... Number Start End Size File system Name Flags .....(中間省略)..... 6 35.4GB 36.0GB 537MB linux-swap(v1) Linux swap # 要先找出來下一個分區的起始點! [root@study ~]# parted /dev/vda mkpart primary fat32 36.0GB 36.5GB# 由于新的分區的起始點在前一個分區的后面,所以當然要先找出前面那個分區的 End 位置!# 然后再請參考 mkpart 的指令功能,就能夠處理好相關的動作![root@study ~]# parted /dev/vda print .....(前面省略)..... Number Start End Size File system Name Flags 7 36.0GB 36.5GB 522MB primary [root@study ~]# partprobe [root@study ~]# lsblk /dev/vda7 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda7 252:7 0 498M 0 part # 要確定它是真的存在才行! [root@study ~]# mkfs -t vfat /dev/vda7 [root@study ~]# blkid /dev/vda7 /dev/vda7: SEC_TYPE="msdos" UUID="6032-BF38" TYPE="vfat" [root@study ~]# nano /etc/fstab UUID="6032-BF38" /data/win vfat defaults 0 0 [root@study ~]# mkdir /data/win [root@study ~]# mount -a [root@study ~]# df /data/win Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda7 509672 0 509672 0% /data/win事實上,應該使用 gdisk 來處理 GPT 分區就好了!不過,某些特殊時刻,例如要自己寫一只腳本,讓分區全部一口氣創建, 不需要 gdisk 一條一條指令去進行時,那么 parted就非常有效果了!因為他可以直接進行 partition 而不需要跟用戶互動!這就是它的最大好處!
總結
以上是生活随笔為你收集整理的【Linux】Linux 磁盘与文件系统管理命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里旗下的咸鱼是什么盈利模式?很多人真的
- 下一篇: ubuntu16.04 配置远程桌面