웹사이트 검색

Linux에서 ACPI 이벤트를 처리하는 방법


ACPI는 Advanced Configuration and Power Interface의 약자입니다. 표준으로 1996년 APM(Advanced Power Management)의 후속 제품으로 처음 구현되었습니다. 주요 기능으로 이전에는 BIOS에서 처리되었던 것과 달리 운영 체제 수준에서 전원 관리를 처리할 수 있는 기능을 가져왔습니다. Linux의 일부 ACPI 이벤트는 기본적으로 systemd-logind를 통해 처리되지만 acpid 서비스를 설치하고 실행하여 더 복잡한 구성을 수행할 수 있습니다.

이 문서에서는 systemd-logind를 구성하는 방법과 acpid 데몬을 통해 보다 구체적인 ACPI 이벤트를 처리하는 방법을 알아봅니다.

이 자습서에서는 다음에 대해 알아봅니다.

  • systemd-logind에서 일부 ACPI 이벤트를 처리하는 방법
  • acpid 서비스를 설치하고 시작하는 방법
  • ACPI 이벤트를 처리하는 방법

systemd-logind에 의해 처리되는 ACPI 이벤트

최근 몇 년 동안 systemd는 Linux의 표준 init 시스템이 되었습니다. 몇 가지 논쟁이 있은 후, 데비안 파생 제품인 Devuan과 같이 이를 피하기 위해 명시적으로 존재하는 일부를 제외하고는 거의 모든 주요 배포판에서 이를 채택했습니다. Systemd에 반대하는 주요 비평가 중 하나는 "한 가지 일을 하고 잘 한다"는 유닉스 철학을 존중하지 않는다는 것입니다. 시간이 지나면서 실제로 Systemd는 사용자 로그인 관리와 같은 단순히 시스템 초기화를 처리하는 것 이상의 다른 작업을 수행하도록 확장되었습니다. 이는 systemd-logind 서비스를 통해 수행됩니다.

systemd-logind 서비스는 무엇보다도 세션 ID를 생성 및 관리하고, 종료 또는 일시 중단과 같은 시스템 수준 작업에 대한 polkit 액세스를 제공하고, 전원 버튼의 동작과 같은 ACPI 이벤트를 처리하는 역할을 합니다. 이러한 이벤트가 발생할 때 수행해야 하는 작업은 /etc/systemd/logind.conf 파일을 편집하여 구성할 수 있습니다. 내용을 살펴 보겠습니다.

[Login]
[...]
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
#HandleLidSwitchExternalPower=suspend
#HandleLidSwitchDocked=ignore
#HandleRebootKey=reboot
[...]

가장 관련성이 높은 줄을 표시하기 위해 편의를 위해 파일의 출력을 잘랐습니다. 기본적으로 파일의 모든 줄은 주석으로 처리되고 기본값으로 보고됩니다. reported 지시문은 systemd-logind 가 노트북과 같은 이 이벤트가 발생할 수 있는 시스템의 전원, 일시 중단, 최대 절전 모드 키 및 덮개 스위치를 처리하는 방법을 제어합니다. 지시문에 할당할 수 있는 값 중 일부는 다음과 같습니다.

  • 무시하다
  • 전원 끄기
  • 재부팅
  • 매달다
  • 동면하다
  • 하이브리드 슬립

파일에서 사용할 구문은 꽤 자명합니다: 예를 들어, HandlePowerKey=poweroff 줄을 사용하면 systemd-logind에게 전원 버튼을 눌렀을 때 머신의 전원을 끄고, 일시 중지 키를 눌렀을 때 (HandleSuspendKey=suspend) 램을 실행하도록 시스템을 일시 중단하도록 지시합니다. 같은 방식으로 기본적으로 HandleLidSwitchDocked에 대해 수행되는 것처럼 ignore를 해당 줄의 값으로 사용하여 특정 이벤트가 무시되도록 만들 수 있습니다.

가장 많이 사용되는 데스크탑 환경에서 systemd-logind로 처리할 수 있는 일부 작업은 그래픽 전원 관리자에 의해 관리됩니다. 일시 중단 버튼을 눌렀을 때 시스템이 두 번 일시 중단되는 것과 같은 충돌 또는 중복 작업을 방지하기 위해 이러한 응용 프로그램은 해당 이벤트의 systemd logind 처리를 금지합니다.

