/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