Linux 標準教科書 (Ver.3.0.5)

# はじめに

# 1章
- カーネル
オペレーティングシステムの中核となる部分で、ハードウェアと直接やりとりするなどもっとも中心的な機能を受け持つ部分

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

# 3章
- ファイルやディレクトリの参照（ls）

```
ls [オプション] [ファイル]

オプション
-a
. で始まる隠しファイル等もすべて (All) 出力します。
-l
長 (Long) 形式で出力します。
-t
最終更新時間 (Time) によって、ソートをして出力します。
-r
逆順 (Reverse) にソートをして出力します。
```

- ファイルのコピー (cp)

```
cp [オプション] コピー元 コピー先

例）cp src-file dst-file

ファイルを別名のファイルとしてコピー
    src-file がファイル名で、dst-file が存在しないファイル名の場合、src-file のコピーとして dst-file
    が作成されます。
ファイルをディレクトリにコピー
    src-file がファイル名で、dst-file がディレクトリ名の場合、dst-file の下にファイル src-file のコ
    ピーが作成されます。
ファイルを新しいファイルで上書き
    src-file がファイル名で、dst-file が存在するファイル名の場合、ファイル dst-file はファイル
    src-file のコピーで上書きされます。


オプション
-i
    処理を行なうときに確認をします。ファイルを上書きコピーするときなど、-i オプションを付けていると、コ
    ンピュータが確認のための問い合わせをしてきます。誤って上書きコピーすることを防ぐために利用されます。
-r
    ディレクトリをコピーします。cp コマンドは基本的にファイルをコピーする機能のみですが、-r オプション
    を付けていると、ディレクトリの中にある全てのファイル・ディレクトリに対してコピーを行なうことができ
    ます。
-p
    元ファイルの情報を保存します。ファイルには所有者・属性・更新日時など、ファイルに関するさまざまな情
    報があります。cp コマンドでコピーをすると、新しいファイルはそれらが全て新しい内容になってコピーされ
    ます。新しい内容を作成せず、古い情報を保持したままコピーを作成したい場合、この-p オプションを付けま
    す。
```

- ファイルの移動 (mv)

```
mv 移動元ファイル 移動先ファイル

オプション
-i
    処理を行なうときに確認をします。ファイルを上書きするときなど、-i オプションを付けていると、コン
    ピュータが確認のための問い合わせをしてきます。誤って上書きされることを防ぐために利用されます。
-f
    強制的に処理を実行します。一部の処理では、mv コマンドが確認の問い合わせをします。その確認を無視し、
    強制的に処理を実行するためのオプションが-f です。

ファイルを別のディレクトリに移動
    src-file がファイル名で、dst-file が存在するディレクトリの場合、ファイル src-file がディレクト
    リ dst-file の下に移動します。
ディレクトリを別のディレクトリに移動
    src-file がディレクトリ名で、dst-file が存在するディレクトリの場合、ディレクトリ src-file は
    ディレクトリ dst-file の下に移動します。
ファイル名の変更
    src-file がファイル名で、dst-file が存在しないファイル名の場合、ファイル dst-file にファイル名
    が変更されます。
ディレクトリ名の変更
    src-file がディレクトリ名で、dst-file が存在しないディレクトリ名の場合、ディレクトリ dst-file
    にディレクトリ名が変更されます。
```

- ファイルの削除 (rm)

```
rm ファイル名

オプション
-i
    処理を行なうときの確認です。対象ファイルを本当に削除してよいか、確認のための問い合わせをします。誤っ
    て削除することを防ぐために利用されます。
-f
    強制的に処理を実行します。ファイルによっては、削除に確認を求められる場合がありますが、-f オプション
    はその確認を無視して、強制的に処理を継続します。
-r
    ディレクトリを対象にします。ディレクトリの中の、ファイルやディレクトリも削除します。
```

## ディレクトリの操作（pwd,cd,mkdir,rmdir）

- 現在のディレクトリの表示 (pwd)

ディレクトリは、階層構造になっています。その階層の中で、現在どの位置にいるか表示するのが、この pwd(Print Working Directory) です
```
実行例
$ pwd
/home/penguin
```

- ディレクトリの変更 (cd)

cd(Change Directory) コマンドを実行すると、現在いるディレクトリを変更することができます。cd の後にスペースを入力し、続けて移動先のディレクトリを指定します。ディレクトリを指定しない場合はホームディレクトリ (後述) に移動します。

```
$ pwd
/home/penguin
$ cd /usr
$ pwd
/usr
```

- ディレクトリの作成 (mkdir)

mkdir コマンドを実行すると、ディレクトリを作成できます。mkdir の後にスペースを入力し、続けて作成するディレクトリ名を指定します。

```
mkdir ディレクトリ名

オプション
-p
    指定されたディレクトリの上位ディレクトリも作成する

実行例：オプションを付けない例
    $ mkdir dir1
    $ mkdir dir1/dir2
    $ mkdir dir1/dir2/dir3

mkdir コマンドを 3 つに分けて実行しました。これは、ディレクトリを作るときはその上位層ができていないと作成できない、という制約があるためです。-p オプションを付けて実行すると次の
ように一度に実行できます。

実行例：オプションを付けた例
    $ mkdir -p dir1/dir2/dir3
```

- ディレクトリの削除 (rmdir)

ディレクトリを削除するコマンドとして rmdir コマンドがあります。

```
rmdir ディレクトリ名

オプション
-p
    指定した階層までのディレクトリを一括で削除します。オプションを付けないで rmdir コマンドを実行した場
    合は、最下層のディレクトリのみ削除します。ただしいずれの場合も、対象とするディレクトリ内は空でなけ
    ればなりません。

(例)dict1/dict2 ディレクトリを一括で削除
    rmdir -p dict1/dict2

rmdir の特徴は、「中が空であるときのみ」ディレクトリを削除できることです。ディレクトリの中にファイルが存在していると、ディレクトリは削除できません。
ディレクトリにファイルが存在する場合、ディレクトリを削除するには

rm -r

コマンドを用いて行なうことができます。
```

## 特別なディレクトリ

Linux では、ディレクトリの中で特別なディレクトリや、それを表す記号があります。以下がその代表的なものです。

- カレントディレクトリ (.)

現在いるディレクトリのことです。ファイルやディレクトリ操作では「ドット」を使って表わします。

- 親ディレクトリ (..)

1階層上のディレクトリのことです。カレントディレクトリが/home/penguin の場合、/home が親ディレクトリにあたります。

- ホームディレクトリ (~)

ユーザの作業開始位置となるディレクトリです。ログイン直後のユーザは、必ずホームディレクトリにいます。ユーザごとに異なるホームディレクトリを使うので、それぞれのユーザにとってホームディレクトリは異なります。ファイルやディレクトリ操作では「~ チルダ」を使って表わします。

- ルートディレクトリ (/)

ディレクトリ階層の、最上位階層を示します。ファイルやディレクトリ操作では「/ ルート」を使って表わします。

## 絶対 (パス) 指定と相対 (パス) 指定

カレントディレクトリが/usr/local であるとします。このとき、/usr/bin/xxx のファイルを指定するには、次の 2 通りが存在します。

①/usr/bin/xxx
②../bin/xxx

①は、最上位のディレクトリ (/) からディレクトリ・ファイル名を指定しています。②は、「自分が現在いる位置からみて」ディレクトリ・ファイル名を指定しています。①の方法を絶対 (パス) 指定といい、②の方法を相対 (パス) 指定といいます。絶対 (パス) 指定は、どのディレクトリにいてもパスを指定できます。逆に、相対 (パス) 指定は、現在のディレクトリが変わると利用できない、という特徴があります。また、絶対 (パス) 指定は、常に/から指定するので非常に記述が長くなることがあります。相対 (パス) 指定は、現在の位置から見て非常に近いディレクトリのときは、指定の記述が短くて済む、という特徴があります。ここでは、penguin というユーザのホームディレクトリが、/home/penguin であるという想定をしています。

## ファイルの内容を表示

- ファイルの内容を表示 (cat)

ファイルの内容を確認するコマンドの 1 つである cat コマンドを利用する方法について説明します。

```
cat ファイル名

ファイルの内容を表示することができます。

オプション
-n
    行番号を付加して表示します。
```

- ページャを使った表示

cat コマンドを使ってファイルの内容を表示するとき、行数がたくさんあると表示が流れてしまいます。皆さんが利用するコマンドラインは、多くの場合 25 行に設定されているため、それ以上の行は流れてしまって確認できません。たくさんの行があっても、画面制御を行なってスクロールを途中で止めてくれる機能のことをページングといい、それを実現するコマンドをページャといいます。代表的なページャとしては more や less コマンドがあげられます。使い方は cat コマンドなどと同じで、オプションとしてページングする対象のファイル名をとります。

```
more ファイル名
less ファイル名
```

more コマンドの場合
|項目 |内容|
|:-:|:-:|
|スペース |次のページに進む
|b |前の一画面に戻る
|f |次の一画面に進む
|/単語 |単語を検索します。n キーで検索結果をジャンプします
|q |ページャコマンドを終了 (quit) します

 less コマンドの場合
|項目 |内容|
|:-:|:-:|
|スペース |次のページに進む
|b |前の一画面に戻る
|f |次の一画面に進む
|↑ |前の行に進む
|↓ |次の行に進む
|/単語 |単語を検索します。n キーで検索結果をジャンプします
|q |ページャコマンドを終了 (quit) します

- ファイルの検索（find）

ファイルがどこのディレクトリに存在するか、find コマンドにて検索できます

```
find パス -name ファイル名
```

- コマンドのパスを表示 (which)

基本的なコマンドを実行するとき、その実体であるプログラムがどのディレクトリに配置されているかを意識する必要はありません。これは、PATH という環境変数にプログラムが配置されているディレクトリが設定されているからです。which というコマンドを用いると、PATH 環境変数に含まれるディレクトリ配下に配置されているコマンドのパスを表示することができます。

```
which コマンド名

例）which cat
/bin/cat
（cat コマンドは/bin 配下に配置されているのがわかる）
```

- ヘルプの使い方

```
コマンド --help

例）$ ls --help
```

- マニュアルの使い方

```
man コマンド名

オプション
    -k 単語
    '単語'が含まれるエントリ一覧を出力します

例）$ man ls
```

# 4章 正規表現とパイプ

- パイプ "|"

```
例）$ ls -l /usr/bin | less
```

less は前章で学習したページャの less コマンドのことです。コマンドとコマンドを「|（パイプ）」でつなげることでパイプの前のコマンドを後ろのコマンドの標準入力とすることができます。GNOME などのデスクトップ環境がインストールされている場合は、端末上でカーソルキーを押すことでページングすることができるため、操作する端末が目の前にある場合は、ページャにパイプで繋ぐ必要はあまりないかもしれません。しかし端末をリモート操作している場合やデスクトップ環境がインストールされていない Linux 環境の場合は、パイプでつなげる方法を知っておくと大変便利です

