13Linux之磁盘管理

13Linux之磁盘管理

13 磁盘管理

13.1 两种分区格式

13.1.1 磁盘命名

  • 磁盘在系统中的命名

    设备名称 分区信息 设备类型
    /dev/sda /dev/sda1 第一块物理磁盘第一分区
    /dev/sdb /dev/sdb2 第二块磁盘第二个分区
    /dev/vdd /dev/vdd4 第四块虚拟磁盘第四个分区
  • 三类分区:主分区<----扩展分区<----逻辑分区

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

    主分区又叫引导分区,是可以安装系统的分区

  • 两种分区格式

    mbr分区格式----->分区工具fdisk(最多四个主分区,通常用于<2T的硬盘空间)

    gpt分区格式------>分区工具gdisk(最多128个主分区,通常用于>2T的硬盘空间)

13.1.2 mbr

  • 查看设备详情及分区情况

    [root@ccc ~]# lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   10G  0 disk 
    ├─sda1   8:1    0  476M  0 part /boot
    ├─sda2   8:2    0  1.9G  0 part [SWAP]
    └─sda3   8:3    0  7.7G  0 part /
    sdb      8:16   0   20G  0 disk 
    ├─sdb1   8:17   0    1G  0 part /qq
    ├─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    1G  0 part 
    └─sdb6   8:22   0    1G  0 part 
    sr0     11:0    1  4.5G  0 rom  
    
    [root@ccc ~]# fdisk -l
    
    磁盘 /dev/sda:10.7 GB, 10737418240 字节,20971520 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x000c10cc
    
       设备 Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048      976895      487424   83  Linux
    /dev/sda2          976896     4882431     1952768   82  Linux swap / Solaris
    /dev/sda3         4882432    20971519     8044544   83  Linux
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x8d447f7c
    
       设备 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
    /dev/sdb5         6295552     8392703     1048576   83  Linux
    /dev/sdb6         8394752    10491903     1048576   83  Linux
    
  • 命令

    m  # 查看帮助
    q  # 退出
    n  # 新建分区(p主分区,e扩展分区)
    d  # 删除分区
    w  # 保存
    p  # 查看分区情况
    
  • fdisk工具

    [root@ccc ~]# fdisk /dev/sdb
    欢迎使用 fdisk (util-linux 2.23.2)。
    
    更改将停留在内存中,直到您决定将更改写入磁盘。
    使用写入命令前请三思。
    
    
    命令(输入 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
    分区 1 已设置为 Linux 类型,大小设为 1 GiB
    
    命令(输入 m 获取帮助):n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): p
    分区号 (2-4,默认 2):
    起始 扇区 (2099200-41943039,默认为 2099200):
    将使用默认值 2099200
    Last 扇区, +扇区 or +size{K,M,G} (2099200-41943039,默认为 41943039):+1G
    分区 2 已设置为 Linux 类型,大小设为 1 GiB
    
    命令(输入 m 获取帮助):n
    Partition type:
       p   primary (2 primary, 0 extended, 2 free)
       e   extended
    Select (default p): p
    分区号 (3,4,默认 3):
    起始 扇区 (4196352-41943039,默认为 4196352):
    将使用默认值 4196352
    Last 扇区, +扇区 or +size{K,M,G} (4196352-41943039,默认为 41943039):+1G
    分区 3 已设置为 Linux 类型,大小设为 1 GiB
    
    命令(输入 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 获取帮助):n
    All primary partitions are in use
    添加逻辑分区 5
    起始 扇区 (6295552-41943039,默认为 6295552):
    将使用默认值 6295552
    Last 扇区, +扇区 or +size{K,M,G} (6295552-41943039,默认为 41943039):+1G
    分区 5 已设置为 Linux 类型,大小设为 1 GiB
    
    命令(输入 m 获取帮助):p
    
    磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):512 字节 / 512 字节
    磁盘标签类型:dos
    磁盘标识符:0x8d447f7c
    
       设备 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
    /dev/sdb5         6295552     8392703     1048576   83  Linux
    
    命令(输入 m 获取帮助):w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    正在同步磁盘。
    
  • lsblk /dev/sdb查看一下

    [root@ccc ~]# 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 /qq
    ├─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   1G  0 part 
    └─sdb6   8:22   0   1G  0 part 
    

13.1.3 gpt

  • 步骤与mbr相似

     # 需要先安装命令
    [root@ccc ~]# yum install gdisk -y
    

