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

패키지 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했지만 아무 효과가 없습니다.



답변

보고있는 동작 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행동을 제공 할 수있는 옵션이 없습니다 .)


답변