東京エリア Debian 勉強会
第 102 回 2013 年 7 月度

上川純一

2013 年 7 月 20 日

設営準備にご協力ください。

会場設営よろしくおねがいします。

Agenda

注意事項
飲食禁止

最近あった Debian 関連のイベント報告
第 100 回 東京エリ
ア Debian 勉強会
2013 大統一 Debian勉強会

Debian Trivia Quiz
事前課題紹介イベント報告第 100 回 東京エリア Debian 勉強会

大統一 Debian 勉強会 2013

DWN quizDebian 常識クイズ

Debian の常識、もちろん知ってますよね? 知らないなんて恥ずかしくて、知らないとは言えないあんなことやこんなこと、みんなで確認してみましょう。
今回の出題範囲はdebian-devel-announce@lists.debian.org,debian-devel@lists.debian.org に投稿された内容とDebian Project News などからです。

問題 1. Stefano Zacchiroli さんが新しく作成したサービスは？

A chiebukuro.debian.net

B 2ch.debian.net

C sources.debian.net

問題 1. Stefano Zacchiroli さんが新しく作成したサービスは？
答えは:

A chiebukuro.debian.net

B 2ch.debian.net

C sources.debian.net

C問題 1. Stefano Zacchiroli さんが新しく作成したサービスは？

解説： Stefano Zacchiroli さんが、 Debian パッケージで提供されているソースコードすべてを閲覧・ 検索出来る
sources.debian.net を作った

問題 2. 新しく FTP master チームに入った人は？

A Gergely Nagy

B Kouhei Maeda

C Joerg Jaspert

問題 2. 新しく FTP master チームに入った人
は？
答えは:A Gergely Nagy

B Kouhei Maeda

C Joerg JaspertA問題 2. 新しく FTP master チームに入った人は？

解説： Paul Tagliamonte,Scott Kitterman,Luke Faraone,Gergely Nagy が加入

問題 3. Debian GNU/Hurd がリリースされましたが、バージョンはいくつでしょう。

A 2013B 3.141592

C 7.0

問題 3. Debian GNU/Hurd がリリースされましたが、バージョンはいくつでしょう。
答えは:A 2013B 3.141592

C 7.0

A

問題 3. Debian GNU/Hurd がリリースされましたが、バージョンはいくつでしょう。

解説：

事前課題

koedoyoshida

1

お使いのマシンに ARM はありますか？ もしあるのでしたら、どのように使っているか教えてください。
Raspberry Pi を使ってます。とりあえずリモートアクセス用がメインですが、 I2C とかを使って外部 IO をやってみたいと思っています。

2

Debian の ARM に期待していること、お願いしたいことがあれば教えてください。
省電力な環境を生かして ReadOnlyboot(でも定期的にセキュリティupdate はしたい) で放置できる環境とかが作れるとよいですね。

吉野

1

地図マシンです2なしdictoss

1

CuBox を持っている。 eSATA 端子があるのでファイルサーバのバックアップをするマシンとして使おうとしたが、 USB ポートから電源供給量が不足のため、 HDD が動かず使えていない。そのため単なるarmel バイナリのお試しマシンになっている。

2

新 Nexus7 で Debian が動いてほしい。

mtoshi.g

1

お使いのマシンに ARM はありますか？
ないっす

2

Debian の ARM に期待していること、お願いしたいことがあれば教えてください。
今のところないっす野島 貴英1

昔売っていた B&N の NookColor を ARM 機材実験ボードとして未だに使ってます。この電子書籍端末は 2012/4 の東京エリア debian 勉強会,2012/6 の大統一 debian 勉強会で喋ったとおり、特定ブートフォーマットの SD カードを用意して SD カードスロットへ入れちゃうと、うっかりそのままブートしちゃうという隠れ (?) 機能が大変便利です。おまけに連続 8 回起動失敗するとリカバリーが始まるという非文鎮化機能まで搭載しています。そのままでも pdf リーダ、ポータブル mp4 ビデオ/mp3 鑑賞機材として、また、 debian ARM のnative ブートの可能性を秘めた hack 機材としても楽しくお使いいただけます。

2

NookColor 用の debian ネイティブブートが可能なイメージ（ というかインストーラ）が欲しいといってみるテスト。

岩松 信洋1

お使いのマシンに ARM はありますか？ もしあるのでしたら、どのように使っているか教えてください。
たくさんある。開発用とかビルドマシンとして使っています。
Raspberry Pi は家のゲートウェイマシンとして動いています。

2

Debian の ARM に期待していること、お願いしたいことがあれば教えてください。
マルチメディア系が弱いので整備して欲しい。

