株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

Baculaデータを別サーバに退避してリストア【運用手順編その2】

【構築手順編その1】【構築手順編その2】【運用手順編】 と連続して書きましたが、そのほかにもやってる事を書きたいと思います。
【運用手順編】にまとめて書こうとしたのですが、長くなってしまったので分けました。


マフラーを外すタイミングが分かりません。
matsBです。(๑•̀ㅂ•́)و✧


なんならヒートテックも、どのタイミングから着なくていいのか分かりません。

Baculaを使ってると、DR(Disaster Recovery)どうしようとか、Directorが壊れたらどうしようとか、Catalogが消えたらどうしようとか、Volumeデータ消えたらどうしようとかとかとか・・・・思ったりしたことはありませんか?
後で説明しますが、BaculaはVolumeデータさえあればどこでもリストアできます。Catalog無くても大丈夫です。
その使い方&設定等の説明を含めて、簡単なDR的な事をBaculaでやってみたので紹介します。

前提

サーバ情報

役割 ホスト名 IPアドレス
Director quick-dir 10.0.0.1
Client quick-fd 10.0.0.2
Client(DR用) quick-dr 10.0.0.3
Storage quick-sd 10.0.0.10

Baculaデータを別サーバに退避してリストア

Baculaを使って簡単なDR(Disaster Recovery)的な意味で、他の拠点や他のサーバに一部データを退避させたいなーって方用の説明です。

前提

【事実】
・ホスト名はquick-dr
・quick-drにはMySQLが入ってる
【願望】
・2週間だけ別サーバに退避させたい
・DBのCatalogは最新が望ましい
・いつでも別サーバに移行出来るようにしたい

bacula-dir のインストール

【構築手順編その1】でやってるので説明は省きますが、とりあえずquick-dirと同じようなものにしていきます。

[root@quick-dr ~]# yum install -y bacula-client bacula-common bacula-console bacula-console-bat bacula-debuginfo bacula-devel bacula-director bacula-docs bacula-libs bacula-libs-sql bacula-traymonitor
[root@quick-dr ~]# /bin/sh /usr/libexec/bacula/create_mysql_database -u root -p
[root@quick-dr ~]# /bin/sh /usr/libexec/bacula/make_mysql_tables -u root -p
[root@quick-dr ~]# egrep "^db_password=" /usr/libexec/bacula/grant_mysql_privileges
db_password=bacula_quick
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/grant_mysql_privileges -u root -p

bacula-dir のconfigをコピーとVolumeデータのコピー

って言っても、やりたい事を箇条書きしただけです。

[root@quick-dr ~]# cat /var/spool/bacula/config-rsync.sh
#!/bin/bash

# Directorのconfigを全てコピー
rsync -avz --delete -e ssh root@10.0.0.1:/etc/bacula/ /etc/bacula/
# Storage Daemonのconfigをコピー
rsync -avz --delete -e ssh root@10.0.0.10:/etc/bacula/bacula-sd.conf /etc/bacula/
# Storage Daemonの設定のIPアドレスを置換
sed -i -e 's/10.0.0.10/127.0.0.1/g'  /etc/bacula/bacula-dir.conf
# スケジュールを消す
sed -i -e 's/  Run /#  Run /g'  /etc/bacula/bacula-dir.conf
# File Daemonを自分のホスト名に置換
sed -i -e 's/quick-dir/quick-dr/g'  /etc/bacula/bacula-fd.conf

Catalogとデータが無いので何も出来ませんが、まぁこれで一応動くようにはなってるはずです。 そして、欲しいデータを雑にコピーしてきます。

・quick-fdのバックアップファイル
[root@quick-dr ~]# rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/quick-fd-* /data/bacula-backup/
・Catalogの最新バックアップファイル
[root@quick-dr ~]# rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/localhost-FullVol-2017-04-13_1150 /data/bacula-backup/

Catalogのデータについては、基本的に最新のバックアップファイルだけで大丈夫です。

Catalogのリストア

Catalogに何も無い状態なので、Volumeデータだけ持ってきてもリストアが出来ない事はないのですが・・・このあと説明しますが面倒です。
Catalogのリストアはmysqldumpしか方法が無いとか思われがちですが、Baculaにはbextractとblsというコマンドがあって、組み合わせて使えばリストアが出来るようになっています。

[root@quick-dr ~]# cat /var/spool/bacula/catalog_restore.sh
#!/bin/bash

BaseDir=/var/spool/bacula

#過去分をリストアしたい場合はここで日付を指定
#FileNameDate=`date --date '7 days ago' +%Y-%m-%d`
FileNameDate=`date +%Y-%m-%d`

#Catalogのファイル名を取得
CatalogFileName=`ls /data/bacula-backup/localhost-FullVol-${FileNameDate}_* | awk -F"/" '{print $4}'`

#Bootstrapファイルを作成
touch ${BaseDir}/restore-bacula-catalog.bsr

#Bootstrap内に必要情報を記述
echo Volume=${CatalogFileName} > ${BaseDir}/restore-bacula-catalog.bsr
bls -j -V ${CatalogFileName} /data/bacula-backup | sed -n 3p | awk '{print $4"\n"$5}' | sed -e "s/SessId/VolSessionId/g" | sed -e "s/SessTime/VolSessionTime/g" >> ${BaseDir}/restore-bacula-catalog.bsr

#BaculaのCatalogを直接リストア
bextract -b ${BaseDir}/restore-bacula-catalog.bsr -V /data/bacula-backup/${CatalogFileName} /data/bacula-backup /data/catalog

#リストアしたファイルをMySQLに突っ込む
mysql -u bacula -pbacula_quick bacula  < /data/catalog/var/spool/bacula/bacula.sql

