Linux の基本（初心者向け）

# はじめに
この記事はインフラ未経験者を読者として想定した記事で、インフラ入門レベルの内容となっている。

その中で以下の項目について簡潔に紹介する。
+ **Linux とは？**
+ **最も使われているディストリビューション**
+ **Fedora と RHEL と CentOS の関係**
+ **ディレクトリ**
+ **ユーザー**
+ **グループ**
+ **パーミッション**
+ **デーモン**

# Linux とは？
Linux とは、サーバや個人用のコンピュータで使われている、UNIX※1互換のOS※2である。

※1...1969年に米国 AT&T 研究所で開発された、マルチユーザー、マルチタスクの OS で、
　　Windows の前身でもある MS-DOS の元にもなった OS。
※2...パソコンの操作やアプリケーションなどを使うために必要なソフトウェア。

Linux はカーネル※3、ユーティリティ※4、アプリケーション等、一般ユーザーがコンピュータを活用するための機能をパッケージ化した「**Linux ディストリビューション**」という形で流通されている。

※3...狭義のOS。コンピュータとアプリケーションの間でリソースの管理や通信を仲介し、コンピュータの基本的な機能を提供するコア部分。
※4...規模が小さく、補助的で簡潔した機能を持つプログラム。

Linux ディストリビューションを作成・配布している個人や団体を「**Linux ディストリビュータ**」と言う。

# 最も使われているディストリビューション
直近5年の状況では、**Ubuntu** や **Debian** が増加しているものの、**RHEL(Red Hat Enterprise Linux)**※5 が最も多いディストリビューションである。

※5...Red Hat 社が提供している、企業向けの有償 Linux ディストリビューションでサポートが充実しているのが特徴。
　**CentOS** は RHEL をベースに作られており、無償で利用可能だが、CentOS 7 は2024年6月、CentOS 8 は2021年12月にサポート終了となっている。

# Fedora と RHEL と CentOS の関係
RHEL を提供するRed Hat 社は **Fedora Project** というコミュニティを支援している。
半年ごとにリリースされる Fedora で新機能を試しつつ、そのノウハウやナレッジを RHEL に反映している。
Red Hat 社はさらに**Cent OS Project** というコミュニティも支援しており、RHEL に随時反映している機能のうち、無償で提供可能な機能をCent OSにも反映していた。

補足だが、2019年にリリースされた**Cent OS Stream** は、従来の CentOS と比較して、RHEL の新しい機能や更新が最初に Cent OS Stream に統合されて、将来的にはそれが RHEL のメジャーリリースになるモデルが採用されている。
![スクリーンショット 2024-02-14 21.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/03b1407d-4794-d0c3-6dcb-4e97665cec06.png)

# ディレクトリ
Linux は自動的に生成されるディレクトリがあり、それらディレクトリに置かれるファイルはある程度決まっている。
例えば、RHEL をインストールすることでルートディレクトリ配下に以下のディレクトリが自動作成される。
ただし、ディストリビューションやバージョンによって異なる可能性がある点に留意する。
![スクリーンショット 2024-02-15 8.15.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/3fed4a41-6985-1074-73d9-d71dd5d5c1cb.png)

また、Linux のディレクトリは階層構造となっている。
前述の通り、ディレクトリ名はある程度決まっているが、同じ名称のディレクトリが異なる階層に置かれる場合もある。

例えば、バイナリファイルを格納する`bin`や`sbin`は、以下のようにいくつかの階層に置かれている。
![スクリーンショット 2024-02-16 10.15.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/d46e23be-5119-7566-abf8-7f30729b1a7c.png)

