Public:Svamberg/SSD

Z HelpDesk

Nastavení a instalace Linux na SSD není vubec jednoduché. Zde jsou posbírané informace, odkazy a vše co se mi podařilo zjistit. V textu jsou uváděny odkazy na dokumenty, které dané řešení osvětlují nebo popisují postup.

Velmi pěkný návod a vše pohromadě je na wiki arch linuxu[1].

Postup

Vyčistit disk

Použít secure erase, funkci ATA vrstvy, která označí všechny bloky za nepoužité, viz [2][3].

Rozdělit disk

Lze použít starý způsob (MBR), který je založený na cylindrech, hlavičkách a sektorech (C/H/S), tento koncept je hodně starý, ale bude fungovat. Nebo můžeme použít GPT, který je novější, k tomu ovšem budeme potřebovat novější nástroje a taky riziko, že něco nepoběží, na druhou stranu zarovnáme partitiony jen podle velikosti.[4]

MBR

První partitiona z historických důvodů bývá zarovnána na 4kB, my bychom ale potřebovali na 128kB. Mame 2 možnosti:

  1. dlabeme na to, necháme to stejně jako /boot a tady se moc zápisových operací neprovádí a nejsou nikterak časté
  2. na rozdělení použijeme W7, které toto zarovnání provedou samy, ale zarovnávaji na 240 hlav a 63 sektorů s 8k zarovnáním partišen, pozor na to u dalších programů
  3. v expertním módu programu fdisk to lze upravit, ale můžeme se dočkat překvapení od některých programů

Další partitiony budou zarovnány na 128kB, pokud při rozdělování nadefinujeme počet hlav na 224 a počet sektorů na 56[5], např.:

fdisk -H 224 -S 56 /dev/sda

GPT

Při použití GPT je nutné mít GRUB2.[4] Pro rozdělení použijte gdisk (ovládání podobné fdisk) nebo parted.

Warning: zkontrolujte si verzi gdisk. V současnosti (8.12.2010) je v Debian unstable verze 0.5.1, která obsahuje chyby a neprovádí automatické zarovnání na 2048 sektorů, jak píše návod [1]. Podle manuálu [6] je automatické zarovnání podporování až od verze 0.6.6. Deb balíček s nejnovější verzí si můžete stáhnout na [7].

LVM

POZOR: na zařízeních typu device-mapper není podporován TRIM, tedy i na logických oddílech[8], což lze obejít na vlastní nebezpečí[9].

Pokud použijete LVM, je potřeba jej taky "magicky"[5] nastavit jeho zarovnání:

pvcreate –metadatasize 250k /dev/sdb2

Minimální hlavička LVM je 192k, proto jej potřebujeme šoupnout na 2*128=256k (v parametru je treba zadat 250k), výsledek ověříme příkazem (viz poslední sloupec):

# pvs /dev/sdb2 -o+pe_start
PV         VG   Fmt  Attr PSize  PFree  1st PE
/dev/sdb2       lvm2 –   73.52G 73.52G 256.00K

Šifrování

POZOR: na zařízeních typu device-mapper není podporován TRIM, tedy i na šifrovaných oddílech[8], což lze obejít na vlastní nebezpečí[9]

Pokud použijeme LUKS pro šifrování, také jej musíme správně zarovnat[10], stačí použít volbu --align-payload=, např.:

cryptsetup --align-payload=2048 ...

Aktuální payload lze zjisti příkazem[11]:

cryptsetup luksDump /dev/sda1 | grep Payload

Souborový systém

Ten překvapivě musíme také zarovnat. S podporou TRIM[12] máme nýní pouze ext4 a brtfs[13]. Brtfs ještě ale není zcela prověřené, takže nám zůstane ext4:

mke2fs -t ext4 -E stripe-width=32,resize=500G /dev/ssd/root

Volba stripe-width je počet 4k bloků v jednom stripe = 128k a to jsme chtěli, resize omezí počet rezervovaných inodů pro případné online zvětšení, minimální garantované zvětšení bude na 500GB. Pokud požijete e2fsprogs od verze 1.41.4, pak žurnál bude automaticky zarovnán na 128k (dle parametru stripe-width) a budou také vhodně rozmístěny inody.

