Linux業務の新人が覚えるべき基礎知識

ここでは、私が新人としてLinux業務に携わった際に、
これどういう意味？なんでこの機能があるの？
と疑問に思った知識を載せています。

元々、私は電気工学科の大学生でありまして、大学院でも火力発電機の高効率化についての研究をしていました。
そのため、情報系の知識はほぼ0 (大学の15コマ分の授業でC++とか2進数やった程度）でした。
その状態からLinux業務に携わった経験を元に書いているので、
情報系の学生などは「何当たり前なこと書いてるんだ？」となるかもしれません。

しかし、全くの情報系でない方がLinuxのような情報系の分野に手を出す際には、役に立つページだと思います。

# 技術用語
### OS (Operating System) とディストリビューションの違い
1. OS
コンピュータの基本的な動作 (I/Oやプロセス管理など) の制御を行っているソフトウェア。
OSの1つであるLinuxは、OSのコアであるカーネルのみのことを指す。
カーネルのみでは、ドライバーやUI (User Interface)、アプリケーションソフトは含まれない。
そのため、Linuxのみの利用は困難。

2. ディストリビューション
その他周辺のソフトウェアを組み合わせて、OSとして利用できるようにまとめたもの。
LinuxはオープンソースのOSであり、Linuxのコアの部分であるKernelのみのOSでは使いづらい。
そこで、多くの組織や個人が様々なソフトウェアを組み合わせて、元のLinux OSをアレンジした。
そのアレンジしたものがLinuxディストリビューションとして提供されている。
Linuxディストリビューションは無償のものや有償のものがあったりする。
:bulb: **ex** 無償: CentOS, 有償: Red Hat Enterprise Linux (RHELと略すことがある)

[Linuxディストリビューション色々](https://eng-entrance.com/linux_beginner_distribution)
[Linux Distributions Timeline](https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg)

### RTC (Real Time Clock) / UTC (Universal Time Coordinated) / JST (Japan Standard Time)
1. RTC
コンピュータに内蔵された時計機能。
2. UTC
協定世界時。つまり、世界共通の標準時刻のこと。
3. JST
日本標準時のこと。

これは主に、ログの参照の際に用いられる。
例えば、あるソフトAがインストールできなかったとする。原因特定のために、 /var/log/messages を参照。
エラー箇所を検索するために、インストール時刻で検索。
このときに、時刻設定をどのタイムゾーンにするかで、検索時刻が変わってくる。
ここで、RTCは時計であり、UTC・JSTはタイムゾーンである。
普通に考えれば、エラーの起こった現在時刻、つまり、日本ならばJSTに時刻を設定してたほうがエラー箇所を発見しやすい。
そのため、タイムゾーンをJSTにしているNTPサーバーを利用するのが望ましい。NTPサーバーは社内のものを使うとよい。

:bulb: **RTC, タイムゾーンなどの確認例**

```
# timedatectl
      Local time: Wed 2018-10-03 10:25:08 JST         --TimeZoneで設定されている地域の現地時刻
  Universal time: Wed 2018-10-03 01:25:08 UTC         --協定世界時の時刻
        RTC time: Wed 2018-10-03 07:30:25             --リアルタイムクロックの時刻
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes                                 --NTPの同期状態
 RTC in local TZ: no                                  --リアルタイムクロックのタイムゾーン設定
      DST active: n/a                                 --夏時間の期間であれば「yes」そうでなければ「no」夏時間の設定がないタイムゾーンの場合は「n/a」
```

### デプロイ
ソフトウェアやサービスを利用可能な状態にすること。

### QEMU
オープンソースのPCエミュレーターのこと。
BIOSやPCIバス、USBバス、IDE、SCSIディスク・コントローラー、NIC、CPUなどのデバイス・セットをエミュレーションする。

### KVM (Kernel-based Virtual Machine)
ハードウェア仮想化支援機能をもつハイパーバイザー。Linux Kernelに組み込まれて用いられる。

:bulb: **Tips**
QEMUでのエミュレーションにはCPUも含まれる。
つまり、QEMUだけでPCをエミュレートして、その上にゲストOSを立ち上げると、CPUのプロセスさえも1つ1つエミュレーションすることになる。
そのため、ゲストOSの動作がかなり遅くなる。
そこで、、仮想化支援機能のあるKVMにCPUのエミュレーションを任せることで、ゲストOSをスムーズに動作させることができる。

### SCSI (Small Computer System Interface)
周辺機器とマシンのハードウェア間でデータのやり取りを行うインタフェースの規格のこと。

### SELinux (Security-Enhanced Linux)

Linuxのカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールのこと
Linuxディストリビューションではない。

### OOM killer (Out Of Memory Killer)

システムが実メモリーと仮想メモリー空間 (スワップ領域) を使い切り、必要なメモリーを新たに確保できない場合に、
プロセスを強制終了させて、空きメモリーを確保するLinuxカーネルの仕組み。

:bulb: **tips**
空きメモリーが確保できないことにより、システム自体が停止するという最悪の事態を避けるために用意されている。

### バックポート
ソフトウェアの新しいバージョンで実装された機能や改良点などを、以前のバージョンのソフトウェアでも利用できるように移植すること。
あるいは、そのために発行されるソフトウェアコンポーネントのこと。

:bulb: **tips**
ソフトウェアがバージョンアップしても、安定性や互換性などの事情から、以前のバージョンを使い続けなければならない場合がある。
そのため、古いバージョンでも部分的に新しい機能を取り込むことができるようにするのがバックポート

### ハイパーバイザー
コンピュータを仮想化するソフトウェアのこと。
ハードウェアの上にハイパーバイザーは配置され、ハイパーバイザー上で複数のOSが動作する。

### UUID (Universally Unique IDentifier)
全世界で重複しない一意なIDのこと。
何らかの組織やシステムなどが管理・割り当てを行っているわけではない。
誰でもいつでも自由に生成することができ、他のUUIDと重複しないような仕組みになっている。

[UUIDの仕組み](http://blog.katty.in/5124)

### PXE (Preboot eXecution Environment) ブート

他のサーバーからネットワークを介して、ダウンロードしたプログラムからブートするブート方法のこと。
これにより、クライアント側にOSインストールメディアやファイルが無くても、
他のサーバーにOSイメージがあれば、ブートが可能となる。
1度、これでダウンロードしたイメージはローカルに保存される。
つまり、2度目のブートは保存されたローカルのイメージからブートすることになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455013/91229ef6-3583-f3b8-55e2-246339f8deaa.png)

### Introspection
サーバに対して一時的なOSを送り込んでブートし、サーバの情報を吸い出す操作。

### ベンチマークテスト
コンピュータの処理性能を比較・評価するために行われるテストのこと。
テスト用のプログラムを実行させてソフトウェアやハードウェアの性能を計測する。
CPUの処理速度やメモリのアクセス速度など、部分的な性能を評価する場合もあれば、システム全体の処理性能を評価する場合もある。

:bulb: **tips**
これを行うことで、そのシステムや製品がどの程度優れているのかを、具体的な数値をもとに評価することができる。

### swap領域
swap領域とは、メモリ容量が不足した際にメモリの内容を退避するハードディスク上の領域である。
メモリからハードディスクに退避する操作をswap-out、メモリに書き戻す操作をswap-inという。
swap-in、swap-outが頻繁に発生することをスラッシングと呼び、スラッシングが発生するとシステムのパフォーマンスが大幅に低下する。また、swap領域が不足するとシステムがハングすることがある。

swap領域の設定は、OSインストール時のパーティションの設定で行う。あるいは、後からswap領域を増設することもできる。
swap領域の増設の手順は以下の通り。

```
# fallocate -l 4G /swapfile　--/swapfileというファイルを作成し、4Gのswap領域を確保
# chmod 600 /swapfile
# mkswap /swapfile　-- swap領域の作成
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944
# swapon /swapfile　-- swap領域の有効化
# swapon -s　-- 設定の確認
Filename                Type        Size    Used    Priority
/swapfile               file        4194300 0       -1
# vi /etc/fstab　-- 最後の行に以下の内容を追加
/swapfile   none    swap    sw    0   0
```

### ルートファイルシステム
ルートディレクトリ `/` を格納するファイルシステム。

以下にルートファイルシステムの例を示す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455013/2993623c-352d-7754-44bf-b2215472c049.png)

### サブネットマスク
利用できるIPアドレスを示す情報。
:bulb: **ex**
ネットワークアドレス「192.168.1.0/24」は、「192.168.1.0」の左から24ビット分が固定で、その後ろを自由に使えるという意味。
192.168.1.0/24 = 192.168.1.0/255.255.255.0

| 255.255.255 | .0 |
|:---------------------------:|:----------:|
| 11111111.11111111.11111111  | .00000000  |
| 24 bit固定  | 16 bit自由

つまり、最後の8 bit (0～255) を使って、IPアドレスを割り当てれるということ。

[なぜサブネットマスクが必要なのか](http://www.runsurunet.com/2017/01/20/%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E5%8C%96%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/)

### SNMP (Simple Network Management Protcol)
ルータ、スイッチ、サーバーなどTCP/IPネットワークに接続された通信機器に対し、ネットワーク経由で監視、制御するためのプロトコル。
OSI参照モデル: レイヤ6
TCP/IP階層モデル: アプリケーション層

### VLAN (Virtual Local Area Network)
物理的な接続で設定することなく、端末の仮想的なネットワーク・グループを構築できる技術。
物理配線を気にすることなくネットワーク構成を変更できる。
つまり、人事異動などで組織編制が変わった際でも、1つ1つケーブルやスイッチなどを変更することなく、容易にネットワーク構成の変更が可能となる。
また、組織ごとに分離されたL2ネットワークが構築できる。

しかし、分離ネットワークの数が不足するデメリットがある。
4094個のVLAN ID (12 bitつまり0～4095までIDがあるが、規格で0, 4095は予約されている) を使い、スイッチ上のどのポートがVLANに所属しているかを識別する。
つまり、4094個までしかL2ネットワークを構築できない。

### VXLAN (Virtual eXtensible Local Area Network) 
オーバーレイネットワークを実現するプロトコルの1つ。
VXLANヘッダをデータに付けて、L2ネットワークを分離し、VLANを拡張する技術。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455013/7dfd8b8f-609e-4b28-ec85-1435b9b1a492.png)
VM1とVM3は異なるL2ネットワークに属している。しかし、VXLANヘッダを付与して、VM1・VM3を同一VXLANセグメントに存在させる。
これにより、L3ネットワークを超えた、仮想的なL2ネットワーク通信 (オーバーレイネットワーク) が可能となる。
つまり、異なるL2ネットワークに所属しているにもかかわらず、VM1とVM3で通信が可能となる。

また、L2Network AとL2Network Bで同じIPアドレスがあるために、通信できないということを防ぐ。
これはセキュリティ面にも関係してくる。IPアドレスが同じでないようにするには、お互いのIPアドレスの把握が必要となる。
つまり、「機密サーバーのIPアドレスが123.45.123.123だから、ダメだよ。」ということが起きたら、機密サーバーであるはずのIPアドレスが分かってしまう。
そのためにも、L2ネットワークをお互いに隔離する必要がある。

その他にも、下のL2ネットワークの構造を意識することなく、仮想的なL2ネットワークが実現できる。
24 bitつまり約1600万ものVXLAN ID (VLAN IDに相当するもの) を持っている。などといったメリットもある。

しかし、VXLANヘッダを付けるカプセル化により、データ量が大きくなるデメリットがある。
また、パケットのカプセル化の分だけ処理がかかる。VXLAN未対応の機器がある。などといったデメリットもある。

[L3ネットワークを超えた、論理的なL2ネットワーク通信とは？](https://www.infraexpert.com/study/virtual3.html)

### DNS (DNSサーバーとも言う)
IPアドレスとホスト名を紐づける、いわば辞書のような役割をもつサーバー。
数字の羅列であるIPアドレスでは判別しにくいため、普段はwww.example.comのように、ホスト名で検索している。
その際、www.example.comのIPアドレスをDNSに聞くことにより、www.example.comのアクセスを可能にしている。



# コマンド
### mount
HDDやUSBメモリ、DVD-ROMなどのファイルシステムを指定したディレクトリに接続し、読み書きできる状態にすること。
ex. USBをマウントすれば、USBの中身を読み書きできる。

isoファイルなどは、中身がディレクトリのツリー構造になっている。そのため、中身をインストールするには、ファイルシステムにマウントする必要がある。

:bulb: **ex**
`mount <fsA> <dirB>` :
ディレクトリBにファイルシステムAが接続されるように、マウントする。
これにより、ディレクトリB配下を参照することで、ファイルシステムA内を読み書きすることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455013/3abfbbd0-eac5-137b-394d-074a5e2dbab7.png)

### source
シェルの設定ファイルを反映させるコマンド。

:bulb: **ex**

```
[root@example ~]# less keystonerc_admin                              --環境変数設定ファイル参照
unset OS_SERVICE_TOKEN
    export OS_USERNAME=admin
    export OS_PASSWORD='redhat'
    export OS_AUTH_URL=http://123.123.123.12:5000/v3
    export PS1='[\u@\h \W(keystone_admin)]\$ '

export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_IDENTITY_API_VERSION=3
[root@example ~]# source keystonerc_admin                            --. keystonerc_adminでも可 (source = .)
[root@example ~(keystone_admin)]#                                    --表示が変わる
[root@example ~(keystone_admin)]# export PS1='[\u@\h \W]\$ '         --元に戻したいとき
[root@example ~]#
```

# tcpdump
ネットワーク通信のパケットを観測するコマンド。

:bulb: **exampleから×××.×××.××××××.×××へpingを送った例**

```
[root@example ~]# tcpdump host ×××.×××.××××××.×××
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br-ex, link-type EN10MB (Ethernet), capture size 262144 bytes
13:32:51.250181 IP example > ×××.×××.××××××.×××: ICMP echo request, id 14750, seq 1, length 64
13:32:51.267572 IP ×××.×××.××××××.××× > example: ICMP echo reply, id 14750, seq 1, length 64
13:32:52.252245 IP example > ×××.×××.××××××.×××: ICMP echo request, id 14750, seq 2, length 64
13:32:52.269883 IP ×××.×××.××××××.××× > example: ICMP echo reply, id 14750, seq 2, length 64
```

### rpm
rpm(Red Hat Package Manager)形式のパッケージを扱うことができるパッケージ管理コマンド。

**tips**
rpm形式パッケージにおいて、プログラムの配布形式は、
バイナリーコードになったソフトウェアをそのまま配布し、インストールするといった形式となっている。
従来は、ソースコードを配布していたため、コンパイルしてインストールする必要があった。
あらかじめコンパイルされたバイナリーコードで配布することにより、コンパイルの手順が省かれ、インストールが容易になった。
rpm形式パッケージは、Red Hat系のLinuxで採用されていることが多い。
rpm形式パッケージでは、ソフトウェアのインストールやアップデート、アンインストールが非常に簡単に行える。

rpmコマンドのオプションは数多くあるが、主に用いられるコマンド例を以下に示す。

```
[root@example ~]# rpm -qa    --インストールされているパッケージの一覧を表示する
python2-oauthlib-2.0.1-8.el7.noarch
redhat-support-lib-python-0.9.7-6.el7.noarch
git-1.8.3.1-20.el7.x86_64
efibootmgr-17-2.el7.x86_64
python-testtools-1.8.0-2.el7ost.noarch
rhnsd-5.0.13-10.el7.x86_64
...
[root@example ~]# rpm -qa redhat-support-lib-python  --パッケージ名を指定した場合、そのパッケージがインストールされていれば表示される
redhat-support-lib-python-0.9.7-6.el7.noarch

[root@example ~]# rpm -ql redhat-support-lib-python  --指定したパッケージによりインストールされているファイルの一覧を表示する
/usr/lib/python2.7/site-packages/redhat_support_lib
/usr/lib/python2.7/site-packages/redhat_support_lib/__init__.py
/usr/lib/python2.7/site-packages/redhat_support_lib/__init__.pyc
/usr/lib/python2.7/site-packages/redhat_support_lib/__init__.pyo
/usr/lib/python2.7/site-packages/redhat_support_lib/api.py
...

[root@example ~]# rpm -qf /usr/lib/python2.7/site-packages/redhat_support_lib          --指定したファイルがどのパッケージからインストールされたのかを表示する
redhat-support-lib-python-0.9.7-6.el7.noarch

[root@example ~]# rpm -q --changelog redhat-support-lib-python           --指定したパッケージの更新情報を表示する
* Tue Jul 05 2016 Mark Huth <mhuth@redhat.com> - 0.9.7-6
- Resolves: rhbz#1314606 - show progress with addattachment
- Resolves: rhbz#1314607 - problem with addattachment -s switch

* Wed Jan 07 2015 Mark Huth <mhuth@redhat.com> - 0.9.7-3
- Resolves: rhbz#1176473 - FTP upload via proxy
- Small changes to download progress
...
```