2012-01-19 5 views
1

파일, 제어 파일 및 postinst 파일의 타르 볼을 포함하는 빌드 된 데비안 패키지가 있습니다. dpkg-deb를 사용하여 빌드되었고 dpkg를 사용하여 올바르게 설치됩니다.debian 패키지 내용의 런타임 설치 디렉토리

수정하고 싶은 것은 파일의 설치 디렉토리가 dpkg -i가 deb 파일에서 실행될 때 설정 될 환경 변수를 기반으로 런타임에 결정되도록하는 것입니다. postinst 스크립트에서 환경 변수를 출력하고 그 설정을 제대로 볼 수 있습니다.

내 질문 :

1) 동적으로 런타임에 설치 디렉토리를 판별 할 수 있습니까?

2) 가능한 경우 어떻게해야합니까? 나는 규칙 파일과 mypackage.install 파일에 대해 읽었지만 이것들 중 어느 것이 나를 성취 할 수 있는지는 모른다.

파일을 posinst 스크립트의 대상 위치에 복사하여 해킹 할 수 있지만 가능한 경우 올바른 방법으로 수행하는 것이 좋습니다.

미리 감사드립니다.

+0

설치를 위해'/ usr'와는 다른 루트를 사용하기 위해'dpkg '에 전달할 수있는 옵션이 있습니다. 'deb' 패키지는 그 의미에서 "설치 디렉토리"를 가지고 있지 않습니다 - 당신이 지금 가지고있는 것과 그것을 원할 때의 예제를 추가하면 도움이 될 것입니다. 이론적으로'postinst' 스크립트에서 물건을 옮길 수는 있지만, 나는 당신을 강력하게 낙담시킬 것입니다. – tripleee

+0

좋은 아이디어. 나는 --instdir =을 사용하여 파일을 복사했지만 postinst는 --instdir이 chroot를 실행 한 후 실행되지 않으므로 dpkg admin 디렉토리도 있어야합니다. 또한 두 개의 디렉토리를 분리 할 수 ​​있는지 확인하기 위해 --root와 --admindir을 조합하여 사용하려고했습니다. rpm에는 재배치 플래그가있어 패키지 위치를 이동할 수 있습니다. 이 패키지는 서로 다른 임베디드 리눅스 배포판의 서로 다른 위치에 있어야하므로 동적 디렉토리가 있어야합니다. 예를 들어, 다른 컴퓨터의 다른 위치에있는 하나의 파일을 타르볼에있는 것으로 가정합니다. –

+0

파일이 conffile이 아니라면 나는 단지 두 개의 서로 다른'deb' 패키지를 만들 것입니다. 예는 여전히 도움이 될 것입니다. 전형적으로 패키지 관리 파일은'/ usr/lib/yourpackage.so'와 같은 전형적인 파일이고 전형적으로 예를 들어. '/ etc/yourpackage.cfg'. – tripleee

답변

1

그래서 지난 몇 주 동안이 문제에 대해 알게 된 것입니다.

사전 패키지 된 바이너리를 사용하면 런타임에 결정된 대상 디렉토리 dynamicall로 debian 패키지를 빌드 할 수 없습니다. configure를 사용하여 설치 디렉토리를 설정할 수있는 소스에서 빌드 된 패키지를 설치하는 경우 이것이 가능할 수 있다고 생각합니다. 하지만이 경우 Ubuntu 머신에 내장되어 있으므로 make가 없으므로 이러한 옵션을 추구하지 않았습니다. 나는 작동하지 않는 전통적인 방법 (해킹)을 시도했다. debian 패키지는 단지/tmp 아래에있는 디렉토리에 상대적인 패키지를 빌드하기 만하면됩니다. postinst 스크립트에서 아카이브에서 영구적 인 위치로 파일을 복사 할 위치를 결정할 수 있습니다.

/tmp에서 서브 디렉토리를 자동으로 삭제하고 재부팅 한 후 dpkg가 파일 패키지가 있음을 알지 못할 수도 있습니다. 이것은 문제가되지 않았습니다. 'dpkg -l myapp'를 실행했을 때 여전히 설치되어있는 것으로 나타났습니다. dpkg/apt-get를 사용하여 패키지를 업데이트하는 것도 문제없이 작동했습니다.

내가 찾은 것은 'dpkg -r myapp'를 사용하여 패키지를 제거하려고 시도하면 dpkg가/tmp를 제거하려고 시도한다는 것입니다. 그러나/tmp는 쉽게 제거되지 않으므로 성공하지 못했습니다. 또한 우리 상황에서는 패키지를 제거하지 않고 단순히 업그레이드 만합니다.

플랫폼마다 재 컴파일해야하는 소스 코드 차이로 인해 최종적으로 유니버설 패키지를 포기해야했지만이 방법을 사용하면 작동했을 것입니다.

--instdir을 사용하여 패키지의 설치 디렉토리를 변경하려고 시도했지만 파일의 위치를 ​​변경했지만 dpkg 파일이 새로운 instdir에 상대적으로 발견되지 않아 dpkg가 실패합니다. --instdir을 사용하는 것은 chroot와 비슷합니다. 또한 --admindir과 --root를 다양한 조합으로 시도하여 /에 상대적으로 dpkg 시스템을 사용할 수 있는지 확인했지만 파일을 다시 설치했지만 작동하지 않았습니다. rpm이 우분투가 아니라 작동하는 재배치 옵션을 가지고 있다고 생각합니다.

0

다른 환경의 dpkg-deb를 6 회 실행하여 6 가지 패키지를 생성하는 스크립트를 작성할 수도 있습니다. 수정을하면 스크립트를 실행하기 만하면 모든 6 개의 패키지가 생성되고 postinst 해킹을 피하면서 컴퓨터에 설치할 수 있습니다!

0

왜 표준 위치에 설치하지 않고 단순히 postinst 스크립트를 사용하여 원하는 위치에 대한 심볼릭 링크를 만드시겠습니까? 이것은 훨씬 더 깨끗하며 dpk -I에서 어떤 것도 깨뜨릴 수 없습니다.