Linux---硬盘管理

文章目录


一.硬盘概述

物理结构

        硬盘一般由多个盘片组成,每个盘片有正两面,每个盘片都对应一个读写磁头。

        下图显示的是一个磁盘盘面,盘面中一个个灰色的圆圈就是一条条磁道,从圆心向外画直线可以将磁道划分为若干个弧线,这些弧线就是扇区(绿色部分) ,扇区是磁盘的最小组成单元(512字节)

        硬盘通常由一组磁盘组成,每个盘面被划分为相等数量的磁道,从外向内磁盘编号从0开始递增,具有相同编号的磁道组成一个柱面。

读写过程

        系统将文件存储到磁盘上时,按柱面,磁头,扇区,即最先将文件存储到第一个盘面的编号“0”磁道的所有扇区,然后是同一柱面的第二个盘面的磁道,一个柱面存储满之后进入下一个柱面,直到把内容全部写入硬盘。这种有序的方式能够提高硬盘的读写速率

分区结构

        我们在Linux下通常使用两种分区结构:MBR/GPT

MBR分区结构

        通常将硬盘的第一个磁盘的“0”号磁道的第一个扇区称为MBR扇区,也称为主引导扇区。

         MBR扇区由主引导程序(446字节),主分区表(64字节)结束标志(2字节)组成;其中引导程序负责在系统启动时加载和启动操作系统,分区表记录了磁盘信息)。

CHS寻址方式

MBR分区结构采用CHS(32位)寻址方式,原理如下:

  1. 确定柱面:首先,硬盘控制器根据要访问的数据的柱面号,移动磁头到相应的柱面位置。这个步骤是机械运动,也是硬盘读写操作中最耗费时间的一步。
  2. 确定磁头:一旦磁头到达指定的柱面位置,硬盘控制器就会选择正确的磁头来读取或写入数据。这个步骤决定了数据位于哪一张盘片的哪一面。
  3. 确定扇区:最后,硬盘控制器会在选定的磁道上找到指定的扇区,并读取或写入数据。这个步骤是通过电子方式完成的,速度相对较快

硬盘容量=磁头数×柱面数×扇区数×512字节=2^32*521≈2TB

下面重点讲解一下分区表和分区的概念。

分区表

        分区表中记录了磁盘信息包括分区的起始和结束位置、分区的大小,文件类型等),由于每个分区的记录信息需要占用16个字节,而分区表大小为64字节,因此分区表中只能记录4个主分区的信息;实际业务场景中4个主分区显然不够用的,想要得到更多的分区,我们可以将一个或多个主分区设置为扩展分区,然后在扩展分区上划分出多个逻辑分区即可。

 GPT分区结构

GPT分区结构采用64位寻址方式,支持的最大硬盘容量达到了1,048,576TB比MBR更大

GPT的分区表占用32个扇区(编号2-33)按照每个扇区占用512个字节,32个扇区共占用16384个字节,而每个分区表项(记录分区信息的表)占用128个字节,因此GPT分区表共可容纳128个分区表项,即可创建128个主分区,实际上,扇区大小也可以是4096个字节, 此时分区表项的个数将远程128,同时GPT支持分区表项的扩展,因此理论上GPT分区结构可以创建无数个主分区。

 保护MBR:

保护MBR位于“0”号扇区,该扇区包含磁盘签名0xEE(表示该硬盘使用GPT分区),MBR分区表(含一个空分区表项),结束标志。

GPT头:

GPT头位于1号扇区,创建磁盘时自动生成该扇区,其作用是定义分区表大小和位置。

分区表:

分区表位于2-33号扇区,共容纳128个分区表项,包含分区区域起/尾信息,分区名字/类型等息。

分区区域:
该区域供用户存储数据等,用户可使用的区域。

Linux系统中常见的分区

  1. 根分区(/):用于安装操作系统和系统文件,包括/boot和/目录。

  2. 交换分区(swap):用于虚拟内存,当物理内存不足时,用来存储不常用的内存数据。

  3. /home分区:用于存储用户的个人文件和配置文件。

  4. /var分区:用于存储系统日志文件、数据库文件和其他变化较频繁的文件。

  5. /tmp分区:用于临时文件的存储,存放系统和应用程序临时生成的文件。

  6. /boot分区:用于存储启动加载器和内核映像文件。

  7. 其他分区:根据需要,可以创建其他独立分区,如/data用于存储数据或/app用于存放应用程序文件。

文件系统

