DEB의 포장 풀기, postinst 편집 및 DEB 재 포장 용이


129

인텔의 OpenCL SDK를 설치하려고하는데 DEB 파일은 RPM에서 버그가있는 변환입니다 ( 호기심 은 여기 를 참조 하십시오 ). postinst제공하는 DEB 에서 스크립트 를 편집해야 합니다.

기존 DEB를 가져 와서 내용 (컨트롤 정보 포함)을 추출한 다음 나중에 내용을 다시 패키지하여 새로운 DEB를 만들 수 있습니까? 파일 만 편집하고 파일을 추가하거나 제거하지 않습니다.

답변:


202

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파일을 데비안 변경 기록을 편집 할 수 있습니다. 이맥스는 대화식으로 사용하거나 스크립트로 사용할 수 있습니다.


4
fpm-e 스위치 를 사용하여 제어 파일을 변경할 수도 있습니다 .. 편집기에서 제어 파일이 열립니다. fpm -e -s deb -t deb ../old.deb
Artefacto 2016 년

1
btw, fakeroot bash소유권 문제와 관련하여 명령을 실행하려고 시도하지 않으며, ar큰 deb 파일에 대한 방법이 엄청나게 빠릅니다!
물병 자리 힘

1
감사. 이것은 유용했습니다. dpkg-deb -R모드를 사용 하여 추출한 파일을로 dpkg-deb -b재설정 uid:gid했습니다 0:0. fakeroot가 필요하지 않았습니다. (아카이브 내에 id 파일이 설정되어 있지만 문제가되지 않을 경우 문제가있을 수 있습니다.
PSkocik

2
@PSkocik setxid 파일뿐만 아니라 특정 그룹에 속 /etc하거나 /var특정 그룹에 속해야하는 파일 및 디렉토리 등 .
Gilles

8

다음 과 같이 fpm--after-install옵션 과 함께 사용 하여 postinst스크립트 를 교체 할 수 있습니다 .

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

2
데비안 / 우분투에서 fpm을 설치하려면 : sudo apt-get install ruby-dev build-essential; sudo gem install fpm
Craig S. Anderson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.