Shellの基礎知識(実践編)

【Shellの基礎知識】ファイルバックアップ機能を徹底解説!設計・実装・活用まで!

データの損失を防ぎ、安全な運用を支えるファイルバックアップ機能。本記事では、その設計思想から実装、設定手順、サンプルコードまで詳しく解説します。バックアップの基本概念を理解し、実践的な活用方法を身につけましょう。

もくじ
  1. ファイルバックアップ機能の概要と役割
  2. 設計書の構成と設計要素
  3. target.cfg と ignore.cfg の具体的な記載方法
  4. ファイルバックアップ機能の設定手順
  5. 実践的な利用方法とサンプルコード
  6. バックアップデータのリストア方法
  7. トラブルシューティングとベストプラクティス

ファイルバックアップ機能の概要と役割

ファイルバックアップ機能は、重要なデータの保護を目的として設計されています。システム障害やヒューマンエラーによるデータ損失を防ぐため、定期的なバックアップを実施することが求められます。本セクションでは、ファイルバックアップ機能の目的、重要性、設計方針について解説します。

ファイルバックアップ機能の目的

ファイルバックアップの主な目的は、以下の通りです。

  • データ保護: システム障害や誤削除によるデータ損失を防ぐ。
  • 業務継続性の確保: 迅速なデータ復元により業務の停止時間を最小限に抑える。
  • 法令遵守: データの保存義務がある業界において、適切なバックアップが必要。
  • サイバー攻撃対策: ランサムウェアなどの攻撃からデータを守るために、バックアップが重要。

ファイルバックアップ機能の重要性と課題解決のポイント

バックアップ機能は、単にデータを保存するだけでなく、実用的な復元が可能であることが求められます。重要性を理解し、課題を解決するためのポイントを押さえましょう。

バックアップ機能の重要性

  • システム障害時にデータを迅速に復旧できる。
  • 誤操作によるデータ削除を防ぐためのリスク管理が可能。
  • データ保管ポリシーに基づいた安全な管理が可能。

課題解決のポイント

課題解決策
バックアップの頻度が適切でない業務に応じたスケジュールを設定し、定期バックアップを実施する。
ストレージの容量が不足する増分バックアップや圧縮を活用し、容量を最適化する。
バックアップデータが破損する可能性がある定期的なバックアップデータの検証(整合性チェック)を行う。

ファイルバックアップ機能の設計の基本方針

ファイルバックアップを設計する際には、データの一貫性や復元性を考慮する必要があります。以下のポイントに基づいて設計を行います。

設計の基本原則

  • 信頼性: バックアップデータが確実に復元できることを保証。
  • 自動化: 定期バックアップをスケジュール設定し、人的ミスを防ぐ。
  • 効率性: 重複データを減らし、ストレージを最適に使用。
  • セキュリティ: バックアップデータを暗号化し、不正アクセスを防ぐ。

設計時に考慮すべきポイント

設計要素内容
バックアップの種類フルバックアップ・増分バックアップ・差分バックアップの選択
ストレージの選定ローカルストレージ、クラウドストレージ、外部デバイスなど
リストア手順バックアップデータの検証と復旧方法の確立
自動化スケジュールタスク(cronなど)の設定

これらの設計方針に基づき、ファイルバックアップ機能を適切に構築することで、安定したデータ管理が可能になります。

設計書の構成と設計要素

ファイルバックアップ機能の実装には、明確な設計書が必要です。本章では、クラス設計の前提条件、使用する変数の一覧、実装されている関数の詳細について解説します。

クラス設計の前提条件

ファイルバックアップ機能を設計するにあたり、以下の前提条件を考慮します。

  • バックアップ対象: 指定されたディレクトリやファイルをアーカイブ形式で保存
  • 実行環境: Linux環境(Bashスクリプトで実装)
  • ログ管理: 共通ログ出力クラスを活用
  • エラーハンドリング: 異常発生時は適切なエラーメッセージを出力

前提となる実行環境

本バックアップスクリプトは、共通ログ出力クラス( logger.shrc)および共通関数定義クラス( utils.shrc)を使用することを前提としています。これにより、ログ管理や共通関数の再利用性を高め、メンテナンス性を向上させます。

