SSブログ

『コピー』と『リンク』 [概論・概要]

 本人でさえもその存在を忘れるくらい、超ご無沙汰をしていました。(大笑)
 久しぶりにこっちのblogも更新~ってことで。

 さて、今度はUNIX/Linuxで必修の知識の一つである、『コピー』と『リンク』について触れておきます。

 UNIX/Linuxの超基礎コマンドの一つに、ファイルをコピーするコマンド「cp」というコマンドがあります。そりゃもう、頻繁に使うコマンドなのですが、これとよく似たコマンドに、「ln」というコマンドも存在するのです。
 まず、両方のコマンドを実際に試してみましょう。

 まず、ここではサンプルとして、original.txtというテキストファイルを作成します。苦労して練習したであろうviコマンドを使って、皆さんも作成してみましょう。
[piro791@urd copy_and_link]$ cat original.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の…(古いネタを引っ張るなあ
[piro791@urd copy_and_link]$


 続いて、このファイルをcpコマンドでコピーしてみます。cpコマンドの使い方は、基本型としては

 cp コピー元のファイル コピー先のファイル

 というように指定します。今回は「original.txt」というファイルを、「copy.txt」というファイルにコピーしてみましょう。この場合は

 cp original.txt copy.txt

 と、実行すれば、所定の目的は達成出来そうです。
 では、レッツ・トライ!
[piro791@urd copy_and_link]$ ls -la
合計 12
drwxrwxr-x 2 piro791 piro791 4096 11月 14 17:04 2012 .
drwx------ 3 piro791 piro791 4096 11月 14 17:04 2012 ..
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:04 2012 original.txt
[piro791@urd copy_and_link]$ cp original.txt copy.txt
[piro791@urd copy_and_link]$ ls -la
合計 16
drwxrwxr-x 2 piro791 piro791 4096 11月 14 17:08 2012 .
drwx------ 3 piro791 piro791 4096 11月 14 17:04 2012 ..
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:08 2012 copy.txt
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:04 2012 original.txt
[piro791@urd copy_and_link]$

 ご無沙汰していましたが、lsコマンドの使い方・見方をちゃんと思い出してくださいよ?
 まず最初(コピーを実行するにlsコマンドで確認してみると、「original.txt」というファイルしか存在していないことが確認できます。
 そして、先ほど確認したcpコマンドを実行し、再度lsコマンドで確認をしています。すると今度は、「original.txt」というファイルに加えて「copy.txt」というファイルが存在していることが判ります。これでファイルがコピーされていることが判ります。

 念のため、両方のファイルの中身を確認してみましょうか。「cat」コマンドでファイルの中を見ることが出来ます。
[piro791@urd copy_and_link]$ cat original.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の…(古いネタを引っ張るなあ
[piro791@urd copy_and_link]$ cat copy.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の…(古いネタを引っ張るなあ
[piro791@urd copy_and_link]$


 全く同じ内容が表示されていますね。このように、cpコマンドでファイルの複製を作ることが出来ます。
 サーバ管理者として「よくある」使い方は、ファイルのバックアップを取得するなんていうケースでしょうね。サーバの設定をするファイルを編集するに、そのファイルをコピーして名前を変えて保存しておく…という使い方はごくごく一般的でごくごく初歩的なオペレーションです。例えば…

 cp httpd.conf httpd.conf.bak

 なんていうコマンドでサーバの設定ファイル(上記の例ではWebサーバの設定ファイル)をバックアップしておき、設定が間違っていた時にはファイルのコピーを逆向きに指定して再度実行すれば、たちまち変更前の状態に復帰することができます。

 さて。冒頭でもう一つ『リンク』なるものに言及していましたが、こちらもサンプルを見ておきましょう。こちらは使用するコマンドがlnになります。
 使い方はcpコマンドと大体一緒なので、先ほどの操作と同じようにこのコマンドを試してみます。なお、先ほどは「copy.txt」と指定した箇所について、今度は「link.txt」と指定することにします。つまり…

 ln original.txt link.txt

 と、します。
 さっそくレッツトライ。
[piro791@urd copy_and_link]$ ls -la
合計 16
drwxrwxr-x 2 piro791 piro791 4096 11月 14 17:08 2012 .
drwx------ 3 piro791 piro791 4096 11月 14 17:04 2012 ..
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:08 2012 copy.txt
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:04 2012 original.txt
[piro791@urd copy_and_link]$ ln original.txt link.txt
[piro791@urd copy_and_link]$ ls -la
合計 20
drwxrwxr-x 2 piro791 piro791 4096 11月 14 17:20 2012 .
drwx------ 3 piro791 piro791 4096 11月 14 17:04 2012 ..
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:08 2012 copy.txt
-rw-rw-r-- 2 piro791 piro791  121 11月 14 17:04 2012 link.txt
-rw-rw-r-- 2 piro791 piro791  121 11月 14 17:04 2012 original.txt
[piro791@urd copy_and_link]$

 cpコマンドの時と同じように、lnコマンドの実行前と後にlsコマンドを実行しています。
 original.txtの他にcopy.txtファイルがありますが、まあこれは先ほどcpコマンドを試したときの残骸ですから気にしないでください。
 lnコマンドの実行前には無かった、「link.txt」というファイルが新たに登場していることがわかりますね?

 では、これもcpコマンドの時と同じように、それぞれの中身を覗いてみましょう。
[piro791@urd copy_and_link]$ cat original.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の…(古いネタを引っ張るなあ
[piro791@urd copy_and_link]$ cat link.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の…(古いネタを引っ張るなあ
[piro791@urd copy_and_link]$

 なんと、original.txtとlink.txtの中身が一緒で、cpコマンドの時と結果が一緒じゃないですか!!

 つまらんつまらん…

 と、がっかりしたあなた。でもこれ、実はcpコマンドと結果が違うんですよ。

 まず、もう一度lsコマンドの実行結果をよ~く見てみましょう。
[piro791@urd copy_and_link]$ ls -la
合計 20
drwxrwxr-x 2 piro791 piro791 4096 11月 14 17:20 2012 .
drwx------ 3 piro791 piro791 4096 11月 14 17:04 2012 ..
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:08 2012 copy.txt
-rw-rw-r-- 2 piro791 piro791  121 11月 14 17:04 2012 link.txt
-rw-rw-r-- 2 piro791 piro791  121 11月 14 17:04 2012 original.txt
[piro791@urd copy_and_link]$

 ファイル名とタイムスタンプが違う…というのはこの際横に置いておくとして、他に違いがあることに気がつきませんか?

 …「-rw-rw-r--」という表示の右側に注目しましょう。copy.txtは「1」になっているのに対して、link.txtとoriginal.txtは「2」になっていることが判りますね?ここにその「理由」が隠されています。

 では、見た目的に判りやすい方法で解説します。
 では、viコマンドを使って、「original.txt」ファイルの中身を変更してみましょう。
[piro791@urd copy_and_link]$ cat original.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の言葉で
ぽぽぽぽーん!
[piro791@urd copy_and_link]$

 …と、このように変更してみました。catコマンドで確認していますが、確かに変更されています。
 ここで今度は先ほど作成した、「copy.txt」と「link.txt」の中身をそれぞれ確認してみましょう。(copy.txtとlink.txtは変更していない事に注意!
 まずは、copy.txtをcat コマンドで確認すると…
[piro791@urd copy_and_link]$ cat copy.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の…(古いネタを引っ張るなあ
[piro791@urd copy_and_link]$

 変更前の状態のままだということが判ります。ところが、link.txtを見ると…
[piro791@urd copy_and_link]$ cat link.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の言葉で
ぽぽぽぽーん!
[piro791@urd copy_and_link]$

 link.txtは変更していないのに、original.txtと全く同じ内容に変更されているではありませんか。

 …これが、『コピー』と『リンク』の違いです。

  『コピー』とは、ファイルの「複製」を作ります。だから、内容は同じでもそれぞれは別の物です。

 ところが、『リンク』というのは、既存のファイルに別名を付けるイメージにるのです。同じ物に違う名前を付けるだけなのです。
 例えば、衣類の種類に、「オーバーオール」というものがありますが、全く同じ物でも「サロペット(ジーンズ)」という人もいます。(詳しくはwikipediaで確認してみてください。)この時、「オーバーオール」「サロペット」は同じ物を指し示していますね?『リンク』はこれと全く同じような振る舞いをするのです。

 ちょっと先走りますが、original.txtとlink.txtは実際には「同じ物」で、copy.txtは実際には「違う物」だということを確認してみましょう。statというコマンドでそれが確認できます。(表示内容は難しいですが、ちょっと試してみてください)
[piro791@urd copy_and_link]$ stat original.txt
  File: `original.txt'
  Size: 113             Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 1706896     Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/ piro791)   Gid: (  500/ piro791)
Access: 2012-11-14 17:32:04.969622598 +0900
Modify: 2012-11-14 17:31:59.442859522 +0900
Change: 2012-11-14 17:32:00.425099552 +0900
[piro791@urd copy_and_link]$ stat copy.txt
  File: `copy.txt'
  Size: 121             Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 1706895     Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  500/ piro791)   Gid: (  500/ piro791)
Access: 2012-11-14 17:12:16.514622280 +0900
Modify: 2012-11-14 17:08:40.033622485 +0900
Change: 2012-11-14 17:08:40.033622485 +0900
[piro791@urd copy_and_link]$ stat link.txt
  File: `link.txt'
  Size: 113             Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 1706896     Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/ piro791)   Gid: (  500/ piro791)
Access: 2012-11-14 17:32:04.969622598 +0900
Modify: 2012-11-14 17:31:59.442859522 +0900
Change: 2012-11-14 17:32:00.425099552 +0900
[piro791@urd copy_and_link]$

 3つのファイルそれぞれに対して、statコマンドを実行しています。注目してほしい場所は「Inode:」という項目です。

 original.txtは 1706896
 copy.txtは 1706895
 link.txtは 1706896

 と、表示されています。なんと、original.txtとlink.txtとは同じ番号が与えられています。「Inode」(アイノードと読みます)とは、ファイルの管理情報を管理しているテーブルのことで、1個のファイルにつき1個のInodeが与えられます。
 cpコマンドは、ファイルの中身を複製し、そして新しいInodeを作成します。だから、新しく作成されたファイル「copy.txt」はInode番号が他と違っているのです。Inode番号が他と違うと言うことは、ファイルの物のが別に存在しているということになるのですね。
 一方でlnコマンドは、新しくInodeを作成しません。既存のInodeに、新しく別の名前を割り当てて終了となるのです。Inodeが同じということは、そのInodeが管理しているファイルの中身は同じ物を使うということになるのです。


 このようなリンクのことを、特にハードリンクと呼びます。

 さて、ハードリンクなんていう単語が登場したということは、お約束事項としてはハードじゃないリンクが存在するのか!?  という疑問も湧いてきませんか?


 …湧きますよね?


 ここは大人の対応をするところですよ?^-^

 実は、存在します。(笑)
 ハードじゃないリンクのことは、ソフトリンクまたは、シンボリックリンクと呼びます。おそらく、後者の方が一般的な呼び方のはずです。

 シンボリックリンクは、先ほど登場したlnコマンドに、「-s」オプションを付けて実行することで作成されるものです。ちょっと試してみましょう。
[piro791@urd copy_and_link]$ ls -la
合計 20
drwxrwxr-x 2 piro791 piro791 4096 11月 14 17:32 2012 .
drwx------ 3 piro791 piro791 4096 11月 14 17:32 2012 ..
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:08 2012 copy.txt
-rw-rw-r-- 2 piro791 piro791  113 11月 14 17:31 2012 link.txt
-rw-rw-r-- 2 piro791 piro791  113 11月 14 17:31 2012 original.txt
[piro791@urd copy_and_link]$ ln -s original.txt symlink.txt
[piro791@urd copy_and_link]$ ls -la
合計 20
drwxrwxr-x 2 piro791 piro791 4096 11月 14 18:05 2012 .
drwx------ 3 piro791 piro791 4096 11月 14 17:32 2012 ..
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:08 2012 copy.txt
-rw-rw-r-- 2 piro791 piro791  113 11月 14 17:31 2012 link.txt
-rw-rw-r-- 2 piro791 piro791  113 11月 14 17:31 2012 original.txt
lrwxrwxrwx 1 piro791 piro791   12 11月 14 18:05 2012 symlink.txt -> original.txt
[piro791@urd copy_and_link]$

 「symlink.txt」というリンクを作成しています。なんだか今まで見たことの無い表示になっているではありませんか。
 catコマンドでsymlink.txtの中身を覗いてみましょう。
[piro791@urd copy_and_link]$ cat symlink.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の言葉で
ぽぽぽぽーん!
[piro791@urd copy_and_link]$

 先ほど変更したoriginal.txtと同じ内容です。
 これもリンクなので、original.txtを変更すれば、symlink.txtも(そしてlink.txtも)内容が変化するはずです。(copy.txtは変わらないはずです)試してみましょう。
[piro791@urd copy_and_link]$ cat original.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の言葉で
ぽぽぽぽーん!
えーしー!
[piro791@urd copy_and_link]$

 末尾に、「えーしー!」という行を追加しています。
 では、copy.txt、link.txt、symlink.txtをそれぞれ中身を覗いてみましょう。
[piro791@urd copy_and_link]$ cat copy.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の…(古いネタを引っ張るなあ
[piro791@urd copy_and_link]$ cat link.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の言葉で
ぽぽぽぽーん!
えーしー!
[piro791@urd copy_and_link]$ cat symlink.txt
オリジナルのファイルです。
こんにちは
こんばんわ
魔法の言葉で
ぽぽぽぽーん!
えーしー!
[piro791@urd copy_and_link]$

 予定通り、copy.txtは変わらない、link.txtとsymlink.txtは変わっています。
 link.txtが変わっている理由はすでに説明しました。Inodeを参照しているので、実体は同じ物だからです。
 では、シンボリックリンクの方は?というと…
[piro791@urd copy_and_link]$ stat original.txt
  File: `original.txt'
  Size: 129             Blocks: 8          IO Block: 4096   通常ファイル
Device: fd00h/64768d    Inode: 1706896     Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/ piro791)   Gid: (  500/ piro791)
Access: 2012-11-14 18:08:37.216622801 +0900
Modify: 2012-11-14 18:08:32.427885831 +0900
Change: 2012-11-14 18:08:33.292733204 +0900
[piro791@urd copy_and_link]$ stat symlink.txt
  File: `symlink.txt' -> `original.txt'
  Size: 12              Blocks: 0          IO Block: 4096   シンボリックリンク
Device: fd00h/64768d    Inode: 1706897     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/ piro791)   Gid: (  500/ piro791)
Access: 2012-11-14 18:05:01.708608811 +0900
Modify: 2012-11-14 18:05:00.291622399 +0900
Change: 2012-11-14 18:05:00.291622399 +0900
[piro791@urd copy_and_link]$

 なんと、Inode番号が違うじゃないですか!
 …しかし、今回も、lsコマンドの結果をよーく見ていただきたい。今回の注目ポイントは、一番左側の情報とファイルサイズの情報です。

lrwxrwxrwxと、書いてあります。先頭のlが大注目ポイントです。実はコレ、ファイルにまつわる情報の記事内でしれっと説明済みなんですが(笑)、これがこのファイルが「リンク」で有ることを示しているのです。
 そして、ファイルのサイズにも注目。
-rw-rw-r-- 2 piro791 piro791  129 11月 14 18:08 2012 link.txt
-rw-rw-r-- 2 piro791 piro791  129 11月 14 18:08 2012 original.txt
lrwxrwxrwx 1 piro791 piro791   12 11月 14 18:05 2012 symlink.txt -> original.txt

 ハードリンクの時は、ファイルのサイズはオリジナルのファイルと同じ値でした。
 なぜなら、「Inode」が全く同じだからです。(ファイルのサイズに関する情報もInodeの中に入っています)

 ところが、シンボリックリンクの場合は、同じInodeを使っている訳では無いので、ファイルのサイズが「12」バイトしかありません。

 これはなんでか…?

 ここで、「copy.txt」のシンボリックリンクを作成してみましょう。ここで気がつく人が出たらあなたは鋭い。(笑)
-rw-rw-r-- 1 piro791 piro791  121 11月 14 17:08 2012 copy.txt
-rw-rw-r-- 2 piro791 piro791  129 11月 14 18:08 2012 link.txt
-rw-rw-r-- 2 piro791 piro791  129 11月 14 18:08 2012 original.txt
lrwxrwxrwx 1 piro791 piro791   12 11月 14 18:05 2012 symlink.txt -> original.txt
lrwxrwxrwx 1 piro791 piro791    8 11月 15 10:04 2012 symlink_copy.txt -> copy.txt

 …と、こういう結果になりました。

 ln -s original.txt symlink.txt  で12バイト。
 ln -s copy.txt symlink_copy.txt  で8バイトです。

 さあ!この「差」は一体!?







































 答えは、「オリジナルのファイルの『名前』の長さの差」なんですね!!
 文字数を数えてみましょう。「original.txt」は12文字、「copy.txt」は8文字です。(ピリオドもちゃんと数える!)
 そうなのです。シンボリックリンクの中身の実体は、「リンク元のファイルの名前」が入っているのです。そして、そのファイルに「リンクです」という属性を付けて(一番左端の「l」)リンクに見立てている…と、こういう寸法なのです。

 「ハードリンク」と「シンボリックリンク(ソフトリンク)」と、同じような事をするのにどうして2種類存在しているのでしょうか?
 ここには…

 きわめて重大な問題・違い・原因がある

 ということだけ、今は覚えておけば十分じゃないかなーと。この内容については追々解説していきたいと思います。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。