2017/02/17

NetBSDのログイン環境の初期設定に関わるファイル群

dynabook SS SX/15AにNetBSD/i386をインストールして環境を構築してきましたが、ログインの仕方の違いや、ログインするユーザの違いによって、環境が微妙に異なっているので困っていました。具体的には、次のようになっています。
  1. アカウントは、rootと、2つの非特権ユーザがあり、合計で3つのアカウントがある。
  2. シェルには、rootはshだが、非特権ユーザはtcsh(場合によってはcsh)を使う。
  3.  各アカウントには、xdm経由でログインする場合と、TeratermやSSHなどの端末経由でログインする場合がある。
  4.  xdmでログインした場合、twmを利用するアカウントと、MATEを利用するアカウントがある。
このような組み合わせを考えると、闇雲にファイルを変えていくと、どのファイルで何の環境が変わるのか、だんだん分からなくなってきます。こういう場合の対処方法として一般的に行われるのは、組みあわせの数を減らすことです。例えば使おうとするシェルが3つ(sh、csh、tcsh)もあるので、何か1つ(例えばtcsh)に限定したりして、組みあわせの複雑さを低減させることです。

rootのシェルをCSH系にするというのも一案ではありますが、伝統的にrootはSH(1)を使ってきた(BASHですらなく)という経緯があるので、シェルを統一してしまうのは気が引けます。アカウントやログイン経路なども、何かに限定するわけにもいきません。

ここは覚悟を決めて、統一した環境を作ることを考えてみます。SH(1)にしろCSH(1)にしろ、初期設定を行うファイルは、全部使うかどうかは別にして、次のようになっています。これらを組み合わせて計4種類のファイルがあります
  1. /etcに置かれるシステム全体のものと、ホームディレクトリに置かれるユーザ固有のもの
  2. ログインシェルの場合に呼び出されるものと、サブシェルでも呼び出されるもの
SH(1)では伝統的にはホームディレクトに.profileというファイルを置くだけでしたが、POSIXの拡張か何かで、環境変数ENVが定義されているとサブシェル実行時に指定されているファイルを読み込むようになっています。ファイル名は何でも良いわけですが、NetBSDでは.shrcになっています。

環境を設定するための基本方針を次のように定めました。
  1. 基本的に/etcにあるファイルで設定をおこなう。
  2. ユーザ固有の設定がある場合のみホームディレクトリのファイルで設定する。従ってユーザ固有の設定がなければ、ファイルは空のままになる。
  3. 環境変数PATHやLANGのような情報はログインシェルの場合に読み込まれるファイルで設定し、シェル変数やコマンド・エイリアスなどはサブシェルでも読み込まれるファイルで設定する。
これで端末経由でログインする場合は問題ありませんが、XDM経由でログインする場合の対処が必要です。XDM経由でログインすると「ログインシェル」というものが無いのでPATHやLANGのような環境変数が設定されなくなってしまいます。xtermを起動するときに「-ls」というオプションを指定すればログインシェルとして扱われるようになりますが、それはオプションを指定したxtermだけであって、ウィンドウマネージャから直接起動したアプリケーションは対象になりません。

XDMはホームディレクトリにある.xsessionというファイルを使って初期設定をおこないます。このファイルは実行ビットが立っていてもいなくても構わないのですが、実行ビットが落ちている場合にはSH(1)のスクリプトとして扱われます。そうなるとユーザがCSH系のシェルに切り替えている場合、環境変数などをSH系としてもCSH系としても定義しておくことになり、重複して環境をメンテナンスするのは間違いのもとです。

この問題を解決するためにホームディレクトリにある.xsessionはユーザで使っているシェルにあわせることにしました。CSH系を利用するのであれば、このファイルもCSHのスクリプトとして書いておきます。さらに実行ビットを立てておかないと、shを介して実行されてしまいますから、忘れずにchmodしておきます。そして~/.xsessionの最初の方で/etcやホームディレクトリにあるシェル用の環境設定ファイルを読み込むようにしておきます。

以上のようにしておけば、環境を設定するための情報をあちこちに書かずにすむようになると思います。

上述した環境を整えている段階で/etc/login.confという設定ファイルがあるのも気にかかっていました。このファイルでも環境変数などを設定できるので、ここで設定しておいた方が良いのだろうかと悩みました。結局このファイルは使わない決断をしましたが、その理由はXDM経由でログインした場合の扱いが不明だったことです。XDMやLightDMなどを利用した場合に/etc/login.confで設定してはずの内容が使われないのであれば無駄になると思ったのです。

そもそも/etc/login.confが存在する歴史的経緯や、どのような利用方法を想定しているのかが分からないので、今回は使わないこととしました。

0 件のコメント:

コメントを投稿