Intel SSD 8MB bug に遭遇して困る

2018-07-21 の 鹿児島Linux勉強会 2018.07 で発表したものに少し加筆修正したものです.

一昨日 Intel SSD 8MBバグに遭遇><

  • 多分cpufreqの設定が甘くて離席時にCPUの熱でpoweroff
  • 起動しなくなった
  • BIOSからはSSD見える
  • 別メディアで起動するとfdisk -l で総容量 8MB

8MB bug

  • 一部のIntel SSDにあるバグ(今回はINTEL SSDSA2CW600G3)
  • 強制電源断時などに発症?
  • 8MBの容量しか見えない&使えない
  • データは救えない
  • secure eraseでとりあえず復活(データは消える)
  • 2011年の話なので最近該当デバイス使っている人は少ないと思う

8MBのdiskとして使ってみる……

普通に8MBのdiskとして利用できる.

$ sudo fdisk /dev/sdc
$ sudo fdisk -l /dev/sdc
ディスク /dev/sdc: 8 MiB, 8388608 バイト, 16384 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xa3850bcb
 
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sdc1 16 16383 16368 8M 83 Linux
$ sudo /sbin/mkfs.ext4 /dev/sdc1
$ sudo cp /boot/config-`uname -r` /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
$ ls -la /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
合計 229
drwxr-xr-x 3 root root 1024 8月 23 20:13 .
drwxr-x---+ 3 root root 4096 8月 23 20:11 ..
-rw-r--r-- 1 root root 216860 8月 23 20:13 config-4.15.0-32-generic
drwx------ 2 root root 12288 8月 23 20:11 lost+found
$ df /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdc1 6899 289 6038 5% /media/mk/4a42767f-18bc-4250-9266-e61d41a47260
$ dd if=/dev/zero bs=4M | pv | sudo dd of=/media/mk/4a42767f-18bc-4250-9266-e61d41a47260/all
dd: '/media/mk/4a42767f-18bc-4250-9266-e61d41a47260/all' に書き込み中です: デバイスに空き領域がありません
12895+0 レコード入力
12894+0 レコード出力
6601728 bytes (6.6 MB, 6.3 MiB) copied, 0.0772058 s, 85.5 MB/s
6.36MiB 0:00:00 [73.4MiB/s] [ <=> ]
$ ls -la /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
合計 6676
drwxr-xr-x 3 root root 1024 8月 23 20:14 .
drwxr-x---+ 3 root root 4096 8月 23 20:11 ..
-rw-r--r-- 1 root root 6601728 8月 23 20:14 all
-rw-r--r-- 1 root root 216860 8月 23 20:13 config-4.15.0-32-generic
drwx------ 2 root root 12288 8月 23 20:11 lost+found
$ df /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdc1 6899 6736 0 100% /media/mk/4a42767f-18bc-4250-9266-e61d41a47260

8MB bug 対処

  • secure erase により元の容量に復旧
  • もちろんデータは救えない……

secure erase の用意

$ sudo apt update
$ sudo apt install hdparm

状態確認

$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 8 MiB, 8388608 bytes, 16384 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

8MB><

$ sudo hdparm -I /dev/sdb
 
/dev/sdb:
 
ATA device, with non-removable media
        Model Number:       INTEL SSDSA2CW600G3
        Serial Number:      BAD_CTX     0000013F
        Firmware Revision:  4PC10362
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6
Standards:
        Used: unknown (minor revision code 0x0029)
        Supported: 8 7 6 5
        Likely used: 8
Configuration:
        Logical         max     current
        cylinders       16383   256
        heads           16      1
        sectors/track   63      63
        --
        CHS current addressable sectors:       16128
        LBA    user addressable sectors:       16384
        LBA48  user addressable sectors:       16384
        Logical  Sector size:                   512 bytes
        Physical Sector size:                   512 bytes
        device size with M = 1024*1024:           8 MBytes
        device size with M = 1000*1000:           8 MBytes
        cache/buffer size  = unknown
        Nominal Media Rotation Rate: Solid State Device
Capabilities:
        LBA, IORDY(can be disabled)
        Standby timer values: spec'd by Standard, no device specific minimum
        R/W multiple sector transfer: Max = 16  Current = 16
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4
             Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    NOP cmd
           *    DOWNLOAD_MICROCODE
                SET_MAX security extension
           *    48-bit Address feature set
           *    Device Configuration Overlay feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    General Purpose Logging feature set
           *    WRITE_{DMA|MULTIPLE}_FUA_EXT
           *    64-bit World wide name
           *    IDLE_IMMEDIATE with UNLOAD
           *    WRITE_UNCORRECTABLE_EXT command
           *    {READ,WRITE}_DMA_EXT_GPL commands
           *    Segmented DOWNLOAD_MICROCODE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Phy event counters
           *    Software settings preservation
           *    SMART Command Transport (SCT) feature set
           *    SCT Write Same (AC2)
           *    SCT Error Recovery Control (AC3)
           *    SCT Features Control (AC4)
           *    SCT Data Tables (AC5)
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
                frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 500151795957940c
        NAA             : 5
        IEEE OUI        : 001517
        Unique ID       : 95957940c
