자바스크립트를 활성화 해주세요

SD카드에서 라즈베리파이 headless 설정하기

 ·  ☕ 7 min read

라즈베리파이 OS를 설치한 microSD카드를 꽂고 전원을 연결하면 바로 라즈베리파이 OS가 부팅된다. 하지만 해당 장치를 사용하려면 HDMI로 모니터에 연결하고 (혹은 DSI 커넥터에 디스플레이 모듈 연결) 키보드, 마우스를 연결해야 한다. Headless 방식은 위 장치들이 없이 네트워크 혹은 시리얼 케이블로 연결하는 환경을 말한다. (보통 위 3가지 장치를 묶어서 KVM 스위치 등으로 여러 컴퓨터를 동시 제어할 때 쓰기도 한다.)

본 문서에서는 라즈베리파이를 처음부터 Headless로 사용하기 위해 필요한 설정 방법을 설명할 것이다. 순서는 아래와 같다.

  1. 네트워크/시리얼 포트로 라즈베리파이와 연결 가능한 환경 확보
  2. SSH 원격 접속을 설정하여 CLI로 접속 가능하게 하기
  3. VNC 원격 접속을 설정하여 GUI로 접속 가능하게 하기

본 문서에서는 처음부터 headless로 사용하기 위해 라즈베리파이 OS가 설치된 microSD의 내용을 변경하는 방법을 설명한다. 라즈베리파이 OS가 설치된 microSD카드는 FAT32로 포맷된 boot 파티션과 ext4로 포멧된 rootfs 파티션이 있을 것이다. 본 문서에서는 boot파티션의 내용 수정을 주로 설명할 것이다.

라즈베리파이와 연결 가능한 환경 확보하기

WiFi 자동 접속 설정하기

라즈베리파이를 유선랜으로 연결할 수 있다면 가장 좋겠지만, 불가능한 경우 WiFi에 자동 접속하도록 설정해주자. 라즈베리파이는 wpa_supplicant를 사용하므로 해당 설정 파일을 미리 작성해서 넣으면 된다.

boot 파티션에 wpa_supplicant.conf 파일을 생성하고 WiFi 연결 정보를 작성한다. 아래는 WiFi AP 이름이 “testing”, 비밀번호가 “testingPassword"일 때의 작성 예시다.

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB

network={
    ssid="testing"
    psk="testingPassword"
}

country= 부분에는 현재 WiFi의 국가를 설정하는 부분인데, 한국이라서 KR로 입력하면 WiFi 사용에 문제가 있는 경우가 있으므로, 일단은 GB 혹은 US로 설정해 주도록 하자. (링크를 보면 알겠지만, 한국에서 WiFi 사용을 위한 주파수 밴드가 대부분 비활성화 되어 있어 생기는 문제다.)

비밀번호 없는 WiFi 접속 설정

network={ } 안에 비밀번호 대신 key_mgmt=NONE를 입력하면 된다. 아래는 비밀번호 없는 WiFi AP 이름이 “testing"일 때의 작성 예시다.

network={
    ssid="testing"
    key_mgmt=NONE
}

숨겨진 WiFi 접속 설정

network={ } 안에 scan_ssid=1을 추가하면 된다. 아래는 숨겨진 WiFi AP 이름이 “hiddenSSID”, 비밀번호가 “testingPassword"일 때의 작성 예시다.

network={
    ssid="hiddenSSID"
    scan_ssid=1
    psk="testingPassword"
}

2개 이상의 WiFi 접속 설정

각 WiFi AP에 대한 network={ }를 여러 개 입력하면 된다. 각 WiFi AP간 우선순위는 priority=으로 표기한다. 아래는 WiFi AP 이름이 “firstSSID”, 비밀번호가 “firstPassword"이고 다른 WiFi AP의 이름이 “secondSSID”, 비밀번호가 “secondPassword"이며, “firstSSID"를 우선적으로 접속하고 싶을 때의 작성 예시이다.

network={
    ssid="firstSSID"
    psk="firstPassword"
    priority=1
}

