🍖磁盘管理
一.磁盘在系统上的命名
1.设备名称
设备名称 | 分区名称 | 分区类型 |
---|---|---|
/dev/sda | /dev/sda1 | 第一块物理磁盘第一分区 |
/dev/sdb | /dev/sdb3 | 第二块物理磁盘第三分区 |
...... | ....... | ....... |
2.分区分类
-
磁盘分区类型分为:
p
主分区,e
扩展分区,l
逻辑分区 -
逻辑分区属于扩展分区, 扩展分区属于主分区
-
主分区又叫做引导分区
二.两种分区格式
1.mbr
分区格式
- 最多可分4个主分区
- 通常用于小于2T的硬盘空间
- 分区工具: fdiak
2.gpt
分区格式
- 最多可分128个主分区
- 通常用于大于2T的硬盘空间
- 分区工具: gdisk
三.制做磁盘分区的通用流程
-
插一块硬盘
-
小于2T空间用mbr分区格式, 大于2T推荐用gpt分区格式
-
设置分区类型和大小保存设置
-
为每个分区制作文件系统(格式化):
mkfs.xfs
-
为每个分区关联挂载点:
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
🌵查看磁盘分区类型
[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
🌵查看磁盘分区类型
[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 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卡配置方法
九.服务器文件系统的修复
1.什么情况会造成文件系统错误
-
Linux系统中,为了提升读写速度, 通常将要写入硬盘的数据先放在内存中(buff区)
-
等攒够了一波再写入内存, 如果这时突然断电或其它未知原因产生后
-
从新启动系统后,可能会发现系统提示: 文件系统错误信息
ps : 查看运行日志可以提示出损坏的文件系统
2.真实情况下修复方式
- 操作系统进不去, 可以先进到单用户模式进行操作
- 首先尝试 mount 和 umount ,看看能不能重放日志进行修复
- 不行再执行
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 #发现正是第一次增量备份时的数据状态