13.2 制作文件系统并且挂载

13.2.1 制作文件系统

  • 磁盘必须格式化制作文件系统,然后挂载才能使用

  • 一块磁盘可以不分区直接格式化制作文件系统

    [root@ccc ~]# mkfs.xfs /dev/sdb
    
  • 也可以基于mbr或gpt分区方式分区完毕后,针对某一个分区比如/dev/sdb1制作文件系统

    [root@ccc ~]# mkfs.xfs /dev/sdb1
    meta-data=/dev/sdb1              isize=512    agcount=4, agsize=65536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=262144, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@ccc ~]# mkfs.xfs /dev/sdb2
    meta-data=/dev/sdb2              isize=512    agcount=4, agsize=65536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=262144, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@ccc ~]# mkfs.xfs /dev/sdb3
    meta-data=/dev/sdb3              isize=512    agcount=4, agsize=65536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=262144, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@ccc ~]# mkfs.xfs /dev/sdb4
    mkfs.xfs: /dev/sdb4 appears to contain a partition table (dos).
    mkfs.xfs: Use the -f option to force overwrite.
    [root@ccc ~]# mkfs.xfs /dev/sdb5
    meta-data=/dev/sdb5              isize=512    agcount=4, agsize=65536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=262144, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@ccc ~]# mkfs.xfs /dev/sdb6
    meta-data=/dev/sdb6              isize=512    agcount=4, agsize=65536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=262144, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    