network={
    ssid="secondSSID"
    psk="secondPassword"
    priority=2
}

WiFi 비밀번호 암호화하기

이전까지의 설정은 모두 비밀번호가 평문으로 저장된다는 문제점이 있다. 비밀번호를 노출하고 싶지 않다면, 미리 암호화된 비밀번호로 변환하여 저장하는 방법이 있다. (해당 방법은 wpa_supplicant를 직접 사용해야하며, 윈도우즈에서는 일반적으로 설치하기 힘든 것으로 보인다.)

$ wpa_passphrase $SSID $PASSPHRASE

wpa_supplicant를 설치하면 wpa_passphrase 명령어도 같이 설치되는데, 위와 같이 명령어의 인자로 WiFi AP의 이름과 비밀번호를 입력하면 사용해야 할 network={ } 내용을 생성해준다. 원문 비밀번호는 앞에 #으로 주석처리되어 있는데, 평문을 노출하지 않고 저장하는 것이 목적이므로 해당 줄만 삭제하면 된다. 아래는 WiFi AP 이름이 “testing”, 비밀번호가 “testingPassword"일 때 평문을 감추는 예시다.

$ wpa_passphrase testing testingPassword
network={
        ssid="testing"
        #psk="testingPassword"
        psk=131e1e221f6e06e3911a2d11ff2fac9182665c004de85300f9cac208a6a80531
}

wpa_supplicant를 직접 사용할 수 없는 경우에는 Wireshark에서 제공하는 변환 페이지를 사용할 수도 있다.

라즈베리파이 제로를 USB 이더넷 장치로 사용할 수 있게 설정하기

라즈베리파이 제로의 경우 WiFi가 지원되지 않는다. 하지만 해당 제품에서 USB 연결 설정을 변경하여 PC에서 USB 이더넷 장치로 인식하게 하는 방법이 있다. Addon boarddongle expansion breakout module kit을 사용한다면 PC에서 라즈베리파이를 마치 이더넷 어댑터에 연결한 것 처럼 사용할 수 있다. 이 방법은 라즈베리파이 제로 W도 적용 가능하다.

boot 파티션의 cmdline.txt 파일을 아래와 같이 수정한다.

console=serial0,115200 console=tty1 root=PARTUUID=384c22b9-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet splash plymouth.ignore-serial-consoles

해당 파일은 1줄짜리로 되어있는데, 내용 중 rootwait 부분과 quiet 사이에 modules_load=dwc2,g_ether를 추가해준다.

또한 config.txt 파일에 dtoverlay=dwc2를 추가한다.

50
51
52
53
54
55
56
57
58
# Uncomment this to enable infrared communication.
#dtoverlay=gpio-ir,gpio_pin=17
#dtoverlay=gpio-ir-tx,gpio_pin=18

# Additional overlays and parameters are documented /boot/overlays/README
dtoverlay=dwc2

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

라즈베리 파이 제로의 USB controller인 DesignWare Core2의 OTG 설정을 활성화해주고, USB OTG 모듈 중 g_ether 모듈을 사용하게 하는 것이다.

윈도우즈에서는 이렇게 설정한 라즈베리파이를 연결하면 RNDIS 장치로 인식하게 되는데, 해당 장치 연결 시 컴퓨터가 느려지는 문제가 있다.

라즈베리파이에게 DHCP로 IP를 할당해 줄 수 없을 때

라즈베리파이 제로를 USB로 연결하거나, 공유기 등에서 DHCP 기능을 사용하지 않는 경우 라즈베리파이는 IP를 할당받지 못하게 된다. 고정IP 설정은 boot 파티션 수정으로 할 수 없기 때문에 rootfs 파티션 내부를 수정하거나, 링크 로컬 주소를 사용해야 한다. 위에서 말한대로 rootfs는 ext4로 포멧되어있으니 윈도우즈만 사용하는 경우에는 고정IP 설정은 바로 할 수 없다고 생각하면 된다.