Checksum: correct

症状

  • Serial Number: BAT_CTX
    8MBバグ中
        Serial Number:      BAD_CTX     0000013F
  • Security: frozen
    frozen状態ではこれ以上操作できないので解除の必要がある
                frozen

frozen 状態を解除

  • 起動した状態のまま SSD のデータケーブルを物理的に切断,接続
    LENOVO ThinkPad X201i / T430s(NotePC)ではデータケーブルだけの切断は出来ず,電源も同時に切断,接続したがOKだった.

    or

  • サスペンド,レジュームを行う
    LENOVO ThinkPad X201i / T430s(NotePC)で問題なかった.
    $ sudo sh -c "echo mem > /sys/power/state"

  • hdparm コマンドで not frozen になるっているのを確認

$ sudo hdparm -I /dev/sdb
   :
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
   :

SSDにパスワードを設定

  • 一時的なパスワード(secure eraseで消去される)だが次の手順で必要なのでメモしておく
    ここでは SOMEPASS
$ sudo hdparm --user-master u --security-set-pass SOMEPASS /dev/sdb

パスワードを解除する場合は以下のように一旦アンロックしてから解除する

$ sudo hdparm --user-master u --security-unlock SOMEPASS /dev/sdb
$ sudo hdparm --user-master u --security-disable SOMEPASS /dev/sdb

パスワードがわからなくなった場合メーカ規定値のマスターパスワードで解除できる場合がある.
その場合 --user-master m とマスターパスワードを指定する

再度ドライブの状態を確認

  • Securityセクションが以下のようにnot enabled から enabled になっていること
$ sudo hdparm -I /dev/sdb
   :
Security:
        Master password revision code = 65534
                supported
                enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
   :

Secure Erase

  • データの消去を行う
$ sudo hdparm -–user-master u –-security-erase-enhanced SOMEPASS /dev/sdb
  • うまく行かない場合( hdparmでsupported: enhanced eraseが無い場合 )以下のコマンドを試す
$ sudo hdparm --user-master u --security-erase SOMEPASS /dev/sdb

※–-security-erase-enhanced は代替処理された不良セクタも消去される.対応している場合こちらを使ったほうが確実にデータ消去が行える.

エラー

USB変換アダプタ経由の場合以下のようなエラーとなった.

$ sudo hdparm --user-master u --security-erase SOMEPASS /dev/sdb
security_password: "SOMEPASS"
 
/dev/sdb:
 Issuing SECURITY_ERASE command, password="SOMEPASS", user=user
The running kernel lacks CONFIG_IDE_TASK_IOCTL support for this device.
SECURITY_ERASE: Invalid argument

恐らくUSB変換部分で全ての機能がサポートされていないせい.
この状態でSATA接続すると起動時にHDD PASSWORDを尋ねられる.しかし,--security-set-passで設定したパスワードでは通らない.一旦USB変換アダプタに戻し,--security-disable でパスワードを消去した後SATA接続で再度やり直したらうまく行った.

hdparmコマンドで確認

  • Serial Number が正しくなっている :)
  • もちろん600GB全領域利用できる
$ sudo hdparm -I /dev/sdb
 
/dev/sdb:
 
ATA device, with non-removable media
        Model Number:       INTEL SSDSA2CW600G3
        Serial Number:      CVPR1206005W600FGN
        Firmware Revision:  4PC10362
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6
    :

これでとりあえず復活

SSD の寿命確認

フラッシュメモリー自体はまだ健康に見える

$ sudo smartctl --all /dev/sda |grep -E '232|233'
232 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   100   100   000    Old_age   Always       -       0
E8 Available Reserved Space Normalized 10 予約領域の残っている数を表す。正規化した (Normalized) 値は、100 パーセントを表す 100 から始 まる。正常の範囲は 10 パーセントまで。
E9 Media Wearout Indicator Normalized 記録メディアであるフラッシュメモリーの使い込んだ程度 を表す。平均消去回数が増えるにつれ、正規化した (Normalized) 値が 100 から 1 へ減少していく。

