計算機関連のトピックス

管理者 中山研 小林
Updated,
中山研究室の計算機に関する事、その他計算機に関する雑多な事柄を掲載しています。
再び同じ悩みで時間を浪費することのない様に...
計算機
 >> 東大物性研
 >> 千葉大計算機センター

プログラミング
 >> CPU時間、実時間の関数について
 >> スタックサイズ

カーネルの再構築
 >> Alpha - SuSE Linux ( Black & Blue , gundam ) の場合
 >> Symmetric MultiProcessor(SMP) の設定
 >> SRM + aboot での kernel 選択

セキュリティ
 >> サーバのセキュリティレベル
 >> 不要なサービスを停止する

ssh による接続
 >> 基本的なこと
 >> パスワードなしにログインする
 >> ポート転送

Web サーバに関して
 >> FreeBSD での apache の制御
 >> FreeBSD の管理者で定期作業の登録 - cron
 >> AWStats を用いてアクセスログの可視化

CVS に関して
 >> import: プロジェクトの登録
 >> checkout: プロジェクトの呼び出し
 >> release: プロジェクトの消去

ジョブ管理システム
 >> インストール
 >> Generic NQS の使い方
 >> Batch Job ファイル

ディレクリ・サービス - OpenLDAP
 >> 基本的な事
 >> インストール
 >> 初期設定
 >> 起動 etc.
 >> ユーザー認証への利用(サーバの設定)
 >> ユーザー認証への利用(クライアントの設定)
 >> トラブル・シューティング
 >> 参考文献

バックアップ
 >> scp
 >> tar
 >> rsync

その他
 >> 各ユーザーの状態(ホームディレクトリ、グループ等)を変更する
 >> マシンを止める方法
 >> カーネル・パラメータの表示法
 >> 各ユーザーのシェルの変更の仕方
 >> バックアップを取る
 >> 定期的作業の自動化
 >> DebianIntel Fortran Compiler をインストールする
 >> g77 でコンパイルする際の注意事項
 >> script コマンドで作業ログを残す
 >> Java3D をインストールする
 >> perl script: 英文のワードカウント
 >> proftpd のインストール
 >> HDD の増設に関して
 >> ログイン時のメッセージを表示する
 >> SSH でリモートの XWindow を表示する
 >> MacOS X: サービスの再起動をコマンドラインで行う
 >> FreeBSD のネットワーク設定
 >> Linux の distribution を知りたい

トラブルシューティング
 >> phys9において...
 >> MacOS X: LP-9300PS3 を使う
 >> Elsevier の submission tool が使えない
 >> SRM からの CD-ROM の起動
 >> SRM を使用するときの disklabel
 >> Linux?: ロードされているモジュールを調べる
 >> SMP(MultiProcessor) と UP(UniProcessor) の問題
 >> MacOS X: シェルスクリプトをダブルクリックで起動する
 >> MacOS X: バックアップをとる(アイコンなどを保持!)
 >> キーボードなしで起動させる - BIOS の設定
 >> phys8(FreeBSD)のsshが時々止まってしまう

Mac OS X 関連
 >> MacOS X: サービスの再起動をコマンドラインで行う
 >> MacOS X: LP-9300PS3 を使う
 >> MacOS X: シェルスクリプトをダブルクリックで起動する
 >> MacOS X: バックアップをとる(アイコンなどを保持!)
L I N K S

--> 中山研究室 top
--> TAPP trouble shooting(学内のみ...?)
--> PC Cluster 関連トピックス
--> 中山研グループウェア(学内、中山研のみ)




  • CPU時間、実時間の関数について
    マシン、コンパイラによって関数が異なる?
    今のところ、gouf(Intel Pen4 & Intel Fortran Compiler) だと、etime, time, dtime などの関数が解釈されない。
    他のマシンでは(第一原理計算(bbvb)で使われてる)次のような関数を使うといいかも..
    --> vbtime.f

  • スタックサイズ (stacksize) について
    プログラムの実行時エラーで stacksize のオーバーフローですというエラーがでる。
    % limit -h
    cputime         unlimited
    filesize        unlimited
    datasize        unlimited
    stacksize       65536 kbytes
    coredumpsize    unlimited
    memoryuse       unlimited
    descriptors     unlimited
    memorylocked    unlimited
    maxproc         unlimited
    
    この値が個人ユーザが増やせる上限値(Hard limit)なんで、ここまでならば
    % limit stacksize 65536
    などとやって、値を変更できる。
    この Hard limit を変更できるのは、スーパーユーザー(管理者、SU)のみということだけど、SUでもうまくいかない?

    解決方法はカーネルの再構築しかないらしい。
    カーネルをコンパイルする段階で、
    /usr/src/linux/include/linux/sched.h
    の中の stacksize についての記述を自分で書き換えてやる必要がある。


  • Alpha - SuSE Linux ( Black & Blue , gundam ) の場合
    基本的には「HPC-Alpha 取扱説明書 for Linux」に書いてあることに従えばよい。
    取説は2種類あり、緑の方の説明書。
    違うタイプのマシンではなんか注意が必要らしい。

    カーネルの再構築で最も注意しなければならないのは、起動できなくなってしまうことなんで、
    必ず以前のカーネルを名前を変更して残しておきましょう。


    簡単な手順を説明しておきます。
    1. まず、カーネルのソースが置いてある Directory に移動。大抵は、
      % cd /usr/src/linux
      で O.K. です。

    2. カーネルのコンフィギュレーションの設定。
      % make menuconfig
      or
      % make xconfig
      昔の設定を使いたい場合は、
      % make oldconfig

    3. コンパイルはもうおまじないみたいなもんで、
      % make dep ; make clean
      % make boot
      % make modules
      % make modules_install

    4. 出来上がったブートイメージは、
      /usr/src/linux/arch/alpha/boot/
      あたりに、vmlinux.gz みたいな名前で置いてあるんで、それを
      /

      /boot/
      にあるブートイメージと入れ替えれば終わりです。

    5. 後は起動の設定をしっかりして下さい。
      起動の設定は、ブートイメージを入れ替えるだけでいい場合もあるが、
      lilo.config の設定を書き換えなければならない等、面倒なこともあるらしい。


  • Symmetric MultiProcessor(SMP) の設定
    CPU が2つ以上ある様なマシンでは Kernel Compile の段階で SMP にチェックを入れておく必要がある。
    $ make menuconfig
    として、General Setting かなにかにチェックするところがあると思うんで、チェックを入れてコンパイルする。
    ここで一つ問題なのは、
    # make modules_install
    とした時に、大抵の場合、/lib/modules/<Kernelversion> ディレクトリにモジュールがインストールされる。もし、すでにこのディレクトリが存在していたら、混乱が起こるかもしれない(シングルプロセッサ・モジュールは SMP カーネルの元では働かない、その逆も!)。
    なので、/usr/src/linux/Makefile の中の EXTRAVERSION ってところになにかを加えましょう。
    VERSION = 2
    PATCHLEVEL = 2
    SUBLEVEL = 5
    EXTRAVERSION = -smp <-- こんな感じ
    そうすれば、モジュールが /lib/modules/2.2.5-smp のようなディレクトリにインストールされるはず。

  • SRM + aboot での kernel 選択
    Alpha マシンの SRM + aboot での起動の場合の kernel の選択の仕方は2通りで、
    SRM 上で直接 boot コマンドを打ち込み、boot file をコマンドラインで指定してやる方法と、
    /boot/etc/aboot.conf の中身の boot file の部分を書き換える方法がある。


