amazon linux2023 でhomeディレクトリ配下をユーザーディレクトリ毎に容量制限をかける方法

# 概要

amazon linux2023上に作成されたユーザー毎の利用できる容量に制限を設けたい
そこで、今後迷わないよう手順を整理して記事にまとめます

# 環境

- AWS
  - EC2インスタンス
    - AmazonLinux2023
    - ストレージ
      - EBS(1台): gp3
        - 手順の中でもう一台増設します

# 方針

1. homeディレクトリ用のEBSを追加する
1. homeディレクトリ用のパーティションを切る
1. homeディレクトリを利用するユーザーに対して quotaをかける

# 手順

## homeディレクトリ用のEBSを追加する

### EBSを作成

- EBSボリュームをAWSコンソール上から作成
- 作成が完了したEBSを選択し、アクション -> ボリュームのアタッチを選択
  - デバイス名の選択
    - データボリュームとして利用するため、推奨とされるデバイス名 /dev/sdf ~ /dev/sdp の間で選択する
    - ここでのデバイス名とlinux上で認識されるデバイス名は異なる可能性があります
    - 参考
        - https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/device_naming.html
  - 対象インスタンスを選択
- ボリュームをアタッチ

## homeディレクトリ用のパーティションを切る

### 新しく追加したEBSを認識させる

- 参考にした記事
    - AWS公式記事: [Amazon EBS ボリュームを使用できるようにする](https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-using-volumes.html)

- 手順を実施するSFTPサーバーへsshする
- ルートユーザーになる

```
sudo su -
```

- 追加されたディスク名を確認する

```
lsblk
```

下記の例ではxvdfが追加されたディスク

```
NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
xvda      202:0    0  100G  0 disk 
├─xvda1   202:1    0  100G  0 part /
├─xvda127 259:0    0    1M  0 part 
└─xvda128 259:1    0   10M  0 part /boot/efi
xvdf      202:80   0  100G  0 disk 
```

- ファイルシステムが何も利用されていないことを確認する
    - data だけが表示されている場合は、デバイスにはファイルシステムが存在していない
    - xvdfの箇所はlinux上で認識されているディスク名に合わせて置き換え

```
file -s /dev/xvdf
```

出力例

```
/dev/xvdf: data
```

- ボリューム上にファイルシステムを作成
  - xvdfの箇所はlinux上で認識されているディスク名に合わせて置き換え

```
mkfs -t xfs /dev/xvdf
```

- ファイルシステムが作成されたことを確認
  - xvdfの箇所はlinux上で認識されているディスク名に合わせて置き換え

```
file -s /dev/xvdf
```

出力例

```
/dev/xvdf: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
```

## `/home`のデータを退避する

- 新しいディスクへ/homeを割り当てるため、一時的に/homeの中身を退避するディレクトリを作成
```
mkdir /mnt/newhome
```

- /homeディレクトリの内容を新しい退避ディレクトリへコピー元ファイルと同一条件でコピー
```
rsync -aX /home/ /mnt/newhome/
```

<details>
<summary>rsyncのオプションについての補足</summary>

- -a（コピー元のファイルと同一条件でコピーする）
    - 以下オプションすべて指定した時と同じ動き
        - -r：再帰的にディレクトリをコピーする
         - -l：シンボリックリンクをシンボリックリンクとしてコピーする
         - -p：パーミッションを保持する
         - -t：タイムスタンプを保持する
         - -g：グループを保持する
         - -o：所有者を保持する
         - -D：デバイスファイルと特殊ファイルを保持する
- -X
    - 拡張属性を保持する
</details>

## 新しく追加したEBSへ（`/home`）を割り当てる

- 新しいディスクを/homeにマウント
  - xvdfの箇所はlinux上で認識されているディスク名に合わせて置き換え

```
mount /dev/xvdf /home
```

- 元の/homeディレクトリの内容を新たにmountされた/homeへコピー

```
rsync -aX /mnt/newhome/ /home/
```

- ファイルサイズや権限についてdiffチェックを行い、コピー元とコピー先に差分が生じていないことを確認する

```
diff <(ll /home) <(ll /mnt/newhome)
```

- 一時的に作成した/homeディレクトリのコピーを削除

```
rm -rf /mnt/newhome
```

## 追加したEBSボリュームのmountを永続化する

- 参考にした記事
  - [Amazon EBS ボリュームを使用できるようにする](https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-using-volumes.html) 内の `再起動後に接続ボリュームを自動的にマウントする`

- mount設定を書き換える前に、mount設定を記載するfstabのコピーを取得する

```
cp /etc/fstab /etc/fstab.orig
```

- 追加されたディスクのUUIDを確認する

```
blkid
```

- /etc/fstabの末尾に以下の行を追加し、mount設定を永続化する
  - UUIDは適宜置き換えてください

```
UUID=xxxxxxx-0000-11aa-bbcc-0123456789  /home  xfs  defaults,nofail,usrquota  0  2
```

## homeディレクトリを利用するユーザーに対して quotaをかける

### quotaを有効にする

- stabe記載のquota設定を反映させるため、`/home` を再マウントする

```
umount /home
mount /home
```

もし設定に誤りがある場合は、以下のようにエラーが表示される

```
mount: /home: wrong fs type, bad option, bad superblock on /dev/xvdf, missing codepage or helper program, or other error.
```

- quota設定が有効になっていることを確認する
  - 以下コマンド実行で、 `User quota on /home` が表示されること

```
xfs_quota -x -c 'report -h' /home
```

### ユーザーに対して、/homeディレクトリの使用量を制限する
- ここでは仮に以下のようにする
  - ユーザー名: hoge
  - 容量上限: 5GB

- setquotaを利用して5GBに使用量を制限する
    - 5GB * 1024(MB/GB) * 1024(KB/MB) = 5242880KB

```
setquota -u hoge 5242880 5242880 0 0 /home
```

<details>

<summary>setquotaの補足</summary>

```
setquota -u {ユーザー名} {容量ソフトリミット} {容量ハードリミット} {inode数ソフトリミット} {inode数ハードリミット} {quota対象ディレクトリ}
```

- 容量ソフトリミット
    - リミットを超えるとlinux上で警告が出る
    - KB単位で指定
    - 0で制限なし
- 容量ハードリミット
    - リミットを超えたファイルを格納することができない
    - KB単位で指定
    - 0で制限なし
- inode数ソフトリミット
    - リミットを超えるとlinux上で警告が出る
    - 0で制限なし
- inode数ハードリミット
    - リミットを超えたファイルを格納することができない
    - 0で制限なし

</details>

- quota設定が反映されていることを確認する

```
repquota /home
```

```
*** Report for user quotas on device /dev/xvdb
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --       0       0       0              8     0     0       
ec2-user  --      48       0       0             13     0     0       
hoge      --       0 5242880 5242880              1     0     0
```