13.2.2 挂载

  • 挂载

    [root@ccc ~]# mount /dev/sdb1 /opt
    [root@ccc ~]# df
    文件系统         1K-块    已用    可用 已用% 挂载点
    devtmpfs        487140       0  487140    0% /dev
    tmpfs           497840       0  497840    0% /dev/shm
    tmpfs           497840    7780  490060    2% /run
    tmpfs           497840       0  497840    0% /sys/fs/cgroup
    /dev/sda3      8034304 6531028 1503276   82% /
    /dev/sda1       484004  125552  358452   26% /boot
    tmpfs            99572       0   99572    0% /run/user/0
    /dev/sdb1      1038336   32992 1005344    4% /opt
    
  • 卸载

    [root@ccc ~]# umount /opt
    [root@ccc ~]# df
    文件系统         1K-块    已用    可用 已用% 挂载点
    devtmpfs        487140       0  487140    0% /dev
    tmpfs           497840       0  497840    0% /dev/shm
    tmpfs           497840    7780  490060    2% /run
    tmpfs           497840       0  497840    0% /sys/fs/cgroup
    /dev/sda3      8034304 6531028 1503276   82% /
    /dev/sda1       484004  125552  358452   26% /boot
    tmpfs            99572       0   99572    0% /run/user/0
    
  • 强制卸载

    [root@ccc ~]# umount -l /opt
    [root@ccc ~]# df
    文件系统         1K-块    已用    可用 已用% 挂载点
    devtmpfs        487140       0  487140    0% /dev
    tmpfs           497840       0  497840    0% /dev/shm
    tmpfs           497840    7780  490060    2% /run
    tmpfs           497840       0  497840    0% /sys/fs/cgroup
    /dev/sda3      8034304 6531028 1503276   82% /
    /dev/sda1       484004  125552  358452   26% /boot
    tmpfs            99572       0   99572    0% /run/user/0
    
  • 强制重新格式化

    [root@ccc ~]# mkfs.xfs /dev/sdb1 -f
    
  • 将/dev/sdb1挂载到/opt下,往/opt下新建文件,文件存到的是/dev/sdb1下,卸载/opt后,数据依然存在

  • 同一个分区/文件系统挂载到不同的文件夹下,数据的来源一致

  • 开机自动挂载

    # 查看UUID
    [root@ccc ~]# blkid
    /dev/sda1: UUID="b89e54ee-6c11-44da-b17d-25a1fb8e5bb5" TYPE="xfs" 
    /dev/sda2: UUID="762c7f34-e11a-49dd-8697-b7fa2546fef0" TYPE="swap" 
    /dev/sda3: UUID="b43c52c4-89a7-48d2-83e4-6e8d35553e64" TYPE="xfs" 
    /dev/sdb1: UUID="b0cde59c-5d48-4a53-87ec-85e428c07d82" TYPE="xfs" 
    /dev/sdb2: UUID="6ff6e47c-98b7-4bb1-ab9b-56a96fff7374" TYPE="xfs" 
    /dev/sdb3: UUID="7e7ee698-6a23-4786-9034-f3f7a23865eb" TYPE="xfs" 
    /dev/sdb5: UUID="92903935-1bee-4c35-87ce-317bff95bd2e" TYPE="xfs" 
    /dev/sdb6: UUID="85b1c2ed-bb44-4c3f-b576-4f72025895a6" TYPE="xfs" 
    /dev/sr0: UUID="2020-04-22-00-54-00-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" 
    
    # 编辑配置文件
    [root@ccc ~]# vim /etc/fstab
    [root@ccc ~]# tail -1 /etc/fstab 
    UUID=b0cde59c-5d48-4a53-87ec-85e428c07d82 /boot                   xfs     defaults        0 0
    方法二
    /dev/sdb1 /boot                   xfs     defaults        0 0
    
  • 磁盘挂载mount补充

    -t  # 指定文件系统
    -a  # 挂载/etc/fstab中配置的所有
    
    [root@ccc ~]# mkdir /db2
    [root@ccc ~]# mount -t xfs /dev/sdb2 /db2
    [root@ccc ~]# df
    文件系统         1K-块    已用    可用 已用% 挂载点
    devtmpfs        487140       0  487140    0% /dev
    tmpfs           497840       0  497840    0% /dev/shm
    tmpfs           497840    7788  490052    2% /run
    tmpfs           497840       0  497840    0% /sys/fs/cgroup
    /dev/sda3      8034304 6556084 1478220   82% /
    /dev/sdb1      1038336   32992 1005344    4% /opt
    /dev/sda1       484004  125552  358452   26% /boot
    tmpfs            99572       0   99572    0% /run/user/0
    /dev/sdb2      1038336   32992 1005344    4% /db2
    
    查看文件系统的UUID并挂载
    [root@ccc ~]# blkid | grep sdb1
    /dev/sdb1: UUID="b0cde59c-5d48-4a53-87ec-85e428c07d82" TYPE="xfs" 
    [root@ccc ~]# mount UUID="b0cde59c-5d48-4a53-87ec-85e428c07d82" /db2
    
    修改配置文件建议用UUID
    [root@ccc ~]# tail -1 /etc/fstab 
    UUID=b0cde59c-5d48-4a53-87ec-85e428c07d82 /boot                   xfs     defaults        0 0
    [root@ccc ~]# mount -a
    [root@ccc ~]# df
    ...
    
  • /etc/fstab配置文件编写格式

    需挂载的设备 挂载点 文件系统类型 挂载参数 是否备份 是否检查
    /dev/sdb1 /data xfs defaults 0 0

    第一列device:指定要挂载的文件系统的设备名称或块信息,除指定设备文件外,也可使用UUID、LABEL来指定分区。

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

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

    第四列options:指定挂载参数,默认为defaults。

    第五列dump:表示该挂载后的文件系统是否能被dump备份命令作用。

    第六列pass:指定如何使用fsck来检查硬盘。

    options指定挂在参数的类型

    参数 含义
    async/sync 是否同步方式运行,默认async(异步)
    user/nouser 是否允许普通用户使用mount命令挂载,默认nouser
    exec/noexec 是否允许可执行文件执行,默认exec
    suid/nisuid 是否允许存在suid属性的文件,默认suid
    auto/noauto 执行mount -a时,此文件是否被主动挂载,默认auto
    rw/ro 是否只读或者读写模式进行挂载,默认rw
    defaults 具有rw、suid、exec、auto、nouser、async等默认参数的设定

    dump选项的作用

    选项 含义
    0 不做备份
    1 每天进行备份操作
    2 不定日期的进行备份操作

    pass选项的含义

    选项 含义
    0 不检查
    1 检查,挂载点为/的时候(即根分区),必须写1,其他都不能写1
    2 检查,当1级别检验完成后进行2级别检验

13.3 制作swap分区

13.3.1 查看

  • free -m

    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         115         762           7          94         736
    Swap:          1906           0        1906
    

13.3.2 制作swap分区

  • mkswap

    # 首先磁盘进行分区
    [root@ccc ~]# mkswap /dev/sdb3  # 将/dev/sdb3格式化为swap
    

