rpi-clone Error: /dev/nvme0n1: unrecognised disk label NVMe M.2 SSD対応パッチ

sdaからNVMe M.2 SSDにrpi-cloneしてみたらできなかった。その対策。

わしの構成

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 512M 0 part /boot/firmware
└─sda2 8:2 0 118.7G 0 part /
mmcblk0 179:0 0 14.5G 0 disk
├─mmcblk0p1 179:1 0 512M 0 part
└─mmcblk0p2 179:2 0 14G 0 part
nvme0n1 259:0 0 119.2G 0 disk

  • sudo rpi-clone nvme0n1

Target disk nvme0n1 ends with a digit so may be a partition.
rpi-clone requires disk names like ‘sda’ and not partition names like ‘sda1’.

Continue anyway? (yes/no): yes
Error: /dev/nvme0n1: unrecognised disk label

エラー???逆は?

  • sudo rpi-clone sdb

Error: Could not stat device /dev/nvme0n1p – No such file or directory.

これもエラー?

原因

rpi-cloneのスクリプトが、NVMe デバイスの名前の末尾、 n1p1, n1p2の場合を考慮していない。そりゃ、無かったから仕方ない。誰も悪くないです。

rpi-cloneはすばらしいツールです。感謝しています。ありがとうございます。

直すところ

通常はこの場所

  • sudo nano /usr/local/sbin/rpi-clone

必要ならバックアップ、まあ、githubにあるからええか。

お決まり、自己責任でおねがいします。もし間違えても、chatgptがエラー直してくれるはず。

プログラムのブロックごとコピペ、ソースの元のコードを対策したコードに置き換え、保存でOK。

destination部分の対応

元のコード

if [[ ${chk_disk: -1} =~ ^[0-9]$ ]]
then
if [[ $dst_disk == “mmcblk” ]]
then
SD_slot_dst=1
dst_part_base=${dst_disk}p
if [ “$edit_fstab_name” == “” ] \&& ! grep -q “^PARTUUID=” /etc/fstab
then
edit_fstab_name=$dst_part_base
assumed_fstab_edit=1
else
assumed_fstab_edit=0
fi
else
qecho $”
Target disk $dst_disk ends with a digit so may be a partition.
$PGM requires disk names like ‘sda’ and not partition names like ‘sda1’.”confirm “Continue anyway?” “abort”
fi
fi

対策したコード

if [[ ${chk_disk: -1} =~ ^[0-9]$ ]]
then
if [[ $dst_disk == “mmcblk” ]]
then
SD_slot_dst=1
dst_part_base=${dst_disk}p
if [ “$edit_fstab_name” == “” ] \
&& ! grep -q “^PARTUUID=” /etc/fstab
then
edit_fstab_name=$dst_part_base
assumed_fstab_edit=1
else
assumed_fstab_edit=0
fi
elif [[ $dst_disk == “nvme” ]]
then
# NVMe デバイスの場合
dst_part_base=${dst_disk}p
else
qecho $”
Target disk $dst_disk ends with a digit so may be a partition.
$PGM requires disk names like ‘sda’ and not partition names like ‘sda1’.”confirm “Continue anyway?” “abort”
fi
fi

source部分の対応

元のコード

get_src_disk()
{
partition=${1#/dev/}
disk=${partition:: -1}
num=”${partition: -1}”
if [[ $disk == “mmcblk” ]]
then
SD_slot_boot=1
disk=${disk:0:7}
src_part_base=${disk}p
fi
printf -v “${2}” “%s” “$disk”
printf -v “${3}” “%s” “$num”
}

対策したコード

get_src_disk()
{
partition=${1#/dev/} # 引数から “/dev/” を除去
if [[ $partition == “nvme” ]]
then
# NVMe デバイスの場合、 “nvme0n1p1” の形式を解析
disk=${partition:: -2} # 末尾の “pX” を除去して “nvme0n1” を取得
num=”${partition: -1}” # 最後の数字を取得
src_part_base=${disk}p # パーティションベース名を設定
elif [[ $partition == “mmcblk” ]]
then
# SD カードスロットの場合
SD_slot_boot=1
disk=${partition:0:7} # “mmcblkX” の形式
num=”${partition: -1}” # 最後の数字を取得
src_part_base=${disk}p # パーティションベース名を設定
else
# その他のデバイス (例: sda, sdb)
disk=${partition:: -1} # デバイス名を取得 (末尾の数字を除去)
num=”${partition: -1}” # 最後の数字を取得
src_part_base=${disk} # パーティションベース名を設定
fi
# ディスク名とパーティション番号を返す
printf -v “${2}” “%s” “$disk”
printf -v “${3}” “%s” “$num”
}

ここ直してくれと、ソースをchatgptに投げたら、こんなん出ました。

使い方例

普通のデバイスからNVMe デバイスへ

  • sudo rpi-clone nvme0n1

NVMe デバイスのルートからsdbへ

  • sudo rpi-clone sdb

NVMeデバイスから起動しない時

それは、恐らく、SDカードを起動デイスクにして、SSDをルートにしてるraspiをrpi-cloneしていませんか?その場合、NVMeデバイスのPARTUUIDがNVMeデバイスにはならないみたい。(SDカードのまま?)fstabは変更してくれるので変更は不要。

NVMeデバイス上の/boot/cmdline.txtにあるPARTUUID=xxxxxxx-02をお使いのやつにかえると起動します。もちろん、raspiにNVMeから起動するようにしてないとダメですが。

sudo blkid

で、調べてみて下さい。

以上


よろしければチャンネル登録よろしくお願い申し上げます!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です