LinuxのリンクファイルとはWindowsでいうところのショートカットだ。ショートカットキーではなく、デスクトップに置かれるようなファイルやフォルダへのショートカットがそれに当たる。
このページではLinuxでのリンクファイルの作成方法と使い方についてお伝えした。
目次
リンクファイルを作成する意味
「リンク」を使用すると深い階層にあるファイルへのパスを短くしたり、特定の場所にリンクを設置することで、あたかも実態がそこにあるかのように振る舞うことが出来る。
例えば実態の実行ファイルをパスの通っていない場所に設置して、リンクをパスの通った場所に設置することでリンクをとおしてファイルを実行できるようになる。
要するに諸々の作業時間を減らしたり、わかりやすくすることができるということだ。
作業時間を減らすという意味では下記ページも参考になるし、下記でもリンクファイルの作成方法を簡単に説明している。このページよりもざっくり説明しているので、早く知りたい方はこちらを参考に。
Windowsでは「ショートカット」といわれるが、Linuxではリンクの種類が二つある「ハードリンク」と「シンボリックリンク」である。
ハードリンクに最初は戸惑うかもしれないが、さほど難しい概念ではないので安心していただきたい。
inodeのお話
ハードリンクやシンボリックリンクの話をする前にファイルの実態に関わる「inode」について話をしよう。
Linuxでファイルを作成すると、自動的にユニークな「inode番号」という番号が割り振られる。全てのファイルにinode番号が割り当てられることになっており、inodeはファイルの実態と強く結びついている。
またinodeにはファイルの「各属性情報」が収納されており、具体的には
- ファイル種別
- ファイルサイズ
- アクセス権
- 所有者情報
- リンク
- ブロック番号
などが納められている。
ハードリンク
ハードリンクを理解するときに重要なのは、「ファイル名はラベル」ということだ。ひとつのinodeにたいして複数のファイル名を割り振ることが可能になっている。
ハードリンクがまさにそれだ。ハードリンクはinodeに複数のファイル名つまりラベルを貼りつける作業となる。
名前や場所が違うファイルが実際には同じものを見ているイメージだ。
ファイルそのものを見るため、ファイルシステムに強く関係している。そのため、異なるファイルシステムやパーティションへのハードリンクはできない。
また、inodeの番号を参照するため、元のファイルを移動させてもリンクがデットリンクになることがない。
特徴
- inodeを参照する
- パーティションをまたげない(inodeの関係上)
- 異なるファイルシステム上ではリンクを作成できない(inodeの関係上)
- ディレクトリのハードリンクは作成できない
- 元ファイルを移動しても大丈夫
シンボリックリンク
Linuxに限らずパソコン上で一般的にリンクというと「シンボリックリンク」を指すことが多いだろう。こっちが、Windows用語でいうならば「ショートカット」となる。
ただ、置き場を見にくだけのリンクだ。
パスでの参照となるのでinodeに依存しておらず、OSが認識しているファイルシステムならパーティションや異なるファイルシステムであっても問題なくリンクを作成できる。
lsなどで見ると、シンボリックリンクもファイルのように見える。
元ファイルを移動や削除するとデットリンクになる。ハードリンクよりもソフト的であり比較的に柔軟だ。
他のファイルシステムなどにリンクを貼っても動く。
特徴
- パスでファイルやディレクトリを参照(リンク元のポインタとして動作する)
- 別のファイルシステムでも問題なく動作する
- ディレクトリに対しても有効
- 元ファイルを移動するとデットリンクになる
- 元ファイルを削除するとデットリンクになる
lnコマンドで実際に操作してみる
ハードリンクを実験する
では実際にlnコマンドでリンクを作成してみよう。とりあえず実験するためにディレクトリとファイルを用意しよう
$ mkdir -p testdir/mydir
$ touch testdir/mydir/testfile1.txt
$ echo test > testdir/mydir/testfile1.txt
$ cd testdir
準備はこのくらいで大丈夫だろう。いよいよlnコマンドを使用してみる
$ ln mydir/testfile1.txt ./test-hard-link
ハードリンクの作業は以上で終了だ。
ためしに
$ cat test-hard-link
としてみるとtestfile1.txtと内容が同じになっているはずだ。無事にリンクを作成できている。
さて次はinodeを確認してみよう
$ ls -il test-hard-link mydir/testfile1.txt
1 2 3 |
145717 -rw-r--r-- 2 ken users 5 12月 24 15:53 mydir/testfile1.txt 145717 -rw-r--r-- 2 ken users 5 12月 24 15:53 test-hard-link |
カラム1がinode番号であり、同じものをしめしているのがわかる。
ここで元のファイルtestfile1.txtの場所を変更してみよう
$ mv mydir/testfile1.txt .
この状態で
$ cat test-hard-link
としてみよう。問題なく参照できるはずだ。
ハードリンクはinode番号(今回の例では145717)が判断基準となりファイル名が増えるだけなので、どこに移動させてもリンクの状態はたもたれる。
ちなみにカラム3がinode番号に対してリンクされている数をしめしている。通常では実態ファイルを削除したい場合、ハードリンクをすべて削除すると実態も削除される。つまり現状
$ rm testfile1.txt
$ cat test-hard-link
としても実態はなくならないのである。inodeを基準にファイルが開かれるはずだ。
シンボリックリンクを実験する。
ハードリンクの次はシンボリックリンクを実験してみよう
まずは先程とおなじく適当にディレクトリやファイルを作成
$ mkdir -p stestdir/smydir
$ touch stestdir/smydir/stestfile1.txt
$ echo test > stestdir/smydir/stestfile1.txt
$ cd stestdir
この状態で
$ ln -s smydir/stestfile1.txt ./test-link
として
$ ls -lah
とすると
1 2 3 4 5 6 7 |
drwxr-xr-x 3 ken users 4.0K 12月 24 16:27 ./ drwx------ 34 ken users 4.0K 12月 24 16:25 ../ drwxr-xr-x 2 ken users 4.0K 12月 24 16:25 smydir/ lrwxrwxrwx 1 ken users 21 12月 24 16:27 test-link -> smydir/stestfile1.txt |
リンクがはられているのがわかる。
この状態で元ファイルの場所を変えてみよう
$ mv smydir/stestfile1.txt .
この状態で
$ cat test-link
としてみるとファイルが参照できなくなる。
シンボリックリンクはファイル名とパスに依存している。そのため名前が変わったり、場所が変更されると参照できなくなるので注意しよう。またシンボリックリンクを削除するときはrmコマンドを使用するよりも「unlink」コマンドを使用した方が安全だ。
$ unlink test-link
まとめ
このページではLinuxのリンクファイルの作成方法などについてまとめてご紹介してきた。
特にシンボリックリンクはシステム動作にも不可欠なものになっている。よく出てくるので、使い方含めマスターしてしまおう。
ハードリンクとシンボリックリンクの違いが今までよくわかってなかったんですが,この記事を読んでよくわかりました!ありがとうございます
ご参考にしていただきありがとうございます。
引き続き、ご愛読いただけますと幸いです。
今まで、右クリックにて、リンクが作成できたのに、Ubuntu 18.04 より、リンクの作成みたいなものが見当たらず、どうしようかと思っていました。(私自身の設定の不備もあると思いますが)
端末を利用して作成するのですね。投稿されておられる記事を参考にして、リンクを作成することができました。
ほんとうにありがとうございます。
ご愛読いただきありががとうございます。
引き続き、何卒よろしくお願いいたします。