13.3.3 激活swap分区

  • swapon

    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         115         762           7          94         736
    Swap:          1906           0        1906
    [root@ccc ~]# swapon /dev/sdb3
    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         116         761           7          94         735
    Swap:          2930           0        2930
    

13.3.4 关闭swap分区

  • swapoff

    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         116         761           7          94         735
    Swap:          2930           0        2930
    [root@ccc ~]# swapon -s
    文件名				类型		大小	已用	权限
    /dev/sda2                              	partition	1952764	0	-2
    /dev/sdb3                              	partition	1048572	0	-3
    [root@ccc ~]# swapoff /dev/sdb3
    [root@ccc ~]# swapon -s
    文件名				类型		大小	已用	权限
    /dev/sda2                              	partition	1952764	0	-2
    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         115         762           7          94         735
    Swap:          1906           0        1906
    

13.3.5 开机自动挂载

  • 修改配置文件/etc/fstab

    [root@ccc ~]# blkid | grep /dev/sdb3
    /dev/sdb3: UUID="268ac984-c7e4-48ad-8511-0c29897453b4" TYPE="swap" 
    [root@ccc ~]# vim /etc/fstab 
    [root@ccc ~]# tail -1 /etc/fstab
    UUID=268ac984-c7e4-48ad-8511-0c29897453b4 swap                    swap    defaults        0 0
    

