26 磁盘管理

1,183次阅读
没有评论

共计 10454 个字符,预计需要花费 27 分钟才能阅读完成。

一. 磁盘在系统上的命名

1. 设备名称

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

26 磁盘管理

2. 分区分类

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

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

  • 主分区又叫做引导分区

26 磁盘管理

二. 两种分区格式

1.mbr分区格式

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

2.gpt分区格式

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

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

  1. 插一块硬盘

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

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

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

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

四. 制作磁盘分区 fdisk

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

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

26 磁盘管理

2. 使用 fdisk 工具进行分区

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

26 磁盘管理

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

26 磁盘管理

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

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

26 磁盘管理

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

26 磁盘管理

五. 制作磁盘分区 gdisk

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

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

26 磁盘管理

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

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

26 磁盘管理

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

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

7. 挂载

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

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

26 磁盘管理

六. 磁盘挂载方式

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  defaults  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

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       #发现正是第一次增量备份时的数据状态

正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计10454字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)