🍖磁盘管理

Posted songhaixing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了🍖磁盘管理相关的知识,希望对你有一定的参考价值。

一.磁盘在系统上的命名

1.设备名称

设备名称 分区名称 分区类型
/dev/sda /dev/sda1 第一块物理磁盘第一分区
/dev/sdb /dev/sdb3 第二块物理磁盘第三分区
...... ....... .......

技术图片

2.分区分类

  • 磁盘分区类型分为: p主分区, e扩展分区, l逻辑分区

  • 逻辑分区属于扩展分区, 扩展分区属于主分区

  • 主分区又叫做引导分区

技术图片

二.两种分区格式

1.mbr分区格式

  • 最多可分4个主分区
  • 通常用于小于2T的硬盘空间
  • 分区工具: fdiak

2.gpt分区格式

  • 最多可分128个主分区
  • 通常用于大于2T的硬盘空间
  • 分区工具: gdisk

三.制做磁盘分区的通用流程

  1. 插一块硬盘

  2. 小于2T空间用mbr分区格式, 大于2T推荐用gpt分区格式

  3. 设置分区类型和大小保存设置

  4. 为每个分区制作文件系统(格式化):mkxfs.xfs

  5. 为每个分区关联挂载点:mount

四.制作磁盘分区 fdisk

1.先给虚拟机添加一块小于2T的磁盘

??使用命令查看磁盘是否存在
# lsblk
# ll /dev/sd   +   双击 Tab 键

技术图片

2.使用fdisk工具进行分区

??选择要分区的磁盘设备 "/dev/sdb"
[root@shawn ~]#fdisk /dev/sdb

技术图片

??输入"m"获取帮助信息
??常用命令操作
"n"  :  #新建分区
"d"  :  #删除分区
"l"  :  #显示分区类型
"m"  :  #帮助菜单
"p"  :  #显示分区表信息
"q"  :  #不保存退出
"w"  :  #保存退出

技术图片

3.开始创建三种分区

  • 主分区创建
??创建一个主分区
命令(输入 m 获取帮助):n     #新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)  #三种分区类型
   e   extended
Select (default p): p      #选择你想要的分区类型(逻辑分区需要先有扩展分区)
分区号 (1-4,默认 1):1     #设定分区号
起始 扇区 (2048-4194303,默认为 2048):    #设置扇区开始位置(正常默认就行)
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-4194303,默认为 4194303):+500M  #大小
分区 1 已设置为 Linux 类型,大小设为 500 MiB    #设置成功
  • 扩展分区创建
??创建一个扩展分区
命令(输入 m 获取帮助):n     #新建
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e      #选择扩展分区
分区号 (2-4,默认 2):      #分区号
起始 扇区 (1026048-4194303,默认为 1026048):   #默认起始位置
将使用默认值 1026048
Last 扇区, +扇区 or +size{K,M,G} (1026048-4194303,默认为 4194303):#都给扩展分区
将使用默认值 4194303
分区 2 已设置为 Extended 类型,大小设为 1.5 GiB    #设置成功
  • 新建逻辑分区
??创建一个逻辑分区
命令(输入 m 获取帮助):n    #新建
Partition type:
   p   primary (1 primary, 1 extended, 2 free)
   l   logical (numbered from 5)
Select (default p): l     #创建逻辑分区
添加逻辑分区 5
起始 扇区 (1028096-4194303,默认为 1028096):  #默认起始
将使用默认值 1028096
Last 扇区, +扇区 or +size{K,M,G} (1028096-4194303,默认为 4194303):+500M  #分配空间
分区 5 已设置为 Linux 类型,大小设为 500 MiB   #设置成功

4.创建完成后查看一下保存退出

??先使用"p"命令查看一下
命令(输入 m 获取帮助):p   #查看
   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     1026047      512000   83  Linux      #主分区
/dev/sdb2         1026048     4194303     1584128    5  Extended   #扩展分区
/dev/sdb5         1028096     2052095      512000   83  Linux      #逻辑分区

??使用"w"命令保存退出
命令(输入 m 获取帮助):w   #保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。

5.保存退出后再查看一下磁盘设备

??查看
# lsblk
# ll /dev/sd   +   双击 Tab 键
??如果没有显示出来就使用"partprobe"命令刷新一下内核(经常使用的命令)
# partprobe /dev/sdb

??查看磁盘分区类型
[root@shawn ~]#fdisk /dev/sdb -l | grep "类型"
磁盘标签类型:dos    #dos就是mbr分区类型

技术图片

6.制作文件系统(格式化磁盘分区)

