Linux18--存储管理之:MBR与GPT分区、格式化文件系统、磁盘挂载、制作swap分区、raid磁盘阵列、文件系统修复、xfs系统备份与恢复、LVM逻辑卷

0 新增磁盘流程

# 磁盘整体的操作步骤
  1.增加磁盘  
    编辑虚拟机设置--新增硬盘--SCSI--创建新虚拟磁盘--200G、多个文件--完成
  2.磁盘分区 
  3.分区格式化成文件系统
  4.文件系统挂载到指定目录

1 磁盘分区

# 1 分区分类
主分区
  主引导分区,是可以安装系统的分区
  
拓展分区
  属于主分区

逻辑分区
  属于拓展分区


# 2 分区格式 
MBR分区: "主引导记录"
  1.MBR最大支持 2TB容量,在容量方面存在着极大的瓶颈
  2.最多支持4个主分区

GPT分区: GPT fdisk,是fdisk的延伸   
  GPT是全局唯一标识分区表(GUID Partition Table)GUID分区表
  
  1.它支持的磁盘容量比MBR大得多
  2.最多支持128个主分区,足够使用
   
  # GPT分区
  这是一个正逐渐取代MBR的新标准,它是由UEFI辅住而形成的
  将来UEFI用于取代老旧的BIOS,而GPT则取代老旧的MBR


# 3 分区工具
fdisk 工具用于 MBR 格式

gdisk 工具用于 GPT 格式

1.1 MBR分区

# 1 查看所有可用块设备(磁盘)的信息
lsblk [选项]  [设备块]
  
  选项:
    -a  显示所有块设备 包含空设备
    -f  显示文件系统信息、UUID     xfs、ext4


# 2 fdisk工具 用于 MBR格式
# 查看、创建和维护分区表:
fdisk [选项] 或 [磁盘路径]
  选项:
    -l 列出所有分区表
    -u 与 -l搭配使用,显示分区数目
            
  # eg: 
    1.显示所有磁盘的分区情况
    fdisk -l 
          
    2.显示指定磁盘的分区情况
    fdisk -l /dev/sdb
          
    3.修改指定磁盘的分区
    fdisk /dev/sdb    # 出现操作菜单
          
      # 菜单操作指令:  
        m :帮助信息  
        n : 新增一个分区
        d : 删除分区,保存退出后 需要执行partprobe命令,刷新一下分区表
        p : 查看分区列表  
        w : 保存,并退出
        
        
# 3 eg: fdisk命令 做MBR分区
fdisk /dev/sdb
    
  Command (m for help): n   # 新增分区
    # 分区类型
    Partition type:     
        p   primary (0 primary, 0 extended, 4 free)   # 主分区最多创建4个,通常是3个主分区,加一堆拓展分区
            # primary  : 已经分过的分区  
            # extended : 已经分过的逻辑分区  
            # free     : 总共还可以分多少个分区  
        e   extended    # 拓展分区

    # 选择分区类型
    Select (default p):  
    # 选择分区的编号  
    Partition number (1-4, default 1):  
    # 分区开始的扇区
    First sector (2048-419430399, default 2048):  # 0-2047:磁盘自己使用
    # 分区结束的扇区
    Last sector, +sectors or +size{K,M,G} (2048-419430399, default 419430399): +100G    


  Command (m for help): p   # 查看分区列表
    # 分区的名称   扇区开始的编号 扇区结束的编号 桶的数量   当前硬盘的编号   文件系统
    Device Boot    Start     End       Blocks           Id         System  
    /dev/sdb3      2048     209717247  104857600        83          Linux  
    
    
# 4 刷新分区表
partprobe

1.2 GPT分区

# 1 安装gdisk工具  用于GPT格式  GPT fdisk,是fdisk的延伸 
yum install gdisk -y