文件系统简单来说负责将用户数据存储到磁盘中,还提供了用户和系统程序访问这些数据的接口。文件系统通过以下方式实现文件的存储:

  1. 格式化存储介质:在使用之前,文件系统会对如硬盘进行格式化,以清空原有数据并为文件系统分配必要的数据结构(索引节点和目录项)用于管理硬盘上的空闲空间和已分配空间。
  2. 文件分配:当用户创建一个文件时,文件系统会根据文件大小来分配足够的空间,并更新相应的数据结构以记录文件的位置和属性信息。
  3. 数据写入:当用户向文件写入数据时,文件系统会将数据成适当大小的数据块从内存缓存写入到磁盘的磁道中。
  4. 目录管理:文件系统还维护目录结构,以记录文件和目录之间的层次关系。这使得用户可以通过目录路径来方便地访问和操作文件。

Linux文件系统会为每个文件分配两个数据结构:索引节点和目录项

  • 索引节点inode:用来记录文件的元信息,包括inode编号,文件大小,文件类型,文件权限,所属用户,数据在磁盘的位置等等。索引节点与文件一一对应,同样会被存储在硬盘中。
  • 目录项:用来记录文件名,索引节点指针,以及其他目录项的层级关系,多个目录项关联起来就会形成一个目录项。

 如上图所示,磁盘格式化的时候会被分成3个存储区域,分别是超级块,索引节点和数据块区。

  • 超级块区:用来存储文件系统的详细信息,如块个数,块大小,空闲块个数。
  • 索引节点区:用来存储索引节点信息。
  • 数据存储区:用来存储文件/目录信息。

     在磁盘创建或格式化时,指定文件系统格式类型可以确保磁盘正确的被识别和挂载,以及提供适合的读写性能和功能。同时,不同的文件系统格式还有不同的特性,如支持文件大小、文件系统大小等方面的限制,需要根据需求选择适合的格式类型。

        通过分区可以将操作系统、应用程序和用户数据分开存储。这样,如果需要重新安装操作系统或者更换硬盘,只需要备份和恢复对应的分区,而不影响其他分区。

        磁盘中的最小存储单位是扇区,一个扇区512个字节,从数据存放角度来看,一个数据块默认4KB(4096字节)相当于8个扇区。

二.硬盘分区步骤

查看硬盘设备情况

  • 使用fdisk -l命令(适用于 MBR 分区)
    • 打开终端,输入fdisk -l。这个命令会列出系统中所有磁盘设备的分区信息。例如,你可能会看到类似于/dev/sda/dev/sdb等设备名称,以及它们已有的分区情况,包括分区编号、起始和结束扇区、分区大小等。
    • 如果是新磁盘,可能只会显示磁盘设备名称(如/dev/sdc),没有任何分区信息。

  • 使用lsblk命令
    • lsblk命令可以以树状结构列出块设备信息。它不仅会显示磁盘设备,还会显示设备之间的挂载关系等。例如,它会显示磁盘设备(如/dev/sda)、分区(如/dev/sda1)、分区是否挂载以及挂载点等信息。
[root@localhost ~]# fdisk /dev/sdb

 对硬盘进行分区

  • 启动分区工具
    • 假设要对/dev/sdb进行分区,在终端中输入fdisk /dev/sdb。这会启动fdisk分区工具,进入交互式的分区操作界面。
[root@localhost ~]# fdisk /dev/sdb

 创建新分区

下面给硬盘/dev/sdb创建一个10G的主分区 

 下面给硬盘/dev/sdb创建一个5G的扩展分区

将扩展分区创建为逻辑分区

 格式化分区

挂载分区 

临时挂载 

 永久挂载

[root@localhost ~]# vim /etc/fstab

三.逻辑卷 

        逻辑卷的存储空间实际上是从卷组中分配而来的。卷组则是由一个或多个物理卷(Physical Volume,PV)组成,物理卷可以是磁盘分区、整个磁盘甚至是磁盘阵列等物理存储设备。例如,你可以将两个 100GB 的磁盘分区标记为物理卷,然后将它们组合成一个卷组,再从这个卷组中划分出大小合适的逻辑卷。

        这里有一个10G的分区(sdb1)和一个4G的分区(sdb5),将这些分区加工成物理卷(PV),它们就可以合体成一个大小为14G的虚拟硬盘,这个虚拟硬盘叫作卷组(VG),然后在这个虚拟硬盘上划分一个分区(逻辑卷),如下图所示:

         这个逻辑卷是可变大、可缩小的,最大可以占用整个卷组的空间,即14G。如果逻辑卷还不够,可以继续找一个硬盘加入卷组中,如上图红色扩展部分所示。

        用户直接格式化挂载逻辑卷即可,不必关心关心写入逻辑卷的数据最终是写入第一个分区还是第二个分区。

