2016年9月24日土曜日

ZoLでZFSのdiskをmountする

zpool createでpoolを作製すると自動でmountされるが、これをexplicitに行う方法。


  • zfs importでimport可能なpoolを検出
  • zfs import <pool>で実際にimportを行う。このcommandが完了するとmountも行われる


PostgreSQL 9.5→9.6へupgradeに伴うMediaWikiへの影響と対策

Debian Sidで、PostgreSQLが9.5→9.6にupgradeされた。MediaWikiをPostgreSQL +textsearch_jaで使っている人は、clusterのupgradeをする前にtextsearch_jaのinstallが必要。

Upgrade手順の概要


  • database clusterのbackupを取る
  • (aptitudeとかで) PostgreSQLをupgrade (今回は9.5→9.6)
  • PostgreSQLやweb serverなどを停止
  • textsearch_jaを9.6のdevelopment filesでrebuild & install
  • pg_upgradeclusterでclusterをupgrade
  • textsearch_ja.sqlを修正し、対象databseに適用
  • web serverなどをstart
  • MediaWikiの動作確認
  • 古い (9.5の)clusterをdrop

実際にいろいろとやってみた結果、上記の手順なら不具合が出ないか少なくて済むと思う。

なお、以下の個別の詳細手順については↑とは一致しない。というのも、aptitudeでupgradeすると、9.6がinstallされた時点でserverが9.6の空cluster+port 5433でstartしてしまっているから。

PostgreSQLのupgrade

PostgreSQLそのもののupgradeに関しては/usr/share/doc/postgresql-9.6/README.Debian.gzを参照のこと。

ざっくりまとめると、install scriptによって新しいversion (9.6)の空っぽのclusterが自動で作られるので、それをdropしてから古いversion (9.5)のclusterを9.6にupgradeしてね、ということ。

pg_dropcluster 9.6 main
pg_upgradecluster 9.5 main

なお、不要になった古いversionのclusterは、変換したclusterが正常であることを確認した後に削除して良い。

portの修正

この時点で9.5のserverがport 5432を使っていたため、9.6のserverはport 5433を使ってしまった。/etc/postgresql/9.6/main/postgresql.confにportの設定があるので、これを5432に修正しておく。

portが変更されたままだとphp-fpmとかがPostgreSQLを見付けられなくなる。

MediaWiki関連のupgrade

textsearch_jaの更新

MediaWikiで全文検索できるようにするため、PostgreSQLで日本語の全文検索を行うためのtextsearch_jaをinstallする。SourceからbuildするのにPostgreSQLのdeveloment packageが必要なのでpostgresql-server-devをinstallしておく。

textsearch_jaのdirectoryにて:

make PGXS_USE=1
sudo make PGXS_USE=1 install

これで/usr/share/postgresql/9.6/contrib/あたりに関連filesがinstallされる。

※この手順が終わるより前にpg_upgradeclusterを実行すると、functionが見付からないとかでMediaWiki関連のdatabaseでerrorが大量に出る。

textsearch_jaの適用

MediaWikiが使用しているdatabaseにtextsearch_jaをinstallする。しかし、その前にPostgreSQLの仕様変更に伴う修正をtextsearch_ja.sqlに行う必要がある。

具体的には"LANGUAGE 'C'" → "LANGUAGE c"に全て変更する。

cf. http://stackoverflow.com/questions/12514664/postgresql-procedural-language-c-not-found

修正後、

psql -f /usr/share/postgresql/9.6/contrib/textsearch_ja.sql <database>

既にfunctionがあるとかでerrorが出る場合は、一旦

psql -f /usr/share/postgresql/9.6/contrib/uninstall_textsearch_ja.sql <database>

を実行してから、あらためてやりなおす。


2016年9月9日金曜日

GCC 5.x → GCC 6.xへ完全移行 @Debian Sid

Debian GNU/Linux Sidではしばらく前にdefaultのGCCが5→6になったのだが、Firefoxのbuildに不具合がありGCC 5.xを残してあった。

今日、Firefox 49 (release)をbuildしてみた所、mach packageがうまくいかない不具合が解消されていたので、晴れてGCC 5 seriesをuninstallした。

helm-swoopのwindowを下部にfull widthで表示する

動機


Full HD (1920x1080)のLCDを使っている関係で、Emacsを縦に3分割 (こんな感じ → [||])している。

この使い方だと、複数のbuffersの内容を参照できて便利だ。一方で、window widthが2分割に比べて狭くなるので、helm関連のwindowでは一度に表示できる情報量が減ってしまう。

特に困るのはhelm-filelist+のように1行の情報量が多いbufferを表示する時で、これを解決するためにhelm関連windowはframeのwidthいっぱいに表示する設定をしている。

