521

Linux ( Red Hat Linux ) システムで大きなファイルをすばやく作成するにはどうすればよいですか?

ddは仕事をし/dev/zeroますが、テストのためにサイズが数百GBのファイルが必要な場合、ドライブからの読み取りとドライブへの書き込みには長い時間がかかる可能性があります...それを繰り返し行う必要がある場合、実際には時間がかかります。

ファイルの内容は気にせず、すばやく作成したいだけです。これはどのように行うことができますか?

これには、スパース ファイルを使用しても機能しません。ファイルにディスク容量を割り当てる必要があります。

4

15 に答える 15

639

dd他の回答からは良い解決策ですが、この目的には時間がかかります。Linux (およびその他の POSIX システム) では、fallocate実際に書き込みを行うことなく必要なスペースを使用する があり、最新のディスク ベースのファイル システムで非常に高速に動作します。

例えば:

fallocate -l 10G gentoo_root.img
于 2011-04-16T18:28:50.710 に答える
341

これは、特に今日の仮想環境の環境ではよくある質問です。残念ながら、その答えは、想定されているほど単純ではありません。

dd は明らかな最初の選択肢ですが、dd は本質的にコピーであり、データのすべてのブロックを書き込む必要があります (したがって、ファイルの内容を初期化します)...そして、その初期化は非常に多くの I/O 時間を消費します。(さらに長くしたいですか? /dev/zeroの代わりに/ dev/randomを使用してください! そうすれば、I/O 時間だけでなく CPU も使用することになります!) 結局のところ、 dd は適切な選択ではありません (基本的には、 VM の「作成」GUI で使用されるデフォルト)。例えば:

dd if=/dev/zero of=./gentoo_root.img bs=4k iflag=fullblock,count_bytes count=10G

切り捨ては別の選択肢であり、おそらく最も高速です...しかし、それは「スパースファイル」を作成するためです。基本的に、スパース ファイルは、同じデータが多数含まれるディスクのセクションであり、基盤となるファイル システムは、実際にはすべてのデータを保存するのではなく、すべてのデータが存在するように「ふりをする」ことで「ごまかします」。したがって、truncate を使用して VM 用に 20 GB のドライブを作成すると、ファイルシステムは実際には 20 GB を割り当てませんが、ディスク上に 1 トラックしかないにもかかわらず、20 GB のゼロがあるとごまかして言います。実際に(実際に)使用されている可能性があります。例えば:

 truncate -s 10G gentoo_root.img

fallocate は、VM ディスク割り当てで使用するための最後の (そして最良の)選択です。これは、本質的に、探しているすべてのスペースを「予約」(または「割り当て」) しますが、何も書き込む必要がないためです。したがって、 fallocate を使用して 20 GB の仮想ドライブ スペースを作成すると、実際には 20 GB のファイル (「スパース ファイル」ではない) が作成され、そこに何も書き込む必要はありません。そこに -- 新品のディスクのようなものです!) 例:

fallocate -l 10G gentoo_root.img
于 2012-08-02T14:23:41.477 に答える
183

Linux とすべてのファイルシステム

xfs_mkfile 10240m 10Gigfile

Linux & および一部のファイルシステム (ext4、xfs、btrfs、および ocfs2)

fallocate -l 10G 10Gigfile

OS X、Solaris、SunOS、およびおそらくその他の UNIX

mkfile 10240m 10Gigfile

HP-UX

prealloc 10Gigfile 10737418240

説明

mkfile <size>の代わりに myfile を試してくださいdd。オプションを使用-nすると、サイズが記録されますが、データが書き込まれるまでディスク ブロックは割り当てられません。このオプションを指定しない-nと、スペースがゼロで埋められます。つまり、ディスクへの書き込みが必要になり、時間がかかります。

