{"id":115,"date":"2017-09-08T11:07:07","date_gmt":"2017-09-08T09:07:07","guid":{"rendered":"http:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/?p=115"},"modified":"2020-03-11T15:00:36","modified_gmt":"2020-03-11T14:00:36","slug":"zfs-terminologie-et-commandes-de-bases","status":"publish","type":"post","link":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/2017\/09\/08\/zfs-terminologie-et-commandes-de-bases\/","title":{"rendered":"ZFS terminologie et commandes de bases"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Avec ZFS on parlera de <strong>datasets<\/strong>, pr\u00e9sents dans des <strong>zpools<\/strong>, compos\u00e9s de plusieurs <strong>vdev<\/strong>&nbsp; repr\u00e9sentant eux-m\u00eame les disques concrets. Pour mieux comprendre, voici un exemple :<\/p>\n<p>Nous avons quatre disques durs, de 1 Go chacun. Nous allons les utiliser de&nbsp;fa\u00e7on \u00e0 avoir un pool de stockage de 2 Go r\u00e9pliqu\u00e9s :<\/p>\n<pre class=\"lang:default decode:true\"># zpool create -f -o ashift=12 tank mirror \/home\/spydemon\/hdd1 \/home\/spydemon\/hdd2 mirror \/home\/spydemon\/hdd3 \/home\/spydemon\/hdd4\n# zpool status\n                                pool: tank\nstate: ONLINE\n                                scan: none requested\nconfig:\n\n\tNAME                     STATE     READ WRITE CKSUM\n\ttank                     ONLINE       0     0     0\n\t  mirror-0               ONLINE       0     0     0\n\t    \/home\/spydemon\/hdd1  ONLINE       0     0     0\n\t    \/home\/spydemon\/hdd2  ONLINE       0     0     0\n\t  mirror-1               ONLINE       0     0     0\n\t    \/home\/spydemon\/hdd3  ONLINE       0     0     0\n\t    \/home\/spydemon\/hdd4  ONLINE       0     0     0\n\nerrors: No known data errors\n\n# sudo zfs list\nNAME   USED  AVAIL  REFER  MOUNTPOINT\ntank  56,5K  1,95G    19K  \/tank<\/pre>\n<p>Nous pouvons \u00e0 pr\u00e9sent directement exploiter le <strong>zpool<\/strong>&nbsp;<em>tank<\/em>, ou alors le segmenter en diff\u00e9rents <strong>datasets :<\/strong><\/p>\n<pre class=\"\">zfs create tank\/dataset1\nzfs create tank\/dataset2<\/pre>\n<pre class=\"lang:default decode:true\">zfs list\nNAME            USED  AVAIL  REFER  MOUNTPOINT\ntank            468K  11,6G    96K  \/tank\ntank\/dataset1    96K  11,6G    96K  \/tank\/dataset1\ntank\/dataset2    96K  11,6G    96K  \/tank\/dataset2\n<\/pre>\n<p>Voici un sch\u00e9ma pour mieux comprendre :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2458 size-full\" src=\"http:\/\/remics.lmgc.univ-montp2.fr\/memo\/wp-content\/uploads\/2017\/09\/schema.png\" alt=\"\" width=\"538\" height=\"300\"><\/p>\n<p>Nous avons con\u00e7u deux <strong>vdevs<\/strong> :&nbsp;<em>mirror-0<\/em>&nbsp;et&nbsp;<em>mirror-1<\/em>&nbsp;appartenant tous les deux au <strong>zpool<\/strong>&nbsp;<em>tank<\/em>&nbsp;dont la taille efficace est de 2 Go. Il est mont\u00e9 sur&nbsp;<em>tank<\/em>&nbsp;dans l&rsquo;arborescence.<\/p>\n<h1>Renommer et lister un dataset<\/h1>\n<pre class=\"lang:default decode:true\">Renommer un dataset :\nzfs rename tank\/dataset1 tank\/data\n\nLister les datasets :\nzfs list \n<\/pre>\n<h1>Snapshot en local<\/h1>\n<pre class=\"lang:default decode:true\">Cr\u00e9ation : \nzfs snapshot tank\/data@one\n\nLister :\nzfs list -t snapshot\n\b\nRendre visible le dossier snapshot :\nzfs set snapdir=visible tank\/data\n\nAfficher les modifications depuis le snapshot :\nzfs diff tank\/data@one\n<\/pre>\n<h1>Compression<\/h1>\n<pre class=\"lang:default decode:true\">\u00c9tat :\nzfs get compression zfs_data \nNAME      PROPERTY     VALUE     SOURCE\nzfs_data  compression  lz4       local\n\nActiver :\nzfs set compression=lz4 zfs_data\n<\/pre>\n<h1>Znapzend (snapshot distant)<\/h1>\n<p>Nous allons utiliser znapzend pour envoyer les snapshot d&rsquo;un serveur de production \u00ab\u00a0servprod\u00a0\u00bb vers un serveur de sauvegarde \u00ab\u00a0servsav\u00a0\u00bb.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/oetiker\/znapzend\">Installer<\/a> znapzend sur&nbsp;servprod<\/li>\n<li>ensuite il faut <a href=\"https:\/\/github.com\/oetiker\/znapzend\/tree\/master\/init\">cr\u00e9er un service znapzend<\/a> dans le fichier <em>\/etc\/init\/znapzend.conf<\/em><\/li>\n<li>puis d\u00e9marrer le service : <em>service znapzend start<\/em><\/li>\n<li>ajouter mbuffer<\/li>\n<li>cr\u00e9ation du dataset sur servsav : <em>zfs create zfs_sav\/TestNorbert<\/em><\/li>\n<li>\u00e9change de clef ssh de servprod sur servsav<\/li>\n<li>lancer le processus de backup* du dataset <em>data,&nbsp; <\/em>avec la politique suivante :<em> garde un snapshot toutes les minutes pendant 30 minutes et copie sur&nbsp;servsav.<\/em><\/li>\n<\/ul>\n<blockquote><p>*En langage ZFS, les processus de backup sont appel\u00e9s <strong>PLAN de snapshot.&nbsp;<\/strong>Voir plus bas pour un <strong>PLAN<\/strong> plus op\u00e9rationnel.<\/p><\/blockquote>\n<ul>\n<li>commande \u00e0 lancer sur&nbsp;servprod pour ex\u00e9cuter le <strong>PLAN<\/strong> :<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">znapzendzetup create SRC '30min=&gt;1min' tank\/data DST '30min=&gt;1min' root@servsav:zfs_sav\/TestNorbert<\/pre>\n<blockquote><p>Au bout de 30mn servprod \u00e0 g\u00e9n\u00e9r\u00e9 30 snapshot (SRC &rsquo;30min=&gt;1min&rsquo;) . A la 31\u00e8me minutes le syst\u00e8me supprime le snapshot le plus vieux et g\u00e9n\u00e8re un nouveau snapshot. Ainsi il reste toujours 30 snapshot. ET ainsi de suite, la fen\u00eatre des snapshot ce d\u00e9cale dans le temps. De la m\u00eame mani\u00e8re , l&rsquo;attribut&nbsp; <em>DST &rsquo;30min=&gt;1min&rsquo; ,&nbsp;<\/em>d\u00e9finie la politique de r\u00e9tention des snapshots sur le serveur distant.<\/p><\/blockquote>\n<ul>\n<li>lister les snapshots sur servprod :<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true \">root@servprod:\/tank\/data# zfs list -t snap\nNAME                          USED  AVAIL  REFER  MOUNTPOINT\ntank\/data@one                  68K      -   108K  -\ntank\/data@two                  72K      -   116K  -\ntank\/data@2017-09-15-174200      0      -   120K  -\ntank\/data@2017-09-15-174300      0      -   120K  -\ntank\/data@2017-09-15-174400      0      -   120K  -\ntank\/data@2017-09-15-174500      0      -   120K  -\ntank\/data@2017-09-15-174600      0      -   120K  -\ntank\/data@2017-09-15-174700      0      -   120K  -\ntank\/data@2017-09-15-174800      0      -   120K  -\ntank\/data@2017-09-15-174900      0      -   120K  -\ntank\/data@2017-09-15-175000      0      -   120K  -\ntank\/data@2017-09-15-175100      0      -   120K  -\ntank\/data@2017-09-15-175200      0      -   120K  -\ntank\/data@2017-09-15-175300      0      -   120K  -\ntank\/data@2017-09-15-175400      0      -   120K  -\ntank\/data@2017-09-15-175500      0      -   120K  -\ntank\/data@2017-09-15-175600      0      -   120K  -\ntank\/data@2017-09-15-175700      0      -   120K  -\ntank\/data@2017-09-15-175800      0      -   120K  -\ntank\/data@2017-09-15-175900      0      -   120K  -\ntank\/data@2017-09-15-180000      0      -   120K  -\ntank\/data@2017-09-15-180100      0      -   120K  -\ntank\/data@2017-09-15-180200      0      -   120K  -\ntank\/data@2017-09-15-180300      0      -   120K  -\ntank\/data@2017-09-15-180400      0      -   120K  -\ntank\/data@2017-09-15-180500      0      -   120K  -\ntank\/data@2017-09-15-180600      0      -   120K  -\ntank\/data@2017-09-15-180700      0      -   120K  -\ntank\/data@2017-09-15-180800      0      -   120K  -\ntank\/data@2017-09-15-180900      0      -   120K  -\ntank\/data@2017-09-15-181000      0      -   120K  -\ntank\/data@2017-09-15-181100      0      -   120K  -\ntank\/data@2017-09-15-181200      0      -   120K  -\n<\/pre>\n<ul>\n<li>lister les snapshots sur servsav :<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">[root@servsav~]# zfs list -t snap | grep Norbert\nzfs_sav\/TestNorbert@2017-09-15-174400  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-174500  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-174600  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-174700  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-174800  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-174900  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175000  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175100  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175200  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175300  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175400  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175500  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175600  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175700  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175800  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-175900  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180000  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180100  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180200  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180300  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180400  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180500  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180600  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180700  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180800  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-180900  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-181000  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-181100  12,8K      -   230K  -\nzfs_sav\/TestNorbert@2017-09-15-181200  12,8K      -   230K  -\n<\/pre>\n<ul>\n<li>dernier snapshot sur&nbsp;servprod :<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\">root@servprod:\/tank\/data# znapzendztatz -r tank\/data\nUSED    LAST SNAPSHOT       DATASET\n 268K   2017-09-15-181500   tank\/data\n 614K   2017-09-15-181500   root@servsav:zfs_sav\/TestNorbert\n<\/pre>\n<ul>\n<li>Le programme de backup est sauvegard\u00e9 dans les propri\u00e9t\u00e9s du dataset ZFS :<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true code\">zfs get all tank\/data | grep org.znapzend\n\ntank\/data  org.znapzend:dst_0          root@servsav:zfs_sav\/TestNorbert  local\ntank\/data  org.znapzend:pre_znap_cmd   off                              local\ntank\/data  org.znapzend:recursive      off                              local\ntank\/data  org.znapzend:src_plan       30minutes=&gt;1minutes              local\ntank\/data  org.znapzend:tsformat       %Y-%m-%d-%H%M%S                  local\ntank\/data  org.znapzend:enabled        on                               local\ntank\/data  org.znapzend:post_znap_cmd  off                              local\ntank\/data  org.znapzend:dst_0_plan     30minutes=&gt;1minutes              local\ntank\/data  org.znapzend:mbuffer        off                              local\ntank\/data  org.znapzend:zend_delay     0                                local\ntank\/data  org.znapzend:mbuffer_size   1G                               \nlocal<\/pre>\n<h1>Autre PLAN de snapshot<\/h1>\n<p>En local sur servprod :<\/p>\n<ul>\n<li>toutes les 6 heures pendant 2 jours : 2d=&gt;6h<\/li>\n<li>tous les jours pendant 1 semaine : 1w=&gt;1d<\/li>\n<\/ul>\n<p>En distant sur servsav:<\/p>\n<ul>\n<li>toutes les 6 heures pendant 2 jours : 2d=&gt;6h<\/li>\n<li>tous les jours pendant 1 semaine : 1w=&gt;1d<\/li>\n<li>garder une semaine : 1m=&gt;1w<\/li>\n<li>garder un mois : 1y=&gt;1m<\/li>\n<li>garder une semaine pendant 3 mois : 3m=&gt;1w<\/li>\n<\/ul>\n<p>Et la commande linux :<\/p>\n<pre class=\"lang:default decode:true\">znapzendzetup create SRC '2d=&gt;6h,1w=&gt;1d' tank\/data DST '2d=&gt;6h,1w=&gt;1d,1m=&gt;1w,1y=&gt;1m,3m=&gt;1w' root@servsav:zfs_sav\/TestNorbert<\/pre>\n<blockquote><p>Red\u00e9marrer le service znapzend pour une prise en compte de toute modification du PLAN<\/p><\/blockquote>\n<pre class=\"lang:default decode:true\">systemctl reload znapzend.service<\/pre>\n<h3>Ajouter mbuffer au PLAN<\/h3>\n<pre class=\"lang:default decode:true\">znapzendzetup edit --mbuffer=\/usr\/bin\/mbuffer SRC tank\/data\nrecharger le plan<\/pre>\n<h3>Ajouter le dump de la BDD au plan avant la creation des snapshots<\/h3>\n<pre class=\"lang:default decode:true\">znapzendzetup edit --pre-snap-command=\/var\/pgsave\/bin\/pg_seafile.sh SRC tank\/data\nrecharger le plan<\/pre>\n<p>&nbsp;<\/p>\n<h1>R\u00e9f\u00e9rences<\/h1>\n<ul>\n<li><a href=\"https:\/\/blog.netapsys.fr\/petite-introduction-a-zfs\/\">intro<\/a><\/li>\n<li><a href=\"https:\/\/journaldunadminlinux.fr\/tutoriel-tuto-zfs-linux\/\">snapshot<\/a><\/li>\n<li><a href=\"https:\/\/morph027.gitlab.io\/post\/zfs-snapshotting-using-znapzend\/\">snapshot2<\/a><\/li>\n<li><a href=\"https:\/\/www.julp.fr\/blog\/posts\/17-freebsd-zfs-utilisation-des-snapshots\">snap3<\/a><\/li>\n<li><a href=\"https:\/\/pthree.org\/2012\/12\/04\/zfs-administration-part-i-vdevs\/\">zfs admin<\/a><\/li>\n<li><a href=\"https:\/\/www.osnet.eu\/fr\/content\/news\/quest-ce-que-le-syst%C3%A8me-de-fichiers-zfs\">c&rsquo;est quoi ZFS<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/oetiker\/znapzend\/blob\/master\/doc\/znapzendzetup.pod\">znapzendzetup<\/a><\/li>\n<li><a href=\"https:\/\/braindump.ca\/doku.php\/zfs_snapshot_send_receive\">mettre en place znapzend de A \u00e0 Z<\/a><\/li>\n<li><a href=\"https:\/\/manual.seafile.com\/deploy\/start_seafile_at_system_bootup.html\">comment configurer un service en fonction de l&rsquo;OS<\/a><\/li>\n<li><a href=\"http:\/\/remics.lmgc.univ-montp2.fr\/memo\/wp-content\/uploads\/2017\/09\/CafeTech-ZFS.pdf\">CafeTech-ZFS<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Avec ZFS on parlera de datasets, pr\u00e9sents dans des zpools, compos\u00e9s de plusieurs vdev&nbsp; repr\u00e9sentant eux-m\u00eame les disques concrets. Pour mieux comprendre, voici un exemple : Nous avons quatre disques durs, de 1 Go chacun. Nous allons les utiliser de&nbsp;fa\u00e7on \u00e0 avoir un pool de stockage de 2 Go r\u00e9pliqu\u00e9s : # zpool create &hellip; <a href=\"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/2017\/09\/08\/zfs-terminologie-et-commandes-de-bases\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">ZFS terminologie et commandes de bases<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-115","post","type-post","status-publish","format-standard","hentry","category-sys"],"_links":{"self":[{"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/posts\/115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/comments?post=115"}],"version-history":[{"count":11,"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/posts\/115\/revisions"}],"predecessor-version":[{"id":304,"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/posts\/115\/revisions\/304"}],"wp:attachment":[{"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/media?parent=115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/categories?post=115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lmgc.univ-montp2.fr\/perso\/norbert-deleutre\/wp-json\/wp\/v2\/tags?post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}