跑步时,
fallocate -l 10G /path/to/file
我返回了以下错误:
fallocate: file: fallocate failed: Operation not supported
使用 dd(if=/dev/zero 或 if=/dev/urandom)创建文件是可行的,但如果我尝试创建数十 GB 的大文件,则需要几个小时才能完成。
运行 Ubuntu 14.04。使用 ext4 分区,指定文件类型似乎不会改变结果。
在我的 CentOS6 机器上运行良好,但不是 Ubuntu。
答案1
如果你觉得稀疏文件没问题(例如,你想创建一个镜像以便用文件系统填充它),那么它们很快就会被创建出来
100GB 需要 3 毫秒:
# time dd if=/dev/zero of=tmptst.dat bs=1G seek=100 count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0,00037726 s, 0,0 kB/s
real 0m0.003s
user 0m0.000s
sys 0m0.002s
生成的文件:
# ls -lh tmptst.dat
-rw-r--r-- 1 root root 100G 2015-01-22 16:39 tmptst.dat
目前的实际大小:0 字节
# ls -lsh tmptst.dat
0 -rw-r--r-- 1 root root 100G 2015-01-22 16:39 tmptst.dat
答案2
我也遇到了这个问题。
目录路径中的符号链接似乎是问题所在。在 /tmp 上尝试相同的命令,它应该可以工作。
我通过在 fallocate 命令中添加“-x”解决了这个问题。这会强制“posix 模式”,并且应该会花费更长时间。
即使文件系统是 ext4,符号链接也会导致“此文件系统不支持”错误。事实上,如果我直接转到目录名称(没有任何符号链接),fallocate() 调用就会起作用。
A1:您正在创建的文件的完整路径名中的任何地方都不要有符号链接。
A2:使用‘-x’,即使它需要更长的时间。
b\375
答案3
如果你不关心内容而只是需要一些数据,
首先,
dd if=/dev/urandom of=tmp.txt bs=1M count=1
它将创造,
-rw-r--r-- 1 root root 1.0M Oct 17 00:30 tmp1.txt.
然后,如果你想创建一个 10M 的文件,使用上面生成的文件进行重复追加,
for i in {1..10}; do dd if=tmp.txt of=tmp1.txt bs=1M oflag=append conv=notrunc; done;
答案4
的输出fallocate --help
为:
Usage:
fallocate [options] <filename>
Preallocate space to, or deallocate space from a file.
Options:
-c, --collapse-range remove a range from the file
-d, --dig-holes detect zeroes and replace with holes
-i, --insert-range insert a hole at range, shifting existing data
-l, --length <num> length for range operations, in bytes
-n, --keep-size maintain the apparent size of the file
-o, --offset <num> offset for range operations, in bytes
-p, --punch-hole replace a range with a hole (implies -n)
-z, --zero-range zero and ensure allocation of a range
-x, --posix use posix_fallocate(3) instead of fallocate(2)
-v, --verbose verbose mode
-h, --help display this help
-V, --version display version
Arguments:
<num> arguments may be followed by the suffixes for
GiB, TiB, PiB, EiB, ZiB, and YiB (the "iB" is optional)
尝试这个命令:
fallocate -x -l 10G /path/to/file