〜2002年12月上旬〜
ちょうど400通。そのうち112通が韓国から。
reiserfsをモジュールにしようと思い
% PATH=/usr/bin:$PATH make menuconfig
したら、__ctype_bがundefinedになってしまう。 なぜかlibncurses.aをリンクしにいこうとする。 libncurses.soもちゃんと存在するのに。 gcc 2.95.3だとこうなってしまうのかあ。うーむ。 ncursesをglibc 2.3.1の環境でmakeしてみるかな。
いろいろ考えた結果
% mkdir linux; cd linux % CFLAGS=-Os ../configure --prefix=/usr \ --with-shared --without-debug --without-cxx
でいくことにした。なぜか--enable-sharedではないので注意。 元々のlibncurses.so{,.5*}は/libにあったのでこれを消去。 libncurses.so.3*のsymlinkは/usr/libへ移動。 これでgcc 2.95.3でもok。
w3mでgoogleを見ると画像を表示するところで固まってしまうようになってしまった。 w3mimgdisplayが返ってこない。
どうせmakeし直すならと、-m17nパッチもあてることにする。 ついでにgdk-pixbufもインストールしてアニメーションGIFも表示できるようにしよう。 ftp://ftp.gnome.org/pub/gnome/sources/gdk-pixbuf/からgdk-pixbuf-0.21.0を取ってきて適当にインストール。 w3mは出たばかりの0.3.2.1を使い、w3m-m17nは 坂本さんのページからw3m-0.3.2.1-m17n-20021127.patch.gzとlibwc-latest.tar.gzを入手。 後は
% tar xfvz w3m-0.3.2.1.tar.gz % cd w3m-0.3.2.1 % gzip -dc ../w3m-0.3.2.1-m17n-20021127.patch.gz | patch -p1 % tar xfvz ../libwc-latest.tar.gz % ./configure % make
てな感じでいいかと思ったら、-lgpmでまた__ctype_bがundefinedに。 失敗したなあ。gpmなんか使わないからインストールするんじゃなかった。 面倒なので
% sudo removepkg gpm
してしまう。もう一度configureし直してmakeしたらok。
これでutf-8なページも見ることができる。 アニメーションGIFはlとかhを連打する。
何も考えずにext3をモジュールにしたんだけど、 initrdにもしてないのになぜパニックを起こさないのか不思議に思う。 dmesgを見ると
EXT2-fs warning (device ide1(22,2)): ext2_read_super: mounting ext3 filesystem a s ext2 VFS: Mounted root (ext2 filesystem) readonly. Freeing unused kernel memory: 212k freed NET4: Unix domain sockets 1.0/SMP for Linux NET4.0. Journalled Block Device driver loaded kjournald starting. Commit interval 5 seconds EXT3 FS 2.4-0.9.19, 19 August 2002 on ide1(22,1), internal journal EXT3-fs: mounted filesystem with ordered data mode.
とあった。なるほど。とりあえずext2としてread-onlyでmountされたわけだ。 で、実際に/etc/fstabに従ってmountするときは、 /lib以下は見えているのでext3モジュールは見つかる。 なかなか興味深い。
旧環境からそのまま/optと/usr/i386-linux-uclibcをコピー。 これで揃ったかな。
このような変な技は使えなくなったので、日本語対応版をインストールする。 あれでSJISになるほうが不思議ではあるが。
結局のところ、初心者にとっては記号は暗号にしか見えないらしい。 でも、この人の最近の投稿を見てると、 ドキュメントがあろうがなかろうが全く理解する気がないようではあるが。 というか脊髄反射でリプライしすぎ。
更新。
ところどころ
#! /bin/ash
と書いたスクリプトがあることが判明。 いや自分で書いたんだけど、なんでわざわざ/bin/ashと指定してるのか謎だ。 それはそれとして、また diet libc版ashをインストールしとく。今回はmakeの引数で対応してみよう。 使ったのは例によってCygwinのash-20020731-1-src.tar.bz2。
% CC='diet gcc' CC_BUILD='diet gcc' ./configure % make CFLAGS='-Os -D_BSD_SOURCE -Dquad_t=long -Du_quad_t="unsigned long" -D__S_ISVTX=S_ISVTX'
てな感じだ。
gcc 3.2.1でコンパイルしたら以前より小さくなってる。
% ls -l /plamo-old/bin/ash /bin/ash -rwxr-xr-x 1 root root 70952 Dec 1 21:48 /bin/ash -rwxr-xr-x 1 root root 78808 Jan 20 2002 /plamo-old/bin/ash
やっぱdiet libcでコンパイルしたいねってことで、
% make DOSTATIC=true CC='diet gcc' \ CFLAGS_EXTRA='-D__uid_t=uid_t -D__gid_t=gid_t' LIBRARIES=-lcompat
としてみたが、結構あちこちでひっかかる。 主に__GLIBC__がらみなんだけど、とりあえず こうしてみる。ついでにviも活かそう。Config.hのBB_VIをuncomment out。 まずはdateを試す。
% ./busybox date zsh: segmentation fault ./busybox date
いきなりかよ。他のコマンドは問題ないようだ。 ってことはdateだけだな。うーむ。
結局tznameがちゃんと初期化されなくて、 それを参照しているstrftimeで0番地にアクセスしてる模様。 /etc/localtimeの中を見てるようだけど、 これってglibcが作るもんだしなあ。ちゃんと読めるのか? またしても quick hackでごまかす。
timezoneは表示されなくてもどうでもいいかと、 とりあえず思うことにする。
% ./busybox date; date -u Sun Dec 1 16:11:53 2002 Sun Dec 1 16:11:53 UTC 2002
ってUTCじゃん。意味なし。--helpを見ると
Options: -R Outputs RFC-822 compliant date string -d STRING display time described by STRING, not `now' -s Sets time described by STRING -u Prints or sets Coordinated Universal Time
のように-uを指定しなきゃlocaltimeのようにも思えるのだが。
サイズはこのくらい。
% ls -l busybox -rwxr-xr-x 1 watanabe ruby 235924 Dec 2 01:04 busybox
/binへコピーしとこう。非常時にはこれだけで復旧できるはず。
ふと思い立って
% sudo localedef -i ja_JP -c -f SJIS ja_JP.SJIS
としてSJISのlocale環境を作ってみる。
character map `SHIFT_JIS' is not ASCII compatible, locale not ISO C compliant
と文句を言われるが一応完了する。で、xmmsを1.2.7のオリジナルに戻して
% LC_ALL=ja_JP.SJIS xmms
のように起動すると、ちゃんとSJISなID3タグが表示された。 が、例によってメニューは化け化けなので、LANGUAGE指定は必要。
% LC_ALL=ja_JP.SJIS LANGUAGE=C xmms
ということは 以前はjapaneseでSJISな環境になっていたってことか。 それはそれでかなり不可解ではあるが。
遅れるほど混むとは。明日は湘南新宿ラインにしてみよう。
boot時とshutdown時になんかエラーメッセージが出てる。
sh: /proc/sys/kernel/hotplug: No such file or directory
どうも/etc/rc.d/rc.murasakiが出してるようだ。 SoftwareDesignの11月号を見るとmurasakiはUSB関係のツールらしい。 とするとこのマシンには関係ない。x permissionだけ落としとこう。
% sudo chmod -x /etc/rc.d/rc.murasaki
rc.0でも呼んでるようなので、
for i in /etc/rc.d/init.d/*; do if [ -x $i ]; then $i stop fi done
に変更。
全く問題ないんだけど、何がどうなるんでしょう?
インストーラはついてないようだ。とりあえず
% ruby tests/runtests.rb
してみたが、
./tests/testmboxreader.rb:11:in `require': No such file to load -- \ rmail/mailbox/mboxreader (LoadError)
となる。たしかにmboxreader.rbは存在しない。 バックアップファイルが残ってるのも気になる。
RMagick 0.9.2をmakeするにはまずImageMagickの移植が必要だ。
% PATH=/usr/local/mingw/bin:$PATH \ ac_cv_lib_bz2_BZ2_bzCompress=yes \ ac_cv_lib_bz2_BZ2_bzDecompress=yes \ ac_cv_jpeg_version_ok=yes \ CFLAGS=-Os CXXFLAGS=-Os \ CC='i686-pc-cygwin-gcc -mno-cygwin' \ ../configure \ --target=i386-mingw32 --host=i686-pc-cygwin --build=i586-pc-linux-gnu \ --without-magick-plus-plus --without-perl \ --prefix=/usr/local/mingw --enable-shared --without-x \ --without-threads --without-tiff --cache=config.cache
でやってみた。freetype2がまずいようだ。更新が必要かも。 tiffなしってのも寂しいから、tiffもなんとかすべきか。
メールを出していた気になっていたが、nullmailerが動いてなかった。 何か変だと思ってたんだけど、queueに溜っていただけとは。
CFLAGSを削除した責任を取ってパッチを書く。 erubyも同じか。
プロンプトを変えても文句は言われるわけだ。
セキュリティを強化するパッチを試す。make oldconfigで全部yに設定。
* Security options * Non-executable user stack area (CONFIG_HARDEN_STACK) [N/y/?] (NEW) y Autodetect and emulate GCC trampolines (CONFIG_HARDEN_STACK_SMART) [N/y/?] (NEW) y Restricted links in /tmp (CONFIG_HARDEN_LINK) [N/y/?] (NEW) y Restricted FIFOs in /tmp (CONFIG_HARDEN_FIFO) [N/y/?] (NEW) y Restricted /proc (CONFIG_HARDEN_PROC) [N/y/?] (NEW) y Enforce RLIMIT_NPROC on execve(2) (CONFIG_HARDEN_RLIMIT_NPROC) [N/y/?] (NEW) y Destroy shared memory segments not in use (CONFIG_HARDEN_SHM) [N/y/?] (NEW) y
テストは明日。
昨日makeしたkernelを試す。optional/stacktest.cをコンパイルして実行。
% ./a.out -e Attempting to simulate a buffer overflow exploit... zsh: segmentation fault ./a.out -e
ちゃんとSEGVになる。Openwallパッチをあてる前は
% ./a.out -e Attempting to simulate a buffer overflow exploit... Succeeded.
とexploitが成功してしまう。機能してるようだ。
でも、PPxPが動かなくなってしまった。 全部yにしたうちのどれかが原因のはずだが、 とりあえず明日はCONFIG_HARDEN_STACKだけをyにしてみよう。
ちょっと面倒なのでここに書いてしまいますが、 irb/locale.rbでkconvを使ってます。
てゆか、ruby-talk爆発気味じゃない?
駅前のキャンペーンで2ヶ月無料で試せるというので、 Yohoo! BBのADSLモデムを持って帰った。 NTTの設定は2週間後ぐらいという話だが、 そんなに早くできるようになったのか。
あ、TVでSo-netが3ヶ月無料と歌ってる…。
更新。
CONFIG_HARDEN_STACKだけをyにしたkernelでもppxpは動かず。 ここが原因なのか。一番欲しい機能だっただけに残念だ。 なにしろ何のメッセージもなくプロンプトに戻ってきてしまうから原因がわからない。
ltraceしてみたら、なんと動いてしまった。うーむ。 あ、Plamo 3.0はちゃとstraceが動くね。 straceしてみると、サブプロセスがSEGVしてるようだ。
read(3, 0x123000, 4096) = ? ERESTARTSYS (To be restarted) --- SIGCHLD (Child exited) --- read(3, "", 4096) = 0 close(3) = 0 wait4(106, [WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV], 0, NULL) = 106
と思ったらltraceでも動かないときもある。タイミングなのか? このサブプロセスはppxpdだな。これを単独で起動すると確かにSEGVになる。
% /usr/local/sbin/ppxpd interface: tun0 zsh: segmentation fault /usr/local/sbin/ppxpd
そのわりには残っていたりするのが不思議なんだけど。
% ps x |grep '[p]pxpd' 229 ? S 0:00 /usr/local/sbin/ppxpd
この状態でppxpを起動するとちゃんと動く。
% ppxp PPxP version 2001080415 interface: tun0 ppxp>
dialもできる。うーむ。
-debugを試すと問題なし。とするとdaemon化のしかたがまずいと言える。 ソースを見るとsrc/main.cにDaemon()という名前の関数が見つかる。 ここで
if ((child = fork()) == -1) return; if (child) { static void QuitParent(int sig) { exit(0); } signal(SIGTERM, QuitParent); pause(); }
という記述があった。 GCCのnested functionを使ってsignalのハンドラ関数を定義してるわけか。 なるほど。nested functionはこういう時に便利だな、って、 その関数はどこに作られるんだ? 親の関数から抜ければ用済みだから、スタック上に作られる可能性は高い。 だとしたら原因はこれか?試しに以下のテストプログラムで検証。
% cat foo.c main() { void foo(){} foo(); } % gcc foo.c % ./a.out
あれ?問題ない。-Sをつけてfoo.sを見ても静的に作られたfoo()を直接呼んでいる。 とすると、関数ポインタを渡すところか?
% cat foo.c bar(void (*func)()) { func(); } main() { void foo(){} bar(foo); } % gcc foo.c % ./a.out zsh: segmentation fault ./a.out
これだな。foo.sを見ると確かにコードをわざわざスタックにコピーしてる。 foo()をmain()の外へ出せばもちろん何の問題もない。 というわけで無事解決。いやでもスタックにコピーする理由がよくわからない。 スコープ的に親の関数から抜けたら無効だということを意味させたかったんだろうか? info gccを見るとどうもそういうことらしい。
If you try to call the nested function through its address after the containing function has exited, all hell will break loose. If you try to call it after a containing scope level has exited, and if it refers to some of the variables that are no longer in scope, you may be lucky, but it's not wise to take the risk. If, however, the nested function does not refer to anything that has gone out of scope, you should be safe.
続きを読んでみる。
GCC implements taking the address of a nested function using a technique called "trampolines". A paper describing them is available as `http://people.debian.org/~aaronl/Usenix88-lexic.pdf'.
trampolinesってどこかで見たよ。configしたときだ。
Autodetect and emulate GCC trampolines (CONFIG_HARDEN_STACK_SMART)
これだ。ということはautodetectがうまく働いてないのか? Openwallパッチのoptional/stacktest.cを見ると、 -tはまさにさっきのテストプログラムそのものだった。ぐはぁ。
それはそれとしてnested functionにする必要もないので、 外に出すことにしよう。
すでにパッチがあたったものをインストール。 前回configureした結果はconfig.paramに残っているのでこれをコピーしてからconfigureする。 あとは
% ./configure --nonstop
でいける。
0.93がリリースされたということなので、 CVSでupdateしてるソースを使って更新。
% mkdir objs; cd objs % CFLAGS=-Os ../grub-current/configure --prefix=/usr % make % sudo make install % sudo grub-install '(hd0)'
全部yにしたカーネルに戻すとtrampolineテストプログラムはちゃんと成功する。 ということはsignalだと駄目なのか?
% cat signal.c #include <stdio.h> #include <signal.h> main() { void term(int sig) { printf("%d\n", sig); } signal(SIGTERM, term); raise(SIGTERM); } % gcc signal.c % ./a.out zsh: segmentation fault ./a.out
どうもそういうことらしい。自動では検出できないようだ。
これは知らなかった。省略するとそういう意味になるのか。 リファレンスマニュアルにも そう書いてある。
いままでbkの使い方を間違えていたようだ。
% cd /usr/src % bk clone -l /path/to/repo/for/linux-2.4 linux-2.4 % cd linux-2.4 % bk -r edit % cp ../linux-2.4.config .config % make oldconfig ...
という手順でカーネルをmakeしていた。 常に最新をmakeしていたときはこれでなんの疑問も持たなかったんだけど、 linux 2.4.20 vanillaを取り出すにはどうすればいいのかさっぱりわからなくなる。 bk help topicsでいろいろ見てみるとbk exportでいいと気づく。というわけで
% bk export -w -rv2.4.20 /path/to/repo/for/linux-2.4 linux-2.4.20
てな感じで使ってみる。 でもexportしたファイルを更新することはできないんだよね。
Plamo 3.0のfileutilsは3.16と古いので4.1に上げる。 diet libcだと 面倒なのでuClibcを使う。
% CC='/usr/i386-linux-uclibc/usr/bin/gcc -static' \ CFLAGS=-Os am_cv_lib_error_at_line=no \ ../configure --prefix=/usr --libexecdir=/bin --bindir=/bin \ --disable-nls --cache=config.cache
uClibcのerror()関数の表示が微妙に違うのでlib/error.cを使うように
am_cv_lib_error_at_line=no
とした。こうしないとmake checkでひっかかる。
% make % make check % sudo make install
print case when true then "Just another Ruby hacker," end
寒いっす。
駅までの道、なぜか逆流する人が多い。そういえば踏切の警報機が全然鳴ってない。 この時間なら5分に1本は来るはず。 駅に着くと案の定電車が走ってなかった。 駅員に対して現状を説明しろと叫ぶ会社員。ま、聞いても無駄だろう。 階段までごったがえしていてホームへたどり着くのに15分かかる。 でも電車は来ない。
「ただいまとりはねを出ました」
とアナウンス。どこだよ?そんな駅名は聞いたこともない。 諦めて外へ出るにしてもまた15分かかるだろうし、どうするか悩む。 雪道を15分ほど歩いてバス停に行くのもいやだし、待つことにする。 その後はまったくアナウンスなし。20分ぐらいしてやっと来た。 が、まったく乗れる隙はない。降りる人もやっと出られてほっとしてる様子。 その時曇ったガラスになぜか忍者ハットリ君を書く女子高生。 殺伐とした空気が一瞬和む。3本見送った。結局電車に乗れるまでに1時間かかる。 少年ジャンプはとっくに読み終わっていた。大宮駅に着いたら
「降雪のため列車が乱れたことをお詫び致します」
と2回繰り返された。乱れたのはダイヤだろと小声でツッコむ。
暑いっす。
文句ばっか。いい加減うざい。
Software-suspend-mini-HOWTOを見てたら、 2.6章に
You must have a swap partition on your disk. This swap partition should be at least 30% larger than your RAM
と書いてあった。その後に128Mだったら160Mのswapを用意しろとある。 現在は
% fdisk -l /dev/hdc Disk /dev/hdc: 255 heads, 63 sectors, 4865 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hdc1 1 13 104391 83 Linux /dev/hdc2 * 14 4850 38853202+ 83 Linux /dev/hdc3 4851 4865 120487+ 82 Linux swap
と足りない。というわけで、partedでresizeに挑戦だ。 hdc2を小さくしてhdc3を大きくするので、手順としては
hdc3を削除 hdc2を小さくする hdc3を作る
となる。rootパーティションを変更することになるので、 partboot, partrootをフロッピーに書き込んで起動する。 イメージは ftp://ftp.gnu.org/gnu/parted/bootdisk/から入手可能。フロッピーでブートしてparted /dev/hdcで起動。
(parted) p Disk geometry for /dev/hdc: 0.000-38166.679 megabytes Disk label type: msdos Minor Start End Type Filesystem Flags 1 0.031 101.975 primary ext3 2 101.975 38044.556 primary ext3 boot 3 37044.556 38162.219 primary linux-swap (parted) rm 3 (parted) resize 2 101.975 38000 (parted) p Disk geometry for /dev/hdc: 0.000-38166.679 megabytes Disk label type: msdos Minor Start End Type Filesystem Flags 1 0.031 101.975 primary ext3 2 101.975 37997.490 primary ext3 boot (parted) mkpartfs primary linux-swap 37997.491 38162.219 (parted) p Disk geometry for /dev/hdc: 0.000-38166.679 megabytes Disk label type: msdos Minor Start End Type Filesystem Flags 1 0.031 101.975 primary ext3 2 101.975 37997.490 primary ext3 boot 3 37997.490 38162.219 primary linux-swap (parted) quit # fdisk -l /dev/hdc Disk /dev/hdc: 255 heads, 63 sectors, 4865 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hdc1 1 13 104391 83 Linux /dev/hdc2 * 14 4844 38805007+ 83 Linux /dev/hdc3 4845 4865 168682+ 82 Linux swap
よさげだ。再起動もokだ。
届きました。
すっかり忘れていた。もう要らないかなあ。
肝は--with-screen=ncursesらしい。にしてもdefaultの色使いがひどいよね。
--disable-sharedで拡張ライブラリを作るときに-lruby-staticをリンクしちゃうのはまずいね。 have_funcのときだけにしないと。 拡張ライブラリが無駄に太るだけなので、それが原因とも思えないんだけど。
あ、豊春か。すっきりした。って「と」と「は」しか合ってねー。