Login Logout

Howto Duc

Duc est un outil qui permet d’analyser l’espace disque en créant un index, que l’on pourra ensuite visualiser avec une interface texte ou ncurses, un graphique, une GUI ou en CGI.

Installation

Un paquet est disponible à partir de Debian Stretch :

# apt install duc

Utilisation

Création de l’index

La première chose à faire est de créer un index, c’est la partie qui analyse l’espace disque pour ensuite l’afficher de différentes manières. Par défaut l’index sera créé dans $HOME/.duc.db, si l’on veut changer le chemin de l’index il faudra utiliser la variable d’environnement DUC_DATABASE ou spécifier le chemin avec -d.

L’index n’est pas forcément rattaché à un seul chemin, on peut en indexer autant qu’on veut :

$ duc index -Hpx -d /tmp/duc.idx /var/
$ duc index -Hpx -d /tmp/duc.idx /usr/

Note : La génération de l’index peut être très longue et peut prendre de la place si vous avez beaucoup de données. Il est peut être intéressant de :

  • rajouter le paramètre -p pour suivre la progression,
  • vérifier que la partition qui héberge l’index (/tmp dans l’exemple ci-dessus) soit suffisamment grande,
  • exécuter la commande dans une session Screen ou Tmux.

Consulter l’index

Voir les informations de l’index

$ duc info -d /tmp/duc.idx 
Date       Time       Files    Dirs    Size Path
2018-03-02 09:49:38   22.5K    2.4K    2.2G /var
2018-03-02 09:49:42  268.0K   24.1K    8.2G /usr

Lister le contenu de l’index

$ duc ls -d /tmp/duc.idx /usr     
  4.3G lib
  3.0G share
606.2M bin
210.5M src
 66.4M include
 35.3M sbin
 20.1M local
  6.4M lib32
  2.2M libexec
  1.7M games
  4.0K etc

$ duc ls -d /tmp/duc.idx /usr/bin/ | head
 29.9M hkt
 28.3M hokey
 24.2M node
 19.6M hot
 17.0M shellcheck
 15.7M mysql_embedded
 14.7M fwbuilder
 11.6M audacity
 11.1M rawtherapee
 10.4M qemu-system-x86_64

$ duc ls -d /tmp/duc.idx /var/log | head  
197.2M atop
 30.4M daemon.log.1
 24.1M daemon.log
 17.1M installer
  5.4M syslog.1
  2.7M messages.1
  2.4M vbox-install.log
  2.1M syslog
  1.9M kern.log.1
  1.7M ufw.log.1

Pour avoir une liste basée sur le nombre d’inode plutôt que la quantité d’octet utilisé, il faut utiliser l’option --count.

Lister le contenu de l’index avec une interface ncurses

L’interface ncurses est semblable à celle de l’outil ncdu. La touche h permettra d’afficher l’aide pour comprendre comment naviguer et interagir avec cette interface.

# duc ui -d /tmp/duc.idx /usr
Interfaces ncurses
Interfaces ncurses

Lister le contenu de l’index avec une interface graphique

Si on est sur un poste ayant un serveur X (ou en ssh -X), on pourra utiliser cette interface et utiliser la souris. Contrairement à l’interface ncurses on n’a pas d’aide en appuyant sur h, il faudra voir la liste des raccourcis dans le manuel.

$ duc gui -d /tmp/duc.idx /usr
Le GUI de Duc
Le GUI de Duc

Lister le contenu de l’index en générant une image

On peut générer une image PNG, utile pour l’envoyer à quelqu’un d’autre par exemple :

$ duc graph -d /tmp/duc.idx -o /tmp/duc.png -l8 -s 1920 /usr

Les paramètres intéressants sont :

  • -l nombre de sous-répertoires à afficher ;
  • -o chemin de sortie de l’image ;
  • -s largeur de l’image.

On appelle Duc dans un script CGI.

Créer /usr/lib/cgi-bin/duc.cgi contenant :

#!/bin/sh
/usr/bin/duc cgi -d /var/cache/duc.idx --list

Ajuster les droits :

# chmod 755 /usr/lib/cgi-bin/duc.cgi
# chown www-data: /usr/lib/cgi-bin/duc.cgi
# chmod 640 /var/cache/duc.idx
# chgrp www-data /var/cache/duc.idx

Configurer le vhost dans lequel on veut avoir accès aux graphes :

Cas Apache :

Vérifier l’activation des script CGI, avec une protection d’accès :

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory /usr/lib/cgi-bin>
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Require all denied
    Include /etc/apache2/ipaddr_whitelist.conf
</Directory>

Puis à la suite, ajouter un alias pour le CGI :

ScriptAlias /duc /usr/lib/cgi-bin/duc.cgi

Cas Nginx :

    location /duc {
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /usr/lib/cgi-bin/duc.cgi;
    }

TODO : accès sécurisé (whitelist dans les snippets).

Puis, mettre en place un cron pour indexer le contenu, par exemple de /home :

# cat /etc/cron.d/duc
30 6  * * * root /usr/bin/ionice -c3 /usr/bin/duc index -q -d /var/cache/duc.idx /home && /bin/chmod 640 /var/cache/duc.idx && /bin/chgrp www-data /var/cache/duc.idx

Il y aura besoin du paquet fcgiwrap pour le socket.

Plomberie

Quelques options utiles :

  • -H : Compter les mêmes inodes une seule fois ;
  • -e : Exclure les fichiers correspondant (ne correspond que au nom du fichier et non de son PATH complet) ;
  • -p : Affiche la progression de l’indexation.
  • -x : Comme pour la commande du, limite au FS analysé
# duc index -p -H -e "*.log*" -d /backup/duc.idx /backup/jails
# duc index -p -H -d /backup/duc.idx /backup/jails 

Pour exclure un répertoire (par exemple backup/ contenant de nombreux fichiers), se placer dessus et faire :

# duc index -p -e "backup" -d duc.idx .

Cron

Il peut être judicieux de créer un cron pour faire une indexation journalière, très pratique quand couplé avec l’interface CGI.

30 6  * * * root /usr/bin/ionice -c3 /usr/bin/duc index -q -d /var/cache/duc.idx / && /bin/chmod 640 /var/cache/duc.idx && /bin/chgrp www-data /var/cache/duc.idx