DEB의 압축을 쉽게 풀고, postinst를 편집하고, DEB를 다시 압축하세요.

DEB의 압축을 쉽게 풀고, postinst를 편집하고, DEB를 다시 압축하세요.

Intel의 OpenCL SDK를 설치하려고 하는데 DEB 파일이 RPM에서 버그가 있는 변환입니다(참조:여기호기심을 위해). postinst그들이 제공하는 DEB에서 스크립트를 편집해야 합니다 .

기존 DEB를 가져와 콘텐츠(제어 정보 포함)를 추출한 다음 나중에 콘텐츠를 다시 패키지하여 새 DEB를 만들 수 있습니까? 파일만 편집할 것이며 파일을 추가하거나 제거하지 않습니다.

답변1

deb 패키지를 조작하는 기본 명령은 다음과 같습니다.dpkg-deb.

패키지의 압축을 풀려면 빈 디렉터리를 만들고 해당 디렉터리로 전환한 다음 실행하여 dpkg-deb제어 정보와 패키지 파일을 추출합니다. dpkg-deb -b패키지를 다시 빌드하는 데 사용됩니다 .

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

스크립트가 루트로 실행되지 않는 한 추출 단계에서 파일의 권한과 소유권이 손상된다는 점에 주의하십시오. 이를 방지하는 한 가지 방법은 다음에서 스크립트를 실행하는 것입니다.fakeroot. 생성할 수 없는 파일의 권한에 대한 메모리를 그대로 유지하는 프로세스 이므로 fakeroot각각 개별적 으로 실행하는 것이 아니라 전체 시퀀스를 실행해야 합니다 .dpkg-debfakeroot

fakeroot sh -c '
  mkdir tmp
  dpkg-deb -R original.deb tmp
  # edit DEBIAN/postinst
  dpkg-deb -b tmp fixed.deb
'

권한을 혼란스럽게 하는 대신 데이터 아카이브를 그대로 유지하고 제어 아카이브만 수정할 수 있습니다. dpkg-deb그렇게 할 수 있는 방법을 제공하지 않습니다. 다행히도 deb 패키지는 표준 형식입니다.ar아카이브. 따라서 ar제어 아카이브를 추출하고, 해당 파일을 수정하고, ar다시 사용하여 제어 아카이브를 새 버전으로 교체할 수 있습니다.

mkdir tmp
cd tmp
ar p ../original.deb control.tar.gz | tar -xz
# edit postinst
cp ../original.deb ../fixed.deb
tar czf control.tar.gz *[!z]
ar r ../fixed.deb control.tar.gz

당신은해야~을 추가하다변경 로그 항목그리고 변경버전 번호패키지의 내용을 수정한 경우. 데비안 패키지를 조작하기 위한 인프라에서는 두 패키지의 이름과 버전이 동일하면 동일한 패키지라고 가정합니다. 에 접미사를 추가하세요.debian_revision버전 번호 끝에 있는 부분; 정렬상의 이유로 접미사는 로 시작해야 합니다 . ~예를 1.2.3-4.1들어 가 됩니다 1.2.3-4.1~johnjumper1.

쉘 도구를 사용하는 대신 Emacs를 사용할 수 있습니다. 그만큼dpkg-dev-el패키지(네이티브 데비안 패키지이므로 자체 업스트림입니다)에는 .deb파일을 편집하고 데비안 변경 로그를 편집하는 모드가 포함되어 있습니다. Emacs는 대화형으로 사용하거나 스크립트로 사용할 수 있습니다.

답변2

당신이 사용할 수있는fpm--after-install다음과 같이 스크립트를 대체하는 옵션이 있습니다 postinst.

fpm -e --after-install ../DEBIAN/postinst.new -s deb -t deb ../old.deb

답변3

.deb 파일에서만 파일을 추출하려면 7-Zip이 편리합니다. 7-Zip은 "압축해제만"을 위해 "ar" 파일을 지원합니다. (파일 이름을 바꿀 필요가 없습니다. *.deb를 "ar"로 열고 내부에 "data.tar"를 표시합니다.)

관련 정보