我が研究室の計算機も、最近踏み台にされて、多方から苦情が来るという事件があり、他人事ではなくなってきました。
問題なのは、クラックされた場合、自分だけでなくそのサーバから様々なサーバへ攻撃をしてしまう。 つまり、自分のサーバがクラッカーの手助けをしてしまうということでしょう。
そのために、最近は計算機管理者の責任というものが大きくなってきている様な気がします。気をつけなければならない...

  • 基本的なこと
    ネットワークを介して他のコンピュータにログインする場合、telnet などのパスワードが平文で流れてしまう方法では、 セキュリティ上好ましくないので、基本的にグローバルネットワークを介する場合は ssh を使用するべきである。
    基本的な使い方は、
    > ssh account@remotehost
    とすることで、remotehost にログインすることができる。
    ssh を利用してファイル転送をすることも可能で、scp というコマンドを使って、
    > scp account@remotehost:file .
    > scp ./file account@remotehost:
    のようにして、リモートからローカルへのファイル転送も、ローカルからリモートへのファイル転送も可能です。

  • パスワードなしにログインする
    毎日同じサーバにアクセスするのに、毎日パスワードを打つなんて面倒なことをする必要はありません。 ssh には鍵交換方式で、あらかじめ鍵を作っておいてその鍵を照合することでパスワードなしの認証を行う方法がある。
    まず localhost で、
    > ssh-keygen -b 1024 -t dsa
    として、秘密鍵(id_dsa)と公開鍵(id_dsa.pub)を生成します。このとき、この鍵用のパスフレーズを設定する必要があるハズです。 この内の公開鍵(id_dsa.pub)をパスワードなしでログインしたいサーバに、~/.ssh/authorized_keys として置いておく(バージョンによってはauthorized_keys2 としなければならないかもしれない)。
    そうして、localhost の認証エージェント ssh-agent に秘密鍵を登録すれば、公開鍵を置いてあるサーバにパスワードなしにログイン出来るようになるらしい(認証エージェントに秘密鍵を登録する必要があるか否かや、登録の仕方は忘れた。しかし、Mac OS 10 以上の場合、というより僕の場合、SSHKeyChain というソフトを使用しているらしい)。

  • ポート転送
    藤本さんに教えてもらいました。感謝。
    2006年3月1日現在において、中山・夏目研究室はローカルネットワークに多くの計算機が繋がっており、外部からログインして使うにはゲートウェイサーバ(snowwhite)を介する必要がある。 そこで、ポート転送を利用しない場合、
    localhost ---(SSH)---> snowwhite (gateway) ---(SSH)---> remotehost
    という2段階の ssh を自分で打つことになります。頻繁にログインするような場合、こんなことは面倒だと思います。
    そこで、ポートフォワードという機能を利用して1段階に減らしてしまいましょう。 これは,ローカルポートとリモートポートの間に「トンネル」を掘るというものです. そして,その後の通信にはこのトンネルを使うようにします. 例えば,localhost の 10022 番ポート(この値は適当です.でも,1024 未満はだめです. 慣習としては,8022 とか 10022 がよく使われます)と remotehost の 22(SSH)番ポートの間に SSHプロトコルを通すトンネルを掘った場合の概念図は次のようになります.
    localhost:10022 <---(SSH)---> remotehost:22
    snowwhite を経由していることは確かなのですが,その接続は表に表れません. このままでは,ポート間をつないでトンネルを作っただけなので具体的に操作することはできません. 具体的な操作をするために,このトンネルを通してリモートホストへの接続を試みます. remotehost への SSH 接続だと
    > ssh -p 10022 localhost
    とすることで,localhost の10022番ポートつまり remotehost へ接続されます.おまちかねの中間ファイルなしのファイル転送は
    > scp source-file destination:10022
    で可能です.一連の操作を書くと、
    > ssh -fNL 10022:remotehost:22 account1@gateway     ! トンネルの作成
    > ssh -p 10022 -oHostKeyAlias=remotehost account2@localhost     ! リモートホストへの接続
    > ssh -oHostKeyAlias=remotehost remotehost:~/target.file .     ! リモートホストのホームディレクトリにある target.file をここにコピー
    といった感じになります。 ここで、account1 は gateway 上のアカウントで、 account2 は remotehost 上のアカウントを意味している。 2行目がaccount2@localhost となっていて違和感を感じるけど、これは localhost の10022 に接続することを意味しているからこれで良い。 とりあえず、オプションの説明をしておきます。
    -X    X Window を透過させる。リモートホストで gnuplot を使いたかったら必要。
    -f    SSHをバックグラウンドで走らせる。
    -N    リモートコマンドを実行しない(ホートフォワードで使われる)。
    -L    ポートフォワードの宣言。
    -oHostKeyAlias=...   ホストネームの詐称。ポートフォワードを利用する場合,remotehost への接続であっても localhost に接続するという形態をとるので,このオプションをつけておかないと「知らないホストに接続しようとしている」と文句を言われてしまいます.

    これまでのことでポートフォワードを利用できるのですが, 毎回コマンドを打つのが面倒臭いので,それを回避すべく設定ファイルを書きましょう。 まず変更するファイルは /etc/hosts~/.ssh/config です。
    /etc/hosts は、
    127.0.0.1 localhost
    となっている箇所を、
    127.0.0.1 localhost remote1 remote2 ...
    のように、ポートフォワードしたいリモートホストの名前を加えておく。
    ~/.ssh/config の方は、
    Host *
          ForwardAgent yes

    Host remote1
          Port 10022
          HostKeyAlias remote1

    Host remote2
          Port 10023
          HostKeyAlias remote2
    のように接続ホストを追加する。スクリプトを用いて接続する際に扱いやすいように各接続先について1つのポートを割り当てています。 さらに,トンネル作成とリモート接続を1コマンドで行うためのスクリプトを書きます。
    remote1 に接続するスクリプトは、
    #!/bin/sh
    ssh -XfNL 10022:192.168.1.XX:22 account@snowwhite && ssh -X account1@remote1
    remote2 に接続するスクリプトは、
    #!/bin/sh
    ssh -XfNL 10023:192.168.1.XX:22 account@snowwhite && ssh -X account2@remote2
    となる。ここで、account は snowwhite 上のアカウント、account1 は remote1 上、account2 は remote2 上のアカウントを意味する。 この後は、remote1remote2 と打ち込むだけで、直接接続できるようになります。

    この方法には、SSH 接続を切ったあともトンネルの接続が残ってしまう,という問題があります.
    部分的には解決しました(2006.03.02)
    上の接続スクリプトに、おまじないを付加すればよく、
    結局 remote1 に接続するスクリプトは、
    #!/bin/sh
    ssh -XfNL 10022:192.168.1.XX:22 account@snowwhite && ssh -X account1@remote1
    PID=`ps aux | awk '$11 ~ /ssh/ && $13 ~ /^10022:/ {print $2}'`
    kill $PID
    remote2 に接続するスクリプトは、
    #!/bin/sh
    ssh -XfNL 10023:192.168.1.XX:22 account@snowwhite && ssh -X account2@remote2
    PID=`ps aux | awk '$11 ~ /ssh/ && $13 ~ /^10023:/ {print $2}'`
    kill $PID
    とすればいいです。 スクリプトに付加するおまじないで気をつけるべきところは、PID= の後の部分の囲みはちょっと特殊(?)なヤツで、 $13 ~ の後の数字は上の行のポート番号に等しくなければならないということの2点かな。 これで、SSH 接続を切った後はトンネルが解除されるようになります。
    しかし、この方法にも少し問題があって、例えばひとつのトンネルで2つ接続している場合、 片方の接続を切る時にトンネルも解除してしまうために、もう一方の接続も強制的に切られてしまう。 トンネルを使用中の場合は切らないなど、条件を設定できれば解決できるが...

  • 参考
    @IT: ssh でパスワードなしにログインするには
    ssh ポート転送(ポートフォワード)


  • FreeBSD での apache の制御
    FreeBSD では Linux とは少し異なり、
    # /usr/local/bin/apachectl [start,stop,restart]
    のようにすることで apache のコントロールをするらしい。

  • FreeBSD の管理者で定期作業の登録 - cron
    毎日、毎週、毎月に対応した以下のディレクトリがあるので、
    /etc/periodic/daily
    /etc/periodic/weekly
    /etc/periodic/monthly
    ここに、shell script を入れておけば良い。

  • AWStats を用いてアクセスログの可視化
    最近、ウイルスや不正アクセス等がちょくちょく出てくるんで、web site の監視をしておいた方がいいだろうと言うことで、AWStats を用いてアクセスの統計を可視化することにする。 そうすれば、CodeRed2 ワームや Nimda ワーム等のアクセスログを感知することが出来るようになるでしょう。
    基本的には以下のサイトを参考に awstat をインストールする。
    http://awstats.sourceforge.net/
    http://www.ryu.dyn.to/

    ちなみに、パッケージに含まれてる awstats_buildstaticlinks.pl っていうツールは便利。
    このホストのアクセス集計ページはこちら


  • import: プロジェクトの登録
    プロジェクトをまず、登録するには、そのプロジェクトのディレクトリで、
    $ cvs import -m "<comment>" <module-name> <vender-tag> <release-tag>
    ここで、-m "<comment>" はなければ vi が起動して入力することになる。<vender-tag> は作者の名前でいいと思う。<release-tag> は各バージョンのリリースに付ける名前、一番初めは init とでもしておけばいいと思う。<module-name> が最も使用頻度が高い。毎回このプロジェクト(モジュール)を呼び出す時に使用する。
    これで、プロジェクトが CVS リポジトリに登録される。

  • プロジェクトの呼び出し
    すでに登録してあるプロジェクトは、
    $ cvs checkout [-d <directory>] [-r <tag>] [-D <date>] <module-name>
    で、取得することが出来る。カッコ [] はオプションで、ディレクトリの指定やリリース・タグの指定、日付の指定等が出来る。

  • プロジェクトのリリース(作業終了)
    作業が終了したら、混乱を避けるために作業ディレクトリを消去した方がいいときがある。 そのためには、
    $ cd ..
    $ cvs release -d <directory-name> <module-name>
    つまり、作業ディレクトリの一つ上で作業していたモジュールを消去するという行為で、リポジトリとの差異があった場合は削除するかどうか聞かれる。

  • プロジェクトのエクスポート
    cvs checkout とは異なり、作業するわけじゃないけどソースファイルを欲しいときや、出来上がったものとして取り出す時には、
    $ cvs export -d <directory-name> -D <date> <module-name>
    datetoday としておけば、最新バージョンが得られる。


