linux 技術情報 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # 備忘録 #--------------------------------------------------------------------------------------------- ・linux ではファイル名の大文字、小文字は区別がされる ・windows ではファイル名の大文字、小文字の個別がされない ・gcc の警告オプション -Wall は引数の数、引数の型チェックを厳密に行う ・gcc の最適化オプション -O1 〜 -O2 はプログラムの実行速度を早めるために行う ・カーネルはコンピューターのハードウェア(デバイス) を取りまとめる役割がある ・デバイス種類ごとに操作方法も違うので、異なる部分のみをドライバでまかなう ・カーネルに仕事させるにはシステムコールを用いる ・linux にはよく使う関数をライブラリとしてプログラムからリンクすることで利用できる ・/lib 配下に標準C ライブラリの実体が置かれている ・mount コマンドはファイルシステムを一覧表示する ・gdb を使う時は gcc にディバッグオプション -g を付けるが、最適化オプションは付けてはいけない # ゾンビプロセスとは? #--------------------------------------------------------------------------------------------- UNIX のプロセスの情報は、終了してからも親プロセスが子プロセスの終了ステータスを知るなどの目的のために、プロセス管理テーブルに残っている。これを解放するために、親プロセスは子プロセスの終了シグナルSIGCHLDを処理する際に、wait(2) システムコールを発行しなければならない。 親プロセスでwait が実行されるまでの間、子プロセスは、プログラムは終了しているのにプロセス管理テーブルに残っているという状態になるが、これをゾンビプロセスと呼ぶ。ゾンビプロセスはリソースを解放しない上にゾンビプロセスに対してのシグナルは無視され、ずっと居残ってしまう。 親プロセスがwait せずに終了してしまった場合は、最初に起動され、全てのプロセスの先祖であるinitプロセスが、そのプロセスを自分の養子として引き受け、ゾンビプロセスの解放にあたる。 > ゾンビプロセスが残るケース ・親プロセスより早く子プロセスが終了した場合、子プロセスがゾンビプロセスとなる > ゾンビプロセスを作らないためには? 子プロセスの終了を待つ(waitシステムコール) 必要が無いのであれば、SIGCHLD シグナルは無視指定(SIG_IGN) におけば、 システム内に意味無くZOMBIEプロセスが増えることはない。 # Linux のタイムゾーンに関する考察 #--------------------------------------------------------------------------------------------- タイムゾーンは、世界の別の場所では今何時なのかということを分かりやすくするために作られました。 Linux のタイムゾーンは、/etc/localtime ファイルで決まります。このファイルは、あるゾーン情報ファイルへのリンク(またはそのコピー) です。ゾーン情報ファイルは通常/usr/share/zoneinfo ディレクトリに置かれています。 日本のタイムゾーンは、JST で世界協定基準UTCに+9時間した時間です。通常タイムゾーンは、OS インストール時に、サーバーがある地域から、もしくはUTC 時間からのオフセット(JST であれば+9) を基に設定します。 # su コマンドにおける環境変数の取扱い #--------------------------------------------------------------------------------------------- # login root # su - nobody 上記のようにした場合、root がnobody にスイッチユーザーするが、このとき、オプションにハイフンをつけることで、nobody にスイッチした際、環境変数をnobody のもので上書きします。 # サーバーの文字コードを変更する #--------------------------------------------------------------------------------------------- Red Hat 系Linux のサーバー文字コードは/etc/sysconfig/i18n ファイルで管理されています。また、Red hat 9 以降のRed Hat 系Linux のサーバー文字コードは、ディフォルトUTF-8 となっています。 # telnet のリモートによるroot のログインを拒否する #--------------------------------------------------------------------------------------------- リモート端末からログイン可能とするには/etc/securetty ファイルにpts/0、pts/1、pts/N など、端末の/dev/pts/N の/dev を省略した文字列を記載します。/dev/pts/N とは、リモート端末番号であり、/etc/securetty ファイルにリモート端末番号を記載することで、root に限らず全てのユーザーがリモートログイン可能となります。 # xinetd により起動されるサービスのIP レベルでの接続制御を行う #--------------------------------------------------------------------------------------------- xinetd により起動される全てのサービスに接続制御処理を施す以外にも、xinetd 自体にも接続許可判断をしてもらいます。また、xinetd 自体にもログを採取する機構を設けます。 /etc/xinetd.d 以下の各サービス毎のファイルに下記の行を追加 ------------------------------------------------------------ only_from = 192.168.0.0/24 ------------------------------------------------------------ 192.168.0.0/24 の範囲のIP からのみ接続を許可する /etc/xinetd.conf に下記の行を追加 ------------------------------------------------------------ defaults { instances = 15 log_type = FILE /var/log/servicelog log_on_success = HOST PID EXIT DURATION log_on_failure = HOST RECORD } ------------------------------------------------------------ 指示されたファイルにxinetd を経由して起動されるサービスの接続に関するログが記憶される、 # 前回のログイン時間、ログイン元を次回ログイン以降、非表示にする #--------------------------------------------------------------------------------------------- SSH 等のリモートツールよりLinux にログインした場合、下記のような表示がされます。 Last login: Wed Sep 5 02:37:41 from 192.168.0.15 これを無効とするには、ユーザーのホームディレクトリ直下に.hushlogin ファイルを作成するだけでよく、かつ、中身は空でよいのです。 # ログのロテートを行う #--------------------------------------------------------------------------------------------- ログは基本的に [/var/log] 以下に集約される。このログの肥大化を防ぐため、ログをlogrotate によってロテートする。ロテートされた場合、過去のログは***.1, ***.2 のように別ファイル名で同ディレクトリ内に保存されます。 必要に応じて、ロテートする定義ファイル/etc/logrotate.conf を修正します。 logrotate 起動自体はcron.daily ファイルより参照、cron より定期的に行われる。が、テストのためにcron を返さずに強制的にlogrotate を実行させる方法を下記に示します。 ロテート指標時間(ロテートする際に基準になる時間) を記述したファイル/var/lib/logrotate.status を直接編集 ------------------------------------------------------------ "/var/log/lastlog" 2002-2-5 ← テストのため、現在より過去の時間に設定 ------------------------------------------------------------ ロテートをコマンドラインより実行します。 # logrotate /etc/logrotate.conf # 一般ユーザーのうち、root になりうるユーザーを限定する #--------------------------------------------------------------------------------------------- デフォルトの設定では、su コマンドを実行してパスワード認証をクリアすればだれでもroot になれる。これはセキュリティ上好ましくないので、su コマンドでroot になれるアカウント(wheel アカウント) を制限するようにします。 /etc/login.defs ファイルに下記の1行を追加 ------------------------------------------------------------ SU_WHEEL_ONLY yes ------------------------------------------------------------ /etc/group ファイルのwheel の行を修正 ------------------------------------------------------------ wheel:x:10:root,user ------------------------------------------------------------ root に成り得るアカウントをuser とした。 上記の設定を有効にするため/etc/pam.d/su ファイルに以下の行を追加 ------------------------------------------------------------ auth required /lib/security/pam_wheel.so use_uid group=wheel ------------------------------------------------------------ # 文字列の16 進数変換方法 #--------------------------------------------------------------------------------------------- xxd | 16進数ダンプと、16進数ダンプからの元にもどすこともできるコマンド # echo -n 'あ' | xxd -g 1 > 文字列を16 進数1 桁表示で出力 # echo -n 'あ' | xxd -p > 文字列を16 進数2 桁表示で出力 # echo -n 'あ' | xxd -b > 文字列を2 進数表示で出力 # echo -n '61 62' | xxd -r -p > 16 進数を文字列表示で出力 hexdump | 16 進数ダンプを行うコマンド # echo -n 'あ' | hexdump -C > 文字列を16 進数2 桁表示で出力