현재 루트 파티션에 이미지 쓰기

현재 루트 파티션에 이미지 쓰기

저는 현재 Raspberry Pi와 유사한 컴퓨터(Debian 기반)용 디스크 이미지를 구축 중입니다.

내 현재 작업 흐름은 다음과 같습니다.

  1. 디스크 이미지 생성(비압축 시 최대 16GB, 압축 시 3GB)
  2. 대상 시스템 전원 끄기
  3. 대상 시스템에서 SD 카드 꺼내기
  4. 빌드 컴퓨터에 SD 카드를 삽입하세요.
  5. ddSD 카드에 이미지 저장
  6. 빌드 머신에서 SD 카드 꺼내기
  7. SD 카드를 대상 시스템에 삽입하십시오.
  8. 대상 시스템을 새 운영 체제 버전으로 부팅합니다.

그것은 지루.

주기를 단축하고 싶습니다.

  1. 디스크 이미지 생성(비압축 시 최대 16GB, 압축 시 3GB)
  2. scp대상 시스템의 디스크 이미지
  3. 새 이미지로 대상 시스템의 SD 카드를 덮어씁니다.dd
  4. 대상 시스템을 새 운영 체제 버전으로 재부팅합니다.

이제 분명히 문제가 있습니다. 다음을 포함하는 마운트된 파티션을 덮어쓰려고 합니다.루트 파일 시스템(디스크 이미지에는 루트 및 부팅 파티션만 포함되어 있습니다). 결국 dd(이미지를 SD 카드에 복사하는 데 사용했던) 세그폴트가 발생하고 그 후에는 파일 시스템을 복구할 수 없고 더 이상 작동하지 않게 됩니다.

그래서 내 질문은: 현재 rootfs에서 낮은 수준의 데이터 "복구"를 수행할 수 있는 방법이 있습니까? 다음과 같습니다. 관련 바이너리( dd, reboot)의 "정적으로 연결된" 버전을 일부 안전한 공간(RAM 디스크)에 복사하고 거기에서 실행합니다.

이상적으로는 대상 시스템에 물리적으로 액세스하지 않고 이 작업을 수행하고 싶습니다(디스크 이미지가 손상되지 않은 경우).

답변1

Brian의 대답은 제가 제안한 것입니다. 웹에서 이미지를 자유롭게 받으십시오. 덮어쓰려는 저장 장치에 이미지를 넣을 수 없기 때문에 다른 방법은 없습니다.

그러나 Brian의 접근 방식에는 이 문제도 있습니다. 현재 부팅된 전체 데비안에서 이미지를 받았다고 가정하면 파일 시스템의 현재 소프트웨어를 덮어쓰기 시작하게 됩니다. 어, 원시 디스크에 다운로드하고 추출하는 동안 일부 하드웨어 중단, 일부 타이머/크론 작업 또는 일부 파일 시스템 유지 관리 도구가 발생하면 어떻게 되나요? 전체 시스템이 충돌할 수도 있고 그렇지 않을 수도 있습니다.

충돌이 발생하면 액세스할 수 없는 위치에서 부팅되지 않는 내장 장치가 남게 됩니다. 이로 인해 노력이 더욱 악화됩니다.

따라서 당신이 해야 할 일은 현재 실행 중인 소프트웨어를 덮어쓰지 않고 소프트웨어를 받아 압축을 푸는 것입니다. 두 가지 방법:

  1. A와 B라는 두 개의 루트 볼륨이 있습니다. 현재 데비안은 A에서 실행 중이고 B의 모든 것을 안전하게 덮어쓸 수 있습니다. 완료되면 부팅 프로세스에 B에서 부팅하고 시스템을 올바르게 재부팅하도록 지시할 수 있습니다. (일반적으로 부트 로더가 실행되고 RPi 부팅 하드웨어에 대한 부팅 구성 파일을 포함하는 별도의 "부팅" 파티션이 있습니다. 이는 특이한 현상입니다.)
    시스템 저장 공간의 두 배 크기가 필요합니다.
    나는 완전히 RPi에서 이 작업을 수행하는 방법에 대한 버전의 초안을 작성했습니다.이 최근 답변
  2. 덮어쓸 루트 볼륨(A)이 있지만 해당 볼륨에서 실행하는 동안에는 이 작업을 수행하지 마십시오. 대신, 부트로더에 항목을 추가한 다음초기 RAM 파일 시스템파일을 부팅 드라이브에 추가하면 메가바이트 이미지에서 부팅되고 이미지가 RAM에 로드되며 거기에서 A로 압축이 풀립니다. 또는 네트워크 설정, SSH 및 압축 해제기 외에는 거의 필요하지 않은 최소 버전의 운영 체제가 포함된 또 다른 (C) 작은 볼륨이 있습니다.

라즈베리파이의 가장 심각한 하드웨어 장애 모드가 쓰기 피로로 인한 SD 카드 정지라는 점과 SD 카드의 가격이 얼마나 저렴한지를 고려하면 아마도 첫 번째 방법(A/B 부팅, 별도의 "유지 관리" 없음)을 택할 것입니다. OS) ), 새 시스템이 완벽하게 작동한다면 blkdiscardSD 카드 웨어 레벨링에 사용할 공간이 생기도록 현재 사용하지 않는 볼륨을 사용하겠습니다 .

