GCEで運用しているサーバーでエラーが出てるというので確認したら、ディスク容量不足が起きているらしい。
GCEはデフォルトのディスク容量が10GBなので、気をつけてないとこういうことが起こってしまいます。
いつものようにsshで接続しようとしたら、まったく接続できないのです!
「GCE ssh接続できない」とかでぐぐるといろいろヒットするけど、今回はこちらが該当しているようです。
ブラウザからの SSH | Compute Engine ドキュメント | Google Cloud
https://cloud.google.com/compute/docs/ssh-in-browser?hl=ja
インスタンスのブートディスクの空き容量が不足している。接続が確立されると、ゲスト環境により、現在のセッションに使用されている公開 SSH 認証鍵で ~/.ssh/authorized_keys ファイルが更新されます。ディスクの空き容量が不足していると、更新に失敗します。
で、解決する方法として、
インスタンスのブート永続ディスクをサイズ変更して、そのサイズを増やします。インスタンスで使用されるオペレーティング システム イメージで自動サイズ変更がサポートされている場合、インスタンスの再起動後にオペレーティング システムが新しいサイズに合わせてルート パーティションのサイズを自動的に変更するので、これが最も簡単なオプションとなります。
という方法があげられています。さっそくブートディスクのサイズを増やしてみたのですが、「イメージで自動サイズ変更がサポートされている場合」に該当してないらしく、再起動しても改善されません。
少しだけ余計なログファイルなどを削除すれば動くような状況なんでしょうけど、ssh接続ができないからそれすらできないという困った状況です。
そこで試した方法。
GCEの別インスタンスを用意して、容量不足のディスクを接続して、不要なファイルを削除して、元のインスタンスにディスクを戻す、という方法です。
まずは、容量不足になっているブートディスクを別インスタンスからアクセスできるようにするために、インスタンスから解放する必要があります。
- 容量不足になっているVMインスタンスを停止します。
- 容量不足になっている「MVインスタンスの詳細」を表示します。
- 「編集」をクリックします。
- 右側の✗をクリックしてブートディスクを削除します(ここで削除してもなくなるわけではないので大丈夫)。
- 「保存」をクリックして編集を終了します。
これで、容量不足のブートディスクが開放されました。
次に新しいVMインスタンスを作成します。作成するインスタンスは最小構成で問題ないです。ディスクを接続して不要なファイルを削除するだけなので。ただし、ディスクを接続するために、リージョンとゾーンは合わせておきます。
新しいVMインスタンスを作成したら、容量不足のブートディスクをそこに接続します。
- 新しいVMインスタンスの詳細画面に進み、「編集」をクリックします。
- Boot Diskの下にある追加ディスクの「既存のディスクを接続」をクリックします。
- ドロップダウンで表示されている中から容量不足のブートディスクを選択て完了をクリックします。
- 「保存」をクリックしてVMインスタンスの編集を終えます。
新しいVMインスタンスにssh接続して容量不足のブートディスクから不要なファイルを削除します。
接続したばかりの状態ではマウントされていないので、まずはマウントします。
lsblkで見ると、一番下に接続したブートディスクがあります。
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 55.4M 1 loop /snap/core18/1944
loop1 7:1 0 55.5M 1 loop /snap/core18/1988
loop2 7:2 0 152.4M 1 loop /snap/google-cloud-sdk/169
loop3 7:3 0 152.9M 1 loop /snap/google-cloud-sdk/170
loop4 7:4 0 69.8M 1 loop /snap/lxd/19032
loop5 7:5 0 69.9M 1 loop /snap/lxd/19188
loop6 7:6 0 31.1M 1 loop /snap/snapd/10707
loop7 7:7 0 31.1M 1 loop /snap/snapd/11036
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 9.9G 0 part /
├─sda14 8:14 0 4M 0 part
└─sda15 8:15 0 106M 0 part /boot/efi
sdb 8:16 0 100G 0 disk
├─sdb1 8:17 0 9.9G 0 part
├─sdb14 8:30 0 4M 0 part
└─sdb15 8:31 0 106M 0 part
マウント先のディレクトリを用意してからマウントします。
これで中身が見えるようになったので、不要なファイルを削除します。
$ sudo mkdir /mnt/hd1
$ sudo mount /dev/sdb1 /mnt/hd1
$ ls -l /mnt/hd1/
total 96
drwxr-xr-x 2 root root 4096 Jul 21 2020 bin
drwxr-xr-x 4 root root 4096 Jul 21 2020 boot
drwxr-xr-x 4 root root 4096 Jul 21 2020 dev
drwxr-xr-x 83 root root 4096 Feb 26 15:55 etc
drwxr-xr-x 4 root root 4096 Feb 26 15:55 home
lrwxrwxrwx 1 root root 30 Jul 21 2020 initrd.img -> boot/initrd.img-5.3.0-1030-gcp
lrwxrwxrwx 1 root root 30 Jul 21 2020 initrd.img.old -> boot/initrd.img-5.3.0-1030-gcp
drwxr-xr-x 18 root root 4096 Jul 21 2020 lib
drwxr-xr-x 2 root root 4096 Jul 21 2020 lib64
drwx------ 2 root root 16384 Jul 21 2020 lost+found
drwxr-xr-x 2 root root 4096 Jul 21 2020 media
drwxr-xr-x 2 root root 4096 Jul 21 2020 mnt
drwxr-xr-x 2 root root 4096 Jul 21 2020 opt
drwxr-xr-x 2 root root 4096 Apr 24 2018 proc
drwx------ 3 root root 4096 Feb 26 15:55 root
drwxr-xr-x 3 root root 4096 Jul 21 2020 run
drwxr-xr-x 2 root root 4096 Jul 21 2020 sbin
drwxr-xr-x 6 root root 4096 Feb 26 15:55 snap
drwxr-xr-x 2 root root 4096 Jul 21 2020 srv
drwxr-xr-x 2 root root 4096 Apr 24 2018 sys
drwxrwxrwt 9 root root 4096 Feb 26 15:56 tmp
drwxr-xr-x 10 root root 4096 Jul 21 2020 usr
drwxr-xr-x 13 root root 4096 Jul 21 2020 var
lrwxrwxrwx 1 root root 27 Jul 21 2020 vmlinuz -> boot/vmlinuz-5.3.0-1030-gcp
lrwxrwxrwx 1 root root 27 Jul 21 2020 vmlinuz.old -> boot/vmlinuz-5.3.0-1030-gcp
削除が終わったらアンマウントします。
元のVMインスタンスの詳細から編集に進み、ブートディスクとして設定してから再起動します。
これでssh接続が復活すると思います。
仮に作成したVMインスタンスは、動かしたままだと課金されてしまうので、停止しておきましょう。
結果的に何をやったかというと、パソコンが容量不足で再起動しなくなったという状況での話。
元のパソコンからブートディスクを取り外して、普通に起動できる別のパソコンにそのディスクを接続して、別のパソコンを起動してから不要なファイルを削除して、元のパソコンに接続し直して再起動したってだけの話なんですけどね。
クラウドだと、物理的な作業をまったくやらなくても設定画面でちゃちゃっとやれば、物理的な話としてこういうことが簡単にできるのは本当に楽ですよね。