1、磁盤結構
設備文件:關聯至一個設備驅動程序,進而能夠與之對應硬件設備進行通信
I/O Ports:I/O 設備地址
一切皆文件:open(),read(),write(),close()
設備類型:
塊設備:block,存取單位 “塊”,磁盤,支持緩存
字符設備:char,存取單位 “字符”,鍵盤
設備號碼:
主設備號:major number,標識設備類型
次設備號:minor number,表示同一類型下的不同設備
磁盤設備的設備文件命名:/dev/dev_file
SCSI,SATA,SAS,IDE,USB:/dev/sd
虛擬磁盤:/dev/vd(kvm 技術)、/dev/xvd(xen 技術)
不同磁盤標識:a-z,aa,bb…
/dev/sda,/dev/sdb…
同一設備上的不同分區:1,2…
/dev/sda1,/dev/sda5
硬盤存儲術語:
head:磁頭
track:磁道
cylinder:柱面
sector:扇區
# cat /sys/block/sda/queue/rotational # 1 為機械硬盤、0 為固態硬盤(針對於直接在物理機上裝的 Linux 可以測,虛擬機沒用)
硬盤存放單位:CHS(磁盤三圍)

每個盤片對應一個磁頭(head),每個盤片被化成多個同心圓(track/cylinder),每個同心圓被切斷成多個扇區(sector)。磁盤存儲最小單位是 sector
采用 24bit 位尋址,其中前10位表示 cylinder(柱面),中間8位表示 head(磁頭),后面6位表示 sector(扇區),最大尋址空間8GB。
LBA ( logical block addressing )
LBA 是一個整數,通過轉換成 CHS 格式完成磁盤具體尋址。
ATA-1 規范中定義了28位尋址模式,以每扇區512位組來計算,ATA-1 所定義的28位 LBA 上限達到128 GiB。2002年 ATA-6 規范采用48位 LBA,同樣以每扇區512位組計算容量上限可達128 Petabytes。
由於 CHS 尋址方式的尋址空間在大概8GB以內,所以在磁盤容量小於大概8GB時,可以使用 CHS 尋址方式或是 LBA 尋址方式,在磁盤容量大於大概8GB時,則只能使用LBA尋址方式。
2、 MBR 和 GPT 分區管理
2.1 為什么分區
優化 I/O 性能、實現磁盤空間配額限制、提高修復速度、隔離系統和程序、安裝多個 OS、采用不同文件系統
2.2 分區
兩種分區方式:MBR,GPT
1> MBR:Master Boot Record 主引導記錄,1982 年,使用 32 位表示扇區數,分區不超過2T
如何分區:按柱面
0 磁道 0 扇區:512bytes,不屬於任何分區(存取分區元數據)
446bytes:boot loader(主引導程序)
64bytes:分區表,其中每 16bytes 標識一個分區
2bytes:55AA(標記位),沒有 55AA 標記位,認為沒有分區
MBR 分區中一塊硬盤最多有 4 個主分區,也可以 3 主分區 + 1 擴展(N 個邏輯分區)
# hexdump -C -n 512 /dev/sda # 查看 sda 硬盤的前 512 字節
MBR 分區結構:
硬盤主引導記錄 MBR 由 4 個部分組成:
主引|導程序,偏移地址 0000H--0088H , 它負責從活動分區中裝載,並運行系統引導程序;
出錯信息數據區,偏移地址 0089H--00E1H 為出錯信息,00E2H--01BDH 全為 0 字節;
分區表(DPT,Disk Partitioln Table)含 4 個分區項,偏移地址 01BEH--01FDH,每個分區表項長 16 個字節,共 64 字節為分區項 1、分區項 2、 分區項 3、分區項 4;
結束標志字,偏移地址 01FE--01FF 的 2 個字節值為結束標志 55AA。

