Cài đặt gói mà không bắt đầu quá trình và dịch vụ nền


43

Đôi khi cài đặt một số ứng dụng sẽ bắt đầu một quá trình hoặc dịch vụ từ ứng dụng được chạy tự động khi cài đặt. Làm thế nào để tôi cài đặt mà không bắt đầu chúng?


Tôi tự hỏi tiềm năng nào có thể khiến một hệ thống ở trạng thái không ổn định khi cài đặt các gói kernel hoặc DKMS sử dụng loại cấu hình này. Tôi không biết nhiều về lĩnh vực này.
ændrük

@ ndrük Điều đó đã làm tôi lo lắng. Bạn thấy tôi đang cài đặt Ubuntu tối thiểu trên một ổ đĩa, sau đó thay vì khởi động vào nó, tôi sử dụng Live CD / USB để chrootvà cài đặt các gói tôi cần. Tất nhiên, trình điều khiển, cụ thể, trình điều khiển GPU không có ở đó và cần phải được cài đặt.
Oxwivi

Câu trả lời:


35

Có một cách hơi khó tin, nhưng khá đáng tin cậy để làm điều này mà tôi đã sử dụng một thời gian trong một kịch bản cài đặt tự động.

Đầu tiên tạo một thư mục, ví dụ /root/fake, có chứa các liên kết tượng trưng để /bin/truegọi:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

Bạn cũng có thể làm cho chúng bash script không làm gì và trả lại thành công.

Sau đó bao gồm thư mục đó ở phía trước $PATHkhi cài đặt gói:

PATH=/root/fake:$PATH apt-get install whatever

Điều này chỉ ngăn daemon bắt đầu / khởi động lại, trong khi những việc như tạo initramfs vẫn đang được thực hiện.

Giải trình

Các tập lệnh đang được thực thi khi cài đặt và gỡ bỏ gói thực thi invoke-rc.dhoặc các lệnh khác được đề cập để bắt đầu và dừng dịch vụ. Tuy nhiên, họ không gọi họ bằng những con đường tuyệt đối (ít nhất là tôi chưa gặp phải điều đó).

Vì vậy, bằng cách chèn các lệnh "không hoạt động" giả mạo vào đầu $PATH, các lệnh thực không bao giờ được gọi.

Vì chỉ các lệnh được sử dụng để bắt đầu / dừng dịch vụ đang bị làm giả, mọi thứ khác, đặc biệt là các tác vụ quan trọng như cập nhật / tạo initramfs-hình ảnh vẫn hoạt động.


Không hoàn toàn quen thuộc với các liên kết tượng trưng, ​​bạn có thể xây dựng với tất cả các bước bạn thực hiện không?
Oxwivi

Symlink là một loại tệp đặc biệt không có nội dung, thay vào đó nó đề cập đến một tệp khác (theo đường dẫn / tên). Chúng có thể được tạo với ln -s, trong trường hợp này chẳng hạn ln -s /bin/true /root/fake/initctl.
bseibold

Làm thế nào để nó ngăn daemon bắt đầu / khởi động lại? Theo câu trả lời của @ psusi's invoke-rc.dlà có trách nhiệm.
Oxwivi

Bằng cách đặt thư mục với các lệnh giả mạo ở đầu $PATHbiến, tất cả các lệnh gọi đến invoke-rc.dvà các lệnh khác có thể được sử dụng để bắt đầu và dừng trình nền sử dụng các lệnh giả. Đó là, trừ khi họ được gọi với một con đường tuyệt đối, nhưng tôi chưa bao giờ gặp phải điều này.
bseibold

Ah, bây giờ tôi thấy cách nó hoạt động - về cơ bản, các liên kết tượng trưng dẫn đến ngõ cụt. Nhưng chính xác thì đó là /bin/truegì? Và những gì còn lại của các lệnh liên quan đến các gói? Họ sẽ không bị lạc đường bởi chỉ định $PATH?
Oxwivi

27

