- PR -

CentOS でデフォルトで設定される環境変数について

投稿者投稿内容
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2006-04-19 02:01
以下の2点について教えていただけないでしょうか。(OS : CentOS 4.3)

1. LANG 環境変数は /etc/sysconfig/i18n で設定されると認識していますが、runlevel 5 で起動して、gnome-terminal を立ち上げた時に .bash_profile や .bashrc に LANG を設定していないと、例え /etc/sysconfig/i18n で LANG=ja_JP.eucJP に設定しても ja_JP.UTF8 になってしまいます。この設定はどのファイルで行われているのでしょうか?

なお、runlevel 3 で起動して、startx した場合は ja_JP.eucJP になります。
/etc/X11/gdm/locale.alias ファイルなどを触ってみたり、/etc 以下のディレクトリ内で "UTF-8" という文字列を含むファイルを検索してみましたが、それらしきものは見あたりませんでした。

2. PATH 環境変数のデフォルト値は、/etc/rc.local/rc.sysinit スクリプトから参照されている、/etc/rc.d/init.d/functions で設定されていて、その内容は rc.sysinit スクリプトの最後まで引き継がれているようですが、runlevel 3 で起動し、一般ユーザでログインすると、sbin を含むパスが全て削除されてしまっています。この処理はどのファイル内で行われているのでしょうか?

よろしくお願いします。

[ メッセージ編集済み 編集者: あんとれ 編集日時 2006-04-19 02:13 ]
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2006-04-20 00:18
gnomeは知らんですが、ログインした際の環境変数のデフォルトを
設定してるのは例えばlogin(1)ではないでしょーか。

mingettyあたりからloginでログインしたのかとか
sshdからログインしたのかとかあるですが。
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2006-04-21 03:41
ぽんすさん、ありがとうございます。

質問1については自己解決しました。$HOME/.dmrc に ja_JP.UTF-8 の設定があり、
これが影響していたようです。

質問2のデフォルトパスについてはどこかにハードコーディングでもされているのでしょうか? こちらは GUI を使用しない runlevel 3 でも再現します。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2006-04-21 22:43
引用:

あんとれさんの書き込み (2006-04-21 03:41) より:
質問2のデフォルトパスについてはどこかにハードコーディングでもされているのでしょうか? こちらは GUI を使用しない runlevel 3 でも再現します。


login(1)を使っている場合に限るとして...

login(1)のマニュアルの記述からは、そのように読めます。
ソースコードを確認したわけではありませんが。
-p オプションを付けてlogin(1)を呼ぶと環境変数を保持するようですから、
mingetty(8)に --loginprog オプションを付けて指定すると挙動が変わるかも
しれません。試してませんが。
というわけで、/etc/inittab の記述を変えてみるとどうにかなるかも。

[ メッセージ編集済み 編集者: ぽんす 編集日時 2006-04-21 22:43 ]
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2006-04-23 01:48
すみません、質問2についても自己解決しました。

引用:

bash-3.0/config-top.h :

/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
"/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:."
#endif



ここで設定していたようですね。ちなみに、CentOS の bash には この部分にパッチが当たっていて、/usr/local/bin;/bin:/usr/bin に書き換えられていたようです。

/etc/rc.d/rc.sysinit や /etc/rc.d/rc スクリプトで設定されているという考えそのものが間違っていたようですね。;;

環境変数 LANG については /etc/profile が起動された時点では設定されていないことも確認できました。

ただ、その下にある以下の部分がちょっと気になりました。

引用:

/* The value for PATH when invoking `command -p'. This is only used when
the Posix.2 confstr () function, or CS_PATH define are not present. */
#ifndef STANDARD_UTILS_PATH
#define STANDARD_UTILS_PATH \
"/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc"
#endif


ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2006-04-23 03:03
引用:

あんとれさんの書き込み (2006-04-23 01:48) より:
引用:

bash-3.0/config-top.h :

/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE
"/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:."
#endif




えーと、それは「bashが起動された際にPATH環境変数が*存在していない*」
というわりと異常な状況に対処する際に使用するものです。

手元にbash-3.0のソースが無いので、bash-2.05bのソースより。
使われているのは variables.c の中の一ヶ所のみ。
引用:

/* Now make our own defaults in case the vars that we think are
important are missing. */
temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE);

あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2006-04-23 12:40
DEFAULT_PATH_VALUE については動作からしても、ソースコードから追ってみてもそういう感じですね。よく分かっていないのは、STANDARD_UTILS_PATH の方ですが、こちらについてもソースコードを追ってみます。

ログイン直後にパスが設定されていないのは自然なことかもしれません。Solaris では /etc/default/login だったか何かで設定しておくことも可能でしたが、実際のところはどのタイミングで呼ばれているのか知りません。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2006-04-23 20:23
話が通じてない気がしますが...

Linuxでは通常、PATH環境変数が存在しないことはあり得ません。
すべてのユーザプロセスの祖先であるinitが自分自身のPATH環境変数を設定して
いますので、わざわざ変えない限りその値が全ユーザプロセスに受け継がれます。

PATH環境変数へのポインタを取得して値をファイルに書き出すプログラムをCで書いて
inittabにそのプログラムを登録しておけばinitが設定している値が分かります。
# initが子プロセスの環境変数を変えてからexecする、なんてこと(initのような
# 立場のプロセスでは、ちょっとあり得そうにないことです)をしていない限り。
実際にやってみれば分かりますが、もちろん値が設定されています。

では、環境変数を破壊的に再設定しているプロセスは何か?
ttyにログインする場合、initからログインシェル(bashとしましょう)までの
プロセスの親子関係は init - (mingetty) - login - bash です。
ここで mingetty をカッコでくくったのは、mingetty と login とは
親子関係ではなく exec しているので、ログインシェルまで辿り着いたときには
psコマンド等で認識できるものではなくなっているからです。
シェルというプログラムの使われ方からして、環境変数を破壊的に再設定する
というのは、これまたちょっとありそうにないことです。
# そんなことをされると不便でたまらない
してみると、mingetty か login か、ということになりますが、mingetty が
起動した時点ではこれからログインするユーザが一般ユーザなのかrootなのか
まだ分かりません。というわけで、犯人としてはloginがもっとも有力だ、
ということが分かります。それだけアタリをつけておいてからマニュアルを
読むと、たしかにそのようなことを書いてある。

ただし、このことは login がPATH環境変数をハードコードしていて変更
できない、ということは意味しません。なんらかの設定ファイルが存在する
可能性はありますし、login自身というよりもpam経由で設定されている
可能性もあります。それはそれとして。

Solaris でも、init や getty がPATH環境変数を持っていないなんてことは
まず無いと思いますが。


[ メッセージ編集済み 編集者: ぽんす 編集日時 2006-04-23 20:34 ]

スキルアップ/キャリアアップ(JOB@IT)