web-dev-qa-db-ja.com

シンボリックリンクとハードリンクの違いは何ですか?

最近私は就職の面接でこれを尋ねられました。私は正直、シンボリックリンクがどのように振る舞うのか、そしてどのようにしてそれを作成するのかを知っていると言ったが、ハードリンクの使い方とシンボリックリンクとの違いは理解していない。

691
Nick Stinemates

ファイルシステムの下にあるファイルは、iノードで表されています(または複数のiノードがわからない)。

ファイルシステム内のファイルは、基本的にはiノードへのリンクです。
次に、ハードリンクは、同じ基礎となるiノードへのリンクを持つ別のファイルを作成するだけです。

ファイルを削除すると、基礎となるiノードへのリンクが1つ削除されます。 iノードへのすべてのリンクが削除された場合にのみ、iノードが削除されます(または削除可能/上書き可能)。

シンボリックリンクは、ファイルシステム内の別の名前へのリンクです。

ハードリンクが作成されると、そのリンクはinodeになります。元のファイルの名前変更を削除したり移動したりしても、それが基盤となるiノードにリンクしているため、ハードリンクには影響しません。 iノード上のデータに対する変更は、そのiノードを参照するすべてのファイルに反映されます。

注:ハードリンクは同じファイルシステム内でのみ有効です。シンボリックリンクは、単に別のファイルの名前であるため、ファイルシステムにまたがることができます。

714
Martin York

Linux(ish)コンソールを使って、手助けになるかもしれないNice直感。

ファイルを2つ作成します。

$ touch foo; touch bar

それらにいくつかのデータを入力してください:

$ echo "Cat" > foo
$ echo "Dog" > bar

