跳转至

存储管理之传统磁盘管理

""" -- 对磁盘进行分区并查看磁盘有哪些分区 -- """
fdisk /dev/sdb              # -- 以MBR格式对某个磁盘进行分区
gdisk /dev/sdd              # -- 以GPT格式对某个磁盘进行分区
partprobe                   # -- 及时更新磁盘分区后的分区表信息!!
lsblk                       # -- 查看所有磁盘分区情况
ls /dev/sdb 连续按两下Tab键!! # -- 查看某一磁盘下有哪些分区 
# -- 查看某个磁盘分区情况
     lsblk /dev/sda     
     fdisk /dev/sdb 进去后 输入p
     fdisk -l /dev/sdb
     gdisk -l /dev/sdd

""" -- 格式化分区并挂载(临时、永久) -- """
mkfs.xfs /dev/sdb1          # -- 格式化某个分区
mount /dev/sdb1 /a          # -- 将某个分区进行临时挂载
blkid                       # -- 查看每个分区的UUID
vim /etc/fstab              # -- 设置开机自动挂载
sed -i '$a /dev/sdb3 /opt xfs defaults 0 0' /etc/fstab  
mount -a                    # -- 不reboot重启机器,使配置文件/etc/fstab生效
                            # 前提: 分区对应的挂载参数设置为defaults或者多个挂载参数中包含auto
df                          # -- 查看已经挂载磁盘的使用情况
mount | grep sdb            # -- 最准确的显示是否挂载成功


""" -- 制作swap分区并激活 -- """
mkswap /dev/sdd3
swapon /dev/sdd3            # -- 激活/临时挂载swap分区
swapon -s                   # -- 查看有哪些挂载的swap分区
swapoff -a                  # -- 关闭所有swap分区
swapoff /dev/sdd3           # -- 关闭某个swap分区
free -m                     # -- 查看虚拟内存情况
vim /etc/fstab              # -- 开机自动挂载新增的swap分区    临时 + 开机挂载 = 永久
sed -i '$a /dev/sdd3 swap swap defaults 0 0' /etc/fstab 

磁盘分区

回顾详见: 0_计算机基础/1_计算机硬件组成.md 中 存储器详解 这一部分的内容...

lsblk /dev/sda

## -- 在vm虚拟机里可以直接添加多个硬盘 
## -- 这里我添加了 sdb sdc sdd三块硬盘(都是SCSI接口 容量分别为20G、20G、2500G/2.5TB) 
[root@localhost ~]# ls /dev | grep sd
sda     ## -- 第一块物理磁盘
sda1    ## -- 第一块物理磁盘第一分区
sda2    ## -- 第一块物理磁盘第二分区
sdb     ## -- 第二块物理磁盘
sdc     ## -- 第三块物理磁盘
sdd     ## -- 第四块物理磁盘
## Ps:  vde4 第五块虚拟磁盘的第四分区

## -- 查看磁盘设备详情,以及分区情况
"""
TYPE
    disk 磁盘
    part 分区
    rom  只读
"""
[root@localhost ~]# lsblk /dev/sda
NAME            MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda               8:0    0  20G  0 disk 
├─sda1            8:1    0   1G  0 part /boot
└─sda2            8:2    0  19G  0 part 
  ├─centos-root 253:0    0  17G  0 lvm  /
  └─centos-swap 253:1    0   2G  0 lvm  [SWAP]
