blog.logout.fr Il est (vraiment) temps de faire une pause…

5Août/082

Périphériques USB sous Unix (suite)

Il y a quelques temps, je parlais d'un problème de mount de disques USB sous Linux. Vous m'avez alors conseillé (en commentaire) ceci :

  • Tu peux essayer de mounter tes disques en utilisant leur label. Sur les kernels linux récents (avec udev quoi) tu peux y accéder via /dev/disk/by-label.
  • Tu peux instaurer des règles de nommage pour certains périphériques. Il y a une page de la documentation Ubuntu a ce sujet : http://doc.ubuntu-fr.org/udev
  • Sinon, il y a HAL qui est bien pour pas ce prendre la tête avec tout ça.
  • Auto-mount devrait faire l'affaire, en effet.

Et bien c'est knarf qui avait raison. Pas pour l'histoire du label mais pour celle de udev. Il faut effectivement faire des règles udev pour créer des "fake mount points" plus faciles à gérer. La solution d'utiliser les labels ou les UUID ne fonctionne pas, car les disques USB ne sont pas disponibles au boot, je n'ai rien compris à HALd et Auto-mount ne correspondait pas à ce que je voulais.

En réalité, je me suis aidé d'un post que j'ai trouvé sur les forums de linuxquestions.org.

When a removable USB device is plugged in/out of a Linux box, there's no telling if Linux will assign that piece of hardware the same ID (ie. /dev/sdc1) each time. This of course wreaks havoc when trying to write an rsync backup script that starts by mounting the removable drive. Here's how to ensure that multiple *identical* removable hdd's can all get mounted and used.

  1. Create or edit the following new file :

    nano /etc/udev/rules.d/10-local.rules

    Code:

    ## gk - Persistent name for removable USB hdd's used for backup
    BUS=="usb", KERNEL=="sd?1", SYSFS{manufacturer}=="Prolific Technology Inc.", NAME="%k", SYMLINK+="usbhdd1"

    Note that the SYSFS{manufacturer} data comes from this command (while the drive is connected but not mounted on the server) :

    udevinfo -a -p $(udevinfo -q path -n /dev/sdc)

  2. Once the rule is created, disconnect, then reconnect the removable device so udev re-reads it's ruleset. Now there should be a new symlink, /dev/usbhdd%n, that points to the actual device file, in this case, /dev/sdc1.
  3. Modify /etc/fstab so you can mount /dev/usbhdd1 at /media/usbhdd:
  4. nano /etc/fstab and add the following:

    /dev/usbhdd1 /media/usbhdd ext3 rw,user,noauto 0 0

Une fois ceci fait, on doit obtenir un alias de mount point nommé /dev/usbhdd1 et qui pointera toujours vers le bon disque, en fonction de ses informations. Il y a plein d'informations disponibles avec la commande udevinfo. Personnellement, j'ai ajouté le numéro de série du disque à la règle udev, comme ça, je suis sûr que c'est le bon.

En conclusion, merci tout le monde, et à bientôt pour de nouvelles aventures.

Remplis sous: Geeker 2 Commentaires
17Juil/087

Périphériques USB sous Unix

Juste un petit article rapide pour faire une demande à tout ceux qui liraient ce blog et qui seraient assez calés en Unix pour me répondre. J'ai un petit problème avec des disques dur USB dont j'aimerais bien me débarrasser une bonne fois pour toutes (des problèmes).

Le problème est le suivant :
Je branche un disque dur USB sur la machine Unix, il prend le périphérique /dev/sdb. Je mounte /dev/sdb1 dans /mnt/disk1 et ça fonctionne. Je branche un second disque dur USB, il prend /dev/sdc, je mounte /dev/sdc1 dans /mnt/disk2 et ça fonctionne.

Disque dur USB
Maintenant imaginons que pour une raison X ou Y les disques durs soient arrêtés et redémarrés ou juste débranchés et rebranchés. Je perds /dev/sdb et /dev/sdc ainsi que les mount /mnt/disk1 et /mnt/disk2. Le problème, c'est que lorsque je rebranche les disques, ils prennent /dev/sdd et /dev/sde. Alors comment faire pour les re-mount automatiquement s'ils changent sans arrêt de nom ?

