Aller au contenu

Linux Attitude

Le libre est un état d'esprit

Archive

Tag : planet-libre

Niveau :      
Résumé : mv ; rm ; top

Maintenant que vous êtes passé root vous êtes impatient d'optimiser votre téléphone.

Plusieurs choses sont importantes à savoir :

  • une application ce n'est qu'un fichier .apk, ce qui veut dire que supprimer le fichier suffit pour supprimer l'application (mais pas ses données)
  • le firmware n'est rien d'autre qu'un système de fichier standard, donc rien ne vous empêche de le modifier
  • android distingue une carte sd "interne" du reste du système. Sur mob téléphone, il s'agit en pratique de la même mémoire flash découpée en partitions mais formatée avec différents systèmes de fichier

Lister et supprimer les application inutiles

Tout d'abord je vous conseille juiceplotter pour regarder quand et combien consomme votre téléphone.

Ensuite, puisque vous avez un shell, ne vous privez pas et utilisez la commande top lorsque la consommation vous parait importante ou que la machine rame (attention aux bizareries du top d'android, comme la charge)

Enfin je vous recommande de supprimer les applications du système qui ne vous servent pas mais qui semblent se réveiller fréquemment.

Voici comment faire (en root sur le téléphone) :

$ mkdir /sdcard/app-backup
$ mount -o remount,rw  /system # si vous n'utilisez pas busybpox, vous devrez passer tous les paramètres a mount
$ mv /system/app/<applicaiton>.apk /sdcard/app-backup
$ mount -o remount,ro  /system

Ainsi vous gardez l'application sous le coude si vous voulez revenir en arrière.

Sur mon optimus 2x

J'ai supprimé :

  • l'antivirus F-Secure (il consomme pas mal et je n'ai toujours pas vu de virus)
  • PCSync jamais besoin et il est actif le bougre
  • LGOnScreenPhone même chose
  • LGLauncher le home du téléphone, ne pas supprimer si vous n'en installez pas une autre avant
  • LGEmail je n'utilise pas, trop limité (K9-mail est très bien)
  • SNS : se connecte automatiquement a tous vos réseaux sociaux, mais aucun moyen de l'en empecher

Au passage j'ai installé ADW, très bonne home qui remplace celle par défaut, qui permet les thèmes, qui permet de faire des raccourcis vers des activités et qui permet de faire des groupes d'applications pour y accéder plus rapidement. Notez qu'il est possible d'avoir 2 home en même temps mais j'ai tout de même supprimé l'original. Petite touche finale, elle est sous licence libre ...

Et pour vous montrer ce que j'ai gagné, lorsque j'ai eu mon téléphone, il consommait entre 10 et 15% de batterie par nuit. Maintenant après ces suppressions (et après avoir désactivé la 3G) il consomme entre 3% et 4% par nuit !

Niveau :      
Résumé : /etc/inittab ; /etc/gdm.conf ; /etc/sshd.conf

Pour ceux qui voudraient essayer le parachutisme, je vous le conseille, c'est très fort ! Par contre ça vous empêche d'écrire des articles ...

Vous venez de faire un chroot et vous voulez pouvoir vous connecter dessus comme s'il s'agissait de votre machine locale ?
Pas de panique, c'est tout simple.

Pour cela nous allons regarder 3 méthodes différentes de connexion à votre chroot : le terminal local, ssh et l'environnement graphique. Mais avant tout préparons le chroot à ressembler à une distribution normale.

$ mount --bind /dev $CHROOT_BASE/dev
$ mount --bind /proc $CHROOT_BASE/proc
$ mount --bind /sys $CHROOT_BASE/sys

Terminal local

Pour se connecter en local à votre machine, vous utilisez les consoles disponibles (alt-Fx ou ctrl-alt-Fx si vous êtes en mode graphique). Vous en avez 6 à disposition.

Pour faire simple, nous allons juste faire en sorte que les consoles 4 à 6 redirigent dans le chroot tandis que les 1 à 3 resteront dédiées à la machine principale.

Il suffit de modifier /etc/inittab :

# /etc/inittab
1:2345:respawn:/sbin/getty tty1
2:2345:respawn:/sbin/getty tty2
3:2345:respawn:/sbin/getty tty3
4:2345:respawn:chroot <chroot_base> /sbin/getty tty4
5:2345:respawn:chroot </chroot_base><chroot_base> /sbin/getty tty5
6:2345:respawn:chroot </chroot_base><chroot_base> /sbin/getty tty6

