systemd는 리눅스 운영 시스템에 대해 시스템 구성 요소의 배열을 제공하는 소프트웨어 모음입니다.
그것의 주요 목표는 리눅스 배포판에 걸쳐 서비스 구성과 동작을 통합하는 것입니다; systemd의 주요 구성 요소는 "시스템 및 서비스 관리자"–사용자 공간을 부트스트랩하고 사용자 프로세스를 관리하기 위해 사용되는 init 시스템입니다. 그것은 역시 장치 관리, 로그인 관리, 네트워크 연결 관리, 및 이벤트 로깅을 포함하여 다양한 데몬과 유틸리티에 대해 대체를 제공합니다. 그 이름 systemd는 문자 d를 덧붙임으로써 이름-지정하는 데몬의 유닉스 관례를 따릅니다. 그것은 역시 용어 "System D"를 사용하며, 이것은 문제를 해결하기 위해 신속하게 및 즉석에서 적응하기 위한 사람의 능력을 참조합니다.
2015년 이레로, 대부분의 리눅스 배포판은 유닉스 시스템 V와 BSD init 시스템과 같은 다른 시스템을 대체해 오면서, systemd를 채택해 왔습니다. systemd는 리눅스 사용자로부터 엇갈린 반응을 보여 왔으며, systemd가 미션 크립과 부풀음으로 어려움을 겪고, 마찬가지로 소프트웨어 (그놈 데스크탑과 같은)에 대한 비판이 systemd에 대한 종속성을 추가하여 다른 유닉스와 유사한 운영 시스템과의 호환성을 복잡하게 만들고, systemd로부터 벗어나기 어렵게 만든다는 비판을 받았습니다. 역시, 일부 사람들은 리눅스에서 init 시스템의 장면을 제어하는 Red Hat과 IBM에 대한 우려를 표시합니다.
How to Enable /etc/rc.local with Systemd
몇 년전의 리눅스는 시작 스크립트로 OpenRC를 사용했지만, 지금은 대부분 systemd를 사용합니다. 이전 스크립트에서, 부팅의 마지막에 시스템의 하드웨어 또는 필수 설정을 /etc/rc.local 파일에 기록해서 자동으로 실행할 수 있었습니다.
대체로 이것이 유용하지 않지만, 하드웨어적인 문제는 이 파일에 기록하는 것이 편리할 때가 있습니다.
어쨌든, systemd 아래에서, 이것을 하나의 서비스로 제공할 수 있지만, 약간의 수정이 필요합니다.
먼저, 파일을 만듭니다.
- printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
그런-다음, 실행 권한을 추가합니다.
- sudo chmod +x /etc/rc.local
해당 서비스의 파일에 다음 2줄을 마지막에 추가합니다.
- sudo nano /lib/systemd/system/rc-local.service
[Install]
WantedBy=multi-user.target
이제 서비스를 시작하고, 다음 부팅 때에 자동으로 서비스가 실행되도록 추가합니다.
- sudo systemctl daemon-reload
- sudo systemctl start rc-local.service
- sudo systemctl status rc-local.service
- sudo systemctl enable rc-local.service
만약, status에서 오류가 있으면, 해당하는 오류를 수정해야 합니다.
Usage
기가바이트 보드의 팬을 모니터링하기 위해서, Ubuntu_on_Ryzen_CPU/Troubleshooting#ITE_IT8688E에서 설명된 것처럼, modprebe 과정이 필요합니다.
위에서 만들어진 파일 rc.local에서 'exit 0'위에 다음 내용을 추가할 수 있습니다.
- modprobe it87 force_id=0x8628
Systemd-oomd
이 서비스는 메모리 부족 상황에서 더 나은 대처를 위해 사용될 수 있습니다.
페도라 34부터, 우분투 LTS 22.04에서 systemd-oomd를 지원합니다.
데비안은 bullseye-backports에 패키지가 존재하지만, 설치하려면 의존성에 의해 다른 패키지들을 지우려고 합니다. 이것을 사용하기 위해, 백포트 패키지를 로컬에서 빌드해서 설치할 수 있습니다. 이때, 버전 정보를 1.1과 같이 수정하는 것이 좋은데, 왜냐하면, 정식 백포트 패키지로 덮어쓰려고 시도하기 때문입니다.
먼저, 커널 수준에서 PSI를 지원하도록 반드시 컴파일되어야 합니다. 그러나, 데비안은 커널에서 지원하도록 컴파일되지만, 마찬가지로 커널 옵션에 기본적으로 사용하지 않도록 설정됩니다. 이를 사용하기 위해, 그럽 옵션을, /etc/default/grub 파일에 추가해야 합니다:
GRUB_CMDLINE_LINUX="psi=1"
- sudo update-grub
그런-다음 백포트된 250.4-1 패키지들을 전부 업데이트하고 더불어 systemd-oomd를 설치합니다. 먼저, 목록을 얻기 위해,
- dpkg -l | grep systemd
- dpkg -l | grep 247.3-7
이제 위에서 출력된 리스트 중에서 해당하는 패키지와 systemd-oomd를 로컬 빌드된 패키지로 설치할 수 있습니다.
그런-다음 서비스를 시작하고, 시스템을 재시작힙니다:
- sudo systemctl enable --now systemd-oomd
- sudo reboot
재시작 후에 서비스를 확인합니다:
- sudo systemctl status systemd-oomd
Analyze booting time
컴퓨터의 파워 스위치를 켜고 로그인 창이 나올 때까지, 시간이 꽤 걸릴 수 있습니다.
물론, 하드웨어를 바꾸는 것, 예를 들어 SSD를 사용하는 것이 가장 많은 개선이 있겠지만, 그런 상황에서도 부팅 시간이 긴 것을 좋아할 수는 없습니다.
어쨌든, 부팅 시간을 줄이기 위해, 먼저, 커널 컴파일을 생각해 볼 수 있습니다. 그러나, 이 과정은 자신의 하드웨어와 요구 사항을 알고, 커널에서 어떤 부분이 그런 것을 담당하는지 알아야 하기 때문에, 현 시스템에 최적화된 커널을 만드는 것이 쉽지는 않습니다.
다음으로, 비교적 난이도가 낮으면서 부팅 시간을 단축할 수 있는 것이 부팅 중에 자동으로 시작되는 서비스 중에 필요하지 않은 서비스를 제거, 또는 설정을 바꾸는 방법입니다.
이를 위해, 부팅 시간을 확인할 수 있습니다:
- systemd-analyze
그런-다음 부팅 과정에서 자동으로 실행되는 서비스를 서비스가 동작하도록 걸리는 시간의 내림차순으로 정리해서 볼 필요가 있습니다. 즉, 어떤 서비스가 부팅 시간이 많이 걸리는지 확인을 할 필요가 있습니다:
- systemd-analyze blame
어떤 서비스는 먼저 실행되어야 중속 서비스가 정상적으로 진행이 되기 때문에, 이 중에서 시간이 오래 걸리는 것을 체인으로 만들어서 볼 수 있습니다:
- systemd-analyze critical-chain
부팅 시간을 줄이는 위해, blame 옵션으로 만들어진 순위를 확인해서, 어떤 서비스가 자신에게 불필요한지 확인해서 제거할 수 있습니다.
어쨌든, 어떤 서비스를 중지하거나, 설정을 바꾸었을 때, 시스템이 정상적인 운영이 되지 않거나, 보안의 위험성이 증가할 수 있으므로, 정확한 정보를 기반으로 작업을 진행해야 합니다.
Clearing systemd journal logs
보통 최근 30일 동안의 로그를 보관합니다. 이러다 보니, 꽤 많은 로그가 쌓입니다. 상황에 따라 다르겠지만, 예를 들어, 4G 정도의 꽤 큰 크기를 가질 수 있습니다.
- du -sh /var/log/journal/
또는
- journalctl --disk-usage
강제로 크기를 줄이고 싶고, 최근 로그가 중요하기 때문에, 아래와 같이 날의 숫자를 정해서 이전 로그를 지울 수 있습니다:
- sudo journalctl --vacuum-time=3d
이와 관련된 설정은 /etc/systemd/journald.conf 파일에 기록되어 있습니다. 정확한 정보가 아닐 때에는 관련 내용을 가능한 수정하지 않는 것이 좋겠습니다.
Troubleshootings
systemd-udevd
다음 메시지가 출력됩니다:
event_source: Failed to get device name: No such file or directory
/lib/udev/rules.d/60-evdev.rules 파일에 오타가 있습니다. 9줄을 아래와 같이 고쳐야 합니다:
IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=evdev:", \
Named
부팅 후에 다음 메시지가 출력됩니다:
Failed to restart named.service: Unit named.service not found.
아래와 같이 처리하고 확인 중입니다:
- sudo systemctl disable systemd-hostnamed.service
이 문제는 rc.local 파일에 쓸모없는 코드를 제거하지 않아서 발생했습니다.