/dev/sda & /dev/sdb & /dev/zero && dd命令 && fallocate

/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命令是缩小或者扩展文件至指定大小,它的语法如下:

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] 是接收指定大小的字符串,单位是字节,后面也可以接 KKBMMBGGB等单位

下面的实例是往 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 要慢很多

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值