【ペチオブ】仮想環境ハンズオン 第1回 Linuxの基礎編

## ペチオブとは

https://phper-oop.connpass.com

隔週の木曜日に開催されているPHPエンジニア向けのコミュニティです。
(現在はオンラインのみで、YouTube撮影等の活動を行ってます)
PHPでお困りの方はお気軽にSlackにてご質問ください。(connpass内に招待リンクがあります)

今回の仮想環境ハンズオンは去年の2020年4月にオフラインのハンズオンイベントとして公開する予定でした。
しかし某コロナの影響で延期が続き、当イベントは没になる予定でしたが、主催の @hirodragon さんからせっかくだからYouTubeでオンラインで公開しよう！という話になり2020年12月から翌年2月にかけて動画撮影しました。

## 対象者、目的

プログラミング初心者、ウェブエンジニアに向けてVirtualBox, Vagrant, Docker, Docker Composeを使って同様の仮想環境を構築して、どういった違いがあるのかを体験してもらうためのハンズオン記事です。

環境構築を始めるにはLinuxの知識が必要不可欠です。
ということで今回はLinuxの基本を解説します。

## YouTube版 【ペチオブ】仮想環境ハンズオン 第1回 Linuxの基礎編

[![【ペチオブ】エンジニアのための仮想環境ハンズオン 第1回 Linuxの基礎編](http://img.youtube.com/vi/VMLpBad1U4g/0.jpg)](https://www.youtube.com/watch?v=VMLpBad1U4g)

※初めてのYouTubeで恥ずかしいので見なくても大丈夫です..。

## シリーズ記事

1. **Linux基礎編**
2. [VirtualBoxハンズオン](https://qiita.com/ucan-lab/items/d06f9ab9946598b53421)
3. [Vagrantハンズオン](https://qiita.com/ucan-lab/items/e14a26081229c8bef98a)
4. [Dockerハンズオン](https://qiita.com/ucan-lab/items/6e6a7d7d40c7287b6af9)
5. [Docker Composeハンズオン](https://qiita.com/ucan-lab/items/6809c83380af9afac216)

## OS とは

Operating System (オペレーティングシステム) の略。
システム全体を管理するソフトウェアのこと。

- 1960年代に誕生
- OSが通訳となりアプリケーションを実行
- メモリやCPUの違い等をOSが吸収してくれている
- Windows, macOS, UNIX, Linux ...

## Linux とは

![Tux](https://i.imgur.com/4cOoILx.png)

https://ja.wikipedia.org/wiki/Linux

- 1991年にリーナス・トーバルズが開発したOS
  - 「[ワタシハ リナックス チョットデキル](https://mohritaroh.hateblo.jp/entry/2019/08/18/164000)」の人
  - バージョン管理ソフト Git を開発した人
- UNIX互換OSの一つ
- 主にサーバー用途に使用される
- オープンソースのため無料で利用できる
  - 無料なのでサーバーとして用いられることが多い
- LinuxにはLinuxカーネルとLinuxディストリビューションの意味がある

![リーナス・トーバルズ](https://i.imgur.com/3WKVtax.jpg)

## Linux カーネル

https://ja.wikipedia.org/wiki/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB

OSの中核部分としてハードウェアとソフトウェアの仲立ちをしてくれます。
ハードウェアといえばCPU、メモリ、ハードディスク等がありますが、アプリケーションが直接操作するのではなく、カーネルを経由して操作します。

![Linux カーネル](https://i.imgur.com/kt2Rk0m.png)

### シェルとは

シェルはユーザーから入力されたコマンドを解釈し、それをカーネルに伝えます。
カーネルはシェルから伝達された要求に応えてプログラムの操作を行い、その結果をシェルに返します。

![](https://i.imgur.com/LBjenNg.png)

ユーザーがターミナルにコマンドを入力 => シェル => カーネル => シェル => ターミナルに実行結果を出力

## Linux ディストリビューション

https://ja.wikipedia.org/wiki/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

配布している企業や団体がたくさんあり、
それぞれがLinuxカーネルにソフトウェアを追加したり、独自の設定や構成で配布しています。
その配布形式のことをディストリビューションといいます。

Red Hat Enterprise Linux (RHEL), Debian, CentOS, Ubuntu...たくさん種類があります。

![Linux ディストリビューション](https://i.imgur.com/RAWvZQ8.png)
![Linux 派生図](https://i.imgur.com/YgoQZvQ.jpg)

すべては紹介しきれないので、特に使われるOSをピックアップして紹介します。

### RedHat

![RedHat](https://i.imgur.com/Ty7USSe.jpg)

- https://www.redhat.com/ja

商用として一番しっかりしていて、有名なLinuxOS
しかし、料金が高い。
しかもサーバーは普通のサービスでも最低で３台は必要なので結構な金額になる。

### Debian

![Debian](https://i.imgur.com/qlfFScM.png)

https://www.debian.or.jp

Linux界隈ではもっとも規模の大きいコミュニティがある。
商用ならRedHat。コミュニティなら 「Debian」 と言われている。
安定しており、堅実な作りをしている。

### Ubuntu

![Ubuntu](https://i.imgur.com/g8yvpNj.png)

https://www.ubuntulinux.jp

「Debian」ベースに作られたOS。無料。
Debian と比べて、先進的でリリースも早い。
Ubuntuは「誰にでも使いやすい最新かつ安定したOS」と掲げている
Linuxはもっと普通の人にも使えるものにできる、という思想が見えるのがUbuntu。実際とても使いやすくて、Windowsの代わりとして使えるようなOSになっている。

### CentOS

![CentOS](https://i.imgur.com/mRDodD6.jpg)

https://www.centos.org

RedHat をベースに作成されたOS。無料。
2019年にCentOS8が出て、徐々にCentOS7からCentOS8に移行され始めている。

CentOS7までパッケージ管理ツールが `yum` でしたが、
メンテナンス性が低かったり、Python2に依存していてPython3移行の妨げになっていたため `dnf` に変更となりました。
環境構築する際は古い記事を参照しないように注意が必要です。

CentOSは 「コミュニティによるエンタープライス級のOS」と掲げている
商用で使える圧倒的高品質のOSを目指すという意味。

<b>2021.03.04 追記</b>

[CentOS Project shifts focus to CentOS Stream](https://blog.centos.org/2020/12/future-is-centos-stream)

この記事を執筆した当初(2020.04)はCentOSが終了するとは夢にも思わず...
今後はUbuntuやDebianが主流になってくるのかなと思います。

また、CentOS終了に伴いRedHatの一部が無償化するらしいです。

- [CentOS終了に対する大ブーイングでRHELが一部無償になるらしい](https://qiita.com/yamada-hakase/items/9d03c156ceac31fde6c4)

### Alpine Linux

![Alpine Linux](https://i.imgur.com/ZPOL0Uc.png)

https://alpinelinux.org

組み込み系でよく使われているBusyBoxとmuslをベースにしたLinuxディストリビューション。
コンテナに必要なサイズは8MB以下であり、ディスクへの最小インストールは約130MBと非常に軽量なため、Dockerでも人気のOSです。

bashシェルも用意されていないため、Linuxに慣れていないと構築の難易度が上がります。

## 補足: Linux プロンプト

ターミナルにコマンドを入力する際、左側に表示されている文字を「プロンプト」と呼ばれます。

- prompt(促す)

```shell-session
vagrant@ubuntu-focal:~$ 
```

`ユーザー名@パソコン名:現在の作業ディレクトリ$` という情報を表示しています。
OSによって表示形式が異なることもありますが、プロンプトの表示形式は変更可能です。

また、root権限で実行されている場合、 `$` の部分が `#` と表示されます。
この場合は特に注意してコマンドを実行してください。

## Linux コマンド

[POSIX(Portable Operating System Interface for UNIX)](https://linuc.org/study/knowledge/402)という「UNIX系OSが備えるべき」とされる仕様の標準規格が定められています。

基本的なLinuxコマンドを覚えてしまえばすべてのUNIX互換OSで使えます。

|command|名称                                        |説明             |
|:----- |:---------------------------------------------|:----------------|
|man    |manual                                        |マニュアル         |
|echo   |                                              |文字列や数値、変数を表示 |
|cd     |change directory                              |ディレクトリ移動     |
|pwd    |print working directory                       |作業中ディレクトリ表示 |
|mkdir  |make directory                                |ディレクトリ作成     |
|ls     |list                                          |リスト             |
|cp     |copy                                          |コピー(複製)        |
|rm     |remove                                        |削除               |
|mv     |move                                          |移動               |
|chown  |change owner                                  |所有者情報を変更     |
|chmod  |change mode                                   |ファイルパーミッション変更|
|cat    |catenate / concatenate                        |ファイルの閲覧, 結合 |
|tail   |                                              |ファイルの末尾を表示する|
|vim    |                                              |Linuxエディタ      |
|find   |                                              |ファイルを検索      |
|grep   |globally search a regular expression and print|ファイル中の探したい文字を検索|
|sudo   |substitute user do, superuser do              |root権限で実行     |

### Linux コマンド リダイレクト

主に標準出力をファイルへ出力したいときに使用されます。

```shell-session
$ echo Hello $USER
Hello ucan
```

`echo` コマンドを実行すると文字列や環境変数が展開されて端末に表示されます。
これを端末ではなくファイルなどに出力したいときにリダイレクトします。

```shell-session
$ echo Hello $USER > test.txt
$ cat test.txt
```

`>` はファイルを上書きする

```shell-session
$ echo Goodbye >> test.txt
$ cat test.txt
```

`>>` はファイルに追記する

```shell-session
$ ls -l > test.txt
$ cat test.txt
```

`ls -l` の実行結果が `test.txt` へ上書きされて出力されています。

## Linux エディタ(vim)

```shell-session
$ vim ファイル名
```

- `vim sample.txt` でファイルを開けます。
- `i` で挿入モード(insert mode)になり、テキスト入力行えます。
- `Esc` でコマンドモードになります、困ったら `Esc` 連打する。
  - `:wq` で保存してvimから抜けます。
  - `:w` 保存します。
  - `:q!` 保存せず、強制的にvimから抜けます。

vim操作は覚えておいて損はないので、ぜひマスターしてみましょう！
[vim入門](https://dotinstall.com/lessons/basic_vim)

| コマンド | 説明 |
| --- | --- |
| i | 挿入モード |
| escキー | 挿入モード解除 |
| dd | 1行削除 |
| u | 直前の変更操作の取り消し |
| / | 検索 |
| 1G | 文頭へ |
| G | 文末へ |
| :q | 終了キー(保存せずに終了) |
| :q! | 終了キー(変更した行も保存せずに終了) |
| :w | 保存するが終了しない |
| :wq | 保存して終了 |

## Linux ディレクトリ構造

https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

| ディレクトリ | 説明 |
|-------------|----|
| / | ルートディレクトリ。全ての始まり。|
| /bin | cpやchmodなどのシステムを管理する上で基本コマンドが入っています。|
| /etc | システム全体に関わる設定ファイルが配置されます。|
| /home | 一般ユーザーのホームディレクトリ。通常ユーザーを追加するごとにユーザー名のディレクトリを追加します。 |
| /root | rootユーザーのホームディレクトリ。homeがセキュリティ上の脅威にさらされてもこちらは大丈夫。という保険のディレクトリです。 |
| /sbin | 再起動やファイルシステムの操作などシステム管理者用のコマンドが配置されています。/bin同様、新しいコマンドの追加や変更は推奨されません。shutdown、rebootなど |
| /tmp | 一時ファイル置場 |
| /usr | 各ユーザーが共通して利用するプログラム・ライブラリのデータ。ソースからコンパイルしたソフトなどはこちらにインストールされます。通常パッケージの追加するこのディレクトリにインストールされることが多い。etcに保存されている設定ファイルのシンボルリンクもこちらに貼られることが多い。 |
| /usr/bin | usr版のコマンドが保存されている。一般ユーザーの利用するコマンド。別名ユーザーコマンドの保存場所。プログラムのインストールによって追加する場合はこのディレクトリが適している。openssl、php、perlなど |
| /usr/local | システム管理者用のローカルファイル。管理者のみが利用するライブラリなどの追加に利用する。 |
| /usr/sbin | usr版管理者用コマンド。 |
| /var | 可変なファイル群。内容が常に変化するようなファイル群を格納する。例えば、ログ、スプール、一時的電子メールファイル |
| /var/log | システム管理者御用達ログファイルの保存場所。システム、メール、インターネットのアクセスログなど、あらゆるログが保存される。 |
| /var/www | Apacheのデフォルトデータ保存場所。インターネット関連のディレクトリはここに収めるのが一般的 |

## Linux パッケージ管理システム

パッケージとは、実行プログラム、設定ファイル、ドキュメントなどを1つのファイルにまとめたものです。
パッケージ管理システムは、パッケージのインストール、アンインストール、アップデート作業において、パッケージ間の依存関係や競合関係を管理する仕組みを提供しているツールです。

|ディストリビューション|コマンド|
|---|---|
|RedHat系|yum,dnf|
|Debian系|apt-get,apt|
|Mac|brew|

## サービス起動と終了

```shell-session
# /etc/init.d/サービス名 start
# /etc/init.d/サービス名 stop
```

or

```shell-session
# service サービス名 start
# service サービス名 stop
```

or

```shell-session
# systemctl start サービス名
# systemctl stop サービス名
```

OSによってサービスの起動方法が異なる場合がありますが、
この3つのいずれかの方法になります。

## ウェブシステムの構成

### 主なサーバー

- ウェブサーバー
  - Apache, nginx
- アプリケーションサーバー
  - php-fpm
  - Apache(mod_php)
- データベースサーバー
  - MySQL
  - MariaDB
  - PostgreSQL

よく使われるウェブ、アプリケーション、データベースの三層構造のサーバ構成です。

## 参考

- https://qiita.com/uguis410/items/17ec1e447e9716bfdca7
- http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2011/2011-05-06/
- https://orizuru.io/blog/os/shell
- https://dotinstall.com/lessons/basic_unix_v2