¿Hay alguna forma de obtener APT para instalar paquetes en mi directorio de inicio?


Respuestas:


17

Dpkg no tiene la función --relocate que tiene RPM. Sin embargo, vale la pena considerar cuántos paquetes RPM admiten esa función. Básicamente, no se puede hacer.

Lo que podría hacer es usar un chroot si desea probar algo antes de instalarlo globalmente en el sistema. Para hacer esto, necesita poder acceder a la raíz. Lo primero que debe hacer es crear un chroot básico:

# debootstrap lenny lenny-chroot

Esto crea un chroot de Lenny dentro del lenny-chrootdirectorio.

Ahora podemos ingresar al chroot:

# chroot lenny-chroot

Ahora podemos hacer lo que queramos e instalar cualquier cosa sin que estropee el resto del sistema. Cuando hayamos terminado, simplemente escriba exit o presione ctrl-D


8

Linuxbrew es otro administrador de paquetes no root para Linux (basado en el popular sistema de administración de paquetes Homebrew para OS X) que compila desde la fuente y mantiene los archivos binarios en su directorio de inicio.

Citando los documentos, las características de Linuxbrew son:

  • Puede instalar software en un directorio de inicio y, por lo tanto, no requiere sudo
  • Instalar software no empaquetado por la distribución nativa
  • Instale versiones actualizadas de software cuando la distribución nativa es antigua
  • Use el mismo administrador de paquetes para administrar sus máquinas Mac y Linux

7

El prefijo Gentoo hace exactamente lo que quieres.

Instala todos los paquetes en un directorio especificado. No se requiere acceso de root. Si desea deshacerse de él, simplemente elimine el directorio base.

PD: Esto no funciona en Ubuntu> = 11.04, o cualquier otro derivado de Debian con Multiarch.


1
Gentoo construye desde la fuente, el póster parece querer instalar a través de un paquete en un directorio específico. Eso no es realmente lo mismo.
Andrew Case

1
@ AndrewCase Gentoo también tiene paquetes, creo. El hecho de que no sean binarios es irrelevante para la instalación final.
jiggunjer

4

Como una pequeña adición a la opción de compilarlo, existe la opción a mitad de camino de compilar en un paquete con una opción de prefijo diferente en el momento de la compilación (con "checkinstall" o quizás algún otro método). La ventaja es que el paquete aparecerá en los administradores de paquetes, como aptitude o synaptic.

Además de eso, creo que en algunos casos puede ser posible descargar el .deb real y forzar un prefijo diferente a través de la instalación de dpkg, pero creo que no es algo que se pueda hacer con cualquier paquete aleatorio, pero deben haber sido compilados con alguna variable para su ubicación (en lugar del prefijo explícito literal) que exportaría antes de instalar. Sin embargo, no sé nada sobre el procedimiento, google para "prefijo dpkg instdir".



1

Roboless GoboLinux puede hacer exactamente lo que está pidiendo: administrador de paquetes, sin privilegios elevados, en su propio directorio de inicio. Espero que sepas lo que estás haciendo; rootless no es el modo de instalación más bien mantenido de Gobo, y cuando solía usarlo hace unos años requería algunos ajustes ya que el script de instalación estaba un poco desactualizado en relación con otros cambios de Gobo.

También hay klik que vuelve a empaquetar bastantes .debs, puede instalar paquetes en su directorio de inicio y no requiere privilegios de root para operar ... pero la configuración inicial requiere root.


1

Generalmente obtengo las fuentes y reviso un archivo como "INSTALAR". Por lo general, hay instrucciones para hacer ./configure --prefix=somedir. Entonces tienes que agregar somedir/bina tu camino.


Puede ser difícil obtener, compilar y mantener las dependencias actualizadas.
Paolo

Esto es al revés. La pregunta es acerca de cómo lograr que los administradores de paquetes (que son preferibles desde la década de 1990) se comporten de esta manera.
Lightness compite con Monica el

1

No, no creo que puedas.

Lo mejor que puedo pensar ahora es usar apt-get sourcey compilar su paquete. Tal vez podría modificar de alguna manera el procedimiento (que puede ser más o menos automatizado) para instalar los paquetes en su hogar.

Otro es usarlo dpkg -Xpara extraerlo en un directorio de su elección.


0

Hay muy pocos casos en los que necesite instalar paquetes en su carpeta de inicio.

Sin embargo, puede compilar e instalar software en su máquina local. Simplemente descomprima, luego configure con ./configure --prefix=$HOME/localo algún otro directorio. Entonces puedes makey make installcomo siempre. Esto compilará e instalará ese programa ~/local/, por ejemplo, el programa que ejecute estará en ~/local/bin/programmname.


