dpkg는 FAT 파일 시스템의 파일을 대체합니다.

dpkg는 FAT 파일 시스템의 파일을 대체합니다.

패키지 dpkg(그리고 궁극적으로 apt-get 등과 같이 패키지를 사용하는 모든 것)를 업그레이드하거나 다시 설치하면 패키지를 교체하기 전에 하드 링크를 생성하여 기존 파일을 백업합니다. 이렇게 하면 압축 해제에 실패하더라도 기존 파일을 쉽게 되돌릴 수 있습니다. 이는 Bad Things™ 발생으로부터 운영 체제를 보호하기 때문에 좋습니다.

제외하고 ... 작동합니다파일 시스템이 하드 링크를 지원하는 경우. FAT 파일 시스템과 같이 모든 파일 시스템이 이를 수행하는 것은 아닙니다.

저는 특정 임베디드 ARM 플랫폼용 Debian 배포판을 개발 중입니다. 부팅 환경에서는 부팅 코드가 해당 파일을 찾아 로드할 수 있도록 특정 파일(커널 포함)이 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

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

웹을 검색했는데 내가 찾을 수 있는 유일한 참조는 특정 업그레이드를 수행하는 특정 문제가 있는 특정 사람들에 대한 것이며 대답은 일반적으로 "/boot/vmlinuz-3.18.11+를 삭제하고 다시 시도하십시오"이며 예, 특정 문제가 해결되었습니다. 문제.

하지만 그건 내 대답이 아니다. 저는 OS 사용자가 아닌 OS 리셀러이므로 최종 사용자가 업그레이드하기 전에 커널 파일을 수동으로 삭제하지 않는 방식으로 이 문제를 해결할 수 있는 방법이 필요합니다. dpkg에게 /boot의 파일(또는 관심 있는 모든 파일, 업그레이드 작업 속도가 약간 느려지지만)에 "하드링크가 아닌 복사"를 지시하거나 "하드링크가 실패하는 경우" 더 나은 방법이 필요합니다. 불평하면 그냥 복사하세요.”

나는 표시와 --force-unsafe-io같은 것을 시도했지만 아무것도 작동하지 않습니다.--force-alldpkg

답변1

당신이 보고 있는 동작은 소스 코드에 archives.c구현되어 있습니다 dpkg.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

관련 정보