Linux를 사용한 Raspberry Pi 헤드리스 설정 [단계별]


키보드와 모니터 없이 Raspberry Pi를 설치하는 방법(예: Linux를 사용하여 Raspberry Pi의 헤드리스 설정)을 보여주는 단계별 가이드입니다.

Linux 시스템에서 Raspberry Pi에 Raspbian을 설치하는 것은 어려운 작업이 아닙니다. 그리고 Raspberry Pi 재단은 Raspberry Pi 헤드리스(모니터와 키보드가 연결되지 않음) 및 무선(Wi-Fi를 통해)을 설치해야 하는 경우를 제외하고 이를 수행하는 데 필요한 정보를 제공합니다. 그리고 이것은 단지 나의 경우입니다.

이 튜토리얼에서는 Raspberry Pi의 헤드리스 설정을 수행하는 방법을 보여 드리겠습니다. 또한 실제로 작동하는 모습을 볼 수 있도록 단계에 대한 비디오를 만들었습니다.

헤드리스 설정 Raspberry Pi

헤드리스 설치를 진행 중이므로 여기서는 Linux 명령줄을 광범위하게 사용할 것이기 때문에 Linux 명령줄에 어느 정도 익숙하다고 가정합니다. 이 튜토리얼에서는 Debian Linux를 사용했습니다.

1단계: Raspberry Pi Foundation 다운로드 서명 키를 키링으로 가져오기

나는 정품 여부를 확인하지 않고 소프트웨어를 설치하는 것을 좋아하지 않으므로 먼저 Raspbian 이미지를 검증하는 데 필요한 키를 GPG 키링에 추가하겠습니다.

오늘 현재 Raspberry Pi Foundation에서 다운로드하는 서명 키 지문은 54C3DD610D9D1B4AF82A37758738CD6B956F460C입니다. 다른 소스를 사용하여 교차 확인하는 것이 좋습니다. 키는 2019-04-10에 만료되므로 이 날짜 이후에 이 기사를 읽으면 달라질 것입니다.

gpg --recv-key 54C3DD610D9D1B4AF82A37758738CD6B956F460C

2단계: Raspberry OS 이미지 및 해당 서명 다운로드

최신 버전의 Raspberry OS(이전에는 Raspbian으로 알려짐)를 이 주소에서 항상 사용할 수 있습니다.

그러나 이것은 방향전환일 뿐이다. 이미지와 해당 분리 서명 파일을 모두 다운로드하려면 실제 주소가 필요합니다.

가장 좋은 방법은 고급 curl 흑마법을 사용하는 것입니다.

URL=https://downloads.raspberrypi.org/raspbian_lite_latest
EFFECTIVE_URL=$(curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null)
echo $EFFECTIVE_URL

항상 해당 명령을 기억하는 데 어려움이 있다는 점을 인정해야 합니다. 따라서 대화형 사용을 위해 제한된 리디렉션 횟수를 사용하는 간단한 wget 명령을 사용하는 경우가 많습니다.

URL=https://downloads.raspberrypi.org/raspbian_lite_latest
EFFECTIVE_URL=$(wget --max-redirect=0 $URL 2>&1 | sed -En 's/Location: ([^ ]*).*$/\1/p')
echo $EFFECTIVE_URL

(실제로 특정 경우에는 --max-redirect=1이어야 하지만 첫 번째 수준의 리디렉션만 통과하면 우리 요구에 충분합니다.)

이제 이미지와 분리된 서명을 모두 다운로드하는 데 필요한 유효한 URL이 있습니다.

wget "$EFFECTIVE_URL"{,.sig}

저처럼 인터넷 연결이 불안정하다면 동영상을 녹화할 때 했던 것처럼 기본값인 900초보다 훨씬 더 공격적인 시간 제한을 명시적으로 추가하는 것을 고려해 보세요.)

3단계: 서명 확인

잠시 후 다운로드가 완료되고 현재 디렉터리에 다음 두 파일이 있어야 합니다.

ls *raspbian*
2017-11-29-raspbian-stretch-lite.zip  2017-11-29-raspbian-stretch-lite.zip.sig

이제 GPG를 사용하여 서명이 파일에 해당하는지 그리고 서명이 신뢰할 수 있는 기관에서 발행되었는지 여부를 모두 확인할 수 있습니다.

gpg --verify 2017-11-29-raspbian-stretch-lite.zip{.sig,}
gpg: Signature made Thu 30 Nov 2017 02:48:51 PM CET
gpg:                using RSA key 8738CD6B956F460C
gpg: Good signature from "Raspberry Pi Downloads Signing Key" [full]

