Wiki Désinstaller proprement ses paquets sur sa distribution

Licence CC by-sa
Tags : aucun
0
22
mar.
2017

Sommaire

Cette page wiki était à l'origine une dépêche qui avait été rédigée en juin 2016 :
https://linuxfr.org/redaction/news/astuces-pour-desinstaller-proprement

Les auteurs: Oliver H, Yves Bourguignon, rogo, palm123, BAud, Storm et guitou

Tour d'horizon des astuces actuelles (2016) pour supprimer complètement et proprement les applications, et tout autre paquet en général. Cette dépêche ne traite pas du nettoyage en profondeur de sa machine, seulement de la désinstallation.

Avertissement : Vouloir supprimer trop de paquets peut conduire à l'instabilité du système, voire à ne plus pouvoir le redémarrer !

Suppression partielle avec apt remove

Sur une distribution Debian et dérivées, pour supprimer un logiciel nous avons le traditionnel :

sudo apt-get remove <paquet-a-supprimer>

Sur d'autres distributions nous avons les commandes suivantes (liste non exhaustive) :

sudo yum    remove <paquet-a-supprimer>  # Jusqu'à Red Hat 7
sudo dnf    remove <paquet-a-supprimer>  # Remplacement de yum
sudo zypper remove <paquet-a-supprimer>  # OpenSuse
sudo snappy remove <paquet-a-supprimer>  # Ubuntu Core

La suite de cette dépêche se concentre sur les distributions Debian et ses dérivés (comme Ubuntu).

Suppression complète avec apt purge

Mais bien souvent, nous voulons supprimer aussi les fichiers de configuration qui ont également été installés avec le logiciel. Ces fichiers de configuration sont conservés par défaut au cas où ils auraient été personnalisés, bien que la plupart du temps personne ne les modifie. Sauf cas particulier, réinstaller le logiciel va réécrire ces mêmes fichiers de configuration. Donc purge à la place de remove :

sudo apt-get purge <paquet-a-supprimer>

Qui est un raccourci à

sudo apt-get  remove --purge <paquet-a-supprimer>

Les copains de apt-get

Depuis quelques années, nous avons aussi la possibilité d'utiliser la commande apt à la place de apt-get. Et aussi le bon vieux dpkg et l'interface aptitude.

sudo apt-get  purge <paquet-a-supprimer>
sudo apt      purge <paquet-a-supprimer>
sudo dpkg   --purge <paquet-a-supprimer>
sudo aptitude purge <paquet-a-supprimer>

Mais dans tous ces cas, ces actions remove et purge n'enlèvent pas les dépendances, et oui toutes les bibliothèques qui ont été nécessaires pour installer tel ou tel logiciel et dont on ne se souvient plus et qui sont mises à jour inutilement pendant des mois, voire des années après la suppression des logiciels.

Suppression des dépendances avec apt --purge autoremove

Donc pour supprimer un logiciel et ses dépendances (du moins, celles qui ne sont pas utilisées par d'autres logiciels) nous avons apt --purge autoremove (merci à Morphé de l'équipe Ubuntu-Fr pour avoir partagé cette astuce).

sudo apt-get        --purge   autoremove  <paquet-a-supprimer>

ou encore :

sudo apt-get          purge --auto-remove <paquet-a-supprimer>
sudo apt-get remove --purge --auto-remove <paquet-a-supprimer>

aptitude en mode interactif

aptitude peut s'utiliser en ligne de commande, mais cet usage est progressivement supplanté par la commande apt. En mode curses, il permet par contre de nettoyer de façon optimale ses paquets.

Ce chapitre présente la suppression de bibliothèques (librairies) inutiles, puis des fichiers de configuration étant toujours présents malgré la suppression des paquets correspondants.

1. Supprimer les bibliothèques inutiles

  • Lancer aptitude ;
  • Ouvrir les "Preferences" dans le menu ; Comme indiqué à l'écran, on peut utiliser ctrl-t pour ouvrir le menu, ou passer par la souris ;
  • Cocher la case "Remove unused packages automatically" sous "Dependency handling" ;
  • Presser q pour quitter la configuration ;
  • Avec les flèches et entrée, déplier "Installed packages" et se placer sur "libs" ;
  • Appuyer sur M (majuscule-m) pour marquer tous les paquets sous "lib" comme étant automatiquement installé. On peut vérifier sur la page d'aide, accessible par ?, que m est l'action réciproque qui marque les paquets manuellement installés ;
  • aptitude propose alors de désinstaller les bibliothèques qui ont été installées automatiquement mais ne sont plus nécessaires. En haut à droite de la page s'affiche l'espace qui serait gagné. Appuyer sur g (go) pour amorcer cette action ;
  • Sur cette nouvelle vue "Preview" (noter l'onglet en haut de l"écran), les paquets sont regroupés selon de nouvelles catégories, la première étant ici "Packages being removed because they are no longer used". On peut la déplier et vérifier au cas par, en appuyant sur + si on veut annuler la désinstallation ;
  • Si la liste des désinstallations a été modifiée, mieux vaut fermer et réouvrir ce panneau avec q puis g ;
  • Pour purger au lieu de conserver les fichiers de configuration, utiliser _. On peut bien sûr l'appliquer à tout un groupe ;
  • Depuis le panneau de "preview", appuyer à nouveau sur g pour appliquer les modifications listées.

2. Supprimer les configurations de paquets désinstallés

  • Dans aptitude, taper l pour filtrer les paquets selon un motif de recherche. Pour info, la recherche normale est associée à / comme d'habitude, mais elle permet seulement de se déplacer dans la liste des paquets ;
  • Saisir ~c dans la boîte de dialogue, puis entrée ;
  • aptitude affiche alors une liste de tout les paquets dont il ne reste que la configuration. Appuyer sur _ demandera une purge de ce qui est surligné ;
  • Une fois désignées les cibles, g passe dans l'onglet preview et un second g applique les changements.

NB : La syntaxe pour filtrer les paquets n'est pas spécifique à aptitude, elle est définie par la bibliothèque APT. Il y a aussi d'autres paramètres APT qui influencent aptitude, par exemple le fait d'installer automatiquement les paquets recommandés (activé par défaut, désactivable dans la configuration d'aptitude ou en éditant la configuration dans /etc/apt/).

aptitude a encore bien d'autres cordes à son arc, notamment pour gérer les conflits de mises à jour en ajoutant des contraintes (monter la version de A sans désinstaller B ni rétrograder C, etc).

Suppression des dépendances avec debfoster

Mais d'autres outils sont disponibles.

sudo apt-get install debfoster
sudo debfoster <paquet-a-supprimer>-

Notez le signe « tiret du six » '-' collé à la fin du nom du paquet. Sans ce caractère « tiret du six », debfoster installe le paquet. Personnellement, je trouve cela plus pratique que d'avoir à taper install ou purge.

Un autre truc sympa avec debfoster est l'enregistrement en local de tous les paquets à conserver.
Lors de la première utilisation, debfoster demande quels paquets sont à conserver/supprimer.
Les principales réponses :

Français Anglais Explication
'o' 'y' Conserver le paquet (par défaut, appuyer juste sur [Entrée])
'n' 'n' Supprimer le paquet (par défaut c'est un apt-get --purge remove)
'm' 'p' Supprimer le paquet et les paquets qu'il maintient installés
'r' ou '?' 'i' ou '?' Affiche la description du paquet (très utile)
'd' 'u' Annuler la précédente réponse (très utile aussi)

Les auteurs de cette page wiki ne sont pas sûr d'avoir bien compris ce que signifie « Supprimer le paquet et les paquets qu'il maintient installés ». Voici notre compréhension :

  • D'abord, les paquets ont plusieurs marquages possibles. Les paquets sont tous marqués comme installés automatiquement ou manuellement (voir les commandes apt-mark showauto et apt-mark showmanual) ;
  • D'autres marquages sont possibles. Quand un paquet est installé, d'autres paquets sont recommandés/suggérés. Les paquets installés ne dépendent pas forcément de ces paquets recommandés/suggérés, mais ces derniers peuvent être marqués comme installés avec ;
  • C'est aussi le cas quand l'installation d'un paquet installe une dépendance par défaut. Mais le paquet peut fonctionner avec une autre dépendance alternative. La suppression de cette dépendance force l'installation d'une dépendance alternative…

Bon bref, encore une fois, nous ne sommes pas sûrs d'avoir bien pigé mais nous avons l'impression que répondre « Supprimer le paquet et les paquets qu'il maintient installés » (plutôt que seulement « Supprimer le paquet ») permet de virer le maximum de paquets inutiles.

Apparemment, il n'y a pas de moyen élégant pour remettre à zéro la base de donnée des paquets à conserver. Voici deux façons moches de réinitialiser cette liste des paquets :

  1. Supprimer le fichier (selon votre système, le fichier peut se trouver dans une autre arborescence)

    sudo rm -vi /var/lib/debfoster/keepers
  2. Réinstaller debfoster

    sudo debfoster debfoster-
    sudo apt install debfoster

La commande suivante permet de lister les paquets marqués « à conserver » :

debfoster --show-keepers

ou :

debfoster -a

Pour finir, notons que la configuration de debfoster peut être finement paramétrée :

sudo vim /etc/debfoster.conf

Lister les orphelins avec deborphan

À la recherche des paquets orphelins.
Généralement ce sont des bibliothèques oubliées dont aucun logiciel ne dépend.

sudo apt install deborphan
deborphan                  # Liste les bibliothèques orphelines (lib) 
deborphan --guess-all      # Liste aussi les autres dépendances orphelines
deborphan --all-packages   # Liste aussi les exécutables

Pour être sûr que certains paquets ne soit pas listés comme orphelins :

sudo deborphan --add-keep libdvdcss2 ubuntu-desktop ubuntu-restricted-extras ubuntu-minimal ubuntu-standard

Pour la suppression, trois alternatives :

  1. Passer la liste des orphelins à dpkg (ou apt ou …). Ici, c'est la philosophie « chaque petit outil fait son boulot » ;

    deborphan | xargs sudo dpkg --purge
  2. Utiliser l'interface en mode texte fournit avec le paquet deborphan ;

    sudo orphaner --purge [options deborphan]
  3. Utiliser l'interface graphique.

    sudo apt install gtkorphan
    sudo gtkorphan

aptsh

sudo apt install aptsh
sudo aptsh purge <paquet-a-supprimer>

Mais comme son suffixe sh l'indique, c'est à utiliser en mode interactif (shell)

$ sudo aptsh
Generating and mapping caches...
Reading commands history...

aptsh>  # Appuyer sur la touche [Tab] pour la liste des commandes
add              dump             policy           source
autoclean        dump-cfg         purge            stats
build-dep        dumpavail        queue*           toupgrade
changelog        help*            quit             unmet
check            install          rdepends         update
clean            listfiles        remove           upgrade
depends          ls               rls              whatis
dist-upgrade     madison          search           whichpkg
dotty            news             show
dpkg*            orphans*         showpkg
dselect-upgrade  pkgnames         showsrc

aptsh> orphans
libcdaudio1
libgmp-dev
libprocps3
libgstreamer-plugins-bad0.10-0
libboost-dev
libwebkit2gtk-3.0-dev

`wajig`
=======

https://en.wikipedia.org/wiki/Wajig

```bash
$ sudo apt install wajig
$ sudo wajig orphans
libgstreamer-plugins-bad0.10-0:amd64
libcdaudio1:amd64

Mais toute sa puissance se révèle en mode interactif :

$ sudo wajig
wajig> commnads
addcdrom           Add a Debian CD/DVD to APT's list of available sources
addrepo            Add a Launchpad PPA (Personal Package Archive) repository
aptlog             Display APT log file
autoalts           Mark the Alternative to be auto-set (using set priorities)
autoclean          Remove no-longer-downloadable .deb files from the download cache
autodownload       Do an update followed by a download of all updated packages
autoremove         Remove unused dependency packages
build              Get source packages, unpack them, and build binary packages from them.
builddeps          Install build-dependencies for given packages
changelog          Display Debian changelog of a package
clean              Remove all deb files from the download cache
contents           List the contents of a package file (.deb)
dailyupgrade       Perform an update then a dist-upgrade
dependents         Display packages which have some form of dependency on the given package
describe           Display one-line descriptions for the given packages
describenew        Display one-line descriptions of newly-available packages
distupgrade        Comprehensive system upgrade
download           Download one or more packages without installing them
editsources        Edit list of Debian repository locations for packages
extract            Extract the files from a package file to a directory
fixconfigure       Fix an interrupted install
fixinstall         Fix an install interrupted by broken dependencies
fixmissing         Fix and install even though there are missing dependencies
force              Install packages and ignore file overwrites and depends
hold               Place packages on hold (so they will not be upgraded)
info               List the information contained in a package file
init               Initialise or reset wajig archive files
install            Package installer
installsuggested   Install a package and its Suggests dependencies
integrity          Check the integrity of installed packages (through checksums)
large              List size of all large (>10MB) installed packages
lastupdate         Identify when an update was last performed
listall            List one line descriptions for all packages
listalternatives   List the objects that can have alternatives configured
listcache          List the contents of the download cache
listcommands       Display all wajig commands
listdaemons        List the daemons that wajig can start, stop, restart, or reload
listfiles          List the files that are supplied by the named package
listhold           List packages that are on hold (i.e. those that won't be upgraded)
listinstalled      List installed packages
listlog            Display wajig log file
listnames          List all known packages; optionally filter the list with a pattern
listpackages       List the status, version, and description of installed packages
listscripts        List the control scripts of the package of deb file
listsection        List packages that belong to a specific section
listsections       List all available sections
liststatus         Same as list but only prints first two columns, not truncated
localupgrade       Upgrade using only packages that are already downloaded
madison            Runs the madison command of apt-cache
move               Move packages in the download cache to a local Debian mirror
new                Display newly-available packages
newdetail          Display detailed descriptions of newly-available packages
news               Display the NEWS file of a given package
nonfree            List packages that don't meet the Debian Free Software Guidelines
orphans            List libraries not required by any installed package 
policy             From preferences file show priorities/policy (available)
purge              Remove one or more packages and their configuration files
purgeorphans       Purge orphaned libraries (not required by installed packages)
purgeremoved       Purge all packages marked as deinstall
rbuilddeps         Display the packages which build-depend on the given package
readme             Display the README file(s) of a given package
recdownload        Download a package and all its dependencies
recommended        Display packages installed as Recommends and have no dependents
reconfigure        Reconfigure package
reinstall          Reinstall the given packages
reload             Reload system daemons (see LIST-DAEMONS for available daemons)
remove             Remove packages (see also PURGE command)
removeorphans      Remove orphaned libraries
repackage          Generate a .deb file from an installed package
reportbug          Report a bug in a package using Debian BTS (Bug Tracking System)
restart            Restart system daemons (see LIST-DAEMONS for available daemons)
rpm2deb            Convert an .rpm file to a Debian .deb file
rpminstall         Install an .rpm package file
search             Search for package names containing the given pattern
searchapt          Find nearby Debian package repositories
show               Provide a detailed description of package
sizes              Display installed sizes of given packages
snapshot           Generates a list of package=version for all installed packages
source             Retrieve and unpack sources for the named packages
start              Start system daemons (see LIST-DAEMONS for available daemons)
status             Show the version and available versions of packages
statusmatch        Show the version and available versions of matching packages
stop               Stop system daemons (see LISTDAEMONS for available daemons)
tasksel            Run the task selector to install groups of packages
todo               Display the TODO file of a given package
toupgrade          List versions of upgradable packages
tutorial           Display wajig tutorial
unhold             Remove listed packages from hold so they are again upgradeable
unofficial         Search for an unofficial Debian package at apt-get.org
update             Update the list of new and updated packages
updatealternatives Update default alternative for things like x-window-manager
updatepciids       Updates the local list of PCI ids from the internet master list
updateusbids       Updates the local list of USB ids from the internet master list
upgrade            Conservative system upgrade
upgradesecurity    Do a security upgrade
verify             Check package's md5sum
versions           List version and distribution of given packages
whichpackage       Search for files matching a given pattern 

ubuntu-tweak

Pour les heureux possesseurs d'une vieille distribution de type Debian, l’interface graphique ubuntu-tweak est géniale, surtout son onglet « Nettoyage ». Mais bon, son auteur est passé depuis sur MacOS. Et personne n'a repris la maintenance de cette application. Cette application bien pratique n'est donc plus officiellement disponible pour les version récentes de Debian, Ubuntu et autres distributions dérivées. Le code source python ne compile même plus ! Néanmoins, le site getdeb.net propose un paquet tout prêt pour Ubuntu 16.04 (non testé).

Synaptic

Pour ceux qui préfèrent l’interface graphique :

sudo apt install synaptic
gksu synaptic

Cliquer en bas à gauche sur « État ».
Voici les sélections qui apparaissent alors en haut à gauche :

Menu Explication
Installés (locaux ou obsolète) Paquets installés à partir d'un .deb ou conservé d'une version précédente du système…
Installés (manuellement) Paquets installés par l'utilisateur après l'installation du système (voir apt-mark showmanual)
Installés (pouvant être supprimés) Correspond à sudo apt autoremove
Non installés (résidus de configuration) Paquets ayant été supprimés mais pas purgés (différence entre apt remove et apt purge).

Dans les menus de Synaptic, "Sélectionner pour suppression complète" correspond à apt purge.

Synaptic a 14 ans (APT a 17 ans) et utilise les bibliothèques graphiques GTK+, donc pour les environnements Gnome, Unity, XFCE…

Dans le monde GTK+, il y avait aussi GNOME apt remplacé maintenant par
GNOME Software qui se base sur PackageKit. Ce dernier est une abstraction des différents gestionnaire de paquets.

Muon

Et KDE ?
Pour ne pas faire de jaloux, un petit historique des équivalents pour les environnements basés sur Qt :

  • Il y avait adept jusqu'à la fin des années 2010 (pour les nostalgiques qui n'utilisaient pas la ligne de commande à cette époque) ;
  • Puis apper ;
  • Et maintenant, muon prend la relève.

    sudo apt install muon
    kdesu muon

Il y avait aussi KPackage remplacé par Shaman je crois…

Et les autres

Voir aussi

Merci d'apporter votre pierre à l'édifice

Et vous, quelles sont vos astuces pour désinstaller une application, une bibliothèque ou un paquet quelconque ?

Comment faire avec les autres gestionnaires de paquet ?

  • pip
  • npm
  • yum
  • dnf
  • zypper
  • snappy
  • pacman
  • portage/emerge
  • pkgsrc
  • nix

Wiki Tuto - Montage webdav-DAVFS sur Android avec Total Commander

1
7
mar.
2017

Préambule

  • DAFVS2 est entre autre utilisé pour monter localement des dossiers distant hébergés sur un serveur owncloud/nextcloud. Il utilise le protocole HTTP(S) se qui le rend plus lent que d'autres comme SSHFS mais DAVFS (webdav), lui, est compatible avec le Web.
    Il vous permet d'accéder à vos fichiers à peu près comme s'ils étaient stockés sur votre machine.
    Total Commander est un logiciel libre (licence apache v2).
    Lorsque vous lisez un fichier avec TotalCommander, ce dernier télécharge le fichier dans un dossier temporaire puis le supprime une fois que vous arrêtez d'utiliser le fichier (par exemple si vous quittez la lecture VLC).

    • Note : cette méthode ne fonctionne qu'avec Total Commander, n'est pas encore possible de monter le dossier et de le rendre disponible pour tout les autres gestionnaires de fichiers.

Installer les pré-requis

  1. Installez l'application Total Commander.
  2. Installez l'extension webdav plug-in-Total Commander

Ajouter un ou plusieurs dossiers distants

  1. Lancez Total Commander.
  2. Cliquez sur Webdav (dossiers http) DLFP
  3. Cliquez sur Nouveau Serveur DLFP
  4. Entrez un petit nom pour votre montage par exemple owncloud local
  5. Entrez les informations d'accès à votre serveur : Nom du server/repertoire => HOSTNAME:PORT/owncloud/remote.php/webdav/
  • Remplacez HOSTNAME par l'adresse IP ou le nom d'hôte de votre serveur
  • :PORT n'est nécessaire que si vous utilisez un autre port que celui par défaut.
  • /owncloud/ représente le chemin complet jusqu'au dossier de votre installation d'owncloud

  • Nom utilis.: => votre utilisateur sur votre serveur

  • MotDePasse: => le password de votre user sur le serveur

  • Cochez https:// si vous souhaitez passer par la version sécurisée de HTTP

  • Cochez "Protéger avec un mot de passe maître" si vous souhaitez restreindre l'accès au montage/démontage du dossier par un mot de passe principal
    DLFP

    1. Cliquez sur "Confirmer"
    2. C'est terminé, il ne vous reste plus qu'à monter votre dossier

Monter un ou plusieurs dossiers distant

  1. Lancez Total Commander
  2. Cliquez sur Webdav (dossiers http) DLFP
  3. Cliquez sur votre montage créé précédemment
  4. C'est terminé.

ScreenShot

DLFP
DLFP
DLFP
DLFP

Wiki Tuto - Comment synchroniser des dossiers-fichiers sur Nextcloud ou Owncloud

0
7
mar.
2017

Testé sur : Xubuntu, Raspbian (raspberry pi).

Préambule

  • Tout d'abord, sachez que les applications owncloud-client et nextcloud-client sont compatible autant avec owncloud que nextcloud. Par sécurité, sachez que Nextcloud (et je suppose owncloud) vous permet de générer des mots de passe pour vos applications. Ainsi si on vous vole votre smartphone ou pirate votre ordinateur, le malotrus ne pourra pas modifier votre mots de passe et s'emparer de votre compte: il pourra juste accéder aux données des contactes, calendriers et éventuellement du système de fichier (ce dernier vous pouvez autoriser/refuser pour chaque applications). Si vous modifiez le mot de passe de votre utilisateur, tout les mots de passes de vos applications seront supprimés (les applications devront donc toutes être reconfigurées).

Mise en place

  1. Installez l'application cliente de synchronisation.
sudo apt-get install owncloud-client
  1. Rendez-vous avec votre navigateur sur la WEBUI (interface web) de Nextcloud et connectez-vous avec votre utilisateur lambda.
  2. Dans le menu en haut à droite, rendez-vous dans "Personnel" (votre profil).
  3. Dans votre profil Personnel rendez-vous dans "Mots de passe de l'application"
  4. Entrez un nom pour reconnaître l'accès (par exemple "synchronisation PC") puis cliquez sur "Créer un nouveau mot de passe d'application"
    DLFP
    DLFP

  5. Ouvrez l'application owncloud-client (ou nextcloud-client) et cliquez sur "Nouveau" puis "Ajouter un nouveau".
    DLFP

  6. Entrez le nom de domaine (hostname) (l'URL si vous préférez) pour joindre le serveur nextcloud/owncloud puis cliquez sur "Suivant".
    DLFP

  7. Entrez votre nom d’utilisateur puis le mot de passe généré précédemment aux points 4 et 5 et cliquez enfin sur "Suivant".
    DLFP

  8. Choisissez d'outrepasser la synchronisation afin de la remettre à plus tard. ("Passer outre la configuration des dossiers"). Puis "Connexion".

  9. Cliquez sur "Ajouter une synchronisation de dossier".

  10. Choisissez le dossier local à synchroniser.
    DLFP

  11. Choisissez le dossier distant à synchroniser.
    DLFP

  12. Cliquez sur "Ajouter une synchronisation".

  13. Voila, c'est terminé !
    DLFP

Remerciement

Wiki Tuto - chiffrer côté serveur les fichiers hébergés par Nextcloud

0
27
fév.
2017

Introduction

  • Le chiffrement permet d'apporter une protection pour vos données au cas où un de vos disques se ferait voler ou bien partirait en réparation (n'oubliez pas que les types qui vont réparer vos disques peuvent tout à fait s'amuser à récupérer vos données a mauvais escient). Nextcloud dispose d'une module s'occupant de chiffrer les informations sur vos disques. Ce mécanisme permet aussi de protéger les fichiers du regards indiscret d'un administrateur système qui ne pourra plus que récupérer la liste des noms de fichiers. Attention, en cas de formatage il y a risques de pertes de données si vous perdez vos clés de chiffrement (ndlr: comment les protéger?)

Mise en place

  1. Connectez-vous en tant qu’administrateur sur l'interface web de votre Nextcloud.
  2. Déroulez le menu principal (en haut à gauche) et rendez-vous dans "Applications" DLFP
  3. Allez dans la liste des applications "Désactivées"
  4. Activez le module au doux nom de "Default encryption module" DLFP
  5. Allez dans "Administration" puis "chiffrement"
  6. Entrez une clé de récupération afin de pouvoir récupérer les fichiers en cas de problème
  7. Cochez "Activer le chiffrement côté serveur" et cliquez sur "Activer" DLFP
  8. C'est terminé, à partir de maintenant tout les prochains fichiers uploadés seront chiffré

Foire Aux Questions

Si j'active le module de chiffrement, les fichiers présent sur les montages distants/locaux seront-ils chiffrés?

  • Réponse : Par défaut oui mais vous pouvez le régler comme dans la capture d'écran suivante :
    •  DLFP

Si j'active le module de chiffrement, les fichiers déjà présent seront-ils chiffrés?

  • Réponse : Non.

Si je désactive le module de chiffrement, qu'est passa?

  • Réponse : Les fichiers chiffrés deviennent inaccessible (par contre les prévisualisations des images chiffrées sont encore affichées).
    •  DLFP

Si un utilisateur perd son mot de passe ou bien que je le ré-initialise,qu'est passa??

  • Réponse : Si l'utilisateur a activé dans son profil "Activer la récupération du mot de passe" alors on (qui? user ou admin?) peut récupérer l'accès aux fichiers. (a vérifier!)

Le chiffrement consomme-t-il des ressources?

  • Réponse : En effet les fichiers chiffrés prennent plus d'espace mémoire que le même fichier en clair. La consommation en ressources machines augmente aussi (surtout le processeur).

Sur quelle type de machine as-tu essayé pour rédiger ton tuto?

Le chiffrement change-t-il le temps qu'il faut pour uploader/télécharger un fichier?

  • Réponse : Oui très clairement.

Wiki Tuto - Chercher présence d'une sous chaîne dans une chaîne avec MySQL grâce à LIKE

0
25
fév.
2017

Introduction

Admettons que nous possédions une table "articles" contenant une cellule "quelleCategorie". Dans cette cellule nous indiquons une ou plusieurs catégories pour chaque articles comme dans l'exemple suivant :

    id | nomArticle | quelleCategorie | dateCreation
    1 | banane | fruits | 5
    2 | jus d'orange | jus de fruits | 9
    3 | tomate | fruits ; legumes | 22
    4 | maison | immobilier | 42

Admettons que nous désirons récupérer tout les articles ayant "fruit" dans "quelleCategorie". Avec l'option LIKE nous allons pouvoir spécifier une filtrage par motif (ou "pattern matching") afin de récupérer banane, jus d'orange et tomate et ce même si chacun possède une version légèrement différente de la catégorie.
À noter que vous pouvez aussi utiliser NOT LIKE qui vous permet de faire exactement l'inverse : demander à MySQL de ne retourner que les chaînes où n'est PAS présent le pattern.
Attention : une mauvaise utilisation de LIKE peut engendrer une chute des performances et une augmentation des ressources CPU.

L'exemple suivant va sélectionner dans la table "articles" tout les éléments ayant dans leur cellule "quelleCategorie" la sous-chaîne contenue dans la variable $categorieChoisie, classés du plus récent aux plus anciens.

<?php
$bdd_hostname = "localhost";
$bdd_name = "nomDeMaBase";
$bdd_login = "loginDeMaBase";
$bdd_password = "passowrdDeMaBase";
try {
    $bdd = new PDO('mysql:host='.$bdd_hostname.';dbname='.$bdd_name.';charset=utf8', $bdd_login, $bdd_password);
} catch( Exception $e){
    error_log("Error BDD connexion from ".$_SERVER["PHP_SELF"]);
}

$categorieChoisie = "fruit";

$requestSQL = $bdd->prepare('SELECT `*` FROM articles WHERE `quelleCategorie` LIKE %{:categorieChoisie}%  ORDER BY `dateCreation`');
$requestSQL->bindParam(':categorieChoisie', strval($categorieChoisie), PDO::PARAM_STR);
$requestSQL->execute();
$myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS);
print_r($myArticles);
?>

Explication en détails :

  1. On tente de connecter PDO à la base de données, si on réussi on obtient l'objet $bdd si non on retourne une erreur dans les logs (/var/log/apache2/error.log pour apache2)
try {
    $bdd = new PDO('mysql:host='.$bdd_hostname.';dbname='.$bdd_name.';charset=utf8', $bdd_login, $bdd_password);
} catch( Exception $e){
    error_log("Error BDD connexion from ".$_SERVER["PHP_SELF"]);
}
  1. On défini notre sous chaîne à rechercher : fruit
$categorieChoisie = "fruit";
  1. On demande a PDO de préparer notre requête à partir de l'objet $bdd
$requestSQL = $bdd->prepare('SELECT `*` FROM articles WHERE `quelleCategorie` LIKE %{:categorieChoisie}%  ORDER BY `dateCreation`');
  • Ici on lui demande de tout (*) récupérer dans "articles" où "quelleCategorie" ressemble à la chaîne injectée, ordonnée (ORDER BY) par leur date de création.
  1. On injecte le paramètre de recherche (fruit)
$requestSQL->bindParam(':categorieChoisie', strval($categorieChoisie), PDO::PARAM_STR);
  1. On exécute la requête SQL
$requestSQL->execute();
  1. On récupère le résultat de la requête SQL sous forme d'objet
$myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS);
  1. Si vous préférez récupérer sous forme de tableau, remplacez la précédente ligne par les suivantes
$myArticles = array();
while($tmpArticle = $requestSomeArticles->fetch(PDO::FETCH_ASSOC)){
    $myArticles[] = $tmpArticle;
}
  1. On affiche le résultat
print_r($myArticles);

Wiki Tuto Ajax - afficher au format JSON des articles e-shop depuis MySQL-MariaDB grâce à PHP

0
23
fév.
2017

Sommaire

Niveau requis pour utilisation : moyen.
Nécessite au moins PHP5.4+ avec PDO (php-mysql)
Ce tutoriel s'intègre dans une suite de tutoriel permettant d'appréhender l'ajax voir Farm Link à la fin du wiki.

Introduction

  • Nous allons ici étudier un script PHP, rédigé par votre humble serviteur en programmation fonctionnelle, permettant de faire de l'ajax. L'objectif d'origine de ces fonctions est de recevoir les requêtes GET provenant d'une interface cliente (page web angularjs) d'une boutique en ligne, de récupérer des articles depuis une table de Base de Données puis afficher les informations au format JSON.
    Le but de ce topic est de vous aider a mettre en place le plus rapidement possible une fonction ajax côté serveur (pour les tuto côté client il faudra voir du côté du Farm Link en bas de page).

  • Donc ce script analyse les variables $_GET afin de récupérer les informations lui permettant de forger des requêtes SQL. Ensuite il récupère les informations de la base de données MySQL/MariaDB et les affiche dans un JSON.
    Pour fonctionner il faut bien entendu disposer d'une base de données contenant une table (nom gérable via $tableName) et contenant au moins les cellules : id, categorie.
    Afin d'éviter les doublons entre deux requêtes clientes lorsque des articles ont des informations recherchées quasi identique: lors d'une requête GET le client doit mentionner les articles qu'il a visionné dernièrement en ajoutant dans ses requêtes GET les variables banItemX = identifiant article à bannir comme dans l'exemple suivant : ajax.php?banItem1=6&banItem2=7&banItem3=8

  • La sécurité anti injection SQL est gérée suivant les cas par les requêtes préparées de PDO ou par une moulinette qui vérifie la correspondance entre la table de données et les infos postées par l'utilisateur puis qui injecte les infos depuis la base de données en lieu et place des données envoyées par l'user. Sauf pour les $_GET["banItemX"] qui eux sont directement convertis en integer afin de casser toutes injections.

Les paramètres GET acceptés par le script :

Paramètres obligatoires :

  • &articleMax=[integer] gère la LIMITE SQL (nombre d'entrées max à renvoyer)
  • &orderByAttributs=[string] l'attribut pour ORDER BY (par exemple l'id, le prix, etc)
  • &orderByAttributsLastValue=[float] la valeur la plus haute (ou basse selon la recherche) de l'attribut ORDER BY afin de commencer la recherche à partir de là
  • &categorie=[string] le nom de la catégorie d'article (peut facilement être remplacer par une seconde condition de recherche)
  • &orderByType=[1|-1] décide du sens de la recherche (1 pour plus petit au plus grand (> et ASC), -1 pour plus grand au plus petit (< et DESC))

Paramètres optionnels :

  • &forceChangeOrderSymbole=[1|2] 1 pour > (plus grand que) ou 2 pour < (plus petit que) permet de changer le sens de la recherche sans affecter le reste (ASC ou DESC). Par défaut 1 (>) est sélectionné.
  • &banItem1=[integer] reçoit les identifiants à bannir (peut avoir un nombre "infini" (voir limite GET) ex: banItem2, banItem3, etc). Par défaut aucun élément n'est bannis.

Exemples :

  • www.hostname.be/ajaxArticles.php?articleMax=10&orderByAttributsLastValue=42&orderByAttributs=prix&orderByType=1&categorie=film

    • On demande à voir les 10 prochains articles, classé par la cellule prix du plus petit au plus grand à partir du prix 42, de la catégorie film

Le code

Pour l'installer créez un ajaxArticles.php et collez le code suivant dedans.

<?php
/*  Licence GPLv3 - Papa :  voxdemonix
    infos : https://www.0rion.netlib.re/forum4/viewtopic.php?f=79&t=541&p=1156#p1156
*/
/*  Je vous conseil d'insérer tout le bloc try dans un fichier séparé protégé par un .htaccess (deny for all)  */
try {
    /*  éditez les informations nécessaire pour la connexion à la base de données   */
    $bdd = new PDO('mysql:host='.$main["bdd_Hostname"].';dbname='.$main['bdd_Name'].';charset=utf8', $main['bdd_Login'], $main['bdd_Pass']);
} catch( Exception $e){
    error_log("ajax -> Error BDD connexion from ".$_SERVER["PHP_SELF"]);
}

    $tableName = "Articles";



    function displayInJsonMyArray($myArray){
        header('Content-type: application/json');
        print_r( json_encode($myArray, JSON_NUMERIC_CHECK)  );
    }



    function articleOrderByList(){
            //MYSQL
        global $bdd;
        $searchCategorieArticle = $bdd->prepare('SELECT * FROM '.$tableName.' LIMIT 1');
        $searchCategorieArticle->execute();

            //RECOVER THE RESULT IN A TAB
        $tabCategorie = $searchCategorieArticle->fetch(PDO::FETCH_ASSOC);
        $tab = array();

            //READ THE TAB AND MAKE THE OPTIONS'S TAG
        foreach ($tabCategorie as $key => $value) { 
            $tab[] = $key;
        }
        return $tab;
    }


    function articleCategorieList(){
        $liste = array(); global $bdd;
        $searchCategorieArticle = $bdd->prepare('SELECT `categorie` FROM '.$tableName);
        $searchCategorieArticle->execute();

            //MAINTENANT LISTE LES CATEGORIES DANS $tmpCategorie, (PERMET AUSSI DE CRÉER UN FORMULAIRE SELECT)
        while($tmpCategorie = $searchCategorieArticle->fetch(PDO::FETCH_ASSOC)){
            if (!in_array($tmpCategorie["categorie"], $liste)) {
                $liste[] = $tmpCategorie["categorie"];
            //  var_dump($tmpCategorie); echo '<br />';
            }
        }
        return $liste;
    }


    function genBanItemForMySQLRequest(){
        $banRequest = '';
        foreach( $_GET as $key => $value){
            if (stripos( ' '.$key , 'banItem' )){
                $banRequest .= ' AND (id != '.intval($value).')';   
            }
        }
        return $banRequest;
    }


    /*
        EXPLICATIONS :
    reçoit des variables GET du style :
opt     &banItem1= reçoit les identifiants a bannir (peut avoir un nombre "infini" (voir limite GET) ex: banItem2, banItem3, etc)
        &articleMax= gère la LIMITE SQL (nombre d'entrée max a renvoier)
        &orderByAttributs= l'attribut pour ORDER BY (par exemple l'id, le prix, etc)
        &orderByAttributsLastValue= la valeur la plus haute (ou basse selon la recherche) de l'attribut ORDER BY afin de commencer la recherche a partir de là
        &categorie= la categorie d'article (peut facilement être remplacer par une seconde condition de recherche)
        &orderByType= decide du sens de la recherche (1 pour plus petit au plus grand (> et ASC), -1 pour plus grand au plus petit (< et DESC))
opt     &forceChangeOrderSymbole= permet de changer le sens (< ou >) de la recherche sans affecter le reste (ASC ou DESC)
    */




    $forceChangeOrderSymbole = 0; //if = 1 => > (plus grand que); if = 2 => < (plus petit que)
    if(filter_has_var(INPUT_GET, "forceChangeOrderSymbole")){
        if(isset($_GET["forceChangeOrderSymbole"]) & !empty($_GET["forceChangeOrderSymbole"])){
            switch(intval($_GET["forceChangeOrderSymbole"])){
                case 1 :
                case '1':
                    $forceChangeOrderSymbole = 1;
                break;
                case 2 :
                case '2':
                    $forceChangeOrderSymbole = 2;
                break;              
            }
        }
    }
    if ( filter_has_var(INPUT_GET, "articleMax") & filter_has_var(INPUT_GET, "orderByType") & filter_has_var(INPUT_GET, "orderByAttributs") & filter_has_var(INPUT_GET, "orderByAttributsLastValue")) {
        $wichCategorie = "all";
        if (filter_has_var(INPUT_GET, "categorie")) {
            $wichCategorie = strval($_GET["categorie"]); //categorie = idForTraduct, not the traducted version (https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=211)
        }
        displaySomeArticleInJSONUniversal($_GET["articleMax"], $wichCategorie, $_GET["orderByAttributs"], $_GET["orderByAttributsLastValue"]);
    }


    function displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue){
        // $iMinimal = l'identifiant unique minimal de l'article, afin d'envoyer les suivants
        global $bdd; //PDO object
        global $forceChangeOrderSymbole;

        $orderByAttributs = 'id'; $orderByAttributsLastValue = 1;
        /* security */
        if(in_array(strval($inputOrderByAttributs) , articleOrderByList())){
            $orderByAttributs = strval($inputOrderByAttributs);
            $orderByAttributsLastValue = $inputOrderByAttributsLastValue;
        }
        $orderByType = 'ASC'; $orderSymbole = '>';
        if(strval($_GET["orderByType"]) == '-1'){
            $orderByType = 'DESC';
            $orderSymbole = '<';    
        }
        if($forceChangeOrderSymbole == 2){ $orderSymbole = '<'; }
        if( strval($categorie == "all") || !in_array(strval($categorie), articleCategorieList() )   ){
            $requestSomeArticles = $bdd->prepare("SELECT * FROM ".$tableName." WHERE `".$orderByAttributs."` ".$orderSymbole."= :orderByAttributsLastValue ".genBanItemForMySQLRequest()." ORDER BY `".$orderByAttributs."` ".$orderByType.", `id` ASC LIMIT :nbLimit");
        }else{
            $requestSomeArticles = $bdd->prepare("SELECT * FROM ".$tableName." WHERE `".$orderByAttributs."` ".$orderSymbole."= :orderByAttributsLastValue AND `categorie` = :categorie ORDER BY `".$orderByAttributs."` ".$orderByType.", `id` ASC LIMIT :nbLimit");
            $requestSomeArticles->bindParam(':categorie', strval($categorie), PDO::PARAM_STR);
        }

        $requestSomeArticles->bindParam(':nbLimit', intval($nbLimit), PDO::PARAM_INT);
        $requestSomeArticles->bindParam(':orderByAttributsLastValue', floatval($orderByAttributsLastValue), PDO::PARAM_STR);

        $requestSomeArticles->execute();
        //$myArticles = $requestSomeArticles->fetchAll(PDO::FETCH_CLASS); 
        $myArticles = array();
            while($tmpArticle = $requestSomeArticles->fetch(PDO::FETCH_ASSOC)){
                $myArticles[] = arrayUniversalTraductor($tmpArticle);
            }
        displayInJsonMyArray($myArticles);
    }
?>

Fonctionnement en détail :

Note : ne serons mentionné que les noms des fonctions, leur fonctionnement et les types de sorties (avec des exemples). Il n'y aura pas de copier-coller de morceaux de code afin d'éviter de devoir éditer le tutoriel à chaque édition du code source.

Listes des fonctions :

  1. articleOrderByList()
  2. articleCategorieList()
  3. genBanItemForMySQLRequest()
  4. displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue)
  5. displayInJsonMyArray($myArray)

articleOrderByList()

  • Récupère la liste des attributs possible (nom de cellule) pour la table de données.
    • Exemple de sorties :
$liste[1] = "film"
$liste[2] = "séries"
$liste[3] = "musiques"

articleCategorieList()

  • Retourne une liste sous forme d'un array contenant les noms des différentes catégories sans doublon.
    • Exemple de sorties :
$liste[1] = "id"
$liste[2] = "prix"
$liste[3] = "nom"
$liste[4] = "timeCreation"

genBanItemForMySQLRequest()

  • Récupère les identifiants des articles à bannir de la prochaine requête SQL. Utilise les variables $_GET[banItemX] afin de générer un morceau de requête SQL du type ' AND (id != '.intval($_GET[banItemX]).')' à insérer avant l'ORDER BY.
    • Exemple de sorties :
    $stringMorceauRequeteSQL = ' AND (id != 1) AND (id != 2) AND (id != 3) AND (id != 5) AND (id != 9) AND (id != 8)'

displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue)

  • La fonction displaySomeArticleInJSONUniversal($nbLimit, $categorie, $inputOrderByAttributs, $inputOrderByAttributsLastValue) est précédée d'un bloc de code chargé d'appréhender certaines informations envoyées par l'utilisateur avant d’exécuter la dite fonction. C'est la fonction principale : chargée de forger et exécuter la requête SQL, insérer les résultats dans un tableau (array) puis l'envoyer à displayInJsonMyArray($myArray).

displayInJsonMyArray($myArray)

  • Fonction toute banale recevant un tableau (array) et affichant les informations contenues via print_r() au format JSON avec la vérification des entiers.

-


-

-


-

Note pour la rédaction :

  • il faut encore simplifier le tuto, ajouter des exemples (et mettre en place un exemple en ligne afin que les lecteurs puissent tester (comme dans cet exemple lié à ce tuto))
  • le code aurait besoin d'une fraîcheur afin de le rendre plus compréhensible et généralisable au max (le but étant qu'un lecteur néophyte puisse copier-coller, éventuellement avec une légère modification puis en route)
  • des exemples d'utilisations suivront (un avec javascript et un avec angular 4)

Wiki Tuto Piwik - Ajouter un robot

0
15
fév.
2017

Introduction

Il existe actuellement des centaines voir des milliers de robots (crawler, dataminer, etc) et Piwik ne les détecte pas tous.
Piwik a la capacité de détecter les robots qui utilisent une chaîne de caractères spécifique dans leur User-Agent.
La liste contenant les informations pour chaque bot détecté par Piwik se situe à l'adresse suivante.
Il est conseillé de savoir se qu'est une regex pour ajouter un robot.
Voici un exemple d'ajout d'un bot au code source de piwik : commit 860a3f44435cb20874ce6043dd7260506cae6ccc

Ajouter un ou plusieurs bots à la liste de Piwik

Note : svp, respectez l'ordre alphabétique ! Attention, certains bot ayant des UserAgent similaire ou contenu dans un autre bot, il faut veiller à éviter les conflits (par exemple si vous voulez ajouter un bot "Slu", vous devrez le mettre après "Slurp").

  1. Vérifiez que le robot n'est pas déjà présent dans la liste bots.yml

  2. Vous inscrire/connecter sur GitHub

  3. Vous rendre dans Piwik > device-detector > regexes > bots.yml

  4. Cliquez sur Édit et ajoutez les informations du robot en suivant la structure suivante

- regex: 'Googlebot(-Mobile|-Image|-Video|-News)?|Feedfetcher-Google|Google-Test|Google-Site-Verification|Google Web Preview|AdsBot-Google(-Mobile)?|Mediapartners-Google|Google.*/\+/web/snippet|GoogleProducer|Google[ -]Publisher[ -]Plugin'
  name: 'Googlebot'
  category: 'Search bot'
  url: 'http://www.google.com/bot.html'
  producer:
    name: 'Google Inc.'
    url: 'http://www.google.com'
  • regex: 'variable' > l'expression régulière à chercher dans l'User-Agent pour détecter le robot
  • name:'variable' > son petit nom
  • category: 'variable' > la catégorie dans laquelle classée le robot
  • url: 'variable' > l'URL pointant vers le fichier d'information officielle du bot
  • producer:

    • name: 'variable' > Le nom de l'entreprise/personne qui se cache derrière le bot
    • url: 'variable' > L'URL du site de l'entreprise/personne qui gère le bot
  1. Sauvegardez votre commit (n'oubliez pas de décrire vos changements) et créez le Pull Request
  2. Checkez dans les heures/jours qui suivent si un mainteneur ne vous demande pas l'une ou l'autre correction. Le code sera accepté lorsque Github vous signalera un "Merge".
  3. C'est terminé ! Le bot sera disponible dés la prochaine mise a jours mineur de piwik :)

Wiki Formater les disques d'un volume Gluster Sur Ubuntu

0
10
fév.
2017

Ce tuto concerne debian/ubuntu/raspbian

Introduction

Les volumes gluster sont indépendant du système de fichier (formatage du disque), on peut sans problème appliquer et tester certaines modifications sans casser notre raid.
Dans le tutoriel ci-présent nous allons donc formater en F2FS deux SSD contenant déjà un volume gluster. Ensuite nous ré-uploaderons les fichiers afin de reforger le volume en veillant bien à se que les points de montage (exemple /media/disque1) soient identique à avant le montage (important).
Pour rappel F2FS est un système de fichier conçu entre autre par Samsung (fabricant de techno flash) et spécialement conçu pour les technologies mémoire basées sur Flash (SSD, eMMC). Il est plus rapide que NTFS et ext4 sur ce type de technologie. Par contre F2FS n'est reconnu que sur Linux (y compris Android et peut-être aussi BSD). F2FS consomme plus de cache que ext4 (vous disposez donc de moins d'espace pour un disque de taille égal).

Résumé de l'opération

  1. Stopper les services utilisant le volume puis arrêter le volume gluster
  2. Sauvegarder les fichiers et leurs droits respectifs
  3. Formater les disques puis les remonter
  4. Ré-injecter les fichiers
  5. Corriger le fichier /etc/fstab

Formatage en ligne de commande

Installer les pré-requis

sudo apt-get install f2fs-tools

On crée notre répertoire de sauvegarde

mkdir -p /tmp/backup/SSD480Go1
mkdir -p /tmp/backup/SSD480Go2

On se dirige vers le répertoire de travail

cd /tmp/backup/

Sauvegarde du contenu des disques

sudo cp -v -a /media/SSD480Go1/* ./SSD480Go1
sudo cp -v -a /media/SSD480Go2/* ./SSD480Go2

Lister les volumes

sudo gluster volume status

Arrêter le volume

sudo gluster volume stop monServer_raidLocalSSD

Récupérer le path des disques a formater

df -h

/dev/sde1 395G 75M 375G 1% /media/SSD480Go1
/dev/sdf1 395G 75M 374G 1% /media/SSD480Go2

Démonter les disques

sudo umount /media/SSD480Go1
sudo umount /media/SSD480Go2

Formatage

Note : pour un autre système de fichier que F2FS, vous pouvez passer par l'interface graphique de votre distribution. Mais si, comme ici, vous souhaitez une partition F2FS alors restez en ligne de commande (si non bug).

sudo mkfs.f2fs /dev/sde1
sudo mkfs.f2fs /dev/sdf1

Remonter les disques

sudo mount -t f2fs /dev/sde1 /media/SSD480Go1
sudo mount -t f2fs /dev/sdf1 /media/SSD480Go2

Ré-injection des fichiers

sudo cp -v -a /tmp/backup/SSD480Go1/* /media/$USER/123456-identifiant-disque-un-654321
sudo cp -v -a /tmp/backup/SSD480Go2/* /media/$USER/123456-identifiant-disque-deux-654321

Afficher les nouveaux UUID des partitions des disques précédemment formaté

sudo blkid

Éditer le fichier /etc/fstab afin de remplacer ext4/ntfs ou autre par f2fs (pour les disques qu'on formate, pas les autres!) ainsi que mettre la nouvelle correspondance des UUID

sudo nano /etc/fstab

Redémarrez la machine et gluster n'y aura vu que du feu

Note : en cas de bug, les fichiers sont déjà ré-uploadé sur les disques et donc récupérable

sudo reboot

C'est Terminé

Wiki RaspberryPi remplacer son Système de Fichier par F2FS (formatage)

1
10
fév.
2017

Introduction

  • F2FS ("flash-friendly file system") est un système de fichiers (filesystem) conçu pour les mémoires Flash. Sa conception lui permet d'être réputé plus rapide en écriture que les autres systèmes de fichiers (NTFS, ext4, zfs) sur les mémoires flash (SSD, eMMC, etc). La différence est significative sur raspberry pi.

Note : je vous conseil de d'abord tester sur une seconde carte mémoire
Note Bis : vous pouvez suivre exactement la même procédure pour formater la carte mémoire de votre appareil Android, arrêtez-vous juste après "Injection des fichiers précédemment sauvegardé"

Résumé de la procédure :

  1. Copie sur PC (Linux) de TOUS les fichiers de la carte SD/microSD du Raspberry Pi
  2. Formatage de la carte SD/microSD en F2FS
  3. Ré-injection des fichiers précédemment sauvegardés
  4. Édition des fichiers de démarrage du système

Mise en place en ligne de commande

Note : la carte mémoire du Raspberry Pi est divisée en deux partitions, une pour le boot (dont nous éditerons juste un fichier) et la seconde qui est celle que nous allons formater en F2FS et qui contient le Système de Fichier.

  1. Branchez votre carte mémoire à votre ordinateur

  2. Ouvrez un Terminal de commande (shell)

  3. Créez le dossier où ranger les fichiers du Raspberry Pi pendant le formatage

    mkdir /tmp/backup_sd

    • Ici j'ai choisi de créer un dossier dans /tmp/ ainsi le dossier et son contenu seront supprimés au redémarrage de la machine.
  4. Copiez les fichiers de votre carte mémoire vers un dossier sur votre ordinateur

    sudo cp -v -a /mnt/cartememoire/* /tmp/backup_sd

    • /mnt/cartememoire/ est le path du point de montage de votre carte mémoire (l'option -a est nécessaire). Sur Ubuntu par défaut le montage s'effectue dans /media/$USER/identifiant-partition-sur-carte-memoire/
  5. Installez le package f2fs-tools

    sudo apt-get install f2fs-tools

  6. Récupérez le path de la partition à formater. (par exemple /dev/sdf2)

    df -h

  7. Démontez la partition que nous allons formater

    sudo umount /media/$USER/identifiant-partition-sur-carte-memoire

  8. Formatage de la partition root de la carte mémoire

    sudo mkfs.f2fs /dev/sdf2

  9. Montage de la partition créée (sur ubuntu la partition s'auto-monte automatiquement)

    sudo mount -t f2fs /dev/sdf2 /media/raspberrypi

  10. Injection des fichiers précédemment sauvegardé

    sudo cp -v -a /tmp/backup_sd/* /mnt/cartememoire

  11. Éditez le fichier /etc/fstab sur la partition précédemment formatée de notre carte mémoire. La ligne correspondant à / (la racine) doit ressembler à quelque chose du style :

    /dev/mmcblk0p2 / f2fs defaults,noatime,discard 0 0

  12. Enfin remplacez rootfstype=ext4 par rootfstype=f2fs (en minuscule) dans le fichier cmdline.txt lui-même dans la partition intitulée "boot" de votre carte mémoire

  13. Démontez la carte SD

    sudo umount /dev/sdf1 & sudo umount /dev/sdf2

  14. C'est terminé !

Wiki LUKS

1
31
août
2016

Astuce : Faire son coffre fort numérique : un disque virtuel chiffré & camouflé

tout d'abord installer cryptsetup :

sudo apt-get install cryptsetup

ensuite on veut créer un fichier qui nous servira de disque dur, pour cela on utilise l'utilitaire dd qui nous permet de créer un fichier block par block avec le périphérique /dev/zero qui produit des bits a "0" en indiquant a la commande que l'on veut des blocs de 4 megaoctet (bs=4M).

Créer son disque virtuel

Il convient de bien choisir sa taille : suffisamment grande pour stocker nos données mais pas trop pour rester discret et être transportable pour l'exemple on créera un disque de 2.1Go pour cela on fera 512 création de block de 4Mo.

dd if=/dev/zero of=disque-secret.img bs=4M count=512

on obtient ainsi un fichier de 2.1Go (illisible pour l'instant car il ne contient que des octets de valeur 0)
Pour pouvoir travailler sur ce fichier (qui au final a les mêmes caractéristiques qu'un disque dur), il va falloir en faire un périphérique (ici loop0), pour cela la commande losetup va être bien utile:

sudo losetup /dev/loop0 disque-secret.img

'Formater' et chiffrer le tout

il va falloir "formater" ce fichier, et comme on veut aussi le chiffrer on va utiliser cryptsetup, qui permet de gérer des fichiers chiffré via dm-crypt et de les utiliser comme des périphériques de stockage complété par la commande luksFormat (luks permet de piloter plus simplement la création d'archives chiffré qu'en 'plain dm-crypt'), puis mk2fs.ext4 pour créer le système de fichier (en ext4):

sudo cryptsetup --verbose --verify-passphrase luksFormat /dev/loop0

il faudra ensuite rentrer une passphrase robuste… qui servira a chiffrer/déchiffer le volume afin qu'il ne soit pas décryptable par des yeux indiscrets…

sudo mkfs.ext4 -j /dev/mapper/disque-secret.img

Utilisation :

il ne reste plus qu'a déchiffrer

sudo cryptsetup luksOpen disque-secret.img

puis monter le disque pour l'utiliser, pour cela on crée un répertoire pour monter le disque (on peut aussi utiliser temporairement un répertoire existant (et la on ne laisse pas de trace)

mkdir tmp && sudo mount /dev/mapper/disque-secret.img tmp

et pour refermer le tout :

sudo umount tmp && sudo cryptsetup luksClose disque-secret.img

et supprimer le périphérique /dev/loop0

sudo losetup -d /dev/loop0

Pour vivre heureux vivez caché

pour bien cacher ce fichier (disque-secret.img) il suffit de changer son nom et son extension et le mettre dans un repertoir inattendu : par exemple bieber-song.mp3 ou video.ogg ou catalogue.pdf ou programe-systeme.bin : votre imagination fera le reste (soyez logique par rapport a la taille du fichier et choisissez un fichier que l'on a en général pas envie d'ouvrir…)
Il faut aussi être conscient que luks insère des header qui peuvent être repérable par un scan, même si le fichier chiffré semble bien caché donc si la confidentialité des données est essentielle, voir vitale, il convient alors d'utiliser du plain-dm (ou autre) pour le chiffrement du disque.

bien sur pour réouvrir l'ensemble :

1 / on crée /dev/loop0 avec losetup (sudo losetup /dev/loop0 bieber-song.mp3)
2 / on le déchiffre avec cryptsetup (sudo cryptsetup luksOpen /dev/loop0 bieber-song.mp3)
3/ on le monte sudo mount /dev/mapper/bieber-song.mp3 )
4/ quand on a fini on démonte le fichier et on re-chiffre (dans nautilus cela se fait en même temps)

vous voila avec un fichier anodin, transportable, chiffré dans lequel vous pouvez ranger en toute tranquillité vos mots de passes et autres fichiers sensible.

Wiki Chroniques de l'automatisation

Licence CC by-sa
Tags : aucun
0
27
août
2016

Les chroniques de l'automatisation sont une série de journaux voulant relater les innovations et la mise en pratiques concernant tout ce qui est automatisation - robotisation, informatisations, mutualisation d'info à grande échelle - de taches auparavant effectuées par des humains et en explorer les conséquences sociales.

Tag associé : https://linuxfr.org/tags/chroniques_de_l'automatisation/public

Journaux dans la série :

Wiki Vieux PC

1
26
fév.
2016

Combien de fois ai-je vu dans le forum une demande pour un vieux PC et ceux qui répondent s'imaginer un pentium III avec péniblement 512 Mo de RAM) en proposant du Xubuntu et autres environnements légers à la LXDE voire i3 (de bons choix, au demeurant), là où Vieux PC pour le demandeur correspond en réalité au portable qu'il a acheté il y a 3 ans, core i7, 4 à 8 Go de RAM… o_O

en 2010

Un EeePC 901 avec un CPU poussif comme atom avec « seulement » 1 Go de RAM fait tourner n'importe quelle distribution moderne de 2010, avec des bureaux comme Gnome ou KDE.
En 2016, c'est encore le cas.

en 2016

Un vieux PC fait tourner tous les environnements sans souci.
Pour un ordinosaure il y a aussi des possibilités.


tag ordinosaure


Pour identifier votre PC, quelques commandes :

  • cat /proc/cpuinfo
  • free -m

Wiki Séries de dépêches et de journaux sur un même thème

2
10
nov.
2015

Dans la série des thèmes récurrents pour participer à LinuxFr, il y a eu quelques initiatives intéressantes :

Wiki ordinateurs-libres

Licence CC by-sa
Tags : aucun
1
8
fév.
2015

Jusqu’à quel point peut-on être fidèle à la philosophie du libre ? Bien sûr, avoir recours à un OS libre et à des applications respectant les piliers de l'état d'esprit Open Source semble une évidence, mais pour ceux qui chercheraient à se reposer exclusivement sur du logiciel libre pour leur ordinateur, la tâche est bien plus complexe. Les quelques (rares) machines à être intégralement libre le font en général savoir en se faisant appliquer la certification RYF (Respect Your Freedom) délivrée par la FSF (Free Software Foundation)

Nous listons ci-dessous les meilleures possibilités pour acquérir un ordinateur 100% libre (ou au maximum).

Ordinateurs « Open hardware »

Novena

TODO Faire une revue.

Olinuxino

À sa création, il était légèrement plus cher que le RPi (45 euros) mais plus puissant.

Ordinateurs «libres»

LibreBoot X60 / X200

Ce sont (à l'heure actuelle) les seules machine à avoir reçu la certification RYF. Il s'agit de d'anciennes machines ThinkPad re-concontidionnées après quelques modifications (modification du BIOS pour coreboot, changement du chipset wifi, …).

Ordinateurs presque libres

Purism

L'entreprise Purism, après une levée de fonds participative réussie, cherche à proposer un ordinateur 100% libre (bios inclus). La distribution utilisée de base est Trisquel GNU/Linux.
À partir de 1500 dollars pour un 15 pouces, 4 cœurs Intel i7 à 3,4 Ghz, 4Go de Ram et 500Go de stockage.
Une version 13' devrait également voir le jour.

L'objectif n'est pas encore totalement atteint, puisque certains composants utilisent encore des composants logiciels non libérés. C'est notamment le cas pour le binaire FSP/ME intégré à coreboot comme l'indique le site de financement du projet:

Though the bootloader, Linux kernel, GNU OS, and all software applications are completely free/libre software without any binary blobs, the BIOS does use coreboot, which includes a binary from Intel, called FSP

L'avancement de ce chantier peut être suivi sur cette page.

Cependant, les firmwares embarqués dans certains composants tels que les disques ne sont pour l'instant pas libérés :

In addition to enabling as above the development of free BIOS firmware, we are also working with Intel to allow us to scrub, release, and maintain the source for the FSP, but haven’t finalized that yet. We are devoted to freeing this binary.

De plus, il a certaines spécifications matériels pouvant être gênantes, selon les besoins. On pourra noter :

La gamme ThinkPenguin

ThinkPenguin propose tout une gamme d'ordinateurs qui, bien que n'étant pas libérés, peuvent être utilisés avec des distributions GNU/linux intégralement libres (i.e. n'installant aucun composant non libre tel que des firmwares binaires par exemple) telles que Trisquel GNU/Linux ou Parabola GNU/Linux.

Les mini-ordinateurs, cousins des Raspberry Pi

Le RPi n'est pas libre (niveau matériel ou logiciel, en particulier la partie GPU (de marque Broadcom) est «closed-source binary blob»), mais d'autres le sont.