Linux基礎学習まとめ⑦ ファイル管理

##概要
Linuxのファイル管理には、ハードディスクとファイルシステムとディレクトリ構造の理解が必要になる。
ここでは、ファイルシステムを準備するためのコマンドなどを簡単にメモしておく。

##実行環境
- macOS BigSur 11.4
- CentOS7 (macOS上でLinux環境を構築する方法は[こちら](https://qiita.com/tamago3keran/items/781728815e359243ff33)を参考にしました)

##ファイルシステム
ファイルシステムとは、ファイル名・更新日などの属性データ・ファイルデータ本体を管理するための仕組み。

##パーティション
ハードディスクを利用するために、ハードディスクを区切った単位。
ディスクの内部を複数のパーティション（領域）に区切る必要がある。

##ファイル管理の主な流れ
1. パーティションの作成 : `fdisk`
1. ファイルシステムの作成 : `mkfs`
1. マウント : `mount`

###1. パーティションの作成
```
$ fdisk
```

- `-l` : 現在認識されているハードディスクのパーティション情報を表示する。(これは使い勝手が良い)

例） パーティション作成に関する様々なオプションの確認

```
$ fdisk [target]
$ Command (m for help): m
```

- `n` : 新しいパーティション領域の作成、基本or拡張パーティションの指定、パーティション番号の指定、先頭シリンダの指定などを行っていく。
- `t` : パーティションの種類の変更
- `w` : ハードディスクにパーティション情報を書き込む (write)
- `q` : パーティションの変更を破棄する (quit)

例）

```
$ mkfs -t ext3 -c /dev/vda1
```

###2. ファイルシステムの作成
```
$ mkfs
```

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

####ラベルの確認
```
$ e2label [target] [name]
```

[name]無しでデバイスを指定すると、ラベルを確認できる。
ラベルとデバイスを指定すると、デバイスのラベルを変更できる。

###3. マウント
ハードディスクはパーティション分割して、、ファイルシステムを作ってからマウントすると読み書きできるようになる(CD-ROM, DVD-ROMなどのリムーバブルディスクも)。
マウントする際には、存在しているディレクトリにマウントする必要があり、マウントするために利用するディレクトリをマウントポイントと呼ぶ。
`df`コマンドで、現在マウントされているファイルシステムのリストを表示することができる。

```
$ mount -t [type] -o [option] [device_file] [mount_point]
```

- `-t` : タイプ、ファイルシステムのext3、Windowsのmsdos、CD,DVDのiso9600など
- `-o` : 読み書きのrw、読み取り専用のroなど
- `[device_file]` : ファイルシステムをアクセスするためのデバイスファイル (ex. /dev/vda1)
- `[mount_point]` : マウントするディレクトリ (ex. /opt)


####アンマウント
マウントされたハードディスクなどを利用しなくなると、アンマウントする。

```
$ unmount [mount_point]
```

###スワップ領域
Linuxのカーネルは、ハードディスクからプログラムやデータをメモリ領域へ読み込んで実行する。
新たに読み込むための空きメモリ領域がなくなると、カーネルは今利用していないメモリ上のプログラムやデータをスワップ領域へ一時的に退避する。
(基本情報技術者の参考書にもこんな感じの記載があったと思うので、そっちの方がわかりやすいかも)
(スワッピング方式、スワップアウト、スワップインなど)

・`mkswap [device_file]`
　スワップのパーティション確保コマンド
　`-c` : 不要な部分を探して利用しない

・`swapon [device_file]`
　スワップ領域の有効化コマンド
　`-s` : 現在利用しているスワップ領域の表示
  
・`swapoff [device_file]`
　スワップ領域の無効化コマンド
　`-v` : 指定したスワップの無効化
　`-a` : 全てのスワップの無効化

例）

```
$ fdisk -l (ハードディスクのパーティションを確認、IDが82(スワップ用)のパーティションを確認)
...
device boot start end block Id system
/dev/sda2 *     1  587  123681  82  Linux swap/Solaris

$ mkswap -c /dev/sda2 (スワップファイルに変更)
$ swapon /dev/sda2 (スワップファイルシステムとして利用(有効化))
$ swapon -s (利用開始しているスワップ領域の表示)
Filename                        Type        Size  User
/dev/sda2      partition  12311   0    -1

$ swapoff /dev/sda2 (スワップファイルシステムの無効化)
```

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

・`df -i`
　`-i` : ファイルシステムにおけるiノード情報の表示

・`ls -il | sort`
　`-i` : ファイルやディレクトリに割り振られたiノード番号を表示

##ハードリンクとシンボリックリンク
リンク機能とはファイルをコピーしたり移動したりせずに、別のディレクトリにあるように扱うことができる機能。
パスを指定する際などに、よく使うファイルを自分のホームディレクトリにあるように扱うこともできる。

###ハードリンク
ファイルの実体を直接指し示して共有する。
iノード番号を共有して実現しているため、他のファイルシステム(パーティション)には作成できない。

###シンボリックリンク
元ファイルが保管されている位置(パス)を示す擬似的なファイルを作成する。
パスを指定しているだけなので、他のファイルシステムの間でも作成できる。
Windowsでいうショートカットと考え方は同じ。
リンクを消しても元ファイルに影響はないが、元ファイルを消すとアクセスエラーとなる。(ハードリンクは大丈夫)

###リンク作成コマンド

```
$ ln [original_file] [link_name]
```

`ln`コマンドでリンクを作成する。
何もオプションをつけなければ、ハードリンクを作成。
`-s`オプションでシンボリックリンクを作成。

ファイルのハードリンクを作ると、iノード領域にあるリンク数が１つ増え、削除すると一つ減る。
リンク数が0になると、ファイルのデータがファイルシステムから完全に削除される。
シンボリックリンクはパーミッション情報の先頭が`l`で表示される

例）　

```
$ ls -il
12311413 -rw-r--r-- 1 root root 5 Jun 6 14:31 test1
12311412 lrw-r--r-- 1 root root 5 Jun 6 14:31 test2 -> test1
```

##ディスク管理
・`fsck [device_name]`
ファイルシステムのチェックと修復コマンド。
コンピュータが異常終了するなど、正常にシャットダウンが行われないと、ファイルシステムのファイル管理情報とハードディスクに書き込まれたデータ間の辻褄が会わなくなる。
不整合の場合、`fsck`コマンドを用いて、整合性のチェックと修復を行う。
ext3は、ジャーナリング機能があるため、修復が早い。
　　
・`du [directory/file]`
ディレクトリの使用料やファイルのサイズを調べる。
`-s` : 指定ファイルや指定ディレクトリの統計を表示する。


##終わりに
ものすごく簡単なメモになってしまった。
実際にどういった場面で使うのか現時点では、全然イメージが沸いてないので今回の記事もよくわからない内容になってしまった。
早くこれらを使うような場面に行きたい。

##参考文献
この記事は以下の情報を参考にして執筆しました。
- [Linux標準教科書(ver.3.0.2)](https://linuc.org/textbooks/linux/)