What if there was a command which would let you, in an easy-to-read format, view all of the hardware in your Linux system? Welcome to lshw, the great tool often overlooked even by seasoned Linux professionals.
What Is lshw?
lshw, A utility, or better tool, installed by default when you install Linux, provides you with a listing of hardware as found in your system. One can remember
lshw by thinking about
ls (the command which lets you list directory contents) and
hw for hardware.
While the tool has a good number of formatting options, gives detailed output for the devices it finds and can detect a solid number of device types, even seasoned Linux professionals may not have heard of it. Perhaps other tools have taken too much of a front posting on search engines and similar.
Currently, the tool can detect DMI (x86 and IA-64), OpenFirmware device tree (PowerPC), PCI/AGP, CPUID (x86), IDE/ATA/ATAPI, PCMCIA, SCSI, and USB devices.
You can even install a graphical version of the same tool using a separate package, namely
lshw does not need to be installed and is included by Linux by default if you are interested in exploring your hardware in a GUI rather than at the command line (which this article will focus on), install
To install lshw-gtk on your Debian/Apt based Linux distribution (Like Ubuntu and Mint), execute the following command in your terminal:
sudo apt install lshw-gtk
To install lshw-gtk on your RedHat/Yum based Linux distribution (Like RHEL, Centos and Fedora), execute the following command in your terminal:
sudo yum install lshw-gtk
If you end up installing
lshw-gtk, please note that there are a few oddities with this tool that may not be expected. For starters, it is recommend that you use
sudo lshw-gtk at your terminal prompt to start
lshw-gtk as otherwise not all hardware info may be available.
Next, when you have started the tool, you will want to hit the Refresh button near the top as
lshw-gtk does not scan hardware by default, but only on demand.
Finally, when your hardware is scanned a few seconds later, the output seems to be missing except for a single Desktop Computer in the leftmost column. Double click this, then double click, for example Motherboard in the second column, and so on. In my own experience, I have found this particular GUI tool to be, while working, a bit limited.
Do you know the difference between a crash and error and an assert? Our Asserts, Errors, and Crashes article explains the difference.
Exploring lshw at the Linux Terminal
When you execute
lshw at your Linux Terminal (which can usually be started by pressing the
Windows Key +
T on your keyboard, or by pressing the operating system’s main icon (like the green circle in Linux Mint) and typing terminal) you will see a long and verbose output of hardware.
lshw did what it was instructed to do; list all hardware.
Let’s make this work a bit better by limiting the output to what we are interested in. Firstly we should explore the hardware classes of output available to us.
We can do this with
lshw -short, which at the same time will render a shorter, much more readable overview of our hardware. Still, the output list can be 1-2 pages long, depending on your terminal settings.
We should also at this point remember to always use
sudo. This will ensure that the output will not be incomplete or inaccurate. Running
sudo should be safe (famous last words!) as
lshw is included by default in the Linux operating system core distribution files; one would hope it has been thoroughly evaluated.
sudo lshw -short | head -n6
Here we requested a short list of all hardware using
lshw -short, executed as the root superuser using
sudo, and limited to the first six lines of output using
head -n6. We piped the output from
head by using a Linux pipe
| which is a very handy method of post-parsing information rendered by a tool into some almost any other format required.
Running this in VirtualBox, we see an immediately interesting bit of information:
lshw is aware that the system and bus is VirtualBox based. We also see that 8GiB of memory was assigned to this VM (Virtual Machine).
Also importantly, we can see the Class of devices being listed, which is what we will use in our next
lshw example. The device Class names used in
lshw are straightforward and easy to remember; there is
processor and potentially a few others.
Using a Device Class to Query with lshw
Now that we know the device Class names, let us use the same in combination with the
-class option (which can be abbreviated to
-C) to query for only specific devices which we are interested in. For example, what if we had an easy way to detect if the system we were using is a virtualized machine running under VirtualBox specifically?
sudo lshw -short -C system sudo lshw -short -C system 2>/dev/null | grep -o 'VirtualBox' if [ "$(sudo lshw -short -C system 2>/dev/null | grep -o 'VirtualBox')" == 'VirtualBox' ]; then echo 'We are using VirtualBox!'; else echo 'This is not a VirtualBox VM!'; fi
Here we executed multiple commands, each time building the command into more complexity. In the first command we simply query
lshw in the same way as before, though this time with the extra
-C system option to only list devices from the
After briefly scanning (not shown in the screenshot, as the output disappears once the scanning is complete), the system class devices are shown, which in this case is the VirtualBox system.
In the next command, we grep (select) for only (thanks to the
-o option) the word ‘VirtualBox’. If the output does not contain ‘VirtualBox’, the command will not yield any output.
We also added and stderr (standard error output) redirection to
2>/dev/null for the odd case where
sudo lshw would render an error. This is a commonly used scripting technique when piping information from one command to another, though perhaps here there is little possibility of an error presenting itself (but not impossible).
n the final command, we insert this code into a subshell (
$(...)) and then into an
if statement. Basically, we are asking the
Bash interpreter to check if the output of the second command matches ‘VirtualBox’.
If so, we can quite confidently say We are using VirtualBox!. If you execute this code on your machine, assuming you are using
Bash, as your command line interpreter/shell, and that you are not using VirtualBox, the output should be This is not a VirtualBox VM! instead.
In this article, we explored
lshw-gtk, the Linux tools for obtaining detailed hardware and system information from the command line and from within a GUI on your desktop. After exploring
lshw device classes, we also looked at directly using
lshw information to establish whether we are running inside VirtualBox or not.
If you enjoyed reading this article, you may like to read How to Use strace to Trace System Calls and Signals next!