2008-03-27

Gentooで libexpat.so.0が無いと言われた時

error while loading shared libraries: libexpat.so.0: cannot open shared object file: No such file or directory

expatをアップデートしたタイミングで、apacheやらsubversionやらでこんなエラーに遭遇することがある。
libexpatのメジャーバージョンが上がったのに、libexpat.so.0を参照しているバイナリが残っているとこのような問題が起こる。
このようなリンク切れを探し出して再emergeをするには、

revdep-rebuild --library=libexpat.so.0

としてやると良い。ただしrevdep-rebuildコマンドが無い場合は先に emerge gentoolkit すること。

ラベル:

2008-03-21

64bit Gentooで32bitのライブラリが必要になったとき

emul-linux-x86-*シリーズをemergeしてやれば良い

ラベル:

2008-02-11

GentooのXenで network-bridgeが上手くできない場合

xendの起動時に実行される network-bridgeスクリプトは元の物理的な eth0を peth0 にリネームしたうえでIPアドレスを剥奪し、代わりの eth0を作成して元のIPアドレスを付け直すという動作をする(SSHで接続した端末から xendの起動をすると切断されてしまうのはこのためだ)。

しかし Gentooの場合、普通に emergeしたての xendを起動すると、peth0は出現するものの元の eth0 が作成されず通信できない状態になってしまうことがある(私の所だけなのか?)

この場合、network-script内で addr_pfxを取り出している部分を書き直すことで問題を回避できる。
get_ip_info() {
# addr_pfx=`ip addr show dev $1 | egrep '^ *inet' | sed -e 's/ *inet //' -e "s/$1//"`
addr_pfx=`ip addr show dev $1 | sed -n 's/^ *inet \(.*\) [^ ]*$/\1/p'`
gateway=`ip route show dev $1 | fgrep default | sed 's/default via //'`
}

ラベル: ,

2007-09-02

Gentooに Oracle Clientをインストールする

Oracleアプリケーションを Javaで開発する分には、大抵 Type4(thin)ドライバで何とかなるのでネイティブの Oracle Clientを入れる必要がないのだが、ネイティブアプリケーションや Railsから Oracleにアクセスしたい場合どうしても Oracle Clientは必要となる。

Gentooの Portageには Oracle Instant Client があるので、emergeですぐにインストール出来る・・・といいたいところだが、プロプライエタリなソフトウェアなのでバイナリを Oracleのサイトからダウンロードして /usr/portage/distfiles に配置してやる必要がある。

# emerge oracle-instantclient-sqlplus

それらのファイルを配置せず上記 emergeコマンドを実行すると、入手先やファイル名などを指示するメッセージが出力され emergeが一度停止するので、言われたとおりのファイルを入手・配置して再度 emergeをする。

ORACLE_HOMEの設定は自動的に行われるので、emergeが済んだらすぐに SQL*Plusを使ってテストが出来る。
前にも書いたことがあるが、最近の Oracle Clientは tnsnames.oraにTNS名を定義しなくても直接 DBサーバへ接続できるのでそのあたりの手間は随分省けるようになった。
下記は mydbhost 上で動作している Oracle Expressに対して SQL*Plusで接続を行う例。
(なお Oracle Expressのインスタンスはサービス名が常に xe となっている)

$ sqlplus scott/tiger@mydbhost/xe

ただ、NLS_LANGの設定は自動的には行われないので、必要なら /etc/env.d/50oracle-instantclient-basic ファイルに
NLS_LANG=japanese_japan.utf8
などの設定を追加してやること。

ラベル: ,

2007-06-23

Gentoo:電源ボタンの押下で電源が切れるようにする

客先にちょっとしたアプライアンスめいたヘッドレスサーバをGentooで構築して置いておくなんていう場合、問題になるのがシャットダウン手順だ。
ログインして root権限でシャットダウンコマンドを実行するといった簡単な操作でも、コマンドライン操作に慣れていない人にはかなり厳しいものがある。Macならともかく、そもそも Windows端末には sshクライアントが入っていない。
ここで「TeraTermなりPoderosaなりを入れればいいじゃん」って言い出す奴は、まず顧客というものを分かっていない。

いいかよくきけ。顧客というモノには、Officeと InternetExplorerとOutlook(Express)の操作スキルしか要求してはいかんのである。基本的には。顧客はパソコンを使いたいから使っているのではなく、使わないと仕事にならないから仕方なく使っているのだということを忘れてはならぬ。

