最終更新日 2005/06/22
ハードリンク・シンボリックリンク
iノードとは
iノード情報
リンクとは
ハードリンク
シンボックリンクiノードとは
GNU/Linuxシステム(正確にはファイルシステム)では、すべてのファイルの実体を「iノード」と呼ばれるもので管理をしています。iノードは"インデックスノード"の略で、すべてのiノードには重複しない番号が設定されています。
このiノードには、ファイルの属性を示す様々な情報(ファイルサイズ・所有者・アクセス権等)が保存されています。
また、ファイルシステム全体のiノードの数は、ファイルシステム作成時に自動的に設定され、後から追加や削除することはできません。
ファイルを一つ作成すると、一個のiノードが消費(使用)されます。ファイルのサイズは関係ありません。
1Kの小さなファイルでも500Mの大きなファイルでも関係なく、1個のiノードが消費されます。
小さいファイルを数多く作成すると、その分iノードも消費されますので、ハードディスクの空き容量があったとしてもiノードが不足して 新たにファイルを作成することができなくなることになります。これはiノードの"枯渇問題"と呼ばれます。
iノードに格納されている情報(一部)
- ファイルの種類
- ファイルサイズ
- 所有者
- パーミッション
- リンク
- ファイルの物理的な位置
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 |
リンクとは
リンクとは、同じファイルに別名をつけて、異なった名前でアクセスすることができる仕組みです。ほとんどのオペレーティングシステムには、備わっている機能の一つになります。
GNU/Linuxシステムでの、リンクは「ハードリンク」と「シンボリックリンク」の2つがあります。 同じリンクでもそれぞれ、動作や仕組みが異なります。
仕組みについては、上記に示したiノードの知識が前提となります。
ハードリンク
ハードリンクは、一つのファイルの実体に複数の名前をつけることを言います。ファイルの実体は一つ、つまり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 |
- リンク情報(ファイルの詳細)を表示
- sampleファイルの、ハードリンクは1つである
- iノード番号の表示
- 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 |
- ハードリンクを作成
- iノードの確認)
- iノード番号は"305055"である(同じiノードである)
- リンク数を確認
- リンク数が2個に増加
- リンク数が2個に増加
- iノード番号の確認
- 同じiノード番号である
シンボリックリンク
シンポリックリンクは、リンク元ファイルを示すポインタになります。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 |
- /etc/grub.confのファイルの詳細表示
- シンボリックリンクで指し示しているファイルは「/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 |
- シンボリックリンクを作成
- リンク情報(ファイルの詳細)を表示
- リンク元ファイルの情報
- リンク先ファイルの情報
- iノード番号の表示
- シンボリックリンクなので別々のiノードを持つ
Top