# 2 查看、创建和维护分区表:
gdisk [选项] 或 [磁盘路径]
  选项:
    -l 列出所有分区表
            
  # eg: 
    1.显示所有磁盘的分区情况
    gdisk -l 
          
    2.显示指定磁盘的分区情况
    gdisk -l /dev/sdb
          
    3.修改指定磁盘的分区
    gdisk /dev/sdb    # 出现操作菜单
          
      # 菜单操作指令:  
        ? :帮助信息  
        n : 新增一个分区
        d : 删除分区,保存退出后 需要执行partprobe命令,刷新一下分区表
        p : 查看分区列表  
        w : 保存,并退出
        
        
# 3 eg: gdisk命令 做GPT分区
gdisk /dev/sdb

  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  # 设定1G的空间
  Current type is 'Linux filesystem'
  # 列出所有文件系统  L指令
  Hex code or GUID (L to show codes, Enter = 8300): L  
   会看到一系列文件系统信息,默认的8300编号代表Linux filesystem,用它就好
   
  Hex code or GUID (L to show codes, Enter = 8300):  # 直接回车用默认8300就好
  Changed type of partition to 'Linux filesystem'


  Command (? for help): p  # 查看分区表
  ......
  Number  Start (sector)  End (sector)  Size     Code     Name
   1         2048         2099199   1 024.0 MiB  8300  Linux filesystem


  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继续    proceed v.继续进行
  OK; writing new GUID partition table (GPT) to /dev/sdc.
  The operation has completed successfully.

2 格式化文件系统

# 1 强调:linux目录需要挂载使用
    系统目录可以挂载到任何磁盘设备上  
    磁盘必须格式化制作文件系统,然后挂载才能使用


# 2 格式化文件系统    给分区指定文件系统的类型
mkfs.xfs [文件系统分区的路径]

  # eg: mkfs.xfs /dev/sdb3  
    meta-data=/dev/sdb3     isize=512    agcount=4, agsize=6553600 blks  
             =              sectsz=512   attr=2, projid32bit=1  
             =              crc=1        finobt=0, sparse=0  
    data     =              bsize=4096   blocks=26214400, imaxpct=25  
             =              sunit=0      swidth=0 blks  
    naming   =version 2     bsize=4096   ascii-ci=0 ftype=1  
    log      =internal log  bsize=4096   blocks=12800, version=2  
             =              sectsz=512   sunit=0 blks, lazy-count=1  
    realtime =none          extsz=4096   blocks=0, rtextents=0  
    
  # 注:
    针对一块硬盘/dev/sdb,可以不分区,直接格式化制作文件系统  硬盘整体就是一个分区
    mkfs.xfs /dev/sdb
    
    
# 3 注意
  centos7选择xfs格式作为默认文件系统,而且不再使用以前的ext,但仍然支持ext4
  xfs专为大数据产生,每个单个文件系统最大可以支持8eb
  单个文件可以支持16tb,不仅数据量大,而且扩展性高
  还可以通过xfsdump,xfsrestore来备份和恢复

3 磁盘挂载

3.1 挂载与卸载命令

### 1 磁盘挂载

# 1.1 手动挂载   临时挂载  每次重启就失效  需要重新挂载  
mount [选项] [磁盘分区(文件系统)的路径] [挂载的路径]

  选项:
   -o 参数   主要用来描述设备或档案的挂接方式  # 就是/etc/fstab 挂载参数的列
      loop  # 用来把一个文件当做硬盘分区,挂接上系统  常用于挂载ISO镜像文件,就不用依赖于iso光盘
      ro    # 采用只读方式挂接设备
      rw    # 采用读写方式挂接设备
      
   -t   指定文件系统
   -a   挂载 /etc/fstab文件中 配置的所有挂载

eg: 
mount /dev/sdb3 /mnt 
mount -o loop /xxx.iso /opt  # 直接 把本地的ISO镜像文件 当做一个硬盘分区,挂载 到 /opt目录


# 1.2 自动挂载   永久挂载 
  
# 方式一: 修改磁盘配置文件 /etc/fstab    # 先做快照,防止配置失误后,可恢复!
sed -i '$a /dev/sdb1 /mnt xfs defaults 0 0' /etc/fstab 
或
vim /etc/fstab
    
