Poniższe instrukcje zostały opracowane do pracy z CentOS 7, ale powinny być wystarczająco łatwe do przeniesienia do dowolnej dystrybucji działającej systemd. Wszystkie polecenia są uruchamiane jako root.
Upewnij się, że system jest stabilny
Upewnij się, że nikt inny go nie używa i nic innego się nie dzieje. Prawdopodobnie dobrym pomysłem jest zatrzymanie jednostek świadczących usługi, takich jak httpd lub ftpd, aby upewnić się, że połączenia zewnętrzne nie zakłócają działania w środku.
systemctl stop httpd
systemctl stop nfs-server
# and so on....
Odmontuj wszystkie nieużywane systemy plików
umount -a
Spowoduje to wydrukowanie wielu ostrzeżeń „Docelowy jest zajęty”, dla samego woluminu głównego i dla różnych tymczasowych / systemowych FS. Można je na razie zignorować. Co ważne, żaden system plików na dysku nie pozostaje podłączony, z wyjątkiem samego systemu plików root. Sprawdź to:
# mount alone provides the info, but column makes it possible to read
mount | column -t
Jeśli zauważysz, że jakieś systemy plików na dysku są nadal podłączone, oznacza to, że nadal działa coś, co nie powinno być. Sprawdź, czego używa fuser
:
# if necessary:
yum install psmisc
# then:
fuser -vm <mountpoint>
systemctl stop <whatever>
umount -a
# repeat as required...
Zrób tymczasowy root
mkdir /tmp/tmproot
mount -t tmpfs none /tmp/tmproot
mkdir /tmp/tmproot/{proc,sys,dev,run,usr,var,tmp,oldroot}
cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/
cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/
cp -ax /var/{account,empty,lib,local,lock,nis,opt,preserve,run,spool,tmp,yp} /tmp/tmproot/var/
Tworzy to bardzo minimalny system root, który psuje (między innymi) przeglądanie strony podręcznika (nie /usr/share
), dostosowywanie na poziomie użytkownika (nie /root
lub /home
) i tak dalej. Jest to celowe, ponieważ stanowi zachętę do nie pozostawania w tak sfałszowanym systemie korzeniowym dłużej niż to konieczne.
W tym momencie powinieneś również upewnić się, że całe niezbędne oprogramowanie jest zainstalowane, ponieważ z pewnością spowoduje to również uszkodzenie menedżera pakietów. Przejrzyj wszystkie kroki i upewnij się, że masz niezbędne pliki wykonywalne.
Przenieś się do katalogu głównego
mount --make-rprivate / # necessary for pivot_root to work
pivot_root /tmp/tmproot /tmp/tmproot/oldroot
for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
systemd powoduje, że montowania domyślnie zezwalają na współużytkowanie poddrzewa (tak jak w przypadku mount --make-shared
), co powoduje pivot_root
niepowodzenie. Dlatego wyłączamy to globalnie za pomocą mount --make-rprivate /
. Systemowe i tymczasowe systemy plików są hurtowo przenoszone do nowego katalogu głównego. Jest to konieczne, aby w ogóle działało; gniazda do komunikacji z systemd, między innymi, są w /run
nim obecne, więc nie ma sposobu, aby działające procesy je zamknęły .
Upewnij się, że dostęp zdalny przetrwał zmianę
systemctl restart sshd
systemctl status sshd
Po zrestartowaniu sshd upewnij się, że możesz się dostać, otwierając inny terminal i ponownie łącząc się z maszyną przez ssh. Jeśli nie możesz, napraw problem przed przejściem dalej.
Po sprawdzeniu, że możesz się ponownie połączyć, zamknij aktualnie używaną powłokę i połącz się ponownie. Pozwala sshd
to wyjść z pozostałych wideł i upewnić się, że nowy nie trzyma /oldroot
.
Zamknij wszystko, wciąż używając starego katalogu głównego
fuser -vm /oldroot
Spowoduje to wydrukowanie listy procesów wciąż trzymających się w starym katalogu głównym. W moim systemie wyglądało to tak:
USER PID ACCESS COMMAND
/oldroot: root kernel mount /oldroot
root 1 ...e. systemd
root 549 ...e. systemd-journal
root 563 ...e. lvmetad
root 581 f..e. systemd-udevd
root 700 F..e. auditd
root 723 ...e. NetworkManager
root 727 ...e. irqbalance
root 730 F..e. tuned
root 736 ...e. smartd
root 737 F..e. rsyslogd
root 741 ...e. abrtd
chrony 742 ...e. chronyd
root 743 ...e. abrt-watch-log
libstoragemgmt 745 ...e. lsmd
root 746 ...e. systemd-logind
dbus 747 ...e. dbus-daemon
root 753 ..ce. atd
root 754 ...e. crond
root 770 ...e. agetty
polkitd 782 ...e. polkitd
root 1682 F.ce. master
postfix 1714 ..ce. qmgr
postfix 12658 ..ce. pickup
Przed odmontowaniem musisz poradzić sobie z każdym z tych procesów /oldroot
. Podejście brutalnej siły jest po prostu kill $PID
dla każdego, ale może to popsuć. Aby zrobić to bardziej miękko:
systemctl | grep running
Spowoduje to utworzenie listy uruchomionych usług. Powinieneś być w stanie skorelować to z listą utrzymywanych procesów /oldroot
, a następnie wydawać systemctl restart
dla każdego z nich. Niektóre usługi odmawiają pojawienia się w tymczasowym katalogu głównym i przechodzą w stan awarii; nie ma to obecnie znaczenia.
Jeśli dysk główny, którego rozmiar chcesz zmienić, jest dyskiem LVM, może być również konieczne ponowne uruchomienie niektórych innych uruchomionych usług, nawet jeśli nie są wyświetlane na liście utworzonej przez fuser -vm /oldroot
. Jeśli okaże się, że nie można zmienić rozmiaru dysku LVM w kroku 7, spróbuj systemctl restart systemd-udevd
.
Niektórych procesów nie da się rozwiązać za pomocą prostych systemctl restart
. Dla mnie to wliczone auditd
(które nie lubią być zabijane systemctl
, a więc po prostu chciałem kill -15
). Można sobie z tym poradzić indywidualnie.
Ostatnim procesem, który zwykle znajdziesz, jest systemd
sam. W tym celu uruchom systemctl daemon-reexec
.
Po zakończeniu tabela powinna wyglądać następująco:
USER PID ACCESS COMMAND
/oldroot: root kernel mount /oldroot
Odmontuj stary root
umount /oldroot
W tym momencie możesz wykonywać dowolne manipulacje, których potrzebujesz. Pierwotne pytanie wymagało prostego resize2fs
wywołania, ale możesz tutaj zrobić, co chcesz; Innym przypadkiem użycia jest przeniesienie głównego systemu plików z prostej partycji na LVM / RAID / cokolwiek.
Odwróć korzeń z powrotem
mount <blockdev> /oldroot
mount --make-rprivate / # again
pivot_root /oldroot /oldroot/tmp/tmproot
for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done
Jest to proste odwrócenie kroku 4.
Usuń tymczasowy root
Powtórz kroki 5 i 6, z wyjątkiem użycia /tmp/tmproot
zamiast /oldroot
. Następnie:
umount /tmp/tmproot
rmdir /tmp/tmproot
Ponieważ jest to tmpfs, w tym momencie tymczasowy korzeń rozpuszcza się w eterze, którego już nigdy nie można zobaczyć.
Odłóż rzeczy na swoje miejsce
Ponownie podłącz systemy plików:
mount -a
W tym momencie powinieneś również zaktualizować /etc/fstab
i grub.cfg
zgodnie z wszelkimi korektami dokonanymi podczas kroku 7.
Uruchom ponownie wszystkie nieudane usługi:
systemctl | grep failed
systemctl restart <whatever>
Zezwól ponownie na wspólne poddrzewa:
mount --make-rshared /
Uruchom zatrzymane jednostki usługowe - możesz użyć tego pojedynczego polecenia:
systemctl isolate default.target
I jesteś skończony.
Wielkie podziękowania dla Andrew Wooda, który opracował tę ewolucję na RHEL4, i Steve'a, który dostarczył mi link do tego pierwszego.