Linux Archive

APR
17

今回は、pipでsphinxをインストールするが、システムワイドではインストールせず、venvでプロジェクトローカルにインストールするものとする。

 

まずはvenvのアップデート。Ubuntu14.04のインストール直後のpython3.4-venvはバグがあるので、アップデートが必要。

sudo apt-get install python3.4-venv

pyvenv-3.4コマンドでvenvを作成

pyvenv-3.4 venv

venvに入る

source venv/bin/activate

sphinxのインストール

(venv)   $ pip install sphinx sphinx_rtd_theme

sphinxの初期設定

(venv)   $ sphinx-quickstart # ダイアログにそって良しなに

(venv)   $ sed -ie "s/html_theme = 'default'/html_theme = 'sphinx_rtd_theme'/g" conf.py # テーマの変更

HTMLのビルド

(venv)   $ make html

出来上がり。

image

ACT-SBY構成を組む場合、リソースの調停にpacemaker/corosyncを使う場合が多いと思いますが、リソースが何らかの原因でフェールオーバーした場合にメールで通知を受けたい場合、どう実装するのが良いのかこの間悩んだ際のメモ。

ネット上で良く紹介されている方法として、MailTo ocfリソースを作り、監視したいリソースと同一ノードで動作するようcolocation設定をするというものがありますが、MailTo ocfリソースはstart、stopイベントに反応して常にメールを送信するため、計画メンテナンス時に非監視設定にし、アラートメールを飛ばさないように設定するということが出来ない(MailToリソースを通常の手順でstopさせた場合もアラートメールが発報されてしまう)問題があります。

 

CRMリソース設定

primitive mailto ocf:heartbeat:MailTo \
   params \
      email=<your mail address> \
   op monitor \
      depth="0" timeout="10s" interval="10s"

 

何か別に良い方法がないかと探していたところ見つけたのが、以下のcrm_monコマンドを使用する方法。

crm_monコマンドには–mail-toオプションがあり、リソースがフェールオーバーしたときにアラートメールを送信してくれます。こちらをUpstartでサービスとして動作させることで、監視を有効化しておきたい時だけサービスを立ち上げ、監視を無効化したいときはサービスを停止することで対応できました。

 

/etc/init/pacemaker-monitor

# pacemaker-monitor
#
# pacemakerを監視し、failoverが発生した場合はアラートを発報します
 
description     "pacemaker-monitor"
 
start on filesystem or runlevel [2345]
stop on runlevel [!2345]
 
respawn
respawn limit 10 5
umask 022
 
console output
 
exec crm_mon --mail-host=<mail host>:<mail host port> --mail-to=<your mail address> --mail-prefix="<your mail prefix>"

何かの参考になれば。

yum install pyliblzma

するとよい。
cobblerでepel7 betaのレポジトリのsyncをしようとしてハマった。

FEB
6

https://issues.apache.org/jira/browse/CLOUDSTACK-2328 で教えてもらった話なのですが、CentOS 6.5のカーネルにVXLANサポートがバックポートされて使えるようになっています。便利になりましたね。

# ip link add vxlan0 type vxlan id 1000 group 239.1.1.1 dev eth0
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:fc:8b:9b brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:fc:8b:a5 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:fc:8b:af brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:fc:8b:b9 brd ff:ff:ff:ff:ff:ff
8: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN
    link/ether 6a:97:59:a7:90:65 brd ff:ff:ff:ff:ff:ff

rsyncで/var/www/html/centos以下にミラーを取得する方法のメモ。過去のリリースが含まれたミラーをrsyncで公開してくれているftp.rken.jpに感謝。

#!/bin/bash

rsync="/usr/bin/rsync -avSHP --delete"
mirror="rsync://ftp.riken.jp/centos"

verlist="6.3 6.4 6.5"
baselist="os updates addons extras isos"
archlist="x86_64"
repo_base_dir="/var/www/html/centos"


if [ -f /var/lock/subsys/rsync_updates ]; then
    echo "Updates via rsync already running."
    exit 0
fi

touch /var/lock/subsys/rsync_updates

for ver in $verlist
do
  for base in $baselist
  do
    for arch in $archlist
    do
      repo_dir=$repo_base_dir/$ver/$base/$arch/
      remote=$mirror/$ver/$base/$arch/

      mkdir -p $repo_dir

      $rsync $remote $repo_dir
    done
  done
done

rm -f /var/lock/subsys/rsync_updates

