không thể kết nối lại hệ thống tập tin trở lại chỉ đọc sau khi nâng cấp gói


10

Trên hệ thống Debian của tôi, tôi có /phân vùng riêng và được gắn kết read-only. Chỉ /home/, /var//tmp/có thể ghi. Tôi cũng đã tạo một Pre-InvokePost-Invoke apt hook, để aptcó thể tự động kết nối lại hệ thống để ghi, khi các gói được cài đặt hoặc nâng cấp, và kết nối lại cho đến read-onlykhi hoàn thành:

DPkg::Pre-Invoke  {"mount -o remount,rw / ;};
DPkg::Post-Invoke {"mount -o remount    / ;};

Toàn bộ thiết lập này hoạt động tốt với một ngoại lệ. Đôi khi trong quá trình cài đặt / nâng cấp, một số dịch vụ cần được khởi động lại hoặc các tệp mới được mở trong cửa sổ ngắn khi tôi /được gắn kết read-write, các tệp này được mở bằng writequyền. Sau khi cài đặt / nâng cấp hoàn tất, Post-Invokehook của tôi trả về lỗi vì nó không thể /quay lại read-only.

Có cách nào để giải quyết vấn đề này? Điều này rất khó chịu, vì trong tình huống này tôi thường phải khởi động lại máy chủ, điều này không thực tế.

BIÊN TẬP

Dưới đây là nhật ký nâng cấp gói mới nhất của tôi, dẫn đến lỗi được mô tả:

root@alpha# apt-get upgrade 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  base-files curl libc-bin libc6 libcurl3 libcurl3-gnutls libmysqlclient18 libssl1.0.0 locales multiarch-support mysql-client mysql-client-5.5 mysql-common
  nscd openssl tzdata wget whois
18 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 18.7 MB of archives.
After this operation, 264 kB of additional disk space will be used.
Do you want to continue [Y/n]? 
Fetched 18.7 MB in 0s (33.2 MB/s) 
Preconfiguring packages ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace base-files 7.1wheezy3 (using .../base-files_7.1wheezy4_amd64.deb) ...
Unpacking replacement base-files ...
Processing triggers for man-db ...
Processing triggers for install-info ...
Setting up base-files (7.1wheezy4) ...
Installing new version of config file /etc/debian_version ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc-bin 2.13-38 (using .../libc-bin_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc-bin ...
Processing triggers for man-db ...
Setting up libc-bin (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libc6:amd64 2.13-38 (using .../libc6_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement libc6:amd64 ...
Setting up libc6:amd64 (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace libssl1.0.0:amd64 1.0.1e-2+deb7u1 (using .../libssl1.0.0_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement libssl1.0.0:amd64 ...
Preparing to replace curl 7.26.0-1+wheezy7 (using .../curl_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement curl ...
Preparing to replace libcurl3:amd64 7.26.0-1+wheezy7 (using .../libcurl3_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3:amd64 ...
Preparing to replace libcurl3-gnutls:amd64 7.26.0-1+wheezy7 (using .../libcurl3-gnutls_7.26.0-1+wheezy8_amd64.deb) ...
Unpacking replacement libcurl3-gnutls:amd64 ...
Preparing to replace mysql-common 5.5.33+dfsg-0+wheezy1 (using .../mysql-common_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-common ...
Preparing to replace libmysqlclient18:amd64 5.5.33+dfsg-0+wheezy1 (using .../libmysqlclient18_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement libmysqlclient18:amd64 ...
Preparing to replace multiarch-support 2.13-38 (using .../multiarch-support_2.13-38+deb7u1_amd64.deb) ...
Unpacking replacement multiarch-support ...
Processing triggers for man-db ...
Setting up multiarch-support (2.13-38+deb7u1) ...
(Reading database ... 20532 files and directories currently installed.)
Preparing to replace tzdata 2013h-0wheezy1 (using .../tzdata_2013i-0wheezy1_all.deb) ...
Unpacking replacement tzdata ...
Setting up tzdata (2013i-0wheezy1) ...

Current default time zone: 'Europe/London'
Local time is now:      Sat Feb 15 11:35:41 CET 2014.
Universal Time is now:  Sat Feb 15 11:35:41 UTC 2014.
Run 'dpkg-reconfigure tzdata' if you wish to change it.

(Reading database ... 20511 files and directories currently installed.)
Preparing to replace wget 1.13.4-3 (using .../wget_1.13.4-3+deb7u1_amd64.deb) ...
Unpacking replacement wget ...
Preparing to replace locales 2.13-38 (using .../locales_2.13-38+deb7u1_all.deb) ...
Unpacking replacement locales ...
Preparing to replace whois 5.0.23 (using .../whois_5.1.1~deb7u1_amd64.deb) ...
Unpacking replacement whois ...
Preparing to replace mysql-client 5.5.33+dfsg-0+wheezy1 (using .../mysql-client_5.5.35+dfsg-0+wheezy1_all.deb) ...
Unpacking replacement mysql-client ...
Preparing to replace mysql-client-5.5 5.5.33+dfsg-0+wheezy1 (using .../mysql-client-5.5_5.5.35+dfsg-0+wheezy1_amd64.deb) ...
Unpacking replacement mysql-client-5.5 ...
Preparing to replace nscd 2.13-38 (using .../nscd_2.13-38+deb7u1_amd64.deb) ...
[ ok ] Stopping Name Service Cache Daemon: nscd.
Unpacking replacement nscd ...
Preparing to replace openssl 1.0.1e-2+deb7u1 (using .../openssl_1.0.1e-2+deb7u4_amd64.deb) ...
Unpacking replacement openssl ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Setting up libssl1.0.0:amd64 (1.0.1e-2+deb7u4) ...
Setting up libcurl3:amd64 (7.26.0-1+wheezy8) ...
Setting up curl (7.26.0-1+wheezy8) ...
Setting up libcurl3-gnutls:amd64 (7.26.0-1+wheezy8) ...
Setting up mysql-common (5.5.35+dfsg-0+wheezy1) ...
Setting up libmysqlclient18:amd64 (5.5.35+dfsg-0+wheezy1) ...
Setting up wget (1.13.4-3+deb7u1) ...
Setting up locales (2.13-38+deb7u1) ...
Generating locales (this might take a while)...
  en_DK.UTF-8... done
  en_US.UTF-8... done
Generation complete.
Setting up whois (5.1.1~deb7u1) ...
Setting up mysql-client-5.5 (5.5.35+dfsg-0+wheezy1) ...
Setting up mysql-client (5.5.35+dfsg-0+wheezy1) ...
Setting up nscd (2.13-38+deb7u1) ...
[ ok ] Starting Name Service Cache Daemon: nscd.
Setting up openssl (1.0.1e-2+deb7u4) ...
mount: / is busy

Dòng cuối cùng ( mount: / is busy) là lỗi được trả về bởi apt, khi cố gắng truy cập /lại read-only.

CẬP NHẬT:

lệnh được đề xuất bởi Graemekhông hiển thị bất kỳ tệp nào:

# lsof / | awk 'NR==1 || $4~/[0-9][uw]/'
COMMAND     PID       USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME

Bạn đang tìm cách để ngăn chặn các tập tin được mở read-write, hoặc phải khởi động lại máy chủ trong khi có thể truy cập lại ro, hoặc tìm và thay đổi các gói chặn? Hoặc là sẽ được chấp nhận như là một giải pháp?
Anthon

Lý tưởng nhất, tôi muốn ngăn chặn các tập tin được mở rwở nơi đầu tiên. Nhưng bất kỳ giải pháp nào sẽ cho phép tôi làm lại romà không cần khởi động lại cũng tốt.
Martin Vegter

Dừng các dịch vụ vi phạm, kể lại, bắt đầu lại?
frostschutz

@martin bạn đã có cái nhìn tổng quan về các dịch vụ vi phạm chưa? Tôi thích thiết lập mà bạn đã trình bày và sẽ thử nó trong VM, nhưng thật tuyệt khi biết bạn không chạy thứ gì đó không mặc định trên hệ thống của bạn, điều đó sẽ khiến các thử nghiệm của tôi chỉ liên quan một phần.
Anthon

@Anthon Tôi không biết dịch vụ nào vi phạm. Nhưng xem EDIT của tôi ở trên để làm rõ. Máy chủ của tôi cũng là một VM. Nó là một cài đặt tối thiểu chỉ với một vài dịch vụ đang chạy.
Martin Vegter

Câu trả lời:


2

Tôi đoán là không chỉ các dịch vụ, thực tế là bạn có các hệ thống tệp khác, như / home và / var, được gắn bên trong hệ thống tệp gốc. Ngoài ra, giải pháp tốt nhất tôi có thể khai thác được nêu ra ở đây:

https://sites.google.com/site/linuxpendrive/rorootfs

Tìm phần có tiêu đề Làm cách nào để cài đặt / gỡ cài đặt gói trên hệ thống tệp chỉ đọc? Tóm lại, nó liên quan đến việc nối lại hệ thống tập tin đích và sau đó chroot vào mount mới, trước khi sử dụng trình quản lý gói.

Gợi ý, được nêu trong một trong những câu trả lời khác, đưa ra các giả định về những gì xảy ra khi hệ thống tập tin gốc được nhắc lại để cập nhật gói, vì vậy giải pháp này có thể không thực sự hoạt động Debian, nếu Debian thể hiện hành vi khác với giả định. Nhưng này, nó đáng để thử, tôi nghĩ ...


1

Để đến gần hơn với câu trả lời dứt khoát cho vấn đề này, chúng ta cần xem tập tin nào gây ra mount: / is busylỗi. Bạn có thể làm điều này với:

lsof / | awk 'NR==1 || $4~/[0-9][uw]/'

Xem câu trả lời của tôi cho câu hỏi khác của OP - lsof: hiển thị các tệp được mở dưới dạng đọc-ghi - để biết thêm về điều này. Có thể là bạn cần đặt đoạn mã này vào một tập lệnh riêng biệt và đặt tập lệnh vào hook apt để xem nội dung nào đó.

Sự nghi ngờ của tôi là các tệp bên dưới /etcvẫn mở khi dịch vụ được bắt đầu. Một số chương trình / trình nền cập nhật cấu hình của chúng một cách linh hoạt. NetworkManagercupsdlà hai ví dụ. Các bản cập nhật cupsgây ra cupsdviệc quét các máy in mới (trái ngược với dpkgtập lệnh cấu hình) cũng có thể là nguyên nhân gây ra sự cố của bạn. Tôi khuyên bạn nên đặt /etctrên một hệ thống tệp có thể ghi, ngay cả khi đó không phải là nguồn gốc của vấn đề của bạn.

Một khả năng khác là bộ đệm hệ thống tập tin vẫn đang trong quá trình chuyển sang đĩa khi bạn cố gắng thực hiện lại. Tôi không chắc hành vi của mountnó là gì ở đây, cho dù đó là chặn cho đến khi IO hoàn thành hoặc thất bại và báo cáo đĩa là bận. Đầu tiên có vẻ nhiều khả năng hơn, nhưng tôi thấy không có synccuộc gọi nào ở đầu ra strace(mặc dù có thể mountcuộc gọi hệ thống thực hiện điều này). Dù sao, nó có thể hoạt động synctrước khi kết thúc nếu phần lsoftrên không hiển thị bất cứ điều gì, ví dụ:

DPkg::Post-Invoke { "sync; mount -o remount /"; };

điều này thật lạ lsofLệnh của bạn không liệt kê bất kỳ tệp nào
Martin Vegter

1
Thật thú vị, một điều khác là các tập tin ánh xạ bộ nhớ có thể được sao chép khi ghi. Tôi không biết làm thế nào điều này ảnh hưởng gắn kết, cộng với tôi không chắc chắn lsofvà thậm chí hiển thị này. Bạn đã thử chạy lsofvới hook của bạn? Làm thế nào về các synccông cụ?
Graeme
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.