#不要ファイルを削除
rm -rf /data/catalog/* ${BaseDir}/restore-bacula-catalog.bsr

#configのIPアドレスの書き換え
sed -i -e 's/10.0.0.10/127.0.0.1/g'  /etc/bacula/bacula-dir.conf

#bacula 関連を再起動
/etc/init.d/bacula-sd restart
/etc/init.d/bacula-dir restart

blsでバックアップされた時の情報を抽出して、Bootstrap内に必要情報(Volume/VolSessionId/VolSessionTime)を入れて、bextractでリストアしてます。
これはCatalogに限らず、bextractとblsを使えばVolumeデータだけでリストアが出来ます。
なので最悪Directorが入ったサーバが壊れて使えなくなっても復旧は可能なので、VolumeデータとConfigだけ退避させておけば心強いです。

必要期間分のVolumeデータのコピー

まぁこの辺は取りたいVolumeデータを書いてるだけなので、大したことは書いてないですが晒します。

[root@shoukai-dr ~]# cat /var/spool/bacula/data-rsync.sh
#! /bin/bash -x

TODAY=`date +%Y-%m-%d`
ONEWEEKAGO=`date --date '7 days ago' +%Y-%m-%d`
TWOWEEKAGO=`date --date '14 days ago' +%Y-%m-%d`
DAYOFWEEK=`date -d $TODAY '+%w'`

rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/localhost-FullVol-${TODAY}_* /data/bacula-backup/ && rm -f /data/bacula-backup/localhost-FullVol-${ONEWEEKAGO}_*

    if [ ${DAYOFWEEK} -eq 0 ] ; then      # if文で判定に使用している値'0'は日曜日を指す。
        echo 'today is Sunday.'
        rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/quick-fd-FullVol-${TODAY}_* /data/bacula-backup/ && rm -f /data/bacula-backup/scat-FullVol-${TWOWEEKAGO}_*
        else
        echo 'today is not Sunday.'
        rsync -avz -e ssh root@10.0.0.10:/data/bacula-backup/quick-fd-DifferentialVol-${TODAY}_* /data/bacula-backup/ && rm -f /data/bacula-backup/scat-DifferentialVol-${ONEWEEKAGO}_*
    fi

exit 0

rsync && rm -f」と直列にしてるのはrsync出来なかった時(quick-sdが死んでる時)にquick-drのデータを消してくなかったからです。
って言うのも、東京に災害があってquick-sdが死んだ2週間後に「事業を再開させましょう!」→「保存期間2週間で、データありません!」じゃ話にならないですよね。
もっとマシな書き方あると思うんですが、面倒になっただけでした。笑

bacula-dirにquick-drのクライアントの設定configを作成

必要なスクリプトは揃ったので、これをBaculaで自動化させます。

[root@quick-dir ~]# cat /etc/bacula/client/00_quick-dr.conf
############################
# Job Information
############################
Job {
  Name = "quick-dr-job"
  Client = quick-dr
  JobDefs = "DefaultJob"
  FileSet= "quick-dr File Set"
  Schedule = "WeeklyCycleAfterBackup"
  Full Backup Pool = etc-Pool
  Client Run Before Job = "/var/spool/bacula/config-rsync.sh"
  Client Run Before Job = "/var/spool/bacula/data-rsync.sh"
  Client Run After Job = "/var/spool/bacula/catalog_restore.sh"
  Priority = 13
}

############################
# FileSet
############################
FileSet {
  Name = "quick-dr File Set"
}

############################
# bacula-fd Information
############################
Client {
  Name = quick-dr
  Address = 10.0.0.3
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-password"
  File Retention = 1 days
  Job Retention = 1 days
  AutoPrune = yes
}

全てのJobが完全に終わった後じゃないと意味が無いので、JobのPriorityを13にして一番最後にJobが走るようにしています。
00_quick-sd.confと一緒で何もバックアップされず、空のVolumeだけが作成されます。

上記ファイルを外部ファイルとして読み込む

[root@quick-dir ~]# grep "00_quick-dr.conf" /etc/bacula/bacula-dir.conf
@/etc/bacula/client/00_quick-dr.conf
[root@quick-dir ~]# /etc/init.d/bacula-dir restart
Stopping bacula-dir:                                        [  OK  ]
Starting bacula-dir:                                        [  OK  ]

これで設定が完了です。
Directorのステータスを見るとこんな感じの順序でjobが走ってくれます。

*status Director
bacula-dir Version: 7.4.4 (20 September 2016) x86_64-redhat-linux-gnu redhat
Daemon started 06-Apr-17 19:04, conf reloaded 06-Apr-2017 19:04:40
 Jobs: run=78, running=0 mode=0
 Heap: heap=385,024 smbytes=543,712 max_bytes=628,117 bufs=976 max_bufs=1,243

Scheduled Jobs:
Level          Type     Pri  Scheduled          Job Name           Volume
===================================================================================
Differential   Backup    10  13-Apr-17 02:05    quick-fd-job       *unknown*
Full           Backup    11  13-Apr-17 02:10    quick-sd-job       *unknown*
Full           Backup    12  13-Apr-17 02:10    BackupCatalog      *unknown*
Full           Backup    13  13-Apr-17 02:10    quick-dr-job       *unknown*
====

MySQLのReplication使えよーとかDRDBでいいじゃん!とかあると思いますが、quick-drはBaculaの検証にも使ってたりしていて、MySQLに書込みしたいのでこんな形になりました。


ってまぁ、クイックではこんな感じでBaculaを運用しています。 無理矢理使ってる感はありますが、、、Baculaに集約させとけばとりあえずは迷わないですし、後々別の方法を取るにしろスケールするにしろ見れば分かる状態にしています。

即実践できるBaculaの設定例【運用手順編】

前々回の【構築手順編その1】、前回の【構築手順編その2】 では構築部分を紹介しました。
今回は【運用手順編】として、どうBaculaを運用しているかを設定例やスクリプトを書きたいと思います。
ここおかしいよー!とかあれば、コソッと教えてもらえたらありがたいです!

ラーメンのスープが髭に付くことが最近の悩み。
matsBです。(๑•̀ㅂ•́)و✧


髭は伸ばしてる訳ではなく、単に伸びてるだけです。

運用部分は会社や規模によって大きく変わるので、一概にこれが正しいとは言えないんですがクイックではこうやってるよーって事を書いていきます。
逆に、「うちではこう運用してるよー」ってのがあれば、コメントに書いても直接連絡して頂いても嬉しいです!

前提 (前の記事からのおさらい)

前提環境

MySQLをインストール済。
iptables等のFirewallは一旦無視してます。

サーバ情報

役割 ホスト名 IPアドレス
Director quick-dir 10.0.0.1
Client quick-fd 10.0.0.2
Client(DR用) quick-dr 10.0.0.3
Storage quick-sd 10.0.0.10

bat(BaculaのGUIツール)

慣れてくると基本的にはコマンド(CUI)の方が圧倒的に早いんですが、慣れるまではGUIの方が分かりやすいです。
普段使ってるパソコンがWindowsであれば、Xming等を入れてdisplayをforwardできるようにしておいて、SSHクライアントもX11をforward出来るようにしておいて下さい。

動作環境の準備

[root@quick-dir ~]# yum install -y xorg-x11-apps
[root@quick-dir ~]# xeyes

とかでX Window Systemを使ってるアプリを起動させてちゃんと表示できれば、基本的にbatが使える環境になってます。
もしサーバ側にX11の準備をしてなくて「Error: Can’t open display:」とかで見れない場合は、

[root@quick-dir ~]# yum groupinstall "X Window System"

とかでインストールしてやれば、不要なものも入ってきますがとりあえずで動かすことは出来ます。

batのインストール

[root@quick-dir ~]# yum install -y bacula-console-bat

batの設定

[root@quick-dir ~]# cat /etc/bacula/bat.conf
Director {
  Name = quick-dir
  DIRport = 9101
  address = localhost
  Password = "dir-password"
}

Directorのサーバに入れたくなければ、自分のテスト環境等にbatとX Window Systemを入れて

address = localhost
 ↓
address = 10.0.0.1

って感じにIPアドレスをDirectorのサーバにすれば大丈夫です。

自動で古いVolume(Purged)のDELETEとファイル削除

【構築手順編】で書いた設定例だとVolumeはリサイクルされず、保存期間が過ぎたVolumeはPurgedになります。
これはデフォルトだと、「どのクライアント」の「どのレベルのバックアップ」で「何が最新なのか」が全然分からなかったので、Label Formatを全部ユニークでパッと見で全部分かるようにしたかったからです。

Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
quick-fd-DifferentialVol-2017-04-08_1130ってVolume名になります。

ユニークにしてるので、リサイクルさせると訳わからん状態になるからリサイクルさせてません。
ただ、bacula的にはPurgedになるだけでCatalogから削除もされないしVolumeの実体ファイルもそのまま残るので、いつかbacula-sdの容量が100%になって破綻してしまいます。
そこで、一日一回キレイに削除する作業が必要になりますが、手動はしんどいのでBaculaで自動化させます。

前提

【事実】
・quick-dirとquick-sdは別サーバ。
・quick-sdにbconsoleを入れていて、向き先はquick-dirになっている。
・bacula-sdの設定でファイルは/data/bacula-backup/に全て置かれている。
【願望】
・この削除作業は全てのバックアップが完了した後に実行したい。

purgedの数をチェック

シンプルに下記のようなシェルで、ステータスがPurgedのVolumeの数を見れます。

[root@quick-sd ~]# cat /var/spool/bacula/check_purged.sh
#!/bin/bash
echo "list volumes" | bconsole | grep "Purged" | awk {'print $4'} | wc -l

purgedの状態のVolumeのファイル削除とDELETE

PurgedをgrepしてVolume名を特定させて、ファイル削除して、BaculaからDELETEさせてます。

[root@quick-sd ~]# cat /var/spool/bacula/purged_delete.sh
#!/bin/bash
for f in `echo "list volume" | bconsole | grep "Purged" |awk -F" " '{print $4}'`; do
  rm -f /data/bacula-backup/$f;
  echo "delete volume=$f yes" | bconsole;
done

BaculaのJobにする

「・この削除作業は全てのバックアップが完了した後に実行したい。」
とあるので、cron等で定期実行してしまうとバックアップ完了時間が前後した時に対応できなくなってしまいます。
なので空のバックアップJobを作成して、シェルだけ動くようにしました。
本当はBaculaに全部やらせなくても解決出来る問題なんですが、せっかくだからBaculaで完結させてみた。って感じです。

bacula-fd(Backup Client)のインストール

[root@quick-sd ~]# yum install -y bacula-client

bacula-fd(Backup Client)の設定は前回説明したので割愛します。

bacula-dirにquick-sdのクライアントの設定configを作成

[root@quick-dir ~]# cat /etc/bacula/client/00_quick-sd.conf
############################
# Job Information
############################
Job {
  Name = "quick-sd-job"
  Client = quick-sd
  JobDefs = "DefaultJob"
  FileSet= "quick-sd File Set"
  Schedule = "WeeklyCycleAfterBackup"
  Full Backup Pool = etc-Pool
  Client Run After Job = "/var/spool/bacula/purged_delete.sh"
  Priority = 11
}

############################
# FileSet
############################
FileSet {
  Name = "quick-sd File Set"
}

############################
# bacula-fd Information
############################
Client {
  Name = quick-sd
  Address = 10.0.0.10
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-password"
  File Retention = 1 days
  Job Retention = 1 days
  AutoPrune = yes
}

JobのPriorityを11にすることによって、他のバックアップ(Priority=10)が完了した後に、purged_delete.shが動くことになり「・この削除作業は全てのバックアップが完了した後に実行したい。」を満たす事になります。
FileSetが空なのでファイルは何もバックアップされず、空のVolumeだけが作成されて1日でPurgedになるようにしています。

上記ファイルを外部ファイルとして読み込む

[root@quick-dir ~]# grep "00_quick-sd.conf" /etc/bacula/bacula-dir.conf
@/etc/bacula/client/00_quick-sd.conf
[root@quick-dir ~]# /etc/init.d/bacula-dir restart
Stopping bacula-dir:                                        [  OK  ]
Starting bacula-dir:                                        [  OK  ]

これで全てBaculaが自動で古いVolume(Purged)のDELETEとファイル削除をしてくれるようになりました。

注意点

今回説明した設定だと4週間の保存期間ですが、運用してる途中で「やっぱり2ヶ月」残したいなーと思ってPoolのVolume Retentionを「28 days」から「60 days」に変更したとします。

  Volume Retention = 28 days
    ↓
  Volume Retention = 60 days

この変更して再起動させても新規で作成されたVolumeが60日の保管期間になるだけで、古いVolumeは保存期間が4週間のままです。なので4週間経つとPurgedにされてしまいます。
そんな時は、下記のように変更したいVolumeと何日保存するかを書いて、VolRetentionを一括変更すれば楽な運用ができます。

[root@quick-dir ~]# cat retention.sh
#!/bin/bash

VolumeName=quick-fd-DifferentialVol
RetentionDate=60days

for f in `echo "list volume" | bconsole | grep $VolumeName |awk -F" " '{print $4}'`; do
  echo "update volume=$f VolRetention=$RetentionDate" | bconsole

done

jenkinsでデータのRestore

クイックではjenkinsを使ってますが、jenkinsのプラグインにBaculaは存在してませんでした。
jenkinsでポチッとビルドするだけでDBの復旧とか、DEV環境にデータ復元してすぐ使えるようになったら楽なのになーと思いやってみることにしました。

jenkinsサーバにbconsoleをインストール

[root@jenkins ~]# yum install bacula-console.x86_64
[root@jenkins ~]# cat /etc/bacula/bconsole.conf
Director {
  Name = quick-dir
  DIRport = 9101
  address = 10.0.0.1
  Password = "dir-password"
}

jenkinsのJobの設定

リストア後に何かしらの作業をしたいのですが、bconsoleからリストアするとBacula側からリストアが完了したかどうかを教えてくれません。
なので、「echo “messages”| bconsole」を実行してこっちから聞きに行かないと駄目です。
とりあえず特定のdumpをリストアして、リストア完了を待って、DBに入れるところまでを書きました。

#!/bin/bash

FileDate=`date +%y%m%d`
Termination=`echo "messages" | bconsole | tail | grep Termination | awk -F" " '{print $2$3$4$5}'`
SleepCount=1

echo "messages" | bconsole
echo "restore storage=quick-sd \
      client=quick-fd \
      where=/tmp/bacula-restores \
      restoreclient=jenkins \
      file=/var/spool/bacula/quick-fd_${FileDate}db.dump \
      mark current done yes" \
| bconsole 

while [ "$Termination" != '***RestoreError***' -a "$Termination" != 'RestoreOK' ]; do
  VolumesName=`echo "messages" | bconsole | tail | grep Termination | awk -F" " '{print $2$3$4$5}'`
  sleep 30
  if [ ${SleepCount} -lt 60 ] ; then
    SleepCount=`expr 1 + $SleepCount`
  else
    exit 0
  fi
done

if [ "${Termination}" = "RestoreOK" ] ; then
  mysql -u root -p????? -h quick-fd < /tmp/bacula-restores/var/spool/bacula/quick-fd_${FileDate}db.dump
  rm -rf /tmp/bacula-restores/*
fi

なんか無理矢理感が凄いですが、とりあえずバックアップされたdumpを突っ込むまではいけました。
JobじゃないからClientRunBeforeJobとか使えないですし、RestoreClientRunBeforeJobとか定義出来たらめっちゃ楽なのになー・・・・とか思いましたが、機能追加に期待ですね!

注意点

・リストア実行する前に「echo “messages” | bconsole」をしないと溜まってるmessagesが出てきてしまいます。
・sleepとCountの値は適当です。

その他

Baculaはとにかくマニュアルが充実してて、分からない事をググればすぐに探せるのがいいですね。(英語だけど)
まだまだ認知度もユーザも、ソリューションに比べたら少ないですがBaculaが広まったら情シスの年間予算とか凄い削れるのになーって思ったりしました。
Windowsも使えますし、ファイルサーバとか容量大きなバックアップはBaseJobを使えばその後は時間を掛けずにバックアップが可能になりますし。
まだまだ調べきれてない事も多いですが、今後も色々Baculaを触っていきたいと思います。

即実践できるBaculaの設定例【構築手順編その2】

前回 に続き、今回はBacula【構築手順編その2】を書きたいと思います。
【構築手順編その2】ではbacula-fd(Backup Client)とbacula-sd(Storage Daemon)の設定例と疎通確認方法を紹介します。


自分のデスク上に、飲み終わったペットボトルが溜まりがちです。
matsBです。(๑•̀ㅂ•́)و✧


ペットボトル集めの趣味はないのですが、捨てるタイミングをいつも逃してます。

Baculaの情報って海外サイトが基本で、英語の翻訳が出来ないと結構苦労します。
日本サイトや日本語マニュアルもあるにはあるんですが、実際の設定例や運用例がかなり少ないので、迷った方や困った方がいれば一例として参考にしてもらえればと思います!

前提 (前の記事からのおさらい)

前提環境

MySQLをインストール済。
iptables等のFirewallは一旦無視してます。

サーバ情報

役割 ホスト名 IPアドレス
Director quick-dir 10.0.0.1
Client quick-fd 10.0.0.2
Client(DR用) quick-dr 10.0.0.3
Storage quick-sd 10.0.0.10

bacula-fdの下準備

リポジトリの追加

Baculaの7系を入れるためにBaculaのリポジトリを追加。

【CentOS6用】
[root@quick-fd ~]# wget https://copr.fedorainfracloud.org/coprs/slaanesh/Bacula/repo/epel-6/slaanesh-Bacula-epel-6.repo -O /etc/yum.repos.d/slaanesh-Bacula-epel-6.repo

ここまでは【構築手順編その1】と一緒で、↓から【構築手順編その2】の始まりです!
まずは、bacula-fd(Backup Client)から。

bacula-fd(Backup Client)の準備

yum でインストール

[root@quick-fd ~]# yum install -y bacula-client

bacula-fd(Backup Client)の設定

/etc/bacula/bacula-fd.conf

[root@quick-fd ~]# cat /etc/bacula/bacula-fd.conf
Director {
  Name = quick-dir          # Director名
  Password = "fd-password"  # Directorとのパスワード
}

Director {
  Name = bacula-mon
  Password = "mon-fd-password"
  Monitor = yes
}

FileDaemon {
  Name = quick-fd           # Client名
  FDport = 9102
  WorkingDirectory = /var/spool/bacula
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib64/bacula
}

Messages {
  Name = Standard
  director = bacula-dir = all, !skipped, !restored
}

ってまぁ、ほとんどデフォルトに近い状態です。
これでクライアント側は設定完了です。

configチェックと再起動して適用

[root@quick-fd ~]# bacula-fd -t -c /etc/bacula/bacula-fd.conf
[root@quick-fd ~]# /etc/init.d/bacula-fd restart
Stopping bacula-fd:                                        [  OK  ]
Starting bacula-fd:                                        [  OK  ]

Directorからの疎通確認

クライアント側で設定後、bacula-dirからbacula-fdに接続できるか確認します。
下記のようにステータスが取れない場合は、Configにミスがあるか、ネットワーク(iptables)等に問題があります。

[root@quick-dir ~]# echo status Client=quick-fd | bconsole
Connecting to Director localhost:9101
1000 OK: 102 bacula-dir Version: 7.4.4 (20 September 2016)
Enter a period to cancel a command.
status Client=quick-fd
Connecting to Client quick-fd at 10.0.0.2:9102

quick-fd Version: 7.4.5 (07 February 2017)  x86_64-redhat-linux-gnu redhat
Daemon started 08- 32017 20:54. Jobs: run=0 running=0.
 Heap: heap=135,168 smbytes=16,926 max_bytes=16,943 bufs=56 max_bufs=56
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 07- 42017 15:38
No Jobs running.
====

Terminated Jobs:
====

bacula-fd(Backup Client)の設定はこれで設定完了です。
次に、bacula-sd(Storage Daemon)を説明します。

bacula-sdの下準備

リポジトリの追加

Baculaの7系を入れるためにBaculaのリポジトリを追加。

【CentOS6用】
[root@quick-sd ~]# wget https://copr.fedorainfracloud.org/coprs/slaanesh/Bacula/repo/epel-6/slaanesh-Bacula-epel-6.repo -O /etc/yum.repos.d/slaanesh-Bacula-epel-6.repo

bacula-sd(Storage Daemon)の準備

yum でインストール

【運用手順編】で出す予定ですが、PurgedになったVolumeとファイルをストレージ側から削除させてるのでbacula-consoleもインストールします。

[root@quick-sd ~]# yum install -y bacula-storage bacula-console

bacula-sd(Storage Daemon)の設定

/etc/bacula/bacula-sd.conf

FileChgr1にDeviceを複数指定してるんですが、これは同じ時間にバックアップが複数走ると、Deviceの数しかバックアップが走りません。
Deviceを2つにすると、2つ並列でバックアップが走りますし、Deviceを5つにすると5つ並列でバックアップが走ることが出来きるので、サーバのスペックと相談しながら数を調整すると幸せになれます。
Volume自体は/data/bacula-backupに全て保存しています。

[root@quick-sd ~]# cat /etc/bacula/bacula-sd.conf
Storage {
  Name = quick-sd
  SDPort = 9103 
  WorkingDirectory = "/var/spool/bacula"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
}

Director {
  Name = bacula-dir
  Password = "sd-password"
}

Director {
  Name = bacula-mon
  Password = "mon-sd-password"
  Monitor = yes
}

Autochanger {
  Name = FileChgr1
  Device = FileChgr1-Dev1, FileChgr1-Dev2, FileChgr1-Dev3, FileChgr1-Dev4, FileChgr1-Dev5
  Changer Command = ""
  Changer Device = /dev/null
}

Device {
  Name = FileChgr1-Dev1
  Media Type = FileStorage
  Archive Device = /data/bacula-backup
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}

Device {
  Name = FileChgr1-Dev2
  Media Type = FileStorage
  Archive Device = /data/bacula-backup
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}

Device {
  Name = FileChgr1-Dev3
  Media Type = FileStorage
  Archive Device = /data/bacula-backup
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}

Device {
  Name = FileChgr1-Dev4
  Media Type = FileStorage
  Archive Device = /data/bacula-backup
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}

Device {
  Name = FileChgr1-Dev5
  Media Type = FileStorage
  Archive Device = /data/bacula-backup
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = yes;
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}

Messages {
  Name = Standard
  director = bacula-dir = all
}

configチェックと再起動して適用

[root@quick-sd ~]# bacula-sd -t -c /etc/bacula/bacula-sd.conf
[root@quick-sd ~]# /etc/init.d/bacula-sd restart
Stopping bacula-fd:                                        [  OK  ]
Starting bacula-fd:                                        [  OK  ]

Directorからの疎通確認

クライアント側で設定後、bacula-dirからbacula-sdに接続できるか確認します。
接続出来た場合は、下記のように各Deviceのステータスが取得出来ます。
ステータスが取れない場合は、Configにミスがあるか、ネットワーク(iptables)等に問題があります。

[root@quick-dir ~]# echo status Storage | bconsole
Connecting to Director localhost:9101
1000 OK: 102 bacula-dir Version: 7.4.4 (20 September 2016)
Enter a period to cancel a command.
status Storage
Automatically selected Storage: quick-sd
Connecting to Storage daemon quick-sd at 10.0.0.10:9103

bacula-sd Version: 7.4.7 (16 March 2017) x86_64-redhat-linux-gnu redhat
Daemon started 28- 32017 12:08. Jobs: run=143, running=0.
 Heap: heap=155,648 smbytes=390,855 max_bytes=1,599,265 bufs=149 max_bufs=496
 Sizes: boffset_t=8 size_t=8 int32_t=4 int64_t=8 mode=0,0

Running Jobs:
No Jobs running.
====

Jobs waiting to reserve a drive:
====

Terminated Jobs:
====

Device status:
Autochanger "FileChgr1" with devices:
   "FileChgr1-Dev1" (/data/bacula-backup)
   "FileChgr1-Dev2" (/data/bacula-backup)
   "FileChgr1-Dev3" (/data/bacula-backup)
   "FileChgr1-Dev4" (/data/bacula-backup)
   "FileChgr1-Dev5" (/data/bacula-backup)

Device file: "FileChgr1-Dev1" (/data/bacula-backup) is not open.
    Available Space=3.669 TB
==

Device file: "FileChgr1-Dev2" (/data/bacula-backup) is not open.
    Available Space=3.669 TB
==

Device file: "FileChgr1-Dev3" (/data/bacula-backup) is not open.
    Available Space=3.669 TB
==

Device file: "FileChgr1-Dev4" (/data/bacula-backup) is not open.
    Available Space=3.669 TB
==

Device file: "FileChgr1-Dev5" (/data/bacula-backup) is not open.
    Available Space=3.669 TB
==
====

Used Volume status:
====

Attr spooling: 0 active jobs, 0 bytes; 126 total jobs, 149,843,546 max bytes.
====

bacula-consoleの設定

quick-sdにbacula-consoleを入れたので、bconsoleの設定も書きたいと思います。

/etc/bacula/bconsole.conf

[root@quick-sd ~] cat /etc/bacula/bconsole.conf
Director {
  Name = quick-dir          # Director名
  DIRport = 9101            # Directorポート
  address = 10.0.0.1        # DirectorのIPアドレス
  Password = "dir-password" # Directorのパスワード
}

configの確認と接続テスト

[root@quick-sd ~]# bconsole -t -c /etc/bacula/bconsole.conf
[root@quick-sd ~]# bconsole
Connecting to Director 10.0.0.1:9101
1000 OK: 102 bacula-dir Version: 7.4.4 (20 September 2016)
Enter a period to cancel a command.
*http://aimstogeek.hatenablog.com/entry/2017/04/12/213752

ってまぁ、bconsoleはこれだけです。
これで一通りの設定が完了して、Baculaでquick-fdのバックアップを取得できるようになりました。
次回は【運用手順編】として、クイック内でどうBaculaを運用しているかを設定例やスクリプトを書きたいと思います。

即実践できるBaculaの設定例【構築手順編その1】

社内サーバのバックアップは以前までARCserveを使ってたんですが、Backup対象も増えて限界が来たので最近Baculaにしました。
その時の備忘録として、最初のインストールからどんな運用をしてるかまでを
設定例含めて紹介します!!
今回は【構築手順編その1】です。


レッドブルよりライフガード派です。
matsBです。(๑•̀ㅂ•́)و✧


Baculaって何?って方も結構多いかと思いますが、ざっくり説明すると「統合管理バックアップソフト」でNetVaultやARCserveとかに近いオープンソースのソフトです。
※厳密には違いますが、統合管理バックアップってとこだけを取った意味です。
Baculaは「構築が面倒」とか「動くまでに時間がかかる」とか言われてますが、こんな感じに作れば簡単だよーって事を紹介します!

環境

CentOS 6.7
MySQL 5.6
Bacula 7.4.4

前提

前提環境

MySQLをインストール済。
iptables等のFirewallは一旦無視してます。

サーバ情報

役割 ホスト名 IPアドレス
Director quick-dir 10.0.0.1
Client quick-fd 10.0.0.2
Client(DR用) quick-dr 10.0.0.3
Storage quick-sd 10.0.0.10

下準備

リポジトリの追加

Baculaの7系を入れるためにBaculaのリポジトリを追加。

【CentOS6用】
[root@quick-dir ~]# wget https://copr.fedorainfracloud.org/coprs/slaanesh/Bacula/repo/epel-6/slaanesh-Bacula-epel-6.repo -O /etc/yum.repos.d/slaanesh-Bacula-epel-6.repo

bacula-dir(Bacula Director)の準備

yum でインストール

[root@quick-dir ~]# yum install -y bacula-client bacula-common bacula-console bacula-console-bat bacula-debuginfo bacula-devel bacula-director bacula-docs bacula-libs bacula-libs-sql bacula-traymonitor

※下記の2ファイル通りに実行すれば詰まるところは無いはずで、この記事も基本的に下記ファイルに則ってます。  
[root@quick-dir ~]# /usr/share/doc/bacula-common-7.4.4/README.Redhat
[root@quick-dir ~]# /usr/share/doc/bacula-common-7.4.4/quickstart_mysql.txt

BacualがMySQL使用するための準備

  • 使用DBの選択
今回はMySQLを使用するので、MySQLを選択します
[root@quick-dir ~]# alternatives --config libbaccats.so

3 プログラムがあり 'libbaccats.so' を提供します。

  選択       コマンド
-----------------------------------------------
   1           /usr/lib64/libbaccats-mysql.so
   2           /usr/lib64/libbaccats-sqlite3.so
*+ 3           /usr/lib64/libbaccats-postgresql.so

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:1
[root@quick-dir ~]#
  • DB/table/baculaユーザの作成
・DBの作成
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/create_mysql_database -u root -p
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Creation of bacula database succeeded.

・tableの作成
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/make_mysql_tables -u root -p
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Creation of Bacula MySQL tables succeeded.

・MySQLのbaculaユーザの作成
※デフォルトだとパスワードなしになってしまいます。
[root@quick-dir ~]# /bin/sh /usr/libexec/bacula/grant_mysql_privileges -u root -p
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Created MySQL database user: bacula
Enter password:        #←MySQLのパスワード(今回だったらrootのパスワード)
Host    User    Select_priv     Insert_priv     Update_priv     Delete_priv     Create_priv     Drop_priv       Reload_priv     Shutdown_priv   Process_priv    File_priv       Grant_priv      References_priv Index_priv      Alter_priv      Show_db_priv    Super_priv      Create_tmp_table_priv   Lock_tables_priv    Execute_priv     Repl_slave_priv Repl_client_priv        Create_view_priv        Show_view_priv  Create_routine_priv     Alter_routine_priv      Create_user_priv        Event_priv      Trigger_priv    Create_tablespace_priv  ssl_type        ssl_cipher      x509_issuer     x509_subject    max_questions   max_updates max_connections  max_user_connections    plugin  authentication_string   password_expired        password_last_changed   password_lifetime       account_locked
localhost       root    Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y       Y                                       0       0       0       0   mysql_native_password    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B       N       2016-08-04 18:26:57     NULL    N
%       bacula     N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N                                       0       0       0       0   mysql_native_password    *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29       N       2017-04-06 17:57:51     NULL    N
localhost       bacula     N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N       N                                       0       0       0   0mysql_native_password   *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29       N       2017-04-06 17:57:51     NULL    N
Privileges for user bacula granted on database bacula.

grant_mysql_privilegesをそのまま使うと、baculaユーザはパスワード無しです。
パスワードをちゃんと掛けたい場合は、MySQLで直接パスワード付けるか、grant_mysql_privileges内の「db_password=」にパスワードを入れてやってください。

#!/bin/sh
#
# shell script to grant privileges to the bacula database
#
# Copyright (C) 2000-2016 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
db_user=${db_user:-bacula}
bindir=/usr/bin
db_name=${db_name:-bacula}
db_password=bacula_quick        #bacula_quickってパスワードを付けたい場合
if [ "$db_password" != "" ]; then
   pass="identified by '$db_password'"
fi

BacualのConfigの準備

  • 権限周りを適切なのに変更していきます。
[root@quick-dir ~]# chown -R root:root /etc/bacula
[root@quick-dir ~]# chmod 755 /etc/bacula
[root@quick-dir ~]# chmod 640 /etc/bacula/*
[root@quick-dir ~]# chgrp bacula /etc/bacula/bacula-dir.conf /etc/bacula/query.sql
  • config内のBacula間で使用するパスワードを一括で置換します。
[root@quick-dir ~]# sed -i -e 's/@@DIR_PASSWORD@@/dir-password/g' \
        -e 's/@@FD_PASSWORD@@/fd-password/g' \
        -e 's/@@SD_PASSWORD@@/sd-password/g' \
        -e 's/@@MON_DIR_PASSWORD@@/mon-dir-password/g' \
        -e 's/@@MON_FD_PASSWORD@@/mon-fd-password/g' \
        -e 's/@@MON_SD_PASSWORD@@/mon-sd-password/g' \
        /etc/bacula/*.conf
  • bconsoleを設定します。
[root@quick-dir ~]# cat /etc/bacula/bconsole.conf
Director {
  Name = quick-dir          # Director名
  DIRport = 9101            # Directorポート
  address = 10.0.0.1        # DirectorのIPアドレス
  Password = "dir-password" # Directorのパスワード
}
  • 記述に問題無いかConfigをコマンドで確認します。
[root@quick-dir ~]# bconsole -t -c /etc/bacula/bconsole.conf
[root@quick-dir ~]# bacula-dir -t -c /etc/bacula/bacula-dir.conf
  • 問題なけば再起動して、bconsoleでstatusを取れるか確認します。
[root@quick-dir ~]# /etc/init.d/bacula-dir restart
Stopping bacula-dir:                                       [  OK  ]
Starting bacula-dir:                                       [  OK  ]
[root@quick-dir ~]# echo status dir=quick-dir | bconsole
Connecting to Director localhost:9101
1000 OK: 102 bacula-dir Version: 7.4.4 (20 September 2016)
Enter a period to cancel a command.
status dir=quick-dir
bacula-dir Version: 7.4.4 (20 September 2016) x86_64-redhat-linux-gnu redhat
Daemon started 05-Apr-17 18:15, conf reloaded 05-Apr-2017 18:15:06
 Jobs: run=13, running=0 mode=0
 Heap: heap=385,024 smbytes=345,677 max_bytes=393,653 bufs=947 max_bufs=1,202

Scheduled Jobs:
Level          Type     Pri  Scheduled          Job Name           Volume
===================================================================================

bacula-dir(Bacula Director)の設定

弊社ではDirectorの設定やテンプレートと、バックアップ対象のクライアントでConfigファイルを分割させて記述しています。って言うのも、作成経験のある方は分かると思いますが、バックアップクライアントが多くなるとbacula-dir.confの行が無限に増えてってConfigの上に行ったり下に行ったり、、、メンテナンスが凄くやりにくいです。

/etc/bacula/bacula-dir.conf

基本的に下記を設定してしまえば、その後そんなに困らずにクライアントを追加できるようになるはずです。
ちょいちょい必要な事は修正してますが、ほとんどがデフォルトのままで使用しています。

[root@quick-dir ~]# cat /etc/bacula/bacula-dir.conf

########################################################################
#
# Director Information
#
########################################################################
Director {
  Name = quick-dir
  DIRport = 9101
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/spool/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 20
  Password = "dir-password"
  Messages = Daemon
}

########################################################################
#
# Job Template
#
########################################################################
JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Differential
  Client = localhost
  Schedule = "WeeklyCycle"
  Storage = backup-server
  Messages = Standard
  Pool = Default
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/spool/bacula/%c.bsr"
}

########################################################################
#
# Schedule
#
########################################################################

Schedule {
  Name = "WeeklyCycle"
  Run = Full sun at 2:05
  Run = Differential mon-sat at 2:05
}

########################################################################
#
# bacula-sd Information
#
########################################################################
Storage {
  Name = quick-sd
  Address = 10.0.0.10
  SDPort = 9103
  Password = "sd-password"
  Device = FileChgr1
  Media Type = FileStorage
  Maximum Concurrent Jobs = 10
}

########################################################################
#
# Messages Information
#
########################################################################
Messages {
  Name = Standard
  mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = root@localhost = all, !skipped
  operator = root@localhost = mount
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
  catalog = all
}

#
# Message delivery for daemon messages (no job).
Messages {
  Name = Daemon
  mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = root@localhost = all, !skipped
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
}

########################################################################
#
# Pool Template
#
########################################################################
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = no
  AutoPrune = yes
  Volume Retention = 28 days
  Maximum Volume Jobs = 1
  Maximum Volumes = 100
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
}
Pool {
  Name = etc-Pool     # ※1
  Pool Type = Backup
  Recycle = no
  AutoPrune = yes
  Volume Retention = 1 days
  Maximum Volume Jobs = 1
  Maximum Volumes = 10
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
}

########################################################################
#
# Console Information
#
########################################################################
Console {
  Name = bacula-mon
  Password = "mon-dir-password"
  CommandACL = status, .status
}

########################################################################
#
# Catalog Information
#
########################################################################
Client {
  Name = localhost
  Address = localhost
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-password"
  File Retention = 30 days
  Job Retention = 1 months
  AutoPrune = yes
}

Job {
  Name = "BackupCatalog"
  JobDefs = "DefaultJob"
  Level = Full
  FileSet="Catalog"
  Schedule = "WeeklyCycleAfterBackup"
  RunBeforeJob = "/usr/libexec/bacula/make_catalog_backup.pl MyCatalog"
  RunAfterJob  = "/usr/libexec/bacula/delete_catalog_backup"
  Write Bootstrap = "/var/spool/bacula/%n.bsr"
  Priority = 12     # ※2
}

Schedule {
  Name = "WeeklyCycleAfterBackup"
  Run = Full sun-sat at 2:10
}

FileSet {
  Name = "Catalog"
  Include {
    Options {
      signature = MD5
    }
    File = "/var/spool/bacula/bacula.sql"
  }
}

Catalog {
  Name = MyCatalog
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula_quick"
}

########################################################################
#
# Bacula Clients
#
########################################################################
@/etc/bacula/client/quick-fd.conf

※1【運用手順編】で説明しますが、空のバックアップJobのVolumeを保存する為にPoolを作成してます。
※2 デフォルトのPriorityは「11」ですが、【運用手順編】に出てくる空のバックアップJobの関係で「12」にしています。
※3 DR(disaster recovery)を目的としたクライアントです。

各バックアップクライアントのconfig

bacula-dir.confには外部ファイルとして読み込ませていますが、各クライアント毎にconfigを分けて運用するようにしました。 新しいバックアップクライアントを追加する場合、quick-fdを他のホスト名に一括置換すれば、すぐにクライアントが追加できるようになります。

[root@quick-dir ~]# cat /etc/bacula/client/quick-fd.conf

############################
# Job Information
############################
Job {
  Name = "quick-fd-job"
  Client = quick-fd
  JobDefs = "DefaultJob"
  FileSet= "quick-fd File Set"
  Full Backup Pool = quick-fd-Pool-Full    # FullとDiffでPoolを分けてます
  Differential Backup Pool = quick-fd-Pool
  ClientRunBeforeJob = "/var/spool/bacula/mysql_backup.sh"    # MySQLを使用してる想定で、
  ClientRunAfterJob = "/var/spool/bacula/mysql_backup_del.sh" # Before/Afterでスクリプトをセット
}

############################
# FileSet
############################
FileSet {
  Name = "quick-fd File Set"
  Include {
    Options {
      signature = MD5
      Compression = GZIP
    }
    Options {
      wildfile = "*.log"    # logやtmpをバックアップ対象から除外
      wilddir = "*/logs"
      wilddir = "*/tmp"
      exclude = yes
    }
    File = /var/www/quick-fd    # バックアップ対象
    File = /etc
    File = /var/spool/cron
    File = /var/spool/bacula
    Options {
      Compression = GZIP    # 上のOptionsでGZIPが効かなかったのでここでもセットしてます
    }
  }
}

