Pamięć dyskowa

DYSKI i PARTYCJE

Zob. http://www.ibm.com/developerworks/library/l-lpic1-102-1/

Dane gromadzone są na pojedynczych dyskach lub grupach dysków zorganizowanych w fizyczne wolumeny lub macierze dyskowe. Dyski mogą być typu SATA, SAS, SSD.

Oto budowa tradycyjnego dysku:

../../../_images/architektura-dysku.png

Na dysk składają się sektory, które można grupować w partycje, czyli ciągłe obszary dysku. Informacja o partycjach, ich rozmiarze i przeznaczeniu, nazwie, itp. jest przechowywana w tablicy partycji.

Oto jakie informacje można uzyskać o pewnym dysku SATA przy pomocy komend:

  • fdisk

    # fdisk -l  /dev/sda
    Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: gpt
    Disk identifier: CF6D32A2-909C-4745-9A63-9B35E2014598
    
    Device         Start       End   Sectors   Size Type
    /dev/sda1       2048      4095      2048     1M BIOS boot
    /dev/sda2      16384    733183    716800   350M Microsoft basic data
    /dev/sda3     733184 105611263 104878080    50G Microsoft basic data
    /dev/sda4  105611264 106635263   1024000   500M Linux filesystem
    /dev/sda5  106637312 976773119 870135808 414.9G Linux LVM
    
  • parted

    # parted /dev/sda print
    Model: ATA HGST HTS725050A7 (scsi)
    Disk /dev/sda: 500GB
    Sector size (logical/physical): 512B/4096B
    Partition Table: gpt
    Disk Flags:
    
    Number  Start   End     Size    File system  Name                  Flags
     1      1049kB  2097kB  1049kB               BIOS boot partition   bios_grub
     2      8389kB  375MB   367MB   ntfs         Microsoft basic data  msftdata
     3      375MB   54.1GB  53.7GB  ntfs         Microsoft basic data  msftdata
     4      54.1GB  54.6GB  524MB   ext4         Linux filesystem
     5      54.6GB  500GB   446GB                Linux LVM             lvm
    
    # parted /dev/sda unit s print
    Model: ATA HGST HTS725050A7 (scsi)
    Disk /dev/sda: 976773168s
    Sector size (logical/physical): 512B/4096B
    Partition Table: gpt
    Disk Flags:
    
    Number  Start       End         Size        File system  Name                  Flags
     1      2048s       4095s       2048s                    BIOS boot partition   bios_grub
     2      16384s      733183s     716800s     ntfs         Microsoft basic data  msftdata
     3      733184s     105611263s  104878080s  ntfs         Microsoft basic data  msftdata
     4      105611264s  106635263s  1024000s    ext4         Linux filesystem
     5      106637312s  976773119s  870135808s               Linux LVM             lvm
    
  • gdisk

    # gdisk -l /dev/sda
    
     GPT fdisk (gdisk) version 1.0.1
    
     Partition table scan:
       MBR: protective
       BSD: not present
       APM: not present
       GPT: present
    
     Found valid GPT with protective MBR; using GPT.
     Disk /dev/sda: 976773168 sectors, 465.8 GiB
     Logical sector size: 512 bytes
     Disk identifier (GUID): CF6D32A2-909C-4745-9A63-9B35E2014598
     Partition table holds up to 128 entries
     First usable sector is 34, last usable sector is 976773134
     Partitions will be aligned on 2048-sector boundaries
     Total free space is 16365 sectors (8.0 MiB)
    
     Number  Start (sector)    End (sector)  Size       Code  Name
        1            2048            4095   1024.0 KiB  EF02  BIOS boot partition
        2           16384          733183   350.0 MiB   0700  Microsoft basic data
        3          733184       105611263   50.0 GiB    0700  Microsoft basic data
        4       105611264       106635263   500.0 MiB   8300  Linux filesystem
        5       106637312       976773119   414.9 GiB   8E00  Linux LVM
    

    Komenda sgdisk -l /dev/sda daje analogiczną informację, ale bez sekcji Partition table scan.

W przypadku dysku SSD otrzymujemy takie informacje:

# parted /dev/sdb  print
Model: ATA SanDisk SSD U110 (scsi)
Disk /dev/sdb: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
1      1049kB  16.0GB  16.0GB  primary  ext4

Jeśli mamy w systemie dostępną tradycyjną dyskietkę o pojemności 1.44 MB, to jej opis wygląda następująco:

# fdisk /dev/fd0
Disk /dev/fd0: 1 MB, 1474560 bytes
2 heads, 18 sectors/track, 80 cylinders
Units = cylinders of 36 * 512 = 18432 bytes

 Device Boot      Start         End      Blocks   Id  System