フリーのものや商用のものがいくつかあるらしい。ここでは、Generic NQS についてです。
  • インストール( to Linux? )
    Generic NQS のウェブサイトから最新版をダウンロードしてきて、SETUP スクリプトを実行すれば、勝手にインタラクティブに進んでいってインストールが終了する。
    その中にも説明があるけど、 いくらかの設定を行う必要がある。
    まず、デーモンを登録?するために、/etc/services に、
    nqs 607/tcp # Generic NQS batch system
    と書き加える。
    次に、ログを残すために、/etc/syslog.conf に、
    local0.* /var/log/nqs
    と書き加える。
    SETUP スクリプト中にやるかもしれないけど、 nmapmgr でホストを登録する(この時、host がちゃんと /etc/hosts に書かれている必要があるらしい)。
    # nmapmgr
    NMAPMGR:> add host <hostname>
    NMAPMGR:> add alias <alias> <hostname>
    NMAPMGR:> exit
    これで、インストールは終了したと思うんで、まず、nqs を起動する。
    # qmgr start nqs
    プロセスのなかに nqs のデーモンが走っているのが確認できる。
    そしたら、バッチ・キューの作成を行う。
    # qmgr
    Mgr: create batch_queue <queue-name> run_limit = <run-limit>
    Mgr: enable queue <queue-name>
    Mgr: start queue <queue-name>
    これで、キューを作成して、Enable の状態に成ったと思うので、 キューを削除したいときは、
    # qmgr
    Mgr: disable queue <queue-name>
    Mgr: start queue <queue-name>
    Mgr: delete queue <queue-name>
    とすれば良い。また、管理者以外のユーザーに管理権限を与えるには、
    # qmgr set manager <user-name>:m
    とすればいいらしい(最後の :m の意味はようわからんです)。
    キューに時間制限を設けたい時は、
    # qmgr set per_process cpu_limit = ( 2:0:0 ) <queue-name>
    とすれば CPU TIME LIMIT を設けることが出来る。

  • Generic NQS の使い方
    ジョブ管理システムがインストールされたんで、使い方を少し。
    ジョブの投入は、
    $ qsub -q <queue name> -o <output> -e <error output> job
    オプションは、batch job のファイルの中に記述する方法もある。
    キューの情報、ジョブの待機情報などを見るには、
    $ qstat -[abl]
    ジョブを取消し・中止したい時には、
    $ qdel -[sk] <queue ID>
    ジョブが既に実行中の場合には、-k オプションをつけないと止められない(付けても止められないんだけど...)。 他にも -s オプションでシグナルを送ることが出来る。

  • Batch Job ファイル
    qsub でジョブを登録する時に便利な batch job ファイルを載せておきます。
    #!/bin/sh
    #
    #@$-q <queue-name>
    #@$-o <output>
    #@$-eo

    cd $QSUB_WORKDIR

    <command whatever you want to run>



