type
status
date
slug
summary
tags
category
icon
password

一、稀疏文件与非稀疏文件

稀疏文件(sparse file)和非稀疏文件(non-sparse file)是指在存储介质上分配空间的方式不同的两种文件类型。
  • 稀疏文件:
稀疏文件是一种文件,其中包含许多连续的空字节块,这些空字节块在存储介质上并没有实际分配存储空间。换句话说,文件系统会记录这些空洞的位置和大小,但不会在磁盘上实际写入这些空洞的内容。这样的文件通常具有很大的尺寸,但实际上占用的磁盘空间可能远小于其所指示的大小。
  • 非稀疏文件:
非稀疏文件是指在存储介质上分配了实际存储空间的文件。换句话说,文件系统在磁盘上分配了和文件大小相匹配的存储空间,并将文件的内容写入到这些分配的空间中。因此,非稀疏文件的存储大小与其所指示的大小相匹配。
稀疏文件通常用于存储包含大量连续空白数据的文件,例如虚拟机磁盘镜像文件或者日志文件。这样做可以节省磁盘空间,因为文件系统不需要为这些连续的空白数据分配实际的存储空间。

二、命令

dd 是一个常用的命令行工具,在 UNIX 和类 UNIX 系统上用于复制和转换文件。它的使用方式相对灵活,但也因此有些复杂。下面是 dd 命令的各参数详解:
  • if=:指定输入文件(input file),即源文件的路径。如果不指定该参数,默认从标准输入中读取数据。
  • of=:指定输出文件(output file),即目标文件的路径。如果不指定该参数,默认将数据写入标准输出。
  • bs=:指定块大小(block size),即每次读取和写入的数据块大小。块大小可以使用字节、千字节、兆字节等单位表示,例如 bs=4k 表示每次读取和写入 4KB 的数据块。默认的块大小通常为 512 字节。
  • count=:指定要复制的块数,即读取和写入数据的次数。如果不指定该参数,dd 会尽可能读取输入文件的全部内容。
  • skip=:指定跳过的块数,即在复制数据之前跳过的输入块数。通常与 count= 参数一起使用,用于在输入文件中定位复制的起始位置。
  • seek=:指定跳过的块数,即在输出文件中定位写入数据的起始位置。通常与 count= 参数一起使用,用于在输出文件中定位写入数据的位置。
  • status=:指定 dd 命令在执行过程中输出的信息级别。常用的值包括 none(无输出)、noxfer(输出摘要信息)、progress(输出进度信息)等。
  • conv=:指定转换参数,用于对输入或输出数据进行转换。常用的转换参数包括:
    • ascii:将 EBCDIC 字符转换为 ASCII 字符。
      ebcdic:将 ASCII 字符转换为 EBCDIC 字符。
      block:对数据进行块大小调整,确保每个块的大小为 bs= 参数指定的大小。
      unblock:取消块大小调整,将数据重新转换为未调整的形式。
      lcase:将大写字母转换为小写字母。
      ucase:将小写字母转换为大写字母。
      sparse:对输出文件进行稀疏处理,即尽可能使用稀疏文件特性来节省磁盘空间。
      sync:在每个块的末尾添加填充字节,以使输出块的大小与 bs= 参数指定的大小相匹配。

三、举例说明

1、test1
假设我们有一个名为 source.txt 的文本文件,我们想将其复制到名为 destination.txt 的新文件中,并且每次读取和写入的数据块大小为 1KB。
在这个例子中:
  • if=source.txt:指定输入文件为 source.txt
  • of=destination.txt:指定输出文件为 destination.txt
  • bs=1k:指定每次读取和写入的数据块大小为 1KB。
这样,dd 命令将会从 source.txt 中读取数据,并将其写入 destination.txt 中,每次读取和写入 1KB 的数据块,直到 source.txt 中的所有数据都被复制到 destination.txt 中。
2、test2
另外,我们可以添加其他参数来进一步控制复制过程。比如,如果我们只想复制 source.txt 中的前 10KB 数据到 destination.txt 中,可以使用 count= 参数:
这样 dd 命令只会读取 source.txt 中的前 10KB 数据,并将其写入 destination.txt 中。
3、test3
  • if=/dev/zeroif 参数指定了输入文件(input file),在这个例子中是 /dev/zero/dev/zero 是一个特殊的设备文件,在读取时会持续产生无限数量的零字节。因此,这个参数告诉 dd 命令从 /dev/zero 中读取数据作为输入。
  • of=test2.imgof 参数指定了输出文件(output file),在这个例子中是 test2.img。这意味着 dd 命令将会把从 /dev/zero 中读取的数据写入到 test2.img 文件中。
  • bs=1024kbs 参数指定了块大小(block size),在这个例子中是 1024KB(或者说1MB)。这意味着 dd 命令在每次读取和写入数据时会以 1MB 的大小为单位进行操作。
  • count=10count 参数指定了要复制的块数,即读取和写入数据的次数。在这个例子中,dd 命令将从 /dev/zero 中读取 10 个块的数据,并写入到 test2.img 文件中。
  • seek=1024seek 参数指定了跳过的块数,即在输出文件中定位写入数据的起始位置。在这个例子中,dd 命令会在 test2.img 文件中跳过 1024 个块的大小,然后开始写入数据。
这个 dd 命令的作用是从 /dev/zero 中读取 10 个块(每个块大小为 1MB),然后将这些数据写入到 test2.img 文件中,从文件的第 1024 个块的位置开始写入。这个过程会在 test2.img 中创建一个大小为 10MB 的文件,并在文件的前 1GB 的空间中写入连续的零字节。

四、稀疏文件与非稀疏文件互转

方法一:使用 cp 命令
  • 将稀疏文件转换为非稀疏文件:
在这个命令中,sparse_file 是稀疏文件的路径,non_sparse_file 是要创建的非稀疏文件的路径。通过使用 --sparse=never 选项,cp 命令将会将稀疏文件 sparse_file 复制到 non_sparse_file,并确保复制后的文件不再是稀疏文件,而是占用实际存储空间的非稀疏文件。
  • 将非稀疏文件转换为稀疏文件:
在这个命令中,non_sparse_file 是非稀疏文件的路径,sparse_file 是要创建的稀疏文件的路径。通过使用 --sparse=always 选项,cp 命令将会将非稀疏文件 non_sparse_file 复制到 sparse_file,并确保复制后的文件是稀疏文件。
方法二:使用 fallocate 命令
  • 将非稀疏文件转换为稀疏文件:
在这个命令中,sparse_file 是要转换为稀疏文件的非稀疏文件的路径。通过使用 -d--dig-hole 选项,fallocate 命令将会在文件中创建一个“空洞”,即不实际分配存储空间的区域。这样就将非稀疏文件转换为稀疏文件了。
需要注意的是,fallocate 命令可能需要特定的权限才能操作文件,并且并非所有文件系统都支持稀疏文件,因此在使用 fallocate 命令时要谨慎考虑。

五、改变镜像大小

常见的磁盘后缀
raw 文件是一种原始的硬盘镜像格式,它们没有任何压缩或处理。 img 文件也是一种原始的硬盘镜像格式,通常与 Linux 系统中的 dd 命令一起使用。 qcow2 文件是一种由 QEMU 虚拟机使用的硬盘镜像格式,它支持磁盘快照、动态分配和压缩。
改变镜像大小
注意:qcow2不支持缩减磁盘大小,只能增加磁盘大小
给img磁盘缩减1G空间
检查磁盘镜像
Windows server DNS服务器Windows server NTFS权限总结
  • Twikoo