/usrをバックアップ

なんて漠然としたタイトルだろう、と思いつつ。

デバイス   マウントポイント    使用量
/dev/sda1  /boot                 25MB
/dev/sda2  /                     30GB
/dev/sda5  /usr/local           200GB
このうち、/usrは使用量1GBもないはず

例えば、こんなスライス構成をしていたとする。
/usrが独立したファイルシステムだったら、dumpでファイルシステム丸ごと拾えば復旧も簡単なんだけどなー。こうなるとtarかcpだなー。rsyncでも良いか、などというコマンド選びが済んで、いざ!という所で素人のみなさんが困るのがコレ↓。

tar zcvf /path/to/archive.tar.gz /usr

えらく時間かかってんなー。わ!/usr/local 200GBもあるのに!!お願いだから/usr/localを拾わないで下さい!と、ここで気づく。

cp -a /usr /path/to/backup/dir

当たり前だけどこれでも/usr/local 拾っちゃうよね。

#!/bin/sh

for i in /usr/*
do
  if [ $i != "/usr/local" ]; then
    cp -a $i /path/to/backup/dir/.
  fi
done

↑言っちゃー何だが、バカですか?(笑)
と、まーこんな調子で/usr/localは拾いたくないのに!という件、こんだけ引っ張っておいて何だけれど、ごく簡単なこと。

man tar より
       -l, --one-file-system
              stay in local file system when creating an archive
man cp より
       -x, --one-file-system
              stay on this file system
man rsync より
        -x, --one-file-system       don't cross filesystem boundaries

ちょっと違ったりするけど、どれもこれも同じ意味のオプションを持っている。お仕事する対象を一つのファイルシステムに絞って下さい、再帰的に中を見てった時に別なファイルシステムのマウントポイントを見つけてもそこは潜らないで下さい、という意味。これを使えば済む話、なのでした。
ちなみに、du も同じオプションを持っているので、/usr の中身を /usr/local をキレイに除外して容量を計ることができるよ。

# cd /usr
# du -sx .

あら簡単!