ハードリンクとシンボリックリンク

# ハードリンクとシンボリックリンクについて勉強したメモ

環境：CentOS7

## 登場する用語

- ファイル
　コンピュータ上で記録・管理される情報の単位
　通常ファイルとリンクファイルが登場

- iノード (index node)
　ファイルを管理するためのデータ（通常ファイル作成時に、対応したiノードができる？）
　サイズ、日時、ディスク上のデータの場所などが書かれている

- iノード番号
　iノードを識別するための番号

- リンク
　iノード番号とファイル名の対応付け

- ハードリンク
　1つのiノードに複数のファイル名をリンクさせる仕組み

- シンボリックリンク
　ファイルに別名をつける仕組み


## ハードリンク

ファイルとそのファイルのハードリンクを作成↓

```
# echo hello > text  //"hello"と書き込んだ textという名前のファイルを作成

# ln text text.hard  //testファイルのハードリンクをtest.hardという名前で作成

# ls
text  text.hard  //textとtext.hardができていることを確認
```

catコマンドで中身を確認↓

```
# cat text  //textファイルの中身を確認
hello

# cat text.hard  //text.hardファイルの中身を確認 
hello
```
ls -iでiノード番号を確認すると同じiノード番号が対応付けられていることがわかる↓

```
# ls -i 
1331910 text  1331910 text.hard
```

statコマンドでファイルの属性を確認すると全く同じ↓
※ハードリンクのtext.hardの方も「regular file」となっている

```
# stat text
  File: 'text'
  Size: 6         	Blocks: 8          IO Block: 4096   regular file
Device: 6dh/109d	Inode: 1331910     Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-11-15 02:59:31.305456000 +0000
Modify: 2020-11-15 02:57:30.713465000 +0000
Change: 2020-11-15 02:58:14.329159000 +0000
 Birth: -

# stat text.hard
  File: 'text.hard'
  Size: 6         	Blocks: 8          IO Block: 4096   regular file
Device: 6dh/109d	Inode: 1331910     Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-11-15 02:59:31.305456000 +0000
Modify: 2020-11-15 02:57:30.713465000 +0000
Change: 2020-11-15 02:58:14.329159000 +0000
 Birth: -
```

ハードリンクでは元のファイルを削除しても問題なし↓

```
# ls
text  text.hard  //ファイルが2つあることを確認

# rm text
rm: remove regular file 'text'? y  //元のファイルtextを削除

# ls      
text.hard  //textが削除されたことを確認

# cat text.hard  //text.hardの中を確認
hello
```

## シンボリックリンク

ファイルとそのファイルのシンボリックリンクを作成↓

```
# echo hello2 > text2  //"hello"と書き込んだ text2という名前のファイルを作成

# ln -s text2 text.sym  //testファイルのシンボリックリンクをtest.symという名前で作成

# ls
text.sym  text2  //textとtext.symができていることを確認
```
catコマンドで中身を確認↓

```
# cat text2
hello2

# cat text.sym 
hello2
```
ls -iでiノード番号を確認すると異なるiノード番号が対応付けられていることがわかる↓

```
# ls -i 
1331913 text.sym  1331912 text2
```
statコマンドでファイルの属性を確認すると異なる結果が表示される↓
※シンボリックリンクのtext.　symの方は「File: 'text.sym' -> 'text2'」「symbolic link」となっている

```
# stat text2
  File: 'text2'
  Size: 7         	Blocks: 8          IO Block: 4096   regular file
Device: 6dh/109d	Inode: 1331912     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-11-15 05:29:34.474558000 +0000
Modify: 2020-11-15 05:26:48.352110000 +0000
Change: 2020-11-15 05:26:48.352110000 +0000
 Birth: -

# stat text.sym
  File: 'text.sym' -> 'text2'
  Size: 5         	Blocks: 0          IO Block: 4096   symbolic link
Device: 6dh/109d	Inode: 1331913     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-11-15 05:27:06.504110000 +0000
Modify: 2020-11-15 05:27:04.357110000 +0000
Change: 2020-11-15 05:27:04.357110000 +0000
 Birth: -
```

シンボリックリンクでは元のファイルが消えるとダメ↓

```
# ls
text.sym  text2  //ファイルが2つあることを確認

# rm text2
rm: remove regular file 'text2'? y  //元のファイルtext2を削除

# ls
text.sym   //text2が削除されたことを確認

# cat text.sym 
cat: text.sym: No such file or directory   //text.hardの中を確認しようとするとファイルがないと言われる


//statコマンドで見ると削除したtext2を探しにいってファイルがないなっていたことがわかる「File: 'text.sym' -> 'text2'」
# stat text.sym
  File: 'text.sym' -> 'text2'
  Size: 5         	Blocks: 0          IO Block: 4096   symbolic link
Device: 6dh/109d	Inode: 1331913     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-11-15 05:27:06.504110000 +0000
Modify: 2020-11-15 05:27:04.357110000 +0000
Change: 2020-11-15 05:27:04.357110000 +0000
 Birth: -
```