計算機が新しく何台も導入された時など、いちいち新しいユーザーを作るのは面倒なので、ディレクトリ・サービスというものを利用する(2005.1.14)。
Vine Linux にインストールした時の記録です。
  • 基本的な事
    LDAP で用いられる識別名(dn, distinguish name)の例
    属性名意味
    cncommon name
    objectclassオブジェクトクラス
    dcdomain component
    uiduser id
    もっといっぱいあるらしい。

  • インストール
    ソースファイルからコンパイルするのが王道だと思うが、何故かうまくいかなくて、apt-get で簡単にバイナルをインストールした。

    ここに、ldap コマンド群でよく出てくるオプションの意味をいくつか...
    -x認証の際に SASL を使用しない指定
    -DLDAP サーバを操作するユーザの指定
    -Wパスワードを入力するためのもの。「-D」で指定した識別名のパスワードを用いる。「cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp」のパスワードは、slapd.conf で指定する「rootpw」になる。

  • 初期設定
    まずは、/etc/openldap/slapd.conf を編集する。
    いくつかの行のコメントアウトを外して、LDAPの走るホストの設定に合わせて書き換えればいい。 書き換える所は、おそらく、pidfile, argsfile, database, suffix, rootdn, rootpw, directory の行だと思う。 suffix行は、例えばホスト名が oolong.s.chiba-u.ac.jp なら、
    suffix "dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp"
    のようになるハズ。
    database に関しては、ldbm(GNU DBM) では何故か上手く起動しなかったから、bdb(BerkeleyDB) を使用した。
    ちなみに、/etc/openldap/slapd.conf の属性は、owner も group も ldap にしておいて、アクセス権限を 700 に設定しておくのがいいらしい(owner,group が root だと、サービスが起動しなかった。)。
    また、ユーザー認証に利用したい場合は、nis.schema をインクルードしていなければならにから、include行も調べておく必要はある。

  • 起動 etc.
    # service ldap restart
    で、起動させる。動作確認は次のように ldapsearch を利用して namingContexts っていうのを表示させるといいらしい。
    > ldapsearch -h localhost -x -b '' -s base '(objectclass=*)' namingContexts
    正常に起動したら、システム起動時に起ち上がるように設定する。
    # chkconfig ldap on

  • ユーザー認証への利用(サーバの設定)
    ユーザー認証には posixAccount という objectclass を用いる。 Unix の場合にはパスワードを暗号化して、別ファイルに格納しているらしく(/etc/shadow)、それを利用するには objectclass に shadowAccount も加える必要がある。

    とりあえず、ユーザを登録するには...
    objectclass に posixAccountshadowAccount を利用した場合の LDIF ファイルは次のようになる。
    > cat foo.ldif
    dn: uid=foo,ou=People,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
    uid: foo
    cn: foo bar
    objectclass: posixAccount
    objectclass: shadowAccount
    objectclass: account
    uidNumber: 1001
    gidNumber: 1001
    gecos: ,,,
    userPassword: {CRYPT}暗号化された文字列
    shadowLastChange: 12772
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    homeDirectory: /home/foo
    暗号化されたパスワードを得るには、slappasswd というコマンドを使用して、
    > /usr/sbin/slappasswd -h '{CRYPT}' -s password -c "%s"
    とすればよい。
    これを LDAP サーバに登録するには、
    > ldapadd -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W -f foo.ldif
    とする。
    登録したユーザのパスワードを設定するには、
    > ldappasswd -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W 'uid=foo,ou=People,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -S
    New passwd: <--- 新規パスワードを入力
    Re-enter new passwd:
    Enter bind passwd: <--- LDAP のパスワード(つまり、ここでは、Managerの) Result: Success(0)
    とすることで、パスワードの設定をすることができる。passwd コマンドを使用できる様に既に設定してある場合は、passwd コマンドで同様のことが可能だが、そのときも Manager のパスワードは必要と思われる。

    LDIF ファイルで何かしらユーザ(今の場合 foo というユーザ)を登録したら、とうとう登録したアカウント情報をシステムで参照できるようにする。
    まだ、システムは foo というユーザの登録を認識できないから、
    > id foo
    としても、ユーザの情報は得られない。
    そこで、nsswitch.conf と ldap.conf ファイルを変更する必要がある。
    まず、ldap.conf ファイル内に、
    host 127.0.0.1
    base dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
    のように、ホストの場所、検索ベースを書き込んでやる。
    そして、nsswitch.conf には、
    passwd: compat ldap
    group: compat ldap
    shadow: compat ldap
    としてやれば、id コマンドで foo の情報が得られるようになる。

    実際にユーザを登録していく時には、各ユーザがどのグループに属しているかを考えなければならないので、まず、グループを登録することから始めた方がいいかもしれない。 グループは posixGroup という objectclass で登録することができ、そのグループIDを各ユーザに付けてやればよいだろう。

    また、既に登録されているユーザを調べたいときは、ldapsearch を使って、
    > ldapsearch -h localhost -x -b 'dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' '(objectclass=*)' '*' '+'
    とするか、もしくは slapcat を使って、
    # slapcat
    とすれば登録されているユーザは全て見ることができる。

    登録されているユーザを削除するには ldapdelete コマンドを用いて、
    > ldapdelete -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W 'uid=username,ou=People,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp'
    の様にすればいいらしい。これで、LDAP のユーザ情報は消えるが、各マシンに存在しているディレクトリなどは削除されないで残っている。

  • ユーザー認証への利用(クライアントの設定)
    クライアント側は、ユーザがログインしようとして認証を行なうときに、そのホストの passwd ファイルなどよりも先に LDAP サーバを参照するように設定してやればよい。 そのためには、クライアント側に nss_ldap と pam_ldap というLDAP用のモジュールが必要で、ないならインストールする必要がある。 あったら、それら用のコンフィグ・ファイル(/etc/libnss_ldap.conf と /etc/libpam_ldap.conf)を次の様に作る。
    > cat /etc/libnss_ldap.conf
    # Your LDAP server.
    host 192.168.1.99

    # The distinguished name of the search base.
    base dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp

    rootbinddn cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp

    > cat /etc/libpam_ldap.conf
    # Your LDAP server.
    host 192.168.1.99

    # The distinguished name of the search base.
    base dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp

    rootbinddn cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp

    pam_crypt local
    そしたら、rootbinddn に指定した識別名のパスワードを /etc/ldap.secret に書いておき、当然パーミッションを 600 にしておく。

    さらに、passwd や group で LDAP を使用するように、/etc/nsswitch.conf を下記のように修正する。
    passwd: compat ldap
    group: compat ldap
    shadow: compat ldap
    これは、クライアント側だけでなくて、サーバ側でも LDAP を使用するなら同じこと。

    さらに、/etc/pam.d/ ディレクトリの中の login と sshd に下記の行を加える。
    session required /lib/security/pam_mkhomedir.so skel=/etc/skel/ umask=0022
    これは、ログインした時にホームディレクトリがなかったら /etc/skel/ から必要なものをコピーしてきて、新しくホームディレクトリを作成するようにしている。
    また、passwd コマンドでパスワードを変更できるようにするには、/etc/pam.d/passwd を修正する必要がある。
    password required pam_unix.so nullok obscure min=4 max=8
    のところを、
    password sufficient pam_ldap.so
    password required pam_unix.so nullok obscure min=4 max=8
    のように修正してやればよい。
    もしかしたら、/etc/pam.d/system-auth を修正するのかもしれないけど...
    authconfig というツールがあったらそれを利用するとこれらの修正が簡単になる。

  • トラブル・シューティング
    • Object class violation (65)
      下記のような LDIF ファイルを登録しようとしたら、エラーが出て登録が出来ない。
      > cat kobayash.ldif
      dn: uid=kobayash,ou=nakayamal,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
      uid: kobayash
      objectclass: posixAccount
      uidNumber: 1001
      gidNumber: 1001
      homeDirectory: /home/kobayash
      loginShell: /bin/tcsh
      cn: Ryo Kobayashi
      > ldapadd -x -D 'cn=Manager,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp' -W -f kobayash.ldif
      Enter LDAP Password:
      adding new entry "uid=kobayash,ou=nakayamal,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp"
      ldapadd: update failed: uid=kobayash,ou=nakayamal,dc=oolong,dc=s,dc=chiba-u,dc=ac,dc=jp
      ldap_add: Object class violation (65)
      additional info: no structural object class provided
      何故だろう?

      ANSWER
      nis.schema で posixAccount を見てみると、
      objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
      となっており、STRUCTURAL でなく、AUXILIARY なんで、構造オブジェクトをもっていないらしくエラーがでるらしい。 なんで、解決策は、
      objectclass: account
      を加える。これの宣言は cosine.schema にある。こうすると問題なく通る。 参考文献内では、これは載っていないところをみると、バージョンによって異なるのかもしれない。

    • ssh の場合にホームディレクトリが作成されない
      初めユーザがホストにログインする場合には、そのユーザのホームディレクトリを作成する必要があるが、コンソールからログインした場合にはホームディレクトリが作成されるが、ssh でログインした場合にはホームディレクトリが作成されない。

      ANSWER
      どうも OpenSHH の権限分離(Privilege Seperation)に関係しているらしいので、sshd_configUsePrivilegeSeperation を no に設定しておくことが必要らしい。ここのことは詳しくは知らない...

    • 一度登録したはずのものがシステムの再起動後になくなる
      既に登録したはずのユーザがLDAPディレクトリからなくなっていることがあった。
      なぜ?

  • 参考文献
    UNIX USER 2002.1 「認証はLDAPで」
    Linux magazine 2005.2 「LDAPのすすめ」
    The SLAPD and SLURPD Administration Guide


