最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

14Linux磁盘管理

业界 admin 15浏览 0评论

文章目录

    • 1. 磁盘知识的体系结构
    • 2. 第一层:硬件层
      • 2.1 外部结构
      • 2.2 内部结构
        • 2.2.1 磁头组件
        • 2.2.2 磁盘片、主轴组件及前置控制电路
        • 2.2.3 磁盘的控制电路
      • 2.3 磁盘的接口类型
      • 2.4 生产磁盘的选型和应用
      • 2.5 磁盘核心知识内容
        • 2.5.1 磁盘的认知
        • 2.5.2 磁盘容量计算(了解即可)
        • 2.5.3 磁盘的工作原理
    • 3.第二层:Raid和LVM
      • 3.1 Raid介绍
      • 3.2 Raid级别介绍
      • 3.3 Raid技术分类
      • 3.4 常用RAID级别细节说明
        • 3.4.1 `RAID 0` 级别详解
        • 3.4.2 `RAID 1` 级别详解
        • 3.4.3 `RAID 5` 级别详解
        • 3.4.4 `RAID 10` 级别详解
        • 3.4.5 各个级别的特点和区别
      • 3.5 LVM介绍
        • 3.5.1 部署逻辑卷
        • 3.5.2 扩容逻辑卷
        • 3.5.3 缩小逻辑卷
        • 3.5.4 逻辑卷快照
        • 3.5.5 删除逻辑卷
    • 4. 第三层:磁盘分区
      • 4.1 磁盘分区介绍
        • 4.1.1 磁盘分区的类型
        • 4.1.2 磁盘分区注意事项
        • 4.1.3 磁盘分区的工作原理
      • 4.2 磁盘分区实践
        • 4.2.1 fdisk的使用
          • 查看磁盘分区信息
          • 使用fdisk命令分区
        • 4.2.2 parted的使用
        • 4.2.3 分区类型
    • 5. 第四层:文件系统(格式化)
    • 6. 第五层:mount挂载文件系统
      • 6.1 实现开机自动挂载
      • 6.2 fsck 磁盘检查和修复
      • 6.3 创建文件系统时指定块大小和inode大小格式


1. 磁盘知识的体系结构

  • 企业服务器多磁盘知识体系结构
  • 第一层次:Linux系统硬件层次。 该层次说明讲解磁盘的结构以及机械磁盘的工作原理和读写原理;

  • 第二层次:Raid和LVM逻辑层次。 该层次说明讲解Raid知识以及LVM知识,并介绍在企业中的应用区别;

  • 第三层次:分区层次。 该层次说明讲解Linux下磁盘分区的相关知识;

  • 第四层次:文件系统层次。 该层次讲解文件系统知识以及格式化系统相关知识;

  • 第五层次:挂载层次。 该层次讲解一个被格式化后的磁盘如何被应用;

  • 第六层次:管理工具层次。 该层次讲解Linux系统下磁盘文件系统的等日常管理维护知识和实践;

2. 第一层:硬件层

2.1 外部结构

传统的机械硬盘,封装了内部结构,仅对外暴露了磁盘接口、控制电路板及固定面板。

  • 磁盘接口 包括电源接口插座和数据接口插座两部分。电源插座就是与主机电源相连接部分,为磁盘提供电力保证。数据接插座则是磁盘数据与主板控制芯片之间进行数据传输交换的通道,用一根数据电缆将其与主板IDE接口等和磁盘的数据接口相连接,数据电缆一般为40针、80芯的接口电缆,早期数据接口有IDE和SCSI 接口,当前主流的硬盘结构为串口SATA硬盘或者SCSI接口。

  • 控制电路板。 大多数的控制电路板都采用贴片式焊接,包括主轴调速电路、磁头驱动与伺服定位电路、读写电路、控制与接口电路等。在电路板上还有一块ROM芯片,里面固化的程序可以进行磁盘的初始化,执行加电和启动主轴电机,加电初始寻道、定位以及故障检测等。在电路板上还安装有容量不等的高速数据缓存芯片,在此块磁盘内有2MB的高速缓存。

  • 固定面板。 即磁盘正面的面板,它与底板结合成一个密封的整体,保证了磁盘盘片和机构的稳定运行。在面板上最显眼的莫过于产品标签,上面印着产品型号、产品序列号、产品、生产日期等信息。除此之外,还有一个透气孔,它的作用就是使磁盘内部气压与大气气压保持一致。

固态硬盘:一类固态硬盘与机械硬盘在外观上类似,内部使用集成电路板替代了机械硬盘的盘片等结构;还有一类固态硬盘直接就是一个带有接头的电路板。

2.2 内部结构

此处的内部结构仅针对机械磁盘说明。

  • 磁盘是非常精密的设备,震动、灰尘等是磁盘损坏的重要原因,所以磁盘需要密封,并且防止剧烈震动。核心部件被封装在磁盘的密封腔体内,所以磁盘拆开后一般就意味着报废了。

  • 磁头及盘片是磁盘的核心组件,被封装在磁盘的密封腔体内,包括有浮动磁头组件、磁头驱动装置、盘片、主轴驱动装置及前置读写控制电路等几个部分。

磁盘的内部结构主要包括:盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部分。
所有的盘片都固定在盘片主轴上。所有的盘片之间是平行的,每个盘片(一个盘片两个盘面)的每个存储面上都有一个磁头,磁头与盘片之间的距离极小。所有的磁头(一个有效盘面就有一个磁头)连在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向做径向运动(就是沿着半径由圆心到圆周线做直线运动),而盘片以每分钟数千转的速度在高速旋转,这样磁头就能对盘片上的指定位置进行数据的读写操作了。

2.2.1 磁头组件

磁头组件由读写磁头和磁头驱动装置部分组成。

  • 磁头是磁盘技术中最重要和关键的一环,实际上是集成工艺制成的多个磁头的组合,它采用了非接触式头、盘结构,加电后在高速旋转的磁盘表面移动,与盘片之间的间隙只有0.1~0.3um(微米),这样可以获得很好的数据传输率。现在转速为7200RPM的磁盘飞高一般都低于0.3um,以利于读取较大的高信噪比信号,确保数据传输可靠性。

磁盘读取数据的工作原理是利用特定的磁粒子的极性来记录数据。磁头在读取数据时,将磁粒子的不同极性转换成不同的电脉冲信号,再利用数据转换器将这些原始信号变成电脑可以使用的数据,写的操作正好与此相反。

  • 磁头驱动装置。磁盘的寻道是靠移动磁头,而移动磁头则需要该装置驱动才能实现。磁头驱动装置由电磁线圈电机、磁头驱动小车、防震动装置构成,高精度的轻型磁头驱动装置能够对磁头进行正确的驱动和定位,并能在很短的时间内精确定位系统指令指定的磁道。其中电磁线圈电机包含着一块永久磁铁,这是磁头驱动装置对传动手臂起作用的关键。防震动装置在老磁盘中没有,它的作用是当磁盘受动强裂震动时,对磁头及盘片起到一定的保护使用,以避免磁头将盘片刮伤等情况的发生。
2.2.2 磁盘片、主轴组件及前置控制电路
  • 磁盘片。盘片是磁盘存储数据的真正载体,磁盘盘片大多采用金属薄膜材料(也有玻璃材料),这种金属薄膜较软盘的不连续颗粒载体具有更高的存储密度、高剩磁及高矫顽力等优点。磁盘盘片是很光滑平整的。

  • 主轴组件。主轴组件包括如轴承和驱动电机等。随着磁盘容量的扩大和速度的提高,主轴电机的速度也在不断提升,有厂商开始采用精密机械工业的液态轴承电机技术。

    说明:磁盘主轴的转数是衡量磁盘读写性能的重要参考之一。例如:SAS 15k,SATA 10k

  • 前置控制电路。前置电路控制磁头感应的信号、主轴电机调速、磁头驱动和伺服定位等,由于磁头读取的信号微弱,将放大电路密封在腔体内可减少外来信号的干扰,提高操作指令的准确性。

2.2.3 磁盘的控制电路

磁盘的控制电路位于磁盘背面,将背面电路板的安装螺丝拧下,翻开控制电路板即可见到控制电路。

磁盘控制电路分为:主控制芯片、数据传输芯片、高速数据缓存芯片等。其中主控制芯片负责磁盘数据读写指令等工作。数据传输芯片则是将磁盘磁头前置控制电路读取出数据经过校正及变换后,经过数据接口传输到主机系统,高速数据缓存芯片是协调磁盘与主机在数据处理速度上的差异。缓存对磁盘性能所带来的作用是毋庸置疑的,在读取零碎文件数据时,大缓存能带来非常大的优势,因此16MB 甚至32MB等缓存的磁盘产品早年就已出现。缓存无处不在。

2.3 磁盘的接口类型

磁盘接口是磁盘与主机系统间的连接部件,作用是在磁盘缓存和主机内存之间传输数据。不同的磁盘接口决定着磁盘与计算机之间的连接速度,在整个系统中,磁盘接口的优劣直接影响着程序运行快慢和系统性能好坏。

从整体的角度上,磁盘接口分为IDE、SCSI、SATA和光纤FC通道四种。

  • IDE (Integrated Drive Electronics):老旧的接口标准,也称为PATA(Parallel ATA),主要用于连接硬盘和光驱到主板。IDE接口使用扁平电缆,通常有40或80针,早期多用于家用产品中,部分应用于服务器。

  • SCSI (Small Computer System Interface):老旧的接口标准,早期主要应用于服务器和工作站,因为它可以支持多个设备并行连接。

    • SAS (Serial Attached SCSI):是SCSI的串行版本,提供更高的传输速度和更灵活的拓扑结构。而且向后兼容SATA,意味着SAS控制器可以识别和控制SATA设备。
  • SATA (Serial ATA):目前最常见的硬盘接口类型,更快的数据传输速率,在家用市场和服务器市场都是逐渐流行的态势。SATA接口支持热插拔,即在系统运行时插入或移除设备。

  • 光纤通道 (Fibre Channel):高速网络技术,主要用于存储区域网络(SANs),特别在企业级服务器和数据中心中使用。

除此之外,还有一些其他的接口类型逐渐进入服务器市场

  • M.2:这是一种直接安装在主板上的小型接口,主要用于固态硬盘(SSD)。M.2支持两种接口标准:PCIe NVMe和SATA,其中PCIe NVMe提供更快的传输速度,目前已有相当的服务器支持M.2接口的磁盘。

  • PCIe (Peripheral Component Interconnect Express):虽然不是传统意义上的磁盘接口,但许多现代的高性能SSD使用PCIe接口直接与主板通信,提供极高的数据传输速率。

除了上述接口类型,还有一些较为特殊的接口,例如ZIF(Zero Insertion Force)、LIF(Low Insertion Force)和U.2(前称SFF-8639),它们主要用于特定类型的固态硬盘或高端存储解决方案。

备注:总的来说SAS技术是结合了SATA与SCSI两者的优点而诞生的,同时串行SCSI(SAS)是点到点的结构,因此除了提高性能之外,每个设备连接到指定的数据通路上提高了带宽从而为数据传输与存取提供了必要保障。

Serial-Attached SCSI (SAS) 企业生产环境主流磁盘的相关信息对比:

  • 企业生产场景普及程度:SAS > SSD > SATA
  • 单位容量对比性能和价格: SSD > SAS > SAT4(一块SSD和一块SATA)
  • 单位价格购买磁盘容量: SATA > SAS > SSD

2.4 生产磁盘的选型和应用

生产工作中服务器的选型往往倾向于主流大厂DELL,HP,IBM等,其中DELL,HP是互联网公司的主流服务器,这两个品牌的服务器综合的性价比比较高。随着国产化的趋势蔓延,浪潮、联想、华三、华为等国内大厂的设备也开始进入采购清单里。

当前服务器市场的主流磁盘为SAS、SATA、SSD硬盘。

  • 企业级SAS硬盘(默认)

企业里常见的SAS硬盘是15000转/分(这里就是主轴的转数)。当前主流300G、600G、1000G,从具体的业务需求及性价比考虑。单盘容量不建议太大,除非用于存储备份等功能。在满足容量的基础上,尽量保证4块硬盘。

主要用途是提供生产线上的普通对外提供服务的业务服务器。例如:生产线上的数据库业务、存储业务、图片业务及相关高并发业务,总的来说,如果没有特殊业务需求,SAS磁盘是生产环境首选的的磁盘配置。

  • 企业级SATA硬盘

企业级 SATA硬盘,7200-10000转/分,常见的容量为1T、2T、4T等,优点是经济实惠、容量大。从具体的业务需求及性价比考虑,在工作中多用SATA磁盘做线下不提供服务的数据存储或者并发业务访问不是很大的业务应用,比如站点程序及数据库、图片的线下备份等。特点是容量性价比高,一般2T的SATA磁盘较佳。

【磁盘选购小结】

  • 线上的业务,用SAS磁盘。
  • 线下的业务,用SATA磁盘,磁带库。
  • 线上高并发、小容量的业务,SSD磁盘。
  • 成本思想:根据数据的访问热度,智能分析分层存储。SATA+SSD

【企业故障案例】

不要用SATA磁盘来做在线高并发服务的数据存储或数据库业务,这是血的教训的。某公司采用SATA做数据库的存储盘,结果导致数据库连续宕机一个月。

配置:5台SATA盘RAID5。

解决方法:重新买5台,把磁盘从SATA (RAID5)换成SAS (RAID10)。6个月内没事。

数据库集群:

  • 主库选择用SAS RAID10,从库SAS RAID0。

  • 当数据库使用的引擎是MyISAM引擎,改成Innodb引擎。

  • SSD固态电子盘

一般用于数据量小并且有超大规模高并发的业务(当然这种业务还可以通过磁盘加内存缓存的技术方式解决这个大规模并发的问题)。大厂核心业务都会采用SSD磁盘,应用层也必须做各种缓存。甚至某些业务可能会根据数据的热度来综合使用分层存储,以达到性价比最佳的情况。

2.5 磁盘核心知识内容

  • 磁盘相关名词
名词简单说明
磁盘(Disk)存储设备
磁头(Head)磁盘读写数据的关键部件,负责在磁盘表面读取或写入数据。
扇区(Sector)磁盘上的最小可寻址单位,每个扇区存储一定量的数据(例如512字节)。所有扇区大小相同,并且包含一个固定的地址,用于定位数据。
磁道(Track)在磁盘表面上,以盘片中心为圆心的不同半径的圆形磁化轨迹,磁头在一条磁道上读写数据。
柱面(Cylinder)在多盘片硬盘中,同一半径的所有磁道组合成一个柱面,这是磁盘上一个垂直的结构。
单元块(Units)有时指的是文件系统中的块,即文件系统用于存储数据的基本单位,可能包含一个或多个扇区。
数据块(Block)与单元块相似,指的是文件系统中的存储单位,通常比扇区大。
索引节点(Inode)用于存储文件的元数据,包括权限、所有者、时间戳等,但不包括文件名。

2.5.1 磁盘的认知

一般来说,一块磁盘有1个到数个盘片不等,其中每个盘片的有效盘面对应一个读写磁头,从上往下从0开始依次编号,不同的磁盘盘面在逻辑上被划分为磁道、柱面以及扇区,一般在出厂时就设定好了这些。

  • 磁盘的磁头

磁盘的每个盘片的每个有效盘面都会有一个读写磁头(磁头数=盘片个数*2),磁盘盘面区域的划分如图所示。

  • 在磁盘不工作的时候,磁头停靠在靠近主轴接触盘片的表面,即线速度最小的地方,如右图,这里是一个不存放任何数据的特殊区域,称为启停区或着陆区(Landing Zone) ,启停区以外就是数据区。
  • 在磁盘的最外圈,离主轴最远的磁道称为“0”磁道,磁盘数据的存放就是从最外圈“0”磁道开始的。在磁盘中还有一个用来完成磁盘初始定位的“0”磁道检测器构件,由这个构件完成磁头对“0”磁道的定位。
  • “0”磁道非常重要,系统的引导程序就在0柱面0磁道1扇区的前446Bytes。
  • 早期的磁盘在每次关机之前需要运行一个被称为Parking的程序,其作用是在系统关机前让磁头回到启停区。现代磁盘在设计上已摒弃了这个缺陷。磁盘不工作时,磁头会自动停留在启停区,当磁盘需要读写数据时,磁盘主轴盘片开始旋转。旋转速度达到额定的高速时,磁头就会因盘片旋转产生的气流而抬起,这时磁头才向盘片存放数据的区域移动并开始读取数据。
  • 盘片旋转产生的气流很强,足能够把磁头托起,并与盘面保持一个微小的距离。这个距离越小,磁头读写数据的灵敏度就越高,当然对磁盘各部件的要求也越高。气流使磁头非常紧密地跟随着磁盘表面呈起伏运动,使磁头飞行处于严格受控状态。
  • 因为磁盘的磁头飞行悬浮高度低、速度快,一旦有小的尘埃进入磁盘密封腔内,或者一旦磁头与盘体发生碰撞,就可能造成数据丢失,形成坏块,甚至造成磁头和盘体的损坏。所以,磁盘系统的密封一定要可靠,在非专业条件下绝对不能开启磁盘密封腔。另外,磁盘驱动器磁头的寻道伺服电机多采用音圈式旋转或直线运动步进电机,在伺服跟踪的调节下精确地跟踪盘片的磁道,所以,磁盘工作时不要有冲击碰撞,搬动时要小心轻放。
  • 磁盘的盘面

磁盘的盘片一般是用铝合金材料或玻璃做基片。磁盘的每一个盘片都有两个盘面,即上、下盘面,一般来说,每个盘面都可以存储数据,成为有效盘面,也有极个别的磁盘盘面数为单数。每一个这样的有效盘面都有一个盘面号,按顺序从上至下从“0”开始依次编号因为每一个有效盘面都有一个对应读写磁头,盘面号又叫磁头号。磁盘的盘片组在2~14片不等,通常有2~3个盘片(如300G 15K SAS盘就是3个盘片),故盘面号(磁头号)为0-3或0-5不等。

