Linux中XFS檔案系統的備份,恢復,修復

安全劍客發表於2020-11-26

XFS檔案系統是矽谷圖形公司(Silicon Graphics Inc,簡稱SGI)開發的用於IRIX(一個UNIX作業系統)的檔案系統,後將XFS移植到 作業系統上。XFS是高階日誌檔案系統,其特點極具伸縮性,同時也很健壯。2000年5月XFS透過GNU通用公共許可證移植到 Linux系統 上,透過十多年的不斷修改已經成為一款非常成熟的檔案系統。在多項針對XFS的效能測試上,XFS都取得了不俗的成績,高併發環境下甚至已經超過ext4。

 

一、XFS檔案系統的備份與恢復

XFS檔案系統提供了整個分割槽備份的工具xfsdump供使用者使用,使用者可以在不借助第三方軟體的情況下對XFS檔案系統上的資料實施備份。

建立XFS分割槽及測試檔案

[root@localhost ~]# ls /dev/sd*

/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb

[root@localhost ~]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.23.2).

 

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

 

 

Command (m for help): p

 

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x08a5199d

 

   Device Boot      Start         End      Blocks   Id  System

 

Command (m for help): n

Partition type:

   p   primary (0 primary, 0 extended, 4 free)

   e   extended

Select (default p): p

First sector (2048-41943039, default 2048):

Using default value 2048

Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +1G

Partition 1 of type Linux and of size 1 GiB is set

 

Command (m for help): p

 

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x08a5199d

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1            2048     2099199     1048576   83  Linux

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

Syncing disks.

[root@localhost ~]# partprobe

Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.

[root@localhost ~]# ls /dev/sd*

/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1

[root@localhost ~]# mkfs.xfs -f /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@localhost ~]# blkid /dev/sdb1      

/dev/sdb1: UUID="61a5e59d-92d3-458d-ac09-7d945469cda6" TYPE="xfs"

[root@localhost ~]# mkdir /file

[root@localhost ~]# echo "/dev/sdb1 /file xfs defaults 0 0" >> /etc/fstab

[root@localhost ~]# mount -a

[root@localhost ~]# df -h

Filesystem             Size  Used Avail Use% Mounted on

/dev/mapper/rhel-root   17G  1.9G   16G  12% /

devtmpfs               901M     0  901M   0% /dev

tmpfs                  912M     0  912M   0% /dev/shm

tmpfs                  912M  8.7M  903M   1% /run

tmpfs                  912M     0  912M   0% /sys/fs/cgroup

/dev/sr0               3.8G  3.8G     0 100% /yum

/dev/sda1             1014M  143M  872M  15% /boot

tmpfs                  183M     0  183M   0% /run/user/0

/dev/sdb1             1014M   33M  982M   4% /file

[root@localhost ~]# cd /file/

[root@localhost file]# ls

[root@localhost file]# touch file{1..100}

[root@localhost file]# ls

file1    file16  file23  file30  file38  file45  file52  file6   file67  file74  file81  file89  file96

file10   file17  file24  file31  file39  file46  file53  file60  file68  file75  file82  file9   file97

file100  file18  file25  file32  file4   file47  file54  file61  file69  file76  file83  file90  file98

file11   file19  file26  file33  file40  file48  file55  file62  file7   file77  file84  file91  file99

file12   file2   file27  file34  file41  file49  file56  file63  file70  file78  file85  file92

file13   file20  file28  file35  file42  file5   file57  file64  file71  file79  file86  file93

file14   file21  file29  file36  file43  file50  file58  file65  file72  file8   file87  file94

file15   file22  file3   file37  file44  file51  file59  file66  file73  file80  file88  file95

備份XFS分割槽

[root@localhost file]# mkdir /backup  

[root@localhost file]# yum install -y xfsdump

[root@localhost file]# xfsdump -f /backup/file.bak /file

# 利用 xfsdump 備份掛載點 /file 對應的分割槽

xfsdump: using file dump (drive_simple) strategy

xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control

 

 ============================= dump label dialog ==============================

# 輸入 dump 會話標籤

please enter label for this dump session (timeout in 300 sec)

 -> file.bak

session label entered: "file.bak"

 

 --------------------------------- end dialog ---------------------------------

 

xfsdump: level 0 dump of localhost.localdomain:/file

xfsdump: dump date: Thu Oct 31 22:16:02 2019

xfsdump: session id: 02a1445f-5ff3-4518-ab2c-888d9e2a4c44

xfsdump: session label: "file.bak"

xfsdump: ino map phase 1: constructing initial dump list

xfsdump: ino map phase 2: skipping (no pruning necessary)

xfsdump: ino map phase 3: skipping (only one dump stream)

xfsdump: ino map construction complete

xfsdump: estimated dump size: 52800 bytes

 

 ============================= media label dialog =============================

# 輸入媒體標籤

please enter label for media in drive 0 (timeout in 300 sec)

 -> file

media label entered: "file"

 

 --------------------------------- end dialog ---------------------------------

 

xfsdump: creating dump session media file 0 (media 0, file 0)

xfsdump: dumping ino map

xfsdump: dumping directories

xfsdump: dumping non-directory files

xfsdump: ending media file

xfsdump: media file size 86544 bytes

xfsdump: dump size (non-dir files) : 0 bytes

xfsdump: dump complete: 27 seconds elapsed

xfsdump: Dump Summary:

xfsdump:   stream 0 /backup/file.bak OK (success)

xfsdump: Dump Status: SUCCESS

[root@localhost file]# ls /backup/

# 已經成功建立備份檔案

file.bak

恢復過程

[root@localhost file]# ls

file1    file16  file23  file30  file38  file45  file52  file6   file67  file74  file81  file89  file96

file10   file17  file24  file31  file39  file46  file53  file60  file68  file75  file82  file9   file97

file100  file18  file25  file32  file4   file47  file54  file61  file69  file76  file83  file90  file98

file11   file19  file26  file33  file40  file48  file55  file62  file7   file77  file84  file91  file99

file12   file2   file27  file34  file41  file49  file56  file63  file70  file78  file85  file92

file13   file20  file28  file35  file42  file5   file57  file64  file71  file79  file86  file93

file14   file21  file29  file36  file43  file50  file58  file65  file72  file8   file87  file94

file15   file22  file3   file37  file44  file51  file59  file66  file73  file80  file88  file95

[root@localhost file]# rm -rf *

[root@localhost file]# ls

[root@localhost file]# xfsrestore -f /backup/file.bak /file

xfsrestore: using file dump (drive_simple) strategy

xfsrestore: version 3.1.4 (dump format 3.0) - type ^C for status and control

xfsrestore: searching media for dump

xfsrestore: examining media file 0

xfsrestore: dump description:

xfsrestore: hostname: localhost.localdomain

xfsrestore: mount point: /file

xfsrestore: volume: /dev/sdb1

xfsrestore: session time: Thu Oct 31 22:16:02 2019

xfsrestore: level: 0

xfsrestore: session label: "file.bak"

xfsrestore: media label: "file"

xfsrestore: file system id: 61a5e59d-92d3-458d-ac09-7d945469cda6

xfsrestore: session id: 02a1445f-5ff3-4518-ab2c-888d9e2a4c44

xfsrestore: media id: 2d1d9f33-dff3-4cfa-a2f6-bf65bd8f242b

xfsrestore: using online session inventory

xfsrestore: searching media for directory dump

xfsrestore: reading directories

xfsrestore: 1 directories and 100 entries processed

xfsrestore: directory post-processing

xfsrestore: restoring non-directory files

xfsrestore: restore complete: 0 seconds elapsed

xfsrestore: Restore Summary:

xfsrestore:   stream 0 /backup/file.bak OK (success)

xfsrestore: Restore Status: SUCCESS

[root@localhost file]# ls

# 已經成功恢復被刪除的檔案

