weeklyバックアップサーバー (その2;インストール編)

lz4圧縮を使いたいのでFreeBSD 10.0Rをインストールします。インストールの手順そのものは,前にディスクサーバーをインストールしたときと同じです。インストール用のCD (or DVD)でシステムをブートしたあと,welcomeのメニューがでたらさっさとShellを選んでshellに落とします。

あとは,以前と同じ手順です。違いはJBODする部分と圧縮を設定する部分です。

1. シェルに落ちたところで,/tmpを書き込み可能に
# umount -f /dev/md1
# mdmfs -s 512M md1 /tmp

2. HDDのデバイス名を調査
# dmesg | fgrep MB
ada0: Maxtor 250GB (IDE; master)
ada1: Maxtor 250GB (IDE; slave)
ada2: WD 4TB (SATA)
ada3: Hitachi 750GB (SATA)
でした。

3. HDDのテーブルを初期化。
# dd if=/dev/zero of=/dev/ada0 bs=1m count=1
# dd if=/dev/zero of=/dev/ada1 bs=1m count=1
# dd if=/dev/zero of=/dev/ada2 bs=1m count=1
# dd if=/dev/zero of=/dev/ada3 bs=1m count=1

4. GPT形式でパーティション分け。ブート用に64kB,スワップに16GB,残りは全部ファイルシステムに割りあて。オプションの-lはパーティションのラベル名。
# gpart create -s gpt ada0
# gpart add -b 34 -s 64k -t freebsd-boot ada0
# gpart add -s 16G -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l disk0 ada0
# gpart add -t freebsd-zfs -l disk1 ada1
# gpart add -t freebsd-zfs -l disk2 ada2
# gpart add -t freebsd-zfs -l disk3 ada3

5. ada0の先頭にブートブロックを書き込み。
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

6. ZFS ストレージプールを作成。書き込めない,とかいうエラーが出ますが気にせず先へ。zrootというのはプールの名前。
# zpool create zroot /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 /dev/gpt/disk3
プールの後ろにデバイスを並べるとそれをまとめてひとつのプールとしてくれるのでJBODのように使えるというわけです。

7. ブートするプールの設定
# zpool set bootfs=zroot zroot
# zfs set checksum=fletcher4 zroot

8. 圧縮して書き込むプールを設定
# zfs set compress=lz4 zroot
これだけで,圧縮して書き込むようになります。なんて簡単なんでしょう。

9. ZFSパーティションの作成。ここでも上と同じようなエラーが出ますが,気にせず先へ。
# zfs set mountpoint=/mnt zroot
# zfs create zroot/usr
# zfs create zroot/tmp
# zfs create zroot/var
# zfs create zroot/backup
最後のパーティションはバックアップを書き込むためのパーティションのつもりです。

10. zfspoolをexportしたのちimport。キャッシュファイルは、先に書き込み許可を与ええた/tmp上に作成。
# zpool export zroot
# zpool import -o cachefile=/tmp/zpool.cache zroot

11. sticky bitをたてる。
# chmod 1777 /mnt/tmp
# cd /mnt; mkdir var/tmp/
# chmod 1777 /mnt/var/tmp

12. FreeBSDのインストール用ファイルを展開。
# cd /usr/freebsd-dist
# tar zxpf base.txz -C /mnt/
# tar zxpf doc.txz -C /mnt/
# tar zxpf kernel.txz -C /mnt/
# tar zxpf ports.txz -C /mnt/
# tar zxpf src.txz -C /mnt/

13. zpool.cacheをコピー。
# cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache

14. ZFSで起動する設定を追加。
viが使えるので,以下のような行を追加。
ファイル:/mnt/boot/loader.conf
ahci_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:root"
vm.kmem_size="768M"
vm.kmem_size_max="768M"
vfs.zfs.arc_max="512M"
vfs.zfs.prefetch_disable="1"
zfsはメモリ喰いなのでメモリの少ないマシンでvm.kmem_sizeをあまり大きくするとカーネルパニックで死にます。2GBのメモリのマシンでは512MBでないと動きませんでした。今回は3GBあるのでこの設定でどうにかなってます。また,最後の設定はメモリが4GB以上の場合は自動的に0に設定されるそうです。

ファイル:/mnt/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/gpt/swap0 none swap sw 0 0

ファイル:/mnt/etc/rc.conf
zfs_enable="YES"
dumpdev="NO"

