2012-05-24

FreeBSD 9.0 Kernel compilation


Recently, some friends tried to compile a FreeBSD kernel but failed to get the source using CVSup and got stuck... so they asked me how do I do it. Personally, I've never been able to get the sources using CVSup and it may be because I'm used to be behind firewalls.

Since June 2008, development of the base system moved to Subversion, so it might be easier for you to use Subversion if you're having problems to get the source.

The FreeBSD Handbook cites "Building a custom kernel is one of the most important rites of passage for advanced BSD users.", I believe everyone who is really into FreeBSD should do it at some point.

I'll be using the Virtual Machine created in my previous post, you might want to use your own computer with FreeBSD already installed and the only difference is that you might already have the required ports installed.

Preliminaries:
  1.  Install Subversion from ports as you need it to get the sources, use default options when asked (this will require some time due to the dependencies needed):
    cd /usr/ports/devel/subversion/
    sudo make install clean
  2.  Log out and log in again to make the new commands available to your user.
Source:
  1. Use subversion to get the source code:
    sudo svn co http://svn.freebsd.org/base/stable/9 /usr/src
  2. Once installed, use the following commands to update your source:
    sudo svn up /usr/src
Compilation:

Let's create a stripped down kernel for VirtualBox, remeber to use capital letters to name it (as it is a tradition :P) and to leave the GENERIC file untouched (as it is not recommended to modify it). If you have a 32 bit Kernel use the directory i386 instead of amd64.
  1. Start with a copy of the GENERIC Kernel naming it VBOX:
    cp /usr/src/sys/amd64/conf/GENERIC /usr/src/sys/amd64/conf/VBOX
  2.  In the new VBOX file it is important to change the identification changing the line "ident GENERIC" to "ident VBOX". The lines with the options you don't want can be commented or deleted, and you can add options according to your needs. Use the following command to edit the file:
    sudo ee /usr/src/sys/amd64/conf/VBOX
    For this example, I used the following content:
    cpu             I686_CPU
    ident           VBOX
    
    options         SCHED_ULE               # ULE scheduler
    options         PREEMPTION              # Enable kernel thread preemption
    options         INET                    # InterNETworking
    options         INET6                   # IPv6 communications protocols
    options         SCTP                    # Stream Control Transmission Protocol
    options         FFS                     # Berkeley Fast Filesystem
    options         SOFTUPDATES             # Enable FFS soft updates support
    options         UFS_ACL                 # Support for access control lists
    options         UFS_DIRHASH             # Improve performance on big directories
    options         UFS_GJOURNAL            # Enable gjournal-based UFS journaling
    options         MD_ROOT                 # MD is a potential root device
    options         NFSCL                   # New Network Filesystem Client
    options         NFSD                    # New Network Filesystem Server
    options         NFSLOCKD                # Network Lock Manager
    options         NFS_ROOT                # NFS usable as /, requires NFSCL
    options         MSDOSFS                 # MSDOS Filesystem
    options         CD9660                  # ISO 9660 Filesystem
    options         PROCFS                  # Process filesystem (requires PSEUDOFS)
    options         PSEUDOFS                # Pseudo-filesystem framework
    options         GEOM_PART_GPT           # GUID Partition Tables.
    options         GEOM_LABEL              # Provides labelization
    options         COMPAT_FREEBSD4         # Compatible with FreeBSD4
    options         COMPAT_FREEBSD5         # Compatible with FreeBSD5
    options         COMPAT_FREEBSD6         # Compatible with FreeBSD6
    options         COMPAT_FREEBSD7         # Compatible with FreeBSD7
    options         SCSI_DELAY=5000         # Delay (in ms) before probing SCSI
    options         KTRACE                  # ktrace(1) support
    options         STACK                   # stack(9) support
    options         SYSVSHM                 # SYSV-style shared memory
    options         SYSVMSG                 # SYSV-style message queues
    options         SYSVSEM                 # SYSV-style semaphores
    options         _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
    options         PRINTF_BUFR_SIZE=128    # Prevent printf output being interspersed.
    options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
    options         HWPMC_HOOKS             # Necessary kernel hooks for hwpmc(4)
    options         AUDIT                   # Security event auditing
    options         MAC                     # TrustedBSD MAC Framework
    options         INCLUDE_CONFIG_FILE     # Include this file in kernel
    options         KDB                     # Kernel debugger related code
    options         KDB_TRACE               # Print a stack trace for a panic
    
    # To make an SMP kernel, the next two lines are needed
    options         SMP                     # Symmetric MultiProcessor Kernel
    device          apic                    # I/O APIC
    
    # CPU frequency control
    device          cpufreq
    
    # Bus support.
    device          acpi
    device          eisa
    device          pci
    
    # ATA controllers
    device          ahci            # AHCI-compatible SATA controllers
    device          ata             # Legacy ATA/SATA controllers
    options         ATA_CAM         # Handle legacy controllers with CAM
    options         ATA_STATIC_ID   # Static device numbering
    
    # ATA/SCSI peripherals
    device          scbus           # SCSI bus (required for ATA/SCSI)
    device          ch              # SCSI media changers
    device          da              # Direct Access (disks)
    device          sa              # Sequential Access (tape etc)
    device          cd              # CD
    device          pass            # Passthrough device (direct ATA/SCSI access)
    device          ses             # Enclosure Services (SES and SAF-TE)
    device          ctl             # CAM Target Layer
    
    # atkbdc0 controls both the keyboard and the PS/2 mouse
    device          atkbdc          # AT keyboard controller
    device          atkbd           # AT keyboard
    device          psm             # PS/2 mouse
    
    device          kbdmux          # keyboard multiplexer
    
    device          vga             # VGA video card driver
    options         VESA            # Add support for VESA BIOS Extensions (VBE)
    
    device          splash          # Splash screen and screen saver support
    
    # syscons is the default console driver, resembling an SCO console
    device          sc
    options         SC_PIXEL_MODE   # add support for the raster text mode
    
    # Add suspend/resume support for the i8254.
    device          pmtimer
    
    # Serial (COM) ports
    device          uart            # Generic UART driver
    
    # Parallel port
    device          ppc
    device          ppbus           # Parallel port bus (required)
    device          lpt             # Printer
    device          plip            # TCP/IP over parallel
    device          ppi             # Parallel port interface device
    
    device          puc             # Multi I/O cards and multi-channel UARTs
    
    # PCI Ethernet NICs.
    device          em              # Intel PRO/1000 Gigabit Ethernet Family
    
    # Pseudo devices.
    device          loop            # Network loopback
    device          random          # Entropy device
    device          ether           # Ethernet support
    device          vlan            # 802.1Q VLAN support
    device          tun             # Packet tunnel.
    device          pty             # BSD-style compatibility pseudo ttys
    device          md              # Memory "disks"
    device          gif             # IPv6 and IPv4 tunneling
    device          faith           # IPv6-to-IPv4 relaying (translation)
    device          firmware        # firmware assist module
    
    # The `bpf' device enables the Berkeley Packet Filter.
    # Be aware of the administrative consequences of enabling this!
    # Note that 'bpf' is required for DHCP.
    device          bpf             # Berkeley packet filter
    
    # USB support
    options         USB_DEBUG       # enable debug msgs
    device          uhci            # UHCI PCI->USB interface
    device          ohci            # OHCI PCI->USB interface
    device          ehci            # EHCI PCI->USB interface (USB 2.0)
    device          xhci            # XHCI PCI->USB interface (USB 3.0)
    device          usb             # USB Bus (required)
    device          uhid            # "Human Interface Devices"
    device          ukbd            # Keyboard
    device          umass           # Disks/Mass storage - Requires scbus and da
    device          ums             # Mouse
    
    # Sound support
    device          sound           # Generic sound driver (required)
    device          snd_ich         # Intel, NVidia and other ICH AC'97 Audio
  3. To compile and install your Kernel use the following:
    cd /usr/src/
    sudo make buildkernel KERNCONF=VBOX
    sudo make installkernel KERNCONF=VBOX

  4. Reboot to use the new Kernel, you can check it with the following command:
    uname -a

Enjoy a faster boot time and a lower memory usage at this point.

I hope this will help someone out there, please feel free to send any comments.

No comments: