{"id":13495492,"url":"https://github.com/petersulyok/smfc","last_synced_at":"2026-04-02T16:53:25.370Z","repository":{"id":41164563,"uuid":"407337175","full_name":"petersulyok/smfc","owner":"petersulyok","description":"Super Micro Fan Control","archived":false,"fork":false,"pushed_at":"2025-03-23T14:56:04.000Z","size":1828,"stargazers_count":223,"open_issues_count":2,"forks_count":19,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-03-23T15:33:41.924Z","etag":null,"topics":["fancontroller","ipmi","linux","supermicro","systemd-service"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/petersulyok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-16T22:58:16.000Z","updated_at":"2025-03-23T14:56:07.000Z","dependencies_parsed_at":"2023-10-24T17:29:26.629Z","dependency_job_id":"bac237e7-6d34-4033-bc22-50da74b39c6b","html_url":"https://github.com/petersulyok/smfc","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petersulyok%2Fsmfc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petersulyok%2Fsmfc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petersulyok%2Fsmfc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petersulyok%2Fsmfc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/petersulyok","download_url":"https://codeload.github.com/petersulyok/smfc/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246063040,"owners_count":20717729,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fancontroller","ipmi","linux","supermicro","systemd-service"],"created_at":"2024-07-31T19:01:35.289Z","updated_at":"2026-04-02T16:53:25.359Z","avatar_url":"https://github.com/petersulyok.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"﻿\n# smfc\n[![Tests](https://github.com/petersulyok/smfc/actions/workflows/test.yml/badge.svg)\n](https://github.com/petersulyok/smfc/actions/workflows/test.yml) [![Codecov](https://codecov.io/gh/petersulyok/smfc/branch/main/graph/badge.svg)\n](https://app.codecov.io/gh/petersulyok/smfc) [![Issues](https://img.shields.io/github/issues/petersulyok/smfc)\n](https://github.com/petersulyok/smfc/issues) [![Supported Python Versions](https://img.shields.io/pypi/pyversions/smfc)](https://pypi.org/project/smfc)\n[![PyPI version](https://badge.fury.io/py/smfc.svg)](https://badge.fury.io/py/smfc)\n\nSupermicro fan control for Linux (home) servers.\n\n## TL;DR\n\nThis is a `systemd service` running on Linux that can control fans with the help of IPMI on Supermicro X10-X13/H10-H13 (and some X9) motherboards.\n\n### 1. Prerequisites\n - a Supermicro motherboard with ASPEED AST2400/2500/2600 chip\n - Python 3.10-3.14\n - a Linux distribution with:\n   - `systemd` and `bash`\n   - `coretemp` kernel module for Intel CPUs or `k10temp` kernel module for AMD CPUs\n   - `drivetemp` kernel module (kernel version 5.6+ required) for SATA HDDs/SSDs\n - `ipmitool`\n - optional: `smartmontools` for SAS/SCSI disks and *standby guard* feature\n - optional: `nvidia-smi` for GPU fan controller \n\n\n### 2. Installation and configuration\n 1. Set up the IPMI threshold values for your fans (see [chapter 6.](https://github.com/petersulyok/smfc/tree/main?tab=readme-ov-file#6-ipmi-fan-control-and-sensor-thresholds) for more details) \n 2. Optional: enable advanced power management features for your CPU and SATA hard disks for lower power consumption, heat generation and fan noise. \n 3. Load kernel modules (`coretemp/k10temp` and `drivetemp`)\n 4. Install `smfc` service (see [chapter 9.](https://github.com/petersulyok/smfc?tab=readme-ov-file#9-installation-and-uninstallation) for more details)\n    or run `smfc` in docker (see more details in [Docker.md](docker/Docker.md))\n 5. Edit the configuration file `/etc/smfc/smfc.conf` and command line options in `/etc/default/smfc` (see [chapter 10.](https://github.com/petersulyok/smfc/tree/main?tab=readme-ov-file#10-configuration-file) for more details).\n 6. Start `smfc` service (see [chapter 11.](https://github.com/petersulyok/smfc/tree/main?tab=readme-ov-file#11-how-to-run-smfc) for more details)\n 7. Check results in system log\n 8. Leave feedback in [discussion #55](https://github.com/petersulyok/smfc/discussions/55)\n\nFeel free to visit [Discussions](https://github.com/petersulyok/smfc/discussions) and raise your questions or share your experience on this project.\n\n## Details\n### 1. How does it work?\nThis service was designed for Supermicro motherboards with IPMI functionality. It implements fan controllers that control\nfan speed dynamically in one or more IPMI zones. The service operates the fans in IPMI FULL mode, where the fan rotation level\ncan be adjusted with IPMI raw commands (read [more details here](https://forums.servethehome.com/index.php?resources/supermicro-x9-x10-x11-fan-speed-control.20/)).\n\n#### 1.1 IPMI zones\n_IPMI zone_ is a logical term, representing a cooling zone, where there are predefined fans having the same rotation speed.\nPlease note that the fan assignment to an IPMI zone is predefined on the motherboard, it cannot be changed (Supermicro does not \nprovide individual fan configuration features in IPMI, while other vendors do it). On a typical Supermicro motherboard, there are two IPMI zones:\n\n- CPU or System zone (IPMI zone 0) with fan names: FAN1, FAN2, etc.\n- Peripheral or HD zone (IPMI zone 1) with fan names: FANA, FANB, etc.\n\nOn Supermicro server boards, there could be more IPMI zones with different fan names (see [issue #31](https://github.com/petersulyok/smfc/issues/31)). \n\n\u003e `smfc v3.8.0` and earlier versions implemented a feature (called _Swapped Zones_) to swap IPMI zone 0 and 1. From `smfc v4.0.0` the IPMI zones can be assigned freely to fan controllers providing more freedom and convenience for the user (see `ipmi_zone=` parameter for more details).  \n\n#### 1.2 Fan controllers\nIn `smfc`, the following fan controllers are implemented:\n\n| Fan controller | Temperature source      | Configuration                                                         | Default IPMI zone   |\n|----------------|-------------------------|-----------------------------------------------------------------------|---------------------|\n| CPU            | Intel/AMD CPU(s)        | CPUs are identified automatically                                     | 0 (CPU zone)        |\n| HD             | SATA and SCSI HDDs/SSDs | Hard disks' names must be specified in `[HD] hd_names=` parameter     | 1 (Peripheral zone) |\n| NVME           | NVMe SSDs               | NVMe device names must be specified in `[NVME] nvme_names=` parameter | 1 (Peripheral zone) |\n| GPU            | Nvidia GPUs             | GPU indices must be specified in `[GPU] gpu_device_ids=` parameter    | 1 (Peripheral zone) |\n| CONST          | None                    | Constant fan level can be specified in `[CONST] level=` parameter     | 1 (Peripheral zone) |\n\nThese fan controllers can be enabled and disabled independently. They can be used in a free combination with one or more IPMI zones. Multiple fan controllers\ncan share the same IPMI zone -- `smfc` will automatically apply the **highest** fan level requested by any controller in that zone (see [chapter 1.3](#13-shared-ipmi-zone-arbitration) for details).\n_CONST fan controller_ is an exception here, it does not require a temperature source, it can provide a constant fan level for one or more IPMI zones.\nIn `smfc` configuration file each fan controller has an individual section.\n\nIn `smfc`, a temperature-driven fan controller implements the following control logic:\n\n 1. it reads the temperature\n 2. it calculates a new fan level based on the user-defined control function and the temperature value\n 3. the service applies the fan level for the IPMI zone(s) with IPMI commands (i.e. `ipmitool`)\n\n\u003cimg src=\"https://github.com/petersulyok/smfc/raw/main/doc/smfc_overview.png\" align=\"center\" width=\"600\"\u003e\n\nIf the temperature source has multiple instances (e.g. multiple CPUs, HDDs, NVMEs or GPUs) then the user can configure a calculation method (i.e. minimum, average, maximum) for the calculation of the final temperature value (see `temp_calc=` parameter).\n\nPlease note that `smfc` will set all fans back to 100% speed at service termination to avoid overheating!\n\n#### 1.3 Shared IPMI zone arbitration\nWhen multiple fan controllers are assigned to the same IPMI zone, `smfc` detects this at startup and automatically switches to a two-phase arbitration loop for those controllers. Controllers on non-shared zones are not affected -- they apply their fan levels directly.\n\nAt startup, `smfc` logs the detected shared zones at INFO level:\n\n```\nShared IPMI zone 1: ['HD', 'NVME', 'CONST']\n```\n\nFor shared zones, the control loop uses a two-phase approach in each iteration:\n\n 1. **Compute phase**: each fan controller on a shared zone reads its temperature source and calculates its desired fan level, but defers the IPMI call.\n 2. **Apply phase**: the service collects all desired levels, groups them by IPMI zone, and applies the **maximum** level per zone. Only one IPMI command is sent per zone, and only when the level has actually changed.\n\nControllers on non-shared zones skip the apply phase entirely -- they execute their own IPMI calls directly during the compute phase, just like they would if no sharing existed.\n\nThis means the hottest component always wins on a shared zone. For example, if HD fan controller wants 45% on zone 1 and NVME fan controller wants 70% on the same zone, `smfc` will set zone 1 to 70%. When the NVME cools down below the HD temperature, the HD controller's level will take over.\n\nThe CONST fan controller also participates in the arbitration -- its constant level acts as a guaranteed minimum for its zone(s). For example, configuring `[CONST] level=40` on zone 1 ensures that zone never drops below 40%, even if all temperature-driven controllers would request a lower value.\n\nWhen a shared zone's level changes, the log output at INFO level shows the winning controller and lists all other controllers with their requested levels:\n\n```\nShared IPMI zone [1]: new level = 70% (winner: NVME=70%/52.0C, losers: HD=45%/38.5C, CONST=40%)\n```\n\nFor non-shared zones, only the applied level is logged:\n\n```\nIPMI zone [0]: new level = 60% (CPU=45.0C)\n```\n\n### 2. User-defined control function\nFan controllers use user-defined control functions that map a temperature interval to a fan rotation level interval.\n\n \u003cimg src=\"https://github.com/petersulyok/smfc/raw/main/doc/userdefined_control_function.png\" align=\"center\" width=\"500\"\u003e\n\nThe following five parameters will define such a function:\n\n     min_temp=\n     max_temp=\n     min_level=\n     max_level=\n     steps=\n\nIn this way, a fan controller can map any new temperature value to a fan level (from Celsius degrees to % value).   \nChanging the fan rotational speed is a very slow process (it could take several seconds depending on the fan type and the requested amount of change), so we try to minimize these kinds of actions. Instead of setting fan rotational speed continuously, we define discrete fan levels based on `steps=` parameter.\n\n \u003cimg src=\"https://github.com/petersulyok/smfc/raw/main/doc/fan_output_levels.png\" align=\"center\" width=\"500\"\u003e\n\nThe fan controllers implement the following strategies to avoid/minimize the unnecessary change of fan rotation speed:\n\n 1. When the fan rotational speed is changed, it always applies a delay time (defined in `[IPMI] fan_level_delay=` configuration parameter) to let the fan implement the physical change.\n 2. There is a sensitivity threshold parameter (`sensitivity=`) in the fan controller configuration. While the temperature change is below this value, the fan controller does not react. \n 3. The configuration parameter `polling=` defines the frequency of the temperature reading. The bigger polling time, the lower frequency of the fan speed change.\n\n### 3. Standby guard\nFor the HD fan controller, an additional optional feature was implemented, called *Standby guard*, with the following assumptions:\n\t\n - SATA hard disks are organized into a RAID array\n - the RAID array will go to standby mode recurrently\n\nThis feature monitors the power state of SATA hard disks (with the help of `smartctl`) and will put the whole array into standby mode if a few members have already stepped into that state. With this feature, the situation can be avoided where the array is partially in standby mode while other members are still active.\nSCSI disks are not compatible with this feature.\n\n### 4. Hard disk compatibility\nThe following table summarizes how the temperature is read for different disk types: \n\n| Disk type  | Temperature source   | Kernel module | Command    |\n|------------|----------------------|---------------|------------|\n| `SATA`     | Linux kernel (HWMON) | `drivetemp`   | -          |\n| `NVME`     | Linux kernel (HWMON) | -             | -          |\n| `SAS/SCSI` | `smartctl`           | -             | `smartctl` |\n\n\n\u003e The `smfc` service was originally designed for `SATA` hard drives, but from `smfc v3.0.0`, it is also compatible with `NVME` and `SAS/SCSI` disks.\n\u003e `smfc v5.0.0` introduced a new NVME fan controller and separated the use of SATA and SAS/SCSI HDDs/SSDs and NVME SSD disks.  \n\nSome additional notes:\n\n- For `SATA` disks the `drivetemp` kernel module should be loaded. **This is the fastest way to read disk temperature**, and the kernel module can report the temperature while hard disks are in sleep mode!\n- For `SAS/SCSI` disks the `smartctl` command will be used to read disk temperature.\n- If `drivetemp` module is not loaded or an HDD is not compatible with `drivetemp` module then `smfc` will use `smartctl` automatically.   \n- Different disks types can be mixed in `hd_names=` configuration parameter but the *Standby guard* feature will not be supported in this case.\n- For `NVME` SSDs, no kernel driver needs to be loaded; the kernel can handle this disk type automatically\n- NVME SSDs can be used in [NVME] fan controller and [HD] fan controller does not accept them anymore.\n\n\n### 5. Supermicro compatibility\nFeel free to create a short feedback in [discussion #55](https://github.com/petersulyok/smfc/discussions/55) on your compatibility experience.\n\n#### 5.1 Supermicro X10-X13/H10-H13 motherboards\nOriginally, this software was designed to work with Supermicro X10-X12/H10-H12 motherboards with IPMI functionality,\nwhere the BMC chip is ASPEED AST2400 or AST2500. Most motherboards in this set are compatible with the Supermicro IPMI\nraw commands used here and are supported out of the box.\n\nNewer X13/H13 motherboards with AST2600 chips are also compatible with `smfc` (see more details in [issue #33](https://github.com/petersulyok/smfc/issues/33) about\nan X13SAE-F motherboard). The only difference is in the implementation of thresholds: the AST2600 chip implements only the\n`Lower Critical` threshold, so setting up thresholds is different.\n\nSome motherboards require platform-specific IPMI raw commands for fan control. `smfc` implements a **platform abstraction**\n(since `smfc v5.1.0`) that handles these differences. The platform is auto-detected from BMC product name, or can be overridden with the\n`platform_name=` configuration parameter (see [chapter 10.2](https://github.com/petersulyok/smfc/tree/main?tab=readme-ov-file#102-sample-configuration-file)). Currently supported platforms:\n\n| `platform_name=` parameter | Platform                                     | Notes                                                                                            |\n|----------------------------|----------------------------------------------|--------------------------------------------------------------------------------------------------|\n| `auto`                     | automatic discovery based on BMC information | Default behaviour                                                                                |\n| `generic`                  | Generic X10-X13/H10-H13 Supermicro boards   | Uses standard Supermicro IPMI raw commands                                                      |\n| `genericx9`                | Generic Supermicro X9 boards                 | 4 fan zones (0x10-0x13), duty cycle 0-255 scale                                                                                                                                    |\n| `X10QBi`                   | Supermicro X10QBi motherboard               | Nuvoton NCT7904D fan controller, 4 fan zones (0x10-0x13), see [issue #69](https://github.com/petersulyok/smfc/issues/69) and [PR #97](https://github.com/petersulyok/smfc/pull/97) |\n\nWith this abstraction layer, new Supermicro motherboards can also be added to `smfc` with a good understanding of their IPMI raw commands and fan control logic.\n\n#### 5.2 Supermicro X14/H14 motherboards\nFor the newer X14/H14 motherboards, compatibility is still being investigated. There are some issues ([#98](https://github.com/petersulyok/smfc/issues/98)) and discussions ([#92](https://github.com/petersulyok/smfc/discussions/92), [#106](https://github.com/petersulyok/smfc/discussions/106)) about this to get better understanding.\n\n#### 5.3 Supermicro X9 motherboards\nSome X9 motherboards are supported (since `smfc v5.2.0`) via the `genericx9` platform, provided they support the specific IPMI raw commands used for fan control. There is no auto-detection for X9 boards, so you must set `platform_name=genericx9` in the configuration file.\n\n#### 5.4 Supermicro X8 motherboards\nThe earlier X8 motherboards are NOT compatible with this software. They do not implement `IPMI FULL` mode, and they cannot control fan levels with IPMI raw commands.\n\n\n### 6. IPMI fan control and sensor thresholds\nOn Supermicro X10-X11 motherboards IPMI uses six sensor thresholds to specify the safe and unsafe fan rotational speed intervals (these are RPM values rounded to the nearest hundreds, defined for each fan separately):\n\n```\nLower Non-Recoverable  \nLower Critical  \nLower Non-Critical\nUpper Non-Critical  \nUpper Critical  \nUpper Non-Recoverable\n```\n\nbut newer Supermicro X13 motherboards (with AST2600 BMC chip) have only one sensor threshold:\n\n```\nLower Critical  \n```\n\nOriginally, this chapter was created for Supermicro X10-X11 motherboards, but can be easily adapted to X13 motherboards as well (see more details in #33).\n\nLike many other utilities (created by NAS and home server community), `smfc` also uses **IPMI FULL mode** for fan control, where all fans in the zone:\n\n   1. initially configured to full speed (100%)\n   2. then their speed can be safely configured in `[Lower Critical, Upper Critical]` interval\n   3. if any fan speed oversteps either `Lower Critical` or `Upper Critical` threshold then IPMI will generate an _assertion event_ and will set all fan speeds back to 100% in the zone\n\nPlease also consider the fact that **fans are mechanical devices, their rotational speed is not stable** (it could be fluctuating). To avoid IPMI's assertion mechanism described here please follow the next steps: \n\n  1. Per fan: check the minimum and maximum rotational speeds of your fan on its vendor website\n  2. Per fan: configure proper IPMI sensor thresholds adjusted to the fan speed interval\n  3. Per zone: define safe `min_level`/`max_level` values for `smfc` respecting the variance of all fans in the IPMI zone (it could take several iterations and adjustments) \n\n\u003cimg src=\"https://github.com/petersulyok/smfc/raw/main/doc/ipmi_sensor_threshold.png\" align=\"center\" width=\"600\"\u003e\n\nHere is a real-life example for a [Noctua NF-F12 PWM](https://noctua.at/en/products/fan/nf-f12-pwm) fan:\n\n```\nUpper Non-Recoverable = 1800 rpm\nUpper Critical = 1700 rpm\nUpper Non-Critical = 1600 rpm\nLower Non-Critical = 200 rpm\nLower Critical = 100 rpm\nLower Non-Recoverable = 0 rpm\nMax RPM = 1500 rpm\nMin RPM = 300 rpm\nmax_level = 100 (i.e. 1500 rpm)\nmin_level = 35 (i.e. 500 rpm)\n```\n\n\nNotes:\n  - Use the following `ipmitool` command to display the current IPMI sensor thresholds for fans:\n    ```\n    root@home:~# ipmitool sensor|grep FAN\n    FAN1             | 500.000    | RPM        | ok    | 0.000     | 100.000   | 200.000   | 1600.000  | 1700.000  | 1800.000  \n    FAN2             | 500.000    | RPM        | ok    | 0.000     | 100.000   | 200.000   | 1600.000  | 1700.000  | 1800.000  \n    FAN3             | na         |            | na    | na        | na        | na        | na        | na        | na        \n    FAN4             | 400.000    | RPM        | ok    | 0.000     | 100.000   | 200.000   | 1600.000  | 1700.000  | 1800.000  \n    FANA             | 500.000    | RPM        | ok    | 0.000     | 100.000   | 200.000   | 1600.000  | 1700.000  | 1800.000  \n    FANB             | 500.000    | RPM        | ok    | 0.000     | 100.000   | 200.000   | 1600.000  | 1700.000  | 1800.000  \n    ```\n  - Use the following `ipmitool` command to list assertion events:\n    ```\n    root@home:~# ipmitool sel list\n       1 | 10/19/2023 | 05:15:35 PM CEST | Fan #0x46 | Lower Critical going low  | Asserted\n       2 | 10/19/2023 | 05:15:35 PM CEST | Fan #0x46 | Lower Non-recoverable going low  | Asserted\n       3 | 10/19/2023 | 05:15:38 PM CEST | Fan #0x46 | Lower Non-recoverable going low  | Deasserted\n       4 | 10/19/2023 | 05:15:38 PM CEST | Fan #0x46 | Lower Critical going low  | Deasserted\n       5 | 10/19/2023 | 05:20:59 PM CEST | Fan #0x46 | Lower Critical going low  | Asserted\n    ```\n  - Use the following `ipmitool` commands to specify all six sensor thresholds for FAN1:\n    ```\n    root@home:~# ipmitool sensor thresh FAN1 lower 0 100 200\n    root@home:~# ipmitool sensor thresh FAN1 upper 1600 1700 1800\n    ```\n  - You can also edit and run `ipmi/set_ipmi_threshold.sh` to configure all IPMI sensor thresholds\n  - If you install new BMC firmware on your Supermicro motherboard, you have to configure IPMI thresholds again\n  - If you do not see fans when executing `ipmitool sensors`, you may want to reset the BMC to factory default using the Web UI or using `ipmitool mc reset cold`\n  - Noctua specifies the variance of minimum and maximum fan rotational speeds (e.g. see the [specification of Noctua NF-F12 PWM](https://noctua.at/en/products/fan/nf-f12-pwm/specification)). For example:\n\n    - `Rotational speed (+/- 10%) 1500 RPM`: 1350-1650 RPM interval\n    - `Min. rotational speed @ 20% PWM (+/-20%) 300 RPM`: 240-360 RPM interval\n    \n    Please note that [LNA](https://noctua.at/en/na-src10)/ULNA cables or [Y-cables](https://noctua.at/en/na-syc1) can modify the rotational speed calculations here and the required IPMI sensor thresholds too. \n\nYou can read more about:\n\n - IPMI fan control: [STH Forums](https://forums.servethehome.com/index.php?resources/supermicro-x9-x10-x11-fan-speed-control.20/) and [TrueNAS Forums](https://www.truenas.com/community/threads/pid-fan-controller-perl-script.50908/)\n - Change IPMI sensors thresholds: [TrueNAS Forums](https://www.truenas.com/community/resources/how-to-change-ipmi-sensor-thresholds-using-ipmitool.35/)\n\n### 7. Power management\nIf low noise and low heat generation are important attributes of your Linux box, then you may consider the following chapters.\n\n#### 7.1 CPU\nMost modern CPUs have multiple energy-saving features. You can check your BIOS and enable them to minimize the heat generation.\n\nIntel(R) CPUs:\n - Intel(R) Speed Shift Technology\n - Intel(R) SpeedStep\n - C-states\n - Boot performance mode\n\nAMD(R) CPUs:\n - PowerNow!\n - Cool\\`n\\`quiet\n - Turbo Core\n\nWith this setup the CPU will change its base frequency and power consumption dynamically based on the load.\n\n#### 7.2 SATA hard disks\nIn case of SATA hard disks, you may enable:\n\n - advanced power management\n - spin down timer\n\nWith the help of command `hdparm` you can enable advanced power management and specify a spin down timer (read more [here](https://en.wikipedia.org/wiki/Hdparm)):\n\n\thdparm -B 127 /dev/sda\n\thdparm -S 240 /dev/sda\n\t\nIn file `/etc/hdparm.conf` you can specify all parameters persistently:\n\n\tquiet\n\n\t/dev/sda {\n        apm = 127\n        spindown_time = 240\n\t}\n\t/dev/sdb {\n        apm = 127\n        spindown_time = 240\n\t}\n\t...\n\nImportant notes: \n 1. If you plan to spin down your hard disks or RAID array (i.e. put them to standby mode) you have to set up the configuration parameter `[HD] polling=` to at least twice as big as the `spindown_time` specified here.\n 2. In file `/etc/hdparm.conf` you must define HD names in `/dev/disk/by-id/...` form to avoid inconsistency.\n\n### 8. Kernel modules\nOne or more of the following Linux kernel modules need to be loaded for `smfc`:\n\n - [`coretemp`](https://www.kernel.org/doc/html/latest/hwmon/coretemp.html): temperature report for Intel(R) CPUs\n - [`k10temp`](https://docs.kernel.org/hwmon/k10temp.html): temperature report for AMD(R) CPUs\n - [`drivetemp`](https://www.kernel.org/doc/html/latest/hwmon/drivetemp.html): temperature report for SATA hard disks (available from kernel 5.6+ version)\n\nUse `/etc/modules` file for persistent loading of these modules. \n\nNotes:\n- Reading `drivetemp` module is the fastest way to get the temperature of the hard disks, and it can read temperature of the SATA hard disks even if they are in standby mode.\n\n\n### 9. Installation and uninstallation\nFor the installation and uninstallation, you need root privileges. There are several ways to install and uninstall `smfc`, this chapter will show them.\n\n#### 9.1. Manual installation and uninstallation\nThere is an installation script ([`bin/install.sh`](https://raw.githubusercontent.com/petersulyok/smfc/refs/heads/main/bin/install.sh)) which can install `smfc` in two different ways:\n- remotely from the GitHub repository (no cloning required)\n- locally from a git repository (GitHub repository needs to be cloned)\n\nThe installation script requires `curl`, `pip`, `gzip`, and `mandb` commands, and it has the following\ncommand line parameters:\n\n```\nuser@host:~$ ./install.sh --help\nusage: install.sh [-h|--help] [-k|--keep-config] [-l|--local] [-v|--verbose]\n           -h, --help         help text\n           -k, --keep-config  keep original configuration file\n           -l, --local        installation from a local git repository\n           -v, --verbose      verbose output\n```\n\nThe default location of the installed files: \n\n| Files          | Installation folder                                        | Description                     |\n|----------------|------------------------------------------------------------|---------------------------------|\n| `smfc.service` | `/etc/systemd/system`                                      | systemd service definition file |\n| `smfc`         | `/etc/default`                                             | service command line options    |\n| `smfc.conf`    | `/etc/smfc`                                                | service configuration file      |\n| `smfc.1.gz`    | `/usr/local/share/man/man1`                                | smfc manual page                | \n| `smfc`         | `/usr/local/bin` or \u003c/br\u003e `/usr/bin`                       | smfc command                    |\n| `smfc service` | `/usr/local/lib/python3.xx` or \u003c/br\u003e `/usr/lib/python3.xx` | smfc python package             |\n\nNotes for the script:\n- Different Linux distros install python package to different folders (it was tested on Ubuntu 24.04, Debian 13,\nSuse Leap 15, Proxmox 9, and Arch Linux)\n- Installation process will stop for any error\n- The default installation method is the remote installation\n- Using `--local` parameter will do installation locally, from the current folder (i.e. GitHub repository needs to be cloned)\n- The default action is the following:\n  - the existing previous configuration file will be renamed\n  - a new configuration file will be installed\n  - `hd_names=` configuration parameter will be pre-filled with the list of existing hard disks for user's convenience\n    (please check/edit this parameter!)\n- Using `--keep-config` parameter, the original configuration file will be preserved\n- Using `--verbose` parameter, the phases of the installation will be displayed \n\nFor remote installation the script can be executed (as root user) this way:\n\n```\ncurl --silent https://raw.githubusercontent.com/petersulyok/smfc/refs/heads/main/bin/install.sh|bash /dev/stdin --verbose\n```\n\nor if you want to preserve your existing configuration file:\n\n```\ncurl --silent https://raw.githubusercontent.com/petersulyok/smfc/refs/heads/main/bin/install.sh|bash /dev/stdin --verbose --keep-config\n```\n\nFor local installation follow these steps (here [`uv` command](https://docs.astral.sh/uv/getting-started/installation/) is also required):\n\n```\ngit clone https://github.com/petersulyok/smfc.git\ncd smfc\nuv sync\nuv build\n./bin/install.sh --local --verbose --keep-config\n```\n\nHere we clone the GitHub repository and make the `smfc` package locally before installation.\n\nOn the other hand, there is an uninstallation script ([`bin/uninstall.sh`](https://raw.githubusercontent.com/petersulyok/smfc/refs/heads/main/bin/uninstall.sh)) which can uninstall `smfc`.\nThis script has the following command line parameters:\n\n```\nuser@host:~$ ./uninstall.sh --help\nusage: uninstall.sh [-h|--help] [-k|--keep-config] [-v|--verbose]\n           -h, --help         help text\n           -k, --keep-config  keep original configuration file\n           -v, --verbose      verbose output\n```\n\nThis script can be executed locally and remotely as described for installation above. Here is an example for remote execution: \n\n```\ncurl --silent https://raw.githubusercontent.com/petersulyok/smfc/refs/heads/main/bin/uninstall.sh|bash /dev/stdin --verbose\n```\n\nThe script will remove the installed `smfc` files and the python package.\n\n#### 9.2. DEB and RPM package installation\nPre-built DEB and RPM packages are available as build artifacts from the [GitHub packages workflow](https://github.com/petersulyok/smfc/actions/workflows/packages.yml) on each release. You can also build them locally from the repository.\n\nFor Debian/Ubuntu systems:\n\n```\nsudo dpkg -i smfc_*.deb\n```\n\nFor Fedora/RHEL systems:\n\n```\nsudo dnf install smfc-*.rpm\n```\n\nThe packages install the same files as the manual installation (service unit, configuration, man page, and sample configs). Configuration files under `/etc/` are preserved on upgrade. See [PACKAGES.md](PACKAGES.md) for build instructions and compatible distributions.\n\n#### 9.3. Docker installation\n`smfc` is also available as a docker image, see more details in [Docker.md](docker/Docker.md). In this case, your job is only to provide your configuration file on the host computer, `smfc` will be executed automatically when the container is starting. \n\n### 10. Configuration file\nAfter successful installation, create/edit your new configuration file. If you just upgraded to a new `smfc` version, you can preserve the existing one. \n\n#### 10.1 Right strategy to create your configuration file\nYou have to think over and answer the following questions:\n\n1. What are the most important heat sources in your machine? Typically, these could be CPU(s), hard disks, or GPUs.\n2. Which fan controller would you like to use and configure in `smfc`?\n3. What is the expected temperature interval (minimum/maximum C degree) for the selected temperature source(s)? Use some test tools to measure it (e.g. [`s-tui`](https://github.com/amanusk/s-tui), [`fio`](https://fio.readthedocs.io/en/latest/fio_doc.html), [`iozone`](https://www.iozone.org/)) if you don't have their track records.  \n4. Which IPMI zone(s) will be connected to these fan controllers/temperature sources)? Check how many IPMI zones you have, how the fans are connected on your motherboard, and how they are cooling the selected temperature source(s). Multiple controllers can share the same zone -- the highest requested level will be applied automatically.\n5. What is the stable level interval for fans in the selected IPMI zone(s)? Probably this part requires the most patience! You have assumptions here that need to be verified. If you experience IPMI assertions and your fans are spinning up then you have to refine the level interval or threshold configuration and try again. You will have several cycles here, this is normal. \n\n#### 10.2 Sample configuration file\nThe configuration file contains sections. The first one for IPMI configuration, the rest for fan controllers.\nEdit `/etc/smfc/smfc.conf` and specify your configuration parameters here:\n\n```\n#\n#   smfc.conf (C) 2020-2026, Peter Sulyok\n#   smfc 5.x service configuration parameters\n#\n#   Please read the documentation here: https://github.com/petersulyok/smfc\n#\n\n# Ipmi specific parameters.\n[Ipmi]\n# Path for ipmitool (str, default=/usr/bin/ipmitool)\ncommand=/usr/bin/ipmitool \n# Delay time after changing IPMI fan mode (int, seconds, default=10)\nfan_mode_delay=10\n# Delay time after changing IPMI fan level (int, seconds, default=2)\nfan_level_delay=2\n# IPMI parameters for remote access (string, default='')\n#remote_parameters=-U USERNAME -P PASSWORD -H HOST\n# Supermicro platform (string, default='auto')\n# Potential values:\n#  auto       - automatic discovery based on BMC information\n#  generic    - Generic Supermicro X10-X13/H10-H13 platform\n#  genericx9  - Generic Supermicro X9 platform\n#  X10QBi     - Supermicro X10QBi platform\nplatform_name=auto\n\n\n# CPU fan controller: works based on CPU(s) temperature.\n[CPU]\n# Fan controller enabled (bool, default=0)\nenabled=1\n# IPMI zone(s) (comma- or space-separated list of int, default=0))\nipmi_zone=0\n# Calculation method for CPU temperatures (int, [0-minimum, 1-average, 2-maximum], default=1)\ntemp_calc=1\n# Discrete steps in mapping of temperatures to fan level (int, default=6)\nsteps=6\n# Threshold in temperature change before the fan controller reacts (float, C, default=3.0)\nsensitivity=3.0\n# Polling time interval for reading temperature (int, sec, default=2)\npolling=2\n# Minimum CPU temperature (float, C, default=30.0)\nmin_temp=30.0\n# Maximum CPU temperature (float, C, default=60.0)\nmax_temp=60.0\n# Minimum CPU fan level (int, %, default=35)\nmin_level=35\n# Maximum CPU fan level (int, %, default=100)\nmax_level=100\n\n\n# HD fan controller: works based on SATA or SAS HDDs/SSDs temperature.\n[HD]\n# Fan controller enabled (bool, default=0)\nenabled=1\n# IPMI zone(s) (comma- or space-separated list of int, default=1))\nipmi_zone=1\n# Calculation of HD temperatures (int, [0-minimum, 1-average, 2-maximum], default=1)\ntemp_calc=1\n# Discrete steps in mapping of temperatures to fan level (int, default=4)\nsteps=4\n# Threshold in temperature change before the fan controller reacts (float, C, default=2.0)\nsensitivity=2.0\n# Polling interval for reading temperature (int, sec, default=10)\npolling=10\n# Minimum HD temperature (float, C, default=32.0)\nmin_temp=32.0\n# Maximum HD temperature (float, C, default=46.0)\nmax_temp=46.0\n# Minimum HD fan level (int, %, default=35)\nmin_level=35\n# Maximum HD fan level (int, %, default=100)\nmax_level=100\n# Names of the HDs (str multi-line list, default=)\n# MUST BE specified in '/dev/disk/by-id/...' form, for example:\n# hd_names=/dev/disk/by-id/ata-WDC_WD100EFAX-68LHPN0_8CH7T91E\n#\t/dev/disk/by-id/ata-WDC_WD100EFAX-68LHPN0_8CH7T813\n#\t/dev/disk/by-id/ata-WDC_WD100EFAX-68LHPN0_8CHUFFRE\nhd_names=\n# Path for 'smartctl' command (str, default=/usr/sbin/smartctl).\nsmartctl_path=/usr/sbin/smartctl\n# Standby guard feature for RAID arrays (bool, default=0)\nstandby_guard_enabled=0\n# Number of HDs already in STANDBY state before the full RAID array will be forced to it (int, default=1)\nstandby_hd_limit=1\n\n\n# NVME fan controller: works based on NVMe SSD(s) temperature.\n[NVME]\n# Fan controller enabled (bool, default=0)\nenabled=0\n# IPMI zone(s) (comma- or space-separated list of int, default=1))\nipmi_zone=1\n# Calculation of NVMe temperatures (int, [0-minimum, 1-average, 2-maximum], default=1)\ntemp_calc=1\n# Discrete steps in mapping of temperatures to fan level (int, default=4)\nsteps=4\n# Threshold in temperature change before the fan controller reacts (float, C, default=2.0)\nsensitivity=2.0\n# Polling interval for reading temperature (int, sec, default=10)\npolling=10\n# Minimum NVMe temperature (float, C, default=35.0)\nmin_temp=35.0\n# Maximum NVMe temperature (float, C, default=70.0)\nmax_temp=70.0\n# Minimum NVMe fan level (int, %, default=35)\nmin_level=35\n# Maximum NVMe fan level (int, %, default=100)\nmax_level=100\n# Names of the NVMe devices (str multi-line list, default=)\n# MUST BE specified in '/dev/disk/by-id/...' form, for example:\n# nvme_names=/dev/disk/by-id/nvme-ADATA_LEGEND_650_2OFF29AO8DKR\n#\t/dev/disk/by-id/nvme-CT4000P3PSSD7_2446E89408FA\nnvme_names=\n\n\n# GPU fan controller: works based on Nvidia GPU(s) temperature.\n[GPU]\n# Fan controller enabled (bool, default=0)\nenabled=0\n# IPMI zone(s) (comma- or space-separated list of int, default=1))\nipmi_zone=1\n# Calculation of GPU temperatures (int, [0-minimum, 1-average, 2-maximum], default=1)\ntemp_calc=1\n# Discrete steps in mapping of temperatures to fan level (int, default=5)\nsteps=5\n# Threshold in temperature change before the fan controller reacts (float, C, default=2.0)\nsensitivity=2.0\n# Polling interval for reading temperature (int, sec, default=10)\npolling=2\n# Minimum GPU temperature (float, C, default=40.0)\nmin_temp=40.0\n# Maximum GPU temperature (float, C, default=70.0)\nmax_temp=70.0\n# Minimum GPU fan level (int, %, default=35)\nmin_level=35\n# Maximum GPU fan level (int, %, default=100)\nmax_level=100\n# GPU device IDs (comma- or space-separated list of int, default=0)\n# These are indices in nvidia-smi temperature report.\ngpu_device_ids=0\n# Path for 'nvidia-smi' command (str, default=/usr/bin/nvidia-smi).\nnvidia_smi_path=/usr/bin/nvidia-smi\n\n\n# CONST fan controller: sets constant fan level (without any heat source) for IPMI zones(s).\n[CONST]\n# Fan controller enabled (bool, default=0)\nenabled=0\n# IPMI zone(s) (comma- or space-separated list of int, default=1))\nipmi_zone=1\n# Polling interval for checking/resetting level if needed (int, sec, default=30)\npolling=30\n# Constant fan level (int, %, default=50)\nlevel=50\n```\n\nImportant notes:\n1. `[Ipmi] remote_parameters=-U USERNAME -P PASSWORD -H HOST` parameter can be used for remote access for the IPMI interface. It could be useful for a VM setup where the hard disks are configured with PCI passthrough (e.g. a TrueNAS running in a VM on Proxmox), but IPMI needs to be accessed \"remotely\". Please note that the HOST is the BMC network address (not the VM host address).\n2. `[HD] hd_names=` is a compulsory parameter for HD fan controller, and it must be specified in `/dev/disk/by-id/...` form. Please note that the `/dev/sda` form is not persistent and could change after a reboot!\n3. `[NVME] nvme_names=` is a compulsory parameter for NVME fan controller, and it must be specified in `/dev/disk/by-id/...` form. Please note that the `/dev/nvme0n1` form is not persistent and could change after a reboot!\n4. `[CPU] / [HD] / [NVME] min_level= / max_level=` should be configured in alignment with threshold configuration (see more details in [this chapter](https://github.com/petersulyok/smfc/blob/main/README.md#6-ipmi-fan-control-and-sensor-thresholds)). Be patient, several refinement cycles could happen.\n5. Several sample configuration files are provided in `./config/samples` folder.\n6. Save/backup your configuration file when you've got the final version. Avoid overwriting if you upgrade to a new version of `smfc`.\n\n\n### 11. How to run `smfc`?\nAfter manual installation, `smfc` can be started and stopped as a standard `systemd` service. Remember to reload `systemd` configuration after a new installation or if you changed the service definition file:\n\n```\nsystemctl daemon-reload\nsystemctl start smfc.service\nsystemctl stop smfc.service\nsystemctl restart smfc.service\nsystemctl status smfc.service\n● smfc.service - Supermicro Fan Control\n     Loaded: loaded (/etc/systemd/system/smfc.service; enabled; preset: enabled)\n     Active: active (running) since Tue 2026-03-03 21:32:22 CET; 7min ago\n Invocation: b613d841e1cf43f4ace80d472623ed4c\n   Main PID: 82521 (smfc)\n      Tasks: 1 (limit: 154231)\n     Memory: 12M (peak: 19.5M)\n        CPU: 1.271s\n     CGroup: /system.slice/smfc.service\n             └─82521 /usr/bin/python3 /usr/local/bin/smfc -c /etc/smfc/smfc.conf -l 3\n\nMar 03 21:37:27 nas smfc.service[82521]: Shared IPMI zone [0]: new level = 67% (winner: CPU=67%/51.0C, losers: NVME=35%/37.9C)\nMar 03 21:37:30 nas smfc.service[82521]: Shared IPMI zone [0]: new level = 35% (winner: CPU=35%/31.0C, losers: NVME=35%/37.9C)\nMar 03 21:38:46 nas smfc.service[82521]: Shared IPMI zone [0]: new level = 67% (winner: CPU=67%/49.0C, losers: NVME=35%/37.9C)\nMar 03 21:38:49 nas smfc.service[82521]: Shared IPMI zone [0]: new level = 35% (winner: CPU=35%/31.0C, losers: NVME=35%/37.9C)\n```\n\nThe `smfc` program has the following parameters:\n\n```\nroot@nas$ smfc --help\nusage: smfc [-h] [-c CONFIG_FILE] [-v] [-l {0,1,2,3,4}] [-o {0,1,2}] [-nd] [-s] [-ne]\n\noptions:\n  -h, --help      show this help message and exit\n  -c CONFIG_FILE  configuration file (default is /etc/smfc/smfc.conf)\n  -v, --version   show program's version number and exit\n  -l {0,1,2,3,4}  set log level: 0-NONE, 1-ERROR(default), 2-CONFIG, 3-INFO, 4-DEBUG\n  -o {0,1,2}      set log output: 0-stdout, 1-stderr, 2-syslog(default)\n  -nd             no dependency checking at start\n  -s              use sudo command\n  -ne             no fan speed recovery at exit\n```\n\n`smfc` command-line options can be specified in `/etc/default/smfc` file if you run `smfc` as a systemd service. \n\nIf you are testing your configuration, you can start `smfc` directly in a terminal (logging to the standard output on debug log level):\n\n\tsmfc -o 0 -l 3\n\nIn case of Docker installation, `smfc` will be executed automatically when the container is started. Its command-line parameters can be specified in the docker-compose file. \n\n### 12. Checking the results and monitoring the logs\nAll messages will be logged to the specific output and the specific level.\nWith the help of command `journalctl` you can check logs easily. For example:\n\n1. listing service logs of the last two hours:\n\n\t\tjournalctl -u smfc --since \"2 hours ago\"\n\n2. listing service logs from the last boot:\n\n\t\tjournalctl -b -u smfc\n\n### 13. FAQ\n\n### Q: My fans are spinning up and loud. What's wrong?\nMost probably, there was an assertion (i.e., the rotational speed of a fan went above or below an IPMI threshold) and IPMI switched back that zone to full rotational speed.\nYou can check the current fan rotational speeds:\n\n\tipmitool sdr\n\nand you can also check IPMI event log and list assertion events:\n\n```\nroot@home:~# ipmitool sel list\n   1 | 10/19/2023 | 05:15:35 PM CEST | Fan #0x46 | Lower Critical going low  | Asserted\n   2 | 10/19/2023 | 05:15:35 PM CEST | Fan #0x46 | Lower Non-recoverable going low  | Asserted\n   3 | 10/19/2023 | 05:15:38 PM CEST | Fan #0x46 | Lower Non-recoverable going low  | Deasserted\n   4 | 10/19/2023 | 05:15:38 PM CEST | Fan #0x46 | Lower Critical going low  | Deasserted\n   5 | 10/19/2023 | 05:20:59 PM CEST | Fan #0x46 | Lower Critical going low  | Asserted\n```\n\nIf the problematic fan (causing the alert) is identified, then you must adjust its threshold. This process could take several adjustment cycles. Be patient :)\nYou may read [this chapter](https://github.com/petersulyok/smfc#6-ipmi-fan-control-and-sensor-thresholds) for more details. \n\n### Q: How does the author test/use this service?\nThe configuration is the following:\n\n - [Supermicro X11SCH-F motherboard](https://www.supermicro.com/en/products/motherboard/X11SCH-F)\n - [Intel (R) Xeon (R) E-2276G processor](https://www.intel.com/content/www/us/en/products/sku/191035/intel-xeon-e2276g-processor-12m-cache-3-80-ghz/specifications.html)\n - 128 GB ECC DDR4-2666MHz RAM\n - [Fractal Design Node 804 case](https://www.fractal-design.com/products/cases/node/node-804/black/), with separate chambers for the motherboard and the hard disks:\n \n\t\u003cimg src=\"https://www.legitreviews.com/wp-content/uploads/2014/05/fractal-design-node-804-vendor-fans.jpg\" align=\"center\" width=\"500\"\u003e\n\n - Proxmox 9\n - 8 x [WD Red 12TB (WD120EFAX)](https://shop.westerndigital.com/en-ie/products/outlet/internal-drives/wd-red-plus-sata-3-5-hdd#WD120EFAX) hard disks in ZFS RAID\n - 4 x [Noctua NF-F12 PWM](https://noctua.at/en/products/fan/nf-f12-pwm)  fans (FAN1, FAN2, FAN3, FAN4) in IPMI CPU zone\n - 2 x [Noctua NF-F12 PWM](https://noctua.at/en/products/fan/nf-f12-pwm) on an Y-adapter + [Noctua NF-A14 PWM](https://noctua.at/en/products/fan/nf-a14-pwm) fans (FANA, FANB) in IPMI HD zone\n\n### 14. References\nFurther readings:\n\n#### Supermicro\n - [BMC IPMI User's Guide 1.1b (X10/X11/H11)](https://www.supermicro.com/manuals/other/IPMI_Users_Guide.pdf)\n - [X9 SMM IPMI User's Guide](https://www.supermicro.com/manuals/other/X9_SMM_IPMI.pdf)\n - [Supermicro Management Software download](https://www.supermicro.com/en/solutions/management-software/bmc-resources)\n - [IPMI utilities overiew](https://www.supermicro.com/en/solutions/management-software/ipmi-utilities)\n - [IPMICFG User's Guide (1.18)](https://www.supermicro.com/Bios/sw_download/968/IPMICFG_UserGuide.pdf)\n\n#### Forums and blogs\n - [\\[STH forums\\] Reference Material: Supermicro X9/X10/X11 Fan Speed Control](https://forums.servethehome.com/index.php?resources/supermicro-x9-x10-x11-fan-speed-control.20/)\n   - [\\[STH forums\\] Addition to X9 motherboards](https://forums.servethehome.com/index.php?threads/supermicro-x9-x10-x11-fan-speed-control.10059/post-339801) \n - [\\[TrueNAS forums\\] How To: Change IPMI Sensor Thresholds using ipmitool](https://www.truenas.com/community/resources/how-to-change-ipmi-sensor-thresholds-using-ipmitool.35/)\n - [\\[TrueNAS forums\\] Script to control fan speed in response to hard drive temperatures](https://www.truenas.com/community/threads/script-to-control-fan-speed-in-response-to-hard-drive-temperatures.41294/)\n - [\\[Pcfe's blog\\] Set fan thresholds on my Supermicro H11DSi-NT](https://blog.pcfe.net/hugo/posts/2018-08-14-epyc-ipmi-fans/)\n\n#### Tools, standards and Linux kernel components\n - [IPMI v2.0 specification](https://www.intel.com/content/www/us/en/products/docs/servers/ipmi/ipmi-second-gen-interface-spec-v2-rev1-1.html) by Intel\n - [ipmitool](https://github.com/ipmitool/ipmitool) — CLI for managing IPMI-enabled devices\n - [smartmontools](https://www.smartmontools.org/) — S.M.A.R.T. monitoring tools for hard disks (`smartctl`)\n - [nvidia-smi](https://developer.nvidia.com/system-management-interface) — NVIDIA System Management Interface for GPU monitoring\n - [hwmon subsystem](https://www.kernel.org/doc/html/latest/hwmon/index.html) — hardware monitoring framework used for temperature readings\n - [coretemp](https://www.kernel.org/doc/html/latest/hwmon/coretemp.html) — Intel CPU temperature monitoring\n - [k10temp](https://docs.kernel.org/hwmon/k10temp.html) — AMD CPU temperature monitoring\n - [drivetemp](https://www.kernel.org/doc/html/latest/hwmon/drivetemp.html) — SATA disk temperature monitoring, and its [GitHub repository](https://github.com/groeck/drivetemp)\n \n#### Similar projects on GitHub\n - [\\[GitHub\\] Kevin Horton's nas_fan_control](https://github.com/khorton/nas_fan_control)    \n - [\\[GitHub\\] sretalla's fork nas_fan control](https://github.com/sretalla/nas_fan_control)\n - [\\[GitHub\\] supermicro-fancontrol by jvdillion](https://github.com/jvdillon/supermicro-fancontrol)\n - [\\[GitHub\\] PureCypher's supermicro-fans](https://github.com/PureCypher/supermicro-fans)\n - [\\[GitHub\\] luckylinux's supermicro-fan-control](https://github.com/luckylinux/supermicro-fan-control)\n - [\\[GitHub\\] mrstux's hybrid_fan_control](https://github.com/mrstux/hybrid_fan_control)\n\n\u003e Written with [StackEdit](https://stackedit.io/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetersulyok%2Fsmfc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpetersulyok%2Fsmfc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetersulyok%2Fsmfc/lists"}