Không thể kết nối / quay lại chỉ đọc sau khi nâng cấp gói


13

Tôi đang sử dụng Debian Stretch. Phân vùng gốc của tôi được gắn kết read-only. Chỉ khi tôi cài đặt hoặc nâng cấp các gói, được kết nối /lại read-write(bằng cách sử dụng apt hook), và sau đó được gửi lại ro.

Đôi khi sau khi nâng cấp gói, tôi không thể /quay lại chỉ đọc:

mount -o remount,ro /
mount: / is busy

Trên các phiên bản Debian cũ hơn (Wheezy), tôi có thể liệt kê các tệp đang mở không được liên kết với lsof:

 lsof +L1

hoặc, cụ thể hơn, các tệp ngăn không /được gửi lại cho ro:

{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'

Tuy nhiên, trên Debian Stretch, lsof +L1không liệt kê bất kỳ tệp nào.

Tôi không thấy bất kỳ thay đổi nào +|-Ltrong man lsofđó sẽ giải thích tại sao nó ngừng hoạt động.

Tại sao lsof + L1 không còn liệt kê các tệp đang mở mà không được liên kết?

Làm cách nào tôi có thể liệt kê các tệp ngăn / không được đọc lại thành chỉ đọc?

CẬP NHẬT

Tôi đã ngừng tất cả các quá trình có thể được dừng lại, và chỉ có initgettyvẫn chạy, nhưng tôi vẫn không thể đi ngược lại /đến ro.


Các tập tin mở không liên kết không phải là trở ngại duy nhất. Tìm kiếm whoặc utrong FDcột của lsofđầu ra, hoặc cho Fđầu ra của fuser -vm /, ví dụ. Tôi không thể cung cấp cho bạn một danh sách đầy đủ, mặc dù. Bạn cũng có thể muốn cài đặt gói Needrestart .
Ferenc Wágner

Câu hỏi ngu ngốc nhưng bạn đang thực hiện lsof như root?
Kiwy

1
Kiwy - vâng, tôi đang thực thi lsof với quyền root.
Martin Vegter

1
không fuser -m / cho biết những gì đang sử dụng root?
Rui F Ribeiro

1
@Marcus Linsner - Tôi không sử dụng systemd. Tôi đang sử dụng init.
Martin Vegter

Câu trả lời:


2

Làm cách nào tôi có thể liệt kê các tệp ngăn / không được đọc lại thành chỉ đọc?

A) fusercó thể được tìm thấy trong psmiscgói; đây là trường hợp sử dụng mà tôi thấy fusertỏa sáng & hữu ích hơn lsof.

# fuser -v -m / 2>&1 | grep '[Ff]r.e'

Điều đó sẽ hiển thị tất cả các quy trình có tệp mở trên / để đọc (f) và viết (F). Các tệp sẽ ngăn / không được đọc lại thành chỉ đọc là những tệp được mở để ghi (F).

Giết các tiến trình đang chạy có thể chạy với các tệp thư mục gốc mở để ghi ., Tức là

# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done

Đó là trên các systemdý kiến ​​với một cảnh báo. Nếu systemdinitsau đó fusersẽ thấy nó và có những cân nhắc khác. Với systemdviệc chạy, nó có thể (bắt đầu lại) các quá trình phía sau lưng của bạn, ngay cả khi chúng vừa được xác định và bị giết fuser. systemdtiên tiến hơn nhiều so với truyền thống sysvinit.

B) CẬP NHẬT trong phần mô tả cho biết hệ thống chỉ có ... initgettyvẫn đang chạy ...

Tôi thấy bình luận nói rằng hệ thống không sử dụng systemd, nó đang sử dụng init. Trên căng, systemd init . Nhận xét không nói rõ ràng sysvinit, vì vậy tôi cho rằng hệ thống đang được đề cập có thể đang sử dụng độ dài mặc định systemdcho init. Hoặc rằng những người khác vấp ngã trên bài đăng này, đang sử dụng căng systemd, thấy phần này hữu ích.

