壊れたSSDを修復する(ラズパイ4で)
ブートしなくなった中古ノートPCから問題のSSDを抜いた。それを修復して再利用したい。
前回まで
- 中古ノートPCのmSATAなSSDを交換する(acer Aspire S7 series MS2364)
- mSATAのSSDにUbuntuをインストールする(acer Aspire S7 series MS2364)
新しいSSDにすることでマシンが復活した。
今回
古いSSDを修復して再利用したい。サイズは64GB。
I/F | Size | Date |
---|---|---|
mSATA | 64GB | 2012-10-01 |
ブートしなかった原因はSSDにある。交換したら起動したのだから間違いない。
SSDは物理的に壊れているのか、ソフト的に壊れているのかわからない。とりあえず10年前のものだし物理破損しており不良セクタが出ていないかチェックしてみる。もし不良セクタがあればそれを無視して使うようにする。
必要なもの
- SSD(
acer Aspire S7 series MS2364
に入ってたやつ) - mSATA USB ケース(
ELUTENG MSATA to USB3.0 ケース 5gbps 高速データ転送 MSATA SSDケースアルミ合金製 MSATA USB 変換 外付け ドライブケース 30x30 / 30×50mm 超小型 MSATA ケース USBケーブル付き
)
参考
手順
1. 対象ディスクのデバイスIDを調べる
$ sudo fdisk -l
今回の対象デバイスは以下/dev/sdb1
。
Device Boot Start End Sectors Size Id Type /dev/sdb1 1 125045423 125045423 59.6G ee GPT Partition 1 does not start on physical sector boundary.
全ログ
$ sudo fdisk -l Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram1: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram2: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram3: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram4: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram5: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram6: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram7: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram8: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram9: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram10: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram11: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram12: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram13: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram14: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/ram15: 4 MiB, 4194304 bytes, 8192 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk /dev/sda: 111.8 GiB, 120034121728 bytes, 234441644 sectors Disk model: D Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x15804d4d Device Boot Start End Sectors Size Id Type /dev/sda1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/sda2 532480 234441643 233909164 111.5G 83 Linux GPT PMBR size mismatch (250073599 != 125045423) will be corrected by write. Disk /dev/sdb: 59.6 GiB, 64023257088 bytes, 125045424 sectors Disk model: Generic Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: dos Disk identifier: 0x6c6cc444 Device Boot Start End Sectors Size Id Type /dev/sdb1 1 125045423 125045423 59.6G ee GPT Partition 1 does not start on physical sector boundary.
sudo apt -y install hdparm
$ sudo hdparm -i /dev/sdb | fgrep Model HDIO_GET_IDENTITY failed: Invalid argument
$ sudo hdparm -i /dev/sdb1 | fgrep Model /dev/sdb1: No such file or directory
たぶんマウントできていないせい。対象デバイスは自動マウントしなかった。たぶん壊れているせいだと思う。でも、hdparm
はマウントしないと調査できないっぽい。でも後で使うbadblocks
もアンマウントしないと使えないはず。だったら使わなくていいや。デバイス名がわからなくてもディスクのサイズで特定できるし。
コントロールチップの罠
今回使ったmSATA USBケースのコントロールチップはJMicron
のJMS567
である。これ、ラズパイ4でブートするのにひと工夫いる。
$ lsusb Bus 002 Device 003: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 005: ID 046d:c043 Logitech, Inc. MX320/MX400 Laser Mouse Bus 001 Device 004: ID 1c4f:0027 SiGma Micro Bus 001 Device 003: ID 05e3:0718 Genesys Logic, Inc. IDE/SATA Adapter Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
具体的には/boot/cmdline.txt
の先頭にusb-storage.quirks=152d:0578:u
を追記する必要がある。さもなくばブートしない。
mkdir -p /tmp/work/mnt/boot sudo mount /dev/sdb1 /tmp/work/mnt/boot sudo mousepad /tmp/work/mnt/boot/cmdline.txt
cmdline.txtファイルの先頭に以下を追記する。末尾にはスペースを1ついれて後続のコマンドとつながらないよう区切ること。また、改行しないこと。
usb-storage.quirks=152d:0578:u
保存したらMousePadを終了する。
つぎにアンマウントする。
sudo umount /tmp/work/mnt/boot
対象デバイス/dev/sdb
がどこにもマウントされていないことを確認する。
$ lsblk -p NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT /dev/sda 8:0 0 111.8G 0 disk ├─/dev/sda1 8:1 0 256M 0 part /boot └─/dev/sda2 8:2 0 111.5G 0 part / /dev/sdb 8:16 0 59.6G 0 disk ├─/dev/sdb1 8:17 0 256M 0 part └─/dev/sdb2 8:18 0 3.5G 0 part
最後にケースのUSBをはずす。
これでブートするOS完成。5Gbps(非UASP)として接続する。
2. 不良セクタを調べる
10分くらいで終わった。(64GB mSATA SSD)
sudo badblocks -v -s /dev/sdb -o /tmp/badblocks.txt
失敗ログ
デバイスに番号をつけると失敗した。
time sudo badblocks -v -s /dev/sdb1 -o /tmp/badblocks.txt
エラー。
badblocks: そのようなファイルやディレクトリはありません while trying to determine device size
英語だと以下。
badblocks: No such file or directory while trying to determine device size
sdb1
でなくsdb
のように番号をとりのぞくと成功した。
もし不良セクタがあればテキストファイルに何か出力されるはず。
確認してみたが、ファイルサイズはゼロであり、内容は何も書き込まれていなかった。
$ cat /tmp/badblocks.txt
つまり不良セクタなし。
物理的に壊れていたわけではなかったようだ。
3. 不良セクタをマーキングする
これで不良セクタを使わないようにする。でも、不良セクタがなかったので今回は不要。
e2fsck -l /tmp/badblocks.txt /dev/sdb1
4. OSを書き込む
ダウンロード。
cd /home/pi/root/in/os sudo apt install -y aria2 time aria2c -x10 https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2021-05-28/2021-05-07-raspios-buster-armhf.zip
書き込む。
IMG=2021-05-07-raspios-buster-armhf.zip DEV=/dev/sdb time unzip -p "$IMG" | sudo dd of=$DEV bs=4M conv=fsync
2分くらいで終わった。
0+59559 レコード入力 0+59559 レコード出力 3980394496 bytes (4.0 GB, 3.7 GiB) copied, 109.427 s, 36.4 MB/s real 1m49.722s user 1m0.486s sys 0m30.309s