BSD memoの最近のブログ記事

zshインストールしようとしたらPerlを巻き込みはじめてちょっとビックリ。
perlならいいが一度X WindowなどのGUI関連が巻き込まれたら手に負えなくなる。
なゆた先生からMakeの設定を変えれば良いと教えられ、/etc/make.confに以下の2オプションを追加。そーいえばmake.confって今まで変えたことがなかったような...。

NO_X=true
WITHOUT_X11=true

ちなみに=の後ろの値は何でもいい。マニュアルより
bool と指定されている変数では、その値は
意味を持ちません。変数が設定されていれば (たとえ値が ``FALSE'' や ``NO''
でも)、変数が設定されているものとして扱われます。

まぁこれでインストールに数時間なんて事態も防げるはず。

この間の続き。

早速完成した環境でsshdの設定やportsnapでportsツリーを更新。
その後locateコマンドを効かす為に
/usr/libexec/locate.updatedb を実行したらカーネルがパニくってシステムが完全固まった。

もう一度再起動してdmesgを確認するとZFS関連のメッセージで以下が出力されていた。
ZFS NOTICE: Prefetch is disabled by default on i386 -- to enable,
add "vfs.zfs.prefetch_disable=0" to /boot/loader.conf.
ZFS WARNING: Recommended minimum kmem_size is 512MB; expect unstable behavior.
Consider tuning vm.kmem_size and vm.kmem_size_max
in /boot/loader.conf.
ZFS filesystem version 3
ZFS storage pool version 14

どうやらI/O周りに負荷がかかるとやっぱりメモリを多く割り当てないとダメなようだ。

そこで、ハンドブック[1]を参照にカーネルを再ビルドすることにした。

カーネルコンフィグレーションファイルを以下のように変更。色々弄くってみたいが、とりあえず余計なことはせず、options KVA_PAGES=512だけを追加。

後はハンドブックの指示通りにmake buildkernelしてmake installkernelしたら再起動。dmesgにidentに指定した i386_ZFS_KERNELという文字列が出力され、うまくカーネルがさし変わったことを確認した後、似たような構成でZFS環境を構築している方のパラメータを参考に[2] /boot/loader.confに以下を追記し、また再起動。
vm.kmem_size="1536M"
vm.kmem_size_max="1536M"
vfs.zfs.arc_max="1024M"

dmesgにZFS WARNINGが消えたのを確認。
/usr/libexec/locate.updatedb を再実行しても落ちなくなった!

後はnoticeに出ているプリフェッチを有効化するのかどうかだが、性能と引き替えに落ちるという報告[3]を見かけたので特に何もしないことにした。


参考
[1]カスタムカーネルの構築とインストール http://www.freebsd.org/doc/ja/books/handbook/kernelconfig-building.html
[2]ともちゃ日記 - 元大学生のぐだぐだOL日記- http://tomocha.net/diary/?20100608#201006082
[3]ZFSが落ちる - smectic_gの日記 http://d.hatena.ne.jp/smectic_g/20100827/1282862472

たまには技術ネタでも。
そろそろ以前買ったatomマシンにFreeBSDを入れることにした。で、FreeBSD8.0系からZFSが実験的レベルからプロダクションレベルに引き上げられたので、是非この先進的なファイルシステムを使ってみたいと思い、数日間寝る前に色々格闘した結果、案外簡単にOS立ち上げまで辿り着けたので、環境構築手順をメモっておく。

まぁ偉そうにいっても、ほとんどwiki.freebsd.org[1]に書かれている内容の真似事である。
ただ、記憶領域がSSDの40GBでそんなに余裕が無い為、swap領域は別パーティションで用意せずにzfsの機能を利用させてもらっている。

まず、公式からiso-imgのFreeBSD-8.1-RELEASE-i386-memstick.imgを取得し、USBメモリに移す。isoイメージの書き込みにはWin32DiskImagerってツールを使用した。

USBメモリからbootし、以下の手順で環境を構築。
http://gist.github.com/615329

とりあえずここまでやれば
Welcome_to_FreeBSD.jpg
システムログイン画面までいける!いっつもsysinstallでやっていたから楽々だったけど手動インストールは結構めんどい。実際に何回かやり直しもしている。Welcome to FreeBSDの文字が表示されて嬉しく思うのは初インストール以来だろうか。

ちなみに貧弱なシェルで上記コマンドを打つのは結構な苦行だ。特にzfsファイルシステム作成のあたりとか泣きそうになる。実際に自分は一回他のwindowsマシンで上記コマンドをzfs_install_helper.shみたいな名前のシェルスクリプトに纏めてUSBメモリに書き写し、OSインストール中のマシンで以下のコマンドを実行し一気に作業を進めている。
mount_msdosfs /dev/da0s1 /mnt
sh /mnt/zfs_install_helper.sh

8.0の段階ではi386じゃメモリ不足によりZFS無理って評価が圧倒的に多かったので、メモリチューニング&カーネル再構築は必須かと思っていたが意外にも大丈夫だった。まぁメモリ絡みの設定はもう少しアプリ入れてからやってみることにしよう。