创建逻辑卷的整个过程如下:

  • 创建物理卷(PV)
  • 创建卷组(VG)
  • 创建逻辑卷(LV)

创建物理卷

        通过fdisk -l 命令查看/dev/sdb硬盘的详细情况,/dev/sdb硬盘上存在一个标准分区(sdb1)和一个逻辑分区(sdb5)。

下面我们将这两个分区创建为物理卷(PV):

[root@localhost ~]# pvcreate /dev/sdb1
[root@localhost ~]# pvcreate /dev/sdb5

删除物理卷用pvremove
[root@localhost ~]# pvremove /dev/sdb1

 通过pvs或pvscan查看现在的系统是否存在物理卷(PV)命令如下:

[root@localhost ~]# pvs
[root@localhost ~]# pvscan

      

创建卷组

        从上面可以看到/dev/sdb1和/dev/sdb5的VG列表是空的,说明刚刚创建的物理卷还未加入任何卷组,下面把/dev/sdb1和/dev/sdb5组成一个名称为VG0的卷组,命令如下:

[root@localhost ~]# vgcreate vg0 /dev/sdb1 /dev/sdb5
  Volume group "vg0" successfully created

删除卷组,命令如下:
[root@localhost ~]#vgremove 卷组名

        查看卷组的情况则需要使用如下命令:

[root@localhost ~]# vgs

仅显示单个卷组信息
[root@localhost ~]# vgs vg0
  VG  #PV #LV #SN Attr   VSize   VFree
  vg0   3   0   0 wz--n- <19.99g <19.99g


查看卷组的详细信息
[root@localhost ~]# vgdisplay vg0

        可以看到,VG0由2个PV组成,因为两个PV的大小分别为10G和4G,所以VG的大小约为14G

卷组扩容

        可以看到,/dev/sdb1和/dev/sdb5是在VG0中的,但是/dev/sdc5不是,如果VG0空间不够,可以将/dev/sdc5加过去,从而增加vg0的空间。

[root@localhost ~]# vgextend vg0 /dev/sdc5
  Volume group "vg0" successfully extended

删除卷组中的物理卷
[root@Ray10 ~]# vgreduce vg0 /dev/sdc5

这样就把 /dev/sdc7 加到 vg0 中了,再次查看 VG 的信息 :

         使用vgdisplay 可以查看卷组的详细信息,如果只想显示特定的某个卷组的详细信息,则用“vgdisplay 卷组名”命令。例如,现在要显示vg0的详细信息,命令如下:

        上面的代码中有一个关键信息叫PESize,PE 的意思是物理扩展,是分配给逻辑卷的最小单位,即逻辑卷的大小是PE的整倍数。如果创建逻辑卷时指定的创建一个大小为98M的逻辑卷,而每个PE是4M,因为98M有24.5个PE,此时系统会自动将逻辑卷创建为100M,即25个PE,如下所示。

[root@Ray10 ~]# lvcreate -L 98M -n lv0 vg0
  Rounding up size to full physical extent 100.00 MiB
  Logical volume "lv0" created.

删除逻辑卷,命令如下:
[root@Ray10 ~]# lvremove -f /dev/vg0/lv0
  Logical volume "lv0" successfully removed

        PE 的大小只能在创建 VG 时用-s选项来指定,不可以后期修改。创建一个PE大小为8M、名称为vg0的VG,命令如下。 此处8后面没有写单位,默认就是M。

[root@Ray10 ~]# vgcreate s 8 vg0 /dev/sdb{5..7}
Volume group "vg0" successfully created

        重命名 VG 用 vgrename 命令。例如,把 vg0 重命名为 myvg,命令如下。

[root@Ray10 ~]# vgrename vg0 myvg
  Volume group "vg0" successfully renamed to "myvg"

创建逻辑卷

        逻辑卷的创建可以使用如下命令:

创建逻辑卷
[root@Ray10 ~]# lvcreate 大小 -n 名称卷组

创建逻辑卷时指pe数
[root@Ray10 ~]# 1vcreate-l pe数 -n名称 卷组

创建一个大小为百分比剩余空间的卷组
[root@Ray10 ~]# lvcreate -l 数字%free -n 名称 卷组

删除逻辑卷
[root@localhost ~]# lvremove /dev/vg0/lv0
Do you really want to remove active logical volume vg0/lv0? [y/n]: y
  Logical volume "lv0" successfully removed

        查看逻辑卷的信息,命令如下,可以看到访问逻辑卷的方式为/dev/vg0/lv0,大小为200M

案例:创建一个逻辑卷Iv2,大小为剩余空间的25%,命令如下。