# 增加1行
/dev/sdb1             /mnt         xfs          defaults      0      0
    
# 注:
  1.当挂载信息出现问题时,linux主机将无法正常开机  
  2.在添加完配置信息之后,一定要检测语法是否正确  
     同一挂载点,若被多个磁盘挂载,会被覆盖
     同一个磁盘,若挂载到多个挂载点,操作数据是同一份
  3.挂载完要重启 或 mount -a 是挂载配置文件 立即生效
    
    
# 方式二: 将临时挂载命令 添加到开机自启动脚本中  /etc/rc.local

1.为/etc/rc.local文件添加可执行权限  
chmod +x /etc/rc.d/rc.local 
    
2.修改rc.local文件
vim /etc/rc.local
  mount /dev/sdb1 /mnt
      
3.重启  
reboot 
    
    
 
### 2 磁盘卸载:  
umount [挂载的设备  或者 挂载的目录路径]  
  eg: umount /dev/sdb1  或 umount /mnt  
    
  # 注:卸载文件时,光标不能够在卸载的目录  
  umount /mnt  
  umount: /mnt: target is busy.  
        (In some cases useful info about processes that use  
        the device is found by lsof(8) or fuser(1))  

  # 强制卸载
  umount -l [挂载源 或 挂载点]


### 3  查看目前文件系统 磁盘使用情况统计
df 
  -h   # 大小按照易读的方式 展示
  -T   # 显示文件系统的类型
  -i   # 显示inode的信息
 
  # eg: df -h
    文件系统                  大小   已用  可用  已用(%)  挂载的目录
    Filesystem               Size  Used Avail Use% Mounted on  
    devtmpfs                 475M     0  475M   0% /dev  
    tmpfs                    487M     0  487M   0% /dev/shm  
    tmpfs                    487M  7.5M  479M   2% /run  
    tmpfs                    487M     0  487M   0% /sys/fs/cgroup  
    /dev/mapper/centos-root   98G  2.2G   96G   3% /  
    /dev/sda1                509M  132M  378M  26% /boot  
    tmpfs                     98M     0   98M   0% /run/user/0  
    /dev/sdb3                100G   33M  100G   1% /mnt

3.2 挂载配置文件详解

# 磁盘挂载配置文件详解  /etc/fstab

挂载的设备	挂载点(入口)	文件系统类型	挂载参数	是否备份  是否检查
/dev/...     /            xfs       defaults      0      0 

第一列:device:指定要挂载的文件系统的设备名称或块信息
       除了指定设备文件外,也可以使用UUID、LABEL来指定分区。 # 推荐UUID   
       
       # 查看设备块的 uuid
       blkid  或  lsblk -f 

第二列:dir:指定挂载点的路径

第三列:type:指定文件系统的类型,如ext3,ext4,xfs等

第四列:options:指定挂载的参数,默认为defaults
   defaults具有 rw、suid、exec、auto、nouser、async等默认参数的设定
  
第五列:dump:表示该挂载后的文件系统能否被dump备份命令作用
  0   不备份
  1   每天进行备份
  2   不定日期的进行备份

第六列:pass:指定如何使用fsck来检查硬盘
  0   不检查
  1   检查  # 挂载点为/ (根分区)的时候,必须填写1,其他的都不能填写1
  2   检查  # 当1级别检验完成之后,进行2级别检验

3 制作swap分区

# 1 查看开启的swap分区
swapon -s
  文件名        类型         大小    已用   权限
  /dev/sda2    partition   1048572   0    -2

free -m   # 查看cpu 含swap


# 2 制作swap分区

### 通过真实磁盘空间,增加swap空间
# 2.1 先磁盘分区
fdisk或gdisk   /dev/sdb

# 2.2 再格式化为swap
mkswap /dev/sdb1  

### 通过文件,增加swap空间   本质还是磁盘
dd if=/dev/zero of=/swap_file bs=1M count=200
chmod 0600 /swap_file

mkswap -f /swap_file  # 以文件制作swap分区

swapon /swap_file     # 挂载


# 3 挂载swap分区
swapon /dev/sdb1


