====== メモ:FreeBSDでESPが壊れる問題の調査 ======
NVMe SSD上に確保したESPが、当初は問題ないのに何らかのタイミングで不具合が発生し、ESPとして認識されなくなる問題の調査記録。
diskinfo
$ diskinfo -v /dev/nvd0
/dev/nvd0
4096 # sectorsize
960197124096 # mediasize in bytes (894G)
234423126 # mediasize in sectors
0 # stripesize
0 # stripeoffset
SAMSUNG MZQLB960HAJR-00007 # Disk descr.
S437NY0KCxxxxx # Disk ident.
Yes # TRIM/UNMAP support
0 # Rotation rate in RPM
$ sudo diskinfo -v /dev/nvme0ns1
/dev/nvme0ns1
4096 # sectorsize
960197124096 # mediasize in bytes (894G)
234423126 # mediasize in sectors
0 # stripesize
0 # stripeoffset
No # TRIM/UNMAP support
Unknown # Rotation rate in RPM
$ sudo diskinfo -v /dev/nvd0p1
/dev/nvd0p1
4096 # sectorsize
536870912 # mediasize in bytes (512M)
131072 # mediasize in sectors
0 # stripesize
24576 # stripeoffset
8 # Cylinders according to firmware.
255 # Heads according to firmware.
63 # Sectors according to firmware.
SAMSUNG MZQLB960HAJR-00007 # Disk descr.
S437NY0KCxxxxx # Disk ident.
Yes # TRIM/UNMAP support
0 # Rotation rate in RPM
S.M.A.R.T.
$ sudo smartctl -a /dev/nvme0ns1
smartctl 7.0 2018-12-30 r4883 [FreeBSD 12.1-RELEASE-p3 amd64] (local build)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Number: SAMSUNG MZQLB960HAJR-00007
Serial Number: S437NY0KCxxxxx
Firmware Version: EDA5202Q
PCI Vendor/Subsystem ID: 0x144d
IEEE OUI Identifier: 0x002538
Total NVM Capacity: 960,197,124,096 [960 GB]
Unallocated NVM Capacity: 0
Controller ID: 4
Number of Namespaces: 1
Namespace 1 Size/Capacity: 960,197,124,096 [960 GB]
Namespace 1 Utilization: 201,605,705,728 [201 GB]
Namespace 1 Formatted LBA Size: 4096
Local Time is: Sun Oct 18 11:31:24 2020 JST
Firmware Updates (0x17): 3 Slots, Slot 1 R/O, no Reset required
Optional Admin Commands (0x000f): Security Format Frmw_DL NS_Mngmt
Optional NVM Commands (0x001f): Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat
Maximum Data Transfer Size: 512 Pages
Warning Comp. Temp. Threshold: 87 Celsius
Critical Comp. Temp. Threshold: 88 Celsius
Namespace 1 Features (0x02): NA_Fields
Supported Power States
St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat
0 + 10.60W - - 0 0 0 0 0 0
Supported LBA Sizes (NSID 0x1)
Id Fmt Data Metadt Rel_Perf
0 - 512 0 0
1 + 4096 0 0
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02)
Critical Warning: 0x00
Temperature: 43 Celsius
Available Spare: 100%
Available Spare Threshold: 10%
Percentage Used: 0%
Data Units Read: 2,313,153 [1.18 TB]
Data Units Written: 22,720,897 [11.6 TB]
Host Read Commands: 57,512,115
Host Write Commands: 627,513,504
Controller Busy Time: 306
Power Cycles: 418
Power On Hours: 10,471
Unsafe Shutdowns: 395
Media and Data Integrity Errors: 0
Error Information Log Entries: 6
Warning Comp. Temperature Time: 0
Critical Comp. Temperature Time: 0
Temperature Sensor 1: 43 Celsius
Temperature Sensor 2: 47 Celsius
Temperature Sensor 3: 54 Celsius
gpart
> gpart show nvd0
=> 6 234423115 nvd0 GPT (894G)
6 131072 1 efi (512M)
131078 26214400 2 freebsd-zfs (100G)
26345478 4194304 3 freebsd-zfs (16G)
30539782 4194304 4 freebsd-zfs (16G)
34734086 2097152 5 freebsd-zfs (8.0G)
36831238 162529280 6 freebsd-zfs (620G)
199360518 23592960 7 freebsd-zfs (90G)
222953478 7864320 8 freebsd-zfs (30G)
230817798 3605323 - free - (14G)
ESPをゼロフィル
$ sudo dd if=/dev/zero of=/dev/nvd0p1 bs=4096
dd: /dev/nvd0p1: end of device
131073+0 records in
131072+0 records out
536870912 bytes transferred in 4.088874 secs (131300437 bytes/sec)
$ sudo dd if=/dev/nvd0p1 of=/usr/home/Decomo/nvd0p1_esp_zero_filled.raw bs=4096
131072+0 records in
131072+0 records out
536870912 bytes transferred in 6.493961 secs (82672331 bytes/sec)
$ cat ~/nvd0p1_esp_zero_filled.raw | tr -d '\0' | read -n 1 || echo "All zeroes."
All zeroes.
ESPを作る
$ sudo newfs_msdos -F 32 -S 4096 -c 1 nvd0p1
/dev/nvd0p1: 130812 sectors in 130812 FAT32 clusters (4096 bytes/cluster)
BytesPerSec=4096 SecPerClust=1 ResSectors=4 FATs=2 Media=0xf0 SecPerTrack=63 Heads=255 HiddenSecs=0 HugeSectors=131072 FATsecs=128 RootCluster=2 FSInfo=1 Backup=2
$ mkdir /tmp/esp
$ sudo mount -t msdosfs /dev/nvd0p1 /tmp/esp
$ mkdir -p /tmp/esp/efi/boot
$ cp /boot/boot1.efi /tmp/esp/efi/boot/BOOTx64.efi
$ echo 'BOOTx64.efi' >> /tmp/esp/efi/boot/startup.nsh
$ sync
$ sync
$ sync
$ sudo umount /tmp/esp
$ dd if=/dev/nvd0p1 of=/usr/home/Decomo/nvd0p1_esp_created.raw bs=4096
131072+0 records in
131072+0 records out
536870912 bytes transferred in 6.256422 secs (85811175 bytes/sec)
$ cat ~/nvd0p1_esp_created.raw | tr -d '\0' | read -n 1 || echo "All zeroes."
tr: Illegal byte sequence
All zeroes.
イメージのsha1
$ sha1 ~/nvd0p1_esp_zero_filled.raw ~/nvd0p1_esp_created.raw
SHA1 (/home/Decomo/nvd0p1_esp_zero_filled.raw) = 5b088492c9f4778f409b7ae61477dec124c99033
SHA1 (/home/Decomo/nvd0p1_esp_created.raw) = c17a73829890d552305af69bdc1ab2321e1f081d
再起動1回目後のイメージ
$ sudo dd if=/dev/nvd0p1 of=/usr/home/Decomo/nvd0p1_esp_reboot_20201018.raw bs=4096
131072+0 records in
131072+0 records out
536870912 bytes transferred in 6.461511 secs (83087514 bytes/sec)
$ sha1 ~/nvd0p1_esp_reboot_20201018.raw
SHA1 (/home/Decomo/nvd0p1_esp_reboot_20201018.raw) = c17a73829890d552305af69bdc1ab2321e1f081d