09/24/2017, 11:55 PM GMT+9

自宅サーバ(CentOS7)のバックアップをとる

はじめに

間違いを発見された場合は、Cosnomiまでご連絡ください。

追記: この一般的なバックアップ方法では、稼働中サービスをすべて終了してからでないとバックアップデータに不整合が生じる可能性があります。オンラインバックアップ(サービスを動かしたままバックアップすること)に興味がある方は、 CentOS7 で LVM のスナップショットを用いたオンラインバックアップをとる  も併せて御覧ください。

バックアップの重要性

バックアップを取ることは重要だと理解はしていても、自宅サーバーのバックアップとなると容量も大きく時間がかかりますし、rotateも必要となり面倒に感じてしまいます。今まで私もバックアップについて、その重要性をなんとなく理解しつつもたまに手動でバックアップを取る程度でしたが、今朝、データを全部失った夢から覚め最悪の気分になったので、この際ですしバックアップ作業を自動化し、二度とあの悪夢を見ることのないようにしてしまいましょう。

目的

HDD全体のデータをバックアップして、今のHDDが故障したときにデータ/システムを素早く復旧できるようにしたい。(特定領域ではなく全体をカバーすることで、そのまま入れ替えができるようになる。)

準備

  • 新しいHDD コスパ重視で DSC00855 300x201
  • SATAケーブル 意外と忘れがち DSC00858 300x201

方法

データを復元できれば良いので、愚直に圧縮もありですが、より便利な手段として、ファイルシステムごとバックアップするdumpというコマンドがあります。dumpコマンドはフルバックアップのみならず、差分バックアップが可能な点などで優れています。ですので、今回は dump コマンドを使ってバックアップを取ってみたいと思います。

ファイルシステムを調べる

[[email protected] ~]$ 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について調べます。 [[email protected] ~]$ 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つのパーティションにしてしまいます。

[[email protected] ~]$ 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 でフォーマットします

[[email protected] ~]$ 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 の使い方

まず、シングルユーザモードにします。これは、バックアップ中にファイルが変更されることで、整合性が取れなくなったり、バックアップデータが破壊されたりするのを避けるためです。

[[email protected] 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コマンドを使います。

今後の課題

最後までお読みいただきありがとうございました。


Cosnomi
Cosnomi

コンピュータ(Web, 機械学習など)が好きな医学部生

Twitter / GitHub