[root@localhost ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk 
[root@localhost ~]# lsblk /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc    8:32   0  20G  0 disk 
[root@localhost ~]# lsblk /dev/sdd
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdd    8:48   0  2.5T  0 disk 

某个磁盘划分的分区主要分为三类: 
     主分区/引导分区扩展分区 -- 包含-- 逻辑分区

主分区/引导分区: 包含主引导记录MBR的分区,意味着可以安装系统(MBR里有OS的启动程序grub)
Ps: 相关知识点翻阅  0_计算机基础/1_计算机硬件组成.md 中 计算机启动过程 以及 1_linux基础/0_准备工作.md Linux启动流程 这两部分内容...

常见的磁盘分区方案有两种: MBR分区表和GUID分区表(简称GPT)
     MBR -- 最多能识别 2TB 的容量 ; 最多只能支持4个主分区 or 3个主分区+1个扩展分区(逻辑分区不限制)
     GPT -- 支持的磁盘容量比 MBR 大得多,最多支持128个主分区

我们拿到一块没有分区的新硬盘, 首先将硬盘划分出n个主分区(MBR方案通常是3个), 再将硬盘剩余空间给扩展分区, 然后将扩展分区划分为若干个逻辑分区,具体的细节操作后文会详细阐述..

磁盘分区的工具 
     fdisk 工具 -- MBR
     gdisk 工具 -- GPT

磁盘容量小于2TB的通常用MBR, GPT当然也可以,但存着效率的问题...


MBR进行分区

fdisk /dev/sdb

m        查看帮助
q         退出, 未w保存的分区信息不会写入磁盘,不会生效
n         新建分区(p 主分区;e 扩展分区)
d         删除分区
p         查看磁盘已划分分区的信息
w         保存

创建3个大小为1G的主分区,剩余容量给扩展分区,扩展分区里划分出了两个逻辑分区,一个为2G,另一个为3G.. 

中途还验证了,MBR的方案新建四个主分区后,不能再新建任何分区..

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)... ... ...

""" -- 新建第一个主分区分区(1G) -- """
命令(输入 m 获取帮助): n    ## -- 新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free) ## -- 主分区
   e   extended    ## -- 扩展分区
Select (default p): p   ## -- 选择新建主分区
分区号 (1-4,默认 1):     ## -- 回车,使用默认的
## -- 上一个分区的结束应该作为下一个分区的启始 
起始 扇区 (2048-41943039,默认为 2048):     ## -- 回车,启始位置不指定使用默认的
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039, 默认为 41943039):+1G  ## -- 1GB大小
分区 1 已设置为 Linux 类型,大小设为 1 GiB

""" -- 重复上述步骤,新建第二个第三个第四个大小都为1G的主分区 -- """
命令(输入 m 获取帮助): n
Select (default p): p   
分区号 (2-4,默认 2):
起始 扇区 (2099200-41943039,默认为 2099200):
Last 扇区, +扇区 or +size{K,M,G} (2099200-41943039, 默认为 41943039):+1G

命令(输入 m 获取帮助): n
Select (default p): p   
分区号 (3,4,默认 3):
起始 扇区 (4196352-41943039,默认为 4196352):
Last 扇区, +扇区 or +size{K,M,G} (4196352-41943039, 默认为 41943039):+1G

命令(输入 m 获取帮助): n
Select (default e): p ## -- 建第4个分区的时候,fdisk工具已经开始提示,"default e,该建扩展分区啦"
                      ## -- 当然,可以不听,执意创建主分区
已选择分区 4  ## -- 可以发现,因为只剩一个分区了,就不让你选择分区号啦
起始 扇区 (6293504-41943039, 默认为 6293504):
Last 扇区, +扇区 or +size{K,M,G} (6293504-41943039, 默认为 41943039):+1G

""" -- 我们已经创建了4个主分区(大小都为1G),哪怕还剩16G,空间够用也不能继续新建分区啦 -- """
命令(输入 m 获取帮助): n
## -- 如果要创建四个以上的分区,必须替换一个主分区优先使用扩展分区!!
If you want to create more than four partitions, you must replace a
primary partition with an extended partition first.

""" -- 删除第4个分区 -- """
命令(输入 m 获取帮助): d
分区号 (1-4,默认 4): 4
分区 4 已删除

""" -- 创建第4个分区为扩展分区,磁盘剩余的空间都给它 -- """
命令(输入 m 获取帮助):n
Partition type:
   p   primary (3 primary, 0 extended, 1 free)
   e   extended
Select (default e): e
已选择分区 4
起始 扇区 (6293504-41943039,默认为 6293504):
将使用默认值 6293504
Last 扇区, +扇区 or +size{K,M,G} (6293504-41943039, 默认为 41943039): ## -- 空格,默认剩下的都给
将使用默认值 41943039
分区 4 已设置为 Extended 类型, 大小设为 17 GiB

""" -- 查看磁盘已划分分区的信息 -- """
命令(输入 m 获取帮助): p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理): 512 字节 / 512 字节
I/O 大小(最小/最佳): 512 字节 / 512 字节
磁盘标签类型: dos
磁盘标识符: 0x651efb78
## -- 可以观察到,每个分区都是紧挨着的 2099199-2099200 4196351-4196352 6293503-6293504
   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
