树莓派的SD卡达到使用寿命进入写保护模式,如何无痛迁移系统
1.起因
使用apt update
命令检查是否有包需要更新时,出现警告Structure needs cleaning
,网上查了一下发现可能是因为文件系统损坏,需要修复。
于是关机,取下SD卡准备用fsck.ext4
命令修复,结果发现修复不了,提示: 无法设置 writable 的超级块标志
。
一通捣鼓发现SD里的文件不管是删除、修改、新增,重新连接电脑之后就都自动恢复原样了,网上一查,说是SD卡寿命到了,进入了写保护模式,这下就只能迁移系统到其它SD卡或者U盘上了。
2.迁移系统
网上最多的方法就是使用dd
命令进行对拷,但是我发现dd
命令在拷贝过程中没有进度显示,几十个G的文件,没有进度那可太难受了。然后我发现Windows上一款软件DiskGenius
也能对分区进行对拷,能看到进度,也不需要什么学习成本。
2.1 备份和还原分区表
打开DiskGenius
软件,选中有写保护的,出问题的SD卡右键,选择“备份分区表”
然后选中系统要迁移到的新SD卡右键,选择“还原分区表”。这样我们新SD卡和旧SD卡的分区大小就是一样的了
2.2 克隆分区
右键选中旧SD卡的分区,选择“克隆分区”
然后选择新SD卡对应的分区,注意不要选错。选择完分区后,勾选按文件系统结构原样复制
,如果是灰色的不能选中,那证明两个分区大小不一样,这就是为什么步骤2.1要备份和还原分区表。
然后点击“开始”,等待克隆完成。旧SD卡的所有分区都需要这样进行克隆。
2.3 扩展分区
如果你的新SD卡显示还有“未分配的空间”,比如在软件中看到有这样“空闲”,如果没有,可以跳过此步骤
右键新SD卡的 writable
分区,选择”扩容分区“
鼠标放在交界处,往右边拉完即可
3.启动树莓派
将迁移好的新SD卡插上树莓派,通电,系统就正常启动了
3.1 修改树莓派4B为USB启动
如果你是用的SD卡进行的迁移,那么这一步你就不用看了。
因为我手上没有其它同容量或者更大的SD卡,所以我迁移系统到的U盘,还需要修改启动方式。由于旧卡进入了写保护,系统也进不去了,所以没法通过 raspi-config 命令来修改,只能手动修改配置文件。
找到迁移好系统的U盘,进入system-boot
这个分区下面的config.txt
文件,找到下面这部分:
[all]
# added by do-release-upgrade (LP: #1936401)
kernel=vmlinuz
initramfs initrd.img followkernel
arm_64bit=1
# commented by do-release-upgrade (LP: #1936401)
#device_tree_address=0x03000000
在 [all]
这一行下面新建一行,填写 BOOT_ORDER=0xf14
,变成这样
[all]
BOOT_ORDER=0xf14
# added by do-release-upgrade (LP: #1936401)
kernel=vmlinuz
initramfs initrd.img followkernel
arm_64bit=1
# commented by do-release-upgrade (LP: #1936401)
#device_tree_address=0x03000000
然后将U盘插上USB口,通电就能成功进入系统。
4.备份系统
以防万一以后SD卡或者系统又出什么问题导致无法启动,所以还是备份一下系统
备份系统这里用的是 Win32DiskImager
这个软件,如果你只想备份已使用的空间,那还需要linux系统下的 GParted
这个软件。
4.1 全卡备份
全卡备份,顾名思义就是对整张卡进行备份,不管实际使用了多少空间,128G的卡即使只用了30G,备份出来的文件也有128G。
在电脑上新建一个文本文件,例如:backup.txt
,将后缀名改为img
,即:backup.img
打开 Win32DiskImager
,“镜像文件”选择刚才新建的文件,“设备“选择插入的SD卡,点击”读取“即可
4.2 压缩备份
4.2.1 调整分区
只备份已使用的空间。进入linux系统,安装并打开GParted
,选择我们插入的SD卡
右键分区,点击卸载
再次右键分区,点击调整大小
鼠标放最右边,向左拖动调整至最小
然后点击”调整大小/移动“,等待完成
4.2.2 备份
回到Windows系统,打开Win32DiskImager
软件,按照”全卡备份“那样,选择”镜像文件“和”设备“,然后勾选上”仅读取已分配分区“,点击”读取“等待完成。
5.恢复系统
打开Win32DiskImager
,”镜像文件“选择之前备份的镜像,”设备“选择要恢复的SD卡,点击”写入“等待完成即可。