mkfileは SunOS から派生したものであり、どこでも使用できるわけではありません。名前にかかわらず、XFS ファイル システムだけでなく、ほとんどの Linux システムにはxfs_mkfileまったく同じように動作するものがあります。xfsprogs (Debian/Ubuntu 用) または同様の名前のパッケージに含まれています。

ほとんどの Linux システムには もありfallocate、これは特定のファイル システム (btrfs、ext4、ocfs2、xfs など) でのみ機能しますが、すべてのファイル スペースを割り当てる (穴のないファイルを作成する) だけで初期化は行わないため、最も高速です。それの。

于 2008-11-03T03:14:02.890 に答える
111
truncate -s 10M output.file

瞬時に 10 M ファイルを作成します (M は 1024 1024 バイトを表し、MB は 1000 1000 を表します - K、KB、G、GB と同じです...)

編集:多くの人が指摘しているように、これはデバイスにファイルを物理的に割り当てません。これにより、「スパース」ファイルが作成されるため、デバイスの使用可能なスペースに関係なく、実際に任意の大きなファイルを作成できます。

たとえば、このコマンドでは HDD スペースが消費されないことに注意してください。

### BEFORE
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

$ truncate -s 500M 500MB.file

### AFTER
$ df -h | grep lvm
/dev/mapper/lvm--raid0-lvm0
                      7.2T  6.6T  232G  97% /export/lvm-raid0

したがって、これを行うと、ファイルがアクセスされるまで物理割り当てを延期することになります。このファイルをメモリにマップしている場合、期待どおりのパフォーマンスが得られない可能性があります。

しかし、これは知っておくと便利なコマンドです。たとえば、ファイルを使用して転送をベンチマークする場合、指定されたサイズのファイルは引き続き移動されます。

$ rsync -aHAxvP --numeric-ids --delete --info=progress2 \
       root@mulder.bub.lan:/export/lvm-raid0/500MB.file \
       /export/raid1/