Theo Wiki Wiki ,

Quá trình khởi tạo hệ thống được xử lý bởi trình nền init. Trong các bản phát hành nén và trước đó, trình nền đó được cung cấp bởi gói sysvinit và không có sự thay thế nào được hỗ trợ. Trong wheezy , init daemon mặc định vẫn cònsysvinit , nhưng "bản xem trước công nghệ" của systemd có sẵn. Trong jessiecăng , hệ thống init mặc định làsystemd , nhưng chuyển đổi để sysvinit được hỗ trợ.

Kể từ jessie, chỉ có systemd được hỗ trợ đầy đủ; sysvinit chủ yếu được hỗ trợ, nhưng các gói Debian không bắt buộc phải cung cấp các tập lệnh khởi động sysvinit. runit cũng được đóng gói, nhưng chưa nhận được mức độ thử nghiệm và hỗ trợ như các loại khác và hiện không được hỗ trợ như PID 1.

Với systemdviệc chạy, có một vài bước bổ sung cần được thực hiện để giải phóng / để nó có thể được xử lý lại mà không gặp vấn đề gì.

Có khả năng system.sliceđang giữ các tệp đang mở cho systemd-journald.servicehoặc systemd-udevd.service(cả hai đều có phụ thuộc ổ cắm). Hoặc, nếu NetworkManagerđang chạy, nó có thể hồi sinh dhclient, ghi vào / var / ... (& / var / không phải luôn là thiết bị của chính nó), v.v. fusercó thể tìm thấy & bạn giết dhclientnhưng NetworkManagerkhởi động lại ngay.

Đạo đức là rất nhiều thứ được tự động hóa mà có thể 'muốn' / (và thậm chí còn hơn thế nữa systemd).

Để chắc chắn, nếu nó khả thi, systemdtương đương với cấp 1 chạy được khớp với rescue.target(và runlevel1.targetlà một liên kết tượng trưng cho rescue.target).

1) Bắt đầu bằng cách cách ly hệ thống với rescue.target

# systemctl isolate rescue.target

Nó sẽ nhắc bạn nhập mật khẩu root; làm theo hướng dẫn trên màn hình.

2) Tại vỏ cứu hộ, tìm hiểu những gì muốn /.

# systemctl show -p Wants /

Thông thường, nó là system.slice; dừng tất cả mọi thứ mà Wants /. ví dụ

# systemctl stop system.slice

3) Tại thời điểm này, bản báo cáo không nên báo cáo mount: / is busymount -o remount,ro / nên hoạt động. Nếu không, kiểm tra lại với fuser.

4) FWIW; Tôi cũng đã thấy những lần umountthất bại khi / nếu một thiết bị khác được gắn trên thư mục con của một mount khác, tức là các mount được lồng. Ví dụ: umount /sẽ thất bại nếu / var / hoặc / boot / nằm trên thiết bị khác (và được gắn). Mặc dù mount -o remount,ro /vẫn nên làm việc trong trường hợp này.

lsblk có thể hữu ích để hình dung gắn kết lồng nhau.

Tại sao lsof + L1 không còn liệt kê các tệp đang mở mà không được liên kết?

Bởi vì chúng không có sẵn (ổ cắm hoặc hầu hết các bộ & ống), chúng không mở tệp nữa (quy trình cha mẹ đã đóng bộ mô tả tệp) hoặc chúng (vẫn) có số lượng liên kết lớn hơn 1.

người đàn ông lsof (8) chi tiết ...

+ | -L [l]

Tùy chọn này cho phép ('+') hoặc vô hiệu hóa ('-') danh sách số lượng liên kết tệp, nơi chúng có sẵn - ví dụ: chúng không có sẵn cho ổ cắm, hoặc hầu hết các bộ xếp hình và ống.