Pierwszy sektor dysku, tzw. MBR (sektor 0, Master Boot Record) zawiera kod programu do ładowania systemu operacyjnego oraz tabelę partycji MSDOS. Tego typu tablica ma 4 pozycje po 16 bajtów każda, dzięki czemu można zdefiniować

  • maksymalnie 4 partycje typu podstawowego (primary)

  • 3 partycje podstawowe i partycję rozszerzoną (extended)

    Partycja rozszerzona pozwala zdefiniować wiele partycji logicznych. Najpierw definiowana jest pierwsza poprzez wskazanie adresu pierwszego sektora partycji logicznej. W nim umieszczana jest tabela partycji z adres drugiej partycji logicznej, itd.

Partycje ograniczona są do 232 x 512 B=2 TiB.

Poprawny sektor zerowy musi kończyć się sygnaturą AA55.

W przypadku używania tablicy GPT (GUID Partition Table, standard UEFI) liczba partycji jest dowolna (domyślnie 128).

Zalety GPT:

  • LBA 0: określa MBR dla zachowania wstecznej kompatybilności, protective MBR z~partycją typu 0xEE wypełniającą cały dysk lub partycję długości 2~TiB

  • LBA 1: nagłówek określa maksymalną liczbę partycji (domyślnie 128), wielkość opisu partycji (domyślnie 128 B), sumy kontrolne CRC32 i UUID dysku

  • opis partycji: 64-bitowy początek i koniec (LBA), typ (UUID), nazwa (do 36 znaków kodowych UTF-16LE)

  • partycje mogą być większe niż 2 TiB (do 8 ZiB)

  • partycje są identyfikowane przez GUID (przenaszalność dysków)

  • typy partycji są identyfikowane prze GUID (brak konfliktów)

  • 46 bajtowa etykieta partycji (UTF-16)

  • CRC32 uzywane do kontroli integralności tablicy partycji

  • kopia tablicy przechowywana jest na końcu dysku

../../../_images/gpt-struct.png ../../../_images/GUID_Partition_Table_Scheme.png

Oto przykład informacji o partycji typu Linux filesystem uzyskanej przy pomocy komendy gdisk:

Command (? for help): i
Using 1
Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
Partition unique GUID: 079BF95E-A726-44E6-886E-8428ED1E6C0E
First sector: 2048 (at 1024.0 KiB)
Last sector: 206847 (at 101.0 MiB)
Partition size: 204800 sectors (100.0 MiB)
Attribute flags: 0000000000000000
Partition name: 'Linux filesystem'

Przykładowe typy partycji GPT:

0700

Microsoft basic data

0c01

Microsoft reserved

2700 Windows RE

3000

ONIE boot

3001

ONIE config

3900 Plan 9

4100

PowerPC PReP boot

4200

Windows LDM data

4201 Windows LDM metadata

4202

Windows Storage Spac

7501

IBM GPFS

7f00 ChromeOS kernel

7f01

ChromeOS root

7f02

ChromeOS reserved

8200 Linux swap

8300

Linux filesystem

8301

Linux reserved

8302 Linux /home

8303

Linux x86 root (/)

8304

