Gibt es eine Möglichkeit, APT dazu zu bringen, Pakete in meinem Home-Verzeichnis zu installieren?


Antworten:


17

Dpkg verfügt nicht über die RPM-Funktion --relocate. Es lohnt sich jedoch zu überlegen, wie viele RPM-Pakete diese Funktion unterstützen. Grundsätzlich geht das nicht.

Sie können eine Chroot verwenden, um etwas zu testen, bevor Sie es global auf dem System installieren. Dazu müssen Sie in der Lage sein, auf root zuzugreifen. Als Erstes müssen Sie eine Basis-Chroot erstellen:

# debootstrap lenny lenny-chroot

Dadurch wird eine Lenny-Chroot im lenny-chrootVerzeichnis erstellt.

Nun können wir die Chroot betreten:

# chroot lenny-chroot

Jetzt können wir tun, was immer wir wollen, und alles installieren, ohne den Rest des Systems durcheinander zu bringen. Wenn wir fertig sind, geben Sie einfach exit ein oder drücken Sie Strg-D


8

Linuxbrew ist ein weiterer Nicht-Root-Paketmanager für Linux (basierend auf dem beliebten Homebrew-Paketverwaltungssystem für OS X), der aus dem Quellcode kompiliert und die Binärdateien in Ihrem Ausgangsverzeichnis aufbewahrt.

Linuxbrew bietet folgende Funktionen, um die Dokumente zu zitieren:

  • Kann Software in einem Home-Verzeichnis installieren und benötigt daher kein sudo
  • Installieren Sie Software, die nicht von der nativen Distribution gepackt wurde
  • Installieren Sie aktuelle Softwareversionen, wenn die native Distribution alt ist
  • Verwenden Sie denselben Paket-Manager, um sowohl Ihre Mac- als auch Linux-Computer zu verwalten

7

Gentoo Präfix macht genau das, was Sie wollen.

Es installiert alle Pakete in einem angegebenen Verzeichnis. Kein root-Zugriff erforderlich. Wenn Sie es loswerden möchten, entfernen Sie einfach das Basisverzeichnis.

PS: Dies funktioniert nicht auf Ubuntu> = 11.04 oder anderen Debian-Derivaten mit Multiarch.


1
Gentoo baut aus dem Quellcode auf, Poster scheint via Paket in ein bestimmtes Verzeichnis installieren zu wollen. Das ist nicht wirklich dasselbe.
Andrew Fall

1
@ AndrewCase Gentoo hat auch Pakete, glaube ich. Die Tatsache, dass sie nicht binär sind, spielt für die endgültige Installation keine Rolle.
Jiggunjer

4

Nur als kleine Ergänzung zu der Möglichkeit, es zu kompilieren, gibt es die Möglichkeit, zur Kompilierungszeit in ein Paket mit einer anderen Präfix-Option zu kompilieren (mit "checkinstall" oder einer anderen Methode). Der Vorteil ist, dass das Paket auf Paketmanagern wie aptitude oder synaptic angezeigt wird.

Abgesehen davon denke ich, dass es in einigen Fällen möglich ist, die aktuelle .deb-Datei herunterzuladen und ein anderes Präfix per dpkg-Installation zu erzwingen, aber ich denke, dass dies nicht mit einem zufälligen Paket möglich ist, sondern mit dem sie kompiliert wurden Einige Variablen für ihren Speicherort (anstelle des expliziten Literalpräfix), die Sie vor der Installation exportieren möchten. Ich weiß nichts über die Prozedur, google nach "dpkg instdir prefix".



1

Rootless GoboLinux kann genau das tun, wonach Sie suchen: Paketmanager ohne erhöhte Berechtigungen in Ihrem eigenen Ausgangsverzeichnis. Hoffentlich wissen Sie, was Sie tun. rootless ist nicht der am besten gewartete Installationsmodus von Gobo, und als ich ihn vor einigen Jahren verwendet habe, waren einige Anpassungen erforderlich, da das Installationsskript im Vergleich zu anderen Gobo-Änderungen etwas veraltet war.

