Jak mogę wyświetlić listę plików, które uniemożliwiają / nie są ponownie montowane w trybie tylko do odczytu?
A) fuser
można znaleźć w psmisc
paczce; 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 systemd
komentarzami z zastrzeżeniem. Jeśli systemd
tak, init
to fuser
zobaczymy i istnieją inne względy. Po systemd
uruchomieniu może (ponownie) rozpocząć procesy za twoimi plecami, nawet jeśli zostały właśnie zidentyfikowane i zabite fuser
. systemd
jest znacznie bardziej zaawansowany niż tradycyjny sysvinit
.
B) AKTUALIZACJA w opisie stwierdza, że system ma tylko ... init
i getty
nadal 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 systemd
dla 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 systemd
uruchamiania jest kilka dodatkowych kroków, które należy podjąć, aby zwolnić /, aby można go było ponownie zamontować bez problemu.
Prawdopodobnie system.slice
przechowuje otwarte pliki dla ( systemd-journald.service
lub systemd-udevd.service
oba mają zależności gniazd). Lub, jeśli NetworkManager
jest uruchomiony, może odrodzić się, dhclient
co zapisuje dzierżawę do / var / ... (& / var / nie zawsze jest jego własnym urządzeniem), itp. fuser
Może znaleźć i zabijesz, dhclient
ale NetworkManager
uruchomi 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, systemd
odpowiednik poziomu uruchomienia 1 jest dopasowany przez rescue.target
(i runlevel1.target
jest 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 busy
i mount -o remount,ro /
powinien działać. Jeśli nie, sprawdź ponownie za pomocą fuser
.
4) FWIW; Widziałem także czasy, kiedy umount
zawodzi, 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.
w
lubu
wFD
kolumnielsof
wyników lub na przykładF
w danych wyjściowychfuser -vm /
. Nie mogę ci jednak podać wyczerpującej listy. Możesz także zainstalować pakiet needrestart .