where does uname get version number in FreeBSD RELEASE?

I installed FreeBSD 9.1-RELEASE, after binary upgrading to 9.2-RELEASE using freebsd-update, all files I checked are correctly in 9.2-RELEASE-p4. For example:

  1. the kernel contains the new version:

    # strings /boot/kernel/kernel | grep RELEASE|grep 9
    @(#)FreeBSD 9.2-RELEASE-p4 #0: Tue Apr  8 18:08:22 UTC 2014
    FreeBSD 9.2-RELEASE-p4 #0: Tue Apr  8 18:08:22 UTC 2014
    9.2-RELEASE-p4
    
  2. the first line of /etc/hosts shows it is upgraded to 9.2:

    # $FreeBSD: release/9.2.0/etc/hosts 109997 2003-01-28 21:29:23Z dbaker $
    

I asked on another forum and have verified that:

  1. I never compiled kernel, and do not have /usr/src and /usr/obj folders.

  2. the default /etc/profile is unchanged, in particular I never defined UNAME_* vars .

  3. I also tried "unsetenv UNAME_r"

However, uname somehow shows the wrong version 9.1:

# uname -a
FreeBSD localhost.localdomain 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec  4 09:23:10 UTC 2012     root at farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

So where does uname get the version number from? Which file(s) might not have been upgraded? Thank you!


FreeBSD uname is using sysctl values to fill-in its output, so there is no file to update except for the kernel.

Here are the corresponding sysctl key to uname options (from usr.bin/uname/uname.c):

  • -i : kern.ident
  • -m : hw.machine
  • -n : kern.hostname
  • -p : hw.machine_arch
  • -r : kern.osrelease
  • -s or -o : kern.ostype
  • -v : kern.version

It seems your actual kernel is not the one you think. You can check the kernel file in use with:

# sysctl kern.bootfile