Khi + L được chỉ định mà không có số sau, tất cả số lượng liên kết sẽ được liệt kê. Khi -L được chỉ định (mặc định), sẽ không có số lượng liên kết nào được liệt kê.

Khi + L được theo sau bởi một số, chỉ các tệp có số lượng liên kết ít hơn số đó sẽ được liệt kê . (Không có số nào có thể theo -L.) Một đặc điểm kỹ thuật của biểu mẫu '' + L1 '' sẽ chọn các tệp đang mở đã được hủy liên kết. Một đặc điểm kỹ thuật của biểu mẫu +aL1 <file_system>sẽ chọn các tệp đang mở không được liên kết trên hệ thống tệp được chỉ định.


0

Bạn đã /procgắn kết?

Dường như là một người quan tâm đến việc /gắn kết chỉ đọc hầu hết thời gian, tôi có thể tưởng tượng bạn cũng có thể chọn không gắn kết các bảng. Nhưng Procfs nó là cần thiết lsofđể tìm các tập tin mở.

Các tệp được giữ bởi các tiến trình được hiển thị bởi kernel thông qua các liên kết tượng trưng trong Procfs. Các thư mục /proc/<pid>/fdchứa một liên kết tượng trưng cho mỗi tệp được mở. Tên của các liên kết tượng trưng là các số mô tả tệp và đường dẫn được liên kết bởi symlink là đường dẫn tệp.

Liên kết tượng trưng vẫn còn tồn tại trong /proccác tệp đang mở đã bị xóa. Và đường dẫn được tham chiếu của tệp được đổi tên thành kết thúc bằng "(đã xóa)".

Những gì lsof +L1về cơ bản không khác gì một lớp lót nhanh như:

stat -c%N /proc/[0-9]*/fd/* | grep deleted

Vì vậy, bạn có thể sử dụng một lớp lót tương tự để liệt kê tất cả các tệp đang mở có thể ngăn hệ thống tệp gốc không bị xóa (cung cấp hoạt động /proc).

Tuy nhiên, nếu bạn đã / đã /procgắn kết, các nguyên nhân khác mà tôi có thể nghĩ đến là lỗi ... Dù sao, FYI, trên hệ thống Debian Stretch hiện tại của tôi. lsof +L1hoạt động như mong đợi.

bash# lsb_release -d
Description:    Debian GNU/Linux 9.5 (stretch)

bash# uname -a
Linux bwp-249-8 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux

bash# lsof -v
lsof version information:
    revision: 4.89
    [...]

vâng, tôi đã /procgắn kết. Tôi không làm theo lý do của bạn tại sao tôi có thể không có. Dù sao, stat -c%N /proc/[0-9]*/fd/* | grep deletedcho tôi thấy không có gì.
Martin Vegter

0

Tôi chỉ có thể tái tạo vấn đề này một lần và giải quyết nó bằng cách chỉ sử dụng mountvới tùy chọn -n .

Trích dẫn người đàn ông gắn kết :

-n, --no-mtab
      Mount without writing in /etc/mtab.  This is necessary for example when /etc is on a read-only filesystem.

Các mountchương trình riêng của mình mở file (s) cho văn bản trong hệ thống tập tin gốc nghe như một lời giải thích chính đáng đối với tôi. Cụ thể mountviết /etc/mtabsau tất cả và /etcthường là một phần của hệ thống tập tin gốc. Tuy nhiên tôi không thể sao chép lại trên cùng một máy sau khi tôi đã làm điều đó một lần ...

Điều này có thể giải quyết vấn đề của bạn?


không, sử dụng -nvới mount không có sự khác biệt.
Martin Vegter

0

Không có khả năng hiển thị vào hệ thống của bạn, rất khó để cho bạn biết chính xác vấn đề là gì. Các ý kiến ​​và câu trả lời trước là khởi đầu tốt.

Điều đó nói rằng, tôi sẽ quay trở lại tất cả các cách thông qua wiki debian mô tả các điều kiện tiên quyết chỉ để gắn / đọc.

Liên kết đến tài liệu ở đây: https://wiki.debian.org/ReadonlyRoot

Người lớn tôi sẽ dẫn bạn qua đây:

1 - có những vị trí cụ thể dưới / phải được đọc ghi. Dựa trên tài liệu có vẻ như thế này:

gốc ro

các thiết bị khối của bạn có thể sẽ khác nhau, tùy thuộc vào cấu hình ngăn xếp lưu trữ của bạn (phân vùng, lvm partion, v.v.) nhưng ý tưởng chính là bạn cần 4 điểm gắn kết đó để có hệ thống tệp được gắn tiếp theo của chúng để có tùy chọn gắn RW.

2 - có một số tệp đặc biệt trong / etc mà bạn cần tạo liên kết tượng trưng cho hoặc thực hiện một số thay đổi khác (cụ thể chi tiết trong bài viết được liên kết.). Chúng có thể hoặc không thể áp dụng dựa trên những ứng dụng mà máy chủ linux của bạn đang chạy. một số tệp thậm chí có thể không tồn tại trên máy của bạn, nhưng tôi đã bao gồm mọi thứ trong tài liệu. Hãy ghi nhớ, tôi thực sự khuyên bạn nên thực hiện những thay đổi này NGAY CẢ NẾU bạn đã giết chết quy trình này. Dưới đây là các đường dẫn trực tiếp từ wiki debian:

  • thời gian chờ
  • init.d / alsa-utils
  • / etc / chuyển phát nhanh / chia sẻ / chỉ mục
  • bất kỳ tập tin trạng thái cốc, class.conf, cupsd.conf, máy in.cs đăng ký.
  • /etc/lvm/lvm.conf
  • mtab (có vẻ như bạn đã cố gắng giải quyết bằng cách gắn cờ -n)
  • mạng / chạy (được sử dụng bởi ifup và ifdown, trong vắt. có thể không áp dụng cho kéo dài, ymmv)
  • nologin
  • độ phân giải
  • cả tập tin passwd và bóng
  • samba / dhcp.conf
  • mút
  • udev

Khi bạn đã kiểm tra tất cả các mục trên và xác nhận rằng chúng phù hợp với thông số kỹ thuật trong wiki, điều tiếp theo cần kiểm tra là /etc/apt/apt.conf

DPkg {
// Auto re-mounting of a readonly /
Pre-Invoke { "mount -o remount,rw /"; };
Post-Invoke { "test ${NO_APT_REMOUNT:-no} = yes || mount -o remount,ro / || true"; };
}; 

dựa trên lỗi của bạn, điều cuối cùng bạn có thể kiểm tra dựa trên tài liệu đến từ bên dưới:

"Sau khi nâng cấp các gói bạn có thể phải đối mặt với vấn đề gắn kết từ chối nhắc lại hệ thống tập tin chỉ cho bạn biết / đang bận. Đây là do các tệp bị xóa mà chúng vẫn được sử dụng bởi một quy trình. các tệp sử dụng công cụ kiểm tra công cụ (1) từ gói debian-goodies hoặc sử dụng lệnh sau. Thường thì đây là các trình tiện ích sử dụng các thư viện được nâng cấp. Bạn phải khởi động lại chúng để làm cho các tệp được phát hành. "

lệnh được cung cấp trong tài liệu.:

{lsof +L1; lsof|sed -n '/SYSV/d; /DEL\|(path /p;'} |grep -Ev '/(dev|home|tmp|var)'

Nếu không biết cấu hình hệ thống tập tin chính xác, chia tay và cấu hình thiết bị lưu trữ, thật khó để cung cấp cho bạn nhiều thứ khác để làm theo. Tôi sẽ bắt đầu với việc quay lại và kiểm tra lại điều kiện tiên quyết của bạn trong tài liệu (và được nêu ở trên).

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.