2011年12月30日金曜日

[Linux]ハードリンク・シンボリックリンクの基礎 と リンクを含んだコピー操作検証

バックアップ・ディスク拡張などを考えるうちに、初心者のため手軽にcp/gzipコマンドなどを利用して異なるディスク間でファイルを入れ替えできないかと安易に試してみたが、


gzip: /usr/share/icons/gnome/16x16/devices/mouse.png: Too many levels of symbolic links
gzip: /usr/share/kdump/firstboot_kdump.pyo has 1 other link  -- unchanged
cp: cannot create symbolic link `/home/root77/mybox/usr/b/indx-sl.ejs': Protocol error


まぁ当然のごとくリンクがうまく働かない。
しかし、リンクが働かないとは具体的にどういうことなのか、リンクの基本をまとめつつ、整理したいと思います。(間違っている箇所があれば、謹み深いご指摘を賜りたい!)

[基礎の確認]

まずそもそもLinuxのファイル管理について、



Linuxではファイルをディスクに保存すると、重複しないiノード番号が割り当てられる。 全てのファイルには、対応するiノードが存在し、iノードにはディスク上のファイルに 関する情報が格納されている。
Linuxのファイルシステムでは、ファイルの実体がiノード内に記録された iノード番号によって管理されている。

{抜粋} http://www.geocities.jp/lpic949/hardlinksymboliclink/ より



とある、そしてもとのファイル名をtodayとすると
ハードリンクとは、todayと同じinode番号をもつもの
シンボリックリンクとは、「today ファイルへの参照」を参照するinode番号(新規発行される番号)をもつもの
となる。
下記のサイトの図がわかりやすい。



http://okinawaturi.sakura.ne.jp/wp/saba/hlink/



じゃあ、リンクを含んだフォルダをコピーするとどうなるか検証してみる(異なるパーティションやファイルファイルシステムへも)

実機で下記検証する。

・リンクを含んフォルダを同一のパーティションにコピー
・リンクを含んフォルダを異なるパーティションで同一ファイルシステムにコピー

・リンクを含んフォルダを異なるパーティションで異なるファイルシステムにコピー



[環境]

※ ゲストのCentOS にて検証

Oracle VM VirtualBox ver 4.0.10
ホストOS Windows Vista
ゲストOS CentOS6  2.6.32-71.el6.i686 


[準備]

1. ホームディレクトリ内に  a と b  というディレクトリを作成し、a の中へ index.ejs というファイルを作成。

2. bディレクトリ内で下記2行のコマンドを実行し、hardlink symboliclink をそれぞれ作成 
(bディレクトからaのindex.ejsへリンクを張る構成を作る)

ln ../a/index.ejs indx-hl.ejs
ln -s ../a/index.ejs  indx-sl.ejs

3.ホームディレクトリで下記3コマンドを実行し、コピーを作成する

cp -ar b b2        ①(同一のパーティションにコピー)
cp -ar b ~/1dev/b     ②(異なるパーティションで同一ファイルシステムにコピー)
cp -ar b ~/mybox/usr/b  ③(異なるパーティションで異なるファイルシステムにコピー)

※ ちなみに、③のコピーで下記のエラーがでる
[root77@localhost ~]$ cp -ar b ~/mybox/usr/b
cp: cannot create symbolic link `/home/root77/mybox/usr/b/indx-sl.ejs': Protocol error


4、inode番号の確認


[root77@localhost ~]$ ls -i a 
388610 index.ejs

[root77@localhost ~]$ ls -i b
388610 indx-hl.ejs  388612 indx-sl.ejs

[root77@localhost ~]$ ls -i b2
388615 indx-hl.ejs  388614 indx-sl.ejs

[root77@localhost ~]$ ls -i 1dev/b
131075 indx-hl.ejs  131074 indx-sl.ejs

[root77@localhost ~]$ ls -i ~/mybox/usr/b
23656 indx-hl.ejs
※ ③のコピーでシンボリックリンク自体の作成に失敗しているため、ファイルは一つ


5.ファイルを開けるか確認する。


b  : 両方開ける

b2  : 両方開ける

1dev/b  : ハードリンクのみ開ける (ls ではシンボリックを確認できるが cat で No such file or directory エラーとなる)

[root77@localhost ~]$ cat 1dev/b/indx-sl.ejs
cat: 1dev/b/indx-sl.ejs: No such file or directory

/mybox/usr/b : ハードリンクのみ開ける (シンボリック自体はつくられていない) 


・・・
むむむ、てきとうにやったので参考程度にしていただきたい

linuxを一歩踏み込んで学習する場合は下記の2つ書籍が非常に有用であった



0 件のコメント:

コメントを投稿