注意:盘面的个数等于磁头的个数。

  • 磁盘的磁道

磁盘在格式化时被划分成许多同心圆,这些同心圆的轨迹叫做磁道(Track)磁道由盘面从外向内依次从0开始顺序编号。

磁盘的每一个盘面一般有300-1024个磁道,新式大容量磁盘每个盘面的磁道数可能会更多。信息以脉冲串的形式记录在这些轨迹中,这些同心圆轨迹不是连续的记录数据,而是被划分成一段段的圆弧。这些圆弧的角速度一样,由于径向长度不一样,所以,线速度也不一样,外圈的线速度较内圈的线速度大,即同样的转速下,外圈在同样时间段里,划过的圆弧长度要比内圈划过的圆弧长度大(但是读取到的数据是一样的)。这样的每段圆弧叫做一个扇区,扇区从“1”开始编号,每个扇区中的数据作为一个单元同时读出或写入。一个标准的3.5寸磁盘盘面通常有300-1024个磁道。特别说明,磁道是“看”不见的,只是在盘面上以特殊形式磁化了的一些磁化区,在磁盘格式化时就已规划完毕了。

【提示】

  • 角速度: 一个以弧度为单位的圆(一个圆周为2Π,即:360度=2П),在单位时间内所走的弧度即为角速度。公式为:ω=Ч/t(Ч为所走过弧度,t为时间)ω的单位为:弧度每秒。连接运动质点和圆心的半径在单位时间内转过的弧度叫做“角速度”。它是描述物体转动或一质点绕另一质点转动的快慢和转动方向的物理量。
  • 线速度: 物体上任一点对定轴作圆周运动时的速度称为“线速度”。它的一般定义是质点(或物体上各点)作曲线运动(包括圆周运动)时所具有的即时速度。它的方向沿运动轨道的切线方向,故又称切向速度。它是描述作曲线运动的质点运动快慢和方向的物理量。
  • 磁盘的柱面

一个磁盘所有的盘面上同一个半径相同的磁道的圆形轨迹从上到下依次组成一个圆柱体,就称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。一块磁盘的柱面数(或每个盘面的磁道数)既取决于每条磁道的宽窄(也会与磁头的大小有关),也取决于定位机构所设定的磁道间步距的大小。这些都是在出厂前就完成设定的。特别注意:这里的柱面数和前面的磁道数是一样的。

提示:

  • 给磁盘分区实际就是划分柱面号及扇区号。

  • 柱面是所有盘面上相同半径的不同磁道的集合。

  • 一块硬盘柱面数等于一个盘面的磁道数。

  • 磁道是多个扇区的集合。

  • 磁盘的扇区

操作系统是以扇区(Sector)为单位将信息存储在磁盘上的,一般情况下,每个扇区的大小是512字节。一个扇区主要有两部分内容:存储数据地点的标识符和存储数据的数据段。

扇区的第一个主要部分是标识符。标识符就是扇区头标,包括组成扇区三维地址的三个数字:扇区所在的磁头(或盘面)、磁道(或柱面号)以及扇区在磁道上的位置即扇区号。头标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些磁盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束以供控制器检验扇区头标的读出情况,确保准确无误。

扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC.在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的 ECC数字填入这个部分。

磁道柱面扇区总括:

磁盘最基本的组成部分是由坚硬的金属材料制成的涂以磁性介质的盘片(有很多层),不同容量磁盘的盘片数不等。
记忆要点:

  1. 一块磁盘有2-14个盘片,每个盘片有两个面,每个面对应一个读写磁头,用磁头号来区分盘面,即盘面数就是磁头数,盘片数*2=磁头数(盘面数)。
  2. 不同盘面的磁道被划分为多个扇形区域,每个区域就是一个扇区 (Sector)。
  3. 同一个盘面,以盘片中心为圆心,每个不同半径的圆行轨迹就是一个磁道(Track)。
  4. 不同盘面相同半径的磁道组成一个圆柱面就是柱面(Cylinder)。
  5. 一个柱面包含多个磁道(这些磁道的半径相同),一个磁道包含多个扇区。
  6. 数据信息记录可表示为:某磁头,某磁道(柱面),某扇区。

一句话概括定义

  • 磁道: 每个盘片有两个面,都可记录信息。盘片表面以盘片中心为圆心,用于记录数据的不同半径的圆形磁化轨迹就称为磁道。磁化轨迹是磁化区域,是看不见的。磁道看起来是一个平面圆周形。

  • 扇区: 盘面由圆心向四周画直线,不同的磁道被直线分成许多扇形(弧形)的区域每个弧形的区域叫做扇区,每个扇区大小一般为512字节,扇区看起来就是圆弧或扇形1.1.2.3柱面的一句话概括定义

  • 柱面: 磁盘中,不同的盘片(或盘面)相同半径的磁道轨迹从上到下所组成的圆柱型区域就称为柱面,柱面看起来是一个圆柱形。

2.5.2 磁盘容量计算(了解即可)

每个盘片有两个面,每个面有一个读写磁头,因此,一般我们习惯用磁头号来区分盘面。

扇区,磁道(或柱面)和磁头数构成了磁盘结构的基木参数,通过这些参数可以得到磁盘的容量,基本计算公式为:

涉及到的基本参数:磁头数、磁道数(柱面数)、每个磁道的扇区数、每个扇区的字节数、

  • 计算方法一(盘面角度):
存储容量 = 磁头数 * 磁道数 * 每个磁道的扇区数 * 每个扇区的字节数(512字节)

每个磁道的容量 = 512字节 * 扇区数; 
每个盘面的容量 = 单个磁道容量 * 磁道数 = (512字节 * 扇区数)* 磁道数; 

存储容量 = 单个盘面容量 * 磁头数 = (512字节 * 扇区数 * 磁道数)* 磁头数; 
  • 计算方法二(柱面角度):
存储容量 = 柱面大小(每个磁道的扇区数 * 每个扇区的字节数 * 磁头数)* 柱面数(磁道数)

一个柱面的容量 = 每个磁道的扇区数 * 512 * 磁头数 
存储容量 = 柱面大小 * 柱面数(磁道数)       
		=(每个磁道的扇区数 * 每个扇区的字节数 * 磁头数)* 柱面数(磁道数) 

一块磁盘的磁道数和柱面数的数量是永远相等的。

2.5.3 磁盘的工作原理
  • 磁盘的读写流程及原理

磁盘的数据 读/写 一般是按柱面进行的,即磁头读/写数据时首先在同一柱面内从“0"”磁头开始进行操作,依次向下在同一柱面的不同盘面即不同磁头上进行操作,只有同一柱面所有的磁头全部读/写完毕后,磁头才转移到下一柱面(即寻道),因为切换磁头只需通过电子设备切换即可,而切换柱面则必须通过机械设备切换。电子磁头间的切换比机械磁头向邻近磁道或柱面切换要快得多。所以,数据的读/写按柱面进行,而不按盘面进行。也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面的相同半径磁道来写,一个柱面写满后,才移到下一个柱面开始写数据。读数据也按照这种方式进行,这样就大大提高了磁盘的读/写效率。

读写数据时,先操作同一个柱面不同盘面的数据,如果仍未读完,才移动磁头。(磁盘的读写是按照柱面读写)

  • 磁盘的读写原理详细说明

当操作系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,依次是同一柱面的下一磁头(也可以说下一盘面),……,一个柱面存储满后就通过步进电机把磁头移动到下一个柱面(即寻道),继续写入数据,直到把文件内容全部写入磁盘。
系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则直接使磁头部件步进到相应的柱面,选则相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。
待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路,还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁盘继续旋转。

  • 读写磁盘数据小结
  1. 磁盘是按照柱面为单位读写数据的,即先读取同一个盘面的某一个磁道,读完之后,如果数据没有读完,磁头也不会切换其他的磁道,而是选择切换磁头,读取下一个盘面的相同半径的磁道,直到所有盘面的相同半径的磁道读取完成之后,如果数据还没有读写完成,才会切换其他不同半径的磁道,这个切换磁道的过程称为寻道。
  2. 不同磁头间的切换是电子切换,而不同磁道间的切换需要磁头做径向运动,这个径向运动需要步进电机调节,这个动作是机械的切换。
  3. 磁头寻道是机械运动,切换磁头是电子切换。

3.第二层:Raid和LVM

3.1 Raid介绍

Raid是独立冗余磁盘阵列(Redundant Array of Inexpensive Disk)的简称,有时也简称磁盘阵列(Disk Array)。它是一种把多块独立的物理磁盘按不同的技术方式组合起来形成一个磁盘组,在逻辑上(做完RAID,装系统后)看起来就是一块大的磁盘,可以提供比单个物理磁盘更大的存储容量或更高的存储性能,同时又能提供不同级别数据冗余备份的一种技术。

用RAID最直接的好处是:

  1. 提升数据安全性。
  2. 提升数据读写性能。
  3. 提供更大的单一逻辑磁盘数据容量存储。

3.2 Raid级别介绍

把多个物理磁盘通过不同的技术方式组成磁盘阵列,这个不同的技术方式就被称为RAID级别。

生产环境常用的Raid 的级别:为Raid 0Raid 1Raid 5Raid 10

  • 这些RAID级别的优、缺点比较:
RAID级别关键优点关键缺点应用场景
RAID 0读写速度最快没有冗余集群节点RS
RAID 1100%冗余读写性能一般,成本高单独的,数据重要的,不能宕机的业务。往往用作系统盘
RAID 5具备一定的性能和冗余,可以坏一块盘。读性能不错写入性能一般一般业务都可以用
RAID 10读写很快,100%冗余成本高性能和冗余要求都很好的业务。数据库主库和存储的主节点。

冗余,指重复配置系统的一些部件,当系统发生故障时,冗余配置的部件介入并承担故障部件的工作,由此减少系统的故障时间 Redundant,自动备援,即当某一设备发生损坏时,它可以自动作为后备式设备替代该设备。

3.3 Raid技术分类

常见RAID技术分为两种:基于硬件的RAID技术和基于软件的RAID技术。

  • 软RAID技术:

在Linux下在安装系统过程中或者安装系统后通过自带的软件就能实现软RAID功能,使用软RAID可省去购买昂贵的硬件RAID控制器和附件就能极大地增强磁盘的IO性能和可靠性。由于是用软件去实现的RAID 功能,所以它配置灵活、管理方便。同时使用软件RAID,还可以实现将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的。

  • 硬RAID技术:

基于硬件的RAID解决方案比基于软件RAID技术在使用性能和服务性能上会更胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。从安全性上考虑,基于硬件的RAID解决方案也是更安全的。因此,在实际的生产场景工作中,基于硬件的RAID解决方案应该是我们的首选。例如比较常用的DELL服务器,默认的就会支持RAID0,1(主板板载RAID);如果RAID5,10就需要买RAID卡(独立RAID卡)。

3.4 常用RAID级别细节说明

3.4.1 RAID 0 级别详解
  • RAID 0 描述

RAID0又称为Stripe(条带化)或Striping(条带模式),它在所有RAID级别中具有最高的存储性能。

RAID0提高存储性能的原理是把连续的数据分散到多个磁盘上存取。这样,系统有数据读写请求就可以在多个磁盘并行的执行,每个磁盘读写属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。

要制作RAID0要求至少是1块物理磁盘,一般用来做RAID的不同磁盘大小最好一样(可以充分发挥并行优势);而数据分散存储于不同的磁盘上,在读写的时候可以实现并发,所以,RAID0读写性能最好;但是没有容错功能,即任何一个磁盘的损坏会导致整个RAID的全部数据丢失;生产中使用单盘,要做成RAID0,否则可能无法使用。

如图所示:系统向三个磁盘组成的逻辑磁盘(RADI 0磁盘组)发出的I/O数据请求被转化为3项操作,其中的每一项操作都对应于一块物理磁盘。我们从图中可以清楚的看到通过建立RAID 0,原先顺序的数据请求被分散到所有的3块磁盘中同时执行。从理论上讲,三块磁盘的并行操作使同一时间内磁盘读写速度提升了3倍。

但由于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是,大量数据并行传输与串行传输比较,提速效果显著显然毋庸置疑。

RAID 0的缺点是不具备数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。RAID0具有的特点,使其特别适用于对性能要求较高,而对数据安全不太在乎的领域,

  • 生产应用场景
  1. 负载均衡集群下面的多个相同RS节点服务器。
  2. 分布式文件存储下面的主节点或CHUNK SERVER。
  3. MySQL主从复制的多个Slave服务器。
  4. 对性能要求很高,对冗余要求很低的相关业务。
3.4.2 RAID 1 级别详解
  • RAID 1 描述

RAID1又称为Mirror 或 Mirroring(镜像),它的宗旨是最大限度的保证用户数据的可用性和可修复性。RAID1的操作方式是把用户写入一个磁盘的数据百分之百地自动复制到另外一个磁盘上,从而实现存储双份的数据。

要制作RAID1,要求至少是两块磁盘(支持偶数块盘),整个RAID大小等于两个磁盘中最小的那块磁盘的容量(当然,最好使用同样大小的磁盘),数据有50%的冗余,在存储时同时写入两块磁盘,实现了数据完整备份;但相对降低了写入性能,但是读取数据时可以并发,相当于两块Raid0的读取效率(有待实践验证)。

  • 当读取数据时,系统先从RAID1的源盘读取数据,如果读取数据成功,则系统不去管备份盘上的数据;如果读取源盘数据失败,则系统自动转而读取备份盘上的数据,不会造成用户工作任务的中断(有待验证)。当然,我们应当及时地更换损坏的磁盘并利用备份数据重新建立Mirror,避免备份盘在发生损坏时,造成不可挽回的数据损失。

  • 由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而Mirror(镜像)的磁盘空间利用率低,存储成本高。Mirror虽不能提高存储性能,但由于其具有极高的数据安全性,使其适用于存放重要数据,如传统企业对性能要求不高,对数据要求高的服务器和数据库存储等领域。

3.4.3 RAID 5 级别详解
  • RAID 5 描述

RAID 5是一种存储性能、数据安全和存储成本兼顾的存储解决方案。

RAID5需要三块或以上的物理磁盘,可以提供热备盘实现故障的恢复;采用奇偶校验,可靠性强,且只有同时损坏两块硬盘时数据才会完全损坏,只损坏一块硬盘时,系统会根据存储的奇偶校验位重建数据,临时提供服务;此时如果有热备盘,系统还会自动在热备盘上重建故障磁盘上的数据。

RAID 5可以理解为是RAID 0和RAID 1的折衷方案。RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低而磁盘空间利用率要比 Mirror高。RAID 5具有和RAID 0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较低。

RAID 5是把数据和相对应的奇偶校验信息存储到组成RAID 5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID 5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

3.4.4 RAID 10 级别详解
  • RAID 01 和 RAID 10

RAID 10实际上有两种表现形式:Raid0+Raid1Raid1+Raid0,是将磁盘按照两种不同的方式进行的逻辑组合。

  • RAID 01 = RAID 0+1:先做RAID 0,再做RAID 1

  • RAID 10 = RAID 1+0:先做RAID 1,再做RAID 0

以四块硬盘做RIAD来细说他们的区别:

  • RAID10是先将四块硬盘在纵向上分别两两做镜像,镜像后再在横向上做条带。简而言之:RAID10是先做镜像后做条带。在这种情况下,如果只是坏掉其中的一个硬盘,对RAID组的影响都不是非常大,只要不是同时坏掉其中的一个硬盘和他的镜像盘RAID组都不会崩溃。

  • RAID01是先将四块硬盘中横向上两两做条带,然后再纵向上做镜像。简而言之:先条带后镜像。这种情况下如果两个条带上有任意两块硬盘坏掉了,则整个RAID组都将崩溃了。不管发生介质损坏的两块硬盘是否是镜像盘。

RAID 0+1的特点使其特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域,如银行、金融、商业超市、仓储库房、各种档案管理等。

如图,假设左边的RAID 0系统中有一块磁盘损坏,此时左边的RAID 0系统便没有丝毫作用了。所有的IO均转向右边的RAID 0系统。而此时,仅仅允许左边剩余的那块磁盘损坏。如果右边任何一块磁盘损坏,则整体数据将不可用。所以这个系统的冗余度变成了1,即只允许损坏特定的一块磁盘(左边RAID0系统剩余的磁盘)。

综上所述,RAID 10系统要比RAID01系统冗余度高,安全性高。

总而言之,RAID10 和 RAID01在读和写的性能上没有太大的差别,从发生故障的概率上看,RAID01 是远大于RAID10 的。一般情况下选择RAID10的情况会多些。

3.4.5 各个级别的特点和区别
RAID类型最少需要几块盘安全冗余可用容量性能使用场景举例
RAID 01最低所有硬盘容量之和读写最快只要求速度不要求安全数据库从库;存储从库
RAID 12100%一半写入慢,读取可以只要求安全不要求速度系统盘
RAID 53可以损坏一块损失一块盘的容量写入较慢,读取可以速度和安全的要求一般一般业务
RAID 104可以损坏一半损失所有容量的一半读写很快全都要高并发或高访问量主库
  • 总结:
  • Raid 0支持1块盘到多块盘,容量是所有盘之和。

  • Raid 1最少2块盘,容量损失一半。

  • Raid 5最少三块盘,不管硬盘数量多少,只损失一块盘容量。

  • Raid 6最少4块盘,5块盘也可以,损失2块盘,不管硬盘多少,只损失两块盘容量。

  • Raid10最少4块盘,必须偶数硬盘,不管硬盘多少,都损失一半容量,不支持虚拟磁盘。

3.5 LVM介绍