0

Según mi propia experiencia, no hay una manera fácil de usar los paquetes DEB existentes para instalar en otro directorio que no sea un entorno chroot . Las herramientas de instalación de Debian / Ubuntu dpkg / aptitude / dselect requieren privilegios de root para funcionar correctamente.

Ahora, dado el DEB de origen, puede modificar el archivo Debian / rules para que el paquete se construya e instale en un árbol de directorios diferente, pero no está utilizando los paquetes binarios ya disponibles.

Como otros han mencionado, puede usar debootstrap y crear fácilmente un entorno chroot, lo que he hecho en el pasado para tener un entorno de 32 bits en un host de 64 bits, pero esto requiere instalar un chroot con al menos los paquetes base duplicados. Si tiene el espacio y esta es una solución viable, puede acoplarla dchroot, o incluso mejor schroot, para permitir la ejecución fácil de las aplicaciones instaladas en el entorno chroot.


0

Tengo problemas para imaginar cómo funcionaría eso con los repositorios oficiales de una distribución. ¿Cómo debería resolver las dependencias? ¿Del sistema o de sus directorios personales? ¿Qué pasa si encuentra diferentes versiones en ambos?

Lo mejor que se me ocurre sería un entorno chroot'd como lo hacen las personas para aplicaciones de 32 bits en sistemas de 64 bits. Es más costoso ya que llamarías debootstrap en el chroot, pero con un poco de simblinking y diversión de script de envoltura de shell, podría hacer lo que quieras.


0

Todavía estoy trabajando en el problema, pero debootstrap es básicamente lo que necesitas y debería funcionar con fakeroot. debootstrap es solo un montón de scripts de shell, así que lo estoy separando para ver qué lo hace funcionar. La parte difícil será desinstalar los archivos una vez que estén instalados.


Yo (y miles de otros usuarios) lo alentaría de todo corazón. Algo que se conecta con la base de datos rpm existente en todo el sistema (o una alternativa apta), así como con una base de datos rpm proporcionada por el usuario e instala rpms ubicados por el usuario. Esto sería asombroso. Esto incluso podría fusionarse con la línea principal. ¿Se ha realizado alguna investigación sobre esto anteriormente?
Andrew Case

0

Lamentablemente, no he oído hablar de ninguna distribución que proporcione algo como esto (aunque estoy seguro de que sería muy popular). Sin embargo, es posible que pueda imitar la distribución basada en rpm ... No he intentado esto, pero puede crear una base de datos de rpm basada en el usuario y luego instalar las rpm en la base de datos de usuario.

Intenta configurar una nueva distribución basada en el usuario con:

rpm --initdb --dbpath DIRECTORY

Luego hay varias opciones que pueden ayudar:

  • --prefix
  • --relocate

0

Tengo una solución que he utilizado con éxito para instalar una GRAN colección de paquetes de software cooperantes en un servidor Debian de la escuela, donde no tengo acceso a la raíz (ni siquiera para instalar otro administrador de paquetes). No utiliza deboostrapni ningún administrador de paquetes.

El método es en parte manual, pero he hecho todo lo posible para que sea conveniente.

Utiliza este script que he llamado install(no lo olvides 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

Por lo general, primero descargo un archivo deb usando apt-get download package_name. Luego ejecuto ./install package_name_blabla.deby decido manualmente sobre cada aparición /usren los archivos desempaquetados, si se debe reemplazar por $PREFIX/usro no.

Esta decisión depende completamente de qué paquetes están instalados por el sistema y cuáles se instalan utilizando este método. Por lo general, por ejemplo, los archivos pkg-config necesitan esta sustitución, mientras que las líneas shebang como #!/usr/bin/perlno. La regla general es que la ruta resultante debe apuntar a un archivo existente.

Con los paquetes instalados de esta manera, obviamente necesita informarles a los otros programas sobre ellos. Esto se puede lograr añadiendo los valores correctos a LD_LIBRARY_PATH, PATH, PYTHONPATH, PKG_CONFIG_PATH, CMAKE_MODULES_PATH, CMAKE_PREFIX_PATHetc.

Hay una advertencia en este enfoque, que las dependencias no se descargan / instalan automáticamente; tienes que hacer un seguimiento de ellos manualmente.

Además, APT obviamente no conoce estos paquetes, por lo que siempre los mostrará como faltantes. Pero eso tiene sentido: quién querría instalar una aplicación de todo el sistema que depende de la instalación de un usuario.

Si desea desinstalar un programa, puede enumerar el contenido del archivo deb usando ar p "$1" data.tar.xz | tar tJy luego eliminar todos estos archivos del PREFIX.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.