logrotateを使ってバックアップをしよう

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

コメント

タイトルとURLをコピーしました