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
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对应进程即可,再次查看磁盘空间使用情况,已经恢复正常。