Et là, soit vous redémarrez (bof on n'est pas sous windows) soit vous forcez init à relire sa configuration :


continuer la lecture...

Niveau :      
Résumé : ditaa

Aujourd'hui je voudrais partager avec vous un petit soft que je viens de découvrir : ditaa.

Qu'est-ce que ça fait ?

C'est un outil très simple qui vous permet de faire des diagrammes en ascii art. Non pas de les dessiner comme le ferait emacs artist-mode mais de les transformer en un vrai png propre et beau.

Exemple : Je dessine ceci (par exemple avec asciio)

    +--------+   +-------+    +-------+
    |        | --+ ditaa +--> |       |
    |  Text  |   +-------+    |diagram|
    |Document|   |!magic!|    |       |
    |cRED {d}|   |cBLU   |    |cRED   |
    +---+----+   +-------+    +-------+
        :                         ^
        |       Lots of work      |
        +-------------------------+

Cela devient automatiquement ceci :

Intégration

C'est tellement magique que je n'ai pas hésité et je l'ai intégré à mon site directement. En effet avant à chaque fois que je devais faire un diagramme il fallait que je sorte inkscape, que fasse attention à caler correctement les cases et les flèches et que je pense à sauvegarder l'image et l'uploader sur le serveur.

Maintenant j'intègre tout simplement le code dans le texte de mon article et ca marche !

Je n'ai pas trouvé de code qui faisait cela, je l'ai donc fait moi-même. Un peu rapidement il est vrai, il n'y a pas de gestion des différents cas d'erreur. Mais je vous laisse le code au cas où vous voudriez faire de même chez vous.

    function __macroDITAA($s)
    {
        $base=$_SERVER['DOCUMENT_ROOT']."/public/ditaa";
        $tmp="/tmp/ditaa";

        # first line of code is for ditaa parameters
        $p = strpos($s, "\n");
        $args = substr($s, 0, $p-2);
        $data = substr($s, $p+1 );

        # md5sum to generate a unique id
        $id = md5($data);

        # file test
        if(!file_exists("$base/$id.png")) {
            # create tmp
            $f = fopen("$tmp", "w");
            fwrite($f, $data);
            fclose($f);

            # call ditaa (beware of safe mode)
            system("ditaa $args $tmp > /dev/null");

            # move file
            rename("$tmp.png", "$base/$id.png");
        }

        return "<img src='/public/ditaa/$id.png'>";
    }

Puisque ditaa est malgré tout un peu lourd, on crée un identifiant d'image avec le md5 de la ligne de commande et le contenu. Et on ne fait l'appel qu'une fois (attention je n'ai pas de safe_mode ici), lorsque le fichier n'existe pas encore. Ensuite le serveur web l'utilise le fichier directement comme n'importe quel autre.

Sur mon site, j'ai une syntaxe dotclear2, j'ai donc dû enregistrer un nouveau mot clé pour la syntaxe ditaaa "///ditaa" :

# dans class.wiki2xhtml.php / class wiki2xhtml / function __construct()
$this->registerFunction('macro:ditaa','__macroDITAA');

A vous de faire de même pour la syntaxe wordpress !

Cloonix

jan 18

Niveau :      
Résumé : ./start_cloonix_net ; ./graph

De temps en temps je vous fais un article sur le réseau, et je teste quasiment tous mes articles dans la vraie vie. Et là vous vous dites, mais c'est énorme ! Mais comment que fait-il ? A-t-il l'infrastructure ?

En fait non, enfin si mais non. Pour tester le réseau, j'utilise tout simplement cloonix.

Cloonix n'est pas une distribution, mais un outil permettant de gérer des machines virtuelles et de les mettre en réseau. Pratique, tout se fait graphiquement ou presque.

Installation

La version ubuntu ne marche pas sur ma debian, j'ai donc du utiliser les sources. Ça compile bien, il suffit d'appeler doitall dans le répertoire sources. Par contre faites attention, la version source ne contient pas de vm de démo.

Donc après compilation récupérez le répertoire virtual_platform_configs ainsi que le répertoire bulk du package ubuntu et déposez-les dans le répertoire de cloonix.

Le répertoire bulk contient les images disque de base des distribution à virtualiser.

Le répertoire virtual_platform_configs contient la définition des vm, les personnalisation spécifiques à chaque machine, ainsi que la façon dont les machines sont reliées.

Utilisation

./start_cloonix_net
./graph

Vous pouvez alors cliquer sur le bouton droit et charger une topologie. C'est à dire une infrastructure telle que stockée dans un des répertoires de virtual_platform_configs. Un fois que toutes les vm sont chargées vous obtenez ceci : Cloonix_IHM

Et c'est parti, vous avez plusieurs machines virtuelles préconfigurées directement utilisables. Pour ouvrir un shell sur une des machine, double cliquez dessus. Vous pouvez aussi en ajouter dynamiquement, relier deux cartes réseau ...

