viewing major and minor device numbers

Doug Hardie bc979 at
Fri Oct 25 22:24:37 UTC 2013

On 25 October 2013, at 13:40, David Newman <dnewman at> wrote:

> On 10/25/13 12:34 PM, Polytropon wrote:
>> On Fri, 25 Oct 2013 12:26:31 -0700, David Newman wrote:
>>> FreeBSD 9.2-RELEASE, amd64
>>> To create some character special devices in a chroot environment, I've
>>> previously used mknod, but now can't find the major and minor device
>>> numbers.
>>> The ls manpage says these numbers should be displayed in the size field.
>>> However, I'm seeing only one hex value, e.g.:
>>> $ ls -l /dev/null
>>> crw-rw-rw-  1 root  wheel  0x13 Oct 25 12:22 /dev/null
>>> So I don't know what major and minor values to feed mknod. Or is there
>>> another way to do this?
>> Do you have any "suspicious" ls alias or options preconfigured?
>> That output looks a bit strange, it should be something like
>> this (example from a host system, not from inside a jail):
>> % /bin/ls -laFG /dev/null 
>> crw-rw-rw-  1 root  wheel    0,  17 Oct 25 21:33 /dev/null
>>                             ^   ^^
>> This is the binary /bin/ls, no "shell builtin" or the like,
>> called from the C shell; OS is FreeBSD 8, x86.
> Even with /bin/ls, the system still returns the hex code:
> # /bin/ls -laFG /dev/null
> crw-rw-rw-  1 root  wheel  0x13 Oct 25 13:22 /dev/null
> Two machines, both running 9.2/amd64, both return these hex codes. One
> machine runs on bare metal and the other is a VM I just built. Both
> machines have no aliases for ls.

The ls source module print.c has been changed in the printdev module to print differently:

Here is the module from 8.x (I don't recall which exact version this is)

printdev(size_t width, dev_t dev)
        char buf[DEVSTR_HEX_LEN + 1];
        if (minor(dev) > 255 || minor(dev) < 0)
                (void)snprintf(buf, sizeof(buf), "%3d, 0x%08x",
                    major(dev), (u_int)minor(dev));
                (void)snprintf(buf, sizeof(buf), "%3d, %3d",
                    major(dev), minor(dev));
        (void)printf("%*s ", (u_int)width, buf);

Note that it splits the dev number into the two fields we are all used to.

Now here is the same code from 9.2 Release:

printdev(size_t width, dev_t dev)

        (void)printf("%#*jx ", (u_int)width, (uintmax_t)dev);

Note its a lot simpler because it does not bother to split out the major and minor numbers.

You might be able to replace just this module and rebuild ls.  major and minor are still in the libs.  It looks like it should work, but I haven't tried it.

More information about the freebsd-questions mailing list