«Mount: / is busy» при попытке монтировать только для чтения, чтобы я мог запустить zerofree


36

Я пытаюсь запустить zerofreeUbuntu 11.04, чтобы сжать образ VirtualBox vdi с помощью:

VBoxManage modifyhd Ubuntu.vdi --compact

Для запуска zerofreeобраз диска был смонтирован только для чтения. Я следую этим инструкциям, в которых говорится, что нужно использовать это, чтобы перемонтировать только для чтения из режима восстановления (приглашение Drop to root shell):

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

Но когда я делаю это, я получаю ошибку:

mount: / is busy

Есть идеи, как это сделать?

Последующие действия : После ответа Яри и этого поста эти команды решают проблему.

service rsyslog stop
service network-manager stop
killall dhclient

4
Страница man для zerofree предлагает запустить, telinit 1и это решило проблему для меня.
Алекс Райан

Ответы:


23

Некоторые процессы держат файлы открытыми для записи. Это могут быть, например, программы, которые пишут логи, например rsyslogd, сетевые инструменты, dhclientили что-то еще. Отключение одного за другим и попытка перемонтирования могут сработать.

Вы можете найти процессы, которые используют определенные файлы с помощью программы fuser. Например, fuser -v -m /вернет список процессов. Тем не менее, я не уверен, если это один из них, который поддерживает файловую систему.


2
Процессы, файлы которых открыты в режиме записи, будут иметь заглавные буквы Fв флагах доступа на fuserвыходе.
Ян Худек

21

Вы можете перемонтировать файловую систему только для чтения, если нет процесса, у которого есть файл, открытый для записи. Запустите, lsof /чтобы увидеть, какие процессы открывают файлы в корневой файловой системе. Файлы, открытые для записи, будут указаны в FDстолбце. Вы можете отфильтровать их с

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

Чтобы отфильтровать идентификаторы процесса автоматически, проанализируйте выходные данные lsof -F pa:

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

1
Попытка использовать это решение, все еще занятая, может привести к тому, что какой-то ресурс не сможет показать таким образом. После остановки некоторых запущенных сервисов, можете перемонтировать фс только для чтения.
Сэм Ляо

Я закрыл все процессы, в которых был открыт файл для чтения, записи или для обоих ( u), и он по-прежнему говорит занят.
Hubro

12

Совершенствую ответ Петра:

Я не мог убить процессы, использующие мою точку монтирования. Итак, я сделал это:

  • Изменить /etc/fstabдо запуска только для чтения при следующей загрузке. Пример:/dev/sda1 / ext2 ro 0 1
  • Перезагрузите компьютер и откройте оболочку (например, Host Key + F2)
  • Запустить ноль

Чтобы «восстановить» вашу систему:

  • Монтировать с опцией чтения-записи: $ mount -o remount,rw /dev/sda1
  • Отредактируйте /etc/fstabснова, восстанавливая ваше первоначальное значение

Дополнительно: при необходимости откройте режим восстановления на любом этапе:

  • перезагружать
  • Удерживайте Shift во время загрузки виртуальной машины
  • Дополнительные параметры> Параметр ядра с режимом восстановления> Запрос перехода в корневую оболочку

2
Капитан Очевидность хочет добавить: Убедитесь, что вы устанавливаете ноль без ПЕРЕД перезагрузкой в ​​режиме ro
Xosofox

используя «Drop to Root Shell Prompt» и zerofree: смонтированную в файловой системе rw. Но у меня не было проблем в других виртуальных
машинах

Это сработало только для меня, когда /dev/sda1 / ext2 ro 0 1запись была в верхней части списка. Когда я впервые поставил его как последнюю запись, у меня все еще была ошибка занятости точки монтирования.
Афилина

6

Иногда бывает так много процессов, которые поддерживают монтирование, так что может быть проще просто перезагрузиться с монтированием только для чтения.

Измените запись для корневой файловой системы /etc/fstab, например:

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

будет выглядеть так:

/dev/sda1 / ext2 noatime,ro 0 1

При перезагрузке файловая система будет смонтирована только для чтения, поэтому вы можете запустить zerofreeее.

Когда вы закончите, перемонтируйте файловую систему для чтения / записи снова ( mount -o remount,rw /) и отмените ваши изменения /etc/fstab.

Вдохновленный https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root


Большой! К вашему сведению, я использовал только это, /dev/sda1 / ext2 ro 0 1и я мог загрузиться в режиме только для чтения.
Topera

5

Если вы по-прежнему не можете размонтировать или перемонтировать устройство после остановки всех служб и процессов с открытыми файлами, возможно, существует раздел подкачки или раздел подкачки, сохраняющий занятость устройства. Это не будет отображаться с fuserили lsof. Выключите обмен с:

sudo swapoff -a

Вы можете проверить заранее и показать сводку любых разделов подкачки или файлов подкачки с:

swapon -s

или:

cat /proc/swaps

В качестве альтернативы использованию команды sudo swapoff -aвы также можете отключить обмен, остановив службу или системный модуль. Например:

sudo systemctl stop dphys-swapfile

или:

sudo systemctl stop var-swap.swap

В моем случае было необходимо отключить подкачку, в дополнение к остановке любых служб и процессов с файлами, открытыми для записи, чтобы я мог перемонтировать свой корневой раздел как доступный только для чтения, чтобы запустить fsckмой корневой раздел без перезагрузки. Это было необходимо на Raspberry Pi под управлением Raspbian Jessie.


4

