【Linux】lnコマンドでシンボリックリンク・ハードリンクを作成・削除する方法

【Linux】lnコマンドでシンボリックリンク・ハードリンクを作成・削除する方法 Linux

「あれ…?設定ファイルを一箇所にまとめたくて、linux リンク 作成 って調べたけど…」
シンボリックリンクハードリンクっていう2種類が出てきて、違いがまったくわからないんだけど!?」

ある日突然、あなたがLinuxサーバーを触っていて、そんな状態になって、スマホで慌てて「linux シンボリックリンク」とか「linux ln」なんて検索して、このページにたどり着いてくれたんじゃないでしょうか。

 

もしかして、「ln -s っていうコマンドを見かけたけど、これって一体何なの…?」ってイライラしていませんか…?
それとも、「リンクを消したつもりがオリジナルファイルまで消えた(ように見えた)」「リンク元を消したらリンクが機能しなくなった!」っていう、最悪のケースで、もう途方に暮れていたり…?

わかります、わかります!私もLinuxを学び始めた頃、全く同じ経験があります。
ファイル管理がまったく思い通りにいかないし、「もしかして、Windowsのショートカットと全然違う…?」「変なことしてシステム壊してない…?」って、もうパニックになっちゃいますよね😥

 

でも、大丈夫です!

その焦る気持ち、よーくわかります。でも、慌ててコマンドを連打するのは、絶対に待ってください!

Linuxの「リンク」は、Windowsのショートカットと似ているようで、実はもっと奥が深い、システムの根幹に関わる重要な仕組みなんです。

特に「シンボリックリンク」と「ハードリンク」は、似ているようでいて、その実体はまったくの別物なんですよ😲

 

この記事は、そんな「リンク地獄」に陥ってしまったあなたを救うための、安全な対処法をステップバイステップで徹底的に解説する「完全ガイド」です🕵️‍♀️✨

「シンボリックリンク vs ハードリンクの根本的な違い(inodeの概念)」から、「linux ln コマンドの完全ガイド」、「linux シンボリックリンク 作成 の実践」、「絶対パスと相対パスの落とし穴」、そして「安全なリンクの削除方法(rm コマンドの恐怖の罠)」まで。

私と一緒に、一つずつ冷静に確認していきましょうね🥰

 

スポンサーリンク
スポンサーリンク

Linuxの「リンク」とは何か? なぜ必要なのか?

 

まず初めに、なんでLinuxに「リンク」なんていう機能が必要なのかを、カンタンに理解しちゃいましょう。

すっごく簡単に言っちゃうと、リンクとは「既存のファイルやディレクトリに、別の名前や別の場所からアクセスするための『参照』」機能のことです。

Windowsを使ったことがある方なら、「ショートカット」を作成した経験がありますよね?

デスクトップにショートカットを置いておけば、それをダブルクリックするだけで、PCの奥深くにある C:\Program Files\MyApp\app.exe みたいなプログラムを実行できる、アレです。

Linuxのリンクも、このショートカットと考え方はとっても似ています。

例えば、 /etc/very/long/path/to/config.conf っていう、すっごく深い階層にある設定ファイルがあるとします。

これを編集するたびに長いパスを打ち込むの、すっごく大変ですよね…。

そこで、自分のホームディレクトリ(/home/user)に config.conf っていう「リンク」を作成しておけば、vi ~/config.conf って入力するだけで、あたかもファイルがそこにあるかのように編集できちゃうんです!

こんな風に、「linux リンク 作成」 は、ファイル管理を効率化して、システムの柔軟性を高めるために、ぜったいに欠かせない機能なんですね。

でも、LinuxがWindowsのショートカットと決定的に違うのは、「リンク」に2つの種類がある、っていう点なんです。

1. シンボリックリンク (Symbolic Link)
2. ハードリンク (Hard Link)

linux シンボリックリンク」 はWindowsのショートカットとほぼ同じものなんですが、「ハードリンク」はまったく異なる概念に基づいています。

この2つを混同しちゃうことが、Linux初心者が最初に陥る最大の罠なんですよ💦

 

スポンサーリンク

【最重要】シンボリックリンク vs ハードリンク 徹底比較

 

ln コマンドを学ぶ前に、まず「シンボリックリンク」と「ハードリンク」が、概念としてどれほど違うのかを、ここで徹底的に理解しちゃいましょう!