더 복잡하거나 사용자 지정 작업으로 systemd-logind에서 다루지 않는 acpi 이벤트를 관리해야 하는 경우 전략을 변경하고 acpid 데몬을 설치 및 실행해야 합니다. 진행 방법을 살펴 보겠습니다.

acpid 데몬 설치

acpid 데몬을 설치하는 것은 관련 패키지가 주요 Linux 배포판의 저장소에 포함되어 있기 때문에 매우 쉽습니다. 예를 들어 Fedora에 패키지를 설치하려면 다음 명령을 실행합니다.

sudo dnf install acpid

Archlinux에 동일한 패키지를 설치하려면 대신 다음을 실행합니다.

sudo pacman -Sy acpid

마지막으로, 데비안과 데비안 기반 배포판에서 acpid 패키지를 설치하려면 apt wrapper를 사용합니다.

sudo apt install acpid

설치가 완료되면 acpid 서비스를 시작하고 부팅시 활성화해야하므로 시스템을 시작할 때마다 자동으로 시작됩니다. 하나의 명령으로 두 작업을 모두 수행할 수 있습니다.

sudo systemctl enable --now acpid

ACPI 이벤트 처리

acpid 서비스가 실행 중일 때 특정 이벤트에 대해 수행할 작업을 구성해야 할 때 가장 먼저 해야 할 일은 해당 이벤트가 시스템에서 어떻게 인식되는지 확인하는 것입니다(동일한 이벤트를
다른 컴퓨터에서 다른 방법 : ACPI가 구현되는 방식에 따라 다릅니다). acpi_listen 유틸리티는 이러한 특정 목적을 위해 설계되었으며 acpid 패키지의 일부로 설치되므로 바로 사용할 수 있습니다.

이벤트를 식별하려면 터미널 에뮬레이터에서 유틸리티를 시작하고, 이벤트를 트리거하고, ACPI에서 이벤트를 읽는 방법을 확인해야 합니다. 실제 예를 들어 보겠습니다. Fn 키와 F3 키를 함께 누를 때 랩톱에서 작업을 수행한다고 가정합니다. 먼저 acpi_listen 호출합니다.

acpi_listen

깜박이는 커서를 가져와야 합니다. 이는 시스템이 대기 중이며 이벤트를 읽는 방법을 표시할 준비가 되었음을 의미합니다. 이제 키 조합을 누를 수 있습니다. 즉시 정보가 화면에 인쇄됩니다. 이 경우 사용중인 컴퓨터에서 다음과 같은 결과를 얻습니다.

hotkey ATK0100:00 00000050 00000001

출력에서 4개의 열을 볼 수 있습니다: 첫 번째 열은 장치 클래스를 나타내고, 두 번째 열은 /sys/bus/acpi/devices 디렉토리 아래에 나타나는 "장치"의 커널 이름입니다. 세 번째 열은 이벤트 코드를 보고합니다. 마지막으로, 네 번째 열 값은 이벤트 유형에 따라 다른 의미를 갖습니다. 이벤트 코드를 알게 되면 해당 코드에 작업을 연결할 수 있습니다.

이벤트를 액션과 연관시키기

ACPI 이벤트를 동작과 연결하는 것은 매우 쉽습니다. 기본적으로 두 개의 파일이 관련되어 있습니다: 첫 번째는 acpid 서비스에 의해 파싱된 파일이며(기본적으로 /etc/acpi/events 디렉토리 내에 생성되어야 합니다) 처리할 이벤트의 코드와 실행해야 하는 명령이 포함된 스크립트의 경로를 지정하는 곳입니다. 두 번째는 스크립트 자체입니다. 파일 스템에서 스크립트가 배치되는 위치는 분포에 따라 다릅니다. 예를 들어, Fedora에는 기본적으로 다음과 같은 디렉토리가 있습니다.

├── actions
│   └── power.sh
└── events
├── powerconf
└── videoconf

이미 말했듯이 /etc/acpi/events 디렉토리에는 이벤트를 처리하는 파일이 포함되어 있습니다. 대신 /etc/acpi/actions 디렉터리에는 이벤트와 연결된 스크립트가 포함되어 있습니다. 기본적으로 powerconf 및 power.sh 스크립트가 설치되어 있으며 전원 버튼의 처리를 관리합니다.

데비안에서는 파일이 다르게 정렬됩니다. /etc/acpi/actions 디렉터리가 없습니다.