LVM全称为逻辑卷管理(Logical Volume Manager),是一种在Linux操作系统中用于管理和优化磁盘存储的技术。LVM提供了一种灵活的方式来管理硬盘和分区,它允许用户在不中断系统服务的情况下动态调整存储容量,提高了存储资源的利用率和管理效率。

优点包括:

  • 允许在系统运行时动态地增加或减少逻辑卷的大小,无需重新分区或重启系统,极大提升了存储管理的灵活性。
  • 将多个物理磁盘组合成卷组,实现了存储资源的池化,使得存储空间可以更高效地被管理和分配。
  • 提供了一个统一的抽象层来管理存储,使得添加、删除或更换磁盘变得简单易行,降低了管理复杂度。

缺点包括:

  • 相较于传统的分区管理,配置和管理较为复杂,需要一定的学习成本。
  • 虽然可以优化存储性能,但在某些场景下,尤其是涉及大量小文件读写时,由于额外的抽象层,可能会有轻微的性能损失。
  • 在特定情况下,例如系统崩溃,恢复LVM配置可能比标准分区更为复杂。
  • 本身需要占用少量的系统资源,包括磁盘空间用于元数据管理,以及在处理大量I/O请求时可能消耗更多的CPU资源。

LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分区的动态调整,LVM的技术架构如图。

LVM体系结构包括三个基本概念:

  • 物理卷(Physical Volume, PV):LVM的基础构建块,通常对应于一个硬盘分区或整个硬盘。物理卷上包含可供LVM使用的存储容量,这些容量被划分为称为“物理区域(physical extents)”的小块。

  • 卷组(Volume Group, VG):一个或多个物理卷可以组合成一个卷组,这构成了LVM的存储池。卷组中的物理区域形成了一个连续的地址空间,LVM在此基础上创建逻辑卷。

  • 逻辑卷(Logical Volume, LV):从卷组中分配一部分物理区域创建而成,逻辑卷对操作系统来说就像一个普通的块设备,可以在其上创建文件系统。逻辑卷的大小可以根据需要动态调整,而且可以轻松迁移或扩展,而不会影响到数据的可用性。

  • 三者之间的关系类似于PV组成LG,LG分割出LV

LVM的核心理念:

物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列, 这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也 可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立 后可以动态地扩展或缩小空间。

3.5.1 部署逻辑卷

部署LVM时,需要逐个配置物理卷、卷组和逻辑卷。常用部署命令如下:

功能物理卷管理命令卷组管理命令逻辑卷管理命令
扫描pvscanvgscanlvscan
建立pvcreatevgcreatelvcreate
显示pvdisplayvgdisplaylvdisplay
删除pvremovevgremovelvremove
扩展vgextendlvextend
缩小vgreducelvreduce

演示:在虚拟机中添加两块新硬盘设备,然后开机

  • 第一步:查看硬盘
