리눅스에서 부팅 시 특정 작업을 하거나 특정 프로그램이 돌도록 하고 싶을 때가 있다. 그럴 경우 어떻게 해야하는지 차근차근 알아보자.
본 포스팅은 우분투 16.04 기준으로 작성되었다. 하지만 다른 리눅스 배포판도 비슷한 구조를 가지고 있을 것이다.
리눅스 부팅 과정
BIOS
MBR
GRUB
커널
드디어 리눅스 운영체제의 핵심부인 커널이 메모리에 올라오게 되었고, 이제 커널은 부팅을 마무리 짓기 위한 마무리를 지어야 한다. grub 설정파일에 정의된 루트 경로에 부분에 루트 파일시스템을 마운트하고, /sbin/init 프로그램을 실행한다. init 프로세스는 해당 OS에서 실행된 첫번째 프로세스로 pid가 1이다. 우분투 최신 버전의 경우 init 프로세스 대신 systemd이라는 시스템 데몬 프로세스가 그 자리를 대신하기도 한다. 하지만 전체적인 맥락은 비슷하다.
Init
man systemd.special
명령어로 확인이 가능하다.0 - 시스템 종료
1 - 싱글 유저 모드.
S - 싱글 유저 모드
2 - 멀티유저모드, NFS비활성화.
3 - 풀 멀티유저 모드.
4 - 사용안함.
5 - X11
6 - 재시작
런레벨 프로그램
root@ubuntu:/etc# tree rc1.d/
rc1.d/
├── K01alsa-utils -> ../init.d/alsa-utils
├── K01bluetooth -> ../init.d/bluetooth
├── K01cups-browsed -> ../init.d/cups-browsed
├── K01docker -> ../init.d/docker
├── K01irqbalance -> ../init.d/irqbalance
├── K01kerneloops -> ../init.d/kerneloops
├── K01lightdm -> ../init.d/lightdm
├── K01mysql -> ../init.d/mysql
├── K01saned -> ../init.d/saned
├── K01speech-dispatcher -> ../init.d/speech-dispatcher
├── K01thermald -> ../init.d/thermald
├── K01ubuntu-fan -> ../init.d/ubuntu-fan
├── K01ufw -> ../init.d/ufw
├── K01uuidd -> ../init.d/uuidd
├── K01vmware-tools-thinprint -> ../init.d/vmware-tools-thinprint
├── K01whoopsie -> ../init.d/whoopsie
├── K01xinetd -> ../init.d/xinetd
├── K02avahi-daemon -> ../init.d/avahi-daemon
├── K02cgroupfs-mount -> ../init.d/cgroupfs-mount
├── K02cups -> ../init.d/cups
├── K04rsyslog -> ../init.d/rsyslog
├── README
├── S01killprocs -> ../init.d/killprocs
└── S02single -> ../init.d/single
이런식으로 rc?.d 디렉토리들을 확인해보면, 런레벨 2~5와 S레벨의 경우 마지막에 /etc/init.d/rc.local 이라는 스크립트를 실행시킨다.
/etc/init.d/rc.local 스크립트를 살펴보면 내용은, /etc/rc.local 이라는 파일이 있을 경우 실행시킨다고 되어있다.
즉 런레벨 2~5, S의 경우 /etc/rc.local 이라는 스크립트를 부팅 과정 마지막에 실행시킨다는 것이다.
/etc/rc.local 스크립트 실행
Ubuntu16.04의 경우 런 레벨 2~5, S의 경우 /etc/rc.local를 최종적으로 실행시킨다. 해당 파일이 없을 경우 실행하지 않는다. 런레벨 0은 시스템 종료, 6는 재부팅이므로 관계 없고, 런레벨 1의 경우 시스템 복구 모두이기 때문에 복구를 위해서 해당 스크립트를 실행하지 않는것으로 보인다.
리눅스 부팅 스크립트 등록
리눅스 부팅 과정을 알아보면서 알 수 있듯이, 부팅때마다 실행되어야 할 스크립트는 /etc/rc.local에 입력하면 된다.
단, 주의할 사항은 PATH 같은 환경변수가 일반 쉘과 같은 환경으로 설정되지 않을수도 있기 때문에, 환경변수를 설정하고 명령어를 실행하거나, 절대경로로 실행하는 것을 추천한다.
또한 스크립트 실행 도중 에러가 발생했을 때, 표준 출력과 표준 에러를 직접 터미널로 확인하기 어려우므로 파일로 리디렉션(Redirection)하되, 표준 에러도 같이 리디렉션(Redirection)하도록 하는 것을 추천한다.
-------------------------------------
참조
https://www.thegeekstuff.com/2011/02/linux-boot-process/
http://kateee.tistory.com/51
http://nuitstory.tistory.com/500
https://wiki.debian.org/BootProcess
http://cherub.sungkyul.edu/~web/jinboard/files/63_boot.pdf
https://ko.wikipedia.org/wiki/%EC%8B%9C%EB%8F%99_%EC%9E%90%EC%B2%B4_%EC%8B%9C%ED%97%98
http://forensic-proof.com/archives/435
'팁 & 기타' 카테고리의 다른 글
윈도우즈 프린팅 관련 문서 번역(Introduction to Printing) (0) | 2019.01.07 |
---|---|
간편한 한글 기반 일본어 입력기 (6) | 2018.06.05 |
KaTeX를 이용해서 블로그에 수학 수식 입력하기 (0) | 2018.02.20 |
비트, 바이트, 워드사이즈 - 컴퓨터 정보 단위 간략 정리 (0) | 2018.01.13 |
Windows 10 부팅 USB 만들기 (0) | 2017.12.22 |