ブート手順についてのFAQはBootFAQsに移動しました。
rootユーザー(スーパーユーザー)はUNIXに用意されている特別なユーザー。rootユーザーには、マシンを完全に掌握できるroot権限(管理者権限)が与えられる。
UNIXでは通常、そのユーザーにとって操作できるように所有権とパーミッションが設定されているファイルしか操作することができないが、root権限の元で実行されたプログラムは、ファイルの所有権に関わらずあらゆることを実行することができる。
そのため、全てのユーザーにとって共有されるシステム一般のファイルでも、rootになれば改変できる。
rootユーザーは非常に強力なので、常に使っているとあらぬ操作でシステムを動作不能にさせてしまう可能性がある。通常は普通のユーザーで操作を行い、システム全体を調整する必要があるときだけrootユーザーを使おう。
普通のユーザーでログインしてるときに root や他のユーザーに切り替わりたいときは、 su を実行すると別のユーザーになった上で新しいシェルを立ち上げてくれる。
$ su - Password: (root のパスワードを入力) # (rootのシェルになった)
root のシェルではコマンド入力行の $ が # と表示される。
# exit $ (ユーザーに戻る)
前のユーザーに戻るときは exit でシェルを終了させる。
root というとシステム管理権限のあるスーパーユーザを指すことが多いけど、ファイルシステムの一番根元の事("/")も root と呼ばれる。
というわけで root ユーザ(もしくはスーパーユーザ)、ルートディレクトリなどと区別して記述するといいかと。
コマンドを打ち込むユーザーの権限 (一般ユーザー/root ユーザー) のことです。
$ %は一般ユーザーでの操作。# は root 権限を持った スーパーユーザー (root ユーザー) での操作を示します。
相手に一般ユーザーでの作業なのかスーパーユーザーでの作業なのかを判別するのに使われます。
~/ はユーザのホームディレクトリのことです。例えば hoge という名前のユーザなら、/home/hoge が ~/ となります。
$ cd ~/ $ pwd /home/hoge
(ただ単に cd とだけ打てばホームディレクトリに行けるけど、あくまで例として。)
shutdown を使う。実行する前に root になっておこう。停止する場合は -h、再起動する場合は -r オプションをつける。
# shutdown -h now # shutdown -r now
halt、reboot などのコマンドも使えます。終了時に root になる必要があるのは、root で実行するサーバーなどのデーモンを終了させる必要があるからです。
コンソール上の各種パスワード入力プロンプトでは、入力した文字の情報が他の人にわからないように何も表示されないようになっています。 文字が表示されなくてもそのままかまわずパスワードを打ち、続いて Enter キーを打ちましょう。
打ち間違えたり、もう一度最初から入力したい時は Ctrl+u (=行削除) キーを押すと、入力した文字をすべて消去してパスワードを再入力することができます。
vipw コマンドで:と:の間にはさまれた意味不明な文字列を削除する。vipw (=vi) の使いかたはしらべてね。
/etc/shadow を直接編集してもいいけれどもお薦めしない。そもそもパスワードを削除すること自体お薦めしない。
簡単に言うと端末画面をエミュレートするソフトのこと。
決められた数しか開けない実際の端末とは違って好きなだけウィンドウを開けるのも利点の1つ。(*1)
端末エミュレータ(ターミナル)には色んな種類があるので代表的な物をいくつか紹介します。 X Window System がインストールされているならば、どれか一つはインストールされていることでしょう。
script コマンドを使います。
script | コマンド |
記録を開始 | $ script 記録保存用ファイル |
記録を終了 | $ exit |
あるいは tee コマンドを使うと、特定のコマンドだけ出力を記録しておけます。
tee | コマンド |
コマンドの出力を記録 | $ コマンド | tee 記録保存用ファイル |
逆に beep というパッケージを入れるとビープ音をコマンドで任意に鳴らせる。
端末エミュレータ (ターミナル) というのを開いたあとで、コマンドをキーボード入力して Enter キーを押すと実行できる。
コマンド入力例の$/%/#はコマンドを打ち込むユーザの権限のことなので打つ必要なし。#がついたコマンドは root ユーザー になったあとで実行すること。
以下のページで簡単に解説してあります。
Tabキーを押してコマンド補完を使ってみよう。Bash入門の コマンド補完機能を使おう 参照。
質問したものの冷たく「 man (オンラインマニュアル) 読め 」と言われて途方にくれた場合どう生き残るか。
とりあえず、Red Hat Linux 入門ガイドの シェルプロンプトの基本 を読んでみよう。
日経 Linux に Linux コマンド逆引き大全 というすんごいページがあるので参考にしよう。左下の Linux の基礎というところから読めます。閲覧にはユーザー登録が必要なので登録するべし。(無料)
日経 Linux に Linux コマンド集 があるので参考にしよう。
ジャンル別になっているのでペラペラと読んでみると新たな発見があるかも。
JM を読んでみましょう。JM はコマンドについているオンラインマニュアルを日本語に翻訳してくれているありがたいプロジェクトです。
たとえばファイルをコピーするコマンド "cp" を検索するとこんな風に表示してくれます。
また、JM では最新のバージョンのコマンドに翻訳が追い付いていない場合があるので、端末エミュレータで man コマンドを使えるようになっておくといいでしょう。
$ man コマンド名
man コマンドの使い方を表示する方法は以下の通り。
$ man man
英文のものを表示したい場合は以下のように環境変数 LANG を一時的に変更して実行します。
$ LANG=C man man
man は UNIX 系 OS のほとんどで採用されている伝統的なマニュアルシステムですが、GNU 系のソフトウェアだと info というのを標準採用していたりもします。
$ info info
man も info も表示されない場合は、コマンドに --help とつけて呼び出すとヘルプが表示されることも。
$ cat --help
$ man bash
とすると BASH(1) と表示されます。この数字はセクションと呼ばれるものです。
数字の詳細については JM Project のセクションとは?参照のこと。
例えば mount コマンドに関するマニュアルは 2 と 8 の異なるセクションのマニュアルが用意されています。
$ man 2 mount $ man 8 mount
上記のようにセクションを指定すると見ることができます。
コマンド補完を使うと正確に、そして早く入力ができるようになります。
詳細は初心者のためのシェル(bash)入門を参照のこと。
ターミナルでコマンドを実行しようと hoge と入力しても、bash: hoge: command not found などと言われてしまう場合。
原因は以下の2通りが考えられます。
この場合、そのコマンドの実行ファイルをインストールすれば使えるようになるはず。
コマンドの実行ファイルが存在していても、環境変数 PATH の一覧に含まれてるディレクトリにないと見つけられない。
PATH の設定を確認するには echo $PATH と実行する。もし、実行ファイルがこれ以外の場所にあれば /home/huga/hoge とフルパスで打てば実行できる。(*2)
/sbin や /usr/sbin にある管理用のコマンドの場合は、root でない一般ユーザの PATH には含まれないので、一般ユーザはフルパスで打たない限り実行できない。
su で一般ユーザから root に切り替る際は、 su - とハイフンをつけずに su と実行すると、一般ユーザの環境設定がそのまま使われてしまうので注意すること。(参考)
なお、現在のディレクトリに hoge という実行ファイルがあったとして、それを実行したいときは ./hoge と打ち込む。("." は現在のディレクトリの意)(*3)
/usr/local/hoge1 とか /usr/local/hoge2 とかに実行ファイルを入れている場合、全てを PATH に追加するのが面倒なら /usr/local/bin などにシンボリックリンクを張る手が使えます。
分割は split コマンド、結合は cat コマンドが簡単です。
split -b 分割サイズ 分割するファイル 分割後のファイル先頭につける文字列 hoge.tar.gzを1440KBの「hoge_splited」で始まるファイルに分割してみる:
$ split -b 1440k hoge.tar.gz hoge_splited. $ ls hoge.tar.gz hoge_splited.aa hoge_splited.ab hoge_splited.ac
cat 結合したいファイル >> 結合後のファイル
$ cat huga_splited.aa huga_splited.ab >> huga.tar.gz
あるいは * を用いて
$ cat huga_splited.* > huga.tar.gz
分割/結合 | コマンド |
split (分割) | $ split -b 分割サイズ 分割するファイル 分割後のPREFIX |
cat (結合) | $ cat 結合するファイルのPREFIX .* >> 結合後のファイル名 |
分割サイズのデフォルト単位はバイトだけど、サイズの後に k や m をつければKB(=1024B)やMB(=1024KB)になります。
grep コマンドを使うと、指定した文字列を含む行を画面に表示します。ディレクトリ内のファイル全てから検索する場合は -r オプションをつけます。
grep | コマンド |
ファイルから検索 | $ grep 検索する文字列 ファイル |
ディレクトリから検索 | $ grep -r 検索する文字列 ディレクトリ |
ディレクトリから検索するときは「ファイル名:一致する行」のように表示されます。
sed コマンドを使うと、ファイルの中の特定の文字列を別の文字列に置換して画面に表示します。
sed | コマンド |
置換 | $ sed -e "s/置換したい文字列/置換後の文字列/g" ファイル |
-e オプションを複数指定すると複数置換します。出力を表示せずにファイルに保存したい場合はリダイレクトします。
awk コマンドを使うと、空白などで区切られた表示結果の2列目や3列目の部分だけを抜き出して画面に表示します。
例えば コマンド | awk '{print $2}' と入力すると、コマンドの出力のすべての行のうち、何か(デフォルトは空白)で区切られている 2 番目(=$2)だけを抜き出して表示します。
SMBCHARTOOL が便利です。
SMBCHARTOOLは、Sambaのコンパニオンツールで、Samba サーバ上の日本語ファイル名の文字コードを一括変換することで、Sambaサーバを運用する管理者を支援するツールです。
現在は euc, hex, jis, cap, sjis の各文字コードに対応しています。また、変換だけでなく旧バージョンにおける文字化けに対しても、修復します。
convmv ってのも。
diff コマンドで差分を調べられます。二つのディレクトリにあるファイルの差分を調べたい時は -r オプションをつけます。
diff | コマンド |
2つのファイルの差分を調べる | $ diff ファイル1 ファイル2 |
2つのディレクトリの差分を調べる | $ diff -r ディレクトリ1 ディレクトリ2 |
各種テキストエディタ を使用します。 Unix 系 OS では vi系エディタを使うのが伝統ですが、初心者には難しいかもしれません。Linux では nano が簡単です。
GUI のテキストエディタもありますが、X サーバが立ち上がらなくなってしまった時にも困らないよう、 CUI のテキストエディタに慣れておいた方がよいでしょう。
タイムゾーンを変更するには、root になって以下のコマンドを実行します。
タイムゾーン変更 | コマンド |
Red Hat 系 | # /usr/sbin/timeconfig |
Debian 系 | # /usr/sbin/tzconfig |
知らない間にcoreという名前のファイルができてしまった(@IT)
ロードアベレージを調べるには top , uptime , xload などを使います。
たいていの場合、使っていない実メモリをキャッシュとして有効活用しているだけなので、問題はありません。
free コマンドを実行してメモリの使用状況を確認してください。
$ free total used free shared buffers cached Mem: 256568 251608 4960 0 16992 99836 -/+ buffers/cache: 134780 121788 Swap: 196520 29488 167032
出力の2行目 (Mem: の行) を見ると、free の欄が 4960 となっていて total に比べてかなり小さく、メモリ使用率がかなり高くなっているように見えます。
が、キャッシュとして使用している分を除いた値 (3行目の free の欄) を見ると121788 なので、半分近く空いています。この場合はそれほど問題ではありません。メモリが必要になるとキャッシュ部分がクリアされて、使用できるようになります。
Linux(っていうか UNIX かな?) では, 各プロセスにメモリを割り振った残りをバッファ(buffer)とキャッシュ(cache)に利用して, ディスク入出力の負荷を減らしている. そのため, free コマンド等で見える残りメモリ−(free)は 1M 程度の瞬間的な使いまわしに対処する程度しか残っていない事が多い.
この例では, 実質的な残りメモリ−は, バッファとキャッシュに転用された分も考慮すると free+buffers+cached で計算できる. 上の例で云うと free+buffers+cached = 1628+20112+126848 = 148588. まだまだ, メモリ−には余裕がある.
ファイルの内容の閲覧。
$ less [ファイル名]
スペースキーで進む、bキーで戻る、qキーで終了。似たようなのに more (次に進むだけで、元に戻れない) とか lv (国際化版) とかもある。
システム (OS 名など) の情報を表示。
$ uname
すべての情報を表示させるには、 -a オプションを使用。
$ uname -a
現在時刻を表示。
$ date
カレンダーを表示。
$ cal
数ヵ月分まとめて表示させるには、 -* オプションを使用。
ここより Linux Kernel 2.6 関連 の方が情報が多いです。
解説 | リンク |
高橋浩和氏によるカーネルコード解析文書 | http://sourceforge.jp/projects/linux-kernel-docs/wiki/internal22-index (2.2) |
http://sourceforge.jp/projects/linux-kernel-docs/wiki/internal24-index (2.4) | |
http://sourceforge.jp/projects/linux-kernel-docs/wiki/%E7%9B%AE%E6%AC%A1 (2.6) | |
Linuxデバイスドライバ開発のヒント | http://www.devdrv.co.jp/linux/ |
Linux Head Quarters | http://www.linuxhq.com/ |
Kernel Newbies | http://kernelnewbies.org/ |
Kernel Trap | http://kerneltrap.org/ |
@IT: Linux Square カーネル関連記事 | http://www.atmarkit.co.jp/flinux/index/indexfiles/index-linux.html#kernel |
解説 | リンク |
JF: Index of Linux Kernel 2.2 Documentation | http://linuxjf.sourceforge.jp/JFdocs/kernel-docs-2.2/ |
JF: Index of Linux Kernel 2.4 Documentation | http://linuxjf.sourceforge.jp/JFdocs/kernel-docs-2.4/ |
JF: Index of Linux Kernel 2.6 Documentation | http://linuxjf.sourceforge.jp/JFdocs/kernel-docs-2.6/ |
JF: Configure.help Japanese translations. | http://linuxjf.sourceforge.jp/JFdocs/Configure.help/ |
Unable to open a suitable terminal device.とエラーメッセージが出る。
カーネルコンフィグで
File Systems > Pseudo filesystems > [*] /dev/pts
これで解決。
NPTL は古い Linux Threads 実装とバイナリで互換性があるようになっていますが、古い Linux Threads の実装で POSIX 標準以外の実装の部分を使用しているソフトウェアの場合、NPTL の環境では修正が必要になります。
NPTL でソフトがうまく動作しない場合は環境変数 LD_ASSUME_KERNEL を設定すると古い Linux Threads を使えます。
古い Linux Threads を使う | 設定値 |
フローティングスタックあり | 2.4.1 |
フローティングスタックなし | 2.2.5 |
今のところ上記二種類の設定があるようです。
hoge というプログラムを使うときに設定したい場合は以下のようにすれば一時的に環境変数を設定して実行する事ができます。(bash の例)
LD_ASSUME_KERNEL=2.2.5 hoge
カーネルはとても小さな時間で次々とプロセスを切り替えることで プログラムの並列実行を可能としている。
具体的には、レジスタの内容をtask_structという構造体に退避し、 プロセスを安全に停止し、切り替えながら再実行する。
プロセスには、タイムスライスと呼ばれる「とても小さな時間」が与えられ、 Linuxカーネルはスケジューラによってこれを次々に切り替える。 これをコンテキスト切り替えと呼ぶ。
主なスケジューリングアルゴリズムに、ラウンドロビン、協調的スケジューラ、多段フィードバックキューなどがある。Linux 2.6.23以降ではCFSという新しいスケジューラが使われている。
プロセスには、「実行中」「実行可能」「待ち状態」の3つの状態があり、それぞれに切り替わる。待ち状態とは、たとえばfind . | grep hogeでfindの実行終了を待っているgrepのような状態。この間grepの実行はブロックされる。
カーネルは、実行するプロセスに、テキスト領域(プログラムが格納される)、スタック領域、ヒープ領域などを与える。
カーネルはプログラムがメモリ領域にアクセスした段階で、 論理アドレスを物理アドレスに翻訳する。
これを仮想アドレス空間と呼ぶ。
ハードウェアのMMUという機構を使ってこれを実現している。
このようにすることで、CPUとメモリの組がひとつしかなくても、 プログラムの数だけあるかのように仮想化することができる。
カーネルは三段階のメモリアドレッシングを行う。
すなわち、ページグローバルディレクトリ、ページミドルディレクトリ、ページテーブルである。
もともとは二段階だったが、64bit化された結果二段階では不十分ということになり、 Alphaプロセッサを参考に三段階のアドレッシングがされるようになった。
カーネルは、ページングやセグメンテーションによってメモリ空間を小さく分割して管理している。
C言語のプログラムをコンパイルすると、ネイティブに実行できるバイナリファイルが出来るが、 このプログラムを実行すると、カーネルがこのプロセスがきちんと動くようにメモリ領域を割り当てて管理する。
カーネルは、できるだけ連続したメモリ領域を確保し、空き領域の断片化が起きないように、ページの置換のために頻繁に使用されていない空き領域を選ぶページ置換アルゴリズムや、2を基底する数で管理するバディシステムのような仕組みを使って努力している。
メモリを動的に確保するにはmalloc(), realloc(), calloc()などのAPIを使う。またbrk()やsbrk()も使うが、malloc()系列のAPIとbrk()系列のAPIを同時に使うことはできない。これはmalloc()がbrk()などとともに使われないことを前提として実装されているため。
malloc()した領域は必ずfree()してプログラムの中で解放しなければならない。C言語ではJavaのようなガーベッジコレクションの仕組みがないため、解放しなければメモリリークが起きる。
C++ではnewとdeleteを使ってオブジェクト指向のオブジェクトをmalloc()やfree()と同様に動的スコープで管理できる。この際には構造体のポインタと同じように.の代わりに->を用い、型宣言に*をつける。また、C++でもスマートポインタを用いれば、Javaと同じように自動的に解放されるメモリ領域を管理できる。
また、メモリではないが、プログラムを書く時はエラーチェックをきちんとすること。malloc()のエラーチェックをしなかった場合、システムに存在するメモリが使い果たされた時などの対応ができない。C言語には例外の仕組みがないため、エラーチェックは返り値を条件式で比較してチェックする。
カーネルは、IOデバイスの応答を待機している間、別の仕事をする。
IOデバイスが処理を完了して応答した時点で、 デバイスがカーネルに割り込み、処理を継続する。
割り込みとは、このようにカーネルの処理に対してさまざまな場面で割り込んでくる処理のことで、 場合によって例外と呼ばれることもある。
ソフトウェア割り込みとかハードウェア割り込みと区別されることもある。
プロセスは、それぞれに独立したメモリ領域を用意する。
これに対して、スレッドはプロセスの中に軽量な並列処理を実行し、 メモリ領域を共有する。
スレッドにおいては、競り合い状態が発生しないように、 変数を排他制御(ロック)する必要がある。
プロセスにおいても、プロセス間通信の仕組みを使うことで、 異なるプロセスでデータを共有できる。
セマフォを使うことで、排他制御ができる。 セマフォは、同時に使える人数のうち、あとどれくらいの人数が使えるかを示す整数値を提供する。
プロセス関連のシステムコール・APIとして、fork(), exec(), wait(), exit()などがある。forkをするとその時点からプログラムが二つに分岐する。execをすると自分のプロセスを上書きしてそのプログラムを実行する。特にサーバーなどでは面倒くさくてもforkしよう。
デーモンを作る場合、fork()した上でsetsid()で制御端末を切り離せばよい。
デバイスドライバは、カーネルの中で唯一デバイスコントローラの詳細な仕様を知っている部分。
キャラクタ型デバイスとブロック型デバイスがある。
キャラクタ型デバイスは、ランダムアクセス(好きな時に好きな場所にアクセス)することができない。
ブロック型デバイスは、ランダムアクセスができる。多くの場合、ハードウェアなどのストレージはブロック型デバイスであり、マウントして利用する。
カーネルはVFSという機構を使うことで、ファイルシステムが違ってもプログラムを修正する必要はなく、 同じシステムコールからアクセスできる。
ext2やext4はブロック型ファイルシステムで、ブロックでデータを管理し、i-nodeと呼ばれるインデックスからブロック内のデータにアクセスする。
カーネルは、低速なディスクに頻繁にアクセスしないように、ストレージの内容を内部でキャッシュしている。ファイルの書き込みはまずキャッシュに書かれてからその後にディスクに書かれる。なんらかの理由でキャッシュからディスクに書きたいならsyncコマンドを実行する。
i-nodeはデータへとアクセスするためのインデックスのことで、「未使用」「使用中」「ダーティ」に分けられる。ダーティとは「書き込み中」の意味。ダーティフラグがつけられると、カーネルはそれをダーティリストに加えて、I/Oリクエストキューに加え、順次それが書き込まれる。
ext2などのブロック型ファイルシステムは、ブロックの集合であるブロックグループの集合としてデータを保管し、メタデータをスーパーブロックに格納する。
これに対してReiserFSやXFSはデータベースで用いられるB-Treeと呼ばれるインデックスを用いる。
BtrFSのようなコピーオンライトのファイルシステムでは、ファイルはコピーだけされても実際のデータは複製されず、読み取り専用となっている元のファイルの部分を参照する。実際にこのデータに書かれた時にその部分だけが複製される(コピーオンライト)。
このためBtrFSではファイル容量が大幅に削減できるため、過去のその時読まれたデータを残しておくスナップショットの機能を持たせても構わないぐらいの現実的な余裕がある。そのため、障害復旧に優れている。
カーネルはBSDソケットインターフェースを提供する。
これは互いに関連づけられると有効になり、片方から書き込むと片方から読み込める。
TCPでは再送制御など信頼性確保のための多くの機能があるが、UDPは機能がない代わり、ビデオや音声などを多少誤りがあっても高速に通信できる。
APIは、socket(), bind(), listen(), accept(), connect()となる。サーバ側で待ち受けて待機しているソケットに、クライアントが接続することで、ソケットの連携が可能となる。
カーネル内部では、BSDソケット層とINETソケット層がある。OSI参照モデルでは、ヘッダを付加して上層から下層へとデータを送り、ヘッダを除去して下層から上層へとデータを受け取る。Linuxでは、ソケットバッファsk_buffのポインタをOSI参照モデルの各層に渡していくことでこれを実現している。
シグナルはプログラムを強制終了するのに使う。
デフォルトの動作は強制終了やコアダンプなどに限られているが、プロセスの側でシグナルを捕捉(トラップ)し、別の動作をさせることができる。
シグナルはシステムコールsignal()で捕捉できるが、古いので新しいプログラムではsigaction()を使う。
システムコールは、基本的にopen(), close(), write(), read()で行う。
しかしながら、バッファリングを行うstdioのライブラリ関数を使った方が高速。この場合、fopen(), fclose(), fwrite(), fread()などが使えるほか、ほかにもたくさんのAPI関数がある。
システムコールは固定長の読み書きしかできないが、stdioは文字単位や行単位で入出力でき、フォーマット出力などの便利な機能がある。一文字だけ出力するにはputchar()、一文字だけ入力するにはgetchar()を使う。この二つの関数だけでもいろんなプログラムが書ける。
システムコールを使う場合、ファイルディスクリプタと呼ばれる整数値をストリームの識別に用いる。プロセスには、標準入力、標準出力、標準エラー出力のファイルディスクリプタが与えられるが、ファイルやソケットをオープンした場合にもファイルディスクリプタが与えられ、これに対してread()やwrite()することでストリームの読み書きが可能となる。
stdioでは、ファイルディスクリプタをFILEポインタというラッパーに格納する。FILEポインタにはバッファリングの情報や、ファイルのどの位置を今読んでいるかの情報などが格納されている。
単に入出力をするだけなら、fgets()やfputs()、あるいはprintf()などを使う。ファイルに書き込む時はfprintf()を、出力せずに文字列をフォーマットだけしたい場合はsprintf()を使う。また、テキスト処理をする場合、トークン解析などの理由で一文字だけ元に戻したいことがある。この時はungetc()を使う。
insmodで、カレントディレクトリにあるカーネルモジュールをロードできる。
insmod hello.ko
ロードされたモジュールはlsmodで確認できる。
モジュールをアンロードするにはrmmodを行う。
rmmod hello
また、「/lib/modules/`uname -r`」からドライバをロードするにはmodprobeコマンドを使う。
カーネルモジュールのロードの設定は、/etc/modules-load.d/*.confに記述する。オプションは、/etc/modprobe.d/*.confに記述する。
lddコマンドでいける。
ldd /bin/ls
lddコマンドは、バイナリが依存する共有ライブラリを表示するコマンド。これに対してldconfigは共有ライブラリのキャッシュを更新するコマンド。共有ライブラリの設定を変えた時はldconfigを実行する。
静的リンクのライブラリは、ビルド時にプログラムに物理的に結合される。動的リンクでは、別々のオブジェクトが作られ、実行時に動的リンクローダが結合する。基本的に、動的リンクを用いるのが一般的。
straceコマンドでいける。
基本は、
gcc -o test test.c
主なオプションは、
コンパイラは、字句解析と構文解析からパースツリー(トークンを葉とする構文の構造を表した木構造)を作り、最適化してアセンブリ言語コードを出力する。中間言語表現として3番地コード(3つの番地だけのコードに直す)が知られる。字句・構文解析にはyaccとlexを用いる場合が多い。新しい言語を作りたいのなら、RustのようにLLVMのバックエンドを用いてもいいだろう。
Makefileは
作成されるファイル : 依存ファイル 作成方法
と書く。 たとえば、
test : main.o test1.o test2.o gcc -o test main.o test1.o test2.o main.o : main.c gcc -c main.c test1.o : test1.c gcc -c test1.c test2.o : test2.c gcc -c test2.c
とすれば、main.cが変更されると以下だけを実行する。
gcc -c main.c gcc -o test main.o test1.o test2.o]]>
基本的に、ifconfig(IPアドレスなどネットワークの低水準の設定)、netstat(TCP/UDPパケットの統計表示)、route(ルーティングテーブルの設定)、top(タスクのモニタリング)、vmstat(仮想メモリの状況表示)、iostat(I/Oデバイスの状況表示)は覚えておこう。
ほかにもいろいろとあるからネットで検索してほしい。traceroute(接続経路を表示), nslookupとdig(名前解決), arp(IPアドレスとMACアドレスの対照表であるARPテーブルを表示。IPアドレスはパケットの送受信のアドレスだが、MACアドレスはそれぞれのハードウェアデバイス機器の識別番号)は覚えておいて損はない。
また、ifconfigは低レベルな設定ができるが、使いやすいもっと高レベルなツールやシステムが使われていることが多い。Red Hatならsysconfig、Debianならifupdown。ただし、最近はNetworkManagerを使うことがどちらのディストリビューションでも推奨されている。
ifconfigやnetstatは現在型遅れになりつつあり、今では新しいiproute2パッケージのipとかssコマンドを使えと言われ始めている。
また、ファイアーウォールについては基本的にiptablesを使う。ファイアーウォールでパケットフィルタリングをすることで、不正な通信をブロックできる。他にも、VPNというインターネット回線を使って仮想的な専用のネットワーク(たとえば社内の専用回線的なネットワーク)を作ることのできる技術もある。トンネリングという送信者と受信者をほかから見えないトンネルで繋ぐ技術もある。
またNFSを使うとネットワーク上のファイルシステムをローカルと同じようにマウントできる。
NFSはUNIX由来の技術だが、Windowsとmixされた環境で使う場合は、Windowsネットワークのフリーソフトウェア実装であるSambaを使うこともできる。たとえば、Windowsをプリンタサーバにして、Sambaで繋いだりできる。
また、NISを使うことで、ネットワークにつながった各コンピュータで認証情報(ログインユーザ名・パスワード)を共通化できる。UNIXの優れた点はこうしたネットワーク性にあると言われる。NFSとNISはSun Microsystemsによる技術。
ほかに、OpneLDAPを使うことで、ディレクトリと呼ばれるデータベースから、ネットワークに繋がったネットワーク機器やユーザー認証情報などに一元的にアクセスできる。
その他ネットワーク関係の技術としては、WebサーバのApache, Nginx(Apacheにはプロセス・スレッドが10,000を超すと不安定になるC10K問題があり、たくさんのスレッドを作成せずイベント駆動でやりとりするNginxが最近流行っている)や、ProFTPDやvsftpdなどのFTPサーバ、lftpなどのFTPクライアント、Windowsとファイルやプリンタを共有できるSamba、メール関係ソフトウェア(MTA・メールサーバ)のsendmail(設定ファイルの形式が超難解), qmail, postfix, eximなどがある。
また、Linuxでは仮想化システムのDockerを使うことができる。Linuxカーネル上で隔離された仮想化コンテナプロセスを起動することができる。Dockerでは、Linuxカーネルの基本的な設定を引き継ぎながら、プロセスとファイルシステムを隔離し、コンテナ上で実行できる。Docker Hubを使うことで、簡単にRailsサーバなどのコンテナイメージを導入・共有できる。また、Kubernetesを使うことで、ネットワークで繋がったクラスタ環境を一台のホストとして仮想化した上でDockerの仮想化システムを実現できる。使うのは簡単だが概念が難しい(ここまで書いていて意味が分からない人は多いかもしれない)が、実際の開発現場ではDockerは開発環境で本番環境を再現するために使う。RailsサーバとMySQLサーバのように、複数のコンテナを連携させるには、Dockerに加えてYAMLでコンテナの構成情報を記述するDocker Composeを使う。
サーバの管理にはSSHを用いてリモートから接続してコマンドを実行する。以前はtelnetやrloginだったが、これらはパスワードなども含めて平文で送受信するため、公開されたインターネットの普及した現在ではセキュアなシェルとしてSSHを用いる。できるだけパスワード認証を使わず、公開鍵暗号通信を用いること、root認証を許可しないこと、デフォルトのポートを変えることなどがSSHにおけるセキュリティ対策の基本。
サーバマシンでないならXのネットワーク透過を使うとか、GNOMEのCORBAとかD-Busとかの分散システムを使ってネットワーク上のシステムを構築することもできる。CORBAやD-Busは、インターフェース記述言語によって、ネットワーク・言語・プラットフォームの垣根を越えてコンポーネントが通信し合う「分散オブジェクト」と呼ばれる技術。MicrosoftのCOMを元にしている。このような分散システムにはほかにRPC(遠隔手続き呼び出し)やJavaのRMI/JavaBeans/EJBなどがある。
LinuxやFreeBSDなどのUNIXには、タスクがたくさんあって高負荷になってもきちんと動くという特徴がある。このため、クラスタだけではなく、中小から大企業まで、サーバーによく使われる。逆に、WindowsのようなGUIで仕事をするデスクトップOSには不向きである。UNIXはインフラとして使うサーバ、Windowsはゲームの延長線上の仕事をするマシンに使うといいだろう。
そもそも、インターネットはそれぞれのネットワークが家庭やISPのルータによってつながったもの。
それぞれのルータの接続情報を代表ルータが集約し、ルーティングテーブルという経路表を作り出し、その経路表を全ルータに送る。
パケットのIPアドレスがローカルの中であれば、そのコンピュータにパケットを送信する。外部のものであれば、ルータはどこに送れば宛先に近づけるかを知っているので、ネットワークの外部のルータにそのパケットを送る。
IPアドレスは、そのホストのインターネット上の住所(アドレス)で、パケットの送受信先である。このIPアドレスは、ネットワーク部とホスト部に分かれている。
たとえば、IPアドレスが192.168.0.2である時、これをビットにすると、
11000000 10101000 00000000 00000010
となる。
ネットワーク部とホスト部を識別するために、サブネットマスクを使う。サブネットマスクは、ネットワーク部を1とし、ホスト部を0にしたアドレスのこと。
よって、
11111111 11111111 11111111 00000000
であれば、サブネットマスクは255.255.255.0となる。
また、それぞれのホストのネットワークを共有してくれるアドレス(たとえばルータ)をゲートウェイと言う。
サブネットマスクだけではなく、ブロードキャストアドレスを指定することもある。ブロードキャストアドレスは、パケットをブロードキャストするためだけに存在する。これはネットワーク部と同じアドレスを持ち、ホスト部が1となるアドレスとなる。上記の例では、192.168.0.255となる。
最後に、名前解決がある。このようなビット数値によるアドレスは、機械にとっては理解しやすいが、人間にとっては理解しづらい。そのため、人間に分かりやすい名前(hogehoge.co.jpのような)をつける。ここで、hogehogeの部分をホスト名、co.jpの部分をドメインと呼び、ホスト名は自由につけられる。
名前解決をしてくれるのはDNSという仕組みを用いたネームサーバ。ルータが兼ねていることもあるが、そうでなければISPの指定するネームサーバのアドレスを指定する。ネームサーバは/etc/resolv.confに記述する。DNSを含めてあらゆる名前解決をするソフトウェアのことを「リゾルバ」と呼ぶ。
ルータを用いて家庭内ネットワークを構築する際、静的にIPアドレスを与える(たとえば192.168.0.11ならば11の部分を手動で決める)こともできるが、DHCPを用いれば動的に自動で与えることもできる。DHCPを用いる場合、ネットワーク設定にはDHCPを用いることを指定するだけでよく、管理は楽になるが、IPアドレスがたまに変化することがあり、サーバを公開する場合には向いていない。もし、DHCP環境でサーバを公開する場合、ダイナミックDNSという仕組みを使って、IPアドレスがもし変わった場合はそれを定期的にDNSサーバに通知することができる。
32ビットのIPアドレスが表せるIPv4に比べて、IPv6では128ビットのIPアドレスが表せる。IPv6では石ころにすらIPアドレスがふれるぐらい、多くのアドレスが有り余っているとされる。
Linuxはサーバやクラスタにおいてよく使われている。
クラスタについては、性能を重視するHPCクラスタと、信頼性を重視する可用性クラスタがある。Linuxで可用性クラスタをやりたいなら、Heartbeatやその後継のPacemakerが使える。
冗長化とは、サーバのデータ(特にデータベース)をコピーして、一部のデータが破損しても代わりが存在するように多重化すること。
フェイルオーバとは、サーバがダウンしても別のサーバが代わりのサーバを務めること。
ロードバランサとは、サーバの負荷を分散させるため、複数のサーバに処理を分担させる仮想的なサーバのこと。クライアントからの要求を仮想サーバに伝え、クライアントからはロードバランサがサーバであるかのように見える。LinuxではLVSなどのロードバランサ技術がある。
また、仮想サーバのリソースを管理する技術をワークロード管理と呼ぶ。主なワークロード管理ソフトウェア(ジョブスケジューラ)としてSlurmなどがある。
スループットは、単位時間あたりの処理数。これに対してレイテンシとよばれる実際の時間から応答時間を割り出す単位もある。
ネットワークは、大部分が円滑に動いていても、一番細くなっている部分が制限されていると、全体の速度が遅くなる。これをボトルネックと呼ぶ。
IBMのメインフレームのような大型コンピュータは、とても高い信頼性と性能を誇る反面、拡張性が低く、一度作ったシステムを拡張しようと思った時に巨額の追加資金がかかる。こうしたシステムを「中央集約型アーキテクチャ」と呼ぶ。
これに対して、俗に「オープン系」と呼ばれる、UNIXやC/C++/Javaのような「標準的OS・言語」を用いてクラスタを築く方法が増えている。こうしたシステムを「分散型アーキテクチャ」と呼ぶ。
最近は、クラウドと言って、ネットワーク上にコンピュータ資源が存在し、業者が管理する中でそうした「ネットワーク上のリソース」の上でシステムを築く手段も増えている。
だが、クラウドは手軽で安価な反面、物理マシンが自社内になく、管理もしづらいという欠点がある。クラウドに対してオンプレと呼ばれる、「自社内にシステムを構築し、自社で管理する」という方式もとられることが増えている。
最近のエンタープライズシステムは、Webクライアント、Webサーバ、APサーバ、DBサーバで構築されることが多い。これはWebブラウザを端末として使い、サーバを3段階構成にしたもので、LinuxであればApache, Java EE (WebならRuby on Rails), MySQLといった構成が多い。
RDBMSにおいて、SQLを用いたリレーションにより、テーブルを自動的に作成できる。テーブルの主キーは行を一意に特定するが、別のテーブルの主キーを含む列のことを外部キーと呼ぶ。たとえば、学部と名前、名前と電話番号の2つのテーブルがあった時、名前を外部キーとして2つのテーブルを結合し、学部、名前、電話番号のテーブルを自動的に作成する。これを結合と呼ぶ。結合はデータベース操作の基本である関係演算のひとつで、ほかに選択と射影がある。
実際には、同姓同名の場合があるため、名前は外部キーにはできない。同一の項目を入れられないように制約をかけることもできる。
また、テーブルの重複要素を排除し、正しい状態でテーブルを整理することを正規化と呼ぶ。テーブルには、エンティティとリレーションシップがあり、これをE-R図で表す。たとえば、1対1、1対多(ひとつのスレッドにたくさんのコメントがつくような場合)、多対1、多対多のリレーションシップがある。
このようなSQLによるデータベースは、プログラムの中ではデータ構造として格納・構築・参照・変更される。主なデータ構造に、配列(順番に要素を格納する)、連結リスト(要素とポインタを持ち、動的に変化させやすい)、ハッシュ(マップ、辞書、連想配列)、セット(集合)、検索テーブル、行列、スタック(最後に入れたものが最初に出てくる)、キュー(最初に入れたものが最初に出てくる)、ツリー(木構造、たとえば二分探索木などは既出の単語検索の効率化のために使われる)、そしてグラフ(ひとつひとつのノードがエッジと呼ばれる繋がりを表す線で繋がる)などがある。C言語の構造体を用いるときは、データのマッピングだけではなく、効率やパフォーマンスも考える必要がある。
C++のSTLやJavaでは、こうしたデータ構造をテンプレート(ジェネリクス)とともに使う。ArrayListなどのObject型とキャストを用いたプログラミングでは、もしStringを想定しておきながらIntegerが入った場合に、コンパイルエラーにならず、実行時に失敗する。JavaではすべてのクラスがObject型を継承しているため、Object型に頼るプログラミングもできるが推奨されない。このような場合はジェネリクスを使うこと。すべてをObject型として扱う時点で、静的型付け言語を使っている意味がそもそもない。
逆に、RubyやPythonでは動的型付け言語であるため、配列にはどんな要素もミックスして入れることができるし、「アヒルのように振る舞うものはアヒルである」とするダックタイピングもできるが、これは大規模な開発では推奨されたスタイルではない。JavaScriptなどはあえて静的型付けをすることができる言語であるTypeScriptがMicrosoftによって開発されており、JavaScript開発ではTypeScriptを使うことが推奨される場合もある。JavaScriptは「自分でオブジェクトを構築してそれを量産する」というプロトタイプベースのオブジェクト指向を用いているが、TypeScriptを用いることでクラスベースのオブジェクト指向ができる。JavaScriptではthis参照を使うことで委譲もできるが、TypeScriptではクラス継承やジェネリクスやインターフェース(要素となるすべてのメンバと型を指定する)、タプル型(配列のそれぞれの要素に型を指定する。データベースなどを扱う際に有用)や型エイリアス(型の別名。stringをHogeTypeなどとできる)なども用意されている。蛇足だが、JavaScriptで書かれたモジュールは、当然ながら型宣言がない。このようなモジュールをTypeScriptで使うために、型宣言ファイルと呼ばれるものが提供されており、C/C++のヘッダファイルとよく似ている。JavaScriptではDOMを用いてHTML文書の編集はできるが、ファイル処理APIは標準では存在しない。ファイル処理のAPIはサーバーサイド向けのJavaScript環境であるNode.jsで同期・非同期のものが提供されている。
オブジェクト指向において、オブジェクトとRDBMSのマッピングを行うことをO/Rマッピングと呼ぶ。また、オブジェクトをファイルに書き出すことをシリアライズと呼ぶ。データを永続化するための常套手段なので覚えておこう。
データベースは、並列で動かした時のデータの矛盾を無くすため、排他制御やロックを行い、トランザクションが失敗すればロールバックする。同様のことをプログラミング言語でやるならば、Mutexによるロックを使う。
長い間C/C++には標準のマルチスレッドがなかった。そのため、UNIXではpthreadと呼ばれるPOSIXプラットフォーム依存のマルチスレッドを行う。Javaでは標準的にスレッドの機能があり、ThreadクラスまたはRunnableインターフェースを用いることでマルチスレッドのプログラミングができる。Javaではsynchronizedブロック・関数を用いることで、ひとつのスレッドしかアクセスできない(要するにロック)ようにできる。また、Javaではスレッドの一時停止や中断(割り込み)、待機などの機能もあり、例外などの機能とともに使う。
よくある並列処理として、単にマルチスレッドでそれぞれのスレッドが働く場合、マスター・スレーブにより主従関係を用いて複雑な処理を行う場合がある。あるいは、UNIXのパイプのように次々に順番で処理を行うパイプラインモデルがある。
最近では、Promiseやasync/awaitを用いて、非同期処理を行う仕組みもJavaScriptなどに存在する。コールバック関数を使うことでも非同期処理は実現できるため、Windows APIやC#のWindows.Formsなどではコールバック関数を多用するが、用途を考えず多用しすぎると、ネストが深くなり見通しが悪くなる(コールバック地獄)に陥ることがある。JavaScriptではPromiseなどの仕組みを使うことで、基本的には非同期で実行しながら、「この処理が終わったらこの処理をしてね」ということを、resolveとreject、thenとcatchの仕組みで実行できる。async/awaitは同期処理を書く場合と同じようにPromiseの非同期処理を書く記述のスタイル。
高速かつ効率的なアプリケーションを開発するには、ボトルネックとなっている部分を調べること、キャッシュを行うこと、並列処理を行うこと、データ構造を変えること、データを圧縮することなどが言える。言語を単にPythonからC++にすることでも高速化はするが、アルゴリズム的な部分は変わらないため、アルゴリズム的な改良も必要となる。
最近は、Kubernetesを用いることによるマイクロサービスという仕組みが流行している。ひとつのJava EEアプリケーションサーバですべての機能をもたせるのでなく、コンテナごとに機能をもたせてKubernetesを用いてオーケストレーションする。ひとつのサービスがすべてを行うわけでないため、テストなどが容易となる。
UNIXではrootユーザのほかに一般ユーザが存在するが、rootユーザの絶大な特権を制限する方法がない。
また、ファイルやユーザごとにパーミッションをつけることはできるが、HTTPサーバプロセスなどの「プロセス」に直接アクセスを制限するルールを持たせることができない。
SELinuxでは、rootユーザに制限をかけられるほか、プロセスごとに権限のレベルを制限することができる。
mii-tool や ethtool を使ってください。
[root@localhost]# ethtool eth0
現在の状態を確認。
[root@localhost]# ethtool -s eth0 duplex full
注意: この手のツールは、モジュールにオプションを渡しているだけである。 そのオプションをカーネルが認識したかどうかは不明である。 ドライバによってはツールでの変更が出来ないものもある。 また、システムの再起動時には設定がクリアされるため 恒常的に変更したいのであれば、マニュアルファイルを読むべきである。
最近は(有線の)LAN 接続よりも、無線 LAN の導入に関心が集まっています。この問題が主因でクライアントのパソコンに Linux の導入をためらっている方もいるかも知れませんので、参考情報を載せておきます。(追加情報があれば、お願いします。)
orinoco_cs などで対応しているチップを採用した無線LANカードを入手するのが無難でしょう。例えば、次の無線LANカード製品は CentOS 3/4、Debian 3.1/4.0、Fedora Core 1、MEPIS、Mandriva、Red Hat Linux 9 を始めとした多くのディストリビューションで自動認識されるようです。
Buffalo: WLI-PCM-L11, WLI-PCM-L11G, WLI-PCM-L11GP (旧製品。ただし店舗によっては在庫がある模様、また探せば中古品が入手可能)
Vine Linux の場合も、上記 Buffalo (旧 Melco) のカードは使えますが、設定が多少ややこしいので詳しくは Vine Linux の該当項目を見てください。
最近のノートブックでは、無線LANカード(PCカード規格)専用の接続端子が標準でついていないケースが増えています。その場合は、USB 2.0 端子へ直接つなぐタイプの無線子機を検討しても良いでしょう。ただし対応可能な機種が限られるので、事前調査が必要です。
デスクトップ型PCでは、よく一般に売られているPCカード規格(PCMCIA)に対応した無線LANカードの利用は、専用の接続端子が標準でついていないためできない場合があります。 この場合の対処としては、次のような方法が考えられます。
この種の製品は、国内の主要メーカーから販売されているので、入手は容易です。Webブラウザから設定が可能な機種もあります。
現在発売されている製品の中に、メーカーで Linux をサポートしている製品は見当たらないようですが、OS の違いによる影響はあまり受けないので、動作する可能性が高いと考えられます。
(注1) メーカーによって、接続設定に独自の仕様があると利用できない場合があるので、導入する場合は同一メーカーのアクセスポイントを利用する方が安心できます。
(注2) イーサネット・コンバーターでは、Webブラウザからの設定が可能となっている機種があります。ただし、機種によっては、購入した直後の最初の接続設定を Windows パソコンから行うことになる場合があります。
この場合、OS が自動認識する可能性は低いと思われますので、追加設定が必要かも知れません。
pcmcia サービスが起動する前に network サービスが起動してしまい、PCMCIA のネットワークカードを見つけられないために起こることがあります。起動スクリプトの起動順を変えて対処します。
まず、普段使うランレベル(Red Hat系なら5、Debian系なら2)の rcディレクトリに移動します。例) cd /etc/rc.d/rc5.d/
次にそれぞれの起動の順番を変更します。頭の数字の順番に起動するので、pcmcia が network よりも先に起動するように数字を変えます。(root 権限が必要)
他の起動スクリプトとの兼ね合い上、なるべく早く起動するように network の数字は10前後にしておいたほうが無難です。
これで、次回起動時より、pcmcia(10) → network(11) の順番に起動するようになります。
[追加情報] 新しいノートPCは内蔵の無線LANを装備していますが、下記の情報が入手できればLinux(FedoraCore3で確認)で利用可能です。 % lspci | grep Atheros 02:02.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)
「ワイヤレス接続モニタ」という GNOME 付属のアクセサリーがあります。
デスクトップの下部に表示されるパネル上でマウスを右クリックし、 [パネルに追加] > [インターネット] > [ワイヤレス接続モニタ] を開くと、通知アイコンがパネルに追加されます。
Linux で Toshiba Tecra の内蔵無線LANを使う というページを参考にして、対応ドライバーを組み込み設定してください。
ping -b 192.168.0.255 や arp を使う。
適当なホスト名、ドメイン名をつけてやってください。example.com なんかは実際に使われないことになってるので、おすすめ。
インストール後にホスト名を変更したい場合は ITMedia のホスト名を変更したいを参照のこと。
最近のディストリビューションにはこの記事に出てくる linuxconf が収録されていない場合が多い。その場合は設定ファイルを直接編集。
/etc/services ファイルにあります。
root で以下のコマンドを実行すれば調べられます。
参考:
/etc/hosts ファイルに名前を書いておいてください。
192.168.0.2 hoge.hogehoge hoge 192.168.0.3 fuga.hogehoge fuga
Windows のほうの C:¥windows¥hosts (9x系列)、%Systemroot%¥system32¥drivers¥etc¥hosts (NT系列) を同じ書式のファイルを用意すると、どちらからでも逆引きできるよ。
host コマンドを使ってください。dig コマンドも使えます。
うまく行かない場合は /etc/resolv.conf ファイル や DNS の設定を確認してください。
/etc/resolv.conf に DNS サーバを指定していますか?
nameserver 123.456.789.101 nameserver 123.456.789.102
Ctrl+C で止めてください。あるいは -c オプションで回数を事前に指定 ($ ping -c 5 www.yahoo.co.jp など)。
traceroute www.yahoo.co.jp などとしてください。
dhclient コマンドを使います。
$ su # dhclient -r
でIPアドレスを解放し、つづいて再取得します。
# dhclient
アクセスの際に IPv6 で接続しようとするため、アドレス解決に時間がかかっていると考えられます。その結果、ページが表示されるまでの時間がかかり、ネットワーク環境が遅いと感じるのでしょう。
alias net-pf-10 off alias ipv6 offディストリビューションによっては、このファイルを新規に自分で作るので、同名ファイルがない場合があります。
/etc/modutils/aliases が存在している場合には、設定の変更はこのファイルより行います。 /etc/modutils/aliases の次の行のコメントを外します。
# alias net-pf-10 off # IPv6
変更後は次のようになります。
alias net-pf-10 off # IPv6
たとえ /etc/modules.conf と /etc/modprobe.d/aliases が存在しても、それらのファイルは変更せずそのままにしておきます。
net.ipv6.all.disable_ipv6=1
ifconfig コマンドでループパックデバイスを調べてください。
# ifconfig lo lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host ←この行があればIPV6が動作してます UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:46 errors:0 dropped:0 overruns:0 frame:0 TX packets:46 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3016 (3.0 KB) TX bytes:3016 (3.0 KB)
VMware上にインストールした時、DHCP で IPアドレスを取得する設定にしているとネットワークがリンクアップしていないため起動しません。
以下のファイルを編集します。
[追加]
check_link_down () { return 1; }
Vine Linux 3.0 の場合です。[アプリケーション] > [システム・ツール] > [ネットワークの管理] よりネットワークの設定を行えます。2.6 と比較して設定ツールは改善されたようですが、WEP KEY を有効にしている場合にはその設定項目が存在しないため自動接続ができず、設定が正常に完了できません。 そこで、 /etc/sysconfig/network-scripts/ifcfg-eth1 ファイルを適当なエディターで開くと、次のように(一例)記述されているでしょうから、
BOOTPROTO=dhcp ONBOOT=yes USERCTL=yes NAME="無線 LAN カード" DEVICE=eth0 ESSID=********** PEERDNS=yes
さらに次の一行を追加してください。これでたいていは接続できるようになるでしょう。
KEY=s:*************
rp-pppoe パッケージのバグです。
パッケージのインストール時に起動スクリプトの設定は行われるのに終了スクリプトの設定が行われないため、シャットダウンもしくはリブート時に正常に切断がされず、プロバイダ側が異常終了と判断して五分間ぐらい接続を停止するのが原因です。
以下の方法で解決します。
# /sbin/chkconfig --del adsl # /sbin/chkconfig --add adsl
このように一度スクリプトの設定を削除し、追加し直すことで終了時の設定が正常に設定し直されます。
無線LANカードをパソコンのPCカードスロットに差し込んだだけで直ぐに利用できる場合もありますが、カードの稼働ランプが点灯していなければ、無線LANの接続設定を実行する必要があります。
K アイコン(メインメニュー) > KNOPPIX > Network/Internet > ネットワークカードの設定 から接続設定を行ないます。この場合は、「DHCP のブロードキャストを使いますか?」という問いかけで「No」を選択し、ネットワークの各項目を再設定します。
出てくる入力フォームが分からない場合はWINDOWS(XP)で「ワイヤレスネットワークの表示」の「サポート」タブを確認する。
それぞれの問いかけにWINで確認した項目をそれぞれ入力する。
これで多分OK。
あとの不明な項目については「OK」で切り抜けると、自動設定が行なわれます。これで大抵は、ネットワークに接続可能となります。
はい。日付と時刻の調整という設定画面で、「ネットワークタイムプロトコルを有効にする」という項目にチェックを入れます。 Red Hat Linux 9 や Fedora Core ではあらかじめ登録された中から選択するだけですが、WBEL では空欄となっているので明示的に指定する必要があります。
ntp.ring.gr.jp (Ring Server Project の NTP サーバによる国内サービス)
time.nist.gov (National Institute of Standards and Technology- 米国標準技術局の運営)
これらはその一例です。
]]>PC の起動から常に実行状態でシステムに待機 (常駐) し、自動で定期的に処理を実行したり、サーバーとしてクライアントの要求に対してサービスを提供するためのプログラムの事です。
システムに必要のない余計なデーモンが起動していると
といったことがあるのでシステムに必要がないデーモンの起動は止めておきましょう。
デーモンの起動スクリプトは通常/etc/rc.dにありますが、特に理由がなければディストリビューション付属のツールを使って設定しましょう。
デーモンの起動設定は次のツールで行うことができます。
OS の起動・終了時に実行する処理を段階ごとに分類する仕組み。
SysV系UNIX互換のディストリビューション (Red Hat/Slackware系) での標準的なランレベルの設定は以下のとおり:
ランレベル | 説明 |
0 | 停止 |
1 | シングルユーザモード |
2 | マルチユーザモード(ネットワークなし) |
3 | マルチユーザモード(ネットワークあり) |
4 | 未使用 |
5 | マルチユーザモード(GUIログイン) |
6 | 再起動 |
Red Hat系では /usr/sbin/chkconfig --list と実行すれば設定が表示される。(*4)
ランレベルの配置は /etc/rc.d で決まっていて、起動・終了時に init が /etc/inittab の設定をみて実行します。
なので、普段使うランレベルを変更したい時は /etc/inittab を編集しましょう。
ディストリビューションによって /etc 直下にあったり /etc/rc.d にあったりという違いはあるものの、大まかに言えば
たとえば Apache を起動させたければ
/etc/rc.d/init.d/apache start
とか。stop と restart で停止/再起動。
夜中に勝手にハードディスクがガリガリガリガリ。うぉ、まさかクラッカーに乗っ取られたのか!?
大抵の場合、夜中に cron デーモン (特定の処理を定期的に実行するデーモン) によって locate コマンドのためのデータベースを更新する作業 (updatedb) が行われています。
停止するには root の crontab を編集して cron の設定を変更します。ただし、その時点から locate コマンドが新しいファイルを探せなくなってしまうので、locate を使う場合は手動で updatedb を実行しましょう。
/var/spool/cron/crontabs に ユーザ名.new というファイルが残っていませんか? 削除してから編集し直してみましょう。
inetdはスーパーサーバと呼ばれるソフトウェア。
デーモンは通常、それぞれ起動してポートへの接続を待機するが、あまり使われないデーモンだと、ポートの数だけ待機するのに無駄がある。
そのため、デーモンとして常にひとつだけ起動しておいて、ポートへの接続が来た段階で担当のデーモンを起動するスーパーサーバと呼ばれるデーモンが作られた。
ただし、httpdのようにたくさんのリクエストが来るデーモンの場合、inetdで管理するのは必ずしも適切ではない。あくまで、あまり使われないが常駐する必要のある雑多なデーモンのための仕組み。
この設定変更は、Mandriva コントロールセンターより行えます。具体的には、デスクトップのパネルメニューより [アプリケーション] > [システム] . [コンピューターを設定] > [システムサービス] より、任意のサービスを選択して変更ができます。
Mandriva Linux 10.1 Memo というサイトでは、サーバーの運用に関連した実用的な情報が公開されているので大変参考になるでしょう。
最近、マルチコアのCPUが普通になったため、並列処理のできないsysv initは時代遅れになった。
代わりに最近使われるのがsystemd。
systemdではシェルスクリプトではなくUnitと呼ばれる設定ファイルを記述し、並列処理ができるところではできる限り並列処理を行う。
なんだか、単なる並列のinitシステムではなく、新しいLinuxの管理ツールのデファクトスタンダードになりつつある。
それもそのはず、Linuxの開発者たちは「無意味なLinuxディストリビューション間の差異をなくす」ために、systemdを位置付けて開発している。
だが、複雑怪奇なsystemdは賛否両論を生んでおり、systemdを排除したDevuanのようなディストリビューションも開発されている。
たとえば、
systemctl start httpd.service
とすれば、httpdのサービスが起動する。
startのほか、restart(再起動), stop(停止), reload(設定の再読み込み), status(情報表示), show(情報表示2)などがある。また、enable, disableで自動起動を有効化・無効化できるほか、is-enabledで有効・無効の確認ができる。
システム標準のUnitファイルは/usr/lib/systemd/system/にあり、管理者による設定は/etc/systemd/system/にUnitファイルを置いて行う。
Unitファイルは、前後関係と依存関係によって成り立つ。前後関係があるUnitについてはその順序を守り、前後関係のないUnitについてはすべて並列で起動する。
また、udevのデフォルトの設定(ルール)は/usr/lib/udev/rules.dに、管理者によるルールは/etc/udev/rules.dにある。
]]>Linux のハードディスクのパーティションは、/ と swap 用に2つは必要。サイズは、/ 全体に 3GB 程度はあると良い。
後でディストリビューションを再インストールするなら /、/home、swap と分割しておくと、ホームディレクトリだけ保持した上でそれ以外の / にあるファイルだけ再インストールできる。
/usr、/usr/local、/var、/tmp なども場合によって分けておくと良いこともある。が、考えなしに分けすぎると後でどこかの容量が足りなくなったりするし、デスクトップ用途ではそれ以上はおすすめしない。
たいていの場合はインストーラーの自動設定で適当に切り分けできる。
パーティションの基本領域/拡張領域/論理領域とかいったことについては以下が詳しい。
パーティションが / の他に複数ある場合は、他のパーティションが / ディレクトリ以下にマウントされた状態で、それぞれのディレクトリにファイルができる。
自動じゃなくて手動で / と swap パーティションを作ってみる。
fdisk が使えれば、Ctrl+Alt+F2 キーでコンソールを表示したり、他の Linux から接続して、fdisk でパーティションを切ってもよし。
スワップ領域は、実際のメモリが一杯になったときにあまり使わないデータをメモリから移動して空きを作るのに使う、ハードディスク上の仮想メモリ領域。
スワップ領域のサイズは、以前は搭載メモリの 2 倍程度と言われていたが、256MB 以上のメモリ搭載が当たり前になった最近では、64MB ぐらい確保しておく程度でも実害は少ない模様。
ただし、64MB 以下の少なめのメモリを載せているマシンで運用しようと思うなら、128MB 程度は見積もっておいてもバチは当たらないかと。
同時にハードディスクの容量も大きくなってるので、標準設定で512MBとか確保するようなディストリビューションもある。
なお、パーティションとしては設定したくないという場合、普通のファイルをスワップ用とみなして設定することも可能。
不要になったらすぐに消去できる。
恒常的に必要なら /etc/fstab に swap としてマウントするように書いとこう。
現存するパーティションを縮めてインストール領域を確保することは危険なので普通はお勧めしない。とは言っても、Windows Vista には標準でパーティション設定ツールが付属しているので、比較的簡単に空き領域の作成が可能です。
[コンピュータの管理] > [記憶域] > [ディスクの管理] > [パーティションの圧縮] より、選択しているパーティションのサイズを小さくできます。圧縮することによって、未割り当ての領域を作成し、その領域から新しいパーティションを作成します。[Windows Vista] ドライブの圧縮方法 (ソニー製品情報 VAIOサポート) を参照してください。
どうしても切り直したければ、次のプログラムも使えます。
Linux 環境があれば以下。
その他
参考リンク
Windows 2000 / XP / Vista でハードディスクのドライブが C: と D: に 2 分割されている場合(メーカー製パソコンに多い仕様)では、通常 C: に Windows がインストールされていて、D: はデータ保存用の領域となってる。
この D: は簡単に未使用領域に変えられるので、これをインストール用のパーティションに利用するとお手軽。
具体的には、次のように操作する:
Windows 95, 98, ME の場合はこういう機能は使えないので Windows (MS-DOS) 上からの操作では fdisk を使うと便利。fdisk の操作は慣れが必要なので事前に関連サイトで調べること。
chrootは、ルートディレクトリを変更するコマンド。
たとえば、/mnt/redhatなどにRed Hatを導入している場合、/mnt/redhatにchrootすれば、PATHなども含めて/mnt/redhatがルートディレクトリになる。
これは環境を構築する時によくやる方法。chrootした後、すべてのバイナリファイルを導入し、設定をすべて記述したら、新しい環境を/としてマウントするようにfstabに記述して、最後に再起動する。
ディスククォータとは、各ユーザーに使用できるディスク容量の制限をかけること。
ディスククォータをかけるには、quotaパッケージをインストールし、edquotaコマンドで設定する。
]]>
Linuxでプログラムの動作を設定する方法には、コンパイル時にオプションを指定して設定する方法、設定ファイルで実行時に動作を変える方法の2種類が存在する。
前者の場合、設定しなおすにはプログラムの再コンパイルが必要だが、後者の場合は同じプログラムを実行し直す度に(場合によっては実行中に)動作する内容を変更することが可能。
主に、単純なコマンド系プログラムでは前者の方式だけ、シェルやネットワークみたいなシステム系の設定では前者に加えて後者の方式が取られる(というか、用意されてないと使いづらくてしょうがない)。ファイルになってるのは、単純で柔軟性があるという理由だけなので、ユーザーにやさしいフロントエンド系のプログラム(Perlとかの言語で書かれたようなやつ)を使ってファイルを間接的に操作してもOK(*5)。
このページでは、後者の設定ファイルを使ったプログラムとシステムの設定について書いてます。
参考:Understanding Linux configuration files
マシンへのアクセスを制御する設定ファイル。
ファイル名 | コメント | Manページ |
/etc/host.conf | IPアドレスの名前解決方法の設定(今は殆ど使われてない) | host.conf.5 |
/etc/nsswich.conf | 名前解決等の手段を設定 | |
/etc/hosts | IPアドレスとホスト名の対応付け | hosts.5 |
/etc/hosts.allow | アクセス許可設定 | hosts_access.5 |
/etc/hosts.deny | アクセス拒否設定 | hosts_access.5 |
ブート・ログイン時の処理を決定する設定ファイル。
ファイル名 | コメント | Manページ |
/etc/issue, issue.net | ログイン前に表示される注意書き | issue.5, issue.net.5 |
/etc/rc.d/rc | ||
/etc/rc.d/rc.local | ローカル用の起動設定 | |
/etc/rc.d/rc.sysinit | システム用の起動時初期化設定 | |
/etc/rc.d/rcX.d | ブートアップ時・終了時に実行するスクリプトを入れるディレクトリ、ランレベル別 |
ファイルシステム関連の設定ファイル。
ファイル名 | コメント | Manページ |
/etc/mtab | 現在マウントされているファイルシステムの情報 | |
/etc/fstab | マウントするファイルシステムの情報 | fstab.5 |
/etc/mtools.conf | DOS用ユーティリティ向け設定 |
システム管理者向けの設定ファイル。
ファイル名 | コメント | Manページ |
/etc/group | グループ設定 | group.5 |
/etc/nologin | root以外のログインの禁止を示すファイル | nologin.5 |
/etc/passwd | ユーザアカウント情報の設定ファイル | passwd.5 |
/etc/rpmrc | RPMコマンドの設定 | |
/etc/securetty | rootがログインできる端末の設定 | securetty.5 |
/etc/usertty | ||
/etc/shadow | 暗号化パスワード | shadow.5 |
/etc/shells | シェルとして認識されている物の一覧 | shells.5 |
/etc/motd | ログイン後に表示されるお知らせ | motd.5 |
ネットワーク関係の設定ファイル。
ファイル名 | コメント | Manページ |
/etc/gated.conf | ||
/etc/gated.version | ||
/etc/gateway | ||
/etc/protocols | プロトコル定義。変更禁止 | protocols.5 |
/etc/resolv.conf | ネームサーバーなどの設定 | resolv.conf.5 |
/etc/rpc | RPC向けデーターベース。NFS用 | rpc.5 |
/etc/exports | エキスポートされるファイルシステム。NFS用 | exports.5 |
/etc/services | インターネットサービスリスト | services.5 |
/etc/inetd.conf | スーパーサーバ設定ファイル | |
/etc/sendmail.cf | Sendmailの設定(かなり古いバージョンです) | |
/etc/sysconfig/network | ”システムの”ネットワーク関連設定(Red Hat) | |
/etc/network/interfaces | ネットワーク設定(Debian) |
システム関係のコマンドの設定ファイル。
ファイル名 | コメント | Manページ |
/etc/logrotate.conf | ログのロテート(シフト)の設定 | |
/etc/identd.conf | ||
/etc/ld.so.conf | ダイナミックリンカーの設定 | |
/etc/inittab | ブートアップ時・終了時に実行する処理。UNIXで最初に読まれる設定です。 | inittab.5 |
/etc/termcap | 端末設定ファイル | termcap.5 |
デーモンの設定ファイル。
ファイル名 | コメント | Manページ |
/etc/syslog.conf | システムログデーモンの設定 | syslog.conf.5 |
/etc/httpd.conf | Apache HTTPサーバーデーモンの設定(旧バージョン) | |
/etc/modules.conf | 読み込むカーネルモジュールの設定ファイル | modules.conf.5 |
個別ユーザー向け、設定・初期化ファイル。
ファイル名 | コメント | Manページ | 書式 |
~/.bash_logout | ログアウト時に読み込むBashの後始末ファイル | Bashスクリプト | |
~/.bash_profile | ログイン時に読み込むBashの初期化ファイル | Bashスクリプト | |
~/.bash_history | Bash コマンドの履歴ファイル | Bashスクリプト | |
~/.bashrc | 起動時に読み込むBashの設定ファイル | Bashスクリプト |
システムのログは/var/log/syslogなどに出力される。ログを監視することをロギングと呼ぶ。 プロセスの稼働状況はtopコマンドなどで監視できる。システムの稼働状況を監視することをモニタリングと呼ぶ。
たとえば、ブート時にサービスが起動しなかったときは、まずログファイル/var/log/boot.logを見る。その後に、サービス名が分かったらsystemctl status [サービス名]のように実行して、エラーの詳細を見て解決すればよい。
また、ps axで実行中のプロセス一覧を表示できる。kill [PID]でプロセスの強制終了ができる。
cron(クーロンと読む)はデーモンのひとつで、決まった時間になった時に定期的にスクリプトを実行してくれる。
crontabという設定ファイル・コマンドを持つが、基本的にシステムの方でスクリプトを格納するための決められた場所(スクリプトを入れるべきディレクトリ)が用意されているので、その中に記述したスクリプトを放り込めばよい。
]]>