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/ より
{抜粋} 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
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 ~/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
[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 : ハードリンクのみ開ける (シンボリック自体はつくられていない)
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つ書籍が非常に有用であった
linuxを一歩踏み込んで学習する場合は下記の2つ書籍が非常に有用であった