############################
# quick-fd Information
############################
Client {
  Name = quick-fd
  Address = 10.0.0.2
  FDPort = 9102
  Catalog = MyCatalog
  Password = "fd-password"
  File Retention = 30 days
  Job Retention = 1 months
  AutoPrune = yes
}

############################
# Pool Information
############################
Pool {
  Name = quick-fd-Pool-Full
  Pool Type = Backup
  Recycle = no                # Volumeの再利用はさせないように
  AutoPrune = yes             # 保管期間が終わったらPurgedになるように
  Volume Retention = 28 days  # 保管期間を4週間に
  Maximum Volume Jobs = 1     # 1Volumeに1Jobしか入らないように
  Maximum Volumes = 100
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
  # ↑のフォーマットはパット見で分かりやすいようにしました。
  # 上記の例で動かすとボリューム名は↓のようになります。
  # Fullの場合:quick-fd-FullVol-2017-04-05_954
  # Diffの場合:quick-fd-DifferentialVol-2017-04-05_954
  # お尻に付けてるJobIDは、ボリューム名が被らないようにって理由で付けてます。
}

Pool {
  Name = quick-fd-Pool
  Pool Type = Backup
  Recycle = no
  AutoPrune = yes
  Volume Retention = 28 days
  Maximum Volume Jobs = 1
  Maximum Volumes = 100
  Label Format = "${Client}-${Level}Vol-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}_${JobId}"
}

