八、磁盘管理

   日期:2024-12-25    作者:i1tir 移动:http://oml01z.riyuangf.com/mobile/quote/14156.html

8.1 机械与固态知识


8.2 RAID知识

8.2.1 RAID概述

磁盘冗余阵列RAID,物理服务器的硬盘通过RAID卡进行配置,然后才能使用。

八、磁盘管理


8.2.2 RAID优势
  • 可以获取更高容量
  • 可以获取更高性能(读写速度 io(input写/output读)速度
  • 可以获取更高冗余(安全性)

8.2.3 RAID级别

常见的raid级别:raid 0 ,raid 1,raid 5,raid 10

需要几块盘 安全冗余 可用容量 性能 应用场景 RAID 0 1 最低 所有硬盘总和 读写最快 不要求安全,只要求速度(数据库从库、存储从库、web服务器) RAID 1 只能有2块 100% 所有硬盘总和/2 写入速度慢,读取OK 系统盘、监控服务器 RAID 5 3 最多坏一块盘 损失一块盘的容量 写入性能不好,读取OK 普遍数据库,存储等访问量不高的 RAID 10 4 可以损坏一半 所有硬盘总和/2 读取很快 高并发或高访问的数据库从库、存储等

8.3 MBR与GPT

早期的 Linux 系统为了兼容于 Windows 的磁盘,因此使用的是支持 Windows 的 MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开机管理程序纪录区与分区表则通通放在磁盘的第一个扇区。


这个扇区通常是 512bytes 的大小,所以说第一个扇区 512bytes 会有这两个数据:

  • 主要启动记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有 446 bytes
  • 分区表(partition table):记录整颗硬盘分区的状态,有 64 bytes

由于分区表所在区块仅有 64 bytes 容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的磁柱号码。 若将硬盘以长条形来看,然后将磁柱以柱形图来看,那么那 64 bytes 的记录区段有点像底下的图示:


由于分区表就只有 64 bytes 而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要(Primary)或延伸(Extended)分区槽。


如何分出四个以上分区?利用延伸分区(Extended)的方式来处理,既然第一个扇区所在的分区表只能记录四笔数据, 那我可利用额外的扇区来记录更多的分区信息。实际上图示有点像底下这样:


主分区、扩展分区、逻辑分区(GPT随便用分区)

主分区: 最多有4个,每个占用16字节分区表空间。

扩展(延伸)分区:

  • 主要用来解决主分区最多4个。
  • 主分区无法直接存放数据与使用。
  • 如果要使用需要在扩展分区中创建逻辑分区。
  • 扩展分区在一个磁盘中只有1个。

逻辑分区:

  • 需要先创建扩展分区。
  • 使用逻辑分区存放数据。

MBR vs GPT

MBR

  • MBR主引导记录,磁盘分区格式。
  • 磁盘大小不能大于2tb,如果大于2tb则无法使用。

GPT

  • GPT分区表格式,解决分区数量问题。
  • 解决系统支持大硬盘的问题。
  • 主分区随便用,不用区分主分区,扩展分区,逻辑分区。


8.4 分区命名规则




8.5 磁盘分区实战

8.5.1 添加并识别硬盘

先查看现在系统的硬盘信息


在vmware上给虚拟机添加一块10G的硬盘,这个操作模拟在物理服务器热插拔进一块硬盘,此时再查看硬盘信息,还是没有新的硬盘信息加入。在生产环境中,磁盘空间不足时需新加磁盘,一般来说,新加磁盘后需要重启系统才能识别加载,但是生产环境不能随便重启,所以需要一种方法能够不重启系统也可以加载识别新磁盘。那就是通过加载总线扫描方法


查看总线并进行重新扫描SCSI总线


重新查看硬盘信息,已成功添加


8.5.2 磁盘相关工具和命令
8.5.2.1 lsblk 列出所有磁盘列表

由于目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样!当然可以使用parted 这个通通有支持的工具来处理,不过,还是比较习惯使用 fdisk 或者是 gdisk 来处理分区!因此,我们自然就得要去找一下目前系统有的磁盘有哪些?这些磁盘是 MBR 还是 GPT 等等的!


lsblk命令的选项与参数:
-d :仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)
-m :同时输出该装置在 /dev 底下的权限数据 (rwx 的数据)
-p :列出该装置的完整文件名!而不是仅列出最后的名字而已。
-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等


示例



