„Mount: / is busy”, gdy próbuję zamontować jako tylko do odczytu, aby móc uruchomić zerofree

36

Próbuję uruchomić system zerofreeUbuntu 11.04, aby skompresować obraz VirtualBox vdi przy użyciu:

VBoxManage modifyhd Ubuntu.vdi --compact

Aby uruchomić zerofreeobraz dysku został zamontowany jako tylko do odczytu. Postępuję zgodnie z tymi instrukcjami, które mówią, aby użyć tego do ponownego zamontowania jako tylko do odczytu z trybu odzyskiwania (monit o upuszczenie do powłoki root):

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

Ale kiedy to robię, pojawia się błąd:

mount: / is busy

Wszelkie pomysły, jak to zrobić?

Kontynuacja : Postępowanie zgodnie z odpowiedzią Jari i tym postem przez uruchomienie tych poleceń rozwiązuje problem.

service rsyslog stop
service network-manager stop
killall dhclient
Falisty krab
źródło
4
Strona podręcznika dla zerofree sugeruje uruchomienie telinit 1i to rozwiązało problem dla mnie.
Alex Ryan,

Odpowiedzi:

23

Niektóre procesy utrzymują pliki otwarte do zapisu. Mogą to być na przykład programy, które zapisują dzienniki, rsyslogdnarzędzia sieciowe itp. dhclientLub coś innego. Wyłączenie ich jeden po drugim i próba ponownego zamontowania może działać.

Możesz znaleźć procesy korzystające z niektórych plików za pomocą programu fuser. Na przykład fuser -v -m /zwróci listę procesów. Nie jestem jednak pewien, czy jest to jeden z tych, który utrzymuje system plików zajęty.

Jari Laamanen
źródło
2
Procesy, w których pliki są otwarte w trybie zapisu, będą miały kapitał Fw flagach dostępu na fuserwyjściu.
Jan Hudec
21

Możesz ponownie zamontować system plików tylko do odczytu, jeśli nie ma procesu, w którym plik jest otwarty do zapisu. Uruchom, lsof /aby zobaczyć, jakie procesy mają pliki otwarte w głównym systemie plików. Pliki otwarte do zapisu zostaną wskazane w FDkolumnie. Możesz je filtrować za pomocą

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

Aby automatycznie filtrować identyfikatory procesów, przeanalizuj dane wyjściowe lsof -F pa:

lsof -F pa /home | awk '/^p/ {pid = substr($0, 2)} /^a.*w/ {print pid}'
Gilles „SO- przestań być zły”
źródło
1
Wypróbowane z tym rozwiązaniem, wciąż zajęte, może spowodować, że niektóre zasoby nie mogą zostać wyświetlone w ten sposób. Po zatrzymaniu niektórych uruchomionych usług można ponownie zainstalować fs jako tylko do odczytu.
Sam Liao,
Zamknąłem wszystkie procesy, w których plik był otwarty do odczytu, zapisu lub obu ( u) i nadal jest zajęty.
Hubro,
12

Poprawianie odpowiedzi Piotra:

Nie mogłem zabić procesów korzystających z mojego punktu podłączenia. Zrobiłem to:

  • Edytuj, /etc/fstababy rozpocząć w trybie tylko do odczytu przy następnym uruchomieniu. Dawny:/dev/sda1 / ext2 ro 0 1
  • Uruchom ponownie i otwórz powłokę (na przykład klucz hosta + F2)
  • Uruchom zerofree

Aby „odzyskać” system:

  • Zamontuj z opcją odczytu i zapisu: $ mount -o remount,rw /dev/sda1
  • Edytuj /etc/fstabponownie, przywracając pierwotną wartość

Dodatkowo: w razie potrzeby otwórz tryb odzyskiwania na dowolnym etapie:

  • Restart
  • Przytrzymaj shift podczas ładowania maszyny wirtualnej
  • Opcje zaawansowane> Opcja jądra z trybem odzyskiwania> Monituj o zrzut do roota powłoki
Topera
źródło
2
Captain Obvious chce dodać: Upewnij się, że instalujesz zerofree PRZED ponownym uruchomieniem w trybie ro
Xosofox
używając polecenia „Drop to Root Shell Monit” i zerofree: rw zamontowany na systemie plików. Ale nie miałem problemu z innymi maszynami wirtualnymi
Paweł Cioch
To działało dla mnie tylko wtedy, gdy /dev/sda1 / ext2 ro 0 1pozycja znajdowała się na górze listy. Kiedy po raz pierwszy umieściłem go jako ostatni wpis, nadal występował błąd zajętości punktu instalacji.
afilina
6

