こんばんわ、ミツです。
今回はシンボリックリンクやハードリンクを作成する「ln」コマンドについて紹介していきます。
目次
リンク
リンクとはwindowsでの「ショートカット」と似ており、同一ファイルに異なる2つの名前をもたせることができます。
したがって、データのコピーが行われるのではなく、同じデータを指しています。
シンボリックリンク
シンボリックリンクは、ファイルやディレクトリに別名を持たせファイルを参照することができます。
シンボリックリンクにアクセスしようとすると、実際にはそこ(ファイルやディレクトリ)に記憶されているパス名が表す対象へアクセスします。
下記図ではfileBがfileCに対してシンボリックリンクしている場合、fileBを参照してもfileCのデータにアクセスします。ここで注意が必要なのはfileCを削除した場合、fileCのデータにはアクセスできずエラーになります。
主にアクセスしたいファイルやディレクトリのすばやく参照したり、場合に利用されます。そのためリンク元(fileB)ファイルを消しても実ファイルは削除されません。
シンボリックリンクの特徴
特徴として以下のような特徴がございます。
・リンクファイルが使用するiノードはオリジナルファイルと異なる番号
・ディレクトリをもとにリンクファイルを作成可能
・オリジナルファイルと別のパーティションにリンクファイルを作成可能
・パーミションの先頭は、ファイルタイプとしてシンボリックリンクファイルを表す「|」が表示される
ハードリンク
ハードリンクとは、あるファイルやディレクトリの実体に複数の名前を付け、それぞれが実際のファイル名/ディレクトリ名として等しく機能するようにできます。
ハードリンクの特徴
特徴は下記となります
・リンクファイルが使用するiノードはオリジナルファイルと同じ番号
・ディレクトリをもとにリンクファイルを作成することはできない
・iノード番号は同一ファイルシステム内でユニークな番号なので、異なるパーティションのハードリンクを作成することはできない
・iノードは、そのファイルの詳細情報や、実データが格納されているデータブロック番号が保存されています。
inodeについて
inode(アイノード)は、Unix系ファイルシステム使われているデータ構造です。
ファイル、ディレクトリなどのファイルシステム上のオブジェクトに関する基本情報が格納されています。ファイルやディレクトリはinodeに接続してデータを参照します。
lnコマンド
ファイルやディレクトリにリンクをはるにはlnコマンドを使用します。
書式
ln [オプション] オリジナルファイル [ディレクトリ] リンクファイル名
オプション
オプション | 説明 |
-s | シンボリックリンクで別名を付けます |
-d | ハードリンクを別名で作成します |
-f | 同盟のファイルがある場合には、上書きします |
-i | 同名のファイルがある場合には、上書きするかどうかをユーザに確認します。 |
実行例
シンボリックリンクの作成
ファイルの場合
以下の実行例ではシンボリックリンクを作成しています。
そしてiノード番号を確認するにはiノードを見るには、lsコマンドに「i」オプションをつけます。
異なることが確認できます。
「ls -l」を実行した際に、シンボリックリンクファイルは「リンク名」であることを確認します。
参照先(オリジナル)ファイルが「fileA」参照元ファイルがfileBとなります。fileBを削除してもfileAへ影響はありません。
また注意する点として、オリジナルファイル(fileA)を削除した場合、リンクファイル自身が保持している参照先(オリジナルファイルの場所)がなくなるため、fileBを参照してもエラーとなります。
なおシンボリックリンクは、ディレクトリに対しても作成が可能です。次の例では、ディレクトリのシンボリックリンクを作成しています。
ディレクトリに対して
新たに「directoryB」を作成し、そのディレクトリ内にfile1を作成しました。
事前準備ができたら、「directoryA」から「directoryB」に対してシンボリックリンクをします。その後「ls -l」コマンドでリンクができたら「cdコマンド」で「directoryA」に移動し、「directoryB」の情報にアクセスできているか確認します。
無事direcotryA(参照元)を利用してdirectoryB(参照先)にシンボリックリンクできたことが確認できます。
ディレクトリに対しても「inode」を確認できます。
シンボリックリンクの削除
リンク先ファイルを削除した場合、赤枠で表示されるようになり、参照元ファイルである「fileB」を参照して参照先ファイルが削除されているので参照できなくなります。ディレクトリの場合も同様の結果になります。
ハードリンク作成
以下の実行例では、ファイル「fileA」のハードリンクとして「fileB」を作成しています。それぞれを「cat」コマンドで内容を表示すると、同じ内容が表示されます。
ハードリンクの削除
「fileA」を作成し、「fileA」に対して「fileB」というファイルでハードリンクを作成します。
その後fileAというファイルを削除しますが、ハードリンクで作成した「fileB」をを参照することで、fileAの内容を確認できます。これは同じinode番号であるため、同じデータブロックにアクセスできているからです。
よくあるエラー:ディレクトリに対してハードリンクを作成
ハードリンクは、ディレクトリ対して作成することができません。
次の例では、ディレクトリのハードリンクを作成しようとすると、エラーが発生することを確認しています。
まとめ
リンク作成をするlnについては以上になります。
人によってはwindowsで頻繁にショートカットをしてデスクトップに並べている人を良く見かけます。
Linuxでもコマンドで簡単に設定できるので、ぜひ試してみてください。
本メディアではLinuxやプログラミング言語に関する記事を執筆しているのでぜひ興味がありましたら、ご覧ください。