라즈베리파이의 경우, 모니터를 연결하는 hdmi 포트가 있습니다. 디스플레이를 연결하여 부팅 내역을 볼 수도 있습니다. 하지만, 빠르게, 대량으로, 작업하는 경우, 매번 디스플레이를 연결할 수 없는 노릇입니다.
그래서, 아래와 같은 구조를 구현했습니다.
라즈베리안을 설치한 SD카드에, 부팅시 프로그램이 실행되도록 합니다. 부팅에 성공하면, 스크립트가 실행됩니다. 스크립트는 slack이나 메신저에 맥 어드레스를 보냅니다. (Rest API).
Raspberry Pi OS 준비하기
Raspberry Pi Imager 라는 것을 이용하면 손쉽게 OS를 준비할 수 있습니다.
Imager 설치하기
Imager 다운로드 페이지에 접속합니다.
https://www.raspberrypi.com/software/
아래와 같은 페이지를 만나게됩니다. 본인 OS에 맞는 실행파일을 다운로드 받으시면 됩니다.

설치되었으면, 실행합니다.
Imager 로 실행가능한 OS 만들기
아래 절차와 같이 클릭 몇번으로 Pi OS Lite 버전을 설치할 수 있습니다.
우선, SD카드를 슬롯에 넣습니다.
SD카드를 읽고 쓰는 어댑터중 좋은 제품이 많이 나와있습니다. 적절한 것으로 구매하시면 됩니다. (TMI. 저는 맥에 착 달라붙는 어댑터가 맘에 들어서 ‘이것‘을 구매했습니다)

[운영 체제]를 선택합니다.

Raspberry Pi OS (other) 메뉴를 선택합니다.

가볍게 스크립트를 실행할 예정이므로, Raspberry Pi OS Lite (32-bit)를 선택합니다.

OS 이미지를 생성할 SD카드를 선택합니다.

우측 하단의 설정(기어모양)을 선택합니다.

WiFi 패스워드를 미리 설정할 것인지 물어봅니다. Yes를 선택합니다.

만약 Rpi가 아니라, 원격 ssh 로 작업을 원한다면, 미리 pub key를 등록할 수도 있습니다. 등록해 놓으면 매우 편리합니다.
사용자 이름도 pi 가 아니라, 다른 이름으로 지정할 수 있습니다. 다른 이름으로 등록/생성해서 작업하는 것을 권장합니다.

무선 LAN 설정하는 부분에, SSID와 Password를 넣습니다.

저장합니다.

모든 설정이 완료되었으면, [쓰기] 버튼을 누릅니다.



쓰기가 완료되면, Rpi OS Lite 준비가 끝났습니다.
스크립트 준비하기
python으로 간단하게 코드를 만듭니다.
requests 패키지를 이용해서, API를 호출했습니다. 만약을 위해 log를 남기도록 했습니다. 추가 정보를 위해 mac address를 가져와서 보이도록 했습니다.
/home/tester/pi-startup.py 파일로 저장합니다.
import requests import subprocess import datetime import logging URL = "https://api.---------" headers = { "Content-Type": "application/json", "x-___-api-key": "------" } def get_mac_address(): command = "ifconfig | grep -E 'ether'" output = subprocess.check_output(command, shell=True) mac_address = output.decode("UTF-8").replace("ether", "").replace(":", "") return mac_address time_now = datetime.datetime.now() time_now = time_now.strftime("%H:%M:%S") payload = { "title": "RPi says I am alive, don't throw me in the trash (" + time_now + ")", "contents": "Mac address: \n" + get_mac_address(), } def main(): file_handler = logging.FileHandler("/home/tester/log.txt") formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") file_handler.setFormatter(formatter) logger = logging.getLogger(__name__) logger.addHandler(file_handler) logger.setLevel(logging.DEBUG) response = requests.post(URL, headers=headers, json=payload) if response.status_code == 200: print("Post created successfully") logger.info("Post created successfully") else: print("try again") print(response.status_code) print(response.content) logger.warning("Post failed") if __name__ == "__main__": main()
부팅시 스크립트 실행하기
만약에 네트웍을 사용하지 않는다면, rc.local 에 간단히 넣어서 실행하게 해도 됩니다.
네트웍을 사용하는 스크립트의 경우, 네트웍이 올라올 때까지 기다려야 합니다.
그래서, systemd의 기능을 사용하기로 했습니다.
systemd 등록하기
systemd 에 서비스로 등록하면, 부팅시 실행할 수 있고, 특정 서비스가 올라온 후에 실행되도록 할 수 있습니다.
절차는 아래와 같습니다.
- 서비스를 생성합니다.
- 서비스의 세부 사항을 설정합니다.
- 서비스를 활성화 합니다.
서비스 생성
sudo nano /etc/systemd/system/pi-startup.service
서비스 세부 사항 설정
아래와 같이 입력합니다.
[Unit] Description=RPi super duper booting service After=network-online.target Wants=network-online.target [Service] Type=idle User=tester ExecStart=/usr/bin/python3 /home/tester/pi-startup.py [Install] WantedBy=multi-user.target WantedBy=network-online.target
서비스에는 3개의 섹션이 존재합니다. Unit, Service, Install 여기에서 netwok-online.target 이 중요한 키워드입니다. 네트웍이 온라인 상태일때 이 서비스를 수행하라는 뜻 입니다.
편집이 완료되었으면 저장 합니다.
서비스 활성화
저장후, 서비스를 enable 해줍니다.
sudo chmod 644 /etc/systemd/system/pi-startup.service sudo systemctl enable pi-startup.service
모든 준비가 끝났습니다. reboot 명령어로 재 시작해본후, API를 호출하는지 확인하시면 됩니다.
결론
테스트 결과
모든 설정이 끝난 SD카드를 넣으면 아래와 같이 제대로 출력되는 것을 볼 수 있습니다.

원리는 간단합니다. 부팅할때, 네트웍이 올라온후, Python을 수행하여, 메신저의 API를 호출합니다.