J'aimerais également les mettre directement dans /etc/fstab, mais idem. Je ne sais pas trop s'ils vont toujours avoir le même nom de périphérique et surtout s'ils seront toujours détectés dans le même ordre (disk1 sur sdb et disk2 sur sdc, et non l'inverse) lorsqu'on relancera la machine.

Avis aux connaisseurs.
(la suite ici)

Remplis sous: Geeker 7 Commentaires
1Juil/084

Domo-kun expliqué aux enfants

Que ce soit sur Internet ou dans la vraie vie, on me demande souvent ce que c'est que ce petit monstre que j'arbore régulièrement dans mes avatars ou sur mes tee-shirts et que je dispose un peu partout comme signature. Et c'est vrai que je n'en parle pas car les gens que je fréquente sont généralement déjà au courant. Mais depuis peu, j'ai reçu des demandes, même par email pour me poser juste cette question. Alors voilà, allons-y.

Ce monstre, c'est Domo-kun, du japonais Domo (mot passe-partout signifiant salut) et kun (un suffixe honorifique japonais pour désigner les jeunes hommes). En réalité, ce monstre est la mascotte d'une chaîne de TV japonaise nommée NHK (le plus important groupe audiovisuel public japonais). Elle apparait dans des petits clips très courts de 30 secondes, dans lesquels on peut la voir évoluer au quotidien dans une société qui l'effraie et la fascine à la fois.

Mais alors pourquoi est-il aussi célèbre, et pourquoi l'utiliser pour me représenter ? Il est célèbre car il a été utilisé pour la première fois hors de son contexte le 28 juillet 2001, dans la fameuse image que beaucoup de gens connaissent :

Every time you masturbates, god kills a kitten

Cette image a fait le tour du monde plusieurs fois, et de nombreuses personnes se sont attribuées la mascotte dans des tas de caricatures et de parodies. Au final, cette mascotte je l'adore parce qu'elle me ressemble...

Au premier abord, elle semble méchante et maléfique, mais quand on apprend à la connaître, on se rend compte qu'elle ne veut faire que le bien, c'est juste qu'elle est maladroite et ne sait pas trop comment s'y prendre avec les gens. De plus, elle voue une passion pour les nouvelles technologies et énerve souvent les gens parce qu'elle ne leur prête pas assez attention ou qu'elle passe son temps à rêvasser. Si on rajoute à ça le fait qu'elle est très colérique et souvent de mauvaise humeur, je crois qu'on a fait le tour de ma personnalité.

Voilà pourquoi, si vous me croisez un jour, vous me verrez probablement affublé d'un tee-shirt avec des dents pointues et deux yeux noirs. Mais je ne mord pas pour autant.

20Juin/082

PHP et les tableaux

Aujourd'hui, j'ai eu besoin de trouver la méthode la plus rapide pour chercher une valeur dans un tableau en PHP 5.2.3. Ça paraît super simple dit comme ça, mais le PHP est loin d'être le langage le moins verbeux... Je recherche donc la valeur «lol» dans le tableau suivant :

1, 'ceci est une chaîne de caractères', 2, 'true', 3, 'ceci est une autre chaîne', 4, 5, 'lol..?', 6, 'false', 7, 'lol', 8, 1564891215, 10, ' ', 11, 'fin'

Rien que pour rechercher cette valeur dans le tableau, j'ai réussi à trouver 8 méthodes différentes.

  • Boucler sur les valeurs du tableau avec un foreach($array as &$val) et comparer les valeurs une à une.
  • Passer toutes les valeurs du tableau en clés via array_combine() et faire un array_key_exists($value, $array) dessus.
  • Passer toutes les valeurs du tableau en clés via un array_combine() et faire un isset($array[$value]).
  • Remettre les valeurs en clés mais via array_flip($array) et retenter un array_key_exists($value, $array) dessus.
  • Remettre encore les valeurs en clés via array_flip($array) et tenter un isset($array[$value]) dessus.
  • Effectuer l'intersection du tableau $array et de array($value) et regarder s'il y a une concordance.
  • Utiliser la fonction in_array($value, $array) dédiée à ça de PHP, mais réputée lente.
  • Utiliser la fonction array_search($value, $array) dédiée à ça de PHP, mais réputée lente.

