Gắn kết trên mạng: / đang bận rộn khi cố gắng gắn kết ở chế độ chỉ đọc để tôi có thể chạy zerofree


36

Tôi đang cố gắng chạy zerofreetrên Ubuntu 11.04 để có thể nén hình ảnh VirtualBox vdi bằng cách sử dụng:

VBoxManage modifyhd Ubuntu.vdi --compact

Để chạy zerofreehình ảnh đĩa đã được gắn ở dạng chỉ đọc. Tôi đang làm theo các hướng dẫn có nội dung này để sử dụng lại để chỉ đọc ở chế độ khôi phục (Dấu nhắc thả xuống gốc):

mount -n -o remount,ro -t ext2 /dev/sda1 /

Nhưng khi tôi làm điều này, tôi nhận được lỗi:

mount: / is busy

Có ý tưởng nào để làm việc này không?

Theo dõi : Theo dõi câu trả lời của Jari và bài đăng này bằng cách chạy các lệnh này giải quyết vấn đề.

service rsyslog stop
service network-manager stop
killall dhclient

4
Trang người đàn ông cho zerofree đề nghị chạy telinit 1và điều đó đã giải quyết vấn đề cho tôi.
Alex Ryan

Câu trả lời:


23

Một số quy trình đang giữ các tệp mở để viết. Đây có thể là, ví dụ, các chương trình viết nhật ký, như rsyslogd, các công cụ mạng, thích dhclienthoặc một cái gì đó khác. Tắt từng cái một và thử làm lại có thể có hiệu quả.

Bạn có thể tìm thấy các quy trình sử dụng các tệp nhất định bằng cách sử dụng chương trình fuser. Ví dụ, fuser -v -m /sẽ trả về một danh sách các quy trình. Tuy nhiên, tôi không chắc liệu đây có phải là một trong những thứ giữ cho hệ thống tập tin bận rộn không.


2
Các quy trình có tệp được mở trong chế độ ghi sẽ có vốn Ftrong các cờ truy cập ở fuserđầu ra.
Jan Hudec

21

Bạn chỉ có thể kết nối lại hệ thống tệp chỉ đọc nếu không có quá trình mở tệp để ghi. Chạy lsof /để xem những gì quá trình có tập tin mở trên hệ thống tập tin gốc. Các tệp mở để ghi sẽ được chỉ định trong FDcột. Bạn có thể lọc chúng với

lsof / | awk '$4 ~ /[0-9].*w/'

Để tự động lọc ID tiến trình, phân tích đầu ra của lsof -F pa:

lsof -F pa /home | awk '/^p/ {pid = substr($0, 2)} /^a.*w/ {print pid}'

1
Đã thử với giải pháp này, vẫn còn bận, có thể vì một số tài nguyên không thể hiển thị theo cách này. Sau khi dừng một số dịch vụ đang chạy, có thể xem lại fs dưới dạng chỉ đọc.
Sam Liao

Tôi đã đóng tất cả các quy trình có tệp mở để đọc, viết hoặc cả hai ( u) và nó vẫn báo là bận.
Hubro

12

Cải thiện Peter trả lời:

Tôi không thể giết các tiến trình sử dụng điểm gắn kết của mình. Vì vậy, tôi đã làm điều này:

  • Chỉnh sửa /etc/fstabđể bắt đầu ở chế độ chỉ đọc trong lần khởi động tiếp theo. Vd/dev/sda1 / ext2 ro 0 1
  • Khởi động lại và mở một vỏ (ví dụ: Khóa máy chủ + F2)
  • Chạy zerofree

Để "phục hồi" hệ thống của bạn:

  • Gắn kết với tùy chọn đọc-ghi: $ mount -o remount,rw /dev/sda1
  • Chỉnh sửa /etc/fstablại, khôi phục giá trị ban đầu của bạn

Thêm: nếu cần chế độ phục hồi mở trong bất kỳ bước nào:

  • Khởi động lại
  • Giữ shift trong khi VM đang tải
  • Tùy chọn nâng cao> Tùy chọn hạt nhân với Chế độ khôi phục> Thả xuống Root Shell Nhắc

2
Captain Rõ ràng muốn thêm: Đảm bảo bạn cài đặt zerofree TRƯỚC KHI bạn khởi động lại ở chế độ ro
Xosofox

sử dụng "Drop to Root Shell Prompt" và zerofree: hệ thống tập tin được gắn rw. Nhưng tôi không gặp vấn đề gì với VM khác
Pawel Cioch

Điều này chỉ làm việc cho tôi khi /dev/sda1 / ext2 ro 0 1mục ở đầu danh sách. Khi tôi lần đầu tiên đặt nó làm mục nhập cuối cùng, tôi vẫn gặp lỗi bận điểm gắn kết.
afilina

6

Đôi khi có rất nhiều quá trình giữ cho mount bận rộn, có thể dễ dàng khởi động lại chỉ với mount chỉ đọc.

Thay đổi mục nhập cho hệ thống tập tin gốc /etc/fstab, ví dụ:

/dev/sda1 / ext2 relatime,rw,errors=remount-ro 0 1

trở thành:

/dev/sda1 / ext2 noatime,ro 0 1

Khi khởi động lại, hệ thống tập tin sẽ được gắn ở chế độ chỉ đọc, do đó bạn có thể chạy zerofreetrên nó.

Khi bạn kết thúc, hãy nhắc lại hệ thống tập tin đọc / ghi lại ( mount -o remount,rw /) và hoàn tác các thay đổi của bạn thành /etc/fstab.

Lấy cảm hứng từ https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root


Tuyệt quá! FYI, tôi chỉ sử dụng cái này /dev/sda1 / ext2 ro 0 1và tôi có thể khởi động ở chế độ chỉ đọc.
Topera

5

Nếu bạn vẫn không thể ngắt kết nối hoặc kết nối lại thiết bị của mình sau khi dừng tất cả các dịch vụ và quy trình với các tệp đang mở, thì có thể có một tệp hoán đổi hoặc phân vùng trao đổi khiến thiết bị của bạn luôn bận rộn. Điều này sẽ không hiển thị với fuserhoặc lsof. Tắt trao đổi với:

sudo swapoff -a

Bạn có thể kiểm tra trước và hiển thị tóm tắt của bất kỳ phân vùng trao đổi hoặc tệp hoán đổi nào với:

swapon -s

hoặc là:

cat /proc/swaps

Thay thế cho việc sử dụng lệnh sudo swapoff -a, bạn cũng có thể vô hiệu hóa trao đổi bằng cách dừng một dịch vụ hoặc đơn vị systemd . Ví dụ:

sudo systemctl stop dphys-swapfile

hoặc là:

sudo systemctl stop var-swap.swap

Trong trường hợp của tôi, tắt trao đổi là cần thiết, ngoài việc dừng bất kỳ dịch vụ và quy trình nào với các tệp được mở để ghi, để tôi có thể truy xuất phân vùng gốc của mình dưới dạng chỉ đọc để chạy fscktrên phân vùng gốc mà không cần khởi động lại. Điều này là cần thiết trên một Raspberry Pi chạy Raspbian Jessie.


4

Nếu bạn sử dụng systemd thì việc ghi đĩa sẽ bị dừng bằng cách dừng systemd-journald.

# systemctl stop systemd-journald.socket
# systemctl stop systemd-journald.service
# mount -o ro,remount /

1
Đối với tôi cả hai đơn vị khởi động lại ngay lập tức.
Rld.

đã làm việc cho tôi trong "Tùy chọn nâng cao> Tùy chọn hạt nhân với Chế độ khôi phục> Nhắc đến Root Shell Prompt"
Pawel Cioch

3

Ok, có những gì tôi đã làm

Đầu tiên, mục tiêu của tôi là giảm phân vùng /( ROOT) của tôi để thêm một phân vùng khác vào đĩa của tôi.

  • Từ phiên chạy một khi mọi thứ được dọn dẹp và sao lưu:

    init 1
    

    Máy tính để bàn của tôi biến mất và bây giờ tôi đang ở trên bảng điều khiển Linux ...

    ...
    Give root password for maintenance or press CTRL+D to continue
    TheRootPassword_SomethingLike1234
    
  • Bây giờ, cố gắng gắn kết /trong chế độ chỉ đọc :

    mount -o remount,ro /
    mount: / is busy
    
  • Ok, từ giờ, tôi đang ở chế độ một người dùng trên lý thuyết , nhưng ps axhiển thị rất nhiều quá trình khác !!

    Giết tất cả chúng không thực sự có thể, hoặc nguy hiểm ... ( kill 1bị cấm ... Tôi không có thời gian để chơi psdoom :-)

    Điều duy nhất tôi có thể làm là System Request, vì điều này, tôi biết hai cách: (xem Documentation/sysrq.txttệp trong tài liệu kernel):

    1. đầu tiên sử dụng magic SysRq keybẫy nhân bàn phím:

      • giữ AltGr, sau đó duy trì sau đó nhấn,
      • đánh PrtScnchỉ một lần, nhưng không phát hành AltGr,
      • nhấn schỉ một lần, điều này sẽ gửi Emergency syncyêu cầu đến kernel và
      • nhấn u, điều này sẽ gửi Umount allyêu cầu, điều này sẽ kể lại tất cả các hệ thống tập tin được gắn kết chỉ đọc,
      • rồi thả ra AltGr
    2. Hoặc theo dòng lệnh:

      echo s >/proc/sysrq-trigger
      echo u >/proc/sysrq-trigger
      
  • Bây giờ, tôi có thể

    fsck -fC0 /dev/mapper/MyDisk-ROOT
    

    ....

