livecdを起動せずにルートファイルシステムを縮小する方法

livecdを起動せずにルートファイルシステムを縮小する方法

以前にルートファイルシステムの下にあったデータを専用のマウントポイントに移動するには、システムパーティションを並べ替える必要がありました。ボリュームはすべてLVMにあるため、比較的簡単です。新しいボリュームを作成し、データをそのボリュームに移動し、ルートファイルシステムを縮小し、適切なポイントに新しいボリュームをマウントします。

問題は、手順3でルートファイルシステムを縮小することです。関連するファイルシステムはext4なので、オンラインサイズ変更はサポートされていますが、インストール後にファイルシステムが大きくなる可能性があります。パーティションを縮小するにはマウント解除が必要ですが、正常に機能するルートパーティションではこれは不可能です。

Webへの回答は、LiveCDやその他のリカバリメディアの起動、縮小操作の実行、インストールされたシステムへの再起動を中心に戻っているようです。ただし、問題のシステムはリモートであり、SSHを介してのみアクセスできます。再起動できますが、リカバリディスクを起動してコンソールから操作を実行することはできません。

リモートシェルアクセスを維持しながらルートファイルシステムをアンマウントする方法は?

ベストアンサー1

この問題を解決するときに提供される情報は次のとおりです。https://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml鍵です。ただし、このガイドは非常に古いRHELバージョンに関するものであり、さまざまな情報が最新バージョンではありません。

以下の手順はCentOS 7用に設計されていますが、systemdを実行しているすべてのディストリビューションに簡単に転送できます。すべてのコマンドはrootとして実行されます。

  1. システムが安定していることを確認してください。

    他の人が使用せず、他の重要なことが起こらないことを確認してください。外部接続が途中で中断されないようにするには、httpdやftpdなどのサービスプロバイダを停止することをお勧めします。

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

    インストールされていることを確認してくださいlsoflsof -v)。そしてfuserfuser -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-sharedpivot_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に感謝します。

おすすめ記事