Access to accurate hardware information in Linux simplifies capacity planning, troubleshooting, and hardware compatibility checks. Clear visibility into installed components such as CPUs, memory modules, storage devices, and controllers avoids guesswork when diagnosing issues or deciding on upgrades.
Command line utilities such as lshw, lspci, lsusb, lscpu, lsmem, and lsblk query the kernel, firmware, and device buses to describe hardware that is currently detected. These tools combine information from firmware interfaces like DMI and ACPI with the virtual filesystems under /proc and /sys, producing structured text output that can be filtered, searched, and logged.
Many of these tools require sudo because firmware tables and low level device attributes are only readable by privileged users, and their output can include sensitive details such as serial numbers, asset tags, and UUIDs. Output is safest stored locally and sanitized before sharing externally, especially when examining production systems or virtual machines hosted on platforms such as VMware or KVM.
Steps to check hardware information in Linux:
- Open the terminal.
Use an account with sudo privileges so utilities that read firmware tables and low level device attributes can run successfully.
- Use lshw to display all installed hardware.
$ sudo lshw 14844ef6f7fc description: Computer width: 64 bits capabilities: smp tagged_addr_disabled *-core description: Motherboard physical id: 0 *-cpu:0 description: CPU product: cpu physical id: 0 bus info: cpu@0 capabilities: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp flagm2 frint *-cpu:1 description: CPU product: cpu physical id: 1 bus info: cpu@1 capabilities: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp flagm2 frint ##### snipped #####Use lshw for a comprehensive overview of all hardware components, including CPU, memory, and storage devices.
More options for lshw:
$ lshw --help Hardware Lister (lshw) - usage: lshw [-format] [-options ...] lshw -version -version print program version () format can be -html output hardware tree as HTML -xml output hardware tree as XML -json output hardware tree as a JSON object -short output hardware paths -businfo output bus information options can be -class CLASS only show a certain class of hardware -C CLASS same as '-class CLASS' -c CLASS same as '-class CLASS' -disable TEST disable a test (like pci, isapnp, cpuid, etc. ) -enable TEST enable a test (like pci, isapnp, cpuid, etc. ) -quiet don't display status -sanitize sanitize output (remove sensitive information like serial numbers, etc.) -numeric output numeric IDs (for PCI, USB, etc.) -notime exclude volatile attributes (timestamps) from output - Run lspci to list connected PCI devices.
$ lspci 00:00.0 Host bridge: Apple Inc. Device 1a05 00:01.0 Ethernet controller: Red Hat, Inc. Virtio 1.0 network device (rev 01) 00:05.0 Communication controller: Red Hat, Inc. Virtio 1.0 console (rev 01) 00:06.0 Mass storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01) 00:07.0 Mass storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01) 00:08.0 Mass storage controller: Red Hat, Inc. Virtio file system (rev 01) 00:09.0 Mass storage controller: Red Hat, Inc. Virtio file system (rev 01) 00:0a.0 Mass storage controller: Red Hat, Inc. Virtio file system (rev 01) 00:0b.0 Mass storage controller: Red Hat, Inc. Virtio file system (rev 01) 00:0c.0 Mass storage controller: Red Hat, Inc. Virtio file system (rev 01) 00:0d.0 Mass storage controller: Red Hat, Inc. Virtio file system (rev 01) 00:0e.0 Communication controller: Red Hat, Inc. Virtio 1.0 socket (rev 01) 00:0f.0 Network and computing encryption device: Red Hat, Inc. Virtio 1.0 RNG (rev 01) 00:10.0 Memory controller: Red Hat, Inc. Virtio 1.0 memory balloon (rev 01) ##### snipped #####
Use lspci to view PCI devices such as network cards, sound cards, and GPUs.
More options for lspci:
$ lspci --help lspci: invalid option -- '-' Usage: lspci [<switches>] Basic display modes: -mm Produce machine-readable output (single -m for an obsolete format) -t Show bus tree Display options: -v Be verbose (-vv or -vvv for higher verbosity) -k Show kernel drivers handling each device -x Show hex-dump of the standard part of the config space -xxx Show hex-dump of the whole config space (dangerous; root only) -xxxx Show hex-dump of the 4096-byte extended config space (root only) -b Bus-centric view (addresses and IRQ's as seen by the bus) -D Always show domain numbers -P Display bridge path in addition to bus and device number -PP Display bus path in addition to bus and device number Resolving of device ID's to names: -n Show numeric ID's -nn Show both textual and numeric ID's (names & numbers) -q Query the PCI ID database for unknown ID's via DNS -qq As above, but re-query locally cached entries -Q Query the PCI ID database for all ID's via DNS Selection of devices: -s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]] Show only devices in selected slots -d [<vendor>]:[<device>][:<class>] Show only devices with specified ID's Other options: -i <file> Use specified ID database instead of /usr/share/misc/pci.ids.gz -p <file> Look up kernel modules in a given file instead of default modules.pcimap -M Enable `bus mapping' mode (dangerous; root only) PCI access options: -A <method> Use the specified PCI access method (see `-A help' for a list) -O <par>=<val> Set PCI access parameter (see `-O help' for a list) -G Enable PCI access debugging -H <mode> Use direct hardware access (<mode> = 1 or 2) -F <file> Read PCI configuration dump from a given file
- Use lsusb to list connected USB devices.
$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
More options for lsusb:
$ lsusb --help Usage: lsusb [options]... List USB devices -v, --verbose Increase verbosity (show descriptors) -s [[bus]:][devnum] Show only devices with specified device and/or bus numbers (in decimal) -d vendor:[product] Show only devices with the specified vendor and product ID numbers (in hexadecimal) -D device Selects which device lsusb will examine -t, --tree Dump the physical USB device hierarchy as a tree -V, --version Show version of program -h, --help Show usage and help - Use lscpu to view CPU architecture details.
$ lscpu Architecture: aarch64 CPU op-mode(s): 64-bit Byte Order: Little Endian CPU(s): 10 On-line CPU(s) list: 0-9 Vendor ID: Apple Model name: - Model: 0 Thread(s) per core: 1 Core(s) per cluster: 10 Socket(s): - Cluster(s): 1 Stepping: 0x0 BogoMIPS: 48.00 Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp flagm2 frint Vulnerability Gather data sampling: Not affected Vulnerability Indirect target selection: Not affected Vulnerability Itlb multihit: Not affected Vulnerability L1tf: Not affected Vulnerability Mds: Not affected Vulnerability Meltdown: Not affected Vulnerability Mmio stale data: Not affected Vulnerability Reg file data sampling: Not affected Vulnerability Retbleed: Not affected Vulnerability Spec rstack overflow: Not affected Vulnerability Spec store bypass: Vulnerable Vulnerability Spectre v1: Mitigation; __user pointer sanitization Vulnerability Spectre v2: Mitigation; CSV2, but not BHB Vulnerability Srbds: Not affected Vulnerability Tsa: Not affected Vulnerability Tsx async abort: Not affected Vulnerability Vmscape: Not affected
The lscpu command shows detailed CPU information such as architecture, core count, and supported features.
More options for lscpu:
$ lscpu --help Usage: lscpu [options] Display information about the CPU architecture. Options: -a, --all print both online and offline CPUs (default for -e) -b, --online print online CPUs only (default for -p) -B, --bytes print sizes in bytes rather than in human readable format -C, --caches[=<list>] info about caches in extended readable format -c, --offline print offline CPUs only -J, --json use JSON for default or extended format -e, --extended[=<list>] print out an extended readable format -p, --parse[=<list>] print out a parsable format -s, --sysroot <dir> use specified directory as system root -x, --hex print hexadecimal masks rather than lists of CPUs -y, --physical print physical instead of logical IDs --hierarchic[=when] use subsections in summary (auto, never, always) --output-all print all available columns for -e, -p or -C -h, --help display this help -V, --version display version Available output columns for -e or -p: BOGOMIPS crude measurement of CPU speed CPU logical CPU number CORE logical core number SOCKET logical socket number CLUSTER logical cluster number NODE logical NUMA node number BOOK logical book number DRAWER logical drawer number CACHE shows how caches are shared between CPUs POLARIZATION CPU dispatching mode on virtual hardware ADDRESS physical address of a CPU CONFIGURED shows if the hypervisor has allocated the CPU ONLINE shows if Linux currently makes use of the CPU MHZ shows the currently MHz of the CPU SCALMHZ% shows scaling percentage of the CPU frequency MAXMHZ shows the maximum MHz of the CPU MINMHZ shows the minimum MHz of the CPU MODELNAME shows CPU model name Available output columns for -C: ALL-SIZE size of all system caches LEVEL cache level NAME cache name ONE-SIZE size of one cache TYPE cache type WAYS ways of associativity ALLOC-POLICY allocation policy WRITE-POLICY write policy PHY-LINE number of physical cache line per cache tag SETS number of sets in the cache; set lines has the same cache index COHERENCY-SIZE minimum amount of data in bytes transferred from memory to cache For more details see lscpu(1). - Use lsmem to check memory status and details.
$ lsmem lsmem: cannot open /sys/devices/system/memory: No such file or directory
The lsmem command provides a view of available memory blocks and their status.
More options for lsmem:
$ lsmem --help Usage: lsmem [options] List the ranges of available memory with their online status. Options: -J, --json use JSON output format -P, --pairs use key="value" output format -a, --all list each individual memory block -b, --bytes print SIZE in bytes rather than in human readable format -n, --noheadings don't print headings -o, --output <list> output columns --output-all output all columns -r, --raw use raw output format -S, --split <list> split ranges by specified columns -s, --sysroot <dir> use the specified directory as system root --summary[=when] print summary information (never,always or only) -h, --help display this help -V, --version display version Available output columns: RANGE start and end address of the memory range SIZE size of the memory range STATE online status of the memory range REMOVABLE memory is removable BLOCK memory block number or blocks range NODE numa node of memory ZONES valid zones for the memory range For more details see lsmem(1). - Run lsblk to list available block storage devices.
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 512M 0 loop /mnt/bench nbd0 43:0 0 0B 0 disk nbd1 43:32 0 0B 0 disk nbd2 43:64 0 0B 0 disk nbd3 43:96 0 0B 0 disk nbd4 43:128 0 0B 0 disk nbd5 43:160 0 0B 0 disk nbd6 43:192 0 0B 0 disk nbd7 43:224 0 0B 0 disk vda 254:0 0 1.8T 0 disk `-vda1 254:1 0 1.8T 0 part /etc/hosts /etc/hostname /etc/resolv.conf vdb 254:16 0 606.5M 1 disk nbd8 43:256 0 0B 0 disk nbd9 43:288 0 0B 0 disk nbd10 43:320 0 0B 0 disk nbd11 43:352 0 0B 0 disk nbd12 43:384 0 0B 0 disk nbd13 43:416 0 0B 0 disk nbd14 43:448 0 0B 0 disk nbd15 43:480 0 0B 0 diskThe lsblk command shows block storage devices, including partitions and mounted filesystems.
More options for lsblk:
$ lsblk --help Usage: lsblk [options] [<device> ...] List information about block devices. Options: -A, --noempty don't print empty devices -D, --discard print discard capabilities -E, --dedup <column> de-duplicate output by <column> -I, --include <list> show only devices with specified major numbers -J, --json use JSON output format -M, --merge group parents of sub-trees (usable for RAIDs, Multi-path) -O, --output-all output all columns -P, --pairs use key="value" output format -S, --scsi output info about SCSI devices -N, --nvme output info about NVMe devices -v, --virtio output info about virtio devices -T, --tree[=<column>] use tree format output -a, --all print all devices -b, --bytes print SIZE in bytes rather than in human readable format -d, --nodeps don't print slaves or holders -e, --exclude <list> exclude devices by major number (default: RAM disks) -f, --fs output info about filesystems -i, --ascii use ascii characters only -l, --list use list format output -m, --perms output info about permissions -n, --noheadings don't print headings -o, --output <list> output columns -p, --paths print complete device path -r, --raw use raw output format -s, --inverse inverse dependencies -t, --topology output info about topology -w, --width <num> specifies output width as number of characters -x, --sort <column> sort output by <column> -y, --shell use column names to be usable as shell variable identifiers -z, --zoned print zone related information --sysroot <dir> use specified directory as system root -h, --help display this help -V, --version display version Available output columns: ALIGNMENT alignment offset ID-LINK the shortest udev /dev/disk/by-id link name ID udev ID (based on ID-LINK) DISC-ALN discard alignment offset DAX dax-capable device DISC-GRAN discard granularity DISK-SEQ disk sequence number DISC-MAX discard max bytes DISC-ZERO discard zeroes data FSAVAIL filesystem size available FSROOTS mounted filesystem roots FSSIZE filesystem size FSTYPE filesystem type FSUSED filesystem size used FSUSE% filesystem use percentage FSVER filesystem version GROUP group name HCTL Host:Channel:Target:Lun for SCSI HOTPLUG removable or hotplug device (usb, pcmcia, ...) KNAME internal kernel device name LABEL filesystem LABEL LOG-SEC logical sector size MAJ:MIN major:minor device number MIN-IO minimum I/O size MODE device node permissions MODEL device identifier MQ device queues NAME device name OPT-IO optimal I/O size OWNER user name PARTFLAGS partition flags PARTLABEL partition LABEL PARTN partition number as read from the partition table PARTTYPE partition type code or UUID PARTTYPENAME partition type name PARTUUID partition UUID PATH path to the device node PHY-SEC physical sector size PKNAME internal parent kernel device name PTTYPE partition table type PTUUID partition table identifier (usually UUID) RA read-ahead of the device RAND adds randomness REV device revision RM removable device RO read-only device ROTA rotational device RQ-SIZE request queue size SCHED I/O scheduler name SERIAL disk serial number SIZE size of the device START partition start offset STATE state of the device SUBSYSTEMS de-duplicated chain of subsystems MOUNTPOINT where the device is mounted MOUNTPOINTS all locations where device is mounted TRAN device transport type TYPE device type UUID filesystem UUID VENDOR device vendor WSAME write same max bytes WWN unique storage identifier ZONED zone model ZONE-SZ zone size ZONE-WGRAN zone write granularity ZONE-APP zone append max bytes ZONE-NR number of zones ZONE-OMAX maximum number of open zones ZONE-AMAX maximum number of active zones For more details see lsblk(8). - Browse the /dev directory for available special or device files.
$ ls /dev autofs btrfs-control bus cachefiles core cpu_dma_latency cuse fd full fuse gpiochip0 hvc0 hvc1 hvc2 hvc3 hvc4 hvc5 hvc6 hvc7 hwrng input kmsg log loop-control loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 mapper mem mqueue nbd0 nbd1 nbd10 nbd11 nbd12 nbd13 nbd14 nbd15 nbd2 nbd3 nbd4 nbd5 nbd6 nbd7 nbd8 nbd9 net null port ppp ptmx pts ram0 ram1 ram10 ram11 ram12 ram13 ram14 ram15 ram2 ram3 ram4 ram5 ram6 ram7 ram8 ram9 random rtc0 shm stderr stdin stdout tty tty0 tty1 tty10 tty11 tty12 tty13 tty14 tty15 tty16 tty17 tty18 tty19 tty2 tty20 tty21 tty22 tty23 tty24 tty25 tty26 tty27 tty28 tty29 tty3 tty30 tty31 tty32 tty33 tty34 tty35 tty36 tty37 tty38 tty39 tty4 tty40 tty41 tty42 tty43 tty44 tty45 tty46 tty47 tty48 tty49 tty5 tty50 tty51 tty52 tty53 tty54 tty55 tty56 tty57 tty58 tty59 tty6 tty60 tty61 tty62 tty63 tty7 tty8 tty9 ttyS0 ttyS1 ttyS2 ttyS3 uinput urandom usbmon0 usbmon1 usbmon2 vcs vcs1 vcs2 vcs3 vcs4 vcs5 vcs6 vcsa vcsa1 vcsa2 vcsa3 vcsa4 vcsa5 vcsa6 vcsu vcsu1 vcsu2 vcsu3 vcsu4 vcsu5 vcsu6 vda vda1 vdb vga_arbiter vhost-net vhost-vsock vport1p0 vsock zero
- Use dmidecode to view BIOS and system information.
$ sudo dmidecode # dmidecode 3.5 # No SMBIOS nor DMI entry point found, sorry.
More options for dmidecode:
$ dmidecode --help Usage: dmidecode [OPTIONS] Options are: -d, --dev-mem FILE Read memory from device FILE (default: /dev/mem) -h, --help Display this help text and exit -q, --quiet Less verbose output --no-quirks Decode everything without quirks -s, --string KEYWORD Only display the value of the given DMI string -t, --type TYPE Only display the entries of given type -H, --handle HANDLE Only display the entry of given handle -u, --dump Do not decode the entries --dump-bin FILE Dump the DMI data to a binary file --from-dump FILE Read the DMI data from a binary file --no-sysfs Do not attempt to read DMI data from sysfs files --oem-string N Only display the value of the given OEM string -V, --version Display the version and exit - Explore sysfs for hardware devices and related kernel information.
$ cat /sys/class/power_supply/ACAD/type cat: /sys/class/power_supply/ACAD/type: No such file or directory
sysfs under /sys exposes kernel devices and their attributes in a structured directory tree grouped by class and bus.
- Inspect the /proc and /sys directories for additional hardware details.
$ cat /proc/meminfo MemTotal: 24314884 kB MemFree: 21206808 kB MemAvailable: 22949396 kB Buffers: 436616 kB Cached: 1195512 kB SwapCached: 0 kB Active: 1017988 kB Inactive: 1337016 kB Active(anon): 739584 kB Inactive(anon): 0 kB Active(file): 278404 kB Inactive(file): 1337016 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 1048572 kB SwapFree: 1048572 kB Zswap: 0 kB Zswapped: 0 kB Dirty: 148 kB Writeback: 0 kB AnonPages: 591660 kB Mapped: 232180 kB Shmem: 16728 kB KReclaimable: 445948 kB Slab: 521696 kB SReclaimable: 445948 kB SUnreclaim: 75748 kB KernelStack: 5616 kB PageTables: 5804 kB SecPageTables: 0 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 13206012 kB Committed_AS: 1747536 kB VmallocTotal: 135288315904 kB VmallocUsed: 6148 kB VmallocChunk: 0 kB Percpu: 3760 kB AnonHugePages: 350208 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB FileHugePages: 0 kB FilePmdMapped: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB
The /proc and /sys directories contain real-time and persistent system and hardware data, which can be accessed using the cat command.
- Use dmesg to view kernel diagnostic messages for hardware related information.
$ dmesg | head -n 20 [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x610f0000] [ 0.000000] Linux version 6.12.54-linuxkit (root@buildkitsandbox) (gcc (Alpine 13.2.1_git20240309) 13.2.1 20240309, GNU ld (GNU Binutils) 2.42) #1 SMP Tue Nov 4 21:21:47 UTC 2025 [ 0.000000] OF: reserved mem: Reserved memory: No reserved-memory node in the DT [ 0.000000] Zone ranges: [ 0.000000] DMA [mem 0x0000000070000000-0x00000000ffffffff] [ 0.000000] DMA32 empty [ 0.000000] Normal [mem 0x0000000100000000-0x000000065fffffff] [ 0.000000] Movable zone start for each node [ 0.000000] Early memory node ranges [ 0.000000] node 0: [mem 0x0000000070000000-0x000000065fffffff] [ 0.000000] Initmem setup node 0 [mem 0x0000000070000000-0x000000065fffffff] [ 0.000000] psci: probing for conduit method from DT. [ 0.000000] psci: PSCIv1.1 detected in firmware. [ 0.000000] psci: Using standard PSCI v0.2 function IDs [ 0.000000] psci: Trusted OS migration not required [ 0.000000] psci: SMC Calling Convention v1.1 [ 0.000000] percpu: Embedded 34 pages/cpu s100312 r8192 d30760 u139264 [ 0.000000] pcpu-alloc: s100312 r8192 d30760 u139264 alloc=34*4096 [ 0.000000] pcpu-alloc: [0] 00 [0] 01 [0] 02 [0] 03 [0] 04 [0] 05 [0] 06 [0] 07 [ 0.000000] pcpu-alloc: [0] 08 [0] 09
More options for dmesg:
$ dmesg --help Usage: dmesg [options] Display or control the kernel ring buffer. Options: -C, --clear clear the kernel ring buffer -c, --read-clear read and clear all messages -D, --console-off disable printing messages to console -E, --console-on enable printing messages to console -F, --file <file> use the file instead of the kernel log buffer -f, --facility <list> restrict output to defined facilities -H, --human human readable output -J, --json use JSON output format -k, --kernel display kernel messages -L, --color[=<when>] colorize messages (auto, always or never) colors are enabled by default -l, --level <list> restrict output to defined levels -n, --console-level <level> set level of messages printed to console -P, --nopager do not pipe output into a pager -p, --force-prefix force timestamp output on each line of multi-line messages -r, --raw print the raw message buffer --noescape don't escape unprintable character -S, --syslog force to use syslog(2) rather than /dev/kmsg -s, --buffer-size <size> buffer size to query the kernel ring buffer -u, --userspace display userspace messages -w, --follow wait for new messages -W, --follow-new wait and print only new messages -x, --decode decode facility and level to readable string -d, --show-delta show time delta between printed messages -e, --reltime show local time and time delta in readable format -T, --ctime show human-readable timestamp (may be inaccurate!) -t, --notime don't show any timestamp with messages --time-format <format> show timestamp using the given format: [delta|reltime|ctime|notime|iso] Suspending/resume will make ctime and iso timestamps inaccurate. --since <time> display the lines since the specified time --until <time> display the lines until the specified time -h, --help display this help -V, --version display version Supported log facilities: kern - kernel messages user - random user-level messages mail - mail system daemon - system daemons auth - security/authorization messages syslog - messages generated internally by syslogd lpr - line printer subsystem news - network news subsystem Supported log levels (priorities): emerg - system is unusable alert - action must be taken immediately crit - critical conditions err - error conditions warn - warning conditions notice - normal but significant condition info - informational debug - debug-level messages For more details see dmesg(1).
Mohd Shakir Zakaria is a cloud architect with deep roots in software development and open-source advocacy. Certified in AWS, Red Hat, VMware, ITIL, and Linux, he specializes in designing and managing robust cloud and on-premises infrastructures.