この2つの違いを理解する鍵は、「inode(アイノード)」っていうナゾの言葉にあるんです。

 

inode(アイノード)とは?

 

難しく考える必要はぜんぜんありません!

inodeっていうのは、Linuxのファイルシステムが、ファイルやディレクトリの実体を管理するために使っている「管理番号(名札)」みたいなものだ、って考えてください。

あなたが「sample.txt」っていうファイル名でファイルを見ている時、Linuxは内部的に「inode番号 12345 番さん」っていう形でファイルを認識しています。

ファイル名(sample.txt)は、あくまで私たち人間が見るための「ラベル」に過ぎなくて、ファイルの実体(データがディスクのどこに保存されてるか、パーミッションは何か、所有者は誰か)は、ぜーんぶこのinode番号に紐付いて管理されてるんですね。

ls -i コマンドを使うと、ファイルのinode番号を確認できますよ。

 

[user@server ~]$ ls -i sample.txt 12345 sample.txt <-- この「12345」がinode番号です!

 

この「inode」を頭の片隅に置いたまま、2つのリンクの違いを見ていきましょう!

 

シンボリックリンク (Symbolic Link) とは?

 

  • 概要: Windowsの「ショートカット」とほぼ同じものです。
  • 実体: リンク元の「パス(ファイル名)」をテキストとして保持している「ポインタ」(「あっち参照してね」って書いてある付箋みたいなもの)です。
  • inode: リンク元(オリジナル)とシンボリックリンクは、異なるinode番号を持ちます。シンボリックリンク自体が独立した「l」タイプの小さなファイルだからです。
  • ls -l での表示: 先頭が l で始まり、->(矢印)でリンク先を示します。

 

[user@server ~]$ ls -li 12345 -rw-r--r--. 1 user user 1024 11月 13 06:00 original.txt 12346 lrwxrwxrwx. 1 user user 12 11月 13 06:01 symlink.txt -> original.txt

 

この例では、original.txt (inode 12345) に対するシンボリックリンク symlink.txt が作成されています。

symlink.txt は、original.txt とは別のinode番号(12346)を持っていて、その実体は「original.txt」っていう文字列(パス)を持っているだけなんです。

だから cat symlink.txt を実行すると、Linuxは「お、これはシンボリックリンクだ。original.txt を参照しろってことだな」と解釈して、自動的に original.txt の中身を表示してくれるんですね。

 


シンボリックリンクの制約と特徴

 

ディレクトリに対しても作成可能です。これがすっごく便利!
異なるファイルシステム間でも作成可能です。(例: /(メインディスク)から /mnt/usb(USBメモリ)へのリンクとか)
リンク元(オリジナル)を削除・移動すると、リンクは機能しなくなります。これは「リンク切れ(Broken Link)」って呼ばれてて、ls -l で見ると赤く点滅したりします(怖い!)。参照先のパスが書かれたポインタ(付箋)だけが残っちゃってる状態だからですね。

 

2. ハードリンク (Hard Link) とは?

 

  • 概要: ファイルの実体(inode)に対する「別名」です。「あだ名」みたいなものですね。
  • 実体: リンク元とハードリンクは、まったく同一の「inode」を共有します。
  • inode: リンク元(オリジナル)とハードリンクは、同じinode番号を持ちます。
  • ls -l での表示: 通常のファイルとまったく見分けがつきません…。ls -i でinode番号を見るか、ls -l の2列目「リンクカウント」で判断するしかないんです。

 

[user@server ~]$ ls -li 12345 -rw-r--r--. 2 user user 1024 11月 13 06:00 original.txt 12345 -rw-r--r--. 2 user user 1024 11月 13 06:00 hardlink.txt

 

この例では、original.txt (inode 12345) に対するハードリンク hardlink.txt が作成されています。

注目してほしいのは、以下の2点です!

1. inodeが同じ: original.txt も hardlink.txt も、inode番号は 12345 でまったく同じです。これは、original.txt と hardlink.txt っていう2つの異なるファイル名が、ディスク上のただ一つの実体(inode 12345)を指している、っていうことを意味します。