仮想化が大流行りな今日この頃、ホストのセットアップもテンプレートからで済むケースが身の回りでも増えていますが、そうはいっても、いや仮想化が流行っているからこそ、KVM用に何台もの物理サーバーにLinuxのインストール繰り返す、そんな刺身タンポポな作業も出てきます。最近はよくUbuntu Server 12.04 LTSを触っているので、いい加減これはインストール作業を自動化する方法を覚えねば、とPreseedingによるUbuntu Serverの自動インストールに取り組んでみました。PreseedingはUbuntu Serverのインストーラのダイアログへの応答を事前に定義しておくことで、完全自動インストールを実現する仕組みです。

今回作成した設定ファイルの中身は以下の通り。なお、設定は、Ubuntu Serverのインストーラに対してtftpで食わせたりもできるのですが、今回は完全にCDのISOイメージの中に入れ込む形で作りました。詳しくは日本HPによるUbuntu Serverの自動インストールCD作成手順Appendix B. Automating the installation using preseeding – Ubuntu Official Documentationを参照されるとよいのではないかと思います。

isolinux.cfg
default install
label install
  menu label ^Install Ubuntu Server
  kernel /install/vmlinuz
  append auto=true locale=en_US.UTF-8 console-setup/charmap=UTF-8 console-setup/layoutcode=us console-setup/ask_detect=false pkgsel/language-pack-patterns=pkgsel/install-language-support=false vga=normal file=/cdrom/isolinux/preseeding.cfg initrd=/install/initrd.gz quiet --
label hd
  menu label ^Boot from first hard disk
  localboot 0x80
timeout 3
preseeding.cfg.erb
d-i debian-installer/language string en
d-i debian-installer/country string US
d-i debian-installer/locale string en_US.UTF-8
d-i localechooser/supported-locales en_US.UTF-8d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string us
d-i console-setup/charmap select UTF-8
d-i keyboard-configuration/layoutcode string us
d-i netcfg/choose_interface select autod-i netcfg/disable_autoconfig boolean trued-i netcfg/dhcp_failed note
d-i netcfg/dhcp_options select Configure network manuallyd-i netcfg/get_ipaddress string <%= conf['ip_addr'] %>
d-i netcfg/get_netmask string <%= conf['netmask'] %>
d-i netcfg/get_gateway string <%= conf['gateway'] %>
d-i netcfg/get_nameservers string <%= conf['nameserver'] %>
d-i netcfg/confirm_static boolean trued-i netcfg/get_hostname string <%= conf['hostname'] %>
d-i netcfg/get_domain string <%= conf['domainname'] %>
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.jaist.ac.jp
d-i mirror/http/directory string /pub/Linux/ubuntu
d-i mirror/http/proxy stringd-i clock-setup/utc boolean trued-i time/zone string Asia/Tokyod-i clock-setup/ntp boolean trued-i partman-auto/init_automatically_partition select biggest_freed-i partman-auto/method string lvmd-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean trued-i partman-auto-lvm/guided_size string maxd-i partman-auto/choose_recipe select atomicd-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i passwd/user-fullname string <%= conf['username'] %>
d-i passwd/username string <%= conf['username'] %>
d-i passwd/user-password-crypted password <%=conf['password'] %>
d-i user-setup/encrypt-home boolean false
tasksel tasksel/first multiselect noned-i pkgsel/include string openssh-server build-essential
d-i pkgsel/update-policy select unattended-upgrades
d-i pkgsel/install-language-support boolean trued-i grub-installer/only_debian boolean trued-i grub-installer/with_other_os boolean trued-i finish-install/reboot_in_progress notexserver-xorg xserver-xorg/autodetect_monitor boolean true
xserver-xorg xserver-xorg/config/monitor/selection-method \
       select medium
xserver-xorg xserver-xorg/config/monitor/mode-list \
       select 1024x768 @ 60 Hz

そして、これだけ用意しても、後でまた設定を変更して再度ISOイメージを作りなおすとなると面倒なので、Rubyの勉強も兼ねて、ISOイメージを作成するRakeタスクも作成しました。これらをまとめてGithubに置いてあります。

https://github.com/ynojima/aigus

呼び出し方は以下の通り。引数は、config/rake.ymlにデフォルト値を記述してあります。

sudo bundle exec rake install_iso:make ip_addr="192.168.0.2" version="12.04" hostname="test" domainname="sharplab.org"
NOV
11

fsprotectによるテスト実行環境初期化

Published:2012-11-11 02:45:57 UTC

