rc.local 파일을 이용한 부팅시 명령어 자동 실행하기

✍️

🛠️

👤

🔍 최신 Linux 배포판을 사용할 경우 systemd에 맞춘 설정 방법 안내 글도 있어요.

들어가기 앞서서

리눅스 서버를 운용하다보면 커널을 업데이트하거나 하드웨어의 장치 실패(device fault) 등의 다양한 상황으로 서버를 재시작하게되는 상황이 종종 발생하게 된다.

그런데 서버 운용에 필요한 데몬을 실행하거나 특정 설정 명령어를 입력해야할 때, 서버를 재시작할 때마다 항상 사용자가 해당 명령어들을 직접 shell을 통해 입력하는건 정말 비효율적이다.

전통적인 init 리눅스 배포판들은 /etc/rc.local 파일을 작성하여 OS 부팅에 있어 사용자의 명령어를 자동화할 수 있다. systemd 배포판은 호환 서비스(rc-local.service)를 활성화하여 사용할 수 있다. 물론, 해당 방법은 systemd의 기본철학이 아님을 미리 이야기한다.

예시를 통한 직접 설정해보기

무턱대고 어떤 명령어를 자동화 해야할지 모르는 사용자를 위해 예시를 가져왔다.

아래의 스크립트는 서버가 재부팅될때 /dev/sd{x} 경로가 변경되어 SCSI 드라이브와 SATA 드라이브 구분에 맞춰 디스크 파킹(Parking)명령어를 적절하게 설정한 것이다.

우선, 본인에게 익숙한 편집도구(vim, nano, emacs 등)를 이용해 /etc/rc.local 경로의 파일을 편집한다.1 또한, 해당 파일의 소유권 유저와 그룹은 root이므로, sudo 명령어를 입력하여 편집하거나 root 계정으로 수정하면 된다.

#!/bin/bash

driveSdx=$(findfs UUID=ABCDEFGH-IJKL-MNOP-QRST-UVWXYZ0123 | sed 's/.$//')
driveSdy=$(findfs UUID=HGFEDCBA-IJKL-MNOP-QRST-UVWXYZ0123 | sed 's/.$//')

hdparm -S 120 $driveSdx
sdparm --set SCT=6000 $driveSdy

위의 명령어에 대한 차이점은 리눅스에서 sdparm 명령어로 USB 외장하드(WD Elements등)의 절전모드 진입시간 조정하기 글에서 설명하므로 해당 글을 참고하길 바란다.

각각 변수가 가져오는 부분 중 UUID는 다음과 같은 blkid 명령어를 통해 얻을 수 있다.

username@hostname:~$ blkid

/dev/sda1: UUID="aaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
/dev/sdb1: UUID="aaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

이와같이 명령어를 rc.local 파일에 저장하고 부팅시 해당 파일을 실행할 수 있도록 chmod 명령어를 통해 해당 파일의 권한을 수정한다.

# Ubuntu의 경우
sudo chmod 700 /etc/rc.local

# RHEL/fedora의 경우
sudo chmod 700 /etc/rc.d/rc.local

이후 운영체제를 재부팅한다면, 위에서 설정한 명령어가 자동으로 실행되어 수고스럽게 부팅 이후에 명령어를 수동으로 입력할 필요가 없어진다.

systemd를 사용하는 최신 배포판의 추가설정

systemd가 채택된 배포판은 일반적인 rc.local 파일 생성만으로 활성화가 되지않는다. 다음과 같이 systemctl 명령어로 서비스 활성화를 해줘야한다.

# systemctl 명령어로 해당 서비스가 존재하는지 확인 (없을 경우 최상단 링크를 통해 systemd 설정 페이지로 문서 확인)
sudo systemctl status rc-local.service

# systemctl 명령어로 서비스 
sudo systemctl enable --now rc-local.service

여담

위에서 설명한 예시는 아주 간단한 예시를 가져왔다. 서버의 역할이 웹 서비스 서버일 경우 웹 서비스에 필요한 파일을 실행할 수 있도록 하거나, dmesg의 내용을 출력하여 메일 서버를 통해 메일로 해당 내용을 전송하여 외부에서 부트 로그를 보는 등 다양한 방법으로 활용할 수 있는 좋은 도구가 될 것이다.

주의점으로는 다음과 같이 외부 데이터를 가져와 Shell을 호출하는 명령어는 보안상 위험성을 높인다.

curl http://domain.example/script.sh | bash

위의 예시와 같이 OS에 큰 데미지를 줄 수 있는 명령어대신 예시에서 보여주었던 디스크 설정과 같이 1회성 단발로 끝나는 스크립트에 대해서만 활성화 하는 걸 추천한다.

  1. 파일이 존재하지 않을 경우 생성한다. vim의 경우 해당 경로로 입력하여 파일이 없을 경우 자동으로 파일을 생성한다. ↩︎