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 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é !

Journal [Tuto/HowTo] SSHFS : mises en place et montage

18
1
nov.
2016

[Tuto/HowTo] SSHFS : mises en place et montage

Présentation rapide

SSHFS permet d'utiliser un serveur ssh afin de monter des dossiers distants disponibles dans le système de fichier grâce à fuse.
Il ne nécessite côté serveur que openssh-server et côté client fuse openssh-client sshfs et éventuellement tor.
N'hésitez pas à signaler toute erreur/faute.

Ce tuto est une mise en forme de ces deux-ci : [Tuto/HowTo] Configurer et monter SSHFS sécurisé via utilisateur dédié côté serveur et [Tuto/HowTo] [GNU/Linux] Montage (...)

Forum général.petites-annonces Ouverture de Kalinux.fr (Linux et sécurité informatique) !

Posté par . Licence CC by-sa
2
28
avr.
2016

Bonjour à tous,

Je poste ce message afin de vous présenter mon site internet.

J’ai très récemment créé un site web autour du monde de Linux en général et plus particulièrement autour de la sécurité informatique.

Ce site a pour but d’en apprendre un peu plus sur le monde de Linux et de la sécurité informatique à nos visiteurs grâce au partage de projets réalisés en cours ou lors de sessions de recherches personnelles.

Deux amis et moi-même nous chargeons (...)

Journal Yocto+Docker: Les containers personnalisé

Posté par (page perso) . Licence CC by-sa
20
5
avr.
2016

Bonjour 'nal… c'est comme ça qu'on dit n'est pas?

Vous connaissez certainement Docker, la solution permettant de d'automatiser le déploiement d'application sous forme de containers LXC.

Docker fournit un grand nombre d'images prédéfinies par d'autre mais, question: Comment peut-on faire pour créer notre propre image et la déployer?

Je travail avec Yocto qui est conçu pour créer des images aux petits oignions pour des systèmes embarqués. Pourquoi donc ne pas utiliser cet outil pour fabriquer une image qui sera ensuite (...)