やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

壊れたSSDを修復する(ラズパイ4で)

 ブートしなくなった中古ノートPCから問題のSSDを抜いた。それを修復して再利用したい。

前回まで

 新しいSSDにすることでマシンが復活した。

今回

 古いSSDを修復して再利用したい。サイズは64GB。

I/F Size Date
mSATA 64GB 2012-10-01

 ブートしなかった原因はSSDにある。交換したら起動したのだから間違いない。

 SSDは物理的に壊れているのか、ソフト的に壊れているのかわからない。とりあえず10年前のものだし物理破損しており不良セクタが出ていないかチェックしてみる。もし不良セクタがあればそれを無視して使うようにする。

必要なもの

  • SSDacer Aspire S7 series MS2364に入ってたやつ)
  • mSATA USB ケース(ELUTENG MSATA to USB3.0 ケース 5gbps 高速データ転送 MSATA SSDケースアルミ合金製 MSATA USB 変換 外付け ドライブケース 30x30 / 30×50mm 超小型 MSATA ケース USBケーブル付き

f:id:ytyaru:20210725153401j:plainf:id:ytyaru:20210725153405j:plain

参考

手順

  1. 対象ディスクのデバイスIDを調べる
  2. 不良セクタを調べる
  3. 不良セクタをマーキングする

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.

hdparmコマンドでデバイス名取得できなかった  参考先にはhdparmコマンドでデバイス名などを取得できるとあった。しかし私の環境ではできなかった。

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ケースのコントロールチップはJMicronJMS567である。これ、ラズパイ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