Linux文件系統和磁盤管理
磁盤管理方案
目前主要有兩種磁盤管理的方案
-
MBR管理方案:
主引導記錄(Master Boot Record , MBR)是指一個存儲設備的開頭 512 字節。它包含操作系統的引導器和存儲設備的分區表。在MBR解決方案中由於分區表的大小限制導致只能有四個主分區或者三個主分區加一個擴展分區 (以及在擴展分區中的任意數量的邏輯分區)。如果你有三個主分區加一個擴展分區以及除此之外的空閒空間,在空閒空間之上你無法創立分區,傳統的linux磁盤管理方案裏都是以MBR爲主。
-
GPT管理方案:
全局唯一標識分區表(GUID Partition Table,縮寫:GPT)是一個實體硬盤的分區表的結構佈局的標準,是新一代的分區表格式。它是統一可擴展固件接口標準的一部分,它使用全局唯一標識來標識設備。GPT爲每個分區提供了一個唯一硬盤 GUID 和一個唯一分區 GUID - 一個好的不依賴文件系統的引用分區和硬盤的方式。他可以任意分區數,取決於給分區表分配的空間,不需要擴展和邏輯分區。GPT ,默認包含了定義128個分區的空間。當用戶想要更多分區時,他可以給分區表分配更多空間 (目前只有 gdisk 支持這一特性)。
-
選擇管理方式注意事項:
如果使用GRUB legacy作爲bootloader,必須使用MBR。
如果使用 UEFI 而不是BIOS,並且雙啓動中包含 Windows 64位版,必須使用GPT。
非常老的機器需要使用 MBR,因爲 BIOS 可能不支持 GPT。
磁盤管理的指令
-
fdisk:用於顯示硬盤使用情況、執行分區操作等,適用於MBR管理方案
常用指令: a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition # 刪除一個分區 l list known partition types m print this menu n add a new partition # 新增一個分區 o create a new empty DOS partition table p print the partition table # 在屏幕上顯示分區信息 q quit without saving changes # 不將變更後信息保存下來 s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit # 將信息保存至分區表中 x extra functionality (experts only) 注意:創建邏輯分區前必須創建擴展分區,且擴展分區不能直接投入使用。
-
gdisk:適用於GPT管理方案
常用指令: 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 #不保存退出 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 # 保存退出 x extra functionality (experts only) ? print this menu
文件系統
操作系統中負責管理和存儲文件信息的部分稱爲文件管理系統,簡稱文件系統。從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。大部分UNIX文件系統種類具有類似的通用結構,即使細節有些變化。
核心概念:
- 超級塊superblock:超級塊包括文件系統的總體信息,比如大小(其準確信息依賴文件系統)
- inode:inode包括除了名字外的一個文件的所有信息,名字與inode數目一起存在目錄塊中,目錄條目包括文件名和文件的inode數目。inode包括幾個數據塊的數目,用於存儲文件的數據。inode中只有少量數據塊數的空間,如果需要更多,會動態分配指向數據塊的指針空間。這些動態分配的塊是間接塊;爲了找到數據塊,這名字指出它必須先找到間接塊的號碼。
- 數據塊data block:實際存放數據的位置。
- 目錄塊directory block,和間接塊indirection block
常用指令:du,df,mkfs,fsck,mount,umount,blkid
涉及文件:/etc/fstab 記錄開機自動掛載信息
du和df用法:
[root@rhel6 ~]# df -h # 查看磁盤空間情況
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_rhel6-LogVol01 17G 3.0G 13G 19% /
tmpfs 499M 72K 499M 1% /dev/shm
/dev/vda1 477M 58M 390M 13% /boot
/dev/mapper/vg_rhel6-LogVol00 380M 2.3M 354M 1% /home
[root@servera ipython-0.13.1]# df -i # 查看inode使用情況
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda1 10484096 41152 10442944 1% /
devtmpfs 58324 293 58031 1% /dev
tmpfs 62628 1 62627 1% /dev/shm
tmpfs 62628 319 62309 1% /run
tmpfs 62628 13 62615 1% /sys/fs/cgroup
172.25.254.250:/content 117569536 149932 117419604 1% /mnt
[root@rhel6 ~]# du -sh /var/ # 統計文件或目錄實際佔用空間情況,-s 代表求和
138M
mkfs用法:
[root@rhel7 ~]# mkfs.xfs /dev/vdb1 # 用以對磁盤或分區創建文件系統(格式化)
meta-data=/dev/vdb1 isize=256 agcount=4, agsize=655296 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=2621184, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
mount用法:
mount [-fnrsvw] [-t vfstype] [-o options] device dir # 提供給磁盤設備文件一個入口的目錄
舉例:
[root@rhel7 ~]# mount -t xfs /dev/vdb1 /test # 標準用法
[root@rhel7 ~]# mount -o ro,remount /dev/vdb1 /test # 以ro的方式重新掛載,默認rw
[root@rhel7 ~]# mount -o loop rhel-server-6.5-x86_64-dvd.iso /test # 以本地迴環設備掛接特殊文件
[root@rhel7 ~]# mount # 用來查看當前掛接情況
/dev/mapper/vg_rhel7-LogVol01 on / type xfs (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/vda1 on /boot type ext4 (rw)
/dev/mapper/vg_rhel6-LogVol00 on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
umount用法:
umount [-dflnrv] {dir|device}... # 取消目錄和設備文件的對應關係
[root@rhel7 ~]# umount /test
blkid用法:
blkid -p [-O offset] [-o format] [-S size] [-s tag] [-n list] [-u list] device ... # 用以顯示文件系統信息
[root@servera ipython-0.13.1]# blkid /dev/vda1
/dev/vda1: UUID="e2a34bd8-5f19-4dae-ad8b-e98560bffbac" TYPE="xfs"
/etc/fstab文件管理方法:
寫在該文件中的掛接信息會在服務器開啓時自動完成。
[root@foundation0 ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Jul 23 20:30:13 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=6039c222-d258-419f-b309-25b48a9b47c7 / xfs defaults 0 0
# 設備 掛載點 文件系統類型 選項 是否備份 是否檢測
UUID=c6feca1f-487b-4740-be24-3d8414fa1483 swap swap defaults 0 0
/content/rhel7.2/x86_64/isos/rhel-server-7.2-x86_64-dvd.iso /content/rhel7.2/x86_64/dvd iso9660 loop,ro 0 0
/content/rhel7.1/x86_64/isos/rhel-server-7.1-x86_64-dvd.iso /content/rhel7.1/x86_64/dvd iso9660 loop,ro 0 0
/content/rhel6.5/x86_64/isos/rhel-server-6.5-x86_64-dvd.iso /content/rhel6.5/x86_64/dvd iso9660 loop,ro 0 0
/content/rhel7.0/x86_64/isos/rhel-server-7.0-x86_64-dvd.iso /content/rhel7.0/x86_64/dvd iso9660 loop,ro 0 0
lvm管理方案
邏輯卷管理器則是在磁盤分區與文件系統之間添加的邏輯層,提供一個抽象的卷組,使得管理者可以忽略底層磁盤佈局,從而實現對分區的靈活動態調整,目前建議啓用 LVM(Logical Volume Manager) 機制。
關鍵詞:
- 物理卷(PV,Physical Volume ):整個硬盤設備或使用 fdisk 命令建立的硬盤分區。
- 卷組(VG,Volume Group ) :由一個或多個物理卷(PV)組成的整體
- 邏輯卷(LV,Logical Volume ):;從卷組(VG)出切割出的空間來用於創建文件系統,大小由 PE 的個數決定。
常用指令
指令 | 含義 |
---|---|
pvcreate | 創建物理卷 |
pvremove | 刪除物理卷 |
vgcreate | 創建卷組 |
vgextend | 擴展卷組 |
vgreduce | 縮小卷組 |
vgremove | 刪除卷組 |
lvcreate | 創建邏輯卷 |
lvextend | 擴展邏輯卷 |
lvreduce | 縮小邏輯卷 |
lvremove | 刪除邏輯卷 |
pvmove | 遷移pv的數據 |
pvs | pvdisplay | 查看pv狀態 |
vgs | vgdisplay | 查看vg狀態 |
lvs | lvsdisplay | 查看lv狀態 |
舉例:
[root@iscsi1-f15 ~]# fdisk /dev/vdb --->vdb[123] 100M
[root@iscsi1-f15 ~]# pvcreate /dev/vdb[123]
[root@iscsi1-f15 ~]# vgcreate myvg /dev/vdb[123]
[root@iscsi1-f15 ~]# lvcreate -L 20M myvg -n lv1-linear
[root@iscsi1-f15 ~]# lvcreate -L 60M myvg -n lv2-linear
[root@iscsi1-f15 ~]# mkfs.ext4 /dev/myvg/lv1-linear
[root@iscsi1-f15 ~]# mkfs.ext4 /dev/myvg/lv2-linear
[root@iscsi1-f15 ~]# mount /dev/myvg/lv1-linear /opt/lv1
[root@iscsi1-f15 ~]# mount /dev/myvg/lv2-linear /opt/lv2
[root@iscsi1-f15 ~]# lvextend -L +60M /dev/myvg/lv1-linear
[root@iscsi1-f15 ~]# lvextend -L +30M /dev/myvg/lv2-linear
[root@iscsi1-f15 ~]# resize2fs /dev/myvg/lv1-linear
[root@iscsi1-f15 ~]# resize2fs /dev/myvg/lv2-linear
[root@iscsi1-f15 ~]# pvcreate /dev/vdb[45]
[root@iscsi1-f15 ~]# vgextend myvg /dev/vdb[45]
[root@iscsi1-f15 ~]# pvmove /dev/vdb1 /dev/vdb4
[root@iscsi1-f15 ~]# pvmove /dev/vdb2 /dev/vdb4
[root@iscsi1-f15 ~]# pvmove /dev/vdb4 /dev/vdb5
[root@iscsi1-f15 ~]# dmsetup table|grep myvg
lvm故障案例
故障描述:
在雲上需要擴展磁盤,由於雲系統支持原盤擴容,原來1T的磁盤直接擴展成2T。原環境中整盤做成pv,執行fdisk的時候識別到了2T,但是pv依舊爲1T,如何擴容lvm。
解決方法
pvresize $PVNAME # 讓pv重新識別磁盤
LVM實戰案例:
使用LVM 的Snapshot功能實現備份:
構建步驟:
# 根據當前的LVM構建Snapshot
lvcreate -L 1G -n lv-data-backup -s /dev/mapper/vgtest-lvtest
# 將snapshot後的設備掛載起來
mount -o nouuid /dev/vgtest/lv-data-backup /lvbackup/
# 針對該目錄進行壓縮備份操作
tar -czf /tmp/test.tgz /lvbackup
Swap使用
作用:
Swap分區在系統的物理內存不足的時候,把硬盤中的一部分空間釋放出來,以供當前運行的程序模擬成內存去使用,通常Swap空間的大小應是物理內存的2倍左右,但根據不同的應用,需採取不同的配置方案。
每個進程都有獨立的虛擬地址空間,進程訪問的虛擬地址並不是真正的物理地址。
虛擬地址可通過每個進程上的頁表(在每個進程的內核虛擬地址空間)與物理地址進行映射,獲得真正物理地址。
如果虛擬地址對應物理地址不在物理內存中,則產生缺頁中斷,真正分配物理地址,同時更新進程的頁表;如果此時物理內存已耗盡,則根據內存替換算法淘汰部分頁面至物理磁盤中。
構建swap的方法:
# 將分區構建爲swap:mkswap [options] device [size]
# 啓用swap:swapon [-d] [-f] [-p priority] [-v] specialfile...
# 停用swap:swapoff [-v] specialfile...