(add-to-list 'display-buffer-alist
     `(,(rx bos "*helm" (* not-newline) "*" eos)
       (display-buffer-in-side-window)
       (inhibit-same-window . t)
       (window-height . 0.4)))

cf. https://www.reddit.com/r/emacs/comments/345vtl/make_helm_window_at_the_bottom_without_using_any/

しかし、helm-swoopのwindowには何故か適用されず困っていた。

原因と対策


helm-swoopはbufferを表示する際に何らかの理由でhelm標準となっているfunctionを使っていないらしく (おそらくはswoop.elとの兼ね合いか、helmの更新が早過ぎて書き換えられていないか)、これを変更すれば他のhelm関連windowと同じ設定にできる。

(setq helm-swoop-split-window-function
      '(lambda (buffer)
         (helm-default-display-buffer buffer)))

なお、spacemacsで同じ疑問と回答が掲載されており、それを参考に以上の設定を行った。

cf. [How do I make helm-swoop to open at bottom with full window width? · Issue #4117 · syl20bnr/spacemacs · GitHub](https://github.com/syl20bnr/spacemacs/issues/4117)


2016年9月8日木曜日

Linux kernel 4.8-rc4でZoL (2016-12-26更新)

ZFS on Linux (ZoL)を試してみたいと思い、Linux kernel 4.8-rc4 (注: 9/8現在の最新版は4.8-rc5)で実験してみた。

(2016-12-26追記)

Linux kernel 4.9.0でも利用可能。

(2016-12-03追記)

Linux kernel 4.8.12でも以下の手順でZoLを利用可能。

Installation

Debian package版ではbuildに失敗した (確か9/8現在で対応しているkernel versionは4.6が最新)ので、gitから直接build & installする。

まずはSPL (Solaris Porting Layer)から:

% git clone https://github.com/zfsonlinux/spl.git
% cd spl
% ./autogen.sh
% make
% sudo make install

ZFSも手順は同じ:

% git clone https://github.com/zfsonlinux/zfs.git
% cd zfs
% ./autogen.sh
% make
% sudo make install

これで、spl.koやzfs.koなどのkernel modulesや、zfs、zpool、zdb commandsなどがinstallされるはず。

もしかしたら、buildの際にlibzfsとかのdevelopment package (header file)が必要かも知れない。

Pool作り

まず、zfs関連のkernel moduleをmodprobeして突っ込む。

% sudo modprobe zfs

多分、自動的にdependencyが解決されてsplとかも突っ込まれるはず。

% lsmod | grep zfs

あたりでcheckする。

% sudo zpool create -o ashift=12 -f -m <mount_point> <pool> <disks>

Poolが作られると自動的にmountされる。

ちなみに、最近のHDDはAFTを使っていると思うのでその場合はashift=12を指定すると速くなるとのこと。

zdbが"no such file or directory"を吐く問題

必要な(?) cache fileがgenerateされていないのが原因っぽい。Package systemとかDKMSとかで入れれば何かしらのscriptで自動生成されたりするんだろうか?

% sudo mkdir /etc/zfs/
% sudo zpool set cachefile=/etc/zfs/zpool.cache <pool>

これでgenerateされたので、後は好き放題zdbを使えるはず。

% sudo zdb -C -U /etc/zfs/zpool.cache <pool>

でも、

% sudo zdb -S -U /etc/zfs/zpool.cache <pool>

でもissueし放題。

cf. [FAQ · zfsonlinux/zfs Wiki · GitHub](https://github.com/zfsonlinux/zfs/wiki/faq)

In-band deduplication

ZFSを使う利点 (というか動機)にもなるであろうdeduplication (重複排除)だが、

どんなdataを抱えているかにもよるが、一度zdb -Sでどのくらい節約できるかを見てみると良い。ratioが2を割るようであれば無駄かなと。何しろ仕組み上ものすごく時間が掛かるし、diskに負荷も掛かるので。

cf. [How To Size Main Memory for ZFS Deduplication](http://www.oracle.com/technetwork/articles/servers-storage-admin/o11-113-size-zfs-dedup-1354231.html)

2016年9月3日土曜日

Mercurialのhg histeditでやらかした時、unbundleで元に(近い状態に)戻す

概要

Mercurial (以下hg)には、履歴を改編する為のhisteditという拡張がある。

履歴を見易く綺麗にするには便利なのだが、うっかり「やらかして」しまったので、その顛末について残しておく。

やらかした内容


  • 関連のあるchangesetをまとめるためにhg histeditを実行した
  • 順序を変える必要があるのを忘れてうっかりeditor (vim)を終了
  • commit logの変更に進んでしまい、そこで:q!を実行してabortしたつもりがhisteditが実行された

復旧の手順


  • hg unbundleを使い、histeditを実行した際に保存されているbackup (bundle file)から復旧する
  • 実行するとheadsが2つに増えた。この状態でhisteditは使えないので、一旦rebaseして履歴をlinearにする
  • histeditを改めて実行して、commitを意図した順に並び換えた上で、不要なcommitをdrop

最後に


  • やらかしても慌てない
  • 自動backupと、hg unbundleは救世主 (間違ってstripした場合とかも戻せる)