虚拟机讲只读文件变为可读可写文件_以只读方式启动虚拟机

用上面的方式来实现 Read-only 略显麻烦, 比如每次启动虚拟机的时候都要手动 创建一个快照, 感觉有点奇怪, 再比如更严重的, QEMU 异常退出怎么办? 快照文件 岂不是会占用而外的空间, 难道需要开启另外一个 daemon 程序监控 QEMU?

好在, QEMU 支持另一种快照模式 – 临时快照, 这种模式不需要经过 1)创建快照, 2)指定快照名称, 3)VM 关机后删除快照就可以实现上述功能.

使用也很简单, 在 QEMU 启动的时候, 增加一个 -snapshot 的参数就可以了.

$ qemu-kvm -hda vm.img -snapshot

下面简叙一下原理: 如果传递了 -snapshot 的参数, 会在初始化 img 的时候创建 一个临时的快照. 并且在具体打开这个 img 的时候把这个文件删除. 请注意, Linux 允许一个文件打开之后删除, 其实只是删除了文件名, 对这类文件的正常操作, 内核会有一个比较优雅的方式来处理.

但是为什么要删除呢而不是让用户visable呢? 在我看来有两点:

一旦这个进程结束(正常或者是异常), 这个文件的内容马上就被系统回收, 不会造成空间浪费. 感觉是不是比上面的方式优雅?

处于安全性的考虑, 一旦文件被删除以后, 除了这个进程(VM进程), 其它 是不可能打开和操作这个文件的, 文件的安全性得到保障. 之前在邮件列表 上看到有人提到把这个文件名让用户来设置, 看了它的代码实现后, 发觉 QEMU 的开发者想问题的时候还是很靠谱的.(当然, 这个提议没有通过)

之后, 如果用户想要把快照的内容写回去, QEMU 提供了方式可以写回去的方式, 例如在 nographic 模式下用 Ctrl-a s 把数据写回去, 过多的 write back 不再讨论, 毕竟这里主要研究”只读”.

int get_tmp_filename(char *filename, int size) { int fd; const char *tmpdir; tmpdir = getenv("TMPDIR"); if (!tmpdir) tmpdir = "/tmp"; if (snprintf(filename, size, "%s/vl.XXXXXX", tmpdir) >= size) { return -EOVERFLOW; } fd = mkstemp(filename); if (fd < 0 || close(fd)) { return -errno; } return 0; }   /* 检查用户是否启用临时快照 */ if (flags & BDRV_O_SNAPSHOT) { ret = get_tmp_filename(tmp_filename, sizeof(tmp_filename)); }   /* 打开文件的时候检查是否是临时快照, 如果是, 把文件删除 */ static int bdrv_open_common(BlockDriverState *bs, const char *filename, int flags, BlockDriver *drv) { if (bs->is_temporary) { unlink(filename); } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值