📖 목차
✍️ 들어가기 앞서서
리눅스 서버를 운용하다보면 커널을 업데이트하거나 하드웨어의 장치 실패(device fault) 등의 다양한 상황으로 서버를 재시작하게되는 상황이 종종 발생하게 된다.
그런데, 서버 운용에 필요한 데몬을 실행하거나 특정 설정 명령어를 입력해야할 때, 서버를 재시작할 때마다 항상 사용자가 해당 명령어들을 직접 shell을 통해 입력하는건 정말 비효율적이다.
그래서, systemd를 채용한 대부분의 리눅스 배포판들은 /etc/rc.local 파일을 이용 또는 생성을 해, 서버의 시작/재시작에 있어 사용자의 명령어를 자동화할 수 있다.
⌨️ 예시를 통한 직접 설정해보기
그저 무턱대고 어떤 명령어를 자동화 해야할지 모르는 사용자를 위해 예시를 가져왔다. 아래는 서버가 재부팅될때 /dev/sd{x} 경로가 변경되어 SCSI 드라이브와 SATA 드라이브의 명령어가 잘못 입력되는걸 해결하는 예시를 든다.
우선, 본인에게 익숙한 편집도구(vim, nano, emacs 등)를 이용해 /etc/rc.local 경로의 파일을 편집한다. (파일이 존재하지 않을 경우 생성한다. vim의 경우 해당 경로로 입력하여 파일이 없을 경우 자동으로 파일을 생성한다.) 또한, 해당 파일의 소유권 유저와 그룹은 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 $driverSdx
sdparm --set SCT=6000 $driveSdy
위의 명령어에 대한 차이점은 [리눅스에서 sdparm 명령어로 USB 외장하드(WD Elements등)의 절전모드 진입시간 조정하기] 글에서 설명하므로 해당 글을 참고하길 바란다.
위의 스크립트는 driverSdx라는 변수와 driveSdy라는 변수에 각각 특정한 드라이브의 장치 /dev/sd* 를 가져와 일정시간 동안 드라이브에 접근(access)하지 않으면, 유휴상태(parking)하도록 설정하는 명령어이다.
각각 변수가 가져오는 부분 중 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 명령어를 통해 해당 파일의 권한을 수정한다.
username@hostname:~$ sudo chmod 755 /etc/rc.local
이후 운영체제를 재부팅한다면, 위에서 설정한 명령어가 자동으로 실행되어 수고스럽게 부팅 이후에 명령어를 수동으로 입력할 필요가 없어진다.
📒 여담
위에서 설명한 예시는 아주 간단한 요소이며, 어떤 명령어를 자동화할지는 사용자의 몫이다. 서버의 역할이 웹 서비스 서버일 경우 웹 서비스에 필요한 파일을 실행할 수 있도록 하거나, dmseg의 내용을 출력하여 메일 서버를 통해 메일로 해당 내용을 전송하여 외부에서 부트 로그를 보는 등 다양한 방법으로 활용할 수 있는 좋은 도구가 될 것이다.