1. 程式人生 > 實用技巧 >第11組 Beta衝刺 (3/5)

第11組 Beta衝刺 (3/5)

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