/etc/acpi
├── events
│   └── powerbtn-acpi-support
└── powerbtn-acpi-support.sh

Archlinux에서는 모든 것이 다르게 처리됩니다: 기본적으로 모든 이벤트가 처리되는 파일은 하나만 있습니다: /etc/acpi/events/anything:

Pass all events to our one handler script
event=.*
action=/etc/acpi/handler.sh %e

파일이 모든 이벤트를 처리하도록하는 것은 .* 정규식입니다. 이벤트의 코드는 /etc/acpi/handler.sh 파일에 인수로 전달됩니다(%e 문자열은 이벤트 코드로 대체됨). 스크립트에서 실행할 작업은 case 문에서 후자에 따라 선택됩니다.

그러나 파일을 정렬하는 방법은 그다지 중요하지 않습니다. 그것은 일이 작동하는 방식을 바꾸지 않습니다. 우리가 이전에 이야기한 이벤트를 관리해 봅시다: 내가 사용하는 기계에 최대 절전 모드 키가 없기 때문에, Fn+f3키 조합이 눌렸을 때 시스템이 최대 절전 모드로 전환되도록 만들 것입니다. 첫 번째로 이벤트 파일을 생성하자면, 우리는 그것을 hibernateconf라고 부를 것이다; 그것은 단지 두 줄만을 포함할 것이다:

event=hotkey ATK0100:00 00000050
action=/etc/acpi/actions/hibernate.sh

첫 번째 줄에서 이벤트 코드를 이벤트의 값으로 지정합니다: 이 경우 acpi_listen 유틸리티를 사용하여 발견한 리터럴 코드를 사용하기만 하면 됩니다. 두 번째 줄에서 실행해야 하는 스크립트의 경로를 지정합니다(/etc/acpi/actions/hibernate.sh).

기억해야 할 한 가지 중요한 점은 SELinux를 사용하는 경우(Fedora에서는 기본적으로 활성화되어 있음) "이벤트" 파일에 적절한 컨텍스트가 연결되어 있는지 확인해야 하며, 그렇지 않으면 이벤트가 처리되지 않는다는 것입니다. 파일에 어떤 컨텍스트를 적용해야 하는지 알아보려면 /etc/acpi/events 디렉토리의 기존 파일을 참조로 살펴볼 수 있습니다. 우리가해야 할 일은 -Z 옵션으로 ls를 실행하는 것입니다.

ls -lZ /etc/acpi/events
-rw-r--r--. 1 root root system_u:object_r:etc_t:s0 168 Oct 5 21:27 powerconf
-rw-r--r--. 1 root root system_u:object_r:etc_t:s0 236 Oct 5 21:27 videoconf

보시다시피 Fedora에서 /etc/acpi/events 디렉토리에 있는 두 개의 기존 파일은 system_u:object_r:etc_t 컨텍스트를 가지고 있습니다. hibernateconf 파일에 동일한 컨텍스트를 적용하려면 chcon 명령과 함께 참조로 사용할 수 있습니다.

sudo chcon --reference /etc/acpi/events/powerconf /etc/acpi/events/hibernateconf

이벤트 파일에 의해 호출된 스크립트에는 다음 줄이 포함됩니다.

#!/bin/bash
systemctl hibernate

스크립트에서는 systemctl을 사용하여 시스템을 최대 절전 모드로 전환합니다. 이제 스크립트를 실행 가능하게 만들기만 하면 됩니다.

sudo chmod +x /etc/acpi/actions/hibernate.sh

새 구성이 적용되려면 acpid 데몬을 다시 시작해야 합니다.

sudo systemctl restart acpid.service

Fn+F3을 누르면 시스템이 최대 절전 모드로 전환되어야 합니다.

결론

이 문서에서는 Linux에서 ACPI 이벤트를 처리하는 방법을 살펴보았습니다. 전원 버튼 누르기, 일시 중단 키 및 랩톱 덮개 닫기와 같은 기본 이벤트가 systemd-logind에 의해 관리되고 /etc/systemd/logind.conf 파일을 통해 구성할 수 있는 방법을 확인했습니다. 또한 가장 많이 사용되는 Linux 배포판 중 일부에 acpid 데몬을 설치하여 사용자 지정 이벤트를 처리하는 방법도 살펴보았습니다.

관련기사: