寂傧 发表于 2025-6-8 13:20:56

使用Device Mapper创建线性阵列

​        在之前的文章:《QEMU/KVM启动物理分区的Windows并调优》中笔者使用mdadm创建线性阵列,使VM启动物理硬盘分区上的Windows系统。这个做法思路清晰且具有实操性,但根据这个issue,Linux内核上游已将CONFIG_MD_LINEAR编译参数弃置了,这意味着在6.8及以后的内核中将无法使用mdadm创建线性阵列,相关模块已不再被内核包含,modprobe linear命令将失效。
​        好在创建线性阵列的方法不止这一种,使用device mapper也可以实现同样的目的。参考这个帖子,这里提供一个新的libvirt hook脚本,使用device mapper动态创建和销毁线性阵列:
#!/usr/bin/env bash
#
# Author: yjzzjy4 (https://github.com/yjzzjy4)
#
# This script creates and distroys /dev/mapper/win10-kvm for booting physical windows drive.
#

WIN_PART=/dev/disk/by-uuid/7CEA3A30EA39E6D4
EFI_DIR=/etc/libvirt/hooks/qemu.d/win10/vdisk

VM_ACTION="$2/$3"

if [[ "$VM_ACTION" == "prepare/begin" ]]; then
        if [[ -e /dev/mapper/win10-kvm ]]; then
                echo "/dev/mapper/win10-kvm already exists" > /dev/kmsg 2>&1
                exit 1
        fi

        if mountpoint -q -- "${WIN_PART}"; then
                echo "Unmounting ${WIN_PART}..." > /dev/kmsg 2>&1
                umount ${WIN_PART}
        fi

        modprobe loop
        table=""
        cur_size=0

        LOOP0=$(losetup -f "${EFI_DIR}/win10-vdisk-loop0" --show)
        sector_size=$(blockdev --getsz $LOOP0)
        table+="$cur_size $sector_size linear $LOOP0 0\n"
        cur_size=$((cur_size+sector_size))

        sector_size=$(blockdev --getsz $WIN_PART)
        table+="$cur_size $sector_size linear $WIN_PART 0\n"
        cur_size=$((cur_size+sector_size))

        LOOP1=$(losetup -f "${EFI_DIR}/win10-vdisk-loop1" --show)
        sector_size=$(blockdev --getsz $LOOP1)
    table+="$cur_size $sector_size linear $LOOP1 0"
    cur_size=$((cur_size+sector_size))

        echo -e "$table" | dmsetup create win10-kvm
elif [[ "$VM_ACTION" == "release/end" ]]; then
        dmsetup remove win10-kvm
        losetup | grep "win10-vdisk" | awk '{print $1}' | xargs sudo losetup -d
fi​        使用这个hook脚本替代原文中manage-vdisk.sh即可。相较于之前的脚本,做了几个小优化:

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

​        然后是销毁阵列:

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


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

全叶农 发表于 2025-11-27 11:48:15

热心回复!

铵滔 发表于 2026-1-2 19:33:13

收藏一下   不知道什么时候能用到

俞秋荣 发表于 2026-1-12 03:18:05

热心回复!

顶豌 发表于 2026-1-16 07:42:51

不错,里面软件多更新就更好了

柯惠心 发表于 2026-1-18 16:03:15

感谢发布原创作品,程序园因你更精彩

菅舛 发表于 2026-1-19 11:38:29

谢谢分享,辛苦了

东门芳洲 发表于 2026-1-21 14:10:03

谢谢分享,试用一下

注思 发表于 2026-1-24 03:31:10

用心讨论,共获提升!

连热 发表于 2026-1-26 06:35:43

热心回复!

南宫玉英 发表于 2026-1-27 22:57:37

这个有用。

王妍芳 发表于 2026-1-28 03:57:51

感谢发布原创作品,程序园因你更精彩

凤患更 发表于 2026-1-29 17:42:12

谢谢楼主提供!

董绣梓 发表于 2026-2-7 04:58:38

感谢,下载保存了

愆蟠唉 发表于 2026-2-7 15:33:58

用心讨论,共获提升!

崔竹 发表于 2026-2-8 02:21:48

感谢发布原创作品,程序园因你更精彩

院儿饯 发表于 2026-2-8 20:44:00

喜欢鼓捣这些软件,现在用得少,谢谢分享!

摹熹 发表于 2026-2-9 00:22:23

感谢发布原创作品,程序园因你更精彩

骆贵 发表于 2026-2-9 07:05:46

新版吗?好像是停更了吧。

扫恢怯 发表于 2026-2-10 11:17:09

喜欢鼓捣这些软件,现在用得少,谢谢分享!
页: [1] 2
查看完整版本: 使用Device Mapper创建线性阵列