답변:
Dpkg에는 RPM에있는 --relocate 기능이 없습니다. 이 기능을 지원하는 RPM 패키지 수를 고려해 볼 가치가 있습니다. 기본적으로는 할 수 없습니다.
시스템에 전역으로 설치하기 전에 무언가를 테스트하려면 chroot를 사용하면됩니다. 이렇게하려면 루트에 액세스 할 수 있어야합니다. 가장 먼저 할 일은 기본 chroot를 만드는 것입니다.
# debootstrap lenny lenny-chroot
이것은 lenny-chroot
디렉토리 안에 Lenny chroot를 만듭니다 .
이제 chroot를 입력 할 수 있습니다 :
# chroot lenny-chroot
이제 우리는 원하는 것을하고 나머지 시스템을 망칠 필요없이 무엇이든 설치할 수 있습니다. 완료되면 exit를 입력하거나 ctrl-D를 누르십시오.
Linuxbrew 는 소스에서 컴파일하고 바이너리를 홈 디렉토리에 유지하는 Linux 용 루트가 아닌 패키지 관리자입니다 (OS X 용으로 널리 사용되는 Homebrew 패키지 관리 시스템 기반).
문서를 인용하면 Linuxbrew 기능은 다음과 같습니다.
젠투 접두사는 원하는 것을 정확하게 수행합니다.
지정된 디렉토리에 모든 패키지를 설치합니다. 루트 액세스가 필요하지 않습니다. 제거하려면 기본 디렉토리를 제거하십시오.
추신 : 우분투> = 11.04 또는 Multiarch가있는 다른 데비안 파생 제품에서는 작동하지 않습니다.
컴파일 옵션을 약간 추가 한 것처럼 컴파일 타임에 다른 접두사 옵션 ( "checkinstall"또는 다른 방법으로)을 사용하여 패키지로 컴파일하는 중도 옵션이 있습니다. 장점은 적성 또는 시냅스와 같은 패키지 관리자에 패키지가 표시된다는 것입니다.
게다가 어떤 경우에는 실제 .deb를 다운로드하고 dpkg 설치를 통해 다른 접두사를 적용하는 것이 가능할 수 있다고 생각하지만 임의의 패키지로 수행 할 수있는 것이 아니라고 생각합니다. 설치하기 전에 내보낼 위치에 대한 일부 변수 (리터럴 명시 적 접두사가 아닌). 나는 "dpkg instdir prefix"에 대한 google 절차에 대해 아무것도 모른다.
fakechroot 를 사용할 수 있습니다 -웹 사이트의 데모를 살펴보십시오.
루트가없는 GoboLinux는 자신의 홈 디렉토리에서 높은 권한이없는 패키지 관리자를 원하는대로 정확하게 수행 할 수 있습니다. 바라건대 당신은 무엇을하고 있는지 알고 있습니다. rootless는 Gobo의 가장 잘 유지되는 설치 모드가 아니며, 몇 년 전에 사용했을 때 설치 스크립트가 다른 Gobo 변경 사항에 비해 약간 오래 되었기 때문에 약간의 조정이 필요했습니다.
꽤 많은 패키지를 다시 .deb
패키지하고 홈 디렉토리에 패키지를 설치할 수 있으며 작동하기 위해 루트 권한이 필요하지 않은 klik이 있지만 초기 설정에는 루트가 필요합니다.
나는 보통 소스를 얻고 "INSTALL"과 같은 파일을 체크 아웃한다. 일반적으로해야 할 지침이 ./configure --prefix=somedir
있습니다. 그런 다음 somedir/bin
경로 에 추가 해야합니다.
내 경험으로는 기존 DEB 패키지를 사용하여 chroot 환경 이 아닌 다른 디렉토리에 쉽게 설치할 수있는 방법이 없습니다 . 데비안 / 우분투 설치 도구 dpkg / aptitude / dselect는 모두 제대로 작동하려면 루트 권한이 필요합니다.
이제 소스 DEB가 제공되면 Debian / rules 파일을 수정하여 패키지를 빌드하고 다른 디렉토리 트리에 설치하도록 할 수 있지만 이미 사용 가능한 바이너리 패키지를 사용하지 않는 것입니다.
다른 사람들이 언급했듯이 debootstrap 을 사용 하고 chroot 환경을 쉽게 구축 할 수 있습니다 . 이전에는 64 비트 호스트에 32 비트 환경을 갖기 위해 수행했지만 최소한 기본 패키지가 복제 된 chroot를 설치해야합니다. 공간이 있고 이것이 가능한 솔루션이라면 chroot 환경에 설치된 응용 프로그램을 쉽게 실행할 수 있도록 dchroot
또는 더 나은 방법 schroot
으로 사용할 수 있습니다.
배포판의 공식 저장소와 어떻게 작동하는지 상상하기가 어렵습니다. 종속성을 어떻게 해결해야합니까? 시스템 또는 홈 디렉토리에서? 둘 다에서 다른 버전을 찾으면 어떻게됩니까?
내가 생각할 수있는 최선의 방법은 사람들이 64 비트 시스템에서 32 비트 응용 프로그램을 사용하는 것과 같은 chroot 환경 일 것입니다. chroot에서 debootstrap을 호출 할 때 더 많은 오버 헤드가 있지만 symlinking , 쉘 래퍼 스크립트 재미로 원하는 것을 할 수 있습니다.
나는 여전히 문제를 해결하고 있지만 기본적으로 필요한 것을 debootstrap하고 fakeroot와 함께 작동해야합니다. debootstrap은 많은 셸 스크립트이므로 틱을 만드는 방법을 알아보기 위해 분리하고 있습니다. 어려운 부분은 일단 설치되면 파일을 제거하는 것입니다.
학교 데비안 서버에 협력 소프트웨어 패키지의 BIG 콜렉션을 성공적으로 설치하는 데 사용한 솔루션이 있습니다. deboostrap
패키지 관리자를 사용하지 않습니다 .
이 방법은 부분적으로 수동이지만 편의를 위해 최선을 다했습니다.
내가 호출 한이 스크립트를 사용합니다 install
(잊지 마십시오 chmod +x
).
#!/bin/bash
# PREFIX is the installation root, i.e. a directory you have write access to
PREFIX=$HOME
# unpack the archive to $PREFIX
ar p "$1" data.tar.xz | tar xJ -C $PREFIX
# go through all unpacked text files and search for occurences of /usr/...
# we're gonna replace some of them with $PREFIX/usr
files=$(dpkg --contents $1 | grep '^-' | awk '{print $6}' | sed 's/^..//' | sort | uniq)
for f in $files; do
file="${PREFIX}${f}"
if grep -Iq . "$file"; then
if grep -q '/usr' "$file"; then
# interactively ask for each occurence, if it should be replaced
vim -c '%s#/usr#'$PREFIX'/usr#gc' -c 'wq' "$file"
fi
else
echo "Leaving binary file $file unmodified"
fi
done
그래서 보통은 먼저을 사용하여 deb 파일을 다운로드합니다 apt-get download package_name
. 그런 다음을 실행 하고 압축을 푼 파일 ./install package_name_blabla.deb
의 각 발생을 /usr
대체 해야하는지 여부를 수동으로 결정 합니다 $PREFIX/usr
.
이 결정은 시스템에 설치된 패키지와이 방법을 사용하여 설치된 패키지에 전적으로 달려 있습니다. 일반적으로 pkg-config 파일은이 대체가 필요하지만 shebang 행은 #!/usr/bin/perl
그렇지 않습니다. 일반적인 경험 규칙은 결과 경로가 기존 파일을 가리켜 야한다는 것입니다.
이 방법으로 패키지를 설치하면 다른 프로그램에 패키지에 대해 알려줘야합니다. 이것은 올바른 값을 부가함으로써 달성 될 수있다 LD_LIBRARY_PATH
, PATH
, PYTHONPATH
, PKG_CONFIG_PATH
, CMAKE_MODULES_PATH
, CMAKE_PREFIX_PATH
등
이 접근 방식에는 종속성이 자동으로 다운로드 / 설치되지 않는다는 경고가 있습니다. 수동으로 추적해야합니다.
또한 APT는 이러한 패키지에 대해 분명히 알지 못하므로 영원히 누락 된 것으로 표시합니다. 그러나 사용자의 설치에 따라 시스템 전체의 앱을 설치하려는 사람은 이치에 맞습니다.
프로그램을 제거 ar p "$1" data.tar.xz | tar tJ
하려면을 사용하여 deb 아카이브의 내용을 나열한 다음에서 모든 파일을 삭제할 수 있습니다 PREFIX
.