이 단계에서 "Raspberry Pi 다운로드 서명 키"의 올바른 서명 이외의 모든 것은 이상한 일이 발생하고 있음을 경고해야 합니다.

호기심을 충족시키기 위한 예로서, 이 경우 GPG가 정확히 무엇을 보고하는지 확인하기 위해 파일을 가짜로 만들어 보겠습니다.

# Add just one byte to the file
(cat 2017-11-29-raspbian-stretch-lite.zip; echo) > 2017-11-29-raspbian-stretch-lite.zip.fake
gpg --verify 2017-11-29-raspbian-stretch-lite.zip{.sig,.fake}
gpg: Signature made Thu 30 Nov 2017 02:48:51 PM CET
gpg:                using RSA key 8738CD6B956F460C
gpg: BAD signature from "Raspberry Pi Downloads Signing Key" [full]

왜 sha256 파일 지문을 대신 사용하지 않았나요?

Raspbian 다운로드 페이지에 파일의 sha256 체크섬이 표시되는 것을 보셨을 것입니다. 이를 사용하여 무고한 다운로드 오류에 대해 파일 무결성을 확인할 수 있습니다. 그러나 그러한 맥락에서는 파일 진위를 확인하는 데 사용할 수 없습니다. 따라서 악의적인 행동으로부터 사용자를 보호할 수 없습니다. 예를 들어 공격자가 Raspbian 이미지를 저장하는 서버를 파괴한 경우 웹 서버를 제어하여 자신이 선택한 sha256 합계를 표시할 가능성이 있습니다. 반면 GPG 서명은 파일 무결성과 진위 여부를 모두 확인합니다.

4단계: 이미지 복사

Raspbian 이미지가 진짜 이미지라고 확신했다면 이제 이를 메모리 카드에 복사할 차례입니다.

하지만 먼저 커널이 메모리 카드를 식별하는 데 사용하는 장치 이름을 알아야 합니다. 따라서 메모리 카드가 카드 리더기에 있지 않은지 확인하십시오. 그런 다음 감시 모드에서 dmesg 유틸리티를 실행합니다.

sudo dmesg -w

이제 카드 리더기에 카드를 꽂아보세요. 이 시점에서 dmesg는 장치 이름을 포함하여 카드에 대한 일부 정보를 표시합니다.

mmc0: new SDHC card at address e624
mmcblk0: mmc0:e624 SC16G 14.8 GiB
mmcblk0: p1

여기에서 /dev/mmcblk0 이름을 통해 내 메모리 카드에 액세스할 수 있는 것을 볼 수 있습니다. 그리고 현재 /dev/mmcblk0p1로 액세스할 수 있는 파티션(p1)이 하나만 포함되어 있습니다.

dmesg 버전이 -w 플래그를 지원하지 않으면 다른 방법으로 작업을 수행하십시오. 카드를 먼저 카드 리더에 넣고 나중에 dmesg를 사용하여 메시지를 확인하십시오.

일부 시스템에서는 카드를 "자동 마운트"할 수 있으므로 더 진행하기 전에 명시적으로 확인하는 것이 더 안전합니다.

sudo umount /dev/mmcblk0*

마지막으로 파일 자체를 복사할 차례입니다.

unzip -p 2017-11-29-raspbian-stretch-lite.zip |
  sudo dd of=/dev/mmcblk0 conv=fsync

파일을 복사하는 데 꽤 오랜 시간이 걸릴 수 있으므로 터미널이 오랫동안 응답하지 않는 것처럼 보이더라도 당황하지 마십시오.

복사가 완료되면 장치의 파티션 테이블이 변경되었으므로 커널에 다시 로드하도록 요청하는 것이 더 안전합니다. 이렇게 하면 나중에 시스템에 메모리 카드 파티션을 마운트할 수 없는 문제를 진단하기 어려운 부분을 피할 수 있습니다.

sudo partprobe /dev/mmcblk0

5단계: 시작 시 SSH 활성화

시작 시 SSH를 활성화하려면 카드 부팅 파티션에 센티넬 파일을 생성하기만 하면 됩니다. 파일 내용은 의미가 없습니다. 단지 존재해야만 합니다.

sudo mount /dev/mmcblk0p1 /mnt -o umask=000
touch /mnt/ssh

6단계: 시작 시 Wi-Fi 활성화

wpa_supplicant는 Wi-Fi 액세스 포인트에 액세스하기 위해 컴퓨터에서 사용하는 소프트웨어입니다. Raspbian에 사전 설치되어 있지만 작동하려면 약간의 구성이 필요합니다.

