livecd를 시작하지 않고 루트 파일 시스템을 축소하는 방법

livecd를 시작하지 않고 루트 파일 시스템을 축소하는 방법

이전에 루트 파일 시스템 아래에 있던 데이터를 전용 마운트 지점으로 이동하려면 시스템 파티션을 다시 정렬해야 했습니다. 볼륨은 모두 LVM에 있으므로 상대적으로 쉽습니다. 새 볼륨을 생성하고, 데이터를 그 볼륨으로 이동하고, 루트 파일 시스템을 축소한 다음, 적절한 지점에 새 볼륨을 마운트합니다.

문제는 3단계에서 루트 파일 시스템을 축소하는 것입니다. 관련된 파일 시스템은 ext4이므로 온라인 크기 조정이 지원되지만 설치 후에는 파일 시스템이 커질 수만 있습니다. 파티션을 축소하려면 마운트 해제가 필요하지만 정상적으로 작동하는 루트 파티션에서는 이는 물론 불가능합니다.

웹에 대한 답변은 LiveCD 또는 기타 복구 미디어 부팅, 축소 작업 수행, 설치된 시스템으로 다시 부팅을 중심으로 돌아가는 것 같습니다. 그러나 문제의 시스템은 원격이며 SSH를 통해서만 액세스할 수 있습니다. 재부팅할 수 있지만 복구 디스크를 부팅하고 콘솔에서 작업을 수행할 수 없습니다.

원격 쉘 액세스를 유지하면서 루트 파일 시스템을 마운트 해제하는 방법은 무엇입니까?

답변1

이 문제를 해결할 때 제공되는 정보는 다음과 같습니다.https://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml열쇠입니다. 그러나 이 가이드는 매우 오래된 RHEL 버전에 대한 것이며 다양한 정보가 최신 버전이 아닙니다.

