SSD overprovisioning z hdparm

Z Thomas-Krenn-Wiki
Przejdź do nawigacji Przejdź do wyszukiwania

Dyski Solid State Drive (SSDs) posiadają tak zwaną spare area - obszar na dysku, który nie jest bezpośrednio widoczny dla systemu operacyjnego. Spare area wykorzystywana jest między innymi do wear leveling-u. Zwiększenie spare area (overprovisioning) może zwiększyć wydajność dysku i wydłużyć jego żywotność. Ten artykuł pokazuje procedurę zwiększenia spare area z hdparm w Linuksie poprzez aktywację host protected area (ATA8-ACS SET MAX ADDRESS). Pojemność netto dysku SSD, która może zostać wykorzystana ulega w ten sposób zmniejszeniu. Alternatywne metody overprovisioningu i dalsze informacje zawarte są we fragmencie spare area artykułu o dyskach SSD.

Przygotowanie

Przed zwiększeniem spare area muszą zostać skasowane wszystkie bloki dysku SSD. Tylko w ten sposób kontroler dysku SSD może wykorzystać niewidoczne bloki do wear leveling-u.

Wszystkie bloki dysku SSD są skasowane, gdy

Aktywacja Host Protected Area

Uwaga: Aktywacja host protected area powinna być przeprowadzana tylko na dyskach SSD nie zawierających danych, inaczej ulegną one utracie.

W normalnym stanie Host Protected Area (HPA) jest nieaktywna. W ten sposób dysk SSD wskazuje normalną pojemność netto (pokazuje ilość sektorów 512 Byte), w tym przykładzie dysk SSD Intel serii 320 160 GB:

root@ubuntu-10-10:~# hdparm -N /dev/sdb

/dev/sdb:
 max sectors   = 312581808/312581808, HPA is disabled
root@ubuntu-10-10:~# 

Te 312.581.808 sektorów * 512 Byte odpowiada dokładnie 160.041.885.696 Byte, a więc normalnej pojemności netto tego dysku SSD.

hdparm -Np aktywuje host protected area. Przy czym podawana jest ilość widocznych sektorów. Jako kolejne parametry konieczne są opcje --yes-i-know-what-i-am-doing i devicename:

root@ubuntu-10-10:~# hdparm -Np281323627 /dev/sdb

/dev/sdb:
 setting max visible sectors to 281323627 (permanent)
Use of -Nnnnnn is VERY DANGEROUS.
You have requested reducing the apparent size of the drive.
This is a BAD idea, and can easily destroy all of the drive's contents.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.
root@ubuntu-10-10:~# hdparm -Np281323627 --yes-i-know-what-i-am-doing /dev/sdb

/dev/sdb:
 setting max visible sectors to 281323627 (permanent)
 max sectors   = 281323627/312581808, HPA is enabled

root@ubuntu-10-10:~# 

Kolejne hdparm -N potwierdza aktywowane HPA:

root@ubuntu-10-10:~# hdparm -N /dev/sdb

/dev/sdb:
 max sectors   = 281323627/312581808, HPA is enabled
root@ubuntu-10-10:~# 

Problem HPA unlocked

Liczne dystrybucje Linuksa mają aktywny parametr libata ignore_hpa.[1] W ten sposób HPA zostaje deaktywowane przy kolejnym uruchomieniu albo hot-plug (przy eSATA), co może prowadzić do wielu problemów. [2]

Czy ignore_hpa jest aktywne, może zostać sprawdzone poniższą komendą:

cat /sys/module/libata/parameters/ignore_hpa

Jeżeli wynikiem jest "1", to natychmiast po podłączeniu dysku SSD, HPA jest automatycznie wyłączane. Niestępujący przykład pokazuje /var/log/messages w Ubuntu 10.10, dysk SSD jest podłączony przez eSATA. Czwarty wiersz pokazuje wyłączone HPA (HPA unlocked):

