Compilation et installation de modules externes

Compilation

Modifier le Makefile

La compilation de modules externes pour UML échoue parfois, faisant apparaître des problèmes d'include. Et même lors la compilation réussit, des problèmes peuvent apparaître à l'exécution. Pour éviter ces problèmes, il faut que le Makefile ou le script construisant le module utilise les mêmes paramètres de compilation que ceux utilisés lors de la compilation du noyau UML. Pour connaître ces paramètres, se placer à la racine du noyau UML sur l'hote et faire un make script 'SCRIPT=@echo $(CFLAGS)' ARCH=um ; par exemple :

      [host]# cd UML/Noyaux/linux-2.4.24-wifi/
      [host]# make script 'SCRIPT=@echo $(CFLAGS)' ARCH=um
-D__KERNEL__ -I/home/galtier/UML/Noyaux/linux-2.4.24-wifi/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -U__i386__ -Ui386 -DUM_FASTCALL -g -D__arch_um__ -DSUBARCH="i386" -D_LARGEFILE64_SOURCE -I/home/galtier/UML/Noyaux/linux-2.4.24-wifi/arch/um/include -Derrno=kernel_errno -I/home/galtier/UML/Noyaux/linux-2.4.24-wifi/arch/um/kernel/tt/include -I/home/galtier/UML/Noyaux/linux-2.4.24-wifi/arch/um/kernel/skas/include
      [host]#
      

(source : user mode linux at sourceforge.net)

Exemple de Kernel AODV

Makefile original (synthétique) :

	CC := gcc
	LD := ld -m elf_i386 -r
	MODCFLAGS :=  -O3 -DMODULE -D__KERNEL__ -DLINUX 
	AODV_FLAGS := -DMESSAGES -DAODV_GATEWAY -DAODV_SIGNAL
	
	KVERSION=`uname -r`
	KPATH := /lib/modules/$(KVERSION)/build/include/
	COMPILE := $(CC) $(MODCFLAGS) $(AODV_FLAGS) -I$(KPATH)
	
	TARGET_MODDIR := /lib/modules/$(KVERSION)
	....
      

Makefile modifié :

	CC := gcc
	LD := ld -m elf_i386 -r
	MODCFLAGS :=  -O3 -DMODULE -D__KERNEL__ -DLINUX 
	AODV_FLAGS := -DMESSAGES -DAODV_GATEWAY -DAODV_SIGNAL
	
	KERNELDIR := /home/galtier/UML/Noyaux/linux-2.4.24-wifi
	ARCHDIR=$(KERNELDIR)/arch/um
	TTDIR=$(ARCHDIR)/kernel/tt
	SKASDIR=$(ARCHDIR)/kernel/skas
	CFLAGS= -I$(KERNELDIR)/include -I$(ARCHDIR)/include  -I$(TTDIR)/include -I$(SKASDIR)/include -Wall -Wunused -Wuninitialized -g -O
	COMPILE := $(CC) $(MODCFLAGS) $(AODV_FLAGS) $(CFLAGS)
	
	TARGET_MODDIR := /home/galtier/UML/kaodv_for_uml
	....
      

(source : mailing list kernelnewbies)

Exemple de AODV UU

aodv-uu-0.9.1/Makefile original aodv-uu-0.9.1/Makefile modifié
KERNEL_DIR=/lib/modules/$(KERNEL)/build
	  
KERNEL_DIR=/home/galtier/UML/Noyaux/linux-2.4.24-wifi
	  
CFLAGS=$(OPTS) $(DEBUG) $(DEFS) $(XDEFS) 
	  
CFLAGS=$(OPTS) $(DEBUG) $(DEFS) $(XDEFS) -I$(KERNELDIR)/include -I$(KERNEL_DIR)/arch/um/include  -I$(KERNEL_DIR)/arch/um//kernel/tt/include -I$(KERNEL_DIR)/arch/um/kernel/skas/include
	  
install: default
	install -s -m 755 aodvd /usr/sbin/aodvd
	@if [ ! -d /lib/modules/$(KERNEL)/aodv ]; then \
		mkdir /lib/modules/$(KERNEL)/aodv; \
	fi

	@echo "Installing kernel module in /lib/modules/$(KERNEL)/aodv/";
	@if [ -f ./kaodv.ko ]; then \
		install -m 644 kaodv.ko /lib/modules/$(KERNEL)/aodv/kaodv.ko; \
	else \
		install -m 644 kaodv.o /lib/modules/$(KERNEL)/aodv/kaodv.o; \
	fi
	/sbin/depmod -a
	  
install: default
	install -s -m 755 aodvd /home/galtier/UML/aodv_uu/aodvd
	@if [ ! -d /home/galtier/UML/aodv_uu/modules/$(KERNEL)/aodv ]; then \
		mkdir -p /home/galtier/UML/aodv_uu/modules/$(KERNEL)/aodv; \
	fi

	@echo "Installing kernel module in /home/galtier/UML/aodv_uu/modules/$(KERNEL)/aodv/";
	@if [ -f ./kaodv.ko ]; then \
		install -m 644 kaodv.ko /home/galtier/UML/aodv_uu/modules/$(KERNEL)/aodv/kaodv.ko; \
	else \
		install -m 644 kaodv.o /home/galtier/UML/aodv_uu/modules/$(KERNEL)/aodv/kaodv.o; \
	fi
#	/sbin/depmod -a
	  
uninstall:
	rm -f /usr/sbin/aodvd
	rm -rf /lib/modules/$(KERNEL)/aodv
	  
uninstall:
	rm -f aodvd /home/galtier/UML/aodv_uu/aodvd
	rm -rf /home/galtier/UML/aodv_uu/modules/$(KERNEL)/aodv
	  
aodv-uu-0.9.1/lnx/Makefile original aodv-uu-0.9.1/lnx/Makefile modifié
$(KOBJS): %.o: %.c Makefile
        $(KCC) $(KCFLAGS) -o $@ $<
	  
$(KOBJS): %.o: %.c Makefile
        $(KCC) $(KCFLAGS) -I/home/galtier/UML/Noyaux/linux-2.4.24-wifi/arch/um/include/ -I/home/galtier/UML/Noyaux/linux-2.4.24-wifi/arch/um/kernel/tt/include/ -I/home/galtier/UML/Noyaux/linux-2.4.24-wifi/arch/um/kernel/skas/include/ -c -o $@ $<
	  

Compilation error ''CONFIG_X86_L1_CACHE_SHIFT' undeclared here''

Si cette erreur apparaît lors de la compilation, vérifier que include/asm pointe bien vers include/asm-um et non pas include/asm-i386.

(source : FAQ usermodelinux.org)

Exemple de ASL, route_check et ARAN

Voir fs10.

Installation

Temporaire (en laissant le module sur l'hôte)

Laisser le module sur l'hôte, et depuis l'UML monter le FS de l'hôte et insérer le module.

Exemple :

	mount none /mnt -t hostfs
	insmod /mnt/root/kernel-aodv_v2.2.2/kernel_aodv.o use_dev=wlan0
      

Inséré au FS

Copier le module compilé dans le répertoire /lib/modules/`uname -r` (répertoire à créer, éventuellement) de l'UML. On peut ensuite soit l'insérer directement "normalement" (insmod kernel_aodv use_dev=wlan0), soit relancer depmod dans le répertoire /lib/modules/`uname -r` et puis utiliser modprobe (exemple : modprobe kernel_aodv use_dev=wlan0).

Ensuite, pour conserver ces changements pour les prochaines utilisations, réutiliser le même fichier COW ou le fusionner avec le root FS (utiliser pour cela uml_moo).