# 4 关闭swap分区
swapoff -a         # 关闭所有的swap分区

swapoff /dev/sdb1   # 关闭某个具体的swap分区


# 5 开机自动挂载新增的swap分区

# 1.先查看swap分区的 设备块id
blkid  | grep /dev/sdb1
  /dev/sdb1: UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97" TYPE="swap" PARTUUID="d3b7649d-54aa-45eb-8bef-dccfe6915413"


# 2.修改/etc/fstab
vim /etc/fstab 
  UUID="91d30c2d-2b43-40b1-b2b5-6f828c585f97"   swap   swap  defaults    0  0

4 raid磁盘阵列

# 0 前提
raid技术是针对实体的服务器 


# 1 RAID(Redundant Array of Independent Disks)
即独立磁盘冗余阵列,简称为「磁盘阵列」

是多个独立的磁盘,通过 硬raid(硬件RAID卡) 或 软raid(软件MDADM)
组成在一起形成一个容量巨大的磁盘组
从而提升整个磁盘系统效能


# 2 RAID常用种类
RAID0  # 存储性能最高、但不提供数据校验或冗余备份

RAID1  # 数据安全最高(双份数据冗余备份)、但成本最高 空间使用率只有50%

RAID5  # 存储性能、数据安全、存储成本 兼顾的一种方案   ***

RAID10 # 0+1的结合 


# 3 具体实战   注意:是先硬盘raid  再装服务器系统
https://zhuanlan.zhihu.com/p/356299159

https://www.cnblogs.com/linhaifeng/articles/13921161.html

5 文件系统的修复

### 0 前提
在Linux系统中为了增加系统性能,通常系统会将一些数据写 先放在内存中,
并不会直接将数据写入硬盘,这是因为内存速度要比硬盘快若干倍

但万一服务器突然断电或者其他未知原因  导致内存写入到硬盘的过程中断了 
再次启动后,会造成文件系统错误:“emergency mode”  紧急模式


### 1 修复
# 0.如果进入不了操作系统,可以进入单用户模式下操作

# 1.首先尝试mount和umount文件系统,以便重放日志修复文件系统,如果不行,再进行如下操作

# 2.执行xfs_repair -n,只检查不修复:检查文件系统是否损坏,如何损坏会列出将要执行的操作
xfs_repair -n /dev/sdb2
  如果是日志和数据不一致了,xfs默认会在挂载的时候修复这种不一致
  操作系统给出的建议是以读写的方式挂载并自动修复,可以尝试以只读不修复方式挂载文件系统

mount -o ro,norecovery /dev/sdb2 /opt

# 3.若上述挂载不成功,xfs_repair 修复文件系统
xfs_repair /dev/sdb2 


# 4.若还不行,最终 强制修复   会清空日志,导致丢失数据
xfs_repair -L /dev/sdb2 

说明:-L是修复xfs文件系统的最后手段,慎重选择,它会清空日志,会丢失用户数据和文件

备注:在执行xfs_repair操作前,最好使用xfs_metadump工具保存元数据
      一旦修复失败,最起码可以恢复到修复之前的状态

# 5.修复完成以后,尝试能不能正常挂载,如能,取消挂载,再启动就正常了
mount /dev/sdb2 /opt



### 2 实例
# 1.准备一个1G的文件系统与数据
mount /dev/sdb1 /opt/
echo big_egon > /opt/1.txt

# 2.模拟文件系统损坏
dd if=/dev/zero of=/dev/sdb bs=500M count=1   # 直接写入到/dev/sdb磁盘,而不是sdb1分区

# 此时看似一切都正常
cat /opt/1.txt 
  big_egon

echo egon_nb > /opt/2.txt
cat /opt/2.txt 
  egon_nb
  
# 但是重新挂载就会失效,即断电后系统重启,重新挂载就会不成功
umount /opt 

mount /dev/sdb1 /opt
  mount: /dev/sdb1 写保护,将以只读方式挂载
  mount: 未知的文件系统类型“(null)”