Czasami jest tak wiele procesów utrzymujących podłączenie zajęte, że łatwiej jest po prostu zrestartować się z zamontowaniem tylko do odczytu.

Zmień wpis dla głównego systemu plików w /etc/fstab, na przykład:

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

staje się:

/dev/sda1 / ext2 noatime,ro 0 1

Po ponownym uruchomieniu system plików zostanie zamontowany tylko do odczytu, więc można zerofreena nim uruchomić .

Po zakończeniu ponownie podłącz system plików do odczytu / zapisu ponownie ( mount -o remount,rw /) i cofnij zmiany w /etc/fstab.

Inspirowany https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root

Peter Nowee
źródło
Świetny! Do twojej wiadomości, użyłem właśnie tego /dev/sda1 / ext2 ro 0 1i mogłem uruchomić się w trybie tylko do odczytu.
Topera,
5

Jeśli nadal nie możesz odmontować ani ponownie zamontować urządzenia po zatrzymaniu wszystkich usług i procesów przy otwartych plikach, może to oznaczać, że plik wymiany lub partycja wymiany zajmują urządzenie. To nie pojawi się z fuserlub lsof. Wyłącz zamianę za pomocą:

sudo swapoff -a

Możesz wcześniej sprawdzić i wyświetlić podsumowanie wszystkich partycji wymiany lub plików wymiany za pomocą:

swapon -s

lub:

cat /proc/swaps

Alternatywą do użycia polecenia sudo swapoff -amoże być również możliwość wyłączenia wymiany poprzez zatrzymanie usługi lub jednostki systemowej . Na przykład:

sudo systemctl stop dphys-swapfile

lub:

sudo systemctl stop var-swap.swap

W moim przypadku konieczne było wyłączenie wymiany, oprócz zatrzymania jakichkolwiek usług i procesów z plikami otwartymi do zapisu, aby móc ponownie zamontować partycję root jako tylko do odczytu, aby uruchomić ją fsckna partycji głównej bez ponownego uruchamiania. Było to konieczne na Raspberry Pi z Raspbian Jessie.

Simon Gould
źródło
4

Jeśli używasz systemd, zapisy na dysku są zatrzymywane przez zatrzymanie systemd-journald.

# systemctl stop systemd-journald.socket
# systemctl stop systemd-journald.service
# mount -o ro,remount /
Artur Pędziwilk
źródło
1
Dla mnie obie jednostki natychmiast się restartują.
rld.
pracował dla mnie w „Opcjach zaawansowanych> Opcja jądra z trybem odzyskiwania> Monituj
Paweł Cioch
3

Ok, jest to co zrobiłem

Po pierwsze, moim celem było zmniejszenie mój /( ROOT) partycję, aby dodać inny na moim dysku.

  • Od uruchomienia sesji po wyczyszczeniu i utworzeniu kopii zapasowej:

    init 1
    

    Mój pulpit zniknął i jestem teraz na konsoli Linux ...

    ...
    Give root password for maintenance or press CTRL+D to continue
    TheRootPassword_SomethingLike1234
    
  • Teraz próbuję zamontować /w trybie tylko do odczytu :

    mount -o remount,ro /
    mount: / is busy
    
  • Ok, od teraz jestem teoretycznie w trybie pojedynczego użytkownika , ale ps axpokażę wiele innych procesów !!

    Zabicie ich wszystkich nie jest tak naprawdę możliwe lub niebezpieczne ... ( kill 1jest zabronione ... Nie mam czasu na grę w psdoom :-)

    Jedyne, co mogę zrobić System Request, to: znam dwa sposoby: (zobacz Documentation/sysrq.txtplik w dokumentach jądra):

    1. najpierw za pomocą magic SysRq keypułapki jądra klawiatury:

      • przytrzymaj AltGr, następnie przytrzymaj , a następnie naciśnij
      • uderzył PrtScntylko raz, ale nie puszczaj AltGr,
      • naciśnij stylko raz, spowoduje to wysłanie Emergency syncżądania do jądra i
      • hit u, to wyśle Umount allżądanie, to ponownie zainstaluje wszystkie zamontowane systemy plików tylko do odczytu,
      • następnie zwolnij AltGr
    2. Lub za pomocą wiersza poleceń:

      echo s >/proc/sysrq-trigger
      echo u >/proc/sysrq-trigger
      
  • Teraz mógłbym

    fsck -fC0 /dev/mapper/MyDisk-ROOT
    

    ....

