ディスクサーバーが停電でクラッシュをしたりするとその損害ははかり知れないのでUPSを導入します。これまで,三菱やオムロンのUPSを使ってきましたが,FreeBSDでも普通に連携がとれるAPCが一番便利だというのが私の結論です。そのため,三菱の古いUPSを廃棄してかわりにAPCのBR 1000S-JPを導入しました。OSとUPSの通信はUSBを介して行い,ソフトウェアとしてはapcupsdを使います。USBケーブルはPC側は普通のA端子ですが,UPS側はRJ-45タイプのよくわからんコネクタで,普通にUSB-Bにしておいてくれれば汎用のケーブルが使えるのに専用品をつけてくるところが嫌な感じです。APCは便利だけど昔からそういうせこいところが嫌いでした。
BR 1000Sに接続しているサーバーはディスクサーバーだけではなく,バックアップ用のサーバーなどもつなぐことにします。そのため,電源が失われたことを互いにネットワーク越しに情報共有してshutdownさせなくてはなりません。
ディスクサーバーとUPSを専用のUSBケーブルで接続し,それ以外のサーバーはディスクサーバーを参照するようにします。
いずれのサーバーもpkg install apcupsdでバイナリをインストールすることができます。古いサーバーでは古いOS (FreeBSD 11とか12!)が動いていて,いまさらpkgではインストールできません。FreeBSD 12のサーバーにはgmakeをインストール済みだったので,portsから簡単にインストールできました。
cd /usr/ports/sysutils/apcupsd/
make
make install
オプションがいろいろ表示されますが,デフォルトのままコンパイルしました。
一方,FreeBSD 11のサーバーにはgmakeもインストールしていなかったのでgmakeのインストールからやらねばなりませんでした。
cd /usr/ports/devel/gmake/
make
ここで,portsが古いとか危険だとか言われて止まってしまうのですが,これを回避するために,
make DISABLE_VULNERABILITIES=yes
make install
とやって無理やりインストールします。gmakeがインストールできたら,
cd /usr/ports/sysutils/apcupsd/
make DISABLE_VULNERABILITIES=yes
make install
とやることでapcupsdもインストールできました。良い子はマネをしてはいけません。
USBケーブルで直接UPSと接続しているディスクサーバーでは,/usr/local/etc/apcupsd/apcupsd.confを編集して以下のように設定しました。
## apcupsd.conf v1.1 ##
UPSNAME BR1000S
UPSCABLE usb
UPSTYPE usb
DEVICE
ONBATTERYDELAY 10
BATTERYLEVEL 10
MINUTES 5
TIMEOUT 150
KILLDELAY 600
DEVICEの値をブランクにしておかねばならないようです。電源が失われてから150秒でシャットダウンに入り,600秒でUPS自体の電源を落とす,という設定です。1行目は設定ファイルのバージョンを指定する行でたんなるコメント行ではないようです。この行を省略するとapcupsd起動時に古い設定ファイルっぽいからちゃんと内容を確認しろ,というような警告が表示されます。
ディスクサーバーで動いているapcupsdがマスターとなって,それ以外のサーバーで動くapcupsdはスレーブとして動かします。
## apcupsd.conf v1.1 ##
UPSNAME BR1000S
UPSCABLE ether
UPSTYPE net
DEVICE 192.168.xxx.yyy:3551
ONBATTERYDELAY 10
BATTERYLEVEL 10
MINUTES 5
TIMEOUT 300
KILLDELAY 0
TIMEOUTはサーバーを落とす順番を考えて設定します。DEVICEの値はマスターのIPアドレスです。3551ポートを使うので,DMZとLANの間で通信ができるようにルーターのフィルタ設定を変更して3551が通るようにしておきます。スレーブではKILLDELAYは設定しないので0を書いておきます。
サーバーをshutdownしたときにサーバーの電源が落ちるように,/usr/local/etc/apcupsd/apccontrolを編集します。doshutdown)の後に書かれているshutdownコマンドのオプションが-hになっているのでこれを-pに修正しておきます。
${SHUTDOWN} -p now "apcupsd initiagted shutdown"
というふうにします。
最後に,/etc/rc.confに
apcupsd_enable="YES"
apcupsd_program="/usr/local/sbin/apcupsd"
を追記して,/usr/local/etc/rc.d/apcupsd startとしてapcupsdを起動します。起動したら,apcaccessでステータスを確認できます。USBケーブルでつながっている場合はSTATUS : ONLINEと表示され,ネットワーク越しにつながっている場合は,STATUS : ONLINE SLAVEと表示されます。MAXTIMEの値がTIMEOUTで設定した値になっていればたぶんOKです。
コンセントを引き抜いてちゃんとshutdownするかどうかを確認しなくてはならないのですが,バックアップ作成中なのでそれが終わってから確かめることにします。
daily backupサーバーの構築
日々のバックアプを取るサーバーをたてているのですが,どうも調子が悪くて1, 2週間に一回は確実にディスクアクセスができなくなってフリーズしてしまい,バックアップ元のサーバーを道連れにしてnfsが固まるというひどいことになっていました。いよいよ限界だろうということでサーバーを入れ替えねばならないと思いつつやる気が起こらなくてずっとやっていませんでした。
とはいえやらないわけにもいかないので重い腰をあげて,これまでメインのディスクサーバーとして使っていたものを引退させて新しいサーバーに入れ替えたので,旧メインサーバーをバックアップにまわすことにしました。新しいディスクサーバーは8TB x 5をraidz2で使っているので24TBくらいの容量があります。現時点では7TBほどしか消費していませんのでたぶんディスクが事故を起こさない限り,私が定年になるまでは使い続けられると期待しています。
一方,旧メインサーバーは128GB SSD x 2のミラーリングでOSを入れておいて,データは3TBのWester DigitalのRED x 5をraidz2で9TBほどの容量のサーバーとして使っていました。新サーバーの容量には遠く及ばず,現時点のディスク消費量を考えてもこのままでは無理があります。raidz2ではなくstripingでディスク容量をフルに使うということも考えられますが,さすがにかなり長い期間使ったシステムなので多少の冗長性は欲しいところです。
バックアップさえとれればよいのでSSDなんて不要です。そこでSSDに使っていたSATAの2ポートをHDDに置き換えて3TB x 7でraidz1として18TBでOS+データ用として運用することにしました。3TBのWD REDは事故に備えて予備で新品を1個確保していたので,これを投入するとともに,そこらへんに転がっていたWD Green 3TBを一個投入することにしました。これで,HDDの容量は当面は足りると期待されます。
旧メインサーバーはXeon E3-1241 v3 @ 3.5GHz 8 coresのCPUでメモリは32GBでした。2014年頃にリリースされたCPUで既に10年選手ですがバックアップサーバーとしてのスペックには問題ありません。FreeBSD 14.1のDVDを焼いてUSB DVDドライブから起動して普通にインストールしました。zfsの圧縮率を高めるためにFreeBSD 13から使えるようになったというZStandard圧縮を試そうと思ったのですが,自動でパーティションわけをする場合,勝手にデフォルトのlz4圧縮になってしまいます。
あとからでも変更できるらしい,ということがわかったのでとりあえずインストールはデフォルトのままインストールしてしまいました。
再起動後にユーザーを追加して,リモートからログインできるようにしたうえで,以下の作業をします。
1. zpool statusでzpoolを確認
zrootというzpoolで7個のHDDでraidz1が構成されていることがわかります。
2. zfs get compressで圧縮方法を確認
全てのスライスがデフォルトのlz4で圧縮されていることがわかります。
3. zfs get compressratioで圧縮率も確認しておきます。
4. バックアップ用のスライスを作ります。
mkdir /backup
zfs create -o mountpoint=/backup -o compression=zstd-7 zroot/backup
圧縮方法はZStandard-7を設定しています。zstdだけを設定するとzstd-3がデフォルトで設定されるようですが,zstd-3よりも圧縮率が高くて速度もあまり遅くならないらしいのでzstd-7にしてみました。バックアップは別に急がないのでもっと圧縮率が高いものにしてもよいのかもしれませんが,あまりよくわかっていないのでとりあえず程々っぽいところを狙ってみました。
5. 他のスライスも必要に応じて圧縮方法を変えておく。
zfs set compression=zstd-7 zroot/home
zfs set compression=zstd-7 zroot/tmp
zfs set compression=zstd-7 zroot/var
zfs set compression=zstd-7 zroot/usr/ports
zfs set compression=zstd-7 zroot/usr/src
まぁ,ほとんど全部zstd-7にしたわけで,zroot/usr/のなかのsrcとports以外だけをlz4のままにしておいた,という感じです。特にこだわりがあるわけじゃないのでいっそ根こそぎzstd-7にしたほうが簡単だったかもしれません。
これでとりあえずディスクを使うことができるようになりました。あとは最低限の設定をしておきます。
6. もろもろのアプデート
freebsd-update fetch
freebsd-update install
pkg update
pkg upgrade
7. NFSの設定
/etc/rc.confに
rpcbind_enable="YES"
mountd_enable="YES"
nfs_server_enable="YES"
nfs_client_enable="YES"
を追記。/etc/exportsに
/backup -maproot=root -alldirs 192.168.xxx.yyy 192.168.xxx.zzz
を追記
8. postfixのインストール
pkg install postfix
/etc/rc.confに
postfix_enable="YES"
sendmail_enable="NONE"
を追記。インストーラの指示にしたがって,
install -d /usr/local/etc/mail
install -m 0644 /usr/local/share/postfix/mailer.conf.postfix /usr/local/etc/mail/mailer.conf
/etc/periodic.confを作って以下を記入。
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
/etc/alieasesを編集してroot宛のメールが自分に届くようにしてnewaliasesを走らせる。
9. ntpクライアントのインストール
pkg install chrony
cd /usr/local/etc
mv chrony.conf chrony.conf.org
vi chrony.confとして
makestep 1000 10
rtcsync
server 192.168.xxx.yyy
を記入。
/etc/rc.confに
ntpdate_enable="YES"
ntpdate_flags="-b 192.168.xxx.yyy"
chronyd_enable="YES"
を追記。
10. その他のツール類のインストール
pkg install で以下のものをインストール
gtar, gzip, lhasa, unzip, zip, sharutils
dosunix, base64, iconv, mpack, unix2dos
rsync, wol, apcupsd
iperf3, bind-tools
gmake
wput, wget
ja-a2ps, ja-kon2-14dot, ja-less, mtools, ja-nkf, ja-w3m
ここまで設定したらOSごと再起動。
とはいえやらないわけにもいかないので重い腰をあげて,これまでメインのディスクサーバーとして使っていたものを引退させて新しいサーバーに入れ替えたので,旧メインサーバーをバックアップにまわすことにしました。新しいディスクサーバーは8TB x 5をraidz2で使っているので24TBくらいの容量があります。現時点では7TBほどしか消費していませんのでたぶんディスクが事故を起こさない限り,私が定年になるまでは使い続けられると期待しています。
一方,旧メインサーバーは128GB SSD x 2のミラーリングでOSを入れておいて,データは3TBのWester DigitalのRED x 5をraidz2で9TBほどの容量のサーバーとして使っていました。新サーバーの容量には遠く及ばず,現時点のディスク消費量を考えてもこのままでは無理があります。raidz2ではなくstripingでディスク容量をフルに使うということも考えられますが,さすがにかなり長い期間使ったシステムなので多少の冗長性は欲しいところです。
バックアップさえとれればよいのでSSDなんて不要です。そこでSSDに使っていたSATAの2ポートをHDDに置き換えて3TB x 7でraidz1として18TBでOS+データ用として運用することにしました。3TBのWD REDは事故に備えて予備で新品を1個確保していたので,これを投入するとともに,そこらへんに転がっていたWD Green 3TBを一個投入することにしました。これで,HDDの容量は当面は足りると期待されます。
旧メインサーバーはXeon E3-1241 v3 @ 3.5GHz 8 coresのCPUでメモリは32GBでした。2014年頃にリリースされたCPUで既に10年選手ですがバックアップサーバーとしてのスペックには問題ありません。FreeBSD 14.1のDVDを焼いてUSB DVDドライブから起動して普通にインストールしました。zfsの圧縮率を高めるためにFreeBSD 13から使えるようになったというZStandard圧縮を試そうと思ったのですが,自動でパーティションわけをする場合,勝手にデフォルトのlz4圧縮になってしまいます。
あとからでも変更できるらしい,ということがわかったのでとりあえずインストールはデフォルトのままインストールしてしまいました。
再起動後にユーザーを追加して,リモートからログインできるようにしたうえで,以下の作業をします。
1. zpool statusでzpoolを確認
zrootというzpoolで7個のHDDでraidz1が構成されていることがわかります。
2. zfs get compressで圧縮方法を確認
全てのスライスがデフォルトのlz4で圧縮されていることがわかります。
3. zfs get compressratioで圧縮率も確認しておきます。
4. バックアップ用のスライスを作ります。
mkdir /backup
zfs create -o mountpoint=/backup -o compression=zstd-7 zroot/backup
圧縮方法はZStandard-7を設定しています。zstdだけを設定するとzstd-3がデフォルトで設定されるようですが,zstd-3よりも圧縮率が高くて速度もあまり遅くならないらしいのでzstd-7にしてみました。バックアップは別に急がないのでもっと圧縮率が高いものにしてもよいのかもしれませんが,あまりよくわかっていないのでとりあえず程々っぽいところを狙ってみました。
5. 他のスライスも必要に応じて圧縮方法を変えておく。
zfs set compression=zstd-7 zroot/home
zfs set compression=zstd-7 zroot/tmp
zfs set compression=zstd-7 zroot/var
zfs set compression=zstd-7 zroot/usr/ports
zfs set compression=zstd-7 zroot/usr/src
まぁ,ほとんど全部zstd-7にしたわけで,zroot/usr/のなかのsrcとports以外だけをlz4のままにしておいた,という感じです。特にこだわりがあるわけじゃないのでいっそ根こそぎzstd-7にしたほうが簡単だったかもしれません。
これでとりあえずディスクを使うことができるようになりました。あとは最低限の設定をしておきます。
6. もろもろのアプデート
freebsd-update fetch
freebsd-update install
pkg update
pkg upgrade
7. NFSの設定
/etc/rc.confに
rpcbind_enable="YES"
mountd_enable="YES"
nfs_server_enable="YES"
nfs_client_enable="YES"
を追記。/etc/exportsに
/backup -maproot=root -alldirs 192.168.xxx.yyy 192.168.xxx.zzz
を追記
8. postfixのインストール
pkg install postfix
/etc/rc.confに
postfix_enable="YES"
sendmail_enable="NONE"
を追記。インストーラの指示にしたがって,
install -d /usr/local/etc/mail
install -m 0644 /usr/local/share/postfix/mailer.conf.postfix /usr/local/etc/mail/mailer.conf
/etc/periodic.confを作って以下を記入。
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
/etc/alieasesを編集してroot宛のメールが自分に届くようにしてnewaliasesを走らせる。
9. ntpクライアントのインストール
pkg install chrony
cd /usr/local/etc
mv chrony.conf chrony.conf.org
vi chrony.confとして
makestep 1000 10
rtcsync
server 192.168.xxx.yyy
を記入。
/etc/rc.confに
ntpdate_enable="YES"
ntpdate_flags="-b 192.168.xxx.yyy"
chronyd_enable="YES"
を追記。
10. その他のツール類のインストール
pkg install で以下のものをインストール
gtar, gzip, lhasa, unzip, zip, sharutils
dosunix, base64, iconv, mpack, unix2dos
rsync, wol, apcupsd
iperf3, bind-tools
gmake
wput, wget
ja-a2ps, ja-kon2-14dot, ja-less, mtools, ja-nkf, ja-w3m
ここまで設定したらOSごと再起動。
CDのリッピングデータの整理 その後
以前からコツコツとリッピングをして整理をしていたCDですが,最後にデータのバックアップをとったのが2017年1月28日だったのでもう7年くらい作業をしていないようで,歳をとるのは速いとまったく関係ないところに感心してしまいます。結果として,どのように作業をしていたのか完璧に忘れていたので作業を再開しようにもどうしてよいかわからない,という実に情けないことになっていました。関連するファイルなどを眺めながら少し思い出す努力をしてみました。
1. 曲(pieces.xls),演奏者(performer.xls),レーベル(label.xls)のデータベースファイル(エクセルのデータ)にデータが登録されているか確認。
2. 登録されていなければ追加。
3. データベースから必要なデータをコピペして新しいエクセルデータとしてCDのトラックデータを作成。
4. トラックデータをcsvで出力。
5. csvファイルをSuper Tag Editor (改)に読み込ませて区切り文字を| (縦棒)にしてテキストファイル(*.txt)として出力。たぶんこのような手続きをやっていたと思われるが,どうやればこれができるのか,まだ使い方が思い出せない。
6. Mp3tagにCDからリッピングしたトラックをwavからflacに変換したファイルを読み込ませる。
7. トラックファイルを全て選択。
8. 5で出力した|区切りのテキストファイルを「テキストファイル - タグ」ボタンを使って読み込む。
9. 「タグを編集」ボタンをおしてカバーアートを追加。
10. 「保存」ボタンでタグを書き込み。
11. 「タグ - ファイル名」ボタンでファイルを出力。
12. 「アクション」ボタンの右側の矢印でメニューを開いて「Output cover art」を選んでカバーアートを出力。
どうも上記のような手順でやっていたようです。8, 11, 12での設定はMp3tagディレクトリの下のdataとexportディレクトリに設定をコピーしておく必要があります。これは以前に使っていた設定ファイルを保存していたものをそのままコピーしています。他にMp3tag/mp3tag.cfgも以前の設定ファイルをコピーをしておきます。オリジナルのdata, export, mp3tag.cfgは適当に名前を変えて保存しておくのが平和です。パーミッションはオリジナルのものにあわせておきます。
5はたんに区切り文字を変えるだけのことなのでsuper Tag Editorを使う必要もなくて,適当なプログラムを書いて処理をしたほうが簡単で速そうです。
とりあえず,macOS上でできればよいだろう,ということで,試してみました。macOSに入っているperlはパーミッションなどが面倒なのでhomebrewから新たにperlをインストールします。
1. brew install perl
2. cpan Text::CSV_XS
3. rehash
としてText::CSV_XSモジュールを使えるようにします。brewからインストールしたperlは/usr/local/bin/perlにインストールされます。もともとmacOSに入っていたperlは/usr/bin/perlです。パスはたぶん/usr/local/bin/を先に探すように設定されているはずなので,特に問題ないはずですが,そうでなければ環境変数PATHの設定で,/usr/local/bin/を先に探すように.profileや.cshrcを書き換えておきます。その上で,conv_csv2bar-sep.plのような適当な名前で以下のコードを保存します。
難しい話は何もないはずなのですが,parse($line)がエラー($status = 0)を返してparseをできずその原因がまったくわかりませんでした。どうも,chomp;によって改行コードを取り除いてからcsvデータをparseすると正しくparseできなくなるようでした。改行コードがついたままparseしたからといって出力に改行コードがついてくることはないようで,改行コードは明示的にprint文につけなければいけないようです。でもって,excelで読み込むことを考えてとりあえずDOS形式のファイルとなるように改行コードをCRLF (\r\n)をつけてprint文で出力しています。改行コードはいつもワナにハマりますが,今回も例外なくハマりました。
Text::CSV_XSについてはこのあたりが参考になりました。
いずれにしても,macOS上でwineを使ってMp3tagも動きそうなのでこれでmacOSだけでなんとかなりそうな気がしてきました。Mp3tagのために7年も前に作った設定用のファイルが最新版でもちゃんと動作するようなのでこれにはとても救われました。素晴らしいです。macOS用のMp3tagもありますが,設定ファイルに互換性があるかどうかもわからないしmacOS版だけ有料ってこともあるし,とりあえずwindows版Mp3tagをmacOS上のwineで使って様子を見てみることにします。
1. 曲(pieces.xls),演奏者(performer.xls),レーベル(label.xls)のデータベースファイル(エクセルのデータ)にデータが登録されているか確認。
2. 登録されていなければ追加。
3. データベースから必要なデータをコピペして新しいエクセルデータとしてCDのトラックデータを作成。
4. トラックデータをcsvで出力。
5. csvファイルをSuper Tag Editor (改)に読み込ませて区切り文字を| (縦棒)にしてテキストファイル(*.txt)として出力。たぶんこのような手続きをやっていたと思われるが,どうやればこれができるのか,まだ使い方が思い出せない。
6. Mp3tagにCDからリッピングしたトラックをwavからflacに変換したファイルを読み込ませる。
7. トラックファイルを全て選択。
8. 5で出力した|区切りのテキストファイルを「テキストファイル - タグ」ボタンを使って読み込む。
9. 「タグを編集」ボタンをおしてカバーアートを追加。
10. 「保存」ボタンでタグを書き込み。
11. 「タグ - ファイル名」ボタンでファイルを出力。
12. 「アクション」ボタンの右側の矢印でメニューを開いて「Output cover art」を選んでカバーアートを出力。
どうも上記のような手順でやっていたようです。8, 11, 12での設定はMp3tagディレクトリの下のdataとexportディレクトリに設定をコピーしておく必要があります。これは以前に使っていた設定ファイルを保存していたものをそのままコピーしています。他にMp3tag/mp3tag.cfgも以前の設定ファイルをコピーをしておきます。オリジナルのdata, export, mp3tag.cfgは適当に名前を変えて保存しておくのが平和です。パーミッションはオリジナルのものにあわせておきます。
5はたんに区切り文字を変えるだけのことなのでsuper Tag Editorを使う必要もなくて,適当なプログラムを書いて処理をしたほうが簡単で速そうです。
とりあえず,macOS上でできればよいだろう,ということで,試してみました。macOSに入っているperlはパーミッションなどが面倒なのでhomebrewから新たにperlをインストールします。
1. brew install perl
2. cpan Text::CSV_XS
3. rehash
としてText::CSV_XSモジュールを使えるようにします。brewからインストールしたperlは/usr/local/bin/perlにインストールされます。もともとmacOSに入っていたperlは/usr/bin/perlです。パスはたぶん/usr/local/bin/を先に探すように設定されているはずなので,特に問題ないはずですが,そうでなければ環境変数PATHの設定で,/usr/local/bin/を先に探すように.profileや.cshrcを書き換えておきます。その上で,conv_csv2bar-sep.plのような適当な名前で以下のコードを保存します。
#!/usr/local/bin/perl
use Text::CSV_XS;
$csv=Text::CSV_XS->new();
if($ARGV[0] eq ""){
print "This programe should be followed by a name of csv file.\n";
end;
}
$file=$ARGV[0];
open(CSV,$file);
while(){
## Do NOT chomp line data;
## chomp;
next if($. == 1); # remove header line
$line = $_;
if ($csv->parse($line)) {
my @field = $csv->fields;
my $count = 0;
$joined = join('|',@field);
# output with CRLF
print "$joined\r\n";
}else{
my $err = $csv->error_input;
print "parse() failed on argument: ", $err, "\n";
}
}
close(CSV);
難しい話は何もないはずなのですが,parse($line)がエラー($status = 0)を返してparseをできずその原因がまったくわかりませんでした。どうも,chomp;によって改行コードを取り除いてからcsvデータをparseすると正しくparseできなくなるようでした。改行コードがついたままparseしたからといって出力に改行コードがついてくることはないようで,改行コードは明示的にprint文につけなければいけないようです。でもって,excelで読み込むことを考えてとりあえずDOS形式のファイルとなるように改行コードをCRLF (\r\n)をつけてprint文で出力しています。改行コードはいつもワナにハマりますが,今回も例外なくハマりました。
Text::CSV_XSについてはこのあたりが参考になりました。
いずれにしても,macOS上でwineを使ってMp3tagも動きそうなのでこれでmacOSだけでなんとかなりそうな気がしてきました。Mp3tagのために7年も前に作った設定用のファイルが最新版でもちゃんと動作するようなのでこれにはとても救われました。素晴らしいです。macOS用のMp3tagもありますが,設定ファイルに互換性があるかどうかもわからないしmacOS版だけ有料ってこともあるし,とりあえずwindows版Mp3tagをmacOS上のwineで使って様子を見てみることにします。