Es gibt auch klik, die eine ganze .debReihe von Paketen neu packen, Pakete in Ihrem Home-Verzeichnis installieren können und keine Root-Rechte benötigen, um zu funktionieren.


1

Normalerweise besorge ich mir die Quellen und checke eine Datei wie "INSTALL" aus. Normalerweise gibt es Anweisungen zu tun ./configure --prefix=somedir. Dann müssen Sie somedir/binIhren Pfad ergänzen .


Es kann schwierig sein, Abhängigkeiten abzurufen, zu kompilieren und auf dem neuesten Stand zu halten.
Paolo

Das ist rückwärts. Die Frage ist, wie Paketmanager (die seit den 1990er Jahren bevorzugt werden) dazu gebracht werden können, sich auf diese Weise zu verhalten.
Leichtigkeit Rennen mit Monica

1

Nein, ich glaube nicht, dass du kannst.

Das Beste, woran ich jetzt denken kann, ist apt-get source, Ihr Paket zu verwenden und zu kompilieren. Vielleicht könnten Sie die Prozedur (die mehr oder weniger automatisiert sein kann) irgendwie optimieren, um die Pakete in Ihrem Haus zu installieren.

Eine andere Möglichkeit besteht dpkg -Xdarin, es in ein Verzeichnis Ihrer Wahl zu extrahieren.


0

Es gibt sehr wenige Fälle, in denen Sie Pakete in Ihrem privaten Ordner installieren müssen.

Sie können jedoch Software kompilieren und auf Ihrem lokalen Computer installieren. Einfach entpacken und dann mit ./configure --prefix=$HOME/localoder einem anderen Verzeichnis konfigurieren . Sie können dann makeund make installwie gewohnt. Dadurch wird das Programm kompiliert und installiert ~/local/, z. B. in dem Programm, das Sie ausführen ~/local/bin/programmname.


0

Aus eigener Erfahrung gibt es keine einfache Möglichkeit, vorhandene DEB-Pakete für die Installation in einem anderen Verzeichnis zu verwenden, das keine Chroot- Umgebung ist. Die Debian / Ubuntu-Installationstools dpkg / aptitude / dselect erfordern alle Root-Rechte, um richtig zu funktionieren.

In Anbetracht der Quell-DEB können Sie die Debian / rules-Datei so ändern, dass das Paket in einem anderen Verzeichnisbaum erstellt und installiert wird, aber Sie verwenden dann nicht die bereits verfügbaren Binärpakete.

Wie bereits erwähnt, können Sie debootstrap verwenden und auf einfache Weise eine Chroot-Umgebung erstellen, wie ich es in der Vergangenheit getan habe, um eine 32-Bit-Umgebung auf einem 64-Bit-Host zu haben. Hierzu muss jedoch eine Chroot-Umgebung installiert werden, bei der mindestens die Basispakete dupliziert sind. Wenn Sie über ausreichend Speicherplatz verfügen und dies eine praktikable Lösung ist, können Sie sie mit der Chroot-Umgebung koppeln dchrootoder noch besser schroot, um eine einfache Ausführung der in der Chroot-Umgebung installierten Anwendungen zu ermöglichen.


0

Ich habe Probleme damit, mir vorzustellen, wie das mit den offiziellen Repositorys einer Distribution funktionieren würde. Wie sollen Abhängigkeiten aufgelöst werden? Aus dem System oder aus Ihren Home-Verzeichnissen? Was ist, wenn in beiden Versionen unterschiedliche Versionen gefunden werden?

Das Beste, was ich mir vorstellen kann, wäre eine Chroot-Umgebung, wie man sie für 32-Bit-Anwendungen auf 64-Bit-Systemen verwendet. Es ist mehr Aufwand, als wenn Sie Debootstrap in der Chroot aufrufen würden, aber mit etwas Symlinking und Spaß am Shell-Wrapper-Skript kann es tun, was Sie wollen.


