- - PR -
CentOS でデフォルトで設定される環境変数について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2006-04-20 00:18
gnomeは知らんですが、ログインした際の環境変数のデフォルトを
設定してるのは例えばlogin(1)ではないでしょーか。 mingettyあたりからloginでログインしたのかとか sshdからログインしたのかとかあるですが。 | ||||||||||||
|
投稿日時: 2006-04-21 03:41
ぽんすさん、ありがとうございます。
質問1については自己解決しました。$HOME/.dmrc に ja_JP.UTF-8 の設定があり、 これが影響していたようです。 質問2のデフォルトパスについてはどこかにハードコーディングでもされているのでしょうか? こちらは GUI を使用しない runlevel 3 でも再現します。 | ||||||||||||
|
投稿日時: 2006-04-21 22:43
login(1)を使っている場合に限るとして... login(1)のマニュアルの記述からは、そのように読めます。 ソースコードを確認したわけではありませんが。 -p オプションを付けてlogin(1)を呼ぶと環境変数を保持するようですから、 mingetty(8)に --loginprog オプションを付けて指定すると挙動が変わるかも しれません。試してませんが。 というわけで、/etc/inittab の記述を変えてみるとどうにかなるかも。 [ メッセージ編集済み 編集者: ぽんす 編集日時 2006-04-21 22:43 ] | ||||||||||||
|
投稿日時: 2006-04-23 01:48
すみません、質問2についても自己解決しました。
ここで設定していたようですね。ちなみに、CentOS の bash には この部分にパッチが当たっていて、/usr/local/bin;/bin:/usr/bin に書き換えられていたようです。 /etc/rc.d/rc.sysinit や /etc/rc.d/rc スクリプトで設定されているという考えそのものが間違っていたようですね。;; 環境変数 LANG については /etc/profile が起動された時点では設定されていないことも確認できました。 ただ、その下にある以下の部分がちょっと気になりました。
| ||||||||||||
|
投稿日時: 2006-04-23 03:03
えーと、それは「bashが起動された際にPATH環境変数が*存在していない*」 というわりと異常な状況に対処する際に使用するものです。 手元にbash-3.0のソースが無いので、bash-2.05bのソースより。 使われているのは variables.c の中の一ヶ所のみ。
| ||||||||||||
|
投稿日時: 2006-04-23 12:40
DEFAULT_PATH_VALUE については動作からしても、ソースコードから追ってみてもそういう感じですね。よく分かっていないのは、STANDARD_UTILS_PATH の方ですが、こちらについてもソースコードを追ってみます。
ログイン直後にパスが設定されていないのは自然なことかもしれません。Solaris では /etc/default/login だったか何かで設定しておくことも可能でしたが、実際のところはどのタイミングで呼ばれているのか知りません。 | ||||||||||||
|
投稿日時: 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 ] |