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つ書籍が非常に有用であった



2011年12月23日金曜日

[VirtualBox] Guest Additions インストール

VirtualBoxにGuest Additionsをインストールする。

インストールすることで、

・VirtualBoxのゲストOSとホストOSで共有フォルダを作成する
・VirtualBox内のウィンドウを大画面で表示する
・マウスコントロールをいちいちゲストOSとホストOSで切り替えないようにする

上記のことが可能になるため。



【環境】


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



【手順】

1.まず、VBoxに付属しているVBoxGuestAdditions.isoをゲストOSへマウントする。
デフォルトの場所は、おそらくこちら
C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso
デバイスよりCDディスクデバイスの選択でマウントする



2. ・GUIで実行
デスクトップに出てきていると思うので、オートランの問い合わせで開くを選択すれば実行。


・CUIで実行

/media にマウントされているので

su でスーパーユーザとなり、VBoxLinuxAdditions.run を実行すればOK。


<問題点1>
シンプルに書いたが、私はここでハマッてしまった。パッケージ不足が原因らしい

・gcc
・kernel-devel

<対策>

・yum install gcc
・yum install kernel-devel

で最新のバージョンへ。


(問題のログ 一部省略)

# ./VBoxLinuxAdditions.run
Verifying archive integrity… All good.
Removing installed version 4.0.2 of VirtualBox Guest Additions…
Removing existing VirtualBox DKMS kernel modules [ OK ]
Removing existing VirtualBox non-DKMS kernel modules [ OK ]
Building the VirtualBox Guest Additions kernel modules
The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.
The missing package can be probably installed with
yum install kernel-devel-2.6.32-71.el6.i686
[失敗]
Your system does not seem to be set up to build kernel modules.
Look at /var/log/vboxadd-install.log to find out what went wrong.
Once you have corrected it, you can run




<問題2>

またもや失敗。カーネルのバージョンが新しくなりすぎたみたいだ

<対策>

カーネルをダウングレードする。

まず、rpm系のサイトから、警告で出ているカーネルのバージョン(kernel-devel-2.6.32-71.el6.i686)を wget  コマンドでダウンロード。

そして、ダウングレード用のrpm オプションをつけて


rpm -Uhv --oldpackage  kernel-devel-2.6.32-71.el6.i686 .rpm


できました!!



【参考サイト】
Guest Additionsインストール
カーネルダウングレード1
カーネルダウングレード2