mardi, juin 14, 2016

Partitionner un gros disque sous NetBSD 7 avec GPT, dkctl, wedges

Introduction

Partitionner un gros disque, c.a.d. qui est au delà des 2To, nécessite d'utiliser "autre chose" que ce bon vieux fdisk, une table des partitions classique et son MBR...

Exit donc disklabel, fdisk, newfs.

Bienvenu GPT, dkctl, drvctl et les wedges

(a wedge = un coin, comme un coin pour fendre les bûches... bravo la métaphore, on fend donc les disques en slices partitions).

Note de précaution :
Actuellement (06.2016), ces différents outils ont un comportement inconsistant, certains traduisent les noms de device automatiquement vers le raw device correspondant, d'autres non. Gardez à l'esprit que NetBSD fait la différence entre un device type /dev/wd1 (représentation logique) et son raw device type /dev/rwd1 (père, ou représentation au format brut, direct).
De plus... une "partition" correspond au raw device, la 'd'. Donc /dev/wd1d c'est le raw device.
Difficile de faire plus flou, surtout en venant de Linux... des discutions sont en cours pour simplifier tout ça, espérons que ça aboutira rapidement.

Ce post est donc autant une "note à moi même" qu'un tutorial en français et sans prétention pour le bénéfice des utilisateurs de NetBSD - fr ;)

Bref.




Voilà un petit guide pour partitionner un gros disque, ici "wd1" (soit le second disque attaché en SATA sur une configuration type amd64).


  • Effacer le début du disque
# dd if=/dev/zero of=/dev/rwd1d bs=1m count=10
10+0 records in
10+0 records out
10485760 bytes transferred in 0.025 secs (419430400 bytes/sec)


On s'adresse au disque physique, le raw device, donc c'est rwd1d car "dd" est basique et suit à la lettre les arguments que vous lui précisez, sans faire de déduction ou de traduction...

  • Créer une table GPT
# gpt create wd1

(on aurait pu faire aussi gpt create wd1d pour désigner le raw device, mais gpt fait partie des outils qui déduit tout seul le raw device d'après le nom court du device).




  • Afficher la table GPT
Juste pour vérifier, gpt show wd1 montre quelque chose comme ceci:

# gpt show wd1
  start   size  index  contents
      0      1         PMBR
      1      1         Pri GPT header
      2     32         Pri GPT table
     34  20413         <================= ici l'espace vide
  20447     32         Sec GPT table
  20479      1         Sec GPT header




  • Créer une partition avec GPT 
Une partition à au minimum un nom (ex: celui qu'on utilisera pour son point de montage), et un type de système de fichier (ffs, raid).

Ici on crée une seule partition nomée WDC3T sur tout l'espace libre:
 
# gpt add -l WDC3T -t ffs wd1

et GPT répond:

Partition 1 added, use:
        dkctl wd1 addwedge 64 20352
to create a wedge for it



Note:
Actuellement, les utilitaires de gestion de disque tels que GPT et dkctl ont on fonctionnement assez basique. Une modification de partition faite avec GPT n'est visible par dkctl qu'après un redémarrage (reboot) ou un rechargement de la table des partitions par le système (soit un on/off du device).


Donc la solution la plus simple est de redémarrer maintenant, avant de passer à la suite.
Ou logiciellement de  détacher et le ré-attacher le device wd1 (avec le gestionnaire de devices et de contrôle de bus système "drvctl"):

# drvctl -d wd1

Vous pouvez vérifier en affichant le journal "dmesg" pour voir si le disque est bien détaché, exemple:
# dmesg
<...>
wsdisplay0: screen 3 added (80x25, vt100 emulation)
wsdisplay0: screen 4 added (80x25, vt100 emulation)
balloon0 at xenbus0 id 0: Xen Balloon driver
balloon0: current reservation: 524288 KiB
wd1: detached <==== le disque est hors ligne


et de le ré-attacher :

# drvctl -a ata_hl -r atabus3   <==== atabus4, ou atabus3, atabus2...1 selon l'emplacement du device sur les ports SATA de votre contrôleur.


Vous pouvez afficher le journal "dmesg" pour voir ré-apparaître le device wd1, exemple:
# dmesg
ahcisata0 port 1: device present, speed: 3.0Gb/s
wd1 at atabus3 drive 0
<==== re-voilà le disque
wd1:
wd1: drive supports 16-sector PIO transfers, LBA48 addressing
wd1: 2794 GB, 5814021 cyl, 16 head, 63 sec, 512 bytes/sect x 5860533168 sectors
wd1: GPT GUID: 84068778-760f-469d-b225-994610be801f




  • Découper l'espace disque avec un coin et un grand coup de marteau (créer les wedges)
On utilise l'utilitaire de gestion des disques dkctl  (DisK ConTroL) pour créer un wedge sur la partition que nous venons de créer (WDC3T).

# dkctl wd1 makewedges

Afficher la liste des wedges, pour vérifier ce que vous venez de créer:

# dkctl wd1 listwedges
/dev/rwd1d: 1 wedge:
dk0: WDC3T, 5860533101 blocks at 34, type: ffs
 

Au passage, notez que j'ai appellé la commande avec "wd1" comme nom de device, et que dkctl en a déduit le raw device "rwd1d".
Le nom du wedge est WDC3T, cf. le nom de la partition GPT.
Le nom du device qui porte le wedge est dk0.

Heureusement, les noms de devices, de raw devices, de wedge et acronymes barbares c'est fini, à partir de maintenant vous pouvez manipuler le nom symbolique de la partition... ouf!
Ca sera donc "WDC3T" pour la suite des opérations.


  • Formater un wedge
En utilisant la commande newfs, avec les arguments habituels pour choisir un format de système de fichiers (ici fast file system v2, avec journalisation):

# newfs -O 2 NAME=WDC3T
/dev/rdk0: 2861588.5MB (5860533096 sectors) block size 32768, fragment size 4096
        using 3855 cylinder groups of 742.31MB, 23754 blks, 46848 inodes.
super-block backups (for fsck_ffs -b #) at:
192, 1520448, 3040704, 4560960, 6081216, 7601472, 9121728, 10641984, 12162240, 13682496, 15202752, 16723008, 18243264, 19763520, 21283776, 22804032, 24324288, 25844544, 27364800, 28885056,
...........
newfs répond avec le comptage habituel pour le formatage d'une partition, et en déduisant le nom du raw device crée à l'instant avec dkctl : /dev/rdk0.
On aurai donc pu utiliser le nom du device dkctl, soit newfs -O 2 /dev/dk0
  •  Monter le wedge sur un point de montage, créer une entrée dans fstab, etc...

A partir de maintenant vous pouvez manipuler le wedge (WDC3T) comme d'habitude, donc pour monter ce wedge dans /mnt/WDC3T :

# mount -o log NAME=WDC3T /mnt/WDC3T/
ou
# mount -o log /dev/dk0 /mnt/WDC3T/

# mount
/dev/wd0a on / type ffs (log, local)
kernfs on /kern type kernfs (local)
ptyfs on /dev/pts type ptyfs (local)
procfs on /proc type procfs (local)
tmpfs on /var/shm type tmpfs (local)
/dev/dk0 on /mnt/WDC3T type ffs (log, local)
<==== une petite dernière pour la route, c'est le nom du device dkctl qui s'affiche, alors qu'on pourrait préférer y voir "WDC3T"...