ファイルはハード ドライブに保存されます。
ハードディスク上の最小の記憶単位はセクターと呼ばれます。
各セクターは 512 バイト (0.5kb に相当) を保存します。
オペレーティング システムがハードディスクを読み取るとき、セクターごとに読み取るわけではないため、非効率的です。
代わりに、複数のセクターを連続して、つまり一度に 1 ブロックずつ読み取ります。
この「ブロック」は複数のセクターで構成され、ファイルアクセスの最小単位です。
ブロック サイズ。最も一般的なのは 4kb で、これはブロックを形成する 8 つのセクターの行です。
ファイル データは「ブロック」に保存されるため、当然のことながら、ファイルの作成者、ファイルの作成日、ファイルの作成日、ファイルのメタ情報などを保存する場所も見つける必要があります。ファイルのサイズなどファイルのメタ情報を格納するこの領域はinodeと呼ばれ、中国語訳は「インデックスノード」です。
inode の内容
inode には、ファイルのメタ情報、具体的には次の内容が含まれます:
* ファイル内のバイト数
* ファイル所有者のユーザー ID
* ファイルのグループ ID
* ファイルの読み取り、書き込み、および実行の権限
* ファイルには 3 つのタイムスタンプがあります。ctime は i ノードが最後に変更された時刻を指し、mtime はファイルの内容が最後に変更された時刻を指し、atime はファイルが最後に開かれた時刻を指します。
* リンクの数、つまり、この i ノードを指すファイル名の数
* ファイル データ ブロックの場所
stat コマンドを使用して、特定のファイルの i ノード情報を表示できます。
リーリーつまり、ファイル名を除くすべてのファイル情報は i ノードに保存されます。ファイル名がない理由については、以下で詳しく説明します。
inode サイズ
Inode はハードディスクの容量も消費するため、ハードディスクがフォーマットされると、オペレーティング システムは自動的にハードディスクを 2 つの領域に分割します。 1 つはファイルデータを格納するデータ領域であり、もう 1 つは inode に含まれる情報を格納する inode 領域 (inode テーブル) です。
各 inode ノードのサイズは通常 128 バイトまたは 256 バイトです。 inode ノードの合計数はフォーマット中に指定され、通常は 1KB ごとまたは 2KB ごとに 1 つの i ノードが設定されます。 1GBのハードディスクにおいて、各inodeノードのサイズが128バイトで、1KBに1つのinodeが設定されているとすると、inodeテーブルのサイズは128MBとなり、ハードディスク全体の12.8%を占めます。
各ハードディスク パーティション内の i ノードの合計数と使用されている数を表示するには、df コマンドを使用できます。
リーリー各 i ノード ノードのサイズを表示するには、次のコマンドを使用できます:
リーリー各ファイルには i ノードが必要なため、i ノードが使い果たされていても、ハードディスクがまだいっぱいになっていない場合があります。現時点では、ハード ドライブ上に新しいファイルを作成することはできません。
inode 番号
各 i ノードには番号があり、オペレーティング システムはその i ノード番号を使用してさまざまなファイルを識別します。
ここで繰り返しておきますが、Unix/Linux システムは内部的にファイル名を使用せず、ファイルを識別するために i ノード番号を使用します。システムにとって、ファイル名は識別を容易にするための inode 番号のエイリアスまたはニックネームにすぎません。表面的には、ユーザーはファイル名でファイルを開きます。実際、システム内のこのプロセスは 3 つのステップに分かれています: まず、システムはファイル名に対応する i ノード番号を見つけます。次に、inode 番号を通じて i ノード情報を取得します。最後に、inode 情報に基づいて、ファイルデータが配置されているブロックにアクセスし、データを読み取ります。
ls -i コマンドを使用して、ファイル名に対応する i ノード番号を確認します:
リーリーディレクトリ ファイル
Unix/Linux システムでは、ディレクトリもファイルの一種です。ディレクトリを開くということは、実際にはディレクトリ ファイルを開くことを意味します。
ディレクトリ ファイルの構造は非常に単純で、一連のディレクトリ エントリ (dirent) のリストです。各ディレクトリ エントリは、含まれるファイルのファイル名と、ファイル名に対応する i ノード番号の 2 つの部分で構成されます。
ls コマンドは、ディレクトリ ファイル内のすべてのファイル名のみをリストします:
リーリーls -i コマンドは、ディレクトリ ファイル全体、つまりファイル名と i ノード番号をリストします。 リーリー
ファイルの詳細情報を表示したい場合は、inode ノードにアクセスし、inode 番号に従って情報を読み取る必要があります。 ls -l コマンドは、ファイルに関する詳細情報を一覧表示します。リーリー
ハードリンク
一般に、ファイル名とinode番号は「1対1」の関係にあり、各inode番号がファイル名に対応します。ただし、Unix/Linux システムでは、複数のファイル名が同じ i ノード番号を指すことができます。これは、同じコンテンツに異なるファイル名でアクセスできることを意味します。ファイル コンテンツを変更すると、すべてのファイル名に影響しますが、1 つのファイル名を削除しても、別のファイル名へのアクセスには影響しません。この状況は「ハードリンク」と呼ばれます。ln コマンドはハード リンクを作成できます:
ln 源文件 目标文件
运 行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文 件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系 统就会回收这个inode号码,以及其所对应block区域。
这里顺便说一下目录文件的”链接数”。创建目录时, 默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当 前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录),这里的 2是父目录对其的“硬链接”和当前目录下的”.硬链接“。
软链接
除了硬链接以外,还有 一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打 开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。
这 意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此 发生变化。
ln -s命令可以创建软链接。
ln -s 源文文件或目录 目标文件或目录
inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
\1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
\2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
\3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时 候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode则被回收。
实际问题
在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
查找原因:
/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
解决方案:
1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
ln -s /opt/newcache /data/cache
以上がLinux での i ノード レコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。