Nhanh chóng tạo một tệp lớn trên hệ thống Linux


438

Làm cách nào tôi có thể nhanh chóng tạo một tệp lớn trên Linux ( hệ thống Red Hat Linux )?

đ sẽ thực hiện công việc, nhưng đọc /dev/zerovà ghi vào ổ đĩa có thể mất nhiều thời gian khi bạn cần một tệp có kích thước vài trăm GB để kiểm tra ... Nếu bạn cần làm điều đó nhiều lần, thời gian thực sự tăng lên.

Tôi không quan tâm đến nội dung của tập tin, tôi chỉ muốn nó được tạo ra một cách nhanh chóng. Điều này có thể giải quyết như thế nào?

Sử dụng một tệp thưa thớt sẽ không hoạt động cho việc này. Tôi cần các tập tin được phân bổ không gian đĩa.


1
Ext4 có hiệu suất phân bổ tệp tốt hơn nhiều, vì toàn bộ các khối lên tới 100MB có thể được phân bổ cùng một lúc.
martinus

5
Nhân tiện, lệnh 'cắt ngắn' tạo ra một tệp thưa thớt. Ví dụ, xem en.wikipedia.org/wiki/Sparse_file
Jason Drew

2
Mọi người dường như đang phớt lờ "tập tin thưa thớt sẽ không hoạt động với điều này", với việc cắt ngắn và dd của họ tìm kiếm bên dưới.
hpavc

1
Bạn nên xác định những gì bạn có nghĩa là "để thử nghiệm". Kiểm tra tốc độ ghi của đĩa cứng của bạn? Kiểm tra những gì dfsẽ báo cáo? Kiểm tra một ứng dụng làm một cái gì đó đặc biệt. Câu trả lời phụ thuộc vào những gì bạn muốn kiểm tra. Dù sao tôi cũng hơi muộn - tôi thấy bây giờ đã nhiều năm kể từ câu hỏi của bạn :-)
ndemou

1
Chỉ trong trường hợp bạn đang tìm cách mô phỏng một phân vùng đầy đủ, giống như tôi, không tìm đâu xa hơn / dev / full
Julian

Câu trả lời:


509

ddtừ các câu trả lời khác là một giải pháp tốt, nhưng nó chậm cho mục đích này. Trong Linux (và các hệ thống POSIX khác), chúng tôi có fallocate, sử dụng không gian mong muốn mà không phải thực sự ghi vào nó, hoạt động với hầu hết các hệ thống tệp dựa trên đĩa hiện đại, rất nhanh:

Ví dụ:

fallocate -l 10G gentoo_root.img

5
Có thể là dd đang sử dụng nội bộ đó không? Nếu tôi thực hiện 'dd if = / dev / zero of = zerofile bs = 1G Count = 1' trên kernel 3.0.0, quá trình ghi kết thúc sau 2 giây, với tốc độ ghi dữ liệu trên 500 megabyte mỗi giây. Điều đó rõ ràng là không thể trên ổ cứng máy tính xách tay 2,5 ..
lxgr

21
fallocatechính xác là những gì tôi đang tìm kiếm.
AB

7
Điều này ( fallocate) cũng sẽ không hoạt động trên hệ thống tệp Linux ZFS - github.com/zfsonlinux/zfs/issues/326
Joe

5
Fallocate cũng không được ext3 hỗ trợ. bugzilla.redhat.com/show_orms.cgi?id=563492
Eddie

3
Trong Debian GNU / Linux fallocatelà một phần của util-linuxgói. Công cụ này được viết bởi Karel Zak từ RedHat và mã nguồn có thể được tìm thấy ở đây: kernel.org/pub/linux/utils/util-linux
Franta

295

Đây là một câu hỏi phổ biến - đặc biệt là trong môi trường ngày nay của môi trường ảo. Thật không may, câu trả lời không đơn giản như người ta có thể nghĩ.

dd là lựa chọn đầu tiên rõ ràng, nhưng về cơ bản dd là một bản sao và buộc bạn phải viết mọi khối dữ liệu (do đó, khởi tạo nội dung tệp) ... Và việc khởi tạo đó là thứ chiếm quá nhiều thời gian I / O. (Bạn muốn làm cho nó lâu hơn nữa? Sử dụng / dev / ngẫu nhiên thay vì / dev / zero ! Sau đó, bạn sẽ sử dụng CPU cũng như thời gian I / O!) Cuối cùng, dd là một lựa chọn kém (mặc dù về cơ bản là mặc định được sử dụng bởi GUI "tạo" VM). Ví dụ:

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

