Public:Svamberg/SSD
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:
- dlabeme na to, necháme to stejně jako /boot a tady se moc zápisových operací neprovádí a nejsou nikterak časté
- 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ů
- 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
Migrace debianu na nový disk bez instalace (překopírováním)
Jeden možný postup pro migraci na notebooku:
- nový SSD disk si připojíte jako externí USB disk (pomocí běžného konvertoru USB -> SATA)
- provedete rozdělení na jednotlivé partitions (např. gdiskem) a naformátování na ext4
- nakopírujete adresářovou strukturu linuxu ze starého disku
- připravíte si bootovací CD nebo USB
Pozor: před výměnou disku se ujistěte, že máte na tom novém disku linux s nejnovějšími knihovnami libklibc klibc-utils. V současnosti je v stable debianu (8.12.2010) verze 1.5.12, která při bootu nerozezná ext4 od ext3 a boot havaruje. Je potřeba nainstalovat novější (já jsem byl úspěšný s verzí 1.5.20), a přegenerovat initrd.img (příkazem update-initramfs, případně dpkg-reconfigure linux-image-2.6.xx). |
Vyjmete z notebooku starý disk, vložíte SSD a dále:
- nabootujete z flashky
- do mnt přimontujete nový disk (případně všechny potřebné partitions), takže např:
mount /dev/sda4 /mnt mount /dev/sda5 /mnt/var mount /dev/sda2 /mnt/boot mount /dev/sda6 /mnt/home
- pripojíte /dev do mnt stromu:
mount --bind /dev /mnt/dev
- change root do /mnt
chroot /mnt
- zavedete grub2
update-grub grub-install /dev/sda
(podrobnosti viz [17])
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[18] 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
- ↑ 1,0 1,1 vše o nastavení SSD disku v Arch linuxu
- ↑ hdparm a zjištěni TRIM, bezpečné smazání disku, testy
- ↑ detailně smazání disku přes hdparm
- ↑ 4,0 4,1 rozdělení disku programem parted ve stylu GPT
- ↑ 5,0 5,1 o zarovnání partition, LVM i FS od vývojáře linuxového jádra, vysvětluje magii u počtu hlaviček a sektorů
- ↑ gdisk manuál, rady k rozdělení disku
- ↑ gdisk download
- ↑ 8,0 8,1 TRIM není na device-mapper zařízeních podporován
- ↑ 9,0 9,1 možnost jak zajistit TRIM i na device-mapper oddílech
- ↑ nastavení šifrování (poslední odstavec)
- ↑ http://thread.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/4075
- ↑ 12,0 12,1 obecně o TRIM a jeho podporách v různých OS - wikipedia
- ↑ 13,0 13,1 popis linuxových FS s podporou TRIM
- ↑ Jak zapnout TRIM u ext4
- ↑ jak otestovat, že TRIM funguje
- ↑ bez důkazů a polopaticky uděláno rozdělení a konfigurace SSD
- ↑ grub2 návod
- ↑ Jak na SSD přes parted a GPT