ラベル gentoo の投稿を表示しています。 すべての投稿を表示
ラベル gentoo の投稿を表示しています。 すべての投稿を表示

2014年12月6日土曜日

Gentoo で FIDO U2F Security Keyを使う


Yubicoのオンラインストアで FIDO U2F Security Key を買ってみました。
他にもFIDO U2Fに対応しているものとしては、高機能なヤツとか小さいヤツとかあり、OpenPGPに対応していると書かれているのでちょっと惹かれましたが、入門としては一番安いヤツでいいかなと思い、これを選びました。

U2Fの使い方については「Googleの二段階認証にセキュリティキーを使う」が分かりやすいですが、Linux環境で動作させる手段は記述がありませんでしたので追加で調べました。

1. 事前準備

まず、と言ってもこれ一つだけですが、ChromiumからSecurity Keyにアクセスできるようにしなければなりません。
YubicoのSecurity Keyは hiddev で提供されます。
これへアクセス出来るように udev ルールを記述する必要があります。

https://github.com/Yubico/libu2f-host/blob/master/70-u2f.rules

udev ルールは上記のGithubに上がっています。
systemd を使用している環境であれば、これで動くらしいです。

私は Gentoo で OpenRC を使用しているので上記のルールでは動作しませんでした。


上記のようにパーミッションとグループについて設定するようにしました。
Security Keyを利用するユーザは plugdev に入っている前提です。

このルールを /etc/udev/rules.d/ に放り込めば準備完了です。

2. 使用する

Google の認証に使用してみます。

https://security.google.com/settings/security/securitykey/add

Security Keys を追加するページにChromiumでアクセスし、案内に従って操作するだけです。
問題なければ、最終的に完了ボタンが押せるようになります。
udev のルールに不備がある場合は、「次にセキュリティキーを挿入してタップしてください」というメッセージが出続けると思います。


せっかくなので Gentoo Advent Calendar 2014 の6日目に登録しました。

2014年7月7日月曜日

Gentoo勉強会 2014年7月に参加してきた

6月に引き続き、7月5日に開催された勉強会に参加してきました。
実はGentoo勉強会のことをすっかり忘れていて、前日に松鵜さんに言われて思い出して参加申し込みをしたのでした。
あと、www.gentoo.gr.jp に掲載しているニュースも当日に Pull Req をするという感じで、次回はちゃんと事前にニュースを載せたいなと思ってます。忘れてたらすいません。

場所はいつもと同じく Miracle Linux さんの会議室。


今回の参加者はメモによると合計11名。

以下メモ。

自己紹介

特にメモはない。
+Takuto Matsuu さんが Gentoo ステッカーを配ってくれました。




最近の Gentoo 事情(@aliceinwire)

EAPI 6のことをいくつか。




