之前使用虛擬機體驗Linux操作系統的使用,一般使用默認的磁盤分區設置,也很少涉及磁盤管理操作,且總有刪除重裝作為后盾。在安裝Ubuntu雙系統后,在使用過程中遇到了磁盤分區不合理導致的/boot分區空間不足、磁盤空間需要進行管理等問題,而使用簡單粗暴的重裝操作則失去了性價比,轉而需要通過Linux系統自帶的強大的磁盤和文件系統的管理功能來進行實際操作,這里記錄平常使用過程中常用的相關的磁盤和文件系統管理所需要的命令和操作。
設備文件命名規則
在Linux系統環境下,設備均被視為文件,一般處於/dev文件夾下,對不同的設備類型,其對應的文件名不相同。
設備 | 設備對應的Linux文件名 |
IDE硬盤 | /dev/hd[ a - d ] |
SCSI/SATA/USB硬盤 | /dev/sd[ a - p ] |
軟盤 | /dev/floppy |
其中,IDE硬盤根據其插入的接口不同,分為/dev/hda - /dev/hdd四個名字,而SCSI/SATA硬盤則根據系統檢測到的硬盤的順序分為 /dev/sda - /dev/sdp 等名稱。
不同的硬件設備會根據其接入情況擁有不同的文件名,進一步的,同一硬件設備中可能存在多個不同的分區,系統通過在設備文件名之后加入數字后綴來進行區分(在后續表述中,一般認為一個分區對應一個文件系統)。以SCSI硬盤為例,其主分區的命名為 /dev/sda1 - /dev/sda4(注意這四個編號只能被主分區和拓展分區使用),而邏輯分區的命名為 /dev/sda5 - /dev/sda15.
關於設備的命名規則,可以參考文檔 Linux allocated devices
文件系統的使用情況查看
可通過Linux命令 df 和 du 來獲得當前系統使用情況的信息。
df
報告文件系統對磁盤空間的使用情況
df [Options] filename 1.顯示包含有參數文件名的文件系統的空間使用情況; 2.不指定文件名時,則顯示當前掛載的所有文件系統的磁盤使用情況 3.直接指定對應的文件系統名顯示相應的信息 Options: -a 顯示所有相關的文件系統的信息 -Bx 以 x 指定的單位來表示空間大小,x 可為整數+單位 的格式,如10K\M\G\T等 -h 以易讀的方式顯示空間,即以1024作為單位 -T 輸出文件系統類型
使用 df -Th命令,顯示情況如下
du
估計文件系統的使用情況
du [Options] FILE 總結FILE指定的文件集合的空間占用情況,若指定文件集合位目錄,則會進行遞歸計算 -a 顯示結果包括文件的空間占用情況,默認值只顯示所有目錄的空間占用情況 -Bx 以x指定的單元作為單位計算空間占用情況,如-BM,則以1M為單位進行顯示 -c 結尾輸出總空間占用量 -h 以人類易讀的方式輸出結果 -s 顯示每個參數的總空間占用量
以命令 du -sc -BM ~/*運行的結果如下
磁盤管理
可借助Linux命令完成磁盤分區與格式化,磁盤的掛載等操作。
fdisk
磁盤的分區與管理等功能
fdisk [-i] 設備名稱 1.-l 選項會將設備名稱對應的設備的所有分區信息顯示后退出,不指定設備時顯示系統能夠識別的所有設備 2.不使用參數時,則進入fdisk命令的交互界面,可按提示進行操作
注意,fdisk以設備名稱作為參數,而不是文件系統名稱,故而參數應該為/dev/sd[a - p]和/dev/hd[a - d]的形式。可通過df命令獲取對應的設備名稱的信息,如某文件系統名為/dev/sda8,則其所在的設備的名稱為/dev/sda.
進入fdisk的交互界面后可根據提示完成獲取磁盤信息、新增/刪除一個分區等操作。對磁盤的操作首先位於內存中,只有通過 w 退出時才會將修改真正執行,相應的使用 q 退出則不會做修改。請確定操作無誤后再執行。
通過fdisk輸出設備/dev/sda的分區信息如下
其中,start和end分別表示對應特定分區的起始柱面號。
mkfs
完成系統的格式化操作
mkfs -t 格式名 設備文件名 mkfs命令會根據其參數調用實際執行的格式化工具,將文件系統格式化
在鍵入 mkfs 后按兩下[tab]鍵,可以看到系統支持的格式化的類型。
mount
磁盤的掛載
mount 將磁盤分區與固定的目錄建立聯系,使得該目錄成為進入該分區的入口 -a 將記錄在/etc/fstab中而未掛載的磁盤進行掛載 -l 顯示目前的掛載信息,只輸入命令mount效果一樣
-t 指定文件系統類型,包括 ext2/3、vfat、iso9660(光盤格式)、nfs、cifs等 -L "xx" 使用文件系統卷標名而不是文件系統名(如/dev/sda1)進行掛載,好處在於文件系統名可能隨接入系統的接口的變化而改變
--bind 將一個目錄掛載到另一個目錄上,實現的效果類似於符號連接 -o 可接一些掛載時的一些參數
-o loop 直接將當前文件系統上的文件以loop設備進行掛載,如下載的iso鏡像文件,不需要先刻錄,直接通過 -o loop xx.iso 將其掛載,即可對其進行操作
筆者對於掛載的理解是將一個訪問入口與一個對應的文件系統聯系起來。Linux系統為系統軟件,而文件系統實際存儲在硬件設備中,掛載所做的就是將某個目錄與文件系統關聯(掛載),之后即可通過該目錄來訪問該文件系統。相應的,對於一個與文件系統A掛載的目錄,將其與另一個文件系統B掛載,則其中的內容就變為文件系統B的內容,原文件系統A的內容不會改變,但只有經過掛載后才能再進行訪問。一般建議掛載的目錄為空目錄,單個文件系統不要重復掛載。
事實上,Linux系統的掛載在開機階段就有發生。在這一階段,系統根據配置文件/etc/fstab中的設置將系統必需的根目錄 / 等進行掛載。該配置文件中包含有文件系統、對應的掛載點、系統類型等信息。而在后續的系統使用過程中,系統的實際掛載情況則被寫入/etc/mtab中(也可通過mount的 -n 選項使得掛載情況不被寫入該文件)。
可通過 mount /dev/sdax ~/test 進行簡單的掛載,系統會自動識別文件系統的類型,故而一般不需要通過 -t 選項指定。
對應的文件系統的卸載可以通過umount命令,其參數可以為文件系統名(/dev/sdax)、掛載點名(~/test)等,均可完成卸載操作。
磁盤二進制內容查看
xxd命令
xxd //可用於顯示磁盤原始的二進制數據 -u //十六進制內容以大寫內容顯示 -g x //結果中每 x Bytes使用空格鍵隔開 -c n //結果中每行包含n個字節的內容 -l n //結果顯示總共n個字節的內容 -s -/+n //+n表示自目標對象開始n字節處開始顯示結果 //-n表示自目標對象結束處前n字節處開始顯示結果
使用示例:
根據磁盤的第一個扇區應該為MBR(使用GPT格式的磁盤第一個扇區為類MBR結構),使用xxd命令查看其最后66字節:
sudo xxd -g 1 -l 64 -s +446 /dev/sda
命令表示將每個字節內容(兩位十六進制數)使用空格隔開,在距文件開始偏移為446的位置開始,顯示連續的66字節的內容,從而可以看到圖示中原本屬於分區表的內容和最后的結束標志0x55aa。
關於硬件設備文件的命名可參考:鳥叔的Linux私房菜-Linux主機規划與磁盤分區
關於Linux磁盤與文件系統管理可參考:鳥叔的Linux私房菜-Linux磁盤與文件系統管理