2. リンクカウントが 2: ls -l の2列目(パーミッションの次)の数字が 2 になっていますよね。これは「この実体(inode 12345)には、今、2つの名前(original.txt と hardlink.txt)が付けられてますよー」っていうカウンターなんです。

だから、hardlink.txt を編集すると、inode 12345 の実体が編集されるので、即座に original.txt の内容も変更されます(だって、実体は一つしかないんですから!)。

 


ハードリンクの制約と特徴

 

ディレクトリに対しては作成できません。(もし許可しちゃうと、ディレクトリ構造がループして(A -> B -> A …みたいに)、システムが混乱しちゃうので禁止されてるんです)
異なるファイルシステム間では作成できません。(inode番号は、そのファイルシステムの中だけで有効な管理番号なので、ファイルシステムをまたいでinodeを共有することはできないんですね)
リンク元(オリジナル)を削除しても、ハードリンクは機能し続けます!
rm original.txt を実行すると、inode 12345 へのリンクカウントが 2 から 1 に減るだけなんです。
実体(inode 12345)は、リンクカウントが 1 以上残っている限り、ディスクから削除されません。
この状態で hardlink.txt にアクセスすれば、ファイルは問題なく存在し続けます。すごいでしょ!
そして rm hardlink.txt を実行して、リンクカウントがついに 0 になった時点で、初めてファイルの実体がディスクから解放(削除)されるんです。

 

(表1)シンボリックリンク vs ハードリンク 徹底比較表

 

これまでの内容を、比較表にまとめますね。ここが一番大事なので、しっかり覚えてください!

比較項目 シンボリックリンク (Symbolic Link) ハードリンク (Hard Link)
通称 ソフトリンク、ショートカット、ポインタ 別名、あだ名
実体 リンク元のパス(文字列)を指す、独立したファイル リンク元の実体(inode)を直接指す、実体の別名
inode番号 リンク元と異なる リンク元と同じ
ls -l 表示 l で始まり -> でリンク先を示す 通常のファイルと見分けがつかない
判断方法 ls -ll-> ls -i のinode番号、または ls -l のリンクカウント
ディレクトリへの作成 可能 不可能
ファイルシステム越え 可能 不可能
リンク元の削除 リンク切れ(Broken Link)になり、機能しなくなる リンクカウントが減るだけで、機能し続ける

 

スポンサーリンク

【実践】ln コマンドの使い方 (linux ln)

 

2つのリンクの根本的な違いを理解したところで、いよいよ「linux ln」 コマンドの実践です!

ln コマンドの基本構文は、cp(コピー)や mv(移動)コマンドとすっごくよく似ています。

ln [オプション] [リンク元(オリジナル)] [リンク先(作成するリンク名)]

この「[元] [先]」っていう順番を、しっかり覚えてくださいね。

  • [リンク元(オリジナル)] : 既に存在している、参照させたいファイルやディレクトリ。
  • [リンク先(作成するリンク名)] : これから新しく作成する、リンクの名前。

ln コマンドは、デフォルト(オプションなし)だとハードリンクを作成しちゃいます。

私たちがよく使うシンボリックリンクを作成するには、必ず -s オプションが必要です!

 

スポンサーリンク

linux シンボリックリンク 作成 (ln -s オプション)

 

現代のLinux運用において、手動で「linux リンク 作成」を行う場合、その99%はシンボリックリンクです!

ハードリンクはシステムの内部(例えば、タイムマシンのような賢いバックアップとか)で使われることはあっても、管理者が手動で作る機会はめったにありません。

なので、まずは ln -s(–symbolic)を確実にマスターしちゃいましょう!

 

ファイルへのシンボリックリンク作成

 

最も基本的な使い方です。

ln -s [オリジナルのファイル] [作成するリンク名]

 


実行例

 

/etc/httpd/conf/httpd.conf っていう深い場所にある設定ファイルへのリンクを、ホームディレクトリに httpd.conf っていう名前で作成してみます。

[user@server ~]$ ln -s /etc/httpd/conf/httpd.conf httpd.conf

 


確認 (ls -l)

 

[user@server ~]$ ls -l httpd.conf lrwxrwxrwx. 1 user user 26 11月 13 06:15 httpd.conf -> /etc/httpd/conf/httpd.conf

 

ちゃんと先頭が l になってますね!
inode番号は、ls -i /etc/httpd/conf/httpd.conf と ls -i httpd.conf で確認すれば、違ってることもわかります。
-> の後に、リンク元(オリジナル)のパスが表示されています。