備份分區表:
# hexdump -C -n 512 /dev/sda # 查看 sda 硬盤的前 512 字節 # dd if=/dev/sda of=/data/dpt bs=1 count=66 skip=446 # 備份分區表(skip 表示跳過 if、seek 跳過 of) # hexdump -C /data/dpt # 查看備份分區表 # dd if=/dev/zero of=/dev/sda bs=1 count=2 seek=510 # 將 55aa 位清空,模擬破壞分區表 # hexdump -C -n 512 /dev/sda # 查看 sda 硬盤的前 512 字節,發現已經更改 # fdisk -l /dev/sda # 查看硬盤分區信息 # lsblk # 查看內存分區表 dd if=/data/dpt of=/dev/sda bs=1 count=2 skip=64 seek=510 # 恢復 55aa 位
2> GPT 分區:
GPT:GUID ( Globals Unique Identifiers ) partition table 支持 128 個分區,使用 64 位,支持 8Z ( 512Byte/block ) 64Z ( 4096Byte/block )
使用 128 位 UUID(Universally Unique Identifier)表示磁盤和分區 GPT 分區表,自動備份在頭和尾兩份,並有 CRC 校驗位 uuidgen,生成 UUID。
UEFI (Unified Extensible Firmware Interface 統一可擴展固件接口)硬件支持 GPT,使操作系統啟動。

BIOS+MBR 和 UEFI+GPT:

