GNU/Linux >> Linux の 問題 >  >> Linux

例を使用して UNIX / Linux の i ノードの基本を理解する

いくつかの国では、その国に住む人々に固有の識別番号(たとえば、米国の社会保障番号)を提供しています。これにより、個人を一意に識別しやすくなります。これにより、さまざまな政府機関や金融機関が個人に必要とするすべての事務処理が容易になります。

社会保障番号と同様に、Linux または *nix システム上のすべてのファイルに対して一意に存在する I ノード番号の概念があります。

i ノードの基本

Inode 番号は Inode を指します。 Inode は、ファイルに関する次の情報を格納するデータ構造です:

  • ファイルのサイズ
  • デバイス ID
  • ファイルのユーザー ID
  • ファイルのグループ ID
  • 所有者、グループ、その他のファイル モード情報とアクセス権限
  • ファイル保護フラグ
  • ファイルの作成、変更などのタイムスタンプ
  • ハード リンクの数を決定するためのリンク カウンタ
  • ファイルの内容を格納するブロックへのポインタ

上記のリストはすべてを網羅しているわけではないことに注意してください。また、ファイルの名前は inode には保存されません (後で説明します)。

ファイルがディレクトリ内に作成されると、ファイル名と i ノード番号がファイルに割り当てられます。これら 2 つのエントリは、ディレクトリ内のすべてのファイルに関連付けられています。ユーザーは、ディレクトリに完全なファイルとそれに関連するすべての追加情報が含まれていると考えるかもしれませんが、常にそうであるとは限りません。したがって、ディレクトリがファイル名をその i ノード番号に関連付けていることがわかります。

ユーザーがファイルまたはファイルに関連する情報にアクセスしようとすると、ファイル名を使用してアクセスしようとしますが、内部的にはファイル名が最初にテーブルに格納されている i ノード番号にマップされます。次に、その Inode 番号を介して、対応する Inode にアクセスします。それぞれの I ノードとの I ノード番号のこのマッピングが提供されるテーブル (I ノード テーブル) があります。

I ノード情報にファイル名がないのはなぜですか?

前に指摘したように、I ノードにはファイル名のエントリはなく、ファイル名は I ノード番号と並行する別のエントリとして保持されます。ファイル名を同じファイルに関連する他の情報から分離する理由は、ファイルへのハードリンクを維持するためです。これは、他のすべての情報がファイル名から分離されると、同じ I ノードを指すさまざまなファイル名を持つことができることを意味します。

例:

$ touch a

$ ln a a1

$ ls -al
drwxr-xr-x 48 himanshu himanshu 4096 2012-01-14 16:30 .
drwxr-xr-x 3 root root 4096 2011-03-12 06:24 ..
-rw-r--r-- 2 himanshu family 0 2012-01-14 16:29 a
-rw-r--r-- 2 himanshu family 0 2012-01-14 16:29 a1

上記の出力では、ファイル「a」を作成し、ハード リンク a1 を作成しました。コマンド「ls -al」を実行すると、「a」と「a1」の両方の詳細が表示されます。両方のファイルが区別できないことがわかります。出力の 2 番目のエントリを見てください。このエントリは、ファイルへのハード リンクの数を指定します。この場合、両方のファイルのエントリの値は「2」です。

ハード リンクは異なるファイル システムでは作成できず、ディレクトリに対しても作成できないことに注意してください。

i ノードはいつ作成されますか?

私たちが今知っているように、Inode はファイルの情報を含むデータ構造です。データ構造はストレージを占有するため、i ノードがシステム内でいつ作成されるのかという明らかな疑問が生じます。さて、オペレーティング システムまたは新しいファイル システムがインストールされ、最初の構造化が行われるときに、i ノード用のスペースが割り当てられます。このようにして、ファイル システムで最大数の I ノード、つまり最大数のファイルが設定されていることがわかります。

さて、上記の概念は別の興味深い事実をもたらします。ファイル システムは、次の 2 つの方法でスペースが不足する可能性があります。

  • 新しいデータを追加するスペースがありません
  • すべての Inode が消費されています。

最初の方法は非常に明白ですが、2 番目の方法を検討する必要があります。はい、空きストレージ容量があるにもかかわらず、すべての i ノードが消費されているため、ファイル システムに新しいデータを追加できない場合が発生する可能性があります。これは、ファイル システムに非常に多数の非常に小さなサイズのファイルが含まれている場合に発生する可能性があります。これにより、すべての I ノードが消費され、ハードディスク ドライブの観点からは空き領域がありますが、ファイル システムの観点からは、新しいファイルを保存するための I ノードがありません。

