Apakah ada cara untuk mendapatkan APT untuk menginstal paket ke direktori rumah saya?

42

Apakah ada cara untuk mendapatkan APT untuk menginstal paket ke direktori rumah saya?

Saya tidak ingin membuat perubahan sistem luas.

Atau, apakah ada manajer paket linux berbasis home-direktori?

Peter Mortensen
sumber
Lihat juga Manajer Paket Non-Root .
imz - Ivan Zakharyaschev

Jawaban:

17

Dpkg tidak memiliki fitur --relokasi yang dimiliki RPM. Perlu mempertimbangkan berapa banyak paket RPM yang mendukung fitur itu. Pada dasarnya, itu tidak bisa dilakukan.

Yang bisa Anda lakukan adalah menggunakan chroot jika Anda ingin menguji sesuatu sebelum menginstalnya secara global pada sistem. Untuk melakukan ini, Anda harus bisa mendapatkan akses ke root. Hal pertama yang harus dilakukan adalah membuat chroot dasar:

# debootstrap lenny lenny-chroot

Ini menciptakan chroot Lenny di dalam lenny-chrootdirektori.

Sekarang kita bisa masuk ke chroot:

# chroot lenny-chroot

Sekarang kita dapat melakukan apa yang kita inginkan dan menginstal apa pun tanpa itu mengacaukan sisa sistem. Setelah selesai, ketik saja keluar atau tekan ctrl-D

David Pashley
sumber
8

Linuxbrew adalah manajer paket non-root untuk Linux (berdasarkan sistem manajemen paket Homebrew untuk OS X) yang mengkompilasi dari sumber dan menyimpan binari di direktori home Anda.

Mengutip dokumen, fitur Linuxbrew adalah:

  • Dapat menginstal perangkat lunak ke direktori home dan tidak memerlukan sudo
  • Instal perangkat lunak yang tidak dikemas oleh distribusi asli
  • Instal versi perangkat lunak terbaru ketika distribusi asli sudah tua
  • Gunakan manajer paket yang sama untuk mengelola mesin Mac dan Linux Anda
Paolo
sumber
7

Awalan Gentoo melakukan apa yang Anda inginkan.

Itu menginstal semua paket ke direktori yang ditentukan. Tidak diperlukan akses root. Jika Anda ingin menyingkirkannya, hapus saja direktori basis.

PS: Ini tidak berfungsi di Ubuntu> = 11.04, atau turunan Debian lainnya dengan Multiarch.

hayalci
sumber
1
Gentoo membangun dari sumber, poster sepertinya ingin menginstal melalui paket ke direktori tertentu. Itu tidak benar-benar sama.
Andrew Case
1
@AndrewCase Gentoo juga punya paket. Fakta bahwa mereka bukan biner tidak relevan untuk instalasi akhir.
jiggunjer
4

Sama seperti tambahan kecil pada opsi kompilasi, ada opsi setengah jalan untuk mengkompilasi ke dalam sebuah paket dengan opsi awalan yang berbeda pada waktu kompilasi (dengan "checkinstall" atau mungkin beberapa metode lain). Keuntungannya adalah bahwa paket tersebut akan muncul pada manajer paket seperti aptitude atau synaptic.

Selain itu saya pikir dalam beberapa kasus mungkin untuk mengunduh .deb yang sebenarnya dan memaksakan awalan yang berbeda melalui instalasi dpkg, tapi saya pikir itu bukan sesuatu yang dapat dilakukan dengan paket acak apa pun, tetapi harus dikompilasi dengan beberapa variabel untuk lokasi mereka (bukan awalan eksplisit literal) yang akan Anda ekspor sebelum menginstal. Saya tidak tahu apa-apa tentang prosedur ini, google untuk "dpkg instdir prefix".

dsc
sumber
2

Anda dapat menggunakan fakechroot - lihat demo di situs web mereka.

niutech
sumber
1

