Có cách nào để có được APT để cài đặt các gói vào thư mục nhà của tôi không?


Câu trả lời:


17

Dpkg không có tính năng - Relocate mà RPM có. Thật đáng để xem xét có bao nhiêu gói RPM hỗ trợ tính năng đó. Về cơ bản, nó không thể được thực hiện.

Những gì bạn có thể làm là sử dụng một chroot nếu bạn muốn kiểm tra một cái gì đó trước khi cài đặt nó trên toàn cầu trên hệ thống. Để làm điều này, bạn cần có khả năng truy cập vào root. Điều đầu tiên cần làm là tạo ra một chroot cơ bản:

# debootstrap lenny lenny-chroot

Điều này tạo ra một chroot Lenny trong lenny-chrootthư mục.

Bây giờ chúng ta có thể nhập chroot:

# chroot lenny-chroot

Bây giờ chúng tôi có thể làm những gì chúng tôi muốn và cài đặt bất cứ thứ gì mà không làm hỏng phần còn lại của hệ thống. Khi chúng ta hoàn thành, chỉ cần gõ exit hoặc nhấn ctrl-D


8

Linuxbrew là một trình quản lý gói không root khác dành cho Linux (dựa trên hệ thống quản lý gói Homebrew phổ biến cho OS X) để biên dịch từ nguồn và giữ các tệp nhị phân trong thư mục nhà của bạn.

Trích dẫn các tài liệu, các tính năng của Linuxbrew là:

  • Có thể cài đặt phần mềm vào thư mục chính và do đó không yêu cầu sudo
  • Cài đặt phần mềm không được đóng gói bởi bản phân phối gốc
  • Cài đặt các phiên bản cập nhật của phần mềm khi bản phân phối gốc cũ
  • Sử dụng cùng một trình quản lý gói để quản lý cả máy Mac và Linux của bạn

7

Tiền tố Gentoo làm chính xác những gì bạn muốn.

Nó cài đặt tất cả các gói vào một thư mục được chỉ định. Không cần truy cập root. Nếu bạn muốn thoát khỏi nó, chỉ cần loại bỏ thư mục cơ sở.

PS: Điều này không hoạt động trên Ubuntu> = 11.04 hoặc bất kỳ dẫn xuất Debian nào khác với Multiarch.


1
Gentoo xây dựng từ nguồn, poster dường như muốn cài đặt qua gói đến một thư mục cụ thể. Đó không thực sự là điều tương tự.
Trường hợp Andrew

1
@AndrewCase Gentoo có các gói quá tôi tin. Thực tế là chúng không phải là nhị phân không liên quan đến cài đặt cuối cùng.
jiggunjer

4

Chỉ là một bổ sung nhỏ cho tùy chọn biên dịch nó, có tùy chọn nửa chừng để biên dịch thành một gói với tùy chọn tiền tố khác nhau trong thời gian biên dịch (với "checkinstall" hoặc có lẽ là một phương thức khác). Ưu điểm là gói sẽ xuất hiện trên các trình quản lý gói như aptitude hoặc synap.

Bên cạnh đó tôi nghĩ rằng trong một số trường hợp có thể tải xuống .deb thực tế và buộc một tiền tố khác thông qua cài đặt dpkg, nhưng tôi nghĩ rằng đó không phải là thứ có thể được thực hiện với bất kỳ gói ngẫu nhiên nào, nhưng chúng đã được biên dịch với một số biến cho vị trí của chúng (chứ không phải là tiền tố rõ ràng theo nghĩa đen) mà bạn xuất trước khi cài đặt. Tôi không biết gì về thủ tục mặc dù, google cho "tiền tố ddkg instdir".



1

Rootless GoboLinux có thể thực hiện chính xác những gì bạn yêu cầu: trình quản lý gói, không có đặc quyền nâng cao, trong thư mục nhà riêng của bạn. Hy vọng bạn biết những gì bạn đang làm; rootless không phải là chế độ cài đặt được duy trì tốt nhất của Gobo và khi tôi sử dụng nó vài năm trước, nó yêu cầu một vài điều chỉnh vì tập lệnh cài đặt đã lỗi thời so với các thay đổi khác của Gobo.