[root@localhost ~]# lvcreate -l 25%free -n iv2 vg0
  Logical volume "iv2" created.
逻辑卷格式化

下面将逻辑卷用EXT4 文件系统进行格式化,命令如下。

[root@localhost ~]# mkfs.ext4 /dev/vg0/iv2

逻辑卷挂载 

逻辑卷扩容 

        前面讲逻辑卷的优点在于可以动态地扩大或缩小,下面演示逻辑卷的扩大。首先逻辑卷和文件系统的大小,命令如下。

[root@localhost ~]# lvscan
  ACTIVE            '/dev/vg0/iv2' [<4.95 GiB] inherit
  ACTIVE            '/dev/kylinsec/swap' [3.00 GiB] inherit
  ACTIVE            '/dev/kylinsec/root' [<26.00 GiB] inherit

        下面开始扩容逻辑卷:

在原有基础上扩容2G大小:
[root@localhost ~]# lvextend -L +2G /dev/vg0/iv2
  
在原有基础上扩容到10G
[root@localhost ~]# lvextend -L 10G /dev/vg0/iv2

         现在查看一下扩容后的逻辑卷大小和文件系统的大小:

         从图片中可以发现逻辑卷vg0-iv2的文件实际存储大小为10G,而文件系统大小为4.9G,这意味着该逻辑卷最多只能存储4.9G大小的数据,为什么会出现这种原因?

扩展文件系统 

        我们可以将文件系统当作填充物(蓝色部分),右侧是新增的逻辑卷5G空间,这里面没有文件系统,就无法存储数据,所以现在要做的是将扩容的存储部分进行文件系统格式化。

XFS 文件系统使用:xfs_growfs,用法:xs_growfs /挂载点
EXT4 文件系统用; resize2fs, 用法:resize2fs 逻辑卷访问路径 

        下面开始扩展逻辑卷vg0-iv2文件系统大小,命令如下:

        再次查看文件系统大小,可以看到已经扩展成功:

 逻辑卷缩小

        非常不建议对逻辑卷做缩小的操作,但是如果必须缩小,一定要先缩小文件系统,再缩小逻辑卷,否则会破坏文件系统。

        原来的文件系统和逻辑卷是贴合的,如果先把逻辑卷缩小了,则文件系统会多出来一块、没有承载体,整个文件系统就会被破坏,所以一定要先缩小文件系统,然后再缩小逻卷、不过对于XFS文件系统来说是不支持缩小的,这里使用EXT4来演示。
第一步:取消挂载点

[root@localhost ~]# umount /ky

第二步:对文件系统进行fsck检查

