
SBCs를 위한 프로비저닝 및 공유 시스템
Provisioner는 개발자 중심의 프로비저닝 도우미로, 단일 보드 컴퓨터(SBC), 특히 U-Boot 기반 플랫폼을 대상으로 합니다.

다음과 같은 자체 포함 환경을 제공합니다:
운영 모델은 의도적으로 단순합니다:
하나의 보드 => 하나의 프로비저너 인스턴스
Provisioner는 하드웨어에 근접하여 실행되며, 안전하고 다중화된 인터페이스를 통해 개발자에게 제어된 원격 접근을 제공합니다.
프로젝트는 두 가지 주요 요소로 구성됩니다:
| 구성 요소 | 실행 위치 | 역할 |
|---|---|---|
| Provisioner | 호스트 / 실험실 노드 | 제어 평면, 직렬 게이트웨이, 프로비저닝 서비스 |
| goinit | 대상 보드 | 플래싱 에이전트 및 프로비저닝 런타임 |
Provisioner는 워크플로우를 오케스트레이션하고, goinit은 보드에서 로컬로 이를 실행합니다.
Provisioner는 세 가지 운영 평면을 연결합니다:
이를 통해 부트로더부터 런타임 프로비저닝까지 지속적인 제어가 가능합니다.
물리적 콘솔 연결을 소유하고 다음을 제공합니다:
직렬 연결은 궁극적인 대체 제어 경로로 남습니다.
내장 서비스가 부팅 아티팩트를 제공합니다:
TFTP
HTTP
Provisioner는 접근 및 제어 계층 역할을 하는 통합 SSH 엔드포인트를 노출합니다.
모든 원격 상호작용은 단일 SSH 연결을 통해 다중화되며 공개 키 인증을 통해 관리됩니다.
다중화된 채널은 다음을 포함합니다:
접근 관리:
따라서 SSH는 다음을 모두 전달합니다:
Provisioner의 I/O 모델의 핵심에는 라우터가 있습니다. 이는 생산자와 소비자 간의 터미널 스트림을 중개하는 플러그 가능한 소프트웨어 아티팩트입니다.
모든 콘솔 트래픽은 하위 시스템 간에 직접 흐르는 대신 이 구성 요소를 통해 흐릅니다.
라우터 클라이언트는 다음을 수행할 수 있습니다:
예:
라우터는 두 가지 클라이언트 변형을 구분합니다:
| 유형 | 특성 | 예 |
|---|---|---|
| 사람 | 대화형, ANSI 인식 | SSH 터미널 |
| 기계 | 결정적, 원시 I/O | 스크립트, 자동화 |
이를 통해 사용성과 결정성에 맞춰진 스트림 처리가 가능합니다.
유니캐스트
멀티캐스트
여러 엔지니어가 간섭 없이 동일한 콘솔을 볼 수 있습니다.
전용 플러그 가능 감시자가 ANSI 터미널 미묘한 차이를 완화합니다:
하드코딩된 로직이 아닌 플러그인으로 구현되었습니다.
모니터 셸은 대화형 보드 제어를 제공합니다.
> ?
? : this text
board_stat : report last goinit board stat; board must have printed PROVISIONER_MGMT_*
echo : echoes back the argument
enuser : enable user for tunnel
exec_assm : Load and executes the specified assm script
exec_scr : Load and executes the specified script
exec_state : returns the state of the specified script
exit : exit this shell
filter : Filter commands: type 'filter help' for more info
help : this text
log_serial : copies in a file ser.log all sent and received from the serial. Note: overwrites previous.
log_serial_stop : Requires serila log subsystem to stop.
send_serial : send file over serial: send_serial <file> <plain|gzip|xmodem_unix|xmodem_uboot> [dest_path]
send_serial_deps : check remote deps for send_serial plain/gzip: stty, dd, base64, gzip, rm (or busybox).
toff : command PDU using snmp to turn off the board
ton : command PDU using snmp to turn on the board
tterm : terminate serial tunnel connection
ulist : list user state for tunnel
>
filter help
available: enable, disable, default, show, add, remove, help
규칙은 ASCII 또는 HEX로 정의할 수 있습니다:
filter add ascii Hello Hello World
filter add hex 48656c6c6f 48656c6c6f 576f726c64
필터는 다음을 할 수 있습니다:
이는 부트 자동화와 콘솔 정규화에 유용합니다.
Provisioner는 직접 직렬 파일 전송을 지원합니다:
send_serial <file> <mode> [dest_path]
모드:
| 모드 | 방법 |
|---|---|
| plain | Base64 |
| gzip | Base64 + 압축 |
| xmodem_unix | rx를 통한 XMODEM |
| xmodem_uboot | loadx를 통한 XMODEM |
의존성은 다음을 통해 확인됩니다:
send_serial_deps
필요한 유틸리티:
전송 엔진은 독립 실행형 유틸리티 send_console-ng에서 파생되어 Provisioner에 적응되었습니다. 다음 상황에서 파일 전송을 활성화합니다:
기능:
원래 유틸리티와 비교하여:
stdbuf 및 cat 의존성 제거됨dd 도입이를 통해 Provisioner는 심각하게 손상된 보드 상태에서도 작동할 수 있습니다.
어셈블리 스타일 expect 엔진:
로그인 및 부트 흐름에 가장 적합합니다.
직렬 스트림에 바인딩된 외부 프로그램을 실행합니다.
모드:
| 모드 | 동작 |
|---|---|
| line | 라인 버퍼링 |
| char | 바이트 스트림 |
가벼운 예약 통합이 존재하지만 주요 프로젝트 초점은 아닙니다. 다음에만 사용됩니다:
Provisioner는 완전한 실험실 스케줄러가 되는 것을 목표로 하지 않습니다.
Provisioner는 Go로 작성되어 크로스 컴파일이 용이합니다.
make
GOARCH=arm64 make
외부 툴체인이 필요하지 않습니다.
다음에 배포 가능: