KVM虚拟机镜像那点儿事,qcow2六大功能

本文详细介绍了KVM虚拟机镜像的两种主要格式:raw和qcow2。raw格式简单且性能好,但不支持稀疏文件,适合ext3文件系统。qcow2格式动态,即使文件系统不支持稀疏文件,文件大小也很小,支持copy-on-write、转换、压缩、加密、扩展和快照等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KVM虚拟机镜像对于物理机的操作系统来讲是一个文件,这个文件最主要的两种格式,一种是raw,也即原始格式,还有一种是qcow2,顾名思义cow是copy on write。

 

一、RAW Image

 

 

raw格式简单,性能较好

 

然而本身不支持稀疏格式,需要文件系统的支持才能支持稀疏文件,所以最好基于ext3文件系统。

 

创建image

 

用dd产生image

 

产生非稀疏文件nonsparse file

 

dd if=/dev/zero of=flat1.img bs=1024k count=1000

 

在这里blocksize是1024k,共1000个block

 

也可以产生稀疏文件sparse file

 

dd if=/dev/zeroof=flat2.img bs=1024k count=0 seek=2048

 

seek的意思是将文件的结尾设在那个地方

 

copy一个稀疏文件的时候,可能会将稀疏文件没有数据的部分压缩掉

 

dd if=/dev/zero of=flat3.img bs=1024k count=1 seek=2048

 

cp --sparse=never flat3.img flat3-never.img

这样拷贝会占用整个2G空间

 

cp --sparse=always flat3.img flat3-always.img

这样拷贝原来写入的1M的0也会被去掉

 

cp --sparse=always flat3-never.img flat3-never-always.img

这样拷贝原来的2G都会被清理掉

 

二、qcow2是动态的

 

即便文件系统不支持sparse file,文件大小也很小

 

qcow2功能一:copy on write

 

qcow2的格式如下

 

 

它实行的是2-Level loopup

 

qcow2的数据是存储在data clusters里面的,每个cluster是512 byte sector

 

为了能够管理这些cluster,qcow2保存了两层的Table,L1 table指向L2 Table,L2 Table管理data cluster.

 

在image里面的offset会被解析成三部分,L1 Table Pointer先找L1,L1 Table Pointer+ offset[0]是L1中的一个entry,读出来便是L2 Table Pointer, L2 Table Pointer + offset[1]是L2中的一个entry,读出来便是data cluster pointer, data cluster pointer +offset[3]便是数据所在的位置。

 

backing file就是基于这个原理的用处,一个qcow2的image可以保存另一个disk image的改变,而不影响另一个image

 

创建backing file

qemu-img create -f qcow2 -o backing_file=./ubuntutest.qcow2 ubuntutest1.qcow2

 

一开始新的image是空的,读取的内容都从老的image里面读取。

当一个data cluster被写入,发生改变的时候,在新的image里面创建一个新的data cluster,这就是copy on write的意义。 

 

 

基于ubuntutest1.img创建一个虚拟机

qemu-system-x86_64 -enable-kvm -name ubuntutest  -m 2048 -hda ubuntutest1.qcow2 -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no -monitor stdio

 

在虚拟机里面创建一个1G的non sparse file

dd if=/dev/zero of=flat1.img bs=1024k count=1000

 

 

qcow2功能二:转换

 

 image格式之间可以转换

 

raw可以转换为qcow2

 

创建一个raw image: dd if=/dev/zero of=flat.img bs=1024k count=1000

 

进行转换: qemu-img convert -f raw -O qcow2 flat.img flat.qcow2

 

qcow2也可以转换为qcow2,转换的过程中,没用的data cluster就被去掉

 

qemu-img convert -f qcow2 -O qcow2 ubuntutest.img ubuntutest-convert.img

 

 

qcow2功能三:压缩

 

qemu-img convert -c -f qcow2 -O qcow2 ubuntutest.img ubuntutest-compress.qcow2

 

 

qcow2功能四:加密

 