2.3 管理分區
列出塊設備:lsblk
創建分區使用:
fdisk 創建 MBR 分區
gdisk 創建 GPT 分區
parted 高級分區操作
重新設置內存中的內核分區表版本
Partprobe
添加硬盤,創建分區:
不重啟電腦識別新添加的硬盤(echo ‘- - -’ > /sys/class/scsi_host/host2/scan)
[root@centos6 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 4.2G 0 rom sda 8:0 0 20G 0 disk [root@centos6 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan # 觸發磁盤掃描 [root@centos6 ~]# lsblk # 列出所有可用塊設備的信息 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 4.2G 0 rom sda 8:0 0 20G 0 disk sdb 8:16 0 20G 0 disk
parted 命令:parted 的操作都是實時生效的,小心使用
用法:parted [選項]…[設備 [命令 [參數]…]] parted /dev/sdb mklabel gpt|msdos # 創建 GPT 或 MBR 分區 parted /dev/sdb print # 打印分區表 parted /dev/sdb mkpart primary 1 200(默認 M) # mkpart:分區;primary:全是主分區;起始點和結束點(默認 M) parted /dev/sdb rm 1 # 刪除分區 parted -l # 列出分區信息
分區工具 fdisk 和 gdisk
分別為 MBR 和 GPT 格式的分區工具
# 子命令: p 列出分區列表 t 更改分區類型(默認 83,swap 82) n 創建新分區 d 刪除分區 v 校驗分區 u 轉換單位 fdisk -u=cylinders /dev/sdb(更改為以扇區分區) w 保存並退出 q 不保存退出
# 查看分區的方式: cat /proc/partitions lsblk fdisk -l /dev/sdb # 看到的是真正硬盤的分區表,其他三項看的是內存 ll /dev/sdb* 划分分區、更改分區要同步信息到硬盤:(新硬盤分區不會有,舊硬盤更改分區注意 warning) centos6:
partx -a /dev/sda # 增加分區 partx -d --nr 6 /dev/sda # 刪除分區 centos5,7:
partprobe
使用 dd 命令克隆分區表(只能克隆主分區、擴展分區,邏輯分區不能克隆) 使用 dd 命令清空硬盤標記位 數字越小,在越外圈,可以提高優化!
3、 管理文件系統
3.1 文件系統
文件系統是操作系統用於明確存儲設備或分區上的文件的方法和數據結構,即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件結構稱為文件管理系統,簡稱文件系統。
從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,安全控制,日志,壓縮,加密等。
3.2 Linux 文件系統類型:
支持的文件系統: /lib/modules/`uname -r`/kernel/fs df -T # 查看文件系統類型
ext2:適用於那些分區容量不是太大,更新也不頻繁的情況,例如 /boot 分區;
ext3:是 ext2 的改進版本,其支持日志功能,能夠幫助系統從非正常關機導致的異常中恢復。它通常被用作通用的文件系統;
ext4:是 ext 文件系統的最新版。提供了很多新的特性,包括納秒級時間戳、創建和使用巨型文件(16TB)、最大 1EB 的文件系統,以及速度的提升;
SGI 的 xfs:支持最大 8EB 的文件系統。
其他文件系統:btrfs ( Oracle ),reiserfs,jfs ( AIX ),swap
光盤:iso9660
Windows:FAT32,exFAT,NTFS
Unix:FFS ( fast ),UFS ( unix ),JFS2
網絡文件系統:NFS,CIFS
集群文件系統:GFS2,OCFS2 ( oracle )
分布式文件系統:fastdfs,ceph,moosefs,mogilefs,glusterfs,Lustre
RAW:未經處理或者未經格式化產生的文件系統
3.3 創建文件系統
文件系統分類:
根據是否支持 “journal” 日志功能:
日志型文件系統:ext3,ext4,xfs…
非日志型文件系統:ext2,vfat
文件系統的組成部分:
內核中的模塊:ext4,xfs,vfat
用戶空間的管理工具:mkfs.ext4,mkfs.xfs,mkfs.vfat
Linux 的虛擬文件系統:VFS
間接的訪問各個文件系統
查看支持的文件系統:cat /proc/filesystems

創建文件系統:
mkfs 命令: mkfs.[ext3|ext4|xfs…] /dev/device 例:
mkfs.xfs /dev/sdb1 # 將/dev/sdb1 創建為 xfs 的文件系統格式
mkfs -t [ext3|ext4|xfs…] /dev/device -L 'LABEL' # 設定卷標名 blkid /dev/device # 查看文件系統類型
創建 ext 文件系統:
mke2fs:ext 系列文件系統專用管理工具 -t [ext2|ext3|ext4] 指定文件系統類型 -b [1024|2048|4096] 指定塊大小為 1K,2K,4K 每創建一個文件不論大小以塊為單位分配
-L 'LABEL' 設置卷標名 -f 重新格式化 -j 相當於 -t ext3 mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3 -i 為數據空間中每多少個字節創建一個 inode,不應該小於 block 大小 -N 指定分區中創建多少個 inode -I 一個 inode 記錄占用的磁盤空間大小,128—4096 -m 指定為管理員預留的空間,默認為 5% -O FEATURE 啟用指定特性 -O ^FEATURE 關閉指定特性
把連續的塊組合成組,每個組有自己節點表
文件系統標簽:
指向設備的另一種方法,與設備無關 blkid:塊設備屬性信息查看 -U UUID 根據指定的 UUID 來查找對應的設備 -L LABEL 根據指定的 LABEL 來查找對應的設備 e2label:管理 ext 系列文件系統的 LABEL e2label /dev/device [LABEL] # 指定卷標名 findfs:查找分區 findfs UUID=XXX findfs LABEL=XXX
超級塊和 INODE TABLE:
tune2fs:重新設定 ext 系列文件系統可調整參數的值 -l 查看指定文件系統超級塊信息;super block -L 'LABEL' 修改卷標名 -m 修改預留給管理員的空間百分比 -j 將 ext2 升級為 ext3 -O 文件系統屬性啟用或禁用,-O ^has_journal(啟用日志) -o 調整文件系統的默認掛載選項,-o ^acl -U UUID 修改 UIID 號(UUID 使用 uuidgen 命令生成)
dumpe2fs:顯示 ext 文件系統信息,將磁盤分組管理 -h 查看超級塊信息,不顯示分組信息相當於 tune2fs -l
xfs_info:顯示已掛載的文件系統信息
文件系統故障常發生於死機或非正常關機,掛載為文件系統標記 "no clean"
注意:一定不要在掛載狀態下執行修復!
fsck.FS_TYPE fsck -t FS_TYPE 注意:FS_TYPE 一定要與分區上文件類型相同 -a 自動修復 -r 交互式修復錯誤
e2fsck:ext 系列文件專用的檢測修復工具 -y 自動回答為 yes -f 強制修復 -p 自動進行安全的修復文件系統問題
xfs_repair:xfs 文件系統專用檢測修復工具 -f 修復文件,設備不修復 -n 只檢查 -d 允許修復只讀的掛載設備,在單用戶下修復時使用,然后立即 reboot
4、掛載設備
4.1 掛載 mount、卸載 umount
掛載:將額外文件系統與根文件系統某現存的目錄建立起關聯關系,進而使得目錄作為其他文件訪問入口的行為
卸載:為解除此關聯關系的過程
掛載點下原有文件在掛載完成后會被臨時隱藏,掛載點目錄一般為空。
偽文件系統名稱:proc,sysfs,devtmpfs,configfs
mount device dir device:指明要掛載的設備 dir:掛載點 事先存在,建議使用空目錄 進程正在使用的設備無法被卸載 默認掛載可讀可寫
mount -r:只讀掛載
mount -o remount,[rw|ro]:取消掛載
/etc/mtab # 掛載信息實時更新 mount -L 'LACEL' /mnt/sdb1 # 以卷標的方式掛載 mount -U 'UUID' # 以 UUID 掛載 -B 綁定目錄到另一個目錄上 -t 指明要掛載的設備上的文件系統類型(默認不用寫) -r readonly 只讀掛載 -w read and write 讀寫掛載 -n 不更新/etc/mtab,mount 不可見 隱藏掛載,centos7 不支持 -a 自動掛載所有支持自動掛載的設備(定義在了/etc/fstab 文件中,且掛載選項中有 auto 功能)
查看內核追蹤到的已掛載的所有設備: cat /proc/mounts 同一掛載點同一時間只能掛載一個;可以將一個設備掛載到多個掛載點。 也可以將文件掛載至文件夾(將文件先格式化成特定的文件系統)centos6 上掛載時要加 -o loop 選項 相當於 U 盤 losetup -a # 顯示 loop 設備分配 ls /dev/loop* # 顯示 loop 設備 brw-rw----. 1 root disk 7, 0 2 月 13 11:23 /dev/loop0 brw-rw----. 1 root disk 7, 1 2 月 13 11:23 /dev/loop1 brw-rw----. 1 root disk 7, 2 2 月 13 11:23 /dev/loop2 …… centos 6 只有 0-7 8 個設備,centos7 沒限制 mknod /dev/loop100 b 7 100 # 臨時創建設備,100 是編號 編輯/boot/grub/grub.conf 文件,再 kernel 后加上 max_loop=100,重啟生成 100 個 loop 設備 losetup /dev/loop66 /data/disk # 關聯 loop 設備再掛載
4.2 mount 常用選項
-o options : (掛載文件系統的選項),多個選項使用逗號分隔 async異步模式 sync同步模式,內存更改時,同時寫磁盤 atime/noatime 包含目錄和文件 diratime/nodiratime 目錄的訪問時間戳 auto/noauto 是否支持自動掛載,是否支持-a選項 exec/noexec 是否支持將文件系統上運行應用程序 dev/nodev 是否支持在此文件系統上使用設備文件 suid/nosuid 是否支持suid和sgid權限 remount 重新掛載 ro只讀 rw讀寫 user/nouser 是否允許普通用戶掛載此設備,/etc/fstab 使用 acl 啟用此文件系統上的ac|功能 loop 使用loop設備 defaults:相當於rw, suid, dev, exec, auto, nouser, async
4.3 持久掛載和 swap 空間管理
fuser 可以顯示出當前哪個程序在使用磁盤上的某個文件、掛載點、甚至網絡端口,並給出程序進程的詳細信息。
fuser 顯示使用指定文件或者文件系統的進程 ID。
# yum install psmisc -y # 安裝 fuser # fuser -v /mnt/sdb1 # 查看誰正在使用該文件夾,請進一步了解 fuser 命令的用法 /mnt/sdb1: root kernel mount /mnt/sdb1 root 1245 ..c.. bash # fuser -km /mnt/sdb1 # 強制殺掉該目錄使用的用戶進程
查看掛載情況:
# findmnt /mnt/sdb1 # df 顯示不了隱藏的掛載,使用 findmnt 查詢該目錄是否為掛載點 # 查看正在訪問指定文件系統的進程: # lsof /boot # 也能看到是否有人使用該目錄(掛載點) # fuser -v /mnt/sdb1 # 也可以
# 終止所有正在指定的文件系統的進程: # fuser -km /mnt/sdb1
掛載點和 /etc/fstab
配置文件系統體系
被 mount、fsck 和其他程序使用
系統重啟時保留文件系統體系
可以在設備欄使用文件系統卷標
文件掛載配置文件:
/etc/fstab 每行定義一個要掛載的文件系統
要掛載的設備或偽文件系統:
設備文件:LABEL:LABEL=卷標名
UUID:UUID=uuid
偽文件系統名稱:proc,sysfs
掛載點
文件系統類型:ext4,xfs,iso9660,nfs,none
掛載選項:defaults,acl,bind
使用 mount -a 命令掛載 /etc/fstab 中的所有文件系統,使配置文件生效
轉儲頻率:0:不做備份 1:每天轉儲 2:每隔一天轉儲
fsck 檢查的文件系統的順序:0:不自檢 1:首先自檢 2:非 rootfs 使用
注意:mount -a 針對於剛掛載的,加載使生效;對於已經掛載的,更改屬性值后使用 mount -a 不管用,使用 mount -o remount /mnt/sdb1。
處理交換文件和分區:
swap 交換分區是系統 RAM 的補充,swap 分區支持虛擬內存,當沒有足夠的RAM 保存系統處理的數據時會將數據寫入 swap 分區。
當系統缺乏 swap 空間時,內核會因 RAM 內存耗盡而終止進程。配置過多 swap 空間會造成存儲設備處於分配狀態但閑置,造成浪費,過多 swap 空間還會掩蓋內存泄露。
推薦系統 swap 空間:

設置增加 swap 大小,至於磁盤外側(訪問快)
1.新添硬盤,分區 1(於磁盤外側);分配大小完畢,t 82 設置 swap 格式分區。 2.mkswap /dev/sdc1 # 格式化(swap 格式使用 mkswap 格式化) 3.寫入/etc/fatab 文件,swap 掛載到 swap;默認值更改為 pri=10(優先級) 4.swapon -a # 使 swap 格式配置文件生效 5.swapon -s # 相當於 cat /proc/swaps,查看 swap 分區信息
swapoff /dev/sdc1 # 關閉 swapon -a 開啟 free -h # 查看內存和 swap 信息 增加文件 swap 分區,dd 設置大文件(swap 只能寫文件名),刪除的話:關閉,改文件
swap 的優先級:
可以指定 swap 分區 0到32767 的優先級,值越大優先級越高。
如果用戶沒有指定,那么核心會自動給 swap 指定一個優先級,這個優先級從-1開始,每加入一個新的沒有用戶指定優先級的 swap,會給這個優先級減一。
先添加的 swap 的缺省優先級比較高,除非用戶自己指定一個優先級,而用戶指定的優先級(是正數)永遠高於核心缺省指定的優先級(是負數)。
優化性能:分布存放,高性能磁盤存放。
文件夾掛載文件夾:
文件類型:none bind 0 0
掛載光盤:
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
掛載網絡服務:nfs,samba
遷移 home 目錄到新分區:
建議 init 1 進入單用戶模式,防止別人正在使用文件(要確保別人不訪問)
新建 /mnt/home 目錄,將新分區(格式化)掛載至該目錄
cp -a /home/. /mnt/home/
再將新分區掛載到 /home 目錄
4.4 移動介質
掛載意味着使外來的文件系統看起來如同是主目錄樹的一部分
訪問前,介質必須被掛載
摘除時,介質必須被卸載
按照默認設置,非根用戶只能掛載某些設備(光盤、DVD、軟盤、USB 等)
掛載點通常在 /media 或 /mnt 下
使用光盤:
在圖形環境下自動啟動掛載 /run/media/<user>/<label> 否則必須手動掛載:
mount /dev/cdrom /mnt/cdrom
操作光盤:
eject 彈出光盤 eject -t 彈入光盤
創建 ISO 文件:
# cp /dev/cdrom /root/centos.iso # mkisofs -r -o /root/etc.iso /etc # /將/etc 目錄打包成 iso 文件
掛載 ISO 文件(ISO 文件只讀)
刻錄光盤:
wodim -v -eject centos.iso
掛載 USB 介質
# lsusb # 查看 USB 設備是否識別 # lsmod # 查看正在使用的內核 被內核探測為 SCSI 設備 /dev/sdaX、/dev/sdbX 或類似的設備文件 在圖形環境中自動掛載: 圖標在[計算機]窗口創建 掛載/run/media/<user>/<label> 手動掛載: # mount /dev/sdb1 /mnt
4.5 常見工具
文件系統空間占用等信息的查看工具:
df [OPTION]… [FILE]… -H 以 10 為單位 -T 文件系統類型 -h human-readable -i inodes instead of blocks -P 以 Posix 兼容的格式輸出
查看某目錄總體空間占用狀態:
du [OPTION]… DIR -h human-readble -s summary -max-depth=# 指定最大目錄層級
dd 命令:convert and copy a file(轉換並復制文件)
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=# if=file 從所命令文件讀取而不是從標准輸入 of=file 寫到所命令的文件而不是到標准輸出 ibs=size 一次讀 size 個 byte obs=size 一次寫 size 個 byte bs=size block size,指定塊大小(即是 ibs 也是 obs) cbs=size 一次轉化 size 個 byte skip=blocks 從開頭忽略 blocks 個 ibs 大小的塊 seek=blocks 從開頭忽略 blocks 個 obs 大小的塊
count=n 復制 n 個 bs
echo {0..9} | tr -d ' ' > /test/f1.txt echo {a..z} | tr -d ' ' > /test/f2.txt dd if=/test/f1.txt of=/test/f2.txt bs=1 skip=2 seek=3 count=4 cat /test/f2.txt abc2345 # 默認截斷之后的數,要想不截斷使用 conv echo {a..z} | tr -d ' ' > /test/f2.txt dd if=/test/f1.txt of=/test/f2.txt bs=1 skip=2 seek=3 count=4 conv=notrunc cat /test/f2.txt abc2345hijklmnopqrstuvwxyz conv= conversion[,conversion...] 用指定的參數轉換文件 轉換參數: ascii 轉換 EBCDIC 為 ASCII ebcdic 轉換 ASCII 為 EBCDIC Icase 把大寫字符轉換為小寫字符 ucase 把小寫字符轉換為大寫字符 nocreat 不創建輸出文件 noerror 出錯時不停止 notrunc 不截短輸出文件 sync 把每個輸入塊填充到 ibs 個字節,不足部分用空(NUL)字符補齊 fdatasync 寫完成前,物理寫入輸出文件
使用 dd 命令備份 MBR 分區表:
# 使用 dd 命令備份 MBR 分區表:
# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
# 破壞 MBR 中的 bootloader # dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
# 備份: # dd if=/dev/sdx of=/dev/sdy # 將本地的/dev/sdx 整盤備份到/dev/sdy # dd if=/dev/sdx of=/path/to/image # 將/dev/sdx 全盤數據備份到指定路徑的 image 文件 # dd if=/dev/sdx | gzip > /path/to/image.gz # 備份/dev/sdx 全盤數據,並利用 gzip 壓縮,保存到指定路徑 # 恢復: # dd if=/path/to/image of=/dev/sdx # 將備份文件恢復到指定盤 # gzip -dc /path/to/image.gz | dd of=/dev/sdx # 將壓縮的備份文件恢復到指定盤 # 拷貝內存資料到硬盤 # dd if= /dev/mem of=/root/mem.bin bs= 1024 # 將內存里的數據拷貝到 root 目錄下的 mem.bin 文件
# 從光盤拷貝 iso 鏡像 dd if= /dev/cdrom of=/root/cd.iso # 拷貝光盤數據到 root 文件夾下,並保存為 cd.iso 文件
# 銷毀磁盤數據 dd if=/dev/urandom of=/dev/sda1 利用隨機的數據填充硬盤,在某些必要的場合可以用來銷毀數據,執行此操作以后,/dev/sda1 將無法掛載,創建和拷貝操作無法執行。
