LD_PRELOAD で実効グループをごまかす
最近、Dual Core Opteron のマルチCPUなマシンが4台導入された。
で、分散処理の環境として、Sun の SGE(Sun N1 Grid Engine)というのが導入されているのだが、こいつの管理ツールがユーザの実効グループ(egid)を参照してグループ名を取得しようとするらしく*1、なぜだが primary GID に対応するエントリが /etc/group にない自分はこの時点で "unable to resolve group name for group ID, XXXX" とか言われて実行できない。
しかたが無いので管理者にメール出して primary group id を修正してもらうか、対応するグループを追加してもらおうと思ったんだが、そこでふと思いついた。getegid を定義した共有ライブラリを作って LD_PRELOAD に指定すればごまかせるんじゃないか?
ってことでやってみた。ソースコードと Makefile.am, configure.ac はこんな感じ。
% cat fakegetegid.c #include <sys/types.h> gid_t getegid() { return 1101; } % cat Makefile.am lib_LTLIBRARIES = libfakegetegid.la libfakegetegid_la_SOURCES = fakegetegid.c % cat configure.ac AC_PREREQ(2.59) AC_INIT(libfakegetegid, 0.1, NONE) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([fakegetegid.c]) AC_PROG_CXX AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_LIBTOOL AC_TYPE_UID_T AC_CONFIG_FILES([Makefile]) AC_OUTPUT
で、ビルドしてやってみる。
% touch INSTALL NEWS README AUTHORS ChangeLog % aclocal && libtoolize && aclocal && automake -a -c && autoconf % ./conigure --prefix=$HOME && make install % qstat unable to resolve group name for group ID, 1501 % LD_PRELOAD=$HOMElib/libfakegetegid.so qstat %
おお、いけた。ちゃんと qsub でのジョブの投入もできる。
まぁ、やっておいていうのもなんだけど、やりすぎの感は否めないので、あとで管理者にメールを出して group ID を修正してもらおう。
ていうか、よくよく考えるとソースがあるんだからソースをいじるという手もあったのか。まぁ、気にしないことにする。ビルドの方法確認するのも面倒だしな。
*1:strace/ltraceを使いつつ、ソースを読んで確認した