1. 概要

このチュートリアルでは、Linuxシステムで大きなファイル(> 100 MB)を作成する方法について説明します。 実際のコードとコマンドに飛び込む前に、Linuxファイルがどのように見えるか、そしてストレージ構造がどのように維持されているかを理解する必要があります。

2. iノード

Linuxは、情報を Inodes として特定の構造のファイルとして保存します。これは、 indexnodeの略語です。 ファイルとiノードの間には1-1の関係があります。 さまざまなファイルサイズに対応するために、各iノードには小さいファイル用に12個のポインターがあり、大きいファイル用に3個の他のポインターがあります。 今日は、3つの大きなファイルポインタに焦点を当てます。

2.1. 間接テーブル

3つのポインターの最初の1つである13番目のポインターは、単一の間接参照テーブルを指します。単一の索引テーブルには、他のストレージ・クラスターを指すポインターのクラスターがあります。 4kbクラスターを備えた64ビットマシンでは、単一の間接テーブルで最大2MBのサイズを実現できます。 (4kbクラスターサイズ/ポインターあたり8バイト*ポインターが指す各クラスター4kb)

14番目のポインターは二重間接参照テーブルを指します。このポインターはポインターのクラスターを指し、このクラスター内の各ポインターは単一間接参照テーブルを指し、2層のポインターを提供します。 したがって、4kbクラスターを備えた64ビットマシンでは、二重間接テーブルは最大1GBを保持できます。 (4kb /8バイト*2MB)

最後のポインターはトリプル間接テーブルを指します。その名前は、iノードと実際のストレージクラスターの間に3層のポインターがあることを示しています。 64ビット4kbクラスターマシンのトリプルインダイレクションテーブルのサイズは、最大512GBを保持できます。 (4kb /8バイト*1GB)この時点までに、サイズはすでに一部のストレージの容量を超えています。

ファイルクラスタサイズを大きくすると、iノードの最大サイズも大きくなる可能性があります。 ただし、このチュートリアルでは取り上げません。

2.2. Linuxが間接テーブルを処理する方法

ノードとインダイレクションテーブルを使用してファイルを作成する場合、 Linuxでは、ユーザーはファイルの一部を「空白」のままにすることができます。 これらの空白スペースをファイル内の「穴」と呼び、さまざまな方法でこれらの穴を作成できます。

この知識が頭に浮かんだら、最終的にLinuxコマンドとPOSIXメソッドを深く掘り下げて、実際のケースに適用することができます。 Linuxは、ファイルの内容に関係なく、このような大きなファイルをすばやく作成するためのさまざまなタイプのソリューションを提供しています。

3. Linuxコマンド:truncateおよびfallocate

Linuxには、大きなファイルを作成する2つのコマンドがあります。 truncateまたはfallocateのいずれかを使用して同じ目標を達成できますが、これら2つのコマンドは異なる方法でファイルを作成します。

3.1. 切り捨てコマンド

truncateコマンドは、ファイルのリストを目的のサイズに縮小または拡張します。 ただし、ファイルのサイズを縮小すると、ファイル内の一部のコンテンツが失われるリスクがあります。 ファイルを特定のサイズに拡張しようとすると、truncateコマンドは余分なスペースをゼロで埋めます。 したがって、特定のファイルのコーディング規則に違反し、それらを読み取れなくなるリスクがあります。

-c引数を指定してtruncateコマンドを指定しない場合、指定されたファイルが存在しない場合、truncateは新しいファイルを作成します truncate コマンドの一般的な使用法には、-s引数が付属しています。 これが、この引数でそれをどのように使用するかです。 サイズ単位は大文字にする必要があります。

$ truncate -s 5K test.txt 

このコマンドは、端末出力を提供しません。 代わりに、ファイルが存在しない場合に現在のディレクトリに表示されるtest.txtという名前のファイルが見つかります。 それ以外の場合、このコマンドは専用ファイルを指定されたサイズに調整します。 これは、 ls-lhコマンドを使用して確認できます。

$ ls -lh test.txt
-rw-rw-r--    1    username    username    5.0K    Mar 25    21:01    test.txt 

ただし、ゼロで埋められたこのタイプのファイルは、引数 –apparent-sizeがないとduコマンドで検出できません。 この背後にある理由は、duがディスク使用量のみをカウントするためです。ゼロで埋められているが、明示的に割り当てられていないクラスターは、使用済みとは見なされません。 違いの比較は以下にあります:

$ du -sh test.txt
0    test.txt
=================================
$ du --apparent-size -h test.txt
5.0K     test.txt

簡単に言うと、 truncate コマンドを使用して、任意のサイズのファイルを作成できます。 ただし、そうすると、ファイルが占めるすべてのスペースがゼロになるため、ファイルが破損する可能性があり、効率的でもありません。

3.2. fallocateコマンド

Linuxは、fallocateと呼ばれるより優れたコマンドソリューションも提供します。 すべての空のスペースをゼロで埋めるのではなく、ファイルにストレージクラスターのみを割り当てるため、truncateコマンドよりも優れたオプションです。 I / O操作がないため、 fallocate[ X223X] truncateコマンドよりもはるかに高速です。

ただし、このコマンドは、ファイルを初期化するのではなく、ファイル用のスペースを予約するようにオペレーティングシステムに要求するだけです。 したがって、クラスターが初期化されていない状態でこのような割り当てられたファイルを開こうとすると、問題が発生する可能性があります。

特定のサイズのファイルを作成するには、-l引数を使用する必要があります。 以下の構文を見つけることができます:

$ fallocate -l 5K test2.txt 

結果を確認するには、 ls-lhコマンドを使用するだけです。

$ ls -lh test2.txt
-rw-rw-r--    1    username    username    5.0K    Mar 25    21:22    test2.txt 

2番目のテキストファイルでduコマンドを使用しようとすると、結果は大きく異なります。

$ du -sh test2.txt
8.0K    test2.txt 
=================================
$ du --apparent-size test2.txt
5.0K    test2.txt

この場合、 du -sh コマンドは、割り当てられたクラスターの数に基づいてストレージ使用量をカウントします。 一般的なマシンのクラスターサイズは4.0Kで、これはマシンが割り当てることができる最小のサイズです。 オペレーティングシステムは、5KBファイルに2つのクラスターを割り当てる必要があります。

4. 結論

このチュートリアルでは、最初にLinuxファイルシステムの基本について説明しました。 Linuxシステムでファイルシステムがどのように機能するかを理解すると、ターミナルコマンドを使用してファイルを簡単に作成できます。 truncateまたはfallocateはどちらも、ファイルの一部がゼロで埋められているか、初期化されていないファイルを作成できます。

これらのファイルを作成するときは、コーディング規則に一貫性がないため、このファイルに格納されているほとんどのデータが読み取れないことに常に注意する必要があります。