직렬 연결을 통해 파일 복사

직렬 연결을 통해 파일 복사

그래서 제가 달성하려는 것은 단순해 보이지만 사전 설치되지 않은 외부 유틸리티나 라이브러리를 사용하지 않고는 이를 수행할 수 있는 방법을 찾을 수 없는 것 같습니다.

Linux(모델에 따라 커널 3.x)를 실행하는 임베디드 시스템이 있습니다. 여기에서 대부분의 GNU 핵심 유틸리티(예: cat, sed, ls, tar 등)에 액세스할 수 있습니다. 예를 들어 screen을 사용하여
이를 통해 쉘 세션에 액세스할 수 있습니다 ./dev/ttyUSBx

screen /dev/ttyUSB0 9600 

내가 screen 을 실행하는 컴퓨터(우리가 이라고 부르는 source)에는 ArchLinux가 설치되어 있고 인터넷에 접속할 수 있습니다. 내가 액세스하려고 하는 임베디드 시스템(우리가 부르는)
은 네트워크 액세스가 없고 직렬 포트만 있는 Linux 상자입니다. 바이너리를 대상의 특정 위치에 복사한 다음 cron 작업을 통해 일부 하드웨어(이 경우 FPGA)를 자동으로 플래시할 수 있어야 합니다. 실제로 소프트웨어를 설치할 수는 없으며 작은 쉘 스크립트만 만들 수 있습니다. scp와 동일한 동작을 달성하기 위해 POSIX 셸 방식을 사용할 수 있지만 ssh 대신 인터페이스를 통해 사용할 수 있다는 것을 알고 계십니까?target/dev/ttyUSBx

target
/dev/ttyUSBx

나는 파이프와 파일 리디렉션을 사용하여 다음을 생각했습니다. -
위 의 바이너리 cat파일을 리디렉션하고 , 스트림을 파일로 리디렉션합니다. 어떻게 시작해야 할지조차 모르겠어요. 내가 사용해야 하는 프로젝트는 내일 마감이지만 지금은 길을 잃었으며 어떤 아이디어라도 환영합니다. 쉘 스크립트에서 직접 사용할 수 있는 표준 POSIX 도구가 바람직합니다./dev/ttyUSBxsource
target

솔루션을 컴파일해야 하는 경우를 대비해 대상에서 gcc에 액세스할 수 있지만 컴파일 속도가 target매우 느리고 여러 컴퓨터에 배포하려면 더 많은 노력이 필요하므로 여전히 셸 솔루션을 선호합니다.

내 목표는 이 워크플로를 자동화하는 것입니다(사용자 상호 작용을 최대한 적게 사용). target파일 시스템을 NFS로 마운트하는 것과 같은 것이 있을까요 ?

답변1

한 가지 가능성은 바이너리 파일을 ASCII 텍스트로 인코딩하거나 전통적인 방식을 사용하는 것입니다.유 인코딩, 또는 약간 더 현대적인 것 base64. 프로그램은 소프트웨어 패키지로 uuencode제공됩니다 .uudecode사루티스, base64위치는 다음과 같습니다.핵심 도구. base64최신 GNU/Linux 배포판에 이미 등장했을 가능성이 더 높습니다 .

바이너리 파일을 인코딩한 결과는 많은 양의 텍스트이며 원칙적으로 터미널 연결을 통해 디코더에 복사/붙여넣기할 수 있습니다 target. 대용량 데이터의 경우 클립보드를 사용하는 것이 실용적이지 않을 수 있지만 도구를 사용하여 screen파일 내용을 터미널에 붙여 넣을 수 있습니다.

  1. 일어나 source, 달려라 base64 FILE > FILE.b64.
  2. screen연결된 세션 에서 targetCtrl-A를 입력합니다 :readreg p /path/to/FILE.b64. ( screen컨트롤 키가 Ctrl-A가 아닌 경우 해당 키를 입력하십시오.) FILE.b64에 대한 전체 경로를 제공해야 하는 것으로 보입니다. ~가 작동하지 않습니다. 화면에는 "버퍼에 26665052자를 넣는 중"과 같은 내용이 보고되어야 합니다.
  3. 콘솔에서 를 target실행합니다 base64 -d > FILE.
  4. Ctrl-A를 입력합니다 :paste p.
  5. Ctrl-D를 입력합니다.

이 문제에 대한 또 다른 장기적인 해결책은 다음과 같습니다.모뎀, 터미널 연결을 통해 파일을 전송하는 고대 방법입니다. 많은 터미널 에뮬레이터에는 lrzsz패키지가 설치되어 있는 한 Konsole과 같은 ZModem에 대한 지원이 내장되어 있습니다 . 하지만 lrzsz가 설치되어 있지 않을 가능성이 높으므로 base64를 사용하는 것이 더 좋습니다.

이러한 방법은 모두 당시 콘솔에 사용 중인 직렬 링크를 통해 파일을 전송하는 문제를 해결합니다. 콘솔이 필요하지 않은 경우 target링크에 있는 내용을 파일로 덤프하는 것이 더 간단해야 합니다. 그러나 직렬 콘솔이 장치와 상호 작용하는 유일한 방법이라면 문제가 됩니다.

답변2

지금까지의 모든 응답을 바탕으로 설치된 유틸리티를 고려하여 target스크립트를 실행하는 것만으로도 작동하는 솔루션을 찾았습니다 source. 스크립트는 다음과 같습니다.

dest="/dev/$(dmesg | grep "now attached to ttyUSB" | awk '{print$NF}' | tail -1)"
cat binfile | gzip | base64 > binfile.64.gz
md5=$(md5sum binfile | awk '{print $1}')
printf "\necho \"[ \\\$(md5sum <target-dir>/binfile | awk '{print \\\$1}') == %s ] &&\\ 
<flashing commands>\" > <target-dir>/flash.sh\n" \
    "$md5" \
    > "$dest"
printf " echo \"%s\" | base64 -d | gunzip > <target-dir>/binfile &&\\
/bin/sh <target-dir>/flash.sh
" "$(cat binfile.64.gz)" \
    > "$dest"

리프레셔를 보내고, 소스와 대상 bin 파일의 체크섬이 동일한지 확인하고,
bin 파일을 압축 및 인코딩하여
전송하고,
리프레셔를 사용하여 카드를 새로 고칩니다. 인코딩/디코딩에 중단이 있는 경우 대상을 플래시해서는 안 됩니다. 간단한 재부팅만으로 시스템을 기본 상태로 복원하므로 다른 문제로 인해 시스템에 문제가 발생할 가능성은 거의 없습니다.

다음은 프로세스의 전체 구현에 대한 링크입니다.
https://github.com/Soulthym/cycloneV-serial-flasher

관련 정보