-  grep コマンド

grep コマンドは、ファイルの中からデータを検索します。また、| grep とすることで、標準入力から入ったデータに対し検索を行なうことも可能です。

```
grep [オプション] 検索条件 [指定ファイル]
```

- 正規表現

正規表現は文字列のみならず、意味のある記号を用いることで、高度な検索条件を与える表現方法です。主に用いられる記号は次の通りです。


|記号| 意味
|:-:|:-:|
|^ |行頭を表す
|$ |行末を表す
|. |任意の一字を意味する
|* |直前文字の 0 回以上の繰り返しを意味する
|[...] |.. の中の任意の一字を意味する
|[^...] |.. の文字が含まれないことを意味する。
|Y |正規表現の記号をエスケープする。

- さまざまな条件を用いた grep コマンドの実行

大文字と小文字の区別に関する条件を指定したり、否定の条件を指定することができます。

```
オプション
-e
    文字列を検索パターンとして扱う。
-i
    検索パターンと入力ファイルの双方で、英大文字と小文字の区別を行わない。
-v
    検索パターンとマッチしなかった行を選択する。
```

# 5章 基本的なコマンド 2

- ファイルのタイムスタンプの変更 (touch)

ファイルには、タイムスタンプ（最終更新日）が必ず存在します。タイムスタンプは ls コマンドの-l オプションを付けることで確認できます。その最終更新時間を変更するのが、touch コマンドです。

```
touch [オプション] ファイル名
```

touch コマンドを実行すると、ファイルのタイムスタンプが現在日時に変更されます。なお、オプションにより、新しいタイムスタンプとなる日時を指定することもできます。ファイルが存在しない場合、touch コマンドは中身が空である 0 バイトのファイルを作成します。

- ファイルの一部の取得 (head, tail)

ファイルの先頭や末尾など一部分のみを見る場合は head コマンドや tail コマンドが使えます。これらのコマンドを実行することでファイルの内容の一部を見ることができます。

```
head [オプション] ファイル名

オプション
-n 行
    先頭から指定した行を標準出力します。
-c バイト
    先頭から指定したバイト分を標準出力します。
```

```
tail [オプション] ファイル名

オプション
-n 行
    末尾から指定した行を標準出力します。
-c バイト
    末尾から指定したバイト分を標準出力します。
```

- 特別なオプション -f

tail は本来ファイルの終わり部分を表示するコマンドです。しかし、ファイルによっては、その終わり部分が随時変わることがあります。tail には-f というオプションが存在します。-f オプションを付けることにより、変更をリアルタイムでモニタすることが可能です。よく用いられる目的に、ログファイルのモニタがあげられます。ログとは、サービスの動作状況が出力されるファイルです。システムの変更やサービスの動作などでメッセージがログに記載されると、その内容が出力されます。

```
tail -f ファイル名
```

リアルタイムでログファイルなどの変更を見ることが可能です。

- テキストファイルのソート (sort)

テキストファイルの中身をソートするには sort コマンドが使えます。オプションでどのような順序でソートするか指定することができます。

```
sort [オプション] ファイル名
オプション
-r
    逆順でソートする
-k n
    n 列目のデータをソートする
-n
    数値としてソートする
```

- 行の重複の消去 (uniq)
uniq コマンドを使うことで直前の行と同じ内容があった場合、対象行を出力しません。連続している同じ内容の行を、1 行にまとめることができます。

```
uniq ファイル名
```

- 文字列の置き換え (tr)
tr コマンドを使って、標準入力からのデータを文字毎に置き換える (TRanslate) ことができます。
```
tr 文字列 1 文字列 2

例） cat FILE | tr abc ABC
この例では以下のようなことを行ないます。
• cat コマンドで FILE を開く。
• tr コマンドで a,b,c をそれぞれ A,B,C に置き換える。
```

- ファイルの比較 (diff)
Linux にはファイルを比較するコマンドがあります。主に使われる用途として、変更の有無を調べる場合に用いられます。diff の結果は標準出力されますが、リダイレクトすればファイルに出力することもできます。

```
diff [オプション] ファイル 1 ファイル 2
オプション
-c
    context diff 形式で差分を出力します。
-u
    unified diff 形式で差分を出力します。
実行例
    $ diff file1 file2
    $ diff -c file1 file2
    $ diff -u file1 file2
```

# 6章 viエディタ

- ファイルを開く
vi コマンドでファイルを開くには vi コマンドの後に編集したいファイルを指定します。
```
vi [ファイル名]
```

- ファイルを閉じる
vi コマンドを使って開いたファイルを閉じるには、「ESC」キーを押したあと、:q と入力します。q は quit の略です。ファイルを閉じることができます。

- ファイルを保存する
vi コマンドを使って開いたファイルを保存するには、「ESC」キーを押したあと、:w と入力します。w は write の略です。ファイルに変更内容が書き込まれて、編集作業を継続できます。

- ファイルを保存して終了する
vi コマンドを使って開いたファイルを保存したあとファイルを閉じるには、「ESC」キーを押したあと、:wq と入力します。w により変更内容が書き込まれ、q によりファイルを閉じます。

- ファイルを保存せずに強制的に閉じる
vi コマンドを使って開いたファイルを保存せずに閉じるには、「ESC」キーを押したあと、:q!と入力します。通常、編集済みのファイルはそのままでは閉じることができません。:q コマンドのあとに!をつけることで、ファイルを保存せずに強制的に終了できます。

- テキストの入力
文字列を入力するインサートモードは、コマンドでインサートモードへ切り替える必要があります

- カーソルの移動

```
カーソルの左右移動
    vi でカーソルを左へ移動するには「h」を、カーソルを右へ移動するには「l」と入力します。CentOS 7 で利用できる vi コマンドでは、カーソルキーの左右を使ってカーソルの左右移動をすることもできます。
カーソルの上下移動
    カーソルの上下移動は「j」で下へ、「k」で上へ移動することが可能です。CentOS 7 で利用できる vi コマンドでは、カーソルキーの上下を使ってカーソルの上下移動をすることもできます。
コマンドを使った行頭への移動
    0（ゼロ）コマンドを実行すると、カレント行の行頭へ移動することができます。
コマンドを使った行末への移動
    $コマンドを実行すると、カレント行の行末へ移動することができます。
```

- ページ単位の移動
素早く編集するために画面をページ (デフォルト指定の行数) 単位で前後へ移動するコマンドを使います。
```
次のページへの移動は「Ctrl」f コマンドです。前のページへの移動は「Ctrl」b コマンドです
```

- 行を指定した移動
行番号を指定して移動するには、これまでにコマンドを入力する時に出てきた:の後に行番号を指定します。たとえば 10 行目へ移動したい場合は、「:10」と入力してください。10 行目へカーソルが移動します。

- コマンドを使った文書頭への移動
gg コマンドを実行すると文書頭、つまり 1 行目へ戻ることができます。

- コマンドを使った文書末への移動
G コマンドを実行すると文書末、つまり最終行へ移動することができます。

- 文字のカット・アンド・ペースト

|コマンド| 内容
|:-:|:-:|
|x |1 文字削除
|dd |1 行削除
|yy |1 行コピー
|nyy |n 行コピー
|p |カーソルの文字の次または次の行にペースト
|P |カーソルの文字の前または前の行にペースト
|u |カット、ペーストを一回取り消し（アンドゥ）

- 編集の取り消し (アンドゥ)
テキストの編集で何か失敗をしたとき、それを元に戻したいことがあります。そのためのコマンドがアンドゥ (undo) で、u コマンドを入力します。vi エディタでは、すべての編集操作について、u コマンドでそれを取り消すことができます。

- 置換と検索

検索
|コマンド| 内容
|:-:|:-:|
|/検索文字列 |文字列の検索
|n |下方向へ再検索
|N |上方向へ再検索
|:対象の行 s/検索文字列/置換文字列/オプション |文字列を置換する

置換
|コマンド| 内容
|:-:|:-:|
|: ns/old/new |n 行目の最初の old を new に置換して終了
|: ns/old/new/g |n 行目の全ての old を new に置換して終了
|:%s/old/new/g |ファイル全体の検索語句を置換する
|:%s/old/new/gc |置換の度に確認を求める

# 7章 管理者の仕事

- ユーザの作成
新しくユーザを作成するには useradd コマンドを使います。ユーザには数字であるユーザ ID を割り振ります。ユーザは必ずグループに所属します。作成したユーザをログインユーザとして使用する場合は、後述する passwd コマンドにてパスワードを登録する必要があります。

```
useradd ユーザ名

オプション
-c コメント
    コメント (文字列) を指定します。
-g グループ名
    プライマリグループ名を指定します。グループ名は/etc/group ファイルで定義したグループ名です。
-G グループ名
    補助グループを指定します。
-d
    ホームディレクトリを指定します。
-s
    シェルを指定します。デフォルトで/bin/bash が指定されているディストリビューションが多く、ログインしないユーザは nologin を指定するなどします。
-u ユーザ ID 番号
    ユーザ ID 番号を指定します。
```

- ユーザアカウントの変更
ユーザのアカウントを変更するには usermod コマンドを使います。

```
usermod ユーザ名

オプション
-c コメント
    コメント (文字列) を変更します。
-g グループ名
    プライマリグループ名を変更します。グループ名は/etc/group ファイルで定義したグループ名です。
-G グループ名
    補助グループを変更します。
-l ユーザ名
    既存のユーザ名を変更します。
-u ユーザ ID 番号
    ユーザ ID 番号を変更します。
```

- ユーザの削除
ユーザを削除するには userdel コマンドを使います。

```
userdel ユーザ名

オプション
-r
    ホームディレクトリを削除します。
```

- グループの作成
新しくグループを作成するには groupadd コマンドを使います。グループには数字のグループ IDを割り振ります。

```
groupadd グループ名

オプション
-g グループ ID 番号
    グループ ID 番号を指定します。
```

- グループの登録情報の変更
グループの定義を変更するには groupmod コマンドを使います。

```
groupmod [-g gid] [-n new-group-name] 変更対象のグループ

オプション
-n
    既存のグループ名を変更する場合に指定します。
-g
    既存のグループ ID を変更します。100 未満のグループ ID はシステムで使われているため、指定できません。
```

- グループを削除
グループを削除するには groupdel コマンドを使います。groupdel コマンドでは登録されているグループの情報を削除します。ユーザが所属していないグループのみ削除できます。

```
groupdel グループ名
```

