Linux的基本学习(四)——磁盘与文件系统管理
前言:
承接Linux的基本學習(三)我們接著往下走
?
?
認識Linux文件系統:
整塊磁盤的組成主要有:
而碟片上的物理組成又是:
- 扇區(Sector)為最小的物理存儲單位,且依據磁盤設計的不同,目前主要有512B與4KB兩種格式
- 將扇區組成一個圓,那就是柱面(Cylinder)
- 早期的分區主要以柱面為最小分區單位,現在的分區通常使用扇區為最小分區單位(每個扇區都有其號碼)
- 磁盤分區表主要有兩種格式,MBR(限制較多)、GPT
- MBR分區表中,第一個扇區最重要,里面有:主引導記錄(Master boot record,MBR)——446B、分區表——64B。
- GPT分區表除了分區數量擴充較多之外,支持的磁盤容量也可以超過2TB
文件系統特性:
磁盤分區完畢后要進行格式化,這是因為每種操作系統所設置的文件屬性/權限不同,為了存放這些文件所需的數據,因此就需要將分區進行格式化,以成為操作系統能夠利用的文件系統格式
在Linux的學習中,我們通常稱呼一個可被掛載的數據為一個文件系統而不是一個分區
我們知道,每個文件除了自身的數據還有非常多的屬性,,例如文件的權限(rwx)和文件屬性等,文件系統通常會將這兩部分的數據分別存放在不同的區塊,權限與屬性放置到inode中,至于實際數據則放到數據區塊中,另外,還有一個超級區塊。
- 超級區塊:記錄此文件系統的整體信息,包括inode與數據區塊的總量、使用量、剩余量,以及文件系統的格式與相關信息等
- inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的區塊號碼
- 數據區塊:實際記錄文件的內容。若文件太大時,會占用多個區塊
這種數據存儲的方式我們稱為索引式文件系統
與之對比的文件系統比如U盤的FAT格式,讀取了一個區塊,才能知道下一個區塊的位置,如此往復(所以常常需要碎片整理:同一個文件所屬的區塊集合在一起,使讀取容易)
Linux的ext2文件系統(inode):
標準的ext2就是使用這種inode為基礎的Linux文件系統
文件系統一開始就將inode與數據區塊規劃好了,除非重新格式化(或利用resize2fs等命令修改大小),否則inode與數據區塊固定后就不再變動。
但是,當我們文件系統高達數百GB時,所有的inode與數據區塊通通放在一起就不太合適了,因此,ext2文件系統格式化的時候基本上時區分為多個區塊群組(block group),每個區塊群組都有獨立的inode、數據區塊、超級區塊系統。文件系統最前面有一個啟動扇區(boot sector),這個啟動扇區可以安裝啟動引導程序(這樣才能夠制作出多重引導環境)
每一個區塊群組的內容如下:
數據區塊(data block):
ext2文件系統中所支持的區塊大小由1k、2k、4k(在格式化時各個區塊的大小就固定了)
| 最大單一文件限制 | 16GB | 256GB | 2TB |
| 最大文件系統總容量 | 2TB | 8TB | 16TB |
?
雖然ext2已經能夠支持大于2GB以上的單一文件容量,不過某些應用程序依舊使用舊的限制
另外的基本限制如下:
- 原則上,區塊的大小與數量在格式化完就不能再修改(除非重新格式化)
- 每個區塊內最多只能夠放置一個文件的數據
- 如果文件大于區塊的大小,則一個文件會占用多個區塊數量
- 若文件小于區塊,則該區塊內剩余空間就不能再使用了
inode表(inode table):
inode會記錄如下數據:
- 該文件的讀寫屬性(read、write、excute)
- 該文件的擁有者與用戶組(owner、group)
- 該文件的大小
- 改文件建立時間或狀態改變的時間(ctime)
- 最近一次讀取的時間(atime)
- 最近修改的時間(mtime)
- 定義文件特性的標識(flag),如SetUID
- 該文件真正內容的指向(pointer)
inode的數量與大小也是在格式化的時候就固定了,inode還有什么特色?
- 每個inode大小均固定為128B(新的ext4與xfs可設置到256B)
- 每個文件都僅會占用一個inode而已
- 文件系統能夠建立的文件數量與inode有關
- 系統讀取文件時需要先找到inode,并分析inode所記錄的權限與用戶是否符合,然后(符合)再讀取區塊內容
在這個CSDN找到了鳥哥的這樣一張圖
上圖最左邊為inode本身(128bytes),里面有12個直接指向block號碼的對照,這12組記錄就能夠直接讀取block號碼啦!至于所謂的間接就是再拿一個block來當作記錄block號碼的記錄區,如過檔案太大的時候,就會使用間接的block來記錄編號。如上圖當中間接只是拿一個block來記錄額外的號碼而已。同理,如果檔案持續增大,那么就會利用所謂的雙間接,第一個block僅指出下一個記錄編號的block在那里,實際記錄的在第二個block當中。
這樣子inode能夠指定多少個block呢?我們以較小的1K block來說明好了,可以指定的情況下:
12個直接指向:12*1K=12K
間接 :256*1K = 256K;
雙間接 : 256*256*1K;
三間接:256*256*256*1K;
總額 : 12+256+256*256+256*256*256 = 16G;
故區塊格式化為1k大小時,可以容納的最大文件為16GB
超級區塊(Superblock):
超級區塊是記錄整個文件系統相關的地方,沒有超級區塊,就沒有整個文件系統,它主要記錄的信息有:
- 數據區塊與inode的總量
- 未使用和已經使用的inode與數據區塊、數量
- 數據區塊與inode的大小(block為1、2、4k,inode為128B或256B)
- 文件系統的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤(fsck)的時間等文件系統的相關信息
- 一個有效位數值,若此文件系統已被記載,則有效位為0,若未被掛載,則有效位為1
如果超級區塊損壞,你的文件系統可能就需要花費很多時間去恢復,一般來說,超級區塊的大小為1024B。此外,每個區塊群組都可能還要超級區塊。但是我們說一個文件系統應該僅有一個超級區塊而已,那這是怎么回事?事實上除了第一個區塊群組內會含有超級區塊外,后續的區塊群組不一定含有超級區塊,而若含有超級區塊則該超級區塊主要是作為第一個區塊群組內超級區塊的備份,這樣可以進行超級區塊的恢復
文件系統描述說明(Filesystem Description):
這個區塊可以描述每個區塊群組的開始與結束的區塊,以及說明每個區段(超級區塊、對照表、inode對照表、數據區塊)分別介于哪一個區塊之間,這部分也能夠用dumpe2fs來觀察
區塊對照表(block bitmap):
新增文件時總會用到區塊,那你要使用哪個區塊來做記錄?當然是選擇空區塊來記錄新文件的數據,那你怎么知道哪個區塊是空的?這就要通過區塊對照表的輔助了。從區塊對照表當中可以知道哪些區塊是空的,因此我們的系統就能夠很快速地找到可使用的空間來處理文件。
inode對照表(inode bitmap):
這個其實與區塊對照表的功能類似,只是區塊對照表記錄的是使用與未使用的區塊號碼,inode對照表則是記錄使用與未使用的inode號碼。
dumpe2fs(查詢ext系列超級區塊):
使用dumpe2fs可以查詢ext系列文件系統的超級區塊信息(僅對ext文件系統有效)
[root@www ~]# dumpe2fs [-bh] 裝置文件名 選項與參數: -b :列出保留為壞軌的部分(一般用不到吧) -h :僅列出 superblock 的數據,不會列出其他的區段內容!利用 blkid 這個命令可以顯示出目前系統被格式化的設備,后面的TYPE就可以看出文件系統類型。[root@www ~]# dumpe2fs /dev/hdc2 dumpe2fs 1.39 (29-May-2006) Filesystem volume name: /1 <==這個是文件系統的名稱(Label) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file Default mount options: user_xattr acl <==默認掛載的參數 Filesystem state: clean <==這個文件系統是沒問題的(clean) Errors behavior: Continue Filesystem OS type: Linux Inode count: 2560864 <==inode的總數 Block count: 2560359 <==block的總數 Free blocks: 1524760 <==還有多少個 block 可用 Free inodes: 2411225 <==還有多少個 inode 可用 First block: 0 Block size: 4096 <==每個 block 的大小啦! Filesystem created: Fri Sep 5 01:49:20 2008 Last mount time: Mon Sep 22 12:09:30 2008 Last write time: Mon Sep 22 12:09:30 2008 Last checked: Fri Sep 5 01:49:20 2008 First inode: 11 Inode size: 128 <==每個 inode 的大小 Journal inode: 8 <==底下這三個與下一小節有關 Journal backup: inode blocks Journal size: 128MGroup 0: (Blocks 0-32767) <==第一個 data group 內容, 包含 block 的啟始/結束號碼Primary superblock at 0, Group descriptors at 1-1 <==超級區塊在 0 號 blockReserved GDT blocks at 2-626Block bitmap at 627 (+627), Inode bitmap at 628 (+628)Inode table at 629-1641 (+629) <==inode table 所在的 block0 free blocks, 32405 free inodes, 2 directories <==所有 block 都用完了!Free blocks:Free inodes: 12-32416 <==剩余未使用的 inode 號碼 Group 1: (Blocks 32768-65535) ....(底下省略).... # 由于數據量非常的龐大,因此鳥哥將一些信息省略輸出了!上表與你的屏幕會有點差異。 # 前半部在秀出 supberblock 的內容,包括標頭名稱(Label)以及inode/block的相關信息 # 后面則是每個 block group 的個別信息了!您可以看到各區段數據所在的號碼! # 也就是說,基本上所有的數據還是與 block 的號碼有關就是了!很重要!與目錄樹的關系:
目錄:
當我們在Linux下的文件系統建立一個目錄時,文件系統會分配一個inode與至少一塊區塊給該目錄。inode記錄該目錄的相關屬性與權限,并可記錄分配到的那塊區塊號碼,而區塊則是在這個目錄下的文件名與該文件名占用的inode號碼數據。
如果想要實際觀察root根目錄內的文件所占用的inode號碼時,可以使用ls -i這個選項來處理:
最左邊就是inode號碼
文件:
當我們在Linux下的ext2建立一個一般文件時,ext2會分配一個inode與相對于改文件大小的區塊數量給該文件。例如:假設我的一個區塊為4KB,而我要建立一個100KB的文件,那么Linux將分配一個inode與25個區塊來存儲該文件。但同時請注意,由于inode僅有12個直接指向,因此還要需要一個區塊來記錄號碼。
目錄樹讀取:
由于目錄樹是由根目錄開始讀起,因此系統通過掛載的信息可以找到掛載點的 inode 號碼,此時就能夠得到根目錄的 inode 內容,并依據該 inode 讀取根目錄的 block 內的文件名數據,
再一層一層的往下讀到正確的文件名。
如果我想要讀取 /etc/passwd 這個文件時,系統是如何讀取的?
[root@study ~]# ll -di / /etc /etc/passwd 128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 / 33595521 drwxr-xr-x. 131 root root 8192 Jun 17 00:20 /etc 36628004 -rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd該文件的讀取流程為(假設讀取者身份為 dmtsai 這個一般身份使用者):
文件系統大小與磁盤讀取性能:
關于文件系統的使用效率上,當你的一個文件系統規劃的很大時,例如 100GB 這么大時, 由于磁盤上面的數據總是來來去去的,所以,整個文件系統上面的文件通常無法連續寫在一起(區塊號碼不會連續的意思),
而是填入式的將數據填入沒有被使用的區塊當中。如果文件寫入的區塊真的分的很散, 此時就會有所謂的文件數據離散的問題發生了。
雖然我們的 ext2 在 inode 處已經將該文件所記錄的區塊號碼都記上了, 所以數據可以一次性讀取,但是如果文件真的太過離散,確實還是會發生讀取效率低落的問題。 因為磁頭還是得要在整個文件系統中來來去去的頻繁讀取。果真如此,那么可以將整個文件系統內的數據全部復制出來,將該文件系統重新格式化, 再將數據給他復制回去即可解決這個問題。
此外,如果文件系統真的太大了,那么當一個文件分別記錄在這個文件系統的最前面與最后面的區塊號碼中, 此時會造成磁盤的機械手臂移動幅度過大,也會造成數據讀取性能的低落。而且磁頭在搜尋整個文件系統時,
也會花費比較多的時間去搜尋!因此,磁盤分區的規劃并不是越大越好,而是真的要針對你的主機用途來進行規劃才行。
?
ext2/3/4文件的存取與日志式文件系統的功能:
假如我們想要新增一個文件,此時文件系統的操作是:
一般來說,我們將 inode對照表與數據區塊稱為數據存放區域,至于其他例如超級區塊、區塊對照表與inode對照表等區段就被稱為 metadata (元數據),因為他們經常變動。
如果你的文件在寫入文件系統時,因為不知名原因導致系統中斷(例如突然的停電啊、 系統核心發生錯誤啊~等等的怪事發生時),所以寫入的數據僅有 inode存儲表及數據區塊而已, 最后一個同步更新中介數據的步驟并沒有做完,此時就會發生元數據的內容與實際數據存放區產生不一致 (Inconsistent) 的情況了。
為了解決這個問題,出現了日志式文件系統。
日志式文件系統:
萬一數據的紀錄過程當中發生了問題,那么我們的系統只要去檢查日志記錄區塊, 就可以知道哪個文件發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊文件系統去檢查。
Linux文件系統的運行:
我們知道,所有的數據都得要載入到內存后 CPU 才能夠對該數據進行處理。如果你常常編輯一個好大的文件,在編輯的過程中又頻繁的要系統來寫入到磁盤中,由于磁盤寫入的速度要比內存慢很多,因此你會常常耗在等待磁盤的寫入/讀取上。
為了解決這個效率的問題,inux 使用的方式是通過一個稱為非同步處理(asynchronously)的方式。所謂的非同步處理是這樣的:
當系統載入一個文件到內存后,如果該文件沒有被更動過,則在內存區段的文件數據會被設置為干凈(clean)的。 但如果內存中的文件數據被更改過了(例如你用 nano 去編輯過這個文件),此時該內存中的數據會被設置為臟的 (Dirty)。此時所有的動作都還在內存中執行,并沒有寫入到磁盤中! 系統會不定時的將內存中設置為“Dirty”的數據寫回磁盤,以保持磁盤與內存數據的一致性。
Linux 系統文件系統與內存有非常大的關系:
- 系統會將常用的文件數據放置到內存的緩沖區,以加速文件系統的讀/寫;
- 承上,因此 Linux 的實體內存最后都會被用光!這是正常的情況!可加速系統性能;
- 你可以手動使用sync來強迫內存中設置為 Dirty 的文件回寫到磁盤中;
- 若正常關機時,關機指令會主動調用sync來將內存的數據回寫入磁盤內;
- 但若不正常關機(如跳電、死機或其他不明原因),由于數據尚未回寫到磁盤內, 此重新開機后可能會花很多時間在進行磁盤檢驗,甚至可能導致文件系統的損毀(非磁盤損毀)。
掛載點的意義:
將文件系統與目錄樹結合的動作我們稱為“掛載”。掛載點一定是目錄,該目錄為進入該文件系統的入口。 因此并不是你有任何文件系統都能使用,必須要“掛載”到目錄樹的某個目錄后,
才能夠使用該文件系統的。
其他Linux支持的文件系統與VFS:
Linux還支持其他的文件格式:
- 傳統文件系統:ext2 / minix / MS-DOS / FAT (用 vfat 模塊) / iso9660 (光盤)等等;
- 日志式文件系統: ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS
- 網絡文件系統: NFS / SMBFS
Linux VFS:
Linux系統都是通過一個叫Virtual Filesystem Switch的內核功能區讀取文件系統,也就是說,整個Linux識別的文件系統其實都是VFS在進行管理,我們用戶并不需要知道每個硬盤設備分區上面的文件系統是什么,VFS會主動幫助我們做好讀取的工作
XFS文件系統簡介:
CentOS 7開始,默認的文件系統已經由原本的ext4變成了xfs文件系統,原因:
ext系列當前較燒腦筋的地方:支持度最廣,但格式化最慢
ext 文件系統對于文件格式化的處理方面,采用的是預先規劃出所有的 inode、區塊、元數據 等數據,未來系統可以直接取用,不需要再進行動態配置的作法。這個作法在早期磁盤容
量還不大的時候還算 OK,但時至今日,磁盤容量越來越大,連傳統的 MBR 都已經被 GPT 所取代,現在都已經說到 PB 或 EB 以上容量了!可以想像,當你的 TB 以上等級的傳統 ext 文件系統在格式化的時候,光是系統要預先分配 inode 與 區塊就消耗你好多好多的時間。
XFS文件系統的配置:
xfs 文件系統在數據的分布上,主要規劃為三個部份,一個數據區 (data section)、一個文件系統活動登錄區 (log section)以及一個實時運行區 (realtime section)。
- 數據區(data section)
數據區就跟我們之前談到的 ext 家族一樣,包括 inode、數據區塊、超級區塊等數據,都放置在這個區塊。這個數據區與 ext 家族的區塊群組類似,
也是分為多個儲存區群組(allocation groups)來分別放置文件系統所需要的數據。 每個儲存區群組都包含了
此外,inode與 block 都是系統需要用到時, 這才動態配置產生,所以格式化動作超級快。
- 文件系統活動登錄區(log section)
這個區域主要用來記錄文件系統的變化,有點像是日志區。文件的變化會在這里記錄下來,直到該變化完整地寫入到數據區后,該條記錄才會被結束。另外,xfs的設計很有趣,你可以指定外部的磁盤來作為xfs文件系統的日志區塊。
- 實時運行區(realtime section)
當文件要被創建時,xfs 會在這個區段找到一個到數個 extent 區塊,將文件放置在這個區塊,等到分配完畢后,再寫入到 data section 的inode 和區塊中。
這個 extent 區塊的大小得要在格式化的時候就先指定,最小值是 4K 最大可到 1G。一般非磁盤陣列的磁盤默認為64K的容量,而具有類似磁盤陣列的stripe情況下,則建議將extent設置為與stripe一樣大,這個extent最好不要亂動,因為可能會影響物理磁盤的性能
XFS文件系統的描述數據觀察:
有一個命令類似ext的系列的dumpe2fs觀察xfs文件系統
xfs_info 掛載點|設備文件名- 第一行里面的isize:指的是inode的容量,每個有512B,agcount是存儲區群組個數(allocation group),每個存儲區群組有agsize個區塊
- 第二行里面的sectsz指的是邏輯扇區(sector)的容量設置為512B這么大的意思
- 第四行里面的bsize指的是區塊的容量,每個區塊為4K的意思,共有blocks個區塊在文件系統內
- 第七行里面的internal指的是這個登錄區的位置在文件系統內,而不是外部設備的意思
?
文件系統的簡單操作:
磁盤與目錄的容量:
磁盤的整體數據是在超級區塊中,但是每個文件的容量則在inode當中記載,下面的命令叫我們方便查看:
df:
列出文件系統的整體磁盤使用量
df [-ahikHTm] [目錄或文件名] -a :列出所有的文件系統,包括系統特有的 /proc 等文件系統; -k :以 KBytes 的容量顯示各文件系統; -m :以 MBytes 的容量顯示各文件系統; -h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示; -H :以 M=1000K 取代 M=1024K 的進位方式; -T :連同該硬盤分區的文件系統名稱 (例如 xfs) 也列出; -i :不用磁盤容量,而以 inode 的數量來顯示- Filesystem:代表該文件系統是在哪個硬盤分區,所以列出設備名稱
- 1K-blocks:說明下面的數字單位是1KB,可以用-h或-m來改變容量
- Used:使用掉的磁盤空間
- Available:剩下的磁盤空間大小
- Use%:磁盤使用率
- Mounted on:就是磁盤的掛載目錄(掛載點)
/proc的東西都是Linux系統所需要加載的系統數據,而且是掛載在內存中的。
/dev/shm/,其實是利用內存虛擬出來的磁盤空間,通常是總物理內存的一半
du:
du [-ahskm] 文件或目錄名稱 選項與參數: -a :列出所有的文件與目錄容量,因為默認僅統計目錄下面的文件量而已。 -h :以人們較易讀的容量格式 (G/M) 顯示; -s :列出總量而已,而不列出每個個別的目錄占用容量; -S :不包括子目錄下的總計,與 -s 有點差別。 -k :以 KBytes 列出容量顯示; -m :以 MBytes 列出容量顯示;容量默認以kb為單位
?
硬鏈接與符號鏈接-ln:
硬鏈接(Hard Link,硬式鏈接或實際鏈接):
想要讀取一個文件,必須經過目錄記錄的文件名來指向到正確的inode號碼才能讀取,也就是說,其實文件名只與目錄有關,但是文件內容則與inode有關。硬鏈接就是在某個目錄下新增一條文件名鏈接到某inode號碼的關聯記錄而已。
如圖,兩個文件的inode都是17678412,也就是說訪問這兩個文件訪問的是一個地方。
硬鏈接有這樣的性質:
- 不能跨文件系統
- 不能跨鏈接目錄
符號鏈接(Symbolic Link,即快捷方式):
符號鏈接就是建立一個獨立的文件,這個文件會讓數據的讀取指向它鏈接的那個文件的文件名。
只是指向操作,當源文件被刪除,符號鏈接的文件就打不開了
鏈接文件的重要內容就是它會寫上目標文件的文件名
由符號鏈接創建的文件為一個獨立的新文件,所以會占用inode與區塊
?
使用ln命令去制作鏈接文件:
ln [-sf] 源文件 目標文件 -s:如果不加任何參數就進行鏈接,就是硬鏈接,至于-s就是符號鏈接 -f:如果目標文件存在時,就主動的將目標文件直接刪除后再建立?
磁盤的分區、格式化、檢驗與掛載:
如果我們想要在系統里面新增一塊磁盤的話,應該做哪些操作:
觀察磁盤分區狀態:
liblk:
lsblk(可以看成是【list block device】的縮寫):列出系統上所有的磁盤列表
lsblk [-dfimpt] [device] 選項與參數: -d :僅列出磁盤本身,并不會列出該磁盤的分區數據 -f :同時列出該磁盤內的文件系統名稱 -i :使用 ASCII 的線段輸出,不要使用復雜的編碼 (再某些環境下很有用) -m :同時輸出該設備在 /dev 下面的權限數據 (rwx 的數據) -p :列出該設備的完整文件名!而不是僅列出最后的名字而已。 -t :列出該磁盤設備的詳細數據,包括磁盤陣列機制、預讀寫的數據量大小等[root@study ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 8:0 0 200G 0 disk ├─vda1 8:1 0 2G 0 part /boot ├─vda2 8:2 0 58G 0 part │ ├─rhel-root 253:0 0 191G 0 lvm / │ └─rhel-swap 253:1 0 6G 0 lvm └─vda3 8:3 0 140G 0 part└─rhel-root 253:0 0 191G 0 lvm /從上面的輸出我們可以很清楚的看到,目前的系統主要有個 sr0 以及一個 vda 的設備,而 vda 的設備下面又有三個分區, 其中 vda3 甚至還有因為 LVM 而產生的文件系統。
輸出的信息有:
- NAME:就是設備的文件名,會省略/dev等前導目錄!
- MAJ:MIN:其實核心識別的設備都是通過這兩個代碼來熟悉的!分別是主要:次要設備代碼!
- RM:是否為可卸載設備 (removable device),如光盤、USB 磁盤等等
- SIZE:容量
- RO:是否為只讀設備的意思
- TYPE:是磁盤 (disk)、分區 (partition) 還是只讀存儲器 (rom) 等輸出
- MOUTPOINT:掛載點
blkid:
列出設備的 UUID(universally unique identifier) 等參數
UUID是全局唯一表示符,是Linux給與設備的獨一無二的標識符,這個標識符就可以拿來掛載或是使用這個設備或文件系統
?
parted:
parted:列出磁盤的分區表類型與分區信息
parted device_name printModel:磁盤的模塊名稱(廠商)
Disk:磁盤總容量
Sector size (logical/physical):磁盤的每個邏輯/物理扇區容量
Partition:分區表格式
?
磁盤分區:gdisk/fdisk:
磁盤分區要注意的是:MBR分區表請使用fdisk分區,GPT請使用gdisk分區,這個搞錯會導致分區失敗。
gdisk:
gdisk 設備名稱d:刪除一個分區
n:增加一個分區
p:打印出分區表
q:不保存分區直接離開gdisk
w:保存分區操作后離開gdisk
你可以隨便玩gdisk,只要最后按q離開就不會生效
現在分區主要以扇區為最小單位
上面的各項的意義是:
- Number:分區編號,1號指的就是/dev/sda1這樣計算
- Start:每一個分區的開始扇區號碼位置
- End:每一個分區的結束扇區號碼位置,與start之間可以算出分區的總容量
- Size:就是分區的容量
- Code:在分區內的可能的文件系統類型,Linux為8300,swap為8200,這只是個提示
- Name:文件系統的名稱等
從上表我們可以發現:
- 整個磁盤還可以進行額外的劃分,因為最大扇區為83886080,但只用到65026047號而已
- 分區的設計中,新分區通常選用上一個分區的結束扇區號碼加1作為起始扇區號碼
另外注意:
- 這個gdisk命令只有root可以執行
- 使用的設備文件名請不要加上數字,因為磁盤分區是針對整個磁盤設備而不是某個分區(不能用/dev/sda1,要用磁盤/dev/sda)
?新增分區示例操作:
我們要來做如下分區:
- 1GB的xfs文件系統(Linux)
- 1GB的vfat文件系統(Windows)
- 0.5GB的swap(Linux swap)? (這個分區等一下會被刪除)
在Last sector中絕對不要回車,否則就是把磁盤剩余所有扇區都使用了,這個我們僅要1G(輸入+1G系統會自動計算最接近你需要容量的扇區號碼)
按照上面的方法分出所需要求,最后就是這樣:
很nice,文件系統的ID一般來說,Linux大概就是8200、8300、8e00等三種格式,Windows幾乎都用0700
最后我們按w寫入新的分區,會出現警告,這是因為這塊磁盤現在正在使用中,因此系統無法立即加載新的分區表
可以看到,還沒有sda4、sda5、sda6
這時我們可以通過兩種方式來處理,一種是重新啟動,一種是通過partprobe這個命令來處理
partprobe:更新Linux內核信息
partprobe [-s] //不加-s,那屏幕不顯示信息接下來我們來刪除分區,刪除sda6(Linux swap)
這個刪除很簡單,直接gdisk /dev/sda后,輸入d,然后輸入6,,最后w寫入即可,別忘了出來之后用partprobe更新內核信息,然后lsblk一看,就會發現sda6消失了
千萬不要去處理正在使用中的分區
?磁盤格式化(創建文件系統):
分區完畢后自然就是去進行文件系統的格式化。格式化的命令非常簡單,那就是【make filesystem,mkfs】這個命令。這個命令是個綜合命令,他會去調用正確的文件系統格式化工具軟件。
“格式化”其實應該稱為“創建文件系統 (make filesystem)”才對,所以使用的指令是 mkfs。
創建的 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 :后面接的是區塊量,可由 512 到 64k,不過最大容量限制為 Linux 的 4k 喔! -d :后面接的是重要的 data section 的相關參數值,主要的值有:agcount=數值 :設置需要幾個儲存群組的意思(AG),通常與 CPU 有關agsize=數值 :每個 AG 設置為多少容量的意思,通常 agcount/agsize#只選一個設置即可file :指的是“格式化的設備是個文件而不是個設備”的意思!#(例如虛擬磁盤)size=數值 :data section 的容量,亦即你可以不將全部的設備容#量用完的意思su=數值 :當有 RAID 時,那個stripe數值的意思,與下面的 w搭配使用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 。沒有特殊需求的話,直接mkfs.xfs /dev/sda4即可,非常快就會創建一個 xfs文件系統
XFS 文件系統 for RAID 性能優化 (Optional):
磁盤陣列是多顆磁盤組成一顆大磁盤的意思, 利用同步寫入到這些磁盤的技術,不但可以加快讀寫速度,還可以讓某一顆磁盤壞掉時,整個文件系統還是可以持續運行的狀態!那就是所謂的容錯。
基本上,磁盤陣列 (RAID) 就是通過將文件先細分為數個小型的分區區塊 (stripe) 之后,然后將眾多的 stripes 分別放到磁盤陣列里面的所有磁盤, 所以一個文件是被同時寫入到多個磁盤去,當然性能會好一些。為了文件的保全性,所以在這些磁盤里面,會保留數個(與磁盤陣列的規劃有關) 備份磁盤 (parity disk), 以及可能會保留一個以上的備用磁盤(spare disk),這些區塊基本上會占用掉磁盤陣列的總容量,不過對于數據的保全會比較有保障!
那個分區區塊 stripe 的數值大多介于 4K 到 1M 之間,這與你的磁盤陣列卡支持的項目有關。stripe 與你的文件數據容量以及性能相關性較高。 當你的系統大多是大型文件時,一般建議stripe 可以設置大一些,這樣磁盤陣列讀/寫的頻率會降低,性能會提升。如果是用于系統,那么小文件比較多的情況下, stripe 建議大約在 64K 左右可能會有較佳的性能。不過,還是都須要經過測試啦!完全是 case by case 的情況。
文件系統的讀寫要能夠有最優化,最好能夠搭配磁盤陣列的參數來設計,這樣性能才能夠起來!也就是說,你可以先在文件系統就將 stripe 規劃好, 那交給 RAID 去存取時,它就無須重復進行文件的 stripe 過程,性能當然會更好!那格式化時,最優化性能與什么咚咚有關呢?我們來假設個環境好了:
我有兩個線程的 CPU 數量,所以 agcount 最好指定為 2
當初設置 RAID 的 stripe 指定為 256K 這么大,因此 su 最好設置為 256k
設置的磁盤陣列有 8 顆,因為是 RAID5 的設置,所以有一個 parity (備份碟),因此指定 sw 為 7
由上述的數據中,我們可以發現數據寬度 (swidth) 應該就是 256K*7 得到 1792K,可以指定 extsize 為 1792k
ext4文件系統mkfs.ext4:
如果想要格式化為ext4的傳統Linux文件系統的話,可以使用如下:
mkfs.ext4 [-b size] [-L label] 設備名稱 選項與參數: -b :設置 block 的大小,有 1K, 2K, 4K 的容量, -L :后面接這個設備的標頭名稱。其他文件系統mkfs:
mkfs其實是個綜合命令,使用mkfs -t xfs時,他就會去找mkfs.xfs的相關參數給我們使用。如果想要知道系統還支持哪種文件系統的格式化功能,輸入mkfs再按兩次Tab即可
文件系統檢驗:
xfs_repair處理XFS文件系統
xfs_repair [-fnd] 設備名稱 -f:后面的設備其實是個文件而不是實體設備 -n:單純檢查并不修改文件系統的任何數據 -d:通常用在單人維護模式下面,針對根目錄(/)#進行檢查與修復的操作,很危險,不要隨便用xfs_repair可以檢查/修復文件系統,不過,因為修復文件系統是個龐大的任務,因此,修復時該文件系統不能被掛載。所以,檢查與修復/dev/sda4沒啥問題,但是修復已被掛載的文件系統時,就會出現問題,卸載后再處理即可。
而根目錄無法被卸載,那根目錄有問題怎么辦?進入單人維護模式,加入d參數即可
fsck.ext4處理ext4文件系統
fsck是個綜合命令,針對而ext4的話,用fsck.ext4處理即可
fsck.ext4 [-pf] [-b 超級區塊] 設備名稱 -p:當文件系統在修復時,若要回復Y的操作時,自動回復Y -f:強制檢查,一般來說,如果fsck沒有發現任何unclean的標識,#不會主動進入詳細檢查的,若您想要強制fsck詳細檢查,就要-f -D:針對文件系統下的目錄進行最佳化配置 -b:后面接超級區塊的位置,一般這個選項用不到,但是若果你#的超級區塊做損壞時,通過這個參數即可利用文件系統內備#份的超級區塊來嘗試恢復,一般來說,超級區塊備份在如下:#1K區塊放在8193,2K區塊放在16384,4K區塊放在32768我們可以利用dumpe2fs -h /dev/sda5找到Blocks per group的信息,即可知道超級區塊的位置,比如是32768,然后fsck.ext4 -b 32768 /dev/sda5即可檢查文件系統超級區塊問題
注意,通常只有root且你的文件系統有問題的時候才使用此命令,否則正常情況下使用此命令,可能會造成對系統的危害。
被檢查的硬盤分區務必是卸載狀態
文件系統的掛載與卸載:
每次進行掛載前,要確定幾件事情:
- 單一文件系統不應該被重復掛載在不同的掛載點(目錄)上
- 單一目錄不應該重復掛載多個文件系統
- 要作為掛載點的目錄,理論上應該是空目錄才行
如果你要掛載的目錄里面并不是空的,那么掛載了文件系統之后,原目錄下的東西就會暫時消失
(卸載后才會再次現身)
centOS現在的版本基本上不需要-t,系統會自動分析最恰當的文件系統來嘗試掛載你需要的設備,系統的一句就是分析超級區塊搭配Linux自己的驅動程序去測試掛載,測試成功,就立刻自動使用該類型的文件系統掛載起來。
- /etc/filesystems:系統指定的測試掛載文件系統類型的優先級
- /proc/filesystems:Linux系統已經加載的文件系統類型
Linux支持的文件系統驅動程序寫在如下目錄:
- /lib/modules/$ (uname -r) /kernel/fs/
例如ext4的驅動程序就寫在【/lib/modules/$ (uname -r) /kernel/ext4/】目錄下
掛載 xfs/ext4/vfat 等文件系統:
掛載CD或DVD光盤:
光盤一掛載之后就無法退出光盤了,除非你將它卸載才能夠退出
盡量使用UUID去進行掛載,因為它一般不會變動,而一塊磁盤到了別人的電腦就可能不是sda這個名字了
因為是光盤,所以磁盤使用率達到了100%,所以你無法直接寫入任何數據到光盤中。
此外,如果你使用的是圖形界面,那么系統會自動幫你掛載這個光盤到/media目錄。也可以不卸載就直接退出(但是命令行不能這樣
掛載vfat中文移動磁盤(USB磁盤):
我們來掛載vfat格式的磁盤
mount -o codepage=950,iocharset=utf8 UUID="35BC-6D6B" /data/usb因為是中文文件名的數據,那么可以在掛載時指定掛載文件系統的所使用的的語系。在man mount找到vfat文件格式當中可以使用codepage來處理,中文語系的代碼是950,另外,如果想要指定中文是Unicode還是Big5,就要指定iocharset二選一了。
重新掛載根目錄與掛載不特定目錄:
整個目錄樹最重要的地方就是根目錄,根目錄不可能被卸載,如果你的掛載參數要改變或是根目錄出現【只讀】狀態,如何重新掛載,最可能的處理方式就是重新啟動(reboot),不過你也可以這樣:
#將/重新掛載,并加入參數為rw與auto mount -o remount,rw,auto /重點是那個-o remountde,xx的選項與參數。要重新掛載時,這是個非常重要的機制。尤其是當你進入單人維護模式下的時候,你的根目錄常會被系統掛載為只讀。
另外,我們也可以利用mount來將某個目錄掛載到另外一個目錄。這并不是掛載文件系統,而是額外掛載某個目錄的方法。雖然下面的方法也可以用符號鏈接來實現,不過某些不支持符號鏈接的程序運行中,就用到這個方法了
兩個目錄鏈接在同一個inode,這就是mount --bind的功能,所以從此進入/data/var也就是進入/var
umount(將設備文件卸載):
-umount [-fn] 設備文件名或掛載點 -f:強制卸載,可用在類似網絡系統(NFS)無法讀取到的情況下 -l:立刻卸載文件系統,比-f還強 -n:不更新/etc/mtab情況下卸載就是直接將已經掛載的文件系統卸載,卸載之后,可以使用df或mount看看是否還存在于目錄中。卸載的方式,可以輸入設備文件名或掛載點,都行。
卸載的基本原則就是那塊磁盤不是正在被使用,你在那個磁盤目錄下,就不能卸載它,除非你離開目錄
磁盤/文件系統參數自定義:
mknod:
Linux里萬物皆文件,那么文件是如何代表設備的,就是靠major(主要)和minor(次要)數值來替代
上面的8就是主要設備代碼(major),而0~5就是次要設備代碼(minor)。我們的Linux內核支持的設備文件數據就是通過這兩個數值來決定的。
一般我們不需要手動建立設備文件。不過某些情況下面我們可能還是要手動處理設備文件,例如在某些服務被chroot到特定目錄下時,就需要這樣做了
mknod 設備文件名 [bcp] [Major] [Minor] b:設置設備名稱成為一個外接存儲設備文件,例如磁盤等 c:設置設備名稱成為一個外接輸入設備文件,例如鼠標等 p:設置設備名稱成為一個FIFO文件 Major:主要設備碼 Minor:次要設備碼xfs_admin修改XFS文件系統的UUID與Label name:
如果你當初格式化的時候忘記加入了標頭名稱,后來想再加入,無需格式化,直接使用xfs_admin即可,它還可以設置UUID
該命令只對xfs文件系統類型有效
xfs_admin [-lu] [-L label] [-U uuid] 設備名 -l:列出這個設備的label name -u:列出這個設備的UUID -L:設置這個設備的Label name -U:設置這個設備的UUIDtune2fs修改ext4的label name與UUID
tune2fs [-l] [-L Label] [-U uuid] 設備文件名 -l:類似dumpe2fs,將superblock內的數據讀出來 -L:修改Label name -U:修改UUID設置啟動掛載(fstab與mtab):
可不可以在啟動時就將我要的文件系統掛載好呢?這樣我就不用每次進入Linux都要掛載一次。當然可以,直接到/etc/fstab里面去修改就行,不過,系統掛載有一些限制:
- 根目錄/是必須掛載的,而且一定要先于其他掛載點被掛載進來
- 其他掛載點必須為已建立的目錄,可任意指定,但一定要遵循必須得系統目錄架構原則(FHS)
- 所有掛載點在同一時間內,只能掛載一次
- 所有的硬盤在同一時間內,只能掛載一次
- 如若進行卸載,您必須將工作目錄轉移到掛載點之外
下面那6個字段分別是
[設備/UUID等] [掛載點] [文件系統] [文件系統參數] [dump] [fsck]設備/UUID等:
這個字段可以填寫的數據主要有三個項目:
- 文件系統或磁盤的設備文件名,如/dev/sda2等
- 文件系統的UUID名稱(UUID=?)
- 文件系統的LABEL名稱(LABEL=?)
自己編寫的時候寫哪個都行
掛載點:
一定是目錄
磁盤分區的文件系統:
在手動掛載時可以讓系統自動測試掛載,但在這個文件當中我們必須要手動寫入文件系統才行,包括:xfs、ext4、fab、reiserf、nfs等
文件系統參數:
mount那里的那一幫子
| 參數 | 內容意義 |
| async/sync 異步/同步 | 配置磁盤是否以異步方式運行!默認為 async(效能較佳) |
| auto/noauto 自動/非自動 | 當下達 mount -a 時,此文件系統是否會被主動測試掛載。默認為 auto。 |
| rw/ro 可擦寫/只讀 | 讓該分割槽以可擦寫或者是只讀的型態掛載上來,如果你想要分享的數據是不給用戶隨意變更的, 這里也能夠配置為只讀。則不論在此文件系統的文件是否配置 w 權限,都無法寫入喔! |
| exec/noexec 可運行/不可運行 | 限制在此文件系統內是否可以進行『運行』的工作?如果是純粹用來儲存數據的, 那么可以配置為 noexec 會比較安全,相對的,會比較麻煩! |
| user/nouser 允許/不允許使用者掛載 | 是否允許用戶使用 mount 命令來掛載呢?一般而言,我們當然不希望一般身份的 user 能使用 mount 啰,因為太不安全了,因此這里應該要配置為 nouser 啰! |
| suid/nosuid 具有/不具有 suid 權限 | 該文件系統是否允許 SUID 的存在?如果不是運行文件放置目錄,也可以配置為 nosuid 來取消這個功能! |
| defaults | 同時具有?rw, suid, dev, exec, auto, nouser, async?等參數。 基本上,默認情況使用 defaults 配置即可! |
能否被dump備份使用:
dump是一個用來做備份的命令,不過現在有太多備份方案,這個項目可以不用理會,填0就好
是否以fsck檢驗扇區
早期啟動流程中,會有一段時間去檢驗本機的文件系統,看看文件系統是否完整(clean),不過這個階段主要是通過fsck去完成,我們現在用的xfs文件系統就沒有辦法適用,因為xfs會自己自行檢驗,填0即可
?
?
/etc/fstab是啟動時的配置文件,不過,實際文件系統的掛載是記錄到 /etc/mtab 和 /proc/mounts 這兩個文件中的。每次我們在修改文件系統的掛載時,也會同時修改這兩個文件。但是,萬一發生你在/etc/fstab輸入的數據有誤,導致無法順利啟動成功,而進入單人模式中,那時候的/可是只讀的狀態,當然你無法修改/etc/fstab,也無法更新/etc/mtab,怎么辦?沒關系,可以用這招:
特殊設備loop掛載(鏡像文件不刻錄就掛載使用)
如果有光盤鏡像文件,或是使用文件作為磁盤的方式時,那就要使用特別的方法來將他掛載起來,不需要刻錄
掛載CD/DVD鏡像文件:
想像一下如果今天我們從中科大鏡像站下載了 Linux 或者是其他所需CD/DVD的鏡像文件后, 難道一定需要刻錄成為光盤才能夠使用該文件里面的數據嗎?當然不是啦!我們可以通過 loop 設備來掛載的!
[root@study ~]# ll -h /tmp/CentOS-7.0-1406-x86_64-DVD.iso -rw-r--r--. 1 root root 3.9G Jul 7 2014 /tmp/CentOS-7.0-1406-x86_64-DVD.iso # 看到上面的結果吧!這個文件就是鏡像文件,文件非常的大吧! [root@study ~]# mkdir /data/centos_dvd [root@study ~]# mount -o loop /tmp/CentOS-7.0-1406-x86_64-DVD.iso /data/centos_dvd [root@study ~]# df /data/centos_dvd Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop0 4050860 4050860 0 100% /data/centos_dvd # 就是這個項目! .iso 鏡像文件內的所有數據可以在 /data/centos_dvd 看到! [root@study ~]# ll /data/centos_dvd total 607 -rw-r--r--. 1 500 502 14 Jul 5 2014 CentOS_BuildTag <==瞧!就是DVD的內容啊! drwxr-xr-x. 3 500 502 2048 Jul 4 2014 EFI -rw-r--r--. 1 500 502 611 Jul 5 2014 EULA -rw-r--r--. 1 500 502 18009 Jul 5 2014 GPL drwxr-xr-x. 3 500 502 2048 Jul 4 2014 images .....(下面省略)..... [root@study ~]# umount /data/centos_dvd/ # 測試完成!記得將數據給他卸載!非常方便吧!如此一來我們不需要將這個文件刻錄成為光盤或者是 DVD 就能夠讀取內部的數據了! 換句話說,你也可以在這個文件內“動手腳”去修改文件的!這也是為什么很多鏡像文件提供后,還得要提供驗證碼 (MD5) 給使用者確認該鏡像文件沒有問題!
建立大文件以制作loop設備文件:
想一想,既然能夠掛載 DVD 的鏡像文件,那么我能不能制作出一個大文件,然后將這個文件格式化后掛載呢? 好問題!這是個有趣的動作!而且還能夠幫助我們解決很多系統的分區不良的情況呢!舉例來說,如果當初在分區時, 你只有分區出一個根目錄,假設你已經沒有多余的容量可以進行額外的分區的!偏偏根目錄的容量還很大! 此時你就能夠制作出一個大文件,然后將這個文件掛載!如此一來感覺上你就多了一個分區啰!用途非常的廣泛啦!
下面我們在 /srv 下創建一個 512MB 左右的大文件,然后將這個大文件格式化并且實際掛載來玩一玩!
- 建立大型文件
dd 就好像在疊磚塊一樣,將 512 塊,每塊 1MB 的磚塊堆疊成為一個大文件 (/srv/loopdev)!
- 大型文件的格式化
默認 xfs 不能夠格式化文件的,所以要格式化文件得要加入特別的參數(-f:強制格式化)才行
[root@study ~]# mkfs.xfs -f /srv/loopdev [root@study ~]# blkid /srv/loopdev /srv/loopdev: UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" TYPE="xfs"- 掛載
利用mount的-o參數來掛載
[root@study ~]# mount -o loop UUID="7dd97bd2-4446-48fd-9d23-a8b03ffdd5ee" /mnt [root@study ~]# df /mnt Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop0 520876 26372 494504 6% /mnt通過這個簡單的方法,感覺上你就可以在原本的分區在不更動原有的環境下制作出你想要的分區就是了! 這東西很好用的!尤其是想要玩 Linux 上面的“虛擬機”的話, 也就是以一部Linux 主機再切割成為數個獨立的主機系統時,類似 VMware 這類的軟件, 在 Linux 上使用xen 這個軟件,他就可以配合這種 loop device 的文件類型來進行根目錄的掛載,真的非常有用的喔! ^^
比較特別的是,CentOS 7.x 越來越聰明了,現在你不需要下達 -o loop 這個選項與參數,它同樣可以被系統掛上來! 連直接輸入 blkid 都會列出這個文件內部的文件系統耶!相當有趣!不過,為了考慮向下兼容性,鳥哥還是建議你加上 loop 比較妥當喔! 現在,請將這個文件系統永遠的自動掛載起來吧!
永久自動掛載:
[root@study ~]# nano /etc/fstab /srv/loopdev /data/file xfs defaults**,loop** 0 0 # 畢竟系統大多僅查詢 block device 去找出 UUID 而已,因此使用文件創建的 filesystem, # 最好還是使用原本的文件名來處理,應該比較不容易出現錯誤訊息的! [root@study ~]# umount /mnt [root@study ~]# mkdir /data/file [root@study ~]# mount -a [root@study ~]# df /data/file Filesystem 1K-blocks Used Available Use% Mounted on /dev/loop0 520876 26372 494504 6% /data/file內存交換分區(swap)之創建:
我們知道 CPU 所讀取的數據都來自于內存, 那當內存不足的時候,為了讓后續的程序可以順利的運行,因此在內存中暫不使用的程序與數據就會被挪到 swap 中了。 此時內存就會空出來給需要執行的程序載入。由于 swap 是用磁盤來暫時放置內存中的信息,所以用到 swap 時,你的主機磁盤燈就會開始閃個不停啊!
使用物理分區創建內存交換分區:
1. 分區:先使用 gdisk 在你的磁盤中分區出一個分區給系統作為 swap 。由于 Linux 的gdisk 默認會將分區的 ID 設置為 Linux 的文件系統,所以你可能還得要設置一下 system ID 就是了。
2. 格式化:利用創建 swap 格式的“mkswap 設備文件名”就能夠格式化該分區成為 swap 格式
3. 使用:最后將該 swap 設備啟動,方法為:“swapon 設備文件名”。
4. 觀察:最終通過 free 與 swapon -s 這個指令來觀察一下內存的用量吧!
?
首先我們用gdisk進行分區,Hex code寫8200
w退出保存后,用lsblk可以看見我們的新分區
用mkswap 格式化該分區為swap格式
開始觀察看看:
最后寫入配置文件,因為是swap,所以沒有掛載點
使用文件創建內存交換文件:
如果是在實體分區無法支持的環境下,此時前一小節提到的 loop 設備創建方法就派的上用場啦! 與實體分區不一樣的,這個方法只是利用 dd 去創建一個大文件而已。多說無益,我們就再通過文件創建的方法創建一個 128 MB 的內存交換空間吧
用dd新增大文件
使用mkswap將/tmp/swap格式化為內存交換文件的文件格式
這個命令寫錯字符將可能導致您的文件系統掛掉
使用swapon來將/tmp/swap啟動
接下來寫入/etc/fstab,注意,這里是個大文件,系統僅會查詢區塊設備(block device)不會查詢文件,所以千萬不能用UUID,不然系統會查不到
接下來用swapoff /tmp/swap? /dev/sda6 來關閉示范的兩個swap分區,再用swapon -a全部開啟,如果fstab設置無誤,這些就全部開啟
說實話,swap 在目前的桌面電腦來講,存在的意義已經不大了!這是因為目前的 x86 主機所含的內存實在都太大了 (一般入門級至少也都有 4GB 了),所以,我們的 Linux 系統大概都用不到 swap 這個玩意兒的。不過, 如果是針對服務器或者是工作站這些常年上線的系統來說的話,那么,無論如何,swap 還是需要創建的。
因為 swap 主要的功能是當實體內存不夠時,則某些在內存當中所占的程序會暫時被移動到swap 當中,讓實體內存可以被需要的程序來使用。另外,如果你的主機支持電源管理模式,也就是說,你的 Linux 主機系統可以進入“休眠”模式的話,那么, 運行當中的程序狀態則會被紀錄到 swap 去,以作為“喚醒”主機的狀態依據! 另外,有某些程序在運行時,本來就會利用swap 的特性來存放一些數據段, 所以, swap 來是需要創建的!只是不需要太大!
文件系統的特殊觀察與操作:
磁盤空間浪費問題:
我們在前面的 EXT2 data block 介紹中談到了一個 block 只能放置一個文件, 因此太多小文件將會浪費非常多的磁盤容量。但你有沒有注意到,整個文件系統中包括 superblock, inodetable 與其他中介數據等其實都會浪費磁盤容量喔!所以當我們在 /dev/vda4, /dev/vda5 創建起 xfs/ext4 文件系統時, 一掛載就立刻有很多容量被用掉了!
另外,不知道你有沒有發現到,當你使用 ls -l 去查詢某個目錄下的數據時,第一行都會出現一個“total”的字樣! 那是啥東西?其實那就是該目錄下的所有數據所耗用的實際 block 數量 *block 大小的值。 我們可以通過 ll -s 來觀察看看上述的意義:
[root@study ~]# ll -sh total 12K 4.0K -rw-------. 1 root root 1.8K May 4 17:57 anaconda-ks.cfg 4.0K -rw-r--r--. 2 root root 451 Jun 10 2014 crontab 0 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 crontab2 -> /etc/crontab 4.0K -rw-r--r--. 1 root root 1.9K May 4 18:01 initial-setup-ks.cfg 0 -rw-r--r--. 1 root root 0 Jun 16 01:11 test1 0 drwxr-xr-x. 2 root root 6 Jun 16 01:11 test2 0 -rw-rw-r--. 1 root root 0 Jun 16 01:12 test3 0 drwxrwxr-x. 2 root root 6 Jun 16 01:12 test4從上面的特殊字體部分,那就是每個文件所使用掉 block 的容量!舉例來說,那個 crontab 雖然僅有 451Bytes , 不過他卻占用了整個 block (每個 block 為 4K),所以將所有的文件的所有的 block 加總就得到 12KBytes 那個數值了。 如果計算每個文件實際容量的加總結果,其實只有不到 5K 而已
利用GNU的parted進行分區操作:
雖然你可以使用 gdisk/fdisk 很快速的將你的分區切割妥當,不過 gdisk 主要針對 GPT 而fdisk 主要支持 MBR ,對 GPT 的支持還不夠! 所以使用不同的分區時,得要先查詢到正確的分區表才能用適合的指令,好麻煩!有沒有同時支持的指令呢?有的!那就是 parted 。
[root@study ~]# parted [設備] [指令 [參數]] 新增分區:mkpart [primary|logical|Extended] [ext4|vfat|xfs] 開始 結束 顯示分區:print 刪除分區:rm [partition] [root@study ~]# parted /dev/sda print Model: Virtio Block Device (virtblk) <==磁盤接口與型號 Disk /dev/sda: 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上面是最簡單的 parted 指令功能簡介,你可以使用“ man parted ”,或者是“ parted /dev/sda help mkpart ”去查詢更詳細的數據。比較有趣的地方在于分區表的輸出。我們將上述的分區表示意拆成六部分來說明:
1. Number:這個就是分區的號碼啦!舉例來說,1號代表的是 /dev/sda1 的意思;
2. Start:分區的起始位置在這顆磁盤的多少 MB 處?有趣吧!他以容量作為單位喔!
3. End:此分區的結束位置在這顆磁盤的多少 MB 處?
4. Size:由上述兩者的分析,得到這個分區有多少容量;
5. File system:分析可能的文件系統類型為何的意思!
6. Name:就如同 gdisk 的 System ID 之意。
不過 start 與 end 的單位竟然不一致!好煩~如果你想要固定單位,例如都用 MB 顯示的話,可以這樣做:
parted /dev/sda unit mb print如果你想要將原本的 MBR 改成 GPT 分區表,或原本的 GPT 分區表改成 MBR 分區表,也能使用 parted ! 但是請不要使用 sda 來測試!因為分區表格式不能轉換!因此進行下面的測試后,在該磁盤的系統應該是會損毀的! 所以我拿一顆沒有使用的U盤來測試,所以文件名會變成 /dev/vda 喔!再講一次!不要惡搞喔!
下面操作危險,無法復原!
[root@study ~]# parted /dev/vda print Model: ATA QEMU HARDDISK (scsi) Disk /dev/vda: 2148MB Sector size (logical/physical): 512B/512B Partition Table: msdos # 確實顯示的是 MBR 的 msdos 格式喔! [root@study ~]# parted /dev/vda 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/vda print # 你應該就會看到變成 gpt 的模樣!只是...后續的分區就全部都死掉了!接下來我們嘗試來創建一個全新的分區吧!再次的創建一個 512MB 的分區來格式化為 vfat,且掛載于 /data/win 喔!
[root@study ~]# parted /dev/sda print .....(前面省略)..... Number Start End Size File system Name Flags 7 36.0GB 36.5GB 522MB primary [root@study ~]# partprobe [root@study ~]# lsblk /dev/sda7 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda7 252:7 0 498M 0 part # 要確定它是真的存在才行! [root@study ~]# mkfs -t vfat /dev/sda7 [root@study ~]# blkid /dev/sda7 /dev/sda7: 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/sda7 509672 0 509672 0% /data/win事實上,你應該使用 gdisk 來處理 GPT 分區就好了!不過,某些特殊時刻,例如你要自己寫一只腳本,讓你的分區全部一口氣創建, 不需要 gdisk 一條一條指令去進行時,那么 parted就非常有效果了!因為他可以直接進行 partition 而不需要跟用戶互動!這就是它的最大好處! 建議至少你要操作過幾次 parted ,知道這家伙的用途!未來有需要再回來查!或使用 man parted 去處理喔!
這一章終于過完了,博客都兩萬字了,呼~下回再見!
?
?
?
?
博客:is-hash.com
商業轉載 請聯系作者獲得授權,非商業轉載 請標明出處,謝謝
?
總結
以上是生活随笔為你收集整理的Linux的基本学习(四)——磁盘与文件系统管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LoadRunner-登陆web tou
- 下一篇: 处理ArchLinux上各软件屏幕卡顿与