虚拟化技术 管理虚拟磁盘

一、稀疏文件与非稀疏文件
稀疏文件(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。
1 | dd if=source.txt of=destination.txt bs=1k |
在这个例子中:
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=
参数:
1 | bashCopy code |
这样 dd
命令只会读取 source.txt
中的前 10KB 数据,并将其写入 destination.txt
中。
3、test3
1 | bashCopy code |
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
命令
- 将稀疏文件转换为非稀疏文件:
1 | cp --sparse=never sparse_file non_sparse_file |
在这个命令中,sparse_file
是稀疏文件的路径,non_sparse_file
是要创建的非稀疏文件的路径。通过使用 --sparse=never
选项,cp
命令将会将稀疏文件 sparse_file
复制到 non_sparse_file
,并确保复制后的文件不再是稀疏文件,而是占用实际存储空间的非稀疏文件。
- 将非稀疏文件转换为稀疏文件:
1 | cp --sparse=always non_sparse_file sparse_file |
在这个命令中,non_sparse_file
是非稀疏文件的路径,sparse_file
是要创建的稀疏文件的路径。通过使用 --sparse=always
选项,cp
命令将会将非稀疏文件 non_sparse_file
复制到 sparse_file
,并确保复制后的文件是稀疏文件。
方法二:使用 fallocate
命令
- 将非稀疏文件转换为稀疏文件:
1 | fallocate -d sparse_file |
在这个命令中,sparse_file
是要转换为稀疏文件的非稀疏文件的路径。通过使用 -d
或 --dig-hole
选项,fallocate
命令将会在文件中创建一个“空洞”,即不实际分配存储空间的区域。这样就将非稀疏文件转换为稀疏文件了。
需要注意的是,fallocate
命令可能需要特定的权限才能操作文件,并且并非所有文件系统都支持稀疏文件,因此在使用 fallocate
命令时要谨慎考虑。
五、改变镜像大小
常见的磁盘后缀
raw 文件是一种原始的硬盘镜像格式,它们没有任何压缩或处理。 img 文件也是一种原始的硬盘镜像格式,通常与 Linux 系统中的 dd 命令一起使用。 qcow2 文件是一种由 QEMU 虚拟机使用的硬盘镜像格式,它支持磁盘快照、动态分配和压缩。
改变镜像大小
1 | qemu-img resize vm1.qcow2 +1G |
注意:qcow2不支持缩减磁盘大小,只能增加磁盘大小
1 | qemu-img resize vm2.img -1G |
给img磁盘缩减1G空间
检查磁盘镜像
1 | qemu-img check vm3.qcow2 |
- Title: 虚拟化技术 管理虚拟磁盘
- Author: Gweek
- Created at : 2024-09-13 14:08:11
- Updated at : 2024-09-13 14:08:11
- Link: https://gweek.nyc.mn/2024/09/13/2024-06-11-xnhcpgl/
- License: This work is licensed under CC BY-NC-SA 4.0.