0

Ich arbeite immer noch an dem Problem, aber debootstrap im Grunde das, was Sie brauchen, und sollte mit fakeroot arbeiten. debootstrap ist nur ein Bündel von Shell-Skripten, also ziehe ich es auseinander, um zu sehen, warum es tickt. Der schwierige Teil besteht darin, die Dateien nach der Installation zu deinstallieren.


Ich (und tausende andere Benutzer) würden dies von ganzem Herzen unterstützen. Etwas, das auf die bereits vorhandene systemweite RPM-Datenbank (oder eine geeignete Alternative) sowie auf eine vom Benutzer bereitgestellte RPM-Datenbank zugreift und vom Benutzer lokalisierte RPMs installiert. Das wäre großartig. Dies könnte sogar in der Hauptleitung zusammengeführt werden. Wurde diesbezüglich bereits geforscht?
Andrew Case

0

Leider habe ich von keiner Distribution gehört, die so etwas anbietet (obwohl ich mir sicher bin, dass es sehr beliebt wäre). Möglicherweise können Sie die rpm-basierte Distribution imitieren ... Ich habe dies nicht ausprobiert, aber möglicherweise können Sie eine benutzerbasierte rpm-Datenbank erstellen und dann rpms in der Benutzerdatenbank installieren.

Versuchen Sie, eine neue benutzerbasierte Distribution einzurichten:

rpm --initdb --dbpath DIRECTORY

Dann gibt es mehrere Möglichkeiten, die helfen können:

  • --prefix
  • --relocate

0

Ich habe eine Lösung, mit der ich erfolgreich eine BIG-Sammlung von zusammenarbeitenden Softwarepaketen auf einem Debian-Schulserver installiert habe, auf dem ich überhaupt keinen Root-Zugriff habe (nicht einmal für die Installation eines anderen Paketmanagers). Es wird kein deboostrapPaketmanager verwendet.

Die Methode ist teilweise manuell, aber ich habe mein Bestes getan, um es bequem zu machen.

Es verwendet dieses Skript, das ich aufgerufen habe install(vergessen Sie chmod +xes nicht):

#!/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

Also normalerweise lade ich zuerst eine Deb-Datei mit herunter apt-get download package_name. Dann ./install package_name_blabla.debstarte ich und entscheide manuell über jedes Vorkommen /usrin den entpackten Dateien, ob es durch ersetzt werden soll $PREFIX/usroder nicht.

Diese Entscheidung hängt vollständig davon ab, welche Pakete auf dem System installiert sind und welche mit dieser Methode installiert werden. Normalerweise benötigen zB die pkg-config-Dateien diese Ersetzung, wohingegen shebang-Zeilen #!/usr/bin/perldies nicht tun. Als Faustregel gilt, dass der resultierende Pfad auf eine vorhandene Datei verweisen sollte.

Bei Paketen, die auf diese Weise installiert wurden, müssen Sie den anderen Programmen offensichtlich etwas darüber erzählen. Dies kann durch Anhängen der richtigen Werte erreicht werden LD_LIBRARY_PATH, PATH, PYTHONPATH, PKG_CONFIG_PATH, CMAKE_MODULES_PATH, CMAKE_PREFIX_PATHusw.

Dieser Ansatz hat den Nachteil, dass Abhängigkeiten nicht automatisch heruntergeladen / installiert werden. Sie müssen sie manuell nachverfolgen.

Auch APT weiß offensichtlich nichts über diese Pakete und wird sie für immer als vermisst anzeigen. Aber das ist sinnvoll - wer möchte eine systemweite App installieren, die von der Installation eines Benutzers abhängt.

Wenn Sie ein Programm deinstallieren möchten, können Sie den Inhalt des Deb-Archivs mit auflisten ar p "$1" data.tar.xz | tar tJund dann alle diese Dateien von der löschen PREFIX.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.