...

F. Hauri
źródło
Uwaga: W porządku, jeśli moje fsckzadanie zakończyło się pomyślnie, uruchomiłem Live USB , aby móc uruchomić resize2fs... Ta funkcja nie jest jeszcze zaimplementowana ...
F. Hauri
Mój fscknie wie -f; co by to zrobiło, zero niereferencyjnych bloków?
ᴠɪɴᴄᴇɴᴛ
1
@ ᴠɪɴᴄᴇɴᴛ: I'ts ext2„s fsckprzełącznik: -f Siła sprawdzanie, nawet jeśli system wydaje się być czysty.
F. Hauri,
1

Dla każdego, kto szuka szybkiej poprawki do wklejenia w twoim terminalu ...

(Przed wykonaniem poniższych poleceń upewnij się, że wykonałeś inne kroki, takie jak telinit 1.)

Znaleziono to :

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

Polecenia mogą zabić twoją sesję, ale po powrocie twoja partycja jest gotowa do ponownego zamontowania.

DustWolf
źródło
1

Załącz plik vdi jako wolumin dodatkowy i niesystemowy do innego VirtualBox. Tam możesz (ponownie) zamontować go w razie potrzeby i wykonać zerofree.

Powiedzmy, że chcesz skompaktować dysk VDI VM1 (Virtual Machine 1). Następnie potrzebujesz drugiego VM2 . To jest, :

  • Upewnij się, że ani VM1, ani VM2 nie działa;
  • Z VirtualBox Manager:

    • Wybierz VM2,
    • "Ustawienia" -> "Storage" -> "Dodaj twardym": „Wybierz jako dodatkowy dysk”,

    • wybierz plik vdi VM1, który chcesz skompresować. Wskazówka: Upewnij się, że dysk twardy właśnie dodany do VM2 zajmuje drugie miejsce w kolejności rozruchu po oryginalnym dysku VM2.

    • uruchom VM2: teraz możesz (ponownie) zamontować wolumin VM1 jako dodatkowy dysk dla VM2, ponieważ żaden proces nie używa go w VM2. Wskazówka: Najpierw otwórz wolumin za pomocą przeglądarki linuksa systemu Linux, która automatycznie montuje wolumin. Następnie użyj, mount -laby zobaczyć, który jest _Device_w poleceniu sudo mount -o remount,ro _Device_. W moim przypadku było to / dev / sdb1 . Tak więc polecenie brzmiało (1), sudo mount -o ro,remount /dev/sdb1a następnie (2) sudo zerofree /dev/sdb1.

Zamiast VM2 powinno być możliwe uruchomienie z dysku instalacyjnego i obrazu .iso i osiągnięcie tego samego, ALE nie próbowałem tego.

Lew
źródło
0

Zakładam, że próbujesz uruchomić mountpolecenie na maszynie wirtualnej. W każdym razie prawdopodobnie masz inną partycję root niż autor posta na forum.

Próbować:

mount -o ro,remount /

Który nie zależy od opcji fs lub mount. Jeśli to nie zadziała, możesz także spróbować określić swój root root za pomocą grep " / " /proc/mountslub cat /proc/cmdline. Jeśli Twoim głównym systemem plików jest na przykład / dev / mapper / system-rootfs, możesz użyć:

mount -o ro,remount /dev/mapper/system-rootfs /
Ulrich Dangel
źródło
0

Miałem ten problem, który powstrzymywał mnie od przełączania komputera w tryb tylko do odczytu. Rozwiązanie problemu zajęło mi więcej czasu, niż chciałbym przyznać ... Myślę, że moim problemem było to, że zostawiłem bieg Apache-Zeppelin i zapomniałem o tym. Upewnij się, że nie robisz tego samego z inną usługą hostingową. Aby rozwiązać problem, zwykłem fuser -kill /przerywać wszystkie procesy, które mogły być przyczyną problemu, i pozwoliłem mi wrócić do trybu ro.

ob1
źródło
0

Rozwiązaniem było dla mnie ponowne uruchomienie systemu operacyjnego i wybranie „trybu odzyskiwania” z menu uruchamiania GRUB-a. W „trybie odzyskiwania” działa mniej procesów, a ponowne podłączanie tylko do odczytu działa poprawnie.

Jeśli system ma plik wymiany w głównym systemie plików (zamiast partycji wymiany), konieczne jest również tymczasowe wyłączenie pliku wymiany za pomocą swapoff -a.

Boann
źródło