a
はじめに
間違いを発見された場合は、Cosnomiまでご連絡ください。
追記: このバックアップ方法では、稼働中サービスをすべて終了してからでないとバックアップデータに不整合が生じるかもしれません。オンラインバックアップ(サービスを動かしたままバックアップすること)に興味がある方は、 CentOS7 で LVM のスナップショットを用いたオンラインバックアップをとる も併せて御覧ください。
バックアップの重要性
バックアップを取ることは重要だと理解はしていても、自宅サーバーのバックアップとなると容量も大きく時間がかかりますし、rotateも必要となり面倒に感じてしまいます。今まで私もバックアップについて、その重要性をなんとなく理解しつつもたまに手動でバックアップを取る程度でしたが、今朝、データを全部失った夢から覚め最悪の気分になったので、この際ですしバックアップ作業を自動化し、二度とあの悪夢を見ることのないようにしてしまいましょう。
目的
HDD全体のデータをバックアップして、今のHDDが故障したときにデータ/システムを素早く復旧できるようにしたい。(特定領域ではなく全体をカバーすることで、そのまま入れ替えができるようになる。)
準備
- 新しいHDD コスパ重視で
- SATAケーブル 意外と忘れがち
方法
データを復元できれば良いので、愚直に圧縮もありですが、より便利な手段として、ファイルシステムごとバックアップするdump
というコマンドがあります。dumpコマンドはフルバックアップのみならず、差分バックアップが可能な点などで優れています。ですので、今回はdumpコマンドを使ってバックアップを取ってみたいと思います。
ファイルシステムを調べる
[cosnomi@server1 ~]$ df -T
ファイルシス タイプ 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/cl-root xfs 52403200 9431512 42971688 18% /
devtmpfs devtmpfs 3908384 0 3908384 0% /dev
tmpfs tmpfs 3924600 4 3924596 1% /dev/shm
tmpfs tmpfs 3924600 25716 3898884 1% /run
tmpfs tmpfs 3924600 0 3924600 0% /sys/fs/cgroup
/dev/sda1 xfs 505580 313416 192164 62% /boot
/dev/mapper/cl-home xfs 1891714580 169446112 1722268468 9% /home
tmpfs tmpfs 784924 12 784912 1% /run/user/42
tmpfs tmpfs 784924 0 784924 0% /run/user/0
今回バックアップを取りたいのは、rootとhomeとbootなので、ファイルシステムはxfsです。
ここで注意点ですが、dump
はext2/ext3/ext4ファイルシステムでしか使えません。しかし、xfs版のdumpコマンドである xfsdump
というコマンドがあるので、こちらを使えば問題ありません。この2つのコマンドはほとんど同じですが、オプションが違ったりするので注意が必要です。
HDD のマウント
fdisk
を使って、バックアップデータを保存するHDDについて調べます。
[cosnomi@server1 ~]$ sudo fdisk -l
Disk /dev/sda: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0x0002a646
デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 3907028991 1953001472 8e Linux LVM
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
<<以下略>>
新しく接続したHDD(=バックアップデータを保存するHDD)は /dev/sdb
だということが分かりました。
ということで、そちらにパーティションを作成します。バックアップ用なので丸々1つのパーティションにしてしまいます。
[cosnomi@server1 ~]$ sudo 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.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x4ecc4294.
The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
コマンド (m でヘルプ): p
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0x4ecc4294
デバイス ブート 始点 終点 ブロック Id システム
コマンド (m でヘルプ): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
パーティション番号 (1-4, default 1): 1
最初 sector (2048-3907029167, 初期値 2048):
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-3907029167, 初期値 3907029167):
初期値 3907029167 を使います
Partition 1 of type Linux and of size 1.8 TiB is set
コマンド (m でヘルプ): p
Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0x09a1616d
デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 2048 3907029167 1953513560 83 Linux
コマンド (m でヘルプ): w
パーティションテーブルは変更されました!
ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
xfsでフォーマットします。
[cosnomi@server1 ~]$ sudo mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=122094598 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=488378390, imaxpct=5
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=238466, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
これで新しいHDDの準備は完了です。
xfsdump の使い方
まず、シングルユーザモードにします。これは、バックアップ中にファイルが変更されて、整合性が取れなくなるのを避けるためです。
[cosnomi@server1 mnt]$ sudo init 1
次に、xfsdump
コマンドで実際にバックアップを取ります。
xfsdump -M home -L backup -l 0 -u -f /mnt/backup1/home.dump /dev/mapper/cl-home
先頭から説明すると、-M
でメディアラベル?の指定、-L
でセッションラベルの指定ができます。
-lはレベルを設定するオプションで、フルバックアップのときは0を指定します。1以上は差分バックアップのためで、1を指定すると0との差分が、2を指定すると2より小さい(1または0)との差分が保存されます。レベルは9まで指定できます。-u
はログを残します。-f
でバックアップしたデータの保存先を指定します。最後に、df -T
で調べたバックアップしたいファイルシステムのパスを指定します。
まとめると、大事なオプションはバックアップレベルの -l
と保存先の -f
ですね。
バックアップデータの圧縮についてです。dumpコマンドでは -z
オプションを使ってダンプファイルを圧縮できますが、xfsdumpではできないようです。したがって、一度、生の大きさのファイルを出力してから、それをtarなどで圧縮することにしました。
リストア
リストアには xfsrestore
コマンドを使います。
今後の課題
- LVMのスナップショットを使えばシングルユーザーモードに入らなくても整合性を失わずにバックアップが取れるはず取りました! (CentOS7 で LVM のスナップショットを用いたオンラインバックアップをとる)
- 自動化してcronで定期的に呼びたい→ 書きました!http://blog.cosnomi.com/archives/859
最後までお読みいただきありがとうございました。