【Linux】体系的に学ぶ初学者用のお勉強

# この記事について
ウズウズカレッジ様の[YouTube【LinuC/LPIC合格講座】](https://www.youtube.com/watch?v=BX6v4-sf01s&list=PLXXalsdlzX-InzSH2uMWkoAdd1rE9p0O-)を参考にLinuxについてまとめたものです。
動画がとてもわかりやすいため、初心者の方は是非動画を見ることをお勧めいたします。

# 目次
- [Linuxの誕生](#-Linuxの誕生)
- [主なディストリビューション](#-主なディストリビューション)
- [CUIとGUI](#-CUIとGUI)
- [Linuxの起動の流れ](#-Linuxの起動の流れ)
- [SSH](#-SSH)
- [KVM仮想マシン](#-KVM仮想マシン)
- [docker](#-docker)
- [ブートプロセス](#-ブートプロセス)
- [プロセス](#-プロセス)
- [ジョブ](#-ジョブ)
- [デスクトップ環境](#-デスクトップ環境)
- [終わりに](#-終わりに)


# Linuxの誕生
Linuxが誕生したのは1991年。
フィンランドの大学生が作った無料のオープンソース。

### Linuxのメリット・デメリット

★メリット
・ほとんど無料。
・スペックが低いコンピュータでも動く。
・業務のための環境（サーバなど）を構築するためのソフトウェアが多い。
・目的に応じたカスタマイズの自由度が高い。

★デメリット
・WondowsやMacで使えていたアプリケーションが使えないこともある（ExcelやWordなど）。
・基本的にサポートが充実していない。
・WindowsやMacに比べて用語や操作法が直感的ではない。

# 主なディストリビューション
★Red Hat系
・RHEL・・・有料/サポートが充実している。
・CentOS・・・無料で利用できるが、商用サポートは充実していない。

★Debian（デビアン）系
・ubuntu・・・初心者用。WindowsやMacと操作感が近い。ubuntuソフトウェアセンターで様々なフリーソフトを簡単に導入できる。

# CUIとGUI
★CUI(Character-based User Interface)
コマンドを入力して操作すること。
パソコンの性能が低くても快適に動作する。
様々なコマンドを覚える必要がある。

★GUI（Graphical User Interface)
・キーボードだけでなく、マウスでも操作できる。
・絵やアイコンも表示される。
・学習しなくても直感的に操作できる。
・CUIに比べて高い性能が必要になる。

# Linuxの起動の流れ
電源入る
↓
BIOS/UEFIが起動
・ハードウェアをチェック
・ブートローダを実行しOSを起動
↓
Linux(OS)が起動
・ユーザー選択
・パスワードを入力

### CUI環境でのログインの方法
loginとpasswordを入力
↓
以上

### CUI環境のシャットダウンのコマンド
★前提として
Linuxは、マルチユーザー（複数のユーザー）で使っている場合が多いため、シャットダウンは滅多にしない。
基本的にはRootユーザーのみができる。

★ Debian系のコマンド
````
$ sudo shutdown -h now
　　　root権限を得て　システムを終了して！　電源オフ！　今すぐ！
````
★RHEL系のコマンド
````
$ su -　　　　　　　　　　　　　　　　　　　　　　　　　　　　rootユーザーに代わって
# shutdown -h now　　　　　　システムを終了して！　電源オフ！　今すぐ！
````
※ #はrootユーザーになっているよ、という意味

### shutdownコマンドのオプション
下記のオプションを組み合わせてコマンドを打つことができる。
````
-h, -p, --poweroff　　　・・・　システムを終了して電源を切る。
-H, --halt　　　　　　　　　　　　　　　　　　　・・・　システムを終了させる。
-r, --reboot　　　　　　　　　　　　　　　・・・　システムを終了して再起動する。
-k　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・・・　システムを終了せずに、メッセージだけ送る。
-c　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・・・　システム終了をキャンセルする
--no-wall　　　　　　　　　　　　　　　　　　　　　・・・　シャットダウンやキャンセルの時にメッセージを表示しない
````
例:　5分後にシャットダウンすることをメッセージで通知し、5分後にシステムを終了し電源を切る。
````
# shutdown -h +5 "shutdown in 5 minutes"
システムを終了して電源を切れ。　5分後に。　””の中身はメッセージ。
````

# SSH
SSH（Secure Shell)とは、ネットワークに接続された機器の通信を暗号化することで安全にする”仕組み”。
主にOpenSSHというソフトウェアを使って通信が行われる。

＜認証するための方法＞
★パスワード認証方式（人間が管理するので危ない）
・あらかじめ設定したパスワードを入力して接続
・安全性が低い（パスワード流出のリスクあり）
・設定が簡単

★公開鍵認証方式（一般的にはこちらを使う）
・公開鍵ファイル（文字の羅列）を用いて接続
・安全性が高い
・設定が難しい

### 公開鍵認証方式について
★前提として
SSHクライアント側（秘密鍵・公開鍵を持っている）
↓
SSHサーバ（クライアント側から公開鍵を事前にもらっておく）

★通信開始するとき
①SSHクライアント　→ 「ログインしたい！」　→ SSHサーバ
②SSHクライアント　←　「公開鍵で作った暗号化を送信」　← SSHサーバ
③SSHクライアント　→ 「秘密鍵で復号化した内容を送信」　→ SSHサーバ
④SSHクライアント　⇄ 暗号化された通信を開始　⇄ SSHサーバ

渡した公開鍵を持っていることがわかれば、正しい接続先だ！と認識する。＝　これを「ホスト認証」と呼ぶ。

### SSHに関係するファイル（クライアント側）
★SSHに関係するファイル名
````
ssh_config　　・・・　クライアント側のSSHの設定
id_rsa　　　　　　　　　　・・・　SSHの秘密鍵
id_rsa.pub　　・・・　SSHの公開鍵
known_hosts・・・　接続先サーバーの情報や送られてきたホスト認証のための公開鍵
````
★ディレクトリ
ユーザー別にホームディレクトリ直下の「.ssh」ディレクトリに保存される
例）/home/tanamoru/.ssh/ssh_congif　　※こちらが優先
例）/etc/ssh/ssh_config

### SSHに関するファイル（ホスト側）
````
sshd_config　　　　　　　　　　　　　　　　　　　・・・　ホスト側のSSHの設定
ssh_host_rsa_key　　　　　　　　　・・・　SSHのホスト側の秘密鍵
ssh_host_rsa_key.pub　・・・　SSHのホスト側の公開鍵
authorized_keys　　　　　　　　　　　・・・　クライアント（ユーザー）によって登録された公開鍵のリスト
````
★ディレクトリ
基本的に「etc」ディレクトリの直下「ssh」ディレクトリに保存される。
「authorized_keys」のみ、ホームディレクトリ直下の「.ssh」ディレクトリに保存される。
例）etc/ssh/sshd_config
例）/home/tanamoru/authorized_keys

### 公開鍵と秘密鍵のペアを作成のコマンド
```
$ ssh-keygen　　　　　　　　　　・・・　公開鍵と秘密鍵を作成して！
```

### 公開鍵をリモートホストに登録
```
$ ssh-copy-id testuser@testhost　　　・・・　ssh-copy-id 接続先アカウント名@接続先ホスト名IPアドレス
```
登録するためにはパスワード方式などの他の認証が有効である必要がある。
公開鍵はサーバ側の「~/.ssh」ディレクトリの「authorized_keys」ファイルに書き込まれる。

### SSHでリモートホストにログイン
````
$ ssh testuser@testhost　　　　　　　　　　　　　・・・　ssh 接続先アカウント@接続先ホスト名IPアドレス
````

### SSHリモートホストからログアウト
````
$ logout
$ exit
Ctrl + D
````
# 仮想マシンとは
実際のコンピュータ上に構築された仮想的なコンピュータ。
Windowsが入ったコンピュータの中に、Linuxが入ったコンピュータを作ることができる。
ホストOS型と、ハイパーバイザー型がある。

★メリット
・複数のサーバを一台で作れる。
・何台もサーバを用意する必要がない。
・様々な環境を手軽に導入できる。

★デメリット
    ・本来のコンピュータ自体の性能を活かせない。
・物理環境の不具合の影響が大きくなる。

### ハイパーバイザー型
・Linuxで用いられる仮想化の手段。
・CPUに仮想化支援機能が搭載されている必要がある。
・効率的に仮想マシンを稼働させることができる。
![content1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/3bfa5a34-49c7-386b-52d7-2e82af1600fa.png)

### ホストOS型
・仮想化ソフトをインストールすることで構築できる。
・Windows機やMac機に手軽に仮想環境を導入できる。
・コンピュータの性能を活かし切れない。
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/67fecb6c-011a-ed6d-40aa-2ba5515385f0.png)

# KVM仮想マシン
KVM仮想マシン＝「Kernel-based Virtual Machine」
・Linuxカーネルに標準で組み込まれている仮想化システム
・ハイパーバイザー型
・CPUが対応しているか確認する必要がある

★CPUがKVMに対応しているか調べるコマンド
````
$ lscpu | grep Virtualization
 Virtualization:     VT-x　　　（・・・あるいは「AMD-V」と表示されていればOK）

もしくは
$ grep -E 'vmx | svm' /proc/cpuinfo
 flags　　：　　　　　　　　大量の文字列が出てくる
````

### KVM仮想マシンの基本操作
virsh（バーシュ）コマンドを使用する。
virsh＝バーチャルシェルという意味

```
virshコマンド一例

★導入している仮想マシンの一覧を表示
#　virsh list --all　

★仮想マシンを実行する
# virsh start centos-vm

★仮想マシンを停止する
# virsh shutdown centos-vm
```

### virshコマンドのオプション
```
create 　　　・・・　xmlファイルから仮想マシンを作成
start　　　　　　　・・・　仮想マシンを起動
resume　　　　　・・・　仮想マシンを再開
shutdown　・・・　仮想マシンを正常に終了
destroy　　　・・・　仮想マシンを強制終了
suspend　　　・・・　仮想マシンを一時停止
reboot　　　　　・・・　仮想マシンを再起動
console　　　・・・　仮想マシンのコンソールに接続
dumpxml　　　・・・　仮想マシンの設定をxmlファイルで出力
list　　　　　　　　　・・・　稼働中の仮想マシンの一覧を表示
```

### libvirt(ライブバート)
・仮想マシンの管理を便利にするためのソフトウェアの集まり。
・「library + virtualization」を組み合わせて「libvirt」。
・様々な仮想化に対応している。
・Cライブラリを中心に構成している。

簡単にいうと、
「仮想化の手段(KVMやXen等)が色々あっても、オレ(libvirt)が間に入ってその違いを全部まとめて吸収しちゃうぜ！」です。
アプリケーションさんからすると、libvirtさんを見ればいいだけなので、とてもありがたいこと。

![800px-Libvirt_support.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/229e1298-41ef-a1c3-c1f2-a73181cfb0c6.png)

# docker
打表的なコンテナ管理をするソフトウェア。
アイコンはこちら。dockerをまずはインストールして使用する。
![docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2273453/44b722f5-8b25-0669-4843-9d9bd8dfe434.png)

### Dockerhubとは
様々なDockerイメージがWeb上に保存され、公開されている。
※「dockerレジストリ」・・・dockerイメージのストア。

### Dockerイメージを取得し、起動する
```
①Dockerイメージをダウンロードする
# docker pull centos:8
「pull」はイメージを取得する。「centos:8」はバージョン。

②Dockerイメージからコンテナを作成し、起動する
# docker run centos:8
「run」はコンテナを作成し起動する。centos:8のイメージを元にして。

③Dockerイメージからコンテナを名前つけて起動し、操作する。
# docker run -it --name centOStest centos:8 /bin/bash
「run -it」は作成して起動して入力する。
「--name centOStest」つけたい名前を入れる。
「centos:8」のイメージを元にして。
「/bin/bash」bashを使って。
```

### イメージやコンテナを確認する
```
コンテナを表示する
# docker ps -a
「ps」コンテナの一覧を表示する
「-a」終了したものも含めて全て

イメージを表示する
# docker images
「images」イメージの一覧を表示
```
### dockerのサブコマンド
```
pull　　　　　　　　・・・　Dockerハブからイメージをダウンロード
push　　　　　　　　・・・　Dockerハブにイメージをアップロード
run　　　　　　　　　　・・・　新しいコンテナを作成して実行
ps　　　　　　　　　　　　・・・　コンテナの一覧を表示
images　　　　・・・　Dockerイメージの一覧を表示
rm　　　　　　　　　　　　・・・　コンテナを削除
start　　　　　　・・・　作成済みのコンテナを起動
stop　　　　　　　　・・・　コンテナを停止
kill　　　　　　　　・・・　コンテナを強制終了
attach　　　　・・・　コンテナに接続して操作
exec　　　　　　　　・・・　コンテナでコマンドを実行
Cntr + P(Q)　・・・　コンテナに接続にしている状態から一時的に抜ける
```

# ブートプロセス
Linuxが起動するまでの流れのことを、ブートプロセスという。

①電源が入る
②BIOS(UEFI)が起動
　・ハードウェアのチェックや初期化
　・起動デバイスに書き込まれたブートローダを読み出す
　・ブートローダが起動デバイスからカーネルをメモリに読み込む
③Linux起動
　・メモリや初期化やシステムクロックの設定
　・仮のルートファイルシステムをマウント
　・初期RAMディスクに組み込まれたデバイスドライバを使ってデバイスにアクセス
　・init(古)かsystemd(新)でプロセスを実行
　　→起動に必要なものを順次起動していく。全ての起動処理を完了させ、ログインする画面を表示させる。

### systemd
Linuxの起動処理やシステム管理を行う仕組み。

★Unit（ユニット）　　　・・・　systemdの処理単位（設定ファイル）
設定ファイルが一つずつ分かれているの変更が簡単に行える。

　【ユニットの種類】
　・ターゲット：〜.target
　・サービス：〜.service　

★様々なターゲット
ターゲットとは・・・systemdの処理単位であるUnitをまとめたもの。
|ターゲット|説明|
|:---|:---|
|multi-user.target|CUIログインを行う|
|graphical.target|グラフィカルなログインを行う|
|poweroff.target|システムを終了する|
|rescue.target|シングルユーザーモード|
|reboot.target|システムを再起動する|

※シングルユーザーモードは、他の人が入って来れない状態にすること。

### ターゲットを管理する
```
現在のデフォルトの設定を調べる
$ systemdctl get-default

システム起動時のデフォルトターゲットを変更する
# systemdctl set-default ターゲット名

ターゲットを実行する
# systemctl isolate ターゲット名
```

### systemctlのサブコマンド
```
isolate　　　　　　　　　・・・　他のUnitを停止して、指定したUnitを起動する
status　　　　　　　　　　　・・・　サービスの状態を表示する
is-active　　　　　・・・　サービスが稼働しているかを表示する
disable　　　　　　　　　・・・　サービスの自動起動を無効にする
enable　　　　　　　　　　　・・・　サービスの自動起動を有効にする
start　　　　　　　　　　　　　・・・　サービスを起動する
stop　　　　　　　　　　　　　　　・・・　サービスを停止する
set-default　・・・　次に起動した時のターゲットを設定する
get-default　・・・　次に起動した時のターゲットを表示する
reboot　　　　　　　　　　　・・・　システムを再起動する
poweroff　　　　　　　・・・　システムを終了して電源を切る
```

# プロセス
Linux上で実行中のプログラムのこと。
プロセスは「ps」コマンドなどで確認する。
プロセスは「kill」コマンドなど終了する。

★マルチタスク　・・・　複数のプロセスを同時に稼働できるシステム
★デーモン（守護神）　・・・　一定の条件に従い、バックグランドで実行される常駐プロセス。普段動いていないけど常に待機している。

### プロセスを確認する「ps」コマンドのオプション
```
a　　　・・・　ユーザーが実行した全ての
f　　　・・・　プロセスの親子関係をツリー状で表示する
u　　　・・・　ユーザー名も表示する
x　　　・・・　ユーザーが制御していないサービス（デーモン）などのプロセスを表示する
-e　・・・　全てのプロセスを表示する
-f　・・・　起動時間なども含めた詳細な情報（完全なフォーマット）を表示する
-l　・・・　詳細情報を表示する

（例）
$ps ax　　　　・・・　デーモンも含めて、全てのプロセスを表示する
```

### コマンドで表示されるもの
|PID|TTY|STAT|TIME|COMMAND|
|:--|:--|:--|:--|:--|
|プロセスを識別するための番号（プロセスID）|端末の名前|プロセスの状態|プロセスが実行された総時間|プロセスの実行名|

### psコマンド以外のプロセスを確認するコマンド
★topコマンド
topコマンドはプロセス一覧をリアルタイムで監視する。
CPU利用時間が長い順から上から並んでいる。
システム稼働状況だけを見たい場合は「uptime」コマンドを実行する。
Qで終了する。

★pgrepコマンド
特定のPIDを調べたいときに実行する。
```
オプション
-l　　　・・・　PIDに加えてプロセス名も表示する
-U　　　・・・　指定したユーザーが実行しているプロセスを表示する
```

★pstree
あるプロセス（親プロセス）が新たなプロセス（子プロセス）を実行することがあり、そのプロセスの親子関係を表示できる

### プロセスの終了「kill」コマンドのシグナル名、シグナルID
```
-1(-HUP)　　　　　　・・・　端末切断による終了・再起動
-2(-INT)　　　　　　・・・　キーボードによる割り込みで終了
-9(-KILL)　　　　・・・　強制終了
-15(-TEAM)　　・・・　通常の終了
-18(-CONT)　　・・・　一時停止中のプロセスを再開
-19(-STOP)　　・・・　一時停止
-20(-TSTP)　　・・・　キーボードによる割り込みで一時停止

※kill -lで上記が出てくる。
```

### プロセスを終了するためのkill以外のコマンド

★killall　・・・　killコマンドと同様。完全一致の引数（プロセス名）を指定すると全て終了させる。
例）killall sleep　　とした場合、「sleap」状態のものを全て終了できるという意味になる。

★pkill　　・・・　引数を含むものを全て削除する。
例）pkill slee　　とした場合、「slee」が含まれている引数（プロセス名）を指定すると全て終了させる。

# ジョブ
シェル単位で管理されているコンピュータが実行している処理のこと。コンピュータに実行させる処理のまとまり。
フォアグランドジョブ・・・終了するまでシェルを操作できない。
バックグランドジョブ・・・裏で実行されているためシェルの操作ができる
　→コマンドの後ろの「＆」をつけてバックグラウンドジョブにできる（例：sleep 120 &)

例：「cal」コマンドを実行　　＝　「cal」ジョブが実行される。
通常、ジョブが終了するまで他の作業ができない。

### すでに実行中のジョブをバックグランドで実行させたい場合
①Ctrl + Z　キーでジョブを一時停止（サスペンド）させる。
②jobsコマンドで実行中のジョブを表示させ、ジョブ番号を調べる。
```
(例）
$ jobs　　　　・・・　実行中のジョブを表示する
[1]+ Stopped     sleep 60　　　　・・・　停止中だよ
```
③「bg %ジョブ番号」コマンドを入力
```
$ bg %1 　　　　・・・　指定したジョブ番号１をバックグラウンド実行にする
```
※フォアグランドジョブにしたい場合は「fg %ジョブ番号」

# デスクトップ環境
★「X Windows System」とは
Linux上でGUI環境を実現しているシステムのこと。
外観は複数のソフトウェアが力を合わせて実現している。

★xクライアント
入力情報が欲しい・出力したい側、ディスプレイに表示してほしいアプリケーション。
xクライアントがxサーバーにディスプレイへの表示をお願いしている感じ。

★xサーバー
入出力装置を管理している。
入出力装置の一例　・・・　マウス、キーボード、ディスプレイなどのデバイス。
ウインドウマネージャ・・・X Windows Systemの外観を制御するソフトウェア。

※Linuxは基本的にCUI環境！
GUI環境を使いたい場合は、特別な仕組み→「X Windows System」などが必要になる。
X Windows Systemを実現するためには、「X.Org Server」というソフトウェアが必要になる。

### 代表的なウインドウマネージャ
|名前|説明|
|:--|:--|
|twm|最小限の機能を持つ基本的なウィンドウマネージャ|
|mwm|スタンドアローン（単独で機能する）ウィンドウマネージャ|
|fvwm|立体的なウィンドウ表示を行うウィンドウマネージャ|
|Englishtenment|幅広いカスタマイズが可能なウィンドウマネージャ|
|kWin|KDEの標準ウィンドウマネージャ|
|Metacity|GNOME２の標準ウィンドウマネージャ|
|Mutter|GNOME3の標準ウィンドウマネージャ|
|WindowMaker|標準的な高機能ウィンドウマネージャ|

### 統合デスクトップ環境
ウィンドウマネージャや様々なアプリケーションをまとめ、統一されたデスクトップの見た目や使い勝手を提供するソフトウェア。

||KDE Plasma|GNOME|Xfce|
|:--|:--|:--|:--|
|テキストエディタ|KEdit|gedit|Mousepad|
|端末|Konsole|GNOME端末|xfce4端末|
|ファイルマネージャ|Dolphin|Nautilus|Thunar|
|ウィンドウマネージャ|KWin|Mutter|xfwm4|
|ディスプレイマネージャ|SDDM|GDM|XFCE|

※ディスプレイマネージャ　・・・　GUI環境で（ログイン画面を表示し）ユーザー認証を行うソフトウェア。

### X Window Systemを起動する
```
X Window Systemの起動コマンド
$ startx

systemdが採用されていたら・・・
# systemctl isolate graphical.target
（ターゲットを実行して！という意味）
```

### SSHを利用したX Window Systemの準備
①リモートホスト側（サービスを提供する側）の「/etc/ssh/sshd_config」に下記記述。
「X11Forwarding yes」

②設定を有効にするためにリモートホスト側（サービスを提供する側）でSSHサーバーを再起動。
```
# systemctl restart ssh.service
systemdについて、SSHサーバーを再起動して！
```
③ローカルホスト側（サービスを利用したい側）からリモートホスト側にSSHで接続する。
```
# ssh -X ユーザー@リモートホスト側
```

④DISPLAY環境変数を確認する。
```
$ echo $DISPLAY
ディスプレイ環境変数を表示する。
[ホスト名かIPアドレス]:ディスプレイ番号.スクリーン番号
```
⑤リモートホスト側（xクライアント）がローカルホスト側（xサーバー）に利用資格があるか確認する。
```
$ xauth list
Xサーバー接続の資格情報について表示して
```
⑥リモートホストにログインした状態でコマンドを実行する
```
$ xeyse &
xeyseをバックグラウンドで表示する
```
※xeyseはとあるアプリケーション

# 終わりに
普段パソコンがどのように動いているかを理解できた気がします。
ウズウズカレッジさんのYouTubeは初心者向けで本当にわかりやすいので、すんなり入ってきますね。
あとはPing-tで問題を解きまくることでもっと理解が深まるはずです！