再発防止(完全ではない)

  • firmwareを最新にする
  • 以下のページから入手する
    FirmwareUpdateTool_v3_0_1.zipissdfut_64_3.0.1.iso が入手可能
    前者の中にはドキュメントと後者のisoファイルが含まれていた

  • mkusb で USB memory に書き込んで起動

  • LENOVO T430s では起動に失敗した
  • LENOVO X201i では正常起動
  • 実際にアップデートできるかはもともと最新だったので未確認

最新のファームウェアバージョンは以下のページで確認できる

なお,最新にしてもこのバグは再発する可能性がある……(実際最新fwで2回このbugが発生した)

これ以上は,

  • バックアップをこまめに取る
  • サスペンドなどを行わない
  • なるべく電源のon/offを行わない
  • 安定した電源を利用する
  • バックアップをこまめに取る
  • バックアップをこまめに取る
  • バックアップをこまめに取る

現在はデイリーバックアップだけでなく /home は Lsyncd + rsync している

根本的な対処

SSDを交換する
TLCだと大分安い

その後

1月ほどで再発したorz
2回目は利用中に急にdiskが見えなくなったX201s/X220/X200で何年も使っていて起こらず,T430sにSSDを差し替えてから立て続けに起こっているのでマシンとの相性もありそう.

参考URL

HDDのS.M.A.R.Tから温度を取得して表示してくれるhddtemp

hddtempというコマンドを知りました.熱いし熱が気になる時期だしお手軽に温度を知れるのは良さそうと試してみました.

導入

$ sudo apt install hddtemp

help

$ hddtemp -h
 Usage: hddtemp [OPTIONS] [TYPE:]DISK1 [[TYPE:]DISK2]...
 
   hddtemp displays the temperature of drives supplied in argument.
   Drives must support S.M.A.R.T.
 
  TYPE could be SATA, PATA or SCSI. If omitted hddtemp will try to guess.
 
  -b   --drivebase   :  display database file content that allow hddtemp to
                        recognize supported drives.
  -D   --debug       :  display various S.M.A.R.T. fields and their values.
                        Useful to find a value that seems to match the
                        temperature and/or to send me a report.
                        (done for every drive supplied).
  -d   --daemon      :  run hddtemp in TCP/IP daemon mode (port 7634 by default.)
  -f   --file=FILE   :  specify database file to use.
  -F   --foreground  :  don't daemonize, stay in foreground.
  -l   --listen=addr :  listen on a specific interface (in TCP/IP daemon mode).
  -n   --numeric     :  print only the temperature.
  -p   --port=#      :  port to listen to (in TCP/IP daemon mode).
  -s   --separator=C :  separator to use between fields (in TCP/IP daemon mode).
  -S   --syslog=s    :  log temperature to syslog every s seconds.
  -u   --unit=[C|F]  :  force output temperature either in Celsius or Fahrenheit.
  -q   --quiet       :  do not check if the drive is supported.
  -v   --version     :  display hddtemp version number.
  -w   --wake-up     :  wake-up the drive if need.
  -4                 :  listen on IPv4 sockets only.
  -6                 :  listen on IPv6 sockets only.
 
Report bugs or new drives to <hddtemp@guzu.net>.
hddtemp version 0.3-beta15

デバイスを指定すると温度が取得できます./dev/sd[a-z]とか/dev/sd?とかも使えました.
/dev/sdd, /dev/sdeはS.M.A.R.Tを使えないUSBアダプタ経由で繋いでいるので取得できませんでした.

$ sudo hddtemp /dev/sda
/dev/sda: VB0250EAVER: 37°C
$ sudo hddtemp /dev/sda /dev/sdb
/dev/sda: VB0250EAVER: 38°C
/dev/sdb: Hitachi HDS5C3030ALA630: 39°C
$ sudo hddtemp /dev/sd?
/dev/sda: VB0250EAVER: 37°C
/dev/sdb: Hitachi HDS5C3030ALA630: 37°C
/dev/sdc: WDC WD30EZRX-00MMMB0: 40°C
/dev/sdd: WDC WD30EZRX-00DC0B0: S.M.A.R.T. not available
/dev/sde: TOSHIBA DT01ACA300: S.M.A.R.T. not available

デーモン化もできます.tcp 7634にアクセスると値が取得できます.

$ sudo hddtemp -d /dev/sda
$ nc localhost 7634
|/dev/sda|VB0250EAVER|37|C|

停止

$ pgrep hddtemp
11832
$ sudo kill 11832

複数デバイスも行けるけどそのままでは見にくいですね.

