LUK 加密的 raw disk 映像,通过 nbd 挂接为 NFS

因为我自己的笔记本电脑上安装了 Ubuntu 作为 KVM Host,办公室里有多台 KVM Host,同时用 NFS 服务器,有专门的 Data Pool 分享给客户机。我想做的一件事情是,把自己的个人资料放到一块加密的 虚拟磁盘映像文件中,然后使用的时候,通过 NBD 挂接到 KVM Host 上, 作为 NFS Share export。可以同时被多个不同的客户机挂接,而实际读写的是一个加密的磁盘映像文件。

这样子的目的是如果需要回家办公,只要拷贝这个映像的快照即可,公司的服务器上的映像和自己笔记本上的映像相互之间更新最新的快照即可。

由于 qcow2/raw 格式的加密方式存在潜在问题,新版本的 qemu 推荐用 LUK 格式加密磁盘映像,本文就介绍整个的流程。

  1. 首先创建一个 secret.xml 文件如下:其中 首行 和末尾行以外的其他行都可以不要,然后运行 #virsh secret-define –file secret.xml
    参考官方文档:

# virsh secret-list 就可以看到新建的一个 secret 了。

2. 为创建的 secret 设置密码 123456:
# MYSECRET=`printf %s “123456” | base64`
# virsh secret-set-value 1d9cbca4-864b-45cb-8a23-98c9ee885695 $MYSECRET

3. 创建 vol_luks.xml 文件定义卷如下:

根据以上 XML 文件创建卷:
# virsh vol-create –file vol_luks.xml –pool datapool
查看已经创建好的卷信息
# qemu-img info Albert_Disk.luks

4. 磁盘创建成功后,通过 NBD 挂接到 /dev/nbdX 下(X可以是 0 开始的自然数,这里以 1为例子):
# modprobe nbd max_part=16 (先加载 nbd 驱动到内核)
# qemu-nbd -c /dev/nbd1 -f raw –object secret,id=sec0,data=vol_secret.xml Albert_Disk.luks
上面的 vol_secret.xml 其实就是本文开头截屏的内容。
# fdisk -l /dev/nbd1 可以查看到磁盘信息

5. 通过 cryptsetup 挂接为 DM 设备:
# cryptsetup luksOpen /dev/nbd1 Albert_Encrypted
输入正确的密码后, DM 设备就可以在 /dev/mapper 下看到了。
# dmsetup info /dev/mapper/Albert_Encrypted

由于这是初次创建的磁盘,所以我们需要格式化一下( XFS 文件系统):
# mkfs.xfs /dev/mapper/Albert_Encrypted
然后我们就可以把这个磁盘挂接到 NFS Share 目录,把目录添加到 /etc/exports 文件,运行 exportfs -rav,然后运行 exportfs -s 确认

下面介绍一下逆过程,就是 DM 设备从 NBD 下卸载:
先从 NFS 卸载:
# umount /dev/mapper/Albert_Encrypted
# cryptsetup -v luksClose Albert_Encrypted
# qemu-nbd -d /dev/nbd1

如果遇到问题:
# fdisk -l /dev/nbd1
# dmsetup ls 查看不能卸载设备的 Major:Minor
# lsof |grep “major,minor” (kill 对应的进程)
# dmsetup remove /dev/mapper/Albert_Encrypted (如果有问题)

作者: 甬洁网络

--移动互联网&物联网技术提供商