というわけで、電源ボタンをポチリと押せば自動でOSがシャットダウンされたのちに電源が切れるようにしておきたい。そうすればターミナルの使い方のような「一生触れずに済むのならそれが幸せに違いないモノ」を顧客から遠ざけることが出来るのだ。これは感謝されるべきことである。別に感謝されないけど。

Gentooの場合 ACPIデーモンが標準では入っていないのでそれを入れる。

# emerge acpid

/etc/acpi/events/default というファイルが出来るので、
#event=button.power.*
#action=/sbin/init 0
となっている行をコメントインする。(この2行が電源ボタンが押されたときに何をするか?の定義らしい)

ACPIデーモンを起動する

# /etc/init.d/acpid start

試しにPCの電源ボタンを押してみよう(長押しは有無を言わさず切れてしまうので禁止)。
OSのシャットダウンが行われ、電源が切れるはずだ。もし切れなかったらマザーボードがおかしいかBIOS設定がおかしいかカーネル設定がおかしい。

次回起動時から acpidを自動起動するには

# rc-update add acpid default

とする。
おめでとう、あなたの顧客は幸せだ。本人は知るよしもないけど。

ラベル:

2007-06-12

libdm.so.0 が無いといって Sambaが起動できない

* samba -> start: smbd .../usr/sbin/smbd: error while loading shared libraries: libdm.so.0: cannot open shared object file: No such file or directory

emerge dmapi で解決できた。
dependency漏れ?

dmapiの Descriptionには "XFS data management API library" と書いてあるので、XFSを使用している環境に特有の依存関係なのかもしれない。(そういうのあるのか?)

ラベル:

2007-05-27

はぶられたか、Gentoo(Xen 3.0.4)

Xen 3.0.2→3.0.4への移行をやったときに、network-bridgeスクリプトがそのままでは正常に動かないためやむを得ず 3.0.2のものをコピーして使っていたのだが、もっとよく調べてみた。

手がかりになったのは、下記ファイルにおける Xen3.0.2から3.0.4への差分。
/etc/xen/scripts/xen-network-common.sh

旧バージョンでは、ifup/ifdownコマンドを持たないGentooのために、/etc/init.d/net.* start/stopを呼び出すようなifdown/ifupへのブリッジとなるシェル関数が書かれていたのに対し、新しいバージョンではさっくり消されていた。

Xen-develメーリングリストをちらっと確認したところ、どうやらそういう個別対応はしない方針でスクリプト類をクリーンナップした模様。こういった類の問題に対しては ebuildによるパッチで対応してくれることを期待していたのだが、そうはなっていないみたいだ。

私は xen-network-common.shを一部旧バージョンの内容に書き換えることで対応したが、/sbin/ifupと /sbin/ifdownを手で作るという方法の方がスマートかもしれない。

ラベル: ,

2007-03-23

Gentooでソフトウェア RAID0

最近のマザーボードはシリアルATAのポートを4つとか6つとか搭載している。
大抵の人はこんなに使わないで余らせていると思うし、4つもディスクの搭載できる筐体を持っているとも限らない。

しかし4つのポートを束ねて1個のマルチレーンコネクタとして筐体の外に出すと、下手なSCSIより速い外付けストレージ環境が手に入ることに注目されたい。
参考:マルチレーンの活用記事

さて、せっかくたくさんディスクを並べたらRAIDにしないともったいない。
RAIDコントローラは高いので、さしあたりはソフトウェアRAIDにしようという人も多いはず。
そんなわけで RAID0の組み立て手順をメモ。
(注:RAID0は速いけどMTBFが異様に短くなるので通常の運用にはお勧めしません)

各ディスクに fdiskで同じ大きさのパーティションを作成する。ここでは /dev/sda /dev/sdb /dev/sdc /dev/sddにそれぞれ /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1 を作成したことにする。それぞれのパーティションタイプは 0xfdにしておくと良いかも知れない(そうしておくとOSがこのパーティションをRAIDのメンバだとすぐ認識できる)

LinuxでソフトウェアRAIDを組むには mdadmというツールを使用する。まだ入れてなければ
emerge mdadm
する。

RAID0ボリューム /dev/md0を下記のコマンドで作成

mdadm --create --verbose /dev/md0 --level=0 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1

次回起動時にアレイの情報を確実に自動復元できるよう設定ファイルへ追記

