2013-07-29 38 views
6

Tôi biết các khái niệm cơ bản về sử dụng ldconfigLD_LIBRARY_PATH, nhưng tôi hy vọng một chút trợ giúp về guru với tình huống của tôi.Sử dụng thích hợp LD_LIBRARY_PATH hoặc ldconfig cho gói phần mềm

Tôi có gói phần mềm di động nằm trong thư mục riêng và có nhiều phiên bản thư viện riêng.

Có nhiều tập lệnh nhị phân và tập lệnh chạy từ thư mục này.

Một số tệp nhị phân (apache, php, postgres) cũng có thể có các phiên bản riêng được cài đặt trên hệ thống.

Vì có thể có hai phiên bản của php, nó không đủ để tạo /etc/ld.so.conf.d/myapp.conf nếu hệ thống không thể xác định phiên bản "myapp" nào sử dụng tệp ldconfig cho.

Tôi đang tìm các phương pháp hay nhất về định cấu hình hệ thống như vậy. Người ban đầu thiết lập gói phần mềm xuất khẩu LD_LIBRARY_PATH để TẤT CẢ các ứng dụng trên hệ thống đã sử dụng nó.

Tôi đang cố gắng cách ly chỉ các ứng dụng trong thư mục gói.

Một số thông số để làm việc với:

/mypack - chứa tất cả mọi thứ cho gói phần mềm

/mypack/local/lib - chứa thư viện cần thiết mà có thể không tương thích với hệ thống

thư viện ví dụ:

/mypack/local/lib/libz.so.1 => /mypack/local/lib/libz.so.1.2.3 
/lib/libz.so.1 => /lib/libz.so.1.2.3 

mặc dù các phiên bản giống nhau, phiên bản trong/mypack có thể không tương thích với bản phân phối và sẽ phá vỡ hệ thống nếu được sử dụng

ví dụ nhị phân: php tồn tại trong cả/mypack và trong thư mục mặc định php từ/mypack nên sử dụng libs từ/mypack/local/lib và phiên bản distro nên sử dụng/lib

Một số câu hỏi về đường dẫn thư viện linux: - Có thể chỉ định /etc/ld.so.conf.d/php.conf sao cho nó chỉ ảnh hưởng đến phiên bản php trong/mypack ? - Đường dẫn thư viện có thể được chỉ định dựa trên vị trí của tệp thực thi không? Đó là, vào thời gian chạy, nếu đường dẫn của một tập tin thực thi nằm trong/mypack, nó có thể tự động sử dụng các thư viện từ đó không? - Làm thế nào về trên cơ sở mỗi người dùng? Một số/hầu hết hệ thống chạy trên các tài khoản người dùng khác nhau. Nếu tôi có thể thiết lập một đường dẫn thư viện khác nhau cho mỗi người dùng, điều đó sẽ giải quyết nó.

+0

Tôi nghĩ cách tiếp cận điển hình là để sử dụng tập lệnh trình bao bọc. Kịch bản trình bao bọc đặt giá trị của LD_LIBRARY_PATH và sau đó chạy tệp thi hành. Hãy xem google-chrome chẳng hạn. –

+0

Nếu đó là cách duy nhất mà bất cứ ai đến với, tôi sẽ đi với nó. Tôi đã chạy Chrome 28 trong CentOS bằng cách làm điều đó, nhưng do số lượng thực thi khác nhau có liên quan, tôi đã cố gắng để tránh nó. – thatthatisis

Trả lời

5

Trong trường hợp bất cứ ai khác thấy hữu ích này, tôi đã kết thúc làm điều này trước khi tòa nhà:

export LD_RUN_PATH='$ORIGIN/../lib' 

này bao gồm đường dẫn thư viện trong hệ nhị phân thân, liên quan đến vị trí của nhị phân. Nếu bạn dự định sử dụng tập lệnh này trong tập lệnh bash hoặc trong tệp xây dựng của mình, hãy đảm bảo tra cứu mức sử dụng cụ thể của bạn với $ ORIGIN vì có trường hợp bạn cần thực hiện một số thứ như \ $$ ORIGIN, \ $$ ORIGIN hoặc $$ ORIGIN để các tiện ích khác nhau có liên quan đến việc xây dựng nhận được dấu đô la được thoát đúng cách. Tìm bit hữu ích này đã lưu tôi phải cập nhật khoảng 50 tập lệnh riêng lẻ chạy theo lô để xây dựng gói phần mềm của chúng tôi.

0

Vấn đề nói chung là LD_LIBRARY_PATH trước thông tin được cung cấp bởi ldconfig. Nếu tất cả những gì bạn muốn làm là có một bộ thư viện sao lưu để cài đặt trên các hệ thống chưa có chúng, hãy trích xuất bộ thư viện hiện tại từ ldconfig và thêm chúng vào LD_LIBRARY_PATH

mytmp=/tmp/${USER}_junk$$ 
(for i in `/sbin/ldconfig -p | grep '=>' | awk '{ print $NF }'` ; do dirname $i ; done) | sort -r | uniq > ${mytmp} 
myld="" 
for j in `cat ${mytmp}` ; do myld=${j}:${myld} ; done 
rm -f ${mytmp} 
LD_LIBRARY_PATH=${myld}${LD_LIBRARY_PATH}:${SEP}/lib:${SEP}/lib/syslibs 
export LD_LIBRARY_PATH