??"mkfs. + 双击 Tab 键"查看一下可以做哪些文件系统
[root@shawn ~]#mkfs.
mkfs.btrfs   mkfs.ext2    mkfs.ext4    mkfs.xfs     
mkfs.cramfs  mkfs.ext3    mkfs.minix  

??也可以对单个磁盘分区进行格式化
[root@shawn ~]#mkfs.xfs /dev/sdb1

??格式化整个磁盘
[root@shawn ~]#mkfs.xfs /dev/sdb

??如果不成功,可加入"-f"选项进行强制
[root@shawn ~]#mkfs.xfs -f /dev/sdb

7.使用"mount"进行挂载

??创建一个文件夹
[root@shawn ~]#mkdir /test1

??进行挂载并查看
[root@shawn ~]#mount /dev/sdb1 /test1/
[root@shawn ~]df -h

技术图片

五.制作磁盘分区 gdisk

1.先给虚拟机添加一块大于2T的磁盘

??使用命令查看磁盘是否存在
# lsblk
# ll /dev/sd   +   双击 Tab 键

技术图片

2.使用gdisk工具进行分区

??选择要分区的磁盘设备 "/dev/sdc"
[root@shawn ~]#gdisk /dev/sdc

3.开始创建分区

  • 分区创建,与fdisk步骤相同
??创建一个主分区,可创128个
Command (? for help): n   #创建分区
Partition number (1-128, default 1):    #分区号
First sector (34-6291455966, default = 2048) or {+-}size{KMGTP}:  #默认起始位置
Last sector (2048-6291455966, default = 6291455966) or {+-}size{KMGTP}: +500M  #设置大小
Current type is ‘Linux filesystem‘
Hex code or GUID (L to show codes, Enter = 8300): 8300  #选择类型(默认就行)
Changed type of partition to ‘Linux filesystem‘

4.创建完成后查看一下保存退出

??先使用"p"命令查看一下
Command (? for help): p   #查看
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1026047   500.0 MiB   8300  Linux filesystem

??使用"w"命令保存退出
Command (? for help): w   #保存退出
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y   #按y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.  #创建成功

5.保存退出后再查看一下磁盘设备

??查看
# lsblk
# ll /dev/sd   +   双击 Tab 键
??如果没有显示出来就使用"partprobe"命令刷新一下内核(经常使用的命令)
# partprobe /dev/sdc

??查看磁盘分区类型
[root@shawn ~]#fdisk /dev/sdc -l | grep "类型"
磁盘标签类型:gpt   #gpt类型

技术图片

6.制作文件系统(格式化分区)

??选择需要格式化的分区
[root@shawn ~]#mkfs.xfs /dev/sdc1

7.挂载

??创建一个文件夹并挂载
[root@shawn ~]#mkdir /test2
[root@shawn ~]#mount /dev/sdc1 /test2

??"df"查看挂载情况
[root@shawn ~]#df -h

技术图片

六.磁盘挂载方式

1.什么是磁盘挂载

  • 如果要使用一块磁盘空间, 就需要准备一个空的目录作为挂载点
  • 让该磁盘设备与其进行关联
  • 可以把这个目录看成一个进入磁盘空间的入口
  • 数据真正的存在磁盘设备里面, 而不是目录这个入口

2.挂载与卸载命令---(临时挂载)

  • 挂载: mount
??语法: "mount [磁盘设备] [挂载点]"
[root@shawn ~]#mount /dev/sdc1 /test2
  • 卸载: umount
??语法: "umount [挂载点 / 磁盘设备]" #卸载填任意一方都可
[root@shawn ~]#umount /dev/sdc1
[root@shawn ~]#umount /test2
??如果不能卸载可以采用强制卸载选项"-l"

2.磁盘挂载配置文件---(开机自动挂载)

  • /etc/fstab配置文件格式
??使用"blkid"命令查看磁盘分区设备的"UUID"及"type"
[root@shawn ~]#blkid | grep "sdb1"
/dev/sdb1: UUID="7e95e893-4738-4e8f-896a-d1e0f0e58cde" TYPE="xfs" 

??文件内容设置格式
1.[设备的UUID] [挂载目录] [文件系统类型] [挂载参数:默认] [是否备份:0] [是否检查:0]
例 : "UUID=987083d5-fcd9-4933-8c6f-939a1f79cb8a  /home  xfs  default  s  0 0""
2.[设备名称] [挂载目录] [文件系统类型] [挂载参数:默认] [是否备份:0] [是否检查:0]
例 : "/dev/sdb1 /test1 xfs defaults 0 0"
    
??"-a":从新加载"fstab"文件, 并且会检测语法是否正确
#[root@shawn ~]#mount -a

