Au boulot, j’ai mis en place un NAS. À force de lire les louanges de ZFS, je me suis dit que c’était l’occasion idéale d’utiliser réellement ses capacités, et plus simplement comme “le filesystem de Solaris/OpenSolaris”.
Nous sommes partis de l’hypothèse suivante :
- Nous utiliserons les fonctions RAID de ZFS, et non pas le RAID5 natif fourni par le controlleur du serveur de disques; en effet, après moult lectures, il apparait que le mode RAID-Z de ZFS est non seulement plus flexible, plus rapide, mais également plus sur (voir par exemple ici ou ici)
- La partition de boot/root fonctionnera, elle, en mode mirror et sera disponible sur tous les disques
- Le reste de la place disponible formera un pool raidz. Nous aurions pu choisir raidz2, mais ce dernier nous aurait coûté de l’espace en moins.
Le serveur que nous utilisons pour ce setup comporte une carte HP de type Smart Array g6, dont le firmware ne permet pas de mode JBOD, aussi, chaque disque formera une unité logique RAID0.
Les disques ont une taille de 1To; le système occuppant moins de 10Go, nous spécifions à l’installation que nous ne souhaitons utiliser “que” 30Go pour le système, le reste sera affecté au raidz.
Une fois OpenSolaris installé sur le disque logique numero 1, nous mettons en place le mirroring sur chaque unité logique. Pour ce faire, nous allons préparer un premier disque à l’aide de la commande format puis dupliquer la table de partitions du disque 1 sur ce second disque à l’aide des commandes prtvtoc et fmthard :
# format
Searching for disks...done
AVAILABLE DISK SELECTIONS:
0. c8t0d0
/pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@0,0
1. c8t1d0
/pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@1,0
2. c8t2d0
/pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@2,0
3. c8t3d0
/pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@3,0
4. c8t4d0
/pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@4,0
5. c8t5d0
/pci@0,0/pci8086,340a@3/pci103c,3241@0/sd@5,0
Specify disk (enter its number): 1
selecting c8t1d0
[disk formatted]
No Solaris fdisk partition found
FORMAT MENU:
disk - select a disk
type - select (define) a disk type
partition - select (define) a partition table
current - describe the current disk
format - format and analyze the disk
fdisk - run the fdisk program
repair - repair a defective sector
label - write label to the disk
analyze - surface analysis
defect - defect list management
backup - search for backup labels
verify - read and display labels
save - save new disk/partition definitions
inquiry - show vendor, product and revision
volname - set 8-character volume name
! - execute , then return
quit
format> fdisk
No fdisk table exists. The default partition for the disk is:
a 100% "SOLARIS System" partition
Type "y" to accept the default partition, otherwise type "n" to edit the partition table.
y
format> quit
# prtvtoc /dev/rdsk/c8t0d0s2 |fmthard -s - /dev/rdsk/c8t1d0s2
Pour rappel, le slice numero 2 (s2) représente l’intégralité du disque.
Intervient à cet instant une astuce particulière relative à notre setup. J’ai dit plus haut que nous avons pris le parti de mirrorer la partition système sur tous les disques, cela signifie que sur chacun d’eux, nous devons disposer de deux slices, or, le disque numero 1, en cours d’utilisation, ne peut être manipulé de la sorte. Nous allons donc :
- Créer un deuxième slice sur le second disque
- Intégrer le slice 1 du second disque au pool système
- Détacher le disque 1 du pool système
- Effacer le slice système du disque numero 1
- Re-formatter le disque numero 1
- Importer la table de partition du disque 2 vers le disque 1
# format [...] Specify disk (enter its number): 1 format> partition [...] partition> 3 Part Tag Flag Cylinders Size Blocks 3 unassigned wu 0 0 (0/0/0) 0 Enter partition id tag[unassigned]: Enter partition permission flags[wu]: wm Enter new starting cyl[0]: 1955 Enter partition size[0b, 0c, 0e, 0.0mb, 0.0gb]: 900gb partition> label partition> quit format> quit
Notez que la valeur du cylindre de départ est égale au prochain cylindre disponible. Dans notre cas, le dernier cylindre de la partition système était 1954.
On attache le 1er slice du second disque à rpool
# zpool attach -f rpool c8t0d0s0 c8t1d0s0
On attend que le mirroring soit effectué (quelques secondes), puis on détache le premier disque :
# zpool detach rpool c8t0d0s0
On détruit maintenant le partitionnement du disque 1
# format
[...]
Specify disk (enter its number): 0
[...]
format> fdisk
Total disk size is 60798 cylinders
Cylinder size is 32130 (512 byte) blocks
Cylinders
Partition Status Type Start End Length %
========= ====== ============ ===== === ====== ===
1 Active Solaris2 1 60797 60797 100
SELECT ONE OF THE FOLLOWING:
1. Create a partition
2. Specify the active partition
3. Delete a partition
4. Change between Solaris and Solaris2 Partition IDs
5. Exit (update disk configuration and exit)
6. Cancel (exit without updating disk configuration)
Enter Selection:
fdisk> 3
[...]
Specify the partition number to delete (or enter 0 to exit): 1
fdisk> 1
[...]
Indicate the type of partition you want to create
1=SOLARIS2 2=UNIX 3=PCIXOS 4=Other
5=DOS12 6=DOS16 7=DOSEXT 8=DOSBIG
9=DOS16LBA A=x86 Boot B=Diagnostic C=FAT32
D=FAT32LBA E=DOSEXTLBA F=EFI 0=Exit? 1
Specify the percentage of disk to use for this partition
(or type "c" to specify the size in cylinders). 100
Should this to become the active partition? If yes, it will be
activated each time the computer is reset or turned on.
Please type "y" or "n". y
Enter Selection: 5
On exporte la table de partitions du disque 2 vers le disque 1
# prtvtoc /dev/rdsk/c8t1d0s2 |fmthard -s - /dev/rdsk/c8t0d0s2
Puis on rattache le slice 1 du disque 1 à rpool :
# zpool attach -f rpool c8t0d0s0 c8t1d0s0
Voila !
Nous pouvons maintenant préparer et importer la table des partitions sur les disques suivants grâce au même combo utilisé pour le disque 2 (format>fdisk, prtvtoc et fmthard).
Ainsi, il est maintenant possible d’attacher l’ensemble de nos slices au pool système :
zpool attach -f rpool c8t0d0s0 c8t2d0s0 zpool attach -f rpool c8t0d0s0 c8t3d0s0 etc...
Une fois ceci effectué, il est indispensable d’installer grub sur l’ensemble des disques, de façon que notre NAS puisse booter indifféremment sur n’importe lequel.
# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8t0d0s0 # installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8t1d0s0 # installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c8t2d0s0 etc...
On constate le succès de l’opération grâce à la commande zpool :
# zpool status
pool: rpool
state: ONLINE
scrub: resilver completed after 0h6m with 0 errors on Fri Apr 9 16:27:03 2010
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c8t1d0s0 ONLINE 0 0 0
c8t2d0s0 ONLINE 0 0 0
c8t0d0s0 ONLINE 0 0 0
c8t3d0s0 ONLINE 0 0 0 6.10G resilvered
c8t4d0s0 ONLINE 0 0 0 6.10G resilvered
c8t5d0s0 ONLINE 0 0 0 6.10G resilvered
errors: No known data errors
Désormais, tous nos disques disposent également d’un second slice, s3, qui sera lui affecté à un pool raidz, nous effectuons l’opération de cette façon :
# zpool create -f omnomnom raidz c8t0d0s3 c8t1d0s3 c8t2d0s3 c8t3d0s3 c8t4d0s3 c8t5d0s3
Ce qui nous donne :
# zpool status
pool: omnomnom
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
omnomnom ONLINE 0 0 0
raidz1 ONLINE 0 0 0
c8t0d0s3 ONLINE 0 0 0
c8t1d0s3 ONLINE 0 0 0
c8t2d0s3 ONLINE 0 0 0
c8t3d0s3 ONLINE 0 0 0
c8t4d0s3 ONLINE 0 0 0
c8t5d0s3 ONLINE 0 0 0
errors: No known data errors
pool: rpool
state: ONLINE
scrub: resilver completed after 0h6m with 0 errors on Fri Apr 9 16:27:03 2010
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror ONLINE 0 0 0
c8t1d0s0 ONLINE 0 0 0
c8t2d0s0 ONLINE 0 0 0
c8t0d0s0 ONLINE 0 0 0
c8t3d0s0 ONLINE 0 0 0 6.10G resilvered
c8t4d0s0 ONLINE 0 0 0 6.10G resilvered
c8t5d0s0 ONLINE 0 0 0 6.10G resilvered
errors: No known data errors
On peut dès lors utiliser les commandes ZFS pour créer un filesystem sur notre pool raidz :
# zfs create omnomnom/backup
Placer un quota :
# zfs set quota=3.5T omnomnom/backup
Ou encore exporter un autre système de fichiers en NFS :
# zfs set sharenfs=on omnomnom/share
Trop dur.
Un petit df pour la route :
# df -h
Filesystem Size Used Avail Use% Mounted on
rpool/ROOT/opensolaris
24G 2.9G 21G 13% /
swap 7.2G 332K 7.2G 1% /etc/svc/volatile
/usr/lib/libc/libc_hwcap1.so.1
24G 2.9G 21G 13% /lib/libc.so.1
swap 7.2G 8.0K 7.2G 1% /tmp
swap 7.2G 52K 7.2G 1% /var/run
rpool/export 21G 21K 21G 1% /export
rpool/export/home 21G 29K 21G 1% /export/home
rpool/export/home/imil
21G 862K 21G 1% /export/home/imil
rpool 21G 78K 21G 1% /rpool
omnomnom 4.3T 35K 4.3T 1% /omnomnom
omnomnom/backup 3.5T 32K 3.5T 1% /omnomnom/backup
omnomnom/share 4.3T 32K 4.3T 1% /omnomnom/share
Merci à nico pour ses nombreux conseils.

Recent Comments