初心者のためのLinux

Linuxはサーバ用や組み込み用のOSで使われていることが多く、サーバを操作するためには勉強は避けられません。しかし、Linuxは長い歴史の中で磨きあげられ変更が少ないため、一度習得すれば長く使える技術となっています。
また、今回紹介しているものは最低限の知識です。Linucなどに向けた情報量ではないので、詳しくは

https://www.infraexpert.com/infra/study10.html

をご利用ください。

また、windowsをご利用の方は先程のサイトを参考に、Windowsに仮想化ソフト（VMware）インストールを行い、Linux OSを動かせるようにしてください。

# Linuxとは

LinuxとはOSの一種で、１９９１年からUnixをベースに開発されたもの。

## Linuxの使用用途

サーバー用や組み込み用、デスクトップ用といった幅広い用途で使われている

## Linuxの特徴

- オープンソースなので誰でも自由に使える
- 世界中で利用されているので信頼性が高い
- 自動化するための仕組みがあり、サーバの運用に長ける
- 商用アプリケーション（office 365等）が動作しない
- 日本語対応されていない部分が多い

# Linuxの最低限の用語

## Linuxカーネル

Linuxの中核となる部分で、コンピュータのハードウェア制御などを行うソフトウェア。カーネルはハードウェアの違いを吸収し、プログラムがどのようなハードウェア上でも同じ動作をさせる役割がある。

## ユーザランド

OSが動作するのに必要な、カーネル以外の部分のことを言う。ファイルシステムや操作コマンド、シェルなどの基本ソフトウェア群を指す。

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

Linuxを使う上で必要なプログラムをまとめ、簡単にインストールできるようにしたもの。開発団体をディストリビューターともいう。

## パッケージ

Linuxに追加機能を提供するものであり、導入が困難な応用ソフトウェアを簡単に導入できるよう、ディストリビューターの手によって作成されている

### ディストリビューションの種類

ディストリビューションは１０００種類以上あり、独自のコミュニティが開発を行っている。

- Red Hat系
- Debian系

# Linuxコマンド

Linuxは基本的にはコマンドで操作します。コマンドはユーザランドで動作します。

## シェル

シェルとはLinuxのCLIを提供するソフトウェア。ユーザとカーネルのインターフェイスの役割を行っている。
ターミナルを起動して入力を行うが、ターミナルは画面を提供するソフトウェアであり、コマンドを解釈するのはシェルであるため別物のソフトウェアである

### シェルの機能

1. コマンドの入力を受け付ける
入力されたコマンドを理解し、実行します。
2. シェルスクリプトの実行
シェルスクリプトとはコマンドの入力を自動化するためのものであり、作成したシェルスクリプトをサーバ起動時や数時間毎に実行したりすることが可能

### 種類

- sh
もっとも古いシェル
ほぼ全てのUnixで利用できる
機能は少ない
- bash
shを基本に機能性を拡張したシェル
Linux環境でのデフォルトログインシェル
- zsh
bashの機能を引き継ぎ、独自の拡張も行っているシェル
機能が豊富
基本的にzshが上位互換なので用いると良い

## 書式とオプションとワイルドカード

- 書式とは
コマンドが用いられる形式を示す。
- オプションとは
コマンドにオプションを用いることで、動作を変更することができる。また、複数のオプションを繋げ相乗することができる。
- ワイルドカード
*(アスタリスク）例：*.txt
【例の場合だと、○.txtが列挙され出力される。また、何文字が入っても検索結果が出力される】
?(クエスション）例:??.txt
【例の場合だと、○○.txtが列挙され出力される。また、アスタリスクとは違い、?マークの文字数に合致するものしか列挙されない。】

## Linuxのディレクトリ操作

- cd 
ディレクトリに移動する。またcdのみだとホームディレクトリに移動する。

ディレクトリの指定

| ディレクトリ | 指定方法 | 意味 |
| --- | --- | --- |
| カレントディレクトリ | . | 現在いるディレクトリ |
| 親ディレクトリ | .. | 現在の一つ上階層のディレクトリ |
| ホームディレクトリ | ~ or cd | ホームディレクトリ |
| ルートディレクトリ | / | ルートディレクトリ |
- pwd
現在いるディレクトリを確認できる
- ls
現在の階層の**中にあるデータ**を確認できる。ディレクトリやファイルをlsコマンドで参照する場合、*と?をワイルドカードとして使用することができる。

書式：ls[option][file]

| option | discription |
| --- | --- |
| -a | 隠しファイル等も表示する |
| - l (L) | Long形式で出力（詳細を表示する） |
| -t  | 最終更新時間によって、ソートして出力 |
| -r |  順を逆にソートして出力 |
- mkdir
ディレクトリを作成できる。日本語で作成すると文字化けの恐れがあるため英語で作成する。

| option | discription |
| --- | --- |
| -p | 指定されたディレクトリの上位ディレクトリも作成する |
- rmdir
ディレクトリを削除できる。**空ディレクトリしか削除できない**。

| option | discription |
| --- | --- |
| -p | 指定した階層までのディレクトリを一括で削除する |

### ディレクトリ構造

ディレクトリとはファイルが保存されている場所。スラッシュ  (winはドライブ）のルートを頂点とした階層構造になっており、ディレクトリツリーと呼ぶ。

### 主要なディレクトリの役割

- /bin
一般ユーザ及び管理ユーザが使用可能なコマンドの**実行ファイルを格納**。特にLinuxの動作に最低限必要な極めて重要なコマンドを格納している
- /dev
デバイスファイルを格納
- /etc
設定ファイルを格納
Linuxの設定やLinuxで動作するアプリケーションの設定ファイルなどを格納
- /home
いわゆるホームディレクトリ（個人用ディレクトリ）を格納
ユーザはホームディレクトリ内に自由にファイル等を作成できる
- /sbin
管理者ユーザ向けのコマンドの実行ファイルを格納
- /tmp
アプリケーションの実行中に結果を一時的にファイルとして格納する際に利用
tmp内は定期的に削除される
- /var
変化するデータを格納
アプリケーションを動作する上で作成されたログファイルなどを格納
- /user
各種アプリケーションやそれに付随するファイルを格納

### パス

ディレクトリやファイルの住所情報のようなもの

### 絶対パスと相対パス

- 絶対パス
ルートディレクトリから始まる確実なパス表記。どのディレクトリにいてもパスを指定できる。
例：　「/Users/user/Library」
- 相対パス
カレントディレクトリ（現在いるディレクトリ）から始まるパス表記。現在いるディレクトリが変わると利用できない（指定ができない）
例:　「../user/Library」

# 便利コマンド

- man
マニュアルを表示
書式：man コマンド名

| option | description |
| --- | --- |
| -k 単語 | 単語が含まれるエントリー一覧を出力 |
- --help
コマンドの実行に使えるオプションを表示
書式：コマンド --help

# Linuxのファイル操作

## ファイルの種類

- テキストファイル
文字列（文字コード）が書かれたファイルのことをいう。
- バイナリファイル
画像や音声ファイル、実行ファイルなど、文字コード以外の数値も含むようなファイルのことをいう。

## コマンド

- cat
ファイルの内容を表示する。一画面に表示する。
書式：cat ファイル名

| option | description |
| --- | --- |
| -n | 行番号を付加して表示 |
- less
ファイルの中身をスクロール表示する。長いファイルを見たいときに用いる。

スクロール操作方法

| command | description |
| --- | --- |
| space or f | 一画面下へスクロール |
| b | 一画面上にスクロール |
| j | 一行下にスクロール |
| k | 一行上にスクロール |
| /単語 | 単語を検索。nキーで結果へジャンプ |
| q | lessを終了 |
- touch
ファイルのタイムスタンプが現在日時に更新される。ファイルが存在しない場合、touchコマンドは中身が空であるファイルを生成する
書式：[option]ファイル名
- sort
テキストファイルの中身を並び替える
書式：sort[option]ファイル名

| option | description |
| --- | --- |
| -r | 逆順でソートする |
| -k n | n番目のデータをソートする |
| -n | 数値としてソートする |
- rm
ファイル・ディレクトリを削除する。**実行すると本当に削除される。注意**
書式：rm ファイル名

| option | description |
| --- | --- |
| -i | 処理を行うときに確認をする |
| -f | 強制的に処理を行う |
| -r | ディレクトリを対象とする |
- mv
ファイルの移動・ファイル名を変更する。
移動元(以下：(x) )がファイル名で移動先(以下：(y) )名が存在しないファイル名の場合、(y)にファイル名が変更される。
(x)がファイル名で(y)が存在するディレクトリの場合、(x)  がディレクトリ(y)の下に移動する。

書式：mv  移動元ファイル　移動先ファイル

| option | description |
| --- | --- |
| -i | 処理を行うときに確認をする |
| -f | 強制的に処理を実行する |
- cp
ファイル・ディレクトリのコピーや複数を行う。

コピー元(以下：(x) )名がコピー先(以下：(y) )名が存在しないファイル名の場合、(x)のコピーとして(y)が作成される。
(y)が存在する**ファイル名**の場合、(y)を(x)が**上書き**します。
(y)が存在する**ディレクトリ名**の場合、(y)の下に(x)を**複製**します。

書式：cp[option]コピー元 コピー先

| command | description |
| --- | --- |
| -i | 処理を行うときに確認します。 |
| -r | ディレクトリの中にある全てのファイル・ディレクトリに対してコピーする。 |
| -p | 元ファイルの情報を保存する。 |
- ln
リンクを張る（ファイルに別名をつけることができる）。
長いパス名を省略したいときなどに使用する。
デフォルトはハードリンクになる。
    - ハードリンク
    １つのファイルに複数の名前をつける
     元のファイルを削除しても消えない
    ディレクトリに対して使えない欠点がある
    - シンボリックリンク
    リンク先のパス名が書かれたファイル（ショートカットのようなもの）なので、ファイルの実体を削除したり、移動するともちろん参照できなくなる。
- find
ファイルがどこのディレクトリに存在するか検索できる
書式：find パス -name ファイル名
- which
PATHという環境変数に含まれるディレクトリ配下のコマンドのパスを表示
書式：which コマンド名
- uniq
直前の行と同じ内容があった場合、対象行を出力しない。（連続している同様の行を一行に纏める）
書式：uniq ファイル名
- diff
ファイルを比較する。主に変更の有無を確認する際に用いられる。
書式：diff[option]ファイル１ファイル２

| option | description |
| --- | --- |
| -c | context diff形式で出力 |
| -u | unified diff形式で出力 |

# プロセス・ジョブの管理

プロセスとはメモリ上で実行中のプログラムのことをいう。
ジョブとはまとめて実行されるプロセスの集合。

- ps
実行中のプロセスを表示する。
- jobs
現在のジョブの一覧を表示する
- fg
ジョブをフォアグラウンドにする
- bg
ジョブをバックグラウンドにする
- kill
ジョブやプロセスを終了する

# 標準入出力

コマンドはひとつのプログラム。
入力（標準入力という）には”標準出力”と”標準エラー出力”がある。
・標準出力
　プログラムを実行した端末にディスプレイ表示されるもの
・標準エラー出力
　エラーメッセージを書き出す先のこと

## リダイレクト

コンソールに標準出力された”文字列”はリダイレクトを用いてファイルに上書きします。大なり　（＞）を用います。ファイルに追記したい場合はアペンド (>>)を用います。

### catコマンドによるファイル生成

catとリダイレクトを用いて自由な内容のファイルを作成可能

```bash
$ cat > cat-output
Hi!
HELLO!
$

# (ctrl + Dで終了）
# 結果：記述した文字列を含んだファイルが生成される
```

## 標準エラー出力とリダイレクト

リダイレクトを用いて、任意のファイルにエラーメッセージを書き込むことができる。
また、”1"を指定することで標準出力を書き込め、”2”を指定することで標準エラー出力を書き込める

```bash
$ ls -l sample > ls-output

ls: sample: No such file or directory
```

　このようにエラーは通常は標準出力（ターミナル上に表示）されるが”2”を指定するとエラー出力を書き込むことができる

```bash
$ ls -l sample 2>ls-sample-output

# (エラー出力をls-sample-outputにリダイレクト）
```

### パイプ

コマンドとコマンドをパイプ（｜）でつなげることで、パイプの前のコマンドを後ろのコマンドの標準入力とすることができる。

### grepコマンド

ファイルの中からデータを検索できる。
また　**| grep**とすることで入力されたデータに対して検索を行うことができる。（lsコマンドと合わせると便利）
書式：grep[option]検索条件[指定ファイル]

| option | decription |
| --- | --- |
| -e | 文字列を検索パターンとして扱う |
| -i | 検索パターンと入力ファイルの双方で大文字小文字の区別を行わない |
| -v | 検索パターンとアンマッチな行を選択する |

# グループとユーザ

## ユーザ系

- useradd
新しくユーザを作成する
書式：useradd ユーザ名

| option | description |
| --- | --- |
| -c コメント | コメントを指定する |
| -g グループ名 | プライマリグループ名を指定する |
| -G グループ名 | 補助グループ名を指定留守 |
| -d | ホームディレクトリを指定する |
| -s | シェルを指定する |
| -u ナンバー | ユーザIDを指定する |
- usermod
ユーザのアカウントを変更
書式：usermod ユーザ名
- userdel
ユーザを削除する
書式：userdel ユーザ名

## グループ系

複数のユーザの権限を纏めて扱う

- groupadd
グループを作成する
書式：groupadd グループ名

| option | discription |
| --- | --- |
| -g ナンバー | グループIDを指定する |
- groupmod
グループの定義を変更
書式：groupmod [option] [変更内容] 変更対象グループ

| option | description |
| --- | --- |
| -n | 既存のグループ名を変更する |
| -g | 既存のグループIDを変更する |

### sudo

sudoを使うと特別な権限でコマンドを実行できます。
例えば、root権限でコマンドを実行したいときにsudoを使うと、rootになることなくコマンドを実行できます。

sudoコマンドを使うときには、パスワードを入力する必要があります。
再度sudoコマンドを使うと、15分以内であればパスワードの再入力は不要です。

| option | descripton |
| --- | --- |
| -l | コマンドの実行権限レベルを表示 |
| -v | sudoが出力するメッセージを詳細に表示 |
| -k | 現在のsudoセッションを終了 |
| -s | rootシェルを取得 |
| -u | 別ユーザでコマンドを実行 |

# ユーザ権限・アクセス権限

ファイル作成者のユーザIDとグループIDがファイルの所有者と所有グループ名となる。

- chown
ファイルの所有者を変更
書式：chown ユーザ [.group] ディレクトリorファイル

| option | descripton |
| --- | --- |
| -R | ディレクトリを対象とする |
- chgrp
ファイルの所有グループを変更

| option | descripton |
| --- | --- |
| -R | ディレクトリを対象とする |
- chmod
ファイルのアクセス権を変更

### ファイルの設定アクセス

ファイルのモードとして【読み込み・書き込み・実行】の３つの権限がある。ls -lコマンドで表示される１つ目のカラムがファイルのモードを表している。

| items | description |
| --- | --- |
| r | 読み込み |
| w  | 書き込み |
| x | 実行またはディレクトリ移動 |

### chmodを使用し８進数でモードを指定する

|  | user | group  | other |
| --- | --- | --- | --- |
| permission | r | w | x | r | w | x | r | w | x |
| octal | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |
| set val | 合計値 | 合計値 | 合計値 |

モードは　u(所有ユーザ）,g(所有グループ),o(その他ユーザ）に対して、r(読み）,w(書き）,x（実行）を 設定(” = “)したり、加えたり( “ + “)、取り消したり (” - “ )できる。u,g,oの全てに同じ権限を指定するときはa(All)を指定する。
８進数で変更する場合はユーザカラムで選択したモードの合計値を指定する。

### パーミッションを設定してファイルを作成する

- umask
指定したパーミンションでファイルを作成する
書式：umask [8進数のモードのマスク値]
umaskで指定できるマスク値は、読み書き実行のパーテンション(666)から設定したいパーミッションを引き算することで求めることができる。

# おわりに
ズラズラと書いていきましたが、「こんなのあるんだ〜」くらいの認識で大丈夫です。いざ必要となったときに「そういえばこういうコマンドあったな・・・」と思い出せることができれば大丈夫です。
また、もっとLinuxを深堀りしたい方はLinucの勉強をおすすめします。無事に禿げそうになるくらいの難易度ではありますが。

https://ping-t.com/

https://www.infraexpert.com/infra/study10.html