システム全体に対して変更を加えるようなプログラム、例えばChefのRecipeみたいなもののリグレッションテスト、副作用の範囲が大きいだけに、テスト実施毎に環境を巻き戻すのが大変です。一番手っ取り早い解としては、テスト環境全体をVM化し、テスト前のスナップショットに仮想ディスクをロールバックする、というのがあり、この前のSoftwareDesignのChef特集でもVagrantを使用して実現した例が載っていました。ただ、ChefのRecipeのようなプログラムはハードウェア構成の差分の影響を受けやすく、VMなど本番とハードウェア構成の異なるテスト環境では信頼性の高いテストの実施が難しい場合もあります。

要はテスト実施毎に変更を捨てられれば良いので、ファイルシステムレベルで巻き戻すことを考えます。Windows Embeddedで言うところのEWF(Enhanced Write Filter)の機能をLinuxで実現できればよいのですが、Linuxだとaufsで実現できました。

aufsとは、複数のファイルシステムを重ね合わせて、仮想的なファイルシステムを提供するファイルシステムです。普段使っているディスクをroで使い、tmpfsでメモリ上に変更を貯めておけば、プログラム側に対してrw可能に見せておきながら再起動すると変更を全て捨てるテスト環境を作ることが出来ます。いわゆるLive CD的な挙動ですね。これを実現するシェルスクリプトが、Debian系ディストリではその名もずばりfsprotectというパッケージで提供されており、簡単に導入することが可能です。

Ubuntu 12.04での導入方法は以下の通り。

# aufsとfsprotect、apparmor-utilsの導入
sudo apt-get install aufs-tools fsprotect apparmor-utils
# DHCP Clientがapparmorに引っかかってうまく動かないので調整
sudo aa-complain dhclient3


DHCP ClientがAppArmorに引っかかってしまうので、調整が必要です。

また、fsprotectはカーネルオプションにfsprotectという文字列を渡したかどうかによって、fsptotectの有効・無効を切り替えることが出来るので、GRUBの設定変更が必要です。

vim /etc/dafault/grub

#(変更行抜粋)
#GRUB_HIDDEN_TIMEOUT=0 #コメントアウト
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fsprotect" #ブートオプションにfsprotect追加

GRUBへの変更の反映

update-grub

テスト中に加わった変更を迅速に巻き戻せる環境の構築という点では、fsprotectを基本有効にしておき、リブートするたびにクリーンな環境を利用できるようにし、メンテナンスのためにテスト環境に変更を加えたい場合はGRUB画面からエントリ編集を行い、一時的にfsprotectを外して起動させる、という運用がお勧めです。

なお、注意点として、fsprotectはデフォルトでは"/"パーティションにのみ保護を提供し、他のマウントされているパーティションについては何もしません。他のパーティションについても保護したい場合は、/etc/default/fsprotectを編集し、以下のように保護対象に加えてやる必要があります。

PROTECT="<directory path>=<tmpfsで確保するメモリ量>"

image最近VyattaでL2TP/IPsec VPNのアクセスコンセントレータをたてようとしていて嵌ったのでメモ。VyattaはPCルータを作るために様々なパッケージを集めたDebianベースのLinuxディストリビューションです。Tabによる補完の効くネットワーク機器ライクなCUI(vbash)とWebGUIを備えていて、Ubuntu Serverのような一般的なディストリベースでPCルータを構成するより手軽です。今回はこれをつかって、あるネットワークの管理用セグメントに入るためのVPNアクセスコンセントレータをたてようとしていました。WebGUIをガイドメッセージに従ってポチポチしていたらなんとなく動くものが出来て、こりゃ便利、と思っていたのですが、リモートアクセスするPCがNAT下にいると、うまく動かないという問題に直面。L2TP/IPsec VPNはIPsecで暗号化した通信を行うのですが、IPsecのパケットは、TCPやUDPではなく、IPsecとしてのパケットをIPの上に直接流すため、NATとは相性が悪いというのはよく知られた話。その対策として、IPsecのパケットをUDPで包む技術があり、NAT-Traversalというオプションを有効にしたから良い筈・・・と考えていたのですが、もう一つ指定するオプションがありました。
vpn->ipsec->nat-networksというオプション。これの指定を正しく設定してやらないと正しくNAT下で動きません。このオプションは、リモートのPCが居るかもしれないNATセグメントのレンジを指定するのであって、VPNを使って入りたいセグメントのレンジを書くところではありません。これを勘違いしていたために、丸1日潰しました。。つまり、

     nat-networks { 
         allowed-network 10.0.0.0/8 { 
             exclude <VPN先セグメントがPrivate Addressで被った場合、そのセグメント>  
         } 
         allowed-network 172.16.0.0/12 { 
         } 
         allowed-network 192.168.0.0/16 { 
         } 
     }