[root@localhost ~]# e2fsck -f /dev/vg0/iv2
[root@localhost ~]# fsck -f /dev/vg0/iv2

 第三步:缩小文件系统

 第四步:缩小逻辑卷(逻辑卷最终大小必须大于等于2G

[root@localhost ~]# lvreduce -L -3G  /dev/vg0/iv2

 第五步:重新挂载验证 

[root@localhost ~]# mount /dev/vg0/iv2 /ky

 第六步:验证文件系统是否损坏

        若正常访问说明文件系统未损坏。

[root@localhost /]# cat /ky/ky
文件正常
 逻辑卷恢复

        逻辑卷中的数据是写入底层物理卷(PV)中的,所以即使删除了逻辑卷,也并没有删除存储在物理卷中的数据,如果恢复删除的逻辑卷,仍然能看见逻辑卷中的所有数据。

        现在开始卸载并删除前面创建的逻辑卷:

[root@localhost /]# umount /ky
[root@localhost /]# lvremove -f /dev/vg0/iv2
  Logical volume "iv2" successfully removed

        下面开始恢复,我们在卷组上做的所有操作,均有日志记录,原因如下:

可通过如下命令来查看卷组的备份日志文件: 

[root@localhost /]# vgcfgrestore --list 卷组名

        日志中有这样一条记录,可以看到在执行 lvremove -f /dev/vg0/iv2之前的日志文件是/etc/lvm/archive/vg0_00011-33855017.vg 

 那么就可以利用这个文件对LV进行恢复,命令如下:

[root@localhost /]# vgcfgrestore -f 日志文件 卷组名

         可以看逻辑卷已经恢复,但是逻辑卷的状态未inactive状态,现在需要活跃它:

[root@localhost /]# lvchange -ay 卷组访问路径

 这里-ay的意思是aeiveyes,表明已经成功激活,然后挂载查看里面的文件,依然可以正常访问。

逻辑卷快照 

        为了备份逻辑卷,可以通过对逻辑卷做快照来实现,快照原理如图所示:

         现在有一个逻辑卷Iv0,这个文件中有2个文件hosts、issue,然后对这个逻辑卷做快照Iv0 snap(记住不要对快照格式化)。用户访问Iv0_snap时,发现lv0中的内容在Iv0_snap中都有,例如,在Iv0_snap中也能看到hosts等文件。

        但是此时在lv0_snap中看到的这些文件都只是一个影子而已(这个影子通过硬链接来现),如同井中望月。所以,创建快照时,快照的空间可以很小,因为看到的内容并非存储在快照中。

        如果在快照中把 issue 删除,也不会从原始逻辑卷中把 issue 删除,只是把对应的映射删而已,同样的,如果在Iv0_snap中创建一个文件6le,则这个文件是保存在Iv0_snap中的,占用lv0_snapd1空间,并不会写人lv0,在快照中新增文件的总大小不能超过快照的大小。

        上面这种映射和原始文件之间的关系,采用的是写时复制。

创建快照

lvereate -L 大小 -n 快照名称 -s 逻辑卷访问路径

        现在为 /dev/vg0/iv2创建一个名为/dev/vg0/iv2_snap,大小为20M的快照,命令如下:

[root@localhost ~]# lvcreate -L 20M -n iv2_snap -s  /dev/vg0/iv2
  Logical volume "iv2_snap" created.

        此时可以使用lvscan命令扫描出刚刚创建的快照:

        可以看到/dev/vg0/iv2是原始逻辑卷,/dev/vg0/iv2_snap是快照;从哪里可以看到原始逻辑卷/dev/vg0/iv2的快照是/dev/vg0/iv2_snap呢?可以使用lvs命令查看:

        现在尝试创建一个挂载目录/ky_backup并挂载快照:

        可以看到目录/ky_backup中有目录/ky中的内容,但这些内容并非存储在/ky_backup中的。

       快照有什么用呢?假设原始逻辑卷中的数据被我们误删除了,那么可以利用快照恢复原警逻辑卷中的数据。

        先把/ky目录中的内容删除,然后用快照/dev/vg0/iv2_snap恢复/ky目录中的数据

先删除目录/ky中的内容
rm -rf /ky/*
卸载挂载点
umount /ky
umount /ky_backup

然后恢复数据
[root@localhost ky]# lvconvert --merge /dev/vg0/iv2_snap
  Merging of volume vg0/iv2_snap started.
  vg0/iv2: Merged: 100.00%

        数据恢复完成后,我们重新将/ky目录挂载到逻辑卷/dev/vg0/iv2上验证数据是否恢复:

         可以看到数据已经恢复。 


 命令总结 

物理卷

创建物理卷
[root@localhost ~]# pvcreate /dev/sdb1

删除物理卷
[root@localhost ~]# pvremove /dev/sdb1

查看物理卷信息
[root@localhost ~]# pvs
[root@localhost ~]# pvscan

 卷组

创建卷组
[root@localhost ~]# vgcreate vg0 物理卷

删除卷组,命令如下:
[root@localhost ~]#vgremove 卷组名

卷组扩容
[root@localhost ~]# vgextend 卷组名 物理卷

卷组缩容
[root@Ray10 ~]# vgreduce 卷组名 物理卷

创建卷组时指定PE大小(单位默认为MB)
[root@Ray10 ~]# vgcreate s 8 卷组名  物理卷

查看卷组信息
[root@localhost ~]# vgdisplay 卷组名
[root@localhost ~]# vgs

卷组重命名
[root@Ray10 ~]# vgrename 原名  新名

逻辑卷 

创建逻辑卷
[root@Ray10 ~]# lvcreate 大小 -n 名称卷组

创建逻辑卷时指pe数
[root@Ray10 ~]# 1vcreate-l pe数 -n名称 卷组

创建一个大小为百分比剩余空间的卷组
[root@Ray10 ~]# lvcreate -l 数字%free -n 名称 卷组

删除逻辑卷
[root@localhost ~]# lvremove /dev/vg0/lv0(逻辑卷访问路径)

在原有基础上扩容2G大小:
[root@localhost ~]# lvextend -L +2G /dev/vg0/iv2
  
在原有基础上扩容到10G
[root@localhost ~]# lvextend -L 10G /dev/vg0/iv2

查看逻辑卷信息
[root@localhost ~]# lvs / lvscan / lvdisplay

扩展文件系统大小
XFS 文件系统使用:xfs_growfs,用法:xs_growfs /挂载点
EXT4 文件系统用; resize2fs, 用法:resize2fs 逻辑卷访问路径 


未完待续.......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北 染 星 辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值