# 3.修复
xfs_repair /dev/sdb1
  Phase 1 - find and verify superblock...
  bad primary superblock - bad magic number !!!
  。。。。。。
  修复失败,无法挂载
  
mount /dev/sdb1 /opt/
  mount: 将 /dev/sdb1 挂载到 /opt 失败: 结构需要清理

# 强制修复  清空日志
xfs_repair -L /dev/sdb1  

mount /dev/sdb1 /opt/

# 查看数据  数据丢失
ls /opt/  # 此时修复的意义在于可用,至于数据,你需要自己有备份意识


### 3 ext文件系统修复
fsck -f -y /dev/sda1   # 也是强制修复,清空日志

  -y 对所有问题都回答 "yes"
  -f 即使文件系统标记为clean,也强制进行检查

6 文件系统的备份与恢复

### 0 前提
针对是 xfs 文件系统的备份与恢复


### 1 备份级别
0               完全备份

1 <=level<= 9   增量备份

# ps:增量备份是和第一次的备份(level 0)进行比较,仅备份有差异的文件(level 1)


### 2 xfsdump 备份常用参数
-L  xfsdump会记录每次备份的session Label,一般填写针对此文件系统的简易说明
-M  xfsdump可以记录存储Media Label,一般填写此媒体的简易说明
-l  是L的小写,就是指定level,有0~9共10个等级,默认为0,即完全备份
-f  后面接 备份文件 和源文件
-I  大写的“i”,从/var/lib/xfsdump/inventory 列出目前备份的信息状态



### 3 备份与恢复   备份的数据 应存放在 与源路径 不同的磁盘上! 不然没有意义,一块磁盘坏,备份数据也会坏
# 1 数据备份        
# 1.1 先做全量备份, 切记:“备份的源路径” 末尾不要加左斜杠/  ***
xfsdump -l 0 -L sdb3_bak -M "all bak" -f 全量备份的成果路径1 备份的源路径 
  eg: xfsdump -l 0 -L sdb3_bak -M "all bak" -f /all.bak /opt

# 1.2 再做增量备份
xfsdump -l 1 -L sdb3_bak -M "add bak1" -f 增量备份的成果路径1 备份的源路径 
xfsdump -l 1 -L sdb3_bak -M "add bak2" -f 增量备份的成果路径2 备份的源路径 
xfsdump -l 1 -L sdb3_bak -M "add bak3" -f 增量备份的成果路径3 备份的源路径 
  eg: xfsdump -l 1 -L sdb3_bak -M "add bak1" -f /add.bak1 /opt

# 2 数据恢复
# 2.1  先恢复全量备份
xfsrestore -f 全量备份的成果路径1 数据恢复的路径

# 2.2 再依次恢复增量备份
xfsrestore -f 增量备份的成果路径1 数据恢复的路径
xfsrestore -f 增量备份的成果路径2 数据恢复的路径
xfsrestore -f 增量备份的成果路径3 数据恢复的路径


### 4 xfsdump使用限制
1.必须用root权限
2.只能备份已挂载的文件系统
3.只能备份XFS文件系统
4.只能用xfsrestore恢复
5.通过文件系统的UUID来分辨备份,因此不能备份相同UUID的文件系统

7 LVM逻辑卷

7.1 LVM介绍

# 0 前提:为何使用LVM
磁盘分区时,通常不能确定每个分区的使用大小,凭经验预估
且fdisk、gdisk工具对磁盘分区后,分区空间大小则固定了 后续管理则麻烦


# 1 LVM  Logical Volume Manager  逻辑卷管理
逻辑卷管理LVM是硬盘的一个系统工具
LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘
可以让管理员弹性的管理 逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据


# 2 LVM涉及主要概念 
物理卷(PV):  physical volume
  把常规的磁盘设备通过pvcreate命令对其进行初始化,形成了物理卷  # 其实就是硬盘或分区  面粉

卷组(VG):    volume group
  把多个物理卷组成一个逻辑的整体,卷组的大小就是多个硬盘之和   # 理解就是由一个或多个PV组成的整体  面团

