• Top
  • What's New
  • Command
  • Basic
  • Server
  • Security
  • Conf
  • tools
  • etc
  • blog
  • link
  • サイトについて
  • メール
INDEX /  シェル(bash) /  FHS /  パーミッション /  ランレベル /  RPM /  vi /  シンボリックリンク / 
最終更新日 2005/06/22  

ハードリンク・シンボリックリンク

iノードとは
iノード情報
リンクとは
ハードリンク
シンボックリンク
iノードとは
GNU/Linuxシステム(正確にはファイルシステム)では、すべてのファイルの実体を「iノード」と呼ばれるもので管理をしています。
iノードは"インデックスノード"の略で、すべてのiノードには重複しない番号が設定されています。
このiノードには、ファイルの属性を示す様々な情報(ファイルサイズ・所有者・アクセス権等)が保存されています。
また、ファイルシステム全体のiノードの数は、ファイルシステム作成時に自動的に設定され、後から追加や削除することはできません。
ファイルを一つ作成すると、一個のiノードが消費(使用)されます。ファイルのサイズは関係ありません。
1Kの小さなファイルでも500Mの大きなファイルでも関係なく、1個のiノードが消費されます。
小さいファイルを数多く作成すると、その分iノードも消費されますので、ハードディスクの空き容量があったとしてもiノードが不足して 新たにファイルを作成することができなくなることになります。これはiノードの"枯渇問題"と呼ばれます。

iノードに格納されている情報(一部)
  1. ファイルの種類
  2. ファイルサイズ
  3. 所有者
  4. パーミッション
  5. リンク
  6. ファイルの物理的な位置
ページトップへTop
iノード情報
iノードの絶対的な数や消費iノード数を調べる場合は、「df」コマンドに「-i」オプションをつけて実行します。
現在のハードディスクは大容量化でファイルシステム作成時に設定されるiノードも大きな数字になります。
iノードの数が足りない状況にはほとんどなりませんが、小さなファイルを大量に作成した場合などは、足りなくなる可能性の ありますので、チェックしておく必要があります。

$ df -i
Filesystem            Iノード  I使用   I残り I使用% マウント位置
/dev/hda3             384000   77317  306683   21% /
none                   23912       1   23911    1% /dev/shm

ファイルやディレクトリのiノード番号を表示するには、「ls」コマンドに「-i」オプションをつけて実行します。

/etc以下のファイルのiノード番号表示
$ ls -i
 99727 DIR_COLORS            100093 mailcap
 99728 DIR_COLORS.xterm      113083 makedev.d
210911 FreeWnn               100313 man.config
100876 Muttrc                131510 mgetty+sendfax
 96004 X11                   100094 mime.types
164413 acpi                  100330 minicom.users
 99866 adjtime               101432 modprobe.conf
 96014 aliases                99690 modprobe.conf.dist
100659 aliases.db             96009 modprobe.conf~
177930 alsa                   96026 motd
 96325 alternatives          101538 mtab
100209 anacrontab            100341 mtools.conf
100281 at.deny               101470 named.conf
100522 auto.master           101445 named.conf.rpmorig
100523 auto.misc              98413 netplug
100524 auto.net               98427 netplug.d

         〜中略〜

 96047 ld.so.conf.d           99712 vimrc
100541 ldap.conf             132074 vsftpd
100359 lftp.conf             132076 vsftpd.chroot_list
 99998 libuser.conf          101454 vsftpd.ftpusers
101439 lilo.conf.anaconda    101452 vsftpd.user_list
 96048 localtime             100639 warnquota.conf
163696 log.d                 100405 wgetrc
 99675 login.defs            100768 wvdial.conf
100229 logrotate.conf        100102 xdg
114815 logrotate.d           100771 xinetd.conf
100845 lsb-release            96041 xinetd.d
101258 ltrace.conf           100847 yp.conf
128551 lvm                   100856 yum.conf
176338 mail                   96770 yum.repos.d
100207 mail.rc

ページトップへTop
リンクとは
リンクとは、同じファイルに別名をつけて、異なった名前でアクセスすることができる仕組みです。
ほとんどのオペレーティングシステムには、備わっている機能の一つになります。
GNU/Linuxシステムでの、リンクは「ハードリンク」と「シンボリックリンク」の2つがあります。 同じリンクでもそれぞれ、動作や仕組みが異なります。
仕組みについては、上記に示したiノードの知識が前提となります。
ページトップへTop
ハードリンク
ハードリンクは、一つのファイルの実体に複数の名前をつけることを言います。
ファイルの実体は一つ、つまりiノードは一つです。その一つのiノードに対して複数の名前でアクセスすることが可能です。
ハードリンクのリンク元ファイルとリンク先ファイルは区別がつきません。どちらも同じiノードを指し示しているのでまったく同じです。
ファイルのコピーとは異なり、一つのファイルを変更するば、もちろんもう一つも変更が反映されます。(同じiノードなのであたり前です。)
また、iノードがファイルシステム単位で管理されているため、ハードリンクはファイルシステムを超えて作成することはできません
ハードリンクは、ファイルに対して作成できますが、ディレクトリに対して作成することはできません。
だだし、ユーザが作成できないだけであって、GNU/Linuxシステムでは利用されています。
ちなみにカレントディレクトリを表す「.(ドット)」や親ディレクトリを表す「..(ドット・ドット)」が、ディレクトリのハードリンクになります。


