SAS SSD s 528bajtovými sektory
Jak v Linuxu rozjet SAS SSD IBM zamčené na 528bajtový sektor: přeformátování, záplata jádra změřená na osmi discích a rozbor zámku ve firmwaru.
Serverové SSD z vyřazených diskových polí se dají koupit z druhé ruky. Kdo ale koupí SSD Seagate ST1600FM0013 s firmwarem IBM a zapojí ho do linuxového serveru, zjistí, že systém hlásí disk o nulové velikosti. Disky mají 1,6 TB a rozhraní SAS, ale jsou natvrdo zamčené na sektory o 528 bajtech. Pole IBM využije těch 16 bajtů navíc pro metadata, LVM, ext4, XFS ani ZFS s takovým diskem pracovat neumí. Repozitář popisuje, jak takové disky v Linuxu rozjet, co nefunguje a kde zámek ve firmwaru sedí. Vznikl na osmi zdravých discích v serveru HPE s řadičem Broadcom SAS3216.
Běžné nástroje narazí na jeden chybový kód
U disků NetApp, EMC, Dell nebo HPE obvykle stačí sg_format --size=512. Firmware IBM 6214 změnu velikosti sektoru odmítne, stejně jako rychlejší linku a nahrání jiného firmwaru, pokaždé kódem ASC 0x26 / ASCQ 0x99. Všechno níže se zkoušelo na vlastním disku a disk po každém pokusu zůstal nepoškozený:
| Postup | Výsledek |
|---|---|
sg_format --size=512 a MODE SELECT přes sg_raw | Invalid field in parameter list, projde jen 528 |
| openSeaChest, změna sektoru i FORMAT UNIT | nepodporováno, formát selže |
| oficiální flasher Seagate s podepsaným firmwarem | odmítnuto po 22 segmentech |
| obnova přes PSID | relace TCG neodpovídá; podle fóra ServeTheHome sektor neodemkne |
sedutil-cli | umí jen SATA a NVMe, ne SAS |
Co repozitář nabízí
- Odpověď za zlomek vteřiny. Sonda MODE SELECT nic neukládá a na médium nesáhne. Disk, který odpoví
Good, jde přeformátovat; odpověďIllegal Requestznamená zámek a cestu přes jádro. - Přeformátování bez ztráty místa. Disk IBM od HGST přijal
sg_format --size=512, za 36 minut si přepočítal počet bloků a kapacita zůstala na 400,09 GB. Přímý zápis pak šel rychlostí 392 MB/s, kdežto emulace v uživatelském prostoru přes nbdkit dala 118 MB/s. - Záplata jádra pro zamčené disky. Disk se po ní hlásí jako běžné blokové zařízení s 512bajtovým sektorem. Repozitář ji převádí pro jádro 6.8 i 7.0 a je změřená na všech osmi discích.
- Hotové nastavení. Pět parametrů jádra, se kterými emulace nebrzdí a strop propustnosti určují samotné disky.
- Rozbor zámku a nástroj na jeho úpravu. Zámek je v konfiguračním záznamu, ne v kódu firmwaru, a skript
tools/patch_ibm_lock.pyho přepíše změnou sedmi bajtů. - Česky i anglicky. Každý dokument má českou verzi s příponou
_CZ.
Sonda vypadá takhle:
printf '\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x02\x00' > /tmp/ms512.bin
sg_raw -s 16 -i /tmp/ms512.bin /dev/sdX 55 10 00 00 00 00 00 00 10 00
Emulace v jádře, změřená na osmi discích
Záplata ovladače sd je cizí a její původ neznámý. V publikované podobě se nepřeložila, omezení pokročilých operací nastavovala příliš brzy, takže je běžný kód hned přepsal, a hloubku fronty upravovala ve špatné funkci. K tomu při selhání alokace uvolňovala tutéž paměť dvakrát. Repozitář všechny čtyři chyby popisuje a opravuje skriptem port_universal.py.
Každý 528bajtový sektor se mapuje na jeden 512bajtový a 16 bajtů metadat se zahazuje. Disk pak má 1,55 TB místo 1,60 TB, tedy o 3 % méně. Data zapsaná přes emulaci se porovnala s přímým čtením 528bajtového sektoru a seděla bajt po bajtu. TRIM funguje: po blkdiscard se čtou nuly.
Úzké hrdlo byla společná vyrovnávací paměť emulace pro všechny disky. S požadavky po 128 KiB a zvětšenou pamětí přečte osm disků 4 065 MB/s a zapíše 3 522 MB/s, náhodné čtení 4 KiB drží kolem 780 000 IOPS. To je zhruba 510 MB/s na disk, tedy tolik, kolik jeden disk zvládne sám:
sd_mod.emulate_512_from_fat_sectors=1
sd_mod.emulate_528_queue_depth=32
sd_mod.emulate_528_max_sectors=256
sd_mod.emulate_528_pool_chunks=4608
sd_mod.emulate_528_pool_contexts=512
Nad emulací běží ZFS ve čtyřech zrcadlech po dvou discích s 5,50 TiB využitelného místa. Sekvenčně čte 4 129 MB/s a zapisuje 1 231 MB/s. Test fio s ověřením přes 8 GiB nenašel jedinou chybu, následný zpool scrub neopravil nic a po studeném restartu se pole samo naimportovalo.
Kde zámek ve firmwaru sedí
Porovnání obsahu paměti SPI flash z disku IBM a z disku s původním firmwarem Seagate ukázalo 688 bajtů, které Seagate vůbec nemá. Jsou to čtyři konfigurační záznamy přidané IBM a záznam 0xc8 nese počet bloků a velikost sektoru jako obyčejná data. Kontrolní součet bloku je součet 16bitových slov, který musí vyjít nula. Skript změní počet bloků, velikost sektoru a součet dopočítá:
python tools/patch_ibm_lock.py dump1.bin patched.bin \
--mode blocksize --blocks 3125627568
Kapacita by zůstala stejná: 3 125 627 568 sektorů po 512 bajtech je o 2 688 bajtů víc než dnešních 3 030 911 576 po 528. Je k tomu potřeba odpájet čip W25Q32 a přečíst ho programátorem CH341A ve verzi na 3,3 V; postup krok za krokem je v README. Výpis musí pocházet z vlastního disku, protože konfigurační blok nese sériové číslo a kalibraci konkrétního kusu. Dokud zůstane původní výpis, jde všechno vrátit.
Komu se to hodí
- Majitelům SAS SSD s firmwarem IBM z druhé ruky, kteří je chtějí v Proxmoxu nebo jiném linuxovém serveru.
- Těm, kdo řeší klon řadiče prodávaný jako 9305-16i s čipem SAS3216, na který oficiální firmware nejde. Repozitář popisuje, jak ho dostat na verzi P16.12.
- Komukoli, kdo zkoumá firmware Seagate Koho: jsou tu nástroje na rozbor a porovnání výpisů a odkazy na ně s kontrolními součty.
Když nic z toho nepomůže, README uvádí i jiné cesty: disky nasadit v poli IBM, kde je 528 bajtů nativní velikost, nebo je prodat majitelům takových polí.
Co zůstává otevřené
Úprava paměti flash na skutečném disku vyzkoušená není a jestli firmware kromě součtu nekontroluje i podpis, ukáže až zápis. Linka zůstává na 6 Gb/s, protože limit je ve firmwaru disku; jediná známá cesta je zařízení PC-3000 SAS. Disk s emulací zahazuje metadata, podle kterých firmware IBM hlídá integritu, takže do pole IBM se už vrátit nemá. Proxmox má vlastní jádro, emulaci je tam potřeba sestavit znovu a importovat pole s OpenZFS 2.2 nebo novějším.
Jak začít
Repozitář se stáhne příkazem git clone https://github.com/nks-hub/st1600fm0013-528b-sectors.git. Skripty běží přímo v Pythonu 3 a potřebují balík sg3_utils, cesta přes paměť flash navíc flashrom. Výpisy flash a oficiální balík firmwaru v repozitáři nejsou, README odkazuje, odkud se stáhnou, a uvádí jejich kontrolní součty SHA-256. Vydání ani balíčky projekt nemá.
Zdrojový kód
Poznámky a skripty jsou na GitHubu v repozitáři nks-hub/st1600fm0013-528b-sectors. Licenci repozitář neuvádí. Cizí materiál, tedy výpisy flash, balík firmwaru Seagate a záplata jádra, má u sebe uvedený původ.