脚本中 kpartx 的问题

脚本中 kpartx 的问题

我正在尝试运行 rpi-image-creator 脚本(请参阅https://github.com/ImmobilienScout24/rpi-image-creator/blob/master/rpi-image-creator),并且在使用 kpartx 时遇到一些麻烦。问题似乎发生在“_open_image”函数中。这是代码:

function _open_image {
   echo "Loop-back mounting" temp/*.img
   kpartx="$(kpartx -av temp/*.img)" || die "Could not setup loop-back access to $RASPBIAN_ARCHIVE_FILE:$NL$kpartx"
   read img_boot_dev img_root_dev <<<$(grep -o 'loop.p.' <<<"$kpartx")
   test "$img_boot_dev" -a "$img_root_dev" || die "Could not extract boot and root loop device from kpartx output:$NL$kpartx"
   img_boot_dev=/dev/mapper/$img_boot_dev
   img_root_dev=/dev/mapper/$img_root_dev
   mkdir -p mnt/img_root
   mount -t ext4 $img_root_dev mnt/img_root || die "Could not mount $img_root_dev mnt/img_root"
   mkdir -p mnt/img_root/boot || die "Could not mkdir mnt/img_root/boot"
   mount -t vfat $img_boot_dev mnt/img_root/boot || die "Could not mount $img_boot_dev mnt/img_root/boot"
   cp -a "$(type -p qemu-arm-static)" mnt/img_root/usr/bin/ || die "Could not copy qemu-arm-static"
   echo "Raspbian Image Details:"
   df -h mnt/img_root/boot mnt/img_root | sed -e "s#$(pwd)/##"
}

运行脚本(在我的例子中使用 --chroot)我收到以下错误:

    mount: special device /dev/mapper/loop0p2 does not exist
    ERROR: Could not mount /dev/mapper/loop0p2 mnt/img_root

我在 mount 命令之前添加了一条监控线,列出了 /dev/mapper 的内容,它实际上显示 'loop0p1' 和 'loop0p2' 不存在,这意味着之前调用 kpartx 时一定出了问题。然而,与此同时,变量似乎被分配了循环设备的正确名称。

奇怪的是,在调用脚本之前手动运行“kpartx -a temp/*.img”似乎有效。在脚本因上述错误退出后,循环设备突然出现在它们应该在的位置。

假设该脚本没有错误,我想我的系统中一定发生了一些奇怪的事情。出了什么问题以及如何解决这个问题?

(在内核为 3.16.0-4-amd64、kpartx 版本 0.5.0-6+deb8u1、bash 4.3.30(1)-release 且 .bashrc 为空的 Debian Jessie 上运行)

答案1

当我尝试从使用 kpartx 创建的映射挂载分区时,我也在备份脚本中遇到了类似的问题。经过尝试sync(失败)和sleep 0.5(成功)后,我再次查看了(debian)kpartx 联机帮助页它提供了-s-开关。这会:

-s     Sync mode. Don't return until the partitions are created

现在,运行 kpartx -avs /dev/hostVolumegroup/logicalVolumeSnapshot并安装分区之后可以完美地工作,我不需要解决方法。

相关内容