逻辑卷(LV):  logical volume
  从卷组中划分需要的空间大小出来。用户仅需对其格式化然后即可挂载使用
  从VG中切割出的空间,用于创建文件系统  # 切成馒头

基本单元(PE):  physical extend
  分配的逻辑大小的最小单元,默认为4MB的基本块
    假设分配100MB逻辑空间,则需要创建25个PE



# 3 LVM优缺点
# 优点:
1.可在系统运行的状态下,动态的扩展文件系统的大小
2.文件系统可以跨多个磁盘  # 因此文件系统大小,不会受物理磁盘的限制
3.可增加新的磁盘到LVM的存储池中
4.可 以镜像的方式冗余重要的数据到多个物理磁盘
5.可方便的导出整个卷组到另外一台机器

# 缺点:
1.因为加入了额外的操作,存取性能受到影响
2.当卷组中的一个磁盘损坏时,整个卷组都会受到影响
  解释:LVM如果有一个磁盘损坏,整个lvm都坏了,lvm只有动态扩展作用
  方案:底层用RAID + 上层LVM = 既有冗余又有动态扩展
  
3.在从卷组中移除一个磁盘的时候,必须使用reducevg命令
  该命令要求root权限,且不允许在快照卷组中使用

7.2 LVM基本使用

### 0 安装lvm2
yum install -y lvm2


### 1 PV物理卷 操作 
# 1.制作PV 
pvcreate /dev/sdb1  # 可对分区做
pvcreate /dev/sdc   # 可对整块盘做

# 2.查看PV
pvs
  PV        VG   Fmt   Attr PSize  PFree 
  /dev/sdb1      lvm2  ---   1.00g  1.00g
  /dev/sdc       lvm2  ---  20.00g  20.00g

pvscan
  PV /dev/sdb1                      lvm2 [1.00 GiB]
  PV /dev/sdc                       lvm2 [20.00 GiB]
  PV /dev/sdb2                      lvm2 [1.00 GiB]
  PV /dev/sdb3                      lvm2 [1.00 GiB]
  Total: 4 [23.00 GiB] / in use: 0 [0   ] / in no VG: 4 [23.00 GiB]



### 2 VG卷组 操作
# 1.VG制作   将PV划入VG中
vgcreate vg1 /dev/sdb1 /dev/sdc   # 包含/dev/sdb1与/dev/sdc两个pv

# 2.VG查看
vgs
  VG  #PV #LV #SN Attr   VSize  VFree 
  vg1  2   0   0 wz--n- 20.99g 20.99g
  
  
  
### 3 LV逻辑卷  操作
# 1.LV制作
lvcreate -L 100M -n lv1_from_vg1 vg1   # 从vg1卷组中分出来 逻辑卷lv1_from_vg1
    -L   # 逻辑卷大小
    -n   # 逻辑卷名字
  
# 2.LV查看
lvs
  LV           VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1_from_vg1 vg1 -wi-a----- 100.00m  
  


### 4 格式与挂载
mkfs.xfs /dev/vg1/lv1_from_vg1 

mount /dev/vg1/lv1_from_vg1 /test1/

7.3 在线动态操作容量

### 1 在线扩容
# 1 在线扩容
  意思是在不用卸载的情况下,完成扩容
  
# 2 命令
lvextend -L  [+]MGT  /dev/VG_NAME/LV_NAME
  # 注:
    -L 100M 与 -L +100M不是一个意思
    -L 100M  代表是直接指定大小为多少
    -L +100M 代表在原有的基础上扩容
    
# 3 示例
# 1.新增一块盘或者一个分区
fdisk /dev/sdb ......
partprobe     # 刷新分区表信息
ls /dev/sdb4

# 2.新增一个pv
pvcreate /dev/sdb4

# 3.把新增的pv扩到vg1里     # 前三步 属于VG卷组扩容
vgextend vg1 /dev/sdb4

vgs  # 可以看到vg1扩容了


# 4.接下来对lv1_from_vg1扩容     若VG卷组有多余的空间,以上步骤可不用,直接LV扩容
lvextend -L +1000M /dev/vg1/lv1_from_vg1 