上川純一

なし

まえだこうへい1

Armadillo J で自宅内の DHCP サーバとして使っています (notDebian)。 OpenBlockS AX3 を、昨年夏ごろにカッとなって作ったiori というツール (最近話題の docker みたいなの) の開発環境として使っています。

2

今は特にないですが、今後 ARM サーバの製品版が出てきた時に d-iでインストールできることでしょうか。

armmp月 刊 Debhelper今月のコマンドdh stripdh strip の機能

実行バイナリ、共有ライブラリ、静的ライブラリから、デバッグシンボルを取り除く。
取り除いたデバッグシンボルをデバッガが見つけれるようにして、*-dbg パッケージが作りやすいようにビルドディレクトリ以下に配置する

どうやって*-dbg パッケージを作る？

そんなあなたに、2012 年 大統一 Debian 勉強会「 debug.debian.net」のプレゼン資料がおすすめ！
http://gum.debian.or.jp/2012/
とりあえず、すでに発表済みなので、ここでは省略。

dh strip のコマンドラインオプション (その 1)
man debhelper に記載されている debhelper 共通オプション
他の月刊 debhelper の発表でなされているとおりなので、ここでは割愛。
-Xitem,–exclude=item
item という名前を持つファイル名に対しては処理を行いません。複数指定したければ、 “dh strip -Xfoo1 -Xfoo2”と複数ならべて指定ができます。
–dbg-package=package*-dbg パッケージを作る際に、デバッグシンボルを格納するパッケージ名を指定する為に利用します。 debhelper のCOMPATIBILITY LEVEL によって振る舞いが変わります。 (後述)

dh strip のコマンドラインオプション (その 2)-k
デバッグシンボルをバイナリパッケージに含めてしまいます。つまり、バイナリがインストールされると同時に、対応したデバッグシンボルも/usr/lib/debug/以下にインストールされるようなパッケージを作成するときに使います。なお、–dbg-package も指定されると、–dbg-packageの方の動作が優先されます。

dh strip の COMPATIBILITY LEVEL の動作の違い(その 1)
以下は–dbg-package 指定時の dh strip の振る舞いの違い。

4 以下“dh strip –dbg-package=xxxx –dbg-package=yyyy” のように–dbg-package を複数指定する事が出来ます。ここで、こちらで指定した名前 (xxxx や、 yyyy) に合致するパッケージを処理する際、” パッケージ名-dbg” というパッケージ名を*-dbg パッケージのパッケージ名として自動的に利用します。また、この COMPATIBILITY LEVELの場合、ソースパッケージに含まれる debian/control には、これら*-dbg パッケージの為の記述を必要とはしていません。

dh strip の COMPATIBILITY LEVEL の動作の違い(その 2)
5 以上–dbg-package は１つ指定するのが原則となります。もし複数指定した場合は、最初に指定された内容のみ利用されます。また、–dbg-package=xxxxx とすると、デバッグシンボルを格納するパッケージ名として、 xxxxx がそのまま使われます。例えば、 libfo o パッケージと、 foo パッケージを構築し、これらパッケージに含まれているバイナリのデバッグシンボルを foo-dbg パッケージに全部入れるには、–dbg-package=foo-dbg と指定します。また、ソースパッケージに含まれる debian/control には、生成予定の*-dbg パッケージの為の記述は必須となり、万一記載されていない場合はエラーとして扱われ、この場合はdh strip はエラーを表示して終了します。

dh strip の COMPATIBILITY LEVEL の動作の違い(その 3)

以下は-k/–dbg-package 指定時の出来上がるデバッグシンボル
ファイルの違い

8 以下“/usr/lib/debug/+バイナリのインストール先パス/+バイナリファイル名” に格納されるようにデバッグシンボルファイルが生成されます。また、デバッグに関する情報はコンパイラが生成したままの形で保存されるため、デバッグシンボルファイルのサイズは大きくなりがちです。

dh strip の COMPATIBILITY LEVEL の動作の違い(その 4)
9 以上
バイナリが BuildID を含んでいる場合は、“/usr/lib/debug/.build-id/BuildID の上位 2 桁/+BuildIDの残りの桁+.debug” に格納されるようにデバッグシンボルファイルが生成されます。 BuildID を含んでいなければ
COMPATIBILITY LEVEL 8 以下と同様のファイル名となります。また、 BuildID の有無にかかわらず、デバッグに関する情報は zlib により圧縮されて格納されます。そのため、デバッグシンボルファイルのサイズはできるだけ小さくなるようになっています。

