ホームページに戻る

Linuxリンク集9

Linuxの技術詳細に関するリンク集です。

OS

Linuxカーネル

Linuxカーネルは受動型のプログラムで、能動的に何かを実行することは無い。アプリケーションからのシステムコールと、ハードウェアの割り込みに応じて、応答を返して実行される、イベント駆動型のソフトウェアである。

カーネルのプログラムの役割としては、アプリケーションの実行(プロセス管理)と、システムとプログラムに対するメモリ管理、それからデバイスドライバーによるハードウェアの操作と監視、ストレージデバイスにおけるファイルシステムの実現、そしてネットワークへの接続などがある。

Linuxカーネルは、単一の巨大なプログラムとして実現されており、モノリシックカーネルと呼ばれる。これは、カーネルの機能をたくさんのサーバーやサービスに分ける、MinixやGNU Hurdのマイクロカーネルとは逆の方向である。Minixのタネンバウム教授もそれを批判している。だが、マイクロカーネルは性能的に遅いことがある。Hurdなどは、遅すぎて使い物にならない、と言う話もある。

SysV init

最近はsystemdにとってかわられてしまったが、昔のシンプルだったごろのSysV initを解説する。

まず、ファイルシステムの方に、起動時に実行するスクリプトが存在する。/etc/rc.d/などにあることが多い。

init.dディレクトリの中に、それぞれのデーモン(コマンドではなく、起動時に実行され、システムで恒常的に実行されるプログラム)を実行させるスクリプトがある。

rc0.dのように、rc[数字].dの中に、それぞれのランレベルごとに実行される、先ほどのスクリプトへの、シンボリックリンクがある。

このスクリプトは、S85httpdのように、実行順(実行の順序)の数字とともにファイル名が付けられている。

ランレベルは以下のようになる。

0 停止

1 シングルユーザモード

2 マルチユーザモード(ネットワークなし)

3 マルチユーザモード(ネットワークあり)

4 未使用

5 マルチユーザモード(GUIログイン)

6 再起動

そして、OSの起動・終了時に/etc/inittabの設定を見て、initと言うプログラムがランレベルによって実行される。

X11

X11は、ユーザーのコンピュータの入出力デバイス(マウス、キーボード、ディスプレイなど)を監視するXサーバーと、GUIアプリケーションであるXクライアントが、ネットワーク透過なXプロトコルを使って、要求などの応答を通して成り立っている。(HTTPDとは違い、ユーザーのコンピュータがサーバーで、リモートのプログラムがクライアントである、と言うところに注意が必要。ユーザーはサーバーであるXサーバーの画面を操作しながら、リモートのXクライアントをネットワークで操作する。)

Xlibは、XクライアントがXプロトコルの詳細を知らなくてもXサーバーと通信出来るようにしたライブラリ。Xlibによるプログラミング処理を見ると、Windowsプログラミングのようなメッセージループによるプログラムになる。

だが、普通、Xlibを直接に操作することは無い。ボタンやメニューのようなグラフィックス・ツールキットが用意されていないからである。あらかじめ作られたボタンやメニューを使うためには、Intrinsics (Xt)、Athena widget set (Xaw)、Motif、GTK+、Qt、Tkなどを使う。

X11は、最近ではWaylandと言うものにとってかわられようとしている。

GCC

GCCは、様々な言語に対応しているが、フロントエンドでC、C++、Objective-C、Fortran、Ada、Goをコンパイル出来る。中間コードで最適化処理(コードをもっと高速にする改変)を加えて、バックエンドでさまざまなCPUアーキテクチャに対応する。

GCCもLLVM/Clangにとってかわられようとしている。

RPM

RPMは、ソフトウェアごとにspecファイルと言うそれぞれのパッケージの分類、依存関係、インストール処理、ファイルリストなどを事前に書いておくことで、インストールやアンインストールを分かりやすく、手軽にする仕組みです。

RPMのspecファイルはこんな感じになります:

# This is a sample spec file for wget

%define _topdir	 	/home/strike/mywget
%define name			wget 
%define release		1
%define version 	1.12
%define buildroot %{_topdir}/%{name}-%{version}-root

BuildRoot:	%{buildroot}
Summary: 		GNU wget
License: 		GPL
Name: 			%{name}
Version: 		%{version}
Release: 		%{release}
Source: 		%{name}-%{version}.tar.gz
Prefix: 		/usr
Group: 			Development/Tools

%description
The GNU wget program downloads files from the Internet using the command-line.

%prep
%setup -q

%build
./configure
make

%install
make install prefix=$RPM_BUILD_ROOT/usr

%files
%defattr(-,root,root)
/usr/local/bin/wget