ハードリンク(確認)

ハードリンクを確認するためには、「ls -l」コマンドでファイルの詳細を表示します。
パーミッション(「rw-r--r--」等)の右側の数字がリンク数を表しています。
ハードリンクを設定していない状態でも一個のiノードを指しているためリンク数は「1」と表示されます。
iノード番号は、「ls -i」で表示することができます。

 1: $ ls -l
 2: -rw-rw-r--  1 user user 0  6月 21 11:13 sample
 3: $ls -i
 4: 305055 sample

  1. リンク情報(ファイルの詳細)を表示
  2. sampleファイルの、ハードリンクは1つである
  3. iノード番号の表示
  4. sampleファイルのiノード番号は"305055"である

ハードリンク(作成)

ハードリンクを作成するためには、「ln」コマンドを使用します。書式は、「ln リンク元 リンク先」となります。
また、ハードリンクの数は、「ls -l」コマンドで確認できます。
 2: $ ln sample hardsample
 3: $ ls -i
 4: 305055 hardsample  305055 sample
 5: $ ls -l
 6: -rw-rw-r--  2 mukuan mukuan 0  6月 21 11:13 hardsample
 7: -rw-rw-r--  2 mukuan mukuan 0  6月 21 11:13 sample
 8: $ ls -i
 9: 305055 hardsample  305055 sample

  1. ハードリンクを作成
  2. iノードの確認)
  3. iノード番号は"305055"である(同じiノードである)
  4. リンク数を確認
  5. リンク数が2個に増加
  6. リンク数が2個に増加
  7. iノード番号の確認
  8. 同じiノード番号である
ページトップへTop
シンボリックリンク
シンポリックリンクは、リンク元ファイルを示すポインタになります。
iノード番号はリンク元とリンク先では異なります。リンク元を削除するとリンク先が見つからずエラーになります。
ハードリンクと違い、ファイルシステム(パーティション)を超えて設定することができます。
また、ファイルだけではなく、ディレクトリに対しても設定することが可能です。
GNU/Linuxのシステムでは、このシンボリックリンクはよく利用されています。
例えば、デーモンの起動スクリプトは「/etc/rc.d/init.d/」に配置されていますが、各ランレベルごとのスクリプトは「/etc/rc.d/rc<ランレベル>.d/ 」に「/etc/rc.d/init.d/」内のファイルのシンポリックリンクとして作成されています。
また、Fedora Coreでは、ブートローダー「GRUB」の設定ファイル「/boot/grub/grub.conf」のシンボリックリンクとして「/etc/grub.conf」に設定されています。


シンボリックリンク(確認)

シンボリックリンクを確認するためには、「ls -l」コマンドでファイルの詳細を表示します。
パーミッション(「rw-r--r--」等)の右側にファイルを示す表示がありますが、この部分が「l」と表示されます。
そして、一番右のファイル名の表示の部分が、指し示しているファイル「->」という形で表示されます。
 1: $ ll /etc/grub.conf
 2:lrwxrwxrwx  1 root root 22  4月 25 15:17 /etc/grub.conf -> ../boot/grub/grub.con

  1. /etc/grub.confのファイルの詳細表示
  2. シンボリックリンクで指し示しているファイルは「/boot/grub/grub.conf」である

シンボリックリンク(作成)

シンボリックリンクを作成するためには、「ln」コマンドにオプション「-s」をつけて実行します。
書式は、「ln -s リンク元 リンク先」となります。
 1: $ ln -s sample symlinksample
 2: $ ls -l
 3: -rw-rw-r--  1 user user 0  6月 21 12:25 sample
 4: lrwxrwxrwx  1 user user 6  6月 21 12:25 symlinksample -> sample
 5: $ ls -i
 6: 305055 sample  305056 symlinksample

  1. シンボリックリンクを作成
  2. リンク情報(ファイルの詳細)を表示
  3. リンク元ファイルの情報
  4. リンク先ファイルの情報
  5. iノード番号の表示
  6. シンボリックリンクなので別々のiノードを持つ
ページトップへTop

 
Copyright (c) 2005 Mukuan All Rights Reserved.