Rootless GoboLinux dapat melakukan persis apa yang Anda minta: manajer paket, tanpa hak istimewa, di direktori home Anda sendiri. Semoga Anda tahu apa yang Anda lakukan; rootless bukanlah mode instalasi Gobo yang paling terpelihara dengan baik, dan ketika saya menggunakannya beberapa tahun yang lalu diperlukan beberapa penyesuaian karena skrip instalasi agak ketinggalan zaman relatif terhadap perubahan Gobo lainnya.

Ada juga klik yang mengemas ulang beberapa .debs, dapat menginstal paket ke direktori rumah Anda, dan tidak memerlukan hak akses root untuk beroperasi ... tetapi pengaturan awal memang memerlukan root.

singkat
sumber
1

Saya biasanya mendapatkan sumber dan memeriksa file seperti "INSTALL". Biasanya ada instruksi yang harus dilakukan ./configure --prefix=somedir. Maka Anda harus menambahkan somedir/binke jalur Anda.

Ian Kelling
sumber
mungkin sulit untuk mendapatkan, mengkompilasi, dan menjaga dependensi diperbarui.
Paolo
Ini mundur. Pertanyaannya adalah tentang bagaimana mendapatkan manajer paket (yang lebih disukai sejak 1990-an) untuk berperilaku dengan cara ini.
Lightness Races with Monica
1

Tidak, saya pikir Anda tidak bisa.

Yang terbaik yang bisa saya pikirkan saat ini adalah menggunakan apt-get sourcedan mengkompilasi paket Anda. Mungkin Anda dapat mengubah prosedur (yang bisa lebih atau kurang otomatis) untuk menginstal paket di rumah Anda.

Satu lagi adalah menggunakan dpkg -Xuntuk mengekstraknya pada direktori pilihan Anda.

anon
sumber
0

Ada beberapa kasus di mana Anda perlu menginstal paket ke folder rumah Anda.

Namun Anda dapat mengkompilasi dan menginstal perangkat lunak ke mesin lokal Anda. Cukup unzip, lalu konfigurasikan dengan ./configure --prefix=$HOME/localatau direktori lain. Anda bisa makedan make installseperti biasa. Hal ini akan mengkompilasi dan menginstal program yang di ~/local/, misalnya program Anda mengeksekusi akan di ~/local/bin/programmname.

Rory
sumber
0

Dari pengalaman saya sendiri, tidak ada cara mudah untuk menggunakan paket DEB yang ada untuk menginstal ke direktori lain yang bukan lingkungan chroot . Alat instalasi Debian / Ubuntu dpkg / aptitude / dselect semua membutuhkan hak akses root untuk berfungsi dengan baik.

Sekarang diberikan DEB sumber Anda dapat memodifikasi file Debian / aturan untuk memiliki paket membangun dan menginstal ke pohon direktori yang berbeda, tetapi kemudian Anda tidak menggunakan paket biner yang sudah tersedia.

Seperti yang disebutkan orang lain, Anda dapat menggunakan debootstrap dan dengan mudah membangun lingkungan chroot, yang telah saya lakukan di masa lalu untuk memiliki lingkungan 32-bit pada host 64-bit, tetapi ini membutuhkan menginstal chroot dengan setidaknya paket dasar digandakan. Jika Anda memiliki ruang dan ini adalah solusi yang layak, Anda dapat memasangkannya dengan dchroot, atau bahkan lebih baik schroot, untuk memudahkan eksekusi aplikasi yang terinstal di dalam lingkungan chroot.

Peter Mortensen
sumber
0

Saya kesulitan membayangkan bagaimana itu akan bekerja dengan repositori resmi dari distribusi. Bagaimana seharusnya mengatasi dependensi? Dari sistem atau dari direktori home Anda? Bagaimana jika ia menemukan versi yang berbeda di keduanya?

Yang terbaik yang bisa saya pikirkan adalah lingkungan chroot seperti yang dilakukan orang untuk aplikasi 32-bit pada sistem 64-bit. Ini lebih overhead Anda akan memanggil debootstrap di chroot, tetapi dengan beberapa symlinking , shell skrip wrapper menyenangkan, mungkin melakukan apa yang Anda inginkan.