%doc %attr(0444,root,root) /usr/local/share/man/man1/wget.1

RPM を使ってソフトウェアをパッケージ化する: 第 1 回 パッケージのビルドと配布より。)

YUM/DNF/Apt

パッケージ管理システムで、アプリケーションを簡単にインストールする仕組み。

Ubuntuのapt-getの場合:

apt-get install [package]	パッケージのインストール/更新
apt-get update	パッケージリストの更新
apt-get upgrade	インストールされてるパッケージの更新
apt-get dist-upgrade	インストールされてるカーネルの更新(Ubuntu)/ディストリビューションの更新(Debian)
dpkg -l [package]	インストールされてるパッケージの一覧
dpkg -L [package]	インストールした時のファイルの一覧
apt-cache search [query]	パッケージの検索
apt-cache policy [query]	パッケージの検索 (インストール可能なバージョンの表示)
apt-cache madison [query]	パッケージの検索 (インストール可能なバージョンの一覧)
apt-get remove [package]	パッケージの削除
apt-get autoremove	使ってないパッケージの削除
apt-get purge [package]	パッケージの削除(設定ファイルも)
apt-get clean	アーカイブファイルの削除
apt-get autoclean	使ってないパッケージのアーカイブファイルの削除

[Ubuntu] apt-get まとめより。)

GNU make/Autotools

GNU makeは、プログラムのソースコードをコンパイルする時、更新されたファイルだけをコンパイルするなど、色んなことが出来ます。

Autotoolsは、色んなプラットフォームでソフトウェアをコンパイルする時に自動で設定・処理してくれるGNUの仕組みですが、結構理解し辛いので嫌われています。

このコマンドを実行することで簡単にソフトウェアがインストール出来るのは、Autotoolsのおかげ:

./configure && make && make install

詳細は以下をご覧あれ。

/etc/fstab

パーティションを記載する設定ファイル。

普通はこうなる:

/dev/sda2   /boot        ext2    defaults,noatime     0 2
/dev/sda3   none         swap    sw                   0 0
/dev/sda4   /            ext4    noatime              0 1
  
/dev/cdrom  /mnt/cdrom   auto    noauto,user          0 0

システムの設定 - Gentoo Wikiより。)

システムロガー

システムのログを取ってくれる。

cronデーモン

定期的に特定の処理を実行してくれる。

ネットワークの設定

ネットワークの設定は、昔から手動でするのは複雑です。ディストリビューションによっても違います。以下のリンクが参考になるかもしれません。

国際化・地域化

gettextのような仕組みを用いることで、国際化と地域化が容易になる。

文字列に

printf(_("hoge is %s."), name);

と言うエイリアスをつけ、.poファイルでこのように翻訳出来る。

#: src/prog.c:20
msgid "hoge is %s."
msgstr "ほげとは%sである。"

アプリケーション

grep, sed, awk とUNIXのフィルタコマンド

検索・置換の三人衆。自分は詳しくないです。僕は、パイプを使いながらコマンドに値を与えたりするのは好きですが、検索や置換には詳しくないです。

Emacs

テキストエディタのEmacsはLispインタプリタを内蔵していることで有名です。Lispの実行環境になっているので、エディタなのにメールクライアントになったりします。

Apache & Perl/CGI

HTMLの代わりにCGIを用いて、動的なWebページを作ることが出来る。ブラウザにデータを伝達する前の、サーバーサイドの処理。

同様の技術に、PHP、ERB(Ruby)、Javaサーブレット・JSP、ASP.NETのようなものがある。

PHP

PHPを使ったPOSTアプリケーション。以下のようになります。

HTML フォーム(form-post1.php):

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>フォームからPOSTで送信されたデータを表示 - サンプル1 - PHP入門</title>
</head>
<body>
<form method="POST" action="form-post2.php">
<label>名前を入力してください:</label>
<input type="text" name="onamae" /><br />
<label>メールアドレスを入力してください:</label>
<input type="text" name="mail" />
<input type="submit" value="送信" />
</form>
</body>
</html>

POST で送信されたデータを表示(form-post2.php):

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>フォームからPOSTで送信されたデータを表示 - サンプル2 - PHP入門 - Webkaru</title>
</head>
<body>
<?php
  echo $_POST["onamae"] ."さんのメールアドレスは". $_POST["mail"] ."です。";
?>
</form>
</body>
</html>

フォームから POST で送信されたデータを表示より。)

SQL

基本は、追加(INSERT)、更新(UPDATE)、削除(DELETE)、取り出し(SELECT)の4つです。 DELETEの時WHEREを指定しないと「全削除」になってしまうので注意してください。