no space left on deviceとなった時の対応方法


# 事象 : コンテナをビルドしていたら怒られてコンテナ作成に失敗した
```bash
$ docker-compose up -d --no-recreate --build
...省略...
  vulkan-filesystem.noarch 0:1.1.97.0-1.el7
  xdg-utils.noarch 0:1.1.0-0.17.20120809git.el7

Complete!
ERROR: Service 'ponsuke-java11' failed to build: Error processing tar file(exit status 1): write /opt/google/chrome/chrome: no space left on device
```

# 原因 : ホストのディスク容量が不足しているから

```bash
# ディスク容量の使用率が99%になっていた
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs         32G     0   32G   0% /dev
tmpfs            32G     0   32G   0% /dev/shm
tmpfs            32G   17M   32G   1% /run
tmpfs            32G     0   32G   0% /sys/fs/cgroup
/dev/xvda1      8.0G  7.9G  130M  99% /
tmpfs           6.3G     0  6.3G   0% /run/user/1000

# 残りのinodeを使用率は32%でまだ大丈夫だった
$ df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
devtmpfs       8217754    365 8217389    1% /dev
tmpfs          8223738      1 8223737    1% /dev/shm
tmpfs          8223738    547 8223191    1% /run
tmpfs          8223738     16 8223722    1% /sys/fs/cgroup
/dev/xvda1      387040 120071  266969   32% /
tmpfs          8223738      1 8223737    1% /run/user/1000
```

### 削減できる場所を探ってみる
`du`コマンドでディレクトリのディスク使用量を見ると`/var/lib/docker`がほとんどだった。
というわけで、削減できそうなところはない。

参考 : [CentOS ディスク容量不足の原因調査＆MySQLのバイナリログ自動削除設定](https://qiita.com/myzkyy/items/53e985cf028e3c3edfe5)

```bash
# 全体から見るとvarディレクトリ配下がたくさん使っている
$ sudo du -sh /*
[sudo] password for ponsuke:
...省略...
5.3G    /var

# varディレクトリ配下ではlibディレクトリ配下がたくさん使っている
$ sudo du -sh /var/*
...省略...
5.1G    /var/lib
...省略...

# libディレクトリ配下ではdockerディレクトリ配下がたくさん使っている
$ sudo du -sh /var/lib/*
...省略...
5.0G    /var/lib/docker
...省略...
```

### ディスク容量が小さすぎる
そもそもディスク容量8Gが小さすぎる。

- 参考
    - [【 lsblk 】コマンド――ブロックデバイスを一覧表示する：Linux基本コマンドTips（180） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1802/02/news021.html)
    - [【 fdisk 】コマンド――パーティションを作成、削除する：Linux基本コマンドTips（187） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1803/01/news034.html)

```bash
# パーティション1つ、全体でも8G・・・
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /

# やっぱり、8G・・・は小さい
$ sudo fdisk -l
[sudo] password for ponsuke:

Disk /dev/xvda: 8589 MB, 8589934592 bytes, 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b723c

    Device Boot      Start         End      Blocks   Id  System
/dev/xvda1   *        2048    16777215     8387584   83  Linux
```

## 対応方法 : EBSボリュームを増やす
1回ボリュームサイズやタイプを変更すると6時間以内は変更できなくなるので注意が必要。
> If you reach the maximum volume modification rate per volume limit, you will need to wait at least six hours before applying further modifications to the affected EBS volume.
> [ModifyVolume - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyVolume.html)


1. AWSのコンソール > [EC2] > [インスタンス] > 対象のインスタンスを選択して詳細を画面下部に表示する
1. [説明]タブ > [ルートデバイス]リンクからポップアップを表示する > [EBS ID]リンクからボリューム画面を表示する
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/27cad922-7e1d-3da6-7282-7c158a579edb.png)
1. [アクション] > [ボリュームの変更] > [サイズ]に適当なディスク容量を入力 > [変更]
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/58b5bb54-a721-328b-427f-fe06d8946528.png)
1. デバイスのパーティションテーブルを一覧表示してディスク容量が増えたことを確認する
1. ブロックデバイスの一覧を表示してディスク容量が増えたことを確認する
1. 使っているパーティションのディスク容量がまだ増えていないことを確認する
1. ファイルシステムを拡大する
    - 参考 : [ボリュームサイズ変更後の Linux ファイルシステムの拡張 - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)
1. 使っているパーティションのディスク容量が増えたことを確認する
1. 作成に失敗したコンテナある場合は、削除する
1. 使っていないボリュームやイメージを削除する
1. コンテナをビルドして作り直す

