Computing: Computer Administration

Fixing "SMBus Host Controller not enabled" on a VMware Linux guest.

The screenshot below shows an error message, that I got when booting Linux Mint 20, running on a VMware virtual machine: SMBus base address uninitialized - upgrade BIOS or use force_addr=0xaddr. This issue of Linux operating systems on VMware is rather common; in most cases the error is reported as SMBus Host Controller not enabled, as for example on CentOS. What is an SM Bus Controller? Why Linux reports this error? How much have we to worry about? What can we do to fix the issue?

SMBus Host Controller error on Linux Mint running on VMware

The important first: There is no reason to worry: you can safely ignore this error. What does not mean that fixing it wouldn't have any sense. It's upon you to decide...

The SM Bus Controller, also known as the SMBus or System Management Bus, is a chipset within a personal computer that provides a two-wire interface that allows system and power-related components to communicate with other parts of the computer. The SMBus monitors voltage and temperature and can send a limited number of error messages when problems occur.

The error is due to the fact that VMware doesn't actually provide that level interface for CPU access, but some Linux distributions (perhaps even most of them) try to load the corresponding kernel module anyway. So, fixing the issue should not be too difficult: All we have to do is to prevent the module to be loaded.

On Linux operating systems, a major part of functionality is defined by configuration files located in the /etc directory. To prevent our module to be loaded, we have to take a look in the directory /etc/modprobe.d. Here we'll find a configuration file containing a blacklist of those modules that should not be loaded. This file is often (and it's actually the case on Linux Mint) called blacklist.conf (some Linux distributions use a somewhat different name; on OpenSuse, for example, it's called 50-blacklist.conf). The screenshot below shows the content of this file, opened in the Linux Mint default editor, on my machine.

The file /etc/modprobe.d/blacklist.conf opened in the Linux Mint editor

The SMBus module is called i2c-piix4 and we can prevent it to be loaded by adding the following line at the end of blacklist.conf:
    blacklist i2c-piix4

If you have opened the file as root (what is possible on Linux Mint), you can save (rewrite) it directly. If, as on the screenshot, you have opened it as a standard user, you have to use the Save As command to save it to your home directory and then, in a terminal, copy it as superuser to /etc/modprobe.d:
    sudo cp blacklist.conf /etc/modprobe.d/blacklist.conf

On some pages, you can find on the web, you are told that that's it. This is not true: Even after having made the changes to blacklist.conf, Linux Mint will display the error message when starting up. In fact, we'll have to regenerate initramfs. On Debian based systems (as Linux Mint), this may be done by running the command
    sudo update-initramfs -u
Please, note that you have to reboot to make your changes become active.

Fixing "SMBus Host Controller not enabled" on CentOS.

The screenshot below shows the messages, that I got when booting CentOS 7, running on a VMware virtual machine. There are actually two (non-related) issues here. The first one concerns the CPU of my computer that is said "not having undergone upstream testing". This means that this processor is not certified by Red Hat, or more correctly has not been certified by Red Hat when CentOS 7 was released. As my laptop is rather new and includes a rather recent CPU, this must not surprise (CentOS 7 is not the latest version of the OS). Anyway, this is a message that you can really ignore (even though I think that there is a way to update the list of certified hardware). The second error message concerns the SMBus issue on VMware, as detailed for Linux Mint at the beginning of this tutorial.

SMBus Host Controller error on CentOS 7 running on VMware

The procedure to fix the error is the same as on Linux Mint: 1. blacklist the i2c-piix4 module, and 2. regenerate initramfs.

However, if you have a look at the directory /etc/modprobe.d, you will find no file called blacklist.conf. On my system, there is a file called dccp-blacklist.conf, that seems to be specific for the dccp module. In fact, on CentOS, there usually is a separate configuration file for each module of the blacklist. Thus, we'll have to create a new file, called i2c-piix4-blacklist.conf in the /etc/modprobe.d directory.

In a terminal, you can do this using the vi editor. Being in the directory /etc/modprobe.d, enter the following two commands (the first one makes you superuser, the second one creates and opens the file):
    vi i2c-piix4-blacklist.conf

You must have a basic knowledge concerning the vi editor to be able to use it. Here, what you need to know to create the blacklist file. First of all, you'll have to push the Insert key, because vi, no idea why, starts in override mode. Now, you can enter text as in a "normal" editor, and pressing the ENTER key will terminate the actual line and place the cursor at the beginning of a new one. When you're done entering text, push the Escape key; this will put you in command mode. All vi commands start with a colon (:). There are two of them, you need to save the file: :w (write) to save the file to disk, :q (quit) to exit the editor. By the way, note, that you can combine commands, as for example :wq for save and exit. In order to force a command to be executed, add an exclamation mark (!) after the command.

Here the content of my /etc/modprobe.d/blacklist.conf file:
    blacklist i2c-piix4
    install i2c-piix4 /bin/false
The second line makes sure that the module is really never loaded. In fact, it could be, indirectly, as a dependency of some other module.

Finally, lets regenerate initramfs. To do this on CentOS, we can use the command:
    dracut --omit-drivers i2c-piix4 -f

Fixing "SMBus Host Controller not enabled" on other Linux distributions.

The procedure to follow is always the same: 1. blacklist the i2c-piix4 module in /etc/modprobe.d, 2. regenerate initramfs. Remember that there may be differences in the name of the blacklist file. Concerning the regeneration of initramfs, the command is largely OS-depended. On OpenSuse, for example, you can use the command sudo mkinitrd (not tested by myself...). Have a look in the user manual of your Linux distribution for details.

If you find this text helpful, please, support me and this website by signing my guestbook.