우분투엔 기본적으로 thermald라는 온도 조절 서비스가 설치되어 있다. CPU 온도가 상승하면 쿨러를 더 세게 돌린다든지 하는 걸 담당하는데 우분투답지 않게 이 서비스는 설정을 안 해도 제대로 동작하는 게 아닌데다가 함정이 많이 파여 있다. 그래서 나중에 삽질을 덜 하기 위해 로그를 남긴다.

  1. 설정파일을 불러오게 하기

thermald는 /etc/thermald/thermal-conf.xml 파일을 사용하는 것처럼 보인다. 하지만 이 파일을 아무리 수정해도 로그를 살펴보면 기본값만 불러 올 뿐 설정을 제대로 사용하는 것 같지가 않다. 이것 때문에 결국 thermald를 끄고 사용하던 적이 있지만 이젠 안다. 우분투 제작자들의 설계미스다.
당장 다음과 같이 수정하자

/lib/systemd/system/thermald.service

[Unit]
Description=Thermal Daemon Service

[Service]
Type=dbus
SuccessExitStatus=1
BusName=org.freedesktop.thermald
ExecStart=/usr/sbin/thermald --no-daemon --dbus-enable --config-file /etc/thermald/thermal-conf.xml

[Install]
WantedBy=multi-user.target
Alias=dbus-org.freedesktop.thermald.service

--config-file /etc/thermald/thermal-conf.xml 부분을 추가했는데 thermald는 저 옵션이 없으면 이렇다 할 기본 설정파일을 불러오는 게 없던 것이다.
물론 설정파일을 불러온다고 해도 제대로 작동하는 건 아니다. 여기서부터는 리눅스의 시스템을 잘 아는 사람만 건드릴 수 있는 부분인데 개인적으로 이걸 왜 기본으로 설치해서 아무 것도 안 하는 서비스를 돌아가고 있게 만들어 놓았는지 모르겠다.

/etc/thermald/thermal-conf.xml

<?xml version="1.0"?>

<!--
use "man thermal-conf.xml" for details
-->

<!-- BEGIN -->
<ThermalConfiguration>
  <Platform>
    <Name>Spectre 13</Name>
    <ProductName>*</ProductName>
    <Preference>PERFORMANCE</Preference>
    <ThermalSensors>
      <ThermalSensor>
        <Type>x86_pkg_temp</Type>
        <Path>/sys/class/thermal/thermal_zone6/</Path>
        <AsyncCapable>1</AsyncCapable>
      </ThermalSensor>
    </ThermalSensors>
    <ThermalZones>
      <ThermalZone>
        <Type>x86_pkg_temp</Type>
        <TripPoints>
          <TripPoint>
            <SensorType>x86_pkg_temp</SensorType>
            <Temperature>70000</Temperature>
            <type>active</type>
            <ControlType>SEQUENTIAL</ControlType>
            <CoolingDevice>
              <index>1</index>
              <type>rapl_controller</type>
              <influence>50</influence>
              <SamplingPeriod>5</SamplingPeriod>
            </CoolingDevice>
            <CoolingDevice>
              <index>2</index>
              <type>intel_powerclamp</type>
              <influence>30</influence>
              <SamplingPeriod>5</SamplingPeriod>
            </CoolingDevice>
            <CoolingDevice>
              <index>3</index>
              <type>intel_pstate</type>
              <influence>0</influence>
              <SamplingPeriod>5</SamplingPeriod>
            </CoolingDevice>
            <CoolingDevice>
              <index>4</index>
              <type>Processor</type>
              <influence>0</influence>
              <SamplingPeriod>10</SamplingPeriod>
            </CoolingDevice>
          </TripPoint>
          <TripPoint>
            <SensorType>x86_pkg_temp</SensorType>
            <Temperature>80000</Temperature>
            <type>active</type>
            <ControlType>PARALLEL</ControlType>
            <CoolingDevice>
              <index>1</index>
              <type>rapl_controller</type>
              <influence>40</influence>
              <SamplingPeriod>5</SamplingPeriod>
            </CoolingDevice>
            <CoolingDevice>
              <index>2</index>
              <type>intel_powerclamp</type>
              <influence>30</influence>
              <SamplingPeriod>5</SamplingPeriod>
            </CoolingDevice>
            <CoolingDevice>
              <index>3</index>
              <type>intel_pstate</type>
              <influence>20</influence>
              <SamplingPeriod>10</SamplingPeriod>
            </CoolingDevice>
            <CoolingDevice>
              <index>4</index>
              <type>Processor</type>
              <influence>20</influence>
              <SamplingPeriod>10</SamplingPeriod>
            </CoolingDevice>
          </TripPoint>
          <TripPoint>
            <SensorType>x86_pkg_temp</SensorType>
            <Temperature>85000</Temperature>
            <type>max</type>
            <ControlType>PARALLEL</ControlType>
            <CoolingDevice>
              <index>3</index>
              <type>intel_pstate</type>
              <influence>50</influence>
              <SamplingPeriod>10</SamplingPeriod>
            </CoolingDevice>
            <CoolingDevice>
              <index>4</index>
              <type>Processor</type>
              <influence>50</influence>
              <TargetState>3</TargetState>
              <SamplingPeriod>10</SamplingPeriod>
            </CoolingDevice>
          </TripPoint>
        </TripPoints>
      </ThermalZone>
    </ThermalZones>
    <CoolingDevices>
      <CoolingDevice>
        <Type>rapl_controller</Type>
        <IncDecStep>500000</IncDecStep>
      </CoolingDevice>
      <CoolingDevice>
        <Type>intel_powerclamp</Type>
        <DebouncePeriod>5000</DebouncePeriod>
        <IncDecStep>10</IncDecStep>
      </CoolingDevice>
      <CoolingDevice>
        <Type>intel_pstate</Type>
        <DebouncePeriod>1000</DebouncePeriod>
        <ReadBack>0</ReadBack>
        <MinState>0</MinState>
        <MaxState>0</MaxState>
      </CoolingDevice>
      <CoolingDevice>
        <Type>Processor</Type>
        <DebouncePeriod>10000</DebouncePeriod>
        <ReadBack>0</ReadBack>
        <MinState>0</MinState>
        <MaxState>10</MaxState>
      </CoolingDevice>
    </CoolingDevices>
  </Platform>
</ThermalConfiguration>
<!--
vim: et st=2 sts=2
-->

그냥 바로 복붙해서 쓸 수 있는 건 아니고 ThermalSensor 부분에 있는 Path 설정을 잘 봐야 하는데 이건 시스템마다 모두 다르다. /sys/class/thermal/ 밑에 가 보면 여러가지 쿨링 디바이스와 온도 센서 등이 있는데 각 thermal_zone*에 들어가서 type파일을 보면 타입을 알 수 있다.