
以前にルートファイルシステムの下にあったデータを専用のマウントポイントに移動するには、システムパーティションを並べ替える必要がありました。ボリュームはすべて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として実行されます。
システムが安定していることを確認してください。
他の人が使用せず、他の重要なことが起こらないことを確認してください。外部接続が途中で中断されないようにするには、httpdやftpdなどのサービスプロバイダを停止することをお勧めします。
systemctl stop httpd systemctl stop nfs-server # and so on....
インストールされていることを確認してください
lsof
(lsof -v
)。そしてfuser
(fuser -V
)もインストールされています(Debian / Ubuntuパッケージ:)psmisc
。未使用のすべてのファイルシステムをアンマウントします。
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...
一時ルートの作成注:/ 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
)などが中断される非常に小さなルートシステムが作成されます。これは、人々が一時的なルートシステムに長く留まらないように奨励するため、意図的なものです。この時点で、必要なソフトウェアがすべてインストールされていることも確認する必要があります。これは、パッケージマネージャが確実に中断される可能性があるためです。すべての手順を実行し、必要な実行可能ファイルがあることを確認します。
根に向かって
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
したがって、実行中のプロセスにソケットを閉じる方法はありません。リモートアクセスが移行後も維持されることを保証
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ドライブのサイズを変更できないことがあります。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
以前のルートを削除
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
この時点で、手順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
答え3
DigitalOcean VPSで行った作業(25G /dev/vda1をrootとしてインストール):
- fdiskを使用して最初の(25G)パーティションを削除する
- 20Gパーティションの作成(最初のセクタは元のセクタと同じである必要があります)
- 新しいパーティション(明らかに5Gサイズ)を作成します。 /dev/vda2 になります。
- パーティションテーブルに書き込み、fdiskを終了します。
- /dev/vda2でext4ファイルシステムを作成する
- 両方のパーティションのUUIDを書き留めます(ls -l /dev/disk/by-uuid)。
- /boot/grub/grub.cfg および /etc/fstab の /dev/vda1 UUID を /dev/vda2 UUID に置き換える
- /dev/vda2を/mntにマウントする
- /から/mntにすべてのエントリ(dev、proc、run、sys、mntを除く)をコピーします。
- 走る
update-grub
reboot
そして祈る
resize2fsがサポートされていないと言われたとき、上記の方法は正しく機能しました。