아래 지침은 CentOS 7용으로 설계되었지만 systemd를 실행하는 모든 배포판으로 쉽게 전송할 수 있습니다. 모든 명령은 루트로 실행됩니다.

  1. 시스템이 안정적인 상태인지 확인하세요.

    다른 사람이 사용하지 않고 다른 중요한 일이 발생하지 않는지 확인하세요. 외부 연결이 중간에 중단되지 않도록 하기 위해 httpd 또는 ftpd와 같은 서비스 제공자를 중지하는 것이 좋습니다.

     systemctl stop httpd
     systemctl stop nfs-server
     # and so on....
    

    설치 되어 있는지 확인하세요 lsof( lsof -v). 그리고 fuser( fuser -V)도 설치되어 있습니다(Debian/Ubuntu 패키지: ) psmisc.

  2. 사용하지 않는 모든 파일 시스템을 마운트 해제합니다.

     umount -a
    

    이렇게 하면 루트 볼륨 자체와 다양한 임시/시스템 FS에 대한 많은 "대상 사용 중" 경고가 인쇄됩니다. 지금은 이러한 사항을 무시할 수 있습니다. 중요한 점은 루트 파일 시스템 자체를 제외하고는 디스크의 파일 시스템이 마운트된 상태로 유지되지 않는다는 것입니다. 다음을 확인하세요.

     # 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...
    
  3. 임시 루트 생성 참고: /tmp가 /의 디렉토리인 경우 이 프로세스 중에 /tmp/tmproot를 사용하면 /를 마운트 해제할 수 없습니다. 따라서 /tmproot와 같은 대체 마운트 지점을 사용해야 할 수도 있습니다.

     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/
    

    이로 인해 맨페이지 보기(no /usr/share), 사용자 수준 사용자 정의(no /root또는 /home) 등 이 중단되는 매우 작은 루트 시스템이 생성됩니다. 이는 사람들이 임시 루트 시스템에 너무 오래 머물지 않도록 장려하기 때문에 의도적인 것입니다.

    이 시점에서 필요한 소프트웨어가 모두 설치되어 있는지도 확인해야 합니다. 그렇게 하면 패키지 관리자가 확실히 중단될 수 있기 때문입니다. 모든 단계를 수행하고 필요한 실행 파일이 있는지 확인하십시오.

  4. 뿌리를 향하여

     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와 통신하는 데 사용되는 소켓은 etc. /run이므로 실행 중인 프로세스가 소켓을 닫도록 할 방법이 없습니다.

  5. 원격 액세스가 전환 후에도 유지되도록 보장

     systemctl restart sshd
     systemctl status sshd
    

    sshd를 다시 시작한 후 다른 터미널을 열고 ssh를 통해 머신에 다시 연결하여 들어갈 수 있는지 확인하세요. 그렇지 않은 경우 계속하기 전에 문제를 해결하십시오.

    다시 연결할 수 있는지 확인한 후, 현재 사용 중인 쉘을 종료하고 다시 연결하세요. 이를 통해 남은 포크가 sshd종료되고 새 포크가 유지되지 않도록 합니다 /oldroot.

  6. 여전히 이전 루트를 사용하여 모든 항목을 닫습니다.

     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 드라이브 크기를 조정하지 못할 수 있습니다.

     fsadm: Cannot proceed with mounted filesystem "/oldroot"
    

    시도해 볼 수 systemctl restart systemd-udevd있으며 실패하면 다음 명령을 사용하여 나머지 마운트를 찾을 수 있습니다.grep system /proc/*/mounts | column -t

    다음을 표시하는 프로세스를 찾아 mounts:none다시 시작해 보십시오.

     PATH                      BIN                        FSTYPE
     /proc/16395/mounts:tmpfs  /run/systemd/timesync      tmpfs
     /proc/16395/mounts:none   /var/lib/systemd/timesync  tmpfs
     /proc/18485/mounts:tmpfs  /run/systemd/inhibit       tmpfs
     /proc/18485/mounts:tmpfs  /run/systemd/seats         tmpfs
     /proc/18485/mounts:tmpfs  /run/systemd/sessions      tmpfs
     /proc/18485/mounts:tmpfs  /run/systemd/shutdown      tmpfs
     /proc/18485/mounts:tmpfs  /run/systemd/users         tmpfs
     /proc/18485/mounts:none   /var/lib/systemd/linger    tmpfs
    

    일부 프로세스는 간단하게 처리할 수 없습니다 systemctl restart. 나에게는 여기에는 다음이 포함됩니다 auditd(에 의해 살해되는 것을 좋아하지 않으므로 systemctl그게 전부입니다 kill -15). 이러한 문제는 개별적으로 처리될 수 있습니다.

    종종 마지막 프로세스는 그 systemd자체입니다. 이렇게 하려면 를 실행하십시오 systemctl daemon-reexec.

    완료되면 양식은 다음과 같아야 합니다.

                  USER        PID ACCESS COMMAND
     /oldroot:    root     kernel mount /oldroot
    
  7. 이전 루트 제거

     umount /oldroot
    

    이 시점에서는 원하는 것은 무엇이든 할 수 있습니다. 원래 질문에는 간단한 resize2fs호출이 필요하지만 여기서 원하는 것은 무엇이든 할 수 있습니다. 또 다른 사용 사례는 루트 파일 시스템을 단순 파티션에서 LVM/RAID/기타 파티션으로 전송하는 것입니다.

  8. 루트를 뒤로 회전

     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단계의 직접적인 반전입니다.

  9. 임시 루트 처리

    5단계와 6단계를 반복하되 /tmp/tmproot대신 를 사용하십시오 /oldroot. 그 다음에:

     umount /tmp/tmproot
     rmdir /tmp/tmproot
    

    tmpfs이기 때문에 이 시점에서 임시 루트는 에테르에 용해되어 다시는 볼 수 없습니다.

  10. 물건을 제자리에 다시 놓으세요.

    파일 시스템을 다시 마운트합니다.

    mount -a
    

    이 시점에서 7단계에서 조정한 내용 /etc/fstab도 업데이트해야 합니다.grub.cfg

    실패한 모든 서비스를 다시 시작합니다.

    systemctl | grep failed
    systemctl restart <whatever>
    

    공유 하위 트리를 다시 허용합니다.

    mount --make-rshared /
    

    중지된 서비스 단위 시작 - 다음 단일 명령을 사용할 수 있습니다.

    systemctl isolate default.target
    

이제 끝났습니다.

RHEL4에서 이 진화를 완료한 Andrew Wood와 전자에 대한 링크를 제공한 Steve에게 많은 감사를 드립니다.

답변2

수행 중인 작업이 확실하므로 실험을 하지 않는 경우 비대화형이며 빠른 방법인 initrd에 연결할 수 있습니다.

Debian 기반 시스템에서 이를 수행하는 방법은 다음과 같습니다.

코드를 살펴보세요:https://github.com/szepeviktor/debian-server-tools/blob/master/debian-setup/debian-resizefs.sh

다른 예시:https://github.com/szepeviktor/debian-server-tools/blob/master/debian-setup/debian-convert-ext3-ext4.sh

답변3

DigitalOcean VPS에서 수행한 작업(25G /dev/vda1을 루트로 설치):

  1. fdisk를 사용하여 첫 번째(25G) 파티션 삭제
  2. 20G 파티션 생성(첫 번째 섹터는 원래 섹터와 동일해야 함)
  3. 새 파티션(분명히 5G 크기)을 만듭니다. /dev/vda2가 됩니다.
  4. 파티션 테이블에 쓰고 fdisk를 종료합니다.
  5. /dev/vda2에 ext4 파일 시스템 생성
  6. 두 파티션의 UUID를 기록해 둡니다(ls -l /dev/disk/by-uuid).
  7. /boot/grub/grub.cfg 및 /etc/fstab의 /dev/vda1 UUID를 /dev/vda2 UUID로 교체
  8. /dev/vda2를 /mnt에 마운트
  9. /에서 /mnt로 모든 항목(dev, proc, run, sys, mnt 제외)을 복사합니다.
  10. 달리기update-grub
  11. reboot그리고 기도해

resize2fs가 지원되지 않는다는 말을 들었을 때 위의 방법은 제대로 작동했습니다.

관련 정보