### CentOS7の場合
- 環境 : CentOS Linux release 7.8.2003 (Core)
- 参考
    - [3.4. XFS ファイルシステムのサイズの拡大 Red Hat Enterprise Linux 7 | Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/xfsgrow)
    - [RHEL7とかCentOS7以降でresize2fsコマンドを使うとエラーになるので注意](https://qiita.com/ponsuke0531/items/04153c6228516e48a55e)

```bash:8Gから16Gに変更した場合
# 4. デバイスのパーティションテーブルを一覧表示してディスク容量が増えたことを確認する
$ sudo fdisk -l
Disk /dev/xvda: 17.2 GB, 17179869184 bytes, 33554432 sectors
...省略...

# 5. ブロックデバイスの一覧を表示してディスク容量が増えたことを確認する
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  16G  0 disk
└─xvda1 202:1    0   8G  0 part /

# 6. 使っているパーティションのディスク容量がまだ増えていないことを確認する
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
...省略...
/dev/xvda1      8.0G  7.9G  130M  99% /
tmpfs           6.3G     0  6.3G   0% /run/user/1000

# 7. マウント中のXFSファイルシステムを拡大する
$ sudo xfs_growfs /dev/xvda1
meta-data=/dev/xvda1             isize=512    agcount=4, agsize=524224 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2096896, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096896 to 4194043


# 8. 使っているパーティションのディスク容量が増えたことを確認する
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
...省略...
/dev/xvda1       16G  7.9G  8.2G  50% /
tmpfs           6.3G     0  6.3G   0% /run/user/1000

# 9. 作成に失敗したコンテナある場合は、
$ docker ps -a -s
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES               SIZE
af37a1234567        d6c70722db8a        "/bin/sh -c 'yum -y …"   4 hours ago         Exited (0) 3 hours ago                       zen_blackburn       370MB (virtual 5.15GB)

# 9. 削除する
$ docker rm af37a1234567
af37a1234567

# 10. 使っていないボリュームやイメージを削除する
$ docker system prune -a -f --volumes
Deleted Networks:
...省略...
Total reclaimed space: 4.783GB

# きれいになった
$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              0                   0                   0B                  0B
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

# 11. コンテナをビルドして作り直す
$ docker-compose up -d --no-recreate --build
...省略...
Creating ponsuke-java11 ... done
```

### Ubuntuの場合
- 環境 : Ubuntu 20.04 LTS
- 参考 : [EC2 EBS ボリュームサイズ拡張のやりかた - Qiita](https://qiita.com/mangano-ito/items/629b10ea5d1ab80f2cc6)

```bash:8Gから80Gに変更した場合
# 4. デバイスのパーティションテーブルを一覧表示してディスク容量が増えたことを確認する
$ sudo fdisk -l
...省略...
Disk /dev/xvda: 80 GiB, 85899345920 bytes, 167772160 sectors
...省略...

# 5. ブロックデバイスの一覧を表示してディスク容量が増えたことを確認する
$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...省略...
xvda    202:0    0   80G  0 disk 
└─xvda1 202:1    0    8G  0 part /

# 6. 使っているパーティションのディスク容量がまだ増えていないことを確認する
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.7G  7.4G  326M  96% /
...省略...

# 7. パーティションを拡張する
$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=2048 old: size=16775135 end=16777183 new: size=167770079 end=167772127

# 7. ファイルシステムを拡大する
$ sudo resize2fs /dev/xvda1
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 10
The filesystem on /dev/xvda1 is now 20971259 (4k) blocks long.

# 8. 使っているパーティションのディスク容量が増えたことを確認する
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        78G  7.1G   71G  10% /
...省略...

$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
...省略...
xvda    202:0    0   80G  0 disk 
└─xvda1 202:1    0   80G  0 part /

# 9. 作成に失敗したコンテナある場合は、
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS                               NAMES
3113ef1ce9f0        0d13f4f2d34a        "/bin/sh -c 'yum -y …"   14 minutes ago      Exited (1) 13 minutes ago                                          jolly_lovelace

# 9. 削除する
$ docker rm 3113ef1ce9f0
3113ef1ce9f0

# 10. 使っていないボリュームやイメージを削除する
$ docker system prune -a -f --volumes
Deleted Networks:
...省略...
Total reclaimed space: 3.943GB

# きれいになった
$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              1                   1                   540.6MB             0B (0%)
Containers          1                   1                   1.13kB              0B (0%)
Local Volumes       1                   1                   193.7MB             0B (0%)
Build Cache         0                   0                   0B                  0B

# 11. コンテナをビルドして作り直す
$ docker-compose up -d --no-recreate --build
```