Sommaire

Bash for Windows

Windows a intégré un outil (que je trouve formidable) dans sa mise à jour de l’année dernière: le Windows Subsystem for Linux, ou plus communément appelé Bash for Windows.

Windows Subsystem for Linux est une émulation d’un système Linux complet dans Windows. En résumé, les appels système Linux sont convertis en appels Windows. Plus d’informations sont disponibles ici.

Ce bash for Windows permet donc d’avoir un Linux complet sous la main. Et qui dit Linux complet, dit aussi compilation de programmes et même de kernels.

Problème ou PROBLÈME ?

Dans le cadre de mes études, j’ai eu à cross-compiler un kernel pour un Raspberry Pi. Le début de la compilation a parfaitement fonctionné, jusqu’à ce que je tombe sur l’erreur suivante :

[ . . . ] 
CC [M] net/netfilter/xt_NETMAP.o 
net/netfilter/xt_DSCP.c:20:37: fatal error: linux/netfilter/xt_DSCP.h : Aucun fichier ou dossier de ce type 
#include <linux/netfilter/xt_DSCP.h> ^ 
compilation terminated. 
CC [M] net/netfilter/xt_NFLOG.o 
make[2]: *** [net/netfilter/xt_DSCP.o] Erreur 1 
make[2]: *** Attente des tâches non terminées.... 
CC [M] net/netfilter/xt_NFQUEUE.o 
make[1]: *** [net/netfilter] Erreur 2 
make: *** [net] Erreur 2 
[ . . . ]

Après investigation, j’ai découvert que ce problème vient de la différence d’interprétation des noms de fichiers par les systèmes de fichiers de Windows (NTFS) et de Linux (Ext2-3-4 ou autres). En effet, Windows ne différencie pas les majuscules des minuscules dans les noms de fichiers (il est insensible à la casse), contrairement à Linux. De ce fait, lorsque Windows détecte les fichiers xt_DSCP.h et xt_dscp.h, il les considère comme étant les mêmes, et donc en supprime un des deux. Du coup, lorsque Linux veut y accéder, ce n’est plus possible, d’où l’erreur surlignée précédemment.

On observe ci dessous qu’il existe un fichier xt-DSCP.h et xt_dscp.h. Ces deux fichiers sont utilisés lors de la compilation d’un noyau Linux, et Linux les considère comme différent, contrairement à Windows.

root@DESKTOP-EFKGF65:/usr/src/linux-rpi-4.4.y# locate xt_DSCP.h
/usr/include/linux/netfilter/xt_DSCP.h
/usr/local/bin/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/include/linux/netfilter/xt_DSCP.h
/usr/src/linux-rpi-4.4.y/include/uapi/linux/netfilter/xt_DSCP.h
/usr/src/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/arm-bcm2708-linux-gnueabi/sysroot/usr/include/linux/netfilter/xt_DSCP.h
/usr/src/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/arm-bcm2708hardfp-linux-gnueabi/sysroot/usr/include/linux/netfilter/xt_DSCP.h
/usr/src/tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot/usr/include/linux/netfilter/xt_DSCP.h
/usr/src/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/usr/include/linux/netfilter/xt_DSCP.h
/usr/src/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/include/linux/netfilter/xt_DSCP.h
root@DESKTOP-EFKGF65:/usr/src/linux-rpi-4.4.y# locate xt_dscp.h
/usr/include/linux/netfilter/xt_dscp.h
/usr/local/bin/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/include/linux/netfilter/xt_dscp.h
/usr/src/linux-rpi-4.4.y/include/uapi/linux/netfilter/xt_dscp.h
/usr/src/tools-master/arm-bcm2708/arm-bcm2708-linux-gnueabi/arm-bcm2708-linux-gnueabi/sysroot/usr/include/linux/netfilter/xt_dscp.h
/usr/src/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/arm-bcm2708hardfp-linux-gnueabi/sysroot/usr/include/linux/netfilter/xt_dscp.h
/usr/src/tools-master/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/arm-linux-gnueabihf/sysroot/usr/include/linux/netfilter/xt_dscp.h
/usr/src/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/usr/include/linux/netfilter/xt_dscp.h
/usr/src/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/include/linux/netfilter/xt_dscp.h

Un début de solution ?

J’ai testé plusieurs systèmes de fichiers différents (FAT32, NTFS, ExFAT) et aucun n’est sensible à la casse. La meilleure solution actuelle est de réaliser la compilation sur une machine Linux (virtuelle par exemple), qui fait la différence entre les fichiers en majuscules et en minuscules.

Laisser un commentaire