- パスワードファイル (/etc/passwd)
ユーザの情報は/etc/passwd ファイル (パスワードファイル) に保存され、1 行に 1 ユーザの情報を:で区切って記述します。パスワードファイルに登録された 1 ユーザの内容 (1 行) は次の様になります。
```
account:password:UID:GID:GECOS:directory:shell

※ GECOS = General Electric Comprehensive Operating System
従来はパスワードファイルに暗号化されたパスワードを記述していましたが、多くのディストリビューションはセキュリティを考慮してシャドウファイルにパスワードを記述しています。パスワードファイルはエディタで直接編集するべきではありません。useradd コマンドなどのコマンドを使って操作することが推奨されます。
```

|項目| 内容
|:-:|:-:|
|account| そのシステムでのユーザ名。大文字を含まないようにする
|password |以前はユーザの暗号化されたパスワード、現在は ’x’です
|UID |ユーザ ID 番号
|GID |ユーザが属するプライマリグループ ID 番号
|GECOS |ユーザの名前またはコメントのフィールド
|directory |ユーザのホームディレクトリ
|shell |ログイン時に起動されるユーザのコマンドインタプリタ

- グループファイル (/etc/group)
グループの情報は/etc/group ファイル (グループファイル) に保存され、1 行に 1 グループの情報を:で区切って記述します。グループファイルに登録された 1 つのグループの内容 (1 行) は次の様になります。
```
group_name:password:GID:user_list
```

|項目 |内容
|:-:|:-:|
|group_name| グループの名前。
|password |以前は暗号化されたグループのパスワード、またはパスワードが不要なら空欄
|GID| グループ ID 番号
|user_list |グループに所属するユーザ名のリスト。それぞれのユーザ名はコンマで区切られる。

グループファイルはエディタで直接編集するべきではありません。groupadd コマンドなどのコマンドを使って操作することが推奨されます。

- パスワード
ユーザの権限を使うにはユーザ名とパスワードを使って認証します。作成したユーザはパスワードを登録するとログインできるようになります。ユーザのパスワードを登録・変更するには passwdコマンドがあります。パスワードの登録にはパスワードが必要なので、初めてパスワードを変換するのはシステム管理のための root ユーザ (スーバーユーザ) である必要があります。

```
passwd [ユーザ名]
```

ユーザのパスワード登録と変更ユーザのパスワードを登録したり、変更します

- シャドウファイル (/etc/shadow)
ユーザのパスワードはパスワードファイルではなく、シャドウファイル (/etc/shadow) に保存されます。シャドウファイルに登録された 1 つのユーザ (1 行) の内容は次の様になります。
```
account:password:last_changed:may_be_changed:must_be_changed:warned:expires:disabled:reserved
```
シャドウファイルはエディタで直接編集するべきではありません。

|項目| 内容
|:-:|:-:|
|account| ユーザ名
|password |暗号化されたパスワード
|last_changed| 1970 年 1 月 1 日から、最後にパスワードが変更された日までの日数
|may_be_changed| パスワードが変更可能となるまでの日数
|must_be_changed| パスワードを変更しなくてはならなくなる日までの日数
|warned| パスワード有効期限が来る前に、ユーザが警告を受ける日数
|expires| パスワード有効期限が過ぎ、アカウントが使用不能になるまでの日数
|disabled| 1970 年 1 月 1 日からアカウントが使用不能になる日までの日数
|reserved| 予約フィールド


- 一般のユーザとグループ
Linux にログインするにはアカウントが必要です。アカウントを作成するとユーザ名と同様の名前のグループが作られ、ユーザはそのユーザグループに所属しているとシステムに登録されます。グループは複数のユーザをまとめるためにあります。個別のユーザを所属部署などの単位でグループ化することができます。グループを使うことでシステム上にあるディレクトリのアクセス権を設定して、特定のグループに属したユーザのみアクセスできるディレクトリを作成するといった使い方や、特定グループに属しているユーザのみ後述の root ユーザになることができるような運用が可能になります。

-  root ユーザ
root ユーザはシステム設定の変更や、プログラムのインストールや削除、ユーザを作成・削除する事ができる、利用に制限がない特別なユーザです。root ユーザはアクセス権に関係なくすべてのユーザのディレクトリへのアクセス、コンテンツの読み書きが行なえるなどの点で一般ユーザとは異なります。
このように root ユーザでログインできれば全ての操作を行なうことができてしまうため、rootユーザのアカウントは厳格に管理する必要があります。

- su コマンド
su コマンドはすでに別のユーザでログインしているユーザが、一時的に他のユーザになるためのコマンドです。su コマンドを実行する際、オプションとしてユーザを指定しない場合は root ユーザでシェルを起動します。
オプションを付けずに su コマンドを実行した場合はカレントディレクトリを変更せずに rootユーザでログインします。カレントディレクトリを root のホームディレクトリに変更してログインするには「su -」、もしくは「su - root」と実行することでカレントディレクトリを変更した上でroot ユーザでログインできます。root ユーザでログインすると、システム管理用のコマンドを実行することができます。複数人でLinux システムを管理している場合は、root ユーザで直接ログインして作業をすると、root ユーザとしての履歴だけが残り、誰がどんな作業をしたのかの履歴が残りません。一般ユーザから rootユーザへ切り替えると、root ユーザで作業を開始した時間などは直ぐにわかります。安全や管理を考えると、一般のユーザでログインしてから root ユーザの権限を取得し、システム作業することが望ましいでしょう。

```
su
su - [ユーザ]

オプション
su -（もしくは su - root）
    root ユーザになることができます。
su - user
    指定したユーザになることができます。
```

- root ユーザでコマンドを実行する sudo コマンド
sudo コマンドを使えば、スーパーユーザ（root）権限でコマンドを実行できます。普段作業するときはユーザ権限で行ない、必要に応じて sudo を使いコマンドを実行することで、su コマンドでユーザを root に切り替えることなく、root 権限が必要な設定やプログラムを実行することができます。-u オプションを付けて sudo コマンドを実行すると、任意のユーザでコマンドを実行できます。オプションを付けないで sudo コマンドを実行した場合は root 権限でコマンドを実行します。
CentOS では初期設定のままでは sudo コマンドは利用できません。sudo コマンドを使うには
ーザを wheel グループというスーパーユーザ（root）特権を持つグループに登録する必要があります。sudo の設定は/etc/sudoers ファイルを編集することでユーザが sudo コマンドを利用できるようになります。/etc/sudoers ファイルは visudo コマンドを実行すると編集できます。


```
sudo コマンド
スーパーユーザ（root）権限でコマンドを実行

例 1:
sudo cat /var/log/message

オプション
-u ユーザ
    指定したユーザでコマンドを実行します。
```

# 8章 ユーザ権限とアクセス権
- 所有者の変更
ファイルの所有者を変更するには chown コマンドを使います。

```
chown ユーザ [. グループ] ディレクトリ
chown ユーザ [. グループ] ファイル

ユーザとグループを変更するには、root ユーザである必要があります。ディレクトリとファイルは区別なく変更できます。ユーザとグループの区切りに:を使うことも可能です。

オプション
-R
    ディレクトリを対象にします。ディレクトリの中のディレクトリやファイルを再帰的にたどって変更します。
```

- 所有グループの変更
ファイルの所有グループを変更するには chgrp コマンドを使って行ないます。
```
chgrp グループ ディレクトリ
chgrp グループ ファイル

グループを変更できます。ディレクトリとファイルは区別なく変更できます。

オプション
-R
    ディレクトリを対象にします。ディレクトリの中のディレクトリやファイルを再帰的に変更します。
```

- ファイルに設定できるアクセス
ファイルのモードとしては読み書き実行の 3 つの権限があります。所有ユーザ、所有グループで所有者以外のユーザ、所有グループ以外のユーザごとに 3 つの権限を設定できます。ls コマンドに-lオプションを付けて表示される 1 つ目のカラムがファイルのモードを示しています。モードを表す1 つ目のカラムは次の様になります。

d rwx rwx rwx
1.d 2.rwx 3.rwx 4.rwx

1.ファイル種別
2.所有ユーザ
3.所有グループ
4.その他

|項目 |内容
|:-:|:-:|
|r |読み込み
|w |書き込み
|x |実行またはディレクトリの移動

rwx は、ユーザとグループとその他の 3 つに対して指定できます。r が表示されればファイルの読み込みが可能で、w が表示されればファイルの書き込みが可能です。x が表示されればファイルをプログラムとして実行できるか、または、ディレクトリであればディレクトリへ移動できます。

ファイルのアクセス権を変更するには chmod コマンドを使います。
```
chmod モード [, モード]... ディレクトリ
chmod モード [, モード]... ファイル
chmod 8 進数表記のモード ディレクトリ
chmod 8 進数表記のモード ファイル
```
ファイルのモードを所有ユーザと所有グループとそれ以外のユーザについて設定します。モード指定の書き方で次の 2 通りの記述方法があります。

• モードの書式を複数書き、カンマで区切って指定。
• 8 進数 3 桁で各ユーザのレベルを指定。

```
オプション
-R
    ディレクトリを対象にします。ディレクトリの中のディレクトリを再帰的に (ディレクトリの中にディレクトリがあれば、中のディレクトリを全てたどって) 変更します。
```

- ファイル作成のモード
ファイルを新規に作成すると、ユーザごとに規定されたパーミッションである 644、もしくは 664といったパーミッションが設定されてファイルが作成されます。umask コマンドを使うことで、指定したパーミッションでファイルを作成するように制限できます。

```
umask [8 進数のモードのマスク値]
```

# 9章 シェルスクリプト

- シェル
第 1 章でカーネルは OS の基本部分であり、ハードウェアを操作するほかさまざまな機能を司っていると説明しました。
シェルとは、貝殻 (=Shell) という意味です。カーネルが提供する機能を操作する際に、OS と対話的に操作する必要があります。シェルは OS の、特にカーネル部分を包み込んでいることからその名があり、対話機能を提供するものです。シェルはコマンドの入力を受け付けそのコマンドを実行し、入力したユーザに対しその結果を返す役割があります。


- シェルスクリプト
/etc ディレクトリと/home ディレクトリを圧縮して外部サーバーにコピーするといった流れを考えてみましょう。実際に実行するコマンドを列挙するとたとえば以下のような方法が考えられます。

```
# tar cvzf 120626-etc.tar.gz /etc
# tar cvzf 120626-home.tar.gz /home
# scp 120626-etc.tar.gz root@backup.local.example.com:~/backup
# scp 120626-home.tar.gz root@backup.local.example.com:~/backup
```

- シェルスクリプトの作成
シェルスクリプトは、テキストで記述します。vi 等のテキストエディタを利用してください。
lsdate.sh というファイルに、ls と date コマンドを実行するシェルスクリプトを記述してみましょう。
```
vi lsdate.sh

#!/bin/bash
ls
date
```