とりあえずこれで、Director単体の設定は完了です。 次回は【構築手順編その2】 として、bacula-sd(Storage Daemon)とbacula-fd(Backup Client)の設定例と疎通確認方法を書きたいと思います。

Docker-composeでCentOS7のコンテナを立ち上げてhttpdサービスを起動してみた

こんにちは、みっきーです。

先輩からDockerを引き継いだは良いものの、何がなんだかさっぱり・・・。
そこで今回は、Dockerで遊んだ記録を書きたいと思います。
途中、実行に失敗するのでご注意ください。

登場人物のステータス

  • みっきー(私):新卒1年目
  • みっちー   :SREチームの、さわやかイケメン先輩

環境

OS Docker Engine
CentOS7 1.12.3

概要

  • Docker-composeでCentOS7のコンテナを立ち上げる
  • コンテナを立ち上げた時点で、httpdサービスが起動してる状態にする

とりあえずやってみる

Docker Engineのインストール

$ yum update
$ curl -fsSL https://get.docker.com/ | sh
$ systemctl start docker

動かない!!
そういえばインストール時に作成されるグループに実行ユーザを登録しないとだめって言われたような・・・

ということでdockerグループにユーザを追加

$ sudo usermod -aG docker mikki
$ sudo usermod -aG wheel docker