file1    file16  file23  file30  file38  file45  file52  file6   file67  file74  file81  file89  file96

file10   file17  file24  file31  file39  file46  file53  file60  file68  file75  file82  file9   file97

file100  file18  file25  file32  file4   file47  file54  file61  file69  file76  file83  file90  file98

file11   file19  file26  file33  file40  file48  file55  file62  file7   file77  file84  file91  file99

file12   file2   file27  file34  file41  file49  file56  file63  file70  file78  file85  file92

file13   file20  file28  file35  file42  file5   file57  file64  file71  file79  file86  file93

file14   file21  file29  file36  file43  file50  file58  file65  file72  file8   file87  file94

file15   file22  file3   file37  file44  file51  file59  file66  file73  file80  file88  file95

二、XFS檔案系統的檢查和修復

建立XFS測試分割槽

[root@localhost file]# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.23.2).

 

Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.

 

 

Command (m for help): p

 

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x08a5199d

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1            2048     2099199     1048576   83  Linux

 

Command (m for help): n

Partition type:

   p   primary (1 primary, 0 extended, 3 free)

   e   extended

Select (default p): p

Partition number (2-4, default 2):

First sector (2099200-41943039, default 2099200):

Using default value 2099200

Last sector, +sectors or +size{K,M,G} (2099200-41943039, default 41943039): +1G

Partition 2 of type Linux and of size 1 GiB is set

 

Command (m for help): p

 

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x08a5199d

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1            2048     2099199     1048576   83  Linux

/dev/sdb2         2099200     4196351     1048576   83  Linux

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

 

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.

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)

Syncing disks.

[root@localhost file]# partprobe

Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0 has been opened read-only.

[root@localhost file]# ls /dev/sd*

/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1  /dev/sdb2

[root@localhost file]# 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

檢查XFS檔案系統,如果檢查過程中發現問題將會列出

[root@localhost file]# xfs_repair -n /dev/sdb2

Phase 1 - find and verify superblock...

Phase 2 - using internal log

        - zero log...

        - scan filesystem freespace and inode maps...

        - found root inode chunk

Phase 3 - for each AG...

        - scan (but don't clear) agi unlinked lists...

        - process known inodes and perform inode discovery...

        - agno = 0

        - agno = 1

        - agno = 2

        - agno = 3

        - process newly discovered inodes...

Phase 4 - check for duplicate blocks...

        - setting up duplicate extent list...

        - check for inodes claiming duplicate blocks...

        - agno = 0

        - agno = 1

        - agno = 2

        - agno = 3

No modify flag set, skipping phase 5

Phase 6 - check inode connectivity...

        - traversing filesystem ...

        - traversal finished ...

        - moving disconnected inodes to lost+found ...

Phase 7 - verify link counts...

No modify flag set, skipping filesystem flush and exiting.

自動檢查並修復XFS檔案系統

[root@localhost file]# xfs_repair /dev/sdb2        

Phase 1 - find and verify superblock...

Phase 2 - using internal log

        - zero log...

        - scan filesystem freespace and inode maps...

        - found root inode chunk

Phase 3 - for each AG...

        - scan and clear agi unlinked lists...

        - process known inodes and perform inode discovery...

        - agno = 0

        - agno = 1

        - agno = 2

        - agno = 3

        - process newly discovered inodes...

Phase 4 - check for duplicate blocks...

        - setting up duplicate extent list...

        - check for inodes claiming duplicate blocks...

        - agno = 0

        - agno = 1

        - agno = 2

        - agno = 3

Phase 5 - rebuild AG headers and trees...

        - reset superblock...

Phase 6 - check inode connectivity...

        - resetting contents of realtime bitmap and summary inodes

        - traversing filesystem ...

        - traversal finished ...

        - moving disconnected inodes to lost+found ...

Phase 7 - verify and correct link counts...

done

 

原文來自:

原文連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2737047/,如需轉載,請註明出處,否則將追究法律責任。

相關文章