はじめに
Linux のファイルシステムでは、ファイルは データ本体 と inode で構成される。
-
データ本体(データブロック)
- ファイルの中身そのもの
-
inode
- ファイルのメタデータ
(この記事では「データ本体」という言葉を多用します)
ディレクトリは特別な「ファイル」という扱いになっている。
inode
ファイルのメタデータを管理する構造体。
ファイルやディレクトリごとに作成されるバイナリデータで、inode 番号によって識別される。
ファイルの inode 番号は $ ls -i
コマンドで確認できる。
$ ls -i
inodeには、以下のような情報が含まれている。
- ファイルの属性
- ファイルの種類(通常ファイル、ディレクトリ、リンクの種類など)
- ファイルのサイズ
- 所有者(ユーザーID、グループID)
- パーミッション
- タイムスタンプ(作成時刻、最終更新時刻、最終アクセス時刻)
- リンク数(ハードリンクの数)
- データ本体への参照
また、ファイル名は inode ではなくディレクトリファイルに保存される。
ファイル名は inode に含まれない
ディレクトリファイルに保存される ファイル名 と inode 番号
ディレクトリファイルのデータ本体には、ディレクトリに含まれるファイル名、サブディレクトリ名、またそれぞれに対応する inode 番号が記録されている。
つまりディレクトリは、ファイル名と inode 番号のマッピング情報を保持する単なるメタデータ「ファイル」と考えることができる。
↓ イメージ ↓
ファイル名 | inode番号 |
---|---|
file1.txt |
12345 |
file2.txt |
12346 |
dir1 |
12347 |
$ ln
link
シンボリックリンクやハードリンクを作成する。
Linux のリンクは、Windows では ショートカット、MacOS では エイリアス と呼ばれる。
-s
オプションをつけない場合、ハードリンクを作成することになる。
$ ln リンク元 ハードリンク
$ ln -s リンク元 ハードリンク
ハードリンク
データ本体への参照を、名前が異なる複数のファイルが共有すること。
ハードリンクを作成したファイルは元のファイルと同じ inode を持つため、ファイルシステム上で完全に等価関係にある。
ハードリンクのリンク元、リンク先ファイルは完全に等価。
リンク元、リンク先は区別できない。
ハードリンクは同じファイルシステム内でしか作成できない。ファイルシステム、マウントポイント、パーティションをまたいだファイル間では作成できない。
ディレクトリに対しても作成できない。
ハードリンクは li
コマンドを使用して作成する。
$ ln リンク元ファイル名 リンクファイル名 # リンクファイルは存在しないことが前提
ファイルの削除
ハードリンクが作成されたファイルの データ本体 は、リンク数が 0
になるまでは完全には削除されない。
$ rm
コマンドを実行した時、内部ではそのファイル名とinodeの紐付けが解除され、これによりリンク数が 1
減少している。さらにリンク数が 0
になった場合にのみ、ファイルのデータ本体とinodeが初めて削除(解放)されている。
ファイルのデータ本体はリンク数が 0
になるまで削除されない
シンボリックリンク
リンク元ファイルへのパスを保持する特殊なファイル。
ハードリンク と異なり、異なるネットワーク、ファイルシステム、パーティション間でも作成できる。
シンボリックリンクは元ファイルのデータ本体ではなく、パスを参照するだけなので、元ファイルが削除されるとリンクは壊れてしまう。
$ ln -s リンク元ファイル名 リンクファイル名 # リンクファイルは存在しないことが前提
ディレクトリに対しても作成することができる。
$ ls -s リンク元ディレクトリ名 リンクディレクトリ名
シンボリックリンクは ls -l
コマンド実行時に次のように ->
で表示される。パーミッション は rwxrwxrwx
と表示されるが、実際にはリンク元のパーミッションが適用される。
$ ls -l
> lrwxrwxrwx 1 kei kei 5 Jan 30 11:33 file1 -> file1
リンクのコピー
ハードリンク、シンボリックリンクをファイルコピーした場合、デフォルトではリンク元ファイル(ファイルの実体)がコピーされる。
$ cp リンク コピー先ファイル
ファイルの実体ではなくリンク自体をコピーしたい場合、-d
オプションを使用する。
$ cp -d リンク コピー先ファイル
比較
特徴 | ハードリンク | シンボリックリンク |
---|---|---|
参照方式 | 同じデータ本体を参照 | パスを参照 |
inode 番号 | 同じ | 異なる |
リンク元ファイル削除時の挙動 | リンクが残る限りデータにアクセス可能 | リンク切れなる |
制約 | 同じファイルシステム内でのみ作成可能 | 異なるファイルシステムでも作成可能 |
ディレクトリのリンク | 不可 | 可能 |