mdadm --detail --scan >> /etc/mdadm.conf

アレイを監視させるために mdadmをデーモンとして自動起動するよう rc-updateする

rc-update add mdadm default

ここまでで RAID0の構築は完了。試しに論理ボリュームを作ってみよう。

pvcreate /dev/md0
vgcreate raid0 /dev/md0
lvcreate -n test -L 1G raid0

これで1GBの論理ボリューム /dev/raid0/test が作成されたので、書き込みテストをしてみる。

dd if=/dev/zero of=/dev/raid0/test bs=1M count=1024
1073741824 bytes (1.1 GB) copied, 5.08022 s, 211 MB/s


211MB/秒の書き込み速度。
シリアルATAのポートが4ポートとも同じPCIバスにつながっている場合、バスの帯域がボトルネックになってこの半分くらいの速度しか出ないので注意。(211MB/秒の例は PCI-Express x1スロットも併用している)

ラベル: ,

xendをnfsdより後に起動させるように rcスクリプトを調整する

うちの場合、全てのドメインUから ドメイン0のリソースを NFSで参照するので、xend(と、自動起動のドメインUたち)が nfsdより後に起動してくれないと困る。
Gentooの場合、rcスクリプトの中にdepend(){}というセクションがあって、ここで起動順序を制御できる。

デフォルトの /etc/init.d/xend では

depend() {
need net
before xendomains sshd ntp-client ntpd nfs nfsmount rsyncd portmap dhcp
}

のようになっていたので、

depend() {
need net
before xendomains
after sshd ntp-client ntpd nfs nfsmount rsyncd portmap dhcp
}

というふうに xendがとにかく最後に起動するようにした。

ラベル: ,

2007-03-21

ASUS M2N-VM DHの無線LANをGentoo Linuxで使う

ASUSのマイクロATXマザーボード M2N-VM DH にはオンボードの無線LANが載っている。
どうやらこれは RTL8187というチップらしい。
USB接続なので、カーネルにEHCI(USB2.0)サポートが組み込まれている必要があることに注意。

RTL8187のドライバはカーネルに含まれて居いないが、Portageからインストール出来る。
また、無線関係の設定ツールとして wireless-toolsも必要。

emerge rtl8187 wireless-tools

udevがお節介を焼いてくれれば、次回ブート時に r8187.koが自動でロードされ、wlan0 デバイスが現れる。


rtl8187: Initializing module
rtl8187: Wireless extensions version 19
rtl8187: Initializing proc filesystem
rtl8187: Reported EEPROM chip is a 93c46 (1Kbit)
rtl8187: Card MAC address is xx:xx:xx:xx:xx:xx
rtl8187: Card reports RF frontend Realtek 8225
rtl8187: WW:This driver has EXPERIMENTAL support for this chipset.
rtl8187: WW:use it with care and at your own risk and
rtl8187: WW:**PLEASE** REPORT SUCCESS/INSUCCESS TO andreamrl@tiscali.it
rtl8187: This seems a new V2 radio
rtl8187: PAPE from CONFIG2: 0
rtl8187: Driver probe completed
usbcore: registered new driver rtl8187


/etc/conf.d/net には

config_wlan0=( "dhcp" )
preferred_aps=( "接続先APのESSID" )

とでも書いておけば暗号化なしのネットワークにはつながる。
WEPならこれに少し書き足すだけで良いようなのだが、うちのメインAPはWPAなので事情が複雑になる。

WPAを使うためには wpa_supplicant という別のパッケージが追加で必要で、これ自体は emerge wpa_supplicant で簡単に入るのだが RTL8187のドライバ共々まだ歴史が浅く枯れていないのですんなり組み合わせがうまくいくわけもなく頓挫。

秋葉で新しいモノを買ってくるとこういうことはよくある。
好きこのんで人柱やってるわけではないのだが・・・

ラベル:

2007-03-09

Oracle Express EditionをGentooに入れる

Oracle Express Edition(Oracle XE)は、4GBまでのデータを格納できる無料の Oracle。

Oracle XEは rpm又はdebで配布されている。ここではrpmを使う。
Oracleの動作にはlibaioとbcも必要なようなのでそれもemergeする。

# emerge libaio bc rpm

/etc/sysctl.confに下記を追記して、sysctl -pで反映しておく。

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

グループdbaとユーザーoracleを作成する。
本当はインストールスクリプトで自動作成するようになっているらしいんだけど、私のところではうまくいかなかったので手動で。

