『FreeBSD』 FreeBSD+ZFS+Samba+netatalk環境を構築する – FreeBSDインストール+etc

Debian/kFreeBSDで意味不明なトラブルが多発したので、結局FreeBSDをインストールしました。
トラブルも無く、時間もかからず環境構築できたので、初めからこっちを入れておくべきだった。
#普段使いのマシンはLinuxにしますが

今回は、ZFSな環境構築+αまでを書きます。

インストール

USBメモリスティックを使ってインストールしました。
USBはWindowsで書き込みソフトを使って作成しました。

インストール自体は特に躓くところは無かったと言いたいところですが、オン・ボードのeternetインタフェースからDHCPでアドレスを取得しようとしたら、アドレス取得に失敗する事象が発生しました。
Realtekのeternetインタフェースです。
手持ちのIntelなeternetカードを使ってインストールをしました。

Debian/kFreeBSDでこのマシンにインストールしたときは認識した、他のマシンでインストール済みFreeBSDが入ったHDDで起動させたときは、このインタフェースを認識したので、インストーラの問題なのかな?
インストール後に動作確認はさせていないので微妙ですが。

他に注意点があるとしたら、
○キーボード選択時にJapanese 106xを選ぶと、Caps LockとCtrlが入れ替わったキーマップになります。
○今回は、他のマシンで使っていたファイルサーバーのDiskを再利用するので、ユーザー名を登録するとき、ユーザー番号は移植元のマシンのユーザー番号とあわせないと、あとで大変になる
○suするためにwheelグループにも追加しておく
って所です。

packageを使えるようにする

FreeBSDはportsってシステムでパッケージ管理をしていると思っていたのですが、最近のFreeBSDはpkgと言うコンパイル済みバイナリのパッケージ管理ツールがあるんですね。
で、いまひとつ使い方が解っていませんので、的外れな書き方をしているかもしれませんが、

# pkg
# pkg update

で使えるようになります。

どんなパッケージが使えるのかを知りたいときには、

# pkg search hoge

で探すのかな?

emacsインストール

私はviを使えないので(ぇ)、emacsを入れます。

# pkg install emacs-nox11-24.3_14,3

Xは必要ないです。
#でも、他のパッケージを入れたら結局インストールされた。。。。。

sshでパスワードログインできるようにする

デフォルトではsshでパスワードログインできません。
他のマシンにおいてある暗号鍵を持っていくためにもsshでパスワードログインしたいのです。
#USBメディアでコピーしろって事かもしれませんが・・・

# /etc/ssh/sshd_config

PasswordAuthentication yes
を追加して

# /etc/rc.d/sshd restart

これで、リモートマシンからパスワードログインできます。
秘密鍵をコピーして、RSA鍵でログインできるようになったら無効にするのが正しい使い方な感じがします。

ロケール設定

日本語が表示出来るようにします。

# emacs ~/.login_conf

me:
:charset=UTF-8:
:lang=ja_JP.UTF-8:
を追加

再ログインしたら日本語表示されます。

ZFSを有効にする

# emacs /boot/loader.conf

zfs_load=”YES”
を追加

# emacs /etc/rc.conf

zfs_enable=”YES”
を追加

FreeBSD 10ではインストール時にZFSファイルシステムを選択できるから、上記の設定は要らないのかもしれません。
これを外して有効になるかは確認していません。

404 Blog Not Found – 備忘録 – HP ProLiant MicroServer + FreeBSD + ZFSを参考に以下の設定を追加します。

# emacs /boot/loader.conf

kern.cam.boot_delay=10000
ahci_load=”YES”
vfs.zfs.txg.timeout=”5″
kern.maxusers=512
vm.kmem_size=”4G”
vm.kmem_size_max=”6G”
vfs.zfs.arc_min=”512M”
vfs.zfs.arc_max=”4G”
を追加

設定追加後にreboot

他のマシンで使っていたZFSなpoolをimportします。

# zpool import -f vol1
# zpool import -f vol1

前に使っていたマシンでexportしていなかったため、-fオプションが必要と言われました。

# zpool status

  pool: vol1
 state: ONLINE
status: One or more devices are configured to use a non-native block size.
        Expect reduced performance.
action: Replace affected devices with devices that support the
        configured block size, or migrate data to a properly configured
        pool.
  scan: scrub repaired 0 in 0h44m with 0 errors on Sun Oct  5 01:41:33 2014
config:

        NAME        STATE     READ WRITE CKSUM
        vol1        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            ada1    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada2    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada3    ONLINE       0     0     0  block size: 512B configured, 4096B native