15. すべての領域をアンマウント。
# zfs umount -a
アンマウントが失敗した場合は強制アンマウント。
# umount -f /mnt

16. マウントポイントをセット。
# zfs set mountpoint=legacy zroot
# zfs set mountpoint=/tmp zroot/tmp
# zfs set mountpoint=/usr zroot/usr
# zfs set mountpoint=/var zroot/var
# zfs set mountpoint=/backup zroot/backup
最後のコマンドでエラーが出ますが,気にしない。

17. 再起動。
# sync;sync;sync
# reboot

18. OS再起動後、ネットワークを設定。
# vi /etc/rc.conf
として以下を追加。
hostname="hogehoge.example.com"
ifconfig_re0="inet xxx.xxx.xxx.xxx netmask 255.255.255.0"
defaultrouter="xxx.xxx.xxx.yyy\"
sshd_enable="YES"
ntpdate_enable="YES"
ntpdate_flags="-b xxx.xxx.xxx.xxx"
ntpd_enable="YES"
nfs_client_enable="YES"

19. rootのパスワード設定・タイムゾーン設定。
# passwd
# tzsetup
また適当にアカウントを追加。

20. /etc/resolv.confを作って,適当に設定を書き込み。
domain example.com
nameserver xxx.xxx.zzz.zzz
nameserver xxx.xxx.aaa.bbb

21. 再起動。
# sync;sync;sync
# shutdown -r now

これで一応は動くようになります。でも,まぁ,途中でいっぱい罠にはまります。とりあえず使うと便利なコマンドをいくつか列挙しておきます。

gpart show: GPTのパーティション情報を表示
gpart status: GPTで切ったパーティションの状態を表示
zpool status: プールの状態を表示 NAMEの下に見えるのがプールの名前
zpool list: プールのリストを表示。
zfs list: zfsのスライスの情報を表示
zfs get compressratio: zfsで圧縮している場合,圧縮率を表示。

さらに,再起動したときにルートをマウントできない場合,インストールしたディスクをマウントして設定ファイルを書き直したい,と思うわけですが,そのためには,インストール用CD (or DVD)から起動してwelcomeが出て来たら,Live CDとして起動します。rootでログインして,

zpool import

とやるだけでプールが見えるはずなのですがなぜかうまくいかないので,

zpool import -f zroot

とやって強制的に(-f)インポートします。インポートすると勝手にマウントされます。これで問題のあるファイルを修正して再起動すればうまくいく...かも,です。

私の場合は,loader.confのマウントするプールの名前(zfs:zroot)をタイプミスしていてはまりまくりました。あぁ...。

weeklyバックアップサーバー(その1;能書き編)

今年の正月頃にディスクサーバーの容量不足でピンチに陥りましたが,その際に,引退してweeklyのバックアップに使っていたサーバーを急遽通常使用のサーバーに格上げというか復活させて急場をしのいできました。そのためこの3ヶ月ほどweeklyのバックアップを残していませんでした。

これまでの経験から,これは危険な兆候で,こういう時に限って事故が起こるため,この連休を利用してバックアップサーバーの復活をはかりました。こんなことやってる暇はないのですが,ひとたび事故がおこればもっと悲惨なことになるのは目に見えている,というか何度も痛い目にあっているのでぐっとこらえてバックアップに邁進します。

まず,どの機械をバックアップマシンにするか,ですが,昔,計算用として導入した1Uで奥行きが半分の小型のPentium 4のものがあったのでこれを使うことにしました。バックアップすべきファイルの容量はすでに3TB近くになっているため,4TBのディスクを2台投入してJBODで8TBにすれば当分はバックアップには困らないだろう,と考えました。どうせクラッシュしてもバックアップのバックアップなので(dailyのバックアップは別途取っているから)また新しいディスクを突っ込んでバックアップを取り直せば終わりです。容量があふれることのほうが問題だと考えました。

SuperMicroのP4SCIというマザーボードが入っていたのですが,このマザーにはSATAが2個しかついていません。それはまぁ,よいのですが,どうやらAHCIには対応していないSATA 1.0仕様らしくて,FreeBSDをGPT + ZFS環境でインストールしようとすると,base.txeファイルを展開している途中でカーネルパニックでクラッシュして死にます。バックアップ用途の機械がファイルの書き込みで死ぬようでは使い物になりません。まぁ,メモリが2GBしかないこと,CPUが64bitに対応していないためamd64は使えないことなどいろいろ制約が大きいため,やはり大容量のバックアップは無理,と判断せざるを得ませんでした。小さいケースに無理やり3.5inchのHDDを2台突っ込むために,L字型のSATAケーブルを調達してまでがんばって組み込むという苦労をした割には残念な結果になってしまいました。うーむ。