# groupadd dba
# useradd -m oracle -g dba -G wheel

rpmを使って Oracle XEのパッケージをインストール

# rpm -ivh oracle-xe-univ-ほげほげ.i386.rpm --nodeps

ファイル名に univ って入っている方のパッケージじゃないとデータベースの文字セットがWesternになってしまうので日本人は悲しい目にあうため注意。univって入っている方のパッケージだと内部文字セットにUNICODEが使われる。シフトJISやらEUCやらはXEではサポートされていないというもっぱらの噂。

rpmのインストールが済んだら、/etc/init.dに cdして下記のコマンドを入力(引用元:Gentoo Linux Wiki)。
なにやら Gentoo用に initスクリプトをちょっと直す必要があるみたい。

# sed -i -e "s/\$SU -s \/bin\/bash \{1,2\}\$ORACLE_OWNER -c/\$SU \$ORACLE_OWNER -l -c/g" oracle-xe


ここでハマりどころひとつ。(いや、普通の人はそんなところではまらないのだけど)
/etc/hostsに自分のホスト名が書かれてないと Oracleは正常動作しない。
初期化スクリプトが妙に早く完了したなと思ったら全然データベースが出来てない。
(通常のOSインストール手順を踏まずに仮想マシンとかで手早くセットアップした環境だとそういう問題が起こりうる)

下記コマンドで初期DBを作成する。Web管理画面やリスナーのポート番号、SYSなどの初期パスワードを聞かれる。

# /etc/init.d/oracle-xe configure

質問に答えたあとしばらく処理が行われているようだったら成功の可能性大。
時間をおかずにすぐプロンプトに帰ってくるようだと、おそらく初期DBの作成に失敗したか、あなたのマシンがアホみたいに速いかのどちらか。ちなみに私のところでは Athlon64X2 5200+とRAIDの環境で十数秒〜数十秒かかったと思う。

初期DBの作成が済んだら rc-update add oracle-xe default して自動起動にするとか、http://yourhost:8080/apex にアクセスして Web管理画面から色々やってみるとか、クラシカルに sqlplusでつないでみるとかすれば良い。

但しsqlplusを動かすためには当然伝統的な ORACLE_HOMEとかの設定が必要。

export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export ORACLE_SID=XE
export NLS_LANG=japanese_japan.UTF8
export PATH=$ORACLE_HOME/bin:$PATH

インスタンスの名前は XE になる。TNS記述子もその名前で作られる。
変更できるのかは知らない(TNS記述子は変更できるだろうけど・・・)

注意:64bit環境の人は何とかして 32bit版の libaio.so.1を /usr/lib32 に入れてやらないと動かない。

ラベル: ,

2007-03-06

genkernelでXenカーネルを作る(x86_64)

基本的には、環境変数 ARCH_OVERRIDEに "xen0" 又は "xenU" をセットして genkernelを実行すれば良いのだが、そのままではどういうわけかうまくいかない。

/usr/share/genkernel/xen0(およびxenU)/config.sh

上記ファイル内の KERNEL_MAKE行を下記のように書き換える必要がある。

KERNEL_MAKE="make ARCH=x86_64"

ドメインUで /dev/sd*を使いたければ、ドメインUカーネルを作成するときSCSIをオフにすること。
(/dev/sd*という名前を使わなければいいじゃないかって? sdにしておけば仮想マシンと実機とで行き来できるでしょ)
さもないとxen_blk: can't get major 8 with name sdとか言われてdomainUが起動しない。

Xenの導入がひと段落したのでSDLを入れてHVM domainを試したのだが、xm createした瞬間マシンが即死(リブート)。
これに関しては安定を待つとするか・・・※追記:別のマシンで試したら色々問題はあるものの同じバージョンのXenでWindows XPの起動まで出来た。

ラベル: ,

2007-01-08

GentooとJava

PortageでJava5, Tomcat, mod_jk がちゃんとメンテされるようになっていた。
メンテナー交代があったのかもしれない。いやあ、よかったよかった。

Java5用でTomcatを入れる場合でも、依存コンポーネントの中にはJDK1.4を必要とする物があるので sun-jdkの他に blackdown-jdkも入れておく必要がある。

pptpclientを使おうと思って色々設定したけど何故かGREのパケットが外に出て行かず。いろいろ調べたけど時間もったいないので中断。

ラベル: