
📖 목차
🔎 예전에 쓴 글 중에 rc.local로 하는 방법은?
과거 작성한 글 중 rc.local로 Linux 부팅시 지정한 셸 스크립트를 실행하는 방법을 작성한 rc.local 파일을 이용한 부팅시 사용자 명령어 자동 실행하기 글이 있었다.
사실 rc.local은 과거 UNIX의 유산인 System V에 대응되어, 현재 많은 리눅스 배포판이 채택한 systemd와 어울리지 않는 방법이기에, 현대적인 systemd 방법에 맞춰 다시 안내하기 위해 글을 쓰게되었다.
해당 글은 과거 우분투 8.04부터 사용하던 습관으로 (rc-local.service까지 켜두었다는 걸 망각하고)작성하게 된 글이었다.
🤔 잘 쓰던 걸 굳이 바꿔야할까?
물론, 기존에 잘 쓰고 있던 방식을 굳이 바꿔야할 이유가 있는지 의문을 가질 수 있다. 기존 방식대로 rc.local 파일을 작성하고 chmod +x 권한을 주고 sudo systemctl enable --now rc-local.service 딸깍 한번에 간단하게 설정이 가능하기 때문이다.
하지만, 해당 방법은 systemd 방식에 어울리지 않는 과거 방식이기도 하고, 부팅시 필요한 요구조건이 늘어나는 스크립트로 이후 복잡하게 작성하게 된다면(네트워크 필요 등), 실행이 보장되지 않는다.
또한, 현대 리눅스 배포판에서 서비스 상태를 체크하는 sudo systemctl status, journalctl -xe 와 같은 명령어로 rc.local가 실패하는 등의 문제가 발생했을때, 체크하기 어렵기 때문이다.
그래서 초기 설정이 좀 귀찮지만, 시스템 부팅시 다른 서비스나 네트워크가 필요한 의존성에 맞추어 모니터링이 가능한 현대적인 방법에 맞추어 설명한다.
🪄 예시를 통한 직접 설정해보기
이전 글을 보았다면, 작성하는 방법은 크게 다르지 않다. 아래의 스크립트는 서버가 재부팅될때 /dev/sd{x} 경로가 변경되어 SCSI 드라이브와 SATA 드라이브의 슬립모드(HDD Parking)로 진입하는 시간을 조절하는 예시이다.
1. 실행할 스크립트 작성
#!/bin/bash
driveSdx=$(findfs UUID=ABCDEFGH-IJKL-MNOP-QRST-UVWXYZ0123 | sed 's/.$//')
driveSdy=$(findfs UUID=HGFEDCBA-IJKL-MNOP-QRST-UVWXYZ0123 | sed 's/.$//')
if [ -n "$driveSdx" ]; then
hdparm -S 120 $driveSdx
fi
if [ -n "$driveSdy" ]; then
sdparm --set SCT=6000 $driveSdy
fi
이와 같이 부팅시 필요한 스크립트를 작성 하고 다음 경로에 저장한다.
/usr/local/bin/disk_settings_on_boot.sh
이후, 해당 파일에 실행 권한을 부여한다.
sudo chmod +x /usr/local/bin/disk_settings_on_boot.sh (또는 sudo chmod 700 /usr/local/bin/disk_settings_on_boot.sh)
2. systemd에 등록할 .service 파일 생성하기
이제 이 스크립트를 systemd가 실행 할 수 있도록 설정하는 .service 파일을 생성한다.
[Unit]
Description=Apply custom HDD/SSD sleep settings
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/disk_settings_on_boot.sh
[Install]
WantedBy=multi-user.target
이와 같은 파일을 /etc/systemd/system/disk-settings.service 생성한다.(⚠️ 언더바(_)가 아닌 하이픈(-)이다!)
3. systemd 등록 후 활성화
# systemd가 방금 생성한 파일을 인식할 수 있도록 reload
sudo systemctl daemon-reload
# 부팅 시 자동 실행되도록 후 바로 1회 실행하기
sudo systemctl enable --now disk-settings.service
# 잘 적용되었는지 systemctl로 상태 및 로그 확인
sudo systemctl status disk-settings.service
sudo journalctl -u disk-settings.service
📒 여담
과거 작성한 rc.local 글 보다는 셸 스크립트 작성하고 서비스를 키는 간단한 방법으로 해결되는 딸각이 아닌, 조금 복잡한 과정을 거쳐야해서 귀찮을 수 있다.
하지만, 이러한 방법으로 서비스를 구성해두는 것이 전체적인 시스템의 안정성과 문제가 생겼을 시, 디버깅하기 더 좋은 환경을 조성하는데 더 이로울 것이다.