cắt ngắn là một lựa chọn khác - và có khả năng là nhanh nhất ... Nhưng đó là vì nó tạo ra một "tệp thưa thớt". Về cơ bản, một tệp thưa thớt là một phần của đĩa có nhiều dữ liệu giống nhau và hệ thống tệp cơ bản "gian lận" bằng cách không thực sự lưu trữ tất cả dữ liệu, mà chỉ "giả vờ" rằng tất cả đều ở đó. Do đó, khi bạn sử dụng cắt ngắn để tạo ổ đĩa 20 GB cho máy ảo của mình, hệ thống tệp không thực sự phân bổ 20 GB, nhưng nó gian lận và nói rằng có 20 GB số 0 ở đó, dù chỉ là một rãnh trên đĩa thực sự có thể (thực sự) được sử dụng. Ví dụ:

 truncate -s 10G gentoo_root.img

fallocate là cuối cùng - và tốt nhất - sự lựa chọn để sử dụng với phân bổ đĩa VM, bởi vì nó về cơ bản "dự trữ" (hoặc "giao đất" tất cả các không gian bạn đang tìm kiếm, nhưng nó không bận tâm để ghi bất cứ điều gì Vì vậy,. Khi bạn sử dụng fallocate để tạo dung lượng ổ đĩa ảo 20 GB, bạn thực sự có được một tệp 20 GB (không phải là "tệp thưa thớt" và bạn sẽ không bận tâm viết bất cứ điều gì vào nó - điều đó có nghĩa là hầu như mọi thứ đều có thể có trong đó ở đó - giống như một đĩa hoàn toàn mới!) Eg:

fallocate -l 10G gentoo_root.img

4
+1 truncatelà chức năng trên JFS; fallocate, không nhiều lắm. Một điểm: bạn không thể bao gồm số thập phân trong số, tôi cần chỉ định 1536G, không 1.5T.
Calrion

1
Theo tôi fallocatengười đàn ông trang, điều này chỉ được hỗ trợ trên btrfs, ext4, ocfs2, và xfshệ thống tập tin
Nathan S. Watson-Haigh

Lưu ý swaponkhông may không làm việc trên mức độ cấp phát trước, tôi cuối cùng kiểm tra. Có một số cuộc thảo luận về danh sách gửi thư XFS về việc có một tùy chọn ngụy biện để lộ dữ liệu tự do cũ thay vào đó và không có phạm vi được đánh dấu là preallocated, vì vậy hoán đổi sẽ hoạt động. Nhưng tôi không nghĩ bất cứ điều gì đã được thực hiện.
Peter Cordes

1
FYI, cố gắng đọc quá nhiều dữ liệu từ đó /dev/randomcó thể dẫn đến việc hết dữ liệu ngẫu nhiên và "Khi nhóm entropy trống, đọc từ / dev / ngẫu nhiên sẽ chặn cho đến khi thu được tiếng ồn môi trường bổ sung", vì vậy có thể mất rất nhiều thời gian dài
Xen2050

154

Linux và tất cả các hệ thống tập tin

xfs_mkfile 10240m 10Gigfile

Linux và một số hệ thống tập tin (ext4, xfs, btrfs và ocfs2)

fallocate -l 10G 10Gigfile

OS X, Solaris, SunOS và có lẽ các UNIX khác

mkfile 10240m 10Gigfile

HP-UX

prealloc 10Gigfile 10737418240

Giải trình

Hãy thử mkfile <size>myfile như là một thay thế dd. Với -ntùy chọn kích thước được ghi chú, nhưng các khối đĩa không được phân bổ cho đến khi dữ liệu được ghi vào chúng. Không có -ntùy chọn, không gian được lấp đầy bằng không, có nghĩa là ghi vào đĩa, có nghĩa là mất thời gian.

mkfile có nguồn gốc từ SunOS và không có sẵn ở mọi nơi. Hầu hết các hệ thống Linux đều xfs_mkfilehoạt động chính xác theo cùng một cách, và không chỉ trên các hệ thống tệp XFS mặc dù có tên. Nó được bao gồm trong xfsprogie (cho Debian / Ubuntu) hoặc các gói có tên tương tự.

Hầu hết các hệ thống Linux cũng có fallocate, chỉ hoạt động trên một số hệ thống tệp nhất định (như btrfs, ext4, ocfs2 và xfs), nhưng là nhanh nhất, vì nó phân bổ tất cả không gian tệp (tạo tệp không phải holey) nhưng không khởi tạo bất kỳ tệp nào của nó


5
Mkfile này mà bạn nói ở đâu, người lạ? Nó không có trong bản cài đặt RHEL mặc định.
paxdiablo

2
Đó là một tiện ích solaris. nếu bạn tìm kiếm gpl mkfile, bạn sẽ tìm thấy một số ví dụ về mã nguồn.
Martin Beckett

5
Hoạt động như một bùa mê trên OS X:mkfile 1g DELETE_IF_LOW_ON_SSD_SPACE.img
Volker Rose

2
xfs_mkfileđược bao gồm trong xfspross trên Ubuntu và hoạt động như một nét quyến rũ trên ext3 fs của tôi. :)
Greg Dubicki 5/2/2015

