Нижче наведені інструкції створені для роботи з CentOS 7, але вони повинні бути легко передаваними у будь-який дистрибутив, який працює з системою. Усі команди виконуються як root.
Переконайтесь, що система знаходиться в стабільному стані
Переконайтесь, що ніхто більше не використовує його, і нічого іншого важливого не відбувається. Це, мабуть, гарна ідея зупинити надання службових підрозділів, таких як httpd або ftpd, просто для того, щоб зовнішні з'єднання не порушили речі посередині.
systemctl stop httpd
systemctl stop nfs-server
# and so on....
Демонтуйте всі невикористані файлові системи
umount -a
Це надрукує ряд попереджень "Ціль зайнята" для самого кореневого тома та для різних тимчасових / системних ФС. Це на даний момент можна ігнорувати. Важливо те, що жодна дискова файлова система не залишається встановленою, крім кореневої файлової системи. Перевірте це:
# mount alone provides the info, but column makes it possible to read
mount | column -t
Якщо ви бачите, що будь-які дискові файлові системи все ще змонтовані, то все ще працює щось, чого не повинно бути. Перевірте, що він використовує fuser
:
# if necessary:
yum install psmisc
# then:
fuser -vm <mountpoint>
systemctl stop <whatever>
umount -a
# repeat as required...
Зробіть тимчасовий корінь
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/
Це створює дуже мінімальну кореневу систему, яка порушує (серед іншого) перегляд сторінки сторінки (ні /usr/share
), налаштування на рівні користувача (немає /root
або /home
) тощо. Це навмисно, оскільки це заохочує не залишатися в такій кореневій системі, яка є присяжними, довше, ніж потрібно.
На цьому етапі ви також повинні переконатися, що все необхідне програмне забезпечення встановлено, оскільки воно також безперечно зламає менеджер пакунків. Перегляньте всі кроки та переконайтеся, що у вас є необхідні виконувані файли.
Поворот у корінь
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 викликає кріплення, щоб дозволити спільне використання підрівнів за замовчуванням (як і у випадку mount --make-shared
), і це призводить pivot_root
до збою. Отже, ми все це відключаємо mount --make-rprivate /
. Системні та тимчасові файлові системи переміщуються оптом у новий корінь. Це необхідно, щоб він взагалі працював; розетки для спілкування з systemd, серед іншого, живуть /run
, і тому немає можливості змусити запущені процеси закрити його.
Переконайтесь, що віддалений доступ пережив перехід
systemctl restart sshd
systemctl status sshd
Після перезапуску sshd переконайтеся, що ви можете ввійти, відкривши інший термінал і знову підключившись до машини через ssh. Якщо ви не можете, вирішіть проблему, перш ніж рухатись далі.
Після того, як ви перевірили, що зможете знову підключитися, вийдіть із оболонки, яку ви зараз використовуєте, та підключіться знову. Це дозволяє sshd
вийти з останнього роздвоєного виходу і гарантує, що новий не тримає /oldroot
.
Закрийте все, використовуючи старий корінь
fuser -vm /oldroot
Це дозволить надрукувати список процесів, які все ще містяться в старому кореневому каталозі. У моїй системі це виглядало приблизно так:
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
Вам потрібно розібратися з кожним із цих процесів, перш ніж ви зможете їх відключити /oldroot
. Підхід грубої сили - просто kill $PID
для кожного, але це може зламати речі. Щоб зробити це м'якше:
systemctl | grep running
Це створює список запущених служб. Ви повинні мати можливість співвіднести це з переліком процесів, що проводяться /oldroot
, а потім опублікувати systemctl restart
для кожного з них. Деякі служби відмовляться з'являтись у тимчасовому корені та переходять у невдалий стан; на даний момент це насправді не має значення.
Якщо кореневий диск, для якого потрібно змінити розмір, є LVM-накопичувачем, можливо, вам також знадобиться перезапустити деякі інші запущені служби, навіть якщо вони не відображаються у списку, створеному користувачем fuser -vm /oldroot
. Якщо ви виявите, що не можете змінити розмір накопичувача LVM відповідно до кроку 7, спробуйте systemctl restart systemd-udevd
.
Деякі процеси не вдається вирішити за допомогою простих systemctl restart
. Для мене вони включали auditd
(які не люблять, щоб їх вбивали systemctl
, і так просто хотілося kill -15
). З ними можна вирішуватись індивідуально.
Останній процес, який ви зазвичай знайдете, - це systemd
сам. Для цього біжіть systemctl daemon-reexec
.
Коли ви закінчите, таблиця повинна виглядати так:
USER PID ACCESS COMMAND
/oldroot: root kernel mount /oldroot
Демонтуйте старий корінь
umount /oldroot
У цей момент ви можете проводити всі необхідні маніпуляції. Первісне запитання потребувало простого resize2fs
виклику, але ви можете робити все, що завгодно; ще один випадок використання - це перенесення кореневої файлової системи з простого розділу в LVM / RAID / будь-що інше.
Поверніть корінь назад
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
Це прямий зворотний крок 4.
Утилізуйте тимчасовий корінь
Повторіть кроки 5 та 6, за винятком використання /tmp/tmproot
замість /oldroot
. Тоді:
umount /tmp/tmproot
rmdir /tmp/tmproot
Оскільки це tmpfs, тимчасовий корінь розчиняється в ефір, і його більше не побачити.
Поставте речі на свої місця
Знову змонтуйте файлові системи:
mount -a
На цьому етапі слід також оновити /etc/fstab
та grub.cfg
відповідно до будь-яких коригувань, які ви внесли під час кроку 7.
Перезапустіть всі несправні служби:
systemctl | grep failed
systemctl restart <whatever>
Дозволити знову спільні підкреслення:
mount --make-rshared /
Запустіть блоки зупиненого обслуговування - ви можете використовувати цю єдину команду:
systemctl isolate default.target
І ви закінчили.
Велика подяка Ендрю Вуду, який розробив цю еволюцію на RHEL4, і Стіву, який надав мені посилання на колишню.