- パーミッションの変更
シェルスクリプトを実行するには、パーミッションを変更してファイルの実行権限をつける必要がある

```
chmod u+x lsdate.sh
```

これで所有者に実行権限が与えられました。実行権限をシェルスクリプトにつけたら早速実行してみましょう。

```
./lsdate.sh
```

-  echo コマンド
echo コマンドは引数で与えた文字列を標準出力に出力するコマンドです。

```
echo [オプション] 文字列

オプション
-n
    改行を抑制します。通常の出力は改行されますが、このオプションがあると改行されません。
```

- 変数
プログラミングをする上で、非常に重要な考え方が、変数です。変数は、簡単に言うと「ハコ」で、中に数値や文字列が入ります。ちょうど、中学生の数学のときに習った x や y がそれにあたります。シェルスクリプトプログラミングでは、変数に数値や文字列を代入し、それを利用することができます。変数の代入は「=」を使って行ない、参照は「$」をつけて行います。

```
$ abc=123
$ echo $abc
123
```

変数 abc に 123 を代入しました。bash では、一次元の配列変数を使用することができます。要素は角括弧 [] で囲みます。配列変数の内容を表示する場合は、$の後ろに波括弧{}で配列変数を囲みます。

```
$ abc[0]=123
$ abc[1]=456
$ echo ${abc[0]}
123
（abc[0] の内容を表示する）
$ index=1
$ echo ${abc[$index]}
456
```

- シェル変数と環境変数
シェルには、2 種類の変数があります。シェル変数と環境変数です。シェル変数は、実行しているシェルの内部でのみ有効です。環境変数は、そこから実行されたコマンド内でも有効になります。環境変数は、シェル変数から作成できます。

export コマンドを使って、環境変数を作成してみましょう。

```
 export abc
（シェル変数 abc を環境変数 abc にする）
$ export xyz=234
（環境変数 xyz を作成し 234 を代入する）
```

一つ目のコマンドでは abc という環境変数を作成しています。abc には値を代入していません。
二つ目のコマンドでは xyz という環境変数を作成しています。xyz には 234 を代入しています。
次に、2 つのスクリプト BBB.sh と CCC.sh を使って、シェル変数と環境変数の動作の違いについて確認してみましょう。

```
$ cat BBB.sh
#!/bin/bash
xxx=123 # シェル変数 xxx に 123 を代入する
export yyy=234 # 環境変数 yyy に 234 を代入する
echo xxx=$xxx in BBB.sh # 変数 xxx の値を表示する
echo yyy=$yyy in BBB.sh # 変数 yyy の値を表示する
./CCC.sh # CCC.sh を実行する
$ cat CCC.sh
#!/bin/bash
echo xxx=$xxx in CCC.sh # 変数 xxx の値を表示する
echo yyy=$yyy in CCC.sh # 変数 yyy の値を表示する
$ ./BBB.sh
xxx=123 in BBB.sh
yyy=234 in BBB.sh
xxx= in CCC.sh
yyy=234 in CCC.sh
```

このシェルスクリプトを実行した時、シェルスクリプト CCC.sh の中で xxx の値は表示されません。シェル変数は引き継がれないからです。一方で、yyy は環境変数なので CCC.sh まで引き継がれるため、値が表示されます。

-  read コマンド
read コマンドは、標準入力からデータを読み込みます。すでに変数にデータが入っていた場合、新しいデータに上書きされます。

```
read 変数名
```

```
$ echo $abc
123
（シェル変数 abc の中身が表示されます）
$ read abc
aaabbbccc
（何か入力します）
$ echo $abc
aaabbbccc
（シェル変数 abc の中身が入れ替わっています）
```

- シェル変数
シェル変数の一覧を表示する場合は、set コマンドを利用します。また削除する場合は、unset を利用します。
```
$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:loginBASH_ALIASES=()
abc=aaabbbccc
$ set | grep ^abc
abc=aaabbbccc
（abc で始まるシェル変数のみ確認します）
$ unset abc
（シェル変数 abc を削除します）
$ set | grep ^abc
$ （abc で始まるシェル変数のみ確認します）
```

- 環境変数
現在の環境変数の一覧を表示する場合は、env コマンドを利用します。また登録済みの環境変数を削除するときは、unset コマンドを利用します。

```
$ env
ABC=999999
HOSTNAME=host1.alpha.jp
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
（略）
$ env | grep ^ABC
ABC=999999
（ABC で始まる環境変数のみ確認します）
$ unset ABC
（環境変数 ABC を削除します）
$ env | grep ^abc
$ （ABC で始まる環境変数のみ確認します）
```

- 引用符
シェルスクリプトにおいて、文字列を引用符で囲むことができます。利用できる引用符には’(シングルクォート)、"(ダブルクォート)、‘(バッククォート) があり、使用される引用符により囲まれた文字列の処理が異なります。シングルクォートで囲まれた文字列の中に、参照用の「`$`」付きの変数がある場合、「`$`」も文字列として認識されるため、変数は展開されません。ダブルクォートの場合、引用符内の「`$`」付き変数は展開された文字列になります。バッククォートで囲まれた文字列はコマンドとして解釈され、このとき「`$`」付きの変数があれば、それを展開した上でコマンドが実行されます。引用符は入れ子が可能です。

```
$ ABC=123
$ echo 'Value of ABC is $ABC.'
Value of ABC is $ABC.
（$ABC が文字として認識されそのまま表示された）
$ echo "Value of ABC is $ABC."
Value of ABC is 123.
（$ABC が変数として認識され、内容である 123 が展開された）
$ XYZ=`date`;
$ echo "It is $XYZ now."
It is Thu Mar 20 06:08:14 JST 2017 now.
（$XYZ に date コマンドの実行結果が入っている）
$ echo "It is `date` now."
It is Thu Mar 20 06:08:14 JST 2017 now.
（ダブルクォートで全体の文字列を囲み、バッククォートで囲んだ date コマンドを挿入して、変数 XYZ への代入を省略）
```

- 引数
シェルスクリプトは、実行時にオプションを引数として参照することができます。引数は$1, $2…など$の後に引数の番号を指定することで参照できます。

```
$ cat args.sh
#!/bin/bash
echo '$1:' $1;
echo '$2:' $2;
echo '$3:' $3;
echo '$0:' $0;
echo '$#:' $#;
$ ./args.sh aaa bbb ccc
$1: aaa
$2: bbb
$3: ccc
$0: ./args.sh
$#: 3
（$1-$3 は引数、$0 は実行コマンド名、$#は、引数の数を示す）
```

- shift 文
shift コマンドは、引数の順序をずらします。shift を実行すると、`$2` が`$1` に、`$3` が`$2` に・・・になります。

```
$ cat argsshift.sh
#!/bin/bash
echo '$1:' $1;
echo '$2:' $2;
echo '$3:' $3;
shift
echo '$1:' $1;
echo '$2:' $2;
作成したスクリプトに対して、変数を渡してみます。
$ ./argsshift.sh aaa bbb ccc
$1: aaa
$2: bbb
$3: ccc
$1: bbb
（$1 が bbb に変わった）
$2: ccc
（$2 が ccc に変わった）
```

- エスケープシーケンス
プログラミング言語には、特別な扱いを受ける文字があります。例えば、echo コマンドで、「Valueof ABC is "123".」のように "(ダブルクォート) を出力する方法を考えてみましょう。

```
 ABC=123
$ echo "Value of ABC is "$ABC"."
Value of ABC is 123.
($ABC を""で囲いましたが、""が表示されません)
$ echo "Value of ABC is Y"$ABCY"."
Value of ABC is "123".
(表示したい"の直前に「Y」を付けることで"を表示できます)
```

他にも方法はないでしょうか。

```
$ echo 'Value of ABC is "$ABC".'
Value of ABC is "123".
(この例のように、文字列全体を'(シングルクォート) で囲むことでも"(ダブルクォート) を表示できます)
$ echo "Value of ABC is Y$ABC."
Value of ABC is $ABC.
（ダブルクォートで囲んだ文字列内で「$」をそのまま表示したい場合にも直前の「Y」で可能です）
```

```
このように、シェルスクリプトでは、Y（バックスラッシュ）はエスケープ文字と呼ばれ、特別な
文字で直後の１文字の扱いを変更します。使用する引用符との組み合わせで、文字の扱いを変えた
い場合に有効です。Y（バックスラッシュ）は改行コードにも有効です。Y（バックスラッシュ）を
行末に付与することで、文字列の途中で折り返すことができます。適切に改行を入れることでコマ
ンドの視認性を向上できます。
```

-  source コマンド
source コマンドは、bash などのシェルの内部コマンドで、指定されたファイルを読み込んでシェル環境を設定します。ファイル内容はシェルコマンドと解釈して実行します。


## 条件分岐

- if文

文字列比較を行なう演算子
|演算子| 比較内容
|:-:|:-:|
|a == b |a と b が等しければ真
|a != b |a と b が等しくなければ真

数値比較を行なう演算子

|演算子 |比較内容
|:-:|:-:|
|a -eq b| a と b が等しい（equal to）ければ真
|a -ne b |a と b が等しくなければ（not equal to）真
|a -ge b| a が b 以上（greater than or equal to）であれば真
|a -le b| a が b 以下（less than or equal to）であれば真
|a -gt b| a が b より大きい（greater than）値であれば真
|a -lt b| a が b 未満（less than）であれば真

ファイル属性の確認を行なう演算子

|演算子| 内容
|:-:|:-:|
|-f ファイル名| 通常ファイルなら真
|-d ファイル名| ディレクトリなら真
|-e ファイル名| ファイルが存在すれば真
|-L ファイル名| シンボリックリンクなら真
|-r ファイル名| 読み取り可能ファイルなら真
|-w ファイル名| 書き込み可能ファイルなら真
|-x ファイル名| ファイルが存在して、実行権限があれば真
|-s ファイル名| サイズが 0 より大きければ真

シェルスクリプトでは、case 文が用意されており、一対多の分岐が記述できるようになっています。

```
case 変数 in
    値 A)
        処理 1;;
    値 B)
        処理 2;;
esac
```
変数の値が値 A のとき、処理 1 が実行されます。最後は case 文の逆からの記述である esac で終わっていることが重要です。値はパイプ記号（|）で区切って複数指定することができます。

```
$ cat case.sh
（次のように case.sh を作成して実行します）

#!/bin/bash
case $1 in
    a|A)
        echo "引数に a または A が入力されました";;
    b|B)
        echo "引数に b または B が入力されました";;
esac
```

また、どの値にもマッチしなかった場合の処理を記述するには、値にアスタリスク（*）を用います。

```
$ cat defaultcase.sh 次のように defaultcase.sh を作成し、実行します。

#!/bin/bash
case $1 in
    1)
        echo "引数に 1 が入力されました";;
    2)
        echo "引数に 2 が入力されました";;
    *)
        echo "1,2 以外が入力されました";;
esac
```

- for 文
for 文は値を列挙し、それを対象に処理を繰り返します。

```
for 変数 in 値のリスト
do
    処理
done
```

- while/until 文
while 文は、条件が成立している間ループを繰り返す（条件が成立しなくなったら終了）という処理で利用されます。until 文はそれの反対で、条件が成立してない間ループを繰り返す（条件が成立したら処理を終了）、という用途に用いられます。

```
while 条件式
do
    処理
done
until 条件式
do
    処理
done
```

- select 文
select 文は、ユーザに対し数値による入力を促します。

```
select 変数 in リスト
do
    処理
done
```

```
select name in "apple" "banana" "orange"
do
    echo "You selected $name";
done
```

これを実行すると、以下のような実行結果になります。
```
1) apple
2) banana
3) orange
$? 1
You selected apple
（「Ctrl」C で中止）
```

1-3 を入力すると、do～done 内部が実行されます。

- 繰り返しの制御
break や continue を用いることで、繰り返しを制御することができます。break は繰り返しを終了して、continue は繰り返しの先頭に戻る役割があります。

```
$ cat ./sample.sh
while true
do
    echo "Continue? (y/n)"
    read input
    case $input in
        n) break
            ;;
        y) continue
            ;;
        *) echo "Please input y or n."
            ;;
    esac
done
```

## サブルーチン
プログラミングをする上で、一連の処理をまとめて、再利用できるようにしたものを、サブルーチンといいます。サブルーチンは言語体系によりさまざまな呼ばれ方をしていて、シェルスクリプトでは関数と呼ばれています。

- 関数
関数は、引数とよばれるデータを与え、処理をして結果を返すという機能の集まりです。

```
function 関数名
{
    処理
}
```
または
```
関数名 ()
{
    処理
}
```

- return 文
シェルスクリプトの関数で、結果を返すときは return 文を実行します。

```
return 変数名
```

return 文を実行すると、関数内での処理はそこで終了し、変数が関数の呼び出し元に返されます。

-  sh コマンド
sh 自身はシェルを起動するコマンドですが、-x オプションを付けて引数にシェルスクリプトを指定すると、コマンドや変数の中身を表示しながらスクリプトを実行します。繰り返しの項で使用した sample.sh を sh コマンドにて実行してみましょう。
```
$ sh -x ./sample.sh
+ true
+ echo 'Continue? (y/n)'
Continue? (y/n)
+ read input
y
（y を入力）
+ case $input in
+ continue
+ true
+ echo 'Continue? (y/n)'
Continue? (y/n)
+ read input
n
（n を入力）
+ case $input in
+ break
```

# 10章　ネットワークの設定と管理

Linux がネットワークにつながれたとき、必要とされる基礎知識と確認コマンドと設定を見ていきます。

コンピュータ間をケーブルや無線機能で接続したシステムをネットワークと呼びます。Linux をOS に利用したコンピュータほとんどはネットワークに接続して利用します。物理的なネットワークはコンピュータ間をツイストペアケーブルでつなぎます。最近では有線のネットワークに加えて無線機能を使って接続したり、有線と無線の混在したネットワークもあります。

- ローカルエリアネットワークとワイドエリアネットワーク
学校や自宅などの閉じられた複数のコンピュータを相互接続したネットワークをネットワークをローカルエリアネットワーク (LAN) と呼びます。離れた場所にある LAN と LAN を結んだネットワークのことをワイドエリアネットワーク (WAN) と呼びます。LAN はコンピュータ同士を LANケーブルで結び、WAN は LAN 同士を通信回線で結びます。

-  IP とは
ネットワークでつながったコンピュータ同士の間では、決まった手順（プロトコル）に従ってデータを送受信しています。今日一般的に使われているイーサネット規格のネットワークはプロトコルとして TCP/IP を利用しています。TCP/IP の IP(Internet Protocol：インターネット プロトコル) は手順の基本です。IP は送り先とデータからなるパケットを送るだけの簡単な仕組みです。ping コマンドでデータが送信され、データを受けた機器 (サーバやルータなど) から確認メッセージかが返ってくるかを確認できます。

```
ping ターゲット

ターゲット (ホスト名や IP アドレス) にデータを送り、返答が戻るまでの時間を表示します。
-c オプションを付けて、ping を発行する回数を指定することもできます。
```

-  TCP とは
TCP(Transmission Control Protocol) は IP(Internet Protocol) の仕組みを使ってデータを送る手順です。IP は読んで字のごとく、インターネットにおいて情報の伝達を行なう手順 (プロトコル)です。TCP では、データのまとまりを 1 つ受け取ると、すぐにデータの破損などのエラーを確認し、間違っている場合はデータの再送を依頼します。

- UDP とは
UDP(User Datagram Protocol) はエラー確認やデータの再送制御は行いませんが（必要であれば上位のアプリケーションでそのような処理を実装する必要があります）、その分データを高速に送ることができるので、小さなデータや映像のような多少欠損しても問題なく、信頼性よりも速度を求められる通信に適しています。

- IP アドレス
TCP/IP でデータを送受信するには発送元と発送先の場所を表すアドレスが必要です。インターネットでは IPv4(Internet Protocol version 4) と IPv6 という 2 つのプロトコルが使われています。IPv4 では 4 バイト (16 進数で 8 桁) で表せるアドレスで、4 バイトのアドレスは 1 バイト (16 進数で 2 桁) ごとで 10 進数に変換してでつないで表記します。プライベートな IP アドレスを除いたIP アドレスをグローバルな IP アドレスと呼びます。グローバルな IP アドレスは NIC(日本ではJPNIC) に管理されており、許可なく利用 (設定) できません。



IP アドレスのクラス

IPv4 で使われる IP アドレスはネットワークアドレスとホストアドレスをつなげた形となります。ネットワークアドレスは次の表のサブネットマスクのビットが立っている (255 の様な) 部分で、ホストアドレスはサブネットマスクのビットが立っていない (0) の部分です (サブネットマスクに関しては後述します)。IP アドレスは学校や会社などの組織に対して割り当てられるので、割り当てられた組織で使われる範囲は連続したアドレスです。ネットワークアドレスの長さにより、A から Cのクラスがあり、クラス D やクラス E などの特殊なクラスも予約されています (現状では A から Cのクラスが実用されます)。

ホストアドレスにおいて、ホスト部の全てのビットが 0 のアドレスはそのネットワーク自身のアドレスを示し、ホスト部の全てのビットが 1 のアドレスは、そのネットワーク内の全てのホストに届くブロードキャストアドレスという特殊なアドレスを示します。これらのアドレスは実際にコンピュータに割り当てることはできません。

|アドレスの範囲 |サブネットマスク |クラス |IPアドレスの数
|:-:|:-:|:-:|:-:|
|0.0.0.0～127.255.255.255| 255.0.0.0| クラスA| 16,777,216 個
128.0.0.0～191.255.255.255 |255.255.0.0 |クラスB |65,536 個
192.0.0.0～223.255.255.255 |255.255.255.0| クラスC| 256 個
224.0.0.0～239.255.255.255 ||クラス D
240.0.0.0～255.255.255.255 ||クラス E

- プライベート IP アドレス
ローカルなネットワークで自由に利用可能な IP アドレスが用意されており、プライベート IP アドレスと呼びます。プライベート IP アドレスは次のようになります。

プライベート IP アドレスとクラス

アドレスの範囲 |サブネットマスク |クラス
|:-:|:-:|:-:|
10.0.0.0～10.255.255.255 |255.0.0.0 |クラス A
172.16.0.0～172.31.255.255 |255.255.0.0 |クラス B
192.168.0.0～192.168.255.255| 255.255.255.0 |クラス C

- サブネットマスク
IP アドレスのうち、ネットワークアドレスとホストアドレスを識別するための数値をサブネットマスクといいます。サブネットマスクは通信先ホストが同一ネットワークにいるかいないかの判断に使われます。ネットワーク (IP アドレスの集まり) はサブネットマスクを変えることで、複数のネットワークに分けて、効率的に IP アドレスを利用できます。

- CIDR（サイダー）表記

IP アドレスのクラスを学習したばかりですが、最近よく使用されるようになったクラス分けをしない CIDR （Classless Inter-Domain Routing）表記について学習します。すでに、前節の図にも使用されていますが、IP アドレスのネットワーク部とホスト部の境目を/（スラッシュ）の後に続くビット数で指定する方法です。
まず、表記の例を３つ下記に示します

    • 127.0.0.1/8
        – IP アドレスの先頭から８ビットをネットワーク部として、残りの２４ビットをホスト部
        とした設定です。クラスＡと同じ扱いで、それぞれ下記となります。
            ∗ IP アドレス : 127.0.0.1
            ∗ ネットマスク : 255.0.0.0
            ∗ ネットワーク : 127.0.0.0
            ∗ ブロードキャスト: 127.255.255.255
            ∗ アドレスの数 : 16,777,216 個

    • 192.168.0.1/24
        – IP アドレスの先頭から２４ビットをネットワーク部として、残りの８ビットをホスト部
        とした設定です。クラスＣと同じ扱いで、それぞれ下記となります。
            ∗ IP アドレス : 192.168.0.1
            ∗ ネットマスク : 255.255.255.0
            ∗ ネットワーク : 192.168.0.0
            ∗ ブロードキャスト: 192.168.0.255
            ∗ アドレスの数 : 256 個
            
    • 192.168.0.1/28
        – IP アドレスの先頭から２８ビットをネットワーク部として、残りの４ビットをホスト部
        とした設定です。クラスＣのサブセットの扱いで、それぞれ下記となります。
            ∗ IP アドレス : 192.168.0.1
            ∗ ネットマスク : 255.255.255.240
            ∗ ネットワーク : 192.168.0.0
            ∗ ブロードキャスト: 192.168.0.15
            ∗ アドレスの数 : 16 個

- 経路の確認
LAN と LAN をつなげる場合、もしくは LAN と WAN をつなげる場合は、ゲートウェイ（ルーター）が間に接続されています。

インターネットは多くのネットワークがつながって構成されていて、いくつものネットワークをデータが中継されるので、いくつものゲートウェイを通ってデータが送受信されます。自分が利用しているコンピュータから通信先のコンピュータまでに仲介する複数のゲートウェイを調べるにはtraceroute コマンドと tracepath コマンドがある
```
traceroute ターゲット
tracepath ターゲット
```
ターゲットや途中のゲートウェイへデータを送り、ゲートウェイから返答が戻ってくる時間を表示します。

