FAT 파일 시스템에서 파일을 교체하는 dpkg


22

패키지 dpkg(및 궁극적으로 apt-get 등을 사용 하는 패키지)를 사용하여 패키지를 업그레이드하거나 다시 설치하면 교체하기 전에 파일에 대한 하드 링크를 만들어 기존 파일을 백업합니다. 이렇게하면 압축 풀기가 실패하면 기존 파일을 쉽게 되돌릴 수 있습니다. Bad Things ™에서 운영 체제를 보호하기 때문에 훌륭합니다.

파일 시스템이 하드 링크를 지원하는 경우 에만 작동 합니다 . FAT 파일 시스템과 같은 모든 파일 시스템이 아닙니다.

특정 임베디드 ARM 플랫폼 용 데비안 배포판을 작업 중이며 부트 환경에서는 특정 파일 (커널 포함)이 FAT 파일 시스템에 있어야 부트 코드가 파일을 찾아로드 할 수 있습니다.

커널 패키지 (또는 해당 FAT 파티션에 파일이있는 다른 패키지)를 업그레이드하면 설치가 실패합니다.

dpkg: error processing archive linux-image3.18.11+_3.18.11.2.armadillian_armhf.deb (--install):
 unable to make backup link of `./boot/vmlinuz-3.18.11+' before installing new version: Operation not permitted

그리고 전체 업그레이드가 실패합니다.

웹을 검색 한 결과 특정 업그레이드를 수행 할 때 특정 문제가있는 특정 사람들 만 찾을 수 있습니다. 일반적으로 "삭제 / 부팅 /vmlinuz-3.18.11+ 및 다시 시도"라는 대답이 있습니다. 특정 문제를 해결합니다.

그러나 그것은 저에게 답이 아닙니다. 저는 OS 사용자가 아닌 OS 배포자이므로 업그레이드를 수행하기 전에 최종 사용자가 커널 파일을 수동으로 삭제하지 않는 문제를 해결할 수있는 방법이 필요합니다. dpkg에게 / boot에있는 파일 (또는 업그레이드 작업이 다소 느려질 수 있지만 내가 관심을 갖는 모든 파일에 대해 "하드 링크가 아니라 복사") 또는 "하드 링크가 실패하면 불평하지 말고 대신 복사하십시오. "

나는 --force-unsafe-io및 심지어 --force-all플래그 와 같은 것을 시도 dpkg했지만 아무 효과가 없습니다.


위시리스트 버그의 시간처럼 들립니다. :-)
Faheem Mitha

답변:


13

보고있는 동작 archives.cdpkg소스 1030 (버전 1.18.1의 경우) 에서 구현됩니다 .

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf))
  ohshite(_("unable to make backup link of '%.255s' before installing new version"),
          ti->name);

1003 행과 다음에 사용되는 이름 바꾸기 동작으로 돌아가서 링크 실패를 처리 할 수있는 것으로 보입니다. 다음과 같이 (테스트되지 않았습니다) :

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf)) {
  debug(dbg_eachfiledetail,"link failed, nonatomic");
  nifd->namenode->flags |= fnnf_no_atomic_overwrite;
  if (rename(fnamevb.buf,fnametmpvb.buf))
    ohshite(_("unable to move aside '%.255s' to install new version"),
            ti->name);
}

나는 dpkg전문가가 아닙니다 ... (그리고이 dpkg행동을 제공 할 수있는 옵션이 없습니다 .)


내 버전의 dpkg를 패키징하는 것이 가능하지만 내 버전의 업스트림 변경 사항을 추적하는 오버 헤드를 원하지 않습니다.
Majenko

좋아, 이것이 잘 작동하는지 확인할 수 있으므로 확실히 옵션입니다. 나에게 일어날 수있는 또 다른 옵션은 패키지의 preinst스크립트 에서 문제가되는 파일을 수동으로 옮기는 것입니다. 그러나 커널이 표준 커널 패키징 스크립트에 의해 만들어 짐에 따라 수정 방법을 잘 모르겠습니다. 또한 자동 롤백 기능이 없습니다.
Majenko 2016 년

1
실제로, 그것은 작동 할 것입니다; dpkg후크 ( dpkg --pre-invoke=)를 조사 할 수도 있습니다 .
Stephen Kitt

+1 dpkg이것을 알고있을 때 어떻게 전문가가 되지 않습니까!
nikhil

1
raspberrypi 커널도 dpkg-divert를 사용하여 유사한 트릭을 통해 업데이트됩니다. 에서 촬영 raspberrypi.stackexchange.com/questions/51410/... ,
akarapatis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.