errors: No known data errors

  pool: vol2
 state: ONLINE
status: One or more devices are configured to use a non-native block size.
        Expect reduced performance.
action: Replace affected devices with devices that support the
        configured block size, or migrate data to a properly configured
        pool.
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        vol2        ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            ada4    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada5    ONLINE       0     0     0  block size: 512B configured, 4096B native
            ada6    ONLINE       0     0     0  block size: 512B configured, 4096B native

errors: No known data errors

Debian/kFreeBSDでは出ていなかったのですが、セクタサイズが4kByteだけれども、512byteでpoolを作っちゃったよねてな注意が。
性能落ちるって言うけれども、どのくらい落ちるのかな。
修正しようと思ったらpoolをdestroyしてから-o ashift=12をつけてpoolをcreateする必要があるとのこと

これは、あとで試す。
が、変更させようと思ったら面倒くさい。
2TB×3の空きディスクがあるので、そちらも使ったらデータの移行はできるんだけどね。

rubyのインストール

rubyで書いたスクリプトが結構あるので、rubyをインストールします。

# pkg install ruby-2.0.0.576_1,1

インストール先が
/usr/local/bin/ruby
になっているので、スクリプトの修正が必要になりました。
/usr/bin/rubyへのリンクを作るのがスマートかもです。

Sambaの設定など

Sambaの設定などは別エントリーで

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,125

『Linux/Debian』 Debian/kFreeBSD + ZFS + Samba でWindwosからのディレクトリ表示で同じディレクトリが複数表示される事象が発生

またもトラブルが。
もうFreeBSDに乗り換えた方が良いのでしょうか。
でも、今回のトラブルは*BSD+ZFS+Sambaの問題のみたいなのですが。

Debian/kFreeBSD + ZFS + Sambaな環境で、あるディレクトリにディレクトリが約300個以上存在する状態で、Windwosからそのディレクトリにアクセスすると、ディレクトリ一覧が正しく取得できない事案が発生しました。

Windowsからアクセスしてみると、ディレクトリ数がまずおかしい。

directory1
これ、表示途中の画像ですが、最終的には120万とかになります。

さらに、
directory2
このように同じディレクトリが何個も表示されます。

調べてみたところ、同じディレクトリに約300個以上ディレクトリが存在するとおかしくなるようです。

このような状態になっていても、ファイルアクセスには問題がありません。

私の場合、iTunesに登録した音楽ファイルはみんな、ファイルサーバー上においてあるのですが、そこのディレクトリを見に行ったことで発覚しました。
iTunesで問題なく音楽を再生出来ていたので気がつくのが遅れました。

で、調べてみたところ、
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=612503
http://www.timberline.se/blog/?p=87
と言うのが出てきて、ZFSの仕様による不具合なんだけど、Samba側では積極的に対応する予定が無く、対処療法てきな手段になるみたい。
Debian側でもSambaの設定をどうにかするつもりは無いらしい。

解決方法は、smb.confのglobalセクションに

directory name cache size = 0

を追加したらOKって事だし、Sambaのドキュメントにもその様に書いてあるのだが、この通りに設定しても問題が解決しません。

Sambaのバージョンは3.6.6です。

調べてみたところ、この問題で困っているって情報がほとんど出てこない。
と言うことは、私の所だけで起きているのか、一般的な使い方では問題が出てこないだけなのかよく解りませんって状態です。

 

2014年10月20日追記

FreeBSD 10をインストールして試してみたところ、directory name cache size = 0が無くても正しく動きました。
これ、DebianもFreeBSD 10系列にしたら直るのか?

『ingress』 Lv8になりました

Lv8になりました。
ここからはメダルも増やしていかないとダメなのですね。

profile_20141018_192318_0

resonator不足に悩む

Lv8になってresonatorの破壊も楽になりました。
が、設置するresonator不足に悩んでおります。Lv8、Lv7、Lv4のresonatorが足りないのです。
意識して増やしていかないと増えないので今は以下の方針でresonatorを設置しております。
・基本はLv6、Lv5のresonatorを設置、アップグレード
・portalのレベルがLv7に上がりそう、Lv8に上がりそうな状態ではLv7,Lv8のresonatorを設置

Lv7、Lv8のportalが沢山ある所を周回するのが手っ取り早いのですが、自宅周辺は数が少ないのです。
勤務地最寄りは全くないし。

portal密集地に遠征するしか無いのかな〜

XMP Bursterはあまり気味

