logrotateを使ってバックアップを取得すると、ローテション機能があるので世代管理がとても簡単にできて便利です。
今回はWordpressディレクトリのバックアップを例として説明していきます。
バックアップデータ格納ディレクトリの作成
バックアップデータを格納するディレクトリを作成します。
今回はホームディレクトリ(/home/tamohiko)に「WP_Backup/vpslife」というディレクトリを作成し、パーミッションは「755」に設定しておきます。
$ cd $ mkdir -p WP_Backup/vpslife $ chmod 755 WP_Backup/vpslife
バックアップコマンドの動作テスト
logrotateで実行させようとしているバックアップコマンドを、事前に実行してバックアップが正常に行えることを確認します。
今回はWordPressのディレクトリを丸ごとバックアップしたいので、下記のようなコマンドでバックアップを行っていきます。
$ sudo tar cfz /home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz -C /usr/share/nginx ./vpslife
バックアップが取れていることを確認します。
$ ls -l ~/WP_Backup/vpslife total 65156 -rw-r--r-- 1 root root 66712993 Apr 25 14:41 vpslife.tar.gz
事前にバックアップファイルを作成しておかないと、logrotateが上手く動作してくれませんので注意してください。
logrotate設定ファイル作成
「/etc/logrotate.d」ディレクトリに設定ファイルを作成します。
WordPressのディレクトリを丸ごとバックアップする用なので、「vpslife_dir」といった名前で作っています。
$ sudo vi /etc/logrotate.d/vpslife_dir
設定ファイルの内容
設定ファイルには最低限、下記の内容を設定しておきます。
ローテションさせるファイル名 (バックアップで作成されるファイルを指定) { rotate ローテーション数 daily # 毎日実行 missingok #ファイルがない場合もエラーを出力せず処理を実行 postrotate この間にバックアップコマンドを記述 endscript }
ちなみに、dailyはローテション間隔(ここではバックアップを実行する間隔)の設定で、daily以外にも下記のような間隔の設定を行うことができます。
- daily (毎日)
- weekly(毎週)
- monthly(毎月)
- yearly(毎年)
実際の設定例
私の環境では下記のような内容で設定しています。
これで毎日バックアップが行われて、7世代分のバックアップデータが保存されます。
/home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz { rotate 7 daily missingok postrotate tar cfz /home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz -C /usr/share/nginx ./vpslife endscript }
動作テスト(debug mode)
-dオプションを使用すると、実際にバックアップコマンドを実行せずに動作テスト(debug mode)を行うことができます。
$ sudo logrotate -d 設定ファイル
実際にdebug modeで動作テストを行ってみます。
最初にWARNINGが表示されていますが、これは下記のような内容となっていますので、とくに問題はありません。
「デバッグモードでは、デバックのメッセージを出力するだけで実際の処理は行いません。実際の動作確認をおこないたいのであればverboseモード(-v)を使ってください。」
$ sudo logrotate -d /etc/logrotate.d/vpslife_dir WARNING: logrotate in debug mode does nothing except printing debug messages! Consider using verbose mode (-v) instead if this is not what you want. reading config file /etc/logrotate.d/vpslife_dir Reading state from file: /var/lib/logrotate/status Allocating hash table for state file, size 64 entries Creating new state Creating new state ##### 中略 ##### Creating new state Handling 1 logs rotating pattern: /home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz after 1 days (7 rotations) empty log files are rotated, old logs are removed considering log /home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz Now: 2024-04-25 14:23 Last rotated at 2024-04-25 00:00 log does not need rotating (log has been rotated at 2024-04-25 00:00, which is less than a day ago)
debug modeではファイルがローテションすることが確認できました。
動作確認
実際に作成した設定ファイルを指定して、logrotateを実行してみます。
※「-f」オプションを使用して強制的にログをローテションさせて、ローテションの動作確認をしています。
$ sudo /usr/sbin/logrotate -f /etc/logrotate.d/vpslife_dir
データのバックアップと、古いバックアップデータの後ろに「.1」という番号が付与されてローテションされていることが確認できました。
$ ls -l total 130308 -rw-r--r-- 1 root root 66712993 Apr 25 14:26 vpslife.tar.gz -rw-rw-r-- 1 root root 66712993 Apr 25 14:21 vpslife.tar.gz.1
ローテーションの動作確認
10回logrotateを実行して、rotateで設定した分だけバックアップデータが保存されるかどうかの確認を行います。
$ for i in {1..10}; do sudo /usr/sbin/logrotate -f /etc/logrotate.d/vpslife_dir && echo $i ; done 1 2 3 4 5 6 7 8 9 10
10回logrotateを実行してバックアップを行いましたが、rotateで設定した分の7つだけが残っていることが確認できました。
$ ls -l total 521216 -rw-r--r-- 1 root root 66712993 Apr 25 14:41 vpslife.tar.gz -rw-r--r-- 1 root root 66712993 Apr 25 14:41 vpslife.tar.gz.1 -rw-r--r-- 1 root root 66712993 Apr 25 14:41 vpslife.tar.gz.2 -rw-r--r-- 1 root root 66712993 Apr 25 14:41 vpslife.tar.gz.3 -rw-r--r-- 1 root root 66712993 Apr 25 14:41 vpslife.tar.gz.4 -rw-r--r-- 1 root root 66712993 Apr 25 14:40 vpslife.tar.gz.5 -rw-r--r-- 1 root root 66712993 Apr 25 14:40 vpslife.tar.gz.6 -rw-r--r-- 1 root root 66712993 Apr 25 14:40 vpslife.tar.gz.7
バックアップとローテーションの確認
バックアップ設定後の数日間は、バックアップが正常にされてローテションが問題なく行われているか確認を行うようにしましょう。
動作に問題がなければ設定は完了となります。
失敗のメモ
今回のlogrotateでバックアップを取得する際に遭遇した失敗のメモです。
同じエラーが起きた際の参考になれば良いなと思いったので残しておきます。
error: skipping "xxxxxx" because parent directory has insecure permissions
バックアップデータを格納するディレクトリに、所有者以外の書き込み権限がある場合(777や775等)に発生するエラーです。
簡単な解決策としては、ディレクトリのパーミッションを755へ変更してみてください。
error: skipping "/home/tamohiko/WP_Backup/vpslife.sql" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
su ディレクティブを追加する方法
メッセージに書いてある通り、logrotateの設定ファイルにsuディレクティブを追加する方法もあります。
バックアップデータを格納するフォルダの所有者はtamohikoとなっています。
$ ls -l ~/WP_Backup/ | grep vpslife_bk drwxrwxr-x 2 tamohiko tamohiko 4096 May 4 21:45 vpslife_bk
テスト用にsuディレクティブを追加していないlogrotateの設定ファイルを作成しました。
/home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz { rotate 7 daily missingok postrotate tar cfz /home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz -C /usr/share/nginx ./vpslife endscript }
このファイルを指定しdebug modeで動作させてみると、error: skipping XXXXX parent directory has insecure permissionsのエラーが発生します。
$ sudo logrotate -d /etc/logrotate.d/vpslife_dir_bk WARNING: logrotate in debug mode does nothing except printing debug messages! Consider using verbose mode (-v) instead if this is not what you want. reading config file /etc/logrotate.d/vpslife_dir_bk Reading state from file: /var/lib/logrotate/status Allocating hash table for state file, size 64 entries Creating new state ##### 中略 ##### Creating new state Handling 1 logs rotating pattern: /home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz after 1 days (7 rotations) empty log files are rotated, old logs are removed considering log /home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz error: skipping "/home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
エラーメッセージにある通り、su ディレクティブを追加して見ます。
対象のディレクトリはtamohikoユーザが所有者となっているので、「su tamohiko tamohiko」という設定を追加します。
/home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz
{
rotate 7
daily
missingok
su tamohiko tamohiko
postrotate
tar cfz /home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz -C /usr/share/nginx ./vpslife
endscript
}
debug modeで確認してみると、エラーが発生しなくなりました。
$ sudo logrotate -d /etc/logrotate.d/vpslife_dir_bk WARNING: logrotate in debug mode does nothing except printing debug messages! Consider using verbose mode (-v) instead if this is not what you want. reading config file /etc/logrotate.d/vpslife_dir_bk Reading state from file: /var/lib/logrotate/status Allocating hash table for state file, size 64 entries Creating new state ##### 中略 ##### Creating new state Handling 1 logs rotating pattern: /home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz after 1 days (7 rotations) empty log files are rotated, old logs are removed switching euid from 0 to 1000 and egid from 0 to 1000 (pid 321860) considering log /home/tamohiko/WP_Backup/vpslife_bk/vpslife.tar.gz Now: 2024-05-04 21:51 Last rotated at 2024-05-04 21:45 log does not need rotating (log has already been rotated) switching euid from 1000 to 0 and egid from 1000 to 0 (pid 321860)
実際にlogrotateを実行してもエラーは発生しないことが確認できました。
$ sudo logrotate -f /etc/logrotate.d/vpslife_dir_bk
log xxxxxxx does not exist -- skipping
logrotateの設定ファイルで対象としたファイルがない場合、log xxxxxxx does not exist -- skippingと表示されてログローテーションの処理がスキップされます(xxxxxxxは設定ファイルで指定したファイルになります)
解決方法としては、最初に手動でバックファイルを作成してあげてください。
$ sudo /usr/sbin/logrotate -vf /etc/logrotate.d/vpslife_dir reading config file /etc/logrotate.d/vpslife_dir Reading state from file: /var/lib/logrotate/status Allocating hash table for state file, size 64 entries Creating new state ##### 中略 ##### Creating new state Handling 1 logs rotating pattern: /home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz forced from command line (7 rotations) empty log files are rotated, old logs are removed considering log /home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz log /home/tamohiko/WP_Backup/vpslife/vpslife.tar.gz does not exist -- skipping
コメント