Ngoài ra còn có klik đóng gói lại khá nhiều .debgiây, có thể cài đặt các gói vào thư mục chính của bạn và không yêu cầu quyền root để hoạt động ... nhưng thiết lập ban đầu không yêu cầu root.


1

Tôi thường lấy các nguồn và kiểm tra một tệp như "CÀI ĐẶT". Thông thường có hướng dẫn để làm ./configure --prefix=somedir. Sau đó, bạn phải thêm somedir/binvào con đường của bạn.


nó có thể khó để có được, biên dịch và giữ cho các phụ thuộc được cập nhật.
Paolo

Điều này là ngược. Câu hỏi là về cách làm thế nào để các nhà quản lý gói (được ưa thích hơn từ những năm 1990) hành xử theo cách này.
Cuộc đua nhẹ nhàng với Monica

1

Không, tôi không nghĩ bạn có thể.

Điều tốt nhất tôi có thể nghĩ ngay bây giờ là sử dụng apt-get sourcevà biên dịch gói của bạn. Có lẽ bạn bằng cách nào đó có thể điều chỉnh thủ tục (có thể ít nhiều tự động) để cài đặt các gói trong nhà của bạn.

Một cách khác là sử dụng dpkg -Xđể trích xuất nó trên một thư mục bạn chọn.


0

Có rất ít trường hợp bạn cần cài đặt các gói vào thư mục nhà của bạn.

Tuy nhiên, bạn có thể biên dịch và cài đặt phần mềm vào máy cục bộ của mình. Chỉ cần giải nén, sau đó cấu hình với ./configure --prefix=$HOME/localhoặc một số thư mục khác. Bạn có thể sau đó makemake installnhư bình thường. Điều này sẽ biên dịch và cài đặt chương trình đó ~/local/, ví dụ chương trình bạn thực hiện sẽ nằm trong ~/local/bin/programmname.


0

Theo kinh nghiệm của riêng tôi, không có cách nào dễ dàng để sử dụng các gói DEB hiện có để cài đặt vào một thư mục khác không phải là môi trường chroot . Các công cụ cài đặt Debian / Ubuntu dpkg / aptitude / dselect đều yêu cầu quyền root để hoạt động đúng.

Bây giờ được cung cấp DEB nguồn, bạn có thể sửa đổi tệp Debian / quy tắc để xây dựng gói và cài đặt vào một cây thư mục khác, nhưng sau đó bạn không sử dụng các gói nhị phân đã có sẵn.

Như những người khác đã đề cập, bạn có thể sử dụng debootstrap và dễ dàng xây dựng môi trường chroot, điều mà tôi đã làm trong quá khứ để có môi trường 32 bit trên máy chủ 64 bit, nhưng điều này đòi hỏi phải cài đặt chroot với ít nhất các gói cơ sở được sao chép. Nếu bạn có không gian và đây là một giải pháp khả thi, bạn có thể kết hợp nó với dchroot, hoặc thậm chí tốt hơn schroot, để cho phép thực thi dễ dàng các ứng dụng được cài đặt trong môi trường chroot.


0

Tôi gặp khó khăn khi tưởng tượng nó sẽ hoạt động như thế nào với các kho chính thức từ một bản phân phối. Làm thế nào nó nên giải quyết phụ thuộc? Từ hệ thống hoặc từ thư mục nhà của bạn? Điều gì nếu nó tìm thấy các phiên bản khác nhau trong cả hai?

Điều tốt nhất tôi có thể nghĩ đến sẽ là một môi trường chroot giống như mọi người làm cho các ứng dụng 32 bit trên các hệ thống 64 bit. Nó tốn nhiều chi phí hơn khi bạn gọi debootstrap trong chroot, nhưng với một số symlinking , shell script script vui nhộn, nó có thể làm những gì bạn muốn.


0