この機械はファンがうるさいのでクライアントに使うにはちょっと無理がありますし,働き場所がなくなりそうです。まぁ,ファンを付け替えてバラックで使えばよいのかもしれませんけど。

次に,Opteron 242のdualマシンが転がっていたのでこれを使うことにしました。ところが,Wake up on Lanに対応していないようなのです。weeklyのバックアップには毎週,決まった曜日の決まった時間にディスクサーバーがcronからwolを使ってバックアップサーバーを起こしてやる,という方法を使っています。そのため,wolが使えないマザーボードはどうしようもありません。というか,マザーボードが古すぎです。

さらに,その次はSuper MicroのPDSMEが転がっていたのでこれをOpteronマシンのケースに突っ込んで使うことにしました。Opteron用のケースはSuperMicroの馬鹿でかいタワー型サーバーケース(横にしたら4Uとして使える)なのでHDDを何個でも突っ込むことができます。そこで,マザーボードを入れ替えるついでにそこらへんに転がっているHDDをあれこれつないで容量を稼ぐことにしました。壊れたら交換してバックアップを取り直すだけなのでまぁ,どうってことはありません。さすがに熱くなることを考えるとギチギチには入れられませんから,HDD 4台でよしとしました。4TB x 2という話はどこへいったんだ,という話もありますが,遊んでいるディスクの有効活用も必要かな,と考えた次第です。

PATA (IDE)接続のMaxtorの古い250GBを2個,SATAの日立の750GBを1個,それと先のWDの4TBを1個というめちゃくちゃな組み合わせです。だいたい,IDEとSATAの混在なんて最悪だし,起動ディスクをBIOSがちゃんと見つけられるのか,とかいろいろ不安がありますが,結果的にはIDEのマスターを起動ディスクにして,互換モードで(つまりAHCIを使わない)動かせばどうにか起動はできるようです。

起動できるとわかれば,ZFSを使ってこれらを全部まとめてひとつのプールとしてJBODのような使い方をします。これで,だいたい5TBくらいは確保できそうです。さらに,FreeBSD 10.0Rから使えるようになった激速というふれこみのlz4圧縮を使ってディスクの容量を節約します。まぁ,新しいアルゴリズムが使えるようになった,ってのを試してみたかっただけですが。

ところがこのマシンにも罠がありました。適当に転がっているECCつきのメモリをブスブスさして起動をさせていたのですが,あるとき,突然起動しなくなりました。マザーボード上のLEDの点滅をみていると,POSTのメモリーチェックで死んでいるようです。そこで,突っ込んであるメモリを一枚だけにして,少しずつ刺す組み合わせをかえてみたところ,一枚だけタイミングの遅いメモリが混じっていてデュアルモードで動こうとしてタイミングがあわず死んでいたらしい,ということがわかりました。というわけで,しょうがないので,1GB x 3枚という中途半端な(なぜか,ストックには同じメモリが4枚そろっていなかった)使い方をすることになりました。まぁ,バックアップさえできればよいのであまり気にすることはないと思います。

それにしてもメモリのタイミングってデリケートなんだなぁ...,と思いました。

(続く...)

gifアニメ

MacOS Xでgifアニメを見ようとすると,previewもアニメで表示してくれないし,safariで見るしか思いつかないのですが,safariで表示する場合,一時停止をしたり巻き戻したりすることができません。そこで,なにかよい方法はないか,と思って調べたところ,こちらに方法が紹介されていました。

FFmpeg Binaryのページからバイナリを落としてきて,適当なディレクトリにコピーして(たとえば,~/install_files/),圧縮ファイルを展開して,

ffmpeg -i input.gif -c:v libx264 -pix_fmt yuv420p -vf "scale=trunc(in_w/2)*2:trunc(in_h/2)*2" output.mp4

とやればよいようです。これで,mpeg4のファイルになるのであとは適当なビデオビューワーを使えば自由に早送りや一時停止などをしながら再生できます。

変換にかなり時間がかかりますが,結構,お手軽で便利です。