/dev/sdb2         2099200     4196351     1048576   83  Linux
/dev/sdb3         4196352     6293503     1048576   83  Linux
/dev/sdb4         6293504    41943039    17824768    5  Extended

""" -- 已经划分了四个主分区,接着新建的分区是在扩展分区里划分的逻辑分区 新建两个逻辑分区(2G和3G) -- """
命令(输入 m 获取帮助): n
All primary partitions are in use
添加逻辑分区 5
## -- 可以观察到逻辑分区默认的启始 6295552 接近于/dev/sdb4这一扩展分区的启始 6293504
## -- 没有紧贴,空出来的那部分空间记录的就是扩展分区里逻辑分区的信息
起始 扇区 (6295552-41943039,默认为 6295552): ## -- 同样的不指定启始位置
将使用默认值 6295552
Last 扇区, +扇区 or +size{K,M,G} (6295552-41943039,默认为 41943039): +2G
分区 5 已设置为 Linux 类型,大小设为 2 GiB

命令(输入 m 获取帮助): n
All primary partitions are in use
添加逻辑分区 6
起始 扇区 (10491904-41943039,默认为 10491904)将使用默认值 10491904
Last 扇区, +扇区 or +size{K,M,G} (10491904-41943039,默认为 41943039): +3G
分区 6 已设置为 Linux 类型,大小设为 3 GiB

""" -- 保存退出 -- """
命令(输入 m 获取帮助): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘.

可以查看下/dev/sdb的分区结果

partprobe lsblk /dev/sdb

## -- 执行partprobe命令刷新一下分区表 更新分区表信息
[root@localhost ~]# partprobe

## -- 我们主要使用 sdb1、sdb2、sdb3、sdb5、sdb6
[root@localhost ~]# ls /dev/sdb          ## -- 连续按两下Tab键!!
sdb   sdb1  sdb2  sdb3  sdb4  sdb5  sdb6  
[root@localhost ~]# lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  20G  0 disk 
├─sdb1   8:17   0   1G  0 part 
├─sdb2   8:18   0   1G  0 part 
├─sdb3   8:19   0   1G  0 part 
├─sdb4   8:20   0   1K  0 part 
├─sdb5   8:21   0   2G  0 part 
└─sdb6   8:22   0   3G  0 part 

GPT进行分区

/dev/sdd 磁盘的空间大小为2.5T

[root@localhost ~]# lsblk /dev/sdd
NAME MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdd    8:48   0  2.5T  0 disk 

n         新建分区(建的每个分区都是主分区) p         查看已建分区的信息 d         删除 w        保存 q        退出

[root@localhost ~]# gdisk /dev/sdd
Command (? for help): n   
Partition number (1-128, default 1): 
First sector (34-5242879966, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-5242879966, default = 5242879966) or {+-}size{KMGTP}: +1G
Current type is 'Linux filesystem'  ## - 当前类型是“Linux 文件系统” 
Hex code or GUID (L to show codes, Enter = 8300):  ## - 通过L查看8300指的就是“Linux 文件系统” 
                                                                        ## - Linux文件系统包含xfs,也就是该分区可以选择xfs格式化
Changed type of partition to 'Linux filesystem'

Partition number (2-128, default 2): 
Last sector (2099200-5242879966, default = 5242879966) or {+-}size{KMGTP}: +1G

Command (? for help): p
Disk /dev/sdd: 5242880000 sectors, 2.4 TiB
... ... ...

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem
   2         2099200         4196351   1024.0 MiB  8300  Linux filesystem

Command (? for help): w
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdd.
The operation has completed successfully.

查看sdd分区的情况

[root@localhost ~]# lsblk /dev/sdd
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdd      8:48   0  2.5T  0 disk 
├─sdd1   8:49   0    1G  0 part 
└─sdd2   8:50   0    1G  0 part 

制作文件系统与挂载

磁盘容量小于2T的用MBR进行分区,容量大于2T的用GPT进行分区..
往后的操作就一样啦, 分完区后选择xfs对分区进行格式化...然后进行挂载..

