4.3 レッスン 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
4 Linuxオペレーティングシステム |
Objective: |
4.3 データの格納先 |
Lesson: |
1 of 2 |
はじめに
オペレーティングシステムにとって、すべてはデータとみなされます。Linuxでは、すべてはファイルに関連付けられます: プログラム、普通のファイル、ディレクトリ、ブロックデバイス(ハードディスクなど)、キャラクタデバイス(コンソールなど)、カーネルプロセス、ソケット、パーティション、リンク、などなど。Linuxの ルート ( /
)から始まるディレクトリ構造は、データを含むファイルのコレクションです。すべてがファイルに関連付けられていることは、Linuxの大変に強力な機能であり、システムのさまざまな側面を微調整することができます。
このレッスンでは、 Linux Filesystem Hierarchy Standard (FHS) (Linuxファイルシステム階層標準)で確立された、重要なデータを保存するための位置(ディレクトリ)について説明します。これらの位置の中には、物理ディスク上に永続的にデータをストアする本当のディレクトリもありますし、メモリにロードされる仮想的なファイルシステムで、実行中のプロセスやメモリの用途、ハードウェアの設定といったカーネルサブシステムのデータへのアクセスを可能にするものもあります。仮想ディレクトリにストアされたデータは、それらを監視ないし操作するコマンドで使用されます。
プログラムと設定ファイル
Linuxシステムにおける重要なデータと言えば、間違いなくプログラムと設定ファイルです。前者はプロセッサで実行される一連の命令を格納した実行可能ファイルで、後者はプログラムの動作を制御するためのテキスト文書であることが普通です。実行可能ファイルは、バイナリファイルのことも、テキストファイルのこともあります。Linuxでは伝統的に、設定データもテキストファイルにストアされますが、設定データの表現にはさまざまなスタイルがあります。
バイナリファイルがストアされる位置
他のあらゆるファイルと同様に、実行ファイルは /
の下にぶら下がったディレクトリ内に置かれます。具体的には、プログラムは3層の構造に分散されています: 第1層( /
)の直下にはシングルユーザーモードで必要になるプログラムが含まれ、第2層( /usr
)の直下にはマルチユーザーモードで使用するプログラムの大部分が含まれ、第3層( /usr/local
)の直下にはディストリビューションには含まれず、自前でコンパイルしたソフトウェアが含まれます。
プログラムを置く位置には、次のものがあります:
/sbin
-
システム管理に不可欠なバイナリを含みます。
parted
やip
など。 /bin
-
すべてのユーザーに不可欠なバイナリを含みます。
ls
、mv
、mkdir
など。 /usr/sbin
-
システム管理に使用するバイナリを含みます。
deluser
やgroupadd
など。 /usr/bin
-
すべてのユーザーが使用できるほとんどの実行ファイルを含みます。
free
、pstree
、sudo
、man
など。 /usr/local/sbin
-
システム管理のためにローカルにインストールした、パッケージマネージャで管理されていないプログラムを置くために使用します。
/usr/local/bin
-
/usr/local/sbin
とほぼ同じですが、通常ユーザー用のプログラムを置きます。
近年、いくつかのディストリビューションでは、/bin
と /sbin
を、/usr/bin
と /usr/sbin
へのシンボリックリンクに置き換え始めました。
Note
|
サードパーティ製のアプリケーションを置くために、 |
これらのでディレクトリとは別に、一般ユーザーは自分のプログラムを以下のいずれかのディレクトリに置くことができます:
-
/home/$USER/bin
-
/home/$USER/.local/bin
Tip
|
|
プログラムのある場所を、which
コマンドで調べることができます。
$ which git /usr/bin/git
設定ファイルがある位置
/etc
ディレクトリ
初期のUnixでは、データの種類ごとにディレクトリがありました。バイナリ用の /bin
やカーネル用の /boot
などです。/etc
(エトセトラの意)は、他のカテゴリに属さないあらゆるファイルを引き受けるものとして作成されました。それらのファイルの多くは設定ファイルでした。時が経つにつれて、設定ファイルが次から次に /etc
ディレクトリに追加されたため、/etc
はプログラムの設定ファイルのためのメインフォルダーになりました。前述のように、設定ファイルはそのマシンのみで使用される(バイナリとは対照的な)プレーンテキストファイルで、プログラムの動作を制御します。
/etc
では、いくつかのパターンの設定ファイル名が使われています。
-
サフィックスが無いか、場当たり的なサフィックを持つもの
group
-
システムのグループデータベース
hostname
-
コンピュータのホスト名
hosts
-
ホスト名とIPアドレスの対応表
passwd
-
システムのユーザーデータベース。コロンで区切られた7つのフィールドから成りユーザーの情報を保持します
profile
-
システム全体でのBashの設定ファイル
shadow
-
暗号化されたユーザーのパスワード
-
サフィックスが
rc
である初期化ファイルbash.bashrc
-
対話用のBashシェルが読み込む、システム全体での
.bashrc
ファイル。 nanorc
-
GNU nano(どのディストリビューションにも含まれる簡単なテキストエディタ)の初期化ファイルのサンプル
-
サフィックスが
.conf
であるファイルresolv.conf
-
リゾルバの設定ファイル。インターネットのDNS(Domain Name System)へのアクセス方法を保持します
sysctl.conf
-
カーネルのシステム変数を設定するファイル
-
サフィックスが
.d
であるディレクトリ固有の設定ファイル(
*.conf
など)を持つプログラムの中には、専用のディレクトリ*.d
を持ち、モジュール化された堅牢な設定を行えるように発展したものがあります。例えば logrotate では、logrotate.conf
と共にlogrotate.d
ディレクトリで設定を行います。このアプローチは、複数のアプリケーションがあるひとつのサービスを設定する場合に便利です。例えば、Webサーバーパッケージに logrotateの設定が含まれている場合、その設定を
logrotate.d
ディレクトリ内の専用のファイルに置くことができます。Webサーバーパッケージは、他のlogrotateの設定に影響を及ぼすことなく、そのファイルを更新することができます。同様に、/etc/crontab
を変更する代わりに/etc/cron.d
にファイルを置くことで、パッケージは所定のタスクを追加することができます。Debianとその派生物では、パッケージ管理ツールである
apt
が信頼できる情報源のリストを読み取る際にも同様のアプローチを取っています: すなわち、従来の/etc/apt/sources.list
に加えて、/etc/apt/sources.list.d
ディレクトリを使用しています。$ ls /etc/apt/sources* /etc/apt/sources.list /etc/apt/sources.list.d:
ホーム
ディレクトリの設定ファイル(ドットファイル)
ユーザーレベルでは、プログラムはその構成と設定を、ユーザーのホームディレクトリ( ~
で示します)内の隠しファイルにストアします。隠しファイルは、ドット( .
)で始まること(そのため ドットファイル と呼ばれます)を思い出しましょう。
これらのドットファイルのいくつかはユーザーのシェルセッションをカスタマイズする Bashスクリプトで、ユーザーがシステムにログインしたときに読み込まれます。
.bash_history
-
コマンドラインの履歴(ヒストリー)がストアされます
.bash_logout
-
ログインシェルを終了するときに実行するコマンドが含まれます
.bashrc
-
ログインシェルではない場合の、Bashの初期化スクリプトです
.profile
-
ログインシェルの場合の、Bashの初期化スクリプトです
Note
|
Bashとその初期化ファイルについては “コマンドラインの基本” を参照して下さい。 |
他にも、プログラム開始時にそのプログラムによって読み込まれるユーザー固有の設定ファイルムがいくつもあります: .gitconfig
、.emacs.d
、.ssh
など
Linuxカーネル
何らかのプロセスを実行する前に、カーネルをメモリの保護領域にロードする必要があります。その後に、PIDが 1
のプロセス(最近では systemd
のことが多い)がプロセスの連鎖に着火します。つまり、1つのプロセスが、他のプロセスを開始します。プロセスがアクティブになると、Linuxカーネルがそれらに資源(キーボード、マウス、ディスク、メモリ、ネットワークインターフェイスなど)の割り当てを行います。
Note
|
|
カーネルが保存される /boot
カーネルは、他のブート関連ファイルと共に /boot
に置かれています。これらのファイルのほとんどは、ファイル名にカーネルのバージョン番号(カーネルバージョン、メジャーバージョン、マイナーバージョン、パッチ番号)を含んでいます。
/boot
ディレクトリには、以下の種類のファイルが含まれています。それぞれに、カーネルバージョンに応じたファイル名が付けられています:
config-4.9.0-9-amd64
-
カーネルの構成設定。オプションやカーネルと共にコンパイルされたモジュールなど。
initrd.img-4.9.0-9-amd64
-
初期RAMディスクのイメージ。起動プロセスにおいて、一時的にメモリにロードされるルートファイルシステムです。
System-map-4.9.0-9-amd64
-
System-map
ファイル(一部のシステムではSystem.map
)ファイルは、カーネルシンボルのアドレスを含みます。カーネルを再構築(リビルド)する度にメモリアドレスが変わるので、このファイルの内容も変更されます。このファイルは、特定のカーネルシンボルのメモリアドレスを調べたり、逆にアドレスからシンボルを探すために使用されます。 vmlinuz-4.9.0-9-amd64
-
自己解凍、省スペース、圧縮形式のカーネル。
vmlinux
のz
は圧縮形式を、vm
は仮想メモリをサポートしていることを示します(カーネルが初めて仮想メモリをサポートした頃からの慣習です)。 grub
-
grub2
ブートローダーの設定ディレクトリ。
Tip
|
オペレーティングシステムの中核であるため、 |
/proc
ディレクトリ
/proc
ディレクトリは仮想ファイルシステムのひとつで、内容がディスクに書き込まれるのではなくメモリ上に保持されます。システムが起動する度に動的に生成されて、システムの現在の状態を常に反映します。/proc
には以下の情報が含まれます:
-
実行中のプロセス
-
カーネルの設定
-
システムハードウェア
次のレッスンで見るプロセスに関するすべてのデータに加えて、システムのハードウェアとカーネルの構成設定に関する情報を含むファイルもこのディレクトリに置かれます。これらのファイルの一部は次のとおりです。
/proc/cpuinfo
-
これにはシステムのCPUに関する情報が含まれます。
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 model name : Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz stepping : 10 cpu MHz : 3696.000 cache size : 12288 KB (...)
/proc/cmdline
-
これにはブート時にカーネルに渡された文字列が含まれます。
$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet
/proc/modules
-
これにはカーネルに組み込まれたモジュールの一覧が含まれます。
$ cat /proc/modules nls_utf8 16384 1 - Live 0xffffffffc0644000 isofs 40960 1 - Live 0xffffffffc0635000 udf 90112 0 - Live 0xffffffffc061e000 crc_itu_t 16384 1 udf, Live 0xffffffffc04be000 fuse 98304 3 - Live 0xffffffffc0605000 vboxsf 45056 0 - Live 0xffffffffc05f9000 (O) joydev 20480 0 - Live 0xffffffffc056e000 vboxguest 327680 5 vboxsf, Live 0xffffffffc05a8000 (O) hid_generic 16384 0 - Live 0xffffffffc0569000 (...)
/proc/sys
ディレクトリ
このディレクトリには、カテゴリごとにサブディレクトリに分類されたファイルの仲に、カーネルの構成設定が含まれています。
$ ls /proc/sys abi debug dev fs kernel net user vm
これらのファイルのほとんどは、スイッチのように作用します。すなわち内容は、2つの値 0
か 1
( off
ないし on
)のいずれかです。
/proc/sys/net/ipv4/ip_forward
-
この値は、マシンがルーターとして機能するか否か(パケットを転送できるか)を示します。
$ cat /proc/sys/net/ipv4/ip_forward 0
次のような例外もあります:
/proc/sys/kernel/pid_max
-
PIDの最大値です。
$ cat /proc/sys/kernel/pid_max 32768
Warning
|
カーネル設定に不適当な値を設定するとシステムが不安定になるので、十分な注意が必要です。 |
ハードウェアデバイス
Linuxでは、“すべてがファイル” であることを忘れないで下さい。これはハードウェアのデバイス情報が、カーネル自体の設定と同様に、仮想ディレクトリ内のファイルに格納されることを意味します。
/dev
ディレクトリ
デバイスディレクトリ /dev
には、接続されたすべてのハードウェアデバイスのデバイスファイル(正確にはデバイスノード)が置かれます。これらのデバイスファイルは、デバイスとそれを使用するプロセス間のインターフェースとして使用されます。デバイスファイルは、次の2種類のカテゴリのいずれかに分類されます。
- ブロックデバイス
-
個別にアドレスを指定できるブロックを単位としてデータを読み書きするデバイスです。例えば、ハードディスク(および
/dev/sda1
のようなパーティション)、USBフラッシュデバイス、CD、DVD、などです。 - キャラクタデバイス
-
データを1文字ずつ順番に読み書きするデバイスです。例えば、キーボード、コンソール(
/dev/console
)、シリアルポート(/dev/ttyS0
)などです。
デバイスファイルを一覧表示するときは、比較のために必ず -l
スイッチを指定した ls
を使用します。たとえば、ハードディスクとパーティションを確認します:
# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 may 25 17:02 /dev/sda brw-rw---- 1 root disk 8, 1 may 25 17:02 /dev/sda1 brw-rw---- 1 root disk 8, 2 may 25 17:02 /dev/sda2 (...)
シリアルターミナル( TeleTYpewriter)の場合:
# ls -l /dev/tty* crw-rw-rw- 1 root tty 5, 0 may 25 17:26 /dev/tty crw--w---- 1 root tty 4, 0 may 25 17:26 /dev/tty0 crw--w---- 1 root tty 4, 1 may 25 17:26 /dev/tty1 (...)
先頭の文字が b
の場合はブロックデバイス、c
の場合はキャラクタデバイスです。
Tip
|
アスタリスク( |
さらに、/dev
には、プログラミング時に有用な特別な特殊ファイルもあります。
/dev/zero
-
要求された数のヌル文字を返します。
/dev/null
-
ビットバケツ
とも言います。書き込まれたすべての情報を破棄します。 /dev/urandom
-
疑似的な乱数を生成します。
/sys
ディレクトリ
sysファイルシステム ( sysfs
)は、/sys
にマウントされます。カーネル2.6で導入されて、/proc/sys
を大幅に改良したものです。
(一部の)プロセスは /dev/
にあるデバイスと対話する必要があるため、カーネルにはハードウェアデバイスに関する情報を保持するディレクトリが必要です。/sys
にはそれらのデータがカテゴリごとに整理されています。例えば、ネットワークカード( enp0s3
)のMACアドレスを調べるには、以下のファイルを cat
します。
$ cat /sys/class/net/enp0s3/address 08:00:27:02:b2:74
メモリとメモリの種類
基本的に、プログラムが実行を開始するには、メモリにロードされなくてはなりません。メモリと言うと、たいていの場合は RAM (Random Access Memory)を指し、(機械的なハードディスクに比べると)大変に高速です。逆に欠点は、揮発的である(つまり、コンピュータを停止するとデータが無くなってしまう)ことです。
前述にもかかわらず、Linuxには主に2種類のメモリ種別があります:
- 物理メモリ
-
RAM のことで、数100万のトランジスタとコンデンサから成る集積回路として提供されます。これらはメモリセル(コンピュータメモリの基本的な構成要素)を形成します。それぞれのセルは16進数のコード(メモリアドレス)と関連付けられて、必要に応じて(任意の位置を)参照できます。
- スワップ
-
スワップ空間 とも言います。ハードディスクを利用した仮想メモリの一部で、利用可能なRAMが無くなった時に使用されます。
アプリケーションからは、アドレス可能なメモリ(RAMとディスク上のスワップ)を合わせて抽象化した 仮想メモリ が見えることになります。
free
コマンドは /proc/meminfo
を解析して、システムの空きメモリと使用中のメモリを分かりやすく表示します。
$ free total used free shared buff/cache available Mem: 4050960 1474960 1482260 96900 1093740 2246372 Swap: 4192252 0 4192252
それぞれのカラムを説明しましょう:
total
-
搭載されている物理メモリとスワップ空間の合計容量。
used
-
現在使用中の物理メモリとスワップ空間の容量。
free
-
現在使用されていない物理メモリとスワップ空間の容量。
shared
-
ほとんどが
tmpfs
で利用されている物理メモリの容量。 buff/cache
-
カーネルのバッファやページキャッシュ、スラブに使用されている物理メモリの容量。
available
-
新しいプロセスが使用できる物理メモリの見積もり容量。
デフォルトでは、free
はキビバイト( KiB
)単位で値を表示しますが、オプションで単位を変更することができます。オプションには次のようなものがあります:
-b
-
バイト
-m
-
メビバイト(MiB)
-g
-
ギビバイト(GiB)
-h
-
人が読みやすいフォーマット
-h
はもっとも読みやすい表示となります。
$ free -h total used free shared buff/cache available Mem: 3,9G 1,4G 1,5G 75M 1,0G 2,2G Swap: 4,0G 0B 4,0G
Note
|
キロバイト(KB)が1000バイトであるのに対して、キビバイト(KiB)は1024バイトです。メビバイト(MiB)、ギビバイト(GiB)についても同様です。 |
演習
-
which
コマンドを使って以下のプログラムの位置を調べて、表を完成させて下さい:プログラム which
コマンド実行可能のパス(出力) root
権限が必要か?swapon
kill
cut
usermod
cron
ps
-
以下のファイルはどこで見つかりますか?
ファイル /etc
~
.bashrc
bash.bashrc
passwd
.profile
resolv.conf
sysctl.conf
-
/boot
にあるカーネルファイルvmlinuz-4.15.0-50-generic
における、数値の意味を説明して下さい。数値 意味 4
15
0
50
-
/dev
内のすべてのハードディスクとパーティションを一覧表示するコマンドは何ですか?
発展演習
-
ハードディスクのデバイスファイルは、それらが使用するコントローラに基づいて決まります。
/dev/sd*
は、SCSI(Small Computer System Interface)ないし SATA(Serial Advanced Technology Attachment)です。-
古い IDE(Integrated Drive Electronics)ドライブはどのように表示されていたでしょう?
-
近年の NVMe(Non-Volatile Memory Express)ドライブはどうなりますか?
-
-
/proc/meminfo
ファイルを参照して下さい。このファイルの内容と、free
コマンドの出力を比較して、/proc/meminfo
のどのキー(項目)がfree
の出力におけるフィールドに対応するか調べて下さい。free
の出力フィールド/proc/meminfo
のキーtotal
free
shared
buff/cache
available
まとめ
このレッスンでは、Linuxシステムにおけるプログラムや設定ファイルの位置について学びました。覚えるべき重要な事柄は以下の通りです:
-
基本的に、プログラムは3層のディレクトリ構造にあります:
/
、/usr
、/usr/local
です。階層のそれぞれに、bin
とsbin
ディレクトリがあります。 -
設定ファイルは、
/etc
と~
にあります。 -
ドット(
.
)から始まるドットファイルは、隠しファイルです。
Linuxカーネルの重要な特徴についても学びました。重要なものを示します:
-
Linuxでは、すべてはファイルに関連付けられます。
-
Linuxカーネルは、そのほかの起動に関係するファイルと共に
/boot
に置かれます。 -
プロセスを実行する前に、まずカーネルがメモリの保護領域にロードされます。
-
カーネルの仕事は、プロセスにシステム資源(リソース)を割り当てることです。
-
仮想(疑似)ファイルシステムである
/proc
には、カーネルやシステムの重要なデータを揮発性で格納します。
同様に、ハードウェアデバイスに関する以下の方法を学びました:
-
/dev
ディレクトリにはハードウェアデバイスに対応する特別なファイル(ノード)が置かれています: データをブロック単位で転送する ブロックデバイス と、1文字ずつ転送する キャラクタデバイス です。 -
/dev
ディレクトリには、/dev/zero
、/dev/null
、/dev/urandom
といった特別なファイルもあります。 -
/sys
ディレクトリには、ハードウェアデバイスに関する情報がカテゴリごとに整理されて格納されています。
最後に、メモリについて以下を学びました:
-
プログラムはメモリに読み込まれてから実行される。
-
RAM(Random Access Memory)とは何か。
-
スワップとは何か。
-
メモリの利用を表示する方法。
このレッスンで使用したコマンド:
cat
-
ファイルの内容を結合ないし表示します。
free
-
システムメモリの空き容量と使用中の容量を表示します。
ls
-
ディレクトリの内容を一覧表示します。
which
-
プログラムの位置を示します。
演習の解答
-
which
コマンドを使って以下のプログラムの位置を調べて、表を完成させて下さい:プログラム which
コマンド実行可能のパス(出力) root
権限が必要か?swapon
which swapon
/sbin/swapon
必要
kill
which kill
/bin/kill
不要
cut
which cut
/usr/bin/cut
不要
usermod
which usermod
/usr/sbin/usermod
必要
cron
which cron
/usr/sbin/cron
必要
ps
which ps
/bin/ps
不要
-
以下のファイルはどこで見つかりますか?
ファイル /etc
~
.bashrc
×
○
bash.bashrc
○
×
passwd
○
×
.profile
×
○
resolv.conf
○
×
sysctl.conf
○
×
-
/boot
にあるカーネルファイルvmlinuz-4.15.0-50-generic
における、数値の意味を説明して下さい。数値 意味 4
カーネルのバージョン
15
メジャーレビジョン
0
マイナーレビジョン
50
パッチ番号
-
/dev
内のすべてのハードディスクとパーティションを一覧表示するコマンドは何ですか?ls /dev/sd*
発展演習の解答
-
ハードディスクのデバイスファイルは、それらが使用するコントローラに基づいて決まります。
/dev/sd*
は、SCSI(Small Computer System Interface)ないし SATA(Serial Advanced Technology Attachment)です。-
古い IDE(Integrated Drive Electronics)ドライブはどのように表示されていたでしょう?
/dev/hd*
-
近年の NVMe(Non-Volatile Memory Express)ドライブはどうなりますか?
/dev/nvme*
-
-
/proc/meminfo
ファイルを参照して下さい。このファイルの内容と、free
コマンドの出力を比較して、/proc/meminfo
のどのキー(項目)がfree
の出力におけるフィールドに対応するか調べて下さい。free
の出力フィールド/proc/meminfo
のキーtotal
MemTotal
/SwapTotal
free
MemFree
/SwapFree
shared
Shmem
buff/cache
Buffers
、Cached
、SReclaimable
available
MemAvailable