/sys Filesystem
/sys is a virtual filesystem where the Linux kernel exports its internal state as files. Every piece of hardware, every kernel subsystem, and every device driver has a directory here. Read a file to query a setting. Write to it to change behavior — no reboot required, no config file needed.
What Is sysfs?
How is /sys different from /proc?
/proc was the original Linux "kernel info as files" interface — it's messier, less organized, and mixes process information with hardware info. /sys (sysfs) was introduced with the 2.6 kernel as a clean replacement for hardware/device information. /sys is strictly hierarchical and organized by kernel subsystem. Both exist today, but /sys is the right place for device and driver configuration.
$ ls /sys/
block/ bus/ class/ dev/ devices/ firmware/
fs/ kernel/ module/ power/
# Key directories:
# /sys/block/ ← block devices (sda, nvme0n1)
# /sys/bus/ ← buses (pci, usb, i2c, platform)
# /sys/class/ ← device classes (net, input, power_supply)
# /sys/devices/ ← all devices in hardware tree
# /sys/module/ ← loaded kernel modules and their params
/sys/block — Disk Configuration
# Every block device has a directory
ls /sys/block/
# sda sdb nvme0n1 loop0 loop1 ...
# Disk queue settings (most important for performance)
ls /sys/block/sda/queue/
# scheduler ← I/O scheduler
# nr_requests ← queue depth
# read_ahead_kb ← read-ahead size
# rotational ← 1=HDD, 0=SSD
# max_sectors_kb ← max I/O size per request
# Read scheduler
cat /sys/block/sda/queue/scheduler
# mq-deadline [bfq] none
# Check if SSD or HDD
cat /sys/block/sda/queue/rotational
# 1 = spinning disk (HDD)
# 0 = solid state (SSD)
# Disk size in 512-byte sectors
cat /sys/block/sda/size
# 1953525168 ← * 512 = ~1TB
# Partition info
ls /sys/block/sda/
# dev queue sda1 sda2 sda3 size stat ...
cat /sys/block/sda/stat
# reads read_merges read_sectors read_ms writes write_merges ...
# ← I/O statistics (same data as /proc/diskstats)
/sys/class/net — Network Interface Config
# List network interfaces
ls /sys/class/net/
# eth0 lo wlan0 docker0 ...
# Interface speed
cat /sys/class/net/eth0/speed
# 1000 ← 1Gbps
# MAC address
cat /sys/class/net/eth0/address
# 00:11:22:33:44:55
# TX queue length
cat /sys/class/net/eth0/tx_queue_len
# 1000
# Carrier (link up/down)
cat /sys/class/net/eth0/carrier
# 1 = link up, 0 = link down
# Bring interface up/down via /sys:
echo 1 > /sys/class/net/eth0/flags # (use 'ip link' instead in practice)
/sys/class/power_supply — Battery & Power
# Laptop battery info
ls /sys/class/power_supply/
# AC BAT0 BAT1
cat /sys/class/power_supply/BAT0/capacity
# 87 ← 87% charge
cat /sys/class/power_supply/BAT0/status
# Discharging
cat /sys/class/power_supply/BAT0/energy_full
# 50000000 ← microwatt-hours
cat /sys/class/power_supply/BAT0/energy_now
# 43500000 ← current charge in microwatt-hours
# CPU frequency scaling
ls /sys/devices/system/cpu/cpu0/cpufreq/
# scaling_governor scaling_cur_freq scaling_min_freq scaling_max_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# powersave
# Switch to performance mode:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
/sys/module — Kernel Module Parameters
# See loaded modules
ls /sys/module/
# bluetooth ext4 usbcore nvidia ...
# Module parameters (can change without unloading module!)
ls /sys/module/usbcore/parameters/
# autosuspend usbfs_memory_mb ...
cat /sys/module/usbcore/parameters/autosuspend
# 2 ← USB autosuspend timeout in seconds
# Change parameter live:
echo -1 > /sys/module/usbcore/parameters/autosuspend # disable autosuspend
# NVMe module params
cat /sys/module/nvme/parameters/io_timeout
# 30 ← I/O timeout in seconds
Controlling Hardware Directly
sysfs lets you control hardware without any program — just write to files:
# Control LEDs (Raspberry Pi, servers with front panel)
ls /sys/class/leds/
# input2::capslock input2::numlock ...
cat /sys/class/leds/input2::capslock/brightness
# 0
echo 1 > /sys/class/leds/input2::capslock/brightness # turn on
# Raspberry Pi GPIO (older kernels):
echo 17 > /sys/class/gpio/export # claim GPIO 17
echo out > /sys/class/gpio/gpio17/direction # set as output
echo 1 > /sys/class/gpio/gpio17/value # set high (3.3V)
# CPU core online/offline (disable a core):
echo 0 > /sys/devices/system/cpu/cpu3/online # take cpu3 offline
echo 1 > /sys/devices/system/cpu/cpu3/online # bring it back