0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux リンク

Last updated at Posted at 2025-01-29

はじめに

Linux のファイルシステムでは、ファイルは データ本体 と inode で構成される

  • データ本体(データブロック)
    • ファイルの中身そのもの
  • inode
    • ファイルのメタデータ

(この記事では「データ本体」という言葉を多用します)

ディレクトリは特別な「ファイル」という扱いになっている。

inode

ファイルのメタデータを管理する構造体。

ファイルやディレクトリごとに作成されるバイナリデータで、inode 番号によって識別される

ファイルの inode 番号は $ ls -i コマンドで確認できる。

inode 番号を確認する
$ 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 と表示されるが、実際にはリンク元のパーミッションが適用される。

シンボリックリンクが設定されたf
$ ls -l
> lrwxrwxrwx 1 kei kei 5 Jan 30 11:33 file1 -> file1

リンクのコピー

ハードリンク、シンボリックリンクをファイルコピーした場合、デフォルトではリンク元ファイル(ファイルの実体)がコピーされる。

ファイルの実体がコピーされる
$ cp リンク コピー先ファイル

ファイルの実体ではなくリンク自体をコピーしたい場合、-d オプションを使用する。

リンク自体をコピーする
$ cp -d リンク コピー先ファイル

比較

特徴 ハードリンク シンボリックリンク
参照方式 同じデータ本体を参照 パスを参照
inode 番号 同じ 異なる
リンク元ファイル削除時の挙動 リンクが残る限りデータにアクセス可能 リンク切れなる
制約 同じファイルシステム内でのみ作成可能 異なるファイルシステムでも作成可能
ディレクトリのリンク 不可 可能
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?