Les résultats sont étonnants et parlent d'eux même :

100000 iterations :
0.3730 — foreach($array as &$val)
1.0708 — array_key_exists($value, array_combine($array, array_fill(...)))
1.0194 — isset(array_combine($array, array_fill(...))[$value])
0.8494 — array_key_exists($value, array_flip($array))
0.7558 — isset(array_flip($array)[$value])
4.2376 — count(array_intersect($array, array($value))) > 0
0.2198 — in_array($value, $array)
0.1967 — array_search($value, $array) !== false

Alors que les fonctions in_array() et array_search() sont réputées lentes, il s'avère que ce sont finalement bel et bien les plus rapides ici. Je me suis alors demandé si elles feraient toujours aussi bien avec des tableaux plus grands, j'ai donc testé un tableau de 1000 entiers au hasard, et voilà :

1000 iterations each :
00.2598 — foreach($array as &$val)
00.4319 — array_key_exists($value, array_combine($array, array_fill(...)))
00.4293 — isset(array_combine($array, array_fill(...))[$value])
00.3286 — array_key_exists($value, array_flip($array ))
00.3351 — isset(array_flip($array)[$value])
16.9131 — count(array_intersect($array, array($value))) > 0
00.0826 — in_array($value, $array)
00.0772 — array_search($value, $array) !== false

J'ai ensuite essayé 10000 entiers, puis 1000 chaînes de caractères, et au final, in_array() et array_search() sont toujours plus rapides. Je me demande si je n'ai pas fait quelque chose de travers. En tout cas, ces résultats sont à méditer.

Remplis sous: Geeker 2 Commentaires
13Mai/081

Xubuntu, et vos ennuis s’envolent (et pas qu’eux)

Xubuntu

Au boulot, on a un petit PC qui ne sert pratiquement à rien (juste surveiller une page web) et qui est vraiment, vraiment merdique niveau hardware. Je ne sais pas exactement ce qu'il y a dedans, toujours est-il que c'est à peine suffisant pour faire tourner Xubuntu, ce qui est étonnant puisque Xubuntu a été créé pour ça, à la base (tourner sur de petits PC).

La différence entre Xubuntu et Ubuntu est à peu près le même qu'entre GNOME et Xfce. Ce dernier a comme principale caractéristique d'être plus léger tout en restant compatible avec les applications GNOME et KDE.

Ça marchait relativement bien, jusqu'à il y a quelques jours, quand la barre des tâches et la barre de menus ont subitement décidé d'aller faire un tour ailleurs. Évidemment, sans menu "démarrer" ni barre des tâches, il devient tout de suite plus compliqué à utiliser ce système. Et pour ne rien arranger à la situation, ouvrir une console (terminal) faisait carrément crasher le serveur X (l'interface graphique). Au final, après quelques heures à surfer sur Internet, j'ai trouvé une solution.

Le problème semble récurant sur la version Feisty Fawn de Xubuntu, le xfce4-panel crashe et ne se rouvre plus car, en cas de fermeture de session, ce comportement est sauvegardé comme "comportement par défaut". Il suffit donc de taper xfce4-panel & dans un terminal pour récupérer l'engin, seulement si vous êtes comme moi et que les terminaux ont tendance à en vouloir au GDM, il faudra avant aller faire un petit tour dans le /etc/X11/xorg.conf et changer la ligne DefaultDepth 24 par DefaultDepth 16.

Section "Screen"
Identifier "Default Screen"
Device "XGI - Xabre Graphics Inc Volari Z7"
Monitor "DELL E196FP"
DefaultDepth 24

Non, je ne sais pas pourquoi, ne me demandez pas.
Je sais juste que ça fonctionne, c'est la magie Linux... erm...

Remplis sous: Geeker, Râler 1 commentaire