上記の使用例は可能ですが、一般的なシステムでは平均ファイル サイズが 2KB を超え、最初にハード ディスク領域が不足する傾向があるため、遭遇することはあまりありません。しかし、それにもかかわらず、ファイルシステムに多数の I ノードを作成するために使用されるアルゴリズムが存在します。このアルゴリズムでは、ファイル システムのサイズと平均ファイル サイズが考慮されます。ユーザーは、ファイル システムの作成中に i ノードの数を微調整できます。

I ノード番号にアクセスするコマンド

以下は、ファイルの Inode 番号にアクセスするためのコマンドの一部です:

1) ls -i コマンド

Unix LS Command:15 Practical Examples の記事で以前に説明したように、フラグ -i は各ファイルの Inode 番号を出力するために使用されます。

$ ls -i
1448240 a 1441807 Desktop 1447344 mydata 1441813 Pictures 1442737 testfile 1448145 worm
1448240 a1 1441811 Documents 1442707 my_ls 1442445 practice 1442739 test.py
1447139 alpha 1441808 Downloads 1447278 my_ls_alpha.c 1441810 Public 1447099 Unsaved Document 1
1447478 article_function_pointer.txt 1575132 google 1447274 my_ls.c 1441809 Templates 1441814 Videos
1442390 chmodOctal.txt 1441812 Music 1442363 output.log 1448800 testdisk.log 1575133 vlc

「a」と「a1」の Inode 番号が、ハード リンクとして作成した「a1」と同じであることを確認してください。

2) Df -i コマンド

df -i コマンドは、ファイル システムの inode 情報を表示します。

$ df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            1875968  293264 1582704   16% /
none                  210613     764  209849    1% /dev
none                  213415       9  213406    1% /dev/shm
none                  213415      63  213352    1% /var/run
none                  213415       1  213414    1% /var/lock
/dev/sda2            7643136  156663 7486473    3% /home

フラグ -i は、I ノード情報を表示するために使用されます。

3) 統計コマンド

Stat コマンドは、ファイルの inode 番号も表示するファイル統計を表示するために使用されます

$ stat a
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 805h/2053d Inode: 1448240 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/himanshu) Gid: ( 1001/ family)
Access: 2012-01-14 16:30:04.871719357 +0530
Modify: 2012-01-14 16:29:50.918267873 +0530
Change: 2012-01-14 16:30:03.858251514 +0530

i ノード番号の使用シナリオの例

<オール>
  • ある特殊文字を含むファイル名が存在するとします。例:「ab*
  • rm コマンドを使用して通常どおりに削除してみてください。削除することはできません。
  • ただし、このファイルの inode 番号を使用して削除することはできます。
  • この例でこれらの手順を見てみましょう:

    1) ファイルが存在するかどうかを確認します:

    $ ls -i
    1448240 a 1447274 my_ls.c
    1448240 a1 1442363 output.log
    1448239 "ab* 1441813 Pictures
    1447139 alpha

    したがって、このディレクトリに「ab*」という名前のファイルがあります

    2) 通常どおり削除してみてください:

    $ rm "ab*
    > ^C
    $ rm "ab*
    > ^C
    $

    ファイルを削除しようと何度か試みましたが、できませんでした。

    3) i ノード番号を使用してファイルを削除します。

    前述の find コマンドの例の記事で説明したように、inode 番号を使用してファイルを検索し、削除することができます。

    $ find . -inum 1448239 -exec rm -i {} \;
    rm: remove regular empty file `./"ab*'? y
    $ ls -i
    1448240 a 1447274 my_ls.c
    1448240 a1 1442363 output.log
    1447139 alpha 1441813 Pictures

    そのため、削除する必要があるファイルの inode 番号を指定する find コマンドを使用しました。ファイルが削除されました。上記の複雑な find コマンドの例を使用する代わりに、コマンド rm \”ab* を使用してファイルを削除することもできましたが、それでもユーザーに Inode 番号を使用する方法の 1 つを示すために使用しました。


    Linux
    1. Linuxでの並べ替えコマンドと例

    2. 例を含む10以上のLinuxVIコマンド

    3. Linuxでのchattrコマンドと例

    1. 例を含む10のクイックLinuxテールコマンド

    2. Linux /UNIXAwkコマンドチュートリアルと例

    3. UNIX/Linux での tail コマンドの例

    1. 17Linuxでの実用的な例を含む便利なtarコマンド

    2. LinuxのZipおよびUnzipコマンドと例

    3. Linuxでの差分コマンドと例