Trình nền nền được bắt đầu với invoke-rc.d, điều này đảm bảo rằng trình nền không được khởi động nếu tập lệnh RC của nó nói rằng nó không được phép chạy trong runlevel hệ thống hiện tại. Bạn có thể ghi đè lên ý tưởng của nó về runlevel hệ thống hiện tại bằng cách đặt biến môi trường RUNLEVEL. Không có gì được cho là chạy trong runlevels 0 và 6, nhưng có vẻ như đó invoke-rc.dlà lỗi và chạy mọi thứ nếu bạn sử dụng những runlevels này. Hầu hết các trình tiện ích không chạy trong runlevel 1, vì vậy bạn có thể ngăn chúng bắt đầu cài đặt như thế này:

sudo RUNLEVEL=1 apt-get install redis-server

Tôi đang cài đặt Ubuntu tối thiểu trên một ổ đĩa, sau đó thay vì khởi động vào nó, tôi sử dụng Live CD / USB để chrootvà cài đặt các gói tôi cần. Vì những thứ bắt đầu chạy, đôi khi tôi bị loại khỏi phiên bản Ubuntu (CD trực tiếp). Dù sao, điều tôi muốn hỏi là, làm thế nào để tôi sử dụng nó RUNLEVELtrong chroot?
Oxwivi

@Oxwivi, cùng một cách, nhưng nó được cho là tự động phát hiện bạn đang ở trong một chroot và bỏ qua các trình nền bắt đầu.
psusi

Có thể lỗi đã invoke-rc.dchịu trách nhiệm cho các vấn đề tôi gặp phải?
Oxwivi

@Oxwivi, có thể, nhưng nhiều khả năng một gói cụ thể bị lỗi và không sử dụng invoke-rc.d. Gói này là gì?
psusi

Tôi không có ý tưởng, tôi chỉ liệt kê tất cả các gói để cài đặt và không bận tâm đến thiết bị đầu cuối hơn nữa để xem đầu ra.
Oxwivi


5

Tôi tin rằng bạn cần sử dụng --no-triggerstùy chọn dòng lệnh khi bạn thực hiện dpkgcài đặt. Một cái gì đó như thế này:

dpkg -i --no-triggers SomeBigPackage.deb

Để duy trì cài đặt này để apt-get installkhông chạy bất kỳ trình kích hoạt nào, hãy tạo tệp cấu hình dpkg tùy chỉnh trong /etc/dpkg/dpkg.cfg.d/custom:

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

Lưu ý rằng dpkg vẫn ghi nhật ký kích hoạt khi đã chạy mặc dù chúng không có:

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

Ngoài ra, bạn có thể có tập lệnh cài đặt chạy servicelệnh để tắt dịch vụ mới:

service name_of_service stop

1
Bất kỳ apt-gettương đương? Hoặc có cách nào để cấu hình dpkgđể chạy với --no-triggersviệc sử dụng dpkgtrực tiếp hoặc apt-getcài đặt một cái gì đó không?
Oxwivi

dan_linder, tôi hy vọng bạn không phiền khi tôi chỉnh sửa câu trả lời cho câu hỏi của @ Oxwivi. Hãy thoải mái sửa đổi / hoàn nguyên nó nếu nó không theo ý thích của bạn.
ændrük

5
Điều này là không đúng. Kích hoạt không có gì để làm với daemon bắt đầu. Triggers là một gói thực hiện một số hành động để tự cấu hình lại để phản hồi lại gói khác, chẳng hạn như nếu bạn cài đặt gói có thêm hook initramfs, nó kích hoạt gói initramfs-tools để xây dựng lại initramfs của bạn.
psusi

3

Điều cuối cùng tôi làm là mô phỏng những gì debootstrap làm khi cài đặt các gói, ngoại trừ tôi đã sử dụng dpkg-redirectt:

Đầu tiên di chuyển các tập tin thực sự ra khỏi đường đi:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

Sau đó tạo phiên bản giả:

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

Sau đó thực hiện apt-get nâng cấp, cài đặt, v.v., và sau đó dọn dẹp với:

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

Tôi biết có những lệnh khác có thể được sử dụng để dừng / bắt đầu dịch vụ, nhưng debootstrap chỉ quan tâm start-stop-daemoninitctlvì vậy tôi đã làm theo.


3

Một lót nhanh chóng:

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d

Liên quan đến người đặt "một lớp lót nhanh", bạn đã quên đặt /usr/sbin/policy-rc.d làm tệp thực thi. Nó sẽ bị bỏ qua nếu không.
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.