共计 10454 个字符,预计需要花费 27 分钟才能阅读完成。
一. 磁盘在系统上的命名
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 #发现正是第一次增量备份时的数据状态
正文完