ところで BuildIDってfile コマンドでバイナリを調べると出てきます。
$ file /usr/bin/gst-launch/usr/bin/gst-launch: ELF 64-bit LSB executable,
x86-64, version 1 (SYSV), dynamically linked(uses shared libs), for GNU/Linux 2.6.26,
BuildID[sha1]=9b42db476118ab2b81041acd80e45e89e4289ea2,
stripped

詳しくは 2013 年大統一 Debian 勉強会「 gdb+python 拡張を使ったデバッグ手法」(http://gum.debian.or.jp/2013/slide_data_list) に記載してます。

デバッグシンボルファイルの形式

Debian の i386/amd64 用 linux システムでは、デバッグシンボルファイルの形式としてほぼ DWARF なデバッグシンボルファイルが利用されています。 DWARF は実行ファイルの形式である ELF フォーマットをベースに作られているため、 DWARFを理解する時には、 ELF もあわせて知っておくと良いです。

DWARF 文献
DWARF について：
本家
http://www.dwarfstd.org/
結構良い解説記事
http://www.ibm.com/developerworks/jp/opensource/library/os-debugging/
http://ja.wikipedia.org/wiki/DWARF

DWARF を理解する為のお供に ELF もどうぞ！
http://ja.wikipedia.org/wiki/Executable_and_
Linkable_Format

デバッグシンボルファイル覗いてみる
まず、俯瞰してみたいので、各ヘッダ、各セクションを俯瞰してみます。
$ sudo aptitude install binutils/sid php5-dbg$ env LANG=C readelf -e /usr/lib/debug/usr/bin/php5
ELF Header:
Magic:
7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class:
ELF64.. 中略...
Start of program headers:
64 (bytes into file)Start of section headers:19669080 (bytes into file)... 中略...
Section Headers:[Nr] Name
TypeAddress
OffsetSize
EntSize
Flags Link Info Align... 中略...
[ 1] .interp
NOBITS
0000000000400238 00000238
000000000000001c 0000000000000000
A001... 中略...
[28] .debug_aranges
PROGBITS
0000000000000000 000002d0
0000000000006190 0000000000000000
001... 中略...

ここでは紙面がせまいので、皆さんお手元の debian マシンで確認してみてくださいませ。

readelf -e の結果を図示してみる

ソースの情報を見てみる (その 1).debug info セクションに DWARF のとおりに格納されている。で、こちらのデコードには readelf -wi が便利。
$ env LANG=C readelf -wi /usr/lib/debug/usr/bin/php5
Contents of the .debug_info section:
Compilation Unit @ offset 0x0:
Length:0x15bf3 (32-bit)
Version:4
Abbrev Offset: 0x0
Pointer Size: 8<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)<c>
DW_AT_producer: (indirect string, offset: 0x1832):
GNU C 4.8.1 -mtune=generic-march=x86-64 -g -O2 -fstack-protector -fPIC--param ssp-buffer-size=4<10>
DW_AT_language: 1(ANSI C)<11>
DW_AT_name:(indirect string, offset: 0x1955): /tmp/buildd/php5-5.5.0+dfsg/ext/date/php_date.c<15>
DW_AT_comp_dir: (indirect string, offset: 0x6f0):/tmp/buildd/php5-5.5.0+dfsg/cli-buildソースの情報を見てみる (その 2)

readelf -wi の結果から、こちらの Compilation Unit(以下 CU)に記載されているソースファイル (以下 DW AT name)は、/tmp/buildd/php5-5.5.0+dfsg/ext/date/php date.c であり、コンパイルが行われたディレクトリ (以下DW AT comp dir) は/tmp/buildd/php5-5.5.0+dfsg/cli-buildとなります。

Use the SOURCE!(その 1).debug info の CU の DW AT name が絶対パスで記載されているような場合は、 gdb で、 set substitute-path にDW AT name の絶対パス部分を指定します具体例↓

2013 年 大統一 Debian 勉強会「 gdb+python 拡張を使ったデバッグ手法」のプレゼン資料
http://gum.debian.or.jp/2013/slide_data_list