## ネットワークインターフェース
ネットワークへアクセスするためにネットワークインターフェースが必要です。物理的なネットワークインターフェースとしてネットワークインターフェースカード (NIC) があります。現在は、多くの場合、ネットワークインターフェースがコントロールチップの中に統合されています。プログラムが内部的に使う仮想のネットワークインターフェースとしてループバックインターフェースがあります。

-  IP アドレスを確認
IP アドレスの確認は、ip コマンドの他、NetworkManager の nmcli, nmtui コマンドでも行えます。また、従来からの ifconfig コマンドでも確認できます。
```
ip a[ddress] [インターフェース]
ネットワークインターフェースに設定された IP アドレスとサブネットマスクを表示します。

nmcli [インターフェース]
コマンドラインでネットワークの設定ができるインターフェイスです。オプション無しで実行すると、現在の設定を表示します。

nmtui
会話型でネットワークの設定ができるインターフェイスです。
```
インターフェース (lo や enp0s3 など) を省略すると、全インターフェース情報を表示します。

ip コマンドで表示された lo がループバックインターフェース (機器が正常に稼動しているか確認するためにデータを送って試すループバックテストなどに利用) で、enp0s3 が物理的に存在するEthernet(イーサネット）のネットワークインターフェースです。

-  IP アドレスの設定ファイル
RedHat Linux 系のディストリビューションは IP アドレスの設定を 2 つの設定ファイルに記述しておき、ブート時にはそれらの設定ファイルにより設定されます。
/etc/sysconfig/networkscripts/ifcfg-XXX 設定ファイルは XXX インターフェースの IP アドレスとサブネットマスクなどを記述します。XXX はループバックインターフェースの場合は lo、ネットワークインターフェースカードの場合は enX0Y,enX1Y…とデバイスの種類とスロット位置により番号が振られます。
/etc/sysconfig/network-scripts/ifcfg-XXX 設定ファイルの主な内容は次の様になります。

 ifcfg 設定ファイルの項目
|項目| 内容
|:-:|:-:|
|ONBOOT |起動時にアドレスを自動設定する（yes）か設定しない（no）
|DEVICE| ネットワークインターフェイス
|HWADDR |MAC アドレス

BOOTPROTO 以降の設定を利用 (static) か自動取得 (dhcp)

固定アドレス（static）を設定する場合の設定項目

|項目| 内容
|:-:|:-:|
|IPADDR| IP アドレス
|NETMASK| サブネットマスク
|NETWORK| ネットワーク

起動時にアドレスを自動設定するには DHCP 機能が提供された環境が必要です。/etc/sysconfig/network 設定ファイルはデータが他のネットワークへ転送されるゲートウェイのアドレスとホスト名を記述します。/etc/sysconfig/network 設定ファイルの主な内容は次の様になります。

ネットワークの項目
|項目| 内容
|:-:|:-:|
|NETWORKING| ネットワークを有効にする（yes）か無効にする（no）
|HOSTNAME |ホスト名
|GATEWAY |ゲートウェイアドレス

MAC アドレスはハードウェアに設定されているユニークな番号であり、正しい MAC アドレスが設定されていない場合通信することができなくなるため、自動的に認識された番号を書き換えないようにしましょう。ブロードキャストは 1 対多で通信をする場合に使われるアドレスで、ホスト部のビットが全部１のアドレスです。

- インターフェースの設定
ネットワークのインターフェースは設定ファイルを書き換えて、systemctl コマンドに restart オプションを付けて再起動することで変更できます。

- ルーティング
ネットワークの状況を表示するための ip route コマンドや ss コマンドがあり、これらのコマンドでデータが流れる方向 (ルーティング) を調べられます。

```
ip route [オプション]
ss [オプション]

ネットワークの状況を表示します。

ss のオプション
-V
    バージョン情報
-a
    全てのソケットを表示
-n
    サービス名に変換せずに表示
-r
    ホスト名を名前解決
-p
    ソケットを使用しているプロセス ID を表示
-s
    集約したソケット情報
-4
    IPv4 のソケットのみ表示. 他のオプションと併用.
-6
    IPv6 のソケットのみ表示. 他のオプションと併用.
-t
    TCP のソケットのみ表示
-u
    UDP のソケットのみ表示
-e
    詳細なソケット情報を表示
```

- ルーティングの変更
ルーティングの変更を行なうには、ip route コマンドを使用します。ip route コマンドの実行には、管理者権限が必要です。


```
ip [オプション] r[oute] {コマンド|help}
または
route (非推奨）

ip route {add|del} ターゲット/サブネット via ゲートウェイアドレス dev インタフェース

route add [-net|-host] ターゲット [netmask サブネットマスク] [インタフェース]
```

route コマンドでは、add を指定するとルーティングに経路を追加します。ターゲットには、-netを指定した場合にはネットワークアドレスを、-host を指定した場合にはホストアドレスを宛先として設定します。サブネットマスクの指定を省略した場合は、ターゲットに設定したアドレスから判別されたクラスに該当するマスク値が設定されます。インタフェースを省略すると、カーネルが自動的に最適なデバイスを設定します。

ip route コマンドでは route コマンドと違って -net, -host を指定できません。代わりに CIDR表記で指定します。ターゲット/32 だと-host と同様にホストを指定でき、ターゲット/xx(32 以外)だと-net と同様にネットワークを指定できます。

```
ip route del ターゲット/サブネット via ゲートウェイアドレス
```

## DNS を使う設定

名前解決の機能を使うには/etc/nsswitch.conf ファイルで何を使うか指定します。ファイルを使う指定があれば/etc/hosts ファイルを参照し、DNS(Domain Name System：ドメイン・ネーム・システム) を使う指定があれば、/etc/resolv.conf ファイルを見て DNS サーバを使います。
/etc/nsswitch.conf ファイルでは hosts:の項目でファイル (files) や DNS(dns) を指定します。

hosts:の項目のファイルや DNS の優先順位は記述された順番となります。
```
hosts: files dns
```
/etc/resolv.conf ファイルには nameserver で DNS サーバのアドレスが登録されています。デ
フォルトでは、このファイルは NetworkManager 経由で管理されます。

- 名前 (FQDN)
インターネットでは IP アドレスだけを使うと人間にはわかり辛いので、FQDN(Fully Qualified Domain Name) と呼ばれる名前 (例：www.lpi.or.jp) を使えます。IP アドレスと名前の対応は digコマンドや nslookup コマンドで調べられます。

```
nslookup ターゲット
ターゲットの名前と IP アドレスを返します。
```

- ポート番号
TCP/IP で通信をする場合は、IP アドレスに加えてサービスごとにポート番号を使います。ポート番号がどのサービスに対応するかは規格として取り決められており、一般的なサービスはサービス番号との対応が/etc/services ファイルに書かれています。

ポート番号と対応サービス
|項目 |ポート番号範囲| 内容
|:-:|:-:|:-:|
|WELL KNOWN PORT NUMBERS |0～1023 |一般的なポート番号
REGISTERED PORT NUMBERS |1024～49151 |登録済みポート番号
DYNAMIC AND/OR PRIVATE PORTS |49152～65535 |自由に利用できるポート番号

サーバで使われる主なポート番号と対応するサービス
|ポート番号 |サービス名
|:-:|:-:|
|20 |FTP（データ）
|21 |FTP（制御）
|22 |SSH
|23 |Telnet
|25 |SMTP
|53 |DNS
|80 |HTTP
|443 |HTTPS

- サービスの確認
サーバではホームページを見せるなどのサービスを提供するプログラムを主に動かします。Linuxのサービスやネットワークの状況を表示する ss コマンドは、提供されているサービスを調べて表示することができます。

## ネットワークセキュリティの設定

ネットワークセキュリティのために TCP ラッパー (TCP Wrapper) という機能が提供されています。TCP ラッパーでセキュリティを強化する場合は、サービスが TCP ラッパー機能を提供するライブラリ (プログラム) を利用している必要があります。アクセスを制限する/etc/hosts.denyファイルとアクセスを許可する/etc/hosts.allow ファイルを用意する必要があります。2 つの制御ファイルはサービスを提供するプログラムのリストに対してコロン (:) で区切り、適応するネットワークや IP アドレスやホスト名やドメイン名などのクライアントのリストを書き、ファイルによって許可または拒否します。クライアントのリストの後には:で区切り、制限に引っかかる場合に実行するシェルスクリプトを書けます。全てを表す時はリストの代わりに ALL と記述します。制御ファイルは次のように記述します。

- ファイアウォール (firewalld) の設定
CentOS 7 では、iptables に代わり、firewalld が推奨されています。iptables も使用できますが、使用するには firewalld を無効にする必要があります。

firewalld の状態は、firewall-cmd コマンドまたは systemctl コマンドで確認できます。
```
# firewall-cmd --state
（ファイアウォールの状態を表示）
running
```

```
firewall-cmd [オプション...]
オプション
--permanent
    永続的設定に使用します。
    このオプションを使用しない場合、実行中の firewalld に対して処理されます。
    このオプションを付けて実行した設定を有効にするには、--reload オプションを使用するか、firewalld の再起動が必要です。
--list-all
    追加、有効化されている項目をすべて表示します。
--list-services
    追加、有効化されているサービスを表示します。
--add-services サービス
    サービスを有効にします。
--remove-services サービス
    サービス無効にします。
--reload
    permanent 設定を再読み込みします。
```


# 11章 プロセス管理

- プロセスとは
Linux では実行中のプログラム（アプリケーション）を管理する単位をプロセスと呼びます。コマンドインタープリターであるシェル自身もプロセスです。下記にシェルからコマンドを実行した場合を例に、プロセスの親子関係とプロセス生成から消滅までの流れを説明します。
「ユーザがシェルからコマンドを実行すると、シェルは子プロセスとして自分の分身を作ります（これを fork と呼びます。）。次に、シェルは子プロセスにコマンドの実行（これを exec と呼びます。）を任せ、子プロセスの終了を待ちます。子プロセスはコマンドの実行を終えると親プロセスに終了を伝え、消滅します。親プロセスは子プロセスの終了を受け取り、シェルプロンプトを表示し、ユーザの次のコマンドに備えます。」

- スケジューリング
Linux は、１つの CPU でも複数のユーザが同時にログインでき、複数のプロセスを同時に実行できる、マルチユーザ、マルチタスクの OS です。しかし、厳密には瞬間瞬間では、プロセスは１つしか実行されず、それぞれのプロセスの実行順序は Linux のスケジューラによって管理されています。
各プロセスは Run Queue と呼ばれる待ち行列で待機し、自分が CPU を利用できる順番を待ちます。自分の順番が来ると CPU を使用することができ、一定時間（タイムスライス）だけ処理を前に進めます。一定の時間が超過すると、またキューで次の CPU 使用機会を待つことになります。このようなスケジューリングをラウンドロビン方式と呼びますが、その他に FIFO(First In First Out)方式もあります。
各プロセスはキューで待機しますが、プロセスによっては優先度の高いもの、それほど高くないものもあります。そのパラメータの一つに Nice 値があります。Nice 値は、-20 から 19 までの値を取り、-20 が最も実行優先度が高く、19 が最も低くなっています。nice コマンドにより実行優先度をプロセスに指定したり、実行中のプロセスについては、renice コマンドにより優先度を変更することができます。

- フォアグランドジョブとバックグラウンドジョブ
プロセスとよく似た管理単位としてジョブがあります。Linux が実行中のプログラムを管理する単位であるプロセスに対して、ジョブはシェルが管理するプログラムの単位です。シェルからコマンドを実行する場合、ジョブをフォアグラウンドとバックグランドに切り替える機能があります。
例えば、処理に時間のかかるジョブを実行した時に、何もせずジョブの完了を待つのではなく、その間に別の作業をしたり、進捗を確認したい場合があります。そんな時、ジョブをバックグラウンドで実行すれば、同じ端末から別のコマンドを実行することができます。他にも、プログラムの編集作業を中断して、プログラムを試行し、また編集作業に戻る場合などに有効です。なぜなら、編集を中断した場合、編集の undo や redo が中断前後で継続できるからです。

- プロセス ID
Linux のプロセスには一意の ID であるプロセス ID(PID) が付与されます。自身の PID は $$ で取得できます。
```
$ echo $$
13592
```

```
ps [オプション]
現在実行されているプロセスのスナップショットを表示します。
オプション
-A
    全てのプロセスを選択する。-e と等しい。
e
    コマンドの後に環境を表示する。
l, -l
    長いフォーマット。-（ダッシュ）のあるなしで表示は異なる。
w, -w
    出力幅を広げる。このオプションを 2 つ指定すると、幅の制限がなくなる。
```

- シグナル
Linux には、プロセスにシグナルというイベントを送信してプロセスを制御する機能があります。シグナルには、シグナル番号およびシグナル名が割り当てられており、代表的なものに以下のシグナルがあります。

代表的なシグナル
|シグナル番号 |シグナル名 |意味
|:-:|:-:|:-:|
|1 |HUP |ハングアップ (Hang Up)
|2 |INT |割り込み (Interrupt)
|3 |QUIT |強制停止 (Quit)。コアダンプ生成。
|9 |KILL |強制終了 (Kill)
|15 |TERM |終了 (Terminate)。kill コマンドのデフォルトシグナル。

-  top コマンドと pstree コマンド
ps コマンドの他にプロセスの状態を表示するコマンドとして top コマンドがあります。top コマンドは実行中のプロセスの状態をダイナミックに表示します。CPU やメモリの使用率などでソートしたり、top から指定したプロセスにシグナルを送信することもできます。
また、プロセスの親子関係をツリー表示する pstree というコマンドもあります。

- プロセス間通信
Linux 上である処理を完了するのに、１つのプロセスで完結する場合もありますが、複数のプロセスがコミュニケーションを取りながら同期したり、動作を変更して達成することが多々あります。これをプロセス間通信と呼びます。
先に学習したパイプやシグナルも Linux の代表的なプロセス間通信の手法です。その他に、下記の手法があります。

• System V IPC (Inter Process Communication)
    – 共有メモリ（shared memory)
    – セマフォ (semaphore)
    – メッセージキュー (message queue)