こんな感じでないとダメなんですね。。"cannot respond to ipsec sa request because no connection is known for…"というエラーメッセージが/var/log/messagesに出て困っている方は、試してみてください。

APR
3

roundcubeでWeb Mailer立ててみた。

Published:2011-04-03 16:50:31 UTC

この間、「メールサーバーの一つや二つ、自分で運用しないと!」的なことを言われたのをきっかけにメールサーバーをさくらVPS上に構築して移行しようとしている今日この頃です。まぁ、Google嫌いを公言しておきながらGMailに依存しているというのも、いい加減アレですしね。

で、世の中の定石に従ってPostfix+dovecotでメールサーバー(MTAとMRA)を立てているのですが、問題はメールクライアント(MUA)。手元のWindowsPC上で動かすメールクライアントは色々選択肢があるので良いのですが、問題はWebメールクライアント。やっぱりブラウザだけしかない環境でもメールは読みたいので。。。Webメールクライアントの代表的な実装としてはSquirrelMailがありますが、いい加減UIがボロくて使いたくないので、roundCubeというWebメールクライアントに手を出してみました。これ、結構イケてます。

image

ご覧の通り、Ajaxを活用したモダンなUIで、IMAPでメールを読めます。設定も設定ファイルを半自動生成するためのインストーラがあり、お手軽です。ややこしい要件や、大量のメールを扱う場合のことは分かりかねますが、自分のように、普段使っているMUAのバックアップ目的で使う分には十分すぎるアプリケーションです。なお、PHPで実装されており、MySQLやSQLiteなどのDBも必要とします。ご参考まで。

MAR
21

この間、Windows Serverをもっと勉強したいという考えから、家のサーバー環境のハイパバイザをVMware ESXiからWS2008R2 with Hyper-V2.0+SCVMM2008R2にリプレースして検証環境を作りました。それに合わせて、OpenVPN(ブリッジモード)をHyper-V上で作り直しました。ほんとはESXiからV2Vすればよかったのですが、OpenVPNを動かしていたVMから設定を抜き忘れたまま消してしまったので一から作りました。。

折角なので、Hyper-V上でOpenVPNを動かす場合の情報はネット上に転がってなさそうなので、Hyper-Vと関係ない部分も含めて、OpenVPNを動かす際の注意点をエントリにまとめてみます。

Hyper-Vの設定で気を付ける点

OpenVPNの入ったVMをHyper-V上で動かす場合、そのVMの仮想NICの設定を変更してやる必要があります。

Hyper-V Managerの場合SCVMM2008R2の場合

VMの仮想NICの中で、OpenVPNのクライアントからのフレームを通過させたいNICについては「MACアドレスのスプーフィングを有効にする」というチェックボックスをONにする必要があります。これがONになっていない場合、Hyper-Vの仮想スイッチは、仮想NICの接続されたポートにおいて、仮想NICについたMACアドレス以外を送信元にするフレームを廃棄します。そうした場合、OpenVPNのクライアントが送出したフレーム(TAP-Win32 AdapterのMACアドレスを持つ)が通らなくなってしまいます。ESXiでいうところの、仮想スイッチのPromiscuous Mode(無差別モード)の設定と同じですね。これさえ気をつければHyper-Vの設定は多分大丈夫かと思います。

Hyper-V以外でOpenVPNの設定で気を付ける点

基本的に設定はネット上に色々載っているものに従って行えば動くかとおもいます。自分の環境でのconfig例は立った!OpenVPNが立った! – SharpLab.というエントリに載せています。ただ、そうは言っても、色々間違えやすいのも事実。注意点を一点だけ。server.confの中で、dev tapあるいはdev tunと設定しろ、といった具合にサンプルがなっている部分があります。ここで、よくコメントを読まないといけないのですが、OpenVPNを立ち上げる前に事前に作ったtapインターフェイスを使う場合は、その名前"tap0"などを明示的に指定してやる必要があります。dev tap0のようにです。こうしないと、新しくtap1インターフェイスなどが作られ、起動スクリプトの中でブリッジさせたtapインターフェイスのほうにはトラフィックが流れずVPNがセッションは張れているのに通信できない、ということになってしまいます。