Что такое sysfs и как с ней можно взаимодействовать в Go?

Ответ

Sysfs — это виртуальная файловая система в ядре Linux, которая предоставляет иерархический доступ к информации об устройствах, драйверах и подсистемах ядра. Она монтируется в директорию /sys и позволяет просматривать и изменять параметры ядра и устройств "на лету" через обычные файловые операции.

Зачем это нужно в бэкенде?

  • Мониторинг: Получение данных о состоянии системы: загрузка CPU, использование памяти, состояние сетевых интерфейсов, температура сенсоров.
  • Контейнеризация: Docker и Kubernetes активно используют sysfs (вместе с cgroups) для изоляции и ограничения ресурсов контейнеров (CPU, память, I/O).
  • Управление оборудованием: Взаимодействие с устройствами, например, управление подсветкой (LEDs) или получение данных с сенсоров.

Как взаимодействовать в Go?

Взаимодействие с sysfs в Go не требует специальных библиотек. Так как это файловая система, используются стандартные пакеты os и io/ioutil.

Пример: чтение доступных ядер CPU

package main

import (
    "fmt"
    "log"
    "os"
    "strings"
)

func main() {
    // Файл /sys/devices/system/cpu/online показывает диапазоны активных ядер, например "0-3" или "0,2-3"
    data, err := os.ReadFile("/sys/devices/system/cpu/online")
    if err != nil {
        // Не все ОС имеют sysfs, поэтому важна обработка ошибок
        log.Fatalf("Не удалось прочитать sysfs: %v", err)
    }

    onlineCPUs := strings.TrimSpace(string(data))
    fmt.Printf("Активные CPU: %sn", onlineCPUs)
}

Ключевые характеристики:

  • Структура: Данные организованы в виде директорий и файлов. Один файл обычно содержит одно значение.
  • Текстовый формат: Большинство файлов содержат простые текстовые строки, которые легко парсить.
  • Динамичность: Содержимое sysfs отражает текущее состояние системы и меняется при подключении/отключении устройств.