i ノードに関する何か

中央流通センターに異動するために、私は定期的に、主にサンクトペテルブルクとモスクワにあるさまざまな大企業で DevOps 職の面接を受けています。 多くの企業 (Yandex などの多くの優良企業) が XNUMX つの同様の質問をしていることに気付きました。

  • i ノードとは何ですか。
  • ディスク書き込みエラーが発生する理由は何ですか (または、たとえば、ディスク容量が不足する可能性があります。本質は同じです)。

よくあることですが、私はこのトピックについてよく知っていると思っていましたが、説明を始めるとすぐに知識のギャップが明らかになりました。 自分の知識を体系化し、ギャップを埋め、もう恥ずかしくないように、この記事を書いています。もしかしたら他の人の役に立つかもしれません。

つまり、下から始めます。 ハードドライブから(フラッシュドライブ、SSD、その他の最新のものは破棄します。たとえば、ブロックサイズが20バイトであるため、80ギガまたは512ギガの古いドライブを考えてみましょう)。

ハードドライブはそのスペースをバイトごとにアドレス指定する方法を認識せず、条件付きでブロックに分割されます。 ブロックの番号付けは 0 から始まります。(これは LBA と呼ばれます。詳細は次のとおりです。 ru.wikipedia.org/wiki/LBA)

i ノードに関する何か

図からわかるように、LBA ブロックを HDD レベルとして指定しました。 ちなみに、ディスクのブロックサイズは次のようにして確認できます。

root@ubuntu:/home/serp# blockdev --getpbsz /dev/sdb
512

上のレベルはパーティションであり、ディスク全体に対応します (これも簡単にするため)。 ほとんどの場合、msdos と gpt の 2 種類のパーティション マークアップが使用されます。 したがって、msdos は最大 1Tb のディスクをサポートする古い形式であり、gpt は 512 バイト ブロックの最大 1 ゼタバイトをアドレス指定できる新しい形式です。 この例では、msdos タイプのパーティションがあり、図からわかるように、パーティションはブロック番号 XNUMX から始まり、MBR にはゼロが使用されます。

ext2 ファイル システムを作成した最初のパーティションでは、そのデフォルトのブロック サイズは 4096 バイトであり、これは図にも反映されています。 ファイル システムのブロック サイズは次のように表示できます。

root@ubuntu:/home/serp# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          a600bf40-f660-41f6-a3e6-96c303995479
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536
Block count:              261888
Reserved block count:     13094
Free blocks:              257445
Free inodes:              65525
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      63
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Fri Aug  2 15:02:13 2019
Last mount time:          n/a
Last write time:          Fri Aug  2 15:02:14 2019
Mount count:              0
Maximum mount count:      -1
Last checked:             Fri Aug  2 15:02:13 2019
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      c0155456-ad7d-421f-afd1-c898746ccd76

必要なパラメータは「ブロックサイズ」です。

ここで興味深いのは、/home/serp/testfile ファイルをどのように読み取るかということです。 ファイルは、データが保存される XNUMX つ以上のファイル システム ブロックで構成されます。 ファイル名はわかっているのですが、どうやって見つけますか? どのブロックを読めばよいでしょうか?

ここで i ノードが役に立ちます。 ext2fs ファイル システムには、すべての i ノードの情報を含む「テーブル」があります。 ext2fsの場合のinode数はファイルシステム作成時に設定します。 tune2fs 出力の「Inode count」パラメーターで必要な数値を調べます。 65536個あります。 i ノードには、必要な情報 (探しているファイルのファイル システム ブロックのリスト) が含まれています。 特定のファイルの i ノード番号を見つけるにはどうすればよいですか?

対応する名前と i ノード番号がディレクトリに含まれており、ext2fs 内のディレクトリは特殊なタイプのファイルです。 独自の i ノード番号もあります。 この悪循環を断ち切るために、「固定」の i ノード番号「2」がルート ディレクトリに割り当てられました。 i ノード 2 の内容を見てみましょう。

root@ubuntu:/# debugfs /dev/sdb1
debugfs 1.42.9 (4-Feb-2014)
debugfs:  stat <2>

