/dev/fd0
第一个软驱
/dev/fd1
第二个软驱
/dev/sda 第一块硬盘, sda1, sda2是sda这块硬盘上的两个分区
/dev/sdb
第二块硬盘, 以此类推.
/dev/scd0
第一个SCSI CD-ROM, 可以用/dev/sr0
.
/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件。下面使用dd命令将从zero设备中创建一个10K大小(bs决定每次读写1024字节,count定义读写次数为10次),但内容全为0的文件。
dd if=/dev/zero of=file count=10 bs=1024
dd
命令可用于复制和转换文件,复制分区(备份硬盘驱动器)以及创建映像文件。DD命令只能由root用户或有特权的用户运行。使用dd命令时,请记住在运行命令之前检查目标位置是否有足够的可用空间。
注意:使用dd命令时必须格外小心,因为您可以轻松清除分区和磁盘的数据!
// 将现有硬盘驱动器的映像并将其保存到另一个存储位置
dd if=/dev/sda of=~/sda_disk.img
// 从/dev/sda获取的映像文件,并将其恢复到/dev/sdb的位置。
dd if=sda_disk.img of=/dev/sdb
// 将/dev/sda复制到/dev/sdb。选项conv = noerror,sync用于指定发生错误时我们不停止处理。
// sync参数指定将所有缺失的输入替换为空字节并正常处理。
dd if=/dev/sda of=/dev/sdb conv=noerror,sync
使用dd实际写入硬盘,文件产生速度取决于硬盘读写速度,如果欲产生超大文件,速度很慢
在某种场景下,我们只想让文件系统认为存在一个超大文件在此,但是并不实际写入硬盘
则可以
dd if=/dev/zero of=test bs=1M count=0 seek=100000
此时创建的文件在文件系统中的显示大小为100000MB,但是并不实际占用block,因此创建速度与内存速度相当。seek的作用是跳过输出文件中指定大小的部分,这就达到了创建大文件,但是并不实际写入的目的。
当然,因为不实际写入硬盘,所以你在容量只有10G的硬盘上创建100G的此类文件都是可以的。
fallocate
命令可能是Linux中可以用来创建文件的鲜为人知的命令之一。fallocate用于将块预分配给文件。对于支持fallocate
系统调用的文件系统,这可以通过分配块并将其标记为未初始化来快速完成,因此不需要对数据块进行I / O操作。这是创建文件而不是用零填充的更快的方法。大文件几乎可以立即创建,而不必等待任何I / O操作完成。在以下文件系统上支持fallocate系统调用:btrfs,ext4,ocfs2和xfs文件系统(自内核版本v2.6.31起)。
常规语法: fallocate [-n] [-o offset] -l length filename
length和offset参数后可以跟二进制(2 ^ N)后缀KiB,MiB,GiB,TiB,PiB和EiB(iB
为可选,例如,K
的含义与KiB
的含义相同或后缀KB,MB,GB,PB和EB的十进制(10 ^ N)。
$ fallocate -l 1G test_file1.img
// 上面的命令创建了一个名为test_file1.img的文件,大小为1GB。该文件几乎是立即创建的(没有I / O延迟)
$ fallocate -l 10G test_file2.img
// 上面的命令创建了一个名为test_file2.img的文件,大小为10GB。与前面的示例一样,该文件几乎是立即创建的(没有I / O延迟)。
// 注:由fallocate命令返回的退出代码为0表示成功,1表示失败。
$ du -h allocatefile
10G allocatefile
truncate -s [file-size] [name of the file]
truncate 命令 创建的是一个稀疏文件而不是实际的文件 ,稀疏文件不会占用磁盘空间
$ truncate -s 10G truncatefile
$ du -h truncatefile
0 truncatefile
注意:fallocate
命令只支持 btrfs、ext4、 ocfs2、xfs
这几种文件系统,而 truncate
命令支持所有的现代文件系统
yes
命令,它的作用是循环输出一行指定的字符串,直到进程结束,为了控制文件的大小并打破循环,我们借助 head
命令来实现,使用 yes
命令创建包含指定内容文件的语法如下
yes [string] | head -c [size of file] > [name of file]
string
是写入文件每一行的字符串
head -c [size of file]
是接收指定大小的字符串,单位是字节,后面也可以接 K
、KB
、M
、MB
、G
、GB
等单位
下面的实例是往 yesfile
文件写入,每行的内容是: this is a test content
, 一直到文件大小达到 10G
$ yes "this is a test content" | head -c 10G > yesfile
$ du -h yesfile
10G yesfile
yes
命令创建一个 10G
的文件比 dd
命令慢
创建一个 10G的文件, fallocate 和 truncate 命令只需要不到 0.1 秒的时间,但是 dd 命令需要 8.6 秒的时间,yes命令需要 13.2 秒,这中间相差了几百倍,为什么会有这么大的差别呢?
fallocate 将空间分配给文件,但是不会往文件中写入任何数据
truncate 创建的是稀疏文件,和 fallocate 一样,它也不会往文件中写入任何数据
dd 和 yes 都有写文件操作,而这需要大量的 IO 时间,所以同样创建 10G 的文件,它们比 fallocate 和 truncate 要慢很多