Lorsque vous avez fini tuez cloonix et ses vm :

./ctrl -kill

Détails

Très pratique, quasiment rien à faire, cloonix sait utiliser UML ou KVM au besoin.

Pour les tests réseau vous pouvez faire ce que vous voulez, pensez à enregistre votre topologie pour les tests fréquents.

Pensez aussi à modifier la distribution de base dans bulk pour ne plus avoir de modifications a porteriori à faire car tout le contenu d'une vm est perdu dès qu'elle s'éteint.

Enfin pour ceux qui font des tests avec les couches basses du réseau, il est nécessaire d'autoriser le passage des interface en mode promiscuous depuis cloonix avec une commande de la forme :

# le nom de la vm, ne nom de l'interface, 1 pour activer
./ctrl -promisc ROUTER3 eth0 1

La documentation est minimaliste, mais suffit pour s'en sortir.

PS : Si vous avez des idées d'article à me suggérer n'hésitez pas à utiliser la boite à idées.

Niveau :      
Résumé : modprobe bonding ; ifenslave

Récemment nous avons vu l'agrégation sur couche 3, celle d'IP. Naturelle, pratique pour redonder des chemins réseaux, elle n'est pas forcément adaptée pour de la redondance sur réseau local.

Il existe une autre solution qui fonctionne sur la couche du dessous, le bonding (aussi appelé trunking chez les fabriquants de switch, ou etherchannel qui est la cas particulier du mode 802.3ad). Il permet de communiquer à travers 2 chemins physiques différents avec une machine présente sur le même réseau local.

Le principe est très simple, au lieu de mettre un câble réseau on en met 2. Au lieu de mettre une carte, on en met 2

Matériel

Il vous faut :

  • 2 cartes réseau
  • 2 câbles
  • un switch
    • ou 2
    • ou le même matériel sur la machine en face (connexion directe sans switch)

Selon le mode de bonding choisi, il se peut que vous ayez besoin d'un support particulier sur le switch et sur les driver des cartes.

Méthode

C'est simple, on crée un nouvelle interface virtuelle, comme on ferait avec un bridge et on lui affecte 2 cartes physiques.

# bizarrement le bonding se configure au modprobe ... on a vu mieux
# mode actif-passif et détection auto du débranchement du câble en 100ms
$ modprobe bonding mode=1 miimon=100

# Ajout des interfaces au bond
$ ip link set bond0 up
$ ifenslave bond0 eth0
$ ifenslave bond0 eth1

# Configuration comme une carte normale :
$ ip addr add 10.0.0.1/24 dev bond0

Reste plus qu'a faire pareil si besoin de l'autre côté et c'est bon on peut maintenant débrancher un câble sans être coupé du réseau (enfin pas plus de 100ms).

Pour rendre la chose permanente, il faut ajouter le chargement de module avec ses options dans /etc/modules et mettre les lignes ifenslave en post-up dans /etc/network/interfaces.

Bridge, machinbox

Pourquoi ne fait-on pas un bridge, c'est beau un bridge ?
Il faut savoir qu'un bridge n'a pas le même usage que le bonding. Le bridge est là pour relier 2 réseaux différents. Nous voulons seulement relier 2 cartes sur le même réseau. Évitez d'ajouter un bridge là où ce n'est pas nécessaire, ça vous évitera les problèmes de boucle et de spanning tree.

Et si on a un bridge en face ?
Remarquez que c'est le cas de la plupart des machinbox et autres routeurs wifi. Ils installent un bridge entre les ports wifi et les ports ethernet ce qui leur permet de ne pas avoir à router les paquets. Dans ce cas vous êtes sur le même réseau des 2 côtés, comme sur un switch. Vous pouvez alors mettre du bonding sur votre machine.

# cette fois on détecte la coupure avec des envois de paquet arp
# l'adresse ip est celle de votre passerelle juste en face
$ modprobe bonding mode=1 arp_interval=100 arp_ip_target=192.168.0.1 primary=eth0

$ ip link set bond0 up
$ ifenslave bond0 eth0
$ ifenslave bond0 wlan0

# configuration auto tant qu'à faire
$ dhclient bond0

Et voilà vous êtes toujours connectés, de façon automatique, même lors d'un basculement entre wifi et filaire.

Choix de configuration

Avant de mettre en place une solution de bonding, il faut savoir à quoi il va servir, car plusieurs modes sont disponibles, je ne vous ai parlé que du mode 1 ou active-backup.

Si vous avez 2 câbles, 2 cartes et un switch vous vous prémunissez d'une erreur de branchement (humaine) ou d'une carte qui grille (rare), mais aussi d'un port de switch qui grille.

