順番に読み進めながら学べます

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

この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
ln -s target.txt link.txtでパスを格納するシンボリックリンクを作りls -lの -> で確認し、ln base.txt hard.txtで同じ実体を指すハードリンクを作る違いを、図解とブラウザ端末で確認します。

シンボリックリンク — ln -s

リンクは、別の名前から同じファイルにたどり着けるようにする仕組みです。ln -s 実体 名前で作るのがシンボリックリンクで、これは実体へのパス(場所)を格納した特殊なファイルです。名前を開くと、格納された実体のパスをたどって自動的につながります。ls -lで一覧すると、リンクの行に名前 -> 実体のようにリンク先が表示されます

書き方効果
ln -s 実体 名前-s(symbolic)でパスの別名となるシンボリックリンクを作る
ls -l名前 -> 実体の表示でリンク先を確認する
ln 実体 別名同じ実体(データ本体)を指すハードリンクを作る
シンボリック vs ハードシンボリック=実体のパスを格納した特殊ファイル / ハード=同じ実体への別名
実体を削除したときシンボリック=たどり先を失い壊れる / ハード=中身は残る
シンボリックリンクの仕組み — ln -s
target.txt中身: "data"link.txt(特殊ファイル)中身=パス "target.txt"出力link.txt -> target.txt出力: "data"格納パスをたどり実体を読むln -s target.txt link.txtls -lcat link.txt
ln -sは中身としてパス文字列target.txtを格納した特殊ファイルlink.txtを作ります。ls -lではlink.txt -> target.txtと矢印で表示され、cat link.txtはそのパスをたどって実体target.txtの中身を読み出します。
printf 'data\n' > target.txt   # 実体ファイルを作成
ln -s target.txt link.txt     # シンボリックリンクを作る
ls -l                         # link.txt -> target.txt を確認
cat link.txt                  # 実体 target.txt の中身が出る

printf 'data\n' > target.txtで実体ファイルを作成してください。

lnにシンボリックリンクを作るオプションを付け、実体・新しい名前の順で渡してlink.txtを作成してください。

ls -lを実行し、link.txt -> target.txtのようにリンク先が表示されることを確認してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 3 実行済み
Loading Linux Terminal...

ハードリンク — ln

-sを付けずにln 実体 別名とすると、ハードリンクを作ります。シンボリックリンクが実体へのパスを格納した特殊なファイルなのに対し、ハードリンクは同じ実体(データ本体)を指すもう 1 つの名前です。どちらの名前から開いても中身は同一で、ls -lではハードリンクは矢印を出さず、通常のファイルと同じ表示になります。シンボリックは実体のパスを格納した特殊ファイル、ハードは同じ実体への別名、と区別します。

シンボリックリンクとハードリンクの仕組みの違い
base.txtデータ本体 "shared"sym中身=パス "base.txt"hard同じデータ本体の別名出力: "shared"パス経由で読む出力: "shared"実体を直接読むln -s base.txt symln base.txt hardcat symcat hard中身はどちらも "shared"
ln -sは実体へのパスを格納したsymを作り、lnは同じデータ本体を指す別名hardを作ります。catで出る中身はどちらもsharedですが、symはパスをたどって読み、hardは実体を直接読む点が違います。
printf 'shared\n' > base.txt   # 実体ファイルを作成
ln base.txt hard.txt          # ハードリンクを作る
ls -l                         # hard.txt は矢印なしで並ぶ
cat hard.txt                  # base.txt と同じ中身が出る

printf 'shared\n' > base.txtで実体ファイルを作成してください。

lnをオプション無しで使い、実体・別名の順で渡してhard.txtというハードリンクを作成してください。

ls -lを実行し、hard.txtが矢印(->)無しで通常のファイルと同じように並ぶことを確認してください。

Linux console
0 / 3 実行済み
Loading Linux Terminal...

リンク先を削除したときの挙動差

シンボリックリンクは実体へのパスを格納した特殊なファイルなので、実体が消えるとたどり先を失います。ハードリンクは同じ実体(データ本体)を指すもう 1 つの名前なので、元の名前が消えても中身は残ります。実体を削除して、両者の違いを実際に確かめます。

実体を削除したときの挙動の違い
orig.txtデータ本体 "v"sl.txt中身=パス "orig.txt"hl.txt同じデータ本体の別名参照切れで失敗No such file中身 "v" を表示できる実体は残るln -s orig.txt sl.txtln orig.txt hl.txtcat sl.txtcat hl.txtrm orig.txt を実行した後
実体orig.txtrmで消すと、パスを格納するだけのsl.txtは参照切れになり、データ本体を共有するhl.txtは中身が残ってcatできます。
printf 'v\n' > orig.txt       # 実体ファイルを作成
ln -s orig.txt sl.txt         # シンボリックリンク
ln orig.txt hl.txt            # ハードリンク
rm orig.txt                   # 実体を削除
cat sl.txt                    # たどり先を失い失敗する
cat hl.txt                    # 中身は残っていて表示できる

printf 'v\n' > orig.txtで実体を作成してください。

ln -s orig.txt sl.txtでシンボリックリンク、ln orig.txt hl.txtでハードリンクを作成してください。

rm orig.txtで実体を削除してください。

cat sl.txtcat hl.txtを実行し、結果の違いを確認してください。

ls -lを実行し、削除後に 2 つのリンクがls -lでどう見えるかを確認してください。

Linux console
0 / 7 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1ln -s target.txt link.txtを実行するとls -lでどう表示されますか?

Q2シンボリックリンクとハードリンクの違いとして正しいものはどれですか?

Q3実体ファイルをrmで削除した後、catが成功するのはどちらですか?