Linuxに関すること
ここではLinux。主にDebianを使ううえで学んだことを記録しておく。
ディレクトリ構造について †
- /boot
- カーネルファイル
- /bin
- 汎用コマンド(一般ユーザからも使われる汎用的なプログラム)
- /sbin
- 管理者用コマンド(システム管理者しか使わないような運用系のプログラム)
- /usr
- システム以外のユーティリティやアプリケーション
/usr/bin アプリケーションによる汎用コマンド
/usr/sbin アプリケーションによる管理者用コマンド
/usr/share アーキテクチャに依存しないファイル(ドキュメントなど
/usr/include C言語用ヘッダファイル
/usr/local アプリケーションをソースからコンパイルして入れるなど、管理者が自由に使える領域
- /dev
- デバイスファイルを格納
UNIXでは、端末、磁気ディスク、プリンタなど、すべての装置を特殊なファイルとして扱い、通常これらのファイルは /devディレクトリで管理されます。
スペシャルファイルには次の2種類があります。
- キャラクタデバイスファイル
端末やプリンタなど文字単位で入出力を行う装置
- ブロックデバイスファイル
磁気ディスクなどブロック単位で入出力を行う装置
- /lib
- /usr/lib
- 複数のプログラムから共用されるライブラリ群。
Windows でいう dllファイル。linuxでは、拡張子 a や so が使われる。
例えばC言語で(gcc)コンパイルされたプログラムが使用する、printfなどは、
/usr/lib/libc.a というファイルの中に格納されています。
- /root
- rootのホームディレクトリ
- /home
- ユーザーのホームディレクトリ
ユーザー固有のソフトウエアの設定ファイルは、ここにドットファイルとして置かれる。
- /mnt
- デバイスのマウントポイント
- /var
- ログなどの頻繁に更新されるファイルの保管場所
/var/lock ロック・ファイル
/var/log ログ・ファイル
/var/spool/ プリンタのスプール
- /tmp
- 一時ファイル
- /proc
- プロセスやメモリなどのリソース関連情報を、あたかもファイルのように見せる擬似的なファイル・システム。
Linuxの標準仕様(LSB)には規程されていないが、RedHat?, Debianなど多くのディストリビューションで/procファイルシステムを備えている。
擬似的とはいえ、通常のファイルのようにアクセスできます。
CPU情報を表示
$cat /proc/cpuinfo
メモリ情報を表示
$cat /proc/meminfo
/proc の中には、数字だけのディレクトリがたくさん存在するが、これはプロセスID と対応している。そのディレクトリの中には プロセスの状態を示す statusや、実行パスを示す cmdlineなどの擬似ファイルが含まれます。
/proc/sys のシステムの動作速度に関する情報がファイルとして配置されています。ファイルの内容を書き換えることでカーネル内部の変数を変更できます。
パーミッションについて †
パーミッションはファイルやディレクトリにたいするアクセス権限フラグ。
例えばあるファイルを読むためには、ファイル自身の読み出し権限と、ファイルが属する
ディレクトリの実行権限が必要になる。
ファイル †
- 読み取り (r)
- ファイルの内容を表示できる
- 書き込み (w)
- ファイルの内容を変更できる
- 実行 (x)
- コマンド行のプロンプトにファイル名を入力して、ファイル (実行ファイルまたはスクリ
プト) を実行できる
ディレクトリ †
ディレクトリのパーミッションは、ディレクトリも1つのファイルで、そのディレクトリに含まれるファイルのリストがデータ内容だと思えば理解しやすい。
- 読み取り (r)
- そのディレクトリにあるファイルおよびディレクトリの名前を表示できる。ls等でファイルの一覧を閲覧するのに必要。
- 書き込み (w)
- そのディレクトリにあるファイルおよびディレクトリに対して、作成、名前の変更、または削除できる
- 実行 (x)
- そのディレクトリにあるファイル内容にアクセスする権限。ファイルの内容を表示したり、そのディレクトリにあるコマンド、スクリプト、プログラムを実行できる。cdでカレントディレクトリにするのに必要。
ファイルの関連付けについて †
Unixでは、Windowsのようにファイル名にファイルの種類を示す拡張子をつける必要はない。拡張子がついているファイルもあるが、これはあくまでも整理上の便宜であってシステム上意味はない。(Kernelは関知しない。)
Mac OSでは、同様に拡張子が必要なく、ファイルが個別にファイルの種類を保存している。(Macバイナリ?)、これは実データとは別に特別に保存される内容なので、他のOSにデータを渡したときには、ファイルの種類はわからなくなる。UNIXのファイルシステムには、そういった情報があるわけでもない。
Unix のファイルの種類は「バイトの列」という1種類だけである。つまり、拡張子がないかわりに、どこかにファイルの種類の情報を保存しているわけではく、そもそもファイルの種類を保存しておくという概念がないわけである。(正確には、OS 全体に適用される1貫したファイル判別手法は特にない。)
ただし、実行ファイルについては、パーミッションとして実行権限が設定できるので、事実上の実行ファイルの種類の保存ととることもできる。(実行属性のファイルの先頭に、実行形態を示すマジックナンバーというものをつける。#! スクリプト実行エンジンなど)
しかし、GNOME等のGUIにおいては、Windowsと同様にデータファイルを開くと自動で関連付けられたソフトウエアが実行される。この機能はファイルの種類がわからなければ実現できない。
そこで、ソフトウェアレベルで、ファイルの種類の自動判定を行っている。
例えば、GNOMEのファイルマネージャである Nautilus では、拡張子や、ファイル内容からファイルの種類(MIME type)を自動判別している。
(/usr/share/mime/packages/freedesktop.org.xml に、ファイルの種類判定の定義がある。)
もともと拡張子がなくてもいいという Unixの文化の都合上、拡張子が存在しないファイルでも、すぐに不明のファイルとせずに、内容から自動判定を試みるところが、Windowsと異なる点である。
ファイルの種類は、fileコマンドでも判別可能。
$ file filename