Use the SOURCE!(その 2).debug info の CU の CU の DW AT name が相対パス (あるいは、ファイル名そのもの）で記載されているような場合は、gdb で、 set substitute-path には DW AT comp dir の絶対パス部分を指定します。具体例↓$ env LANG=C readelf -wi /usr/lib/debug/.build-id/9b/42db476118ab2b81041acd80e... 中略...
<11>
DW_AT_name: (indirect string, offset: 0x57a): gst-run.c<15>
DW_AT_comp_dir: (indirect string, offset: 0x36b):/tmp/buildd/gstreamer0.10-0.10.36/tools... 中略...
$ gdb --args gst-launch(gdb) set substitute-path /tmp/buildd/ /home/yours/debian-src/gstreamer/(gdb) b main(gdb) run(gdb) l313
return candidates;
314}
315
316
int
317
main (int argc, char **argv)
319
GHashTable *candidates;
320
gchar *dir;Use the SOURCE!(その 3)
gdb は、ソースの位置を求めるときに以下のアルゴリズムに従ってソースの位置を求めようとします。
CU に記載されているファイル名が絶対パスの時:
そのままソースファイルの位置として扱う。また、この時DW AT comp dir の情報は無視される。
CU に記載されているファイル名が相対パスの時:
ソースのファイル名を”DW AT comp dir の値”+”/”+”DW AT name” として扱う。
なので、先ほどの通り set substitute-path の元ディレクトリ情報として指定するパス情報が異なります。

参考： COMPATIBILITY LEVEL9 だと...(その 1)

デバッグシンボルが COMPATIBILITY LEVEL9 の元で作成されていると...
$ sudo aptitude install libgstreamer0.10-0-dbg$ env LANG=C readelf -e /usr/lib/debug/.build-id/9b/42db476118ab2b81041
acd80e45e89e4289ea2.debug... 中略...
[28] .zdebug_aranges
PROGBITS
0000000000000000 000002d0
000000000000002f 0000000000000000
001[29] .zdebug_info
PROGBITS
0000000000000000 000002ff
0000000000000ccd 0000000000000000
001... 中略...

全部、”.z+debug+なんとか” にセクション名が変更されています。

参考： COMPATIBILITY LEVEL9 だと...(その 2).zdebug info セクションをダンプしてみた。
$ env LANG=C readelf -x .zdebug_info /usr/lib/debug/.build-id/9b/42
db476118ab2b81041acd80e45e89e4289ea2.debug
Hex dump of section ’.zdebug_info’:
0x00000000 5a4c4942 00000000 00001b3f 789c7d59 ZLIB.......?x.}Y
0x00000010 7b7454c5 199fefee 6e76b3d9 2497cd7b {tT.....nv..$..{
0x00000020 370b2109 012e0482 243c13d8 84f01079 7.!.....$<.....y0x00000030 05437988 0887444f 44501e25 94a788b6 .Cy...DODP.%....というわけで、 ZLIB で圧縮されてます。

おわりに質問などおねがいしますーraspberry pi

raspberry pi

raspbianarmel: armv4
raspbian: armv6 (VFP2)
armhf: armv7 (NEON)raspbian のインストール

SD-card にイメージを書き込んでそれから起動するサブマシンを使う時の便利技

mosh: ssh 張りっぱなしな感じにできて、ノートパソコンサスペンドしてもリジュームしたらまた繋げられる。
avahi-daemon: DHCP の環境で面倒なことしなくてもホスト名指定でアクセスできるようになる。 raspberrypi.local
sshfs: ssh でつながるホストのディレクトリを sshfs を使って透過的にマウントできる。 NFS でユーザ ID を調整したり SMB の設定を頑張ってしたりしていたのは過去のことに。

小技： sshfs

sshfs corei7.local:path/to/work ./mnt/

raspbian のセンサー

5550
4540

temperature C60

CPU 温度センサーを使ってみた

Mon

TuetimestampWedsqlite + R
時系列データを sqlite で保存
create table temperature(timestamp TEXT default current_timestamp,temperature INTEGER);

定期的にシェルスクリプトで温度を書き込み
while sleep 5m; do
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
echo "insert into temperature(temperature) " \"values($temp);" | \sqlite3 sensor.db
doneR でグラフ作成

タイムゾーン UTC の POSIXct 形式の文字列として解釈されるのでそれで処理してグラフ作成
library("RSQLite")
drv <- dbDriver("SQLite", max.con=1)
conn <- dbConnect(drv, dbname=’sensor.db’)
r <- dbGetQuery(conn, ’SELECT * from temperature’)
r$posix <- as.POSIXct(r$timestamp, tz=’UTC’)plot((temperature / 1000) ~ posix, r,xlab=’timestamp’,
ylab=’temperature C’,ylim=c(40,60), type=’l’)僕の raspberry pi の今後多分こんなことします。

1000 円くらいで手に入る WebCam つけて監視システム
温度計つけて温度測定

今後のイベント

今後のイベント2013 年 8 月 Debian 勉強会

今日の宴会場所

今日の宴会場所

未定