うーん、恥ずかしながら後半のexport LD_LIBRARY_PATH=/mnt2/lib
が何の為にやっているのか分からん...。システム環境変数なのでOSの挙動に影響しているのは分かったがzfs unmount -aが影響を受けるのだろうか...?


[2010/10/09]これでswap領域も共有されて...と思ったが、よくよく考えたら-V指定でサイズを指定しているので結局パーティション切った同じだ!...orz

echo 'cpufreq_load="YES"' >> /boot/loader.conf を削除。組み込まれているのでいちいち指定する必要はもう無い。http://gihyo.jp/admin/clip/01/fdt/200707/09

[参考]
[1]RootOnZFS/GPTZFSBoot/RAIDZ1 - FreeBSD Wiki
[2]ESXiのゲストOS FreeBSD 8.1 + ZFSの導入メモ [ESXi/FreeBSD](fkimura.com)
[3]~nabeken/diary/ : FreeBSD 8.1-RELEASEでZFS on ROOT
[4]On-line Manual of "gpart"

前回scraper CLIを試してみたら、これはチェックにすげーよさげと書いたけど、なんか使いづらいんだよね。

cpanシェルと同じで履歴効かないし、矢印キーを押したら^[[Aみたいな感じで制御文字が吐き出されちゃう。
cpanシェルはぶっちゃけ、install [モジュール名をコピペ]だからそんな気にしてなかったんだけど、流石にscraper CLIで前回の履歴を使えないのは痛すぎる。

でも前回、参考にしたページには

Term::ReadLine を使用しているのでシェルみたく履歴を呼び出せる。CSS セレクタや XPath をちょこちょこ修正して試すのに便利。

ってあるんだよねぇ。確かにscraperコマンドの本体を見てみたらuse Term::ReadLineをしていた。コケないってことは既に自分の環境にTerm::ReadLineは入っているはず。なのになぜー?

という訳で調べてみたら、Term::ReadLine単体じゃ履歴や補完といった便利な機能は提供してくれないようです。[参考:Term::ReadLine で GNU Readlineを使う。]

Term::ReadLine::Gnuも必要とのことで早速cpanシェルでこれを入れてみる...が見事にこけた。force installでもダメだったのでportsが提供されていないか調べてみたがなさげ...?と思ったらあった![参考:perlshを使いはじめた]

port名は p5-Term-ReadLine-Gnu ではなく p5-ReadLine-Gnuなのか...。危うく諦めるところだった。

portsなら一発でokだった。早速 scraper [URL]とやってみると...矢印キーが普通に効くし、履歴も参照できるようになった!
ついでに、cpanシェルの方も使いやすくなったので、今まで不便な状態でcpanシェルを使っていたのがアホらしくなった。

先日作ったバックアップスクリプトをcronに登録して数日後。サーバの中身を見てみるとなんとそこには10kBほどのtarアーカイブが転がっているだけであった。


  |l、{   j} /,,ィ//|     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  i|:!ヾ、_ノ/ u {:}//ヘ     | あ…ありのまま 今 起こった事を話すぜ!
  |リ u' }  ,ノ _,!V,ハ |     < 『おれはバックアップを取り出そうと
  fト、_{ル{,ィ'eラ , タ人.    |  思ったらいつのまにかゴミファイルを解凍していた』
 ヾ|宀| {´,)⌒`/ |<ヽトiゝ   | 回線落ちだとかtarコマンドのオプション忘れだとか
  ヽ iLレ  u' | | ヾlトハ〉.   | そんなチャチなもんじゃあ 断じてねえ
   ハ !ニ⊇ '/:}  V:::::ヽ. │ もっと恐ろしいものの片鱗を味わったぜ…
  /:::丶'T'' /u' __ /:::::::/`ヽ \____________________ 


シェルスクリプト単体ではちゃんと動くのになんでcronで動かすとゴミファイルになるかなーと思い、早速cronからシステムから送られてくるメールをみたところ

try to create hot copy...
env: python: No such file or directory

と出てた。どうやらhot-backup.pyでコケたらしい。調べたら以下の記事にたどり着いた。
どさにっき #!/usr/bin/env

たとえば FreeBSD では、標準の /etc/crontab は

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

となっていて /usr/local/bin が含まれていない。なので、

#!/usr/bin/env ruby

というスクリプトを /etc/crontab に登録すると、FreeBSD では ruby は /usr/local/bin にあるのが標準なので、インタープリタを見つけられずにエラーになる。

BSDの場合、#!/usr/bin/env hogehoge には気をつけろって事かな。


とりあえずhot-backup.pyの1行目
#!/usr/bin/env pythonを#!/usr/local/bin/pythonに書き換え。直接インタプリタを指定するように修正した。

他にもシェルスクリプト内で export PATH=$PATH:/usr/local/bin って追記する方法がある。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちBSD memoカテゴリに属しているものが含まれています。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 7.9.3