【Linux】【磁盘管理】学习笔记

文章目录

  • [1. 磁盘和磁盘分区](#1. 磁盘和磁盘分区)
    • [1.1 磁盘](#1.1 磁盘)
    • [1.2 分区](#1.2 分区)
      • [1.2.1 分区架构](#1.2.1 分区架构)
      • [1.2.2 分区表MBR vs GPT](#1.2.2 分区表MBR vs GPT)
    • [1.3 逻辑卷管理器LVM](#1.3 逻辑卷管理器LVM)
    • [1.4 磁盘的操作](#1.4 磁盘的操作)
      • [1.4.1 磁盘分区](#1.4.1 磁盘分区)
      • [1.4.2 磁盘格式化(创建文件系统)](#1.4.2 磁盘格式化(创建文件系统))
      • [1.4.3 文件系统校验](#1.4.3 文件系统校验)
      • [1.4.4 文件系统的挂载与解挂载](#1.4.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调整文件系统容量的大致流程:

  1. VG阶段需要有剩余容量,若VG容量不足可以添加硬盘,然后将该硬盘通过pvcreate、vgextend命令增加到该VG
  2. LV阶段产生更多的可用容量,利用lvresize命令将剩余的可用容量加入到所需增加的LV设备内
  3. 文件系统阶段放大容量,不同文件系统使用不同的命令进行容量放大,例如xfs文件系统的放大使用命令xfs_growfs
LVM的删除

如果LVM正在使用系统的物理分区,如果没有关闭LVM就直接将分区删除或转为其他用途,系统会发生很大问题。LVM的删除流程:

  1. 卸载系统上的LVM文件系统(umount)
  2. lvremove删除LV
  3. vgchange -a n , 清除对应的VG的Active标志
  4. vgremove删除VG
  5. pvremove删除PV
  6. 使用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可以通过技术将多个小磁盘整合成一个较大的磁盘设备。

参考内容

相关推荐
Takoony8 分钟前
理解 Python ProcessPoolExecutor 的序列化问题:为什么线程锁(threading.Lock)会导致异常?
linux·开发语言·python
qq_3344078121 分钟前
docker安装mysql5.7
linux·mysql·docker·容器
vvw&40 分钟前
如何在 Ubuntu 22.04 上安装 JupyterLab 环境教程
linux·运维·服务器·ubuntu·jupyter·开源·python3.11
zengshitang5201 小时前
Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程
linux·windows·ubuntu
路星辞*2 小时前
TCP 三次握手四次挥手
linux·服务器·网络
m0_541034842 小时前
Linux shell脚本练习(七)
linux
2201_759154882 小时前
Linux应用开发————mysql数据库表
linux·mysql
雨中rain2 小时前
Linux -- 线程控制相关的函数
linux·开发语言
亭墨2 小时前
linux0.11源码分析第二弹——setup.s内容
linux·驱动开发·学习·系统架构