qemu-img convert -o encryption -f qcow2 -O qcow2 ubuntutest.qcow2 ubuntutest-encrypt.qcow2

 

会要求设置密码

 

从这个加密image启动一个虚拟机

 

qemu-system-x86_64 -enable-kvm -name ubuntutest  -m 2048 -hda ubuntutest-encrypt.qcow2 -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no -monitor stdio

 

一开始虚拟机并不启动

 

在monitor中输入cont

 

需要输入密码后虚拟机才启动

 

 

qcow2功能五:扩展

 

cp ubuntutest.qcow2 ubuntutest-enlarge.qcow2

 

qemu-img resize ubuntutest-enlarge.qcow2 +10G

 

扩大的空间既不会被partition,也不会被format

 

 

 

启动虚拟机

 

qemu-system-x86_64 -enable-kvm -name ubuntutest  -m 2048 -hda ubuntutest-enlarge.qcow2 -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no -monitor stdio

 

Disk已经被扩大

 

 

删除/dev/sda2和/dev/sda5

fdisk /dev/sda

删除分区五:d 5

删除分区二:d 2

写入修改:w

reboot

 

扩展/dev/sda1分区到整块硬盘

fdisk /dev/sda

删除根分区:d 1

在原来根分区的位置创建新分区:n

是一个主分区:p

其他都选默认,最后写入修改:w

partprobe

 

扩展文件系统

resize2fs /dev/sda1

 

qcow2功能六:快照

 

snapshot也是copy on write的一种应用,和backing file有微妙的不同

 

有两种snapshot,一种是internal snapshot,一种是external snapshot

internal snapshot是qcow2中的snapshot table所维护的snapshot,所有的snapshot都是在同一个文件中维护

 

创建一个虚拟机

 

qemu-system-x86_64 -enable-kvm -name ubuntutest  -m 2048 -hda ubuntutest.qcow2 -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no -monitor stdio

 

在monitor中执行savevm后,ubuntutest.img会在image内部打一个snapshot

 

 

原理是,当打一个snapshot后,会在snapshot table中建立一项,但是起初是空的,包含L1 table的一个复制,当L2 table或者data cluster改变的时候,则会将原来的数据复制一份,由snapshot的L1 table来维护,而原来的data cluster已经改变,在原地。

 

external snapshot则往往采用上面的copy on write的方法

当打snapshot的时候,将当前的image不再改变,创建一个新的image,以原来的image作为backing file,然后虚拟机使用新的image

 

在monitor中,snapshot_blkdev ide0-hd0 ubuntutest-snapshot.img qcow2

 

 

在HOST机器上多了一个文件

 

backing file可以是raw,也可以是qcow2,但是一旦打了snapshot,新的格式就是qcow2了。

 

两者很相似,稍微的不同是:

 

对于internal snapshot, 刚打完snapshot的时候,原image集合是不变的,snapshot的集合是空的,接下来的操作,写入在原image,将不变的加入snapshot集合

 

对于external snapshot,刚打完snapshot的时候,原image变成snapshot, snapshot集合是全集,新image是空的,接下来的操作,写入在新image,将改变的加入新image的集合。

 

和打快照有关的命令有:

 

qemu-img snapshot –c

if the domain is offline and –disk-only was not specified

 

savevm

if the domain is online and –disk-only was not specified

 

snapshot_blkdev

if the domain is online and –disk-only is specified