ついでにwheelにdockerユーザを入れておくと、いちいちsudoしなくて済むらしいです。

切断再接続後、DockerEngine起動

$ systemctl start docker
$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) 

起動しましたぁ!

CentOS7のイメージをひっぱてコンテナを立ててみる

$ docker pull centos:7
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   67591570dd29        3 months ago        192 MB

$ docker run centos:7
$ docker ps -a
b9f8c5ca727a        centos:7            "/bin/bash"              18 seconds ago      Exited (0) 17 seconds ago                          elegant_banach

”Exited (0) 17 seconds ago”一瞬で落ちてるじゃーん!
Bashにアクセスしたいよー。ということで起動時にオプションを追加

$ docker run -it centos:7
[root@7cbf45351e50 /]#

CentOS7のコンテナを立ち上げることに成功! 簡単ですね♪

Apache2.4とphp5.6をインストール

# yum -y update
# yum -y install httpd
# yum -y install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum -y install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd
# systemctl start httpd
Failed to get D-Bus connection: Operation not permitted

ん?
rootなのに??なんで??
どうやら、コンテナを立てる際に–privilegedを付けてあげないといけないようです。
詳しいことはこちらを参照
Docker privileged オプションについて - Qiita
CentOS7 に Docker をインストールし、CentOS7コンテナ上で Apache を起動する: ある SE のつぶやき

