2010年12月16日木曜日

portage 小ネタ: package.env

Gentoo Advent Calendar 6日目: Portage に関する小ネタ: package.env

今まで twitter でつぶやいてきたことをいくつかまとめてみる. まとめてみようかと思ったんだけど一つ目で力尽きた.
他はまた今度.


1. /etc/portage/package.env

portage-2.2_rc93 で /etc/portage/package.env が使えるようになるらしい.パッケージ毎に環境変数を変えられるんかなless than a minute ago via web



これは確か New portage on the horizon をみてつぶやいたはず.
* Per-package environment variables can be set with the new package.env 
configuration file in /etc/portage/. See the portage(5) man page for 
details. 

これを実際に使ってみようと思う.
まずは,portage-2.2_rc93 を入れる.
今日時点ではまだマスクされているので,unmask にいれます.

$ echo =sys-apps/portage-2.2_rc93 | sudo tee -a /etc/portage/package.unmask
$ sudo emerge -u portage

使い方を見てみます.(man 5 portage)

package.env
  Per-package  environment  variable  settings. 
  Entries refer to environment files that are placed in the /etc/portage/env/ 
  directory and have the same format as make.conf(5).

  Format:
  - comment lines begin with # (no inline comments)
  - one DEPEND atom per line followed by name(s) of environment file(s)

  Example:
  # use environment variables from /etc/portage/env/glibc.conf for the glibc package
  sys-libs/glibc glibc.conf

/etc/portage/env/ に make.conf と同じフォーマットで記述したファイルを置いておき,それを /etc/portage/package.env で指定するような感じらしい.

例えば,特定のパッケージだけ CFLAGS を変えたいといった場合は,以下のようにする.

/etc/portage/env/hoge.conf
CFLAGS="-march=i686 -O1 -pipe"

/etc/portage/package.env
app-arch/unzip hoge.conf

このような設定を書くと,app-arch/unzip のみ CFLAGS を "-march=i686 -O1 -pipe" にすることができます.

パッケージをデバッグしたい(gdbで調査したいとか)場合は,

/etc/portage/env/debug.conf
CFLAGS="${CFLAGS} -g"
FEATURES="nostrip"

/etc/portage/package.env
app-arch/unzip debug.conf
とすればいいでしょう.
こうすると,app-arch/unzip のみ -g つきでコンパイルされ,自動的にバイナリが strip されません.

2010年12月8日水曜日

kdump on gentoo linux

Redhat や Ubuntu にはクラッシュダンプを取得できる仕組みが用意されている.
しかし,Gentoo Linux にはもちろんそんなものは用意されていないので自前で作ってみる.

クラッシュダンプを取得する仕組みは,だいたい以下のような感じ.

  1. Crash する
  2. CrashDump 取得用のカーネルの起動
  3. /proc/vmcore をコピー

CrashDump 取得用カーネルは kexec の仕組みを利用するので,まず kexec-tools をインストールします.

$ sudo emerge -av sys-apps/kexec-tools
あと,通常使用するカーネルのオプションで下記のものを有効にしておきましょう.

  • CONFIG_KEXEC=y
  • CONFIG_SYSFS=y
  • CONFIG_DEBUG_INFO=y
この設定でコンパイルしたものを準備しておき,起動オプションに crashkernel=128M を追加します.

kernel /kernel-x86_64-2.6.36-gentoo root=/dev/sda2 crashkernel=128M

なんで 128MB なのかは今後調べる.物理メモリがデカいとこの値も大きくしないと動作しないかも.
このオプションを追加して起動すると dmesg に次のメッセージがでるはずです.

Reserving 128MB of memory at 32MB for crashkernel

次のログが出てた場合は何かが失敗してます.
crashkernel reservation failed

次に CrashDump 取得用のカーネルの準備を行います.
このカーネルは余計な機能は使わないようにできるだけ最小構成にした方がいいと思われます.

とりあえず,下記のオプションが必要らしいです.
(全アーキテクチャ共通)

  • CONFIG_CRASH_DUMP=y
  • CONFIG_PROC_VMCORE=y

(for i386, x86_64)

  • CONFIG_HIGHMEM4G or CONFIG_HIGHMEM64G=y
  • CONFIG_SMP=n
  • CONFIG_RELOCATABLE=y
他のアーキテクチャで必要なオプションは Documentation/kdump/kdump.txt を参照してください.

カーネルの準備が終わったところで,クラッシュダンプを取得するスクリプトを作ります.

/etc/init.d/kdump
#!/sbin/runscript
LOGGER="/usr/bin/logger -p info -t kdump"
start() {
    if [ -s /proc/vmcore ]; then
        coredir="/var/crash/`date +"%Y-%m-%d-%H:%M"`"
        mkdir -p $coredir
        cp --sparse=always /proc/vmcore $coredir/vmcore-incomplete
        exitcode=$?
        if [ $exitcode == 0 ]; then
            mv $coredir/vmcore-incomplete $coredir/vmcore
            $LOGGER "saved a vmcore to $coredir"
        else
            $LOGGER "failed to save a vmcore to $coredir"
        fi
        reboot
    fi
}

CrashDump を取得するための runlevel を作ります.
別に runlevel にしなくてもいいんですが,なんとなくです.

 $ sudo install -d /etc/runlevels/crash
 $ sudo rc-update add syslog-ng crash
 $ sudo chmod +x /etc/init.d/kdump
 $ sudo rc-update add kdump crash

最後に CrashDump kernel をロードします.

 $ sudo kexec -p /boot/crashdump-kernel-x86_64-2.6.36-gentoo \
   --append='root=/dev/sda2 softlevel=crash'


これで用意が完了です.テストしてみます.

 $ echo -n c | sudo tee /proc/sysrq-trigger

しばらくすると,マシンがリブートします.
リブート後,/var/crash を確認すると vmcore というファイルができているはずです.

 $ ls -lh /var/crash/2010-12-08-12\:00
 -r-------- 1 root root 3.7G 11月 19 23:25 vmcore

これをデバッグするには,こんな感じです.
デバッグの仕方とかは DEBUG HACKS とかが参考になるんじゃないでしょうか.
 $ gdb /boot/kernel-x86_64-2.6.36-gentoo vmcore

2010年12月4日土曜日

lxc-0.7.3

lxc-0.7.3 から mount entry の指定方法が変わったようです.

Gentoo でインストールしてる人はアップグレード時に einfo が表示されてるので気づくかもしれませんが,
スルーしてて気づくのが遅れてしまった.

Starting from version 0.7.3, you have to specify mount points of bind mounts
using the rootfs mount point as a base. This means you'd then have something
along the lines of the following in your lxc configuration files:
"
lxc.mount.entry = /usr/portage /usr/lib/lxc/rootfs/usr/portage none bind 0 0
"

lxc.mount で fstab ファイルを指定していたのを lxc.mount.entry で書くようになるようです.