たったこれだけで、vi ~/httpd.conf を実行するだけで、実際には /etc/httpd/conf/httpd.conf を編集できるようになっちゃいました!便利!🥰

 

ディレクトリへのシンボリックリンク作成

 

シンボリックリンクはディレクトリに対しても問題なく作成できます。

/var/log/nginx ディレクトリへのリンクを、ホームディレクトリに nginx_logs っていう名前で作成してみましょう。

[user@server ~]$ ln -s /var/log/nginx nginx_logs

 


確認 (ls -l)

 

[user@server ~]$ ls -l nginx_logs lrwxrwxrwx. 1 user user 13 11月 13 06:20 nginx_logs -> /var/log/nginx

 

これで、cd ~/nginx_logs って入力するだけで、実際には /var/log/nginx ディレクトリにワープできるようになります!

 

【超重要】絶対パス vs 相対パスの「落とし穴」

 

linux シンボリックリンク 作成」において、初心者が必ず一度は失敗する(私もやりました…)のが、絶対パス相対パスの扱いです。

さっき、シンボリックリンクの実体は「リンク元のパス(文字列)」だって説明しましたよね?

この「パス(文字列)」を、今いる場所(カレントディレクトリ)からの相対パスで記録するのか、ルート(/)からの絶対パスで記録するのかが、リンクの挙動を大きく左右しちゃうんです。

 


例:data ディレクトリ内にリンクを作成する

 

今いる場所 /home/user に、data ディレクトリと original.txt があるとします。
cd /home/user/data に移動して、../original.txt へのリンクを2パターンで作成してみましょう。

[user@server ~]$ ls data/ original.txt

[user@server ~]$ cd data

 

1. 相対パスで作成(推奨されないケースが多い)

[user@server data]$ ln -s ../original.txt symlink_relative.txt [user@server data]$ ls -l symlink_relative.txt lrwxrwxrwx. 1 user user 16 11月 13 06:25 symlink_relative.txt -> ../original.txt

data ディレクトリ内では、../original.txt は正しく original.txt を指すので、リンクはちゃんと機能します。
でも、問題発生です! もし symlink_relative.txt を別の場所、例えば /tmp に移動(mv)しちゃうと、/tmp から見た ../original.txt は存在しないので、リンク切れになっちゃいます😥

 

2. 絶対パスで作成(安全・確実!)

[user@server data]$ ln -s /home/user/original.txt symlink_absolute.txt [user@server data]$ ls -l symlink_absolute.txt lrwxrwxrwx. 1 user user 23 11月 13 06:26 symlink_absolute.txt -> /home/user/original.txt

今度は、リンク元をルート(/)からの完全なパスで指定しました。
この symlink_absolute.txt は、/tmp に移動しようが、どこに移動しようが、常に /home/user/original.txt を指し示してくれるので、リンク切れになりません!

 

💡 結論(お約束)

リンク切れのリスクを最小限に抑えるため、特に理由がない限り、

シンボリックリンクのリンク元(オリジナル)は、常に絶対パスで指定する!

これを強く強く推奨します!

 

ln コマンドの便利なオプション

 

  • -f (--force)
    リンク先(作成するリンク名)に同名のファイルやリンクが既に存在する場合、ln コマンドは普通エラーになっちゃいます。
    でも -f を付けると、既存のファイルを強制的に上書きしてリンクを作成してくれます。
    古いリンクを新しいリンクに貼り替える時によく使いますよ。(例: ln -sf /new/version /opt/current)
  • -v (--verbose)
    リンクが作成された際に、「'link' -> 'original'」みたいに作成結果を親切に表示してくれます。スクリプトなんかで実行ログを残したい場合に便利ですね。

 

スポンサーリンク

ハードリンクの作成 (オプションなし ln)

 

ln コマンドをオプションなしで実行すると、ハードリンクが作成されます。

ln [オリジナルのファイル] [作成するハードリンク名]

 


実行例

 

original.txt へのハードリンク hardlink.txt を作成してみます。

[user@server ~]$ ls -li original.txt 12345 -rw-r--r--. 1 user user 1024 11月 13 06:00 original.txt

