리눅스 서비스 제어하기 : 데몬, 런레벨 제어
리눅스가 부팅하는 과정 + 런레벨
BIOS(basic input output system, 기본 입출력 시스템)이 usb, hdd와 같이 부팅 가능한 장치를 읽기 시작한다. bios에서 boot 순서를 수정하여 윈도우든 리눅스든 설치한 경험이 있을 것이다. BIOS가 부팅하는 과정은 MBR(master boot record, 마스터 부트 레코더)라 불리는 영역 내에 있는 부트 로더가 진행합니다. 부트 로더는 부팅할 운영체제의 커널이 디스크의 어디에 있는지 알고 있기 때문에 커널을 메모리로 불러옵니다.
메모리에 적재된 커널은 하드디스크의 루트 파티션을 찾아 마운트하고 하드웨어를 감지하여 사용할 수 있게 만든다. 이 과정이 끝나면 리눅스 커널은 모든 프로세스의 부모 역할(pid 1번)을 하는 init을 실행시킨다.
pid를 순서대로 출력하는 ps -ef를 통해 아래 결과를 살펴볼 수 있다. /sbin/init이 실행된 것을 확인할 수 있다.
init은 런레벨에 따라 예약된 프로세스를 실행시킨다. 런레벨은 시스템을 다른 환경으로 부팅할 수 있도록 구분해둔 설정이다.
init 6가 재부팅인 이유가 6이 런 레벨을 지칭하기 때문이다.
0 : 종료
1 : 단일 사용자 모드
2~5 : 다중 사용자 gui 모드 (기본값)
6 : 재부팅
현재 무슨 런레벨로 init 되었는지 확인해보고 싶다면 runlevel 명령어를 입력하면 된다.
runlevel // N 5
네트워크 서비스 시작하기 : 데몬
서버는 보통 백그라운드(&)에서 실행되며 여러 작업을 처리해야 한다. 이런 시스템 프로세스를 'deamon'이라고 한다. nodemon이란 이름이 여기에서 유래된 것이다.
왜 이렇게 서버를 구동시켜야 하는지 쉽게 생각해보면 터미널 하나에서 서버를 돌리고 있고, 해당 터미널에서 아무 것도 못하게 된다면 상당히 귀찮을 것이다. 그래서 보통 서버는 백그라운드에서 실행시킨다.
리눅스에서 서비스를 제공하는 실습을 통해 데몬을 이해해보기로 합시다.
여기서는 ntp를 사용해보기로 하겠습니다. ntp는 네트워크로 연결되어 있는 컴퓨터들끼리 시간을 동기화하는데 사용되는 프로토콜이다. 일종의 타임 sync라고 보면 되겠다.
zetawiki.com/wiki/%EC%9A%B0%EB%B6%84%ED%88%AC_ntp_%EC%84%A4%EC%B9%98
sudo apt-get install ntp // ntp 설치
sudo service ntp start // service start
sudo vim /etc/ntp.conf // 설정 파일 수정
설정 파일에서 우리나라 ntp 서버인 time.bora.net으로 수정했습니다.
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst
sudo service ntp restart // 재시작
// 시간 서버의 상태 조회. -p 옵션을 통해 시간 서버(위에서 설정한 바는 time.bora.net)와의 동기화 상태 체크
ntpq -p
이렇게 설정한 ntp가 시스템을 시작 하자마자 동작하도록 런레벨을 편집해보겠습니다.
런레벨 제어하기
보통 런레벨을 제어하기 위해서 우분투에서는 sysv(sysv-rc-conf)가 주로 사용됩니다만,
어느 버전에서부터인가(아마 14.04가 systemd가 없는 마지막 버전이었을 겁니다) systemd로 대체되었습니다.
그 이유에 대해서는 fossbytes.com/systemd-vs-sys-v-vs-upstart/ 여기를 참고해보세요.
그런데 저는 sysv를 우분투 20에서 사용하고 싶기 때문에 별도의 과정을 거쳤습니다.
/etc/apt/sources.list 에 아래 경로를 추가합니다.
deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
sources.list를 수정했으므로 apt-get update를 진행해준 후 sysv를 설치해주면 됩니다.
sudo apt-get install sysv-rc-conf
sudo sysv-rc-conf
실행 결과를 살펴보면 특정 서비스를 특정 런레벨에 실행시킬지(X) 말지를 결정하는 창이 보입니다.
ctrl + n / p (next/pre) 를 통해 페이지를 이동할 수 있고 스페이스와 화살표를 이용하여 컨트롤합니다.
굳이 설명 안해도 아래에 조작법이 있으니 알아서 ...
여튼 살펴보시면 ntp가 런레벨 2~5에 설정되어 있고, 그래서 멀티 유저 gui 환경 런레벨에서는 init하면서 자동으로 데몬으로 실행되는 것을 볼 수 있습니다. 특정 런레벨에서 데몬을 실행시키고 싶지 않다면 꺼주시면 됩니다.
실습 정리
서비스를 설치하고, 필요에 따라 환경 설정 파일을 수정해줍니다.대개 /etc 하위 경로에 있습니다.
서비스를 재시작합니다(sudo service restart...)
ps 등으로 서비스가 작동 중인지 확인하고,
런레벨 편집기(sysv, sysd ... 원하는 것으로)로 특정 런레벨에서 데몬 설정을 해주면 됩니다.