文章目录
- [1. 磁盘和磁盘分区](#1. 磁盘和磁盘分区)
-
- [1.1 磁盘](#1.1 磁盘)
- [1.2 分区](#1.2 分区)
- [1.3 逻辑卷管理器LVM](#1.3 逻辑卷管理器LVM)
- [1.4 磁盘的操作](#1.4 磁盘的操作)
- [2. 磁盘配额Quota](#2. 磁盘配额Quota)
- [3. 软件磁盘阵列Software RAID](#3. 软件磁盘阵列Software RAID)
- 参考内容
1. 磁盘和磁盘分区
1.1 磁盘
Linux中的所有数据均是以文件的形态来呈现的,磁盘也不例外。Linux中,所有的设备都被当做文件对待,每个设备都有一个设备文件名。Linux所有的设备都被抽象为文件,保存在/dev
目录下。
磁盘设备文件通常分为:SATA与USB设备文件名为/dev/sd[a-p]
;虚拟机的磁盘文件名通常为/dev/vd[a-p]
;若使用了软件磁盘阵列,文件名为/dev/md[0-128]
。
以第一块磁盘为例,分区的文件名为/dev/sda[1-128]
。
1.2 分区
一个磁盘可以分成多个分区(个数有限制),用户可以将每一个分区感知为一个独立的磁盘使用。分区必须挂载在一个目录上才能进行操作。
Linux的目录(目录其实也是文件)和文件以目录树的结构进行管理,不同的目录对应的分区可能是不同的。比如:分区1挂载在根目录下;分区2挂载在/home目录下,因而不同目录下的数据也就存放在了不同的分区中。
1.2.1 分区架构
图源: https://www.cnblogs.com/lijiaman/p/12885649.html
- 磁盘:在系统中呈现为一个个文件:
/dev/sda
等 - 分区:一块磁盘的一部分,逻辑上可以理解为Windows中的C盘、D盘;物理分区又称为主分区,又可以分成多个逻辑分区。
- 物理卷:物理卷在逻辑卷管理中位于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘。
- 卷组:物理卷的集合成为卷组。一个卷组至少要包含一个物理卷;卷组建立之后可以动态将物理卷添加到卷组中;一个逻辑卷管理系统中可以有一个或多个卷组
- 逻辑卷:从卷组中划出来的一块逻辑磁盘。
1.2.2 分区表MBR vs GPT
MBR分区表
MBR:master boot record,主引导记录。
早期Linux为了兼容Windows的磁盘,使用的是支持Windows的MBR的方式来处理启动引导程序和分区表。启动引导程序记录区和分区表通常放在磁盘的第一个扇区:
- 主引导记录:可以安装启动引导程序的地方,446B
- 分区表:记录整块磁盘分区状态,64B。因为只有64B,所以最多只能有4组记录区,每组记录区记录了该区段的起始与结束的柱面号。
分区表示例:64B的分区表记录了分区P1~P4的柱面号范围
- 硬盘默认的分区表只能写入4组分区信息
- 分区的最小单位通常为柱面
- 这四组分区信息成为主要分区或扩展分区
- 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据处理
扩展分区:使用额外的扇区来记录分区信息。
如图所示,继续划分出了5个分区L1~L5,它们被称为逻辑分区。逻辑分区由扩展分区划分而来,逻辑分区能使用的柱面范围就是扩展分区所设置的范围(在图中对应101-400)
MBR中:
- 主要分区与扩展分区最多能有4个(硬盘限制)
- 扩展分区最多能有1个(操作系统限制)
- 逻辑分区是由扩展分区持续划分出来的分区
- 能够被格式化后作为数据存取的分区是主要分区和逻辑分区,扩展分区无法格式化
- 逻辑分区的个数依操作系统而不同
- 逻辑分区设备文件名的号码,一定从5开始,因为前四个号码是保留给主要分区或扩展分区使用的
GPT分区表
GPT:GUID partition table。
MBR分区表限制了操作系统最大能使用2.2TB容量的磁盘,若磁盘容量大于2TB时,系统会自动使用GPT分区方式来处理磁盘分区。
GPT使用逻辑区块地址LBA(logical block address)来记录分区信息,GPT使用34个LBA区块来记录分区信息。(整个磁盘的最后34个LBA用来作为备份):
- LBA0:MBR兼容区块
- LBA1:GPT表头记录。记录了分区表位置和大小,以及记录了备份用的GPT分区放置的位置
- LBA2-33:实际记录分区信息的地方。从LBA2区块开始,每个LBA都可以记录4组分区信息
GPT分区没有主要分区、扩展分区和逻辑分区的概念,每个分区都可以拿来格式化使用。
1.3 逻辑卷管理器LVM
LVM:logical volume manager。LVM可以弹性调整文件系统的容量;可以整合多个物理分区;可以在LVM管理的磁盘中新增或删除其他物理分区。
1.3.1 几个概念
- 物理卷PV:physical volume
- 实际的分区需要调整系统标识符为8e(LVM的标识符),然后通过pvcreate命令将其转成LVM最底层的物理卷PV,之后才能使用这些PV。通过gdisk调整系统标识符system ID。
- 卷组VG:volume group
- VG就相当于LVM整合成的大磁盘
- 物理扩展块PE:physical extent
- PE是整个LVM最小的数据存储单位,文件数据都是通过写入PE来完成写入的
- PE就类似于文件系统中block
- 逻辑卷LV:logical volume
- LV就是最后可以被格式化使用的类似分区的东西了
架构图可见1.2.1
1.3.2 LVM 操作实践
操作命令
使用LVM进行管理时大致可分为:disk阶段;PV阶段;VG阶段;LV阶段;文件系统阶段
- disk阶段
使用gdisk或fdisk命令得到分区 - PV阶段
相关命令:
c
pvcreate : 将物理分区建立为PV
pvscan : 查找目前系统里面任何具有PV的磁盘
pvdisplay : 显示出目前系统上的PV状态
pvremove : 将PV属性删除
- VG阶段
相关命令:
c
vgcreate : 建立VG的命令
vgcreate [-s N[mgt]] VG名称 PV名称
-s : 后面跟PE大小(size),单位可以是m、g、t(大小写均可)
vgscan : 查找系统上是否有VG存在
vgdisplay : 显示目前系统上的VG状态
vgextend : 在VG内添加额外的PV
vgreduce : 在VG内删除PV
vgchange : 设置VG是否启动(active)
vgremove : 删除一个VG
注:PV的名称实际上是分区的设备文件名;而VG的名称可以自己取。
- LV阶段
将VG划分为一个个LV。
相关命令:
c
lvcreate : 建立LV
lvcreate [-L N[mgt]] [-n LV名称] VG名称
-L : 后面接容量,单位可以是m、g、t,最小的单位是PE,这个数量必须是PE的整数倍
-l : 后面接PE的个数,而不是容量
lvscan : 查询系统上的LV
lvdisplay : 显示系统上的LV状态
lvextend : 在LV中增加容量
lvreduce : 在LV中减少容量
lvremove : 删除一个LV
lvresize : 调整LV的容量大小
- 文件系统阶段
创建文件系统并进行挂载
扩大LV容量
LVM可以弹性调整文件系统容量,这是LVM的一大特色。使用LVM调整文件系统容量的大致流程:
- VG阶段需要有剩余容量,若VG容量不足可以添加硬盘,然后将该硬盘通过pvcreate、vgextend命令增加到该VG
- LV阶段产生更多的可用容量,利用lvresize命令将剩余的可用容量加入到所需增加的LV设备内
- 文件系统阶段放大容量,不同文件系统使用不同的命令进行容量放大,例如xfs文件系统的放大使用命令
xfs_growfs
LVM的删除
如果LVM正在使用系统的物理分区,如果没有关闭LVM就直接将分区删除或转为其他用途,系统会发生很大问题。LVM的删除流程:
- 卸载系统上的LVM文件系统(umount)
- lvremove删除LV
- vgchange -a n , 清除对应的VG的Active标志
- vgremove删除VG
- pvremove删除PV
- 使用fdisk将ID修改回来
1.4 磁盘的操作
若想在系统中添加一块磁盘,需执行的操作:分区->格式化(以建立文件系统)->校验(可选)->挂载
1.4.1 磁盘分区
lsblk
lsblk [-dfimpt] [device]
:列出存储设备信息
bash
-d : 仅列出磁盘本身,不会列出该磁盘的分区数据
-f : 同时列出该磁盘内的文件系统名称
-i : 使用ASCII的字符输出
-m : 同时输出该设备在/dev下的权限信息
-p : 列出该设备的完整文件名
-t : 列出该磁盘设备的详细数据,包括磁盘阵列机制、预读写的数据量大小等
- NAME:设备文件名
- MAJ:MIN :内核识别的设备都是通过这两个代码实现,分别是主设备代码和次设备代码
- RM:是否为可卸载设备
- SIZE:容量
- RO:是否为只读设备
- TYPE:disk磁盘、part分区、rom只读存储器等
- MOUNTPOINT:挂载点
blkid
blkid
:列出设备的uuid等参数
parted
parted <device_name> print
:列出磁盘的分区表类型和分区信息
gdisk/fdisk
MBR分区表请使用fdisk分区;GPT分区表请使用gdisk分区。
只有root才有权限执行gdisk、fdisk命令
gdisk
bash
gdisk [设备名称]
e.g.: gdisk /dev/sda
# 输入?即可看到所有的操作命令
分区表信息各个字段含义:
- Number:分区编号。例如1号指的是
/dev/sda1
- Start:每个分区的开始扇区号码位置
- End:每个分区的结束扇区号码位置
- Size:分区的容量
- Code:分区内的可能的文件系统类型
- Name:文件系统名称
fdisk
bash
fdisk [设备名称]
e.g.: fdisk /dev/sda
# 输入m即可看到所有的操作命令
partprobe
partprobe [-s]
:更新Linux内核的分区表信息
bash
partprobe [-s]
# cat /proc/partitions 查看内核的分区记录
1.4.2 磁盘格式化(创建文件系统)
使用mkfs
命令,它会去调用正确的文件系统格式化工具软件。
以创建xfs文件系统为例:
bash
mkfs.xfs [-b size] [-d params] [-i params] [-l params] [-L label] [-f] [-r params] 设备名称
1.4.3 文件系统校验
注:执行修复命令时,被检查的硬盘分区不能挂载到系统上。
对于xfs文件系统:
bash
xfs_repair [-fnd] 设备名称
-f : 后面的设备是个文件而不是实体设备
-n : 只检查而不修改文件系统的任何数据
-d : 通常用在单人维护模式下,针对根目录进行检查与修复
对于ext4文件系统:
bash
fsck.ext4 [-pf] [-b 超级区块] 设备名称
-p : 文件系统在修复时,若有需要回复y的操作,自动回复y
-f : 强制检查
-D : 针对文件系统下的目录进行最佳化配置
-b : 后边跟超级区块的位置,若超级区块损坏,可使用该参数利用文件系统内的备份的超级区块来尝试恢复
1.4.4 文件系统的挂载与解挂载
bash
mount
-a : 依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上
-t : 指定要挂载的文件系统类型
-o : 后面跟一些挂载时额外加上的参数
挂载测试:
/etc/filesystems
:系统指定的测试挂载文件系统类型的优先级/proc/filesystems
:Linux系统已经加载的文件系统类型/lib/modules/$(uname -r)/kernel/fs/
:Linux支持的文件系统的驱动程序
2. 磁盘配额Quota
可以使用磁盘配额来让磁盘容量使用较为公平,磁盘配额Quota一般使用的场景有:网站服务器、邮件服务器、文件服务器。一般可以限制的有:限制某一用户组/某一用户/某一个目录的最大磁盘配额。
磁盘配额的使用限制:
- ext文件系统仅能针对整个文件系统来限制,无法针对某个单一的目录来限制磁盘配额。
- 内核必须支持磁盘配额。
- 只对一般身份用户有效,例如root用户就不能设置磁盘配额,因为整个系统所有的数据几乎都是它的。
- 若启用了SELinux,那么不是所有的目录都能设置磁盘配额
3. 软件磁盘阵列Software RAID
RAID:Redundant Arrays of Inexpensive Disks,独立冗余磁盘阵列。RAID可以通过技术将多个小磁盘整合成一个较大的磁盘设备。