8.6.2.2 blkid 列出UUID、文件系统等参数

8.6.2.3 parted 列出磁盘信息

parted 不仅可以列出磁盘的分区表类型与分区信息,还可以对磁盘进行分区操作。


8.5.2.4 磁盘分区工具

fdisk用法



gdisk用法与fdisk相似,暂不单独列出,请看8.5.4 gdisk创建分区案例。


8.5.3 fdisk 创建分区

在/dev/sdb中创建1个G的磁盘分区



8.5.4 gdisk 创建分区

对刚从添加的磁盘清除分区信息,然后进行gdisk /dev/sdb,下面信息就显示我们刚从的硬盘是有过MBR记录的,如果新磁盘用gdisk进行分区过后再删除分区保存分区表信息,重新进入gdisk也会识别出是GPT记录。



如果分区完遇到以下情况,一般为此硬盘已分区过,并进行了格式化以及挂载,处于正在使用状态。


并没有发现sdb2,因为核心还没有更新。 Linux 此时还在使用这颗磁盘,为了担心系统出问题,所以分区表并没有被更新!这个时候我们有两个方式可以来处理! 其中一个是重新启动,另外一个则是透过 partprobe 这个命令来处理即可!


partprobe 更新 Linux 核心的分区表信息




8.5.5 mkfs 格式化分区

分区完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,mkfs.xfs、mkfs.ext4等等。



8.5.6 mount 文件系统挂载

挂载点是目录, 而这个目录是进入磁盘分区(文件系统)的入口就是了。不过要进行挂载前,先确定要被挂载的磁盘无被挂载,要挂载到的目录此时没有挂载其他磁盘,理论上要作为挂载点的目录应该是空目录才是。


举个例子来说,假设你的 /home 原本与根目录 (/) 在同一个文件系统中,底下原本就有 /home/test 与/home/vbird 两个目录。然后你想要加入新的磁盘,并且直接挂载 /home底下,那么当你挂载上新的分区时,则 /home 目录显示的是新分区内的内容,至于原先的 test 与vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉, 而是暂时的隐藏了起来,等到新分区被卸除挂载之后,则 /home 原本的内容就会再次的跑出来啦!




示例

1.直接mount挂载



2.使用UUID进行mount挂载

找出 /dev/sdb1 的 UUID 后,用该 UUID 来挂载文件系统到 /root/test内



umount 将文件系统卸载



平常使用常规卸载即可



8.5.7 开机自动挂载
8.6.7.1 修改 /etc/rc.local

/etc/rc.local里面存放的命令,脚本会在开机的时候自动运行,第1次使用需要给 /etc/rc.d/rc.local 加上执行权限。



示例



8.6.7.2 修改 /etc/fstab

直接到 /etc/fstab进行修改,实现开机自动挂载。以下是挂载的注意事项:

  • 根目录 / 是必须挂载的,而且一定要先于其它挂载点被挂载进来。
  • 其它挂载点必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则 (FHS)
  • 所有挂载点在同一时间之内,只能挂载一次。
  • 所有磁盘分区(partition)在同一时间之内,只能挂载一次。
  • 如若进行卸除,您必须先将工作目录移到挂载点(及其子目录)之外。

/etc/fstab文件详解


第一栏:设备文件名/UUID/LABEL name:

  • 文件系统或磁盘的装置文件名,如 /dev/vda2 等
  • 文件系统的 UUID 名称,如 UUID=xxx
  • 文件系统的 LABEL 名称,例如 LABEL=xxx

第二栏:挂载点,一定是目录。

第三栏:磁盘分区的文件系统,在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须要手动写入文件系统才行!包括 xfs, ext4, vfat, reiserfs, nfs 等等。

第四栏:文件系统参数,默认填写defaults即可,详情可查询相关资料

第五栏:能否被 dump 备份指令作用,dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会啦!直接输入 0 就好了!

第六栏:是否以 fsck 检验扇区,早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整 (clean)。 不过
这个方式使用的主要是透过 fsck 去做的,我们现在用的 xfs 文件系统就没有办法适用,因为 xfs会自己进行检验,不需要额外进行这个动作!所以直接填 0 就好了。


额外注意

/etc/fstab 是开机时的配置文件,不过,实际文件系统的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个文件当中的。每次我们在更动文件系统的挂载时,也会同时更动这两个文件!但是,万一发生你在 /etc/fstab 输入的数据错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可是 read only 的状态,当然你就无法修改 /etc/fstab ,也无法更新 /etc/mtab ~那怎么办?没事,可以利用底下这一招:



8.5.8 磁盘企业级分区方案

1.通用磁盘分区方案(不太重要的环境,没有用户数据)

运行不太重要的环境,没有用户数据。

/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。

swap 分区 内存不足的时候,swap空间临时充当内存使用。

  • 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
  • 内存大于8G swap 给8G 8-16G

在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap

/ 分区 根分区剩余多少给多少。


2.通用磁盘分区方案(有重要数据)

/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。

swap 分区 内存不足的时候,swap空间临时充当内存使用。

  • 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
  • 内存大于8G swap 给8G 8-16G

在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap

/ 分区 根分区 40-100G

/data 数据分区 重要数据放在/data 目录、分区中。


3.通用磁盘分区方案(不知道是否有重要数据)

/boot 分区 用于引导系统启动,linux内核文件。可能需要升级linux内核,预留到1G即可。

swap 分区 内存不足的时候,swap空间临时充当内存使用。

  • 内存小于8G swap 可以给内存的1.5倍或2倍。 最大控制在8-16G
  • 内存大于8G swap 给8G 8-16G

在一些生产环境中为了极致的速度、性能。会关闭swap。温馨提示:云服务器默认没有swap

/ 分区 根分区 40-100G

剩余空间暂不分配,未来谁使用谁分配。


8.5.9 磁盘故障案例(出现磁盘空间不足 no space left on device)

下面会常用到这两个命令,模拟、排查、解决。



8.5.9.1 因为大文件(block不足)

先查看现有的磁盘使用情况


1.模拟创建大文件

创建一个5G的大文件存放在/root目录下


2.排查定位问题

目标:定位大文件在哪里,在哪个目录,是什么文件名字。首先先整体看一下是哪里磁盘看见不足(哪个分区),根据有问题的分区进行详细的一层一层排查,排查到具体目录或文件。


查看磁盘使用情况,相比前面的信息,根目录下的磁盘使用多了5G,也就是上面的模拟大文件存放在/root目录下多出来的。


根据有问题的分区一层一层排查,排查到具体目录或文件。已看到最大的空间使用在/root目录下


或者还可以使用以下命令进行排查


3.解决问题

大致思路如下,一层一层查询大文件,最终找到大文件在/root下。



确认文件是否重要,确认是否可以删除。删除后再查看磁盘使用情况。


8.5.9.2 大量小文件(inode不足)

1.模拟

创建小的磁盘分区并格式化。


挂载到/inode目录,查看磁盘inode使用情况。


然后创建大量小文件进行占用inode,模拟inode耗尽,查看磁盘inode使用情况,已经被占满。而且从246开始就创建不了,那是因为这个小磁盘可用的就245个inode,所以从246就创建不了(可用inode情况看上图)


2.排查定位问题

默认出现问题的时候,都是提示空间不足,所以一开始都是查磁盘是否还有空间,但创建文件仍然提示磁盘空间不足,就要查磁盘的inode使用情况。


3.解决问题

排查出小文件处在什么目录下,然后确认是否可以删除。可删除后,再测试是否可以进行写入。


如何寻找小文件多的目录

1.目录中文件越多,目录本身大小越大。




2.找出系统中大量小文件的目录

思路:显示系统中所有文件, 取出路径部分(目录),然后uniq 统计次数。



8.5.9.3 文件没有被彻底删除

1.了解文件删除原理

Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。

  • i_count的意义是当前文件使用者(或被调用)的数量
  • i_nlink 的意义是介质连接的数量(硬链接的数量)

当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。


对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?


这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。


当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?

前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名(目录block中数据)到文件本身的inode的链接删除了,此时,并没有删除文件的实体即(文件的block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了,那时就是神仙也没有办法了。


2.故障模拟


模拟大文件的前后磁盘使用对比


新开一个远程连接来模拟程序占用,同时开始排查大文件



最终排查到大文件并删除


但再次查看磁盘使用情况,还是占用这么多。


继续排查,顶多加起来就5G,此时就要怀疑可能是文件没有被彻底删除,这种情况大多出现在被进程或者服务嗦占用了。


3.问题解决

结束或重启对应的进程/服务,现在进行占用排查




由于我们是模拟占用,直接kill对应进程即可,再次查看磁盘空间使用情况,已经恢复正常。


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号