• ソケット

それぞれ次のような特徴があります。
• パイプ:　１つのプロセスの標準入出力をつなぎ替えます。パイプ（｜）の左側のコマンド（プロセス）の標準出力を右側のコマンド（プロセス）の標準入力につなぐことで、通信を実現します。
• シグナル: 特定のシグナルの受信を持って特定の処理を開始するなど、同期を実現します。
• 共有メモリ（shared memory): 特定のメモリ領域を複数のプロセスで共有することでメッ
セージの受け渡し等が行えます。
• セマフォ (semaphore): 資源のロックを行い、複数のプロセス間で同時に書き込みをしたり
しないよう排他処理を実現します。
• メッセージキュー (message queue): キューにメッセージを格納しておき、複数のプロセス間での非同期の通信を実現します。
• ソケット: ネットワーク経由のホスト間のプロセスでの通信を実現します。

# 12章 ファイル管理
ファイルシステムの説明を読みながら、ファイルシステムの管理コマンドに慣れることで、ファイルシステムの概念と管理操作を身に付けます。ファイルシステムの構造を把握するために説明するのは ext3 ファイルシステムにおけるファイルとディレクトリ、i ノード、リンクという用語です。
用語を理解するために、df コマンド、du コマンド、fdisk コマンド、fsck コマンド、mount コマンド、umount コマンドに加え、ln コマンドを実行します。

- ファイルシステムとは
ファイルシステムとは、ファイル名・更新日付などの属性データ・ファイルデータ本体を効率よく管理するためのしくみです。ファイルシステムにはいくつか種類があり、利用するファイルシステムにより、ファイルをアクセスした時に得られる効率や安全性が変わります。ファイルシステムの概要をつかむと、今までに出てきたコマンドの理解度も上がるでしょう。

- パーティションとは
ハードディスクを利用するために、ハードディスクを区切った単位です。ディスクの内部を複数のパーティション（領域）に区切る作業が必要となります。パーティションを分割する作業をパーティショニングと呼びます。

- Linux のディレクトリ構造
ファイル単位でデータを管理すると段々とファイル数が多くなり、ファイル名の管理が難しくなります。ファイル管理の効率化を図るために、多くのファイルシステムと同様に ext3 ファイルシステムでも、ディレクトリという入れ物が用意されています。ディレクトリは複数のファイルをまとめて管理できる上に、他のディレクトリもまとめられます。ディレクトリを使うと、利用目的ごとにファイルをまとめたり、幾つかのディレクトリをディレクトリに入れて管理できるでしょう。Linuxを始めとする Linux のディレクトリ構造は/ディレクトリが大元になるツリー状となっています。

- ファイルシステムの作成方法
ハードディスクを利用するには以下の手順で作成して利用できます。
• パーティションの作成・・・fdisk コマンド
• ファイルシステムの作成・・・mkfs コマンド
• マウント・・・mount コマンド
　以降に出てくるコマンドは/sbin ディレクトリにあるシステム管理用のコマンドです。多くのシステム管理用のコマンドは root ユーザで (管理者になってから) 実行する必要があります。
一般ユーザはシステム管理の権限がないため、システム管理用のコマンドを実行できなかったり、システム管理用のコマンドを実行できても必要な資源 (ハードディスクなど) にアクセスできなかったりします。また、一般ユーザの初期設定では、システム管理用のコマンドが置いてある/sbin ディレクトリが PATH の設定に含まれていないため、/sbin/fdisk の様に絶対パス (/ディレクトリからの指定) でコマンドを実行する必要があります。　本教科書の実行例で、行頭が#になっているコマンドは root ユーザでの作業が必要です。一般ユーザのときは su -コマンドで root ユーザになってからコマンドを実行してください。コマンドの詳しい内容は後ほど説明します。

```
$ su -
パスワード: xxxxxxx
（root のパスワードを入力）
#
（root ユーザに切り替わる）
```

## ディスクのパーティション
fdisk コマンドで、分割されたパーティションの情報を調べたり、パーティションを作成、削除したりできます。

パーティション分割する理由
パーティションを分割するのは以下の理由があります。
• システムとデータのバックアップ頻度を差別化する
• 障害発生時の影響範囲を狭める
• ファイルアクセスの速度向上

```
fdisk [オプション] [デバイスファイル]
ディスクの構造を表示します。
ディスクをパーティション分割します。

オプション
-l
    デバイスのパーティション情報を表示します。
```

- パーティションの分割
コンピュータのハードディスクとして主に SATA と SAS の 2 つのインターフェース (周辺機器を接続するためのハードウェア) 規格が広く使われています。ハードディスクは、1 つのパーティションとして使うか、2～4 つまでのパーティションに分割できます。各パーティションは、基本パーティションまたは拡張パーティションとなります。拡張パーティションは 1 台のハードディスクに1 つだけ作ることができ、拡張パーティションの中には、さらに論理パーティションを複数作ることができます。

パーティション分割の例
    • 基本パーティションを 4 つ
    • 基本パーティションを 3 つ＋拡張パーティションを 1 つ (論理パーティションを 2 つ)
    • 論理パーティションは、基本パーティションと同様にファイルシステムを作成して、ファイルやディレクトリを保管できます。拡張パーティションは、論理パーティションを格納する役割となっており、ファイルシステムを作成することはできません。

パーティションの最大数
    • IDE：63（基本 3 ＋論理 60）
    • SATA：15（基本 3 ＋論理 12）
    • SCSI：15（基本 3 ＋論理 12）

Linux では 4 つ以上のパーティションが必要となるケースが多いので、拡張パーティション 1 つと他の 3 つを基本パーティションという構成で使う場合が多くなります。また、拡張されたハードディスクは基本パーティション 1 つや、LVM(Logical Volume Managemer) 機能を使って複数のハードディスクを統合した 1 つのハードディスクとして大きく使うことも多いでしょう。

- ハードディスクを増設して利用可能にする
Linux マシンにハードディスクを増設して利用可能な状態にします。新しいハードディスクには、データ用の領域と、スワップ領域 (Linux がメモリの代わりにプログラムを置いておく領域) の 2 つを作成します。利用可能にするには、fdisk コマンドでパーティションを 2 つに分割します。パーティションは分割した後からサイズ等の変更が難しいので、あらかじめどのようにパーティションを分割するのか計画してから行ないます。また、既に使用しているハードディスクのパーティションを操作すると、大切なデータが消えてしまいますので、細心の注意を払って進めてください。パーティションを分割する作業をしているときに、指定サイズや分割数の設定ミスに気づいたら、パーティションの変更を保存しないで直ちに終了してください。
パーティションの操作はシステム管理の仕事なので、root ユーザで fdisk コマンドを実行する必要があります。可能であれば、他のユーザがシステムを利用できないランレベル 1(ハードディスクの管理をするときに指定するモードで、管理者のみがコマンドを実行。通常はランレベル 3 やランレベル 5 で動作) の状態で作業をしてください。


ハードディスクを利用するまでの手順

1. 増設前のデバイス構成の確認
2. ハードディスクを増設
3. 増設後のデバイス構成の確認
4. パーティション情報の確認
5. パーティションの作成
6. パーティションの種類の変更
7. パーティション情報の保存
8. 再起動（警告が表示されて、必要な場合）
9. ファイルシステムの作成
10. マウント
11. スワップパーティションの作成
12. スワップの追加
13. 自動マウントの設定

## ファイルシステム

ファイルシステムとは、ディレクトリやファイルの情報やデータをディスクの何処に保存してあるか管理するためのシステム (仕組み) です。ファイルシステムはディレクトリやファイルの、ファイル名やファイルの作成時間やファイルの所有権限などの情報を管理しています。また、ディスクのデータが書いてある場所とデータが書いていない場所なども管理しています。
ファイルシステムはオペレーティングシステムによって利用されるファイルシステムが異なります。Linux の場合はそれぞれのディストリビューションにより採用するファイルシステムは異なりますが、多くの場合は ext3 もしくは ext4 が利用されています。Windows の場合はバージョンは異なるものの多くの領域を管理できる NTFS が利用されている事がほとんどでしょう。CD や DVD、BD では ISO9660 という規格のファイルシステムが使われます。

 Linux で利用できるファイルシステムの一例
|FS 名 |内容 |最大サイズ |最大ファイルサイズ
|:-:|:-:|:-:|:-:|
|ext2 |Berkeley Fast File System を参考にした 16ビット構造|16TB| 2TB
|ext3 |ext2 にジャーナル機能付加と機能拡張 |2～32TB |16GB～2TB
|ext4 |ジャーナリングファイルシステム。ファイルの断片化防止などさまざまな機能拡張によりパフォーマンスが向上 |1EB |16TB
|ReiserFS |小さなファイルの扱いに向いたジャーナリングファイルシステム |8TB |16TB
|XFS |SGI 社が提供したジャーナリングファイルシステム | 8EB| 8EB
|JFS |IBM 社が提供したジャーナリングファイルシステム | 512TB | 4PB～8EB


Windows で利用できるファイルシステムの一例
|FS 名 |内容 |最大サイズ |最大ファイルサイズ
|:-:|:-:|:-:|:-:|
|FAT16 |セクタという領域を 1 次元配列で管理するファイルシステム。現在は使われない |2GB(NT:4GB)  |2GB(NT:4GB)
|FAT32 |セクタという領域を 1 次元配列で管理するファイルシステム。外付ディスクなどで使われており、Windows 以外でも利用できる |2TB(2KB セ クタ:8TB) | 4GB
|NTFS | NT/XP/Vista 用ジャーナリングファイルシステム | 256TB| 16TB(16EB)
|exFAT| フラッシュメディア向けファイルシステム |8ZB(512B セクタ時) | 16TB(16EB)

- ファイルシステムの作成
ハードディスクを利用するためには、パーティションに分割した後ファイルシステムを作成します。ファイルシステムの作成には mkfs コマンドを使用します。

```
mkfs オプション
ファイルシステムを作成します。

オプション
-t
    作成するファイルシステムの種類を指定する。
-c
    ハードディスクの壊れている箇所を検出して、利用しない。
```

- ラベル
ラベルとは、ハードディスクなどのパーティションを認識するための名前です。基本パーティションや論理パーティションにファイルシステムを作るときにラベルを指定するか、または e2labelコマンドでラベルを付けられます。

```
e2label デバイス [ラベル]
    パーティションのラベルを表示します。
    パーティションのラベルを付けます。
```

## マウント
ハードディスクはパーティション分割してファイルシステムを作ってからマウントすると読み書きできます。CD-ROM や DVD-ROM などのリムーバブルメディアもマウントすると読めるようになります。

- マウントポイント
ハードディスクや CD-ROM などを利用する場合は、存在しているディレクトリにマウントする必要があり、マウントするために利用するディレクトリをマウントポイントと呼びます。/として利用されるファイルシステムは/にマウントされており、後から利用するファイルシステムも、必ずどこかのディレクトリにマウントして初めて利用できます。

- マウント（mount コマンド）
ハードディスクやリムーバブルメディアなどをマウントポイントにマウントするために mount コマンドを使います。

```
mount -t タイプ -o オプション デバイスファイル マウントポイント
ハードディスクやリムーバブルメディアをマウントします。

オプション
-t タイプ
    ファイルシステムの ext3 や Windows の msdos、CD と DVD の iso9660 など
-o オプション
    読み書きの rw や読み取り専用の ro など
デバイスファイル
    ファイルシステムをアクセスするためのデバイスファイル
マウントポイント
    マウントするディレクトリ
```

- アンマウント（umount コマンド）
マウントされたハードディスクやリムーバブルメディアを利用しなくなると、アンマウントします。アンマウントするために umount コマンドを使います。
```
umount マウントポイント
ハードディスクやリムーバブルメディアをアンマウントします。
```

## スワップ領域の作成
Linux のカーネルと呼ばれる根幹のプログラムは、ハードディスクからプログラムやデータをメモリ領域へ読み込んで実行します。プログラムやデータを新たに読み込むための空きメモリ領域がなくなると、Linux のカーネルは今利用していないメモリ上のプログラムやデータをスワップ領域へ一時的に退避します。スワップパーティションとは Linux のカーネルシステムがメモリの代わりとして一時的に使うハードディスクのパーティション領域です。ハードディスクのパーティションをスワップ領域として使うのであれば、メモリサイズに対応したパーティションを確保し、スワップファイルシステムをパーティションに作成する必要があります。

- スワップファイルシステムの作成
スワップするためのパーティション確保と、ファイルシステムの作成は、インストールするときや新しくハードディスクを増設するときに実行します。スワップ領域 (スワップのパーティション)を作るには mkswap コマンドを使います。

```
mkswap デバイスファイル
スワップファイルシステムを作ります。

オプション
-c
    不良な部分を探して利用しない
デバイスファイル
    ファイルシステムをアクセスするためのデバイスファイル
```

- スワップの領域作成と利用
スワップ領域は作成した後に swapon コマンドを実行すると有効化できるようになります。　
```
swapon [デバイスファイル]

オプション
-s
    現在利用しているスワップ領域を表示
```

利用中のスワップ領域は swapoff コマンドで無効化できます。　

```
swapoff [デバイスファイル]

オプション
-v
    指定したスワップを無効化
-a
    すべてのスワップを無効化
```

- 自動マウント
インストール時に作られたパーティションは、コンピュータの起動時に自動マウントされます。起動時に自動マウントされる設定を記述するファイルは/etc/fstab というパスにある設定ファイルです。自動マウントには mount コマンドが使われます。増設したハードディスクを自動マウントするために、/etc/fstab ファイルを変更してください。/etc/fstab ファイルに記述されるのは次の項目です。
• ブロックスペシャルデバイス
• マウントポイント
• ファイルシステムのタイプ (ext3,swap など)
• オプション (カンマで区切る)
• dump コマンドがダンプ (バックアップ) するか否か (0・・・ダンプ不要,1・・・ダンプ)
• ブート時にチェックする順番
```
mount -a
デバイスをマウントします。

オプション
-a
    /etc/fstab ファイルに指定された swap 以外のパーティションをマウント
```

##  i ノード
ext3(ext2) ファイルシステムは、ファイルやディレクトリに対し、i ノード番号というユニークな番号を割り振って管理しています。ファイルシステムを作成した時に i ノード領域という場所が確保されます。i ノード領域には、ファイルがディスク上にある位置やアクセス権限などの情報が保持されています。ファイルシステムに作れるファイル数は、i ノード領域の大きさに左右されることとなります。もしファイルが多く作られて i ノード領域が足りなくなると、そのファイルシステムにデータを書き込める空き領域があっても、新規のファイルが作成できなくなります。

-  i ノード情報の確認
ext3 ファイルシステムの i ノード領域の使用状況を確認するには、df コマンドに-i オプションを付けて実行します。i ノード情報として、全体の数、使用している数、残りの数、使用量 (%) が表示されます。

```
df -i
ファイルシステムの情報を表示します。
オプション
-i
i ノード情報の表示をします
```

## ハードリンクとシンボリックリンク
リンク機能は、ファイルをコピーしたり移動したりせずに、別のディレクトリにあるように扱うことができる機能です。たとえば、コマンドの引数としてファイルやディレクトリを指定する場合、パス指定が長くて複雑になると入力を間違えることがあるでしょう。リンク機能を使えば、よく使うファイルを自分のホームディレクトリに置いてあるように扱うことができます。リンクには、ハードリンクとシンボリックリンクの 2 種類があります。

ハードリンク
    ハードリンクは、ファイルの実体を直接指し示して共有します。ハードリンクを削除しても、元ファイルは削除されません。ハードリンクは i ノード番号を共有することで実現しているので、別ファイルシステム（別パーティション）には作成することができません。

シンボリックリンク
シンボリックリンクは、元ファイルが保管されている位置（パス）を示す擬似的なファイルを作ります。シンボリックリンクを消しても元ファイルに影響はありません。元ファイルを消すとシンボリックリンクからのアクセスがエラーとなります。シンボリックリンクは別ファイルシステムの間で作成することができます。Windows ではショートカットと呼ばれるファイルと考え方が同じです。

```
ln 元ファイル名 リンク名

オプション
-s
    シンボリックリンクを作成します。
-s オプションを付けない場合はハードリンクを作成します。
```

## ディスクを管理するコマンド
ハードディスクを管理するコマンドとして、ファイルシステムをチェックして修復する fsck コマンドや、ファイルやディレクトリが使っているディスク容量を調べる du コマンドがあります。

- ファイルシステムのチェックと修復
    コンピュータが異常終了するなど正常にシャットダウンが行われないと、ファイルシステムのファイル管理情報とハードディスクに書き込まれたデータとの間で辻褄が合わなくなることがあります。

ファイルシステムが不整合に陥った場合、fsck コマンドを使って整合性をチェックし、修復を行なう必要があります。fsck コマンドは、異常終了した後のシステム起動時に自動的に実行されます。
```
fsck デバイス名
ファイルシステムのチェックと修復をします。
```

- ディレクトリ使用量の確認
df コマンドでハードディスクなどの全体の使用量を確認できました。細かいディレクトリの使用量を調べるには du コマンドを使います。
 ```
du [ディレクトリ]
du [ファイル]
ディレクトリの使用量を調べます
ファイルのサイズを調べます
オプション
-s
    指定ファイルや指定ディレクトリの総計を表示します
```


# 終わりに
今まで使用頻度の多かったコマンドとかは覚えているけど、ネットワーク周りとか全然覚えてなかったからできて良かったけど、めちゃくちゃ長え。。。
まだサーバーやセキュリティもあってやること多いよLinux

# 参考
Linux標準教科書
https://linuc.org/textbooks/linux/