Jak mogę wyświetlić listę plików, które uniemożliwiają / nie są ponownie montowane w trybie tylko do odczytu?
A) fusermożna znaleźć w psmiscpaczce; jest to przypadek użycia, w którym uważam, że fuserświeci i jest bardziej przydatny niż lsof.
# fuser -v -m / 2>&1 | grep '[Ff]r.e'
To pokaże wszystkie procesy, w których pliki są otwarte na / do odczytu (f) i pisania (F). Pliki, które uniemożliwią / zostaną ponownie zamontowane tylko do odczytu, to te, które są otwarte do zapisu (F).
Zabij procesy uruchamiane z plikami katalogu głównego otwartymi do zapisu , tj
# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done
To jest ponad systemdkomentarzami z zastrzeżeniem. Jeśli systemdtak, initto fuserzobaczymy i istnieją inne względy. Po systemduruchomieniu może (ponownie) rozpocząć procesy za twoimi plecami, nawet jeśli zostały właśnie zidentyfikowane i zabite fuser. systemdjest znacznie bardziej zaawansowany niż tradycyjny sysvinit.
B) AKTUALIZACJA w opisie stwierdza, że system ma tylko ... initi gettynadal działa ...
Widzę komentarz, który mówi, że system nie używa systemd, używa init. Na odcinku systemd jest init . Komentarz nie wyraźnie powiedzieć sysvinit, więc jestem przy założeniu, że dany system może być używany domyślny odcinek systemddla init. Lub że inni ludzie, którzy natkną się na ten post, używający odcinków systemd, uważają tę część za przydatną.
Na Wiki Debiana ,
Proces inicjalizacji systemu jest obsługiwany przez demona init. W wersjach squeeze i wcześniejszych ten demon jest dostarczany przez pakiet sysvinit i nie są obsługiwane żadne alternatywy. W wheezy domyślny demon init jest nadalsysvinit , ale dostępny jest „podgląd technologii” systemd. W jessie i stretch domyślnym systemem init jestsystemd , ale obsługiwane jest przełączanie na sysvinit.
Od czasu jessie tylko systemd jest w pełni obsługiwany; sysvinit jest w większości obsługiwany, ale pakiety Debiana nie są wymagane do dostarczania skryptów startowych sysvinit. runit jest również spakowany, ale nie otrzymał tego samego poziomu testowania i wsparcia jak inne, i nie jest obecnie obsługiwany jako PID 1.
Podczas systemduruchamiania jest kilka dodatkowych kroków, które należy podjąć, aby zwolnić /, aby można go było ponownie zamontować bez problemu.
Prawdopodobnie system.sliceprzechowuje otwarte pliki dla ( systemd-journald.servicelub systemd-udevd.serviceoba mają zależności gniazd). Lub, jeśli NetworkManagerjest uruchomiony, może odrodzić się, dhclientco zapisuje dzierżawę do / var / ... (& / var / nie zawsze jest jego własnym urządzeniem), itp. fuserMoże znaleźć i zabijesz, dhclientale NetworkManageruruchomi się od razu.
Morał polega na tym, że wiele rzeczy jest zautomatyzowanych, które mogłyby „chcieć” / (a nawet bardziej systemd).
Dla pewności, jeśli jest to wykonalne, systemdodpowiednik poziomu uruchomienia 1 jest dopasowany przez rescue.target(i runlevel1.targetjest dowiązaniem symbolicznym rescue.target).
1) Zacznij od izolacji systemu rescue.target
# systemctl isolate rescue.target
Powinien zostać wyświetlony monit o podanie hasła roota; postępuj zgodnie z instrukcjami na ekranie.
2) W muszli ratunkowej dowiedz się, czego chce /.
# systemctl show -p Wants /
Zazwyczaj jest system.slice; zatrzymać wszystko, co chce /. na przykład
# systemctl stop system.slice
3) W tym momencie remont nie powinien się zgłaszać mount: / is busyi mount -o remount,ro / powinien działać. Jeśli nie, sprawdź ponownie za pomocą fuser.
4) FWIW; Widziałem także czasy, kiedy umountzawodzi, gdy / jeśli inne urządzenie jest zamontowane w podkatalogu innego montowania, tj. Zagnieżdżonych montowań. Na przykład umount /nie powiedzie się, jeśli / var / lub / boot / znajduje się na innym urządzeniu (i jest zamontowane). Chociaż mount -o remount,ro /powinno nadal działać w tym przypadku.
lsblk może być pomocny w wizualizacji zagnieżdżonych mocowań.
Dlaczego lsof + L1 nie wyświetla już listy otwartych plików, które zostały rozłączone?
Ponieważ nie są one dostępne (gniazda lub większość FIFO i potoków), nie są już otwartymi plikami (proces nadrzędny zamknął deskryptor pliku) lub (nadal) mają liczbę linków większą niż 1.
man lsof (8) szczegóły ...
+ | -L [l]
Ta opcja włącza („+”) lub wyłącza („-”) listę zliczeń linków do plików, tam gdzie są one dostępne - np. Nie są one dostępne dla gniazd lub większości FIFO i potoków.
Gdy podano + L bez następującego numeru, wszystkie liczby linków zostaną wyświetlone. Gdy podano -L (domyślnie), liczba podanych łączy nie będzie wyświetlana.
Gdy po + L następuje liczba, wyświetlane będą tylko pliki z liczbą łączy mniejszą niż ten numer . (Żaden numer nie może występować po -L.) Specyfikacja postaci „+ L1” wybierze otwarte pliki, które zostały rozłączone. Specyfikacja formularza +aL1 <file_system>wybierze niepowiązane otwarte pliki w określonym systemie plików.
wlubuwFDkolumnielsofwyników lub na przykładFw danych wyjściowychfuser -vm /. Nie mogę ci jednak podać wyczerpującej listy. Możesz także zainstalować pakiet needrestart .