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

May 19, 2018

ハードリンク

Linux ではファイルをディスクに保存すると、重複しない i ノード番号が割り当てられる。全てのファイルには対応する i ノード番号が存在し、i ノードにはディスク上のファイルに関する属性情報が格納されている。
ディレクトリは特殊なファイル形態であり、所属するファイル名と i ノードを関連づけている。
i ノードには以下のような情報が格納されている。

  • ファイル種別
  • ファイルサイズ
  • アクセス権
  • 所有者
  • リンク
  • ディスク上の物理的な保存場所 (ブロック番号)

ファイルの実体 (ディスクに保存されているデータ) が 1 つでも、その実体を参照するファイルが複数あれば、それぞれのファイル名で同一の実体を参照することができる。これがハードリンク

ハードリンクでは、元のファイルとリンクとして作成したファイルの i ノードが同一のため、区別がつけられない。ファイルをコピーした場合は、いずれかを変更しても他方には影響はない。ハードリンクの場合はいずれのハードリンクファイルに変更を加えても、同一の実体に対して変更を加えることになる。

ハードリンクが複数作成されている場合、その全てを削除するまでは、ファイルの実体は削除されない。リンクが作成されている数は ls コマンドで確認可能。
ハードリンクの場合 i ノードが同一になっていることがわかる。

$ touch Original  
$ ln Original hardlink-1  
$ ln Original hardlink-2  
$ ls -li  
total 0  
398937 -rw-rw-r-- 3 ec2-user ec2-user 0 May 19 05:35 hardlink-1  
398937 -rw-rw-r-- 3 ec2-user ec2-user 0 May 19 05:35 hardlink-2  
398937 -rw-rw-r-- 3 ec2-user ec2-user 0 May 19 05:35 Original  

ハードリンクは、リンク元のファイルが存在するファイルシステムと異なるファイルシステム上に作成することはできない。これは i ノードがファイルシステム単位で管理されているため。
また、ディレクトリのハードリンクを作成することもできない。

シンボリックリンク

シンボリックリンクは、リンク元の場所を指し示す。シンボリックリンク自身が持っているのは、リンク元へのポイントであり、そのため、シンボリックリンクを残したままリンク元のファイルを削除することも可能。この場合、シンボリックリンクにアクセスすると、実体ファイルがみつけられずエラーとなる。

シンボリックは、ハードリンクと異なり、別のファイルシステムへもリンクを作成することができる。またディレクトリリンクを作成することも可能。

$ touch Original  
$ ln -s Original symboliclink-1  
$ ln -s Original symboliclink-2  
$ ls -li  
total 0  
398937 -rw-rw-r-- 1 ec2-user ec2-user 0 May 19 05:47 Original  
399000 lrwxrwxrwx 1 ec2-user ec2-user 8 May 19 05:47 symboliclink-1 -> Original  
399003 lrwxrwxrwx 1 ec2-user ec2-user 8 May 19 05:47 symboliclink-2 -> Original  

シンボリックリンクのアクセス権は lrwxrwxrwx となるが、実際のアクセス権はリンク元ファイルのものが適用される。

リンクのコピー

cp コマンドによりシンボリックリンクをコピーすると、デフォルトではリンク元のファイルの内容がコピーされる。シンボリックリンクをコピーするには -d オプションを用いる。

$ ls -li  
total 0  
398937 -rw-rw-r-- 1 ec2-user ec2-user 0 May 19 05:47 Original  
399000 lrwxrwxrwx 1 ec2-user ec2-user 8 May 19 05:47 symboliclink-1 -> Original  
399003 lrwxrwxrwx 1 ec2-user ec2-user 8 May 19 05:47 symboliclink-2 -> Original  
$ cp symboliclink-1 copy1  
$ cp -d symboliclink-1 copy2  
$ ls -li  
total 0  
399004 -rw-rw-r-- 1 ec2-user ec2-user 0 May 19 05:51 copy1  
399005 lrwxrwxrwx 1 ec2-user ec2-user 8 May 19 05:51 copy2 -> Original  
398937 -rw-rw-r-- 1 ec2-user ec2-user 0 May 19 05:47 Original  
399000 lrwxrwxrwx 1 ec2-user ec2-user 8 May 19 05:47 symboliclink-1 -> Original  
399003 lrwxrwxrwx 1 ec2-user ec2-user 8 May 19 05:47 symboliclink-2 -> Original  

 © 2023, Dealing with Ambiguity