本スクリプトを実行するには、以下の環境が必要です。

  • 共通ログ出力クラス( logger.shrc)が適切に配置されていること
  • 共通関数定義クラス( utils.shrc)が適切に配置されていること
  • Bash 4.x 以上の環境
  • バックアップ対象のディレクトリと出力先ディレクトリが適切に設定されていること

前提となる実行環境

Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • <<各種実行スクリプト>>.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • logger.shrc(共通ログ出力ファイル)
      • utils.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • infraMessage.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

使用する変数一覧

スクリプト内で使用する主な変数は以下の通りです。

変数名用途
TARGET_LISTバックアップ対象のファイルリスト/etc/target.cfg
IGNORE_LISTバックアップ除外リスト/etc/ignore.cfg
BACKUP_DIRバックアップファイルの保存先/backup
BACKUP_FILE生成されるバックアップファイル名backup_YYYY-MM-DD.tar.gz

実装されている関数の詳細

本スクリプトでは、以下の関数を実装しています。

1. checkArg() - 引数の妥当性確認

バックアップ対象や保存先ディレクトリの確認を行います。

checkArg()

2. executeBackup() - バックアップ処理の実行

指定された対象をアーカイブし、バックアップを作成します。

executeBackup()

3. cleanup() - 異常終了時の処理

エラー発生時に一時ファイルを削除し、適切なログを出力します。

cleanup()

4. restoreBackup() - バックアップの復元

作成したバックアップファイルを展開し、復元を行います。

restoreBackup()

target.cfg と ignore.cfg の具体的な記載方法

バックアップスクリプトでは、 target.cfg にバックアップ対象のファイルやディレクトリを、 ignore.cfg にバックアップから除外する項目を記載します。本章では、それぞれのファイルの記述フォーマットとサンプルを解説します。

前提となるテスト環境

以下のディレクトリ構成をもとに、バックアップスクリプトの動作を確認します。

[/crayon]

target.cfg の記載方法

target.cfg には、バックアップ対象とするファイルやディレクトリを1行ずつ記述します。

