はじめに
みなさま、lnコマンドを活用されていますでしょうか?
リンクには2種類あります。シンボリックリンクとハードリンクです。
シンボリックリンクはWindowsのショートカットようなものです。ハードリンクは、実態を別のパスや、任意の名前で複製することができます。
説明が下手くそなので、それぞれのリンクについての解説は他のサイトで確認してみてください。
そんなリンクを作成するコマンドを紹介します。
環境
OS : AlmaLinux 8
lnバージョン : 8.30
使い方
さっそくですが、シンボリックリンスを作成してみましょう。
まずは、リンク元となるファイルを作成します。
$ vi aaa.txt
link test file
次に、シンボリックリンクを作成するディレクトリを作成します。
$ mkdir link_test_dir
$ ls -l
total 4
-rw-rw-r-- 1 hogehoge hogehoge 15 Feb 1 17:23 aaa.txt
drwxrwxr-x 2 hogehoge hogehoge 21 Feb 1 17:31 link_test_dir
$
準備が整ったので、シンボリックファイル:bbb.txtを作成します。
$ cd link_test_dir
$ ln -s ../aaa.txt ./bbb.txt
lsコマンドで確認すると以下のように表示されます。パーミッション表示の最初の文字列が「l」となり、ファイル名の表示で、参照先のファイルも表示されます。
$ ls -l
total 0
lrwxrwxrwx 1 hogehoge hogehoge 10 Feb 1 17:39 bbb.txt -> ../aaa.txt
$
bbb.txtの中身を確認すると、aaa.txtの内容になっていることがわかります。
$ cat bbb.txt
link test file
$
シンボリックリンク:bbb.txtの参照先をaaa.txtから別のファイルに変更することで、bbb.txtを参照した際の中身を別のファイルのものに変更することができるのです。
LetsEncryptのSSL証明書では、このシンボリックリンクの機能を使って、SSL証明書のファイルパスを変更することなく、更新された新しいSSL証明書への切替を実現されています。
つづいて、ハードリングを作成してみましょう。
$ ln ../aaa.txt ccc.txt
$ ls -la
total 4
drwxrwxr-x 2 hogehoge hogehoge 36 Feb 1 17:44 .
drwxrwxr-x 3 hogehoge hogehoge 42 Feb 1 17:23 ..
lrwxrwxrwx 1 hogehoge hogehoge 10 Feb 1 17:39 bbb.txt -> ../aaa.txt
-rw-rw-r-- 2 hogehoge hogehoge 15 Feb 1 17:23 ccc.txt
$
ccc.txtが作成されていますね。パッと見は普通のファイルと変わらないですかね。
中身を確認すると、aaa.txtの内容になってますね。
$ cat ccc.txt
link test file
$
ハードリングは通常のコピーとは違って、iノードがコピーされます。
というわけで、iノード番号を確認してみましょう。
$ ls -li ../aaa.txt
2663134 -rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 ../aaa.txt
$
$ ls -li ccc.txt
2663134 -rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 ccc.txt
$
同じになってますね。ハードリンクファイルはいくら複製しても、ディスク容量を消費しません。
$ du -sh ./*
0 ./bbb.txt
4.0K ./ccc.txt
$
$ ln ../aaa.txt ddd.txt
$ ln ../aaa.txt eee.txt
$ ln ../aaa.txt fff.txt
$
$ ls -l
total 16
lrwxrwxrwx 1 hogehoge hogehoge 10 Feb 1 17:39 bbb.txt -> ../aaa.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 ccc.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 ddd.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 eee.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 fff.txt
$
ls -l で表示されれう2カラム目はハードリンクの数になっています。ccc.txt以降のファイルはaaa.txt含めて5つあるので、5になってます。
改めて、duコマンドで容量を確認してみます。
$ du -sh ./*
0 ./bbb.txt
4.0K ./ccc.txt
$
先ほど作成したハードリンクは表示されないですね。
普通のファイルコピーを実施してみましょう。
$ cp -p ../aaa.txt aaaaaa.txt
$ ls -l
total 20
-rw-rw-r-- 1 hogehoge hogehoge 15 Feb 1 17:23 aaaaaa.txt
lrwxrwxrwx 1 hogehoge hogehoge 10 Feb 1 17:39 bbb.txt -> ../aaa.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 ccc.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 ddd.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 eee.txt
-rw-rw-r-- 5 hogehoge hogehoge 15 Feb 1 17:23 fff.txt
$
コピーしたファイルは、duコマンドで表示されますね。
$ du -sh ./*
4.0K ./aaaaaa.txt
0 ./bbb.txt
4.0K ./ccc.txt
$
この特性を利用して、ファイルのバックアップをハードリンクで取得することで、複数世代の保存を余分な容量増加を回避しつつ、運用することができます。
まとめ
いかがでしたか?
シンボリックリンク、ハードリンク、それぞれの特徴を活かして、サーバー運用に快適にしていただければと思います。
ぜひ、ln コマンドを活用してみてください。

