SSD overprovisioning z hdparm
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
- dysk SSD jest fabrycznie nowy lub
- przeprowadzony został Secure Erase lub manualny TRIM (w zależności od SSD).
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
- ↑ (PATCH 1/3) ide: add "ignore_hpa" module parameter
- ↑ Bug #380138 in linux (Ubuntu): “Do NOT disable HPA by default -> leads to data loss” (bugs.launchpad.net)
- ↑ (PATCH 8/8) libata: implement on-demand HPA unlocking (Linux Kernel Mailing Liste)
- ↑ libata: implement on-demand HPA unlocking (kerneltrap.org)
- ↑ Bug #380138 in linux (Ubuntu): “Do NOT disable HPA by default -> leads to data loss” (bugs.launchpad.net), Comment 13
- ↑ Bug #380138 in linux (Ubuntu): “Do NOT disable HPA by default -> leads to data loss” (bugs.launchpad.net), Comment 15