Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| elearning:workbooks:solaris:10:junior:l116 [2019/11/30 15:36] – admin | elearning:workbooks:solaris:10:junior:l116 [2020/01/30 03:28] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ~~PDF: | ~~PDF: | ||
| + | |||
| + | Version: **2020.01** | ||
| Dernière mise-à-jour : ~~LASTMOD~~ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
| - | |||
| - | Version: 1.11.01 | ||
| ======SO210 - Gestion du système de fichiers ZFS====== | ======SO210 - Gestion du système de fichiers ZFS====== | ||
| - | |||
| - | =====Préparation de la VM Solaris 10==== | ||
| - | |||
| - | Éteignez la VM Solaris 10. Dans la section **Stockage** de l' | ||
| - | |||
| - | ^ Type ^ Taille ^ Nom ^ | ||
| - | | vmdk | 200 Mb | Disk1 | | ||
| - | | vmdk | 200 Mb | Disk2 | | ||
| - | | vmdk | 200 Mb | Disk3 | | ||
| - | | vmdk | 200 Mb | Disk4 | | ||
| - | | vmdk | 200 Mb | Disk5 | | ||
| - | | vmdk | 20 Gb | Mirror | | ||
| - | |||
| - | Re-démarrez la VM Solaris 10. | ||
| =====Présentation de ZFS===== | =====Présentation de ZFS===== | ||
| Ligne 27: | Ligne 13: | ||
| Solaris ZFS utilise un modèle de stockage en pools qui supprime purement et simplement le concept de volumes. Ainsi, ZFS supprime les problèmes liés à la gestion des partitions, à l' | Solaris ZFS utilise un modèle de stockage en pools qui supprime purement et simplement le concept de volumes. Ainsi, ZFS supprime les problèmes liés à la gestion des partitions, à l' | ||
| - | Toutes les opérations sont des transactions copie-écriture. L' | + | Toutes les opérations sont des transactions copie-écriture. L' |
| ====Le vocabulaire ZFS==== | ====Le vocabulaire ZFS==== | ||
| Ligne 34: | Ligne 20: | ||
| ^ Terme ^ Description ^ | ^ Terme ^ Description ^ | ||
| - | | pool | Un élement | + | | pool | Un élément |
| | file system | Un **dataset** contenant répertoires et fichiers | | | file system | Un **dataset** contenant répertoires et fichiers | | ||
| | clone | Une copie d'un file system | | | clone | Une copie d'un file system | | ||
| Ligne 70: | Ligne 56: | ||
| | remove | Supprime un disque d'un pool existant | | | remove | Supprime un disque d'un pool existant | | ||
| | replace | Remplace un disque par un autre dans un pool existant | | | replace | Remplace un disque par un autre dans un pool existant | | ||
| - | | scrub | Vérifie les checksums d'un pool et répare des blocs de données | + | | scrub | Vérifie les checksums d'un pool et répare des blocs de données |
| ===La Commande zfs=== | ===La Commande zfs=== | ||
| Ligne 91: | Ligne 77: | ||
| | mount | Mounts a ZFS file system at a specific mount point | | | mount | Mounts a ZFS file system at a specific mount point | | ||
| | unmount | Unmounts a ZFS file system | | | unmount | Unmounts a ZFS file system | | ||
| + | |||
| + | =====Préparation de la VM Solaris 10==== | ||
| + | |||
| + | Éteignez la VM Solaris 10. Dans la section **Stockage** de l' | ||
| + | |||
| + | ^ Type ^ Taille ^ Nom ^ | ||
| + | | vmdk | 256 Mb | Disk1 | | ||
| + | | vmdk | 256 Mb | Disk2 | | ||
| + | | vmdk | 256 Mb | Disk3 | | ||
| + | | vmdk | 256 Mb | Disk4 | | ||
| + | | vmdk | 256 Mb | Disk5 | | ||
| + | | vmdk | 20 Gb | Mirror | | ||
| + | |||
| + | Démarrez la VM Solaris 10, créez ensuite le fichier **reconfigure** à la racine du système et re-démarrez le : | ||
| + | |||
| + | < | ||
| + | # touch / | ||
| + | # shutdown -i0 -g1 -y | ||
| + | </ | ||
| + | |||
| + | Connectez-vous à la VM et vérifiez que les disques ont été détectés : | ||
| + | |||
| + | < | ||
| + | # format | ||
| + | Searching for disks...done | ||
| + | |||
| + | |||
| + | AVAILABLE DISK SELECTIONS: | ||
| + | 0. c0t0d0 < | ||
| + | / | ||
| + | 1. c0t2d0 < | ||
| + | / | ||
| + | 2. c0t3d0 < | ||
| + | / | ||
| + | 3. c0t4d0 < | ||
| + | / | ||
| + | 4. c0t5d0 < | ||
| + | / | ||
| + | 5. c0t6d0 < | ||
| + | / | ||
| + | 6. c0t7d0 < | ||
| + | / | ||
| + | Specify disk (enter its number): ^C | ||
| + | </ | ||
| =====LAB #1 - La Gestion du Stockage ZFS===== | =====LAB #1 - La Gestion du Stockage ZFS===== | ||
| Ligne 106: | Ligne 136: | ||
| < | < | ||
| # zpool list | # zpool list | ||
| - | NAME | + | NAME SIZE ALLOC FREE CAP HEALTH |
| - | mypool | + | mypool |
| </ | </ | ||
| Ligne 114: | Ligne 144: | ||
| < | < | ||
| # zpool status | # zpool status | ||
| - | pool : mypool | + | pool: mypool |
| - | état : ONLINE | + | state: ONLINE |
| - | | + | |
| - | configuration | + | config: |
| NAME STATE READ WRITE CKSUM | NAME STATE READ WRITE CKSUM | ||
| Ligne 125: | Ligne 155: | ||
| c0t3d0 | c0t3d0 | ||
| - | erreurs | + | errors: No known data errors |
| </ | </ | ||
| Ligne 133: | Ligne 163: | ||
| # zfs list | # zfs list | ||
| NAME | NAME | ||
| - | mypool | + | mypool |
| </ | </ | ||
| Ligne 148: | Ligne 178: | ||
| # zfs create mypool/ | # zfs create mypool/ | ||
| # zfs list | # zfs list | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME |
| - | mypool | + | mypool |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| Ligne 166: | Ligne 196: | ||
| # zfs set mountpoint=/ | # zfs set mountpoint=/ | ||
| # zfs list | # zfs list | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME |
| - | mypool | + | mypool |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| Ligne 178: | Ligne 208: | ||
| ====L' | ====L' | ||
| - | Pour visualiser | + | Pour visualiser |
| < | < | ||
| # zpool get all mypool | # zpool get all mypool | ||
| - | NAME PROPERTY | + | NAME PROPERTY |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| - | mypool | + | mypool |
| </ | </ | ||
| - | Notez que la valeur d' | + | Notez que la valeur d' |
| < | < | ||
| Ligne 211: | Ligne 241: | ||
| </ | </ | ||
| - | Ajoutez maintenant en tant que spare le quatrième disque que vous avez précedement | + | Ajoutez maintenant en tant que spare le quatrième disque que vous avez précédemment |
| < | < | ||
| # zpool add mypool spare c0t5d0 | # zpool add mypool spare c0t5d0 | ||
| # zpool status mypool | # zpool status mypool | ||
| - | pool : mypool | + | pool: mypool |
| - | état : ONLINE | + | state: ONLINE |
| - | | + | |
| - | configuration | + | config: |
| NAME STATE READ WRITE CKSUM | NAME STATE READ WRITE CKSUM | ||
| Ligne 226: | Ligne 256: | ||
| c0t2d0 | c0t2d0 | ||
| c0t3d0 | c0t3d0 | ||
| - | | + | |
| - | c0t5d0 | + | c0t5d0 |
| - | erreurs | + | errors: No known data errors |
| </ | </ | ||
| Ligne 238: | Ligne 268: | ||
| < | < | ||
| # cat / | # cat / | ||
| - | 1658 | + | 909 |
| </ | </ | ||
| Ligne 252: | Ligne 282: | ||
| pool alloc | pool alloc | ||
| ---------- | ---------- | ||
| - | mypool | + | mypool |
| - | mirror | + | mirror |
| - | c0t2d0 | + | c0t2d0 |
| - | c0t3d0 | + | c0t3d0 |
| ---------- | ---------- | ||
| Ligne 261: | Ligne 291: | ||
| pool alloc | pool alloc | ||
| ---------- | ---------- | ||
| - | mypool | + | mypool |
| - | mirror | + | mirror |
| - | c0t2d0 | + | c0t2d0 |
| - | c0t3d0 | + | c0t3d0 |
| ---------- | ---------- | ||
| Ligne 270: | Ligne 300: | ||
| pool alloc | pool alloc | ||
| ---------- | ---------- | ||
| - | mypool | + | mypool |
| - | mirror | + | mirror |
| - | c0t2d0 | + | c0t2d0 |
| - | c0t3d0 | + | c0t3d0 |
| ---------- | ---------- | ||
| Ligne 279: | Ligne 309: | ||
| pool alloc | pool alloc | ||
| ---------- | ---------- | ||
| - | mypool | + | mypool |
| - | mirror | + | mirror |
| - | c0t2d0 | + | c0t2d0 |
| - | c0t3d0 | + | c0t3d0 |
| ---------- | ---------- | ||
| Ligne 288: | Ligne 318: | ||
| pool alloc | pool alloc | ||
| ---------- | ---------- | ||
| - | mypool | + | mypool |
| - | mirror | + | mirror |
| - | c0t2d0 | + | c0t2d0 |
| - | c0t3d0 | + | c0t3d0 |
| ---------- | ---------- | ||
| Ligne 303: | Ligne 333: | ||
| Tuez maintenant le processus **randomfile** : | Tuez maintenant le processus **randomfile** : | ||
| - | | + | < |
| + | ^C# kill -9 909 | ||
| + | # | ||
| + | </ | ||
| Supprimez le fichier **/ | Supprimez le fichier **/ | ||
| Ligne 309: | Ligne 342: | ||
| < | < | ||
| # rm -rf / | # rm -rf / | ||
| - | 1658 Tué | + | 909 Killed |
| </ | </ | ||
| ====Le Mise en Place d'un Quota pour un Utilisateur==== | ====Le Mise en Place d'un Quota pour un Utilisateur==== | ||
| - | Afin de mettre en palce un quota pour un utilisateur, | + | Afin de mettre en place un quota pour un utilisateur, |
| < | < | ||
| # zfs set quota=50M mypool/ | # zfs set quota=50M mypool/ | ||
| - | # zfs get quota mypool | ||
| - | NAME PROPERTY | ||
| - | mypool | ||
| # zfs list | # zfs list | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME |
| - | mypool | + | mypool |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| - | <WRAP center round important 60%> | + | Créez maintenant un fichier de données |
| - | Notez la mise en place du quota de 50Mo sur / | + | |
| - | </ | + | |
| - | + | ||
| - | Créez maintenant un fichier de donnnées | + | |
| < | < | ||
| # cat / | # cat / | ||
| - | cat : erreur en sortie | + | cat: output error (0/1040 characters written) |
| - | Quota disque dépassé | + | Disc quota exceeded |
| </ | </ | ||
| - | |||
| - | <WRAP center round important 60%> | ||
| - | Notez la phrase **Quota disque dépassé**. | ||
| - | </ | ||
| Constatez que l' | Constatez que l' | ||
| Ligne 349: | Ligne 371: | ||
| # zfs list mypool/ | # zfs list mypool/ | ||
| NAME USED AVAIL REFER MOUNTPOINT | NAME USED AVAIL REFER MOUNTPOINT | ||
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| Ligne 382: | Ligne 404: | ||
| < | < | ||
| - | # zfs snapshot mypool/ | + | # zfs snapshot mypool/ |
| </ | </ | ||
| Ligne 390: | Ligne 412: | ||
| # ls -l / | # ls -l / | ||
| total 3 | total 3 | ||
| - | drwxr-xr-x | + | drwxr-xr-x |
| </ | </ | ||
| Ligne 396: | Ligne 418: | ||
| < | < | ||
| - | # ls -l / | + | # ls -l / |
| total 2 | total 2 | ||
| - | -rw-r--r-- | + | -rw-r--r-- |
| </ | </ | ||
| - | Il est important à noter que le répertoire .zfs ne peut pas être lister | + | Il est important à noter que le répertoire .zfs ne peut pas être listé |
| < | < | ||
| Ligne 407: | Ligne 429: | ||
| / | / | ||
| total 8 | total 8 | ||
| - | drwxr-xr-x | + | drwxr-xr-x |
| - | drwxr-xr-x | + | drwxr-xr-x |
| - | -rw-r--r-- | + | -rw-r--r-- |
| </ | </ | ||
| Ligne 415: | Ligne 437: | ||
| < | < | ||
| - | # zfs snapshot -r mypool@Dec13-1 | + | # zfs snapshot -r mypool@snapshot2 |
| </ | </ | ||
| Ligne 422: | Ligne 444: | ||
| < | < | ||
| # ls / | # ls / | ||
| - | Dec13-1 | + | snapshot2 |
| # ls / | # ls / | ||
| - | Dec13 Dec13-1 | + | snapshot1 |
| </ | </ | ||
| Ligne 431: | Ligne 453: | ||
| < | < | ||
| # zfs list -t snapshot -r mypool | # zfs list -t snapshot -r mypool | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME |
| - | mypool@Dec13-1 | + | mypool@snapshot2 |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| Ligne 444: | Ligne 466: | ||
| # ls -l / | # ls -l / | ||
| total 3 | total 3 | ||
| - | -rw-r--r-- | + | -rw-r--r-- |
| - | -rw-r--r-- | + | -rw-r--r-- |
| </ | </ | ||
| Ligne 451: | Ligne 473: | ||
| < | < | ||
| - | # zfs snapshot -r mypool@Dec13-2 | + | # zfs snapshot -r mypool@snapshot3 |
| # zfs list -t snapshot -r mypool | # zfs list -t snapshot -r mypool | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME |
| - | mypool@Dec13-1 | + | mypool@snapshot2 |
| - | mypool@Dec13-2 | + | mypool@snapshot3 |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| Ligne 466: | Ligne 488: | ||
| < | < | ||
| - | # zfs diff mypool/ | + | # zfs diff mypool/ |
| M / | M / | ||
| + / | + / | ||
| Ligne 483: | Ligne 505: | ||
| | - | Supprimé | | | - | Supprimé | | ||
| - | NOtez que vous ne pouvez pas comparer les snapshots dans l' | + | Notez que vous ne pouvez pas comparer les snapshots dans l' |
| < | < | ||
| - | # zfs diff mypool/ | + | # zfs diff mypool/ |
| - | Unable to obtain diffs: | + | Unable to obtain diffs: |
| - | Not an earlier snapshot from the same fs | + | |
| </ | </ | ||
| Ligne 497: | Ligne 518: | ||
| < | < | ||
| # zfs list -t snapshot -r mypool | # zfs list -t snapshot -r mypool | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME |
| - | mypool@Dec13-1 | + | mypool@snapshot2 |
| - | mypool@Dec13-2 | + | mypool@snapshot3 |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | # zfs rollback mypool/ | + | # zfs rollback mypool/ |
| - | impossible de restaurer vers ' | + | cannot rollback to ' |
| - | utilisez | + | use ' |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| - | Supprimez donc le snapshot **Dec13-2** : | + | Supprimez donc le snapshot **snapshot3** : |
| < | < | ||
| - | # zfs destroy mypool/ | + | # zfs destroy mypool/ |
| # zfs list -t snapshot -r mypool | # zfs list -t snapshot -r mypool | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME |
| - | mypool@Dec13-1 | + | mypool@snapshot2 |
| - | mypool@Dec13-2 | + | mypool@snapshot3 |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| - | Maintenant fair un RollBack vers le snapshot **Dec13-1** : | + | Maintenant fair un RollBack vers le snapshot **snapshot2** : |
| < | < | ||
| - | # zfs rollback mypool/ | + | # zfs rollback mypool/ |
| # ls -l / | # ls -l / | ||
| total 2 | total 2 | ||
| - | -rw-r--r-- | + | -rw-r--r-- |
| </ | </ | ||
| <WRAP center round important 60%> | <WRAP center round important 60%> | ||
| - | Notez l' | + | Notez l’absence |
| </ | </ | ||
| Ligne 543: | Ligne 564: | ||
| < | < | ||
| - | # zfs clone mypool/ | + | # zfs clone mypool/ |
| # zfs list | # zfs list | ||
| - | NAME USED AVAIL REFER MOUNTPOINT | + | NAME USED AVAIL REFER MOUNTPOINT |
| - | mypool | + | mypool |
| - | mypool@Dec13-1 | + | mypool@snapshot2 |
| - | mypool@Dec13-2 | + | mypool@snapshot3 |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| - | mypool/ | + | mypool/ |
| </ | </ | ||
| Ligne 563: | Ligne 584: | ||
| # ls -l / | # ls -l / | ||
| total 2 | total 2 | ||
| - | -rw-r--r-- | + | -rw-r--r-- |
| </ | </ | ||
| Ligne 583: | Ligne 604: | ||
| < | < | ||
| # zpool status mypool | # zpool status mypool | ||
| - | pool : mypool | + | pool: mypool |
| - | état : ONLINE | + | state: ONLINE |
| - | | + | |
| - | configuration | + | config: |
| NAME STATE READ WRITE CKSUM | NAME STATE READ WRITE CKSUM | ||
| Ligne 593: | Ligne 614: | ||
| c0t2d0 | c0t2d0 | ||
| c0t3d0 | c0t3d0 | ||
| - | | + | |
| - | c0t5d0 | + | c0t5d0 |
| + | |||
| + | errors: No known data errors | ||
| - | erreurs : aucune erreur de données connue | ||
| # zpool replace mypool c0t2d0 c0t4d0 | # zpool replace mypool c0t2d0 c0t4d0 | ||
| </ | </ | ||
| Ligne 604: | Ligne 626: | ||
| < | < | ||
| # zpool status mypool | # zpool status mypool | ||
| - | pool : mypool | + | pool: mypool |
| - | état : ONLINE | + | state: ONLINE |
| - | scan: resilvered | + | scan: resilvered |
| - | configuration | + | config: |
| NAME STATE READ WRITE CKSUM | NAME STATE READ WRITE CKSUM | ||
| Ligne 614: | Ligne 636: | ||
| c0t4d0 | c0t4d0 | ||
| c0t3d0 | c0t3d0 | ||
| - | | + | |
| - | c0t5d0 | + | c0t5d0 |
| - | erreurs | + | errors: No known data errors |
| </ | </ | ||
| Ligne 624: | Ligne 646: | ||
| </ | </ | ||
| - | ====La | + | ====La |
| - | La déscrution | + | La destruction |
| < | < | ||
| # zpool destroy mypool | # zpool destroy mypool | ||
| - | </ | ||
| - | |||
| - | Notez que cette opération détruit aussi les snapshots !! : | ||
| - | |||
| - | < | ||
| # zfs list | # zfs list | ||
| - | aucun jeu de données disponible | + | no datasets available |
| </ | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | Notez que cette opération détruit aussi les snapshots !! | ||
| + | </ | ||
| ====La Création d'un Pool en RAID-5==== | ====La Création d'un Pool en RAID-5==== | ||
| Ligne 646: | Ligne 667: | ||
| # zpool create mypool raidz c0t2d0 c0t3d0 c0t4d0 spare c0t5d0 | # zpool create mypool raidz c0t2d0 c0t3d0 c0t4d0 spare c0t5d0 | ||
| # zpool status mypool | # zpool status mypool | ||
| - | pool : mypool | + | pool: mypool |
| - | état : ONLINE | + | state: ONLINE |
| - | | + | |
| - | configuration | + | config: |
| NAME STATE READ WRITE CKSUM | NAME STATE READ WRITE CKSUM | ||
| Ligne 657: | Ligne 678: | ||
| c0t3d0 | c0t3d0 | ||
| c0t4d0 | c0t4d0 | ||
| - | | + | |
| - | c0t5d0 | + | c0t5d0 |
| - | erreurs | + | errors: No known data errors |
| </ | </ | ||
| Ligne 668: | Ligne 689: | ||
| # zpool destroy mypool | # zpool destroy mypool | ||
| </ | </ | ||
| + | |||
| ====La Création d'un Pool en RAID-6==== | ====La Création d'un Pool en RAID-6==== | ||
| Ligne 675: | Ligne 697: | ||
| # zpool create mypool raidz2 c0t2d0 c0t3d0 c0t4d0 c0t5d0 spare c0t6d0 | # zpool create mypool raidz2 c0t2d0 c0t3d0 c0t4d0 c0t5d0 spare c0t6d0 | ||
| # zpool status mypool | # zpool status mypool | ||
| - | pool : mypool | + | pool: mypool |
| - | état : ONLINE | + | state: ONLINE |
| - | | + | |
| - | configuration | + | config: |
| NAME STATE READ WRITE CKSUM | NAME STATE READ WRITE CKSUM | ||
| Ligne 687: | Ligne 709: | ||
| c0t4d0 | c0t4d0 | ||
| c0t5d0 | c0t5d0 | ||
| - | | + | |
| - | c0t6d0 | + | c0t6d0 |
| - | erreurs | + | errors: No known data errors |
| </ | </ | ||
| Ligne 699: | Ligne 721: | ||
| </ | </ | ||
| - | ====Conculter | + | ====Consulter |
| La sous-commande **history** de la command **zpool** permet de consulter l' | La sous-commande **history** de la command **zpool** permet de consulter l' | ||
| Ligne 705: | Ligne 727: | ||
| < | < | ||
| # zpool history | # zpool history | ||
| - | Historique de ' | + | no pools available |
| - | 2013-06-02.21: | + | |
| </ | </ | ||
| Ligne 716: | Ligne 737: | ||
| < | < | ||
| < | < | ||
| - | Copyright © 2019 Hugh Norris. | + | Copyright © 2020 Hugh Norris. |
| </ | </ | ||
| </ | </ | ||