Inode: 2   Type: directory    Mode:  0755   Flags: 0x0
Generation: 0    Version: 0x00000000:00000002
User:     0   Group:     0   Size: 4096
File ACL: 0    Directory ACL: 0
Links: 3   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
 atime: 0x5d43c247:b704301c -- Fri Aug  2 15:55:35 2019
 mtime: 0x5d43cb51:16b61bcc -- Fri Aug  2 16:34:09 2019
crtime: 0x5d43b5c6:00000000 -- Fri Aug  2 15:02:14 2019
Size of extra inode fields: 28
BLOCKS:
(0):579
TOTAL: 1

ご覧のとおり、必要なディレクトリはブロック番号 579 に含まれています。その中でホーム フォルダーのノード番号を見つけ、serp ディレクトリで要求されたファイルのノード番号が見つかるまでチェーンを下っていきます。 突然、番号が正しいかどうか、必要な情報がそこにあるかどうかを確認したい場合、それは難しくありません。 私たちは次のことを行います:

root@ubuntu:/# dd if=/dev/sdb1 of=/home/serp/dd_image bs=4096 count=1 skip=579
1+0 records in
1+0 records out
4096 bytes (4,1 kB) copied, 0,000184088 s, 22,3 MB/s
root@ubuntu:/# hexdump -c /home/serp/dd_image

出力では、ディレクトリ内のファイルの名前を読み取ることができます。

そこで私は、「録音エラーはどのような理由で発生するのでしょうか?」という最大の疑問にたどり着きます。

当然、これはファイル システムに空きブロックが残っていない場合に発生します。 この場合何ができるでしょうか? 明らかな「不要なものを削除する」以外に、ext2,3、4、および 13094 ファイル システムには「予約ブロック数」のようなものがあることを覚えておく必要があります。 上のリストを見ると、そのようなブロックが「XNUMX」あります。 これらは、root ユーザーのみが書き込み可能なブロックです。 ただし、問題をすぐに解決する必要がある場合は、一時的な解決策として、全員がそれらを利用できるようにして、空き領域を確保することができます。

root@ubuntu:/mnt# tune2fs -m 0 /dev/sdb1
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)

それらの。 デフォルトでは、書き込みに利用できないディスク領域が 5% あり、最新のディスクの容量を考慮すると、これは数百 GB になる可能性があります。

他に何があるでしょうか? 空きブロックはあるものの、ノードがもうないという可能性もあります。 これは通常、ファイル システム上にファイル システムのブロック サイズより小さいファイルが多数ある場合に発生します。 1 つの i ノードが 1 つのファイルまたはディレクトリに費やされ、合計で (特定のファイル システムに対して) 65536 になることを考慮すると、この状況は現実的以上です。 これは、df コマンドの出力から明らかです。

serp@ubuntu:~$ df -hi
Filesystem     Inodes IUsed IFree IUse% Mounted on
udev             493K   480  492K    1% /dev
tmpfs            493K   425  493K    1% /run
/dev/xvda1       512K  240K  273K   47% /
none             493K     2  493K    1% /sys/fs/cgroup
none             493K     2  493K    1% /run/lock
none             493K     1  493K    1% /run/shm
none             493K     2  493K    1% /run/user
/dev/xvdc1       320K  4,1K  316K    2% /var
/dev/xvdb1        64K   195   64K    1% /home
/dev/xvdh1       4,0M  3,1M  940K   78% /var/www
serp@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2,0G  4,0K  2,0G   1% /dev
tmpfs           395M  620K  394M   1% /run
/dev/xvda1      7,8G  2,9G  4,6G  39% /
none            4,0K     0  4,0K   0% /sys/fs/cgroup
none            5,0M     0  5,0M   0% /run/lock
none            2,0G     0  2,0G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/xvdc1      4,8G  2,6G  2,0G  57% /var
/dev/xvdb1      990M  4,0M  919M   1% /home
/dev/xvdh1       63G   35G   25G  59% /var/www

/var/www パーティションではっきりとわかるように、ファイル システム内の空きブロックの数と空きノードの数は大きく異なります。

i ノードが不足した場合に備えて、呪文は説明しません。なぜなら... 何もありません(間違っていたらお知らせください)。 したがって、小さなファイルが複数存在するパーティションの場合は、ファイル システムを賢明に選択する必要があります。 たとえば、btrfs i ノードは終了できません。 必要に応じて、新しいものが動的に作成されます。

出所: habr.com

コメントを追加します