七.制作 swap 分区

1.使用fdisk 或者 gdisk 工具分出一个磁盘空间

??分出一块空间,然后查看一下
[root@shawn ~]#gdisk /dev/sdc
Command (? for help): n   #创建分区
Partition number (2-128, default 2):   #分区号默认
First sector (34-6291455966, default = 1026048) or {+-}size{KMGTP}: #其实位置
Last sector (1026048-6291455966, default = 6291455966) or {+-}size{KMGTP}: +1G   #分区大小
Current type is ‘Linux filesystem‘
Hex code or GUID (L to show codes, Enter = 8300):   #文件系统类型默认
--------------------------------------------------------------
Command (? for help): p   #查看
Number  Start (sector)  End (sector)  Size   Code  Name
  1      2048     1026047   500.0 MiB   8300  Linux filesystem
  2   1026048     3123199   1024.0 MiB  8300  Linux filesystem  #成功
---------------------------------------------------------------
Command (? for help): w     #保存退出
Do you want to proceed? (Y/N): y    #确认
The operation has completed successfully.   #分区成功

2.再次查看一下磁盘设备

??查看
# lsblk
# ll /dev/sd   +   双击 Tab 键
??如果没有显示出来就使用"partprobe"命令刷新一下内核(经常使用的命令)
# partprobe /dev/sdc

3.制作swap文件系统

[root@shawn ~]#mkswap /dev/sdc2
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=537af376-fe42-4b9f-9bf8-f1e036a27295

4.激活swap分区,并对比前后大小

??激活前使用"free"内存查看命令查看"swap"空间大小
[root@shawn ~]#free -m
      total    used    free   shared  buff/cache   available
Mem:   972      125      532     7      313         702
Swap:   1906     0       1906    #可以看到大小为"1964M"

??使用"swapon"命令激活分区
[root@shawn ~]#swapon /dev/sdc2

??再次查看"swap"空间大小
[root@shawn ~]#free -m
      total    used    free   shared  buff/cache   available
Mem:   972      126     532     7       314         701
Swap:  2930      0      2930      #空间已经变成了"2930M"
    
??也可以使用"swapon -s"查看到"swap"空间及设备
[root@shawn ~]#swapon -s
文件名		 类型        大小      已用    权限
/dev/sda3   partition   1952764   0       -2
/dev/sdc2   partition   1048572   0       -3

ps: 如果磁盘没有过多的分区给 swap, 可以通过文件来增加 swap空间, 但本质上还是磁盘空间

5.使用文件来制作swap

??首先制作一个500M(大小自己设置)大小的文件,可以使用"泡泡机"
[root@shawn ~]#dd if=/dev/zero of=/swap_file bs=500M count=1

??查看文件信息
[root@shawn ~]#ll -h /swap_file 
-rw-r--r-- 1 root root 500M 11月  7 16:56 /swap_file  #大小"500M"

??制作"swap"文件系统
[root@shawn ~]#mkswap /swap_file 

??激活这个"文件swap分区"
[root@shawn ~]#swapon /swap_file 

??使用"swapon -s"查看"swap"设备信息
[root@shawn ~]#swapon -s
文件名      类型       大小       已用   权限
/dev/sda3   partition  1952764   264   -2
/swap_file  file       511996     0    -3
??可以发现是"file"类型的"swap"分区

6.关闭swap分区

??"swapoff /dev/sdc2"关闭某一个"swap"分区
[root@shawn ~]#swapoff /dev/sdc2
[root@shawn ~]#free -m
      total  used   free  shared  buff/cache   available
Mem:  972    125    533   7         313         701
Swap: 1906   0      1906      #对比之前可以发现"swap"空间减少了

??"swapoff -a"关闭所有"swap"分区
[root@shawn ~]#swapoff -a
[root@shawn ~]#free
      total   used     free    shared  buff/cache   available
Mem:  995684  127240   547912  7736    20532      720260
Swap: 0       0        0       #"swap"分区被置空了

7.设置开机自动挂载新增的swap分区

  • /etc/fstab: 方法与上面磁盘设置相似
??方式一:使用"UUID"
例: "UUID=de5f8b73-bebd-487d-8c80-53c6721b4a7f  swap  swap  defaults 0 0"

??方式二
例: "/dev/sdc2 swap swap defaults 0 0"        #正常磁盘设备
例: "/dev/sdc1 /file_swap swap defaults 0 0"  #磁盘文件

八.服务器RAID卡配置方法

Dell R740服务器配置RAID5+1

九.服务器文件系统的修复