Pro zapnutí TRIM v ext4 musíte souborový systém připojit s volbou discard, umí jádra 2.6.33 a vyšší, např v /etc/fstab[14]:

/dev/sda1  /  ext4  discard,errors=remount-ro,noatime  0  1

To že vše funguje jak má, můžete provést dle návodu[15].

Swap

Pokud jsme se jej rozhodli použít, pak je vhodné si jej taky zarovnat, ideálně příkazem[16]:

mke2fs -t swap -E stripe-width=32 /dev/sda

Instalace debianu aneb jak jsem to vyřešil já

Pro můj SSD Samsung PM800 256GB 2,5" jsem nikde nenašel a ni nezjistil velikost buňky, která se u flash paměti musí přepsat i při změně 1 bitu, tzv. erase block size. Budu tedy předpokládat, že je to ten nejhorší případ a zarovnám vše na 512KB.

Rozdělení disku

Někde bokem (knoppix?) provedeme rozdělení disku, použil jsem parted dle návodu[17] a jednotlivé partition jsem založil tak, aby jejich začátek byl bezezbytku dělitelný číslem 512*1024. Konec partitiony musí být o jeden byte menší. Proto například první partition nezačíná od prvního volného bytu, protože na začátku disku je master boot record (MBR) a informace o rozdělení disku. Tudiž na začátku je trochu volného místa, ale těch pár kilo mě nezabije.

parted /dev/sda
(parted) unit b
(parted) mklabel gpt
(parted) mkpart boot ext4 524288 210239487
(parted) mkpart swap linux-swap(v1) 210239488 6652690431
...
(parted) print
Model: ATA SAMSUNG SSD PM80 (scsi)
Disk /dev/sda: 256060514304B
Sector size (logical/physical): 512B/512B
Partition Table: gpt 
 
Number  Start         End            Size           File system     Name     Flags
 1      524288B       210239487B     209715200B     ext4            boot     boot
 2      210239488B    6652690431B    6442450944B    linux-swap(v1)  swap
 3      6652690432B   38864945151B   32212254720B   ext4            root
 4      38864945152B  60339781631B   21474836480B   ext4            var
 5      60339781632B  61413523455B   1073741824B    ext4            openafs
 6      61413523456B  256060497407B  194646973952B  ext4            home
(parted) quit


Formátování

Stále zůstávám v knoppixu, ale přecházím na formátování, prakticky jde o příkaz:

mke2fs -t ext4 -j -L home -b 4096 -E stride=128,stripe-width=128 /dev/sda6

Vysvětlení:

  • -t typ souborového systému, my použijeme výhradně ext4, protože umí TRIM
  • -j vytvořit žurnál
  • -L přiřadit svazku jméno (zde 'home')
  • -b velikost bloku na disku, zde 4096B (=4KB)
  • -E další rozšiřující volby, čísla u parametrů určují počet bloků, tedy 128*4KB = 512KB
    • stride zarovnává metadata, původně pro RAID systémy (rozložení metadat přes více disků), ne u všech návodů se volba používá
    • stripe-width taktéž původně pro RAID (omezení přepočítávání parity), tentokrát jde o zarovnání ukládaných dat na disk
  • na závěr formátované zařízení

Instalace Debian Squeeze

Nastartujeme instalátor v expertním módu (o mnoho více otázek tam není), probojujeme se až k rozdělení disku, kde jednotlivé partitionám přiřadíme mountpointy a nastavíme, aby instalátor neformátoval dané diskové oddíly. U swapu se mi to nepodařilo nastavit, ale ten se snadno dá kdykoliv přeformátovat. Pak pokračujeme dále v instalaci.

Po instalaci upgradneme jádro na 2.6.33 nebo novější a můžeme zapnout TRIM volbou 'discard' v /etc/fstab.

Testování

Přehledová tabulka, abychom si mohli porovnat, kdo jej má větší:

