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)
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)
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 $@ $< |
''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)
Voir fs10.
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
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).