가장 기본적인 wpa_supplicant.conf 파일에는 지역 규정 준수를 보장하기 위해 해당 지역의 국가 코드만 포함되어 있습니다.

cat > /mnt/wpa_supplicant.conf << EOT
country=FR
EOT

루트가 아닌 소프트웨어(예: wpa_cli)가 구성을 변경하도록 허용할지 여부에 따라 ctrl_interface=… 옵션을 추가하고 결국에는 update=1 옵션을 사용하면 루트가 아닌 클라이언트가 wpa_supplicant.conf를 덮어써 변경 사항을 영구적으로 적용할 수 있습니다. 전자의 예를 보려면 첨부된 비디오를 확인하고, 후자의 예는 웹에서 쉽게 찾을 수 있습니다.

마지막으로 가능한 모든 구성 설정을 참조하려면 여기를 확인하세요.
https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf

모든 경우에 wpa_supplicant가 액세스 포인트에 연결할 수 있도록 필요한 자격 증명을 추가해야 합니다. 저는 비밀번호를 일반 텍스트로 저장하는 것을 좋아하지 않으므로 wpa_passphrase를 사용하겠습니다.

SSID=my_wifi # This is your Wi-Fi AP SSID (the "name" of your Wi-Fi)
(
  # Disable echoing
  stty_orig=$(stty -g);
  trap 'stty $stty_orig' EXIT;
  stty -echo;
  # Read password from the terminal
  read -rp 'Enter your password: ';
  echo $REPLY
) | wpa_passphrase $SSID | sed '/^[[:space:]]*#/d' >> /mnt/wpa_supplicant.conf

모든 것이 올바른지 확인하겠습니다.

cat /mnt/wpa_supplicant.conf

괜찮다면 카드를 마운트 해제하고 카드 리더에서 제거하세요.

sudo umount /mnt

7단계: 보드 부팅

보드를 부팅할 준비가 거의 완료되었습니다.

그러나 SSH를 통해 액세스하려면 IP 주소가 필요합니다. 해당 정보를 얻기 위한 다양한 솔루션이 있습니다. 보드에서 고정 IP 주소를 사용할 수 있습니다.

또는 DHCP 서버의 로그를 확인하여 보드가 확보된 후 보드와 관련된 임대를 식별할 수 있습니다.

또는 nmap을 사용하여 전체 네트워크를 스캔할 수도 있습니다.

여기서는 덜 방해적이고 다소 교육적이므로 tcpdump를 사용하겠습니다.

따라서 보드를 부팅하기 전에 네트워크에 연결된 컴퓨터에서 tcpdump를 실행하세요.

sudo tcpdump -lenqti any port 68 or arp | grep "^ B"

여기서는 tcpdump에 DHCP(포트 68) 및 ARP 관련 트래픽을 감시하도록 요청합니다. 나는 모든 인터페이스에서 듣는 "게으른" 접근 방식을 취했습니다. 여기에는 tcpdump에서 직접 브로드캐스트 패킷을 필터링할 수 없는 것과 같은 몇 가지 단점이 있으므로 추가 grep 프로세스가 필요합니다. 그러나 컴퓨터를 직접 대상으로 하는 ARP 및 DHCP 트래픽이 매우 높지 않는 한 여기서는 심각한 문제가 되지 않습니다.

패킷 캡처 도구가 준비되었으면 이제 보드를 부팅할 수 있습니다. 몇 초 후에 tcpdump는 보드에서 들어오는 일부 트래픽을 캡처합니다. 먼저 DHCP 서버를 찾고, 나중에 DHCP가 제공한 IP 주소를 사용할 수 있는지 확인하고, 마지막으로 해당 IP 주소의 새 소유자로 자신을 광고합니다.

이벤트의 라이브 스트림을 보려면 비디오의 해당 부분을 시청하는 것이 좋습니다.

보드의 IP 주소를 식별한 후에는 이제 평소처럼 SSH를 통해 보드에 연결할 수 있습니다.

ssh pi@IP_OF_THE_BOARD

이 시점에서 보드는 여전히 기본 재고 비밀번호로 실행 중이므로 비밀번호를 변경하는 것이 가장 먼저 해야 할 작업 중 하나입니다.

passwd

완료되었습니다. 보드가 완전히 설정되었고 로컬 Wi-Fi 네트워크를 통해 SSH를 통해 액세스할 수 있으며 보드로 원하는 모든 작업을 수행할 수 있습니다. 하지만 그것은 귀하의 업무의 일부입니다! 따라서 Raspberry Pi로 수행한 작업과 설정하는 동안 발생할 수 있는 어려움을 주저하지 말고 알려주십시오. 그리고 더 많은 소식을 기대해 주세요!