我正在尝试运行 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
并安装分区之后可以完美地工作,我不需要解决方法。