# exit
$ docker run -it -privileged centos:7 -p 8080:80 /sbin/init
Apache2.4とphp5.6をインストール
# systemctl start httpd

動いた!!

ここからやっとDocker-compose.yml作成

まずは、Dockerfileの作成

コンテナ内で行ったことをそのまま書き込み

FROM centos:7
MAINTAINER "mikki"

RUN yum -y update

# install apache2.4
RUN yum -y install httpd

# install php5.6
RUN yum -y install epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum remove php-*
RUN yum -y install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd

CMD docker-entrypoint.sh


docker-entrypoint.shの中身
#!/bin/bash
system enable httpd
system start httpd
system status httpd

docker-compose.yml作成

ここで問題発生。
私、yamlの書き方知りませんでした。。。
困ったぞと、お昼休みに歯磨きを始めたら救世主みっちーさんと出くわします。

私「みっちーさん。Dockerがゆうことを聞いてくれないんです(泣)」
    中省略(やりたいこと伝え中)
みっちーさん「とりあえずこうかけばいいよ!」

ババーン!

version: '2'
services:
  web:
    build: ./docker
    ports:
      - "8080:80"
    volumes:
      - ./:/var/www/html
    working_dir: /var/www/html
    privileged: true
    command: /sbin/init

やったーyamlクリアした-!
コレでやっと立ち上がるぞ!!と思ってbuild後upしたら