Linux x86-64 root (/

8305 Linux ARM64 root (/)

8306

Linux /srv

8307

Linux ARM32 root (/)

8400 Intel Rapid Start

8e00

Linux LVM

a500

FreeBSD disklabel

a501 FreeBSD boot

… …

Z każdym dyskiem związane jest urządzenie blokowe /dev/hd[a-z] (dyski ATA), /dev/sd[a-z] (dyski SATA/SCSI), /dev/vd[a-z] (dyski maszyny wirtualnej). Jeśli dysk ma partycje, to opisane są one odpowiednimi dodatkowymi plikami w katalogu /dev nazwach typu <dysk-numer partycji>, np. /dev/sdb3.

Komenda parted pozwala na pracę w trybie wsadowym i interaktywnym. Oto kilka typowych przykładów użycia tej komendy w trybie wsadowym:

# parted [-s] /dev/vdb help
# parted [-s] /dev/vdb mklabel msdos
# parted [-s] /dev/vdb mkpart primary 1 20%
# parted [-s] /dev/vdb mkpart primary 1 100%
# parted [-s] -- /dev/vdb mkpart primary 1 -100
# parted [-s] /dev/vdb mkpart primary 1 200 mkpart primary 200 400 mkpart primary 600 800
# parted [-s] /dev/vdb set 1 bios_grub on
# parted [-s] /dev/vdb set 2 swap on
# parted [-s] /dev/vdb set 3 boot on
# parted [-s] /dev/vdb set 3 lvm on|off
# parted [-s] /dev/vdb set 3 raid on|off
# parted [-s] /dev/vdb rm 1 rm 2 rm 3

Do bardziej zaawansowanego (wsadowego) zarządzania dyskami służy komenda sgdisk. Przy jej pomocy można łatwo utworzyć plik zawierający kopię tablicy GPT:

# sgdisk -b backup-vdb.gpt /dev/vdb

W razie potrzeby można także łatwo tablicę odtworzyć:

# sgdisk -l backup-vdb.gpt /dev/vdb

W przypadku korzystania z tablicy MSDOS można archiwizować i odtwarzać cały MBR przy pomocy komendy dd:

# dd if=/dev/vda of=/root/mbr-vda.img bs=512 count=1
# dd if=/dev/vdb of=/root/mbr-vdb.img bs=512 count=1

# dd if=/dev/zero of=/dev/vdb bs=512 count=1
# dd if=/root/mbr-vdb.img of=/dev/vdb bs=512 count=1

Zawartość MBR-a może być analizowana przy pomocy komendy od:

# od -t x1 /root/mbr-vda.img

Pojemność dysku była do niedawna określona przez jego ,,geometrię’’, czyli liczbę cylindrów, ścieżek na cylinder (liczbę głowic), sektorów na ścieżkę oraz bajtów w sektorze. Teraz podaje się pojemność dysku w sektorach lub bajtach, w jednostkach takich jak MB, GB, TB, itd, gdzie 1MB=106 B, 1GB=109 B, 1TB=1012 B.

LOGICZNE WOLUMINY

Jeśli na dysku jest tworzona jedna partycja o wielkości całej dostępnej przestrzeni dyskowej, to jej rozmiar wyznacza maksymalną przestrzeń dyskową, którą będzie można wykorzystać przy tworzeniu systemu plików.

Można obejść to ograniczenie wykorzystując do zarządzania przestrzenią dyskową system LVM (Logical Volume Management), czyli system zarządzania logicznymi woluminami:

  • Fizyczna przestrzeń na dysku (partycje dyskowe) po uzupełnieniu o dane administracyjne jest określana jako wolumin fizyczny (PV, Physical Volume) składający się z fizycznych ekstentów (PE, Physical Extent).

  • Grupę fizycznych ekstentów można przypisać do grupy woluminowej (VG, Volume Group), na którą mogą się składać fizyczne ekstenty pochodzące z tego samego lub różnych dysków.

  • Fizyczne ekstenty z danej grupy woluminowej mogą zostać przydzielone do logicznego woluminu (LV, Logical Volume), który jest odpowiednikiem tradycyjnej partycji.

  • Na logicznym woluminie tworzony jest system plików.

Tworzenie logicznego woluminu przebiega w następujących krokach:

  • tworzenie partycji LVM:

    # parted /dev/vdb mkpart primary  1   50% set 1 lvm on
    # parted /dev/vdb mkpart primary 50% 100% set 2 lvm on
    
  • tworzenie PV

    # pvcreate /dev/vdb1 /dev/vdb2
    # pvs
    
  • tworzenie GV

    # vgcreate test /dev/vdb1 /dev/vdb2
    # vgdisplay [-v test]
    
  • tworzenie LV

    # lvcreate -L 500M -n p1 test
    # lvs
    
../../../_images/lvm-colour.png

Zob. http://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Cluster_Logical_Volume_Manager/LVM_CLI.html.

Zalety LVM

  • dynamiczna zmiana wielkości systemu plików (lvextend, lvreduce, resize2fs)

  • dodawanie/ujmowanie przestrzeni fizycznej

  • przesuwanie grupy woluminu na inny nośnik fizyczny

  • tworzenie ,,zdjęć’’ logicznych woluminów

  • tworzenie woluminów zwierciadlanych (linear vs mirrored volumes)

  • przeplot (striping) – zapisywanie danych związanych z danym logicznym woluminem na fizycznych woluminach, które go tworzą

Zob. przykłady użycia LVM-a: LVM-1.

SMART

Self-Monitoring, Analysis and Reporting Technology (SMART), zob. http://www.linuxjournal.com/magazine/monitoring-hard-disks-smart?page=0,1},

Najczęściej używane komendy sprawdzające stan dysku:

# smartctl --info|-i /dev/sda
# smartctl --all|-a /dev/sda
# smartctl --xall /dev/sda

Czasami trzeba wskazać rodzaj urządzenia, gdyż urządzenie blokowe jest związane ze sterownikiem macierzy dyskowej, np. PERC:

# smartctl -a -d megaraid,[12] /dev/sda

Komendy

# smartctl --test short|long /dev/sda
# smartctl -c /dev/sda

służą do przeprowadzania testów stanu dysku.

Zob. https://www.thomas-krenn.com/en/wiki/SMART_tests_with_smartctl

The goal of the short test is the rapid identification of a defective hard drive. Therefore, a maximum run time for the short test is 2 min. The test checks the disk by dividing it into three different segments. The following areas are tested:

  • Electrical Properties: The controller tests its own electronics, and since this is specific to each manufacturer, it cannot be explained exactly what is being tested. It is conceivable, for example, to test the internal RAM, the read/write circuits or the head electronics.

  • Mechanical Properties: The exact sequence of the servos and the positioning mechanism to be tested is also specific to each manufacturer.

  • Read/Verify: It will read a certain area of the disk and verify certain data, the size and position of the region that is read is also specific to each manufacturer.

Komendy

# smartctl -l selftest /dev/sda
# smartctl -a /dev/sda

wyświetlają wyniki testu. Zestaw wyświetlanych parametrów i interpretacja ich wartości zależy od producenta sprzętu. Zob. https://www.smartmontools.org/wiki/FAQ.