97
truncate -s 10M output.file

sẽ tạo một tệp 10 M ngay lập tức (M là viết tắt của 1024 * 1024 byte, MB là viết tắt của 1000 * 1000 - tương tự với K, KB, G, GB ...)

EDIT: như nhiều người đã chỉ ra, điều này sẽ không phân bổ vật lý tệp trên thiết bị của bạn. Với điều này, bạn thực sự có thể tạo một tệp lớn tùy ý, bất kể dung lượng có sẵn trên thiết bị, vì nó tạo ra tệp "thưa thớt".

Vì vậy, khi làm điều này, bạn sẽ trì hoãn phân bổ vật lý cho đến khi tệp được truy cập. Nếu bạn ánh xạ tệp này vào bộ nhớ, bạn có thể không có hiệu suất mong đợi.

Nhưng đây vẫn là một lệnh hữu ích để biết


1
Đã thử điều này, nhưng nó không ảnh hưởng đến dung lượng đĩa trống. Phải bởi vì nó là một tập tin thưa thớt như được mô tả trước đây.
Gringo Suave

7
Đây không phải là câu trả lời hàng đầu vì nó không giải quyết được vấn đề, fallocatecâu trả lời dưới đây không có.
Gringo Suave

4
@GringoSuave nhưng điều này vẫn hữu ích cho một số người có thể có vấn đề tương tự nhưng hơi khác một chút.
AJMansfield

@GringoSuave: Có vẻ như tạo một tệp lớn theo yêu cầu, tại sao nó không giải quyết được vấn đề? Ngoài ra, có những lưu ý dưới câu trả lời ngụy biện rằng nó thậm chí không hoạt động trong hầu hết các trường hợp.
Pavel imerda

1
Tại sao đề nghị tạo các tệp thưa thớt khi anh ta nói rằng nó sẽ không hoạt động?
hpavc

44

Nơi tìm kiếm là kích thước của tệp bạn muốn theo byte - 1.

dd if=/dev/zero of=filename bs=1 count=1 seek=1048575

6
Tôi thích cách tiếp cận này, nhưng người bình luận không muốn một tệp thưa thớt vì một số lý do. :(
ephemient

3
dd if = / dev / zero of = 1GBfile bs = 1000 đếm = 1000000
Damien

7
dd if = / dev / zero of = 01GBfile bs = 1024 Count = $ ((1024 * 1024))
Xavier Decoret

1
Đối với các tập tin thưa thớt, truncatedường như là tốt hơn nhiều.
Pavel imerda

36

Ví dụ về tìm kiếm là kích thước của tệp bạn muốn theo byte

#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


Từ trang man dd:

BLOCKS và BYTES có thể được theo sau bởi các hậu tố nhân sau: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024, v.v. đối với T, P, E, Z, Y.


Cách này có vẻ tốt hơn nhiều so với cách n-1 , vì vậy về cơ bản nó tương đương với truncate.
Pavel imerda

19

Để tạo tệp 1 GB:

dd if=/dev/zero of=filename bs=1G count=1

7
Tôi tin rằng số lượng phải là 1. (được thử nghiệm trên centos)
SvennD

dd if=/dev/zero of=filename bs=20G count=1sẽ chỉ tạo tệp 2GB! không phải 20GB.
Maulik Gangani

18

Tôi không biết nhiều về Linux, nhưng đây là Mã C tôi đã viết để giả mạo các tệp khổng lồ trên DC Share nhiều năm trướ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");
    }
}

phải có cách tiếp cận tốt hơn trong C. Bạn cũng cần phải đóng tệp. Lặp lại một triệu lần viết 1 char mỗi lần ...
ACV

10

Bạn cũng có thể sử dụng lệnh "có". Cú pháp khá đơn giản:

#yes >> myfile

Nhấn "Ctrl + C" để dừng việc này, nếu không nó sẽ ăn hết dung lượng của bạn.

Để làm sạch tập tin này chạy:

#>myfile

sẽ làm sạch tập tin này.


7

Tôi không nghĩ rằng bạn sẽ nhận được nhanh hơn nhiều so với dd. Nút thắt là đĩa; việc ghi hàng trăm GB dữ liệu vào đó sẽ mất nhiều thời gian cho dù bạn có làm thế nào.

