【2024年01月版】 /sys メモ 【中年エンジニアのためのLinuxメモ】

# はじめに

`/sys` って仮想ファイルシステムで、いろいろシステム情報入ってる、ぐらいしかわからんから、調べてみる

# `/sys` とは

- Linuxの　`/sys` ディレクトリは、システムファイルシステム（sysfs）の一部
- カーネルオブジェクトに関する情報とインターフェースを提供する特殊なファイルシステム
- Linuxカーネルが実行時にデバイスやドライバーなどのカーネルオブジェクトに関する情報を、ユーザースペースに公開するための手段として機能する
- FHS(Filesystem Hierarchy Standard) で定義されている

# `/sys` で公開されている情報

主に以下の情報が公開されている。

- デバイス情報
  - /sysディレクトリは、システムに接続されている各デバイスに関する詳細な情報を含んでいる
  - デバイスの種類、状態、設定などが含まれる

- ドライバーとのインタラクション
  - ユーザーは `/sys` を通じてドライバーと対話できる
  - 特定のデバイス機能を有効または無効にするために、ファイルを読み書きすることができる

- カーネルパラメータの調整
  - カーネルの動作を制御するためのパラメータも `/sys` を通じてアクセス可能
  - システム管理者はランタイム中にカーネルの動作を微調整できる

- 階層構造
  - `/sys` ディレクトリは階層的な構造をしている
  - デバイス、バス、ドライバーなどによって整理された階層構造が公開されている

- 仮想ファイルシステム
  - `/sys` は実際のファイルではなく、カーネルデータ構造へのインターフェースを提供する仮想ファイルシステム
  - ここに存在するファイルは実際のディスクスペースを消費していない

# デバイスツリー

- `/sys` ディレクトリの階層構造は、Linuxカーネルのデバイス、バス、ドライバーなどのオブジェクトを反映している
- これらのオブジェクトは、デバイスツリーと呼ばれる構造で整理されている
- システムのハードウェア構成とカーネルの内部状態を表す

# `/sys`の主要なサブディレクトリ

## `/sys/block`

- ブロックデバイス（ハードドライブ、SSDなど）に関連する情報を含んでいる
- 各ブロックデバイスはサブディレクトリとして表示され、その中にはデバイスの特性や統計情報が含まれる

## `/sys/bus`

- システムのバス（例：PCI, USBなど）に関する情報を提供する
- バスごとにサブディレクトリがあり、接続されているデバイスやドライバーに関する情報が含まれる

## `/sys/class`

- デバイスを機能や種類別に分類したディレクトリ
- 例えば、`/sys/class/net` にはネットワークインターフェースに関する情報が、`/sys/class/sound` にはオーディオデバイスに関する情報が含まれる

## `/sys/dev`

- デバイスをメジャー番号とマイナー番号で分類したディレクトリ
- このディレクトリを通じて、特定のデバイスファイルに対応するカーネルオブジェクトへアクセスできる

## `/sys/devices`

- システム上のすべてのデバイスについての詳細な情報が含まれる
- デバイスは物理的な接続構造に基づいて階層的に配置されている

## `/sys/firmware`

- ファームウェアやBIOSなどの、システムファームウェアに関連する情報が含まれている

## `/sys/kernel`

- カーネル固有の設定や統計情報が含まれている
- 例えば、デバッグ情報やカーネルモジュールに関するデータなどが含まれる

## `/sys/module`

- ロードされているカーネルモジュールに関する情報が含まれる
- 各モジュールはサブディレクトリとして表現され、設定オプションや状態情報が含まれる

# `/sys` から情報を取得しているコマンド

## `lsusb`

USBデバイスに関する情報を表示するコマンド。このコマンドは、`/sys/bus/usb/devices/` から情報を取得している。

## `lspci`

PCIデバイスに関する情報を表示するコマンド。このコマンドは、`/sys/bus/pci/devices/` や `/sys/bus/pci/` から情報を取得している。

## `lsblk`

ブロックデバイス（ハードドライブ、SSDなど）のリストを表示するコマンド。このコマンドは、`/sys/block/` から情報を取得している。

## `udevadm`

udevデバイスマネージャーに関連する情報を表示するコマンド。このコマンドは、`/sys` ディレクトリの情報を利用してデバイスに関する詳細を表示する。

## `lshw`

ハードウェア構成の詳細な情報を表示するコマンド。このコマンドは、`/sys` ディレクトリの情報を利用してハードウェアに関する詳細を表示する。

# `/sys` を使ったトラブルシューティング

以下のトラブルシューティングなどができるが、専用コマンドを使う方が楽かも。

## ネットワークインターフェースの問題診断

`/sys/class/net/` ディレクトリ内を調べることで、ネットワークインターフェースの状態（有効/無効）や統計情報を確認できる。
例えば、`/sys/class/net/eth0/carrier` をチェックして物理的な接続状態を確認したり、`/sys/class/net/eth0/statistics/rx_bytes` で受信したバイト数を調べることができる。

## USBデバイスの問題診断

`/sys/bus/usb/devices/` には、接続されているUSBデバイスの情報が含まれている。
デバイスが正しく認識されていない場合、このディレクトリ内の情報を用いて、デバイスの状態や接続状況を確認できる。

## ストレージデバイスのパフォーマンス監視

`/sys/block/` ディレクトリには、システムのストレージデバイス（ハードドライブ、SSDなど）に関する情報が存在する。
例えば、/sys/block/sda/statファイルには、デバイスの読み書き操作や転送状況に関する情報が含まれており、パフォーマンスの監視に利用できます。
CPUの状態確認

`/sys/devices/system/cpu/` 内では、CPUの状態や性能に関する情報が含まれている。
例えば、`/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq` で現在のCPU周波数を調べたり、`/sys/devices/system/cpu/cpu0/online` で特定のCPUコアが有効かどうかを確認できる。

## カーネルモジュールの状態確認

`/sys/module/` ディレクトリには、ロードされているカーネルモジュールに関する情報が含まれている。
このディレクトリを通じて、特定のモジュールがロードされているか、その設定値を確認することができる。

# 参考リンク

[Wikipedia sysfs](https://ja.wikipedia.org/wiki/Sysfs)
[man sysfs](https://man.archlinux.org/man/sysfs.5.en)
[Filesystem Hierarchy Standard](https://www.pathname.com/fhs/)

# さいごに

さくっと理解しておきたい