Aymeric / APLU(.FR) - Mot-clé - linuxSite d'Aymeric (ou d'aplufr) pour parler de Linux, de technique.. enfin de tout et surtout de n'importe quoi !2023-09-19T19:41:16+02:00Aymericurn:md5:9a770342f58fde945e9ce016459f8f12DotclearUn kernel tout neuf pour l’Odroid-C1 !urn:md5:bda113f5d851a5ad78fd93f8601e962b2019-04-29T14:33:00+02:002019-05-08T20:56:49+02:00APLUsysadminC1hardkernelkernellinuxodroid <p>Pour ceux qui ne le savent pas, je suis l’heureux possesseur d’une carte ARM nommée Odroid-C1. Cette carte a été fabriquée autour de 2014/2015 par Hardkernel.</p>
<p>La version du noyau fourni avec la carte est 3.10, avec énormément de patchs "made by hardkernel" pour que tout fonctionne bien. Seulement, depuis bientôt deux ans, il n’y a plus de mise à jour et déjà les mises à jour à l’époque n’étaient pas fréquentes et ne suivaient pas vraiment les patchs de sécurité.</p>
<p>Bref, j’ai donc décidé qu’il était temps d’essayer d’avoir une nouvelle version du kernel pour cette carte.</p>
<p>Le support de cette carte par la version principale de Linux (mainline) existe grace au projet communautaire Linux for Amlogic Meson (<a href="http://linux-meson.com/doku.php)">http://linux-meson.com/doku.php</a>). Il a débuté fin 2015 avec ce patch (<a href="https://github.com/torvalds/linux/commit/4a69fcd3a10803854852481ab16031563d2d5381">https://github.com/torvalds/linux/commit/4a69fcd3a10803854852481ab16031563d2d5381</a>) qui a atterri dans la version 4.4 de Linux.</p>
<h2>Avant de commencer</h2>
<p>Je n’ai pas fait un test complet de la carte, il est donc possible que certaines choses ne fonctionnent pas correctement ou moins bien qu’avec le kernel d’origine.</p>
<p>Ce billet s’adresse à des personnes qui ont des bonnes connaissances de Linux et de son fonctionnement, il ne s’agit pas d’un tutoriel à appliquer tel que mais il doit être adapté pour votre cas (et carte).</p>
<h2>Support matériel</h2>
<p>La puce principale du C1 est un Amlogic S805, comme indiquée ici : <a href="https://wiki.odroid.com/odroid-c1/hardware/hardware">https://wiki.odroid.com/odroid-c1/hardware/hardware</a>.</p>
<p>Le tableau de la page <a href="http://linux-meson.com/doku.php">http://linux-meson.com/doku.php</a> nous donne le support de cette puce.</p>
<p>Attention, lors de l'écriture de ce billet, la sortie HDMI n'est pas supportée ! Ce nouveau noyau ne vous sera donc utile que si vous avez un usage sans écran (headless).</p>
<h2>Solution rapide</h2>
<p>Récupérer les fichiers sur le dépôt <a href="https://gitlab.com/mulx/kernel-odroidc1/" title="OdroidC1 - Kernel">git suivant</a> et sauter directement à la partie "installation".</p>
<p>Dans cette archive, vous trouverez le fichier uImage (le kernel) et les modules.</p>
<h2>Préparation - Compilation</h2>
<p>Avant tout, il faut préparer l’environnement de compilation, car on ne va pas compiler sur la carte ARM, ça serait bien trop long et ça risque de cramer la carte SD (même si on peut utiliser un disque usb pour éviter ça).</p>
<p>On va donc réaliser une cross-compilation depuis un PC, pour ce cas, je pars du principe que vous êtes avec une Debian Stretch, si ce n’est pas le cas, désolé <img src="https://www.aplu.fr/v2/?pf=smile.svg" alt=":)" class="smiley" /></p>
<p>D’abord, il faut installer les paquets requis pour les différentes étapes</p>
<pre>
apt install gcc-arm-linux-gnueabihf build-essential flex bison libssl-dev bc u-boot-tools ccache fakeroot ncurses-devel libncurses-dev lzop gcc-arm-none-eabi git</pre>
<p>Ensuite, on récupère la version stable de Linux (actuellement la version 5)</p>
<pre>
mkdir $HOME/compile
cd $HOME/compile
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git -b linux-5.0.y linux
cd linux</pre>
<p>La version 5.0 n’est pas une version avec un support à long terme, il faudra donc suivre les évolutions jusqu’à "tomber" sur une version dite LTS.</p>
<p>Avant tout, quelques variables d'environnement sont à définir</p>
<pre>
export PATH=/usr/lib/ccache:$PATH
export CROSS_COMPILE=arm-linux-gnueabihf-
export LOADADDR=0x00208000
export ARCH=arm
export INSTALL_MOD_PATH=$HOME/compile/linux-modules/</pre>
<p>La liste des options à activer pour avoir un kernel fonctionnel, voici le <a href="https://gitlab.com/mulx/kernel-odroidc1/blob/master/config" title="config">fichier « config »</a> à placer dans le dossier à la racine des sources, il faut le nommer ".config".</p>
<p>Vous pouvez sélectionner et modifier les options en faisant make menuconfig. Dans la config proposée ici, la plupart des options du kernel sont configurées en mode "module" afin de faire une image assez petite tout en proposant une configuration qui permettrait de brancher une clef tv en usb ou une carte wifi sans problème sur la carte odroid.</p>
<p>Une fois les options définies, il faut générer l’image ainsi que les fichiers dit "device tree" et bien sûr, les modules.</p>
<pre>
make -j4 uImage dtbs modules</pre>
<p>Je passe l’option j4 car j’ai un PC avec 4 cœurs ce qui permet d’accélerer le temps de compilation.</p>
<p>Une fois la compilation effectuée, on va faire</p>
<pre>
make modules_install</pre>
<p>Et maintenant il ne reste plus qu’à copier les fichiers sur la carte odroid.</p>
<p>Les fichiers dont on va avoir besoin dans la compilation qu'on a effectuée sont :</p>
<ul>
<li>Le fichier « DTB », située ici : <em>arch/arm/boot/dts/meson8b-odroidc1.dtb </em></li>
<li>L’image du noyaux, située ici : <em>arch/arm/boot/uImage</em></li>
<li>les modules dans, située dans : <em>arch/arm/lib/modules </em>(ainsi que dans <em>$INSTALL_MOD_PATH</em>)</li>
</ul>
<h2>Installation</h2>
<p>Si vous prenez les fichiers présents sur le git ou ceux de la compilation, l’installation est identique.</p>
<p>Les opérations de copie de fichiers (modules, kernel et DTB) peuvent être faite en branchant la carte SD sur un PC, ou depuis le C1 via le réseau ou une clef usb. La génération de l'initramfs doit elle être faite dans l'environnement cible, c'est-à-dire sur le C1. Elle nécessite un OS Debian ou Ubuntu sur le C1.</p>
<p>Dans le doute, faites les opérations depuis le C1, afin que les chemins correspondent à ceux de ce billet.</p>
<h3>Les modules</h3>
<p>On copie les fichiers des modules dans /lib/modules/ (si vous avez fait une compilation vous-mêmes ils sont dans : $INSTALL_MOD_PATH, sinon ils sont dans le répertoire <em>lib/modules</em> sur le git).</p>
<h3>Le kernel, l’initramfs et le DTB</h3>
<p>Le kernel est le fichier nommé <em>uImage</em> et le DTB <em>meson8b-odroidc1.dtb</em>, ces deux fichiers sont à copier dans le répertoire de boot de votre carte (en général /boot ou /media/boot).</p>
<p>Par souci de version, j’ajoute au fichier uImage le numéro de version (exemple uImage-3.10.148)</p>
<h4>Génération de l’initramfs</h4>
<p><span class="author-a-5z122zz73zaz70zjz68zvqqc6z90zz76zz83z0 i">Important, cette opération doit être faite depuis le C1 !</span></p>
<p>Pour générer l’initramfs, on utilise les commandes suivantes :</p>
<pre>
VERSION=5.0.10
update-initramfs -c -k $VERSION
mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n uInitrd -d /boot/initrd.img-$VERSION /boot/uInitrd-$VERSION
</pre>
<h3>Le boot.ini</h3>
<p>Il reste ensuite à modifier le fichier boot.ini pour démarrer sur notre nouveau noyau.</p>
<p>Les seules modifications absolument nécessaires au boot.ini par rapport au boot.ini fourni par la version ubuntu-minimal de hardkernel sont les 3 lignes fatload.</p>
<p>Si vous avez des doutes, vous <a href="https://gitlab.com/mulx/kernel-odroidc1/blob/master/boot/boot.ini" title="boot.ini">pouvez prendre celui-là</a> comme exemple.</p>
<p>Pour utiliser le boot.ini qui est en exemple, il faut récupérer l’UUID de votre partition système (rootdev plus loin), pour ça on peut utiliser la commande suivante :</p>
<pre>
blkid $(mount | awk '/ \/ /{print$1}')</pre>
<p>Il faut modifier les deux variables suivante pour correspondre aux informations de votre carte.</p>
<pre>
ethaddr
rootdev</pre>
<p>Il faut aussi changer vers la fin du fichier les noms des fichiers uImage et uInitrd.</p>
<pre>
fatload mmc 0:1 0x21000000 uImage-5.0.10
fatload mmc 0:1 0x22000000 uInitrd-5.0.10
#fatload mmc 0:1 0x21800000 meson8b_odroidc.dtb
fatload mmc 0:1 0x21800000 meson8b-odroidc1.dtb
</pre>
<h3>Post-conf (network)</h3>
<p>Pour une raison inconnue, définir l’adresse MAC de la carte réseau dans le boot.ini ne suffit pas, il faut aussi la définir dans le fichier de configuration <em>/etc/network/interfaces.</em></p>
<p>Il y a aussi un problème de stabilité si on laisse la carte réseau en gigabit, je force donc la carte en 100Mbit full duplex (merci <a href="http://rglinuxtech.com/?p=1831" hreflang="en" title="ARM64 – Odroid C2 – Hack to Fix Ethernet Hangs..">Adventures with Linux</a>).</p>
<pre>
iface eth0 inet dhcp
hwaddress ether 00:1e:06:cb:e2:4d
up ethtool -s $IFACE speed 100 duplex full autoneg off </pre>
<p>Si vous utiliser NetworkManager il faudra faire les modifications dans NetworkManager.</p>
<p>Sur Ubuntu, NetworkManager est installé, et remplace ifupdown.<br />
Cependant, en héritant de la conf dans /etc/network/interfaces.d/eth0 en lecture seule, il n'est pas capable de positionner l'adressse Mac de l'interface.</p>
<p>De plus, une fois l'interface active, il n'est pas possible de changer son adresse... or vous êtes connecté à l'odroid via le réseau en ssh ! La solution consiste a ajouter le paquet ifupdown : <em>apt install ifupdown</em>.</p>
<p>Après le redémarrage, la commande ifup sera lancée par le service networking, et l'adresse Mac sera positionnée en accord avec le fichier /etc/network/interfaces.d/eth0.</p>
<p>L'autre solution (non testée) aurait été une gestion complète via NetworkManager, en supprimant le fichier /<em>etc/network/interfaces.d/eth0</em> et en une ligne <em>mac-address</em> dans la section <em>[Ethernet]</em> du fichier <em>/etc/NetworkManager/system-connections/ethernet-eth0</em>.</p>
<h2>Il manque un module pour chez moi !</h2>
<p>Si vous avez besoin de modules ou d’option pour le noyaux qui ne sont pas disponible dans le binaire mis à disposition, merci d’ouvrir un ticket sur le <a href="https://gitlab.com/mulx/kernel-odroidc1/issues">gitlab.</a></p>
<h2>Ressources complémentaires</h2>
<ul>
<li>Compilations et tests automatisée de différents noyaux pour le C1 : <a href="https://kernelci.org/boot/meson8b-odroidc1/">https://kernelci.org/boot/meson8b-odroidc1/</a></li>
<li>Guide complet pour compiler un nouveau noyau sur ARM : <a href="https://github.com/umiddelb/armhf/wiki/How-To-compile-a-custom-Linux-kernel-for-your-ARM-device">https://github.com/umiddelb/armhf/wiki/How-To-compile-a-custom-Linux-kernel-for-your-ARM-device</a></li>
<li>Le wiki officiel : <a href="https://wiki.odroid.com/odroid-c1/odroid-c1">https://wiki.odroid.com/odroid-c1/odroid-c1</a></li>
<li>Le forum Odroid : <a href="https://forum.odroid.com/viewforum.php?f=111">https://forum.odroid.com/viewforum.php?f=111</a></li>
</ul>
<h2>Remerciement</h2>
<p>Merci à Id2ndR pour les remarques et amélioration de l’article.</p>
<p>Merci à Meriem pour les relectures :)</p>EXT4, augmentation à chaud et erreur de GDTurn:md5:b11193a37e2d5859d3347101f19e0df02017-07-31T22:25:00+02:002017-07-31T22:25:00+02:00APLUsysadminext4gdtlinuxresize2fs <p>Selon les technologies de stockage que vous utilisez, il est possible d’augmenter à chaud la taille d’un disque d’une machine Linux.</p>
<p>Soit par LVM, soit parce que vous êtes sur une solution de virtualisation, ou d’autres solutions farfelues.</p>
<p>Si vous utilisez ext4 (le système de fichiers le plus « standard » sous Linux), la commande magique pour agrandir à chaud, c’est :</p>
<pre>
resize2fs /dev/mondevice</pre>
<p>Vous avez un beau message indiquant :</p>
<pre>
Filesystem at /dev/vg/lv_home <span class="hljs-keyword">is</span> mounted <span class="hljs-keyword">on</span> /home; <span class="hljs-keyword">on</span>-line resizing required...</pre>
<p>Et si tout se passe bien,</p>
<pre class="code not-hl hljs cs">
The filesystem <span class="hljs-keyword">on</span> /dev/vg/lv_home <span class="hljs-keyword">is</span> now <span class="hljs-number">319283200</span> blocks <span class="hljs-keyword">long</span>.</pre>
<p>Mais là, c’est le drame, car vous obtenez le cryptique message</p>
<pre>
<code>resize2fs: Not enough reserved gdt blocks for resizing</code></pre>
<p>Ou encore</p>
<pre>
<code>resize2fs: permission denied to resize filesystem</code></pre>
<h2>Panique à bord ? Il faut tout recommencer ?</h2>
<p>Pas du tout, la raison est simple, vous pouvez augmenter un disque, à chaud, jusqu’à une certaine limite, par exemple 1000x la taille initiale.</p>
<p>La limite dépend de beaucoup d’options qui sont calculées lors du formatage initial.</p>
<p>Dans ce cas, la seule solution c’est de démonter le système de fichier et de l’augmenter à froid.</p>
<p>Donc :</p>
<pre>
<code>umount /home
e2fsck -f /dev/vg/lv_home
resize2fs /dev/vg/lv_home
mount /home</code></pre>
<p>À noter que cette erreur ne se produit, normalement, plus avec des kernels récents.</p>Augmenter la bande passante avec TCP BBRurn:md5:da20f2630f9633d4ec4c156fbf9bb6882017-07-24T00:11:00+02:002017-07-24T16:36:17+02:00APLUsysadminlinuxtcp bbr <p>Il y a quelques jours, je suis tombé sur un article qui explique comment Google a augmenté le débit et réduit la latence de son infrastructure avec un nouveau algorithme de congestion pour TCP : BBR.</p>
<p><a href="https://cloudplatform.googleblog.com/2017/07/TCP-BBR-congestion-control-comes-to-GCP-your-Internet-just-got-faster.html" hreflang="en">On parle ici d’une augmentation de 4 à 15 % selon les tests de Google</a>.</p>
<p>Pour activer cet algorithme, il faut disposer d’un kernel Linux récent avec le support des bonnes options.</p>
<h2>Vérifier les options du kernel</h2>
<p>La commande suivante doit vous retourner au moins la ligne CONFIG_TCP_CONG_BBR et CONFIG_NET_SCH_FQ.</p>
<pre>
$ egrep 'CONFIG_TCP_CONG_BBR|CONFIG_NET_SCH_FQ' /boot/config-$(uname -r)
CONFIG_TCP_CONG_BBR=m
CONFIG_NET_SCH_FQ_CODEL=m
CONFIG_NET_SCH_FQ=m</pre>
<p>Si vous n’avez pas, inutile de continuer, mettez à jour un kernel Linux plus récent, je n’ai pas regardé l’introduction des patchs, mais le kernel 4.9 de debian le supporte.</p>
<h2>Activer l’algorithme TCP BBR</h2>
<p>La solution la plus simple, créer un fichier nommé : /etc/sysctl.d/88-tcp_bbr.conf</p>
<p>avec le contenu suivant :</p>
<pre>
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr</pre>
<p>Puis lancer la commande suivante avec les droits root.</p>
<pre>
sysctl --system</pre>
<h2>Vérifier la prise en compte</h2>
<p>Pour vérifier la prise en compte, rien de plus simple que d’afficher les valeurs prises par le système :</p>
<pre>
# sysctl net.core.default_qdisc net.ipv4.tcp_congestion_control
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr</pre>
<p>On constate ici que les deux options de configuration ont les bonnes valeurs.</p>
<p>À défaut, vous aurez le résultat suivant (il s’agit de l’algorithme par défaut)</p>
<pre>
# sysctl net.core.default_qdisc net.ipv4.tcp_congestion_control
net.core.default_qdisc = pfifo_fast
net.ipv4.tcp_congestion_control = cubic</pre>Installation de EPEL sur RHEL7urn:md5:d51c12266658d1c1b9487aaa15b046812017-07-21T22:00:00+02:002017-07-24T16:16:23+02:00APLUsysadminlinuxrhelsysadmin <p>Utiliser un système RedHat Enterprise Linux ou CentOS c’est bien, mais parfois on a envie d’avoir un peu plus de logiciels que juste ceux supportés par RedHat.</p>
<p>Dans ce cas, on se tourne vers EPEL, <span class="mw-headline" id="Extra_Packages_for_Enterprise_Linux_.28EPEL.29">Extra Packages for Enterprise Linux. Il s’agit d’un repository qui contient bien plus de logiciels, supportés entièrement par la communauté.</span></p>
<p><span class="mw-headline">Pour l’installer, la solution la plus simple, c’est de télécharger et installer le fichier suivant </span><a href="https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm">https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm</a> (pour RHEL 7), pour RHEL 6 il faudra utiliser le lien suivant : <a href="https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm">https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm</a>.</p>
<p>Ce qui peut être fait en ligne de commande en une seule étape :</p>
<pre>
cd /tmp
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install epel-release-latest-7.noarch.rpm</pre>
<p>Ensuite, vous pouvez installer un peu plus de logiciels (comme htop par exemple).</p>
<pre>
# yum repolist
Modules complémentaires chargés : product-id, search-disabled-repos,
: subscription-manager
id du dépôt nom du dépôt statut
epel/x86_64 Extra Packages for Enterprise Linux 7 - 11 909
rhel-7-server-rpms/7Server/x86_64 Red Hat Enterprise Linux 7 Server (RPMs 14 598
repolist: 26 507</pre>
<p> </p>
<p> </p>Stockage, iSCSI, Multipath et Linuxurn:md5:6e854711d089b6d3e3406b5c2d210b392017-06-21T18:49:00+02:002017-07-21T20:53:20+02:00APLUsysadminiscsilinuxlunmultipathsysadmin <p>Ou comment faire tomber tout ce beau monde en marche, assez simplement <img src="https://www.aplu.fr/v2/?pf=smile.svg" alt=":)" class="smiley" /></p>
<h2>De quoi parle-t-on ?</h2>
<h3>iSCSI</h3>
<p>iSCSI c’est un protocole pour accéder à un disque, un morceau de disque, bref à un espace de stockage à travers le réseau (<em>via</em> des adresses IP).</p>
<p>Dit autrement, vous avez une machine avec plein de disques d’un côté du réseau, et une machine avec une (ou plusieurs) cartes réseau et vous souhaitez accéder à vos disques directement <em>via</em> le réseau ? C’est ce que permet de faire iSCSI.</p>
<h3>Multipath</h3>
<p>Le multipath, comme le nom peut le laisser entendre, c’est permettre d’accéder à la même chose par plusieurs chemins.</p>
<p>Appliqué au stockage, ça veut dire qu’on va accéder sur la même ressource de stockage <em>via</em> plusieurs liens, ce qui permet d’avoir de la redondance en cas de perte, et éventuellement, une répartition de charge. Ça peut être vu de manière équivalente <a class="ref-post" href="https://www.aplu.fr/v2/post/2014/05/24/Agr%C3%A9gation-de-liens-%28bonding%29-sous-Linux-%28Debian/Ubuntu%29">à ce qui avait décrit dans ce billet, sur le bonding réseau</a>.</p>
<h2>Mise en pratique</h2>
<p>Ici, je ne vais pas expliquer comment partager la ressource de stockage. Plusieurs raisons :</p>
<ul>
<li>On utilise en général des technologies de stockage différentes les unes des autres, et chacune a ses propres manières de faire la partie « serveur » (<em>target</em>) ;</li>
<li>La ressource de stockage peut être <em>via</em> Ceph/RDB, une baie dédiée (type Dell, IBM, EMC²), du VSAN VMware, une grappe raid… ou un simple disque dur.</li>
</ul>
<p>En termes de stockage, lorsqu’on partage un espace qui sera vu comme un disque, on appelle ça un LUN (<em>Logical Unit Number</em>), on doit donc définir sur l’équipement qui fait le stockage que le LUN numéro <em>xyz</em> sera publié pour le serveur <em>Charlie</em>. Pour ça, on présente le LUN dans un target et ce target au serveur. Il peut y avoir plusieurs LUN dans le même target et, à ma connaissance, un LUN ne peut pas être dans plusieurs targets.</p>
<p>Puisque l’on souhaite mettre du multipath ensuite, on doit donc s’assurer que le target sera joignable par plusieurs addresses IP (qui seront potentiellement sur des équipements réseau différents le long du chemin, sinon on se retrouve avec un SPoF qu’on va chercher à éviter).</p>
<p>Une fois le LUN « publié » depuis notre serveur Linux, on va pouvoir attacher ce volume au serveur.</p>
<p>Sur CentOS/RedHat, il faut installer le paquet iscsi-initiator-utils ; pour Debian/Ubuntu, il faut installer open-iscsi.</p>
<p>Dans les deux cas, on se retrouve avec une commande : iscsiadm.</p>
<h2>iscsiadmin</h2>
<p>Avant de commencer, on va (re)définir quelques valeurs par défaut qui sont plus adaptées pour la suite.</p>
<p>Ces réglages se font dans le fichier /etc/iscsi/iscsid.conf</p>
<p>Il y a quelques variables qui peuvent être définies, elles permettent d’avoir des mots de passe et du chiffrement, ce n’est pas obligatoire mais fortement recommandé.</p>
<pre>
node.session.auth.authmethod = CHAP
node.session.auth.username = username
node.session.auth.password = password!
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = username
discovery.sendtargets.auth.password = password!</pre>
<p>Cette valeur doit être modifiée, elle définit au bout de combien de secondes une session iSCSI qui n’est plus valable (par exemple le chemin réseau est KO) l’erreur sera remontée au-dessus. Vu autrement, au bout de combien de secondes, en cas de perte, on aura des erreurs et le LUN sera vu comme hors ligne, comme nous allons mettre du multipath ensuite, il est préférable d’avoir cette valeur à 0.</p>
<pre>
node.session.timeo.replacement_timeout = 0</pre>
<p>Une fois les options modifiées, lancez ou relancez le service iscsid.</p>
<p>Une fois ces réglages faits, avec la commande iscsiadm on va demander à la partie stockage, d’envoyer la liste des « targets » auquels le serveur a accès.</p>
<pre>
# iscsiadm -m discovery -t sendtargets -p 10.10.199.4
10.10.199.4:3260,2 iqn.1998-01.com.foo:4beb2e86-9c13-45f7-be3d-5eb96b7b62a6
</pre>
<p>On répète la même commande pour toutes les IP où notre LUN est joignable.</p>
<p>Une fois l’ensemble des discovery réalisés, la commande suivante permet de passer en ligne tous les LUNs.</p>
<pre>
# iscsiadm -m node -L all</pre>
<p>Si vous faites la commande <em>lsblk -pS</em> vous devriez voir plusieurs nouveaux disques (ici de sdb à sdm, je vous laisse deviner la solution de stockage utilisée :)).</p>
<pre>
# lsblk -pS
NAME HCTL TYPE VENDOR MODEL REV TRAN
/dev/sda 0:0:0:0 disk VMware Virtual disk 2.0
/dev/sdb 8:0:0:0 disk VMware Virtual SAN 0001 iscsi
/dev/sdc 3:0:0:0 disk VMware Virtual SAN 0001 iscsi
/dev/sdd 9:0:0:0 disk VMware Virtual SAN 0001 iscsi
/dev/sde 10:0:0:0 disk VMware Virtual SAN 0001 iscsi
/dev/sdf 8:0:0:1 disk VMware Virtual SAN 0001 iscsi
/dev/sdg 3:0:0:1 disk VMware Virtual SAN 0001 iscsi
/dev/sdh 9:0:0:1 disk VMware Virtual SAN 0001 iscsi
/dev/sdi 10:0:0:1 disk VMware Virtual SAN 0001 iscsi
/dev/sdj 8:0:0:2 disk VMware Virtual SAN 0001 iscsi
/dev/sdk 3:0:0:2 disk VMware Virtual SAN 0001 iscsi
/dev/sdl 9:0:0:2 disk VMware Virtual SAN 0001 iscsi
/dev/sdm 10:0:0:2 disk VMware Virtual SAN 0001 iscsi</pre>
<h2>Le multipath</h2>
<p>Pour configurer le multipath, ça va être relativement plus simple à faire. Sous CentOS/RHEL, il faut installer le paquet device-mapper-multipath et sous Debian/Ubuntu : multipath-tools.</p>
<p>Ensuite, il suffit de créer le fichier /etc/multipath.conf avec le contenu suivant :</p>
<pre>
defaults {
user_friendly_names yes
find_multipaths yes
features "1 queue_if_no_path"
path_grouping_policy failover
no_path_retry 100
}</pre>
<p>Une relance du service multipathd suffit en général pour prendre en compte les modifs.</p>
<p>Il est possible d’être plus specifique dans le fichier de configuration mais dans le cas présent, ces options suffisent pour nos besoins.</p>
<p>Une fois fait, la commande multipath -l permet de lister les différents agrégats de disque réalisés :</p>
<pre>
# multipath -l
mpathd (1VMware_VITDEVIDc7593159e1fd795a1d02901b0eafc51b) dm-4 VMware ,Virtual SAN
size=400G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 8:0:0:2 sdj 8:144 active undef running
|-+- policy='service-time 0' prio=0 status=enabled
| `- 9:0:0:2 sdl 8:176 active undef running
|-+- policy='service-time 0' prio=0 status=active
| `- 3:0:0:2 sdk 8:160 active undef running
`-+- policy='service-time 0' prio=0 status=enabled
`- 10:0:0:2 sdm 8:192 active undef running
mpathc (1VMware_VITDEVIDa05931591221cbf9f449901b0eafc615) dm-3 VMware ,Virtual SAN
size=200G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 8:0:0:1 sdf 8:80 active undef running
|-+- policy='service-time 0' prio=0 status=active
| `- 3:0:0:1 sdg 8:96 active undef running
|-+- policy='service-time 0' prio=0 status=enabled
| `- 9:0:0:1 sdh 8:112 active undef running
`-+- policy='service-time 0' prio=0 status=enabled
`- 10:0:0:1 sdi 8:128 active undef running
mpatha (1VMware_VITDEVID3dc72e59d49bb331d68b901b0eafc615) dm-2 VMware ,Virtual SAN
size=100G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 3:0:0:0 sdc 8:32 active undef running
|-+- policy='service-time 0' prio=0 status=enabled
| `- 8:0:0:0 sdb 8:16 active undef running
|-+- policy='service-time 0' prio=0 status=active
| `- 9:0:0:0 sdd 8:48 active undef running
`-+- policy='service-time 0' prio=0 status=enabled
`- 10:0:0:0 sde 8:64 active undef running</pre>
<p>Ici, on se retrouve avec 3 disques, mpathd, mpathc, et mpatha qui sont joignables par 4 chemins différents.</p>
<p>Pour l’usage ensuite, on accèdera non plus à sdX mais à mpathX, ainsi l’abstraction multipath permet de garantir l’accès au stockage.</p>
<p> </p>
<p> </p>Forcer un disque à réallouer des secteurs défectueuxurn:md5:5376c270d7189d853d9e85a0549986902016-01-07T16:00:00+01:002021-05-27T17:02:35+02:00APLUsysadminbadblocksdisque durhdparmlinux <p>Pour me souhaiter une bonne année, un disque dur a décidé de me faire une surprise avec des secteurs défectueux. Voici donc une méthode pour forcer le disque à se « réparer », mais d’abord, un peu d’histoire.</p>
<h2>Au commencement…</h2>
<p>Au tout début de l’informatique, on utilisait du support papier pour écrire les programmes et on faisait des trous pour coder les instructions pour l’ordinateur. Un programme faisait rapidement plusieurs centaines de cartes, lorsqu’il y avait une erreur de frappe sur une instruction, il suffisait de trouer l’ensemble de la ligne pour que l’ordinateur ignore l’instruction et continue comme si de rien n’était. Mais je n’ai pas l’intention de faire un cours d’histoire, alors tant pis pour les historiens, mais on va faire un gros saut.</p>
<p>Aujourd’hui, nos disques durs sont un peu plus intelligents et lorsque le logiciel du disque dur détecte des secteurs défectueux lors de la lecture, il tient à jour une liste et va essayer de les « corriger ». En vérité, ils sont déplacés — ou « réalloués » — dans une zone de réserve lors d’une opération d’écriture.</p>
<p>Cependant, tant que l’on n’aura pas réécrit sur ces secteurs, le disque continuera d’essayer de lire le contenu.</p>
<p>Le nombre de secteurs en attente de réallocation peut être visualisé par l’attribut 197 (<em>Current_Pending_Sector</em>) de la <a class="ref-post" href="https://www.aplu.fr/v2/post/2015/11/07/comment-va-ta-smart">S.M.A.R.T.</a>.</p>
<h2>Obtenir la liste des secteurs</h2>
<p>On va ici utiliser deux commandes, <em>fdisk</em> pour avoir des informations sur la géométrie du disque, puis <em>badblocks</em> pour localiser les secteurs défectueux.</p>
<pre>
# fdisk -l /dev/sdb
Disque /dev/sdb : 698,7 GiB, 750156374016 octets, 1465149168 secteurs
Unités : secteur de 1 × 512 = 512 octets</pre>
<p>Avec ces informations, nous savons que la taille d’un secteur est de 512 octets, on va donc demander à <em>badblocks</em> de lire le contenu du disque en précisant que la taille d’un block est de 512 octets. On en profite pour enregistrer le résultat dans un fichier texte.</p>
<p>Bien que ne s’agissant que d’un test en lecture, il est fortement recommandé de faire le test sur un disque non utilisé (pas de partition montée, depuis un livecd par exemple).</p>
<pre>
# badblocks -sv -b 512 /dev/sdb >/tmp/badblocks.txt
</pre>
<p>Une fois le test terminé, le fichier <em>/tmp/badblocks.txt</em> va contenir les numéros des secteurs qui rencontrent une erreur, a noter que <em>badblocks</em> teste 64 blocks d’un coup, donc ici 64 secteurs. Il est possible qu’il n’y en ait qu’un seul dans la liste en erreur.</p>
<pre>
# cat /tmp/badblocks.txt
207205608
207205609
207205610
…
</pre>
<h2>Corriger avec le marteau et le burin</h2>
<p>Maintenant que nous avons la liste, on va forcer le disque à réallouer le secteur en inscrivant des données sur les secteurs en question.</p>
<p>Bien évidemment, cela entraîne de la corruption des données, mais primo les données sur le disque étaient déjà illisibles — puisque les secteurs sont marqués comme défectueux — puis secundo, vous aviez des sauvegardes, n’est-ce pas ?</p>
<p>Avant tout, on va vérifier que le secteur est bien illisible avec la commande <em>hdparm</em>.</p>
<pre>
# hdparm --read-sector 207205609 /dev/sdb
/dev/sdb:
reading sector 207205609: FAILED: Input/output error</pre>
<p>Ici, nous avons une erreur d’entrée-sortie qui confirme que le secteur est illisble. Dans le cas où la lecture fonctionne, le résultat ressemblerait à ça :</p>
<pre>
# hdparm --read-sector 207205608 /dev/sdb
/dev/sda:
reading sector 207205608: succeeded
7b7d d740 31…</pre>
<p>Nous avons identifié notre secteur défectueux, demandons à <em>hdparm</em> d’écrire dessus.</p>
<pre>
# hdparm --write-sector 207205609 /dev/sdb
/dev/sdb:
Use of --write-sector is VERY DANGEROUS.
You are trying to deliberately overwrite a low-level sector on the media.
This is a BAD idea, and can easily result in total data loss.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.
Program aborted.</pre>
<p>Eh oui, c’est très dangereux, alors il faut explicitement dire que l’on est sûr de ce que l’on souhaite faire.</p>
<pre>
# hdparm --yes-i-know-what-i-am-doing --write-sector 207205609 /dev/sdb
/dev/sdb:
re-writing sector 207205609: succeeded</pre>
<p>Il ne reste plus qu’à vérifier que le secteur est redevenu lisible, on utilisera ici la commande précédente, <em>read-sector</em>.</p>
<pre>
# hdparm --read-sector 207205609 /dev/sdb
/dev/sdb:
reading sector 207205609: succeeded
0000 0000 0000…</pre>
<p>La commande a réussi et va retourner le contenu du secteur, qui doit être composé de 0.</p>
<p>Il faut ensuite répéter cette opération pour tous les secteurs trouvés par la commande <em>badblocks</em>. Une fois terminé, il ne reste plus qu’à restaurer les sauvegardes, car vous ne pourrez pas savoir ce qui a été perdu.</p>11111100000urn:md5:1a05299c8da3be963e6a48e8848310932016-01-03T17:00:00+01:002016-01-03T17:00:00+01:00APLUtout et rien2016AndroidCardDAVCyanogenModDAVdroidDégooglisonsgmailGooglelinuxlinux-presentation-day <h1 style="text-align: center;">Bonne année 2016…</h1><p>Je vous souhaite une bonne année 2016. On va espérer qu'elle soit moins dramatique que la précédente, tant sur la partie terrorisme que sur les dérives sécuritaires qui se mettent en place en France (et dans le reste du monde), même si ça semble être utopique… Donc, n’oubliez pas de faire plein de bisous et donner votre salaire, ou une partie, pour les associations qui se battent pour que nous gardions nos libertés (et de vous investir aussi). Je ne peux aussi que vous conseiller d’utiliser Tor, de chiffrer vos mails, vos SMS, et tout le reste, sans que ça devienne non plus contraignant, mais cela permet de mettre un frein à la surveillance de masse par les gouvernements et de conserver notre vie privée.</p><h2>Google et moi, update</h2><p>Il y a un an, dans <a class="ref-post" href="https://www.aplu.fr/v2/post/2015/01/01/11111011111">ce billet</a>, je faisais état de mon usage des services de Google. Un an après, faisons le point :</p><ul><li>Gmail : Cette partie-là n’a pas changé, je ne me suis pas connecté dessus de toute l’année dernière. Les spams et messages de Google qui arrivent dessus me sont transférés sur mon adresse mail ;</li><li>Calendar : Aucun changement sur ce point, mon agenda est toujours sur une instance locale de OwnCloud et je synchronise ça <em>via</em> DAVdroid sur mon Android ;</li><li>Contacts : Ils ne sont pas revenus chez Google, cependant ils ne sont plus gérés par OwnCloud car j’ai rencontré de trop nombreux problèmes. J’utilise maintenant DavCAL mais la partie serveur est quand même susceptible de changer ;</li><li>Android : Cet aspect-là n’a pas changé, j’ai toujours un smartphone Android avec CyanogenMOD, et mon prochain smartphone aura aussi droit à CyanogenMOD ;</li><li>Youtube : Je continue d’y aller pour regarder quelques vidéos (même si je passe souvent par vlc ou youtube-dl pour ne pas aller sur le site) ;</li><li>Search : <a hreflang="fr" href="https://duckduckgo.com/?q=dax+ddg">Duckduckgo</a> est toujours mon moteur de recherche. Il n’y a pas très longtemps, je me suis retrouvé par hasard sur la page de Google et, surprise !, il y a un gros popup qui empêche d’accéder au site demandant de valider les règles de confidentialité. N’ayant pas l’intention de les lire ni de les accepter… ;</li><li>Maps : Toujours <a href="https://openstreetmap.org">OpenStreetMap</a> et depuis que le calcul d'itinéraire a été intégré, je ne me sers quasiment plus que de ça. Parfois, pour des itinéraires complexes, je retourne sur <a hreflang="en" href="http://open.mapquest.com/">open.mapquest.com</a>. Côté smartphone, c’est toujours OsmAnd ;</li><li>Google+ : Zéro connexion sur Google+ pour 2015. En revanche, j’avais dit que j’allais utiliser <a hreflang="fr" href="https://framasphere.org/people/7ee680703b86013250b02a0000053625">Framasphère</a>, c’est un échec et je suis toujours sur Twitter ;</li><li><a hreflang="fr" href="http://google.fr/movies">Movies</a> : Peu de changement, <a hreflang="fr" href="http://www.senscritique.com/films">SensCritique</a> ainsi que les sites des différentes salles de ciné du coin ;</li><li>Translate : Pas de changement pour la traduction mot à mot, toujours WordReference ou Wiktionary. Pour la traduction de texte, je suis allé voir le diable et j’utilise Bing Translate ;</li><li>Code : Google Code n’est plus.</li></ul><p>Pour Android, comme mis à jour en avril dans le billet, mon smartphone fonctionne maintenant sans aucune application Google, et toutes les applications que j’ai viennent uniquement de F-Droid. Mon prochain smartphone sera livré avec CyanogenOS et j’y installerai CyanogenMOD à la place après quelques jours d’utilisation.</p><h2>Dans les projets 2015 :</h2><ul><li>Je n’ai pas publié mon billet pour expliquer comment surveiller la température avec une clef 3G, des capteurs de température et un peu de bricole, mais c’est toujours prévu ;</li><li>Debian est devenu le système d’exploitation installé sur tous mes ordinateurs. <a hreflang="fr" href="https://fr.wikipedia.org/wiki/Vrms">VRMS</a> n’est pas forcément toujours “proud”, j’ai quelques paquets qui viennent de contrib et des firmwares non-free (carte réseau par exemple) ;</li><li>J’ai pu faire des choses fun avec mon Arduino (notamment contrôler une chaudière en fonction de la température), il n’y a pas eu de billet (il y en aura probablement un). Et je n’ai pas fini de m’amuser avec ;</li><li>Le C1 me sert de serveur de fichiers avec des disques branchés en USB, il fonctionne correctement mais je n’en suis pas non plus hyper satisfait, j’ai souvent des problèmes lors des mises à jour du kernel ;</li><li>Le minitel n’a pas bougé d’un poil, il me sert même de presse papier… ;</li><li>En ce qui concerne le projet top secret, il est toujours top secret <img src="https://www.aplu.fr/v2/?pf=smile.svg" alt=":)" class="smiley" /></li></ul><h2>Quant à 2016</h2><ul><li>Comme je l’ai dit dans <a class="ref-post" href="https://www.aplu.fr/v2/post/2015/12/23/linux-presentation-day">le billet</a> parlant de Linux Presentation Day, je vais m’occuper de faire bouger la France (oui, rien que ça) pour qu’il n’y ait pas que les LUG toulousains qui participent ;</li><li>J’irai au FOSDEM, j’ai déjà noté quelques conférences qui m’intéressent mais je n’ai pas encore fait le tour de toutes les tracks ;</li><li>J’ai prévu de regarder les quelques conférences qui m’intéressent du <a hreflang="en" href="https://media.ccc.de/b/congress/2015">CCC</a> ;</li><li>Mon <a class="ref-post" href="https://www.aplu.fr/v2/post/2015/06/14/nouvelle-clef-gpg">ancienne clef GPG</a> a été révoquée comme annoncé précédemment ;</li><li>Le reste n’est pas encore décidé mais il y a encore quelques jours avant 2017 <img src="https://www.aplu.fr/v2/?pf=smile.svg" alt=":)" class="smiley" /></li></ul>Linux Presentation Dayurn:md5:602e31d790a3434e0976f2176b8f131b2015-12-23T23:00:00+01:002015-12-26T19:15:19+01:00APLUtoulibreaprilbelugcapitole du librelibrelinuxlinux-presentation-daylpdtoulibre <p wrap="">Une idée qui vient d’un LUG allemand (<a hreflang="de" href="http://www.belug.de/">BeLUG</a>) est d’organiser, deux fois dans l’année, une rencontre/présentation de Linux (et du logiciel libre) nommée “Linux Presentation Day”.</p><p wrap="">L’idée est d’avoir un équivalent de Libre en Fête, mais au lieu de rester dans les frontières franco-françaises, ces deux dates sont les mêmes pour tous les LUG européens (et peut-être un jour mondiaux, mais ça, on verra).<br /><br />Pour l’instant, les LUG de plusieurs pays suivent l’évènement (Allemagne, Autriche, Italie, Suisse) et un peu les Anglais.<br />La grande idée derrière tout ça ? Arriver à toucher les grands médias (TV, presse généraliste) et permettre donc à plus de monde de découvrir Linux.<br />En effet, les quelques évènements qui atteignent les journaux « généralistes » restent malgré tout des trucs locaux (comme le Capitole du Libre qui arrive à avoir un petit article dans La Dépêche) mais le reste du temps, ça ne sort pas des quelques journaux spécialisés IT.</p><p wrap="">Ensuite, chaque LUG se débrouille pour trouver un lieu pour organiser l’évènement et fait de la com' locale. Pendant la journée, on présente Linux/libre aux visiteurs, on peut faire des petites présentations.</p><p wrap="">Pour l’année 2016, les deux dates choisies sont : 30 avril et 22 octobre.</p><p wrap="">Le site en anglais de l’évènement est là : <a href="http://linux-presentation-day.org">http://linux-presentation-day.org</a>.</p><p wrap="">À <a hreflang="fr" href="http://toulibre.org">Toulibre</a>, on va se débrouiller pour participer, alors si toi, lecteur, tu es en contact avec d’autres LUG français, n’hésite pas à faire passer l’info, ils ont sûrement déjà reçu un mail du référent côté BeLUG, mais ils n’y ont pas répondu.</p><p wrap="">Si vous avez des questions pour la partie française, n’hésitez pas à me solliciter en direct (mon mail est sur la page <a hreflang="fr" href="https://www.aplu.fr/v2/pages/A-propos-/-FAQ">à propos</a>), pour l’instant, je suis le sujet à fond :).</p><p wrap=""> </p>Oh my watchdogurn:md5:21ded1777ca507a62c90473a5d95bc3f2014-12-20T22:29:00+01:002015-01-18T15:34:28+01:00APLUHardwaredebianintellinuxmotherboardsystèmewatchdog <p>Le <a href="https://fr.wikipedia.org/wiki/Chien_de_garde_%28informatique%29" hreflang="fr">watchdog</a>, littéralement chien de garde, est une protection destinée généralement à redémarrer le système, si une action définie n'est pas exécutée dans un délai imparti.<br />
Voici comment l'activer sur des ordinateurs fonctionnant sous Linux à base de processeur Intel ou pour les RaspberryPi.</p>
<h2>Prérequis</h2>
<p>Il faut un système ayant un watchdog, il est possible de faire un watchdog logiciel mais cela ne couvrira pas tous les cas, tel que le crash système.</p>
<h3>Chipset Intel</h3>
<p>Pour les processeurs Intel, il est présent sur tous les chipsets à base de ICH, il suffit de charger le module<em> iCTO_wdt</em>.<br />
Ce qui produit les lignes suivantes dans les messages du noyau :</p>
<pre>
[39401.100017] iTCO_vendor_support: vendor-support=0
[39401.111655] iTCO_wdt: Intel TCO WatchDog Timer Driver v1.10
[39401.111684] iTCO_wdt: Found a Lynx Point TCO device (Version=2, TCOBASE=0x1860)
[39401.114203] iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0)</pre>
<p>Selon le modèle, le module peut détecter d'autres types de périphérique :</p>
<pre>
[ 25.912615] iTCO_wdt: Found a Bay Trail SoC TCO device (Version=3, TCOBASE=0x0460)</pre>
<pre>
[ 25.751022] iTCO_wdt: Found a ICH6-M TCO device (Version=2, TCOBASE=0x0860)</pre>
<h3>RaspberryPi</h3>
<p>Pour raspberry, il suffit de charger le module <em>bcm2708_wdog</em> en ajoutant ledit module dans le fichier <em>/etc/modules</em>.</p>
<pre>
[ 12.450346] bcm2708 watchdog, heartbeat=10 sec (nowayout=1)</pre>
<h3>Vérification</h3>
<p>Dans tous les cas, un périphérique doit apparaître dans /dev</p>
<pre>
ls -l /dev/watchdog*
crw------- 1 root root 10, 130 déc. 20 20:07 /dev/watchdog</pre>
<h2>Mise en place</h2>
<p>Pour la plupart des distrubtions Linux, un logiciel nommé watchdog est présent dans les dépots et permet d'activer le mécanisme.</p>
<p>Sous debian, il suffit d'ajouter dans /etc/watchdog.conf la ligne suivante :</p>
<pre>
watchdog-device = /dev/watchdog</pre>
<p>Une fois le service lancé, le programme va écrire de manière régulière pour qu'un reboot matériel ne soit pas executé par le watchdog.</p>
<h2>Tests</h2>
<p>Une des techniques les plus simples consiste à crasher le kernel, si le système est relancé alors le watchdog fonctionne.</p>
<p>Je vous recommande fortement de fermer les documents actifs et de couper tous les services qui risqueraient de ne pas apprécier (base de données, par exemple).<br />
Pour faire un kernel panic, le plus simple est de faire cette action :</p>
<pre>
echo c > /proc/sysrq-trigger</pre>
<p>Vous pouvez aussi désactiver les partitions swap et éxectuer une fork bomb, en théorie le système devrait finir par crasher :</p>
<pre class="de1">
swapoff -a
:(){ :|:& };:
</pre>
<h2>L'option nowayout</h2>
<p>Quasiment tous les modules de watchdog ont une option nommée <em>nowayout</em>, cette option signifie que le watchdog ne sera pas désactivé, même si le service watchdog est amené à être arrêté (arrêt du service, ou kill du processus).</p>
<p>Pour activer cette option sur mon raspberry, je charge le module de cette manière :</p>
<pre>
# cat /etc/modules
bcm2708_wdog nowayout=1</pre>Installer automatiquement Ubuntu (ou Debian)urn:md5:25bc548698d5a82b454881d10aeef1d12014-11-11T11:11:00+01:002017-07-21T20:54:16+02:00APLUsysadminautodebianinstallationlinuxnetbootpxesysadminubuntu <p>Le but de la manipulation va être de configurer un système Linux (ici Debian) pour installer de manière totalement automatisée une Ubuntu Trusty 64 bits.<br />
<br />
L'utilisation typique est pour un GUL qui souhaite installer très facilement plusieurs PC qui serviront pour faire des démonstrations.</p>
<h2>Prérequis</h2>
<p>Il faut une machine avec deux connexions réseau, dont au moins une filaire et un peu moins de 100 Go pour un miroir complet d'Ubuntu pour une architecture (32 bits ou 64 bits).</p>
<p>Pour la partie système, j'ai choisi d'installer Debian avec XFCE et l'installation de ce dernier n'est pas l'objet de ce billet.</p>
<p>Avoir une connaissance du fonctionnement d'un système Linux et de l'utilisation de la ligne de commande.</p>
<p>Une fois le système installé, on a besoin de quelques outils supplémentaires :</p>
<ul>
<li><q>dnsmasq</q> (peut être remplacé par dhcpd + tftpd + bind9, mais c'est beaucoup plus simple avec dnsmasq) ;</li>
<li><q>nginx</q> (ou n'importe quel serveur web) ;</li>
<li><q>apt-mirror</q> ;</li>
<li><q>syslinux-common</q> ;</li>
<li><q>pxelinux</q> ;</li>
<li><q>ntp</q> (démon) ;</li>
<li><q>apt-cacher-ng</q> (facultatif).</li>
</ul>
<h2>Configuration d'apt-mirror</h2>
<p><q>apt-mirror</q> va servir à faire un miroir local d'apt pour fournir les paquets sans connexion internet.</p>
<p>Le fichier de configuration d'apt-mirror est situé ici <code>/etc/apt/mirror.list</code>, par défaut apt-mirror utilise l'architecture du système, dans notre cas le but est d'avoir un miroir d'Ubuntu 14.04 64 bits, et le système installé est une Debian Jessie 32 bits. Le fichier de configuration a donc été modifié pour ressembler à ça :</p>
<pre>
set defaultarch amd64
set _tilde 0
deb http://archive.ubuntu.com/ubuntu trusty main multiverse universe restricted
deb http://archive.ubuntu.com/ubuntu trusty-updates main multiverse universe restricted
deb http://archive.ubuntu.com/ubuntu trusty-security main multiverse universe restricted
#needed for netboot install
deb http://archive.ubuntu.com/ubuntu trusty main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer
deb http://archive.ubuntu.com/ubuntu trusty-updates main/debian-installer restricted/debian-installer universe/debian-installer multiverse/debian-installer
deb http://security.ubuntu.com/ubuntu trusty-security main multiverse universe restricted
#avoid timeout with netboot autoconfiguring security
deb-i386 http://security.ubuntu.com/ubuntu trusty-security main multiverse universe restricted
deb-i386 http://archive.ubuntu.com/ubuntu trusty-security main multiverse universe restricted</pre>
<p>D'autres options sont possibles, comme spécifier où stocker les paquets, le nombre de téléchargements à effectuer en parallèle, pour les détails voir la documentation d'apt-mirror.</p>
<p>Pour générer le miroir, il suffit de lancer la commande <code>apt-mirror</code>, en root. Il est possible d'arrêter la commande à tout moment, relancer la commande pour reprendre les téléchargements.</p>
<h2>Configuration de l'interface réseau en IP statique</h2>
<p>Avant d'aller plus loin, il est important d'identifier quelle interface réseau va servir à effectuer les installations, ici, il s'agit de l'interface eth0 et le réseau <q>192.168.2.0/24</q> sera utilisé.</p>
<p>Voici ce que l'on positionne dans le fichier /etc/network/interfaces :</p>
<pre>
allow-hotplug eth0
iface eth0 inet static
address 192.168.2.1
netmask 255.255.255.0
auto eth0</pre>
<p>Pour activer le port forwarding (permet de laisser la machine accéder à Internet lorsqu'elle est sur le réseau filaire), cela se fait avec la commande suivante qui a été ajoutée dans le fichier <code>/etc/rc.local</code> afin que le paramétrage soit effectué au démarrage de la machine :</p>
<pre>
iptables -t nat -A POSTROUTING -j MASQUERADE -s 192.168.2.0/24</pre>
<p>Et enfin, en ajoutant l'option suivante dans le fichier <code>/etc/sysctl.conf</code></p>
<pre>
net.ipv4.ip_forward=1</pre>
<h2>Configuration de dnsmasq</h2>
<p>DNSmasq va servir à plusieurs choses :</p>
<ol>
<li>Serveur DHCP ;</li>
<li>Serveur TFTP ;</li>
<li>Serveur DNS.</li>
</ol>
<p>Le fichier de configuration de dnsmasq est ici : <code>/etc/dnsmasq.conf</code>.<br />
Dans un premier temps, on va configurer dnsmasq pour ne fonctionner que sur l'interface réseau qui nous intéresse, ici eth0.</p>
<pre>
interface=eth0
except-interface=wlan0
bind-interfaces</pre>
<p>Ensuite, on active la partie DHCP</p>
<pre>
dhcp-range=192.168.2.20,192.168.2.80,1h
dhcp-option=option:router,192.168.2.1
dhcp-boot=pxelinux.0
dhcp-authoritative
domain=toulibre.org</pre>
<p>Puis TFTP</p>
<pre>
enable-tftp
tftp-root=/srv/tfpd
tftp-no-blocksize</pre>
<p>Et enfin, la partie DNS</p>
<pre>
address=/security.ubuntu.com/192.168.2.1
address=/local.ubuntu.com/192.168.2.1
address=/boot.ubuntu.com/192.168.2.1</pre>
<p>Ici, on effectue un <q>DNS menteur</q> sur la zone ubuntu.com, ce n'est pas forcément très heureux mais ça permet d'éviter d'aller sur internet pour des ressources que l'on peut servir localement.<br />
De plus, on « fabrique » deux sous-domaines qui n'existent pas chez ubuntu.com, pour local. et boot. on pouvait aussi prendre un domaine bidon comme chez.moi.</p>
<h2>Configuration de nginx</h2>
<p>On va activer nginx pour servir trois domaines, les trois que l'on usurpe à ubuntu.com.</p>
<p>Voici donc ce que l'on va placer dans <code>/etc/nginx/sites-available/defaults</code> :</p>
<pre>
server {
listen 80 default_server;
root /srv/apt/archive.ubuntu.com/;
index index.html index.htm;
server_name archive.ubuntu.com local.ubuntu.com;
location / {
try_files $uri $uri/ =404;
}
}
server {
server_name security.ubuntu.com;
root /srv/apt/security.ubuntu.com;
location / {
try_files $uri $uri/ =404;
}
}
server {
server_name boot.ubuntu.com;
root /srv/boot/;
location / {
try_files $uri $uri/ =404;
}
}</pre>
<p>Il ne reste plus qu'à faire des liens symboliques pour rendre les fichiers d'apt-mirror visibles par nginx.</p>
<pre>
mkdir -p /srv/apt/
ln -s /var/spool/apt-mirror/mirror/archive.ubuntu.com/ /srv/apt/archive.ubuntu.com
ln -s /var/spool/apt-mirror/mirror/archive.ubuntu.com/ /srv/apt/security.ubuntu.com</pre>
<h2>Configuration de la partie TFTP</h2>
<p>Commençons par créer le dossier</p>
<pre>
mkdir -p /srv/tftp
cd /srv/tftp</pre>
<p>Puis par copier les fichiers de base</p>
<pre>
cp /usr/lib/syslinux/modules/bios/menu.c32 .
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 . #??
cp /usr/lib/PXELINUX/pxelinux.0 .</pre>
<p>On télécharge l'image netboot fournie par Ubuntu</p>
<pre>
wget http://archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/linux
wget http://fr.archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/ubuntu-installer/amd64/initrd.gz</pre>
<p>Et on termine de configurer le menu de boot PXE :</p>
<pre>
mdkir pxelinux.cfg
cat pxelinux.cfg/default << EOF
default menu.c32
menu "install auto, Toulibre"
label autoboot
menu label Ubuntu Trusty 64 bits fullauto
menu default
timeout 30
kernel linux
append initrd=initrd.gz auto url=http://boot.ubuntu.com/preseed.cfg vga=788 debian-installer/locale=fr_FR console-setup/ask_detect=false console-setup/layoutcode=fr keyboard-configuration/layoutcode=fr keyboard-configuration/variantcode=latin9
EOF</pre>
<p>Ici, on a ajouté quelques options sur la ligne <em>append</em>, voici le détail :</p>
<ul>
<li>auto : installation automatique, suivre les informations du fichier preseed ;</li>
<li>url : où trouver le fichier preseed ;</li>
<li>vga : permet d'avoir une résolution d'écran lisible, peut être totalement supprimé sans problème ;</li>
<li>debian-installer, console-setup et keyboard-configuration : permet de répondre aux questions relatives à la disposition du clavier qui sont demandées avant la lecture du fichier preseed.cfg.</li>
</ul>
<h2>Configuration du système preseed</h2>
<p>Le fichier preseed contient les réponses dont a besoin l'installeur pour fonctionner. S'il ne trouve pas la réponse dans le fichier, alors il demande à l'utilisateur.</p>
<pre>
apt-mirror-setup apt-setup/backports boolean true
apt-mirror-setup apt-setup/extras boolean true
apt-mirror-setup apt-setup/multiverse boolean true
apt-mirror-setup apt-setup/partner boolean true
apt-mirror-setup apt-setup/restricted boolean true
apt-mirror-setup apt-setup/universe boolean true
apt-setup-udeb apt-setup/services-select multiselect security
d-i apt-setup/backports boolean true
d-i apt-setup/restricted boolean true
d-i apt-setup/universe boolean true</pre>
<p>Ces différentes options activent les dépôts apt que l'on souhaite utiliser sur la machine.</p>
<pre>
clock-setup clock-setup/ntp boolean true
clock-setup clock-setup/utc boolean true
d-i clock-setup/ntp-server string local.ubuntu.com
tzsetup-udeb time/zone string Europe/Paris
d-i time/zone string Europe/Paris</pre>
<p>Questions relatives à l'heure, synchronisation ntp et horloge interne en UTC.</p>
<pre>
d-i cdrom-detect/eject boolean false
d-i finish-install/reboot_in_progress note</pre>
<p>Faut-il éjecter le cd à la fin de l'installation, non, car il s'agit d'une install réseau :) (permet aussi de laisser le PC redémarrer automatiquement).</p>
<pre>
d-i console-setup/ask_detect boolean false
d-i console-setup/detect detect-keyboard
d-i console-setup/detected note
d-i debconf/language string fr
d-i debian-installer/country string FR
d-i debian-installer/language string fr
d-i debian-installer/locale select fr_FR.UTF-8
d-i keyboard-configuration/layout select Français
d-i keyboard-configuration/layout select Français
d-i keyboard-configuration/modelcode string pc105
d-i keyboard-configuration/model select
d-i keyboard-configuration/variantcode string latin9
d-i keyboard-configuration/variant select Français - Français (variante obsolète)
d-i keyboard-configuration/variant select Français - Français (variante obsolète)
d-i keyboard-configuration/xkb-keymap select fr(latin9)
d-i localechooser/languagelist select fr
d-i localechooser/preferred-locale select fr_FR.UTF-8
d-i localechooser/shortlist select FR
d-i localechooser/shortlist select FR</pre>
<p>Permet de configurer le clavier et la langue, certaines options ont déjà été fournies au moment du boot et sont donc renseignées deux fois, mais ça n'a aucun impact.</p>
<pre>
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true</pre>
<p>Installation de grub automatique et réponses aux questions pour savoir s'il n'y a qu'un seul système ou plusieurs.</p>
<pre>
d-i mirror/country string manual
d-i mirror/http/directory string /ubuntu
d-i mirror/http/hostname string local.ubuntu.com
d-i mirror/http/proxy string </pre>
<p>Définition du miroir qui va être utilisé, on sélectionne donc le miroir local (qui pointe sur notre PC).</p>
<pre>
d-i hw-detect/load_firmware boolean true</pre>
<p>Chargement automatique des firmwares pour faire fonctionner certains périphériques (carte réseau notamment).</p>
<pre>
d-i msttcorefonts/accepted-mscorefonts-eula boolean true
d-i msttcorefonts/present-mscorefonts-eula note
ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula boolean true</pre>
<p>Permet d'installer automatiquement les polices de compatibilité microsoft (package ttf-mscorefont)</p>
<pre>
d-i netcfg/choose_interface select auto</pre>
<p>Sélectionne automatiquement la carte réseau, peut ne pas fonctionner sur une machine avec plusieurs cartes réseau.</p>
<pre>
d-i partman-auto/choose_recipe select atomic
d-i partman-auto/disk string /dev/sda
d-i partman-auto-lvm/guided_size string max
d-i partman-auto/method string regular
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/default_filesystem string ext4
d-i partman-lvm/confirm boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-partitioning/confirm_write_new_label boolean true</pre>
<p>Partitionnement du disque dur, ici on demande d'effectuer un partitionnement de manière automatique avec une seule partition en ext4, utilisant tout le disque /dev/sda.<br />
Pas de présence de RAID logiciel ou LVM.</p>
<p><strong>Attention donc car l'installeur ne cherchera pas à savoir si ce qu'il y a sur le disque est (était) important !</strong></p>
<pre>
d-i passwd/root-login boolean false
d-i passwd/user-fullname string Toulibre Demo
d-i passwd/username string toulibre
d-i passwd/user-password-again password toulibre
d-i passwd/user-password password toulibre
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false</pre>
<p>Configuration de l'utilisateur avec le mot de passe, il est possible de fournir une chaîne chiffrée pour le mot de passe (afin de ne pas l'écrire en clair dans ce fichier)</p>
<pre>
d-i pkgsel/include string openssh-server build-essential vim htop libreoffice firefox thunderbird gimp eog ntp screen vlc audacity language-pack-fr openshot ubuntu-restricted-extras
d-i pkgsel/language-packs multiselect fr
tasksel tasksel/first multiselect ubuntu-desktop, standard</pre>
<p>Sélection des tâches à effectuer et paquets à installer, ubuntu-desktop permet d'avoir un environnement standard, ensuite on installe quelques logiciels que l'on souhaite avoir en plus.</p>
<pre>
pkgsel pkgsel/update-policy select unattended-upgrades
popularity-contest popularity-contest/participate boolean false </pre>
<p>Unattended upgrades permet au système de faire les mises à jour silencieusement (cf <a href="https://help.ubuntu.com/community/AutomaticSecurityUpdates" hreflang="en">https://help.ubuntu.com/community/AutomaticSecurityUpdates</a>).<br />
L'autre ligne permet de répondre que l'on ne souhaite pas participer à l'évaluation (anonyme) de popularité des logiciels.</p>
<pre>
d-i preseed/late_command string in-target wget --no-proxy -O/tmp/postconf.sh http://boot.ubuntu.com/postconf.sh; in-target bash /tmp/postconf.sh</pre>
<p>Permet d’exécuter un script de post-configuration.</p>
<p>C'est tout pour le fichier preseed.</p>
<h2>Script de post configuration</h2>
<p>Le script de post-conf est facultatif, mais il permet d'effectuer quelques dernières modif sur le système avant de le relancer.</p>
<pre>
#!/bin/bash
#update ubuntu using apt-cacher-ng, not impacted by dnsmasq jobs on secu.
echo 'Acquire::http::Proxy "http://192.168.2.1:3142/";' > /etc/apt/apt.conf
cat << EOF > /etc/apt/sources.list
deb http://fr.archive.ubuntu.com/ubuntu trusty main universe multiverse restricted
deb http://fr.archive.ubuntu.com/ubuntu trusty-updates main universe multiverse restricted
deb http://fr.archive.ubuntu.com/ubuntu trusty-backports main universe multiverse restricted
deb http://security.ubuntu.com/ubuntu trusty-security main universe multiverse restricted
deb http://archive.canonical.com/ubuntu trusty partner
deb http://extras.ubuntu.com/ubuntu trusty main
EOF</pre>
<pre>
apt-get update
apt-get -y dist-upgrade
#reset apt-proxy to a null value, allow end-user to install apps
rm -f /etc/apt/apt.conf</pre>
<p>Ces quelques lignes permettent de mettre à jour l'installation en allant chercher sur internet (cas où le miroir local de ne serait pas à jour), il remet aussi les lignes du sources.list sur des valeurs qui existent.</p>
<pre>
#### fixubuntu
#amazon
apt-get -y purge unity-webapps-common
#script from fixubuntu.com
wget http://boot.ubuntu.com/fixubuntu.sh -O/tmp/fixubuntu.sh
su - toulibre -c '/bin/bash /tmp/fixubuntu.sh' &>/var/log/fixubuntu.log
if ! grep -q "127.0.0.1 productsearch.ubuntu.com" /etc/hosts; then
echo -e "\n127.0.0.1 productsearch.ubuntu.com" | tee -a /etc/hosts >/dev/null
fi
exit 0</pre>
<p>Enfin, cette partie supprime la présence d'Amazon sur le système.</p>Mise à jour des SSD Samsung sans CD et sans Windowsurn:md5:f77344405bf602936aa7d92bd8a520e42014-11-02T19:35:00+01:002015-01-18T15:37:28+01:00APLUHardware840 evobugcorrectifdisque durharddriveinformatiquelinuxproblèmesamsungssd <p>Il y a un mois un problème a été découvert sur les gammes de SSD 840 EVO de Samsung. En effet, les performances se dégradent avec le temps.</p>
<p>Le problème a été reconnu par Samsung qui a publié un correctif, d'abord pour Windows et maintenant en version LiveCD.</p>
<p>Pour les détails, allez lire l'article de NextINpact ici : <a href="http://www.nextinpact.com/news/90205-ssd-840-evo-debits-chutent-parfois-en-lecture-samsung-prepare-patch.htm" hreflang="fr">http://www.nextinpact.com/news/90205-ssd-840-evo-debits-chutent-parfois-en-lecture-samsung-prepare-patch.htm</a> qui sera plus clair que moi.</p>
<h2>Mise à jour du firmware par clef USB</h2>
<p>Samsung a donc <a href="http://www.samsung.com/global/business/semiconductor/minisite/SSD/us/html/support/downloads.html#restoration_ssd840evo" hreflang="fr">publié récemment une version du correctif</a>, d'abord pour Windows, puis une version LiveCD.<br />
La version LiveCD ne pouvant pas être copiée telle que sur une clef USB, voici la même version mais avec une rapide correction pour la rendre compatible clef USB (mais plus CD pour le coup).</p>
<p>À télécharger ici : <a href="https://www.aplu.fr/v2/public/samsung.img.gz" hreflang="fr">samsung.img.gz</a>.</p>
<p>Pour la copier, il suffit de faire les commandes suivantes :</p>
<pre>
gunzip samsung.img.gz
dd if=samsung.img of=/dev/sdX</pre>
<p>où /dev/sdX correspond à la clef USB.</p>
<p>Attention, car toutes les données existantes de la clefs seront perdues.</p>
<h2>Comment le faire à la main</h2>
<p>Pour ceux qui n'auraient pas confiance, voici la liste de commandes utilisée pour transformer le CD en clef USB.</p>
<p>Cela part du principe que la clef USB est sdb, toutes les commandes sont à faire en tant que root et le paquet syslinux doit être installé.</p>
<pre>
# On récupère l'ISO depuis le site de Samsung
wget -O/tmp/SPR.iso http://www.samsung.com/global/business/semiconductor/minisite/SSD/downloads/software/Samsung_Performance_Restoration.iso
# Définir la clef USB
USB=sdb
# Création de dossiers temporaire pour travailler
mkdir /tmp/usb /tmp/iso
# On monte l'ISO pour y accèder
mount /tmp/SPR.iso /tmp/iso
# On démonte la clef (au cas où)
umount /dev/${USB}*
# Création d'une partition en début de disque, bootable, de type fat32 et 5Mo.
fdisk /dev/${USB} << EOF
o
n
p
1
+5M
t
b
a
1
w
EOF
# Création du système de fichier en FAT32
mkfs.vfat /dev/${USB}1
# On monte la partition qu'on vient de créer
mount /dev/${USB}1 /tmp/usb/
# Copie des fichiers du CD sur la clef
cp /tmp/iso/isolinux/* /tmp/usb/.
# On renomme isolinux pour l'utiliser avec syslinux
mv /tmp/usb/isolinux.cfg /tmp/usb/syslinux.cfg
# On installe syslinux
dd if=/usr/lib/syslinux/mbr.bin of=/dev/$USB
# On installe syslinux (encore)
syslinux -sif /dev/${USB}1
# On démonte la clef et c'est fini
umount /tmp/usb /tmp/iso</pre>
<p>Voilà, il ne reste plus qu'à redémarrer sur la clef USB et laisser l'outil de Samsung travailler.</p>Agrégation de liens (bonding) sous Linux (Debian/Ubuntu)urn:md5:8d45ab37e6f0b0de92cd10e2fec255e52014-05-24T22:45:00+02:002017-07-21T20:54:16+02:00APLUsysadminagregationbondingdebianinformatiquelibrelinuxlogicielnetworksysadminsystèmeubuntu <h2>Qu'est-ce que l'agrégation de liens (ou network bonding) ?</h2>
<p>L'agrégation de liens consiste à regrouper plusieurs ports réseau pour en faire un seul. Cette technique permet d'avoir soit de la redondance, soit d’augmenter le débit, soit les deux.</p>
<h2>Prérequis</h2>
<p>Pour faire la suite, il faut :</p>
<ul>
<li>Une machine sous Debian/Ubuntu avec au minimum deux cartes réseau</li>
<li>Un switch sur le même lan</li>
</ul>
<p>Il n'y a pas besoin d'avoir un switch programmable, à 15k euros, un simple switch à 30 euros fait l'affaire, du moins selon ce que l'on veut faire.</p>
<h2>Configuration/Installation</h2>
<p>Dans un premier temps, il faut installer le paquet <code>ifenslave-2.6</code> :</p>
<pre>
# apt-get install ifenslave-2.6</pre>
<p>Ensuite, il faut modifier le fichier interfaces (/etc/network/interfaces).<br />
Dans l'exemple ci-dessous, je pars du principe que les deux cartes sont eth0 et eth1, voici ce qu'il suffit de mettre dans le fichier <em>eni</em> :</p>
<pre>
auto lo
iface lo inet loopback
auto bond0
iface bond0 inet dhcp
bond-slaves eth0 eth1
bond_mode 0
bond_miimon 100
</pre>
<p>Et c'est tout ! Aucune mention des cartes eth0 et eth1 n'est à faire, c'est via l'option <em>bond-slaves</em> que les cartes physiques sont précisées.<br />
Il ne restera plus qu'à faire un <code><em>ifup bond0</em></code><em> </em>pour que l'interface s'active et obtienne une adresse IP automatiquement via DHCP.</p>
<p>Quelques précisions, le mode de l'agrégation (<code>bond_mode</code>) peut prendre différentes valeurs. Il est possible de mettre la valeur en texte ou avec le numéro.</p>
<ul>
<li><em>balance-rr</em> ou 0 : Ce mode permet de répartir le trafic sur les différents liens en utilisant l'algorithme round-robin, il n'y a pas besoin d'équipement spécifique de l'autre côté. Si un des liens ne fonctionne plus, une redondance est assurée.</li>
<li><em>active-backup</em> ou 1 : Ce mode permet d'utiliser une interface pour transmettre, l'autre prenant le relais en cas de problème. Il n'y aucune augmentation de débit, uniquement de la redondance.</li>
<li><em>balance-xor</em> ou 2 : Dans ce mode, les paquets sont transmis via une des cartes qui est choisie en fonction de l'adresse MAC de destination.</li>
<li><em>broadcast</em> ou 3 : Les paquets sont transmis simultanément sur toutes les cartes.</li>
<li><em>802.3ad</em> ou 4 : Nommé aussi <em>Dynamic link aggregation</em>, il utilise la norme IEEE du même nom et le switch doit supporter ce mode.</li>
<li><em>balance-tlb</em> ou 5 : Ceci permet une répartition du trafic émis sur les différentes cartes en fonction de la charge de système. N'importe quel switch est compatible avec ce mode.</li>
<li><em>balance-alb</em> ou 6 : Ce mode est équivalent au précédent mais permet en plus une répartition du trafic reçu sur les différentes cartes. Tout comme le mode 5, cette fonction reste compatible avec n'importe quel switch.</li>
</ul>
<p>Pour avoir plus d'info sur les différents modes possibles, il faut consulter <a href="https://www.kernel.org/doc/Documentation/networking/bonding.txt" hreflang="en">la doc ici (anglais)</a>.<br />
Dans mon cas, j'ai opté pour le mode d'agrégation en <em>round-robin</em>, mon but n'étant pas de chercher à avoir la meilleure redondance mais les meilleures performances.</p>
<h2>Test</h2>
<p>En guise de test, j'ai utilisé <code>iperf</code>.<br />
Dans mon cas, j'ai fais un agrégat de deux cartes 100 Mbits sur un switch giga, et la deuxième machine utilisée pour les tests est reliée via un lien giga ethernet.</p>
<p>En théorie, cette configuration permet d'avoir 200 Mbits full-duplex, dans la pratique j'obtiens plutôt du 150 Mbits full-duplex :</p>
<pre>
[ 3] 0.0-10.0 sec 186 MBytes 156 Mbits/sec
[ 4] 0.0-10.1 sec 182 MBytes 152 Mbits/sec</pre>
<p>Ceci vient sûrement de la machine qui est assez vieille et l'opération de <em>bonding</em> a tendance à solliciter le CPU.</p>
<p>Le téléchargement d'un fichier de 200 M en http sur le réseau local donne quasiment 20 Mo/s comme résultat :</p>
<pre>
wget http://p1e1g/fic -O/dev/null
....
2014-05-24 22:45:53 (18,4 MB/s) - «/dev/null» sauvegardé [209715200/209715200]</pre>
<p>Ce qui donne 147,2 Mbits/sec.</p>
<p>À noter, tous les tests ont été faits en utilisant le protocole TCP, il est probable que ce mode de fonctionnement perturbe des streamings en UDP, mais je n'ai pas fait de test.</p>Un Minitel et un PCurn:md5:f1ef540489479cec69756004449902882014-01-25T09:30:00+01:002015-01-18T15:13:11+01:00APLUHardware7805diyelectroniquehardwarelinuxmax232minitelrs-232schemastransistorvieillerie <h2>Le but</h2>
<p>Le but est de connecter un Minitel sur le port série d'un PC. Il existe une multitude d'articles sur Internet, mais j'ai été déçu du peu d'explications sur les schémas électronique, j'ai donc décidé d'en faire... un de plus.</p>
<p>Quels sont les avantages, à part le côté rétro, fun, et de trouver une utilisation à ce fameux Minitel qui ne sert plus à rien ? Aucun.</p>
<h3>Prérequis</h3>
<p>Pour commencer, il y a plusieurs versions de Minitels. Il en faut un qui dispose d'une prise péri-informatique (prise DIN-5). C'est le cas du <a href="https://www.aplu.fr/v2/public/minitel/minitel_1b.pdf">Minitel 1b (oui, il s'agit d'une doc officielle)</a>.<br />
Actuellement, il n'est pas possible de brancher un Minitel qui n'a pas cette prise, à moins que vous ayez un générateur de signaux Télétel sur prise en T (auquel cas il est probable que vous soyez un ancien technicien de France Télécom).</p>
<p>Il faut ensuite un PC avec port série, ou un port série en USB.</p>
<p>Un câble avec un/des composant(s) pour adapter les signaux RS232 (série) du PC vers la prise DIN du Minitel qui fonctionne en TTL.</p>
<h2>Un peu de théorie</h2>
<p>Le RS232 est un standard pour communiquer des informations numériques (1 ou 0) sur un câble.<br />
Ce qui nous intéresse ici, c'est de savoir qu'un niveau logique 0 est représenté par une tension de +3 V à +25 V et un niveau logique 1 par une tension de -3 V à -25 V.<br />
De manière générale, sur un PC, les tensions sont ±12 V.<br />
Attention, ceci n'est valable que pour les données (TX et RX), les autres lignes de contrôle (DTR, DCD, RTS…) sont en logique positive.</p>
<p>La prise DIN du Minitel fonctionne en niveau TTL. Donc, un niveau logique 0 est représenté par une tension entre 0 et <span class="nowrap">0,5 V</span>, et un niveau logique 1 par une tension de <span class="nowrap">3 V</span> à <span class="nowrap">5 V.</span></p>
<p><span class="nowrap">Partant de ces faits, il est impératif d'adapter les signaux, il y a même un composant spécialement fait pour, le MAX232. </span></p>
<h2>Montage à base de transistor</h2>
<p>Le montage suivant est assez simple à faire, mais ne respecte pas complètement la norme RS232.<a href="https://www.aplu.fr/v2/public/minitel/montage1.png" title="Montage transistor"><img alt="Montage transistor" src="https://www.aplu.fr/v2/public/minitel/.montage1_s.png" style="margin: 0 auto; display: block;" title="Montage transistor, janv. 2014" /></a>La ligne TX (DB9) - RX (DIN) respecte des deux côtés les normes des signaux. Cette ligne fonctionne dans le sens PC vers Minitel.</p>
<ul>
<li>Lorsqu'un 0 (+12 V) est émis depuis le PC, le transistor est passant, le RX est forcé à 0 volts.</li>
<li>Lorsqu'un 1 (-12 V) est émis depuis le PC, le transistor est bloqué, le RX est « flottant », il pourrait être nécessaire d'ajouter une résistance de <em>pull-up</em> depuis l'alimentation PIN5 du Minitel. Néanmoins, cela fonctionne correctement, le Minitel semble générer une tension d'environ 3-4 volts.</li>
</ul>
<p>Cependant la ligne RX (DB9) - TX (DIN) ne respecte pas la norme. De ce fait, il peut y avoir impossibilité d'envoyer des signaux depuis le Minitel.</p>
<ul>
<li>Lorsqu'un 0 (0 V) est émis depuis le Minitel, le transistor est bloqué (la résistance de 15 kΩ est ignorée dans ce cas), la tension est approximativement la même que celle générée par DTR.<br />
<em>DTR produit un niveau logique 1 représenté par une tension positive (12 volts sur un PC).</em><br />
Pour ce cas, la norme RS-232 est bien respectée.</li>
<li>Lorsqu'un 1 est émis depuis le Minitel, la résistance de 15 kΩ ramène la base du transistor à une tension positive. En effet, dans le cas présent, le Minitel ne génère aucune tension, il est spécifié dans la documentation qu'il s'agit d'<a href="https://fr.wikipedia.org/wiki/Collecteur_ouvert" hreflang="fr">un collecteur ouvert</a>.<br />
Le transistor étant passant, la borne RX au niveau RS232 reçoit une tension de 0 volt pour représenter un 1 logique.<br />
Pour ce cas, la norme RS-232 n'est pas respectée.</li>
</ul>
<p>Si les composants sur l'ordinateur respectent la norme RS232, ce montage ne peut fonctionner que dans un sens, une tension de 0 volt étant un état qui n'existe simplement pas.<br />
Heureusement pour nous, généralement, les composants modernes des PC sont plus soft et considèrent le changement de front.</p>
<p>Dans ce montage, les valeurs des résistances peuvent être changées selon ce que vous avez en stock, tant que vous restez dans la gamme 5 kΩ à 20 kΩ.</p>
<h2>Montage autonome avec un RS232</h2>
<p>Ce montage utilise un composant qui respecte totalement la norme RS232 et TTL, il est cependant plus complexe.<a href="https://www.aplu.fr/v2/public/minitel/montage2.png" title="Montage RS232"><img alt="Montage RS232" src="https://www.aplu.fr/v2/public/minitel/.montage2_s.png" style="margin: 0 auto; display: block;" title="Montage RS232, janv. 2014" /></a>Dans ce montage, on utilise une pin supplémentaire sur le connecteur DIN du Minitel. Cette pin (5) fournit une tension de 8,5 V jusqu'à 1 A.<br />
Le LM7805 présent en haut sur le schéma génère une tension de 5 V stabilisée pour une tension d'entrée comprise entre 7 V et 30 V.<br />
Cette tension de 5 V est utilisée pour alimenter le MAX232 qui permet de convertir les signaux TTL en signaux RS232.</p>
<p>Il est parfaitement possible de remplacer le 7805 par une diode Zener et une résistance.</p>
<p>Les condensateurs sont obligatoires pour que le MAX232 fonctionne, et leur valeurs proviennent de la documentation technique du MAX232.<br />
Vérifier ce que spécifie la documentation du composant car le MAX232<strong>A</strong> utilise d'autres valeurs.</p>
<p>Avec ce montage, le MAX232 va générer des tensions comprises entre -10 V et 10 V pour adapter les signaux TTL (0 V,5 V) provenant du Minitel.<br />
Et tout comme le montage précédent, une résistance <em>pull-up</em> est présente sur la pin TX du Minitel.</p>
<h2>DTR, DCD, WTF!</h2>
<p>Une petite précision : sur les montages, le signal DTR (Data Terminal Ready) est connecté sur le signal DCD (Data Carrier Detect).</p>
<p>Le principe est simple, l'ordinateur envoie un signal (1 logique) sur DTR une fois qu'il est en état d'effectuer une transmission série. En réinjectant ce signal sur la ligne DCD, l'ordinateur s'attend à recevoir des données à tout moment. En effet, cela informe l'ordinateur de la présence d'un composant.</p>
<h2>Et après ?</h2>
<p>Une fois le câble fait, il est possible de communiquer avec le Minitel depuis le PC, ou l'inverse. Sous linux, il est possible de :</p>
<ul>
<li>L'utiliser comme un périphérique terminal en activant le TTY ;</li>
<li>L'utiliser comme écran d'affichage pour regarder ses films (certains modèles sont quand même en 8 couleurs !).</li>
</ul>
<h3>Quelques précisions</h3>
<p>Sans manipulation particulière sur le Minitel, il faudra utiliser le port série en 1200 bauds 7N1 (7 bits de data, pas de parité, 1 bit de stop). De plus, sans manipulation sur le Minitel, ce dernier est en mode Vidéotex permettant un affichage de 40 colonnes par 24 lignes.</p>
<p>Avec une vitesse de 1200 bauds en Vidéotex, il est possible de rafraîchir l'écran environ 1 fois par seconde.</p>
<p>Les Minitels 1B qui disposent de la touche fonction peuvent basculer en mode dit mixte permettant un affichage de 80 colonnes par 25 lignes.<br />
De plus, il est possible d'augmenter la vitesse de synchronisation jusqu'à 4800 bauds (9600 bauds pour les plus récents).</p>
<p>Pour les Minitels sans la touche <em>Fonction</em>, il devrait être possible (non testé à l'heure actuelle) de le basculer en mode mixte depuis l'ordinateur en envoyant une séquence particulière.</p>Test de surdité, DIYurn:md5:c95e3a66d33d3ccaabb58bf301c378be2013-10-14T22:55:00+02:002015-01-15T13:15:45+01:00APLUtout et rienaudacityaudiogrammebashdeafnessdiygithublibrelinuxpythonsurditétest <h2>Dit autrement, viens ici voir comment tu n'entends rien.</h2>
<p>Il y a quelques jours, j'ai discuté avec une personne qui a des problèmes d'audition et qui m'a demandé : « <em>Tu ne connais pas un moyen de faire un test ?</em> ».</p>
<h3>Attends, je t'explique le « test »</h3>
<p>Un test auditif, ça consiste juste à jouer des signaux « purs » (tels qu'une sinusoïde à 500 Hz, 1 kHz, etc) avec des volumes différents, puis de noter quand le sourd il finit par entendre ce signal.<br />
Sur un vrai test auditif, le signal va être calibré avant.</p>
<p>Une fois que le sourd il a fini le test, on obtient une courbe par oreille avec les différentes fréquences et grosso modo la puissance qu'il a fallut envoyer pour que ça arrive jusque dans son cerveau.</p>
<h3>Maintenant que tu as la base du test, tu peux reprendre ta lecture.</h3>
<p>Les deux premières choses qui me sont venues à l'esprit :</p>
<ul>
<li>Ça doit déjà exister ;</li>
<li>Avec Audacity, on peut le faire.</li>
</ul>
<h2>Ça existe déjà</h2>
<p>Le « ça existe déjà », perso j'ai pas trouvé un truc pour Linux. Ça existe probablement parce que je ne peux pas être le seul à avoir des idées aussi tordues mais j'ai pas trouvé rapidement dans le grand Internet.</p>
<h2>Plan B</h2>
<p>Du coup, je suis passé au plan B, avec Audacity, on peut le faire.</p>
<p>C'est vrai, on peut générer un signal puis régler le volume prendre des notes, puis on recommence, puis c'est chiant.</p>
<p>Au final, ça marche, mais vraiment c'est chiant. Surtout quand on a beaucoup d'oreilles.</p>
<h2>DIY (Do It Yourself)</h2>
<p>Et donc je me suis dit, ça serait vachement cool d'avoir un truc qui joue un signal sonore, puis tu dis quand tu l'entends. Comme ça, si le truc vachement cool, il change le volume et la fréquence tout seul, ben tu l'as ton test et ça serait chiant mais moins qu'avec Audacity.</p>
<p>Et donc voilà. J'ai écrit un truc à la rache (même plus vite encore) et publié sur GitHub : <a href="https://github.com/mulx/deafness-test" hreflang="en" title="Deafness Test GitHub">https://github.com/mulx/deafness-test</a>.</p>
<h3>Comment que ça marche ?</h3>
<p>C'est un script en bash (écrit à la <del>bash</del> rache mais là je radote) qui fait sortir un son :</p>
<ul>
<li>à une certaine fréquence ;</li>
<li>à un certain volume ;</li>
<li>sur un certain canal (droite ou gauche - je suis désolé si tu as plus de deux oreilles).</li>
</ul>
<p>Une fois que le « bruit » est sorti, tu as une question simple qui te demande sur laquelle de tes oreilles tu as entendu le signal. En fonction de ta réponse, le volume, l'oreille ou la fréquence, change.</p>
<p>Quand c'est fini, un fichier CSV contient les valeurs pour tes deux oreilles ainsi que la fréquence.<br />
Si tu es un pro du tableur en quelques clics, tu peux obtenir un joli graphique (audiogramme précisément) qui ressemblera à ça :</p>
<p><a href="https://www.aplu.fr/v2/public/deafness-test.png" title="Graphique test de surdité"><img alt="Graphique test de surdité" src="https://www.aplu.fr/v2/public/.deafness-test_s.png" title="Graphique test de surdité, oct. 2013" /></a></p>
<h3>C'est génial ! Je veux le faire</h3>
<p>Ça tombe bien, c'est pour ça qu'il est sur github !</p>
<h3>Le bash, ça pue</h3>
<p>Oui (je ne vais pas te contredire) faudrait clairement faire un truc mieux, plus <em>zoli</em>, avec une interface graphique et en python. Sinon, faudrait mieux chercher, je suis sûr que ça existe déjà.</p>
<h3>Ceci étant dit...</h3>
<p>Si, par erreur, tu voudrais faire le test, il faut simplement prendre le fichier audiotest.sh puis <del>tu vas lire la doc</del> il faut le lancer de cette manière :</p>
<p><em>bash audiotest.sh "fréquence de debut" "de combien en combien" "fréquence de fin"</em></p>
<p>Typiquement, pour faire un test assez réaliste (<a href="https://fr.wikipedia.org/wiki/Audiogramme" hreflang="fr" title="Audiogramme">https://fr.wikipedia.org/wiki/Audiogramme</a>)</p>
<pre>
bash audiotest.sh 500 500 8000</pre>
<p>Ensuite, tu lis le texte, oui c'est en anglais, c'est pas un bug.</p>
<p>Si tu as la flemme de lire <del>(ou que tu ne parles pas anglais)</del>, tu vas entendre un premier bruit qui doit te servir à régler le volume de ton casque. L'idéal, c'est que tu entendes le bruit mais que ça te déchire pas les tympans non plus.</p>
<p>Ensuite, la première fréquence est jouée : si tu l'entends de la droite, tu appuies (une seule fois) sur la touche R (R comme dRoite) ; si tu n'entends rien tu appuies sur la touche N (N comme suivaNte ou j'ai pas eNteNdu) ; enfin, si ça venait de la gauche, tu appuies sur L (L comme <del>gauche</del> left).</p>
<p><strong>Surtout ! Ne change pas le volume, si tu n'entends rien, appuie juste sur N.</strong></p>
<p>Le « programme » va changer, en fonction de la position de la lune et de ta réponse, la fréquence, le volume ou ton oreille et prendre des notes, pour toi.</p>
<p>Une fois que tu as fini par répondre à toutes les questions (oui, plus tu es sourd, plus tu en as), un fichier contient tes résultats. En trois clics souris, tu peux faire un audiogramme comme celui qui est au-dessus.</p>
<h3>Attention à un truc !</h3>
<p>Déjà, il faut que tu saches que la valeur -90 dB signifie que tu entends la souris du voisin en train de respirer alors qu'elle est morte, 0 dB QUE TU N'ES MÊME PLUS CAPABLE D'ENTENDRE TA GRAND-MÈRE QUAND ELLE TE PARLE.</p>
<p>Ensuite, si l'audiogramme permet de voir une perte auditive sur certaines fréquences, la valeur sur l'ordonnée (qui est en dB) n'est et ne peut pas être calibrée.</p>
<p>Tu ne peux qu'en tirer comme conclusion, j'entends 3 fois mieux les sons graves (basses fréquences) que les aigus (hautes fréquences).</p>
<h3>Attention à un deuxième truc !</h3>
<p>Pour faire ce test, ça part du principe que ton système d'audition sur ton PC est fiable. Mais comme tu ne peux pas le vérifier toi, dans ton garage, que tu as 0 % de distorsion, tu ne peux qu’espérer. Ça veut dire que le résultat est probablement fiable, mais peut-être pas. </p>
<h3>Prérequis</h3>
<p>Ça devrait être plus haut dans ce billet, mais je ne savais pas où le foutre précisément alors c'est un peu le paragraphe perdu.</p>
<ul>
<li>2 oreilles (ça devrait aussi marcher avec une seule),</li>
<li>1 ordinateur sous Linux,</li>
<li>le programme « sox »,</li>
<li>2 haut-parleurs ou un casque <del>ou un bébé,</del></li>
<li>de la patience.</li>
</ul>
<h2>Et audiogen ?</h2>
<p>C'est pareil que audiotest à part que... devine, ça fait des fichiers wav. Tu es content ?</p>
<h2>Position future</h2>
<p><del>De préférence allongé, mais assis dans un bureau, si tu me payes correctement, ça ira aussi.</del></p>
<p>Faudrait le (re)coder en python, ça serait quand même plus sympa. Mais d'un côté ça ne servira jamais à rien (je suis déjà surpris que tu aies lu jusqu'ici) alors si tu as du temps à perdre fais-le, c'est libre !</p>
<p>Tu peux aussi regarder comment le code est écrit, comme c'est fait à la rache y a pas de commentaire, par contre, y a du vrai code bash qui roxe (tableau, random, etc) :-)</p>
<h2>Voilà</h2>
<p>Amuse-toi bien, et n'oublie d'aller faire un vrai test, si tu n'as pas entendu ce billet.</p>Le RAID logiciel et booturn:md5:295d03e5a4d23e49e1ece823c02a941f2013-05-03T20:19:00+02:002017-07-21T20:54:16+02:00APLUsysadmingrublinuxmdadmraidsystème <p>Si le RAID pour vous ne signifie rien, retenez juste ceci :</p>
<blockquote>
<p>En informatique, le mot RAID désigne les techniques permettant de répartir des données sur plusieurs disques durs afin d'améliorer soit la tolérance aux pannes, soit la sécurité, soit les performances de l'ensemble, ou une répartition de tout cela.</p>
</blockquote>
<p>Sur une machine, j'ai mis en place, il y a quelque temps (2011), un RAID logiciel géré par Linux.</p>
<p>Les partitions sont réparties comme suit :</p>
<ul>
<li>/ (système) 30Go RAID 1 (2*30Go) ;</li>
<li>/Donnees 1To RAID 5 (5*250Go).</li>
</ul>
<p>Partant de ce principe, la machine disposant de 5 disques durs, la perte de n'importe quel disque dur ne doit pas empêcher le démarrage et permettre l'accès aux données.</p>
<p>Ça, c'est la théorie.</p>
<p>On peut parfaitement s'arrêter à la théorie, après tout le RAID logiciel sous Linux est stable et fonctionnel, on peut même s'amuser avec mdadm à déclarer un disque comme défectueux pour voir qu'on peut toujours accéder à ses données et qu'en « changeant » le disque, le RAID se répare pour retrouver son niveau de garantie initial.</p>
<p>La pratique maintenant.</p>
<p>Il est pas mal de faire l'exercice pratique avant d'avoir :</p>
<ol>
<li>Trop de données « critique » sur le RAID ;</li>
<li>Un disque réellement défectueux.</li>
</ol>
<p>Le plus simple pour vérifier la théorie, c'est de débrancher un disque dur, étant donné que je n'ai pas envie de perdre un disque, je fais cette manipulation lorsque la machine est coupée.<br />
Bien sûr, on peut attendre d'avoir un disque dur en panne pour de vrai lorsqu'on a 1 To de données « critiques », non sauvegardées (ben oui, il y a le RAID)...</p>
<p>Débranchons donc un disque, au hasard, rallumons et... surprise, le PC ne peut plus démarrer.</p>
<p>Pas de message d'erreur, rien, juste un PC qui redémarre lorsqu'il essaye de passer charger le système (le bootloader - GRUB - pour être précis).</p>
<p>La première raison, évidente, c'est que le <em>bootloader</em> n'est pas présent sur les autres disques, du coup on l'a dans l'OS.<br />
Bien essayé, mais non, la raison est plus vicieuse.</p>
<p>Le système est sur une partition RAID 1, donc les données sont exactement les mêmes sur les partitions des disques (contrairement au RAID 5), seulement le <em>bootloader</em> a besoin d'aller chercher des fichiers pour pouvoir ensuite lancer le système.<br />
Ces fichiers sont situés dans la partition système, seulement le <em>bootloader</em> n'a pas connaissance du RAID, il a donc mémorisé d'aller chercher les fichiers dont il a besoin sur le disque dur 1 à tel endroit.</p>
<p>Sauf que, le disque dur 1 est débranché et n'existe donc plus.</p>
<p>La solution, c'est d'avoir une petite partition <em>/boot</em> hors du RAID, qu'on sauvegardera sur les différents disques, de manière à installer le <em>bootloader</em> pour qu'il aille chercher les fichiers dans la partition <em>/boot</em> du disque actuellement branché.</p>
<p>Une autre solution quand on ne veut pas retoucher à toutes ses partitions, c'est de configurer la machine pour effectuer un démarrage par le réseau et d'envoyer les 2 fichiers permettant à Linux de démarrer via le réseau.<br />
Cette méthode signifie qu'il ne faut pas utiliser la BiduleBox de votre fournisseur d'accès à Internet comme serveur DHCP (protocole qui permet aux machines d'obtenir une adresse IP automatiquement) mais disposer d'une propre machine qui fera office de serveur DHCP.</p>
<p>Il est aussi possible d'installer le <em>bootloader</em> sur une clef USB et de l'utiliser pour démarrer, les solutions ne manquent pas mais, il est plus utile de savoir comment faire lorsqu'il y aura un problème, tant quand tout fonctionne, que de faire des manipulations quand on a vraiment perdu un disque dur.</p>