Nhưng đây là một khả năng có thể làm việc cho ứng dụng của bạn. Nếu bạn không quan tâm đến nội dung của tệp, làm thế nào về việc tạo tệp "ảo" có nội dung là đầu ra động của chương trình? Thay vì mở () ing tệp, sử dụng popen () để mở một đường ống đến một chương trình bên ngoài. Chương trình bên ngoài tạo dữ liệu bất cứ khi nào cần. Khi đường ống được mở, nó hoạt động giống như một tệp thông thường trong đó chương trình đã mở đường ống có thể fseek (), tua lại (), v.v. Bạn sẽ cần sử dụng pclose () thay vì đóng () khi bạn thực hiện với đường ống.

Nếu ứng dụng của bạn cần tệp có kích thước nhất định, nó sẽ tùy thuộc vào chương trình bên ngoài để theo dõi vị trí của "tệp" đó và gửi eof khi đạt đến "kết thúc".


4

Một cách tiếp cận: nếu bạn có thể đảm bảo các ứng dụng không liên quan sẽ không sử dụng các tệp theo cách xung đột, chỉ cần tạo một nhóm tệp có kích cỡ khác nhau trong một thư mục cụ thể, sau đó tạo liên kết đến chúng khi cần.

Ví dụ: có một nhóm các tệp được gọi là:

  • / nhà / bigfiles / 512M-A
  • / nhà / bigfiles / 512M-B
  • / nhà / bigfiles / 1024M-A
  • / nhà / bigfiles / 1024M-B

Sau đó, nếu bạn có một ứng dụng cần tệp 1G có tên / home / oracle / logfile, hãy thực hiện "ln /home/bigfiles/1024M-A /home/oracle/logfile ".

Nếu nó nằm trên một hệ thống tập tin riêng biệt, bạn sẽ phải sử dụng một liên kết tượng trưng.

Các tệp A / B / etc có thể được sử dụng để đảm bảo không có xung đột sử dụng giữa các ứng dụng không liên quan.

Các hoạt động liên kết là về nhanh như bạn có thể nhận được.


Bạn có thể có một hồ bơi nhỏ hoặc một hồ bơi lớn, đó là lựa chọn của bạn. Dù sao bạn cũng sẽ cần ít nhất một tập tin, vì đó là những gì người hỏi yêu cầu. Nếu nhóm của bạn bao gồm một tệp, bạn không mất gì. Nếu bạn có các thùng đĩa (và bạn nên, với giá thấp), không có vấn đề gì.
paxdiablo

3

GPL mkfile chỉ là một trình bao bọc tập lệnh sh (ba) sh xung quanh dd; Mkfile của BSD chỉ ghi nhớ một bộ đệm bằng không và viết nó nhiều lần. Tôi sẽ không mong đợi trước đây để thực hiện dd. Cái sau có thể vượt ra khỏi dd if = / dev / zero một chút vì nó bỏ qua các lần đọc, nhưng bất cứ điều gì tốt hơn đáng kể có lẽ chỉ là tạo một tệp thưa thớt.

Thiếu một cuộc gọi hệ thống thực sự phân bổ không gian cho một tệp mà không ghi dữ liệu (và Linux và BSD cũng thiếu điều này, có lẽ là Solaris), bạn có thể có một sự cải thiện nhỏ về hiệu suất bằng cách sử dụng ftrunc (2) / truncate (1) để mở rộng tệp đến kích thước mong muốn, mmap tệp vào bộ nhớ, sau đó ghi dữ liệu khác không vào các byte đầu tiên của mỗi khối đĩa (sử dụng fgetconf để tìm kích thước khối đĩa).


4
BSD và Linux thực sự đã phân biệt (chỉnh sửa: giờ là POSIX và có sẵn rộng rãi).
Tobu

3

Trình cắm không biết xấu hổ: OTFFS cung cấp một hệ thống tệp cung cấp các tệp lớn tùy ý (tốt, gần như. Exabyte là giới hạn hiện tại) của nội dung được tạo. Nó chỉ dành cho Linux, đơn giản là C và ở giai đoạn đầu alpha.

Xem https://github.com/s5k6/otffs .


3

Đây là cách nhanh nhất tôi có thể làm ( không nhanh) với các ràng buộc sau:

  • Mục tiêu của tệp lớn là lấp đầy đĩa, do đó không thể nén được.
  • Sử dụng hệ thống tập tin ext3. ( fallocatekhông có sẵn)

Đây là ý chính của nó ...

// 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);
}

Trong trường hợp của chúng tôi, đây là một hệ thống linux nhúng và nó hoạt động đủ tốt, nhưng sẽ thích cái gì đó nhanh hơn.

FYI lệnh dd if=/dev/urandom of=outputfile bs=1024 count = XXrất chậm đến mức không thể sử dụng được.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.