一方で、XMP Bursterはあまり気味。
積極的に破壊しています。
が、中立ポータルにしてしまうと、resonator設置でresonatorが減る。
バランスが難しいです。
と言うことで、
・レベルの低いresonatorを見かけたらとにかく破壊する。メダル獲得にもなるし
・中立ポータルまで持っていったらLv6、Lv5のresonatorを設置してお茶を濁す
以上の方針で取り組んでおります。

アイテム上限の2000個に達してしまった

気がついたらアイテム上限の2000個になって問題になっております。

遠出したときのportal keyを捨てたり、LV3以下のXMP Bursterをrecycleしたのですが、まだカツカツです。
Lv4も捨てるべきか悩んでいます。
MODアイテムのHeat ShinkやMulti-Hackも使うことは無いので捨てました。

それでもまだカツカツです。
ここで盲点だったのがPower Cubeです。450個も持っていました。
使うのがもったいなくて貯めていたのですが、もっと積極的に使うアイテムなんだなと思いました。
その様なわけで、ここ数日はportalをひたすらrechargeしてPower Cubeを使っていますが、全然減らない(´・ω:;.:…

メダル獲得

銀メダルが4個、金メダルが1個必要なわけですが、メダルは特に意識していなかったのです。
それもあってrechargeはそれほど頻繁にしていなかったため、Lv8から急に意識してやり始めました。
Power Cubeの消費も兼ねてですね。

他にメダルを獲得するためにすることは、通常活動で行えるのですが、新規portalのVisit&Hackは意識してやらないとダメですね。
御堂筋沿いに遠征しようかなと思っています。
今のところ、御堂筋沿いで南御堂のあたりまでは訪問したので、御堂筋から東西方向に新規開拓と、さらには難波まで足を伸ばす形かな。
他には、奈良と京都に遠征とか。

自転車は3時間まで

自転車をこぎすぎて膝が痛いです。おまけに太ももも筋肉痛気味です。
病院で見てもらったら軟骨がすり減っていると診断されました。
自転車は2〜3時間を越えると膝に痛みが出てくるので、往復でその時間で済むような範囲で済ませる必要が出てきました。

あと、遠征前には準備運動が必須。

『Linux/Debian』 Debian/kFreeBSDマシンで、DHCPで取得した情報を正しく反映されなくて困る事態が発生

非常にレアケースだと思うのですが、Debian/kFreeBSDで構築したzfsなファイルサーバー、DHCPで取得した情報を正確にネットワークインタフェースに反映させなくて、外部との通信や他のマシンとの通信が上手くできない事態が発生してしまいました。
色々と手段を考えて試して解決したのでメモしておきます。

背景

今住んでいる賃貸マンションでは光ネットワークサービスが導入されています。
今はフレッツやau光サービスも利用できますが、私が入渠した当時はNTT系のプロバイダのサービスしか対応しておらず、それを契約して今もずっと使っております。
トータルでみるとかなりお安く済む上に速度もそれなりに出ているので満足はしています。

サービスは2種類あって、一つはプライベートアドレスをもらって通信するサービス。
もう一つは、追加料金は発生するのですが、グローバルIPをもらって通信するサービス。こちらには固定IPと動的IPの2種類に分かれて、固定IPをもらえるサービスを契約して使っておりました。
自宅鯖でWEBを公開するためにです。

ファイルサーバー更新とともに、WEBサーバーをレンタルサーバーに移動させたのを契機に固定IPをもらうサービスを止めて、プライベートアドレスをもらう契約に変更しました。

今までは、自宅鯖がルーターでDHCPサーバーを立ち上げて運用していたのですが、マンション内のルーターがDHCPサーバーを兼ねていてIPアドレスを配ってくれるので、DHCPサーバーはマンション内のを使うようにしました。

その状態で、Debian/kFreeBSDなマシンをファイルサーバーにしてsambaを立ち上げたところ、どうやってもWindowsPCのネットワークの所にファイルサーバーが出てこない。
IPアドレス直うちならアクセス出来る。
コマンドプロンプトでnbtstat -A IPアドレス、をしたあとならマシン名でアクセス出来るようになるが、Windowsネットワークにはマシンは出てこない状態が続く状態になりました。

master browserの設定かと思って試しても改善せず。

色々と調査した結果、ファイルサーバーのサブネットマスクとブロードキャストアドレスが正しく設定されていないことが解りました。

マンション内ネットワーク、各部屋になぜか/23のアドレスを配っているのですが、Debian/kFreeBSDなマシンは、/24として設定しまいます。
Debian/GNU LinuxなマシンやWindowsやMacは/23のネットワークとして設定されています。
普通のFreeBSDではどのような結果になるか試していません。

このため、ファイルサーバーの情報が他のマシンへ正しく伝わらずこのような現象が起きていたのです。
そういえば、Windowsのファイル共有はブロードキャストで情報を伝える仕様だったので、この状態だと他のマシンから見えないのは当然だなと。

この状態でもネットワークインストールやaptでの更新もできていたし、他のマシンからリモートログインもできていたので気がつくのが遅れました。
#インストール時にサブネットマスクがおかしいって気がついていたような気もするけど・・・

解決方法は色々とあるのですが、直球な方法では解決しなかったので、以下、どのようにして解決していったかを書きます。

解決法その1 固定IPにしちゃう

リモートログインする必要もあり、固定IPにするのが最も楽な解決方法です。
が、DHCPサーバーが関与しないIPアドレスがどこか解らないのでバッティングする可能性もあります。

その時はその時でと思って固定IPで設定したところ、Windowsマシンから見えるようになりました。
が、ファイルサーバーから外部にアクセス出来なくなりました。
どうやら、マンションのルーターはDHCPでIPアドレスを配ったPC以外からのアクセスは弾く設定にしてあるようです。

ほとんどの場合、自宅ネットワーク外部へアクセスすることは無いのだけれども、aptが使えなくなるので致命的状況です。

と言うわけで、この解決方法は失敗。

解決方法その2 dhcpclient.confを設定する

ほとんどの場合、これが100%正しい解決方法で、これで解決するはずです。

Debian/kFreeBSDの場合は、/etc/dhcp/dhcpclient.confというファイルを編集してやります。

manで調べると、supersedeでオプションを強制上書きできるとあります。
つまり、dhcpclient.confに

supersede subnet-mask 255.255.254.0;
supersede broadcast-address ブロードキャストアドレス;

を追加してやれば、正しいサブネットマスクとブロードキャストアドレスが設定される事になります。

が、なぜか設定が反映されません。

なんでやねん!

解決方法その3 ifconfigで設定を変更する

こうなると、ifconfigで設定を変更するしかありません。
試しにコマンドプロンプトから

$ifconfig re0 IPアドレス netmask 255.255.254.0 broadcast ブロードキャストアドレス

とやったら解決しました。
当たり前か。

問題はこれを自動でやる方法です。

まずは、以下のスクリプトを書きました。

2014年10月19日追記

このままだとdefault gatewayが設定されていない状態だったので、スクリプトを追加修正しました

追記ここまで

[bash]
#! /bin/bash

ip_adr=$(ifconfig re0 | grep ‘inet ‘ | sed -e ‘s/^.*inet //’ -e ‘s/ .*//’)
ifconfig re0 $ip_adr netmask 255.255.254.0 broadcast ブロードキャストアドレス
route add default デフォルトゲートウェイのIPアドレス
[/bash]
自分のマシンのIPアドレスを調べて、その値を使ってifconfigを使って再設定をします。
ブロードキャストアドレスは正しい値に置き換えてください。

こいつを/etc/network/if-up.d/においてやります。
Debian系ならこのディレクトリになっているはずです。
FreeBSDやDebian系じゃないLinuxの場合は解りません。

すると、マシン起動時やネットワークカードをdown→upしたときに、dhcpでアドレスを取得したあとにこのスクリプトが走って、サブネットマスクとブロードキャストアドレスを設定し直します。

本当はこんな面倒くさいことはしなくて良いはずなのに(;つД`)

まとめ

なんでやねん!って感じですわ。
素直にFreeBSDを使ったら良かったのかなと大後悔中ですわ。

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 77,502

『デジタルガジェット』 Dell Venue Pro 8用アクティブスタイラスペンを交換してもらった話

Dell Venue Pro8は、艦これ用に外で大活躍しています。
操作に必要なアイテムとして、アクティブスタイラスペンがあります。
本体から遅れること数ヶ月で入手して使っていたのですが、ここ2ヶ月ほど調子がおかしく感じるところがありました。

どこがおかしいかというと、
・電池が残っている状態なら、画面から浮かした状態でペンを動かすとカーソルが動くはずが、動かない
・そもそも、反応していない
・ペンから電池を取り出して、電池を入れ直したりするとたまに反応するときがあるが、直ぐ動かなくなる
・ペンの蓋(?)を緩めたり閉めたりすると反応しはじめることがある
と言った状態。

感覚的には、内部部品のハンダ付け不良か何かで接触が怪しいところがあるためではないかと思いました。

まだ補償期間なのでDellに問い合わせて交換してもらいたいと思ったのだが、問い合わせたところ「オーダー番号」が必要と言われた。
スタイラスペンをAmazon経由で買った人も多いかと思いますが、その場合、どこでオーダー番号が解るのかというと、スタイラスペンが入っていた箱にシールが貼ってあって、そこに書いてあるらしいのです。

まぁ普通は、箱は捨ててますよね。
と言うことで解りません。

では、どうしたらよいか、どうやって交換してもらったかというと、シリアル番号を伝えることで対応してもらえました。
電池交換するために蓋(?)を空けると、下のパーツの部分で内部に隠れていたところに、シリアル番号が書いてあります。
でかい字で書いてあって、「CN-・・・」って番号が書いてあります(私の場合)。
これをDellのサポートに伝えることで初期不良交換をしてもらえました。

シリアル番号からオーダー番号を調べてもらうのに、1週間〜2週間掛かったあとで、発送されて翌日には届きました。

交換してもらったところ、無事にスタイラスペンが動くようになりました。
これで艦これが捗る。
ただ、タッチの感触か前のペンと違って、垂直にあてないと反応してくれないのでまだなれていない感じです。

もし、アクティブスタイラスペンの初期不良交換をしてもらいたいけれども、オーダー番号が解らなくて詰んでいる人が居たら、参考にしてください。

『Linux/debian』 zfsでトラブル poolのエラーでマシンが起動できなくなったときの対処法

昨日、ファイルサーバーのバックアップを走らせたまま寝て、本日起床したところ、サーバーマシンがおかしい。
BIOS画面が立ち上がる前の段階でリブートをくり返しているぽい。

このような場合は、CPUファンが問題なことが多いので確認してみたところ、ファンはきちんと動いているようだ。
それでもおかしいので、同じCPUとファンが残っていたため、それらに置き換えて再起動。
ここで無事に立ち上がったのだが、立ち上げシーケンス中にzfsサービスを起動するところで止まってしまう。

starting zfs subfilesystem swap

と出たところで止まる。
USBキーボードを抜き差ししたり、電源ボタンを押したりするとログが出るので、ハングアップはしていない。

起動デバイスのSSDを別マシンにつないで起動させてみたところ、起動した。
→SSDにトラブル発生では無い

ここで考えられるのは、snapshotの転送中に電源が落ちたため、poolが壊れて起動時にチェックシーケンスが走っていること。
と言うことは、しばらく放置しておけば起動しそうだが起動する気配が無いので対策を考えることに。

raidzを組んでいたため、Diskを1台または2台つないだ状態で起動させたら起動した。
色々組み合わせを変えても2台までなら起動するが、3台になると起動しない。

ぶっちゃけ、まだバックアップが作成されていない状況なのでおかしくなったバックアップ先のプールを削除して、一から作り直しても問題ない。
その様なときにどうやってpoolを削除するか。
つまりは、FAULTED状態でアクセス出来ないpoolの削除の仕方です。
答えは、export。

zpool export vol2

でOK。
このあと、Diskを3台つないで起動させたら無事に起動しました。

poolを再作成するときは、

zpool create vol2 -f raidz ada4 ada5 ada6

-fオプションが必要でした。

ファイルが沢山存在する状態など、poolを再作成できない場合ですが、Disk2台つないだ状態で起動させたら、resilver状態になったので、2台の状態でDiskの同期が終わったら3台目をつないで、再度resilverって手順で戻るのでは無いかと予想しています。

しかし、なぜ再起動を繰り返すようになったのかが解っていない。
ログも残っていないし。

『Linux/Debian』 zfsファイルシステムのsnapshotを取ったり適当に間引いたりするスクリプトを造った

運用をはじめたzfsなファイルサーバーですが、zfsの大きな特徴の一つにsnapshot機能があります。
詳しい説明はちゃんと開設したサイトで調べて欲しいところですが、私が理解しているところのメリットは
・ファイルを操作した履歴を残せる(解りやすく言えば、AppleのTimeMachineみたいなヤツ、削除したファイルを復活させたりできる)
・別Disk、別マシーンにバックアップを取るときにはsnapshot機能を使うと素敵な状態になる
です。

snapshotを使ってバックアップと言われるのは、履歴を残せることだと思っているのですが、同じDiskにバックアップを残してもそれはバックアップじゃないので、別にバックアップは取っておく必要はありますね。

snapshotを取る戦略として
1.1時間おきにsnapshotを取る
2.ファイルサーバーは24時間運用では無い。電源のON/OFFあり
2.翌日になったら、その日から見て直近のサーバーが動いていた日にちのsnapshotは、その日のうちの一番新しいsnapshotのみを残して削除する
3.毎週日曜日に、その週の前の日曜日を起点に古い分6日分のsnapshotを削除する
4.毎月1日に、先々月のsnapshotを一番新しいsnapshot以外削除する。
5.毎月1日に、8ヶ月前のsnapshotを削除する。
としました。

ファイルサーバーが動いていない日にちがある可能性を考えると、3,4の条件はもうちょっと細かくしてやらないとダメなのですが、そこはanacronを入れてやることでカバーできる部分はカバーしてもらって、あとは手動運用で何とかする方針です。
基本的には、1週間以上サーバーの電源を落とす事は希なはず(盆と正月くらい)って前提です。

この方針で、
・当日は1時間おきのsnapshotが作られる。
・前日より前の1週間分は、1日分のsnapshotが残る
・1~4週間分は日曜日時点のsnapshotが残る
・2~7ヶ月前の月末に近い日曜日のsnapshotが残る
ことになるので、誤ってファイルを消しちゃった場合のカバーはできるかなと。
ぶっちゃけ、個人ユースなら1時間おきのsnapshotを60こ位残しておけば十分だと思うんですがね

以上の方針でスクリプトを作りました。
本当は誰かが公開しているものをそのまま使おうと思ったのですが、自分にぴったりのモノがなかったので書きました。
それぞれ、/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthlyに放り込んでおきます。
/etc/cron.*ディレクトリに置いておくファイル名は、”.”を含んだファイルは実行されないんですね。
hogehoge.shって名前にしていてcronで実行されずにものすごく悩みました。

もしかしたら、似たような運用をしたい人が居るかもしれないので、スクリプトを公開しておきます。
rubyスクリプトです。
githubで公開するのが今時なんだと思いますが、アカウント持っていないので貼り付けます(汗

ちょっと冗長なところ等があったりしますが、何かの参考になれば。

/etc/cron.hourly/zfs_snapshot_hourly
[bash]
#!/bin/bash

zfs snapshot -r vol1/pub1@`date ‘+%Y%m%d-%H%M’`
zfs snapshot -r vol1/pub2@`date ‘+%Y%m%d-%H%M’`
[/bash]
これだけはbashスクリプトです。
他のDiskへバックアップを取るvol1/pub1とバックアップを取らないvol1/pub2に分けて、それぞれsnapshotを取ることにしています。

/etc/cron.daily/zfs_snapshot_daily
[ruby]
#!/usr/bin/ruby
#本日より前で最も近い日にちのsnapshotについて、
#その当日内で最も時間的に新しいsnapshoto以外を
#削除する

require “open3”

#zfs snapshot一覧を取得
stdin,stdout,stderr = Open3.capture2(‘zfs list -o name -S creation -t snapshot’)
snapshot_list = stdin.split(“n”)
snapshot_list.delete_at(0)

#処理対象のsnapshot listを作成
#処理対象日を絞り込む
require “date”
today = Date.today
beforeday = today – 1
beforeday_str = beforeday.strftime(“%Y%m%d”)

target_day_flag = false
while !target_day_flag do
snapshot_list.each do |s|
target_day_flag = target_day_flag | s.include?(beforeday_str)
end
if !target_day_flag then
beforeday = beforeday – 1
end
beforeday_str = beforeday.strftime(“%Y%m%d”)

end

#処理対象のリストをpub1とpub2でそれぞれ造る
def extract_target_snapshot_list(list, target_name)
l = Array.new
list.each do |s|
if s.include?(target_name) then
l.push(s)
end
end
return l
end

pub1_snapshot_list = Array.new
pub1_snapshot_list = extract_target_snapshot_list(snapshot_list,”vol1/pub1@”+beforeday_str)

pub2_snapshot_list = Array.new
pub2_snapshot_list = extract_target_snapshot_list(snapshot_list,”vol1/pub2@”+beforeday_str)

#リストを整理して、一番新しい時間だけを除く
pub1_snapshot_list.sort!
pub1_snapshot_list.pop
pub2_snapshot_list.sort!
pub2_snapshot_list.pop

#削除対象snapshotを削除する

if !pub1_snapshot_list.empty? then
pub1_snapshot_list.each do |s|
stdin,stdout,stderr = Open3.capture2(‘zfs destroy ‘+s)
end
end

if !pub2_snapshot_list.empty? then
pub2_snapshot_list.each do |s|
stdin,stdout,stderr = Open3.capture2(‘zfs destroy ‘+s)
end
end
[/ruby]

/etc/cron.weekly/zfs_snapshot_weekly
[ruby]
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
#日曜日に実行されることが前提
#実行された日にちが含む週(日曜日始まり)の前の週の
#日曜日を基準に、その日から前の月曜日までの
#snapshotを削除する

require “open3”

#zfs snapshot一覧を取得
stdin,stdout,stderr = Open3.capture2(‘zfs list -o name -S creation -t snapshot’)
snapshot_list = stdin.split(“n”)
snapshot_list.delete_at(0)

#処理対象のsnapshot listを作成
#処理対象日を絞り込む
require “date”
this_week = Date.today

#直近の日曜日を探す
while !this_week.sunday? do
this_week = this_week -1
end

#処理開始の起点はその前の日曜日
last_week = this_week – 7

#処理対象のリストをpub1とpub2でそれぞれ造る
#volume_name 対象ファイルシステム、最後に@はつけない
def extract_target_snapshot_list(list, volume_name, startpoint)
l = Array.new
for i in 1..6 do
w_date = startpoint – i;
d_string = w_date.strftime(“%Y%m%d”)
list.each do |s|
if s.include?(volume_name+”@”+d_string) then
l.push(s)
end
end
end
return l
end

pub1_snapshot_list = Array.new
pub1_snapshot_list = extract_target_snapshot_list(snapshot_list,”vol1/pub1″, last_week)

pub2_snapshot_list = Array.new
pub2_snapshot_list = extract_target_snapshot_list(snapshot_list,”vol1/pub2″, last_week)

#削除対象snapshotを削除する

if !pub1_snapshot_list.empty? then
pub1_snapshot_list.each do |s|
stdin,stdout,stderr = Open3.capture2(‘zfs destroy ‘+s)
end
end

if !pub2_snapshot_list.empty? then
pub2_snapshot_list.each do |s|
stdin,stdout,stderr = Open3.capture2(‘zfs destroy ‘+s)
end
end
[/ruby]

/etc/cron.monthly/zfs_snapshot_monthly
[ruby]
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
#毎月第1日に実行されることが前提
#実行された月の先々月のsnapshtについて、
#一番新しいもの以外削除する

#プラス
#6ヶ月分を残して、残りのスナップショットは削除する

require “open3”

#zfs snapshot一覧を取得
stdin,stdout,stderr = Open3.capture2(‘zfs list -o name -S creation -t snapshot’)
snapshot_list = stdin.split(“n”)
snapshot_list.delete_at(0)

#処理対象のsnapshot listを作成
#処理対象日を絞り込む
require “date”
today = Date.today

#先々月の日付を取得する
target_month = today << 2 target_month_str = target_month.strftime("%Y%m"); #処理対象のリストをpub1とpub2でそれぞれ造る #volume_name 対象ファイルシステム、最後に@はつけない def extract_target_snapshot_list(list, volume_name, start_point) l = Array.new list.each do |s| if s.include?(volume_name+"@"+start_point) then l.push(s) end end return l end pub1_snapshot_list = Array.new pub1_snapshot_list = extract_target_snapshot_list(snapshot_list,"vol1/pub1", target_month_str) pub2_snapshot_list = Array.new pub2_snapshot_list = extract_target_snapshot_list(snapshot_list,"vol1/pub2", target_month_str) #リストを整理して、一番新しい時間だけを除く pub1_snapshot_list.sort! pub1_snapshot_list.pop pub2_snapshot_list.sort! pub2_snapshot_list.pop #削除対象snapshotを削除する if !pub1_snapshot_list.empty? then pub1_snapshot_list.each do |s| stdin,stdout,stderr = Open3.capture2('zfs destroy '+s) end end if !pub2_snapshot_list.empty? then pub2_snapshot_list.each do |s| stdin,stdout,stderr = Open3.capture2('zfs destroy '+s) end end #8ヶ月前のsnapshotを削除する target_month = today << 8 target_month_str = target_month.strftime("%Y%m"); eight_month_ago__snapshot_list = Array.new snapshot_list.each do |s| if s.include?(target_month_str) then eight_month_ago__snapshot_list.push(s) end end if !eight_month_ago__snapshot_list.empty? then eight_month_ago__snapshot_list.each do |s| stdin,stdout,stderr = Open3.capture2('zfs destroy '+s) end end [/ruby]

『Linux/Debian』 3TBのHDDを3台購入して、zfsなファイルサーバーを作成した

今月頭から継続していましたが、zfsなファイルサーバーを構築して正式運用しました。

zfsなサーバーを構築する手段として、既存サーバーのHDDをやりくりして新サーバー用のHDDを捻出する方法もできたのですが、面倒くさすぎてしょうが無かったので、HDDを新規購入しました。

IMG_0330
Western DigitalのWD Red 3TBを3台購入しました。

zfsなサーバーの構築方法層のものは以前も書いたのでパスして、実際にサーバーを構築してみると、1台あたりの容量は2.7TB。
これ、1k=1000でサイズを表すか、1K=1024でサイズを表すかの違いからでいる話で、コンピュータ内部では1K=1024で処理するところをパッケージ表記ではマーケティング要因でサイズを大きく見せるために1k=1000で処理している為から来るギャップだと認識しています。
が、サイズが大きくなるにつれて益々ギャップが大きくなるため、どこかで治さないとダメだとともうんですよね。
普通はこんな事が解らないので、クレームが出る可能性も高いですし。

LinuxサーバーからFreeBSDサーバーへのデータ移動手段

で、サーバーを構築したあとにデータを移送する手段ですが2種類考えられて
1.LinuxのディスクをFreeBSDでマウントしてコピー
2.ネットワーク経由でコピー(rsyncやscpを使う)
のどちらかになると思われます。
#機材があればテープとかも・・・

1番の手段が一番シンプルかつ楽そうですが、以下の理由からこの手段は実行できませんでした
○ext4ファイルシステムをマウントできない
まず、ext4ファイルシステムをFreeBSDがサポートしていません。
ext4fuseってツールを入れたらマウントできるようなことが調べたら出てきたのですが、Debian/kFreeBSDだとaptでインストール出来なかったので、ソースからコンパイルして試しました。
が、ビルドはできるもののマウントさせてみたらエラーが出てマウントできず断念。

○ext2ファイルシステムのDISKを用意してマウントさせてみるものの、正常にファイルコピーできず断念
マウントはできたのですが、ファイルコピー時にIOエラーが出まくってコピーできなかったパターンと、
マウントをしようとしたら、「そんなデバイスはありません」って出てきて詰むパターンが発生して終了。
Debian/kFreeBSDだからアカンのか?

最終的には、rsyncを利用してデータ移動をしました。
4TB位のデータがあったのですが、3~4日間、夜間を利用してデータ移動できました。
かなりの時間が掛かるかと思ったので、ネットワーク経由を試すのは最終手段としたのですが、この程度で終わるなら初めからネットワーク経由で良かったなと思いましたよ。

WD 内蔵HDD Red 3TB 3.5inch SATA3.0 64MB IntelliPower WD30EFRX
Western Digital
売り上げランキング: 305

『Linux/debian』  Apache+PHP環境でなぜかユーザーディレクトリでPHPを実行できない

さくらVPSにDebianをインストールしてWebサーバーを立ち上げたのですが、ユーザーディレクトリでPHPが動かないという謎現象に悩まされました。

色々と調べた結果、デフォルトの状態ではユーザーディレクトリでPHPを動かないようにしているのでした。
Life is something else. - DebianにApache 2 + MySQL + PHPをインストール
こちらのページに書かれているとおり、
/etc/apache2/mods-available/php5.conf
を編集したところ、無事に動きました。

これで4時間くらいはまり込んでしまいました。

『お知らせ』 Webサーバーを移動しました

このたび、Webサーバーを自宅サーバーからさくらインターネットのさくらVPSに変更しました。
ほぼ設定は終わったのですが、ちょっとおかしいです。
ヘッダーの画像がデフォルトのままだったり、画像アップロード時の挙動がおかしかったり。

サーバー設定は、PHPの設定ではまったので、そこはあとでまとめようと思っています。

今回、サーバー移転した理由ですが、トータルコスト削減のためです。
さくらVPSでは1ヶ月あたり1000円ほどでサーバーを借りることができます。
一方、自宅サーバーでは、固定IPアドレス設定で1ヶ月あたり1000円かかっています。
+電気代が掛かっています。

自宅サーバーはファイルサーバーも兼ねているのですが、これも24時間動かす必要が無いので必要なときだけ電源を入れておくようにしたいんですよね。
#zfsなサーバーに置き換え中です

そんな理由で、Webサーバーを移転しました。

最後に、移転先サーバーの方がレスポンスが良いです。