(実際には、エコーが最初に使用されていた可能性があります。ファイルが存在しない場合は、ファイルが作成されます。

そして予想通り:

$cat foo; cat bar
Cat
Dog

ハードリンクとソフトリンクを作成しましょう。

$ ln foo foo-hard
$ ln -s bar bar-soft

今起こったことを見てみましょう。

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

Fooの名前を変更しても問題ありません。

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hardはファイルのiノード、内容を指し示します - それは変更されていません。

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-soft: No such file or directory

ソフトリンクが名前ではなく名前が変更されていて、内容ではないため、ファイルの内容が見つかりませんでした。

同様に、fooが削除されても、foo-hardはまだ内容を保持しています。 barが削除された場合、bar-softは存在しないファイルへの単なるリンクです。

407
Adam Matan

ことわざにあるように、絵は千語の価値があります。これを視覚化する方法は次のとおりです。

enter image description here

これがどのようにしてその絵にたどり着くかです:

  1. ファイルシステムに新しいinode(ファイルのメタデータを含み、その内容を含むデータブロック、つまり "Hello、World!"というテキストを指す)をmyfile.txtという名前で作成します。

    $ echo 'Hello, World!' > myfile.txt
    
  2. ファイルmy-hard-linkへのハードリンクmyfile.txtを作成します。これは、「myfile.txtが指すのと同じiノードを指すファイルを作成する」という意味です。

    $ ln myfile.txt my-hard-link
    
  3. ファイルmy-soft-linkへのソフトリンクmyfile.txtを作成します。これは、「ファイルmyfile.txtを指すファイルを作成する」という意味です。

    $ ln -s myfile.txt my-soft-link
    

myfile.txtが削除(または移動)されるとどうなるか見てください:my-hard-linkはまだ同じ内容を指しているため影響を受けませんが、my-soft-linkは何も指していません。他の答えはそれぞれの賛否両論について議論します。

383
akivajgordon

元のファイルが移動しているときにハードリンクが役立ちます。たとえば、ファイルを/ binから/ usr/binまたは/ usr/local/binに移動します。/binにあるファイルへのシンボリックリンクはこれによって壊れてしまいますが、ファイルのiノードへの直接リンクであるハードリンクは問題になりません。

ハードリンクはディレクトリエントリを使用するだけなのでディスクスペースを節約できますが、シンボリックリンクはそれが指す名前を格納するための独自のiノードを必要とします。

ハードリンクでも解決にかかる時間が短くなります。シンボリックリンクはシンボリックリンクディレクトリにある他のシンボリックリンクを指すことがあります。また、これらの中にはNFSや他の待ち時間の長いファイルシステム上にあるものもあり、そのためネットワークトラフィックが解決される可能性があります。ハードリンクは、常に同じファイルシステム上にあるため、常に1回のルックアップで解決され、ネットワークの待ち時間を伴うことはありません(NFSファイルシステム上のハードリンクである場合、NFSサーバーが解決します。クライアントシステム)時々これは重要です。私にとってはそうではありませんが、これが重要になる可能性がある高性能システムを想像することができます。

また、mmap(2)やopen(2)のようなものもファイルのinodeをアクティブに保つためにハードリンクと同じ機能を使用するので、ファイルがunlink(2)されてもinodeはプロセスにアクセスを許可します。プロセスが閉じると、ファイルは実際に消えます。これにより、もっと安全な一時ファイルを開くことができます(開いてリンク解除をアトミックに行うことができれば、POSIX APIがあるので覚えていないかもしれませんが、実際には安全な一時ファイルがあります)。誰にもアクセスできないあなたのデータ。まあ、それは/ procが皆にあなたのファイルディスクリプタを見る能力を与える前に本当でした、しかしそれはまた別の話です。

そういえば、プロセスAで開かれているがファイルシステム上でリンクされていないファイルを回復することは、ハードリンクを使ってiノードリンクを作り直すことで、開かれたプロセスがそれを閉じたり消えたりしても消えないということです。

67
Tanktalus

ハードリンクとシンボリックリンクの違いを確認する簡単な方法は、簡単な例です。ファイルへのハードリンクは、ファイルが保存されている場所、またはそのファイルのiノードを指します。シンボリックリンクは実際のファイル自体を指します。

したがって、 "a"というファイルがあり、ハードリンク "b"とシンボリックリンク "c"を作成すると、すべてファイル "a"を参照します。

echo "111" > a
ln a b
ln -s a c

"a"、 "b"、および "c"の出力は次のようになります。

cat a --> 111
cat b --> 111
cat c --> 111

それでは、ファイル "a"を削除して、 "a"、 "b"、および "c"の出力がどうなるかを見てみましょう。

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

どうしたの?

ファイル "c"はファイル "a"自体を指しているので、ファイル "a"が削除された場合、ファイル "c"は何も指すことはなく、実際にはファイルも削除されます。

ただし、ファイル "b"は、ファイル "a"の格納場所、つまりiノードを指しています。したがって、ファイル "a"が削除されると、それはiノードを指し示さなくなりますが、ファイル "b"が指しているため、iノードはハードリンクがそれを指し示さなくなるまで "a"に属する内容を格納し続けます。

33
Bolboa

ソフトリンク

ソフトまたはシンボリックは、オリジナルファイルへのショートカットに近いものです。オリジナルを削除するとショートカットは失敗し、ショートカットを削除するだけではオリジナルには何も起こりません。

ソフトリンク構文ln -s Pathof_Target_file link

出力:link -> ./Target_file

Proof:readlink linkまた、ls -l linkの出力では、lrwxrwxrwxの最初の文字がlと表示されます。これは、ファイルがソフトリンクであることを示しています。

リンクの削除:unlink link

注:必要に応じて、現在のディレクトリから別の場所に移動してもソフトリンクは機能します。ソフトリンクを作成するときは、絶対パスではなく絶対パスを指定してください。つまり、(/ root/user/Target_fileから始まり、。/ Target_fileではなく)

ハードリンク:

ハードリンクは、ミラーコピー、または同じファイルへの複数のパスです。 file1に何かをすると、それがファイル2に表示されます。一方を削除しても、もう一方は問題ありません。

Iノード(またはファイル)は、(同じ)ファイルのiノードへのすべての(ハード)リンクまたはすべてのパスが削除された場合にのみ削除されます。

ハードリンクが作成されると、リンクは元のファイルのiノードを持ちます。元のファイルの名前変更を削除したり移動したりしても、基盤となるiノードにリンクしているためハードリンクには影響しません。 iノード上のデータに対する変更は、そのiノードを参照するすべてのファイルに反映されます。

ハードリンク構文ln Target_file link

Output: linkという名前のファイルは、Targetfileと同じiノード番号で作成されます。

Proof:ls -i link Target_file(inodeを確認してください)

リンクの削除:rm -f link(通常のファイルと同じようにリンクを削除します)

:シンボリックリンクは単に別のファイルの名前であるため、ファイルシステムをまたぐことができます。ハードリンクは同じファイルシステム内でのみ有効です。

シンボリックリンクにはハードリンクがないという機能がいくつかあります

  • ハードリンクはファイルの内容を指します。ソフトリンクはファイル名を指します。
  • ソフトリンクのサイズはコンテンツのサイズで、ソフトリンクはファイル名のサイズです。
  • ハードリンクは同じiノードを共有します。ソフトリンクはしません。
  • ハードリンクはファイルシステムをまたぐことはできません。ソフトリンクがあります。
  • ハードリンクでシンボリックリンクが指す場所をすぐに知ることができるので、ファイルシステム全体を調べて同じiノードを共有するファイルを見つける必要があります。

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • ハードリンクはディレクトリを指すことはできません。

ハードリンクには2つの制限があります。

  • ディレクトリはハードリンクできません。 Linuxでは、これがディレクトリの非循環ツリー構造を維持することを許可していません。
  • ハードリンクはファイルシステム間で作成することはできません。ファイルシステムが異なると、独立したiノードテーブルが異なるため、両方のファイルを同じファイルシステムに配置する必要があります(異なるファイルシステム上の2つのファイル、ただし同じiノード番号を持つファイルは異なります)。
32

シンボリックリンクはパス名にリンクします。これはシステムのファイルツリーのどこにでも置くことができ、リンクが作成されるときに存在する必要すらありません。ターゲットパスは相対パスでも絶対パスでもかまいません。

ハードリンクは、iノードへの追加のポインタです。つまり、ハードリンクは、ターゲットと同じボリューム上にしか存在できません。ファイルへの追加のハードリンクは、ファイルを参照するために使用される「元の」名前と区別がつきません。

29
Andrew Medico

私はあなたをウィキペディアに向けるでしょう:

いくつかのポイント:

  • ハードリンクとは異なり、シンボリックリンクはファイルシステムをまたぐことができます(ほとんどの場合)。
  • シンボリックリンクはディレクトリを指すことができます。
  • ハードリンクはファイルを指し示し、同じファイルを複数の名前で参照することを可能にします。
  • 少なくとも1つのリンクがある限り、データはまだ利用可能です。
19
Jauder Ho

ハードリンクは、増分バックアップを実行するときに非常に便利です。たとえば、 rsnapshot を参照してください。アイデアはハードリンクを使ってコピーすることです:

  • バックアップ番号nをn + 1にコピーする
  • バックアップn - 1をnにコピーする
  • ...
  • バックアップ0をバックアップ1にコピーする
  • 変更されたファイルでバックアップ0を更新します。

すべての増分バックアップは、変更されていないファイルの同じiノードセットを指すため、新しいバックアップでは、行った変更とは別に余分なスペースを占有しません。

8
JesperE

私はニックの質問に付け加えます: ハードリンク はいつ役に立つか、または必要ですか?私の頭に浮かぶ唯一のアプリケーションは、シンボリックリンクがその仕事をしないというもので、chrootされた環境でシステムファイルのコピーを提供することです。

5

Hard link vs Soft link

ハードリンクとソフトリンクはこの画像で簡単に説明できます。

4
PGOEL

また:

  1. ハードリンクの読み取りパフォーマンスはシンボリックリンクより優れています(マイクロパフォーマンス)
  2. シンボリックリンクは、コピー、バージョン管理、などすることができます。言い換えれば、それらは実際のファイルです。一方、ハードリンクはやや低レベルのもので、シンボリックリンクと比較して、ハードリンクを通常のファイルとしてではなくハードリンクとして使用する手段を提供するツールが少ないことがわかります。
3
Amr Mostafa

通常の「ファイル」と考えるのは、実際には2つの別々のことです。ファイルのデータとディレクトリエントリです。ファイルのハードリンクを作成すると、実際には同じデータを参照する2番目のディレクトリエントリが作成されます。両方のディレクトリエントリはまったく同じ機能を持っています。それぞれをファイルを開いて読み込むために使用することができます。つまり、「ファイルとハードリンク」は実際にはありません。「2つのディレクトリエントリを持つファイルデータ」があります。ファイルを削除すると実際にはディレクトリエントリが削除され、データの最後のディレクトリエントリが削除されると、データ自体も削除されます。ディレクトリエントリが1つしかない通常のファイルの場合、ディレクトリエントリを削除すると、通常どおりデータが削除されます。 (ファイルが開かれている間、OSはそのファイルへの一時的なリンクを作成するので、すべてのディレクトリエントリを削除してもデータは残りますが、ファイルを閉じるとすぐに消えます)。

例として、ファイルA.txt、ハードリンクB.txtを作成し、A.txtを削除します。 A.txtを作成したときに、いくつかのデータとディレクトリエントリA.txtが作成されました。ハードリンクを作成したときに、まったく同じデータを指す別のディレクトリエントリB.txtが作成されました。 A.txtを削除しても、最初にファイルB.txtを作成した場合とまったく同じように、すべてのデータと1つのディレクトリエントリB.txtが残っています。

ソフトリンクは、データを含まず、別のディレクトリエントリのパスを除いて、単なる(ほぼ)普通のファイルです。ソフトリンクが参照しているファイルを削除すると、ソフトリンクにはディレクトリエントリを指していないパスが含まれます。壊れています。ソフトリンクを削除しても、それは他のファイルを削除するのと同じです。それが指すファイルは影響を受けません。

3
gnasher729

MSDN から

シンボリックリンク

シンボリックリンクは、別のファイルシステムオブジェクトを指すファイルシステムオブジェクトです。指し示されているオブジェクトは、ターゲットと呼ばれます。

シンボリックリンクはユーザーに対して透過的です。リンクは通常のファイルまたはディレクトリとして表示され、ユーザーまたはアプリケーションはまったく同じ方法で操作できます。

シンボリックリンクは、UNIXオペレーティングシステムとの移行およびアプリケーションの互換性を支援するように設計されています。 Microsoftは、UNIXリンクと同様に機能するシンボリックリンクを実装しています。

シンボリックリンクは、絶対リンクでも相対リンクでもかまいません。絶対リンクは、パス名の各部分を指定するリンクです。相対リンクは、相対リンク指定子が指定されたパスのどこにあるかを基準にして決定されます

絶対シンボリックリンクの例

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

相対シンボリックリンクの例

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

ハードリンク

ハードリンクは、複数のパスが単一のファイルを参照するファイルのファイルシステム表現です同じボリューム内

Windowsでハードリンクを作成するには、リンクを作成する場所に移動し、次のコマンドを入力します。

mklink /H Link_name target_path

ハードリンクは、作成された順序に関係なく、任意の順序で削除できることに注意してください。また、次の場合にハードリンクを作成できません。

  • 参照は異なるローカルドライブにあります
  • 参照にはネットワークドライブが含まれます。つまり、参照の1つはネットワークドライブです
  • 作成されるハードリンクは、ターゲットと同じパスにあります

ジャンクション

NTFSは、ジャンクションと呼ばれる別のリンクタイプをサポートしています。 MSDNは次のように定義しています。

ジャンクション(ソフトリンクとも呼ばれます)は、参照するストレージオブジェクトが個別のディレクトリであるという点でハードリンクと異なり、ジャンクションは同じコンピューター上の異なるローカルボリュームにあるディレクトリをリンクできます。それ以外の場合、ジャンクションはハードリンクと同じように動作します。

ハードリンクセクションとジャンクションセクションの太字部分は、両者の基本的な違いを示しています。

ウィンドウでジャンクションを作成し、リンクを作成する場所に移動して、次のコマンドを入力するコマンド

mklink /J link_name target_path
3

ディレクトリエントリはlink a structrueです。

struct dentry{
    ino_t ino;
    char  name[256];
}

inoはinodeの数、nameはファイル名、inodeの構造は次のようになります。

struct inode{
      link_t nlink; 
      ...
}

たとえば、ファイル/ 1を作成すると、ディレクトリエントリは次のようになります。

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

iノード構造体は次のようになります。

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

それからあなたはハードリンク(/ 100かもしれません)を作成します、ディレクトリエントリはおそらく以下のようになります。

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

iノード構造体は次のようになります。

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

次に、ファイル1へのシンボリックリンク(/ 200)を作成します。ディレクトリエントリは次のようになります。

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

iノード構造体は次のようになります。

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */
2
mc.robin

簡単に言うと、ハードリンク:ファイルに新しい名前を追加するだけです。つまり、ファイルには同時に複数の名前を付けることができます。すべての名前は同じです。ハードリンクはすべての内容をコピーするわけではありません。ファイルの作成と新しいファイルの作成はそれではありません、それだけで知られている代替の名前を作成します..

シンボリックリンク(symlink):他のファイルへのファイルポインタです。シンボリックリンクが後で削除される既存のファイルを指している場合、そのシンボリックリンクはそのファイル名がなくなっても同じファイル名を指し続けます。

上記のすべての回答に加えて、ハードリンクファイルとソフトリンクファイルの検索方法の違いは、次のように理解できます。

現在のディレクトリとf6という名前のディレクトリにファイルt2があります。

f1および./t2/f2という名前のファイルは、f6へのシンボリックリンクです。

f7および./t2/f8という名前のファイルは、f6のハードリンクです。

ソフトリンクとハードリンクを見つけるには、次のものを使用できます。

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

ハードリンクのみを見つけるには、次のものを使用できます。

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

ハードリンクは同じファイルシステム上に作成できるため、-Lオプションを使用せずに(-xdevオプションを使用して)同じファイルシステム/マウントポイントですべてのハードリンクを検索できます。不要な検索を異なるマウントポイントに保存します。

そのため、ハードリンクを検索する方がソフトリンクを検索するよりもやや速くなります(私が間違っているか明確でない場合は修正してください)。

2
ChandanK

ハードリンクと同様に、シンボリックリンクはファイルに別の名前を付けます。しかし、シンボリックリンクが残っていてもファイルは削除できます。

1
lmmorris1

用法についての私の2セント:

ソフト リンクは長いパス名を短くするために使われるかもしれません。

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

/short/file.txtに対する変更は、元のファイルにも適用されます。

ハード リンクを使って大きなファイルを移動できます。

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

別のフォルダへのインスタントコピー、および/myapp/dev上のファイルに触れることなく、元のファイル(/myapp/prd上)を移動または削除できます。

0
Matheus Santoro

この答えで私はファイルを言うとき私はメモリ内の場所を意味する

Iノード番号はiノードにアクセスするために使用されます。ファイルへのすべてのハードリンクは、異なる名前を持つことができますが、同じiノード番号を共有することができます。すべてのハードリンクは同じinode番号(同じinodeにアクセスする)を持っているので、それらはすべて同じ物理メモリを指しています。

シンボリックリンクは特別な種類のファイルです。ファイルでもあるので、ファイル名とiノード番号を持ちます。前述のように、iノード番号はデータを指すiノードを受け入れます。シンボリックリンクのinode番号は、別のファイルへの「パス」を指すiノードにアクセスします。特に、シンボリックリンクのiノード番号は、別のハードリンクを指すiノードを受け入れます。

gUIでファイルを移動、コピー、削除するときは、物理メモリではなくファイルのハードリンクを使用して再生します。ファイルを削除すると、ファイルのハードリンクも削除されます。ファイルへのすべてのハードリンクが削除されると、それはまだメモリ内に存在する可能性がありますが、保存されているデータにアクセスすることはできません。

0
s. srinath

一般的なシナリオ、ソフトウェアのインストールでハードリンクを理解する簡単な方法を見つけました。

ある日私はインストールのためにフォルダDownloadsにソフトウェアをダウンロードしました。 Sudo make installを実行した後、いくつかの実行ファイルがローカルのbinフォルダにcpされました。ここで、cp ハードリンク を作成します。私はソフトウェアに満足していましたが、すぐにDownloadsは長期的には良い場所ではないことに気付きました。そのため、ソフトウェアフォルダをmvディレクトリにsourceしました。それでも、Windowsのようにターゲットリンクのことを心配することなく、以前と同じようにソフトウェアを実行できます。これは、 ハードリンク がinodeを直接見つけ、他のファイルが周りにあることを意味します。

0
themefield