Если вы используете systemd, запись на диск останавливается остановкой systemd-journald.

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

1
Для меня оба блока перезапускаются сразу.
сл.

работал для меня в «Расширенные настройки> Опция ядра с режимом восстановления> Запрос на
переход в корневую

3

Хорошо, есть то, что я сделал

Во-первых, моей целью было уменьшить раздел my /( ROOT), чтобы добавить еще один на мой диск.

  • Из запущенного сеанса один раз все очищается и резервируется:

    init 1
    

    Мой рабочий стол ушел, и я теперь на консоли Linux ...

    ...
    Give root password for maintenance or press CTRL+D to continue
    TheRootPassword_SomethingLike1234
    
  • Теперь пытаемся монтировать /в режиме только для чтения:

    mount -o remount,ro /
    mount: / is busy
    
  • Хорошо, теперь я нахожусь в теоретически однопользовательском режиме , но ps axпокажу много другого процесса !!

    Убить их всех на самом деле невозможно или опасно ... ( kill 1запрещено ... У меня нет времени играть в psdoom :-)

    Единственное, что я могу сделать System Request, для этого я знаю два способа: (см. Documentation/sysrq.txtФайл в документации к ядру):

    1. сначала используя magic SysRq keyловушку ядра клавиатуры:

      • удерживайте AltGr, затем удерживайте, затем нажмите,
      • ударить PrtScnтолько один раз, но не отпускай AltGr,
      • нажмите sодин раз, это отправит Emergency syncзапрос ядру и
      • нажмите u, отправит Umount allзапрос, перемонтирует все смонтированные файловые системы только для чтения,
      • затем отпустите AltGr
    2. Или из командной строки:

      echo s >/proc/sysrq-trigger
      echo u >/proc/sysrq-trigger
      
  • Тогда сейчас я мог

    fsck -fC0 /dev/mapper/MyDisk-ROOT
    

    ....

...


Примечание. В общем, если все fsckбыло сделано успешно, я загрузил Live USB , чтобы он мог работать resize2fs... Эта функция еще не реализована ...
Ф. Хаури

Мой fsckне знает -f; что бы это сделать, ноль не связанных блоков?
ᴠɪɴᴄᴇɴᴛ

1
@ ᴠɪɴᴄᴇɴᴛ: I'ts ext2«ы fsckвыключатель: -f Force проверка , даже если файловая система кажется чистой.
Ф. Хаури

1

Для тех, кто просто ищет быстрое решение для вставки в ваш терминал ...

(Прежде чем следовать приведенным ниже командам, убедитесь, что вы выполнили другие шаги, как telinit 1.)

Нашел это :

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

Команды могут убить ваш сеанс, но после того, как вы вернетесь, ваш раздел готов к перемонтированию.


1

Прикрепите файл vdi как дополнительный и не системный том к другому VirtualBox. Там вы можете (пере) смонтировать его по мере необходимости и выполнить ноль.

Допустим, вы хотите сжать VDI-диск VM1 (Virtual Machine 1). Тогда вам нужен второй VM2 . То есть, :

  • Убедитесь, что ни VM1, ни VM2 не работают;
  • Из VirtualBox Manager:

    • Выберите VM2,
    • "Настройка" -> "Хранилище" -> "Добавить жесткий диск": "Select it as additional disk",

    • выберите файл VMD VM1, который вы хотите сжать. Подсказка: убедитесь, что только что добавленный в VM2 жесткий диск занимает второе место в порядке загрузки после исходного диска VM2.

    • Запустите VM2: теперь вы можете (заново) подключить том VM1 как дополнительный диск для VM2, потому что ни один процесс не использует его в VM2. Подсказка: во-первых, откройте том с помощью браузера Linux, который автоматически подключит том. Затем используйте, mount -lчтобы увидеть, что _Device_в команде sudo mount -o remount,ro _Device_. В моем случае это был / dev / sdb1 . Таким образом, команда была (1), sudo mount -o ro,remount /dev/sdb1а затем (2) sudo zerofree /dev/sdb1.

Вместо VM2 нужно иметь возможность загружаться с установочного диска и образа .iso и получать то же самое, НО я не пробовал.


0

Я предполагаю, что вы пытаетесь запустить mountкоманду в виртуальной машине. В любом случае, у вас, вероятно, другой корневой раздел, чем у автора поста на форуме.

Пытаться:

mount -o ro,remount /

Что не зависит от фс или опции монтирования. Если это не работает, вы также можете попытаться определить ваш корневой файл с помощью grep " / " /proc/mountsили cat /proc/cmdline. Если вашей корневой файловой системой является, например, / dev / mapper / system-rootfs, вы можете использовать:

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

0

У меня была эта проблема, из-за которой я не мог перевести мою машину в режим только для чтения. Решение проблемы заняло у меня больше времени, чем хотелось бы признать ... Я считаю, что моей проблемой было то, что я оставил Apache-Zeppelin запущенным и забыл об этом. Убедитесь, что вы не делаете то же самое с другим типом хостинга. Чтобы решить проблему, я использовал fuser -kill /для завершения всех процессов, которые могли вызвать проблему, и это позволило мне вернуться в режим ro.


0

Решением для меня было перезагрузить ОС и выбрать «режим восстановления» в меню загрузки GRUB. В «режиме восстановления» выполняется меньше процессов, и перемонтирование работает только для чтения.

Если в корневой файловой системе системы есть файл подкачки (а не раздел подкачки), необходимо также временно отключить файл подкачки с помощью swapoff -a.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.