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
で、調べてみて下さい。
以上