ちなみにOracle Linux 9 の場合、以下のように`bin`と`sbin`がそれぞれ`/usr/bin`と`/usr/sbin`にシンボリックリンク※6 化している。(2024年2月現在)
```
dr-xr-xr-x.   2 root root    6  1月 10  2022 afs
lrwxrwxrwx.   1 root root    7  1月 10  2022 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096  1月 31 14:09 boot
drwxr-xr-x   21 root root 3360  2月 16 10:12 dev
drwxr-xr-x. 120 root root 8192  2月 16 10:12 etc
drwxr-xr-x.   3 root root   17  2月 14 10:34 home
lrwxrwxrwx.   1 root root    7  1月 10  2022 lib -> usr/lib
lrwxrwxrwx.   1 root root    9  1月 10  2022 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6  1月 10  2022 media
drwxr-xr-x.   2 root root    6  1月 10  2022 mnt
drwxr-xr-x.   5 root root   78  1月 29 15:50 opt
dr-xr-xr-x  294 root root    0  2月 16 10:11 proc
dr-xr-x---.   6 root root 4096  2月 14 17:48 root
drwxr-xr-x   40 root root 1200  2月 16 10:12 run
lrwxrwxrwx.   1 root root    8  1月 10  2022 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6  1月 10  2022 srv
dr-xr-xr-x   13 root root    0  2月 16 10:11 sys
drwxrwxrwt.  12 root root 4096  2月 16 10:13 tmp
drwxr-xr-x.  12 root root  144  6月 21  2023 usr
drwxr-xr-x.  21 root root 4096  1月 24 13:46 var
```
※6...ファイルやディレクトリへの参照を示す特殊なファイルで、元のファイルやディレクトリへのショートカットとして使用される。

# ユーザー
Linux は複数の利用者が1つのシステムを共同利用することが前提として成り立っている。

そして、Linux はあらかじめ登録された利用者しか使うことができないようになっており、
その利用者のことを「**ユーザー**」 、Linux の利用開始時にユーザーの身元や妥当性を識別する操作を「**ログイン**」と言う。

Linux はユーザーを識別し、そのユーザーに許可されていること、許可されていないこと等をユーザー単位で管理する。
さらに、ログインしているユーザーを特定し、作業内容を記録したりもする。

また、Linux におけるユーザーは以下の種類に分けることができる。
| 種類 | 説明 |
|:-:|:-:|
| システム管理者  | システム管理する管理者。「**root**」というユーザー名で固定。  |
| 一般ユーザー  | システムを利用する利用者用のユーザー。任意で作成可能。  |
| システムアカウント  | Web、DNS、メールサーバといった各種サービスを運用するために使用するユーザー。  |

システム管理者と一般ユーザーは人間が使用するものであるが、システムアカウントは違っており、
システムアカウントは、Apache(Webサーバ)やBIND(DNSサーバ)といった特定のアプリケーション用に存在するユーザーである。

仮にシステムアカウントの所有権をシステム管理者に委譲した場合、全てのサービスがシステム管理者の制限下に置かれ、全ての動作が可能になってしまう。
もし、システム管理者が悪意のあるユーザーに乗っ取られた場合、アプリケーションの操作も全て可能となり、大きな障害が発生する可能性が高くなり、そのためシステム管理者とシステムアカウントは別ユーザーで実行する、という方式となっている。

# グループ
Linuxの利用はユーザー単位が基本だが、ファイルやディレクトリが増えてきた場合に管理が大変となる、といった問題点が発生する。
そこで複数のユーザーを「**グループ**」でまとめることにより、管理を容易に行うことができる。

ファイルやディレクトリのアクセス権(「**パーミッション**」)をグループに対して行えば、そのグループに属する全てのユーザーに適用される。

# パーミッション
ファイルやディレクトリには、**パーミッション** が設定されている。
パーミッションはどのユーザーに対してどのような操作をするのかという情報を指し、
+ **所有者**
+ **所有グループに属するユーザー**
+ **その他のユーザー**

に対して指定することができる。

