아래 지침은 CentOS 7에서 작동하도록 제작되었지만 systemd를 실행하는 배포판으로 쉽게 전환 할 수 있어야합니다. 모든 명령은 루트로 실행됩니다.
시스템이 안정적인 상태인지 확인하십시오
다른 사람이 사용하지 않고 다른 중요한 일이 일어나지 않도록하십시오. httpd 또는 ftpd와 같은 서비스 제공 장치를 중지하고 외부 연결이 중간에 문제를 일으키지 않도록하는 것이 좋습니다.
systemctl stop httpd
systemctl stop nfs-server
# and so on....
사용하지 않는 모든 파일 시스템 마운트 해제
umount -a
루트 볼륨 자체와 다양한 임시 / 시스템 FS에 대해 여러 개의 'Target is busy'경고가 표시됩니다. 현재로서는 무시할 수 있습니다. 중요한 것은 루트 파일 시스템 자체를 제외하고는 온 디스크 파일 시스템이 마운트 된 상태로 남아 있지 않다는 것입니다. 이것을 확인하십시오 :
# 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
. 7 단계에서 LVM 드라이브의 크기를 조정할 수없는 경우을 시도하십시오 systemctl restart systemd-udevd
.
일부 프로세스는 simple을 통해 처리 할 수 없습니다 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 단계의 간단한 반전입니다.
임시 뿌리 폐기
/tmp/tmproot
대신 사용하지 않고 5 단계와 6 단계를 반복하십시오 /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에서이 진화를 수행 한 Andrew Wood와 저에게 이전과의 링크를 제공 한 Steve에게 감사드립니다.