この時点ではリンクカウントは「1」です
[user@server ~]$ ln original.txt hardlink.txt

 


確認 (ls -li)

 

[user@server ~]$ ls -li original.txt hardlink.txt 12345 -rw-r--r--. 2 user user 1024 11月 13 06:00 hardlink.txt 12345 -rw-r--r--. 2 user user 1024 11月 13 06:00 original.txt

 

見てください!

  • 両方の inode番号が 12345 で同一になっています。
  • 両方の リンクカウントが 2 に増加しています。

これで、original.txt と hardlink.txt は、ディスク上のまったく同じデータを指す「2つの名前」になった、ってわけです。

さっき説明した通り、ハードリンクはディレクトリや異なるファイルシステム間では作成エラーになっちゃいます。

[user@server ~]$ ln /home/user /tmp/user_link ln: /home/user: ハードリンクの作成は許可されていません

 

スポンサーリンク

Linuxのリンク削除: rm コマンドの安全な使い方

 

シンボリックリンクもハードリンクも、それらを削除するための特別なコマンド(unlink コマンドもありますが、rm が一般的です)は必要ありません。

通常のファイル削除と同じ rm コマンドを使います。

rm [リンクファイル名]

 

【最重要・警告】ディレクトリへのシンボリックリンク削除時の「恐怖の罠」

 

rm コマンドでリンクを削除する時、特にディレクトリへのシンボリックリンクを扱う場合には、絶対に注意しなきゃいけない「罠」があります。

それは…リンク名の末尾に /(スラッシュ)を付けちゃうことです!

 


状況

 

ホームディレクトリに、/var/log へのシンボリックリンク logs があるとします。

lrwxrwxrwx. 1 user user 8 11月 13 06:30 logs -> /var/log

この logs っていう「リンクファイル自体」を削除したい場合、どうしますか?

 

▼正しい削除方法:

rm logs

これで logs っていう名前の「リンクファイル(ポインタ)」だけが削除されます。
リンク元(オリジナル)である /var/log ディレクトリと、その中身には何の影響もありません。これが正解!🥰

 

▼危険な(間違った)削除方法:

rm -r logs/

あーーーーー!ダメです!😱
rm コマンドに / を付けて logs/ って指定しちゃうと、Linuxは「logs というリンクファイルではなく、logs が指し示しているリンク先のディレクトリの中身」を削除対象として解釈しちゃうんです!

もし -r(再帰的)オプションを付けて sudo rm -r logs/ なんて実行しちゃったら… logs リンクは削除されず、リンク元である /var/log ディレクトリの中身がぜんぶ削除されてしまいます

これはシステムログがすべて消し飛ぶ、致命的なオペレーションミスです…(考えただけでも怖い😭)

 

結論(絶対のお約束!)

リンクファイル(シンボリックリンク、ハードリンク問わず)を削除する場合は、

rm コマンドでリンク名を指定して、末尾に絶対に / を付けない癖をつけましょう!

 

リンク削除時の挙動まとめ

 

  • シンボリックリンクの削除 (rm symlink)
    リンクファイル(ポインタ)が削除されるだけです。
    リンク元(オリジナル)のファイルやディレクトリには、何の影響もありません。
  • ハードリンクの削除 (rm hardlink)
    その実体(inode)へのリンクカウントが 1 減るだけです。
    他のリンク(original.txt とか)が残っていれば、実体データは削除されず、他の名前で引き続きアクセス可能です。
    リンクカウントが 0 になった瞬間に、初めて実体データがディスクから解放(削除)されます。

 

スポンサーリンク

リンク切れ(Broken Link)の探し方と対処法

 

シンボリックリンクはすっごく便利ですが、リンク元(オリジナル)のファイルが移動したり、名前が変更されたり、削除されたりすると、「リンク切れ(Broken Link)」が発生しちゃいます。

ls -l で見ると、環境によっては赤く点滅したり、リンク先が存在しないことを示す色で表示されたりします。

[user@server ~]$ mv original.txt original_moved.txt [user@server ~]$ ls -l symlink.txt lrwxrwxrwx. 1 user user 12 11月 13 06:01 symlink.txt -> original.txt <-- リンク切れ!

システム内にこんな不要なリンク切れファイルが溜まっていくのは、気持ち悪いですよね…。