[root@localhost ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x000bc797

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200     5244927     1572864   82  Linux swap / Solaris
/dev/sda3         5244928    41943039    18349056   83  Linux

Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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


Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 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
  • 第二步:让新添加的两块硬盘设备支持LVM技术(创建物理卷)
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  
# 提示没有该命令的话,则安装软件包 yum -y install lvm2
  • 第三步:把两块硬盘设备加入到storage卷组中,然后查看卷组的状态
# 创建卷组
[root@localhost ~]# vgcreate storage /dev/sdb /dev/sdc
  Volume group "storage" successfully created
  
# 语法: vgcreate 卷组名 磁盘1 磁盘2 ...
# 查看卷组
[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5118 / 19.99 GiB
  VG UUID               FdPjR1-cfK2-Hs1a-h6nh-hEZZ-1dun-bBhOSp
  • 第四步:切割出一个5G的逻辑卷设备

在对逻辑卷进行切割时有两种计量单位。第一种是以容量为单位,所使用的参数为 -L。例如,使用-L 5G生成一个大小为5GB的逻辑卷。另外一种是以基本单元的个数为单位,所使用的参数为-l ,每个基本单元的大小默认为 4MB。例 如,使用-l 37可以生成一个大小为37×4MB=148MB的逻辑卷。

[root@localhost ~]# lvcreate -n vo1 -L 5G storage 
  Logical volume "vo1" created.
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo1
  LV Name                vo1
  VG Name                storage
  LV UUID                fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
  • 第五步:把生成好的逻辑卷进行格式化,然后挂载使用

Linux 系统会把LVM 中的逻辑卷设备存放在/dev设备目录中(实际上是做了一个符号链接),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组 名称/逻辑卷名称)。

[root@localhost dev]# find / -name vo1
/dev/storage/vo1
[root@localhost dev]# mkfs.ext4 /dev/storage/vo1 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# mkdir ceshi
[root@localhost ~]# mount /dev/storage/vo1 ceshi/
  • 查看挂载状态,并写入到配置文件,使其永久生效。
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  4.8G   20M  4.6G   1% /root/ceshi

echo "/dev/storage/vo1 /root/ceshi ext4 defaults 0 0" >> /etc/fstab
3.5.2 扩容逻辑卷
  • 第一步:把上一个实验中的逻辑卷vo1扩展至7G
# 卸载设备和挂载点(可选)
[root@localhost ~]# umount /root/ceshi

[root@localhost ~]# lvextend -L 7G /dev/storage/vo1 
  Size of logical volume storage/vo1 changed from 6.00 GiB (1536 extents) to 7.00 GiB (1792 extents).
  Logical volume storage/vo1 successfully resized.
  • 第二步:检查硬盘完整性,并重置硬盘容量。
[root@localhost ~]# e2fsck -f /dev/storage/vo1 
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo1: 11/393216 files (0.0% non-contiguous), 62574/1572864 blocks

[root@localhost ~]# resize2fs /dev/storage/vo1 
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1835008 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1835008 blocks long.
  • 第三步:重新挂载硬盘设备并查看挂载状态。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  6.8G   23M  6.4G   1% /root/ceshi
  • 注意1:e2fsck命令、resize2f命令、xfs_growf命令

e2fsck是检查ext2、ext3、ext4等文件系统的正确性和完整性,并修复任何问题。如果有任何问题,请根据提示进行修复。

resize2fs是ext2/ext3/ext4文件系统重定义大小工具。使用中将调整文件系统的大小,并根据需要扩展或收缩文件系统。

xfs_growf是xfs文件系统重定义大小工具。在处理xfs文件系统时,使用xfs_growf替换resize2fs。

  • 不卸载的方式(挂载扩容)
[root@localhost ~]# lvextend -L 7G /dev/storage/vo1 
  Size of logical volume storage/vo1 changed from 6.00 GiB (1536 extents) to 7.00 GiB (1792 extents).
  Logical volume storage/vo1 successfully resized.
[root@localhost ~]# resize2fs /dev/storage/vo1 
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1835008 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1835008 blocks long.  
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  6.8G   23M  6.4G   1% /root/ceshi
3.5.3 缩小逻辑卷

相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产 环境中执行相应操作时,一定要提前备份好数据。另外Linux系统规定,在对LVM逻辑卷进 行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执 行缩容操作前记得先把文件系统卸载掉。

  • 第一步:检查文件系统的完整性。
[root@localhost ~]# umount /root/ceshi 
[root@localhost ~]# e2fsck -f /dev/storage/vo1     # 不先卸载的话,执行该命令会报错
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo1: 11/655360 files (0.0% non-contiguous), 79663/2621440 blocks
  • 第二步:把逻辑卷vo的容量减小到5G
[root@localhost ~]# resize2fs /dev/storage/vo1 5G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1310720 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1310720 blocks long.

[root@localhost ~]# lvreduce -L 5G /dev/storage/vo1 
  WARNING: Reducing active logical volume to 5.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage/vo1? [y/n]: y
  Size of logical volume storage/vo1 changed from 10.00 GiB (2560 extents) to 5.00 GiB (1280 extents).
  Logical volume storage/vo1 successfully resized.
  • 第三步:重新挂载文件系统并查看系统状态。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  4.8G   20M  4.6G   1% /root/ceshi
3.5.4 逻辑卷快照

LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可 以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快 照卷进行覆盖还原。LVM的快照卷功能有两个特点:

  • 快照卷的容量必须等同于逻辑卷的容量;
  • 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。

首先查看卷组的信息。

[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       1280 / 5.00 GiB
  Free  PE / Size       3838 / 14.99 GiB
  VG UUID               FdPjR1-cfK2-Hs1a-h6nh-hEZZ-1dun-bBhOSp

通过卷组的输出信息可以清晰看到,卷组中已经使用了 5GB 的容量,空闲容量还有 14.99GB。接下来用重定向往逻辑卷设备所挂载的目录中写入一个文件。

[root@localhost ~]# echo "Welcome to LVM" > /root/ceshi/readme.txt
[root@localhost ~]# ls -l /root/ceshi/
total 20
drwx------ 2 root root 16384 Jul 11 16:34 lost+found
-rw-r--r-- 1 root root    15 Jul 11 19:41 readme.txt
  • 第1步:使用-s参数生成一个快照卷,使用-L参数指定切割的大小。另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作。
[root@localhost ~]# lvcreate -L 5G -s -n BAK /dev/storage/vo1 
  Logical volume "BAK" created.
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo1
  LV Name                vo1
  VG Name                storage
  LV UUID                fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
  LV snapshot status     source of
                         BAK [active]
  LV Status              available
  # open                 1
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/storage/BAK
  LV Name                BAK
  VG Name                storage
  LV UUID                bYJmju-ZZn2-FYkw-PcUq-H7k8-awBM-LHLm1u
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 19:51:46 +0800
  LV snapshot status     active destination for vo1
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  COW-table size         5.00 GiB
  COW-table LE           1280
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
  • 第2步:在逻辑卷所挂载的目录中创建一个1GB的垃圾文件,然后再查看快照卷的状态。可以发现存储空间占的用量上升了。
[root@localhost ~]# dd if=/dev/zero of=/root/ceshi/files count=1 bs=1024M
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 18.5166 s, 58.0 MB/s
[root@localhost ~]#  lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo1
  LV Name                vo1
  VG Name                storage
  LV UUID                fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
  LV snapshot status     source of
                         BAK [active]
  LV Status              available
  # open                 1
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/storage/BAK
  LV Name                BAK
  VG Name                storage
  LV UUID                bYJmju-ZZn2-FYkw-PcUq-H7k8-awBM-LHLm1u
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 19:51:46 +0800
  LV snapshot status     active destination for vo1
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  COW-table size         5.00 GiB
  COW-table LE           1280
  Allocated to snapshot  20.08%                #### 存储空间占的用量上升了
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
  • 第3步:为了校验SNAP快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
[root@localhost ~]# umount /root/ceshi 
[root@localhost ~]# lvconvert --merge /dev/storage/BAK
  Merging of volume storage/BAK started.
  storage/vo1: Merged: 80.57%
  storage/vo1: Merged: 100.00%
  • 第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的1GB的垃圾文件也被清除了。
[root@localhost ~]#  mount -a 
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  4.8G   20M  4.6G   1% /root/ceshi
3.5.5 删除逻辑卷

当生产环境中想要重新部署LVM或者不再需要使用LVM时,则需要执行LVM的删除 操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备, 这个顺序不可颠倒。

  • 第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
[root@localhost ~]# umount /root/ceshi 
[root@localhost ~]# vim /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Mon Apr  8 15:58:05 2024
#
# 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=04637479-3fb2-40e0-9873-276b5a7ca53f /                       xfs     defaults        0 0
UUID=af29a88b-a46b-4654-bdbd-405ca8d6c294 /boot                   xfs     defaults        0 0
UUID=438d68b3-2f2b-4f3d-96ef-d0e5f26babf3 swap                    swap    defaults        0 0
# /dev/storage/vo1 /root/ceshi ext4 defaults 0 0
  • 第2步:删除逻辑卷设备,需要输入y来确认操作。
[root@localhost ~]# lvremove /dev/storage/vo1 
Do you really want to remove active logical volume storage/vo1? [y/n]: y
  Logical volume "vo1" successfully removed
  • 第3步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
[root@localhost ~]# vgremove storage 
  Volume group "storage" successfully removed
  • 第4步:删除物理卷设备。
[root@localhost ~]# pvremove /dev/sdb /dev/sdc 
  Labels on physical volume "/dev/sdb" successfully wiped.
  Labels on physical volume "/dev/sdc" successfully wiped.

在上述操作执行完毕之后,再执行lvdisplayvgdisplaypvdisplay命令来查看LVM 的信 息时就不会再看到信息了。

4. 第三层:磁盘分区

对磁盘空间进行分区相当于对房子进行”隔间“,功能化,专业化每个分区。

4.1 磁盘分区介绍

4.1.1 磁盘分区的类型

【主分区(primary)】

  1. 系统中必须要存在的分区,系统盘选择会选择主分区进行安装系统;
  2. 分区的数字编号中,可以用于主分区的数字只能是1-4。
  3. 主分区最多可以创建4个,但是至少要有一个主分区;

【扩展分区(extend)】

  1. 相当于一个独立的小磁盘;
  2. 有独立的分区表;
  3. 不能够独立存在,即不能够直接存放数据。必须在扩展分区中建立逻辑分区才能够存放数据;
  4. 扩展分区和主分区共享4个数字编号,扩展分区最多一个,可以没有。即主分区 + 扩展分区 = 4

【逻辑分区(logic)】

  1. 逻辑分区的数字编号只能从数字 5 开始;
  2. 逻辑分区存在在扩展分区之上,即逻辑分区依附于扩展分区;
  3. 逻辑分区中可以存放任意磁盘数据;
4.1.2 磁盘分区注意事项

一块硬盘的分区方式只能为如下组合之一:

  1. 任意多个主分区,但要求 1≤主分区数量≤4 。例如:一个硬盘可以分为4个主分区、3个主分区、2个主分区或1个主分区。
  2. 扩展分区可以和主分区组合,但要求 2≤(主分区+扩展分区)数量≤4 。例如:3个主分区+1个扩展分区、2个主分区+1个扩展分区或1个主分区+1个扩展分区。
  3. 当总分区的数量大于4个的时候,必须提前分一个扩展分区,扩展分区最多只能有一个。

问题:如果给一个磁盘分6个分区有哪些方案,同时写出分区/dev/sda(数字)。

3P+1E(3L) 123 567

2P+1E(4L) 12 5678

1P+1E(5L) 1 56789

注意:如果分区操作完成之后,磁盘空间还有剩余的话。这些磁盘空间只能够浪费掉。

4.1.3 磁盘分区的工作原理

磁盘是按照柱面进行分区的;

磁盘分区表(DPT)是磁盘分区登记的地点,存放分区结果信息的。

磁盘分区表位置位于 0磁道0磁头1扇区(512字节),具体位置是1扇区的前446字节(系统引导信息的)后面的64字节(分区表),最后的剩下2个字节分区结束标志。

磁盘分区表的容量是有限的,64字节,一个分区固定占16字节。64/16=4分区(主分区+扩展分区)


【由图所示】

  • 在分区存储结构表中显示,该磁盘分为:3P + 1E(2L)。每一个主分区都分为引导分区信息和数据两个部分;但是在扩展分区中,还会有额外的一个扩展的分区表。扩展分区本身并不存储数据,必须依靠逻辑分区来存储数据。

  • 通过放大引导分区,我们可以清楚的看到,引导分区位于0磁头0磁道1扇区的位置,再次放大来看1扇区这512个字节都包含的内容,可以看到前446字节是存放主引导记录的位置,随后的64字节分别是存放这四个分区(3P+1E)的分区表信息,因为一个分区表信息固定占用16字节,所以最多只能划分4个分区(这里不包括逻辑分区)。最后的2字节被理解为分区结束的标志,也有的被理解为和前面的64个字节一起组成分区表。

4.2 磁盘分区实践

绝对不能对已经挂载的系统进行分区。

磁盘分区的核心本质就是修改64字节的分区表而已。

  • 磁盘分区常用命令fdisk,修改MBR分区表,MBR格式。但是被修改的磁盘大小不能大于2T。
  • 磁盘分区其他命令parted,修改gpt分区格式,既能修改小于2T也能修改大于2T的磁盘。
  • 所以,小于2T 就用 fdisk;大于 2T 就用parted。
4.2.1 fdisk的使用
  • fdisk 是 linux下最常用的分区工具,一般是装完系统后进行分区。而装系统之前的分区,多数都是系统ISO里面的工具分,或者raid里分小磁盘。
  • fdisk只能root权限用户使用。
  • fdisk适合于对装系统后的剩余空间进行分区,例如:安装系统时没有全部分区,或者安装系统后添加新磁盘。
  • fdisk支持 mbr 分区表(2TB 以内)
  • 用fdisk分区的实质,就是修改0磁头0磁道1扇区的前446字节之后的64字节的分区表信息。
查看磁盘分区信息

查看系统硬件配置及相关信息的命令:https://wwwblogs/nineep/p/7011059.html

[root@localhost ~]# fdisk -l        # 查看所有分区的信息

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x00018f37

Device    Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4605951     2097152   82  Linux swap / Solaris
/dev/sda3         4605952    41936895    18665472   83  Linux

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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

[root@localhost ~]#      
使用fdisk命令分区

在执行fdisk命令时,

  • CentOS7 可以使用 fdisk /dev/sdb
  • CentOS6 的话需要执行 fdisk -cu /dev/sdb
[root@localhost ~]# fdisk /dev/sdb     // 找到需要操作的磁盘进行操作
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x71ebff8f.

Command (m for help):           

在这里,需要执行相关的分区操作命令!

Command (m for help): m     # 输入m,查看分区的帮助信息
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition                          # 删除分区
   g   create a new empty GPT partition table      # 创建新的GPT分区表
   G   create an IRIX (SGI) partition table
   l   list known partition types                 # 列出分区类型  82 83 8e
   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             # 改变分区系统的id,类型
   u   change display/entry units                 # 改变分区的方式,是否按照扇区进行划分
   v   verify the partition table
   w   write table to disk and exit               # 保存分区表信息并退出
   x   extra functionality (experts only)      

接下来进入实际划分的阶段。

分区案例:计划使用 3P + 1E(3L) 的方式划分6个分区,鉴于磁盘只有1G空间,所以这里分区规划,每个分区空间为150M。

  • 第一步:创建新分区
Command (m for help): n        # 创建新分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)     # 主分区
   e   extended                                   # 扩展分区
# 主分区当前未创建,还有四个可以创建。
  • 第二步:选择创建分区
Select (default p): p             # 选择需要创建的分区类型,默认是主分区(p),主分区的话直接回车即可。          
  • 第三步:确认创建的分区编号
Partition number (1-4, default 1):       # 因为创建的是主分区,所以编号(1-4),默认是1.可以直接回车确认。 
                                         # 就是 sda1 或 hda1 中的1。
  • 第四步:确认起始扇区位置
First sector (2048-2097151, default 2048):      # 这里给出了扇区的范围,可以在这个区间里选择起始扇区, 
												# 默认的是2048扇区位置        
  • 第五步:确认终止扇区位置
First sector (2048-2097151, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +150M

# 这一步(确认终止扇区位置)和上一步(确定起始扇区位置)共同来确定分区的大小。

# 确认终止扇区有两种方式,一种是根据扇区来,设置填写一个终止扇区的位置;另一种是根据分区大小来,填写这个分区所需要的大小;
# 我们最常用的就是根据分区大小确定终止分区,格式是:+size{K,M,G}         
  • 第六步:回车确认
Partition 1 of type Linux and of size 150 MiB is set

# 设置了 分区1 为Linux 类型 且 大小为 150 MiB         
  • 第七步:完成分区之后,查看分区结果确认
Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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
Disk label type: dos
Disk identifier: 0x51b7f7d9

Device    Boot      Start       End        Blocks   Id  System
/dev/sdb1            2048      309247      153600   83  Linux           

然后,重复执行上述操作,划分完三个主分区。

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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
Disk label type: dos
Disk identifier: 0x51b7f7d9

Device    Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      309247      153600   83  Linux
/dev/sdb2          309248      616447      153600   83  Linux
/dev/sdb3          616448      923647      153600   83  Linux

接下开始划分【扩展分区】,这里的操作与上面类似。

Command (m for help): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
Selected partition 4
First sector (923648-2097151, default 923648): 
Using default value 923648
Last sector, +sectors or +size{K,M,G} (923648-2097151, default 2097151): 
Using default value 2097151
Partition 4 of type Extended and of size 573 MiB is set

# 因为之前已经有了3个主分区,所以只能在有一个主分区或1个扩展分区。
# 在设置扩展分区的终止扇区时,会选择全部的空间。因为即使留有部分空间也会浪费掉。

然后是在扩展分区中创建逻辑分区。

Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (925696-2097151, default 925696): 
Using default value 925696
Last sector, +sectors or +size{K,M,G} (925696-2097151, default 2097151): +150M
Partition 5 of type Linux and of size 150 MiB is set

# 这里创建逻辑分区与主分区略有不同
# 创建逻辑分区时,逻辑分区编号会自动生成,不需要人工选择;
# 而且扇区位置可以很明显看出来是扩展分区的扇区          

重复执行上述操作,最后得到【3P + 1E(3L)】共6个分区。

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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
Disk label type: dos
Disk identifier: 0x51b7f7d9

Device    Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      309247      153600   83  Linux
/dev/sdb2          309248      616447      153600   83  Linux
/dev/sdb3          616448      923647      153600   83  Linux
/dev/sdb4          923648     2097151      586752    5  Extended
/dev/sdb5          925696     1232895      153600   83  Linux
/dev/sdb6         1234944     1542143      153600   83  Linux
/dev/sdb7         1544192     1851391      153600   83  Linux
  • 第八步:但是这里还没有完全结束,还需要输入w保存分区,然后退出。

  • 第九步:退出之后,执行partprobe命令,使内核重新核查分区表。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# partprobe /dev/sdb
4.2.2 parted的使用

GPT的分区表解决了传统的MBR无法逾越2TB的限制。但是在Linux系统中,传统的fdisk命令无法支持gtp分区方式。(在红帽企业版Linux 4 Update 4之后的版本提供了对大于2TB的磁盘设备的支持)

parted 的操作是实时的,也就是说执行一个分区命令之后,就实实在在的分区了。不需要像fdisk命令那样执行w命令保存写入数据。所以在parted命令测试的时候,建议不要在生产环境中。

需求:已有磁盘做了RAID5,大小6T,已经安装了系统。现在需要额外添加4块2T硬盘。

现有一个做了RAID 5的硬盘,要求分三个分区:

硬盘总分区大小: 6.2T

/data0 4.8T

/data1 1T

​ 4G (无需格式化,做DRBD用)

  • 快速分区方式(一键分区):在linux命令行下执行
parted /dev/sdb mklabel gpt                   # 修改分区格式为gpt。
parted /dev/sdb mkpart primary 0 4800000 I        # 创建一个4.8T主分区
parted /dev/sdb mkpart primary 4800001 5800001 I       # 创建一个1T主分区   # 这里的 I表示忽略
parted /dev/sdb mkpart primary 5800002 5804098 I      # 创建一个4G主分区
parted /dev/sdb p
  • 第一步:进入parted配置界面
[root@localhost ~]# parted /dev/sdb     # 交互式分区开始
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)                    
  • 查看帮助命令
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found partitions, or a particular
        partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted
(parted) 
  • 第二步:将分区格式类型转换为gpt
(parted) mklabel gpt       # 转换分区格式 为GPT                                               
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes  

(parted) p   # 查看                                                           
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt    # 分区格式
Disk Flags: 
Number  Start  End  Size  File system  Name  Flags
  • 第三步:创建新分区
(parted) mkpart primary 0 480       # 创建主分区480M                                      
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore      # 忽略警告                                               
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags
 1      17.4kB  480MB  480MB               primary


# 如果是创建逻辑分区的话,不需要先创建扩展分区,可以直接创建逻辑分区
(parted) mkpart logic 481 581                                             
Warning: You requested a partition from 481MB to 581MB (sectors 939453..1134765).
The closest location we can manage is 481MB to 481MB (sectors 940031..940031).
Is this still acceptable to you?
Yes/No? yes                                                               
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore          # 忽略警告                                              
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name     Flags
 1      17.4kB  480MB  480MB                primary
 3      481MB   481MB  512B                 logic
 2      481MB   581MB  99.6MB               logic      
  • parted 命令直接生效,不需要进行保存操作。

  • 如果需要删除的分区的话,使用命令:rm 分区号。

(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name     Flags
 1      17.4kB  480MB  480MB                primary
 3      481MB   481MB  512B                 logic
 2      481MB   581MB  99.6MB               logic

(parted) rm 3           # 删除 3分区                                                      
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name     Flags
 1      17.4kB  480MB  480MB                primary
 2      481MB   581MB  99.6MB               logic
4.2.3 分区类型
  • 常用分区类型
分区系统ID分区系统说明
82Linux swap / Solarisswap分区系统
83Linux标准分区系统
8eLinux LVM动态分区系统
  • 修改分区系统的类型

注意:绝对不能对已经挂载的系统进行分区调整。

对于已经划分的分区,需要修改它的分区文件系统的类型可以按照如下操作:

案例:将一个【动态分区系统】修改为一个【标准分区系统】

Command (m for help): p

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x00001ac8

Device    Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     3762175     1572864   82  Linux swap / Solaris
/dev/sda3         3762176    41943039    19090432   8e  Linux LVM     # 暂时以这个分区进行操作,实际上是不允许操作的

Command (m for help): t           # 改变分区系统的类型
Partition number (1-3, default 3): 3      # 确定分区
Hex code (type L to list all codes): L      # 查看分区系统类型

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1 80  Old Minix      

Hex code (type L to list all codes): 83     # 确认修改成那种分区类型
Changed type of partition 'Linux LVM' to 'Linux'

Command (m for help): p   # 查看结果

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x00001ac8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     3762175     1572864   82  Linux swap / Solaris
/dev/sda3         3762176    41943039    19090432   83  Linux

##########################################################################
# 报错的情况(因为是正在挂载的系统,所以不允许修改)
Command (m for help): w     # 保存退出
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
##########################################################################
# 正常可以保存的情况
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# partprobe /dev/sdb

5. 第四层:文件系统(格式化)

文件系统:计算机存储和组织数据的方法或者机制。

磁盘等硬件需要软件驱动才能够被系统使用,而文件系统就是磁盘的软件驱动。文件系实现通过磁盘管理规划、存取数据。

常见的软件系统有哪些类型:

  • Windows:NTFS、FAT32、msdos、…
  • Linux:ext2、ext3、ext4、xfs、btrfs、…
  • mkfs格式化实践

mkfs命令是用于创建文件系统的命令行工具。当你想要在一个分区或存储设备上初始化一个新的文件系统时,就会用到这个命令。它支持多种文件系统类型,如 ext4、XFS、FAT32、NTFS 等,具体取决于你的操作系统所支持的文件系统类型。

mkfs语法:mkfs [-t 文件系统类型] 设备文件名

[root@localhost ~]# ls -l /dev/sdb*                  // 查看当前硬盘分区
brw-rw----. 1 root disk 8, 16 Feb 21 09:56 /dev/sdb
brw-rw----. 1 root disk 8, 17 Feb 21 09:56 /dev/sdb1
brw-rw----. 1 root disk 8, 18 Feb 21 09:56 /dev/sdb2
[root@localhost ~]# mkfs -t ext4 /dev/sdb1            // 格式化ext4文件
[root@localhost ~]# mkfs.ext4 /dev/sdb1               // 同上效果

# 其实关键就是生成一定数量的Inode和Block。
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345, 73729

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done     

查看可以直接使用mkfs的命令(类似mkfs.ext4),这些都对应着相应的文件系统

[root@localhost mnt]# mk
mkdict            mke2fs            mkfs.btrfs        mkfs.ext3        
mkfs.xfs          mklost+found      mktemp
mkdir             mkfifo            mkfs.cramfs       mkfs.ext4         
mkhomedir_helper  mknod             
mkdumprd          mkfs              mkfs.ext2         mkfs.minix        
mkinitrd          mkswap 

6. 第五层:mount挂载文件系统

mount命令用于将文件系统挂载到已存在的目录上,可以通过该目录访问该文件系统的内容。挂载操作实际上是创建了文件系统与目录之间的一个关联。

[root@localhost ~]# mount -t ext4 /dev/sdb1 /mnt
# 临时挂载 /dev/sdb1 到 /mnt 路径下
# 参数 -t 指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。

[root@localhost ~]# df -h     # 查看挂载结构
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.7M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda3        18G  1.7G   17G  10% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb1        93M  1.6M   85M   2% /mnt

# 强制卸载
[root@localhost mnt]# umount -lf /mnt/
[root@localhost mnt]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.7M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda3        18G  1.7G   17G  10% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs            98M     0   98M   0% /run/user/0

# 【注意】:没有格式化的磁盘分区无法进行挂载
# 这里以sdb2为例
[root@localhost mnt]# mount /dev/sdb2 /opt
mount: /dev/sdb2 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'

# 格式化成xfs文件格式
[root@localhost mnt]# mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2              isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
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=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

6.1 实现开机自动挂载

[root@localhost mnt]# cat /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Fri Feb 18 15:25:05 2022
#
# 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=22ce207e-a69d-46a3-b612-1c5ceada7b38  /       xfs     defaults   0 0
UUID=e07b695c-bbc9-4a53-8560-fa8a75a51710 /boot   xfs     defaults    0 0
UUID=cff3ee6d-2475-4326-ac5f-6117fab27ac7 swap    swap    defaults    0 0
# 设备      挂载点    文件系统类型  默认挂载选项  是否备份  是否开机磁盘检查
/dev/sdb2   /opt      xfs       defaults      0       0
  • 查看设备的UUID号
[root@localhost ~]# blkid
/dev/sda1: UUID="3ffa7b06-22fb-4882-8d0d-a1a2d9809be3" TYPE="xfs" 
/dev/sda2: UUID="1a58e26a-b8ad-4652-aeed-34bff23091a8" TYPE="swap" 
/dev/sda3: UUID="5o3Hbv-0j8p-TE9k-k7nE-Rruu-2how-LEd2Jh" TYPE="LVM2_member" 
/dev/sr0: UUID="2020-04-22-00-54-00-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 
/dev/mapper/centos-root: UUID="9d6bf6f7-2b9e-4bd4-9457-658648128de6" TYPE="xfs" 
  • 查看分区使用空间
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 475M     0  475M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/mapper/centos-root   19G  2.5G   16G  14% /
/dev/sda1                297M  151M  146M  51% /boot
tmpfs                     98M     0   98M   0% /run/user/0
  • 查看分区Inodes
[root@localhost ~]# df -i
Filesystem               Inodes IUsed   IFree IUse% Mounted on
devtmpfs                 121458   387  121071    1% /dev
tmpfs                    124433     1  124432    1% /dev/shm
tmpfs                    124433   737  123696    1% /run
tmpfs                    124433    16  124417    1% /sys/fs/cgroup
/dev/mapper/centos-root 9543680 71926 9471754    1% /
/dev/sda1                153600   332  153268    1% /boot
tmpfs                    124433     1  124432    1% /run/user/0
  • 查看文件系统内部细节
[root@localhost ~]# dumpe2fs /dev/sdb1           # 仅可以查看ext文件系统内部细节
[root@localhost ~]# dumpe2fs /dev/sdb1|egrep -i "size"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Block size:               1024
Fragment size:            1024
Group descriptor size:    64
Flex block group size:    16
Inode size:	          128
Journal size:             4096k

### 对于 xfs文件 可以如何来查看呢?
[root@localhost ~]# xfs_               # xfs文件配套的命令   
xfs_admin      xfs_copy       xfs_estimate   xfs_fsr        xfs_info       xfs_logprint   xfs_metadump   xfs_ncheck     xfs_repair     xfs_bmap       xfs_db         xfs_freeze     xfs_growfs     xfs_io         xfs_mdrestore  xfs_mkfile     xfs_quota      xfs_rtcp
[root@localhost ~]# xfs_info /dev/sda1       # 查看xfs文件信息的命令
meta-data=/dev/sda1              isize=512    agcount=4, agsize=19200 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=76800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

6.2 fsck 磁盘检查和修复

正常运行的磁盘不能操作,需要卸载挂载点再操作。

-a:修复磁盘

[root@localhost ~]# fsck        # fsck相关命令
fsck         fsck.btrfs   fsck.cramfs  fsck.ext2    fsck.ext3    fsck.ext4    fsck.minix   fsck.xfs

[root@localhost ~]# fsck -a /dev/sdb1       # 执行fsck命令,修复sdb1
fsck from util-linux 2.23.2
/dev/sdb1: clean, 12/25688 files, 8896/102400 blocks

[root@localhost ~]# mount /dev/sdb1 /mnt     # 挂载 sdb1
[root@localhost ~]# fsck -a /dev/sdb1        # 然后再使用fsck命令修复sdb1,报错。
fsck from util-linux 2.23.2
/dev/sdb1 is mounted.
e2fsck: Cannot continue, aborting.
[root@localhost ~]# umount /mnt             # 卸载

[root@localhost ~]# e2fsck /dev/sdb1           # e2fsck 等效于 fsck -a 同样,对 xfs文件系统也无法操作
e2fsck 1.42.9 (28-Dec-2013)
/dev/sdb1: clean, 12/25688 files, 8896/102400 blocks
[root@localhost ~]# fsck -a /dev/sdb1
fsck from util-linux 2.23.2
/dev/sdb1: clean, 12/25688 files, 8896/102400 blocks

[root@localhost ~]# xfs_repair /dev/sdb2              # 使用xfs_repair对 xfs 文件系统分区进行修复
xfs_repair: /dev/sdb2 contains a mounted filesystem
xfs_repair: /dev/sdb2 contains a mounted and writable filesystem

fatal error -- couldn't initialize XFS library       # xfs_repair,同理,挂载的不可以操作

[root@localhost ~]# umount /opt
[root@localhost ~]# xfs_repair /dev/sdb2         # 卸载,重复执行
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

6.3 创建文件系统时指定块大小和inode大小格式

root@localhost ~]# mkfs -t ext4 -b 4096 -I 512 /dev/sdb3
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
38400 inodes, 38400 blocks
1920 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=39845888
2 block groups
32768 blocks per group, 32768 fragments per group
19200 inodes per group
Superblock backups stored on blocks: 
	32768

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# dumpe2fs /dev/sdb3|egrep -i "size"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Flex block group size:    16
Inode size:	              512
Required extra isize:     28
Desired extra isize:      28
Journal size:             16M

最后第六层的磁盘管理工具命令这里就不再赘述了,常用的那几个命令以及用法在前面已经提到过了。

文章目录

    • 1. 磁盘知识的体系结构
    • 2. 第一层:硬件层
      • 2.1 外部结构
      • 2.2 内部结构
        • 2.2.1 磁头组件
        • 2.2.2 磁盘片、主轴组件及前置控制电路
        • 2.2.3 磁盘的控制电路
      • 2.3 磁盘的接口类型
      • 2.4 生产磁盘的选型和应用
      • 2.5 磁盘核心知识内容
        • 2.5.1 磁盘的认知
        • 2.5.2 磁盘容量计算(了解即可)
        • 2.5.3 磁盘的工作原理
    • 3.第二层:Raid和LVM
      • 3.1 Raid介绍
      • 3.2 Raid级别介绍
      • 3.3 Raid技术分类
      • 3.4 常用RAID级别细节说明
        • 3.4.1 `RAID 0` 级别详解
        • 3.4.2 `RAID 1` 级别详解
        • 3.4.3 `RAID 5` 级别详解
        • 3.4.4 `RAID 10` 级别详解
        • 3.4.5 各个级别的特点和区别
      • 3.5 LVM介绍
        • 3.5.1 部署逻辑卷
        • 3.5.2 扩容逻辑卷
        • 3.5.3 缩小逻辑卷
        • 3.5.4 逻辑卷快照
        • 3.5.5 删除逻辑卷
    • 4. 第三层:磁盘分区
      • 4.1 磁盘分区介绍
        • 4.1.1 磁盘分区的类型
        • 4.1.2 磁盘分区注意事项
        • 4.1.3 磁盘分区的工作原理
      • 4.2 磁盘分区实践
        • 4.2.1 fdisk的使用
          • 查看磁盘分区信息
          • 使用fdisk命令分区
        • 4.2.2 parted的使用
        • 4.2.3 分区类型
    • 5. 第四层:文件系统(格式化)
    • 6. 第五层:mount挂载文件系统
      • 6.1 实现开机自动挂载
      • 6.2 fsck 磁盘检查和修复
      • 6.3 创建文件系统时指定块大小和inode大小格式


1. 磁盘知识的体系结构

  • 企业服务器多磁盘知识体系结构
  • 第一层次:Linux系统硬件层次。 该层次说明讲解磁盘的结构以及机械磁盘的工作原理和读写原理;

  • 第二层次:Raid和LVM逻辑层次。 该层次说明讲解Raid知识以及LVM知识,并介绍在企业中的应用区别;

  • 第三层次:分区层次。 该层次说明讲解Linux下磁盘分区的相关知识;

  • 第四层次:文件系统层次。 该层次讲解文件系统知识以及格式化系统相关知识;

  • 第五层次:挂载层次。 该层次讲解一个被格式化后的磁盘如何被应用;

  • 第六层次:管理工具层次。 该层次讲解Linux系统下磁盘文件系统的等日常管理维护知识和实践;

2. 第一层:硬件层

2.1 外部结构

传统的机械硬盘,封装了内部结构,仅对外暴露了磁盘接口、控制电路板及固定面板。

  • 磁盘接口 包括电源接口插座和数据接口插座两部分。电源插座就是与主机电源相连接部分,为磁盘提供电力保证。数据接插座则是磁盘数据与主板控制芯片之间进行数据传输交换的通道,用一根数据电缆将其与主板IDE接口等和磁盘的数据接口相连接,数据电缆一般为40针、80芯的接口电缆,早期数据接口有IDE和SCSI 接口,当前主流的硬盘结构为串口SATA硬盘或者SCSI接口。

  • 控制电路板。 大多数的控制电路板都采用贴片式焊接,包括主轴调速电路、磁头驱动与伺服定位电路、读写电路、控制与接口电路等。在电路板上还有一块ROM芯片,里面固化的程序可以进行磁盘的初始化,执行加电和启动主轴电机,加电初始寻道、定位以及故障检测等。在电路板上还安装有容量不等的高速数据缓存芯片,在此块磁盘内有2MB的高速缓存。

  • 固定面板。 即磁盘正面的面板,它与底板结合成一个密封的整体,保证了磁盘盘片和机构的稳定运行。在面板上最显眼的莫过于产品标签,上面印着产品型号、产品序列号、产品、生产日期等信息。除此之外,还有一个透气孔,它的作用就是使磁盘内部气压与大气气压保持一致。

固态硬盘:一类固态硬盘与机械硬盘在外观上类似,内部使用集成电路板替代了机械硬盘的盘片等结构;还有一类固态硬盘直接就是一个带有接头的电路板。

2.2 内部结构

此处的内部结构仅针对机械磁盘说明。

  • 磁盘是非常精密的设备,震动、灰尘等是磁盘损坏的重要原因,所以磁盘需要密封,并且防止剧烈震动。核心部件被封装在磁盘的密封腔体内,所以磁盘拆开后一般就意味着报废了。

  • 磁头及盘片是磁盘的核心组件,被封装在磁盘的密封腔体内,包括有浮动磁头组件、磁头驱动装置、盘片、主轴驱动装置及前置读写控制电路等几个部分。

磁盘的内部结构主要包括:盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部分。
所有的盘片都固定在盘片主轴上。所有的盘片之间是平行的,每个盘片(一个盘片两个盘面)的每个存储面上都有一个磁头,磁头与盘片之间的距离极小。所有的磁头(一个有效盘面就有一个磁头)连在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向做径向运动(就是沿着半径由圆心到圆周线做直线运动),而盘片以每分钟数千转的速度在高速旋转,这样磁头就能对盘片上的指定位置进行数据的读写操作了。

2.2.1 磁头组件

磁头组件由读写磁头和磁头驱动装置部分组成。

  • 磁头是磁盘技术中最重要和关键的一环,实际上是集成工艺制成的多个磁头的组合,它采用了非接触式头、盘结构,加电后在高速旋转的磁盘表面移动,与盘片之间的间隙只有0.1~0.3um(微米),这样可以获得很好的数据传输率。现在转速为7200RPM的磁盘飞高一般都低于0.3um,以利于读取较大的高信噪比信号,确保数据传输可靠性。

磁盘读取数据的工作原理是利用特定的磁粒子的极性来记录数据。磁头在读取数据时,将磁粒子的不同极性转换成不同的电脉冲信号,再利用数据转换器将这些原始信号变成电脑可以使用的数据,写的操作正好与此相反。

  • 磁头驱动装置。磁盘的寻道是靠移动磁头,而移动磁头则需要该装置驱动才能实现。磁头驱动装置由电磁线圈电机、磁头驱动小车、防震动装置构成,高精度的轻型磁头驱动装置能够对磁头进行正确的驱动和定位,并能在很短的时间内精确定位系统指令指定的磁道。其中电磁线圈电机包含着一块永久磁铁,这是磁头驱动装置对传动手臂起作用的关键。防震动装置在老磁盘中没有,它的作用是当磁盘受动强裂震动时,对磁头及盘片起到一定的保护使用,以避免磁头将盘片刮伤等情况的发生。
2.2.2 磁盘片、主轴组件及前置控制电路
  • 磁盘片。盘片是磁盘存储数据的真正载体,磁盘盘片大多采用金属薄膜材料(也有玻璃材料),这种金属薄膜较软盘的不连续颗粒载体具有更高的存储密度、高剩磁及高矫顽力等优点。磁盘盘片是很光滑平整的。

  • 主轴组件。主轴组件包括如轴承和驱动电机等。随着磁盘容量的扩大和速度的提高,主轴电机的速度也在不断提升,有厂商开始采用精密机械工业的液态轴承电机技术。

    说明:磁盘主轴的转数是衡量磁盘读写性能的重要参考之一。例如:SAS 15k,SATA 10k

  • 前置控制电路。前置电路控制磁头感应的信号、主轴电机调速、磁头驱动和伺服定位等,由于磁头读取的信号微弱,将放大电路密封在腔体内可减少外来信号的干扰,提高操作指令的准确性。

2.2.3 磁盘的控制电路

磁盘的控制电路位于磁盘背面,将背面电路板的安装螺丝拧下,翻开控制电路板即可见到控制电路。

磁盘控制电路分为:主控制芯片、数据传输芯片、高速数据缓存芯片等。其中主控制芯片负责磁盘数据读写指令等工作。数据传输芯片则是将磁盘磁头前置控制电路读取出数据经过校正及变换后,经过数据接口传输到主机系统,高速数据缓存芯片是协调磁盘与主机在数据处理速度上的差异。缓存对磁盘性能所带来的作用是毋庸置疑的,在读取零碎文件数据时,大缓存能带来非常大的优势,因此16MB 甚至32MB等缓存的磁盘产品早年就已出现。缓存无处不在。

2.3 磁盘的接口类型

磁盘接口是磁盘与主机系统间的连接部件,作用是在磁盘缓存和主机内存之间传输数据。不同的磁盘接口决定着磁盘与计算机之间的连接速度,在整个系统中,磁盘接口的优劣直接影响着程序运行快慢和系统性能好坏。

从整体的角度上,磁盘接口分为IDE、SCSI、SATA和光纤FC通道四种。

  • IDE (Integrated Drive Electronics):老旧的接口标准,也称为PATA(Parallel ATA),主要用于连接硬盘和光驱到主板。IDE接口使用扁平电缆,通常有40或80针,早期多用于家用产品中,部分应用于服务器。

  • SCSI (Small Computer System Interface):老旧的接口标准,早期主要应用于服务器和工作站,因为它可以支持多个设备并行连接。

    • SAS (Serial Attached SCSI):是SCSI的串行版本,提供更高的传输速度和更灵活的拓扑结构。而且向后兼容SATA,意味着SAS控制器可以识别和控制SATA设备。
  • SATA (Serial ATA):目前最常见的硬盘接口类型,更快的数据传输速率,在家用市场和服务器市场都是逐渐流行的态势。SATA接口支持热插拔,即在系统运行时插入或移除设备。

  • 光纤通道 (Fibre Channel):高速网络技术,主要用于存储区域网络(SANs),特别在企业级服务器和数据中心中使用。

除此之外,还有一些其他的接口类型逐渐进入服务器市场

  • M.2:这是一种直接安装在主板上的小型接口,主要用于固态硬盘(SSD)。M.2支持两种接口标准:PCIe NVMe和SATA,其中PCIe NVMe提供更快的传输速度,目前已有相当的服务器支持M.2接口的磁盘。

  • PCIe (Peripheral Component Interconnect Express):虽然不是传统意义上的磁盘接口,但许多现代的高性能SSD使用PCIe接口直接与主板通信,提供极高的数据传输速率。

除了上述接口类型,还有一些较为特殊的接口,例如ZIF(Zero Insertion Force)、LIF(Low Insertion Force)和U.2(前称SFF-8639),它们主要用于特定类型的固态硬盘或高端存储解决方案。

备注:总的来说SAS技术是结合了SATA与SCSI两者的优点而诞生的,同时串行SCSI(SAS)是点到点的结构,因此除了提高性能之外,每个设备连接到指定的数据通路上提高了带宽从而为数据传输与存取提供了必要保障。

Serial-Attached SCSI (SAS) 企业生产环境主流磁盘的相关信息对比:

  • 企业生产场景普及程度:SAS > SSD > SATA
  • 单位容量对比性能和价格: SSD > SAS > SAT4(一块SSD和一块SATA)
  • 单位价格购买磁盘容量: SATA > SAS > SSD

2.4 生产磁盘的选型和应用

生产工作中服务器的选型往往倾向于主流大厂DELL,HP,IBM等,其中DELL,HP是互联网公司的主流服务器,这两个品牌的服务器综合的性价比比较高。随着国产化的趋势蔓延,浪潮、联想、华三、华为等国内大厂的设备也开始进入采购清单里。

当前服务器市场的主流磁盘为SAS、SATA、SSD硬盘。

  • 企业级SAS硬盘(默认)

企业里常见的SAS硬盘是15000转/分(这里就是主轴的转数)。当前主流300G、600G、1000G,从具体的业务需求及性价比考虑。单盘容量不建议太大,除非用于存储备份等功能。在满足容量的基础上,尽量保证4块硬盘。

主要用途是提供生产线上的普通对外提供服务的业务服务器。例如:生产线上的数据库业务、存储业务、图片业务及相关高并发业务,总的来说,如果没有特殊业务需求,SAS磁盘是生产环境首选的的磁盘配置。

  • 企业级SATA硬盘

企业级 SATA硬盘,7200-10000转/分,常见的容量为1T、2T、4T等,优点是经济实惠、容量大。从具体的业务需求及性价比考虑,在工作中多用SATA磁盘做线下不提供服务的数据存储或者并发业务访问不是很大的业务应用,比如站点程序及数据库、图片的线下备份等。特点是容量性价比高,一般2T的SATA磁盘较佳。

【磁盘选购小结】

  • 线上的业务,用SAS磁盘。
  • 线下的业务,用SATA磁盘,磁带库。
  • 线上高并发、小容量的业务,SSD磁盘。
  • 成本思想:根据数据的访问热度,智能分析分层存储。SATA+SSD

【企业故障案例】

不要用SATA磁盘来做在线高并发服务的数据存储或数据库业务,这是血的教训的。某公司采用SATA做数据库的存储盘,结果导致数据库连续宕机一个月。

配置:5台SATA盘RAID5。

解决方法:重新买5台,把磁盘从SATA (RAID5)换成SAS (RAID10)。6个月内没事。

数据库集群:

  • 主库选择用SAS RAID10,从库SAS RAID0。

  • 当数据库使用的引擎是MyISAM引擎,改成Innodb引擎。

  • SSD固态电子盘

一般用于数据量小并且有超大规模高并发的业务(当然这种业务还可以通过磁盘加内存缓存的技术方式解决这个大规模并发的问题)。大厂核心业务都会采用SSD磁盘,应用层也必须做各种缓存。甚至某些业务可能会根据数据的热度来综合使用分层存储,以达到性价比最佳的情况。

2.5 磁盘核心知识内容

  • 磁盘相关名词
名词简单说明
磁盘(Disk)存储设备
磁头(Head)磁盘读写数据的关键部件,负责在磁盘表面读取或写入数据。
扇区(Sector)磁盘上的最小可寻址单位,每个扇区存储一定量的数据(例如512字节)。所有扇区大小相同,并且包含一个固定的地址,用于定位数据。
磁道(Track)在磁盘表面上,以盘片中心为圆心的不同半径的圆形磁化轨迹,磁头在一条磁道上读写数据。
柱面(Cylinder)在多盘片硬盘中,同一半径的所有磁道组合成一个柱面,这是磁盘上一个垂直的结构。
单元块(Units)有时指的是文件系统中的块,即文件系统用于存储数据的基本单位,可能包含一个或多个扇区。
数据块(Block)与单元块相似,指的是文件系统中的存储单位,通常比扇区大。
索引节点(Inode)用于存储文件的元数据,包括权限、所有者、时间戳等,但不包括文件名。

2.5.1 磁盘的认知

一般来说,一块磁盘有1个到数个盘片不等,其中每个盘片的有效盘面对应一个读写磁头,从上往下从0开始依次编号,不同的磁盘盘面在逻辑上被划分为磁道、柱面以及扇区,一般在出厂时就设定好了这些。

  • 磁盘的磁头

磁盘的每个盘片的每个有效盘面都会有一个读写磁头(磁头数=盘片个数*2),磁盘盘面区域的划分如图所示。

  • 在磁盘不工作的时候,磁头停靠在靠近主轴接触盘片的表面,即线速度最小的地方,如右图,这里是一个不存放任何数据的特殊区域,称为启停区或着陆区(Landing Zone) ,启停区以外就是数据区。
  • 在磁盘的最外圈,离主轴最远的磁道称为“0”磁道,磁盘数据的存放就是从最外圈“0”磁道开始的。在磁盘中还有一个用来完成磁盘初始定位的“0”磁道检测器构件,由这个构件完成磁头对“0”磁道的定位。
  • “0”磁道非常重要,系统的引导程序就在0柱面0磁道1扇区的前446Bytes。
  • 早期的磁盘在每次关机之前需要运行一个被称为Parking的程序,其作用是在系统关机前让磁头回到启停区。现代磁盘在设计上已摒弃了这个缺陷。磁盘不工作时,磁头会自动停留在启停区,当磁盘需要读写数据时,磁盘主轴盘片开始旋转。旋转速度达到额定的高速时,磁头就会因盘片旋转产生的气流而抬起,这时磁头才向盘片存放数据的区域移动并开始读取数据。
  • 盘片旋转产生的气流很强,足能够把磁头托起,并与盘面保持一个微小的距离。这个距离越小,磁头读写数据的灵敏度就越高,当然对磁盘各部件的要求也越高。气流使磁头非常紧密地跟随着磁盘表面呈起伏运动,使磁头飞行处于严格受控状态。
  • 因为磁盘的磁头飞行悬浮高度低、速度快,一旦有小的尘埃进入磁盘密封腔内,或者一旦磁头与盘体发生碰撞,就可能造成数据丢失,形成坏块,甚至造成磁头和盘体的损坏。所以,磁盘系统的密封一定要可靠,在非专业条件下绝对不能开启磁盘密封腔。另外,磁盘驱动器磁头的寻道伺服电机多采用音圈式旋转或直线运动步进电机,在伺服跟踪的调节下精确地跟踪盘片的磁道,所以,磁盘工作时不要有冲击碰撞,搬动时要小心轻放。
  • 磁盘的盘面

磁盘的盘片一般是用铝合金材料或玻璃做基片。磁盘的每一个盘片都有两个盘面,即上、下盘面,一般来说,每个盘面都可以存储数据,成为有效盘面,也有极个别的磁盘盘面数为单数。每一个这样的有效盘面都有一个盘面号,按顺序从上至下从“0”开始依次编号因为每一个有效盘面都有一个对应读写磁头,盘面号又叫磁头号。磁盘的盘片组在2~14片不等,通常有2~3个盘片(如300G 15K SAS盘就是3个盘片),故盘面号(磁头号)为0-3或0-5不等。

注意:盘面的个数等于磁头的个数。

  • 磁盘的磁道

磁盘在格式化时被划分成许多同心圆,这些同心圆的轨迹叫做磁道(Track)磁道由盘面从外向内依次从0开始顺序编号。

磁盘的每一个盘面一般有300-1024个磁道,新式大容量磁盘每个盘面的磁道数可能会更多。信息以脉冲串的形式记录在这些轨迹中,这些同心圆轨迹不是连续的记录数据,而是被划分成一段段的圆弧。这些圆弧的角速度一样,由于径向长度不一样,所以,线速度也不一样,外圈的线速度较内圈的线速度大,即同样的转速下,外圈在同样时间段里,划过的圆弧长度要比内圈划过的圆弧长度大(但是读取到的数据是一样的)。这样的每段圆弧叫做一个扇区,扇区从“1”开始编号,每个扇区中的数据作为一个单元同时读出或写入。一个标准的3.5寸磁盘盘面通常有300-1024个磁道。特别说明,磁道是“看”不见的,只是在盘面上以特殊形式磁化了的一些磁化区,在磁盘格式化时就已规划完毕了。

【提示】

  • 角速度: 一个以弧度为单位的圆(一个圆周为2Π,即:360度=2П),在单位时间内所走的弧度即为角速度。公式为:ω=Ч/t(Ч为所走过弧度,t为时间)ω的单位为:弧度每秒。连接运动质点和圆心的半径在单位时间内转过的弧度叫做“角速度”。它是描述物体转动或一质点绕另一质点转动的快慢和转动方向的物理量。
  • 线速度: 物体上任一点对定轴作圆周运动时的速度称为“线速度”。它的一般定义是质点(或物体上各点)作曲线运动(包括圆周运动)时所具有的即时速度。它的方向沿运动轨道的切线方向,故又称切向速度。它是描述作曲线运动的质点运动快慢和方向的物理量。
  • 磁盘的柱面

一个磁盘所有的盘面上同一个半径相同的磁道的圆形轨迹从上到下依次组成一个圆柱体,就称做柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。一块磁盘的柱面数(或每个盘面的磁道数)既取决于每条磁道的宽窄(也会与磁头的大小有关),也取决于定位机构所设定的磁道间步距的大小。这些都是在出厂前就完成设定的。特别注意:这里的柱面数和前面的磁道数是一样的。

提示:

  • 给磁盘分区实际就是划分柱面号及扇区号。

  • 柱面是所有盘面上相同半径的不同磁道的集合。

  • 一块硬盘柱面数等于一个盘面的磁道数。

  • 磁道是多个扇区的集合。

  • 磁盘的扇区

操作系统是以扇区(Sector)为单位将信息存储在磁盘上的,一般情况下,每个扇区的大小是512字节。一个扇区主要有两部分内容:存储数据地点的标识符和存储数据的数据段。

扇区的第一个主要部分是标识符。标识符就是扇区头标,包括组成扇区三维地址的三个数字:扇区所在的磁头(或盘面)、磁道(或柱面号)以及扇区在磁道上的位置即扇区号。头标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些磁盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束以供控制器检验扇区头标的读出情况,确保准确无误。

扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC.在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的 ECC数字填入这个部分。

磁道柱面扇区总括:

磁盘最基本的组成部分是由坚硬的金属材料制成的涂以磁性介质的盘片(有很多层),不同容量磁盘的盘片数不等。
记忆要点:

  1. 一块磁盘有2-14个盘片,每个盘片有两个面,每个面对应一个读写磁头,用磁头号来区分盘面,即盘面数就是磁头数,盘片数*2=磁头数(盘面数)。
  2. 不同盘面的磁道被划分为多个扇形区域,每个区域就是一个扇区 (Sector)。
  3. 同一个盘面,以盘片中心为圆心,每个不同半径的圆行轨迹就是一个磁道(Track)。
  4. 不同盘面相同半径的磁道组成一个圆柱面就是柱面(Cylinder)。
  5. 一个柱面包含多个磁道(这些磁道的半径相同),一个磁道包含多个扇区。
  6. 数据信息记录可表示为:某磁头,某磁道(柱面),某扇区。

一句话概括定义

  • 磁道: 每个盘片有两个面,都可记录信息。盘片表面以盘片中心为圆心,用于记录数据的不同半径的圆形磁化轨迹就称为磁道。磁化轨迹是磁化区域,是看不见的。磁道看起来是一个平面圆周形。

  • 扇区: 盘面由圆心向四周画直线,不同的磁道被直线分成许多扇形(弧形)的区域每个弧形的区域叫做扇区,每个扇区大小一般为512字节,扇区看起来就是圆弧或扇形1.1.2.3柱面的一句话概括定义

  • 柱面: 磁盘中,不同的盘片(或盘面)相同半径的磁道轨迹从上到下所组成的圆柱型区域就称为柱面,柱面看起来是一个圆柱形。

2.5.2 磁盘容量计算(了解即可)

每个盘片有两个面,每个面有一个读写磁头,因此,一般我们习惯用磁头号来区分盘面。

扇区,磁道(或柱面)和磁头数构成了磁盘结构的基木参数,通过这些参数可以得到磁盘的容量,基本计算公式为:

涉及到的基本参数:磁头数、磁道数(柱面数)、每个磁道的扇区数、每个扇区的字节数、

  • 计算方法一(盘面角度):
存储容量 = 磁头数 * 磁道数 * 每个磁道的扇区数 * 每个扇区的字节数(512字节)

每个磁道的容量 = 512字节 * 扇区数; 
每个盘面的容量 = 单个磁道容量 * 磁道数 = (512字节 * 扇区数)* 磁道数; 

存储容量 = 单个盘面容量 * 磁头数 = (512字节 * 扇区数 * 磁道数)* 磁头数; 
  • 计算方法二(柱面角度):
存储容量 = 柱面大小(每个磁道的扇区数 * 每个扇区的字节数 * 磁头数)* 柱面数(磁道数)

一个柱面的容量 = 每个磁道的扇区数 * 512 * 磁头数 
存储容量 = 柱面大小 * 柱面数(磁道数)       
		=(每个磁道的扇区数 * 每个扇区的字节数 * 磁头数)* 柱面数(磁道数) 

一块磁盘的磁道数和柱面数的数量是永远相等的。

2.5.3 磁盘的工作原理
  • 磁盘的读写流程及原理

磁盘的数据 读/写 一般是按柱面进行的,即磁头读/写数据时首先在同一柱面内从“0"”磁头开始进行操作,依次向下在同一柱面的不同盘面即不同磁头上进行操作,只有同一柱面所有的磁头全部读/写完毕后,磁头才转移到下一柱面(即寻道),因为切换磁头只需通过电子设备切换即可,而切换柱面则必须通过机械设备切换。电子磁头间的切换比机械磁头向邻近磁道或柱面切换要快得多。所以,数据的读/写按柱面进行,而不按盘面进行。也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面的相同半径磁道来写,一个柱面写满后,才移到下一个柱面开始写数据。读数据也按照这种方式进行,这样就大大提高了磁盘的读/写效率。

读写数据时,先操作同一个柱面不同盘面的数据,如果仍未读完,才移动磁头。(磁盘的读写是按照柱面读写)

  • 磁盘的读写原理详细说明

当操作系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,依次是同一柱面的下一磁头(也可以说下一盘面),……,一个柱面存储满后就通过步进电机把磁头移动到下一个柱面(即寻道),继续写入数据,直到把文件内容全部写入磁盘。
系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则直接使磁头部件步进到相应的柱面,选则相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。
待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路,还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁盘继续旋转。

  • 读写磁盘数据小结
  1. 磁盘是按照柱面为单位读写数据的,即先读取同一个盘面的某一个磁道,读完之后,如果数据没有读完,磁头也不会切换其他的磁道,而是选择切换磁头,读取下一个盘面的相同半径的磁道,直到所有盘面的相同半径的磁道读取完成之后,如果数据还没有读写完成,才会切换其他不同半径的磁道,这个切换磁道的过程称为寻道。
  2. 不同磁头间的切换是电子切换,而不同磁道间的切换需要磁头做径向运动,这个径向运动需要步进电机调节,这个动作是机械的切换。
  3. 磁头寻道是机械运动,切换磁头是电子切换。

3.第二层:Raid和LVM

3.1 Raid介绍

Raid是独立冗余磁盘阵列(Redundant Array of Inexpensive Disk)的简称,有时也简称磁盘阵列(Disk Array)。它是一种把多块独立的物理磁盘按不同的技术方式组合起来形成一个磁盘组,在逻辑上(做完RAID,装系统后)看起来就是一块大的磁盘,可以提供比单个物理磁盘更大的存储容量或更高的存储性能,同时又能提供不同级别数据冗余备份的一种技术。

用RAID最直接的好处是:

  1. 提升数据安全性。
  2. 提升数据读写性能。
  3. 提供更大的单一逻辑磁盘数据容量存储。

3.2 Raid级别介绍

把多个物理磁盘通过不同的技术方式组成磁盘阵列,这个不同的技术方式就被称为RAID级别。

生产环境常用的Raid 的级别:为Raid 0Raid 1Raid 5Raid 10

  • 这些RAID级别的优、缺点比较:
RAID级别关键优点关键缺点应用场景
RAID 0读写速度最快没有冗余集群节点RS
RAID 1100%冗余读写性能一般,成本高单独的,数据重要的,不能宕机的业务。往往用作系统盘
RAID 5具备一定的性能和冗余,可以坏一块盘。读性能不错写入性能一般一般业务都可以用
RAID 10读写很快,100%冗余成本高性能和冗余要求都很好的业务。数据库主库和存储的主节点。

冗余,指重复配置系统的一些部件,当系统发生故障时,冗余配置的部件介入并承担故障部件的工作,由此减少系统的故障时间 Redundant,自动备援,即当某一设备发生损坏时,它可以自动作为后备式设备替代该设备。

3.3 Raid技术分类

常见RAID技术分为两种:基于硬件的RAID技术和基于软件的RAID技术。

  • 软RAID技术:

在Linux下在安装系统过程中或者安装系统后通过自带的软件就能实现软RAID功能,使用软RAID可省去购买昂贵的硬件RAID控制器和附件就能极大地增强磁盘的IO性能和可靠性。由于是用软件去实现的RAID 功能,所以它配置灵活、管理方便。同时使用软件RAID,还可以实现将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的。

  • 硬RAID技术:

基于硬件的RAID解决方案比基于软件RAID技术在使用性能和服务性能上会更胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。从安全性上考虑,基于硬件的RAID解决方案也是更安全的。因此,在实际的生产场景工作中,基于硬件的RAID解决方案应该是我们的首选。例如比较常用的DELL服务器,默认的就会支持RAID0,1(主板板载RAID);如果RAID5,10就需要买RAID卡(独立RAID卡)。

3.4 常用RAID级别细节说明

3.4.1 RAID 0 级别详解
  • RAID 0 描述

RAID0又称为Stripe(条带化)或Striping(条带模式),它在所有RAID级别中具有最高的存储性能。

RAID0提高存储性能的原理是把连续的数据分散到多个磁盘上存取。这样,系统有数据读写请求就可以在多个磁盘并行的执行,每个磁盘读写属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。

要制作RAID0要求至少是1块物理磁盘,一般用来做RAID的不同磁盘大小最好一样(可以充分发挥并行优势);而数据分散存储于不同的磁盘上,在读写的时候可以实现并发,所以,RAID0读写性能最好;但是没有容错功能,即任何一个磁盘的损坏会导致整个RAID的全部数据丢失;生产中使用单盘,要做成RAID0,否则可能无法使用。

如图所示:系统向三个磁盘组成的逻辑磁盘(RADI 0磁盘组)发出的I/O数据请求被转化为3项操作,其中的每一项操作都对应于一块物理磁盘。我们从图中可以清楚的看到通过建立RAID 0,原先顺序的数据请求被分散到所有的3块磁盘中同时执行。从理论上讲,三块磁盘的并行操作使同一时间内磁盘读写速度提升了3倍。

但由于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是,大量数据并行传输与串行传输比较,提速效果显著显然毋庸置疑。

RAID 0的缺点是不具备数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。RAID0具有的特点,使其特别适用于对性能要求较高,而对数据安全不太在乎的领域,

  • 生产应用场景
  1. 负载均衡集群下面的多个相同RS节点服务器。
  2. 分布式文件存储下面的主节点或CHUNK SERVER。
  3. MySQL主从复制的多个Slave服务器。
  4. 对性能要求很高,对冗余要求很低的相关业务。
3.4.2 RAID 1 级别详解
  • RAID 1 描述

RAID1又称为Mirror 或 Mirroring(镜像),它的宗旨是最大限度的保证用户数据的可用性和可修复性。RAID1的操作方式是把用户写入一个磁盘的数据百分之百地自动复制到另外一个磁盘上,从而实现存储双份的数据。

要制作RAID1,要求至少是两块磁盘(支持偶数块盘),整个RAID大小等于两个磁盘中最小的那块磁盘的容量(当然,最好使用同样大小的磁盘),数据有50%的冗余,在存储时同时写入两块磁盘,实现了数据完整备份;但相对降低了写入性能,但是读取数据时可以并发,相当于两块Raid0的读取效率(有待实践验证)。

  • 当读取数据时,系统先从RAID1的源盘读取数据,如果读取数据成功,则系统不去管备份盘上的数据;如果读取源盘数据失败,则系统自动转而读取备份盘上的数据,不会造成用户工作任务的中断(有待验证)。当然,我们应当及时地更换损坏的磁盘并利用备份数据重新建立Mirror,避免备份盘在发生损坏时,造成不可挽回的数据损失。

  • 由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而Mirror(镜像)的磁盘空间利用率低,存储成本高。Mirror虽不能提高存储性能,但由于其具有极高的数据安全性,使其适用于存放重要数据,如传统企业对性能要求不高,对数据要求高的服务器和数据库存储等领域。

3.4.3 RAID 5 级别详解
  • RAID 5 描述

RAID 5是一种存储性能、数据安全和存储成本兼顾的存储解决方案。

RAID5需要三块或以上的物理磁盘,可以提供热备盘实现故障的恢复;采用奇偶校验,可靠性强,且只有同时损坏两块硬盘时数据才会完全损坏,只损坏一块硬盘时,系统会根据存储的奇偶校验位重建数据,临时提供服务;此时如果有热备盘,系统还会自动在热备盘上重建故障磁盘上的数据。

RAID 5可以理解为是RAID 0和RAID 1的折衷方案。RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低而磁盘空间利用率要比 Mirror高。RAID 5具有和RAID 0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较低。

RAID 5是把数据和相对应的奇偶校验信息存储到组成RAID 5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID 5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

3.4.4 RAID 10 级别详解
  • RAID 01 和 RAID 10

RAID 10实际上有两种表现形式:Raid0+Raid1Raid1+Raid0,是将磁盘按照两种不同的方式进行的逻辑组合。

  • RAID 01 = RAID 0+1:先做RAID 0,再做RAID 1

  • RAID 10 = RAID 1+0:先做RAID 1,再做RAID 0

以四块硬盘做RIAD来细说他们的区别:

  • RAID10是先将四块硬盘在纵向上分别两两做镜像,镜像后再在横向上做条带。简而言之:RAID10是先做镜像后做条带。在这种情况下,如果只是坏掉其中的一个硬盘,对RAID组的影响都不是非常大,只要不是同时坏掉其中的一个硬盘和他的镜像盘RAID组都不会崩溃。

  • RAID01是先将四块硬盘中横向上两两做条带,然后再纵向上做镜像。简而言之:先条带后镜像。这种情况下如果两个条带上有任意两块硬盘坏掉了,则整个RAID组都将崩溃了。不管发生介质损坏的两块硬盘是否是镜像盘。

RAID 0+1的特点使其特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域,如银行、金融、商业超市、仓储库房、各种档案管理等。

如图,假设左边的RAID 0系统中有一块磁盘损坏,此时左边的RAID 0系统便没有丝毫作用了。所有的IO均转向右边的RAID 0系统。而此时,仅仅允许左边剩余的那块磁盘损坏。如果右边任何一块磁盘损坏,则整体数据将不可用。所以这个系统的冗余度变成了1,即只允许损坏特定的一块磁盘(左边RAID0系统剩余的磁盘)。

综上所述,RAID 10系统要比RAID01系统冗余度高,安全性高。

总而言之,RAID10 和 RAID01在读和写的性能上没有太大的差别,从发生故障的概率上看,RAID01 是远大于RAID10 的。一般情况下选择RAID10的情况会多些。

3.4.5 各个级别的特点和区别
RAID类型最少需要几块盘安全冗余可用容量性能使用场景举例
RAID 01最低所有硬盘容量之和读写最快只要求速度不要求安全数据库从库;存储从库
RAID 12100%一半写入慢,读取可以只要求安全不要求速度系统盘
RAID 53可以损坏一块损失一块盘的容量写入较慢,读取可以速度和安全的要求一般一般业务
RAID 104可以损坏一半损失所有容量的一半读写很快全都要高并发或高访问量主库
  • 总结:
  • Raid 0支持1块盘到多块盘,容量是所有盘之和。

  • Raid 1最少2块盘,容量损失一半。

  • Raid 5最少三块盘,不管硬盘数量多少,只损失一块盘容量。

  • Raid 6最少4块盘,5块盘也可以,损失2块盘,不管硬盘多少,只损失两块盘容量。

  • Raid10最少4块盘,必须偶数硬盘,不管硬盘多少,都损失一半容量,不支持虚拟磁盘。

3.5 LVM介绍

LVM全称为逻辑卷管理(Logical Volume Manager),是一种在Linux操作系统中用于管理和优化磁盘存储的技术。LVM提供了一种灵活的方式来管理硬盘和分区,它允许用户在不中断系统服务的情况下动态调整存储容量,提高了存储资源的利用率和管理效率。

优点包括:

  • 允许在系统运行时动态地增加或减少逻辑卷的大小,无需重新分区或重启系统,极大提升了存储管理的灵活性。
  • 将多个物理磁盘组合成卷组,实现了存储资源的池化,使得存储空间可以更高效地被管理和分配。
  • 提供了一个统一的抽象层来管理存储,使得添加、删除或更换磁盘变得简单易行,降低了管理复杂度。

缺点包括:

  • 相较于传统的分区管理,配置和管理较为复杂,需要一定的学习成本。
  • 虽然可以优化存储性能,但在某些场景下,尤其是涉及大量小文件读写时,由于额外的抽象层,可能会有轻微的性能损失。
  • 在特定情况下,例如系统崩溃,恢复LVM配置可能比标准分区更为复杂。
  • 本身需要占用少量的系统资源,包括磁盘空间用于元数据管理,以及在处理大量I/O请求时可能消耗更多的CPU资源。

LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分区的动态调整,LVM的技术架构如图。

LVM体系结构包括三个基本概念:

  • 物理卷(Physical Volume, PV):LVM的基础构建块,通常对应于一个硬盘分区或整个硬盘。物理卷上包含可供LVM使用的存储容量,这些容量被划分为称为“物理区域(physical extents)”的小块。

  • 卷组(Volume Group, VG):一个或多个物理卷可以组合成一个卷组,这构成了LVM的存储池。卷组中的物理区域形成了一个连续的地址空间,LVM在此基础上创建逻辑卷。

  • 逻辑卷(Logical Volume, LV):从卷组中分配一部分物理区域创建而成,逻辑卷对操作系统来说就像一个普通的块设备,可以在其上创建文件系统。逻辑卷的大小可以根据需要动态调整,而且可以轻松迁移或扩展,而不会影响到数据的可用性。

  • 三者之间的关系类似于PV组成LG,LG分割出LV

LVM的核心理念:

物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列, 这都可以。卷组建立在物理卷之上,一个卷组可以包含多个物理卷,而且在卷组创建之后也 可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立 后可以动态地扩展或缩小空间。

3.5.1 部署逻辑卷

部署LVM时,需要逐个配置物理卷、卷组和逻辑卷。常用部署命令如下:

功能物理卷管理命令卷组管理命令逻辑卷管理命令
扫描pvscanvgscanlvscan
建立pvcreatevgcreatelvcreate
显示pvdisplayvgdisplaylvdisplay
删除pvremovevgremovelvremove
扩展vgextendlvextend
缩小vgreducelvreduce

演示:在虚拟机中添加两块新硬盘设备,然后开机

  • 第一步:查看硬盘
[root@localhost ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x000bc797

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200     5244927     1572864   82  Linux swap / Solaris
/dev/sda3         5244928    41943039    18349056   83  Linux

Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 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


Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 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
  • 第二步:让新添加的两块硬盘设备支持LVM技术(创建物理卷)
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  
# 提示没有该命令的话,则安装软件包 yum -y install lvm2
  • 第三步:把两块硬盘设备加入到storage卷组中,然后查看卷组的状态
# 创建卷组
[root@localhost ~]# vgcreate storage /dev/sdb /dev/sdc
  Volume group "storage" successfully created
  
# 语法: vgcreate 卷组名 磁盘1 磁盘2 ...
# 查看卷组
[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5118 / 19.99 GiB
  VG UUID               FdPjR1-cfK2-Hs1a-h6nh-hEZZ-1dun-bBhOSp
  • 第四步:切割出一个5G的逻辑卷设备

在对逻辑卷进行切割时有两种计量单位。第一种是以容量为单位,所使用的参数为 -L。例如,使用-L 5G生成一个大小为5GB的逻辑卷。另外一种是以基本单元的个数为单位,所使用的参数为-l ,每个基本单元的大小默认为 4MB。例 如,使用-l 37可以生成一个大小为37×4MB=148MB的逻辑卷。

[root@localhost ~]# lvcreate -n vo1 -L 5G storage 
  Logical volume "vo1" created.
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo1
  LV Name                vo1
  VG Name                storage
  LV UUID                fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
  • 第五步:把生成好的逻辑卷进行格式化,然后挂载使用

Linux 系统会把LVM 中的逻辑卷设备存放在/dev设备目录中(实际上是做了一个符号链接),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组 名称/逻辑卷名称)。

[root@localhost dev]# find / -name vo1
/dev/storage/vo1
[root@localhost dev]# mkfs.ext4 /dev/storage/vo1 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# mkdir ceshi
[root@localhost ~]# mount /dev/storage/vo1 ceshi/
  • 查看挂载状态,并写入到配置文件,使其永久生效。
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  4.8G   20M  4.6G   1% /root/ceshi

echo "/dev/storage/vo1 /root/ceshi ext4 defaults 0 0" >> /etc/fstab
3.5.2 扩容逻辑卷
  • 第一步:把上一个实验中的逻辑卷vo1扩展至7G
# 卸载设备和挂载点(可选)
[root@localhost ~]# umount /root/ceshi

[root@localhost ~]# lvextend -L 7G /dev/storage/vo1 
  Size of logical volume storage/vo1 changed from 6.00 GiB (1536 extents) to 7.00 GiB (1792 extents).
  Logical volume storage/vo1 successfully resized.
  • 第二步:检查硬盘完整性,并重置硬盘容量。
[root@localhost ~]# e2fsck -f /dev/storage/vo1 
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo1: 11/393216 files (0.0% non-contiguous), 62574/1572864 blocks

[root@localhost ~]# resize2fs /dev/storage/vo1 
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1835008 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1835008 blocks long.
  • 第三步:重新挂载硬盘设备并查看挂载状态。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  6.8G   23M  6.4G   1% /root/ceshi
  • 注意1:e2fsck命令、resize2f命令、xfs_growf命令

e2fsck是检查ext2、ext3、ext4等文件系统的正确性和完整性,并修复任何问题。如果有任何问题,请根据提示进行修复。

resize2fs是ext2/ext3/ext4文件系统重定义大小工具。使用中将调整文件系统的大小,并根据需要扩展或收缩文件系统。

xfs_growf是xfs文件系统重定义大小工具。在处理xfs文件系统时,使用xfs_growf替换resize2fs。

  • 不卸载的方式(挂载扩容)
[root@localhost ~]# lvextend -L 7G /dev/storage/vo1 
  Size of logical volume storage/vo1 changed from 6.00 GiB (1536 extents) to 7.00 GiB (1792 extents).
  Logical volume storage/vo1 successfully resized.
[root@localhost ~]# resize2fs /dev/storage/vo1 
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1835008 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1835008 blocks long.  
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  6.8G   23M  6.4G   1% /root/ceshi
3.5.3 缩小逻辑卷

相较于扩容逻辑卷,在对逻辑卷进行缩容操作时,其丢失数据的风险更大。所以在生产 环境中执行相应操作时,一定要提前备份好数据。另外Linux系统规定,在对LVM逻辑卷进 行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证我们的数据安全)。在执 行缩容操作前记得先把文件系统卸载掉。

  • 第一步:检查文件系统的完整性。
[root@localhost ~]# umount /root/ceshi 
[root@localhost ~]# e2fsck -f /dev/storage/vo1     # 不先卸载的话,执行该命令会报错
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo1: 11/655360 files (0.0% non-contiguous), 79663/2621440 blocks
  • 第二步:把逻辑卷vo的容量减小到5G
[root@localhost ~]# resize2fs /dev/storage/vo1 5G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/storage/vo1 to 1310720 (4k) blocks.
The filesystem on /dev/storage/vo1 is now 1310720 blocks long.

[root@localhost ~]# lvreduce -L 5G /dev/storage/vo1 
  WARNING: Reducing active logical volume to 5.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage/vo1? [y/n]: y
  Size of logical volume storage/vo1 changed from 10.00 GiB (2560 extents) to 5.00 GiB (1280 extents).
  Logical volume storage/vo1 successfully resized.
  • 第三步:重新挂载文件系统并查看系统状态。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  4.8G   20M  4.6G   1% /root/ceshi
3.5.4 逻辑卷快照

LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,可 以对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快 照卷进行覆盖还原。LVM的快照卷功能有两个特点:

  • 快照卷的容量必须等同于逻辑卷的容量;
  • 快照卷仅一次有效,一旦执行还原操作后则会被立即自动删除。

首先查看卷组的信息。

[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               storage
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               19.99 GiB
  PE Size               4.00 MiB
  Total PE              5118
  Alloc PE / Size       1280 / 5.00 GiB
  Free  PE / Size       3838 / 14.99 GiB
  VG UUID               FdPjR1-cfK2-Hs1a-h6nh-hEZZ-1dun-bBhOSp

通过卷组的输出信息可以清晰看到,卷组中已经使用了 5GB 的容量,空闲容量还有 14.99GB。接下来用重定向往逻辑卷设备所挂载的目录中写入一个文件。

[root@localhost ~]# echo "Welcome to LVM" > /root/ceshi/readme.txt
[root@localhost ~]# ls -l /root/ceshi/
total 20
drwx------ 2 root root 16384 Jul 11 16:34 lost+found
-rw-r--r-- 1 root root    15 Jul 11 19:41 readme.txt
  • 第1步:使用-s参数生成一个快照卷,使用-L参数指定切割的大小。另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作。
[root@localhost ~]# lvcreate -L 5G -s -n BAK /dev/storage/vo1 
  Logical volume "BAK" created.
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo1
  LV Name                vo1
  VG Name                storage
  LV UUID                fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
  LV snapshot status     source of
                         BAK [active]
  LV Status              available
  # open                 1
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/storage/BAK
  LV Name                BAK
  VG Name                storage
  LV UUID                bYJmju-ZZn2-FYkw-PcUq-H7k8-awBM-LHLm1u
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 19:51:46 +0800
  LV snapshot status     active destination for vo1
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  COW-table size         5.00 GiB
  COW-table LE           1280
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
  • 第2步:在逻辑卷所挂载的目录中创建一个1GB的垃圾文件,然后再查看快照卷的状态。可以发现存储空间占的用量上升了。
[root@localhost ~]# dd if=/dev/zero of=/root/ceshi/files count=1 bs=1024M
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 18.5166 s, 58.0 MB/s
[root@localhost ~]#  lvdisplay 
  --- Logical volume ---
  LV Path                /dev/storage/vo1
  LV Name                vo1
  VG Name                storage
  LV UUID                fpfIpY-9PLx-nxiS-5I9h-akH2-vH1W-CJxdha
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 16:26:11 +0800
  LV snapshot status     source of
                         BAK [active]
  LV Status              available
  # open                 1
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/storage/BAK
  LV Name                BAK
  VG Name                storage
  LV UUID                bYJmju-ZZn2-FYkw-PcUq-H7k8-awBM-LHLm1u
  LV Write Access        read/write
  LV Creation host, time localhost, 2024-07-11 19:51:46 +0800
  LV snapshot status     active destination for vo1
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  COW-table size         5.00 GiB
  COW-table LE           1280
  Allocated to snapshot  20.08%                #### 存储空间占的用量上升了
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3
  • 第3步:为了校验SNAP快照卷的效果,需要对逻辑卷进行快照还原操作。在此之前记得先卸载掉逻辑卷设备与目录的挂载。
[root@localhost ~]# umount /root/ceshi 
[root@localhost ~]# lvconvert --merge /dev/storage/BAK
  Merging of volume storage/BAK started.
  storage/vo1: Merged: 80.57%
  storage/vo1: Merged: 100.00%
  • 第4步:快照卷会被自动删除掉,并且刚刚在逻辑卷设备被执行快照操作后再创建出来的1GB的垃圾文件也被清除了。
[root@localhost ~]#  mount -a 
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/sda3                 18G  2.0G   16G  12% /
/dev/sda1               1014M  132M  883M  13% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/mapper/storage-vo1  4.8G   20M  4.6G   1% /root/ceshi
3.5.5 删除逻辑卷

当生产环境中想要重新部署LVM或者不再需要使用LVM时,则需要执行LVM的删除 操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备, 这个顺序不可颠倒。

  • 第1步:取消逻辑卷与目录的挂载关联,删除配置文件中永久生效的设备参数。
[root@localhost ~]# umount /root/ceshi 
[root@localhost ~]# vim /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Mon Apr  8 15:58:05 2024
#
# 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=04637479-3fb2-40e0-9873-276b5a7ca53f /                       xfs     defaults        0 0
UUID=af29a88b-a46b-4654-bdbd-405ca8d6c294 /boot                   xfs     defaults        0 0
UUID=438d68b3-2f2b-4f3d-96ef-d0e5f26babf3 swap                    swap    defaults        0 0
# /dev/storage/vo1 /root/ceshi ext4 defaults 0 0
  • 第2步:删除逻辑卷设备,需要输入y来确认操作。
[root@localhost ~]# lvremove /dev/storage/vo1 
Do you really want to remove active logical volume storage/vo1? [y/n]: y
  Logical volume "vo1" successfully removed
  • 第3步:删除卷组,此处只写卷组名称即可,不需要设备的绝对路径。
[root@localhost ~]# vgremove storage 
  Volume group "storage" successfully removed
  • 第4步:删除物理卷设备。
[root@localhost ~]# pvremove /dev/sdb /dev/sdc 
  Labels on physical volume "/dev/sdb" successfully wiped.
  Labels on physical volume "/dev/sdc" successfully wiped.

在上述操作执行完毕之后,再执行lvdisplayvgdisplaypvdisplay命令来查看LVM 的信 息时就不会再看到信息了。

4. 第三层:磁盘分区

对磁盘空间进行分区相当于对房子进行”隔间“,功能化,专业化每个分区。

4.1 磁盘分区介绍

4.1.1 磁盘分区的类型

【主分区(primary)】

  1. 系统中必须要存在的分区,系统盘选择会选择主分区进行安装系统;
  2. 分区的数字编号中,可以用于主分区的数字只能是1-4。
  3. 主分区最多可以创建4个,但是至少要有一个主分区;

【扩展分区(extend)】

  1. 相当于一个独立的小磁盘;
  2. 有独立的分区表;
  3. 不能够独立存在,即不能够直接存放数据。必须在扩展分区中建立逻辑分区才能够存放数据;
  4. 扩展分区和主分区共享4个数字编号,扩展分区最多一个,可以没有。即主分区 + 扩展分区 = 4

【逻辑分区(logic)】

  1. 逻辑分区的数字编号只能从数字 5 开始;
  2. 逻辑分区存在在扩展分区之上,即逻辑分区依附于扩展分区;
  3. 逻辑分区中可以存放任意磁盘数据;
4.1.2 磁盘分区注意事项

一块硬盘的分区方式只能为如下组合之一:

  1. 任意多个主分区,但要求 1≤主分区数量≤4 。例如:一个硬盘可以分为4个主分区、3个主分区、2个主分区或1个主分区。
  2. 扩展分区可以和主分区组合,但要求 2≤(主分区+扩展分区)数量≤4 。例如:3个主分区+1个扩展分区、2个主分区+1个扩展分区或1个主分区+1个扩展分区。
  3. 当总分区的数量大于4个的时候,必须提前分一个扩展分区,扩展分区最多只能有一个。

问题:如果给一个磁盘分6个分区有哪些方案,同时写出分区/dev/sda(数字)。

3P+1E(3L) 123 567

2P+1E(4L) 12 5678

1P+1E(5L) 1 56789

注意:如果分区操作完成之后,磁盘空间还有剩余的话。这些磁盘空间只能够浪费掉。

4.1.3 磁盘分区的工作原理

磁盘是按照柱面进行分区的;

磁盘分区表(DPT)是磁盘分区登记的地点,存放分区结果信息的。

磁盘分区表位置位于 0磁道0磁头1扇区(512字节),具体位置是1扇区的前446字节(系统引导信息的)后面的64字节(分区表),最后的剩下2个字节分区结束标志。

磁盘分区表的容量是有限的,64字节,一个分区固定占16字节。64/16=4分区(主分区+扩展分区)


【由图所示】

  • 在分区存储结构表中显示,该磁盘分为:3P + 1E(2L)。每一个主分区都分为引导分区信息和数据两个部分;但是在扩展分区中,还会有额外的一个扩展的分区表。扩展分区本身并不存储数据,必须依靠逻辑分区来存储数据。

  • 通过放大引导分区,我们可以清楚的看到,引导分区位于0磁头0磁道1扇区的位置,再次放大来看1扇区这512个字节都包含的内容,可以看到前446字节是存放主引导记录的位置,随后的64字节分别是存放这四个分区(3P+1E)的分区表信息,因为一个分区表信息固定占用16字节,所以最多只能划分4个分区(这里不包括逻辑分区)。最后的2字节被理解为分区结束的标志,也有的被理解为和前面的64个字节一起组成分区表。

4.2 磁盘分区实践

绝对不能对已经挂载的系统进行分区。

磁盘分区的核心本质就是修改64字节的分区表而已。

  • 磁盘分区常用命令fdisk,修改MBR分区表,MBR格式。但是被修改的磁盘大小不能大于2T。
  • 磁盘分区其他命令parted,修改gpt分区格式,既能修改小于2T也能修改大于2T的磁盘。
  • 所以,小于2T 就用 fdisk;大于 2T 就用parted。
4.2.1 fdisk的使用
  • fdisk 是 linux下最常用的分区工具,一般是装完系统后进行分区。而装系统之前的分区,多数都是系统ISO里面的工具分,或者raid里分小磁盘。
  • fdisk只能root权限用户使用。
  • fdisk适合于对装系统后的剩余空间进行分区,例如:安装系统时没有全部分区,或者安装系统后添加新磁盘。
  • fdisk支持 mbr 分区表(2TB 以内)
  • 用fdisk分区的实质,就是修改0磁头0磁道1扇区的前446字节之后的64字节的分区表信息。
查看磁盘分区信息

查看系统硬件配置及相关信息的命令:https://wwwblogs/nineep/p/7011059.html

[root@localhost ~]# fdisk -l        # 查看所有分区的信息

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x00018f37

Device    Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648     4605951     2097152   82  Linux swap / Solaris
/dev/sda3         4605952    41936895    18665472   83  Linux

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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

[root@localhost ~]#      
使用fdisk命令分区

在执行fdisk命令时,

  • CentOS7 可以使用 fdisk /dev/sdb
  • CentOS6 的话需要执行 fdisk -cu /dev/sdb
[root@localhost ~]# fdisk /dev/sdb     // 找到需要操作的磁盘进行操作
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x71ebff8f.

Command (m for help):           

在这里,需要执行相关的分区操作命令!

Command (m for help): m     # 输入m,查看分区的帮助信息
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition                          # 删除分区
   g   create a new empty GPT partition table      # 创建新的GPT分区表
   G   create an IRIX (SGI) partition table
   l   list known partition types                 # 列出分区类型  82 83 8e
   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             # 改变分区系统的id,类型
   u   change display/entry units                 # 改变分区的方式,是否按照扇区进行划分
   v   verify the partition table
   w   write table to disk and exit               # 保存分区表信息并退出
   x   extra functionality (experts only)      

接下来进入实际划分的阶段。

分区案例:计划使用 3P + 1E(3L) 的方式划分6个分区,鉴于磁盘只有1G空间,所以这里分区规划,每个分区空间为150M。

  • 第一步:创建新分区
Command (m for help): n        # 创建新分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)     # 主分区
   e   extended                                   # 扩展分区
# 主分区当前未创建,还有四个可以创建。
  • 第二步:选择创建分区
Select (default p): p             # 选择需要创建的分区类型,默认是主分区(p),主分区的话直接回车即可。          
  • 第三步:确认创建的分区编号
Partition number (1-4, default 1):       # 因为创建的是主分区,所以编号(1-4),默认是1.可以直接回车确认。 
                                         # 就是 sda1 或 hda1 中的1。
  • 第四步:确认起始扇区位置
First sector (2048-2097151, default 2048):      # 这里给出了扇区的范围,可以在这个区间里选择起始扇区, 
												# 默认的是2048扇区位置        
  • 第五步:确认终止扇区位置
First sector (2048-2097151, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): +150M

# 这一步(确认终止扇区位置)和上一步(确定起始扇区位置)共同来确定分区的大小。

# 确认终止扇区有两种方式,一种是根据扇区来,设置填写一个终止扇区的位置;另一种是根据分区大小来,填写这个分区所需要的大小;
# 我们最常用的就是根据分区大小确定终止分区,格式是:+size{K,M,G}         
  • 第六步:回车确认
Partition 1 of type Linux and of size 150 MiB is set

# 设置了 分区1 为Linux 类型 且 大小为 150 MiB         
  • 第七步:完成分区之后,查看分区结果确认
Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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
Disk label type: dos
Disk identifier: 0x51b7f7d9

Device    Boot      Start       End        Blocks   Id  System
/dev/sdb1            2048      309247      153600   83  Linux           

然后,重复执行上述操作,划分完三个主分区。

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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
Disk label type: dos
Disk identifier: 0x51b7f7d9

Device    Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      309247      153600   83  Linux
/dev/sdb2          309248      616447      153600   83  Linux
/dev/sdb3          616448      923647      153600   83  Linux

接下开始划分【扩展分区】,这里的操作与上面类似。

Command (m for help): n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
Selected partition 4
First sector (923648-2097151, default 923648): 
Using default value 923648
Last sector, +sectors or +size{K,M,G} (923648-2097151, default 2097151): 
Using default value 2097151
Partition 4 of type Extended and of size 573 MiB is set

# 因为之前已经有了3个主分区,所以只能在有一个主分区或1个扩展分区。
# 在设置扩展分区的终止扇区时,会选择全部的空间。因为即使留有部分空间也会浪费掉。

然后是在扩展分区中创建逻辑分区。

Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (925696-2097151, default 925696): 
Using default value 925696
Last sector, +sectors or +size{K,M,G} (925696-2097151, default 2097151): +150M
Partition 5 of type Linux and of size 150 MiB is set

# 这里创建逻辑分区与主分区略有不同
# 创建逻辑分区时,逻辑分区编号会自动生成,不需要人工选择;
# 而且扇区位置可以很明显看出来是扩展分区的扇区          

重复执行上述操作,最后得到【3P + 1E(3L)】共6个分区。

Command (m for help): p

Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 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
Disk label type: dos
Disk identifier: 0x51b7f7d9

Device    Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      309247      153600   83  Linux
/dev/sdb2          309248      616447      153600   83  Linux
/dev/sdb3          616448      923647      153600   83  Linux
/dev/sdb4          923648     2097151      586752    5  Extended
/dev/sdb5          925696     1232895      153600   83  Linux
/dev/sdb6         1234944     1542143      153600   83  Linux
/dev/sdb7         1544192     1851391      153600   83  Linux
  • 第八步:但是这里还没有完全结束,还需要输入w保存分区,然后退出。

  • 第九步:退出之后,执行partprobe命令,使内核重新核查分区表。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# partprobe /dev/sdb
4.2.2 parted的使用

GPT的分区表解决了传统的MBR无法逾越2TB的限制。但是在Linux系统中,传统的fdisk命令无法支持gtp分区方式。(在红帽企业版Linux 4 Update 4之后的版本提供了对大于2TB的磁盘设备的支持)

parted 的操作是实时的,也就是说执行一个分区命令之后,就实实在在的分区了。不需要像fdisk命令那样执行w命令保存写入数据。所以在parted命令测试的时候,建议不要在生产环境中。

需求:已有磁盘做了RAID5,大小6T,已经安装了系统。现在需要额外添加4块2T硬盘。

现有一个做了RAID 5的硬盘,要求分三个分区:

硬盘总分区大小: 6.2T

/data0 4.8T

/data1 1T

​ 4G (无需格式化,做DRBD用)

  • 快速分区方式(一键分区):在linux命令行下执行
parted /dev/sdb mklabel gpt                   # 修改分区格式为gpt。
parted /dev/sdb mkpart primary 0 4800000 I        # 创建一个4.8T主分区
parted /dev/sdb mkpart primary 4800001 5800001 I       # 创建一个1T主分区   # 这里的 I表示忽略
parted /dev/sdb mkpart primary 5800002 5804098 I      # 创建一个4G主分区
parted /dev/sdb p
  • 第一步:进入parted配置界面
[root@localhost ~]# parted /dev/sdb     # 交互式分区开始
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)                    
  • 查看帮助命令
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found partitions, or a particular
        partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted
(parted) 
  • 第二步:将分区格式类型转换为gpt
(parted) mklabel gpt       # 转换分区格式 为GPT                                               
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes  

(parted) p   # 查看                                                           
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt    # 分区格式
Disk Flags: 
Number  Start  End  Size  File system  Name  Flags
  • 第三步:创建新分区
(parted) mkpart primary 0 480       # 创建主分区480M                                      
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore      # 忽略警告                                               
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name     Flags
 1      17.4kB  480MB  480MB               primary


# 如果是创建逻辑分区的话,不需要先创建扩展分区,可以直接创建逻辑分区
(parted) mkpart logic 481 581                                             
Warning: You requested a partition from 481MB to 581MB (sectors 939453..1134765).
The closest location we can manage is 481MB to 481MB (sectors 940031..940031).
Is this still acceptable to you?
Yes/No? yes                                                               
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore          # 忽略警告                                              
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name     Flags
 1      17.4kB  480MB  480MB                primary
 3      481MB   481MB  512B                 logic
 2      481MB   581MB  99.6MB               logic      
  • parted 命令直接生效,不需要进行保存操作。

  • 如果需要删除的分区的话,使用命令:rm 分区号。

(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name     Flags
 1      17.4kB  480MB  480MB                primary
 3      481MB   481MB  512B                 logic
 2      481MB   581MB  99.6MB               logic

(parted) rm 3           # 删除 3分区                                                      
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size    File system  Name     Flags
 1      17.4kB  480MB  480MB                primary
 2      481MB   581MB  99.6MB               logic
4.2.3 分区类型
  • 常用分区类型
分区系统ID分区系统说明
82Linux swap / Solarisswap分区系统
83Linux标准分区系统
8eLinux LVM动态分区系统
  • 修改分区系统的类型

注意:绝对不能对已经挂载的系统进行分区调整。

对于已经划分的分区,需要修改它的分区文件系统的类型可以按照如下操作:

案例:将一个【动态分区系统】修改为一个【标准分区系统】

Command (m for help): p

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x00001ac8

Device    Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     3762175     1572864   82  Linux swap / Solaris
/dev/sda3         3762176    41943039    19090432   8e  Linux LVM     # 暂时以这个分区进行操作,实际上是不允许操作的

Command (m for help): t           # 改变分区系统的类型
Partition number (1-3, default 3): 3      # 确定分区
Hex code (type L to list all codes): L      # 查看分区系统类型

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx         
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data    
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility   
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1 80  Old Minix      

Hex code (type L to list all codes): 83     # 确认修改成那种分区类型
Changed type of partition 'Linux LVM' to 'Linux'

Command (m for help): p   # 查看结果

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 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
Disk label type: dos
Disk identifier: 0x00001ac8

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     3762175     1572864   82  Linux swap / Solaris
/dev/sda3         3762176    41943039    19090432   83  Linux

##########################################################################
# 报错的情况(因为是正在挂载的系统,所以不允许修改)
Command (m for help): w     # 保存退出
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
##########################################################################
# 正常可以保存的情况
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# partprobe /dev/sdb

5. 第四层:文件系统(格式化)

文件系统:计算机存储和组织数据的方法或者机制。

磁盘等硬件需要软件驱动才能够被系统使用,而文件系统就是磁盘的软件驱动。文件系实现通过磁盘管理规划、存取数据。

常见的软件系统有哪些类型:

  • Windows:NTFS、FAT32、msdos、…
  • Linux:ext2、ext3、ext4、xfs、btrfs、…
  • mkfs格式化实践

mkfs命令是用于创建文件系统的命令行工具。当你想要在一个分区或存储设备上初始化一个新的文件系统时,就会用到这个命令。它支持多种文件系统类型,如 ext4、XFS、FAT32、NTFS 等,具体取决于你的操作系统所支持的文件系统类型。

mkfs语法:mkfs [-t 文件系统类型] 设备文件名

[root@localhost ~]# ls -l /dev/sdb*                  // 查看当前硬盘分区
brw-rw----. 1 root disk 8, 16 Feb 21 09:56 /dev/sdb
brw-rw----. 1 root disk 8, 17 Feb 21 09:56 /dev/sdb1
brw-rw----. 1 root disk 8, 18 Feb 21 09:56 /dev/sdb2
[root@localhost ~]# mkfs -t ext4 /dev/sdb1            // 格式化ext4文件
[root@localhost ~]# mkfs.ext4 /dev/sdb1               // 同上效果

# 其实关键就是生成一定数量的Inode和Block。
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=33685504
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345, 73729

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done     

查看可以直接使用mkfs的命令(类似mkfs.ext4),这些都对应着相应的文件系统

[root@localhost mnt]# mk
mkdict            mke2fs            mkfs.btrfs        mkfs.ext3        
mkfs.xfs          mklost+found      mktemp
mkdir             mkfifo            mkfs.cramfs       mkfs.ext4         
mkhomedir_helper  mknod             
mkdumprd          mkfs              mkfs.ext2         mkfs.minix        
mkinitrd          mkswap 

6. 第五层:mount挂载文件系统

mount命令用于将文件系统挂载到已存在的目录上,可以通过该目录访问该文件系统的内容。挂载操作实际上是创建了文件系统与目录之间的一个关联。

[root@localhost ~]# mount -t ext4 /dev/sdb1 /mnt
# 临时挂载 /dev/sdb1 到 /mnt 路径下
# 参数 -t 指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。

[root@localhost ~]# df -h     # 查看挂载结构
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.7M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda3        18G  1.7G   17G  10% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs            98M     0   98M   0% /run/user/0
/dev/sdb1        93M  1.6M   85M   2% /mnt

# 强制卸载
[root@localhost mnt]# umount -lf /mnt/
[root@localhost mnt]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        476M     0  476M   0% /dev
tmpfs           487M     0  487M   0% /dev/shm
tmpfs           487M  7.7M  479M   2% /run
tmpfs           487M     0  487M   0% /sys/fs/cgroup
/dev/sda3        18G  1.7G   17G  10% /
/dev/sda1       197M  110M   88M  56% /boot
tmpfs            98M     0   98M   0% /run/user/0

# 【注意】:没有格式化的磁盘分区无法进行挂载
# 这里以sdb2为例
[root@localhost mnt]# mount /dev/sdb2 /opt
mount: /dev/sdb2 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'

# 格式化成xfs文件格式
[root@localhost mnt]# mkfs.xfs /dev/sdb2
meta-data=/dev/sdb2              isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
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=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

6.1 实现开机自动挂载

[root@localhost mnt]# cat /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Fri Feb 18 15:25:05 2022
#
# 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=22ce207e-a69d-46a3-b612-1c5ceada7b38  /       xfs     defaults   0 0
UUID=e07b695c-bbc9-4a53-8560-fa8a75a51710 /boot   xfs     defaults    0 0
UUID=cff3ee6d-2475-4326-ac5f-6117fab27ac7 swap    swap    defaults    0 0
# 设备      挂载点    文件系统类型  默认挂载选项  是否备份  是否开机磁盘检查
/dev/sdb2   /opt      xfs       defaults      0       0
  • 查看设备的UUID号
[root@localhost ~]# blkid
/dev/sda1: UUID="3ffa7b06-22fb-4882-8d0d-a1a2d9809be3" TYPE="xfs" 
/dev/sda2: UUID="1a58e26a-b8ad-4652-aeed-34bff23091a8" TYPE="swap" 
/dev/sda3: UUID="5o3Hbv-0j8p-TE9k-k7nE-Rruu-2how-LEd2Jh" TYPE="LVM2_member" 
/dev/sr0: UUID="2020-04-22-00-54-00-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 
/dev/mapper/centos-root: UUID="9d6bf6f7-2b9e-4bd4-9457-658648128de6" TYPE="xfs" 
  • 查看分区使用空间
[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 475M     0  475M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.7M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/mapper/centos-root   19G  2.5G   16G  14% /
/dev/sda1                297M  151M  146M  51% /boot
tmpfs                     98M     0   98M   0% /run/user/0
  • 查看分区Inodes
[root@localhost ~]# df -i
Filesystem               Inodes IUsed   IFree IUse% Mounted on
devtmpfs                 121458   387  121071    1% /dev
tmpfs                    124433     1  124432    1% /dev/shm
tmpfs                    124433   737  123696    1% /run
tmpfs                    124433    16  124417    1% /sys/fs/cgroup
/dev/mapper/centos-root 9543680 71926 9471754    1% /
/dev/sda1                153600   332  153268    1% /boot
tmpfs                    124433     1  124432    1% /run/user/0
  • 查看文件系统内部细节
[root@localhost ~]# dumpe2fs /dev/sdb1           # 仅可以查看ext文件系统内部细节
[root@localhost ~]# dumpe2fs /dev/sdb1|egrep -i "size"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Block size:               1024
Fragment size:            1024
Group descriptor size:    64
Flex block group size:    16
Inode size:	          128
Journal size:             4096k

### 对于 xfs文件 可以如何来查看呢?
[root@localhost ~]# xfs_               # xfs文件配套的命令   
xfs_admin      xfs_copy       xfs_estimate   xfs_fsr        xfs_info       xfs_logprint   xfs_metadump   xfs_ncheck     xfs_repair     xfs_bmap       xfs_db         xfs_freeze     xfs_growfs     xfs_io         xfs_mdrestore  xfs_mkfile     xfs_quota      xfs_rtcp
[root@localhost ~]# xfs_info /dev/sda1       # 查看xfs文件信息的命令
meta-data=/dev/sda1              isize=512    agcount=4, agsize=19200 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=76800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

6.2 fsck 磁盘检查和修复

正常运行的磁盘不能操作,需要卸载挂载点再操作。

-a:修复磁盘

[root@localhost ~]# fsck        # fsck相关命令
fsck         fsck.btrfs   fsck.cramfs  fsck.ext2    fsck.ext3    fsck.ext4    fsck.minix   fsck.xfs

[root@localhost ~]# fsck -a /dev/sdb1       # 执行fsck命令,修复sdb1
fsck from util-linux 2.23.2
/dev/sdb1: clean, 12/25688 files, 8896/102400 blocks

[root@localhost ~]# mount /dev/sdb1 /mnt     # 挂载 sdb1
[root@localhost ~]# fsck -a /dev/sdb1        # 然后再使用fsck命令修复sdb1,报错。
fsck from util-linux 2.23.2
/dev/sdb1 is mounted.
e2fsck: Cannot continue, aborting.
[root@localhost ~]# umount /mnt             # 卸载

[root@localhost ~]# e2fsck /dev/sdb1           # e2fsck 等效于 fsck -a 同样,对 xfs文件系统也无法操作
e2fsck 1.42.9 (28-Dec-2013)
/dev/sdb1: clean, 12/25688 files, 8896/102400 blocks
[root@localhost ~]# fsck -a /dev/sdb1
fsck from util-linux 2.23.2
/dev/sdb1: clean, 12/25688 files, 8896/102400 blocks

[root@localhost ~]# xfs_repair /dev/sdb2              # 使用xfs_repair对 xfs 文件系统分区进行修复
xfs_repair: /dev/sdb2 contains a mounted filesystem
xfs_repair: /dev/sdb2 contains a mounted and writable filesystem

fatal error -- couldn't initialize XFS library       # xfs_repair,同理,挂载的不可以操作

[root@localhost ~]# umount /opt
[root@localhost ~]# xfs_repair /dev/sdb2         # 卸载,重复执行
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan and clear agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
Phase 5 - rebuild AG headers and trees...
        - reset superblock...
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

6.3 创建文件系统时指定块大小和inode大小格式

root@localhost ~]# mkfs -t ext4 -b 4096 -I 512 /dev/sdb3
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
38400 inodes, 38400 blocks
1920 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=39845888
2 block groups
32768 blocks per group, 32768 fragments per group
19200 inodes per group
Superblock backups stored on blocks: 
	32768

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost ~]# dumpe2fs /dev/sdb3|egrep -i "size"
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Flex block group size:    16
Inode size:	              512
Required extra isize:     28
Desired extra isize:      28
Journal size:             16M

最后第六层的磁盘管理工具命令这里就不再赘述了,常用的那几个命令以及用法在前面已经提到过了。

发布评论

评论列表 (0)

  1. 暂无评论