Appunti su Gentoo Linux
L'Hard Disk

Introduzione

In linux gli hard disk e le pennette USB sono identificati con sda, sdb, ecc... (Ricordiamo che i file dei dispositivi si trovano dentro /dev) Il vecchio driver per la gestione dei dischi invece identificava con hda, hdb, ecc... gli hard disk PATA e con sda, sdb, ecc... quelli SCSI e SATA.

La prima cosa da sapere è che quando si compra un hard disk, la dimensione riportata è espressa nel sistema internazionale (SI). Pertanto un hard disk da 500GB (il valore effettivo è un po' di più, circa 500.1GB), significa che può ospitare 500 miliardi di byte, e non come spesso si crede 1024*1024*1024=1073741824 byte! Pertanto un hard disk da 500GB, potrà ospitare circa 466 GigaByte nel senso comune del termine.
Con il comando fdisk /dev/hda, mostrando la tabella delle partizioni con p, si può vedere la capacità dell'hard disk.

Le partizioni

Un hard disk può ospitare fino a 4 partizioni primarie. Se si ha bisogno di più partizioni, una o più delle partizioni primarie devono essere partizioni logiche. All'interno di queste ultime si possono creare un numero elevato di ulteriori partizioni.
In un sistema GNU/Linux le partizioni di un disco pata vengono indicate con hda1, hda2, ecc... e analogamente le partizioni dei dischi scsi, sda1, sda2, ecc...
Gli strumenti per gestire la tabella delle partizioni sono sostanzialmente due: fdisk oppure parted. Quest'ultimo gode di più funzionalità e di numerose e potenti interfacce grafiche.

Il file system

Dopo aver partizionato l'hard disk si deve scegliere un file system per ogni partizione. Esistono molti filesystem, cioè molti modi per gestire l'organizzazione dei dati sul disco. I due filesystem più famosi sono ext2 ed ext3. Quest'ultimo è sostanzialmente uguale al primo con in più il supporto per il journaling. Siccome un filesystem ext2 o ext3 ben configurato può uguagliare filesystem studiati appositamente per un certo compito, sconsiglio, a meno di VERA necessità, di usare altri filesystem che non siano ext2 o ext3.

Per applicare un filesystem ad una partizione si può usare il solito parted (o una sua interfaccia grafica) oppure mke2fs. L'uso di ext3 è sempre consigliato, ad esclusione della partizione in cui risiede /boot (sempre che lo vogliate mettere su una partizione dedicata).

mk2fs -T largefile4 -j /dev/hdb1    (crea un fs ext3 (-j) adatto per file molto grandi)
mk2fs /dev/hdb1    (crea un filesystem ext2 per un uso generico)

I parametri per il filesystem sono già ottimizzati dal team di Gentoo (/etc/mke2fs.conf). Con l'opzione -j si applica il filesystem ext3 (j sta per journal). L'opzione -T <tipo_fs> permette di specificare a quale scopo sarà destinata la partizione; se non si usa questa opzione vengono usate le impostazioni generiche (già molto buone ed adatte per una partizione in cui risiede il sistema). Per le altre scelte vedere il manual di mke2fs e il file /etc/mke2fs.conf.

A seguito di questa operazione la capacità totale del disco verrà diminuita ulteriormente ma comunque in maniera molto modica, meno dell'uno per mille. Però se date il comando df vedrete che, per ogni partizione, lo spazio disponibile non è pari allo spazio totale meno lo spazio occupato! Lo spazio disponibile è decisamente di meno. Questo è dovuto al fatto che il filesystem ext2 o ext3 riservano il 5% dello spazio totale di una partizione (5% di 466GB è circa 23GB!) per operazioni speciali quali: buffer per evitare di frammentare i dati, spazio di sicurezza in caso di partizione piena, ecc...
A secondo dell'uso della partizione in esame e della sua dimensione, si può ridurre questo spazio di sicurezza con il comando tune2fs, che permette di regolare molti dei parametri di un filesystem ext2 o ext3 senza dover riformattare la partizione stessa. Ad esempio se usate una enorme partizione da 466GB per archiviare film, l'1% della partizione (4.66GB circa) è più che sufficiente per tutte le varie operazioni!

tune2fs -m 1 /dev/hdb1 (spazio riservato par all'1% del totale)

Tra le tante possibilità offerte da tune2fs è la possibilità di trasformare un filesystem ext2 in uno ext3 e viceversa in pochi secondi.

tune2fs -O ^has_journal /dev/hdb1  (elimina il journal, pertanto la fa diventare ext2)
tune2fs -O has_journal /dev/hdb1  (aggiunge il journal, pertanto la fa diventare ext3)

3 tipi di journal, l'intermedio, che è di default, è il migliore per rapporto prestazioni/stabilità.
parlare dell'opzione commit= di /etc/fstab e dell'opzione noatime (che comprende in sé nodiratime, che quindi è inutile da specificare).

Modificare i parametri del bios dell'hard disk: hdparm

hdparm è un programma che permette di sfruttare le potenzialità del kernel nella gestione degli hard disk. Permette di leggere e settare una moltitudine di parametri specifici degli hard disk. Spesso però le configurazioni di default degli hard disk già sono ottime così come le scelte di default del kernel. Pertanto hdparm nella maggior parte dei casi è inutile e trova la sua utilità solo nel controllo del valore dei suddetti parametri.

Per leggere i dati del nostro hard disk:

hdparm -iIaAbcCdDgmMuW /dev/hda

Per controllare il power status dell'hard disk active/idle è il comportamento normale poi c'è standby (il motore è speno) e lo sleeping (hard disk praticamente spento)

hdparm -C /dev/hda

Per testare le performace del nostro hard disk

hdparm -tT /dev/hda

Ecco alcune opzioni che possono risultare utili. Se si dà l'opzione senza aggiungere nulla si vede il suo valore.

Come dicevo tutte queste opzioni sono praticamente inutili perché dovrebbero già essere tutte settate ai valori migliori. L'unica utile è -a da regolare solo in circostanze speciali.

In realtà non sempre il kernel regola l'hard disk sui valori consigliati dal produttore. Questo accade soprattutto per i parametri del risparmio energetico e il rumore, regolabili tramite le opzioni -M, -S e -B. Vanno toccati con molta cautela. Il valore consigliato di -M non sempre è settato di default. Per controllare usare hdparm.

L'opzione -S e la più sofisticata opzione -B sono interessanti. La seconda non è supportata da tutti gli hard disk ma permette un controllo più fine del risparmio energetico, anche se sarebbe buona cosa trovare una buona documentazione del vostro hard disk per capire come agire. Questa cosa si collega all'uso del parametro -S che invece è supportato praticamente da tutti gli hard disk. Difatti lo spindown cioè lo spegnimento del motore dell'hard disk è da attivare con molta cautela. Se si guardano le informazioni SMART (vedi sotto) potete conoscere il numero di cicli di spin up/spin down effettuati dal vostro hard disk. L'hard disk è garantito per supportare un certo numero di questi cicli (50000 per gli hard disk per i pc fissi e 200000 per quelli portatili) dopodiché si rompe. Ci sono svariate teorie che dicono che gli hard disk non dovrebbero essere mai messi in standby altrimenti si rompono più facilmente, non solo perché aumentano i cicli di spin up/spin down. Abilitatelo con cautela e controllate se ritorna troppo facilmente dallo stand-by senza che facciate qualcosa ecc... Consigliato soprattutto su un secondo hard disk.

I parametri impostati con hdparm vengono ripristinati ai valori di default al riavvio del pc. Non li si può rendere permanenti (a meno di modificare il kernel...). L'unica cosa che si può fare è risettarli tutte le volte che il pc si riavvia. Per farlo è sufficiente inserire le opzioni di hdparm in /etc/conf.d/hdparm e inserendo hdparm al boot

rc-update add hdparm boot

Ecco il file hdparm del mio pc. L'opzione per il rumore è settata di default a 0 per entrambi i miei hard disk e quindi la devo rimettere al valore consigliato di 192. Purtroppo il secondo hard disk non supporta questa opzione. Per entrambi gli hard disk disabilito completamente lo standby. Per il secondo hard disk uso un readahead più alto perché contenente solo file di grandi dimensioni.

sda_args="-B254 -S0 -M128"
sdb_args="-B254 -a2048 -S0"

Alcuni di questi parametri spesso non sono supportati. A volte viene esplicitamente detto, altre volte invece bisogna capirlo da soli. Spesso basta settare i parametri a valori ragionevoli e se si ottiene un errore di lettura/scrittura significa che non sono supportati. Il problema si pone soprattutto per lo spindown (-S). Non c'è modo di capire a che valore è settato senza cambiarlo.

Modificare i parametri del kernel riguardanti l'uso del disco. Approccio manuale

Esiste un sottosistema del kernel chiamato VM che si preoccupa di mettere i dati in RAM prima di passarli all'hard disk in modo da diminuire l'accesso al disco.

Quando si scrivono i dati nell'hard disk quindi, questi in realtà finiscono prima nella "page cache" in RAM. In /proc/meminfo potete vedere la grandezza totale della "page cache" disponibile. Viene chiama Cached ed è regolata dal parametro ??? che corrisponde alla percentuale massima di memoria che può essere usata per la page cache.

I dati che vanno a finire nella "page cache" si chiamano Dirty e verranno scritti sull'hard disk solo grazie al demone chiamato pdflush che deciderà, in base a certi parametri, se e quando scrivere questi dati. pdflush si attiva periodicamente ogni dirty_writeback_centisecs (500 di default) centesimi di secondo e seleziona i dati da scrivere in base a due criteri che ora vedremo. Attivarsi non significa scrivere. Scriverà solo se i seguenti criteri sono soddisfatti. Quindi questo parametro è meglio lasciarlo al valore di default.

Il primo criterio fa scrivere solo i dati se sono più vecchi di un certo tempo ed è regolata dal parametro dirty_expire_centisecs (3000 cs di default). Rappresenta il massimo numero di centesimi di secondo che un dato può stare nel buffer senza essere scritto.

L'altro criterio che fa selezionare i dati da scrivere è quello di iniziare a scrivere nell'hard disk se i dati dirty hanno superato la soglia di memoria massima occupabile. Questa memoria massima occupabile corrisponde al dirty_background_ratio (10) percento della memoria data da (MemFree + Cached - Mapped). Quando pdflush entra in azione si ferma o dopo che la memoria è tornata sopra il valore limite o dopo che sono state scritti un numero minimo di buffer. Ovviamente se i dati da scrivere finiscono prima di incontrare queste due condizioni pdflush si ferma comunque.

Un ultimo criterio che non riguarda pdflush è dato dal dirty_ratio (40) che è la massima percentuale di memoria totale usabile da un programma prima che questo sia obbligato egli stesso a scrivere sull'hard disk.

Questo opzioni possono essere cambiate con sysctl.

Esiste poi la swappiness. Più è alta più uso lo swap.

Tutti questi parametri disponibili si possono vedere in /proc/sys/vm/. Per cambiare il loro valore basta scrivere dentro questi file i valori che si desiderano. Al riavvio però questi valori verranno persi. Se li si vuole settare ogni volta che il kernel si avvia basta scriverli /etc/sysctl.conf.

Ecco una lista di parametri che controllano pdflush e il resto... Linux insight La lista si può vedere con sysctl -a

Tabella 1. Parametri del sistema VM del kernel Linux.
Parametro Descrizione
block_dump Block I/O debugging. Vengono loggate tutte le scritture/letture su disco. Può essere utile per capire quale processo sta scrivendo e qual è il responsabile del risveglio di un hard disk (0)
dirty_background_bytes Quantità di memoria dirty dopo il quale pdflush scrive i dati (0). Se diverso da 0 dirty_background_ratio diventa funzione di questo valore: (dirty_background_bytes / the amount of dirtyable system memory).
dirty_background_ratio Massima % di (MemFree + Cached - Mapped) che può essere occupata dal Dirty. Dopodiché viene scritta (10%)
dirty_bytes Quantità di memoria dirty alla quale un processo che sta scrivendo su disco si fermerà e inizierà esso stesso a scrivere su disco. (0) Se è diverso da 0, dirty_ratio diventa funzione di questo valore (dirty_bytes / the amount of dirtyable system memory). Nota: il minimo valore permesso è 2 (pagine). Valori minori risultano nel settaggio di default.
dirty_expire_centisecs Massimo tempo in cs dopo il quale i dati si considerano scaduti e devono essere scritti (3000 cs)
dirty_ratio Massima % di memoria che può essere riempita da pagine Dirty prima che i processi che stanno scrivendo siano obbligati loro stessi a scrivere (20%)
dirty_writeback_centisecs Ogni quanti cs pdflush si sveglia (500 cs). Metterlo a 0 significa disabilitare il periodic writeback.
drop_caches Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free. To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches As this is a non-destructive operation, and dirty objects are not freeable, the user should run "sync" first in order to make sure all cached objects are freed.
laptop_mode Quando si ha una scrittura o lettura fisica su disco, si approfitta di questa occasione per scrivere tutti i dati dirty! Un valore normale è 5 (secondi) Valore di default è 0. (0)
legacy_va_layout If non-zero, this sysctl disables the new 32-bit mmap map layout - the kernel will use the legacy (2.4) layout for all processes. (0)
lowmem_reserve_ratio Ratio of total pages to free pages for each memory zone. (256 256 32)
max_map_count This file contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of calling malloc, directly by mmap and mprotect, and also when loading shared libraries. While most applications need less than a thousand maps, certain programs, particularly malloc debuggers, may consume lots of them, e.g., up to one or two maps per allocation. The default value is 65536.
min_free_kbytes This is used to force the Linux VM to keep a minimum number of kilobytes free. The VM uses this number to compute a pages_min value for each lowmem zone in the system. Each lowmem zone gets a number of reserved free pages based proportionally on its size.
mmap_min_addr This file indicates the amount of address space which a user process will be restricted from mmaping. Since kernel null dereference bugs could accidentally operate based on the information in the first couple of pages of memory userspace processes should not be allowed to write to them. By default this value is set to 0 and no protections will be enforced by the security module. Setting this value to something like 64k will allow the vast majority of applications to work correctly and provide defense in depth against future potential kernel bugs.
nr_pdflush_threads pdflush threads currently running. This is a read-only value.
oom_dump_tasks Enables a system-wide task dump (excluding kernel threads) to be produced when the kernel performs an OOM-killing and includes such information as pid, uid, tgid, vm size, rss, cpu, oom_adj score, and name. This is helpful to determine why the OOM killer was invoked and to identify the rogue task that caused it. If this is set to zero, this information is suppressed. On very large systems with thousands of tasks it may not be feasible to dump the memory state information for each one. Such systems should not be forced to incur a performance penalty in OOM conditions when the information may not be desired. If this is set to non-zero, this information is shown whenever the OOM killer actually kills a memory-hogging task. The default value is 0.
oom_kill_allocating_task
overcommit_memory
overcommit_ratio
page-cluster
panic_on_oom
percpu_pagelist_fraction
scan_unevictable_pages
stat_interval
swappiness Parametro da 0 a 100 che indica quanto si vuole usare lo swap. (60)
vfs_cache_pressure Parametro molto importante. Di default sta a 100. Metterlo a 50 per provare ad aumentare le prestazioni.
vm.swappiness = 10
vm.dirty_background_ratio = 40
vm.dirty_expire_centisecs = 120000
vm.dirty_ratio = 60
vm.vfs_cache_pressure=50

Una volta modificato il file sysctl.conf per rendere effettive le modifiche o si riavvia il sistema oppure si lancia il comando /sbin/sysctl -p

Modificare i parametri del kernel riguardanti l'uso del disco. Laptop-mode

laptop-mode è, come visto sopra, un modo per concentrare la scrittura su hard disk in grandi blocchi. Da qui è nato uno strumento, laptop-mode-tools, che controlla il parametro laptop-mode e tutti gli altri visti sopra, attivandoli e disattivandoli a seconda degli eventi ACPI e del runlevel.

Se non avete bisogno che i parametri VM del kernel si modifichino a seconda delle occasioni, potete anche settarli a mano come visto sopra. L'altro vantaggio di laptop-mode-tools è che evitate di mettere mano a parametri leggermente pericolosi. Infatti i suoi valori di default vanno già benissimo.

emerge -pv laptop-mode-tools

Riferimenti: http://www.westnet.com/~gsmith/content/linux-pdflush.htm, http://www.freeweb.hu/linuxkernel2/ch15lev1sec4.html, http://www.mjmwired.net/kernel/Documentation/laptops/laptop-mode.txt

Prima di tutto configuratelo

Quando avete finito di configurarlo aggiungetelo al runlevel adatto

rc-update add laptop-mode default
/etc/init.d/laptop_mode start

Monitorare l'hard disk: S.M.A.R.T.

S.M.A.R.T. è un sistema di controllo interno degli hard disk presente in tutti gli hard disk da molti anni a questa parte. Per leggere questi dati e attivare i sistemi di controllo interni dell'hard disk va installato un programmino apposito, smartmontools.

emerge -pv smartmontools

Tra i comandi forniti da smartmontools il più importante è smartctl.

Link molto interessante
Link interessante

La riga Start/Stop count dice quante volte la rotazione del disco si è fermata e ripartita. In pratica conta quante volte l'hard disk è stato spento o messo in spindown.

La riga Power_Cycle_Count dice quante volte è stato spento l'hard disk. Se l'hard disk non va mai in spindown allora questo valore dovrebbe essere uguale allo Start/Stop count.

La riga Load Cycle Count ci dice invece quante volte le testine sono state riportate nella loro posizione di partenza. Questo è uno dei parametri fondamentali per la vita di un hard disk. Gli hard disk reggono dai 300000 al milione di riposizionamenti delle testine. Questo riposizionamento viene controllato dal risparmio energetico che con hdparm si setto con il parametro -B. Questo è il motivo per cui si consiglia di impostare -B254 o -B255 con hdparm. Se il risparmio energetico è disabilitato (-B255) questo numero dovrebbe essere uguale allo Start/stop count e se è disabilitato anche lo spindown (-S0) dovrebbe essere uguale al Power_Cycle_Count. Credo che -B255 implichi -S0.

Non ho capito il reset del pc quale di questi contatori incrementa.

Piccolo test (-B254 -S0 -M128)
----------------------------------------------------
 Data         Start/Stop   Power_Cycle   Load_Cycle
----------------------------------------------------
 2011-09-11          773            70        82509
----------------------------------------------------

C'è anche la possibilità di far partire un demone che controlla periodicamente le informazioni SMART, esegue test ecc... e vi avverte non appena c'è qualcosa che non va!

Uno strumento molto semplice, hddtemp, serve per leggere solo la temperatura dell'hard disk usando i dati SMART.

La memoria in Linux

Ecco il contenuto di /proc/meminfo. Analizziamolo.

MemTotal:        2056360 kB   Memoria fisica totale meno 
                              "qualcosina"
MemFree:          239456 kB   Memoria libera
Buffers:          234864 kB   Memoria nella cache buffer
Cached:           962156 kB   Memoria per la pagecahe 
                              meno la SwapCached
SwapCached:            0 kB
Active:           740952 kB
Inactive:         742304 kB
Active(anon):     160324 kB
Inactive(anon):   131084 kB
Active(file):     580628 kB
Inactive(file):   611220 kB
Unevictable:          48 kB
Mlocked:              48 kB
SwapTotal:       2097148 kB   Dimensione dello swap
SwapFree:        2097148 kB   Dimensione libera dello swap
Dirty:               472 kB   Dimensione dati nella Cached
Writeback:             0 kB
AnonPages:        286416 kB
Mapped:           116812 kB
Shmem:              5172 kB
Slab:             277396 kB
SReclaimable:     159744 kB
SUnreclaim:       117652 kB
KernelStack:        2032 kB
PageTables:        15288 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3125328 kB
Committed_AS:     942864 kB   Memoria necessaria per non
                              incorrere in un Out Of Memory
VmallocTotal:34359738367 kB
VmallocUsed:      309532 kB
VmallocChunk:34359395836 kB
DirectMap4k:      792192 kB
DirectMap2M:     1304576 kB