記述ルール

  • 絶対パスで記述する(例: /home/user/documents
  • ファイル名またはディレクトリ名を記載する
  • ワイルドカード( *)は使用しない(意図しないファイルが含まれるリスクを避けるため)
  • コメント行は # を先頭に付与

target.cfg の記述例

# バックアップ対象リスト
/home/user/documents
/etc/nginx/nginx.conf
/var/log/syslog
/home/user/project/source_code
/opt/application/config.yaml

ignore.cfg の記載方法

ignore.cfg には、バックアップ対象から除外するファイルやディレクトリを1行ずつ記述します。

記述ルール

  • 対象ファイルが属するディレクトリを target.cfg に記載している場合、そこから除外したいファイルやフォルダを記述
  • 相対パスまたは絶対パスで記述する
  • ワイルドカード( *)を使用可能(特定の拡張子を除外する際に便利)
  • コメント行は # を先頭に付与

ignore.cfg の記述例

# 除外リスト
*.tmp
*.log
/var/log/debug.log
/home/user/documents/temp/*

target.cfg と ignore.cfg の組み合わせ

例えば、以下の設定でバックアップが行われる場合:

  • target.cfg/home/user/documents が含まれる
  • ignore.cfg*.tmp/home/user/documents/temp/* が指定される

この場合、 /home/user/documents 以下の全ファイルがバックアップ対象になりますが、 *.tmp の拡張子を持つファイル、および /home/user/documents/temp/ 内のすべてのファイルは除外されます。

ワイルドカード(*)の使用について
「ignore.cfg」 では、ワイルドカード(*)を使用できますが、「target.cfg」 では、ワイルドカードを記載しても適用されません。

ignore.cfg の目的

ignore.cfg は、 tar でアーカイブを作成するときに除外するファイルやディレクトリを指定するリストです。
このリストに記載されたものは、バックアップの対象外になります。

ignore.cfg の書き方

指定の仕方によって動作が異なります。
ここでは /test/ 配下のフォルダ・ファイルを例に説明します。

フォルダごと除外する場合

例: test1-1/ フォルダごと除外

/test/test1/test1-1/

📌 この指定をすると test1-1/ フォルダ全体が除外されます。

  • 【除外対象】
    • /test/test1/test1-1/
    • /test/test1/test1-1/test1-1-1.txt
    • /test/test1/test1-1/test1-1-2.txt

特定のファイルだけを除外する場合

例: test1-2/test1-2-1.txt だけを除外

/test/test1/test1-2/test1-2-1.txt

📌 この指定をすると test1-2-1.txt のみが除外され、同じフォルダ内の他のファイルはバックアップに含まれます。

  • 【除外対象】
    • /test/test1/test1-2/test1-2-1.txt
  • 【バックアップに含まれるもの】
    • /test/test1/test1-2/test1-2-2.txt

除外リストの具体例

以下の ignore.cfg を設定すると、フォルダごと除外するものと、特定のファイルだけ除外するものが混在します。

/test/test1/test1-1/ # test1-1 フォルダごと除外
/test/test1/test1-2/test1-2-1.txt # 特定のファイルのみ除外
/test/test1/test1-3/test1-3-2.txt # 特定のファイルのみ除外

📌 この指定をした場合、バックアップの中に含まれるものは以下の通りです。

[/crayon]

tar の実行コマンド

/bin/tar --exclude-from="/scripts/etc/ignore.cfg" -czvf backup.tar.gz -T "/scripts/etc/target.cfg"

このコマンドを実行すると、 ignore.cfg に指定したものを除外した状態で backup.tar.gz を作成します。

除外リストの指定方法

以下の除外リストを使用することで、特定のディレクトリやファイルをバックアップ対象から除外できます。

除外対象記述例除外される内容
フォルダ全体を除外 /test/test1/test1-1/ test1-1 フォルダとその中のすべてのファイル
特定のファイルを除外 /test/test1/test1-2/test1-2-1.txt test1-2-1.txt のみ

除外リストファイルのサンプル

上記の除外リストを ignore.cfg に記述すると、以下のようになります。

# /scripts/etc/ignore.cfg
/test/test1/test1-1
/test/test1/test1-2/test1-2-1.txt
/test/test1/test1-3/test1-3-2.txt

設定の確認方法

設定が正しく反映されているか確認するには、以下のコマンドを実行してください。

1. バックアップ対象の一覧を確認

cat /path/to/target.cfg

2. 除外設定を確認

cat /path/to/ignore.cfg

3. tarコマンドで動作確認

tar --exclude-from=/path/to/ignore.cfg -czf backup.tar.gz -T /path/to/target.cfg

このコマンドを実行することで、 target.cfg に記載されたファイルがアーカイブされ、 ignore.cfg に記載されたファイルは除外されます。

ファイルバックアップ機能の設定手順

このセクションでは、ファイルバックアップ機能の設定手順について説明します。

前提となる実行環境

本スクリプトは以下の環境を前提としています。

  • OS: Linux(CentOS, RHEL, Ubuntuなど)
  • シェル: Bash 4.x 以上
  • 必要なコマンド: tar, find, grep, cron

ファイルバックアップ機能の設定方法

以下の手順でファイルバックアップ機能を設定します。

  1. バックアップ対象リスト( target.cfg)を作成する。
  2. 除外リスト( ignore.cfg)を作成する。
  3. スクリプト backupFiles.sh を適切な場所に配置する。
  4. 実行権限を付与する。
  5. 手動で実行し、正常動作を確認する。

このスクリプトでは、バックアップ対象のファイル・ディレクトリを設定ファイルで管理します。設定ファイルはスクリプトと同じディレクトリにある etc フォルダ内に格納してください。

設定ファイルの格納場所

スクリプトを実行するフォルダに、以下の2つのファイルを作成します。

  • etc/target.cfg - バックアップ対象のファイル・ディレクトリ
  • etc/ignore.cfg - バックアップ時に除外するファイル・ディレクトリ

target.cfg(バックアップ対象リスト)

バックアップ対象のファイルやディレクトリを、1行ずつ記述します。

記述例:

/var/log/syslog
/home/user/documents/
/etc/nginx/nginx.conf

ignore.cfg(バックアップ除外リスト)

バックアップ時に除外するファイルやフォルダを、1行ずつ記述します。ワイルドカード( *)も使用できます。

記述例:

*.log
*.tmp
cache/

アーカイブ格納先ディレクトリの設定

バックアップファイルは、指定されたディレクトリ(例: /backup)に保存されます。バックアップディレクトリの設定方法は以下の通りです。

backupFiles.sh -b /backup

設定後、ディレクトリが適切に作成されていることを確認してください。

定期バックアップのスケジュール設計(cronを活用)

ファイルバックアップを定期的に実行するために、 cron を設定します。

1. crontab -e を実行

ターミナルで以下のコマンドを実行し、crontab を編集します。

crontab -e

2. 定期実行のスケジュールを設定

毎日深夜3時にバックアップを実行する場合、以下のように記述します。

0 3 * * * /path/to/backupFiles.sh -b /backup

3. 設定を確認

設定が反映されたことを確認するため、以下のコマンドを実行します。

crontab -l

この設定により、ファイルバックアップが定期的に実行され、自動でデータを保護できます。

実践的な利用方法とサンプルコード

ファイルバックアップ機能を適切に活用することで、データの保護と業務の安定性を確保できます。本章では、基本的な使い方から具体的な利用ケース、共通ログ出力クラスのメリットまで解説します。

基本的な使い方

バックアップスクリプト backupFiles.sh を実行する基本的な方法を紹介します。

1. バックアップの実行

手動でバックアップを実行するには、以下のコマンドを使用します。

sh backupFiles.sh -b /backup

このコマンドを実行すると、 /etc/target.cfg に記載された対象ファイルがアーカイブされ、指定したディレクトリに保存されます。

2. バックアップの確認

作成されたバックアップが正しく存在しているかを確認するには、以下のコマンドを使用します。

ls -lh /backup/backup_*.tar.gz

3. バックアップデータの内容確認

バックアップファイル内のデータを確認するには、以下のコマンドを実行します。

tar -tvf /backup/backup_YYYY-MM-DD.tar.gz

よくある利用ケース

バックアップ機能は、様々なシチュエーションで活用できます。代表的な利用ケースを紹介します。

定期的なデータ保護

  • 毎日深夜に重要なデータをバックアップし、7日以上前のバックアップを自動削除。
  • クラウドストレージやリモートサーバーへバックアップを転送。

システムメンテナンス時のデータ保全

  • システムアップグレード前にフルバックアップを作成。
  • 障害発生時に迅速に復元できるよう、最新のデータを保持。

開発・テスト環境のデータ管理

  • 本番環境のデータをバックアップし、テスト環境へリストア。
  • バージョン管理の一環として、変更履歴を保持。

ファイルバックアップスクリプトの実装

以下のスクリプトを使用することで、設定済みのディレクトリをバックアップできます。

本スクリプトの利用により生じた、いかなる損害についても一切の責任を負わないものとします。また、損害賠償等の義務ついても、一切責任を負いません。

共通ログ出力クラスを導入するメリット

本スクリプトでは、共通ログ出力クラスを活用し、すべての処理ログを統一的に管理します。そのメリットは以下の通りです。

1. 一貫性のあるログ管理

  • バックアップの開始・終了時にログを出力し、処理状況を記録。
  • エラー発生時には即座に原因を特定できる。

2. デバッグの効率化

  • 詳細なログを残すことで、問題発生時のトラブルシューティングが容易に。
  • スクリプトの動作を時系列で把握できる。

3. システム運用の安定化

  • バックアップ処理が正しく実行されているか、定期的にログを確認可能。
  • 管理者が遠隔地からでもバックアップの実行状況を把握できる。

共通ログ出力クラスを導入することで、ログ管理が効率化され、トラブル対応の迅速化が可能になります。

実行結果

 

🔹 「/bin/tar: メンバ名から先頭の `/' を取り除きます」なぜ / を削除するの?
これは 誤った解凍によるシステム破壊を防ぐため。もし / 付きでバックアップされると、解凍時に ルートディレクトリ (/) 直下に強制的に展開 されてしまい、最悪の場合システムファイルを上書きする危険があるためです。

バックアップデータのリストア方法

バックアップデータは、障害発生時や誤操作によるデータ消失に備えて保存されています。本章では、バックアップファイルを復元する手順と、復元前にデータの整合性を確認する方法について解説します。

tarアーカイブからの復元

バックアップファイルは tar.gz 形式で圧縮されているため、復元には tar コマンドを使用します。

1. バックアップファイルのリスト表示

アーカイブ内のファイルを確認するには、以下のコマンドを実行します。

tar -tzf /backup/backup_YYYY-MM-DD.tar.gz

このコマンドを実行すると、バックアップに含まれているファイル一覧が表示されます。

2. 指定ディレクトリにバックアップを展開

バックアップデータを /restore ディレクトリに復元する場合、以下のコマンドを実行します。

tar -xvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore

復元先のディレクトリを指定することで、データを適切な場所に展開できます。

3. 特定のファイルのみ復元

バックアップデータの一部のみを復元する場合、ファイル名を指定して展開できます。

tar -xvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore path/to/file.txt

バックアップファイルの検証

バックアップが正しく作成されているかを確認することは重要です。以下の手順でデータの整合性を検証できます。

1. ファイルのハッシュ値を比較

バックアップ前後のファイルが一致しているか確認するには、 md5sum または sha256sum コマンドを使用します。

md5sum /original/file.txt

md5sum /restore/file.txt

ハッシュ値が一致すれば、バックアップが正しく復元されていることを示します。

2. tarアーカイブの整合性チェック

バックアップファイルが破損していないかを確認するには、以下のコマンドを実行します。

tar -tvf /backup/backup_YYYY-MM-DD.tar.gz

エラーメッセージが出なければ、アーカイブが正常であることを意味します。

3. バックアップデータのサイズ確認

バックアップデータが想定通りのサイズになっているか確認するには、以下のコマンドを使用します。

ls -lh /backup/backup_YYYY-MM-DD.tar.gz

予想よりも小さい場合、バックアップの対象ファイルが不足している可能性があるため、再確認が必要です。

トラブルシューティングとベストプラクティス

バックアップおよびリストアのプロセスは、データ保護の要となる重要な機能です。しかし、環境や設定によっては問題が発生することもあります。本章では、バックアップの失敗要因とその対策、リストア時のよくある問題と解決策について解説します。

バックアップに失敗する原因と対策

バックアップ処理が失敗する主な原因と、それぞれの対策を以下の表にまとめました。

原因説明対策
権限不足バックアップ対象のディレクトリやファイルに適切なアクセス権限がない
  • sudo を使用して管理者権限で実行する
  • バックアップ対象のディレクトリやファイルの権限を確認する
  • chownchmod を活用して適切なアクセス権限を付与
ストレージ容量不足バックアップの保存先に十分な空き容量がない
  • バックアップ対象のサイズを事前に確認
  • 不要な古いバックアップファイルを定期的に削除
  • 圧縮形式(gzip、bzip2)を利用してバックアップファイルのサイズを削減
  • クラウドストレージや外部ストレージを活用
ネットワーク障害リモートストレージへのバックアップ時に通信が途切れる
  • ネットワークの接続状態を確認( pingtraceroute を活用)
  • 安定した通信環境(有線接続など)を確保
  • バックアップのリトライ機能を活用(rsyncの --partialオプションなど)
  • クラウドストレージ側のAPI制限(レートリミット)を確認

リストア時のよくある問題と解決策

リストアの際に発生しやすい問題と、その対処方法を以下に示します。

1. バックアップファイルが破損している

復元しようとした際に、tarがエラーを出力する場合、バックアップファイルが破損している可能性があります。

tar -tzf /backup/backup_YYYY-MM-DD.tar.gz

エラーが表示された場合、以下の対応を行います。

  • 別のバックアップファイルを使用する
  • バックアップ時のログを確認し、正常に作成されていたかチェックする
  • ストレージのエラーを確認し、ファイルシステムのチェックを行う( fsck コマンドなど)

2. ファイルのオーナーやパーミッションが復元されない

リストア後に適切な権限が付与されていない場合、復元時のオプションを確認する必要があります。

tar -xpvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore

また、手動でオーナーやパーミッションを設定する場合、以下のコマンドを使用できます。

chown -R user:group /restore

chmod -R 755 /restore

3. リストア先のディレクトリが不足している

リストアする際にディレクトリが存在しない場合、事前に作成する必要があります。

mkdir -p /restore

4. 一部のファイルのみ復元したい

特定のファイルのみを復元するには、tarコマンドで対象ファイルを指定します。

tar -xvzf /backup/backup_YYYY-MM-DD.tar.gz -C /restore path/to/file.txt

これにより、指定したファイルのみを復元できます。

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか?無料で使えるだけでなく、高い柔軟性 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Shellの基礎知識(実践編)