신짱구의 개발일지

[Raspberry Pi5] 라즈베리파이 OS 부팅 스크립트 설정하기 본문

임베디드시스템

[Raspberry Pi5] 라즈베리파이 OS 부팅 스크립트 설정하기

신짱구개발자 2024. 11. 14. 18:46

라즈베리파이 OS 부팅 시 지정된 동작이 자동으로 실행될 수 있도록 환경 구성한다.

 

1. rc.local 파일 수정

rc.local 파일은 리눅스 시스템에서 부팅 과정 중 마지막에 실행되는 스크립트 파일이다. 이 파일은 부팅 시에 자동으로 실행되는 사용자 정의 명령이나 스크립트를 포함시킬 수 있다.

sudo vi /etc/rc.local

파일을 수정하기 위해 루트 권한으로 rc.local 파일을 연다.

#!/bin/bash -e 와 exit 0 구문 사이에 부팅 시 실행할 스크립트 작성한다.

 

2. rc.local 파일 실행 권한 부여

부팅 시 rc.local 파일을 실행하기 위해 실행 권한을 부여해야 한다. 라즈베리파이 OS에서는 이미 실행 권한이 부여되어 있었지만, 실행권한이 없는 경우 아래의 명령어로 부여한다.

 sudo chmod +x /etc/rc.local

 

3. rc-local.service 파일 멀티유저 모드로 서비스 실행하기

rc.local 파일은 rc-local.service 서비스를 통해 실행된다.

rc.local 파일을 수정하여 시스템 시작 시 스크립트를 실행되게 하려면, 시스템이 단일 사용자 모드가 아닌 멀티유저 모드에서 동작해야 한다. 리눅스 시스템이 단일 사용자 모드에서는 네트워크와 일부 서비스가 제한되기 때문에 rc.local 에서 실행되는 많은 스크립트가 정상적으로 작동하지 않을 수 있다.

 

아래 명령어로 멀티유저 모드로 시스템이 부팅되는지 확인할 수 있다.

systemctl get-default

 

multi-user.target 또는 graphical.target가 출력되면 멀티유저 모드로 부팅 중이라는 뜻이다.

그게 아닐 경우, 아래 rc-local.service 파일을 열어서 아래 문구를 추가한다.

sudo vi /lib/systemd/system/rc-local.service

 

파일의 하단에 아래 내용을 추가한다. 시스템이 멀티유저 모드로 전환되면 서비스를 실행하라는 의미이다.

[Install]
WantedBy=multi-user.target

 

4. rc-local.service 서비스 활성화

라즈베리파이 OS에서 rc-local 서비스가 기본적으로 Active: active (현재 상태)로 표시된다. 본인의 경우, 위와 같이 (exited)로 표시되었는데, 이는 서비스가 활성화되어 있지만, 이미 실행이 완료되었거나 현재 실행되고 있지 않다는 것을 의미한다. 이 때, start 혹은 restart 명령어로 서비스를 시작해줄 수 있다. 그러나, active 설정만으로는 부팅할 때마다 서비스가 자동으로 시작되지 않기 때문에 enable도 함께 설정해주어야 한다. 

 

Linux에서 active와 enable은 시스템 서비스의 상태와 동작을 제어할 때 자주 사용되는 개념이라서 이해할 필요가 있다.

  • Active (활성화)
    • active는 서비스가 현재 실행 중인지 여부를 의미한다. 
    • 위 설정은 시스템이 재부팅되면 사라지며, 부딩 후 다시 실행되지 않는다. 
    • systemctl start/restart <서비스 이름>: 서비스를 즉시 시작한다. 
    • systemctl stop <서비스 이름>: 서비스를 즉시 중지한다. 
    • systemctl status <서비스 이름>: 서비스의 현재 상태를 확인한다. 
  • Enable (사용 설정)
    • enable은 서비스를 부팅 시 자동으로 시작되도록 설정한다. 
    • systemctl enable <서비스 이름>: 부팅 시 서비스가 자동으로 실행되도록 설정한다.
    • systemctl disable <서비스 이름>: 부팅 시 서비스가 자동으로 시작되지 않도록 설정한다. 
    • enable된 서비스는 시스템이 재부팅되더라도 자동으로 실행되지만, 실제 실행 상태는 start 또는 stop 명령어로 제어해야 한다. 
$ sudo systemctl enable rc-local.service
$ sudo systemctl restart rc-local.service

서비스가 활성화 되고, enable이 설정되었다면, Loaded에 enabled, Active에 active가 표시된다.

 

유의 사항

rc.local 파일이 실행될 때, 그 실행 환경은 일반적으로 루트 사용자로 설정된다. 이로 인해서 rc.local 파일 내에서 사용되는 모든 경로는 루트 디렉토리를 기준으로 해석된다. 즉, 홈 디렉토리($HOME)를 스크립트 파일 내의 파일 경로로 설정할 경우, 유저 경로가 아닌 루트 경로에서 실행되기 때문에 경로 오류가 발생할 수 있고, 원치 않은 경로에서 컴파일되어 실행 파일이 생길 수 있다. 그래서, rc.local 파일에서 사용하는 경로는 절대 경로로 지정하는 것이 좋다.