Jak wymusić sprawdzenie systemu plików w systemd
Spis treści
Jakiś czas temu opisywałem jak w systemach linux'owych przeprowadzić sprawdzenie systemu plików pod
kątem ewentualnych błędów. Był tam
poświęcony kawałek na temat ręcznego wymuszenia takiego skanowania. Ten sposób, który został opisany
w tamtym wpisie działa wyśmienicie w przypadku sysvinit. Natomiast przy systemd mogą pojawić się
pewne problemy, w efekcie czego nie będziemy w stanie wymusić skanowania pewnych partycji.
Generalnie to rozchodzi się o tę główną, na której znajduje się system plików /
. Postanowiłem się
przyjrzeć nieco temu mechanizmowi i sprawdzić czy faktycznie nic nie da się zrobić i czy musimy
czekać pełną ilość cykli startu systemu, by ten system plików został przez niego przeskanowany
automatycznie.
Kiedy kernel stara się wymusić sprawdzanie systemu plików
Kernel linux'a jest w stanie oszacować integralność danych w określonym systemie plików na podstawie
informacji zawartych w superbloku. Te informacje możemy uzyskać przy pomocy tune2fs -l
, bądź też
i dumpe2fs
. Nas tutaj interesują generalnie dwa parametry. Jeden z nich odpowiada za limit cykli
montowań systemu plików, a drugi zaś zwraca informację na temat tego ile razy już ten system plików
został zamontowany, poniżej przykład:
# tune2fs -l /dev/sda2 | grep -i "mount count"
Mount count: 3
Maximum mount count: 30
Gdy te dwie wartości zrównają się, kernel zainicjuje sprawdzanie systemu plików. Co jednak w
przypadku, gdy chcielibyśmy przyśpieszyć nieco ten proces? Nie pomoże nam utworzenie pliku
forcefsck
w katalogu /
, ani też zresetowanie maszyny przy pomocy shutdown -rF now
. Możemy
jednak skorzystać z kilku rozwiązań, które są w stanie wymusić skanowanie systemu plików praktycznie
niezależnie od posiadanego init'u.
Obniżenie wartości parametru "Maximum mount count"
Jednym z tych bardziej niezalecanych rozwiązań jest obniżenie wartości parametru Maximum mount count
, którą widzieliśmy wyżej w informacjach zawartych w superbloku. Im ta wartość będzie
mniejsza, tym częściej system plików będzie skanowany. W przypadku obniżenia jej do 1
, kernel
będzie skanował system plików przy każdym uruchomieniu systemu. By obniżyć tę wartość, posłużymy
się narzędziem tune2fs
, gdzie w opcji -c
określamy maksymalną ilość montowań, przykładowo:
# tune2fs -c 5 /dev/sda2
Oczywiście to nie jest dokładnie to o co nam chodzi, czyli o wymuszenie sprawdzania systemu plików ale tak czy inaczej, ten parametr dobrze jest sobie dostosować w zależności od częstości ponownego uruchamiania komputera.
Zwiększenie wartości parametru "Mount count"
Jeśli chodzi zaś o parametr Mount count
, to przy jego pomocy jesteśmy w stanie oszukać kernel.
Wystarczy ustawić tutaj większą wartość niż jest określona w Maximum mount count
. Wtedy podczas
startu systemu, ten zobaczy, że licznik wybił już określoną ilość cykli i wymusi skanowanie systemu
plików. Do przestawienia wartości tego parametru również wykorzystamy tune2fs
, z tym, że tym
razem skorzystamy z przełącznika -C
, przykładowo:
# tune2fs -C 40 /dev/sda2
Po resetowaniu maszyny, ten współczynnik zostanie wyzerowany.
Oznaczenie systemu plików jako "dirty"
Generalnie rzecz biorąc, system plików jest skanowany w trzech przypadkach. Gdy licznik dobije do
wartości granicznej (opisane powyżej), gdy użytkownik wymusi skanowanie (to odpada przy systemd),
oraz gdy system plików zostanie niepoprawnie odmontowany. W tym ostatnim przypadku jest mu ustawiana
flaga dirty
. Gdy kernel będzie próbował zamontować taki system plików, to automatycznie powinien
go przeskanować. Jakby nie patrzeć, w taki sposób oznaczony system plików prawie na pewno zawiera
błędy. Jak zatem oznaczyć dany system plików jako dirty
i wymusić jego skanowanie?
W przypadku systemu plików ext4
możemy posłużyć się narzędziem debugfs
. Logujemy się zatem na
użytkownika root i wpisujemy w terminalu te poniższe polecenia:
# debugfs
debugfs 1.42.13 (17-May-2015)
debugfs: open -w /dev/sda2
debugfs: set_super_value 2
debugfs: close
Przy pomocy set_super_value
zmieniliśmy stan ( state
) systemu plików. Do wyboru mamy trzy
wartości: 0
(not clean), 1
(clean) oraz 2
(not clean with errors). Po zmianie wartości,
możemy sprawdzić czy została ona poprawnie ustawiona przy pomocy tego poniższego polecenia:
# tune2fs -l /dev/sda2 | grep state
Filesystem state: not clean with errors
Pamiętajmy by zmiany stanu systemu plików dokonywać jedynie gdy ten nie jest zamontowany. Jeśli
chcemy w ten sposób wymusić sprawdzanie systemu plików podczas fazy boot, to wystarczy przestawić
stan na 0
lub 2
. Poniżej zaś jest log, w którym możemy zaobserwować, że system wymusił
sprawdzenie w obu tych przypadkach:
systemd-fsck[1308]: kabi was not cleanly unmounted, check forced.
systemd-fsck[1320]: grafi contains a file system with errors, check forced.
Parametry kernela fsck.mode oraz fsck.repair
Przeglądając jeszcze manual dotyczący
systemd-fsck@.service
natrafiłem na dwa ciekawe parametry: fsck.mode
oraz fsck.repair
. Z opisu wychodzi na to, że
przy pomocy fsck.mode
jesteśmy w stanie manipulować zachowaniem mechanizmu sprawdzania systemu
plików i możemy wymusić ( force
), pominąć ( skip
) lub zostawić domyślne ustawienia ( auto
).
Z kolei przy pomocy parametru fsck.repair
możemy określić czy i jakie błędy kernel ma naprawiać.
Mamy tutaj do wyboru preen
(naprawia łatwe błędy), yes
(naprawia wszystkie błędy) oraz no
(nie
naprawia błędów w ogóle). Oba te parametry dodajemy oczywiście w konfiguracji bootloader'a.
Problem z tymi parametrami jest taki, że nie da rady za ich pomocą wymusić sprawdzenia głównego
systemu plików ( /
) , bo ten zwraca coś w stylu:
# systemctl status systemd-fsck-root.service
...
Condition: start condition failed at Fri 2015-12-04 19:33:20 CET; 13min ago
ConditionPathExists=!/run/initramfs/fsck-root was not met
...
Zdaje się, że nie tylko ja mam taki problem.