<think>好的,我现在需要帮助用户查找关于Traefik插件的使用说明、配置和示例。首先,用户提到他们想了解与Traefik插件相关的信息,特别是使用说明、配置和示例。根据用户提供的引用内容,我需要整理这些信息,并按照用户的要求进行结构化回答。 首先,我要回顾用户提供的引用内容。引用[1]提到了在静态配置文件中添加插件的配置示例,引用[3]和[5]介绍了GitHub上的示例插件demo,说明插件是通过Yaegi动态执行的,并提到了开发指南。引用[4]提到了使用Helm chart部署Traefik,这可能与插件的安装有关。引用[2]可能是一个Terraform的示例,但具体内容不明确,暂时可能用不上。 接下来,我需要确定用户的需求:他们需要知道如何配置和使用Traefik插件,包括具体的步骤和示例。根据引用内容,可以分步骤说明配置方法,比如静态配置文件中的设置,以及插件的开发或使用现有插件的步骤。可能还需要提到动态加载和注意事项,如实验性功能、版本兼容性等。 需要确保回答符合用户的要求,结构清晰,分步骤说明。同时,要引用提供的引用内容,正确标注引用标识。例如,引用[1]中的配置示例,引用[3]关于GitHub仓库的信息,引用[4]提到的Helm安装方法,以及引用[5]的项目介绍部分。 另外,用户可能对插件的实际应用场景和如何开发自己的插件感兴趣,所以可能需要包含这些信息。还要生成相关问题,如如何开发自定义插件、动态加载机制、性能影响等。 需要注意的是,用户提供的引用中有部分内容可能不直接相关,比如引用[2]的Terraform示例,但如果没有更相关的信息,可以暂时忽略。确保回答中的引用准确对应到相关的部分。 总结回答结构: 1. 插件配置步骤,包括静态配置文件示例和Helm安装。 2. 使用现有插件的步骤,比如demo插件的安装。 3. 开发自定义插件的基本流程。 4. 注意事项,如实验性功能、版本要求等。 5. 相关问题部分,生成相关问题。 现在需要将这些信息整合成自然的中文回答,正确引用来源,并确保LaTeX格式符合要求,虽然用户的问题可能不涉及数学公式,但如果有变量或代码,需要使用正确的格式。例如,配置示例中的代码块需要用反引号包裹,并注明语言类型。 检查是否有遗漏的信息,比如引用[3]提到的Yaegi解释器,可能需要解释动态加载机制。同时,引用[5]提到插件是扩展Traefik功能的强大工具,可以用于流量管理,这部分可以在应用场景中提及。 最后,生成的相关问题需要与Traefik插件的使用、开发、配置相关,确保问题有针对性,能够引导用户进一步探索。</think>### Traefik 插件使用说明与配置示例 #### 1. 插件配置基础步骤 Traefik 插件通过静态配置文件或动态加载实现。以下为静态配置示例(需在 Traefik 的 YAML 配置文件中添加): ```yaml experimental: localPlugins: example: moduleName: github.com/traefik/plugindemo # 插件模块路径[^1] ``` 此配置声明了一个名为 `example` 的本地插件,指向 GitHub 上的示例仓库[^3]。 若使用 Helm 安装 Traefik,需在 `values.yaml` 中启用插件支持: ```yaml experimental: plugins: enabled: true # 启用插件功能[^4] ``` #### 2. 使用现有插件(以 demo 插件为例) 1. **安装插件** 通过修改 Traefik 部署配置,将插件代码编译到 Traefik 二进制文件中,或通过动态加载(需 Yaegi 支持)。 2. **配置路由规则** 在 `IngressRoute` 中引用插件: ```yaml apiVersion: traefik.io/v1alpha1 kind: Middleware metadata: name: demo-plugin spec: plugin: example: # 插件名称 headerName: "X-Custom-Header" headerValue: "Hello from Plugin" ``` #### 3. 开发自定义插件 1. **代码结构** 遵循 Traefik 插件接口规范,实现 `New` 初始化方法和 `Handle` 请求处理逻辑[^3]。 2. **动态加载** 利用 Yaegi 解释器实时加载插件(无需重启 Traefik): ```go // 示例插件逻辑 func New(ctx context.Context, config *Configuration) (http.Handler, error) { return &demoPlugin{config}, nil } ``` #### 4. 注意事项 - **实验性功能**:插件功能标记为实验性,需在配置中显式启用[^4]。 - **版本兼容性**:确认 Traefik 版本支持插件(建议 v2.3+)[^4]。 - **安全限制**:动态加载插件需注意代码安全性,建议审核第三方插件[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值