はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。
今回は、LaravelでS3を扱うためにleague/flysystem-aws-s3-v3
パッケージのインストールを実行すると、No space left on device
エラーが発生し解決に時間がかかったので解決策を備忘録としてまとめておきたいと思います。
ちなみに、LaravelアプリケーションはEC2インスタンス配下でgit cloneした状態です。
間違いなどがございましたら、ご指摘のほどよろしくお願い致します。
エラー内容 : composer requireでパッケージをインストールに失敗
Laravel6.xでAmazon S3を利用するために、$ composer require league/flysystem-aws-s3-v3:^1.0
を実行すると下記のようなエラーが発生しました。
$ composer require league/flysystem-aws-s3-v3:^1.0
# 略
Downloading (100%) Failed to download aws/aws-sdk-php from dist:
The "https://codeload.github.com/aws/aws-sdk-php/legacy.zip/ed############e7" file could not be written to /home/###/###/laravel/vendor/aws/aws-sdk-php/4#####36:
write of 8192 bytes failed with errno=28 No space left on device
Only 188416 of 3292576 bytes written, possibly out of free disk space
Now trying to download from source
- Installing aws/aws-sdk-php (3.212.5): Cloning ed69594b38
エラー文ではNo space left on device
と表示されており、ホストのディスク容量が不足していると言われています。
※league/flysystem-aws-s3-v3のバージョン指定は、リンク先を参考にしてください。
今回はこのエラーに対する解決策を実行順にまとめていきます。
No space left on device
の解決策
1.Elastic Block Store(EBS)ボリュームサイズを増やす
1-1.ディスクの容量を確認
まず初めに、エラーの原因であるディスク容量を確認するために$ df -hT
コマンドを実行します。
[ec2-user ~]$ df -hT
ファイルシス タイプ サイズ 使用 残り 使用% マウント位置
devtmpfs devtmpfs 970M 0 970M 0% /dev
tmpfs tmpfs 978M 0 978M 0% /dev/shm
tmpfs tmpfs 978M 25M 953M 3% /run
tmpfs tmpfs 978M 0 978M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 8G 0 8G 100% /
tmpfs tmpfs 196M 0 196M 0% /run/user/1000
実行結果を見ると、ファイルシステム/dev/nvme0n1p1
の箇所が使用率100%となっており、容量が不足した状態となっています。
従って、この状態のままパッケージをインストールしても容量不足でエラーが発生してしまうのです。
これを解決するために、利用しているAWSインスタンスのElastic Block Store(EBS)ボリュームサイズを増やします。
1-2.利用しているAWSインスタンスのEBSボリュームサイズを増やす
下記の画面に移動後、アクションをクリックしてボリュームの変更
を選択します。
ボリュームの変更
を選択後、特定のサイズを指定して変更を実行してください。
2.EBSボリュームサイズを変更後、Linuxファイルシステムの拡張を行う
EBSボリュームのサイズを変更後、ファイルシステム固有のコマンドを使用して、ファイルシステムのサイズを拡張します。(ボリュームの状態が optimizing時のみ)
Linuxでファイルシステムを拡張するプロセスは以下のとおりです。
1.EBS ボリュームには、ファイルシステムとデータを含むパーティションが存在する場合があります。ボリュームのサイズを拡張しても、パーティションのサイズは拡張されません。サイズ変更されたボリュームのファイルシステムを拡張する前に、新しいサイズのボリュームに拡張する必要があるパーティションがそのボリュームにあるかどうかを確認します。
2.ファイルシステム固有のコマンドを使用して、各ファイルシステムのサイズを新しいボリューム容量に変更します。
引用:
AWS docs ボリュームサイズ変更後の Linux ファイルシステムの拡張
※ファイルシステムを拡張する際は、NVMe EBS ボリューム
かEBS ボリューム
どちらかのファイルシステムを拡張します。
各自、該当するボリュームのファイルシステムを拡張して下さい。
今回は、NVMe EBS ボリューム
のファイルシステムを拡張する手順を下記でまとめておきます。
・Linuxファイルシステムの拡張手順
1.AWSインスタンスにssh接続する
2.拡張前のボリュームのファイルシステムを確認するために、$ df -hT
コマンドを実行する
[ec2-user ~]$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/nvme0n1p1 xfs 8.0G 8.0G 0G 100% /
...
今回は、使用率100%であるFilesystem[/dev/nvme0n1p1
]のサイズを拡張します。
3.$ lsblk
コマンドでインスタンスにアタッチされているNVMeブロックデバイスに関する情報を表示する
ボリュームに拡張が必要なパーティションがあるかどうかを確認するには、lsblk
コマンドを使用して、インスタンスにアタッチされている NVMe ブロックデバイスに関する情報を表示します。
[ec2-user ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
ルートボリュームである/dev/nvme0n1
には、パーティション/dev/nvme0n1p1
があります。ルートボリュームのサイズに新しいサイズ(20 GB) が反映されている場合、パーティション(nvme0n1p1)のサイズは元のサイズ (8 GB)のままであるため、ファイルシステムを拡張する前にパーティション(nvme0n1p1)を拡張する必要があります。
4.growpart
コマンドを使用してパーティションを拡張する
先ほどlsblk
コマンドで確認したパーティション(nvme0n1p1)を、下記コマンドを実行してサイズ変更後のEBSボリュームサイズまで拡張させます。
[ec2-user ~]$ sudo growpart /dev/nvme0n1 1
growpart
コマンドを実行後、lsblk
コマンドで増加分のボリュームサイズがパーティションに反映されていることを確認します。
[ec2-user ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 20G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
5.パーティションを拡張後、ファイルシステムを拡張する
各ボリュームでファイルシステムを拡張するには、下記のように利用しているのファイルシステムに適したコマンドを使用します。
今回は、XFSファイルシステム
の拡張を実行しています。
ファイルシステムの種類を確認する際は、リンク先等をご確認ください。
XFS file system (XFS ファイルシステム)
を拡張するには、xfs_growfs
コマンドを使用します。
下記コマンドの/
と/data
は、$ df -hT
の出力で示されているボリュームのマウント位置です。
[ec2-user ~]$ sudo xfs_growfs -d /
[ec2-user ~]$ sudo xfs_growfs -d /data
このコマンドを実行することで、ファイルシステムを拡張することができます。
6.最後にサイズ変更後のボリュームサイズが各ファイルシステムに反映されていることを確認します
[ec2-user@ip-172-16-10-10 ~]$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 970M 0 970M 0% /dev
tmpfs 978M 0 978M 0% /dev/shm
tmpfs 978M 25M 953M 3% /run
tmpfs 978M 0 978M 0% /sys/fs/cgroup
/dev/nvme0n1p1 20G 0 0 0% /
tmpfs 196M 0 196M 0% /run/user/1000
上記のように、/dev/nvme0n1p1
のサイズがAWSインスタンスのEBSボリュームサイズと同じになっていればファイルシステムの拡張は成功です。
まとめ
上記の手順を踏むことで、エラーを解決できると思います。
今回、Linuxのファイルシステム等を拡張する作業は初めて行ったので、もしかしたら間違っている可能性もあるのでご注意下さい。