rootfs에서 고정 IP 설정하기

rootfs의 /etc/dhcpcd.conf 파일 끝에 아래와 같이 수정한다.

interface $IF_NAME
static ip_address=$DEV_IP_ADDR/$PREFIX_BITS
static routers=$GATEWAY_IP_ADDR
static domain_name_servers=$DNS_IP_ADDR
  • $IF_NAME은 사용할 네트워크 장치의 이름을 입력한다. (유선랜: eth0, WiFi: wlan0)
  • $DEV_IP_ADDR는 라즈베리파이가 사용할 주소를, $PREFIX_BITS는 서브넷 마스크의 비트 수를 입력하면 된다.
  • $GATEWAY_IP_ADDR는 공유기의 주소를 입력한다.
  • $DNS_IP_ADDR는 DNS의 주소를 입력한다. (대부분 공유기가 DNS요청을 대신 처리해주기 때문에 공유기의 주소를 입력해도 된다.)

유선랜과 WiFi의 설정을 같이 입력해도 된다. 아래는 유선랜이 172.16.1.101, WiFi가 172.16.2.101로 잡히도록 설정한 예시이다. (공유기는 172.16.0.1로 가정)

interface eth0
static ip_address=172.16.1.101/16
static routers=172.16.0.1
static domain_name_servers=172.16.0.1

interface wlan0
static ip_address=172.16.2.101/16
static routers=172.16.0.1
static domain_name_servers=172.16.0.1

SSH 원격 접속 설정하기

boot 파티션 안에 ssh 혹은 ssh.txt 파일만 생성하면 된다. 해당 파일의 내용은 관계없다. (빈 파일도 상관없다.)

리눅스의 경우 touch 명령어를 사용하여 생성할 수 있다.

# touch $RPI_BOOT/ssh

VNC 원격 접속 설정하기

VNC 서버 설정은 boot 파티션 수정으로 할 수 없다. 원칙적으로 VNC 원격 접속 설정은 라즈베리파이를 부팅하고 나서, raspi-config를 사용하여 Interfacing option에서 VNC 서버 사용 여부를 수정해야한다. 하지만 해당 명령어의 코드를 보면 systemctl을 이용하여 VNC 서비스 데몬을 enable시키는 것을 확인할 수 있다. systemctl enable의 역할은 미리 작성된 서비스 데몬의 파일을 자동 실행되도록 심볼릭 링크를 달아주는 것이므로 rootfs에서 미리 수정할 수 있다. 위에서 말한대로 rootfs는 ext4로 포멧되어있으니 윈도우즈만 사용하는 경우에는 VNC 원격 접속 설정은 바로 할 수 없다고 생각하면 된다.

# ln -s -f /usr/lib/systemd/system/vncserver-x11-serviced.service $RPI_ROOTFS/etc/systemd/system/multi-user.target.wants/vncserver-x11-serviced.service

chroot를 통해 미리 라즈베리파이 OS의 rootfs 위에서 작업하거나, 혹은 mount된 경로를 고려하여 심볼릭 링크를 생성해주면 된다.

  • 원본 VNC 서비스 데몬 스크립트 위치: /usr/lib/systemd/system/vncserver-x11-serviced.service
  • 연결할 자동 실행 위치: /etc/systemd/system/multi-user.target.wants/

원본 VNC 서비스 데몬 스크립트의 경로는 위에 설명한 경로로 고정되어야 한다. (라즈베리파이 안에서 해당 스크립트의 위치를 찾으면 되기 때문이다.)

참고 링크

[1] boot 파티션 상세 설명(https://www.raspberrypi.org/documentation/configuration/boot_folder.md)
[2] WiFi 설정을 위한 wpa_supplicant 설명(https://www.raspberrypi.org/documentation/configuration/wireless/headless.md)
[3] 라즈베리파이 제로의 USB OTG 모드 설정(https://gist.github.com/gbaman/50b6cca61dd1c3f88f41)


JaeSang Yoo
글쓴이
JaeSang Yoo
The Programmer

목차