Jun  1 10:07:17 ubuntu-10-10 kernel: [  116.644752] ata6: hard resetting link
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.583941] ata6: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.584645] ata6.00: ACPI cmd f5/00:00:00:00:00:a0 (SECURITY FREEZE LOCK) filtered out
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.606303] ata6.00: HPA unlocked: 281323627 -> 312581808, native 312581808
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.606310] ata6.00: ATA-8: INTEL SSDSA2CW160G3, 4PC10302, max UDMA/133
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.606314] ata6.00: 312581808 sectors, multi 1: LBA48 NCQ (depth 31/32)
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.607145] ata6.00: ACPI cmd f5/00:00:00:00:00:a0 (SECURITY FREEZE LOCK) filtered out
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.607576] ata6.00: configured for UDMA/133
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.608514] ata6.00: configured for UDMA/133
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.608522] ata6: EH complete
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.608699] scsi 5:0:0:0: Direct-Access     ATA      INTEL SSDSA2CW16 4PC1 PQ: 0 ANSI: 5
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.608953] sd 5:0:0:0: Attached scsi generic sg2 type 0
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.608992] sd 5:0:0:0: [sdb] 312581808 512-byte logical blocks: (160 GB/149 GiB)
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.609079] sd 5:0:0:0: [sdb] Write Protect is off
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.609128] sd 5:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.609373]  sdb:
Jun  1 10:07:18 ubuntu-10-10 kernel: [  117.610090] sd 5:0:0:0: [sdb] Attached SCSI disk

Dotyczy systemów Linux

Zachowanie to występuje w licznych dystrybucjach Linuksa, np.:

  • Ubuntu 10.10

Patch od Tejun Heo (z on-demand HPA unlocking) rozwiązuje ten problem.[3][4] W nowszych jądrach i dystrybucjach Linuksa patch ten jest już zintegrowany, np.

  • Ubuntu 11.04

W Ubuntu 11.04 funkcjonuje HPA (HPA detected):

root@ubuntu:~# tail -f /var/log/kern.log
Jun  1 08:54:32 ubuntu kernel: [  213.433902] ata7: exception Emask 0x10 SAct 0x0 SErr 0x4050000 action 0xe frozen
Jun  1 08:54:32 ubuntu kernel: [  213.433909] ata7: irq_stat 0x00400040, connection status changed
Jun  1 08:54:32 ubuntu kernel: [  213.433914] ata7: SError: { PHYRdyChg CommWake DevExch }
Jun  1 08:54:32 ubuntu kernel: [  213.433926] ata7: hard resetting link
Jun  1 08:54:32 ubuntu kernel: [  214.182197] ata7: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Jun  1 08:54:32 ubuntu kernel: [  214.182631] ata7.00: HPA detected: current 281323627, native 312581808
Jun  1 08:54:32 ubuntu kernel: [  214.182640] ata7.00: ATA-8: INTEL SSDSA2CW160G3, 4PC10302, max UDMA/133
Jun  1 08:54:32 ubuntu kernel: [  214.182645] ata7.00: 281323627 sectors, multi 1: LBA48 NCQ (depth 31/32)
Jun  1 08:54:32 ubuntu kernel: [  214.183140] ata7.00: configured for UDMA/133
Jun  1 08:54:32 ubuntu kernel: [  214.202174] ata7: EH complete
Jun  1 08:54:32 ubuntu kernel: [  214.202317] scsi 6:0:0:0: Direct-Access     ATA      INTEL SSDSA2CW16 4PC1 PQ: 0 ANSI: 5
Jun  1 08:54:32 ubuntu kernel: [  214.202601] sd 6:0:0:0: [sdd] 281323627 512-byte logical blocks: (144 GB/134 GiB)
Jun  1 08:54:32 ubuntu kernel: [  214.202679] sd 6:0:0:0: Attached scsi generic sg4 type 0
Jun  1 08:54:32 ubuntu kernel: [  214.202761] sd 6:0:0:0: [sdd] Write Protect is off
Jun  1 08:54:32 ubuntu kernel: [  214.202768] sd 6:0:0:0: [sdd] Mode Sense: 00 3a 00 00
Jun  1 08:54:32 ubuntu kernel: [  214.202823] sd 6:0:0:0: [sdd] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Jun  1 08:54:32 ubuntu kernel: [  214.203555]  sdd:
Jun  1 08:54:32 ubuntu kernel: [  214.204000] sd 6:0:0:0: [sdd] Attached SCSI disk
^C
root@ubuntu:~# cat /proc/partitions
major minor  #blocks  name

   7        0    1258132 loop0
   8        0  976762584 sda
   8        1   19530752 sda1
   8        2          1 sda2
   8        5    1998848 sda5
   8        6  878905344 sda6
   8       48  140661813 sdd
