Quanto devi sapere sui dischi per gestire con successo un sistema Linux? Quali comandi fanno cosa? Come si fa a prendere buone decisioni sul partizionamento? Che tipo di strumenti per la risoluzione dei problemi sono disponibili? In che tipo di problemi ci si può imbattere? Questo articolo copre un sacco di territorio – dall’esaminare le basi di un file system Linux alla campionatura di alcuni comandi molto utili.
Tecnologia dei dischi
Nei primi giorni di Unix e successivamente di Linux, i dischi erano fisicamente grandi, ma molto piccoli in termini di capacità di memorizzazione. Un disco da 300 megabyte a metà degli anni ’90 era grande come una scatola da scarpe. Oggi, è possibile ottenere dischi multi-terrabyte che hanno le dimensioni di una fetta di pane tostato.
Tradizionalmente, i file risiedevano all’interno di file system che risiedevano in partizioni del disco che erano esse stesse semplicemente fette di disco. Questa organizzazione domina ancora oggi, anche se i server nei grandi data center spesso assumono una struttura completamente diversa.
/\ / \ / \ / file \ / \ /==========\ / \ / file system \ / \ /==================\ / disk partition \ /======================\ / disk \ /==========================\
Questa visione semplicistica funziona ancora per molti sistemi, ma al giorno d’oggi ci sono molte complessità che rendono la gestione del disco più difficile per certi versi e più facile per altri. Un file system potrebbe essere virtuale – non più residente su un singolo disco e più complesso da gestire, ma molto più facile da ridimensionare secondo necessità. In effetti, l’intero sistema potrebbe essere virtuale. E quello che potremmo gestire come se fosse un singolo disco potrebbe essere in realtà una porzione di un array di dischi molto grande.
Gestione dei dischi
Gli amministratori di sistema generalmente hanno a che fare con molti problemi quando si tratta di gestire i dischi. Questi includono:
- Partizionare i dischi
- Creare file system
- Montare i file system
- Condividere i file system
- Monitorare lo spazio libero all’interno dei file system
- Fare il backup (e talvolta il ripristino) dei file system
Le ragioni per partizionare un disco includono:
- proteggere alcuni file system dall’esaurimento dello spazio (es.g., si può desiderare che la partizione del sistema operativo sia separata dalle directory home o dalle applicazioni per evitare che sia influenzata se i file degli utenti iniziano ad occupare una quantità eccessiva di spazio sul disco)
- migliorare le prestazioni
- allocare lo spazio di swap
- facilitare la manutenzione e i backup (es, potreste essere in grado di smontare /apps se non fa parte di / e potreste voler fare il backup di /home più frequentemente di /usr)
- facilitare un fsck più efficiente (e mirato)
- mantenere (particolarmente su sistemi di test) sistemi operativi multipli
- riserva abbastanza spazio su disco per l’espansione del file system
- condivide file system selezionati con altri sistemi
Comandi di partizionamento
Per la maggior parte dei server Linux, il partizionamento viene fatto prima che i server siano distribuiti. D’altra parte, potresti aggiungere dischi in un secondo momento o trattenere una quantità significativa di spazio libero su disco per un uso futuro.
Per fare cambiamenti o verificare le partizioni, inserite un comando come fdisk /dev/sda per avviare fdisk in modo interattivo e poi digitate m per vedere una lista delle cose che potete fare con il comando fdisk.
$ sudo fdisk /dev/sdaCommand (m for help): mCommand action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)
Come potete vedere, il comando fdisk fornisce molte funzionalità. Le partizioni impostate possono assomigliare a questa configurazione in cui sono state impostate quattro partizioni su un singolo disco – /dev/sda.
sda+------------+------------------------+--------------------+------+| / 40G | /home 80G | /apps 70G | swap |+------------+------------------------+--------------------+------+ sda1 sda2 sda3 sda4
Esaminare lo spazio su disco e le partizioni del disco
Ci sono diversi comandi eccellenti per esaminare le partizioni del disco. Il comando df è uno dei comandi più comunemente usati per riportare l’uso dello spazio su disco. Con l’opzione -h, il comando df visualizza le misurazioni nel formato più “human-friendly” e questo è, in effetti, ciò che la “h” vuole implicare. Come potete vedere nell’esempio qui sotto, le misure sono visualizzate in kilobyte, megabyte o gigabyte a seconda delle dimensioni piuttosto che usare tutte la stessa scala.
$ df -hFilesystem Size Used Avail Use% Mounted onudev 969M 4.0K 969M 1% /devtmpfs 196M 1.1M 195M 1% /run/dev/sda1 37G 4.5G 31G 13% /none 4.0K 0 4.0K 0% /sys/fs/cgroupnone 5.0M 0 5.0M 0% /run/locknone 980M 152K 979M 1% /run/shmnone 100M 36K 100M 1% /run/user/dev/sda3 28G 44M 26G 1% /apps
Il comando pydf (pensate a “python df” dato che è davvero uno script python) fornisce anche una visualizzazione molto utile dell’utilizzo del disco che mostra i punti di montaggio e piccole illustrazioni carine per quanto è piena ogni partizione.
$ pydfFilesystem Size Used Avail Use% Mounted on/dev/sda1 37G 4534M 30G 12.1 //dev/sda3 27G 44M 26G 0.2 /apps
Il comando parted mostra le informazioni sulle partizioni in un formato diverso:
$ sudo parted -lModel: ATA WDC WD800AAJS-60 (scsi)Disk /dev/sda: 80.0GBSector size (logical/physical): 512B/512BPartition Table: msdosNumber Start End Size Type File system Flags 1 1049kB 40.0GB 40.0GB primary ext4 boot 2 40.0GB 50.0GB 10.0GB primary linux-swap(v1) 3 50.0GB 80.0GB 30.0GB primary ext4
Il comando lsblk (list block devices) illustra graficamente la relazione tra i dischi e le loro partizioni e fornisce anche i numeri maggiori e minori dei dispositivi e i punti di montaggio.
$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 74.5G 0 disk├─sda1 8:1 0 37.3G 0 part /├─sda2 8:2 0 9.3G 0 part └─sda3 8:3 0 28G 0 part /apps
Il comando fdisk riporta più dettagli sulle partizioni del disco e usa numeri molto diversi. Potete anche usare fdisk per creare o cancellare partizioni, elencare lo spazio non partizionato, cambiare un tipo di partizione o verificare la tabella delle partizioni.
$ sudo fdisk -lDisk /dev/sda: 80.0 GB, 80026361856 bytes255 heads, 63 sectors/track, 9729 cylinders, total 156301488 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x000f114b Device Boot Start End Blocks Id System/dev/sda1 * 2048 78125055 39061504 83 Linux/dev/sda2 78125056 97656831 9765888 82 Linux swap / Solaris/dev/sda3 97656832 156301311 29322240 83 Linux
Il comando sfdisk è simile a fdisk, ma rende alcune attività di manipolazione delle partizioni più facili da eseguire.
$ sudo sfdisk -l -uMDisk /dev/sda: 9729 cylinders, 255 heads, 63 sectors/trackUnits = mebibytes of 1048576 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End MiB #blocks Id System/dev/sda1 * 1 38146 38146 39061504 83 Linux/dev/sda2 38147 47683 9537 9765888 82 Linux swap / Solaris/dev/sda3 47684 76318 28635 29322240 83 Linux/dev/sda4 0 - 0 0 0 Empty
NOTA: Un mebibyte (MiB) = 220 byte o 1.048.576 byte.
Il comando cfdisk può anche essere usato per visualizzare o manipolare le partizioni del disco.
$ sudo cfdisk cfdisk (util-linux 2.20.1) Disk Drive: /dev/sda Size: 80026361856 bytes, 80.0 GB Heads: 255 Sectors per Track: 63 Cylinders: 9729 Name Flags Part Type FS Type Size (MB) -------------------------------------------------------------------------- Pri/Log Free Space 1.05* sda1 Boot Primary ext4 39998.99* sda2 Primary swap 10000.27* sda3 Primary ext4 30025.98* Pri/Log Free Space 0.10* Create new partition from free space
Monitoraggio delle prestazioni del disco
Il comando iostat può visualizzare statistiche che illustrano le prestazioni dei dischi, incluso il loro utilizzo intensivo. Mostra anche importanti misurazioni che mostrano quanto è occupata la CPU e quante delle sue risorse sono usate per tipi di lavoro. Il sistema descritto di seguito è inattivo più del 95% del tempo. Ancora più importante per il nostro focus sui dischi, la %iowait (CPU in attesa di IO del disco) è molto bassa. Questo non sarebbe vero se il disco fosse insolitamente occupato e l’IO del disco fosse un collo di bottiglia.
$ iostat -x 60Linux 3.13.0-129-generic (stinkbug) 08/31/2017 _x86_64_ (2 CPU)avg-cpu: %user %nice %system %iowait %steal %idle 0.93 1.15 0.35 1.86 0.00 95.73Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda 8.37 3.26 13.41 2.79 341.14 191.82 65.79 0.61 37.60 30.40 72.14 2.52 4.08
Probabilmente uno dei comandi più informativi per guardare la salute del disco è smartctl (parte di smartmontools). Mentre il comando genera un sacco di output, fornisce preziose misurazioni che potrebbero aiutare a individuare i problemi del disco, in particolare una volta che ci si abitua a lavorare con il suo ampio output.
$ sudo smartctl -a /dev/sda1smartctl 6.2 2013-07-26 r3841 (local build)Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org=== START OF INFORMATION SECTION ===Model Family: Western Digital Caviar Blue Serial ATADevice Model: WDC WD800AAJS-60M0A0Serial Number: WD-WMAV37134378LU WWN Device Id: 5 0014ee 0015c85efFirmware Version: 02.03E02User Capacity: 80,026,361,856 bytes Sector Size: 512 bytes logical/physicalDevice is: In smartctl database ATA Version is: ATA8-ACS (minor revision not indicated)SATA Version is: SATA 2.5, 3.0 Gb/sLocal Time is: Thu Aug 31 15:30:19 2017 EDTSMART support is: Available - device has SMART capability.SMART support is: Enabled=== START OF READ SMART DATA SECTION ===SMART overall-health self-assessment test result: PASSEDGeneral SMART Values:Offline data collection status: (0x82) Offline data collection activity was completed without error. Auto Offline Data Collection: Enabled.Self-test execution status: ( 0) The previous self-test routine completed without error or no self-test has ever been run.Total time to complete Offlinedata collection: ( 2700) seconds.Offline data collectioncapabilities: (0x5b) SMART execute Offline immediate. Auto Offline data collection on/off support. Suspend Offline collection upon new command. Offline surface scan supported. Self-test supported. No Conveyance Self-test supported. Selective Self-test supported.SMART capabilities: (0x0003) Saves SMART data before entering power-saving mode. Supports SMART auto save timer.Error logging capability: (0x01) Error logging supported. General Purpose Logging supported.Short self-test routinerecommended polling time: ( 2) minutes.Extended self-test routinerecommended polling time: ( 36) minutes.SCT capabilities: (0x303f) SCT Status supported. SCT Error Recovery Control supported. SCT Feature Control supported. SCT Data Table supported.SMART Attributes Data Structure revision number: 16Vendor Specific SMART Attributes with Thresholds:ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0 3 Spin_Up_Time 0x0027 143 140 021 Pre-fail Always - 3841 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 178 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 7 Seek_Error_Rate 0x002f 100 253 051 Pre-fail Always - 0 9 Power_On_Hours 0x0032 058 058 000 Old_age Always - 31203 10 Spin_Retry_Count 0x0033 100 100 051 Pre-fail Always - 0 11 Calibration_Retry_Count 0x0032 100 100 000 Old_age Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 175184 End-to-End_Error 0x0033 100 100 097 Pre-fail Always - 0187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0188 Command_Timeout 0x0032 100 100 000 Old_age Always - 0190 Airflow_Temperature_Cel 0x0022 066 062 040 Old_age Always - 34192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 103193 Load_Cycle_Count 0x0032 200 200 000 Old_age Always - 178196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 0199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age Offline - 0SMART Error Log Version: 1No Errors LoggedSMART Self-test log structure revision number 1Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error# 1 Short offline Completed without error 00% 30349 -# 2 Extended offline Aborted by host 80% 0 -SMART Selective self-test log data structure revision number 1 SPAN MIN_LBA MAX_LBA CURRENT_TEST_STATUS 1 0 0 Not_testing 2 0 0 Not_testing 3 0 0 Not_testing 4 0 0 Not_testing 5 0 0 Not_testingSelective self-test flags (0x0): After scanning selected spans, do NOT read-scan remainder of disk.If Selective self-test is pending on power-up, resume after 0 minute delay.
Ci sono numerosi altri comandi per esaminare dischi e file system. Quelli descritti qui sono alcuni dei più utili e informativi. Usarli periodicamente ha dei vantaggi, poiché il modo più semplice per individuare i problemi è diventare così abituati all’output di comandi come questi da individuare facilmente il tipo di differenze che potrebbero indicare problemi.