kdo OS SSD hdparm [MB/s] iozone write [KB/s] iozone read [KB/s] tar (real) [sec]
kernel C/H/S, zarovnání [KB] FS:volby cached buffered 4 512 4096 4 512 4096
List 2.6.36 GPT, 512 ext4:noatime,discard Samsung PM800 256GB 2.5" 3369 231 31312 132454 197556 45826 218416 223469 17.25

hdparm

Řekne vám, jak rychle je zařízení připojené do systému, je vhodné například při ladění DMA, scheduleru a jiných parametrů ovlivňující vlastní přenos mezi systémem a diskem.

# hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   6738 MB in  2.00 seconds = 3369.32 MB/sec
 Timing buffered disk reads: 696 MB in  3.01 seconds = 231.39 MB/sec

iozone

Program iozone (balík iozone3) pracuje již nad souborovým systémem, proto jsou tyto výsledky realističtější, výstup je v KB/sec (viz záhlaví před tabulkou):

# iozone -I -a -s 100M -r 4 -r 512 -r 8192 -i 0 -i 1 -i 2 -f iozone.dat
        Iozone: Performance Test of File I/O
                Version $Revision: 3.308 $
                Compiled for 64 bit mode.
                Build: linux 

        Contributors:William Norcott, Don Capps, Isom Crawford, Kirby Collins
                     Al Slater, Scott Rhine, Mike Wisner, Ken Goss
                     Steve Landherr, Brad Smith, Mark Kelly, Dr. Alain CYR,
                     Randy Dunlap, Mark Montague, Dan Million, Gavin Brebner,
                     Jean-Marc Zucconi, Jeff Blomberg, Benny Halevy,
                     Erik Habbinga, Kris Strecker, Walter Wong, Joshua Root.

        Run began: Wed Dec  1 17:32:36 2010

        O_DIRECT feature enabled
        Auto Mode
        File size set to 102400 KB
        Record Size 4 KB
        Record Size 512 KB
        Record Size 8192 KB
        Command line used: iozone -I -a -s 100M -r 4 -r 512 -r 8192 -i 0 -i 1 -i 2 -f iozone.dat
        Output is in Kbytes/sec
        Time Resolution = 0.000001 seconds.
        Processor cache size set to 1024 Kbytes.
        Processor cache line size set to 32 bytes.
        File stride size set to 17 * record size.
                                                            random  random    bkwd   record   stride                                   
              KB  reclen   write rewrite    read    reread    read   write    read  rewrite     read   fwrite frewrite   fread  freread
          102400       4   31312   35746    45826    44629   22813    6323                                                          
          102400     512  132454  212060   218416   218261  198819  115273                                                          
          102400    8192  197556  194191   223469   223611  221365  125625                                                          

iozone test complete.

tar

Běžné rozbalení jádra je taktéž vhodným testem z reality:

# wget ftp://ftp.zcu.cz/pub/linux/kernel/v2.6/linux-2.6.36.tar.bz2
# time tar xjf linux-2.6.36.tar.bz2
real    0m17.253s
user    0m17.161s
sys     0m1.756s

TRIM

  • TRIM[12] v linuxu je v jádře 2.6.36 podpora pro ext4 a brtfs (ext4 od verze 2.6.33)[13]
  • informace, jestli SSD disk poskytuje trim a další informace lze zjisti příkazy (hledej "TRIM supported"):
hdparm -I /dev/sda
/dev/sda:

ATA device, with non-removable media
        Model Number:       INTEL SSDSA2M160G2GC                    
        Serial Number:       CVP*******160AGN                     
        Firmware Revision:  2CV102HD                                
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6                                                               
Standards:                                                                         
        Used: ATA/ATAPI-7 T13 1532D revision 1                                     
        Supported: 7 6 5 4                                                         
Configuration:                                                                     
        Logical         max     current                                            
        cylinders       16383   16383                                              
        heads           16      16                                                 
        sectors/track   63      63                                                 
        --                                                                         
        CHS current addressable sectors:   16514064                                
        LBA    user addressable sectors:  268435455                                
        LBA48  user addressable sectors:  312581808                                
        Logical  Sector size:                   512 bytes                          
        Physical Sector size:                   512 bytes                          
        device size with M = 1024*1024:      152627 MBytes                         
        device size with M = 1000*1000:      160041 MBytes (160 GB)                
        cache/buffer size  = unknown                                               
        Nominal Media Rotation Rate: Solid State Device                            