root@ubuntu:~# fdisk -l /dev/sdd

Disk /dev/sdd: 144.0 GB, 144037697024 bytes
255 heads, 63 sectors/track, 17511 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xafd4e895

   Device Boot      Start         End      Blocks   Id  System
root@ubuntu:~#

Zapobiegniecie automatycznemu wyłączeniu HPA w systemach Linux

Tymczasowo

Tymczasowo ignore_hpa może zostać wyłączone przez sysfs. Ta tymczasowa zmiana jest pomocna w przypadku, gdy dysk SSD z HPA jest podłączony do komputera przez eSATA na krótko. Dyski SSD, które są już podczas uruchomiania maszyny podłączone wymagają trwałego rozwiązania (vide poniżej). Tymczasowe ustawienia pozostają aktywne tylko do następnego restartu:

root@ubuntu-10-10:~# cd /sys/module/libata/parameters
root@ubuntu-10-10:/sys/module/libata/parameters# cat ignore_hpa 
1
root@ubuntu-10-10:/sys/module/libata/parameters# echo 0 > ignore_hpa 
root@ubuntu-10-10:/sys/module/libata/parameters# cat ignore_hpa 
0
root@ubuntu-10-10:/sys/module/libata/parameters#

HPA jest poprawnie wykorzystywane (HPA detected: current 281323627, native 312581808):

Jun  1 11:20:13 ubuntu-10-10 kernel: [   70.824850] ata6: hard resetting link
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.764776] ata6: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.765573] ata6.00: ACPI cmd f5/00:00:00:00:00:a0 (SECURITY FREEZE LOCK) filtered out
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.765980] ata6.00: HPA detected: current 281323627, native 312581808
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.765989] ata6.00: ATA-8: INTEL SSDSA2CW160G3, 4PC10302, max UDMA/133
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.765993] ata6.00: 281323627 sectors, multi 1: LBA48 NCQ (depth 31/32)
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.766845] ata6.00: ACPI cmd f5/00:00:00:00:00:a0 (SECURITY FREEZE LOCK) filtered out
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.767284] ata6.00: configured for UDMA/133
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.768148] ata6.00: configured for UDMA/133
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.768157] ata6: EH complete
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.768374] scsi 5:0:0:0: Direct-Access     ATA      INTEL SSDSA2CW16 4PC1 PQ: 0 ANSI: 5
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.768663] sd 5:0:0:0: [sdb] 281323627 512-byte logical blocks: (144 GB/134 GiB)
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.768679] sd 5:0:0:0: Attached scsi generic sg2 type 0
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.768772] sd 5:0:0:0: [sdb] Write Protect is off
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.768807] sd 5:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.769104]  sdb:
Jun  1 11:20:14 ubuntu-10-10 kernel: [   71.770897] sd 5:0:0:0: [sdb] Attached SCSI disk

Trwale

W zależności czy libata jest skompilowane w jądrze lub dostępne jako moduł, ignore_hpa może zostać wyłączone następującymi sposobami:

libata w jądrze:[5]

  • opcję jądra libata.ignore_hpa=0 dodać w konfiguracji bootloadera

libata jako moduł:[6]

  • bash -c 'echo options libata ignore_hpa=0 > /etc/modprobe.d/libata.conf' (als root oder per sudo)

Odnośniki

Powiązane artykuły

NVME Admin command error INVALID OPCODE(2001)
Solid State Drive
SSD Power Loss Protection