사용 시 Linux 재정의

사용 시 Linux 재정의

간단히 말해서 USB 플래시 드라이브를 데비안 시스템(ARM 보드의 NAND 메모리에 설치됨)에 연결하고 시스템이 실행되는 동안 USB 플래시 드라이브의 이미지로 NAND를 덮어쓰고 싶습니다. 가능합니까? 아쉽게도 USB로 부팅이 안되서 "심장절개수술" 처럼 해야겠네요

감사해요

편집: 몇 가지 추가 정보

어쩌면 몇 가지 추가 정보를 추가하는 것이 유용할 수도 있습니다. 200개 이상의 마더보드를 업데이트해야 합니다. 실제 절차는 다음과 같습니다.

  1. 마더보드를 끄세요
  2. 상자를 열어라
  3. microSD(데비안 설치 포함)를 보드 슬롯에 삽입하고 USB 플래시 드라이브(새 보드의 NAND 이미지 포함)를 보드의 USB 포트에 삽입합니다.
  4. 온보드 전원 공급 장치
  5. 보드는 microSD에서 Debian 설치를 부팅하고 간단한 dd 명령을 사용하여 USB 스틱의 이미지를 보드의 NAND에 자동으로 복사합니다. gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand완료되면 보드의 전원이 꺼집니다.
  6. 개발 보드의 전원이 꺼지면 microSD와 USB 플래시 드라이브를 분리하세요.
  7. 케이스를 다시 조립하세요
  8. 업데이트된 Debian 설치로 마더보드 전원을 켜세요.

microSD 슬롯은 외부에서 접근할 수 없기 때문에 이 절차가 필요합니다. 한 번만 해보세요... 문제 없습니다. 200번 넘게 했나? 이런!

저는 프로세스 속도를 높이고 일반 사용자가 마더보드를 업데이트할 수 있도록 매우 쉽게 만들고 싶었습니다. 문제가 발생하더라도 문제가 되지 않습니다. 백업이 필요하지 않으며 보드에 데이터도 없고 배포 중인 소프트웨어만 있으면 됩니다.

내 목표는 다음을 수행하는 새로운 프로그램을 만드는 것입니다.

  1. 개발 보드의 전원이 켜져 있고 Debian이 실행 중입니다.
  2. 펜드라이브를 꽂는다
  3. USB 플래시 드라이브에서 스크립트를 시작합니다. 이 스크립트는 작업을 수행 gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand하고 완료 후 개발 보드의 전원을 끕니다.
  4. 업데이트된 Debian은 다음에 부팅할 때 NAND에서 부팅됩니다.

이 간단한 프로그램을 사용하면 USB 스틱 몇 개를 배포할 수 있으므로 사용자는 200개 이상의 마더보드를 모두 가져오지 않고도 마더보드를 업데이트할 수 있습니다. 이 프로세스가 어딘가에서 실패하고 데비안 설치가 손상되면 사용자가 보드를 나에게 가져오면 나는 실제 프로세스를 따르게 됩니다.

보드에는 인터넷 접속이 없으므로 원격으로 로그인하여 업데이트를 시작할 수 없습니다.

답변1

프로그램을 다루는 데 필요한 모든 것을 tmpfs에 넣고 거기에서 실행하면 이를 수행할 수 있습니다. 위험이 있으므로 문제가 발생할 경우를 대비해 백업을 준비해야 합니다.

답변2

한 번도 해본 적이 없고 위험해 보이지만 가능합니다.

먼저, 현재 실행 중인 모든 서비스와 모든 프로그램을 중지한 후 rsync를 실행하세요.

도움이 될 수 있는 또 다른 방법은 작업하는 동안 올바른 라이브러리에 액세스할 수 있도록 먼저 USB OS로 루트를 변경하는 것입니다.

답변3

귀하의 요청이 변경되었으므로 다시 답변해 드리겠습니다.

귀하의 경우에는 ash(ls mv cp rm과 같은 핵심 유틸리티), dd, vi 및 gzip/gunzip 도구와 정적으로 연결된 특수 비지박스를 구축할 것입니다. 스크립트를 작성하고 USB에서 실행하면(USB 드라이브는 ext* 파일 시스템으로 포맷됩니다. 그렇죠?) 스크립트는 update 명령을 사용할 때와 같이 명령을 실행할 때 플래시의 busybox 바이너리만 사용합니다. 좋다: /mnt/pendrive/busybox gunzip -c /mnt/pendrive/hda.img.gz | /mnt/pendrive/busybox dd of=/dev/nand.

업데이트를 실행하기 전에 비지박스(대화형 모드인 경우)에서 셸을 실행하여 exec /mnt/pendrive/busybox ash -l메모리에 있는 모든 셸을 덮어씁니다. 덮어쓴 후에는 사용할 수 없게 되기 때문입니다. 또는 일괄 모드로 실행하려는 경우 #!/bin/shline을 사용하지 말고 비지박스 셸에 대한 전체 경로를 지정해야 합니다(예 : ). 또는 #!/mnt/pendrive/busybox sh다음과 같이 실행할 때 /bin/sh /mnt/pendrive/script.sh실제 비지박스 바이너리로 실행해야 합니다 /mnt/pendrive/busybox sh /mnt/pendrive/script.sh.

업데이트하기 전에 업데이트 중에 NAND에 쓸 수 있는 모든 시스템 활동을 분석하고 중지해야 하므로 일부 서비스(syslog 포함)가 실행 중인 경우 해당 서비스를 종료해야 합니다. 이를 위해 올바른 도구를 사용하십시오. 어쩌면 이를 다시 생성하는 프로세스 관리자가 실행 중일 수도 있습니다.

정전은 즉시 발생해야 하며 서비스를 제거하거나 종료하는 스크립트는 실행되어서는 안 됩니다. echo o >/proc/sysrq-trigger적절한 restart() 시스템 호출을 즉시 호출하는 적절한 shutdown 명령을 사용하여 이를 수행 할 수 있습니다 .

여기에서 busybox에 대한 자세한 정보를 확인할 수 있습니다.http://busybox.net/. 실행 안전을 위해(정적으로 링크된 바이너리에서도 공유 라이브러리가 필요하지 않음) musl libc를 사용하여 busybox를 구축하겠습니다(http://www.musl-libc.org/).

관련 정보