Ubuntuでrsyncやddコマンドを使ったバックアップ

外部HDDに特定ディレクトリ以下を丸ごとバックアップする想定の手順に関するメモ

基本構文

基本的に-avオプションをつけておけば良い

> rsync -av …

dir1ディレクトリを、backupディレクトリにコピーする

> rsync -av /usr/temp/dir1 /usr/temp/backup

アーカイブモード(-a)に関して

-aは、下記のオプションをまとめたものになる

 -r : ディレクトリを再帰的にコピーする  
 -l : シンボリックリンクを、そのままシンボリックリンクとしてコピーする  
 -p : パーミッションをそのままコピーする  
 -t : タイムスタンプをそのままコピーする  
 -g : グループをそのままコピーする  
 -o : ファイルオーナー (所有者) をそのままコピーする  
 -D : デバイスファイルやを特殊ファイルを、そのままコピーする  

-v : コピーしたファイル名や、コピーしたバイト数などの転送情報を表示するオプション

コピー元の末尾にスラッシュ(/)をつける場合とつけない場合の違い

  • スラッシュ(/)付き
    コピー元ディレクトリの中身がコピーされる
rsync -av /usr/temp/dir1/ /usr/temp/backup
--------------------
usr
└temp
  └backup
    └A
  • スラッシュ(/)なし
    コピー元のディレクトリがコピーされる
rsync -av /usr/temp/dir1 /usr/temp/backup
--------------------
usr
└temp
  └backup
    └dir1
     └A
  • –delete
    –deleteオプションを追加すると、コピー元で削除されたファイルが、コピー先でも削除される
    つまり同期されるようになる。このオプションを付けないと、コピー先は増えていく一方である。
> rsync -av --delete dir/ backup
  • –dry-run
    実際のコピーや削除は行われない。テストモード。
> rsync -av --delete --dry-run dir/ backup

nohupでログアウトしてもバックアップし続けるようにする

&はスペースを空けないで付けること

> sudo nohup rsync -av /home /media/hdd/BACKUP&

rsyncコマンドの備忘録

外部HDD(sdb1)を/media/hddにマウントし、rsyncで同期コピーする。
またrsyncはnohupで実行する。

> sudo mount /dev/sdb1 /media/hdd/
> cd /
> sudo nohup rsync -av --delete --exclude "media" / /media/hdd/BACKUP&
> sudo umount /dev/sdb1

ddコマンドについて

rsyncについてはディレクトリやファイルをコピーするイメージだが、ddコマンドはハードディスクのセクターをコピーするようなコマンド。ハードディスクを丸ごとコピーするのに向いている。なので、1TBのハードディスクの場合、1MBファイルが1個しかなくても1TB丸ごとコピーすることになる。

ddコマンドの使い方

> dd if=[コピー元デバイス] of=[コピー先デバイス] bs=[バッファ] conv=[オプション]

注意点としては、コピー先のデバイスはマウントしてない状態で実行する必要がある。また、デバイスファイル名はlsblkコマンドなどで確認する。

以下の場合、通常使用しているのが、/dev/sdaでバックアップ用に接続したHDDが/dev/sdbとなる。いくつかのパーティションに区切られているが、ddコマンドではお構いなしに丸ごと上書きする。

> lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  1.8T  0 disk
├─sda1   8:1    0 59.6G  0 part /
├─sda2   8:2    0    1K  0 part
├─sda5   8:5    0  7.5G  0 part [SWAP]
└─sda6   8:6    0  1.8T  0 part /home
sdb      8:16   0  1.8T  0 disk
├─sdb1   8:17   0 59.6G  0 part
├─sdb2   8:18   0    1K  0 part
├─sdb5   8:21   0  7.5G  0 part
└─sdb6   8:22   0  1.8T  0 part

あと、オプションに関しては、bsで指定するバッファサイズは大きくなるほど転送時間が短くなるようで、とりあえず64kぐらいを目安にしている。convで指定するオプションとしてはnoerrorsyncが一般的のようである。(エラーが発生しても続行する)

上記を踏まえて普段使用するコマンドは以下になる

> sudo dd if=/dev/sda of=/dev/sdb bs=64k conv=noerror,sync

ちなみに進捗を表示する機能がないようで、以下のように別のコンソールからコマンドを実行すると、進捗具合が表示される。

> sudo killall -USR1 dd