バックアップは重要なんで、独立した項目としてまとめることにします。
  • scp
    scp で簡単にサーバ間でのファイルコピーを行える。
    [user@local]$ scp something.tgz remote-host:remote-dir/
    しかし、もっと良い方法はいくらでもあるようです。

  • tar
    tarssh、パイプを用いて、
    [user@local]$ tar zcvf - ~/directory | ssh remote-host "cat > local-directory.tgz"
    逆のようなことも可能です。
    [user@local]$ ssh remote-host "cat remote-archive.tgz" | tar zpvxf -

  • rsync
    いままでのは、ファイル全部、ディレクトリの中身全部などをコピーするやり方なんで、大きな容量の時などは時間がかかる。rsync は、差分を更新するので、前回のバックアップとあんまり変更がない場合などは、上述のやり方に比べるとかなり高速です。
    [user@local]$ rsync -ave ssh ~/directory remote-host:~/backup/
    -e オプションはシェルを指定するオプションで、ここでは ssh を指定している。この例では、ローカルマシンの ~/directory という名前のディレクトリを、リモートマシンの ~/backup という名前のディレクトリ内にコピーしている。
    cron を用いて自動化したい時は、ssh のログインがパスワード認証でなく、公開鍵認証(パスワードなし)の必要があるかもしれない、しかも、ローカルサイトの秘密鍵のパスフレーズもなしでないと出来ないかも...


  • インストール
    ここで考えるのは、Windows を外から操ることを考える。 VNC はサーバ・クライアント型のアプリケーションなので、まず、サーバーとなる windows に VNC をインストールする。
    http://www.uk.research.att.com/archive/vnc/download.html
    ここあたりからダウンロードできると思う。
    サーバ・ソフトをサーバ側にインストールし、サーバを起動したら、クライアント側に VNCViewer っていうソフトをインストールして接続する。


  • 各ユーザーの状態(ホームディレクトリ、グループ等)を変更する
    スーパーユーザーで、
    # usermod [-g group] username
    のようにする(よく忘れる)。
    ついでにユーザーを消すときは、
    # userdel username

  • マシンを止める方法
    スーパーユーザーになって、
    # shutdown -h now
    あるいはちょっと遅らせたい場合は、
    # shutdown -h +何分

    再起動のときは、
    # shutdown -r now

  • カーネル・パラメータの表示法
    sysctlというコマンドがあります。
    $ sysctl -a
    sunrpc.nlm_debug = 0
    sunrpc.nfsd_debug = 0
    sunrpc.nfs_debug = 0
    sunrpc.rpc_debug = 0
    dev.md.speed-limit = 100
    dev.cdrom.check_media = 0

    ... 中略 ...

    kernel.version = #1 SMP Mon Sep 4 17:19:47 JST 2000
    kernel.osrelease = 2.2.16-3smp
    kernel.ostype = Linux
    というようにパラメータが出力される。
    値の設定方法は、root権限が必要で、
    # sysctl -w var=value
    で、varというパラメータにvalueという値が設定される。

    これらは、/proc/sys 以下にあるファイルを cat で読むのとあんまり変わらない?
    /proc の読み書きには、
    # cat /proc/XXX
    で値が表示され、
    # echo value > /proc/XXX
    で値が設定される。

  • 各ユーザーのシェルの変更の仕方
    大抵のマシンでは、ユーザーは各自好みのシェルを使用することが可能です。
    ログイン時のシェルの変更は、
    $ chsh
    で行うことが出来ます。
    B shell 系では .profile 、C shell 系では .login または .cshrc が設定ファイルとなっています(.login はログイン時に一度だけ読み込まれる)。

  • rsync を用いてバックアップを取る
    1. まずは rsync をインストールする。
    2. バックアップ先のホストの設定
      バックアップ先のホストのユーザー・ディレクトリに .rhosts というファイルを用意し、その中に
      192.168.1.111 kobayash
      のように、バックアップ元のホスト名(もしくは IP アドレス)、バックアップ元でのユーザー名を書き入れる。
      これによって、バックアップ先のホストから接続の許可が与えられる(この方法はセキュリティ上良くないかもしれない)。
    3. バックアップを取る
      実際にバックアップを取るには、
      $ rsync -avz (<バックアップ元>):dir/file <バックアップ先>:dir
      とする。オプションに関してはマニュアルを読んで下さい。
    4. 自動化する
      自動化するには cron を用いる
      cron の登録するコマンドのところに上のコマンドを入れてやれば良い。
      しかし、自動化するためにはパスワードなしで rsh が通るようにバックアップ先のホストの設定をしてやらなければならない。そのためには、バックアップ先のホストの /etc/hosts.equiv にバックアップ元のホストを記入してやれば良かったと思う。

  • cron を用いて定期的に自動作業をする
    cron に作業を登録することで、作業を定期的に自動で行うことが出来る。バックアップを取るのには最適。
    cron に作業を登録するには、まず、次の様なファイルを作ります。
    PATH=/usr/bin
    SHELL=/bin/sh
    0 * * * * command
    PATH=SHELL= 等は、コマンドの存在するパスの設定や実行に用いるシェルを設定するため。
    その後の行が cron に登録する行で、分 時間 日 月 曜日 の順に並んでいて、* はワイルドカード。 このファイルを cron に登録します。
    $ crontab filename
    これで作業が登録される。登録された作業を見るには
    $ crontab -l
    で、登録された作業を解除したいときは
    $ crontab -r
    で解除できる。

  • DebianIntel Fortran Compiler をインストールする
    ifc のインストーラはどうも rpm だけを念頭において設計されてるんで、Debian では面倒なことになる?
    ここを参考にしてインストールすべし。
    Free Software

    要約すると、./install でインストールするには rpm が使用できないといけないんで、Debian の場合は、次のように、
    $ apt-get install alien
    $ rehash
    $ alien -t intel-ifc7-7.1-8.i386.rpm
    とし、alien というソフトを使って rpm から tar アーカイブを作成する。そしたら、
    $ tar xvzf intel-ifc7-7.1-8.tar
    $ mv ./opt/intel/compiler70 <installdir>
    $ mv ./opt/intel/licenses <installdir>
    とする。
    そしたら、<installdir>/opt/intel/compiler70/ia32/bin/ の中のスクリプト ifc, ifcvars.sh, ifcvars.csh, ifc.cfg 内の "<INSTALLDIR>" を適当な値に書き換える。
    つぎに、ifc.cfg の中身に -w90 と書き加える。(なぜかは知らんけど)
    んで、ifc スクリプトをどっか PATH の通ってるところに加えればオッケー。
    最後に、Intel からもらってるはずのライセンスファイル( *.lic ってヤツ )を <installdir>/opt/intel/licenses/ にコピーする。そのファイルを環境変数 INTEL_LICENSE_FILE ってので指定しておく必要がある?かな?
    終わりです。

  • g77 でコンパイルする際の注意事項
    g77 ではアンダースコアが重複して名前付けされるという様な現象があるらしいので、コンパイルする際に、-fno-second-underscore というオプションをつけるべきらしい。
    google などで fortran second underscore で検索すると詳しく調べられると思うけど、これに注意しないとすごい悩むことになる。
    MPI などのライブラリをコンパイルする際には特に気をつけましょう。

  • script コマンドで作業ログを残す
    コマンドの出力と、自分の入力をどちらもログとして残す方法です。
    script は端末上に表示されたものを全て 'typescript' という名前のファイルに残します。
    $ script
    Script started, file is typescript
    $ <command>>
    ....
    $ exit
    Script done, file is typescript
    この方法では、ログの各行の最後に "^M" が記録されることで、それを消去するには、
    $ perl -p -e "s/\r$//;" -i.bak <logfile>
    とすれば、"logfile.bak" という名前のバックアップファイルができて、"^M" を取り除いた "logfile" という名前のファイルが出来る。
    ちなみに、正規表現での \r ってのはたぶん Macintosh で使われる改行コードで、Unix では \n、Windows では \r\n となっているはず...

  • Java3D をインストールする
    Java3D を使いたい理由は、文部科学省ITプログラム「戦略的基盤ソフトウェア」のなかの BioStation Viewer を使いたいというところです。
    Java3D を使用できる様にするには、以下のものが必要です。
    Java 2 Runtime Environment
    Mesa
    これらをどっかのウェブサイトで探してインストールすれば、あとは Java3D をインストールするだけです。
    Java3D は、
    http://mirrors.publicshout.org:81/java-linux/
    で入手できました(2003.10)。
    インストールは付属の README に書いてあることをそのままやれば簡単でした。

  • perl script: 英文のワードカウント
    英文のワードカウント用の perl script です。ワード数指定されている論文等のカウント用に...
    --> wcount.pl
    一応、文字数、ワード数、行数を出力してくれます。

  • proftpd のインストール
    wu-ftpd よりもセキュリティーの面で、いろいろ設定できるらしい。
    まずは、どっかから取ってきて展開して、そのディレクトリに入って、
    $ ./configure
    $ make
    # make install
    で、/usr/local/sbin なんかにいろいろとインストールされるはず。
    そしたら、/usr/local/etc/proftpd.conf を編集する。
    ServerType standalone を
    ServerType inetd に
    として、inetd から起動できる様にしてやる。また、
    Group nogroup を
    Group nobody に
    あとは、<Anonymous ~ftp> ディレクティブの中身に、次の行を加える。
    <Limit LOGIN>
    DenyAll
    </Limit>
    ほかにも、自分で特殊な設定をしたい場合は勝手にしてくれ。
    最後に、inetd 側の設定なんだけど、/etc/inetd.conf っていうファイルがあれば、そこに、適当な行を加えればいいんだけど、そういうファイルがなくて、xinetd.d っていうディレクトリがある場合は、そのディレクトリ内に、ftp って名前のファイルを作って、
    service ftp
    {
    	disable			= no
    	socket_type		= stream
    	protocol		= tcp
    	wait			= no
    	user			= root
    	server			= /usr/sbin/in.proftpd
    	server_args		=
    	log_on_success	+= DURATION USERID
    	log_on_failure	+= USERID
    	nice			= 10
    }
    と書き込んで、あとは xinetd 用の proftpd 起動用のファイルのリンクを作成する。
    # ln -s /usr/local/sbin/proftpd /usr/sbin/in.proftpd
    これで、大丈夫かな?

  • HDD の増設に関して
    Linux マシンに HDD を増設したら、パーティションを切る作業と、フォーマットの作業が必要。
    パーティションは、fdisk を使用する。
    フォーマットは、mke2fs を使用する。

  • ログイン時にメッセージを表示する
    /etc 内にあるファイルに文章を書き加えればいいんだけど、issue, issue.net, motd と3種類あってどれが効いているのかは知りません。RedHat の ssh ログインの場合は motd が効いていたけど...

  • SSH でリモートの XWindow を表示する
    SSH はリモートホストの XWindow session を通過させることが出来るとは聞いていたけど、本当に出来るとは...
    当然、ローカルホストでも XWindow が動いていることが前提であるけど、次の様に、
    $ ssh -l <username> -X <remote-host address>
    と、してやると XWindow session をトンネルすることが出来る。オプションの -X は X トンネリングを可能にするという設定。
    MacOS X では X11 が使えるし、Windows からでも Cygwin とかいうのを使用すれば XWindow を使用できるらしいから使うと便利でしょう。

  • MacOS X でサービスの再起動をコマンドラインで行う
    MacOS X で cupsd の再起動を行おうと思ったときに、どうしていいのかわからなかったので、いちおうメモを残しておきます。
    $ sudo killall cupsd
    $ sudo cupsd
    として再起動をすることができた。

  • FreeBSD のネットワーク設定
    FreeBSD のネットワーク設定は Linux とは多少異なっている。
    考慮すべきファイルは次の4つ
    /etc/hosts
    /etc/hosts.conf
    /etc/resolv.conf
    /etc/rc.conf

    rc.conf の中に ip_address を書くところがある。ifconfig コマンドでネットワークデバイスを確認して、
    ifconfig_dc0="inet 192.168.1.8 netmask 255.255.255.0"
    の様に書き込み設定する。

  • Linux の distribution を知りたい
    親切な(?)マシンだと、起動時に distribution を表示してくれるので、dmesg などで最初の行を見れば判る。けど、時々そこには何も書いてないマシンがある。
    おそらく、/proc/version を見れば distribution が載っていると思う。そんなファイルがない場合はどうしたらいいか判らない。


  • ときどきtelnetなどではログインできるけど、ftpが出来ないという現象が起こる。
    経験上、どうもユーザーのグループが他人のものになっていることがあり、そのような時に上の様な現象が起こるらしい?
    ユーザーのグループの変更は、前の方で述べているが、その方法でも治らないことがある。なんでだろ〜?

  • phys9においてはdeleteやback spaceなどが使えない、tabや前回入力の繰り返しの機能が使えない等の問題がある。
    delete、back spaceの機能は、home directoryに .profile, .login などのファイルを作って、そこにdeleteを使えるようにする事を書き込めば出来るようになった例がいくらかある。
    tabやhistory機能に関しては、未だに解決しておらず、現在解決策を模索中。

  • MacOS X(10.2)からLP-9200PS3に出力できない?
    エプソン社のWebページでは、LP-9200PS3はOS Xには未対応となっているが、PPDファイルさえ入手できれば出力することが可能。
    下のWebページなどからPPDファイルをゲットし、プリントセンターでプリンタの追加を行う。その際に、AppleTalkで追加すればいいらしい(TCP/IPではどうも上手くいかなかったなぁ...)。
    --> クニテック株式会社

    同様に、FUJI XEROX の DocuPrint 201PS でもPPDファイルさえ入手できれば(どっかで、御自分でお探し下さい)、プリントできます。

  • Elsevier の web の submission tool が上手くいかない
    ブラウザが悪いんでしょう。
    MacOS X の Safari 1.0(v85) では submit してもまた submit 用の画面に戻ってしまう。

  • SRM Firmware Console から CD-ROM の起動
    SRM に関しての情報は、
    SRM Firmware Howto
    MILO に関しての情報は、
    Alpha Miniloader Howto
    SRM Console からの RedHat Linux のインストールの手順を少し。
    CD ドライブに CD-ROM をいれて、
    >>> boot dqa0 -flags 0
    ここで、dqa0 ってのは CD ドライブのデバイスを指す。
    日本語キーボードなら
    >>> set language 50
    で、使いやすくなるかも...

  • SRM を使用するときの disklabel
    HDD のパーティションの問題だが、partition table ってのがあって、OS に依存するもので、
    • DOS disklabel
      Linux や Windows で一般的に使用。SRM からは起動不可らしい。
    • BSD disklabel
      Unix 系で使用。SRM でも O.K.。Linux でも kernel コンパイル時に対応しておけば O.K.。
    の2通りあるんだけど、SRM を使用する限りは(?) BSD disklabel でパーティションが必要?

  • Linux?: ロードされているモジュールを調べる
    現在の kernel でロードされているモジュールを調べるには、
    $ lsmod
    もしくは、
    $ cat /proc/modules
    とする。

  • SMP(MultiProcessor) と UP(UniProcessor) の問題
    SMP kernel でモジュールが読み込まれなかったりした場合に、
    # insmod <module>.o
    とした時に、
    • unresolved symbol _global-sti
      ならば、
      kernel が SMP となっていて、
      module が UP(非SMP)
    • unresolved symbol _global-stiAC1294D34
      のように、後になんかが付いてたら、
      kernel が UP となっていて、
      module が SMP となっている。

  • MacOS X でシェルスクリプトをダブルクリックで起動する
    シェルスクリプトをダブルクリックで起動するのは簡単で、ファイルの拡張子を .command として、ファイルのパーミッションを実行可能にし、ファイルをターミナルで開くように設定すればダブルクリックでシェルスクリプトを起動することができる。
    当然ファイルの先頭は #!/bin/sh のようになっていなければならない。

  • MacOS X バックアップをとる(アイコンなどを保持!)
    MacOS X では、前述した rsync を用いる方法でもバックアップはできるが、アイコンや開くアプリケーションの情報などが保持されないために、面倒なことが多々ある。そこで、やっぱりバックアップ用のソフトウェアを用いるのが便利だろう(コピー&ペーストでは面倒なのと時間がかかる)。
    Synchronize! Pro」っていうソフトは結構便利です。シェアウェアだけど。

  • キーボードなしで起動させる - BIOS の設定
    計算機にはモニタやキーボードが必要ない環境ということが多々あるが、起動時にキーボードがささっていないとエラーでそれ以上先に進まないことがある。 これは BIOS の設定でそうなっているんで、それを直してやればキーボードなしでもシステムが起動するようになる。
    詳しくは知らないが、
    • Award BIOS というものの場合は、BIOS 設定のなかに Halt On [All Errors] というところがあって、 これによってキーボードがないというエラーの時に止まってしまうようになっているんで、 [All Errors] というところを [All but keyboard] に変更すればいいらしい。
    • Intel Desktop Board の場合は、Halt On という項目のところがなくてちょっと迷ったけど、 どうも Plug and Play O/S [No] のところを [Yes] に変更すればいいらしい。


  • phys8(FreeBSD)のsshが時々止まってしまう
    今のところ、何故止まってしまうのか原因は判らない。
    復旧は、管理者になって、/etc/netstart を実行すればオッケー。