...


Lưu ý: Tốt thôi, nếu tôi fsckđã thành công, tôi đã khởi động Live USB để có thể chạy resize2fs... Tính năng này chưa được triển khai ...
F. Hauri

Tôi fsckkhông biết -f; Điều đó sẽ làm gì, không khối không được ước tính?
16/11/18

1
@ ᴠɪɴᴄᴇɴᴛ: I'ts ext2's fsckswitch: -f Lực lượng kiểm tra ngay cả khi hệ thống tập tin có vẻ sạch sẽ.
F. Hauri

1

Đối với bất cứ ai khác, những người chỉ tìm kiếm một sửa chữa nhanh chóng để dán vào thiết bị đầu cuối của bạn ...

(Trước khi làm theo các lệnh bên dưới, hãy đảm bảo bạn đã hoàn thành các bước khác như telinit 1.)

Tìm thấy điều này :

fuser -mv /dev/sda1 > /tmp/sda1.pids
kill `cat /tmp/sda1.pids`

Các lệnh có thể giết phiên của bạn, nhưng sau khi bạn quay lại, phân vùng của bạn đã sẵn sàng để được truy cập lại.


1

Đính kèm tệp vdi dưới dạng âm lượng bổ sung và phi hệ thống vào một VirtualBox khác. Ở đó bạn có thể (tái) gắn kết nó khi cần thiết và thực hiện zerofree.

Giả sử bạn muốn nén đĩa VDI của VM1 (Máy ảo 1). Sau đó, bạn cần một VM2 thứ hai . Đó là, :

  • Đảm bảo rằng cả VM1 và VM2 đều không chạy;
  • Từ Trình quản lý VirtualBox:

    • Chọn VM2,
    • "Settings" -> "lưu trữ" -> "Add Hard Disk": "Chọn nó làm đĩa bổ sung",

    • chọn tập tin vdi của VM1 mà bạn muốn thu gọn. Gợi ý: Đảm bảo rằng đĩa cứng vừa được thêm vào VM2 đứng thứ hai theo thứ tự khởi động sau đĩa gốc của VM2.

    • bắt đầu VM2: bây giờ bạn có thể (gắn lại) âm lượng của VM1 dưới dạng đĩa bổ sung cho VM2, vì không có quá trình nào sử dụng nó trong VM2. Gợi ý: Đầu tiên, mở âm lượng với folebrowser của Linux, tự động gắn âm lượng. Sau đó, sử dụng mount -lđể xem đó là _Device_lệnh nào sudo mount -o remount,ro _Device_. Trong trường hợp của tôi, đây là / dev / sdb1 . Vì vậy, lệnh là (1) sudo mount -o ro,remount /dev/sdb1và sau đó (2) sudo zerofree /dev/sdb1.

Thay vì VM2, người ta có thể khởi động và cài đặt đĩa như và hình ảnh .iso và đạt được cùng một NHƯNG tôi chưa thử.


0

Tôi giả sử bạn cố gắng chạy mountlệnh trong VM. Dù sao, bạn có thể có một phân vùng gốc khác với tác giả của bài viết diễn đàn.

Thử:

mount -o ro,remount /

Mà không phụ thuộc vào tùy chọn fs hoặc mount. Nếu điều này không hoạt động, bạn cũng có thể cố gắng xác định fs gốc của mình bằng grep " / " /proc/mountshoặc cat /proc/cmdline. Nếu hệ thống tập tin gốc của bạn là ví dụ / dev / mapper / system-rootfs, bạn có thể sử dụng:

mount -o ro,remount /dev/mapper/system-rootfs /

0

Tôi gặp vấn đề này khiến tôi không thể đặt máy ở chế độ chỉ đọc. Việc giải quyết vấn đề khiến tôi mất nhiều thời gian hơn id muốn thừa nhận ... Tôi tin rằng vấn đề của tôi là tôi đã để Apache-Zeppelin chạy và quên nó đi. Hãy chắc chắn rằng bạn không làm điều tương tự với một dịch vụ lưu trữ loại khác. Để giải quyết vấn đề, tôi đã sử dụng fuser -kill /để chấm dứt tất cả các quy trình có thể gây ra sự cố và nó cho phép tôi quay lại chế độ ro.


0

Giải pháp cho tôi là khởi động lại HĐH và chọn "chế độ phục hồi" từ menu khởi động của GRUB. Từ "chế độ phục hồi", có ít quá trình đang chạy hơn và việc chỉ đọc lại hoạt động tốt.

Nếu hệ thống có tệp hoán đổi trên hệ thống tệp gốc (chứ không phải phân vùng trao đổi), thì cũng cần tạm thời tắt tệp hoán đổi với swapoff -a.

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.