receiving incremental file list
500MB.file
    524,288,000 100%   41.40MB/s    0:00:12 (xfr#1, to-chk=0/1)

sent 30 bytes  received 524,352,082 bytes  38,840,897.19 bytes/sec
total size is 524,288,000  speedup is 1.00
于 2010-08-20T12:04:37.117 に答える
45

seek は、必要なファイルのサイズ (バイト - 1) です。

dd if=/dev/zero of=filename bs=1 count=1 seek=1048575
于 2008-11-03T05:14:34.503 に答える
37

seek が必要なファイルのサイズ (バイト単位) である例

#kilobytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200K

#megabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200M

#gigabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200G

#terabytes
dd if=/dev/zero of=filename bs=1 count=0 seek=200T


dd マンページから:

BLOCKS と BYTES の後には、次の乗法接尾辞を付けることができます: c=1、w=2、b=512、kB=1000、K=1024、MB=1000*1000、M=1024*1024、GB =1000*1000* 1000、G=1024*1024*1024 など、T、P、E、Z、Y についても同様です。

于 2012-02-22T10:57:03.693 に答える
25

1 GB のファイルを作成するには:

dd if=/dev/zero of=filename bs=1G count=1
于 2015-09-27T01:12:17.793 に答える
18

私は Linux についてよく知りませんが、何年も前に DC Share で巨大なファイルを偽造するために私が書いた C コードを次に示します。

#include < stdio.h >
#include < stdlib.h >

int main() {
    int i;
    FILE *fp;

    fp=fopen("bigfakefile.txt","w");

    for(i=0;i<(1024*1024);i++) {
        fseek(fp,(1024*1024),SEEK_CUR);
        fprintf(fp,"C");
    }
}
于 2012-04-25T13:54:54.073 に答える
10

「yes」コマンドも使用できます。構文はかなり単純です。

#yes >> myfile

「Ctrl + C」を押してこれを停止します。そうしないと、使用可能なすべてのスペースが消費されます。

このファイルを消去するには、次を実行します。

#>myfile

このファイルを消去します。

于 2013-12-12T10:32:59.477 に答える
7

dd よりもはるかに高速になるとは思いません。ボトルネックはディスクです。数百 GB のデータを書き込むには、どのように行っても長い時間がかかります。

しかし、あなたのアプリケーションでうまくいく可能性があります。ファイルの内容を気にしないのであれば、内容がプログラムの動的出力である「仮想」ファイルを作成するのはどうですか? ファイルを open() する代わりに、popen() を使用して外部プログラムへのパイプを開きます。外部プログラムは、必要なときにいつでもデータを生成します。パイプが開かれると、パイプを開いたプログラムが fseek()、rewind() などを実行できるという点で、通常のファイルと同じように機能します。パイプで完了。

アプリケーションがファイルを特定のサイズにする必要がある場合、「ファイル」内のどこにあるかを追跡し、「終了」に達したときに eof を送信するのは、外部プログラム次第です。

于 2008-11-03T04:18:35.553 に答える
4

1つのアプローチ:無関係なアプリケーションが競合する方法でファイルを使用しないことを保証できる場合は、特定のディレクトリにさまざまなサイズのファイルのプールを作成し、必要に応じてそれらへのリンクを作成します。

たとえば、次のようなファイルのプールがあります。

  • / home / bigfiles / 512M-A
  • / home / bigfiles / 512M-B
  • / home / bigfiles / 1024M-A
  • / home / bigfiles / 1024M-B

次に、/ home / oracle / logfileという1Gファイルを必要とするアプリケーションがある場合は、「ln /home/bigfiles/1024M-A /home/oracle/logfile」を実行します。

別のファイルシステム上にある場合は、シンボリックリンクを使用する必要があります。

A / B / etcファイルを使用して、無関係なアプリケーション間で競合する使用がないことを確認できます。

リンク操作はあなたが得ることができるのとほぼ同じくらい速いです。

于 2008-11-03T03:27:24.797 に答える
3

これは、次の制約を使用して実行できる最速の方法です (高速ではありません)。

  • 大きなファイルの目的はディスクをいっぱいにすることなので、圧縮できません。
  • ext3 ファイルシステムを使用しています。(fallocate利用できません)

これが本筋です…

// include stdlib.h, stdio.h, and stdint.h
int32_t buf[256]; // Block size.
for (int i = 0; i < 256; ++i)
{
    buf[i] = rand(); // random to be non-compressible.
}
FILE* file = fopen("/file/on/your/system", "wb");
int blocksToWrite = 1024 * 1024; // 1 GB
for (int i = 0; i < blocksToWrite; ++i)
{
   fwrite(buf, sizeof(int32_t), 256, file);
}

私たちの場合、これは組み込み Linux システム用であり、これで十分に機能しますが、より高速なものを好むでしょう。

参考までに、コマンドdd if=/dev/urandom of=outputfile bs=1024 count = XXは非常に遅く、使用できませんでした。

于 2014-12-31T00:10:12.417 に答える
3

GPL mkfile は、dd の単なる (ba)sh スクリプト ラッパーです。BSD の mkfile は、ゼロ以外のバッファーを memset し、繰り返し書き込みます。前者が dd よりも優れているとは思いません。後者は、読み取りを省略するため、 dd if=/dev/zero をわずかに上回る可能性がありますが、大幅に改善されるのは、おそらくスパース ファイルを作成することだけです。

データを書き込まずに実際にファイルにスペースを割り当てるシステム コールがない場合 (Linux と BSD にはこれがなく、おそらく Solaris もそうです)、ftrunc(2)/truncate(1) を使用してファイルを拡張すると、パフォーマンスがわずかに向上する可能性があります。必要なサイズに変更し、ファイルをメモリに mmap してから、ゼロ以外のデータをすべてのディスク ブロックの最初のバイトに書き込みます (ディスク ブロック サイズを調べるには fgetconf を使用します)。

于 2011-07-27T03:22:35.143 に答える