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ごと再起動。

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のような適当な名前で以下のコードを保存します。



#!/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で使って様子を見てみることにします。

GhostBSD 24.07.3の環境構築(その8;アプリケーションのインストール)

FreeBSD 13.2Rのサーバーに一通りインストール済みなのでローカルのGhostBSDにアプリケーションをインストールする必要性は低いのですが,GhostBSDは14.1Rベースということもあってとりあえず,GhostBSDにも同じようにアプリケーションを入れておくことにしました。

インストールしたものは13.2Rのときと同じです。GhostBSDのインストール時にインストール済みのものも含まれていますが,pkg installで以下のアプリケーション名を入力した,ということでとりあえず全部リストしておきます。

archivers:
gtar, gzip, lhasa, unzip, zip, sharutils

benchmark:
iperf3

comms:
minicom

converter:
dosunix, base64, iconv, mpack, unix2dos

devel:
fpp, gmake,

dns:
bind918

editors:
emacs, vim-x11

ftp:
wput, wget

graphics:
gimp, ImageMagick7,ipe,pgplot,xv-m17n,xfig,gm,qgis,p5-Image-ExifTool,dspdfviewer,epdfview

japanese:
ja-a2ps, ja-kon2-14dot, ja-less, mtools, ja-nkf, ja-w3m, xpdf, ja-tgif-resource, ja-eterm, ja-cmigemo

math:
R, RStudio, xgraph, gnuplot, gnuplot-tex-extras, scilab, octave, octave-forge, maxima, wxmaxima, scalapack linpack laspack lapack95, paraview

multimedia:
xanim

net:
rsync, wol

print:
texlive-full, tgif2tex, gv, yatex

sysutils:
xosview, apcupsd, tree

www:
firefox, chromium

x11:
xorg, rxvt-unicode

mail:
postfix, qpopper

postfixをインストールしたらあれこれ設定しろ,というメッセージが表示されるのでそのとおりやります。

To use postfix instead of sendmail:
- clear sendmail queue and stop the sendmail daemons

これはsysctl sendmail stopとやればsendmailが止まります。

Run the following commands to enable postfix during startup:
- sysrc postfix_enable="YES"
- sysrc sendmail_enable="NONE"
sysrcコマンドを使わなくてもvi /etc/rc.confで直接書き込むことでOKです。

If postfix is *not* already activated in /usr/local/etc/mail/mailer.conf
- mv /usr/local/etc/mail/mailer.conf /usr/local/etc/mail/mailer.conf.old
- install -d /usr/local/etc/mail
- install -m 0644 /usr/local/share/postfix/mailer.conf.postfix /usr/local/etc/mail/mailer.conf

Disable sendmail(8) specific tasks,
add the following lines to /etc/periodic.conf(.local):
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

/usr/local/etc/postfix/main.cfをmain.cf.orgというような適当な名前でコピーしておいて,最小限の編集をしておきます。設定ができたら,
service postfix start
としてpostfixを起動します。

cd /etc
ln -s mail/aliases

としておいてvi /etc/aliasesでaliasesを編集してroot宛のメールが自分に届くようにしておきます。

emulators:
virtualbox-ose

インストールをするとあれこれやれ,という指示が表示されます。
/boot/loader.confに
vboxdrv_load="YES"
を追記します。また,USBが使えるようにするために次のような設定を追加します。/etc/groupにはvboxusersというグループが勝手に追加されていますが,VirturalBoxを使う人はこのグループにユーザー名を追加しておきます。
vboxusers:*:920:hoge
hogeがユーザーIDです。/etc/devfs.rulesに
[system=10]
add path 'usb/*' mode 0660 group operator
を追加して,/etc/rc.confに
devfs_system_ruleset="system"
を追加します。
/etc/rc.d/devfs restart
でdevfsを再起動します。

さらに,/etc/rc.confに
vboxnet_enable="YES"
を追記します。これでブリッジネットワークが使えるようになるようです。

textproc:
aspell, en-aspell

aspellによるスペルチェックは英語だけにするために,
cat > ~/.aspell.conf
lang en_US
^D
とやって.aspell.confに英語を設定しておきます。

13.2Rではインストールしたはずなのに,なぜかGhostBSDではそんなアッケージは存在しないと言われてvscodeはインストールできませんでした。どうしてだろう?