xfs_growfs /dev/vg1/lv1_from_vg1   # 扩展逻辑卷后需要更新xfs文件系统


### 2 在线缩容
不要缩容!!!并且xfs干脆不支持缩容

lvreduce -L [-]MGT /dev/VG_NAME/LV_NAME 缩减逻辑卷


### 3 删除
# 1.删除lv    需要先卸载挂载点
umount /test3

lvremove /dev/vg2/lv1_from_vg2 

# 2.删vg
vgremove vg2

# 3.删pv:只能删掉那些不属于任何vg的pv
pvremove /dev/sdb2
pvremove /dev/sdb3

7.4 快照与数据恢复

# 1 快照  snapshot
LVM机制提供了对LV做快照的功能,也就是给文件系统做一个备份
采用写时复制技术(Copy-On-Write,COW),还支持 thin类型的快照


# 2 快照原理:写时复制技术
是指当LVM快照创建的时候,仅创建了 原逻辑卷中实际数据 的inode块的硬链接(hark-link)而已

快照会跟踪原始卷中块的改变
只要实际的数据没有改变,快照就只包含指向数据的inode的指针,而非数据本身
若实际的数据发生改变,原始逻辑卷上 将要改变的数据,会在改变之前,拷贝到快照预留的空间
  故要求快照的空间,是够用的


# 3 快照总结
  1.创建快照实际上就是创建了一个逻辑卷,只不过该卷的属性与普通逻辑卷的属性有些不一样
  
  2.VG中需要预留存放,快照本身的空间,不能全部被占满
  
  3.快照所在的VG 必须与被备份的LV所处的VG 相同,否则创建快照会失败



# 4 快照实例: 给vg1下的lv1建立快照,并恢复快照数据

# 1.准备好初始数据
df
  文件系统                       1K-块    已用   可用 已用%  挂载点
  ...
/dev/mapper/vg1-lv1_from_vg1   98980    5348   93632  6% /test1

echo "hello egon" > /test1/1.txt


# 2.查看vg1容量是否充足  
vgs   # lv1_from_vg1 属于卷组vg1,而vg1有足够的容量来分配给快照卷
  VG  #PV #LV #SN Attr   VSize  VFree  
  vg1   2   2   0 wz--n- 20.99g <20.70g


# 3.在vg1卷组里,创建一个lv1_from_vg1_snap的快照
lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
  # 格式
  -L    指定快照(逻辑卷)的空间大小   
        # 原则上:应该是和源lv的空间一样,但是lv可以动态扩容,故可以先设定小一部分就行
        
  -s    指定为快照(snapshot)的格式
  -n    指定快照的名称
  最后   指定为哪个逻辑卷 建立快照
  

# 4.查看
lvs
  LV                VG  Attr       LSize   Pool Origin   Data%  Meta%  Move Log Cpy%Sync Convert
  lv1_from_vg1      vg1 owi-aos--- 100.00m                                                          
  lv1_from_vg1_snap vg1 swi-a-s--- 104.00m      lv1_from_vg1 0.01                                           


# 5.恢复数据
# 5.1 单个文件的处理: 挂载快照后,再将备份数据,还原到原lv中
mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/

  # 注:
  快照挂载的时候,由于和原来的lv是同一个UUID
  而xfs文件系统是不允许相同UUID的文件系统挂载,故需要加选项 -o nouuid

cp /opt/1.txt /test1/1.txt    # 将备份的1.txt,复制到源目录中

# 其实多个文件,也可以直接cp所有文件
cp  /opt/*  /test/


# 5.2 多个文件的处理: 先卸载数据源与快照,再进行合并快照,再挂载源lv 
     # 快照(lv)是一次性的,合并后会自动删除
     
umount /test1

umount /opt

lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_snap 

mount /dev/vg1/lv1_from_vg1 /test1/

cat /test1/1.txt  # 数据还原回来了
posted @ 2023-07-31 18:16  Edmond辉仔  阅读(1601)  评论(0编辑  收藏  举报