SSDs can only tolerate a certain number of writes to each block. And the number is low. I have a 64gb SSD that went into a permanent read-only mode. 64gb is still today a very useful capacity. Thus the usefulness is cut short by hardware design deficiencies.
Contrast that with magnetic hard drives which often live beyond the usefulness of their capacity. That is, people toss out working 80mb mechanical drives now because they’re too small to justify the physical space they occupy, not because of premature failure ending the device’s useful life.
Nannying
When an SSD crosses a line whereby the manufacturer considers it unreliable, it goes into a read-only mode which (I believe) is passworded with a key that is not disclosed to consumers. The read-only mode is reasonable as it protects users from data loss. But the problem is the nannying that denies “owners”¹ ultimate control over their own property.
When I try to dd if=/dev/zero of=/dev/mydrive
, dd is lied to and will write zeros all day and report success, but dd
’s instructions are merely ignored and have no effect.
The best fix in that scenario would generally be to tell the drive to erase itself using a special ATA command, like this:
$ hdparm --security-erase $'\0' /dev/sdb
security_password: ""
/dev/sdb:
Issuing SECURITY_ERASE command, password="", user=user
SG_IO: bad/missing sense data, sb[]: 70 00 01 00 00 00 00 0a 00 00 00 00 00 1d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
SG_IO: bad/missing sense data, sb[]: 70 00 0b 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Not sure why my null char got converted to a yen symbol, but as you can see the ATA instruction is blocked.
Here is a take from someone who endorses the nannying. The problem is that there is a presumption on how the drive will be used. Give me a special switch like:
$ hdparm --security-erase $'\0' --I-know-what-I-am-doing-please-let-me-shoot-myself-in-the-foot /dev/sdb
and this is what I would do:
$ dd if=KNOPPIX_V8.2-2018-05-10-EN.iso of=/dev/foo
$ hdparm --make-read-only /dev/foo
When the drive crosses whatever arbitrary line of reliability, it’s of course perfectly reasonable to do one last write operation to control what content is used in read-only mode.
5 years later when a different live distro is needed, it would of course be reasonable to repeat the process. One write every ~5 years would at least keep the hardware somewhat useful in the long term.
¹ “owners” is in scare quotes because of the sensible viewpoint “if you don’t control it, you don’t own it”. We are not in control as a consequence of nannying.
Worth noting that SD cards are much more vulnerable to bit wear than a SATA drive. Very early SATA drives pre-date tech advancements on wear reduction and wear leveling. I seem to recall SATA drives became more resilient and longer lasting -- but still far to short of a lifetime in the end.
SD cards use different technology IIRC. Did they ever get a handle on that? Interesting to know SD cards also have a forced read-only state at EOL, but I guess it must be implemented differently because SD is sdio not SATA.
SDIO is an extension of the SD spec for non-storage devices. AFAIK, the term never referred to the original (storage) protocol.
I have no idea about the implementation but in all devices, drives and OSs I tried, it acted the same as an SD card with the write-protect switch enabled. Obviously a SSD can be maliciously programmed to fake writes or time them out but this was not the case. A quick glance at the incomplete spec does not suggest a write-protect implementation from the SD side. The SD can check a register in the host controller (Cat.C 0x024 bit 19 active LOW) for the notch status but it's not allowed to write into it.