$docker-compose build
$docker-compose up
Starting masano_web_1
Attaching to masano_web_1

とまった・・・。
ブラウザからアクセスできず、bashに入ってサービスが立ち上がってるか確認しても動いてない!!
次の日の朝、みっちーさんが出勤してきてそうそうにヘルプを出すことに。

私「みっちーさんみっちーさん動かないよぉ。あ、おはようございます。」
みっちーさん「おはよー。うーん。ちょっと調べてみるね。」

ということで、救世主みっちーさん、Dockerを触ったことがなかったのに色々調べてくれました。


概念的な話
そもそも、Dockerfile には「コンテナ”起動時”に実行してほしいコマンドは書かない」
(らしいです)
→ サービスの起動とか、コンテナが立ち上がった時にやってほしいことは、ここでは書くべきでは無いらしいです。
※ ここで書くのは、コンテナイメージを作る=docker compose build した時に、実行してほしい内容(rpmのinstallとか、ファイルのコピーとか)を書く。
じゃあサービスの起動はどーしたらいい?
→ Centosの起動時に、サービスが自動で立ち上がるようにすれば良い。
  = CMD systemctl enable httpd って書いてあげれば良い。
みたいです。
全部グーグルせんせーの受け売りですが・・・

docker-compose.yml の編集 (とりあえずこんな感じで

# vi ./docker-compose.yml
version: '2'
services:
  web:
    #build: ./docker
    build: /home/micchi/docker
    ports:
      - "8081:80"
    volumes:
      - ./:/var/www/html/micchi_test
    working_dir: /var/www/html/micchi_test
    privileged: true

Dockerfile の編集 

# vi ./docker/Dockerfile
FROM centos:7
MAINTAINER "micchi"

# install apache2.4
RUN yum -y install httpd

# install php5.6
RUN yum -y install epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum remove php-*
RUN yum -y install --enablerepo=remi,remi-php56 php php-devel php-mbstring php-pdo php-gd

# enable service.
RUN systemctl enable httpd

# exec.
CMD ["/sbin/init"]

動いた-!!
自分でDockerfileやcomposeを書いたことがなかったので、すごくいい勉強になりました。
覚えちゃえばDockerなんて怖くないですね!お強い味方になりますね!!
開発環境も作り放題の配布し放題です~!

これで少しは、インフラ音痴を脱却できるといいなぁ。

ブラックサンダー買いに行きたいので、今日はこの辺で失礼します(`・ω・́)ゝ

EmacsからSpacemacsに乗り換えました

こんにちは、五所です。

最近、EmacsからSpacemacsに乗り換えました。

f:id:aimstogeek:20170209100723p:plain

結論としては、非常に快適です。

EmacsVimに対する想い

Emacsは、拡張性が非常に高いです。 エディタの枠を超えて、ファイラー、Gitクライアント、ターミナルエミュレーター、Webブラウザ、画像ビューア、などで使えます。 またタグジャンプや auto-complete.el を使えばIDEとしての機能も満足できます。

Vimは、圧倒的なテキスト編集の速さが売りです。UIが優れています。

EmacsではCtrlキーを常に押している必要がありますが、Vimではモードの切り替えの概念があるため、カーソル移動時と入力時の指の使い方が全く異なります。 これが心地よく、キーコンボを入力するのは、まるで格ゲーをしているような気分にさせてくれます。

Spacemacs

spacemacs.org

両者を統合したのがSpacemacs(正確に言えばEvilパッケージ)で、 Emacsの高い拡張性の上で、VimのUIを実現しました。 またSpaceキーを起点としてEmacsのコマンドを発行することで、より速く効率的なキーバインドを実現しています。

公式サイトでは

The best editor is neither Emacs nor Vim, it’s Emacs and Vim!

と言っています。

日本語の紹介記事もちらほらあります。

spacemacsについて ~~spacemacsが最強で最高で神エディタであると思い始めた件~~ - Qiita

Vimも秘伝のタレも飲み込むEmacsの超強力ディストリビューションSpacemacsまとめ - Qiita

少しだけ紹介すると、

  • Space f f でファイルを開く
  • Space g s で Git status
  • Space w w で ウィンドウ切り替え
  • Space w - で ウィンドウ水平分割

など、かなり直感的です。

日本語入力について

※ ここからはLinuxでの話です。Macの方は別の解決策があるんじゃないかなと思います。Windowsは(ry

Vimは、日本語入力との相性の悪さが随所で指摘されています。

特にターミナルで使っている時は、モード切り替えによって、インサートモードからノーマルモードに移行すると、日本語入力のままになるので不便です。

これを防ぐために、

.vimrc

autocmd InsertLeave * call system('fcitx-remote -c')

という設定もありますが、特定のIMEに依存した挙動をあまり入れたくはありません。

Emacsでは、 mozc パッケージを使うことによりEmacs上で日本語を入力できるようになります。

Emacsが日本語入力を制御するので、非常に柔軟な挙動が実現できています。

またMozcはGoogle日本語入力オープンソース版なので、使いやすいでしょう。

SpacemacsでEvilモードを使ってVimキーバインドを再現している時は、ターミナルのVimの日本語入力より数段快適です。

下記のような挙動です。

  • ノーマルモードに切り替えると、自動的に日本語入力OFF
  • インサートモードに切り替えると、自動的に日本語入力ON

で、これはSpacemacsとはあまり関係が無いのですが、EmacsでMozcを動かす設定です。

~/.spacemacs

(defun dotspacemacs/layers ()
  ;; (中略)
  (setq-default
   dotspacemacs-additional-packages '(
                                      mozc
                                      )
  ;; (中略)
   dotspacemacs-install-packages 'used-only))


(defun dotspacemacs/user-config ()
  ;; (中略)

  ;; Mozc settings
  (set-language-environment "Japanese")
  (setq default-input-method "japanese-mozc")
  (setq mozc-candidate-style 'echo-area)

  (defun mozc-start()
    (interactive)
    (set-cursor-color "blue")
    (message "Mozc start")
    (mozc-mode 1))

  (defun mozc-end()
    (interactive)
    (set-cursor-color "gray")
    (message "Mozc end")
    (mozc-mode -1))

  (bind-keys*
   ("<henkan>" . mozc-start)

  (bind-keys :map mozc-mode-map
             ("q" . mozc-end)
             ("C-g" . mozc-end)
             ("C-x h" . mark-whole-buffer)
             ("C-x C-s" . save-buffer))

  )

Mozcが有効になっている時は、カーソルの色を変えています。もっと分かりやすい色にしないと。

また、自分はUSキーボードを使っているので、下記の設定で右AltをHenkanキーにリマップしています。

~/.xmodmap

! Clear alt mapping
clear mod1

! Alt_R => Henkan
! Set Henkan to Fcitx & Emacs IME activation key
keycode 108 = Henkan Henkan NoSymbol NoSymbol

Mozc自体のインストールは下記です。Archはパッケージ名が fcitx-mozc と競合するので注意。

# Arch
sudo pacman -S emacs-mozc

# Ubuntu / Debian
sudo apt-get install emacs-mozc

これで、日本語入力ができるようになりました。

ススメ

Emacs派も、Vim派も、そうでない方もSpacemacsをぜひ試してみて下さい。

インストールは、GitHubのREADMEに従えば、迷うことは無いと思います。

github.com

Vue.jsの流行とネイティブアプリフレームワークWeex、そして台頭する中国語コミュニティについて

こんにちは。五所です。

最近は時代についていこうと、フロントエンドの情報収集をしています。

React, Redux, AngularJS, ES6, Webpack, Gulp, Babel, Yarn...

情報収集すればするほど、頭がいっぱいになるのですが、その過程で感じたこと、考えたことをつらつら述べさせて頂きます。

Vue.jsについて

github.com

Vue.jsは近年非常に盛り上がりを見せているJavaScriptフレームワークです。

特に2016年にすさまじい勢いで伸びました。

GitHubのスター数は2016年だけで26400獲得し、2017年1月21日現在では40000スターを超えています。

risingstars2016.js.org

Vue.jsは

  • the 10th most starred JavaScript project on GitHub
  • the 3rd most starred among all projects in 2016

とのことです。

medium.com

思想的にはReactに近く、仮想DOM、コンポーネント志向、シンプルなエコシステムなどが特徴です。

Weexについて

github.com

Weexは、Vue.jsを使ったiOS/Android用ネイティブアプリのフレームワークです。

ReactにおけるReact-nativeに相当するものですね。

開発しているのは、中国のアマゾンと言われ、Tencentと並ぶ中国最大のIT企業Alibabaです。

こちらのIssueにある通り、Weexは既に中国最大の通販サイトTaobaoのモバイル版で本番投入されています。

github.com

Vue.jsと合わせて今後も注目していく必要がありそうです。

台頭する中国語コミュニティ

こちらのHacker newsで指摘されている通り、WeexのGitHubでの意見交換は主に中国語で行われています。

we are using Weex for our app on production. Weex is pretty solid platform | Hacker News

作っているのが中国企業なので、当然といえば当然ですが。もちろん英語での議論もあります。

また、上述のVue.jsでも時折中国語でIssueが立ちます。Vue.jsの作者(Meteorの作者でもあります)が中国人であるためでしょうか。

github.com

ただし、単にこのIssueを立てた方が英語を使わないだけで、他のIssueはだいたい英語です。

Vue.jsとは関係ありませんが、SpaceVimの開発者も中国人で、QQのチャットルームがあり、Gitterでの会話も中国語+英語です。

github.com

SpaceVim/SpaceVim - Gitter

個人的な話

個人的な話で恐縮ですが、自分の通っていた一橋大学で、何人かの中国人国費留学生と友人になりました。

日本語上級、TOEFL110点以上、GPA4など秀才ばかりでしたが、 北京大学清華大学には(学力的に)絶対に入れないため、一橋大学に国費留学という道を選んだそうです。

認めたくはありませんが、これが事実です。

世界中の優秀なエンジニアと競争できるよう、日々勉強していかないといけないと思っています。