How to Build a Kernel June 18, 2004 ===================== ============= See the files in the /usr/src/linux-2.4/Documentation/kbuild directory. 00-INDEX - this file: info on the kernel build process bug-list.txt - known bugs in kbuild programs commands.txt - overview of kbuild commands config-language.txt - specification of Config Language (found in Config.in files) eg tristate's legal values are n(=no), m(=module), y(=yes) makefiles.txt - developer information for linux kernel makefiles, eg Makefile's obj-$(CONFIG_...) += ch.o syntax. ================================================================================= There are also interesting stuff in the scripts directory, e.g. patch-kernel, but this turns out to only be to apply all kernel patches to get say from kernel version 2.4.21 to version 2.4.22 by applying patch-2.4.22.gz, then from kernel version 2.4.22 to version 2.4.23 by applying patch-2.4.23.gz, then from kernel version 2.4.23 to version 2.4.24 by applying patch-2.4.24.gz, ... scripts/patch-kernel isn't (apparently) for applying your own kernel mods. ================================================================================= I found http://www.digitalhermit.com/linux/Kernel-Build-HOWTO.html, which first appeared to be a good web page, but it turns out, had some bad suggestions, e.g. "make mrproper" (see below). It turns out the Documentation/kbuild/commands.txt file is a subset of this HOWTO web page, but it was better in that it did NOT have the bad suggestions. On the other hand, it ended with a [to be continued ...] so, I wound up going back to that Kernel-Build-HOWTO.html web page for the rest of what needed to get done. ================================================================================= One reasonable way to handle different kernels, is to make copies of your virgin kernel source, into a sister directory, e.g. cd /usr/src cp -pR linux-2.4.21-15.EL linux-2.4.21-15.EL.Jukebox cd /usr/src/linux-2.4.21-15.EL.Jukebox and start making your changes there. I assume below, that this has been done. ================================================================================= Patch Files: ------------ * Quietly ignore leading & trailing junk, so go ahead an pepper your patch files with comments & instructions. The idea is you can take a news posting that's scattered with junk, and feed it to patch error-free. * Key lines start with --- and +++ and @@. For example, *** To apply this patch, cd into your source directory, *** eg, cd /usr/src/linux-2.4.21-15.EL.Jukebox *** and patch -bp1 < scsi-changer.2.4.21-15.EL.patch *** *** Add 1 line to drivers/scsi/Makefile *** --- linux-2.4/drivers/scsi/Makefile Wed Dec 31 16:00:00 1969 +++ Jukebox/drivers/scsi/Makefile Thu Apr 25 10:38:29 2002 @@ -147,6 +147,7 @@ obj-$(CONFIG_BLK_DEV_SD) += sd_mod.o obj-$(CONFIG_BLK_DEV_SR) += sr_mod.o obj-$(CONFIG_CHR_DEV_SG) += sg.o +obj-$(CONFIG_CHR_DEV_SCH) += ch.o list-multi := scsi_mod.o sd_mod.o sr_mod.o initio.o a100u2w.o cpqfc.o \ zalon7xx_mod.o libata.o * Patch files can be generated by diff-ing what you want, against the original, with the -u option. EG diff -u Makefile Makefile.orig * Patch likes having at least 2 (preferably 3) lines of "context" prior and after the changed lines. Thus the example above, shows 3 lines before and after the new line. * The @@ line says where in the file to check for context. The -147,6 says to take 6 lines starting at line 147, and the +147,7 says to replace them with the following 7 lines. * The lines following the @@, are interpreted based on the first character: * A " " (space) says this line is a "in context" line (thus it's one character indented from the original file). * A "+" says to add this line to the original. * A "-" says to remove this line from the original. * The --- line describes the destination file. * The +++ line describes the original file. * There is interaction between the +++ line, the --- line, and the -p1 option to the patch command. All have to be in synch, else your resulting file won't be in the proper directory, or patch won't find the original file. In my example, the -p1 option to patch says to ignore the first leading directory in the --- and +++ lines. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - My SCSI-Changer patch file updated the following files, * Documentation/Configure.help = Help text during the "make config" step. Documents the CONFIG_CHR_DEV_SCH parm. * Documentation/scsi-changer.txt = The SCSI-Changer README. * drivers/scsi/Config.in = Adds the CONFIG_CHR_DEV_SCH parm to the Config File (see config-language.txt). * drivers/scsi/Makefile = To add ch.o * drivers/scsi/ch.c = Source code for ch.o * include/linux/chio.h = Header file. * include/linux/major.h = Adds Device Major # 86 for SCSI Changers. * include/scsi/scsi.h = Defines 3 SCSI commands for SCSI Changers. ================================================================================= Here are some good hints from the commands.txt file, If you are building a kernel for the first time, here are the commands cd /usr/src/linux-2.4.21-15.EL.Jukebox make config make depend make bzImage Instead of 'make config' for the line-oriented interface, you can run 'make menuconfig' for a curses-based, full-screen text interface, or 'make xconfig' for an X interface using TCL/TK. or 'make oldconfig' to reuse the old values (from where, Rick?) make dep, make depend This command does two things. First, it computes dependency information about which .o files depend on which .h files. It records this information in a top-level file named .hdepend and in one file per source directory named .depend. Second, if you have CONFIG_MODVERSIONS enabled, 'make dep' computes symbol version information for all of the files that export symbols (note that both resident and modular files may export symbols). If you do not enable CONFIG_MODVERSIONS, you only have to run 'make dep' once, right after the first time you configure the kernel. The .hdepend files and the .depend file are independent of your configuration. If you do enable CONFIG_MODVERSIONS, you must run 'make dep' every time you change your configuration, because the module symbol version information depends on the configuration. ================================================================================= We need to update the Makefile, so that the output of a uname -r command, returns something incrementally higher or more descriptive. A uname -r command on my virgin system, returns 2.4.21-15.EL. My untouched /usr/src/linux-2.4/Makefile has VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 21 EXTRAVERSION = -15.ELcustom so the new kernel should already be 2.4.21-15.EL-15.ELcustom. I didn't like that so I changed the EXTRAVERSION line to EXTRAVERSION = -15.EL.Jukebox ================================================================================= WARNING!!! The Kernel-Build-HOWTO.html web page says to next do a make mrproper <- NO. NO. NO. Don't do this command! but this erased hundreds of important files causing many errors later doing the make config and make dep commands. Specific Files Recreated with a ================ ================ 927 files erased -> 340 .stamp files make depend 340 .ver files 229 .depend files make depend 10 .h files include/linux/autoconf.h make *config include/linux/version.h make depend 4 misc files .hdepend make depend drivers/net/hamradio/soundmodem/gentbl scripts/mkdep tmp_include_depends make depend 1 directory erased, include/linux/modules 1 link erased, include/asm -> asm-i386 ------------------------------------------------------------------------------ - This make depend (re)created 228 .depend files, xx - - which one did it miss ?? - - 340 .stamp files, xx - - 4 miscellaneous files, .hdepend xx - - include/linux/modversions.h - - include/linux/version.h xx - - and tmp_include_depends xx - ------------------------------------------------------------------------------ In the README, it says this "make mrproper" will "make sure you have no stale .o files and dependencies lying around", and it does indeed erase all .o files, but in addition to the above, it would have also erased these files, if they existed, .config <-- Gets recreated during a make *config config.in config.old vmlinux System.map all .a and .s files (except those having lxdialog in their names) Fortunately, I made a tar file before doing this command and was able to easily reverted to my prior state to start over. cd /usr/src rm -rf linux-2.4.21-15.EL.Jukebox tar xf pre-make-kernel-source.tar cd linux-2.4.21-15.EL.Jukebox ================================================================================= The next step is to do a make config. They say the output of the config program will be .config files, so to find what's changed, I cd /usr/src/linux-2.4.21-15.EL.Jukebox touch raj.pre.config beforehand, so that I can do a find . -type f -newer raj.pre.config -ls to find what's changed. make menuconfig recreated that asm -> asm-i386 link, but immediately got errors with ... make -C scripts/lxdialog all make[1]: Entering directory `/usr/src/linux-2.4.21-15.EL/scripts/lxdialog' gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DLOCALE -DCURSES_LOC="" -c -o checklist.o checklist.c In file included from checklist.c:24: dialog.h:29:20: curses.h: No such file or directory In file included from checklist.c:24: dialog.h:127: syntax error before "use_colors" ... checklist.c:32: syntax error before '*' token checklist.c:34: warning: function declaration isn't a prototype checklist.c: In function `print_item': checklist.c:38: warning: implicit declaration of function `wattrset' ... /usr/include/bits/string2.h: At top level: dialog.h:130: warning: array `attributes' assumed to have one element make[1]: *** [checklist.o] Error 1 make[1]: Leaving directory `/usr/src/linux-2.4.21-15.EL.Jukebox/scripts/lxdialog' make: *** [menuconfig] Error 2 and just died there. This was due to the fact that I didn't have the ncurses-devel package installed beforehand as is described in that commands.txt file. So I ************************************************************************* * cd /afs/d/software/base/linux/Redhat.Enterprise.Linux-3/RedHat/RPMS * * rpm -Uvh ncurses-devel-5.3-9.3.i386.rpm * * cd - * ************************************************************************* and now make menuconfig works fine, creating files in the scripts/lxdialog directory (8 .o files and scripts/lxdialog/lxdialog) even if you don't save your stuff at the end. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Instead of make menuconfig, make oldconfig also works just fine, stopping at the new config parm, ... SCSI media changer support (CONFIG_CHR_DEV_SCH) [N/m/?] (NEW) Allowing you to answer. Answering "?" got me the help text, CONFIG_CHR_DEV_SCH: This is a driver for SCSI media changers. Most common devices are tape libraries and MOD/CDROM jukeboxes. *Real* jukeboxes, you don't need this for those tiny 6-slot cdrom changers. Media changers are listed as "Type: Medium Changer" in /proc/scsi/scsi. If you have such hardware and want to use it with linux, say Y here. Check Documentation/scsi-changer.txt for details. If you want to compile this as a module ( = code which can be inserted in and removed from the running kernel whenever you want), say M here and read Documentation/modules.txt and Documentation/scsi.txt. The module will be called ch.o. If unsure, say N. Answering "y" gives you this little tutorial, This answer is not allowed, because it is not consistent with your other choices. This driver depends on another one which you chose to compile as a module. This means that you can either compile this one as a module as well (with M) or leave it out altogether (N). which is what the /usr/src/linux-2.4/Documentation/kbuild/config-language.txt file described. Evidently, $CONFIG_SCSI must be "m", not "y". I finally answered "m". Thousands of lines later, I got ... *** End of Linux kernel configuration. *** Check the top-level Makefile for additional configuration. *** Next, you must run 'make dep'. So, what changed? find . -newer raj.pre.config -ls Found 2 files, .config & include/linux/autoconf.h ================================================================================= The next step is a make dep This gives thousands of lines that look like errors, but really are not. This (re)created 228 .depend files, 340 .stamp files, 4 miscellaneous files, .hdepend include/linux/modversions.h include/linux/version.h and tmp_include_depends (leftover junk??) ================================================================================= Now for the make bzImage The docs say this "will leave your new kernel image in arch/i386/boot/bzImage." This only took 7 minutes to run and also produced voluminous output, but no fatal errors. There were at least some warnings. Here's one for example, that I captured ... gcc -D__KERNEL__ -I/usr/src/linux-2.4.21-15.EL.Jukebox/include -Wall \ -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common \ -Wno-unused -fomit-frame-pointer -pipe -freorder-blocks \ -mpreferred-stack-boundary=2 -march=i686 -nostdinc -iwithprefix include \ -DKBUILD_BASENAME=rmap -c -o rmap.o rmap.c In file included from /usr/src/linux-2.4.21-15.EL.Jukebox/include/asm/rmap.h:5, from rmap.c:31: /usr/src/linux-2.4.21-15.EL.Jukebox/include/asm-generic/rmap.h: In function `ptep_to_paddr': /usr/src/linux-2.4.21-15.EL.Jukebox/include/asm-generic/rmap.h:92: warning: cast from pointer to integer of different size ... At the end of it all, were these lines objcopy -O binary -R .note -R .comment -S compressed/bvmlinux \ compressed/bvmlinux.out tools/build -b bbootsect bsetup compressed/bvmlinux.out CURRENT > bzImage Root device is (8, 2) Boot sector 512 bytes. Setup is 4932 bytes. System is 1202 kB warning: kernel is too big for standalone boot from floppy make[1]: Leaving directory `/usr/src/linux-2.4.21-15.EL.Jukebox/arch/i386/boot' My find . -type f -newer raj.pre.config command now finds 4,460 changed files. 3490 .h files 482 .o files 469 .flags files 19 miscellaneous files, arch/i386/boot/compressed/bvmlinux Binary executable. arch/i386/boot/compressed/bvmlinux.out Binary executable? arch/i386/boot/tools/build Binary executable. arch/i386/boot/bbootsect.s Assembler source code. arch/i386/boot/bbootsect x86 boot sector (whatever that is). arch/i386/boot/bsetup.s ASCII, but not interesting. arch/i386/boot/bsetup Binary executable? >> arch/i386/boot/bzImage !!! My new kernel !!! arch/i386/lib/lib.a Archive file. An "ar t arch/i386/lib/lib.a" command shows it contains 7 .o files. arch/i386/vmlinux.lds More Assembler source code. drivers/char/conmakehash Binary executable. drivers/char/consolemap_deftbl.c C source code generated by conmakehash. drivers/pci/gen-devlist Binary executable. include/config/MARKER Empty file. lib/lib.a Archive file. An "ar t lib/lib.a" command shows it contains 14 .o files. scripts/split-include Binary executable. vmlinux Intermediate file, per commands.txt. .version 2-byte file, 1 System.map 19,383-line module load map. ================================================================================= What the "make bxImage" did NOT do, was to create the modules, e.g. my ch.o that will be needed. The Documentation/kbuild/commands.txt file ended at this point, so I went back to http://www.digitalhermit.com/linux/Kernel-Build-HOWTO.html. It said I needed to do a make modules but this gets errors, starting with ... Entering directory `/usr/src/linux-2.4.21-15.EL.Jukebox/drivers/addon/aep' gcc -D__KERNEL__ -I/usr/src/linux-2.4.21-15.EL.Jukebox/include -Wall \ -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common \ -Wno-unused -fomit-frame-pointer -pipe -freorder-blocks \ -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS \ -include /usr/src/linux-2.4.21-15.EL.Jukebox/include/linux/modversions.h \ -nostdinc -iwithprefix include -DKBUILD_BASENAME=paep -c -o paep.o paep.c In file included from paep.c:67: /usr/src/linux-2.4.21-15.EL.Jukebox/include \ /linux/kernel.h:61: invalid suffix on integer constant /usr/src/linux-2.4.21-15.EL.Jukebox/include/linux/kernel.h:61: \ syntax error before numeric constant A google search finds others with this problem. * Suggested sequence is make mrproper cp -p configs/kernel-2.4.21-i686-smp.config .config make menuconfig make dep make bzImage make modules make modules_install make install (to install the kernel) ================================================================================= Starting all over, again. cd /usr/src mv linux-2.4.21-15.EL.Jukebox linux-2.4.21-15.EL.Jukebox.botched cp -pR linux-2.4.21-15.EL linux-2.4.21-15.EL.Jukebox cd linux-2.4.21-15.EL.Jukebox cp -p /u/jasper/aixnotes/linux/scsi-changer.2.4.21-15.EL.patch . patch -bp1 < scsi-changer.2.4.21-15.EL.patch Here I go. make mrproper cp -p configs/kernel-2.4.21-i386.config .config make menuconfig Navigate to SCSI support ---> (Warning. Depending on your screen's colors, the first letter of SCSI may be hard to see) This screen had my new option here, >----------------------------------\ SCSI support | --- SCSI support type (disk, tape, CD-ROM) | SCSI disk support | (256) Maximum number of SCSI disks that can be loaded as modules | SCSI tape support | SCSI OnStream SC-x0 tape support | SCSI CD-ROM support | [*] Enable vendor-specific extensions (for SCSI CDROM) | (4) Maximum number of CDROM devices that can be loaded as modules | < > SCSI media changer support (NEW) <---------------------------/ SCSI generic support --- Some SCSI devices (e.g. CD jukebox) support multiple LUNs [ ] Enable extra checks in new queueing code [ ] Probe all LUNs on each SCSI device [*] Verbose SCSI error reporting (kernel size +=12K) [*] SCSI logging facility SCSI low-level drivers ---> PCMCIA SCSI adapter support ---> I navigated to this "SCSI media changer support (NEW)" line and pressed "m", selected "< Exit >" twice by pressing the left arrow key, then , then answered "< Yes >" to "Do you wish to save your new kernel configuration?" So far, so good. make depend make bzImage Generated lots of output, as before. Finally died with make[2]: Entering directory ... arch/i386/math-emu' gcc -D__KERNEL__ -I/usr/src/linux-2.4.21-15.EL.Jukebox/include -Wall \ -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common \ -Wno-unused -fomit-frame-pointer -pipe -freorder-blocks \ -mpreferred-stack-boundary=2 -march=i386 -nostdinc -iwithprefix include \ -DKBUILD_BASENAME=fpu_entry -c -o fpu_entry.o fpu_entry.c fpu_entry.c: In function `math_emulate': fpu_entry.c:194: structure has no member named `ldt' make[2]: *** [fpu_entry.o] Error 1 make[2]: Leaving directory `/usr/src/linux-2.4.21-15.EL.Jukebox/arch/i386/math-emu' make[1]: *** [first_rule] Error 2 make[1]: Leaving directory `/usr/src/linux-2.4.21-15.EL.Jukebox/arch/i386/math-emu' make: *** [_dir_arch/i386/math-emu] Error 2 My last botched .config file had # CONFIG_MATH_EMULATION is not set This one has CONFIG_MATH_EMULATION=y Another google search says I should have used the 686 stuff, not the 386 stuff. Probably configs/kernel-2.4.21-i686-smp.config is best. ================================================================================= Starting all over, again. cd /usr/src rm -rf linux-2.4.21-15.EL.Jukebox cp -pR linux-2.4.21-15.EL linux-2.4.21-15.EL.Jukebox cd linux-2.4.21-15.EL.Jukebox vi Makefile and change the EXTRAVERSION line from -15.ELcustom, to -15.EL.Jukebox. cp -p /u/jasper/aixnotes/linux/scsi-changer.2.4.21-15.EL.patch . patch -bp1 < scsi-changer.2.4.21-15.EL.patch make mrproper <--- Should this be after the make *config, Rick? cp -p configs/kernel-2.4.21-i686-smp.config .config I like make oldconfig better than make menuconfig. Simply answer "m" at the SCSI media changer support (CONFIG_CHR_DEV_SCH) [N/m/?] (NEW) prompt. ************************************************************************ * B A C K G R O U N D * * * * Both "make oldconfig" & "make menuconfig" use arch/i386/config.in * * as their main config file, which is as ASCII file written with * * the Configuration Language syntax described in that * * Documentation/kbuild/config-language.txt file mentioned above. * * * * Looking at the Makefile, "make oldconfig" calls scripts/Configure * * with "-d arch/$(ARCH)/config.in" ($ARCH being equal to i386), * * which forces the scripts/Configure command to use all the * * default values (ie, the last values in all the define_bool or * * tristate lines in all the config files, e.g. arch/i386/config.in * * or drivers/scsi/Config.in). (BTW, all the define_tristat, * * define_bool, etc functions are defined in scripts/Configure) * * * * A note on architecture confusion: * * Most Intel boxes are 32-bit machines (the 64-bit machines are * * x86_64). When compiling or building the kernel, the high-level * * Makefile translates the machine hardware name as reported by * * uname -m, which is i686, into i386. This is $ARCH. * * * * In the arch directory, you'll find i386 (which is where we get * * our arch/i386/config.in file from), as well as other directories * * we don't care about, e.g. x86_64. * * * * In the configs directory, you'll find 7 different config files * * representing 3 different 32-bin x86 architectures (x=3, 5, or 6). * * kernel-2.4.21-i386.config * * kernel-2.4.21-i386-BOOT.config * * * * kernel-2.4.21-i586.config * * kernel-2.4.21-i586-smp.config * * * * kernel-2.4.21-i686.config * * kernel-2.4.21-i686-hugemem.config * * kernel-2.4.21-i686-smp.config * * See my architectures file, but the bottom line is, we use i686, * * specifically, we use configs/kernel-2.4.21-i686-smp.config. * * * ************************************************************************ make depend make bzImage Again, this generated lots of output. make modules This took 44 minutes, generated lots of output, but finished without fatal errors. make modules_install This installs the kernel's modules in the /lib/modules/2.4.21-15.EL.Jukebox directory, right alongside the /lib/modules/2.4.21-15.EL directory. The problem is, this new directory has 535 .o files not in the old directory, and is missing 3 .o files that are in the old directory. The 3 missing .o files are powernow-k6.o -> Documentation/Configure.help says this adds the CPUFreq driver for mobile AMD K6-2+ and mobile AMD K6-3+ processors. ... For details, see linux/Documentation/cpufreq. If in doubt, say N. speedstep.o -> Documentation/Configure.help says there's a Configure parm named CONFIG_X86_SPEEDSTEP that "adds the CPUFreq driver for certain mobile Intel Pentium III (Coppermine), all mobile Intel Pentium III-M (Tulatin) and all mobile Intel Pentium 4 P4-Ms. ... For details, see linux/Documentation/cpufreq. If in doubt, say N. Documentation/cpufreq has a nice explaination. and ewrk3.o -> Documentation/networking/ewrk3.txt & drivers/net/ewrk3.c say this is "A DIGITAL EtherWORKS 3 ethernet driver" to support 3 DEC networking cards. See the answer below. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - What's the difference between the 3 i686 config files? configs/kernel-2.4.21-i686.config configs/kernel-2.4.21-i686-smp.config and configs/kernel-2.4.21-i686-hugemem.config Configuration Option Plain smp hugemem .config /boot/config-2.4.21-15.0.2.ELsmp ========================= ======= ======= ======= ======= ================================ CONFIG_SMP Not set y y y y ok CONFIG_CPU_FREQ m Not set Not set Not set Not set CONFIG_HOTPLUG_PCI Not set y y y y CONFIG_HOTPLUG_PCI_IBM Not set m m m m CONFIG_HOTPLUG_PCI_COMPAQ ------- m m m Not set CONFIG_EWRK3 m Not set Not set Not set Not set ok CONFIG_PROFILING Not set y y y y CONFIG_OPROFILE Not set m m m m CONFIG_M686 y y Not set y y CONFIG_MPENTIUMIII Not set Not set y Not set Not set CONFIG_X86_PGE Not set y Not set y y CONFIG_HIGHMEM4G y Not set Not set Not set Not set CONFIG_HIGHMEM64G Not set y y y y CONFIG_NR_SIBLINGS_0 y Not set Not set Not set Not set CONFIG_NR_SIBLINGS_2 Not set y y y y CONFIG_X86_4G Not set Not set y Not set Not set CONFIG_X86_NUMA Not set y y y y CONFIG_X86_NUMAQ ------- Not set Not set Not set Not set CONFIG_HZ ------- 512 ------- ------- 512 CONFIG_X86_POWERNOW_K6 m m m ------- m ok CONFIG_X86_SPEEDSTEP m m m ------- m ok CONFIG_X86_SUMMIT ------- y y y y Do I have to do another make module? Maybe something didn't get built? make module > /tmp/make.module.out.3 produced 167 "Entering directory " lines 167 "^make " lines 113 "Nothing to be done for " lines 167 "Leaving directory " lines 71 "^ld -m elf_i386 " lines 14 "^gcc " lines <----------- So it seems there are still 14 things to do---\ 1 "rm -f oprofile.o" line | === =============================== | 700 Total Lines | | /---------------------------------------------------------------------/ | Compiling This To Create This From Directory .config Variable=Values ================ ================== =========================== ======================= cmpci.c cmpci_564.o drivers/addon/cmpci_564 CONFIG_SOUND_CMPCI=m ips.c ips_61052.o drivers/addon/ips_61052 CONFIG_SCSI_IPS=m megaraid2.c megaraid_2009.o drivers/addon/megaraid_2009 CONFIG_SCSI_MEGARAID2=m qla2100.c qla2100_60600b11.o drivers/addon/qla2200_60600b11 CONFIG_FC_QLA2100=m qla2200.c qla2200_60600b11.o drivers/addon/qla2200_60600b11 CONFIG_FC_QLA2200=m qla2300.c qla2300_60600b11.o drivers/addon/qla2200_60600b11 CONFIG_FC_QLA2300=m wvlan_cs.c tmp_wvlan.o ... oprof.c oprof.o cpu_buffer.c cpu_buffer.o buffer_sync.c buffer_sync.o event_buffer.c event_buffer.o oprofile_files.c oprofile_files.o oprofilefs.c oprofilefs.o oprofile_stats.c oprofile_stats.o - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Another post suggested running "make oldconfig" beforehand, as it gets these settings right. Plain smp hugemem .config ======= ======= ======= ======= CONFIG_USB_HID m m m m CONFIG_USB_HIDDEV m m m y CONFIG_USB_HIDINPUT m m m y Then why does my .config file have "y" instead of "m"? Both CONFIG_USB_HIDDEV & CONFIG_USB_HIDINPUT are defined in drivers/usb/Config.in with dep_mbool, e.g. dep_mbool '... description ...' CONFIG_USB_HIDDEV $CONFIG_USB_HID and Documentation/kbuild/config-language.txt says if any of the dependencies (just $CONFIG_USB_HID in this case) are "n", make "n", else prompt. Seems like CONFIG_USB_HIDDEV & CONFIG_USB_HIDINPUT should wind up as "m", not "y", but it's a good thing they ARE "y". From my reading of drivers/usb/Makefile, both variables use "ifeq ($(CONFIG_USB_HIDDEV),y) ...". obj-$(CONFIG_USB_HID) += hid.o (that would be obj-m) CONFIG_USB_HIDDEV -> hiddev.o CONFIG_USB_HIDINPUT -> hid-input.o But OTOH, neither my new or old /lib/modules directory has anything hid*.o but hid.o (ie, no hiddev.o or hid-input.o). I don't understand why not. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I wonder if I'd have any luck with this configuration option? Kernel .config file saved in kernel image CONFIG_IKCONFIG This option enables the complete Linux kernel ".config" file contents to be saved in the kernel (zipped) image file. It provides documentation of which kernel options are used in a running kernel or in an on-disk kernel. It can be extracted from the kernel image file with a script and used as input to rebuild the current kernel or to build another kernel. Since the kernel image is zipped, using this option adds approximately 8 KB to a kernel image file. This option is not available as a module. If you want a separate file to save the kernel's .config contents, use 'installkernel' or 'cp' or a similar tool, or just save it in '/lib/modules/'. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Regarding those 3 "missing" modules (powernow-k6.o, speedstep.o, & ewrk3.o), those 3 modules are all in the /lib/modules/2.4.21-15.EL, which is for the uniprocessor kernel. I should be running the smp kernel since vinu has two processors, but only the kernel-2.4.21-15.0.2.EL package is installed. What happened to my smp kernel, kernel-smp-2.4.21-15.0.2.EL?? It was installed originally (per ~root/install.log) I think it got erased when I applied service, but I'm not sure. I got the latest smp kernel from RedHat, put it in /afs/d/software/fixes/linux/kernel-smp-2.4.21-15.0.2.EL.i686.rpm, applied it, adjusted /boot/grub/grub.conf, and rebooted. Ah, good. Now cat /proc/cpuinfo shows two processors. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - I also downloaded & installed the latest source, via rpm -Uvh /afs/d/software/fixes/linux/kernel-source-2.4.21-15.0.2.EL.i386.rpm so I'm ready to start all over once again on Monday. cd /usr/src cp -pR linux-2.4.21-15.0.2.EL linux-2.4.21-15.0.2.EL.Jukebox cd linux-2.4.21-15.0.2.EL.Jukebox vi Makefile and change the EXTRAVERSION line from "-15.0.2.ELcustom" to "-15.0.2.EL.Jukebox". cp -p /u/jasper/aixnotes/linux/scsi-changer.2.4.21-15.EL.patch . patch -bp1 < scsi-changer.2.4.21-15.EL.patch make mrproper > /tmp/make.mrproper.out 2>&1 cp -p configs/kernel-2.4.21-i686-smp.config .config make oldconfig > /tmp/make.oldconfig.out 2>&1 m make depend > /tmp/make.depend.out 2>&1 make bzImage > /tmp/make.bzImage.out 2>&1 # Compiled 439 modules in 7 minutes. make modules > /tmp/make.modules.out.1 2>&1 # Compiled 1820 modules in 40 minutes. make modules > /tmp/make.modules.out.2 2>&1 # Compiled 14 modules in 2 minutes. make modules > /tmp/make.modules.out.3 2>&1 # Compiled 14 modules in 2 minutes. make modules_install > /tmp/make.modules.install.out 2>&1 The result is 954 modules in /lib/modules/2.4.21-15.0.2.EL.Jukebox, versus 422 modules in /lib/modules/2.4.21-15.0.2.ELsmp, none missing, and 532 new modules, 495 in kernel/drivers, eg, kernel/drivers/sound/gus.o 23 in kernel/net, eg, kernel/net/rose/rose.o and 14 in kernel/fs, eg, kernel/fs/jfs/jfs.o kernel/drivers/sound/gus.o from drivers/sound/Config.in based on CONFIG_SOUND_GUS=m and CONFIG_SOUND_OSS=m and CONFIG_SOUND=m Documentation/Configure.help says GUS="Gravis Ultrasound Support" and OSS="Open Sound System" I must have used the wrong config file. Looking at other parms, I see that my current kernel has kernel/drivers/sound/ad1848.o (* see below), which relies on CONFIG_SOUND_OSS=m, so it must be that CONFIG_SOUND_GUS parm that was not set. grep 'CONFIG_SOUND_GUS is not set' configs/* shows that it must be one of configs/kernel-2.4.21-ia32e.config <-- Intel Architecture, 32 CPUs(!! not bits) configs/kernel-2.4.21-ia64.config <-- Intel Architecture, 64-bit (Itanium) configs/kernel-2.4.21-ppc64.config <-- Wrong architecture configs/kernel-2.4.21-ppc64iseries.config <-- Wrong architecture configs/kernel-2.4.21-ppc64pseries.config <-- Wrong architecture configs/kernel-2.4.21-s390.config <-- Wrong architecture configs/kernel-2.4.21-s390x.config <-- Wrong architecture configs/kernel-2.4.21-x86_64.config configs/kernel-2.4.21-x86_64-smp.config Both kernel/net/rose/rose.o & kernel/fs/jfs/jfs.o are not based on anything, that is, they should ALWAYS be compiled as a module. So how is it that neither one are in my /lib/modules/2.4.21-15.0.2.ELsmp directory? (*) Why did I pick on ad1848.o? Because "grep GUS drivers/sound/Makefile" showed obj-$(CONFIG_SOUND_GUS) += gus.o ad1848.o so I thought that the only way ad1848.o could be there, was if CONFIG_SOUND_GUS was "m". Not so, because "grep ad1848.o drivers/sound/Makefile" showed 11 different CONFIG_* options that could be set to force ad1848.o to be added. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - cd /usr/src cp -pR linux-2.4.21-15.0.2.EL linux-2.4.21-15.0.2.EL.Jukebox cd linux-2.4.21-15.0.2.EL.Jukebox vi Makefile and change the EXTRAVERSION line from "-15.0.2.ELcustom" to "-15.0.2.EL.Jukebox". cp -p /u/jasper/aixnotes/linux/scsi-changer.2.4.21-15.EL.patch . patch -bp1 < scsi-changer.2.4.21-15.EL.patch make mrproper > /tmp/make.mrproper.out 2>&1 cp -p configs/kernel-2.4.21-ia32e.config .config make oldconfig > /tmp/make.oldconfig.out 2>&1 Hmmmm. Interesting. With this configuration file, a lot of questions were not answered. I had to do a lot of detective work to answer these xx questions. 1) CONFIG_M386; * * Processor type and features * Processor family (386, 486, 586/K5/5x86/6x86/6x86MX, Pentium-Classic, Pentium-MMX, Pentium-Pro/Celeron/Pentium-II, Pentium-III/Celeron(Coppermine), Pentium-4, K6/K6-II/K6-III, Athlon/Duron/K7, Opteron/Athlon64/Hammer/K8, Elan, Crusoe, Winchip-C6, Winchip-2, Winchip-2A/Winchip-3, CyrixIII/VIA-C3, VIA-C3-2) [Pentium-Pro] (NEW) CONFIG_M386: This is the processor type of your CPU. This information is used for optimizing purposes. In order to compile a kernel that can run on all x86 CPU types (albeit not optimally fast), you can specify "386" here. The kernel will not necessarily run on earlier architectures than the one you have chosen, e.g. a Pentium optimized kernel will run on a PPro, but not necessarily on a i486. Here are the settings recommended for greatest speed: - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI 486DLC/DLC2, UMC 486SX-S and NexGen Nx586. Only "386" kernels will run on a 386 class machine. - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S. - "586" for generic Pentium CPUs, possibly lacking the TSC (time stamp counter) register. - "Pentium-Classic" for the Intel Pentium. - "Pentium-MMX" for the Intel Pentium MMX. - "Pentium-Pro" for the Intel Pentium Pro/Celeron/Pentium II. - "Pentium-III" for the Intel Pentium III and Celerons based on the Coppermine core. - "Pentium-4" for the Intel Pentium 4. - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D). - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird). - "Elan" for the AMD Elan family (Elan SC400/SC410). - "Crusoe" for the Transmeta Crusoe series. - "Winchip-C6" for original IDT Winchip. - "Winchip-2" for IDT Winchip 2. - "Winchip-2A" for IDT Winchips with 3dNow! capabilities. - "CyrixIII" for VIA Cyrix III or VIA C3. - "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above). If you don't know what to do, choose "386". Processor family (386, 486, 586/K5/5x86/6x86/6x86MX, Pentium-Classic, Pentium-MMX, Pentium-Pro/Celeron/Pentium-II, Pentium-III/Celeron(Coppermine), Pentium-4, K6/K6-II/K6-III, Athlon/Duron/K7, Opteron/Athlon64/Hammer/K8, Elan, Crusoe, Winchip-C6, Winchip-2, Winchip-2A/Winchip-3, CyrixIII/VIA-C3, VIA-C3-2) [Pentium-Pro] (NEW) I answered "Pentium-III" since my "cat /proc/cpuinfo" said "Pentium III (Coppermine)". 2) CONFIG_X86_MCE; Machine Check Exception support allows the processor to notify the kernel if it detects a problem (e.g. overheating, component failure). The action the kernel takes depends on the severity of the problem, ranging from a warning message on the console, to halting the machine. You can safely select this on machines that do not support this feature. For pentium machines the mce support defaults to off as the mainboard support is not always present. You must activate it as a boot option. Machine Check Exception (CONFIG_X86_MCE) [N/y/?] (NEW) I answered "y". The only place this is used is in arch/i386/kernel/bluesmoke.c file, where it ifdef's CONFIG_X86_MCE, but I'm not positive about this answer. 3) CONFIG_I8K: Dell laptop support (CONFIG_I8K) [N/y/m/?] (NEW) I answered "n". 4) CONFIG_E820_PROC: E820 proc support (CONFIG_E820_PROC) [N/y/?] (NEW)". I answered "n" since according to arch/i386/kernel/Makefile, this parm creates the e820.o & rpmhelper.o modules and I don't see these in /lib/modules/2.4.21-15.0.2.ELsmp. (I find it interesting that CONFIG_E820_PROC wasn't mentioned in Documentation/Configure.help at all ... It is in Documentation/i810_rng.txt & Documentation/kernel-parameters.txt, though.) Bzzzzz!! Wrongo, Rick. There is no "m" option. These two pieces reside in the kernel, so you can't tell if this is needed or not. That combined with the fact it's not documented in Documentation/Configure.help, says I've got to do more digging. ... Decided to keep it "n" as "CONFIG_E820_PROC is not set" in all just about all config/* files (configs/kernel-2.4.21-i386-BOOT.config being the only exception). E820 refers to an O.S. interface to the BIOS. See ACPI (Advanced Configuration and Power Interface) Specification at http://www.acpi.info/DOWNLOADS/ACPIspec-2-0B.pdf. It sounds like we should have this. See also arch/i386/boot/setup.S, which has these comments # Try three different memory detection schemes. First, try # e820h, which lets us assemble a memory map, then try e801h, # which returns a 32-bit memory size, and finally 88h, which # returns 0-64m # method E820H: # the memory map from hell. e820h returns memory classified into # a whole bunch of different types, and allows memory holes and # everything. We scan through this memory map and build a list # of the first 32 memory areas, which we return at [E820MAP]. # This is documented at http://www.teleport.com/~acpi/acpihtml/topic245.htm (No, it's not. This URL no longer exists. Try www.acpi.info) and arch/i386/kernel/e820.c, which Just found /boot/System.map-2.4.21-15.0.2.ELsmp, which has e820 thingies in it. c03ef5c0 t sanitize_e820_map c03ef970 t copy_e820_map c0452420 B e820 The first place /boot/System.map-2.4.21-15.0.2.ELsmp differs from my System.map generated with the configs/kernel-2.4.21-i686-smp.config .config file, is in the mm/filemap.c module where it has new code, a new __wtdgeneric_file_read_iodesc subroutine in line 4070. Evidently, the unmodified 2.4.21-15.0.2.ELsmp kernel I'm running right now on vinu, does not match the source code. Apparently, the mm/filemap.c module was not recompiled. And yes, it's not the case that this new code is conditionalized out with some kind of CONFIG_ parm. I checked. 5) CONFIG_EDD: BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL) (CONFIG_EDD) [N/y/m/?] (NEW)" Again, according to arch/i386/kernel/Makefile, this parm creates the edd.o module, but this time, edd.o DID exist in the /lib/modules/2.4.21-15.0.2.ELsmp/kernel/arch/i386/kernel directory, so I answered "m". (This time, it's interesting that CONFIG_EDD WAS in Documentation/Configure.help, but it wasn't shown. Why not? It had x86 BIOS Enhanced Disk Drive support CONFIG_EDD Say Y or M here if you want to enable BIOS Enhanced Disk Drive Services real mode BIOS calls to determine which disk BIOS tries boot from. This information is then exported via /proc. This option is experimental, but believed to be safe, and most disk controller BIOS vendors do not yet implement this feature. I think the reason is, the first prompt, you only get very limited help, but if you first enter something invalid or a "?", you get the full help.) 6) CONFIG_HIGHMEM4G & CONFIG_HIGHMEM64G: High Memory Support (off, 4GB, 64GB) [4GB] defined CONFIG_HIGHMEM4G This was pre-answered to CONFIG_HIGHMEM4G. It would have been nice to set this to CONFIG_HIGHMEM64G instead. 7) CONFIG_HIGHIO: HIGHMEM I/O support (CONFIG_HIGHIO) [Y/n/?] Again, pre-answered to "n", but if I change CONFIG_HIGHMEM64G, then I might want to also change this to "y". The Documentation/Configure.help file has this to say, HIGHMEM I/O support CONFIG_HIGHIO If you want to be able to do I/O to high memory pages, say Y. Otherwise low memory pages are used as bounce buffers causing a degrade in performance. 8) CONFIG_X86_4G 4 GB kernel-space and 4 GB user-space virtual memory support (CONFIG_X86_4G) [N/y/?] (NEW) 4 GB kernel-space and 4 GB user-space virtual memory support CONFIG_X86_4G This option is only useful for systems that have more than 1 GB of RAM. The default kernel VM layout leaves 1 GB of virtual memory for kernel-space mappings, and 3 GB of VM for user-space applications. This option ups both the kernel-space VM and the user-space VM to 4 GB. The cost of this option is additional TLB flushes done at system-entry points that transition from user-mode into kernel-mode. I.e. system calls and page faults, and IRQs that interrupt user-mode code. There's also additional overhead to kernel operations that copy memory to/from user-space. The overhead from this is hard to tell and depends on the workload - it can be anything from no visible overhead to 20-30% overhead. A good rule of thumb is to count with a runtime overhead of 20%. The upside is the much increased kernel-space VM, which more than quadruples the maximum amount of RAM supported. Kernels compiled with this option boot on 64GB of RAM and still have more than 3.1 GB of 'lowmem' left. Another bonus is that highmem IO bouncing decreases, if used with drivers that still use bounce-buffers. There's also a 33% increase in user-space VM size - database applications might see a boost from this. But the cost of the TLB flushes and the runtime overhead has to be weighed against the bonuses offered by the larger VM spaces. The dividing line depends on the actual workload - there might be 4 GB systems that benefit from this option. Systems with less than 4 GB of RAM will rarely see a benefit from this option - but it's not out of question, the exact circumstances have to be considered. ******************************************************** * * * Rick, in /usr/src/linux-2.4.21-15.0.2.EL, * * (not your *Jukebox directory) * * see include/linux/autoconf.h (created by * * make *config) * * include/linux/rhconfig.h * * see also /boot/kernel.h * * * * Maybe I'm suppose to * * cp -p the config file, * * make menuconfig * * and just select my one option to turn on, the * * SCSI media changer support (CONFIG_CHR_DEV_SCH) * * * ******************************************************** Answer "m" to the "SCSI media changer support (CONFIG_CHR_DEV_SCH) [N/m/?] (NEW)" prompt. make depend > /tmp/make.depend.out 2>&1 # Took 2 minutes. make bzImage > /tmp/make.bzImage.out 2>&1 # Compiled 439 modules in 6 minutes. make modules > /tmp/make.modules.out 2>&1 # Compiled 1820 modules in 40 minutes. make modules_install > /tmp/make.modules.install.out 2>&1 The result is 954 modules in /lib/modules/2.4.21-15.0.2.EL.Jukebox, versus 422 modules in /lib/modules/2.4.21-15.0.2.ELsmp, none missing, and 532 new modules, 495 in kernel/drivers, eg kernel/drivers/sound/gus.o 23 in kernel/net, eg kernel/net/rose/rose.o and 14 in kernel/fs, eg kernel/fs/jfs/jfs.o ================================================================================= ***> See the /usr/src/linux-2.4.21-15.0.2.EL.Jukebox/README file!!! <*** ================================================================================= When you do a make *config, these files get read, which have these sample lines, File Name (pwd=/usr/src/linux-2.4) Interesting Lines / Notes ================================== ======================================= Makefile /-------------------------include .config | /-------------------include .depend | | /-------------include include arch/$(ARCH)/Makefile | | | /-------include Rules.make | | | | .config <--/ | | | Suppose to be our master config file. | | | make mrproper Erases, make *config creates | | | .depend <--------/ | | Makefile for init/do_mounts.o, init/main.o, | | and init/version.o. | | make mrproper Erases, but what writes this, Rick? | | arch/i386/Makefile <---/ | Our "architecture-specific flags and dependencies"? | Rules.make <-----------------/ Generic make rules (eg, how to compile .c into .o) Most source files "#include ", which is just include/linux/config.h /--------#include | include/linux/autoconf.h <--/ make mrproper Erases, make *config creates /------#include Very first thing. | ... | #define CONFIG_E820_PROC 1 | #define CONFIG_EDD 1 | #else | #undef CONFIG_E820_PROC | #undef CONFIG_EDD | #define CONFIG_EDD_MODULE 1 | ... | #if !defined(__module__i686) ... | #undef CONFIG_HIGHMEM64G | #else | #define CONFIG_HIGHMEM64G 1 | #endif | include/linux/rhconfig.h <----/ 297-line file, starting with <-----------------\ /* Try to be a little smarter about which | kernel are we currently running */ | ... | /* First, get the version string for the | running kernel from /boot/kernel.h - | initscripts should create it for us */ | ... | /--#include "/boot/kernel.h" | | ... | | #if defined(__BOOT_KERNEL_SMP) ... | | #define __module__smp | | #endif /* __BOOT_KERNEL_SMP */ | | | /boot/kernel.h <------------------/ Note absolute path in /boot directory. | /* Kernel type i686-smp */ | #define __MODULE_KERNEL_i686 1 | #define __BOOT_KERNEL_SMP 1 | | | How 'bout | .hdepend 3,984-line file | #include ----------------------/ Erased by ???, written by make *config ./include/linux/version.h .stamp Documentation/kbuild/makefiles.txt Documentation/smart-config.txt Config.in - arch/i386/boot/setup.S - arch/i386/kernel/.depend - include/asm-i386/linux_logo.h init/version.c scripts/Configure scripts/Menuconfig ================================================================================= Ok. Starting all over again with kernel-source-2.4.21-15.0.2.EL.i386.rpm. cd /usr/src rm -rf linux-2.4.21-15.0.2.EL.Jukebox cp -pR linux-2.4.21-15.0.2.EL linux-2.4.21-15.0.2.EL.Jukebox cd linux-2.4.21-15.0.2.EL.Jukebox vi Makefile and change the EXTRAVERSION line from "-15.0.2.ELcustom" to "-15.0.2.EL.Jukebox". cp -p /u/jasper/aixnotes/linux/scsi-changer.2.4.21-15.EL.patch . patch -bp1 < scsi-changer.2.4.21-15.EL.patch # This time, I'm not doing the make mrproper step. cp -p configs/kernel-2.4.21-i686-smp.config .config Instead of the normal "make oldconfig > /tmp/make.oldconfig.out 2>&1", I wanted to trace it, so I know exactly where it gets the old configuration from. strace -f -o /tmp/strace.make.oldconfig make oldconfig produced a 10MB, 185,373-line trace file with almost 5,000 opens in it. Examining it showed me that "make oldconfig" * Runs scripts/Configure, which is just a shell script you can read through. * Reads only 1 file from the /boot directory, /boot/kernel.h. IE, it does NOT read /boot/config-2.4.21-15.0.2.ELsmp like I thought it might. * From /boot/kernel.h, it knows to use configs/kernel-2.4.21-i686-smp.config (see lines 553-555 of scripts/Configure). * Will use either .config if it exists, or configs/kernel-2.4.21-i686-smp.config! This means that I don't need to do the cp -p configs/kernel-2.4.21-i686-smp.config .config before my "make oldconfig". This is what "make oldconfig" will use if the .config file doesn't exist, as long as I'm running with the right kernel. Actually, since the resulting .config file is quite different than the original configs/kernel-2.4.21-i686-smp.config, this must massage the data. Let's see. More stuff to learn from this strace about this scripts/Configure step, * Writes a few preliminary lines in the .config & autoconf.h files. * Sources either the .config or configs/kernel-2.4.21-i686-smp.config file. * Grabs all the "# CONFIG_* is not set" lines, and converts them to CONFIG_*=n, and sources that. For example, # CONFIG_SBUS is not set becomes CONFIG_SBUS=n * Sources arch/i386/config.in. It's this guy that actually finishes writing the .config & autoconf.h files, starting at the "#define CONFIG_X86 1" line. This arch/i386/config.in guy is the meat of this process. * Saves .config to .config.old, if it exists. * Writes two files with temporary names, then moves them. .tmpconfig becomes .config and .tmpconfig.h becomes include/linux/autoconf.h * The resulting .config file has many more "CONFIG_* is not set" lines, and a few instances of "m" changed to "y" (e.g. CONFIG_HAMRADIO), but this is ok since CONFIG_HAMRADIO is a boolean (whose possible values are "y" or "n"), not a tristate variable (whose possible values are "y", "m", or "n"). So yes, it's massaged a bit, but essentially the same. make mrproper make depend > /tmp/make.depend.out 2>&1 # Took about a minute or two Created arch/i386/oprofile/.depend, which didn't exist before, and did not create arch/i386/math-emu/.depend, which did exist before. make bzImage > /tmp/make.bzImage.out 2>&1 # Compiled 439 modules in 7 minutes. make modules > /tmp/make.modules.out.1 2>&1 # Compiled 1820 modules in 40 minutes. make modules_install > /tmp/make.modules.install.out 2>&1 make install > /tmp/make.install.out 2>&1 vi /boot/grub/grub.conf To change the default kernel to 0, my Jukebox one. ================================================================================= To Do still: Turn on CONFIG_IKCONFIG in kernel build. Rick, see your misc file for unsupported modules. You may have/want to address those.