xfs_copyコマンドの使い方

#1 xfs_copyコマンドとは?
xfsファイルシステムをコピーするコマンドです。
コピー元の属性(inode番号等)を維持したまコピーすることができます。
ここでは、`/dev/loop0`に作成したxfsファイルシステムを
`/dev/loop1`にコピーしてみます。


#2 検証環境
VMware Workstation 14 Player上の仮想マシンを使いました。
仮想マシンは、「最小限のインストール」->「開発ツール」を選択して作成しました。

```console:OS版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

[root@server ~]# uname -r
3.10.0-693.el7.x86_64
```

```console:コマンド版数
[root@server ~]# xfs_copy -V
xfs_copy version 4.5.0
```

#3 オプション一覧

```
[root@server ~]# xfs_copy
Usage: xfs_copy [-bdV] [-L logfile] source target [target ...]
```

#4 事前準備(テスト用のXFSファイルシステム作成)
ループデバイスに使用するファイルを作成します。
fallocateコマンドの使い方は、[ここ(すぐ忘れてしまう、仕事で使う技)](https://qiita.com/hana_shin/items/53c3c78525c9c758ae7c)を参照してください。

```console:ファイルの作成
[root@server ~]# fallocate -l 100M disk1.img
[root@server ~]# fallocate -l 100M disk2.img
```

作成したファイルを確認します。

```console:ファイルの確認
[root@server ~]# ls -l disk*
-rw-r--r--. 1 root root 104857600  5月 12 19:44 disk1.img
-rw-r--r--. 1 root root 104857600  5月 12 19:44 disk2.img
```

作成したファイルをループデバイスとして登録します。
losetupコマンドの使い方は、[ここ(losetupコマンドの使い方)](https://qiita.com/hana_shin/items/90b3c6fb54b59ebba076)を参照してください。

```console:ループデバイスの作成
[root@server ~]# losetup -f /root/disk1.img
[root@server ~]# losetup -f /root/disk2.img
```

登録したループデバイスを確認してみます。

```console:ループデバイスの確認
[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img
/dev/loop1         0      0         0  0 /root/disk2.img

[root@server ~]# lsblk -fip
NAME        FSTYPE  LABEL           UUID                                 MOUNTPOINT
/dev/sda
|-/dev/sda1 xfs                     7bd0c5ce-21ab-4964-871d-61d04a09cc8c /boot
|-/dev/sda2 swap                    708d5fef-16c1-4e0b-86ae-06e09153b155 [SWAP]
`-/dev/sda3 xfs                     a4951ce9-0d6e-4550-9460-dfbae7ea82c7 /
/dev/sr0    iso9660 CentOS 7 x86_64 2017-09-06-10-51-00-00
/dev/loop0
/dev/loop1
```

`/dev/loop0`にxfsファイルシステムを作成します。

```console:xfsファイルシステムの作成
[root@server ~]# mkfs.xfs /dev/loop0
meta-data=/dev/loop0             isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

`/dev/loop0`にxfsファイルシステムが作成されたことがわかります。
`/dev/loop1`には、ファイルシステムは作成されていません。

```console:デバイスの確認
[root@server ~]# lsblk -fip
NAME        FSTYPE  LABEL           UUID                                 MOUNTPOINT
/dev/sda
|-/dev/sda1 xfs                     7bd0c5ce-21ab-4964-871d-61d04a09cc8c /boot
|-/dev/sda2 swap                    708d5fef-16c1-4e0b-86ae-06e09153b155 [SWAP]
`-/dev/sda3 xfs                     a4951ce9-0d6e-4550-9460-dfbae7ea82c7 /
/dev/sr0    iso9660 CentOS 7 x86_64 2017-09-06-10-51-00-00
/dev/loop0  xfs                     057082a2-c2c6-4efb-8095-decbfac1a311
/dev/loop1
```

/mntに`/dev/loop0`をマウントします。

```console:マウント
[root@server ~]# mount -o loop /dev/loop0 /mnt
```

```console:マウントの確認
[root@server ~]# df -ht xfs
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda3         18G   15G  3.8G   79% /
/dev/sda1       1014M  174M  841M   18% /boot
/dev/loop2        97M  5.2M   92M    6% /mnt
```

マウントしたファイルシステムにファイル(test1.dat)を作成してみます。
inode番号は67、ファイル作成日時は`2019-05-12 19:52:00.736573237`であることがわかります。

```console:ファイルの作成
[root@server ~]# touch /mnt/test1.dat
[root@server ~]# ls -li --full-time /mnt/test1.dat
67 -rw-r--r--. 1 root root 0 2019-05-12 19:52:00.736573237 +0900 /mnt/test1.dat
```

xfs_copyコマンドを実行するには、コピー元をアンマウントする必要があります。

```console:アンマウント
[root@server ~]# umount /mnt
[root@server ~]# df -ht xfs
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda3         18G   15G  3.8G   79% /
/dev/sda1       1014M  174M  841M   18% /boot
```


#5 ファイルシステムのコピー
`/dev/loop0`から`/dev/loop1`にxfsファイルシステムをコピーしてみます。


```console:ファイルシステムのコピー
[root@server ~]# xfs_copy /dev/loop0 /dev/loop1
 0%  ... 10%  ... 20%  ... 30%  ... 40%  ... 50%  ... 60%  ... 70%  ... 80%  ... 90%  ... 100%

All copies completed.
```

 xfs_copyコマンドによって、
`/dev/loop1`にxfsファイルシステムが作成されたことがわかります。

```console:実行結果の確認
[root@server ~]# lsblk -fip
NAME        FSTYPE  LABEL           UUID                                 MOUNTPOINT
/dev/sda
|-/dev/sda1 xfs                     7bd0c5ce-21ab-4964-871d-61d04a09cc8c /boot
|-/dev/sda2 swap                    708d5fef-16c1-4e0b-86ae-06e09153b155 [SWAP]
`-/dev/sda3 xfs                     a4951ce9-0d6e-4550-9460-dfbae7ea82c7 /
/dev/sr0    iso9660 CentOS 7 x86_64 2017-09-06-10-51-00-00
/dev/loop0  xfs                     057082a2-c2c6-4efb-8095-decbfac1a311
/dev/loop1  xfs                     8262eb5d-31a4-4450-9f85-db95788caa8a
```


xfsファイルシステムのコピー先の中身を確認してみます。
ファイル(test1.dat)のinode番号、作成日時がコピー元ファイルと同じであることがわかります。

```console:実行結果確認
[root@server ~]# mount -o loop /dev/loop1 /mnt
[root@server ~]# ls -li --full-time /mnt/test1.dat
67 -rw-r--r--. 1 root root 0 2019-05-12 19:52:00.736573237 +0900 /mnt/test1.dat
```

#Z 参考情報
[XFS ファイルシステムのその他のユーティリティー](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/xfsothers)
[xfs_copy command examples](http://fibrevillage.com/storage/668-xfs-copy-command-examples)
[Beginning Ubuntu Server Administration: From Novice to Professional](https://books.google.co.jp/books?id=zGgZ850Aw5gC&pg=PA93&lpg=PA93&dq=xfs_copy+example&source=bl&ots=6L1pfzyK12&sig=ACfU3U1U0AhW5w22h59uSOsHOfzZsY3XCA&hl=ja&sa=X&ved=2ahUKEwjfnc7S1pXiAhVmEqYKHSEjC4k4ChDoATAGegQICBAB#v=onepage&q=xfs_copy%20example&f=false)