$ sudo hddtemp -d /dev/sd?
$ nc localhost 7634
|/dev/sda|VB0250EAVER|38|C||/dev/sdb|Hitachi HDS5C3030ALA630|39|C||/dev/sdc|WDC WD30EZRX-00MMMB0|41|C||/dev/sdd|WDC WD30EZRX-00DC0B0|NA|*||/dev/sde|TOSHIBA DT01ACA300|NA|*|
$ nc localhost 7634|sed -e 's/||/|\n|/g'
|/dev/sda|VB0250EAVER|37|C|
|/dev/sdb|Hitachi HDS5C3030ALA630|38|C|
|/dev/sdc|WDC WD30EZRX-00MMMB0|40|C|
|/dev/sdd|WDC WD30EZRX-00DC0B0|NA|*|
|/dev/sde|TOSHIBA DT01ACA300|NA|*|

S.M.A.R.Tの値を元にしているのでこのツールを使わず大抵の環境で入っているsmartctlでも良い気もします.

$ sudo smartctl -a /dev/sda|grep -i temp
190 Airflow_Temperature_Cel 0x0022   063   056   045    Old_age   Always       -       37 (Min/Max 31/43)
194 Temperature_Celsius     0x0022   037   044   000    Old_age   Always       -       37 (0 11 0 0 0)

環境

$ lsb_release -d
Description:    Ubuntu 16.04.4 LTS
$ uname -m
x86_64
$ dpkg-query -W hddtemp smartmontools
hddtemp 0.3-beta15-52
smartmontools   6.4+svn4214-1

Btrfsでdfで空き容量があるように見えるのに容量が無いと言われてreadonlyにされてしまう

最近Btrfsで利用中にroにされてしまうという症状が起きます.
こんな感じで怒られてroになる.
dfは87%とかで未だ空きはあるように見える.
/に使ってるとこでremount,rwも効かず再起動しないと戻せず辛い.

[ 2196.878532] BTRFS: error (device dm-1) in btrfs_truncate_inode_items:4647: errno=-28 No space left
[ 2196.878537] BTRFS info (device dm-1): forced readonly
[ 2196.881248] BTRFS error (device dm-1): pending csums is 1241088

FAQだったようでここを参照しながら

別のsystemで確認してbtrfs fi balance start -dusage=5を叩いてみました.

$ sudo btrfs fi show
Label: none uuid: e54de82f-1fdb-4f9a-b529-0952b0ea3454
        Total devices 1 FS bytes used 465.89GiB
        devid 1 size 542.28GiB used 542.28GiB path /dev/mapper/x220--vg-root

$ sudo mount -o ro /dev/mapper/x220--vg-root /mnt
$ sudo btrfs fi df /mnt
Data, single: total=538.27GiB, used=462.41GiB
System, single: total=4.00MiB, used=80.00KiB
Metadata, single: total=4.01GiB, used=3.48GiB
GlobalReserve, single: total=512.00MiB, used=0.00B
$ sudo btrfs fi balance start -dusage=5 /mnt
ERROR: error during balancing '/mnt': Read-only file system
There may be more info in syslog - try dmesg | tail
$ sudo mount -o remount,rw /mnt
$ sudo btrfs fi balance start -dusage=5 /mnt
Done, had to relocate 0 out of 546 chunks

しかしあまり変わらず暫く利用しているとまたエラーに.しかし今度はdisk fullと怒られるけどroにはならなかったです.以下のページによると,

This means the bigger the -dusage value, the more work balance will have to do (i.e. taking fuller and fuller blocks and trying to free them up by putting their data elsewhere). Also, if your FS is 55% full, using -dusage=55 is ok, but there isn’t a 1 to 1 correlation and you’ll likely be ok with a smaller dusage number, so start small and ramp up as needed.

ということで-dusage=90にしてみると結構空いた感じです.
上の方では別systemで起動して実行しましたが,オンラインでも大丈夫でした.但し処理中はかなり重くなります.そして処理に200分程かかりました.

$ sudo btrfs fi balance start -dusage=90 /
Done, had to relocate 186 out of 530 chunks
$ sudo btrfs fi show
Label: none  uuid: e54de82f-1fdb-4f9a-b529-0952b0ea3454
        Total devices 1 FS bytes used 446.08GiB
        devid    1 size 542.28GiB used 449.27GiB path /dev/mapper/x220--vg-root

この後数GBのデータを書いてみたり溜まっていたapt upgradeとかしてみましたが今のところ大丈夫そうです.
ちなみにこのfsがあるSSD(INTEL SSDSA2CW600G3)も長く使っているのでそっちも心配だったのですが,smartctl-t longしたり-aの以下のあたり見る感じでは未だ行けそう?

9 Power_On_Hours 0x0032 100 100 000 Old_age Always – 36565
228 Workload_Minutes 0x0032 100 100 000 Old_age Always – 2193912
232 Available_Reservd_Space 0x0033 100 100 010 Pre-fail Always – 0
233 Media_Wearout_Indicator 0x0032 095 095 000 Old_age Always – 0

#適当なとこでsecure eraseしておきたい…….