「Tar によるフルシステムバックアップ」の版間の差分
(→Change Root: 情報を更新) |
(→バックアップスクリプト: 情報を更新) |
||
| 62行目: | 62行目: | ||
== バックアップスクリプト == |
== バックアップスクリプト == |
||
| − | + | {{ic|bsdtar}} でバックアップを取るのは簡単なプロセスです。ここでは、それを行うことができる基本的なスクリプトを紹介し、いくつかのチェックを提供します。このスクリプトを修正して、バックアップの場所と除外ファイル (ある場合) を定義し、{{ic|chroot}} してすべてのパーティションをマウントした後にこのコマンドを実行する必要があります。[https://bbs.archlinux.org/viewtopic.php?id=146269 GNU tar を {{ic|--xattrs}} で実行しても拡張属性は保存されない] ことに注意してください。 |
|
| + | {{bc|1= |
||
| − | #!/bin/bash |
||
| + | #!/bin/bash |
||
| − | # full system backup |
||
| + | # full system backup |
||
| − | |||
| + | |||
| − | # Backup destination |
||
| + | # Backup destination |
||
| − | backdest=/opt/backup |
||
| + | backdest=/opt/backup |
||
| − | |||
| + | |||
| − | # Labels for backup name |
||
| + | # Labels for backup name |
||
| − | #PC=${HOSTNAME} |
||
| + | #PC=${HOSTNAME} |
||
| − | pc=pavilion |
||
| + | pc=pavilion |
||
| − | distro=arch |
||
| + | distro=arch |
||
| − | type=full |
||
| + | type=full |
||
| − | date=$(date "+%F") |
||
| + | date=$(date "+%F") |
||
| − | backupfile="$backdest/$distro-$type-$date.tar.gz" |
||
| + | backupfile="$backdest/$distro-$type-$date.tar.gz" |
||
| − | |||
| + | |||
| − | # Exclude file location |
||
| + | # Exclude file location |
||
| − | prog=${0##*/} # Program name from filename |
||
| + | prog=${0##*/} # Program name from filename |
||
| − | excdir="/home/<user>/.bin/root/backup" |
||
| + | excdir="/home/<user>/.bin/root/backup" |
||
| − | exclude_file="$excdir/$prog-exc.txt" |
||
| + | exclude_file="$excdir/$prog-exc.txt" |
||
| − | |||
| + | |||
| − | # Check if chrooted prompt. |
||
| + | # Check if chrooted prompt. |
||
| − | echo -n "First chroot from a LiveCD. Are you ready to backup? (y/n): " |
||
| + | echo -n "First chroot from a LiveCD. Are you ready to backup? (y/n): " |
||
| − | read executeback |
||
| + | read executeback |
||
| − | |||
| + | |||
| − | # Check if exclude file exists |
||
| + | # Check if exclude file exists |
||
| − | if [ ! -f $exclude_file ]; then |
||
| + | if [ ! -f $exclude_file ]; then |
||
| − | echo -n "No exclude file exists, continue? (y/n): " |
||
| − | + | echo -n "No exclude file exists, continue? (y/n): " |
|
| − | + | read continue |
|
| + | if [ $continue == "n" ]; then exit; fi |
||
| − | fi |
||
| + | fi |
||
| − | |||
| + | |||
| − | if [ $executeback = "y" ]; then |
||
| + | if [ $executeback = "y" ]; then |
||
| − | # -p and --xattrs store all permissions and extended attributes. |
||
| + | # -p, --acls and --xattrs store all permissions, ACLs and extended attributes. |
||
| − | # Without both of these, many programs will stop working! |
||
| + | # Without both of these, many programs will stop working! |
||
| − | # It is safe to remove the verbose (-v) flag. If you are using a |
||
| + | # It is safe to remove the verbose (-v) flag. If you are using a |
||
| − | # slow terminal, this can greatly speed up the backup process. |
||
| + | # slow terminal, this can greatly speed up the backup process. |
||
| − | tar --exclude-from=$exclude_file --xattrs -czpvf $backupfile / |
||
| + | # Use bsdtar because GNU tar will not preserve extended attributes. |
||
| − | fi |
||
| + | bsdtar --exclude-from=$exclude_file --acls --xattrs -cpvzf $backupfile / |
||
| + | fi |
||
| + | }} |
||
== リストア == |
== リストア == |
||
2023年5月20日 (土) 17:48時点における版
この記事では tar を使ってフルシステムバックアップを行う方法を説明します。
tar を使ったバックアップには、ディスク領域の節約に役立つ圧縮機能があることや、簡単にできるという利点があります。基本的な手順は以下のようになります:
- LiveCD から起動
- Linux 環境に Change Root
- パーティションやドライブをマウント
- 除外リストを追加
- バックアップスクリプトを使ってバックアップ
全てのファイルシステムが LVM ボリューム上にある場合、LVM のスナップショットを使うことでバックアップによってシステムが使えなくなる時間を最小限に留めることができます。
LiveCD を起動
大抵の Linux のブータブル CD や USB には Change Root する機能が備わっています。バックアップをするのに Change Root を実行することは必ずしも必須ではありませんが、一時的なドライブに転送する必要なくスクリプトを実行することが可能になります。ライブメディアは使用している Linux 環境とアーキテクチャが一致していなければなりません (i686 または x86_64)。
Change Root
まずは現在の Linux 環境にスクリプト環境をセットアップしてください。通常のプログラムと同じようにスクリプトを実行できるようにします。詳しくは こちらの記事 を読んでください。次に Change Root を実行します。詳しくは Change Root の記事を読んでください。Change Root を行うときに一時的なファイルシステム (/proc, /sys, /dev) をマウントする必要はありません。起動時に作成されているファイルシステムをバックアップしてしまうと通常の作成プロセスと干渉する可能性があります。Change Root を行うには Linux がインストールされているルートパーティションをマウントしてください。例:
# mkdir /mnt/arch # mount /dev/<your-partition-or-drive>
fdisk -l でパーティションやドライブを確認できます。その後に chroot を実行してください:
# cd /mnt/arch # chroot . /bin/bash
この例では bash を使用していますが、利用可能な場合は他のシェルを使用することもできます。これで、スクリプト環境に入ります (これは、入力時に ~/.bashrc をソースしていることが前提です。)
~/.bash_profile
# If using bash, source the local .bashrc source ~/.bashrc
他のパーティションのマウント
使用しているパーティション (例: /home パーティション) は適切な場所にマウントする必要があります。
除外ファイルリスト
tar には指定されたファイルやディレクトリを無視する機能があります。1行ごとに指定してください。正規表現も使えます。例:
# Not old backups
/opt/backup/arch-full*
# Not temporary files
/tmp/*
# Not the cache for pacman
/var/cache/pacman/pkg/
...
バックアップスクリプト
bsdtar でバックアップを取るのは簡単なプロセスです。ここでは、それを行うことができる基本的なスクリプトを紹介し、いくつかのチェックを提供します。このスクリプトを修正して、バックアップの場所と除外ファイル (ある場合) を定義し、chroot してすべてのパーティションをマウントした後にこのコマンドを実行する必要があります。GNU tar を --xattrs で実行しても拡張属性は保存されない ことに注意してください。
#!/bin/bash
# full system backup
# Backup destination
backdest=/opt/backup
# Labels for backup name
#PC=${HOSTNAME}
pc=pavilion
distro=arch
type=full
date=$(date "+%F")
backupfile="$backdest/$distro-$type-$date.tar.gz"
# Exclude file location
prog=${0##*/} # Program name from filename
excdir="/home/<user>/.bin/root/backup"
exclude_file="$excdir/$prog-exc.txt"
# Check if chrooted prompt.
echo -n "First chroot from a LiveCD. Are you ready to backup? (y/n): "
read executeback
# Check if exclude file exists
if [ ! -f $exclude_file ]; then
echo -n "No exclude file exists, continue? (y/n): "
read continue
if [ $continue == "n" ]; then exit; fi
fi
if [ $executeback = "y" ]; then
# -p, --acls and --xattrs store all permissions, ACLs and extended attributes.
# Without both of these, many programs will stop working!
# It is safe to remove the verbose (-v) flag. If you are using a
# slow terminal, this can greatly speed up the backup process.
# Use bsdtar because GNU tar will not preserve extended attributes.
bsdtar --exclude-from=$exclude_file --acls --xattrs -cpvzf $backupfile /
fi
リストア
バックアップから復元するには、全てのパーティションをマウントして、ルートディレクトリに移動して以下のコマンドを実行してください ($backupfile はバックアップファイルに置き換えてください):
# tar --xattrs -xpf $backupfile
バックアップ後に作成されたファイルの削除は手動で行う必要があります。
並列圧縮でバックアップ
並列圧縮 (SMP) を使ってバックアップしたい場合 pbzip2 (Parallel bzip2) を使用してください。
まずは圧縮をかけずに tarball にファイルをバックアップ:
# tar -cvf /destionation_path/etc-backup.tar /etc
それから pbzip2 を使って並列圧縮を実行:
$ pbzip2 /path/to/chosen/directory/etc-backup.tar.bz2
etc-backup.tar.bz2 は USB スティックや外付けハードドライブ、CD-R などのオフラインメディアに保存してください。ときどき元のファイルやディレクトリとバックアップを比較してバックアップが正しく行われているか確認してください。バックアップするファイルのハッシュリストを作っておけば簡単に比較できます。
/etc のファイルが壊れた場合は etc-backup.tar.bz2 ファイルを一時的に作業ディレクトリに展開して、必要に応じてファイルやディレクトリをコピーしてください。/etc ディレクトリ全体を復元するには以下のコマンドを root で実行:
# tar -xvjf etc-backup.tar.bz2 -C /