虚拟化技术 管理虚拟磁盘

Gweek Lv4

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

稀疏文件(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
2
bashCopy code
dd if=source.txt of=destination.txt bs=1k count=10

这样 dd 命令只会读取 source.txt 中的前 10KB 数据,并将其写入 destination.txt 中。

3、test3

1
2
bashCopy code
dd if=/dev/zero of=test2.img bs=1024k count=10 seek=1024
  • 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 命令

  • 将稀疏文件转换为非稀疏文件:
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.
Comments
On this page
虚拟化技术 管理虚拟磁盘