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/zero
:if
参数指定了输入文件(input file),在这个例子中是/dev/zero
。/dev/zero
是一个特殊的设备文件,在读取时会持续产生无限数量的零字节。因此,这个参数告诉dd
命令从/dev/zero
中读取数据作为输入。
of=test2.img
:of
参数指定了输出文件(output file),在这个例子中是test2.img
。这意味着dd
命令将会把从/dev/zero
中读取的数据写入到test2.img
文件中。
bs=1024k
:bs
参数指定了块大小(block size),在这个例子中是 1024KB(或者说1MB)。这意味着dd
命令在每次读取和写入数据时会以 1MB 的大小为单位进行操作。
count=10
:count
参数指定了要复制的块数,即读取和写入数据的次数。在这个例子中,dd
命令将从/dev/zero
中读取 10 个块的数据,并写入到test2.img
文件中。
seek=1024
:seek
参数指定了跳过的块数,即在输出文件中定位写入数据的起始位置。在这个例子中,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空间
检查磁盘镜像
- Author:Gweek
- URL:https://www.myla.eu.org/article/virtualization-technology-managing-virtual-disks
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!