Linux存储管理
一. 存储概览
1.1 从磁盘的工作原理上分类磁盘
机械磁盘 HDD
固态磁盘 SSD
1.2 从插拔方式上分类磁盘
热插拔
非热插拔
1.3 从硬盘接口上分类磁盘
IDE-SATA(串行ATA)
SCSI-SAS(串行SCSI)
PCIE接口
FC光纤接口
1.4 从连接方式上分类
本地存储
外部存储
网络存储
1.5 从分区方式区分
1.5.1 MBR
# MBR是MSDOS;
# 兼容windows的MBR(Master boot record);
# 只能处理小于2TB的磁盘;
# 用fdisk工具分区;
# 最多只能有14个分区(4个主分区,扩展分区,逻辑分区);
# 磁盘的第一扇区,第一扇区有512bytes,存放两类数据:MBR和分区表
# MBR: 安装有开机管理程序,占446bytes
# 分区表: 记录整颗磁盘分区的状态,占64bytes
## 由于分区表只有64bytes,所以只能最多有四组记录区(每个记录占用16bytes),每组记录区记录了该区段的起始和结束扇区号码;
## 所以每块磁盘只能有四个分区槽;
## 这四个分区槽是主分区Primary和扩展分区Extended;
# 每个分区的前面都有一个启动扇区,用于存放操作系统的启动程序;
# 扩展分区的前面有一个扩展分区启动记录区占用多个扇区,用于存放里面的所有逻辑分区的起止扇区号码;
# 扩展分区不能格式化,只能再分成若干个逻辑分区槽;
# 扩展分区利用多个扇区来记录逻辑分区信息,由于是用多个扇区来记录,所以支持大于4个逻辑分区;
逻辑分区的槽号是从5开始,1-4是保留给主分区和扩展分区的
P1: /dev/sda1
P2: /dev/sda2
L1: /dev/sda5
L2: /dev/sda6
L3: /dev/sda7
L4: /dev/sda8
L5: /dev/sda9
1.5.1.1 MBR中主分区、 扩展分区、逻辑分区总结
主分区和扩展分区最多有4个;
扩展分区最多只能有1个;
逻辑分区由扩展分区生;
能被格式化后使用的分区为主分区和逻辑分区; 扩展分区不能直接使用;
逻辑分区的数量由操作系统决定。
1.5.2 GPT(GUID partition table)
# 可以处理大于或小于2TB的磁盘;
# 在CentOS6中用parted工具分区;在CentOS7中用gdisk工具分区;
# 最多只能有128个分区;没有扩展分区和逻辑分区的概念,都是主分区
# GPT将磁盘所有区块以LBA来规划;
# LBA:Logical Block Address ,预设每个LBA为512bytes,第一个LBA称为LBA0;
# GPT使用前面的34个LBA;除此之外还使用了最后的33个LBA做备份;
# GPT分区中没有主分区、扩展分区、逻辑分区的概念,每个分区都能使用;
# 磁盘管理程序中fdisk不识别GPT分区;gdisk和parted可以识别;
# grub第一版不识别GPT
LBA0: 与MBR兼容。这个LBA0区块也分两部分,第一部分是和MBR 相似的446bytes块区,存储了第一阶段的开机管理程序;第二部分放置了一个特殊标志的分区用来表示此块磁盘为GPT分区格式磁盘,不能识别GPT分区表的磁盘管理程序是不能修改此分区信息的
LBA1: 记录GPT分区表的表头数据,内容为:分区表本身的位置和大小;备份GPT(最后34个LBA区块)放置的位置;放置了分区表检验机制码CRC32,操作系统根据这个码来判断GPT是否正确,如果错误,从备份GPT恢复。
LBA2-33: 实际记录分区信息的地方,每个LBA可以记录4个分区槽信息,所以一共可以有128个分区槽
二. 基本分区
2.1 磁盘设备相关命令
lsblk: 查看系统中所有块设备文件
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─rhel-root 253:0 0 44G 0 lvm /
└─rhel-swap 253:1 0 5G 0 lvm [SWAP]
sdb 8:16 0 30G 0 disk
sr0 11:0 1 6.6G 0 rom /media/cdrom
fdisk -l 或 gdisk -l: 查看磁盘的分区情况
[root@localhost ~]# fdisk -l /dev/sda
Disk /dev/sda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x42a80f85
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 2099199 2097152 1G 83 Linux
/dev/sda2 2099200 104857599 102758400 49G 8e Linux LVM
blkid:查看分区的UUID、文件系统类型
[root@localhost ~]# blkid
/dev/mapper/rhel-root: UUID="75619499-06fa-49f8-be42-2361d4d16a34" TYPE="xfs"
/dev/sda2: UUID="OuQG8H-ct9i-AXcl-9o3q-HTYB-THas-CQIbfA" TYPE="LVM2_member" PARTUUID="42a80f85-02"
/dev/sda1: UUID="fc4dfa98-1c5f-4d77-9df2-04dae5a25ad4" TYPE="xfs" PARTUUID="42a80f85-01"
/dev/sdb1: PARTUUID="789b7cc8-01"
/dev/sdb5: PARTUUID="789b7cc8-05"
/dev/sr0: UUID="2019-04-04-08-40-23-00" LABEL="RHEL-8-0-0-BaseOS-x86_64" TYPE="iso9660" PTUUID="0da1aba4" PTTYPE="dos"
/dev/mapper/rhel-swap: UUID="53373187-9792-4c44-be3a-5d12e45ae6fb" TYPE="swap"
2.2 管理基本分区的步骤
- 添加新磁盘设备
- 用MBR或GPT将磁盘分区
- 将各个可用分区格式化为ext3,ext4,xfs等文件系统
- 将格式化好的分区挂载
2.3 用fdisk工具将磁盘设备做MBR格式分区
MBR分区可分14个区(4个主分区,扩展分区,逻辑分区)
一块新磁盘的分区、格式化、挂载步骤:
- 分区:fdisk /dev/sdb
- 分完区后,要用这个命令让内核重新加载一下分区表,才能在/dev目录里找到新分区文件:partprobe /dev/sdb
2.4 用gdisk工具将磁盘设备做GPT格式分区
GPT 128个主分区
- 分区: gdisk /dev/sdc
- partprobe /dev/sdc
2.5 格式化分区后的分区
有两个命令可用:
- mkfs.xxx
- mkfs -t xxx
# mkfs.ext4 /dev/sdb1
# mkfs -t xfs /dev/sdb5
2.6 挂载
2.6.1 手动挂载
# mkdir /tmp/test1/
# mount -t ext4 -o rw /dev/sdb1 /tmp/test1/
# umount /dev/sdb1
2.6.2 永久挂载
写入/etc/fstab
然后重新启动系统或执行mount -a加载所有/etc/fstab中的挂载
三. 交换分区
3.1 交换分区的作用
防止out of memory
3.2 查看交换分区
[root@localhost TestVG]# free -m
total used free shared buff/cache available
Mem: 15877 333 15163 9 380 15252
Swap: 5119 0 5119
[root@localhost TestVG]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 5242876 0 -2
3.3增加交换分区
可以用分区、LVM、文件来增加交换分区
3.3.1 用分区来做交换分区
-
创建分区
-
用mkswap命令格式化交换分区
[root@localhost ~]# mkswap /dev/sdd1
Setting up swapspace version 1, size = 5 GiB (5368705024 bytes)
no label, UUID=5e7526c8-92fb-448b-8c67-f80faec0fe2f
- 先用free -m 命令查看一下现有交换分区的容量,为5119M
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 15877 303 15259 9 314 15288
Swap: 5119 0 5119
- 用命令swapon激活这个新创建的交换分区,相当于把这个新的交换分区挂载到系统
这种方式在系统重启后就会失效;永久挂载的方式是写入fstab文件
[root@localhost ~]# swapon /dev/sdd1
- 再次用命令free -m查看交换分区容量已经扩大到了10239M
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 15877 307 15255 9 314 15284
Swap: 10239 0 10239
- 永久挂载这个交换分区
写入/etc/fstab文件
/dev/sdd1 swap swap defaults 0 0
3.3.2 用文件做交换分区
- 用dd命令创建一个文件
[root@localhost ~]# dd if=/dev/zero of=/tmp/swap.img bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 0.745026 s, 721 MB/s
-
格式化这个文件
[root@localhost ~]# mkswap /tmp/swap.img
mkswap: /tmp/swap.img: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
no label, UUID=6110dada-05e8-4466-b32d-7f10e5c9b506
[root@localhost ~]# chmod 0600 /tmp/swap.img -
挂载
[root@localhost ~]# swapon /tmp/swap.img
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 5242876 0 -2
/tmp/swap.img file 524284 0 -3
3.4 对交换分区调优
默认各个交换分区按照优先级,一个分区使用完再使用另一个分区,
可以使用相同的优先级让多个交换分区同时使用
[root@localhost ~]# reboot
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 5242876 0 1
/tmp/swap.img file 524284 0 1
四. 逻辑卷LVM
4.1逻辑卷概览
1. 由单个磁盘或单个磁盘阵列raid形成一个Physical Volume(物理卷);
2. 多个PV组成一个VG(Volume Group卷组);
3. 从VG中创建一个或多个LV(Logical Volume逻辑卷);
4. PE(Physical Extents物理扩展):PE的大小可以是4M 8M 16M 32M 64M ,这个大小是在创建VG时指定的-s 8M
5. LE(Logical Volume逻辑扩展):LE会映射到PE,不一定连续,也不一定在同一块PV上
LVM的优点:
1. 在线扩容;
2. 在线数据迁移
4.2 创建LVM
4.2.1 创建PV
可以用一个raid或磁盘或分区来做成PV
# 用整个磁盘做PV
root@localhost ~]# pvcreate /dev/sdc
# 用分区做PV
[root@localhost ~]# pvcreate /dev/sdd2
Physical volume "/dev/sdd2" successfully created.
4.2.2 查看PV
[root@localhost ~]# pvscan
PV /dev/sda2 VG rhel lvm2 [<49.00 GiB / 0 free]
PV /dev/sdc lvm2 [25.00 GiB]
Total: 2 [<74.00 GiB] / in use: 1 [<49.00 GiB] / in no VG: 1 [25.00 GiB]
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- <49.00g 0
/dev/sdc lvm2 --- 25.00g 25.00g
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name rhel
PV Size <49.00 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 12543
Free PE 0
Allocated PE 12543
PV UUID OuQG8H-ct9i-AXcl-9o3q-HTYB-THas-CQIbfA
"/dev/sdc" is a new physical volume of "25.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 25.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID q60jal-osG7-QsNe-rsIP-xM9t-RvPQ-HZv1Oq
4.2.3 创建VG
vgcreate VG名 PV名
[root@localhost ~]# vgcreate TestVG /dev/sdh1
Volume group "TestVG" successfully created
# 用-s指定VG的PE大小
[root@localhost ~]# vgcreate -s 8m TestVG1 /dev/sdg
Volume group "TestPV1" successfully created
4.2.4 查看VG
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "TestVG" using metadata type lvm2
Found volume group "rhel" using metadata type lvm2
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
TestVG 1 0 0 wz--n- <10.00g <10.00g
rhel 1 2 0 wz--n- <49.00g 0
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name TestVG
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <10.00 GiB
PE Size 4.00 MiB
Total PE 2559
Alloc PE / Size 0 / 0
Free PE / Size 2559 / <10.00 GiB
VG UUID mWfezI-tVOS-IUaz-FWud-OouC-6fEM-zpFC74
--- Volume group ---
VG Name rhel
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size <49.00 GiB
PE Size 4.00 MiB
Total PE 12543
Alloc PE / Size 12543 / <49.00 GiB
Free PE / Size 0 / 0
VG UUID 1Nhp7T-A5Rn-X4BP-MU9I-bdkN-hZtH-SfDdMb
4.2.5 创建LV
用l接LE数或用L接容量来制定LV的大小
lvcreate -l LE数 -n LV名 VG名
或
lvcreate -L 容量 -n LV名 VG名
或
lvcreate -l 50%VG -n LV名 VG名
或
lvcreate -l 50%Free -n LV名 VG名
[root@localhost ~]# lvcreate -L 100M -n lv1 TestVG
Logical volume "lv1" created.
[root@localhost ~]# lvcreate -l 50%VG -n lv3 TestVG
[root@localhost ~]# lvcreate -l 100%FREE -n lv4 TestVG
Logical volume "lv4" created.
4.2.6 查看LV
[root@localhost ~]# lvscan
ACTIVE '/dev/TestVG/lv1' [100.00 MiB] inherit
ACTIVE '/dev/rhel/swap' [5.00 GiB] inherit
ACTIVE '/dev/rhel/root' [<44.00 GiB] inherit
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv1 TestVG -wi-a----- 100.00m
root rhel -wi-ao---- <44.00g
swap rhel -wi-ao---- 5.00g
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/TestVG/lv1
LV Name lv1
VG Name TestVG
LV UUID aqqVLM-mxSx-f2ZX-2pLq-JDpX-a3pt-SgbjG3
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2021-01-20 23:47:44 +0800
LV Status available
# open 0
LV Size 100.00 MiB
Current LE 25
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/rhel/swap
LV Name swap
VG Name rhel
LV UUID NzwGhe-Wff9-9dN0-gc2a-B0SO-dsnv-bQC45d
LV Write Access read/write
LV Creation host, time localhost, 2020-12-25 18:18:18 +0800
LV Status available
# open 2
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/rhel/root
LV Name root
VG Name rhel
LV UUID s0p5FF-LD1q-Uvxo-J6mh-2EZh-qQLF-eQKH85
LV Write Access read/write
LV Creation host, time localhost, 2020-12-25 18:18:19 +0800
LV Status available
# open 1
LV Size <44.00 GiB
Current LE 11263
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
4.2.7 格式化LV并挂载
[root@localhost rhel]# mkfs.xfs /dev/TestVG/lv1
meta-data=/dev/TestVG/lv1 isize=512 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=1368, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost rhel]#
[root@localhost rhel]# mkdir /tmp/lv1
[root@localhost rhel]# vi /etc/fstab
/dev/TestVG/lv1 /tmp/lv1 auto defaults 0 0
[root@localhost rhel]# mount -a
[root@localhost rhel]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 8113900 0 8113900 0% /dev
tmpfs 8129256 0 8129256 0% /dev/shm
tmpfs 8129256 9220 8120036 1% /run
tmpfs 8129256 0 8129256 0% /sys/fs/cgroup
/dev/mapper/rhel-root 46110724 4226936 41883788 10% /
/dev/sda1 1038336 177012 861324 18% /boot
/dev/sdb5 29344772 237768 29107004 1% /tmp/test1
tmpfs 1625848 4 1625844 1% /run/user/0
/dev/mapper/TestVG-lv1 96928 6112 90816 7% /tmp/lv1
4.3 VG管理
4.3.1 扩大VG
扩大VG的本质是把新PV加入这个VG
- 先建立新的PV
[root@localhost ~]# pvcreate /dev/sde
- 扩容VG
[root@localhost ~]# vgextend TestVG /dev/sde
Volume group "TestVG" successfully extended
4.3.2 减小VG
减小VG的本质是把VG中的PV删除,但如果要删除的PV中有数据要把数据先迁移到同一VG中的其他PV
例如想减小TestVG这VG的容量,把/dev/sdh1这个PV从该VG中移除,发现/dev/sdh1中有数据,所以要先把/dev/sdh1中的数据迁移到/dev/sde中
[root@localhost ~]# pvmove /dev/sdh1
/dev/sdh1: Moved: 20.00%
/dev/sdh1: Moved: 100.00%
然后在把/dev/sdh1从TestVG中删除
[root@localhost ~]# vgreduce TestVG /dev/sdh1
Removed "/dev/sdh1" from volume group "TestVG"
4.4 LV扩容
LV扩容是先扩容LV再格式化(扩容FS)
4.4.1 LV扩容
[root@localhost ~]# lvextend -L +50m /dev/TestVG/lv1
Rounding size to boundary between physical extents: 52.00 MiB.
Size of logical volume TestVG/lv1 changed from 152.00 MiB (38 extents) to 204.00 MiB (51 extents).
Logical volume TestVG/lv1 successfully resized.
4.4.2 FS扩容
- xfs文件系统的lv用xfs_growfs命令格式化
新版操作系统xfs_growfs后要接挂载点
旧版操作系统xfs_growfs后要接文件系统
# xfs_growfs /dev/TestVG/lv1
- ext文件系统的lv用resize2fs命令格式化
# resize2fs /dev/TestVG/lv1
4.5 删除LV
- 先umount要删除的lv
[root@localhost ~]# umount /dev/mapper/TestVG-lv1
[root@localhost ~]#
- 再删除
[root@localhost ~]# lvremove /dev/TestVG/lv1
Do you really want to remove active logical volume TestVG/lv1? [y/n]: y
Logical volume "lv1" successfully removed
4.6逻辑卷快照-snapshot
# 作为快照的分区容量可以比原始分区小;
# 快照不是拷贝,建立快照很快;
# 只有当原始数据发生变化时才把变化前的原始数据拷贝到快照里;
# 当原始数据持续变化,有可能撑破快照,快照损坏;
# 原始逻辑卷和snapshot必须在同一个VG中
4.6.1 Ext4文件系统逻辑卷创建snapshot
原始逻辑卷和snapshot必须在同一个VG中
- 创建snapshot
lvcreate -L snapshot的大小 -s -n snapshot名 原始逻辑卷名
[root@localhost ~]# lvcreate -L 10M -s -n lv4-snap /dev/TestVG/lv4
Rounding up size to full physical extent 12.00 MiB
Logical volume "lv4-snap" created.
2. 挂载snapshot
[root@localhost TestVG]# mount -o ro /dev/TestVG/lv4-snap /tmp/lv4-snap/
4.6.2 xfs文件系统逻辑卷创建snapshot-(xfs格式的snapshot挂载时需要加参数nouuid)
-
创建原始逻辑卷
[root@localhost TestVG]# lvcreate -l 50%VG -n lv1 andy
WARNING: xfs signature detected on /dev/andy/lv1 at offset 0. Wipe it? [y/n]: y
Wiping xfs signature on /dev/andy/lv1.
Logical volume “lv1” created. -
用xfs文件系统格式化这个原始逻辑卷
[root@localhost TestVG]# mkfs.xfs /dev/andy/lv1
meta-data=/dev/andy/lv1 isize=512 agcount=4, agsize=392704 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=1570816, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
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
-
挂载这个原始逻辑卷
[root@localhost TestVG]# mount /dev/andy/lv1 /tmp/lv1 -
创建snapshot
[root@localhost TestVG]# lvcreate -L 50m -s -n lv1-snap /dev/andy/lv1
Rounding up size to full physical extent 56.00 MiB
Logical volume "lv1-snap" created.
- 挂载这个snapshot
[root@localhost TestVG]# mount -o ro /dev/andy/lv1-snap /tmp/lv1-snap/
mount: /tmp/lv1-snap: wrong fs type, bad option, bad superblock on /dev/mapper/andy-lv1--snap, missing codepage or helper program, or other error.
[root@localhost TestVG]# mount -o nouuid,ro /dev/andy/lv1-snap /tmp/lv1-snap/
[root@localhost TestVG]#
五. Ext4文件系统(索引式文件系统)
5.1 概述
superblock:记录整个文件系统的整体信息,包括inode/block的总量、使用量、剩余量等,所有block group的superblock内容是一样的
# 没有superblock就没有文件系统
# block和inode总数
# 已经使用的block和inode的数量
# 剩余的block和inode的数量
# block的大小(1,2,4k)
# inode的大小(128,256b)
inode:记录文件的元数据,包括文件类型、权限、UID、GID、size,以及文件数据所在的block number等。每个文件都有一个inode
# 文件权限
# 文件的属主和属组
# 文件的大小
# 文件的ctime,atime,mtime
# 文件内容所在的block的number
block:实际存放文件的地方,如果文件大可有多个block
5.2 查看inode
5.2.1 查看各个文件系统的inode的总数、使用情况
[root@localhost ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 2028475 462 2028013 1% /dev
tmpfs 2032314 1 2032313 1% /dev/shm
tmpfs 2032314 764 2031550 1% /run
tmpfs 2032314 17 2032297 1% /sys/fs/cgroup
/dev/mapper/rhel-root 23066624 119325 22947299 1% /
/dev/sda1 524288 309 523979 1% /boot
tmpfs 2032314 11 2032303 1% /run/user/0
5.2.2 查看文件的inode的inode number
5.3 文件夹的blcok data已经文件的文件名是存放在他的目录的block data中的
所以对文件的创建和删除要有文件夹的w权限
5.4 查看ext4文件系统的信息-实际上就是查看文件系统的superblock中的信息
5.4.1 dumpe2fs
[root@localhost ~]# dumpe2fs /dev/sdi1 |head
dumpe2fs 1.44.3 (10-July-2018)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 03f62d3b-aae3-4fcd-b99e-23c7868636a2
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
5.4.2 tune2fs -l
[root@localhost ~]# tune2fs -l /dev/sdi1
tune2fs 1.44.3 (10-July-2018)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: 03f62d3b-aae3-4fcd-b99e-23c7868636a2
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 983040
Block count: 3931904
Reserved block count: 196595
Free blocks: 3843564
Free inodes: 983029
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 1024
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Mon Jan 25 17:27:27 2021
Last mount time: Mon Jan 25 17:33:31 2021
Last write time: Mon Jan 25 17:33:31 2021
Mount count: 2
Maximum mount count: -1
Last checked: Mon Jan 25 17:27:27 2021
Check interval: 0 (<none>)
Lifetime writes: 308 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 32
Desired extra isize: 32
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 167d7bde-8740-462a-b30f-1e646f00b0dc
Journal backup: inode blocks
Checksum type: crc32c
Checksum: 0x23bf403c
5.5 ext2/ext3/ext4日志式文件系统(Journaling filesystem)
5.5.1 ext2/ext3/ext4日志式文件系统的工作原理
日志式文件系统工作的三个步骤:
- 准备阶段:当系统要写入一个文件时,会先在日志区记录这个文件准备写入的信息
- 实际写入阶段:将metadata原信息写入inode;将实际数据写入block;更新inode bitmap、block bitmap、superblock
- 结束阶段:完成数据和metadata的写入和inode bitmap、block bitmap、superblock的更新后,在日志记录区块中清楚这个文件的信息
5.5.2 新建一个文件的过程
- 先确定使用者对于想要创建文件的目录是否有w和x权限
- 根据inode bitmap找到没有使用的inode号码,并将文件的权限和属性写入
- 根据block bitmap没有使用的block号码,把实际数据写入,并更新inode的block指向信息
- 将刚刚写入的inode和block在更新inode bitmap和block bitmap,并更新superblock的内容
5.5.3 文件不一致的状态
如果断电或内核发生错误,可能刚刚写完inode和block的数据,还没来得及更新inode bitmap、block bitmap,superblock中的原数据,这就造成了元数据与实际不符的情况Inconsistent
5.5.4 修复文件不一致的状态文件系统
5.5.4.1 文件不一致的现象
- 系统无法启动
- 系统某个分区只读
5.5.4.2 修复文件不一致的命令
fsck和e2fsck-fy
5.5.5 如何利用备份的superblock修复主superblock
六. xfs文件系统
6.1 与ext4相比xfs文件系统的优势
- 创建文件系统(格式化)时快;
- 文件系统修复时快;
- 容量更大
6.2 xfs文件系统概述
-
与ext4一样都是日志式文件系统;
-
inode和block都是系统需要要到时才动态配置生成的;
-
xfs文件系统有三个区:
3.1 数据区data section
存放inode、block、superblock3.2 日志区log section
3.3 实时运行区realtime section
6.3 查看xfs分区的信息
[root@localhost ~]# xfs_info /dev/mapper/andy-lv1
meta-data=/dev/mapper/andy-lv1 isize=512 agcount=4, agsize=392704 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=1570816, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
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
6.4 修复xfs文件系统
[root@localhost ~]# xfs_repair /dev/mapper/andy-lv1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
七 mount挂载命令详解
7.1 常用的挂载选项
-t 文件系统类型
常见的文件系统类型有:ext4,xfs,vfat,nfs,cifs,iso9660,loop
-o 选项1,选项2...
7.1.1 如果没有指定挂载选择则使用默认值挂载
defaults:rw, suid, dev, exec, auto, nouser, async
7.1.2 常见的挂载选项
rw 读写
ro 只读
suid 支持suid
dev 支持设备文件
nodev 不支持设备文件
exec 允许执行二进制文件
noexec 不允许执行二进制文件
auto 开机时或执行mount -a时会自动挂载有auto选项的文件系统
noauto 开机时或执行mount -a时不会自动挂载有noauto选项的文件系统,需要手动执行mount挂载
async 异步写入硬盘(数据写入内存时命令就返回,不等待写到硬盘)
sync 同步写入
uquota 支持用户级磁盘配额功能
gquota 支持组级磁盘配额功能
acl 支持acl功能
remount 在线重新挂载
pri 指定优先级
7.2 用设备文件、卷标、UUID挂载
用设备名挂载 /dev/sdb1
用卷标挂载 LABEL=andy
用UUID挂载 UUID=“sdfsdfsdf”
7.3 iso文件的制作及挂载
7.3.1 将光盘制作成iso文件
[root@localhost sdi]# dd if=/dev/cdrom of=/root/cd.iso
13873152+0 records in
13873152+0 records out
7103053824 bytes (7.1 GB, 6.6 GiB) copied, 264.033 s, 26.9 MB/s
7.3.2 将文件制作成iso文件
[root@localhost ~]# genisoimage -o /root/etc.iso -r /etc/
[root@localhost ~]# file /root/etc.iso
/root/etc.iso: ISO 9660 CD-ROM filesystem data 'CDROM'
7.3.3 将iso文件挂载使用
[root@localhost ~]# mount /root/cd.iso /mnt/iso/
mount: /mnt/iso: WARNING: device write-protected, mounted read-only.
[root@localhost ~]# mount |grep "cd.iso"
/root/cd.iso on /mnt/iso type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048)
八. 磁盘容量配额
8.1 概述
1. 可以针对用户或用户组来设置磁盘容量配额;
2. 可以限制最大磁盘使用空间或最大文件个数;
3. 只能针对整个文件系统来设置磁盘容量配额;
4. 限制方式有软限制和硬限制两种;
5. RH8默认已经安装了quote服务;但存储设备默认没有开启对quote的支持,需要手动编辑配置文件/etc/fstab,让启动目录/boot能够支持quote技术
8.2 为用户设置磁盘配额
- 编辑fstab文件,给/boot加上参数uquota
- 重启reboot
- 查看/boot目录已经支持磁盘配额管理
[root@localhost ~]# mount |grep "/boot"
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
- 让要使用磁盘配额的用户对/boot目录有写权限
[root@localhost ~]# chmod -R o+w /boot
- XFS文件系统的磁盘配额设置工具xfs_quota
bsoft:是最大使用磁盘的软设置,是通过限制文件的block块大小实现的
bhard:是最大使用磁盘的硬设置
isoft:是最大文件数量的软设置
ihard:是最大文件数量的硬设置,是通过限制文件的inode个数实现的
[root@localhost ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=4 ihard=7 andy' /boot/
[root@localhost ~]# xfs_quota -x -c report /boot
User quota on /boot (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 132316 0 0 00 [--------]
andy 0 3072 6144 00 [--------]
8.3 用命令edquota来修改磁盘配额
参数 作用
-u 对那位用户进行设置
-g 对那个用户组进行设置
-p 复制原有的规则到新的用户/组
-t 限制宽限期限
[root@localhost ~]# edquota -u andy
九. 文件链接
9.1 符号链接
[root@localhost ~]# ln -s soft.txt soft1.txt
符号链接的链接数不会增加
符号链接的inode不同
9.2 硬链接
# 不能跨文件系统(分区)做硬链接
# 不能给文件夹做硬链接
[root@localhost ~]# ln hard.txt hard1.txt
硬链接的链接数会增加
硬链接都是同一个文件,因为inode一样