요약하자면, 방법 1을 사용한다고 가정합니다.

  • 시스템에 32GB보다 약간 적은 공간이 필요한 경우 64GB 카드를 구입하세요.
  • 이 시스템에 데비안을 설치하되 기본 파티션 구성을 약간 수정하세요.
    • 디스크를 파티션하라는 메시지가 표시되면 "부팅 - 전체 디스크 사용 및 LVM 설정"을 사용하고 "파티션 구성표" 대화 상자에서 원하는 항목에 따라 "한 파티션의 모든 파일" 또는 "/home 파티션 분리"를 사용합니다. 업그레이드 후에도 살아남기 위해 파이에 파일을 저장하는 홈 디렉터리입니다(나중에 변경할 수도 있습니다. 큰 문제는 아닙니다).
    • 생성할 볼륨 개요의 크기 합계가 SD 카드 크기(간단하게 30GB)의 절반보다 약간 작은지 확인하십시오. 필요한 경우 /(및 /home(있는 경우))의 크기를 그에 맞게 줄입니다.
    • 변경 사항을 디스크에 쓰고, 설치를 완료하고, RPi를 시작하면 작동합니다.
    • (물론 기존 설치의 파티션 크기를 줄여서 이 작업을 수행할 수도 있지만 몇 가지 주의 사항과 나중에 골치 아픈 문제가 있습니다. 깨끗한 LVM 설치부터 시작하는 것이 좋습니다. 후회하지 않을 것입니다. 솔직히 말해서, 저는 그렇지 않습니다. 데비안이 2023년에 기본적으로 LVM을 사용하지 않는 이유를 모르지만 8비트 CPU @ 5MHz 및 16kB RAM(문자 그대로 1983년부터)을 갖춘 특정 브랜드의 개인용 컴퓨터에 특정한 파티션 구성표를 사용하는 것을 선호합니다(문자 그대로 1983년부터). 전에)

따라서 새 시스템을 실행한 후(그리고 추가 설정을 하기 전) 업데이트 프로세스에 대해 설명하겠습니다.

  • 파이에서:
    • 논리볼륨이 있는지 확인 oldsystem(조회 /dev/mapper)
      • 그렇다면 삭제하세요.sudo lvremove your-volume-group-name/oldsystem
    • Pi에서: 압축되지 않은 이미지 크기의 새 볼륨을 만듭니다(여기서는 30GB로 가정).sudo lvcreate -L 30G --name image_prep your-volume-group-name
  • 마지막으로 보내려는 이미지를 추가하세요.
    • 이미지를 압축하려면 다음과 같은 것을 사용하십시오 zstd -12 -T0 < /what/you/want/to/compress > /path/to/images/filesystem.image.zst( -12이미 압축률이 꽤 높기 때문에 그리 빠르지는 않지만 웹에서 시간을 절약해 주기 때문에 그런 것이 있습니다. 1에서 18 사이의 값이 유효하며...)
    • 압축된 이미지의 체크섬을 가져옵니다.sha256sum /path/to/images/filesystem.image.zst >> checksums
    • 호스트에서 수신 시스템으로 이미지를 가져오는 중입니다. 저는 게으르고 보통 작은 Python 웹 서버를 설정합니다(SSH를 통해 복사하면 가난한 RPi의 CPU가 약간 뜨거워지기 때문에). ( cd /path/to/images; python -m http.server -p HTTP/1.1 8765필요한 경우 포트 8765를 열 것입니다. ; 이 컴퓨터의 IP 주소를 기록해 두십시오.
  • 파이에서:
    • 이미지를 가져와서 새 볼륨으로 추출하고 체크섬을 계산합니다.mkfifo checksumpipe; sha256sum > checksum < checksumpipe &
      curl http://ip.address.as.noted:8765/filesystem.image.zst | tee checksumpipe | zstd -d > /dev/your-volume-group-name/image_prep
    • 검증의 체크섬이 전송 호스트에 checksum저장된 것과 동일한 지 확인하십시오.checksums
    • 현재 루트 볼륨의 이름을 찾아( 의심스러운 경우 cat /proc/cmdline검색 root=/dev/mapper/your--volume--group--name-???) 이름을 다음으로 바꿉니다 oldsystem.sudo lvrename your-volume-group-name ??? oldsystem
    • 새로 미러링된 볼륨의 이름을 이전 이름으로 바꿉니다.sudo lvrename your-volume-group-name image_prep ???
    • 볼륨 마운트, 바인딩 마운트 /dev/, 볼륨 /proc /sys진입 /boot, chroot마운트 및 부트로더 업데이트 실행
    • 재시작

mender덜 "데비안"적인 방법은 실제로는 더 효율적인 방법을 사용하는 것일 수 있습니다 .RPi 공식 가이드;"호스트된 성별" 등록에 관한 부분을 무시하고 "독립형" 모드를 찾고 있습니다.

답변2

동일한 시스템에 대해 이 작업을 자주 수행하는 경우. 그런 다음 네트워크 부팅 사용을 고려해보세요. 대상 시스템에 부트로더를 한 번 설치합니다. 그런 다음 대상은 재부팅할 때마다 네트워크 서버에서 현재 운영 체제를 실행합니다.

또는

루트 파티션에 쓰는 것은 나쁜 생각입니다. 그러나 새로운 최소 루트를 생성하고 루트를 새 루트로 회전할 수 있습니다.

답변3

네트워크를 통해 이미징을 수행할 수 있습니다.

소스에서,dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234

나는 그것을 정확하게 추정한다.netcat -l -p 1234 | dd of=/dev/hdc bs=16065b

먼저 대상에서 Enter를 누른 다음 소스에서 Enter를 누르십시오. dd는 작업이 완료될 때까지 메모리에서 실행됩니다. 프로그램이 저장 드라이브에서 실행되지 않습니다. 원하는 합리적인 파티션과 블록 크기(bs)로 교체하세요. /boot 및 /를 이미지화하는 경우 /boot를 먼저 수행하십시오.

관련 정보