格式化/制作文件系统
## -- 注意: 格式化后,分区里面的数据都没了
mkfs.xfs /dev/sdb1   # -- 格式化sdb1分区
mkfs.xfs /dev/sdb2   # -- 格式化sdb2分区
mkfs.xfs /dev/sdb3   # -- 格式化sdb3分区
mkfs.xfs /dev/sdb5   # -- 格式化sdb5分区
mkfs.xfs /dev/sdb6   # -- 格式化sdb6分区
mkfs.xfs /dev/sdd1   # -- sdd1分区
## -- 试着对/dev/sdb4这一扩展分区进行格式化,提示sdb4里包含分区表(指的就是sdb5、sdb6两个逻辑分区)
## -- 可以加上-f选项,强制格式化,但通常不会这么做
[root@localhost ~]# mkfs.xfs /dev/sdb4
mkfs.xfs: /dev/sdb4 appears to contain a partition table (dos).
mkfs.xfs: Use the -f option to force overwrite.

磁盘可以不分区,直接格式化制作文件系统,相当于整个盘是一个分区!!不建议这样做..

临时挂载

mount -t 源 挂载点

mount -a 可以不重启服务器, 让/etc/fstab中的永久挂载配置生效!

mkdir /a
mkdir /b
mkdir /c
mkdir /d
mkdir /e
mount /dev/sdb1 /a
mount /dev/sdb2 /b
mount /dev/sdb3 /c
mount /dev/sdb5 /d
mount /dev/sdb6 /e
[root@localhost ~]# df | grep sdb
## 文件系统                 1K-块    已用     可用       已用% 挂载点
/dev/sdb1                1038336   32992  1005344    4%     /a
/dev/sdb2                1038336   32992  1005344    4%     /b
/dev/sdb3                1038336   32992  1005344    4%     /c
/dev/sdb5                2086912   32992  2053920    2%     /d
/dev/sdb6                3135488   32992  3102496    2%     /e
卸载
## -- umount /dev/sdb1 卸载文件系统或挂载点都能达到预期的效果
umount /a /b /c /d /e  # -- 卸载多个
"""
若正处于某个分区下,umount卸载该分区,会提示目标忙
解决方案一: cd 到其他分区下
解决方案二: umount -l /a # -- 加上l选项,强制卸载
"""
从右往左最近原则

从右往左最近原则 同一个分区可以有多个挂载点

判断文件属于哪一个分区,需要从右到左进行分析..
从右往左最近原则: 文件离哪个挂载点最近, 就会存储到最近的挂载点所在的分区里..

打个比方, 在挂载点是个水龙头, 水从哪里来?挂载点从所对应的某个分区中取水!!!

mkdir /opt/a                    ## -- opt目录在根分区/里;根分区下创建的a目录也在根分区里
mount /dev/sdb1 /opt/a          ## -- /opt/a成为了sdb1分区的挂载点
mkdir /opt/a/b                  ## -- 在/opt/a挂载点下创建的b目录存储在sdb1分区里
mount /dev/sdb2 /opt/a/b        ## -- /opt/a/b成为了sdb2分区的挂载点
touch /opt/a/b/1.txt            ## -- 在/opt/a/b挂载点下创建的1.txt文件存储在sdb2分区里
"""到此为止,问这几个分区下分别存储了什么? 可以反向验证**从右往左最近原则**!!!
根分区             opt、a
sdb1分区       b
sdb2分区       1.txt 

★ /opt/a/b/1.txt 反向验证分析: 1.txt离/opt/a/b挂载点最近; b离/opt/a挂载点最近

简单粗暴,卸载了哪个分区,那个分区里的内容就不会显示..
但首先你要能卸载的了,比如这里直接umount /opt/a卸载sdb1分区是失败的!!要先卸载sdb2分区..
"""
[root@localhost opt]# tree /opt
/opt
└── a
    └── b
        └── 1.txt

2 directories, 1 file
[root@localhost opt]# echo 111 > /opt/a/b/1.txt
[root@localhost opt]# cat /opt/a/b/1.txt 
111
[root@localhost opt]# df | grep sdb | grep -v grep
/dev/sdb1                1038336   32992  1005344    4% /opt/a
/dev/sdb2                1038336   32996  1005340    4% /opt/a/b

