翼度科技»论坛 云主机 LINUX 查看内容

使用Device Mapper创建线性阵列

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
​        在之前的文章:《QEMU/KVM启动物理分区的Windows并调优》中笔者使用mdadm创建线性阵列,使VM启动物理硬盘分区上的Windows系统。这个做法思路清晰且具有实操性,但根据这个issue,Linux内核上游已将CONFIG_MD_LINEAR编译参数弃置了,这意味着在6.8及以后的内核中将无法使用mdadm创建线性阵列,相关模块已不再被内核包含,modprobe linear命令将失效。
​        好在创建线性阵列的方法不止这一种,使用device mapper也可以实现同样的目的。参考这个帖子,这里提供一个新的libvirt hook脚本,使用device mapper动态创建和销毁线性阵列:
  1. #!/usr/bin/env bash
  2. #
  3. # Author: yjzzjy4 (https://github.com/yjzzjy4)
  4. #
  5. # This script creates and distroys /dev/mapper/win10-kvm for booting physical windows drive.
  6. #
  7. WIN_PART=/dev/disk/by-uuid/7CEA3A30EA39E6D4
  8. EFI_DIR=/etc/libvirt/hooks/qemu.d/win10/vdisk
  9. VM_ACTION="$2/$3"
  10. if [[ "$VM_ACTION" == "prepare/begin" ]]; then
  11.         if [[ -e /dev/mapper/win10-kvm ]]; then
  12.                 echo "/dev/mapper/win10-kvm already exists" > /dev/kmsg 2>&1
  13.                 exit 1
  14.         fi
  15.         if mountpoint -q -- "${WIN_PART}"; then
  16.                 echo "Unmounting ${WIN_PART}..." > /dev/kmsg 2>&1
  17.                 umount ${WIN_PART}
  18.         fi
  19.         modprobe loop
  20.         table=""
  21.         cur_size=0
  22.         LOOP0=$(losetup -f "${EFI_DIR}/win10-vdisk-loop0" --show)
  23.         sector_size=$(blockdev --getsz $LOOP0)
  24.         table+="$cur_size $sector_size linear $LOOP0 0\n"
  25.         cur_size=$((cur_size+sector_size))
  26.         sector_size=$(blockdev --getsz $WIN_PART)
  27.         table+="$cur_size $sector_size linear $WIN_PART 0\n"
  28.         cur_size=$((cur_size+sector_size))
  29.         LOOP1=$(losetup -f "${EFI_DIR}/win10-vdisk-loop1" --show)
  30.         sector_size=$(blockdev --getsz $LOOP1)
  31.     table+="$cur_size $sector_size linear $LOOP1 0"
  32.     cur_size=$((cur_size+sector_size))
  33.         echo -e "$table" | dmsetup create win10-kvm
  34. elif [[ "$VM_ACTION" == "release/end" ]]; then
  35.         dmsetup remove win10-kvm
  36.         losetup | grep "win10-vdisk" | awk '{print $1}' | xargs sudo losetup -d
  37. fi
复制代码
​        使用这个hook脚本替代原文中manage-vdisk.sh即可。相较于之前的脚本,做了几个小优化:

  • 使用device mapper创建线性阵列;
  • 使用UUID标识分区(笔者遇到过在某次重启后分区名称发生改变的情况,使用UUID更准确);
  • 规范化脚本中使用的一些目录和文件命名。
​        接下来对脚本进行测试,首先是创建线性阵列:

​        然后是销毁阵列:

​        至此,脚本可以作为libvirt hook正常使用,当然,不要忘记修改VM对应的配置,将启动盘设置为/dev/mapper/win10-kvm,如下图所示:


来源:https://www.cnblogs.com/i-am-stupid/p/18274697
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具