13.3.6 文件系统制作swap

  • 如果磁盘没有过多的分区可以使用,可以通过文件增加SWAP空间,本质上还是磁盘

    [root@ccc ~]# touch /db2/swap_file
    [root@ccc ~]# dd if=/dev/zero of=/db2/swap_file bs=1M count=200
    记录了200+0 的读入
    记录了200+0 的写出
    209715200字节(210 MB)已复制,3.59794 秒,58.3 MB/秒
    [root@ccc ~]# chmod 0600 /db2/swap_file 
    [root@ccc ~]# ll /db2/swap_file 
    -rw------- 1 root root 209715200 11月  8 18:37 /db2/swap_file
    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         116         547           7         308         712
    Swap:          1906           0        1906
    [root@ccc ~]# mkswap -f /db2/swap_file 
    正在设置交换空间版本 1,大小 = 204796 KiB
    无标签,UUID=a5af3188-8e4a-435e-ab05-7314edb2a8ce
    [root@ccc ~]# swapon /db2/swap_file 
    [root@ccc ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:            972         116         547           7         308         712
    Swap:          2106           0        2106
    

13.4 RAID

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

13.5 修复服务器文件系统

13.5.1 修复方式

  • 如果进不了操作系统,可以进入单用户模式操作

  • 首先尝试mount和umount文件系统,以便重放日志,修复文件系统。若不行,再进行以下操作

  • 执行xfs_repair -n 只检查不修复:检查文件系统是否损坏,如果损坏会列出要执行的操作

    [root@ccc ~]# xfs_repair -n /dev/sdb

    如果是日志和数据不一致,xfs会默认在挂载的时候修复这一不一致,操作系统给出的建议是以读写的方式挂载并自动修复,可以尝试以只读不修复方式挂载文件系统

    [root@ccc ~]# mount -o ro,norecovery /dev/sdb1 /opt

  • 如果上述挂载不成功,可以执行xfs_repair修复文件系统

    [root@ccc ~]# xfs_repair /dev/sdb1

  • 如果还不行,只能采用"损失部分数据的修复方法"

    根据打印消息,修复失败时:

    先执行xfs_repair -L /dev/sdb1(清空日志,会丢失文件)

    再执行xfs_repair /dev/sdb1

    -L是修复xfs文件系统的最后手段,会清空日志,丢失用户的数据和文件

    在执行xfs_repair操作前,最好先xfs_metadump工具保存元数据,一旦修复失败,可以修复到恢复之前状态

  • 修复完成以后,尝试能不能正常挂载,如能,取消挂载,再启动就正常了

13.5.2 模拟环境

  • 准备一个1G的文件系统与数据

    [root@ccc ~]# mount /dev/sdb1 /opt
    [root@ccc ~]# echo "ccc" > /opt/1.txt
    
  • 模拟文件系统损坏

    [root@ccc ~]# dd if=/dev/zero of=/dev/sdb bs=500M count=1
    记录了1+0 的读入
    记录了1+0 的写出
    524288000字节(524 MB)已复制,10.3369 秒,50.7 MB/秒
    [root@ccc ~]# cat /opt/1.txt 
    ccc
    [root@ccc ~]# umount /opt  # 模拟断电后系统重启,重新挂载不成功
    [root@ccc ~]# mount /dev/sdb1 /opt
    mount: 将 /dev/sdb1 挂载到 /opt 失败: 结构需要清理
    
  • 修复

    [root@ccc ~]# xfs_repair /dev/sdb1   # 修复失败
    Phase 1 - find and verify superblock...
    Phase 2 - using internal log
            - zero log...
            - scan filesystem freespace and inode maps...
    bad magic number
    Metadata CRC error detected at xfs_agi block 0x2/0x200
    bad magic # 0x0 for agi 0
    bad version # 0 for agi 0
    ...
    [root@ccc ~]# xfs_repair -L /dev/sdb1  # 强制修复
    [root@ccc ~]# mount /dev/sdb1 /opt
    [root@ccc ~]# ls /opt  # 数据丢失
    
  • 如果是ext文件系统,修复用fsck命令

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

13.6 xfs文件系统备份与恢复

13.6.1 两种备份级别

  • 完全备份 0
  • 增量备份 1~9
  • 增量备份是和第一次的备份(level 0)进行比较,仅备份有差异的文件(level 1)

13.6.2 数据备份xfsdump

  • 安装命令

    [root@ccc ~]# yum install -y xfsdump
    
  • 常用参数

    -L  # xfsdump会记录每次备份的session Label,这里可以填写针对此文件系统的简易说明
    -M  # xfsdump可以记录存储Media Label,这里可以填写此媒体的简易说明
    -l  # L的小写,指定level,有0~9共10个等级,默认为0,即完整备份
    -f  # 后面接产生的文件和destination file。如/dev/st0设备文件名或其他一般文件文件名
    -I  # 大写的i,从/var/lib/xfsdump/inventory列出目前备份的信息状态
    
  • 使用限制

    必须用root权限
    只能备份已挂载的文件系统
    只能备份xfs文件系统
    只能用xfsrestore解释
    透过文件系统的UUID来分辨备份档,因此不能备份相同UUID的文件系统
    

13.6.3 数据恢复xfsrestore

  • 安装命令

    [root@ccc ~]# yum install -y xfsrestore
    

13.6.4 xfsdump备份与xfsrestore恢复

  • 数据备份

    # 1、先做全量备份,切记[备份的原路径]末尾不要加做斜杠/
    xfsdump -l 0 -L sdb1_bak -M sdb1_bak -f 全量备份的成果路径1 备份的源路径
    
    # 2、再做增量备份
    xfsdump -l 1 -L sdb1_bak -M sdb1_bak -f 增量备份的成果路径2 备份的源路径
    xfsdump -l 1 -L sdb1_bak -M sdb1_bak -f 增量备份的成果路径3 备份的源路径
    xfsdump -l 1 -L sdb1_bak -M sdb1_bak -f 增量备份的成果路径4 备份的源路径
    
  • 数据恢复

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

13.6.5 示例

  • 数据备份

    # 1、准备一个分区并制作好xfs文件系统,挂载好后给他加一点初始数据
    [root@ccc ~]# df
    文件系统         1K-块    已用    可用 已用% 挂载点
    ...
    /dev/sdb1      1038336   32996 1005340    4% /opt
    [root@ccc ~]# cp -r /etc/ /opt/
    [root@ccc ~]# echo "111" > /opt/1.txt
    [root@ccc ~]# ls /opt/
    1.txt  etc
    
    # 2、制作全量备份
    [root@ccc ~]# xfsdump -l 0 -L sdb1_bak -M sdb1_bak -f /all.bak /opt
    
    # 3、在/opt下新增文件2.txt,然后做增量备份
    [root@ccc ~]# echo "222" > /opt/2.txt
    [root@ccc ~]# xfsdump -l 1 -L sdb1_bak -M sdb1_bak -f /add1.bak /opt
    
    # 4、在/opt下新增文件3.txt,然后做增量备份
    [root@ccc ~]# echo "222" > /opt/2.txt
    [root@ccc ~]# xfsdump -l 1 -L sdb1_bak -M sdb1_bak -f /add2.bak /opt
    
    # 5、查看备份文件大小
    [root@ccc ~]# du -sh /opt/
    32M	/opt/
    [root@ccc ~]# ll -h /all.bak 
    -rw-r--r-- 1 root root 29M 11月  8 20:09 /all.bak
    [root@ccc ~]# ll -h /add1.bak 
    -rw-r--r-- 1 root root 22K 11月  8 20:18 /add1.bak
    [root@ccc ~]# ll -h /add2.bak 
    -rw-r--r-- 1 root root 23K 11月  8 20:19 /add2.bak
    
  • 数据恢复

    [root@ccc ~]# rm -rf /opt/*
    [root@ccc ~]# ll /opt/
    总用量 0
    [root@ccc ~]# xfsrestore -f /all.bak /opt/
    ...
    [root@ccc ~]# ls /opt/
    1.txt  etc
    [root@ccc ~]# xfsrestore -f /add1.bak /opt/
    ...
    [root@ccc ~]# ls /opt/
    1.txt  2.txt  etc
    [root@ccc ~]# xfsrestore -f /add2.bak /opt/
    ...
    [root@ccc ~]# ls /opt
    1.txt  2.txt  3.txt  etc
    

13.7 LVM

13.7.1 lvm简介

  • lvm介绍

    逻辑管理卷LVM是硬盘的一个系统工具。

    通过LVM技术可以屏蔽磁盘分区的底层差异,在逻辑上给文件系统提供一个卷的概念,在卷上建议相应文件系统。

    物理卷(PV):physical volume把常规的磁盘设备通过pvcreate命令对其进行初始化,形成物理卷,也就是硬盘或分区。(比作面粉)

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

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

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

  • 使用lvm的原因

    fdisk、gdisk工具对磁盘分区是把分区大小固定死的

    如果分区设置的过大,白白浪费磁盘空间

    如果分区设置的过小,会导致空间不够用的情况出现

  • lvm优缺点

    优点:

    1、可以在系统运行的状态下动态扩展文件系统的大小

    2、文件系统可以跨多个磁盘,因此文件系统大小不会受到物理磁盘的限制

    3、可以增加新的磁盘到LVM存储池中

    4、可以以镜像的方式冗余重要的数据到多个物理磁盘

    5、可以方便的导出整个卷组到另一台机器

    缺点:

    1、因为有额外的操作,存储性能受到影响

    2、当卷组的一个磁盘损坏时,整个卷组都会受到影响

    ​ LVM有一个磁盘损坏,整个LVM都坏了,LVM只有动态扩展作用

    ​ 解决措施:底层用RAID+上层LVM=既有冗余又有动态扩展

    3、从卷组中移除一个磁盘时必须使用reducevg命令(要求root权限,且不允许在快照卷组中使用)

13.7.2 lvm基本使用

  • 下载安装软件包

    [root@ccc ~]# yum install -y lvm2
    
  • 制作pv:可以对分区做,也可以对整块盘做

    # 1、制作
    [root@ccc ~]# pvcreate /dev/sdb1
    WARNING: xfs signature detected on /dev/sdb1 at offset 0. Wipe it? [y/n]: y
      Wiping xfs signature on /dev/sdb1.
      Physical volume "/dev/sdb1" successfully created.
    [root@ccc ~]# pvcreate /dev/sdb2
      Wiping xfs signature on /dev/sdb2.
      Physical volume "/dev/sdb2" successfully created.
    [root@ccc ~]# pvcreate /dev/sdb3
      Wiping swap signature on /dev/sdb3.
      Physical volume "/dev/sdb3" successfully created.
    
    # 2、查看
    [root@ccc ~]# pvs
      PV         VG Fmt  Attr PSize PFree
      /dev/sdb1     lvm2 ---  1.00g 1.00g
      /dev/sdb2     lvm2 ---  1.00g 1.00g
      /dev/sdb3     lvm2 ---  1.00g 1.00g
    [root@ccc ~]# pvscan
      PV /dev/sdb2                      lvm2 [1.00 GiB]
      PV /dev/sdb3                      lvm2 [1.00 GiB]
      PV /dev/sdb1                      lvm2 [1.00 GiB]
      Total: 3 [3.00 GiB] / in use: 0 [0   ] / in no VG: 3 [3.00 GiB]
    
  • 制作vg:将pv划入vg中

    # 制作一个vg1(包含/dev/sdb1和/dev/sdb2两个pv)
    [root@ccc ~]# vgcreate vg1 /dev/sdb1 /dev/sdb2
      Volume group "vg1" successfully created
    [root@ccc ~]# vgs
      VG  #PV #LV #SN Attr   VSize VFree
      vg1   2   0   0 wz--n- 1.99g 1.99g
    
    # 制作vg2(包含/dev/sdb3一个pv)
    [root@ccc ~]# vgcreate vg2 /dev/sdb3
      Volume group "vg2" successfully created
    [root@ccc ~]# vgs
      VG  #PV #LV #SN Attr   VSize    VFree   
      vg1   2   0   0 wz--n-    1.99g    1.99g
      vg2   1   0   0 wz--n- 1020.00m 1020.00m
    
  • 创建逻辑卷lvm

    选项

    -L # 逻辑卷大小

    -n # 逻辑卷名字

    # 从vg1中分出来逻辑卷lv1_from_vg1、lv2_from_vg1
    [root@ccc ~]# lvcreate -L 100M -n lv1_from_vg1 vg1
      Logical volume "lv1_from_vg1" created.
    [root@ccc ~]# lvcreate -L 200M -n lv2_from_vg1 vg1
      Logical volume "lv2_from_vg1" created.
    
    # 从vg2中分出来逻辑卷lv1_from_vg2、lv2_from_vg2
    [root@ccc ~]# lvcreate -L 300M -n lv1_from_vg2 vg2
      Logical volume "lv1_from_vg2" created.
    [root@ccc ~]# lvcreate -L 400M -n lv2_from_vg2 vg2
      Logical volume "lv2_from_vg2" created.
    
    # 查看
    [root@ccc ~]# lvs
      LV           VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      lv1_from_vg1 vg1 -wi-a----- 100.00m 
      lv2_from_vg1 vg1 -wi-a----- 200.00m 
      lv1_from_vg2 vg2 -wi-a----- 300.00m 
      lv2_from_vg2 vg2 -wi-a----- 400.00m 
    
  • 格式与挂载

    [root@ccc ~]# mkfs.xfs /dev/vg1/lv1_from_vg1 
    [root@ccc ~]# mkfs.xfs /dev/vg1/lv2_from_vg1 
    [root@ccc ~]# mkfs.xfs /dev/vg2/lv1_from_vg2
    [root@ccc ~]# mkfs.xfs /dev/vg2/lv2_from_vg2 
    
    [root@ccc ~]# mount /dev/vg1/lv1_from_vg1 /test1/
    [root@ccc ~]# mount /dev/vg1/lv2_from_vg1 /test2/
    [root@ccc ~]# mount /dev/vg2/lv1_from_vg2 /test3/
    [root@ccc ~]# mount /dev/vg2/lv2_from_vg2 /test4/
    
    # 查看
    [root@ccc ~]# df
    文件系统                       1K-块    已用    可用 已用% 挂载点
    ...
    /dev/mapper/vg1-lv1_from_vg1   98980    5344   93636    6% /test1
    /dev/mapper/vg1-lv2_from_vg1  201380   10464  190916    6% /test2
    /dev/mapper/vg2-lv1_from_vg2  303780   15584  288196    6% /test3
    /dev/mapper/vg2-lv2_from_vg2  406180   20704  385476    6% /test4
    

13.7.3 在线动态扩容

  • 命令

    lvextend -L [+]MGT /dev/VG_NAME/VL_NAME
    # -L 100M与-L +100M不是一个意思,+100M代表在原有基础上扩容
    
  • 示例

    [root@ccc ~]# lvextend -L +100M /dev/vg1/lv2_from_vg1 
      Size of logical volume vg1/lv2_from_vg1 changed from 200.00 MiB (50 extents) to 300.00 MiB (75 extents).
      Logical volume vg1/lv2_from_vg1 successfully resized.
    [root@ccc ~]# lvs
      LV           VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      lv1_from_vg1 vg1 -wi-ao---- 100.00m
      lv2_from_vg1 vg1 -wi-ao---- 300.00m                                   
      lv1_from_vg2 vg2 -wi-ao---- 300.00m                                   
      lv2_from_vg2 vg2 -wi-ao---- 400.00m    
    [root@ccc ~]# xfs_growfs /dev/vg1/lv1_from_vg1   # 扩展逻辑卷后需更新xfs文件系统
    

13.7.4 在线动态缩容与删除

  • !!!!!!!!!!!!!!!不要缩容!!!!!!!!!!!!!

  • xfs不支持缩容

    lvreduce -L [-]MGT /dev/VG_NAME/LV_NAME  # 缩减逻辑卷
    
  • 删除

    # 删除lv之前需先卸载挂载点
    [root@ccc ~]# umount /test1
    [root@ccc ~]# lvremove /dev/vg1/lv1_from_vg1 
    Do you really want to remove active logical volume vg1/lv1_from_vg1? [y/n]: y
      Logical volume "lv1_from_vg1" successfully removed
    [root@ccc ~]# umount /test2
    [root@ccc ~]# lvremove /dev/vg1/lv2_from_vg1 -y
      Logical volume "lv2_from_vg1" successfully removed
    
    # 删除vg
    [root@ccc ~]# vgremove vg1
      Volume group "vg1" successfully removed
    
    # 删pv:只能删掉不属于任何vg的pv
    [root@ccc ~]# pvremove /dev/sdb1
      Labels on physical volume "/dev/sdb1" successfully wiped.
    

13.7.5 快照

  • lvm的快照功能采用写时复制技术(Copy-On-Write,COW)

  • 创建快照时不用停止服务即可对数据进行备份

  • 快照本质是特殊的lv,创建快照后会将老数据赋给快照空间

    # 准备初始数据
    [root@ccc ~]# df
    文件系统                       1K-块    已用    可用 已用% 挂载点
    ...
    /dev/mapper/vg1-lv1_from_vg1   98980    5344   93636    6% /test1
    [root@ccc ~]# echo 111 > /test1/1.txt
    
    # 查看vg1容量是否充足
    [root@ccc ~]# vgs
      VG  #PV #LV #SN Attr   VSize   VFree 
      vg1   1   1   0 wz--n- <10.00g <9.90g
    
    # 在vg1卷里创建一个lv1_from_vg1的快照
    [root@ccc ~]# lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1 
      Reducing COW size 1.00 GiB down to maximum usable size 104.00 MiB.
      Logical volume "lv1_from_vg1_snap" created.
    
    # 查看
    [root@ccc ~]# 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                                   
    # 修改文件/test/1.txt
    [root@ccc ~]# echo 11111111 >> /test1/1.txt 
    [root@ccc ~]# cat /test1/1.txt 
    111
    11111111
    
    # 恢复数据
    # 挂载快照,和原来lvm使用同一个UUID,不被xfs允许,需加选项-o nouuid
    [root@ccc ~]# mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
    [root@ccc ~]# cat /opt/1.txt 
    111
    [root@ccc ~]# cp /opt/1.txt /test1/1.txt 
    cp:是否覆盖"/test1/1.txt"? y
    [root@ccc ~]# cat /test1/1.txt 
    111
    
  • 要恢复的文件个数过多,直接合并

    [root@ccc ~]# mount /dev/vg1/lv1_freom_vg1 /test1
    [root@ccc ~]# echo ccc > /test1/2.txt
    [root@ccc ~]# cat /test1/2.txt 
    ccc
    [root@ccc ~]# lvcreate -L 1G -n lv1_from_vg1_snap /dev/vg1/lv1_freom_vg1 
      Volume group name expected (no slash)
      Run `lvcreate --help' for more information.
    [root@ccc ~]# lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_freom_vg1 
      Reducing COW size 1.00 GiB down to maximum usable size 104.00 MiB.
      Logical volume "lv1_from_vg1_snap" created.
    [root@ccc ~]# echo 1111 >> /test1/2.txt 
    [root@ccc ~]# echo 1111 >> /test1/2.txt 
    [root@ccc ~]# echo 1111 >> /test1/2.txt 
    [root@ccc ~]# echo 1111 >> /test1/2.txt 
    [root@ccc ~]# cat /test1/2.txt 
    ccc
    1111
    1111
    1111
    1111
    [root@ccc ~]# mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
    [root@ccc ~]# cat /opt/2.txt 
    ccc
    
    # 先卸载数据源与快照,再进行合并,快照是一次性的会自动删除
    [root@ccc ~]# umount /opt/
    [root@ccc ~]# umount /test1/
    [root@ccc ~]# lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_snap 
      Merging of volume vg1/lv1_from_vg1_snap started.
      vg1/lv1_freom_vg1: Merged: 100.00%
    [root@ccc ~]# mount /dev/vg1/lv1_freom_vg1 /test1
    [root@ccc ~]# cat /test1/2.txt 
    ccc
    
posted @ 2020-11-19 12:15  drrug  阅读(206)  评论(0编辑  收藏  举报