またパーミッションには、以下の3種類から指定できる。
| 表記 | ファイル | ディレクトリ |
|:-:|:-:|:-:|
| r(**r**ead)  | ファイルの内容を読み出すことが可能で、変更は不可| ディレクトリ内のファイル一覧を表示することが可能  |
|  w(**w**rite) | ファイルの内容を変更したり、削除したりすることが可能  |  ディレクトリでファイルを作成したり、削除することが可能 |
|  x(e**x**ecute) | ファイルを実行することが可能  | ディレクトリ内のファイルにアクセスすることが可能  |

ファイルのパーミッションを確認する場合は`ls -l`コマンドを実行する。
```
$ ls -l
-rwxrw-r-- 1 testuser testgroup        0  2月 16 10:48 testfile
```

実行結果の左側にある`「-rwxrw-r--」`はそのファイルに付与されたファイルのパーミッションを示し、
左から所有者、所有グループに属するユーザー、その他のユーザーの並びとなっている。
上記の場合、
+ **所有者は全ての権限を実行可能**
+ **所有グループに属するユーザーはファイルを読み出したり、変更、削除が可能**
+ **その他ユーザーはファイルの読み出しのみ実行可能**

のパーミッションとなっている。

また、上記のコマンド実行結果に記載されている`testuser`は**所有者のユーザー名**、`testgroup`は**所有グループ**をぞれぞれ示す。

ちなみに、ディレクトリの場合はパーミッションの最初に**d**が含まれる。
(**「ディレクトリ階層」** で確認可能)

# デーモン
「**デーモン**」とは、サーバ機能など複数のユーザーに提供し続けるプログラムのことで、
基本的に Linux の起動時に実行され、そのままユーザにサービスを提供し続けるものである。

また、デーモンが提供し続ける機能のことを「**サービス**」と呼び、Linux のサーバ機能のほとんどがサービスという形で提供されている。
即ち、Linux に新しい機能を追加したいと思ったら、対象のデーモンを追加すれば良いということになる。

以下に主なサービス一覧を記載する。
ただし、ディストリビューションやバージョンによって異なる可能性がある点に留意する。
| サービス名 | 説明 |
|:-:|:-:|
| acpid、apmd  | ACPI※7 やAPM※8 のイベントに対応して動作するためのサービス  |
| anacron、atd、crond  | 定時作業を実行するためのサービス  |
| ip6tables、iptables、firewalld、nftables  | ファイアウォールを設定するサービス  |
| messagebus  | システムの変化をユーザーに通知するためのサービス  |
| network  | 起動時にネットワークの設定(固定 IP アドレスの設定)をするためのサービス  |
| smartd  | ハードディスクの異常を検知するサービス  |
| syslog  | システムログをファイルに保存するサービス  |
| yum-updated  | 自動アップデートを行うためのサービス  |
| cups  | プリントアウトのためのサービス  |
| sshd  | 別のコンピュータから安全にログインするためのサービス  |
| netfs  | 起動時にマウントするように設定されたネットワークファイルシステムをマウントするサービス  |
| restorecond、mcstrans  | SELinux※9 関連のサービス  |
| httpd  | Webサイトを提供するサービス  |
| bind  | DNSを提供するサービス  |
| vsftpd  | ファイルを転送するためのサービス  |
| postfix  | メールを転送するためのサービス  |

※7...Advanced Configuration and Power Interface の略で、パソコンと OS　が相互に通信し、電源管理やシステム構成の管理を行うオープンな標準規格。
※8...Advanced Power Management の略で、パソコンの電源管理を制御するための旧世代の規格で、省電力モードやスリープモードの実装を提供。
※9...Security-Enhanced Linux の略で、アクセス制御やプロセスの隔離を提供するセキュリティ拡張機能。
　SELinux を有効化した場合、パッケージのインストール行えなくなったり、プログラムが動かなくなる場合が多く、基本的には無効化している。

## 参考文献

https://www.amazon.co.jp/gp/product/B0CSX88WVT/ref=ppx_yo_dt_b_d_asin_title_351_o00?ie=UTF8&psc=1