Capabilities:                                                                      
        LBA, IORDY(can be disabled)                                                
        Queue depth: 32                                                            
        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:                                                         
           *    SMART feature set                                                  
                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                                                    
           *    SMART error logging                                                
           *    SMART self-test                                                    
           *    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)                                     
           *    Native Command Queueing (NCQ)                                      
           *    Phy event counters                                                 
                Device-initiated interface power management                        
           *    Software settings preservation                                     
           *    Data Set Management TRIM supported
           *    reserved 69[5]                                                     
           *    Deterministic read after TRIM                                      
Security:                                                                          
        Master password revision code = 65534                                      
                supported                                                          
        not     enabled                                                            
        not     locked                                                             
        not     frozen                                                             
        not     expired: security count                                            
                supported: enhanced erase                                          
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.       
Logical Unit WWN Device Identifier: 50015179590b07e3                               
        NAA             : 5                                                        
        IEEE OUI        : 001517                                                   
        Unique ID       : 9590b07e3                                                
Checksum: correct                                                                  

################################################################

# hdparm -i /dev/sda

/dev/sda:

 Model=INTEL, FwRev=2CV102HD, SerialNo=CVP*******160AGN
 Config={ Fixed }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
 BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=312581808
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio3 pio4
 DMA modes:  mdma0 mdma1 mdma2
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: ATA/ATAPI-7 T13 1532D revision 1:  ATA/ATAPI-2,3,4,5,6,7

 * signifies the current active mode

Nástroje

Partitiony musí být zarovnané na jednotlivé bloky fyzické zařízení

  • fdisk -cu zajistí zarovnání na 1024KB (1MB), je to jedno z řešení, jak si usnadnit cestu, ale není to zaručeno
  • gdisk vhodné použít verzi 0.6 a vyšší, ideálně 0.6.6 a vyšší, umožní rozdělení disků novým způsobem
  • parted pokud zvládnete trochu jiné ovládání, mohu jen doporučit, existuje i GTK varianta gparted

Jiná doporučení

swap

  • nemít swap, ale nelze používat uspání na disk
  • nastavit swapiness, tak aby se swap využíval až v krajním případě:
echo "vm.swappiness=1" >> /etc/sysctl.d/ssd_disk.conf

cache

  • snaha, aby kernel více cachoval strukturu inodu:
echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.d/ssd_disk.conf

souborový systém

  • nastavit u souborových systémů volbu noatime, zruší se tím zápis do FS i při čtení
  • nezaplňovat FS z více než 80%

kernel

  • zkontrolovat, že se kernel ví o použití SSD disku, u klasických HDD se snaží poskládat nejvýhodněji operace, což tady je spíše zdržování, příkaz by měl vrátit nulu:
cat /sys/block/sda/queue/rotational
  • přepnout na minimalistický scheduler, teď už není disk nejužším místem, proto pro dané zařízení můžeme nastavit jiný plánovač
echo noop > /sys/block/sda/queue/scheduler
  • Defaultní plánovač pro celý systém nastavíte při kompilaci jádra nebo parametrem jádra elevator=[anticipatory|cfq|noop|deadline] , řídit by jste se měli tímto:
    • anticipatory (default do jádra 2.6.18): nepoužívat s SSD disky
    • cfq (default od 2.6.19): nepoužívat s SSD disky
    • noop: poukud máte k systému připojené pouze SSD disky
    • deadline: pokud v systému je mix SSD + HDD
  • nastavit frontu na přímo (pokud to jádro umožňuje)
echo 1 > /sys/block/sda/queue/iosched/fifo_batch
  • vyřadit disk ze seznamu pro vytváření entropie (od jádra 2.6.36), disk už nemá přístupové doby různé:
echo 0 > /sys/block/sda/queue/add_random

Odkazy