저는 현재 Raspberry Pi와 유사한 컴퓨터(Debian 기반)용 디스크 이미지를 구축 중입니다.
내 현재 작업 흐름은 다음과 같습니다.
- 디스크 이미지 생성(비압축 시 최대 16GB, 압축 시 3GB)
- 대상 시스템 전원 끄기
- 대상 시스템에서 SD 카드 꺼내기
- 빌드 컴퓨터에 SD 카드를 삽입하세요.
dd
SD 카드에 이미지 저장- 빌드 머신에서 SD 카드 꺼내기
- SD 카드를 대상 시스템에 삽입하십시오.
- 대상 시스템을 새 운영 체제 버전으로 부팅합니다.
그것은 지루.
주기를 단축하고 싶습니다.
- 디스크 이미지 생성(비압축 시 최대 16GB, 압축 시 3GB)
scp
대상 시스템의 디스크 이미지- 새 이미지로 대상 시스템의 SD 카드를 덮어씁니다.
dd
- 대상 시스템을 새 운영 체제 버전으로 재부팅합니다.
이제 분명히 문제가 있습니다. 다음을 포함하는 마운트된 파티션을 덮어쓰려고 합니다.루트 파일 시스템(디스크 이미지에는 루트 및 부팅 파티션만 포함되어 있습니다). 결국 dd
(이미지를 SD 카드에 복사하는 데 사용했던) 세그폴트가 발생하고 그 후에는 파일 시스템을 복구할 수 없고 더 이상 작동하지 않게 됩니다.
그래서 내 질문은: 현재 rootfs에서 낮은 수준의 데이터 "복구"를 수행할 수 있는 방법이 있습니까? 다음과 같습니다. 관련 바이너리( dd
, reboot
)의 "정적으로 연결된" 버전을 일부 안전한 공간(RAM 디스크)에 복사하고 거기에서 실행합니다.
이상적으로는 대상 시스템에 물리적으로 액세스하지 않고 이 작업을 수행하고 싶습니다(디스크 이미지가 손상되지 않은 경우).
답변1
Brian의 대답은 제가 제안한 것입니다. 웹에서 이미지를 자유롭게 받으십시오. 덮어쓰려는 저장 장치에 이미지를 넣을 수 없기 때문에 다른 방법은 없습니다.
그러나 Brian의 접근 방식에는 이 문제도 있습니다. 현재 부팅된 전체 데비안에서 이미지를 받았다고 가정하면 파일 시스템의 현재 소프트웨어를 덮어쓰기 시작하게 됩니다. 어, 원시 디스크에 다운로드하고 추출하는 동안 일부 하드웨어 중단, 일부 타이머/크론 작업 또는 일부 파일 시스템 유지 관리 도구가 발생하면 어떻게 되나요? 전체 시스템이 충돌할 수도 있고 그렇지 않을 수도 있습니다.
충돌이 발생하면 액세스할 수 없는 위치에서 부팅되지 않는 내장 장치가 남게 됩니다. 이로 인해 노력이 더욱 악화됩니다.
따라서 당신이 해야 할 일은 현재 실행 중인 소프트웨어를 덮어쓰지 않고 소프트웨어를 받아 압축을 푸는 것입니다. 두 가지 방법:
- A와 B라는 두 개의 루트 볼륨이 있습니다. 현재 데비안은 A에서 실행 중이고 B의 모든 것을 안전하게 덮어쓸 수 있습니다. 완료되면 부팅 프로세스에 B에서 부팅하고 시스템을 올바르게 재부팅하도록 지시할 수 있습니다. (일반적으로 부트 로더가 실행되고 RPi 부팅 하드웨어에 대한 부팅 구성 파일을 포함하는 별도의 "부팅" 파티션이 있습니다. 이는 특이한 현상입니다.)
시스템 저장 공간의 두 배 크기가 필요합니다.
나는 완전히 RPi에서 이 작업을 수행하는 방법에 대한 버전의 초안을 작성했습니다.이 최근 답변 - 덮어쓸 루트 볼륨(A)이 있지만 해당 볼륨에서 실행하는 동안에는 이 작업을 수행하지 마십시오. 대신, 부트로더에 항목을 추가한 다음초기 RAM 파일 시스템파일을 부팅 드라이브에 추가하면 메가바이트 이미지에서 부팅되고 이미지가 RAM에 로드되며 거기에서 A로 압축이 풀립니다. 또는 네트워크 설정, SSH 및 압축 해제기 외에는 거의 필요하지 않은 최소 버전의 운영 체제가 포함된 또 다른 (C) 작은 볼륨이 있습니다.
라즈베리파이의 가장 심각한 하드웨어 장애 모드가 쓰기 피로로 인한 SD 카드 정지라는 점과 SD 카드의 가격이 얼마나 저렴한지를 고려하면 아마도 첫 번째 방법(A/B 부팅, 별도의 "유지 관리" 없음)을 택할 것입니다. OS) ), 새 시스템이 완벽하게 작동한다면 blkdiscard
SD 카드 웨어 레벨링에 사용할 공간이 생기도록 현재 사용하지 않는 볼륨을 사용하겠습니다 .
요약하자면, 방법 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를 먼저 수행하십시오.