1.什么情况会造成文件系统错误

  • Linux系统中,为了提升读写速度, 通常将要写入硬盘的数据先放在内存中(buff区)

  • 够了一波再写入内存, 如果这时突然断电或其它未知原因产生后

  • 从新启动系统后,可能会发现系统提示: 文件系统错误信息

    ps : 查看运行日志可以提示出损坏的文件系统

2.真实情况下修复方式

  • 操作系统进不去, 可以先进到单用户模式进行操作
  • 首先尝试 mountumount ,看看能不能重放日志进行修复
  • 不行再执行 xfs_repair -n [磁盘设备名], 只检查不修复 (它会检查文件系统, 如果损坏会列出将要执行的操作)
  • 如果检测到日志与数据不一致, 系统会推荐以读写的方式挂载, "xfs"会在挂载的时候修复这种不一致. 命令 : mount -o rw,norecovery [磁盘设备] [挂载目录]
  • 上述不成功只能使用以下实验中的方法

2.文件系统损坏与修复演示

  • 为了让情况更明白, 我们来模拟一下文件系统损坏的实验
  • 我们模拟把我的"/dev/sdc1"损坏
??首先查看一下"/dev/sdc1"的挂载与空间情况
[root@shawn ~]#df -h | grep "/dev/sdc1"
/dev/sdc1    497M   26M  472M    6% /test2   #总共"497M"空间

??查看一下文件
[root@shawn ~]#echo 2222 > /test2/a.txt
[root@shawn ~]#cat !$
2222

??使用"泡泡机"模拟损坏文件系统
[root@shawn ~]#dd if=/dev/zero of=/dev/sdc1 bs=1M count=200
记录了200+0 的读入
记录了200+0 的写出
209715200字节(210 MB)已复制,0.632261 秒,332 MB/秒

??再次操作"/test2/a.txt"文件
[root@shawn ~]#echo 5555 > /test2/a.txt 
[root@shawn ~]#cat !$
5555     #发现文件读写还是正常的

??卸载然后再次挂载---->发现已经损害
[root@shawn ~]#umount /dev/sdc1
[root@shawn ~]#mount /dev/sdc1 /test2
mount: 将 /dev/sdc1 挂载到 /test2 失败: 结构需要清理
        
??使用"xfs_repair"命令修复文件系统
[root@shawn ~]#xfs_repair /dev/sdc1
..............
......
done      #修复操作完成

??再次挂载,并查看文件
[root@shawn ~]#mount /dev/sdc1 /test2
[root@shawn ~]#cat /test2/a.txt 
5555  #文件也有,说明修复成功了
  • 紧接着实验
  • 上面我们是用"泡泡机"制造了 200M 的大小进行覆盖
  • 现在我们来加大一点空间 255M 来进行实验
??开始模拟损坏 255M
[root@shawn ~]#dd if=/dev/zero of=/dev/sdc1 bs=1M count=255
记录了255+0 的读入
记录了255+0 的写出
267386880字节(267 MB)已复制,0.475109 秒,563 MB/秒

??对文件进行读写直接就报错了
[root@shawn ~]#echo 5555 > /test2/a.txt 
-bash: /test2/a.txt: 结构需要清理
[root@shawn ~]#ls /test2/a.txt
ls: 无法访问/test2/a.txt: 输入/输出错误

??于是来卸载进行修复----呵呵
[root@shawn ~]#umount /dev/sdc1
[root@shawn ~]#xfs_repair /dev/sdc1
.....................
............
.Sorry,balabala    #失败了
  • 修复失败了
  • 那我们只能进行强制修复了
  • 选项 "-L" 进行强制修复, 但这种情况会清除日志文件, 数据也就没有了, 意义就在于能用
??我们来进行"-L"选项进行强制修复
?第一种情况强制修复成功,可以挂载了,但没有数据
[root@shawn ~]#xfs_repair -L /dev/sdc1
[root@shawn ~]#mount /dev/sdc1 /test2
[root@shawn ~]#cat /test2/a.txt
cat: /test2/a.txt: 没有那个文件或目录

?第二种情况,使用了强制修复也无法成功
[root@shawn ~]#xfs_repair -L /dev/sdc1
........................
..............
..Sorry, balabala
EXiting now.    #强制也失败了

??强制也是失败的情况下只能重做文件系统了
[root@shawn ~]#mkfs.xfs /dev/sdc1
#于是一块新的磁盘分区就诞生了

4.修复总结

  • xfs_repair方法, 成功后恢复数据

  • xfs_repair -L强制, 成功后数据消失

  • mkfs.xfs格式化是最终解决方案, 数据消失

  • 修复不了数据是因为磁盘分区信息表被损坏导致的, 能修复可能是没有损坏到分区信息(随机性)

  • 做本次实验的目的在于: 数据不可能 100% 的修复回来, 这时候就需要你有备份意识, 可见备份的重要性

十.xfs文件系统备份与恢复

1.XFS的备份级别

级别 说明
0 完全备份
1~9 增量备份

2.两种备份说明

备份名称 说明
完全备份 每次都将指定的目录完完整整的复制一份
增量备份 每次都将之前备份后有变化的文件进行备份

3.备份与恢复命令

  • 备份: xfsdump

xfsdump -l 0 -L xxx_bak -M "bak_all" -f /opt/xxx_bak_all /test

选项 作用
-l (小写L) 指定level, 0~9, 默认为 0
-L 纪录每次备份的 session 标头, 这里可以填写针对此文件系统的简易说明
-M 可以纪录储存媒体的标头, 这里可以填写此媒体的简易说明
-f 后面接 [将要产生的备份路径及名字] [想要备份的原路径]
-I (大写 i) 从"/var/lib/xfsdump/inventoty" 里列出目前备份的信息状态
  • 恢复: xfsrestore

xfsrestore -f /opt/xxx_bak_all /xxx路径

选项 作用
-f 后面接 [备份文件路径] [想要恢复到的路径]

4.xfsdump使用限制

  • 必须用 root 权限
  • 只能备份已挂载的文件系统
  • 只能备份XFS文件系统
  • 只能用xfsrestore恢复
  • 透过文件系统的UUID来分辨备份档,因此不能备份相同UUID的文件系统

5.备份与恢复原则

  • 备份 : 先做全量备份, 然后再做增量备份 (源路径的末尾不能有"/")
  • 恢复 : 先恢复全量备份, 然后按时间点从远到近恢复增量备份

6.数据备份与恢复演示

  • 数据备份
??先准备一个已经关联了一个目录的文件系统
??怎么分区制作文件系统上面已经介绍,这里不做赘述
[root@shawn ~]#df -h | grep "/dev/sdc1"
/dev/sdc1    497M   26M  472M    6% /test2   

??在"/test2"下创建文件
[root@shawn ~]#echo 222 > /test2/2.txt
[root@shawn ~]#cat /test2/1.txt /test2/2.txt 
111
222

??开始一次全量备份"xfsdump", 并查看
[root@shawn ~]#xfsdump -l 0 -L sdc1_bak_all -M "all_bak" -f /mnt/sdc1_bak_all /test2
.....................
........:SUCCESS  #提示"SUCCESS"代表成功
[root@shawn ~]#ls /mnt
sdc1_bak_all      #发现备份文件存在

??我们在"/test2"下修改"2.txt",并新增"3.txt",然后进行增量备份
[root@shawn ~]#echo 555 >> /test2/2.txt 
[root@shawn ~]#echo 666 > /test2/3.txt
[root@shawn ~]#cat /test2/2.txt /test2/3.txt 
222
555       #追加了这一行
666       #新加了这个文件
[root@shawn ~]#xfsdump -l 1 -L sdc1_bak_all -M "add1" -f /mnt/sdc1_bak_add1 /test2
[root@shawn ~]#ls /mnt
sdc1_bak_add1  sdc1_bak_all     #出现了第一次的增量备份文件
  • 数据恢复
??我们将"/test2"下的文件全部删除来演示数据消失
[root@shawn ~]#rm -rf /test2/*
[root@shawn ~]#ll /test2/
总用量 0    #清理干净了

??先恢复全量备份"sdc1_bak_all", 并查看文件
[root@shawn ~]#xfsrestore -f /mnt/sdc1_bak_all /test2
[root@shawn ~]#ls /test2
1.txt  2.txt
[root@shawn ~]#cat /test2/1.txt /test2/2.txt 
111
222      #发现是最开始的全量备份的数据状态

??再恢复第一次的增量备份"sdc1_bak_add1", 并查看文件
[root@shawn ~]#xfsrestore -f /mnt/sdc1_bak_add1 /test2
[root@shawn ~]#ls /test2
1.txt  2.txt  3.txt
[root@shawn ~]#cat /test2/1.txt /test2/2.txt /test2/3.txt 
111
222
555
666       #发现正是第一次增量备份时的数据状态

以上是关于🍖磁盘管理的主要内容,如果未能解决你的问题,请参考以下文章

🍖Flask四剑客及简单使用

🍖Flask配置及路由书写方式

🍖HUP信号,僵尸进程与孤儿进程

扫描算法(SCAN)——磁盘调度管理

使用 Git 来管理 Xcode 中的代码片段

massCode 一款优秀的开源代码片段管理器