Peter Mortensen
sumber
0

Saya masih bekerja pada masalah, tetapi debootstrap pada dasarnya apa yang Anda butuhkan, dan harus bekerja dengan fakeroot. debootstrap hanyalah sekumpulan skrip shell, jadi saya menariknya terpisah untuk melihat apa yang membuatnya dicentang. Bagian yang sulit adalah mencopot file setelah diinstal.

Perkins
sumber
Saya (dan ribuan pengguna lain) dengan sepenuh hati akan mendorong ini. Sesuatu yang mengetuk ke dalam basis data rpm sistem (atau alternatif yang tepat) yang sudah ada serta basis data rpm yang disediakan pengguna dan menginstal rpms yang berada di lokasi pengguna. Ini akan luar biasa. Ini bahkan bisa digabungkan ke jalur utama. Apakah ada penelitian yang pernah dilakukan tentang ini sebelumnya?
Andrew Case
0

Sayangnya saya belum pernah mendengar ada distro yang menyediakan sesuatu seperti ini (walaupun saya yakin itu akan menjadi sangat populer). Anda mungkin dapat meniru distro berbasis rpm meskipun ... Saya belum mencoba ini, tetapi Anda mungkin dapat membangun basis data rpm berbasis pengguna dan kemudian menginstal rpm ke dalam basis data pengguna.

Coba buat distro berbasis pengguna baru dengan:

rpm --initdb --dbpath DIRECTORY

Lalu ada beberapa opsi yang dapat membantu:

  • --prefix
  • --relocate
Andrew Case
sumber
0

Saya punya solusi yang saya berhasil gunakan untuk menginstal koleksi besar paket perangkat lunak yang bekerja sama pada server Debian sekolah, di mana saya tidak memiliki akses root sama sekali (bahkan untuk menginstal palungan paket lain). Itu tidak menggunakan deboostrapatau manajer paket.

Metode ini sebagian manual, tetapi saya sudah melakukan yang terbaik untuk membuatnya nyaman.

Ini menggunakan skrip yang saya panggil install(jangan lupa untuk chmod +xitu):

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

Jadi biasanya saya pertama kali mengunduh file deb menggunakan apt-get download package_name. Kemudian saya jalankan ./install package_name_blabla.deb, dan secara manual memutuskan tentang setiap kemunculan /usrdalam file yang sudah dibongkar, apakah harus diganti $PREFIX/usratau tidak.

Keputusan ini sepenuhnya tergantung pada paket mana yang diinstal sistem dan mana yang diinstal menggunakan metode ini. Biasanya, misalnya file pkg-config membutuhkan substitusi ini, sedangkan garis shebang seperti #!/usr/bin/perltidak. Aturan umum adalah jalur yang dihasilkan harus mengarah ke file yang ada.

Dengan paket yang terinstal dengan cara ini, Anda jelas perlu memberitahu program lain tentang mereka. Hal ini dapat dicapai dengan menambahkan nilai-nilai yang benar untuk LD_LIBRARY_PATH, PATH, PYTHONPATH, PKG_CONFIG_PATH, CMAKE_MODULES_PATH, CMAKE_PREFIX_PATHdll

Ada peringatan dalam pendekatan ini, bahwa dependensi tidak diunduh / diinstal secara otomatis; Anda harus melacaknya secara manual.

Juga APT tidak jelas tahu tentang paket-paket ini, jadi itu akan selamanya menunjukkan mereka sebagai hilang. Tapi itu masuk akal - siapa yang ingin menginstal aplikasi seluruh sistem yang tergantung pada instalasi pengguna.

Jika Anda ingin menghapus instalasi suatu program, Anda dapat mendaftar isi arsip deb menggunakan ar p "$1" data.tar.xz | tar tJdan kemudian menghapus semua file ini dari PREFIX.

Martin Pecka
sumber