"""sdb2分区隐居山林,为何1.txt文件神秘消失?
因为1.txt文件是存储在sdb2分区里的!!sdb2分区未挂载就读取不了里面的内容.
"""
[root@localhost opt]# umount /opt/a/b
[root@localhost opt]# tree /opt
/opt
└── a
    └── b

2 directories, 0 files

"""趁乱在/opt/a/b下创建的2.txt文件,根据从右到左最近原则,是存储在挂载点/opt/a所对应的sdb1分区里!!
"""
[root@localhost opt]# echo 222 > /opt/a/b/2.txt
[root@localhost opt]# cat /opt/a/b/2.txt 
222
[root@localhost opt]# tree /opt
/opt
└── a
    └── b
        └── 2.txt

2 directories, 1 file

"""重新让/opt/a/b成为sdb2分区的挂载点,2.txt文件消失,1.txt文件重见江湖!
因为/opt/a/b挂载点会从sdb2分区里取水,sdb2分区里只有1.txt,可没有2.txt
"""
[root@localhost opt]# mount /dev/sdb2 /opt/a/b
[root@localhost opt]# tree /opt
/opt
└── a
    └── b
        └── 1.txt

2 directories, 1 file

"""开始作妖,/test和/opt/a/b都作为sdb2分区的挂载点!!
所以神奇的发现,新建的test目录下也出现了1.txt文件!!
进一步验证了,挂载点会从所对应的分区里取水!!
需要注意的是:不管是改变/test还是/opt/a/b下的1.txt文件,实则上都是更改sdb2分区里存储的1.txt!!!
                     /test/1.txt和/opt/a/b/1.txt会同时改变!!!
"""
[root@localhost opt]# cd
[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/sdb2 /test
[root@localhost ~]# tree /test
/test
└── 1.txt

0 directories, 1 file
[root@localhost ~]# mount | grep /dev/sdb2  ## -- df可能不会显示全,但mount命令显示的肯定是全的!!!
/dev/sdb2 on /opt/a/b type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sdb2 on /test type xfs (rw,relatime,attr2,inode64,noquota)

"""小小验证下,b目录和2.txt都是存储在/opt/a对应的sdb1分区里
sdb1分区退隐江湖,b目录和2.txt都会消失!!!
"""
[root@localhost ~]# tree /opt
/opt
└── a
    └── b
        └── 1.txt

2 directories, 1 file
## -- 特别注意这里,直接umount /opt/a是失败的!!
[root@localhost ~]# umount /opt/a
umount: /opt/a:目标忙。
        (有些情况下通过 lsof(8) 或 fuser(1) 可以
         找到有关使用该设备的进程的有用信息)
[root@localhost ~]# umount /opt/a/b
[root@localhost ~]# tree /opt
/opt
└── a
    └── b
        └── 2.txt

2 directories, 1 file
[root@localhost ~]# umount /opt/a
[root@localhost ~]# tree /opt
/opt
└── a
永久挂载

上面操作的挂载都是临时挂载, reboot命令重启服务器后, 挂载会失效!!!
而linux中有些挂载就是永久的,如何做到的呢?

/etc/fstab文件

要挂载的设备 挂载点(入口) 文件系统类型 挂载参数 是否备份 是否检查
UUID 挂载点路径 eg: xfs defaults 0 0

Ps: 通常是defaults 0 0, 具体的选项配置详见 https://zhuanlan.zhihu.com/p/337009754

## -- 查看linux中永久挂载的信息
[root@localhost ~]# cat /etc/fstab
/dev/mapper/centos-root                                     /          xfs     defaults        0 0
UUID=7edef40b-555b-485b-a94c-4b345143b5d5 /boot      xfs     defaults        0 0
/dev/mapper/centos-swap                                     swap       swap    defaults        0 0

## -- 查看每个磁盘的UUID
[root@localhost ~]# blkid
/dev/sdb1: UUID="057edccc-4db0-4688-bb18-5e2d5e681c5e" TYPE="xfs" 
/dev/sdb2: UUID="41a7d6a4-b8b6-489a-892a-2e2c1e7d295e" TYPE="xfs" 
/dev/sdb3: UUID="db12f68f-9ea0-4b7a-a927-47d8345dedd3" TYPE="xfs" 
/dev/sdb5: UUID="29301422-0035-417c-bfd0-8d244ce59e0c" TYPE="xfs" 
/dev/sdb6: UUID="73122250-bd11-4ca2-8c84-0a2e412ef708" TYPE="xfs" 
/dev/sda1: UUID="7edef40b-555b-485b-a94c-4b345143b5d5" TYPE="xfs" 
/dev/sda2: UUID="jG51ec-dKTo-gsGv-o7wf-2wXp-Irc8-FYrzXT" TYPE="LVM2_member" 
/dev/mapper/centos-root: UUID="dc8ff591-4043-4c29-82bd-cdc39a0d48fb" TYPE="xfs" 
/dev/mapper/centos-swap: UUID="9a6222cd-5632-4215-acbc-94a9b22ddd6e" TYPE="swap" 

## -- 编辑/etc/fstab 将sdb1和sdb2进行挂载 通常使用UUID,使用分区名称(不建议)也可以
[root@localhost ~]# mkdir /root/test1
[root@localhost ~]# mkdir /root/test2
[root@localhost ~]# tail -2 /etc/fstab 
UUID=057edccc-4db0-4688-bb18-5e2d5e681c5e /root/test1 xfs defaults 0 0
/dev/sdb2 /root/test2 xfs defaults 0 0 

## -- reboot重启服务器后永久挂载生效
[root@localhost ~]# reboot

## -- 检查是否永久挂载成功
[root@localhost ~]# mount | grep sdb
/dev/sdb1 on /root/test1 type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sdb2 on /root/test2 type xfs (rw,relatime,attr2,inode64,noquota)

## -- 不重启服务器,使用mount -a重新加载配置文件实现自动挂载
[root@localhost ~]# sed -i '$a /dev/sdb3 /opt xfs defaults 0 0' /etc/fstab 
[root@localhost ~]# mount -a
[root@localhost ~]# mount | grep sdb
/dev/sdb1 on /root/test1 type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sdb2 on /root/test2 type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sdb3 on /opt type xfs (rw,relatime,attr2,inode64,noquota)

制作swap交换分区

查看swap分区的大小,当前是2个G,准备给它加1个G..
步骤: 新增分区 -- mkswap制作swap文件系统 -- 激活分区 -- 开机自动挂载新增的swap分区

swapon      /dev/sdd3 swapon      -s swapoff      /dev/sdd3 swapoff      -a

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972         621          61           9         289         190
Swap:          2047           4        2043

""" -- 从磁盘中划个1G空间的分区 sdb的逻辑分区 sdd的主分区都可以 -- """
gdisk /dev/sdd
partprobe 

[root@localhost ~]# lsblk /dev/sdd
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdd      8:48   0  2.5T  0 disk 
├─sdd1   8:49   0    1G  0 part 
├─sdd2   8:50   0    1G  0 part 
└─sdd3   8:51   0    1G  0 part 

""" -- 制作swap分区 -- """
[root@localhost ~]# mkswap /dev/sdd3
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=37fcc4d0-a581-404a-b13c-45311d09c7fc

""" -- 激活/临时挂载 刚制作好的swap分区 -- """
[root@localhost ~]# swapon /dev/sdd3
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972         622          70           9         279         189
Swap:          3071           4        3067

[root@localhost ~]# swapon -s
文件名             类型      大小  已用  权限
/dev/sdd3                               partition   1048572 4872    -2
/dev/dm-1                               partition   2097148 0   -3

## -- 开机自动挂载新增的swap分区
## -- 最好使用UUID
[root@localhost ~]# sed -i '$a /dev/sdd3 swap swap defaults 0 0' /etc/fstab 
"""
实验了下 swapoff /dev/sdd3 关闭sdd3这个swap分区,
尽管写进了配置文件, 但使用mount -a命令不会重新挂载上去
可以使用swapon /dev/sdd3 重新激活/临时挂载
开机的时候会自动挂载文件里的swap配置
不就相当于永久挂载了嘛!!!!
"""

Dell R740服务器制作RAID

RAID的基础理论详见: 0_计算机基础/1_计算机硬件组成.md 中 ◎ RAID技术 部分的内容...

Ps: 提一嘴,实体服务器需要做RAID,但大多数中小型公司用的阿里云(提供的是虚拟机),云环境不需要做RAID!!

简单回顾下:
     在生产环境中,通常会将多个盘合到一起做一个RAID...
     RAID0: 两块盘同时提供读写的功能,坏其中一块就不能用了;
     RAID1: 称作备份盘/镜像盘, 一块读写,另一块备份, 通常系统盘做RAID1;
     RAID5: 既考虑了读写速度也考虑了冗余..
     RAID10: 土豪玩法.. 结合raid0和1的优点..

制作RAID需要raid卡这个设备,硬盘是插在raid卡上的.. raid卡将这些硬盘做成磁盘阵列..

具体过程参考: https://www.cnblogs.com/linhaifeng/articles/13921161.html

注意几个地方:
4.在BIOS界面ctrl+R进入阵列卡,不同厂商快捷键不一样,需要查一下;
6.多少个盘根据自己的需求选择;(这里选择的是要操作哪些盘)
7.create New VD # -- VD虚拟磁盘,即多个硬盘组成一个虚拟层面的硬盘
8.这里是选择哪些盘做RAID  按ok完成
9.可以将在步骤6中已经选中而没有做raid的硬盘 继续做其他raid
11.做的RAID5的话,还可以有一块热备盘(当RAID5中任一盘坏了,其余2块可以做奇偶校验将数据恢复到格外的热备盘中) 

修复服务器文件系统

将一块硬盘分区,格式化制作文件系统,再挂载使用.. linux针对写操作会先将数据在内存的buffer缓冲区中攒一波, 若在将buffer中的数据往硬盘中写的过程中,突然断电重启后会提示文件错误: “emergency mode”...

模拟文件系统损坏
""" 1、准备一个1G的文件系统与数据 """
fdisk /dev/sdc            # -- 创建容量大小为1G的分区/dev/sdc1
mkfs.xfs /dev/sdc1        # -- 格式化/dev/sdc1分区
mount /dev/sdc1 /mnt/     # -- 挂载使用
echo 111 > /mnt/1.txt     # -- 1.txt在sdc1分区中

[root@localhost ~]# lsblk /dev/sdc
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc      8:32   0  20G  0 disk 
└─sdc1   8:33   0   1G  0 part 
[root@localhost ~]# mount | grep sdc1
/dev/sdc1 on /mnt type xfs (rw,relatime,attr2,inode64,noquota)

""" 2、模拟文件系统损坏 """
## -- 数据往硬盘中的文件写入的过程中,突然断电.. 文件就不完整啦
## -- 这里通过dd命令用冒0机往sdc硬盘中输入500M的数据,会覆盖掉硬盘中分区表的信息,整个结构就乱了..
## -- 注意哦,不是sdc1 是sdc
[root@localhost ~]# dd if=/dev/zero of=/dev/sdc bs=500M count=1
记录了1+0 的读入
记录了1+0 的写出
524288000字节(524 MB)已复制,1.14939 秒,456 MB/秒

""" 3、卸载后重新挂载,发现无法挂载 模拟断电后重启 """
[root@localhost ~]# umount /mnt 
[root@localhost ~]# mount /dev/sdc1 /mnt/
mount: /dev/sdc1 写保护,将以只读方式挂载
mount: 文件系统类型错误、选项错误、/dev/sdc1 上有坏超级块、
       缺少代码页或助手程序,或其他错误

       有些情况下在 syslog 中可以找到一些有用信息- 请尝试
       dmesg | tail  这样的命令看看..

## -- 吐槽一下: vm虚拟机上进行模拟,直接把/dev/sdc1分区给我干没了..无法开展修复的实验了..
## -- 修复部分就听理论吧!!
[root@localhost ~]# lsblk /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdc    8:32   0  20G  0 disk 

文件系统损坏后,若不能成功重启,可以用单用户模式(进去无挂载)、光盘修复模式来管理操作本地硬盘中的东西...

文件系统修复

使用xfs_repair 命令强制修复后, 数据丢失, 所以此时修复的意义在于可用, 所以数据要有备份意识...

xfs_repair /dev/sdc1            # -- 修复时先尝试这条命令
xfs_repair -L /dev/sdb1     # -- 若上一条命令失败,进行强制修复
mount /dev/sdc1 /mnt/           # -- 重新挂载

若是ext文件系统,修复需要用fsck命令
# -y 对所有问题都回答 "yes"
# -f 即使文件系统标记为 clean 也强制进行检查
fsck -f -y /dev/sda1 

xfs文件系统备份与恢复

备份 xfsdump

全量备份 + 增量备份
第一次备份是全量备份,增量备份是和上一次的备份进行比较, 仅备份有差异的文件...

[root@localhost ~]# rpm -qf `which xfsdump`
xfsdump-3.1.7-1.el7.x86_64
[root@localhost ~]# rpm -qf `which xfsrestore`
xfsdump-3.1.7-1.el7.x86_64

选项

选项 含义
-l 是L的小写, 指定level, 有0~9共10个等级.默认值为0, 即完全备份 ; 数字1至9都是增量备份!!
-L 指定该次备份的标签名.
-M 简易描述信息, 关于什么什么的备份
-f 备份的文件存放的路径 + 空格 + 需要备份文件的路径(备份源路径)

切记: 备份源路径后面千万不要加/斜杠

""" -- 数据准备 -- """
[root@localhost ~]# mount | grep -E "sdb3|sda1"
/dev/sdb3 on /opt type xfs (rw,relatime,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)
[root@localhost ~]# cp -r /etc /opt/
[root@localhost ~]# du -sh /opt
43M /opt
[root@localhost ~]# echo 111 > /opt/1.txt
[root@localhost ~]# ls /opt
1.txt  etc
[root@localhost ~]# cat /opt/1.txt 
111

""" -- 1.先做全量备份 -- """
## -- 将sdb3分区的内容 备份到 sda1分区下 (备份源与备份文件要分别属于两个不同的硬盘)
[root@localhost ~]# xfsdump -l 0 -L sdb3_bak -M sdb3_bak -f /boot/sdb3_bak_all /opt
... ... ...
xfsdump: Dump Status: SUCCESS


""" -- 2.做增量备份 做了两次增量备份-- """
## -- 增删改都属于增量的部分
echo 222 >> /opt/1.txt
echo 333 > /opt/2.txt
# 通常会在增量备份文件名上加上时间
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f /boot/sdb3_bak_add1 /opt

echo 333333 > /opt/3.txt
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f /boot/sdb3_bak_add2 /opt

""" -- 查看 -- """
# -- 备份源的大小
[root@localhost ~]# du -sh /opt/
43M /opt/
# -- 备份文件(全量、增量)的大小
# 可以发现增量备份sdb3_bak_add1、sdb3_bak_add2的大小是小于全量备份的,全量备份的大小是小于备份源的
[root@localhost ~]# ll -h /boot | grep sdb3_bak
-rw-r--r--  1 root root  23K 8月  26 17:41 sdb3_bak_add1
-rw-r--r--  1 root root  24K 8月  26 17:41 sdb3_bak_add2
-rw-r--r--  1 root root  37M 8月  26 17:41 sdb3_bak_all

使用限制

1.必须用root权限
2.只能备份已挂载的文件系统
3.只能备份XFS文件系统
4.只能用xfsrestore进行恢复
5.通过文件系统的UUID来分辨备份档,因此不能备份相同UUID的文件系统
恢复 xfsrestore
""" -- 删除/opt里所有的内容 --"""
[root@localhost ~]# ls /opt
1.txt  2.txt  3.txt  etc

0 directories, 3 files
[root@localhost ~]# rm -rf /opt/*

""" -- 依次恢复全量、增量1、增量2 -- """
# 全量
xfsrestore -f /boot/sdb3_bak_all /opt/
[root@localhost ~]# ls /opt
1.txt  etc
[root@localhost ~]# cat /opt/1.txt
111

# 增量1
xfsrestore -f /boot/sdb3_bak_add1 /opt/
[root@localhost ~]# ls /opt
1.txt  2.txt  etc
[root@localhost ~]# cat /opt/1.txt
111
222
[root@localhost ~]# cat /opt/2.txt
333

# 增量2
xfsrestore -f /boot/sdb3_bak_add2 /opt/
[root@localhost ~]# ls /opt
1.txt  2.txt  3.txt  etc
[root@localhost ~]# cat /opt/3.txt
333333