Dockerでテストする(@naota344)

  • (プレゼントは関係ないけど)新しいマシンにしたらしい
    • ついでに systemd 使ってみたらちょー起動速いとのこと
  • ebuild 書いた後、ちゃんとテストしてますか?
    • repoman は ebuild の静的なチェック。
    • 書式とか DEPEND とか。
    • あとは実際に build してみるくらい。
  • CFLAGS に -frecord-gcc-switches を入れると、バイナリに CFLAGS の内容が記録されて portage が後で正しく適用されているかチェックしてくれるらしい
  • ld.gold を使えば under-linking が防げる
    • under-linking というのは A -> libB -> libC という依存状態の時に A -> libC がリンクされていない状態。
    • A から見ると libC はあってもなくても良いように見えるけど、libB が依存してるので、削除すると A も動かなくなる。
  • ここから本題の Docker.
  • Docker とはなにか
    • 昨日の Docker meeting に行って下さい。
  • https://github.com/naota/dockergentoo を clone して使ってね
  • 資料はコレらしい。

 emerge できない時、どうする?(https://twitter.com/grauwoelfchen)



一度休憩

きのことたけのこや抹茶わらび餅、おまんじゅうなど。
持ってきて下さった方、ありがとうございます。
ちなみに、たけのこ派です。

metro(@kjm)

自分の発表です。
どなたかの発表が入っていたのですが、キャンセルされていたので入れてしまいました。

自分でも理解し切れていないことが多く、うまく説明できませんでした。
半分くらい Funtoo の話題になってしまった気がします。
Funtoo は drobbins 氏がホスティングサービスを提供していて(今は休止中かも?)、契約すると drobbins 氏のサポートが付いてくると言う特典があります。

一応資料はこちらにアップしております。


Gentoo Linux LDAP Authentication(@mazgi)


  • Gentoo Linux で LDAP Authentication 環境を構築
  • 主に Gentoo Wiki を参考にしたとのこと
  • 実際に構築した環境のでもを見せてくれました
  • 最近は SSSD というものを使うのが普通らしい
    • System Security Service Daemon
    • ある程度認証情報をキャッシュしてくれるらしい

 TravisでGentooのRepomanコマンド(@aliceinwire)




という感じで今回はおしまい。
懇親会にも参加したけど、イイ感じの写真が撮れなかった。
さくら水産で撮影だと素人には難しすぎるようです。


2011年5月2日月曜日

Thinkpad X61 でピークシフト機能を使う

Thinkpad X61 でピークシフト機能を使う


Thinkpad にはピークシフト機能が搭載されています. [*]
ピークシフトとは電力使用量が多い時間帯に AC アダプターからの電力供給をカットしバッテリー駆動にすることでその時間帯の電力消費を抑える機能です.
Windows ではソフトウェアが提供されているらしいのですが,Linux ではどうやるんだろうということで調べてみました.

[*]http://www-06.ibm.com/jp/pc/environment/peakshift.shtml

tp_smapi

ThinkPad のことを調べたいと思ったら,まず ThinkWiki です.
探してみたところ,tp_smapi というカーネルモジュールがありました.

http://www.thinkwiki.org/wiki/Tp_smapi

インストール

Gentoo では app-laptop/tp_smapi というパッケージがあるので,一発で入ります.

$ sudo emerge -av app-laptop/tp_smapi

もし,kernel の方で HDAPS を Y もしくは M として利用しているのであれば外しておいた方がいいようです.
外した上で,tp_smapi の hdaps use-flag をオンにしましょう.
外さなくても,利用することは出来ますが,モジュールをロードするときに以下のようなメッセージがでてロードできないことがあるようです.

thinkpad_ec: cannot claim IO ports 0x1600-0x161f... consider using force_io=1.

この場合は /etc/modprobe.d/hoge.conf に以下のような記述を追加しておけば利用できます.

options thinkpad_ec force_io=1

使い方

まずはモジュールをロードします.

$ sudo modprobe tp_smapi

ロードすると,/sys/devices/platform/smapi/ ができます.

$ ls /sys/devices/platform/smapi/
BAT0  BAT1  ac_connected  driver  modalias  power  smapi_request  subsystem  uevent

$ ls /sys/devices/platform/smapi/BAT0
-rw-r--r-- 1 root root 4096 May  1 20:44 barcoding
-rw-r--r-- 1 root root 4096 May  1 20:44 charging_max_current
-rw-r--r-- 1 root root 4096 May  1 20:44 charging_max_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 chemistry
-rw-r--r-- 1 root root 4096 May  1 20:44 current_avg
-rw-r--r-- 1 root root 4096 May  1 20:44 current_now
-rw-r--r-- 1 root root 4096 May  1 20:44 cycle_count
-rw-r--r-- 1 root root 4096 May  1 20:44 design_capacity
-rw-r--r-- 1 root root 4096 May  1 20:44 design_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 dump
-rw-r--r-- 1 root root 4096 May  1 20:44 first_use_date
-rw-r--r-- 1 root root 4096 May  1 21:05 force_discharge
-rw-r--r-- 1 root root 4096 May  1 20:44 group0_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 group1_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 group2_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 group3_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 inhibit_charge_minutes
-rw-r--r-- 1 root root 4096 May  1 20:44 installed
-rw-r--r-- 1 root root 4096 May  1 20:44 last_full_capacity
-rw-r--r-- 1 root root 4096 May  1 20:44 manufacture_date
-rw-r--r-- 1 root root 4096 May  1 20:44 manufacturer
-rw-r--r-- 1 root root 4096 May  1 20:44 model
-rw-r--r-- 1 root root 4096 May  1 20:44 power_avg
-rw-r--r-- 1 root root 4096 May  1 20:44 power_now
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_capacity
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_charging_time
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_percent
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_percent_error
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_running_time
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_running_time_now
-rw-r--r-- 1 root root 4096 May  1 20:44 serial
-rw-r--r-- 1 root root 4096 May  1 20:44 start_charge_thresh
-rw-r--r-- 1 root root 4096 May  1 20:44 state
-rw-r--r-- 1 root root 4096 May  1 20:44 stop_charge_thresh
-rw-r--r-- 1 root root 4096 May  1 20:44 temperature
-rw-r--r-- 1 root root 4096 May  1 20:44 voltage

色々ありますが,いくつか説明します.

state
現在の状態. discharging, charging, idle の3種類
remaining_percent
バッテリー残量(%)
start_charge_thresh

充電を開始する閾値.

echo 70 > start_charge_thresh

とすると,70% 以下になったときに充電を開始する.

stop_charge_thresh

充電を停止する閾値

echo 90 > stop_charge_thresh

とすると,90%になった段階で充電が止まる.

force_discharge

放電モードにする. ACアダプタをつけてるときに機能します.

1 を入れるとこの機能が働き,ACアダプタをつなげていてもバッテリー駆動になります.

inhibit_charge_minutes
指定した時間(分)の間,充電を停止する.

これらのうち,force_discharge と inhibit_charge_minutes あたりの機能が使えそうです.

tp_peakshift

というわけで,簡単なスクリプトを書いてみました.
Yahoo!Japanの電気予報APIを利用し,1時間後もしくは2時間後の消費電力予測を見て 95% を超えたときに電池駆動モードに移行もしくは充電の停止をするものです.



使い方

スクリプトを /etc/cron.hourly/ 以下に放り込んで実行権限をつけてください.

欠点

force_discharge をオンにした状態でバッテリーが空になると,自動的に充電が始まってしまう.
充電が始まると,通常使用分+充電で余計に電力を使用してしまうので逆効果になってしまう場合がある.
バッテリーが空になったときは inhibit_charge_minutes に適当な値を自動的に入れるような仕組みが欲しいところ.


ThinkPad X61 での動作は確認しています.
他の機種でも動くとは思いますが判りません.


参考までに,通常使用時が 20W〜25W ほどで充電中は 55W〜60W くらいでした.

2011年3月6日日曜日

ja_JP.UTF-8 vs ja_JP.utf8

それは某IRCチャンネルの何気ない一言から始まった.
@xxxx | .UTF-8 or .utf8?

僕は何も疑問を持たずに,こう答えた.
@Kojima | ja_JP.UTF-8

そしたら彼は,
@xxxx | .utf8 on 'locale -a'
と返答してきた.

確かに,手元の環境で
locale -a
を実行してみると,utf8 になっている.
$ locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

@matsuu 先生が以前 eselect locale を入れたときにこうつぶやいていたのを思い出したので,「matsuu先生がこういってるんだから,.UTF-8なんだよ!」としておいた.

ja_JP.utf8ではなくja_JP.UTF-8で設定すべし RT @naota344: 気がつけば @matsuu せんせーの eselect locale が入っていた。 eselect locale ja_JP.utf8 しておけばいいんだろうか…。less than a minute ago via web



とはいえ,ちょっと気になったので調べてみた.


LFS のドキュメントにこんな記述がある.
キャラクターマップはたくさんの別名を持つことが出来ます。 例:“ISO-8859-1”は、“iso8859-1”と“iso88591”として参照されます。 いくつかのアプリケーションは、様々な別名を正しく取り扱えません(例:“UTF-8”は、“utf8”ではなく“UTF-8”と書く必要がある)。

いくつかのアプリケーションは "UTF-8" と書いておかないといけないらしい.

"UTF-8" と書く理由はわかったけど,"utf8" と "UTF-8" は同価なのだろうか.

"locale -a" の結果はどこから持ってきてるのか調べてみる

$ strace locale -a
(snip)
open("/usr/lib64/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3677376, ...}) = 0
(snip)
"/usr/lib64/locale/locale-archive" を参照しているようだ.
これはきっと localedef で作られるはずだ,ということで localedef のコードを追ってみた.

glibc-2.11.2 の intl/l10nflist.c:_nl_normalize_codeset で以下のような処理をしていた.

347   if (retval != NULL)
348     {
349       if (only_digit)
350         wp = stpcpy (retval, "iso");
351       else
352         wp = retval;
353 
354       for (cnt = 0; cnt < name_len; ++cnt)
355         if (isalpha ((unsigned char) codeset[cnt]))
356           *wp++ = tolower ((unsigned char) codeset[cnt]);
357         else if (isdigit ((unsigned char) codeset[cnt]))
358           *wp++ = codeset[cnt];
359 
360       *wp = '\0';
361     }

locale-archive に書き込む際に,アルファベットは小文字に,アルファベットと数字以外は無視するようにしているようだ.

ちなみに,LC_* とか LANG のシンタックスは次のような形式らしい.
[language[_territory][.codeset][@modifier]]


結論

"ja_JP.utf8" も "ja_JP.UTF-8" も同じ意味.しかし,一部のアプリケーションでは ".UTF-8" と書かなければ正常に動作しないことがあるので "ja_JP.UTF-8" が推奨される.


たぶん.

2011年1月11日火曜日

app-i18n/atokx3-r6 にアップデートしたら xterm とか urxvt が起動できなくなった

去年の10月くらいに発生したんだけど、先日正常な動作に戻ったのでメモっておく。
色々調査してくださった @matsuu せんせいには感謝。


事象

  • app-i18n/atokx3-r5 から app-i18n/atokx3-r6 にアップデートする
  • xterm を起動する→途中で止まる


原因
/usr/lib32/iiim/xiiimp.so, xiiimp.so.2 が本来であれば xiiimp.so.2.0.0 にリンクが張られているべきところが自分自身にリンクが張られていた。

lrwxrwxrwx 1 root root 25  1月  8 23:11 /usr/lib32/iiim/xiiimp.so -> /usr/lib32/iiim/xiiimp.so
lrwxrwxrwx 1 root root 27  1月  8 23:11 /usr/lib32/iiim/xiiimp.so.2 -> /usr/lib32/iiim/xiiimp.so.2

なんでこんな事になってしまうんだろう、と調査してたところ、このバグが見つかった。
ここに書かれている通りではないが、次のように pym/portage/__init__py を変更してみたところ正常にインストールされるようになり、xterm も起動できるようになった。

def abssymlink(symlink):
         "This reads symlinks, resolving the relative symlinks, and returning the absolute."
         mylink=os.readlink(symlink)
         if mylink[0] != '/':
-                mydir=os.path.dirname(symlink)
+                mydir = "."
                 mylink=mydir+"/"+mylink
-         return os.path.normpath(mylink)
+         return os.path.abspath(mylink)

このバグか!!1と発見したときは喜んだモノの、もう少し調べてみたところ、
/usr/lib64/iiim が /usr/lib32/iiim へのリンクになっていた。

/usr/lib64/iiim を削除して再インストールしてみたら、問題は出なくなった。
なんで、こんなリンクが張られたかについては判っていない。

atokx3-3.0.0-r5.ebuild:
135     # amd64 hack
136     if use amd64 ; then
137         if [ "$(ABI=x86 get_libdir)" != "$(get_libdir)" ] ; then
138             dosym /usr/$(ABI=x86 get_libdir)/iiim /usr/$(get_libdir)/iiim || die
139             dosym /usr/$(ABI=x86 get_libdir)/libiiimcf.la /usr/$(get_libdir)/libiiimcf.la || die
140             dosym /usr/$(ABI=x86 get_libdir)/libiiimp.la /usr/$(get_libdir)/libiiimp.la || die
141         fi
142     fi
138行目あたりでリンク貼られてるので、この辺かなーと思ったんだけど当時使ってた portage のバージョンに戻してやってみたけど再現しなかった。

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年11月13日土曜日

upgrade to xorg-1.8

Xorg-1.8 にアップグレードしたら、マウスとキーボードの操作ができなくなってしまった。
そういえば、xorg-1.8 からデバイスの認識が hal から udev に変わったとどっかで見た気がする。

と、いうわけで検索してみたところ、そこは Gentoo ちゃんとドキュメントがありました。

これを元に、ThinkPad X61 の設定をしてみた。

/etc/X11/xorg.conf.d/ の作成。xorg.conf に書いても良いけど。
$ sudo mkdir /etc/X11/xorg.conf.d

TrackPoint の設定

真ん中のスクロールボタンも使えるように設定する。
$ sudo vim /etc/X11/xorg.conf.d/10-trackpoint.conf

# ThinkPad Trackpoint
Section "InputClass"
        Identifier      "mouse-all"
        Driver          "evdev"
        Option          "EmulateWheel" "true"
        Option          "Emulate3Buttons" "true"
        Option          "EmulateWheelButton" "2"
        Option          "XAxisMapping" "6 7"
        Option          "YAxisMapping" "4 5"
        Option          "ZAxsisMapping" "4 5"
        MatchIsPointer  "on"
EndSection

Keyboard の設定

キーボードレイアウトは dvorak, Control キーと Capslock は入れ替え。
$ sudo vim /etc/X11/xorg.conf.d/10-keyboard.conf

# Keyboard
Section "InputClass"
        Identifier      "Keyboard-all"
        Driver          "evdev"
        Option          "XkbLayout" "dvorak"
        Option          "XkbOptions" "ctrl:swapcaps"

        MatchIsKeyboard "on"
EndSection


system-wide な設定は /usr/share/X11/xorg.conf.d/ にあるらしい。

2010年8月15日日曜日

[memo] LXC ゲストから USB デバイスへアクセス

LXCゲスト内でUSBデバイスなどの物理デバイスにアクセスするには、config ファイルに許可するデバイス番号を記述すればいいらしい。
USBデバイスすべてへのアクセスを許可する場合は、以下の記述を追加する。

lxc.cgroup.devices.allow = c 189:* rwm

特定のデバイス(バス)のみ許可したい場合は、*を適宜書き換えればいいだろう。

ゲスト内では udev が動作しないため手動でデバイスノードを作る必要がある。
GUEST# mkdir -p /dev/bus/usb/001
GUEST# mknod /dev/bus/usb/001/001 c 189 0
GUEST# chgrp -R usb /dev/bus/usb/
GUEST# ls -l /dev/bus/usb/001
total 0
crw-rw-r-- 1 root usb         189, 0 2010-08-12 01:37 001

lsusb コマンドで表示してみる。

GUEST# emerge -av usbutils
GUEST# lsusb
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

参考:
[lxc-users] usb devices


#記事書いてから思ったけど、ゲストじゃなくてコンテナって読んだ方がいいんだろか。

2010年8月12日木曜日

[gentoo] pitivi 起動時のエラー

GentooLinux上で pitivi を起動しようとしたところ、以下のようなエラーが出て起動できなかった。

$ pitivi
ERROR:dbus.proxies:Introspect error on :1.3:/org/freedesktop/Hal/Manager: dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.40" (uid=1000 pid=11904 comm="/usr/bin/python2.6) interface="org.freedesktop.DBus.Introspectable" member="Introspect" error name="(unset)" requested_reply=0 destination=":1.3" (uid=0 pid=4269 comm="/usr/sbin/hald))
Traceback (most recent call last):
  File "/usr/bin/pitivi", line 118, in 
    _run_pitivi()
  File "/usr/bin/pitivi", line 113, in _run_pitivi
    sys.exit(ptv.main(sys.argv))
  File "/usr/lib64/pitivi/python/pitivi/application.py", line 357, in main
    ptv = InteractivePitivi()
  File "/usr/lib64/pitivi/python/pitivi/application.py", line 237, in __init__
    Pitivi.__init__(self)
  File "/usr/lib64/pitivi/python/pitivi/application.py", line 138, in __init__
    self.deviceprobe = get_probe()
  File "/usr/lib64/pitivi/python/pitivi/device.py", line 69, in get_probe
    return HalDeviceProbe()
  File "/usr/lib64/pitivi/python/pitivi/device.py", line 154, in __init__
    for dev in self.manager.FindDeviceByCapability("video4linux"):
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 68, in __call__
    return self._proxy_method(*args, **keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/proxies.py", line 140, in __call__
    **keywords)
  File "/usr/lib64/python2.6/site-packages/dbus/connection.py", line 622, in call_blocking
    message, timeout)
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.40" (uid=1000 pid=11904 comm="/usr/bin/python2.6) interface="org.freedesktop.Hal.Manager" member="FindDeviceByCapability" error name="(unset)" requested_reply=0 destination=":1.3" (uid=0 pid=4269 comm="/usr/sbin/hald))

DBus経由でHALへのアクセス権がないためのエラー?のようなので調べていくと、/etc/dbus-1/system.d/hal.conf が怪しそうということが判った。

"org.freedesktop.Hal.Manager" で探していくと、root ユーザと plugdev グループに所属しているユーザはアクセス権があるように見えたので、plugdev グループに入れてみたが同じエラーがでてしまった。

ネット上で色々調べていくと、全く同じ事例は見つからなかったが、FindDeviceByCapability関係で似たような物があったので参考に、hal.conf に以下の記述を plugdev グループのポリシーに追加した。

<allow send_destination="org.freedesktop.Hal" send_interface="org.freedesktop.Hal.Device.Video4Linux">
</allow>

これで旨く起動できることを確認した。

2010年8月11日水曜日

[memo] LXC - Linux Containers on GentooLinux

GentooLinux上でLXCを使うときのメモ。

Kernel Config
* General
 * Control Group support                                                                                                                                                 
  -> namespace cgroup subsystem
  -> cpuset support
  -> Group CPU scheduler
  -> control group freeze subsystem
  -> Basis for grouping tasks (Control Groups)
  -> Simple CPU accounting
  -> Resource counters
  -> Memory resource controllers for Control Groups
  -> Namespace support
    -> UTS namespace
    -> IPC namespace
    -> User namespace
    -> Pid namespace
    -> Network namespace

cgroupのマウント
$ sudo mkdir /cgroup
$ sudo mount -t cgroup cgroup /cgroup
$ sudo vim /etc/fstab
cgroup                     /cgroup        cgroup           default     0 0



app-emulation/lxc
2010/08/11現在 mask されている。
- app-emulation/lxc-0.7.1 (masked by: package.mask)
/usr/portage/profiles/package.mask:
# Diego E. Pettenò (23 Oct 2009)
#
# Starting work toward supporting Linux Containers in Gentoo.
# Currently, it's a tentative ebuild based upon Tiziano Müller
# (dev-zero)'s overlay, with some differences from the upstream paths
# and handling.
#
# Will be unmasked when felt “ready” (and openrc'll support it as
# guest).

ので、unmask 。
$ echo app-emulation/lxc | sudo tee -a /etc/portage/package.unmask
$ sudo emerge -av lxc


ゲストの作成
ゲストは GentooLinux とする。
Debian を使いたい場合は、debootstrap とか。

HOST# export TARGET_DIR=/var/lxc/rootfs.gentoo
HOST# cd ${TARGET_DIR}
HOST# tar -xjpf stage3-*.tar.bz2
HOST# mkdir usr/portage
HOST# mount -o bind /usr/portage ${TARGET_DIR}/usr/portage
HOST# chroot ${TARGET_DIR} /bin/bash
# env-update
# source /etc/profile
GUEST# PS1="GUEST# "

LXCゲストは baselayout-2 で対応しているらしい。
GUEST# mkdir /etc/portage
GUEST# echo sys-apps/baselayout >> /etc/portage/package.keywords
GUEST# echo sys-apps/openrc >> /etc/portage/package.keywords
GUEST# emerge -u baselayout
GUEST# dispatch-conf

コンテナ用のデバイスファイルを作成します。tarball から展開した /dev は一度削除。
GUEST# rm -rf /dev
GUEST# mknod /dev/urandom c   1  9 
GUEST# mknod /dev/tty1    c 136  1 
GUEST# mknod /dev/tty2    c 136  4 
GUEST# mknod /dev/tty3    c 136  5 
GUEST# mknod /dev/tty4    c 136  6 
GUEST# mknod /dev/tty5    c   4  5 
GUEST# mknod /dev/tty6    c   4  6 
GUEST# mknod /dev/tty7    c   4  7 
GUEST# mknod /dev/tty8    c   4  8 
GUEST# mknod /dev/tty9    c   4  9 
GUEST# mknod /dev/tty10   c   4 10 
GUEST# mknod /dev/tty11   c   4 11 
GUEST# mknod /dev/tty12   c   4 12 
GUEST# mknod /dev/mem     c   1  1 
GUEST# mknod /dev/kmem    c   1  2 
GUEST# mknod /dev/port    c   1  4 
GUEST# mknod /dev/tty     c   5  0 
GUEST# mknod /dev/psaux   c  10  1 
GUEST# mknod /dev/null    c   1  3 
GUEST# mknod /dev/zero    c   1  5 
GUEST# mknod /dev/full    c   1  7 
GUEST# mknod /dev/random  c   1  8 
GUEST# mkdir /dev/pts
GUEST# mknod /dev/pts/ptmx c 5 2
GUEST# ln -s /dev/pts/ptmx /dev/ptmx 
GUEST# mkdir /dev/shm
GUEST# touch /dev/.keep

IPアドレスは、ゲスト内で設定しなくてもLXCが設定してくれるが、 ゲスト内で設定しても良いかもしれない(未確認)。
ルートの設定はしてくれないので、ゲスト内の設定を書く。

GUEST# nano -w /etc/conf.d/net
config_eth0=( "noop" )
routes_eth0=( "default via 192.168.0.1"
              "default via fe80::1" )

GUEST# rc-update add net.eth0 default

その他、resolv.conf や localtime 等はご自由に。
次に、inittab をいじる。TERMINAL以下をコメントアウトして、1行挿入する。

GUEST# nano -w /etc/inittab
# TERMINALS
c0:12345:respawn:/sbin/agetty 38400 console
c1:12345:respawn:/sbin/agetty 38400 tty1 linux
#c2:2345:respawn:/sbin/agetty 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty 38400 tty6 linux

ここで一端ホスト側に戻り、LXCのゲスト設定を作る。
ゲストの名前は "gentoo" とする。

HOST# lxc-create -n gentoo
HOST# vim /etc/lxc/gentoo/config
lxc.utsname = gentoo
lxc.tty = 4
lxc.pts = 1024
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lan0
lxc.network.hwaddr = 02:00:00:01:01:01
lxc.network.ipv4 = 192.168.0.101/24
lxc.network.ipv6 = 2001:db8:1::101/64
lxc.network.name = eth0
lxc.mount = /etc/lxc/gentoo/fstab
lxc.rootfs = /var/lxc/rootfs.gentoo

ゲスト起動前にホスト側でマウントするところは lxc.mount で指定したファイルに記述する。

HOST# vim /etc/lxc/gentoo/fstab
none /var/lxc/rootfs.gentoo/proc proc defaults 0 0
/usr/portage /var/lxc/rootfs.gentoo/usr/portage none bind,ro 0 0
none /var/lxc/rootfs.gentoo/usr/portage/distfiles tmpfs defaults 0 0

起動してみる。
HOST# lxc-start -n gentoo
INIT: version 2.87 booting
Loading /lib64/rc/console/keymap

  OpenRC 0.6.1 is starting up Gentoo Linux (x86_64) [LXC]

Press I to enter interactive boot mode

* /proc is already mounted, skipping
* Caching service dependencies ...
[ ok ]
* Mounting /dev/pts ...
[ ok ]
* Mounting /dev/shm ...
[ ok ]
* Setting hostname to lxc-gentoo ...
[ ok ]
* Configuring kernel parameters ...
[ ok ]
* Creating user login records ...
[ ok ]
* Cleaning /var/run ...
[ ok ]
* Wiping /tmp directory ...
[ ok ]
* Setting terminal encoding [UTF-8] ...
[ ok ]
* Setting keyboard mode [UTF-8] ...
[ ok ]
* Loading key mappings [us] ...
[ ok ]
* Updating /etc/mtab ...
[ ok ]
* Bringing up interface lo
*   Caching network module dependencies
*   127.0.0.1/8 ...
[ ok ]
*   Adding routes
*     127.0.0.0/8 via 127.0.0.1 ...
[ ok ]
* Initializing random number generator ...
[ ok ]
INIT: Entering runlevel: 3
* Mounting network filesystems ...
[ ok ]
* Starting local ...
[ ok ]


This is gentoo.unknown_domain (Linux x86_64 2.6.34-gentoo) 13:37:01

gentoo login:  root
Password: 
Last login: Wed Aug 11 13:37:59 JST 2010 on console
gentoo ~ # ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   3888   620 ?        Ss   13:39   0:00 init [3]  
root       387  0.2  0.0  56040  1468 console  Ss   13:39   0:00 /bin/login -- 
root       388  0.5  0.0  17728  1840 console  S    13:40   0:00 -bash
root       392  0.0  0.0  14804   980 console  R+   13:40   0:00 ps aux
gentoo ~ #

2010年7月25日日曜日

rootfs に btrfs をつかってみる

Gentoo というより Funtoo だけど、LVM上に rootfs を作っていて起動に initramfs が必要な状況だった。
起動時間が遅くなるから、initramfs は使わないようにしたかった。
そうすると、ファイルシステムは ext4 になっちゃうわけだけど、面白くないなあということで btrfs にしてみた。

1. ファイルシステムの作成

まずは btrfs な領域を作成する。
今回のターゲットは ThinkPad X61 で、ディスクを一個しか積んでいない。
そのため、データ領域、メタ領域共に single を指定した。
このパラメータには、raid0 や raid1 などが指定できる

$ sudo mkfs.btrfs -d single -m single /dev/sda3
$ sudo mkdir /btrfs
$ sudo mount -t btrfs /dev/sda3 /btrfs
2. サブボリュームの作成

次に、サブボリュームを作成する。
今回は、/, /home, /usr/portage の3つの領域を作成する。

$ sudo btrfs subvolume create /btrfs/rootfs
$ sudo btrfs subvolume create /btrfs/home
$ sudo btrfs subvolume create /btrfs/portage

ちなみに、btrfs コマンドは2010年7月25日現在、sys-fs/btrfs-progs-9999 に入っています。

3. /etc/fstab の編集

/dev/sda3       /               btrfs           subvol=rootfs,noatime,ssd               0 1
/dev/sda3       /home           btrfs           subvol=home,noatime,ssd         0 1
/dev/sda3       /btrfs          btrfs           noatime,ssd             0 1
/dev/sda3       /usr/portage    btrfs           subvol=portage,noatime,ssd      0 1

4. /etc/boot.conf

Funtoo Linux だと、grub の設定は /etc/boot.conf で行うようになっている。
rootflags=subvol=rootfs が肝です。このオプションで /(root) にサブボリュームの rootfs をマウントすることが出来ます。

"Funtoo Linux" {
    params += root=/dev/sda3 rootflags=subvol=rootfs 
    kernel kernel-genkernel-x86_64[-v]
}

編集が終わったら、boot-update コマンドの実行と再起動です。

$ sudo boot-update
$ sudo reboot