Ajoutez un 2e switch et vous vous prémunissez en plus du cas du switch entier qui grille ou de sa prise qui se retrouve débranchée par erreur.

Il est aussi possible d'avoir pour but de doubler la bande passante de la machine. Dans ce cas choisissez de préférence un switch adapté (pour en profiter dans les 2 sens) et le mode 802.3ad.

Enfin un cas très intéressant est de pouvoir passer d'un mode de transport à un autre automatiquement en fonction des besoins : wifi <-> câble physique.

La liste des modes ainsi que la documentation complète se trouve sur le site de la linux fundation.

Niveau :      
Résumé : Bonne année

Plutôt que de vous souhaiter une bonne année comme tout le monde avec des vœux et du bonheur je vais plutôt vous écrire une article utile.

J'en profite pour ne pas vous demander vos résolutions, de toute façon une résolution est faite pour ne pas être tenue, sinon ça serait déjà fait ! La mienne sera comme tous les ans 1024x1280.

Faire un grep d'un mot (et non pas d'une suite de caractère) :

$ grep -w lemot "lemotte lemot"

Faire un xargs mais résistant aux entrées vides :

$ xargs -r rm < list

Faire un append en fin de fichier :

$ echo toto >> fichier

Faire un insert en début de fichier :

$ sed -i -e '1i\toto/' fichier

Lister les dernières erreurs de connexion :

$ faillog

Niveau :      
Résumé : ip route add .. nexthop via ...

Aujourd'hui on fait des nœuds.

Comme deux exemples valent mieux qu'un, je vous propose d'étudier 2 cas :

  • la personne qui a 2 cartes réseau (wifi, pas wifi) pointant vers le même routeur
  • la personne qui un routeur (genre pour une résidence) pointant vers plusieurs FAI

Comment faire pour répartir les connexions entre les différentes sorties proposées sans tout casser ?

iproute 2

Heureusement tout est dans le noyal ! La table de routage sait faire ce genre de chose.

Contrairement à ce qu'on pourrait croire mettre 2 routes par défaut ne marche pas. Le noyau n'en choisirait qu'une et la garderait jusqu'à ce que quelqu'un intervienne.

Il est par contre possible d'avoir une route vers une destination pointant vers plusieurs intermédiaires en même temps. C'est ce que fait l'option nexthop de la commande ip route.

Deux cartes réseau

Prenons le cas de la personne qui a 2 interfaces vers le même routeur :

$ ip route add default nexthop  via 10.0.0.1 dev eth0 weight 100 nexthop via 10.0.0.1 dev wlan0 weight 1

On choisit un poids de 100 pour faire en sorte d'utiliser presque toujours la première route plutôt que la deuxième. Bien sûr si une des routes est indisponibles, seul l'autre sera utilisée. Mais le système de routage ne le sait que grâce à l'interface elle même, il faut donc que l'interface supporte miimon pour détecter le débranchement d'un câble ou que vous la désactiviez à la main.

Ce genre de problème serait probablement mieux résolu avec un bridge ou du bonding, mais ce le sujet d'un prochain article.

Deux FAI

Plus difficile, prenons le cas de la personne qui a 2 FAI :

$ ip route add default nexthop  via 10.0.0.1 dev eth0 weight 1 nexthop via 192.168.0.1 dev eth1 weight 1

Et n'oubliez pas que pour que ca marche vraiment, il faudra que vous ayez du NAT quelque part (pour ipv6 on en reparle lorsque ça existe).

Il faut savoir que la table de routage dispose d'un cache. L'avantage est qu'il n'y a pas spécialement besoin de bidouiller avec le source routing pour que ça marche, ça fonctionne tel quel. L'inconvénient est qu'il n'y aura qu'une seule route par destination. Le partage de charge ne sera donc pas nécessairement équilibré puisque si tout le monde va sur youtube, un seul FAI sera utilisé.

Pour équilibrer le transfert de paquet il y a l'option equalize, mais elle nécessite d'une part un patch du noyau et d'autre part de passer un certain temps à faire sa configuration réseau car il faut maintenant router à la main les paquets d'une même connexion vers le même FAI (sinon le destinataire est perdu). C'est une solution plus compliquée mais qui peut être utile si vous n'avez que peu d'utilisateur ou de destinataires.

Enfin le failover ne se fait automatiquement que dans un cas, si le réseau est désactivé sur une carte (laquelle doit suporter mii-tools) . Sinon vous devez le faire manuellement :

$ ip link set dev eth0 down

Et si vous voulez le faire automatiquement lorsqu'un FAI ne répond plus, c'est à vous de mettre un script qui va vérifier la connectivité et faire des modifications si besoin.