Używam Debian Stretch. Moja partycja root jest zamontowana read-only
. Tylko wtedy, gdy instaluję lub aktualizuję pakiety, jest /
ponownie instalowany read-write
(za pomocą apt hook), a następnie ponownie instalowany ro
.
Czasami po uaktualnieniu pakietu nie mogę ponownie podłączyć /
się do wersji tylko do odczytu
mount -o remount,ro /
mount: / is busy
W starszych wersjach Debiana (Wheezy) mogłem wyświetlić listę otwartych plików, które zostały odłączone za pomocą lsof
:
lsof +L1
lub dokładniej, pliki, które uniemożliwiają /
ponowne podłączenie z powrotem do ro:
{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'
Jednak w Debian Stretch lsof +L1
nie wyświetla żadnych plików.
Nie widzę żadnych zmian +|-L
w man lsof
które mogłyby wyjaśnić, dlaczego przestał działać.
Dlaczego lsof + L1 nie wyświetla już listy otwartych plików, które zostały rozłączone?
Jak mogę wyświetlić listę plików, które uniemożliwiają / nie są ponownie montowane w trybie tylko do odczytu?
AKTUALIZACJA
Mam zatrzymał wszystkie procesy, które mogą być zatrzymane, a tylko init
i getty
nadal działa, ale nadal nie mogę Remount /
do ro
.
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 .root
?fuser -m /
mówi, co używa root?Odpowiedzi:
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źć wpsmisc
paczce; jest to przypadek użycia, w którym uważam, żefuser
ś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ślisystemd
tak,init
tofuser
zobaczymy i istnieją inne względy. Posystemd
uruchomieniu może (ponownie) rozpocząć procesy za twoimi plecami, nawet jeśli zostały właśnie zidentyfikowane i zabitefuser
.systemd
jest znacznie bardziej zaawansowany niż tradycyjnysysvinit
.B) AKTUALIZACJA w opisie stwierdza, że system ma tylko ...
init
igetty
nadal działa ...Widzę komentarz, który mówi, że system nie używa
systemd
, używainit
. Na odcinkusystemd
jestinit
. Komentarz nie wyraźnie powiedziećsysvinit
, więc jestem przy założeniu, że dany system może być używany domyślny odcineksystemd
dlainit
. Lub że inni ludzie, którzy natkną się na ten post, używający odcinkówsystemd
, uważają tę część za przydatną.Na Wiki Debiana ,
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
lubsystemd-udevd.service
oba mają zależności gniazd). Lub, jeśliNetworkManager
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
aleNetworkManager
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 przezrescue.target
(irunlevel1.target
jest dowiązaniem symbolicznymrescue.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
imount -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ładumount /
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 ...
źródło
Czy masz
/proc
zamontowane?Jako osoba, która przez
/
większość czasu dba o to, aby montować tylko do odczytu, mogę sobie wyobrazić, że możesz zdecydować się nie montować procfs. Ale procfs jest potrzebnylsof
do znalezienia otwartych plików.Pliki utrzymywane przez procesy są ujawniane przez jądro poprzez dowiązania symboliczne w procfs. Katalogi
/proc/<pid>/fd
zawierają dowiązanie symboliczne dla każdego otwartego pliku. Nazwa dowiązań symbolicznych to numery deskryptorów plików, a ścieżka wskazywana przez dowiązanie symboliczne to ścieżka do pliku.Wciąż pozostają wiszące dowiązania symboliczne
/proc
dla otwartych plików, które zostały już usunięte. Nazwa ścieżki, do której następuje odwołanie, zostaje zmieniona na „(usunięte)”.Co w
lsof +L1
zasadzie nie różni się od szybkiego jednego linijki, takiego jak:Możesz więc użyć podobnej jednowierszowej, aby wyświetlić listę wszystkich otwartych plików, co może uniemożliwić ponowne zamontowanie głównego systemu plików (pod warunkiem, że działa
/proc
).Jednak jeśli już to zrobiłeś / zrobiłeś
/proc
, jedynymi innymi przyczynami, o których myślę, są błędy ... W każdym razie, FYI, na moim obecnym systemie Debian Stretch.lsof +L1
działa zgodnie z oczekiwaniami.źródło
/proc
zamontowałem. Nie rozumiem twojego rozumowania, dlaczego mógłbym tego nie mieć. W każdym raziestat -c%N /proc/[0-9]*/fd/* | grep deleted
nic mi nie pokazuje.Mogę odtworzyć ten problem tylko raz, i rozwiązać go tylko przy użyciu
mount
z -n opcja.Cytując wierzchowca :
Sam
mount
program otwierający pliki do zapisu w systemie plików root brzmiał dla mnie jak wiarygodne wytłumaczenie. W końcumount
pisze,/etc/mtab
a/etc
często jest częścią głównego systemu plików. Nie mogłem jednak odtworzyć go ponownie na tym samym komputerze po tym, jak to zrobiłem raz ...Czy to może rozwiązać Twój problem?
źródło
-n
z mountem nie robi różnicy.Bez wglądu w Twój system bardzo trudno jest dokładnie powiedzieć, na czym polega problem. Komentarze i poprzednie odpowiedzi to dobry początek.
Powiedziałbym, że wrócę całą drogę przez wiki debian, która opisuje wymagania wstępne do montowania / tylko do odczytu.
Link do dokumentacji znajduje się tutaj: https://wiki.debian.org/ReadonlyRoot
Ten duży poprowadzę cię tutaj:
1 - istnieją określone lokalizacje w obszarze /, które należy przeczytać. Na podstawie dokumentacji wygląda to tak:
Twoje urządzenia blokowe prawdopodobnie będą się różnić, w zależności od konfiguracji stosu pamięci (partycje, bezdzielny lvm itp.), ale główną ideą jest to, że potrzebujesz tych 4 punktów montowania, aby ich później zamontowany system plików miał opcję montowania RW.
2 - w / etc znajduje się wiele specjalnych plików, które musisz utworzyć symboliczne łącze lub wdrożyć jakąś inną zmianę (szczegółowo opisaną w linkowanym artykule). Mogą one, ale nie muszą mieć zastosowania, w zależności od aplikacji, na których działa Twój serwer Linux. niektóre pliki mogą nawet nie istnieć na twoim komputerze, ale załączyłem wszystko do dokumentacji. Pamiętaj, zdecydowanie zalecam wprowadzanie tych zmian NAWET JEŚLI zabiłeś pid procesu. Oto ścieżki bezpośrednio z wiki debian:
Po sprawdzeniu wszystkich powyższych i potwierdzeniu, że są zgodne ze specyfikacją na wiki, następną rzeczą do sprawdzenia jest /etc/apt/apt.conf
na podstawie Twojego błędu ostatnia rzecz, którą możesz sprawdzić na podstawie dokumentacji, pochodzi z poniższego:
„Po aktualizacji pakietów może pojawić się problem polegający na tym, że mount odmawia ponownego zamontowania systemu plików, mówiąc tylko„ / jest zajęty ”. Jest to spowodowane usuniętymi plikami, które są nadal używane przez proces. Aby dowiedzieć się, które procesy wykorzystują usunięte pliki, użyj narzędzia checkrestart (1) z pakietu debian-goodies lub użyj następującego polecenia. Często są to demony korzystające z ulepszonych bibliotek. trzeba je ponownie uruchomić, aby pliki zostały zwolnione. ”
polecenie dostarczone w dokumencie:
Nie znając dokładnej konfiguracji systemu plików, podziału na partycje i konfiguracji urządzenia pamięci masowej, trudno dać ci wiele innych do naśladowania. Zacznę od powrotu i ponownego sprawdzenia twoich wymagań wstępnych w dokumentacji (i opisanych powyżej).
źródło