Tôi vẫn đang giải quyết vấn đề, nhưng về cơ bản, debootstrap là những gì bạn cần và nên làm việc với fakeroot. debootstrap chỉ là một loạt các kịch bản shell, vì vậy tôi sẽ tách nó ra để xem điều gì làm cho nó được đánh dấu. Phần cứng sẽ là gỡ cài đặt các tập tin sau khi chúng được cài đặt.


Tôi (và hàng ngàn người dùng khác) sẽ hết lòng khuyến khích điều này. Một cái gì đó khai thác vào cơ sở dữ liệu vòng / phút toàn hệ thống hiện có (hoặc thay thế apt) cũng như cơ sở dữ liệu vòng / phút do người dùng cung cấp và cài đặt rpms do người dùng đặt. Điều này sẽ là tuyệt vời. Điều này thậm chí có thể được sáp nhập vào dòng chính. Có bất kỳ nghiên cứu đã được thực hiện về điều này trước đây?
Trường hợp Andrew

0

Thật không may, tôi đã không nghe thấy bất kỳ bản phân phối nào cung cấp một cái gì đó như thế này (mặc dù tôi chắc chắn rằng nó sẽ rất phổ biến). Bạn có thể bắt chước phân phối dựa trên vòng / phút mặc dù ... Tôi chưa thử điều này, nhưng bạn có thể xây dựng cơ sở dữ liệu vòng / phút dựa trên người dùng và sau đó cài đặt vòng / phút vào cơ sở dữ liệu người dùng.

Hãy thử thiết lập một bản phân phối dựa trên người dùng mới với:

rpm --initdb --dbpath DIRECTORY

Sau đó, có một số tùy chọn có thể giúp:

  • --prefix
  • --relocate

0

Tôi có một giải pháp tôi đã sử dụng thành công để cài đặt một bộ LỚN các gói phần mềm hợp tác trên máy chủ Debian của trường, nơi tôi hoàn toàn không có quyền truy cập root (thậm chí không cài đặt trình quản lý gói khác). Nó không sử dụng deboostrapcũng như bất kỳ trình quản lý gói.

Phương pháp này là một phần thủ công, nhưng tôi đã cố gắng hết sức để làm cho nó thuận tiện.

Nó sử dụng tập lệnh này mà tôi đã gọi install(đừng quên chmod +xnó):

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

Vì vậy, thường thì đầu tiên tôi tải xuống một tệp deb bằng cách sử dụng apt-get download package_name. Sau đó, tôi chạy ./install package_name_blabla.debvà tự quyết định về từng lần xuất hiện /usrtrong các tệp được giải nén, liệu nó có nên được thay thế bằng $PREFIX/usrhay không.

Quyết định này hoàn toàn phụ thuộc vào gói nào được cài đặt hệ thống và gói nào được cài đặt bằng phương pháp này. Thông thường, ví dụ: các tệp pkg-config cần sự thay thế này, trong khi các dòng shebang như #!/usr/bin/perlkhông. Nguyên tắc chung là đường dẫn kết quả sẽ trỏ đến một tệp hiện có.

Với các gói được cài đặt theo cách này, rõ ràng bạn cần bằng cách nào đó nói với các chương trình khác về chúng. Điều này có thể được thực hiện bằng cách thêm các giá trị đúng LD_LIBRARY_PATH, PATH, PYTHONPATH, PKG_CONFIG_PATH, CMAKE_MODULES_PATH, CMAKE_PREFIX_PATH, vv

Có một sự cảnh báo trong phương pháp này, đó là sự phụ thuộc không được tự động tải xuống / cài đặt; bạn phải theo dõi chúng bằng tay.

Ngoài ra APT rõ ràng không biết về các gói này, vì vậy nó sẽ mãi mãi hiển thị chúng là mất tích. Nhưng điều đó có ý nghĩa - ai muốn cài đặt một ứng dụng toàn hệ thống phụ thuộc vào cài đặt của người dùng.

Nếu bạn muốn gỡ cài đặt chương trình, bạn có thể liệt kê nội dung của kho lưu trữ gỡ lỗi bằng cách sử dụng ar p "$1" data.tar.xz | tar tJvà sau đó xóa tất cả các tệp này khỏi PREFIX.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.