find コマンドを使うと、リンク切れのシンボリックリンクをカンタンに見つけることができますよ!

find [検索開始ディレクトリ] -xtype l

-xtype l: タイプ(type)がシンボリックリンク(l)で、かつリンク先が存在しない(x)ものを検索します。

# カレントディレクトリ配下(.)のリンク切れを探す [user@server ~]$ find . -xtype l ./symlink.txt

 


リンク切れの対処法

 

1. リンクを貼り直す:
リンク元の新しいパスがわかっている場合は、ln -sf を使ってリンクを強制的に上書き(更新)します。
ln -sf /new/path/to/original.txt symlink.txt

2. リンクを削除する:
そのリンクがもう不要なことがわかっている場合は、rm コマンドで安全に削除します。
rm symlink.txt

 

スポンサーリンク

(表2)linux シンボリックリンク vs ハードリンク 実践的使い分けガイド

 

結局のところ、2つのリンクをいつ使えばよいんでしょうか?
具体的なユースケース(使い道)を表にまとめますね!

項目 シンボリックリンク (ln -s) が最適な時 ハードリンク (ln) が最適な時
ディレクトリの参照 ディレクトリへの「ショートカット」が欲しい時。
(例: cd ~/logs/var/log に移動したい)
使用不可。(ディレクトリには作成できません)
設定ファイルの管理 設定ファイルの実体を一箇所で管理し、有効化・無効化を切り替えたい時。
(例: Nginxの sites-available -> sites-enabled
あまり使われません。
バージョンの切り替え 「常に最新版」を指すリンクを作りたい時。
(例: current -> app-2.0app-2.1 ができたら current のリンク先を貼り替える)
あまり使われません。
別パーティション参照 異なるファイルシステム(ディスク、パーティション、マウントポイント)上のファイルを参照したい時。 使用不可。(ファイルシステムを越えられません)
バックアップ リンク元を消したらリンクも機能しなくて良い場合。 「ファイルの実体を確実に残したい」時。
(リンク元を消しても、ハードリンクがある限り実体は消えない)
ディスクスペース ほぼ0(ポインタ分のみ)。 0(inodeを共有するため、追加のスペース消費はなし)。
結論 日常的な運用(linux リンク 作成)のほぼすべて。 ファイルの実体(inode)の消失を防ぎたい特殊なケース。

 

スポンサーリンク

まとめ

 

linux シンボリックリンク」と「linux ln」 コマンドの世界、いかがでしたでしょうか?

最初は「シンボリック」と「ハード」の違いに戸惑っちゃうかもしれませんが、inode(実体を管理する番号)っていう概念さえ理解してしまえば、すべてはちゃーんと論理的に繋がってるんです。

最後に、この記事で学んだ最重要ポイントを、もう一度おさらいしますね!

 

リンクは2種類ある!
シンボリックリンク (ln -s): ショートカット。実体は「パス文字列(ポインタ)」。inodeは別。ディレクトリOK。
ハードリンク (ln): 別名。実体は「inodeそのもの」。inodeは同じ。ディレクトリNG。

linux シンボリックリンク 作成」 が基本!
日常業務で使うのは99% ln -s です。
作成する時は「絶対パス」でリンク元(オリジナル)を指定するのが、リンク切れを防ぐ最も安全な方法ですよ!

リンクの削除は rm コマンド!
リンクを削除する特別なコマンドは不要です。rm [リンク名] で削除します。
最大の注意点: ディレクトリへのシンボリックリンクを削除する時、rm logs/ みたいに末尾に / を絶対につけちゃダメです!リンク先の中身が消し飛ぶ大惨事になっちゃいますからね!必ず rm logs ってタイプしてください!

ハードリンクとリンクカウント
ハードリンクは、実体(inode)への「参照カウンター」を増やします。
リンクカウントが 0 になるまで、ファイルの実体はディスクから削除されません。

 

linux ln コマンドは、Linuxの柔軟なファイル管理を支える、すっごく強力なツールです。

シンボリックリンクを使いこなせば、複雑な設定ファイルの管理や、アプリケーションのデプロイメントが劇的に効率化されますよ!

この記事をリファレンス(辞書代わり)として、2つのリンクの違いを自信を持って使いこなし、安全で堅牢なLinuxサーバー運用を目指してくださいね!💪✨

コメント