スクリプトの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

/dev/mapperの内容をリストするmountコマンドの前にモニター行を追加しましたが、実際には「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パーティションを実行してマウントした後は完全に機能し、回避策は必要ありません。

おすすめ記事