ディスククォータの設定方法

最新版は以下に記載しています。
https://hana-shin.hatenablog.com/entry/2023/03/17/203829

#1 ディスククォータとは?
ファイルシステムに対してクォータ(利用制限)をかける機能です。
誤って、ファイルシステムを大量に使用してしまう等のトラブルを避けることができます。

たとえば、`/var/spool/mail`および`/home`で、それぞれクォータをかけたい場合、
`/var/spool/mail`に1ファイルシステム、`/home`に1ファイルシステムを作成します。
そして、それぞれのファイルシステムに対して、クォータを設定します。

クォータは、ユーザに対するものと、グループに対するものがあります。
ここでは、ユーザに対するクォータを設定してみます。


#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンのOS版数は以下のとりです。

```console:OS版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

[root@server ~]# uname -r
3.10.0-957.el7.x86_64
```


#3 コマンドのインストール

```console:インストール方法
[root@server ~]# yum -y install quota
```

```console:パッケージの版数確認
[root@server ~]# rpm -qa|grep quota
quota-4.01-19.el7.x86_64
```

#4 コマンド概要
ディスククォータの設定、参照等を行うコマンド概要を以下に示します。

|コマンド | 概要 |
|:--------|:-------------------------|
|quota    | 現在設定しているクォータの設定内容、および使用状況を表示する  |
|quotaon  | クォータを開始する  |
|quotaoff | クォータを停止する   |
|edquota  | クォータを設定する。viが起動します。viの画面で設定します    |
|setquota | クォータを設定する。こちらは、コマンドラインで設定可能です  |
|repquota | クォータの状況を確認する  |

#5 事前準備
テスト用に使うファイルシステムを作成します。

##5.1 ファイルシステムの作成 
ループバックデバイスに使うファイルを作成します。
ここでは、100Mのファイルを作成してみます。
なお、ddコマンドの使い方は、[ここ(ddコマンドの使い方)](https://qiita.com/hana_shin/items/042799a03f8d0b871ef7)を参照してください。

```console:ファイルの作成
[root@server ~]# dd if=/dev/zero of=disk.imag bs=1024K count=100
```


```console:ファイルの確認
[root@server ~]# ls -l disk.imag
-rw-r--r--. 1 root root 104857600  2月 11 10:44 disk.imag
```

作成したファイルをループバックデバイスとして登録します。

```console:ループバックデバイスの登録
[root@server ~]# losetup -f /root/disk.imag
[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk.imag
```

ループバックデバイスにext4ファイルシステムを作成します。

```console:ファイルシステムの作成
[root@server ~]# mkfs.ext4 /dev/loop0
```

作成したファイルシステムを確認します。
ext4ファイルシステムが作成できたことがわかります。

```console:作成したファイルシステムの確認
[root@server ~]# lsblk -fip /dev/loop0
NAME       FSTYPE LABEL UUID                                 MOUNTPOINT
/dev/loop0 ext4         f8aeef1b-a3b1-4481-bb13-ea0c65d436fd
```

##5.2 /etc/fstabの編集
`/etc/fstab`に設定するディスククォータのオプションは、以下のものがあります。
・ユーザに対してクォータを設定する場合：`usrquota`
・グループに対してクォータを設定する場合：`grpquota`

ここでは、ユーザに対してクォータを設定するので、`usrquota`を使います。

```console:エントリの追加
[root@server ~]# cat /etc/fstab
-snip-
/dev/loop0  /mnt  ext4  defaults,usrquota  0  0
```

##5.3 マウント
作成したループバックデバイスをマウントします。

```console:マウント
[root@server ~]# mount -a
```

ファイルシステムを確認します。
ループバックデバイスがマウントできたことがわかります。

```console:ファイルシステムの確認
[root@server ~]# df -hT -t ext4
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/loop0     ext4      93M  1.6M   85M    2% /mnt
```

##5.4 ユーザの作成
テスト用のユーザ(`user1`,`user2`)を作成します。

```console:ユーザ登録
[root@server ~]# useradd user1
[root@server ~]# useradd user2
```

##5.5 パミッション変更
`user1`,`user2`が`/mnt`にファイルを作成できるように、パミッションを変更します。

```console:パミッションの変更
[root@server mnt]# chmod 777 /mnt
[root@server mnt]# ls -ld /mnt
drwxrwxrwx. 3 root root 1024  2月 11 10:47 /mnt
```


#6 クォータファイルの作成

```cosole:クォータファイルの確認
[root@server ~]# cd /mnt
[root@server mnt]# ls
lost+found
```

quotacheckコマンドを実行して、クォータファイルを作成します。
クォータファイルはファイルシステムのトップディレクトリに作成します。

```console:クォータファイルの作成
[root@server mnt]# quotacheck -u /mnt
```

クォータファイル(`aquota.user`)が作成されたことがわかります。

```console:クォータファイルの確認
[root@server mnt]# ls
aquota.user  lost+found
```

#7 クォータの開始
`quotaon`コマンドを使って、ユーザに対するクォータを開始します。

```console:クォータの開始
[root@server mnt]# quotaon -v /mnt
/dev/loop0 [/mnt]: user quotas turned on
```

#8 クォータの設定、確認
`edquota`コマンドを使って、`user1`にクォータを設定します。

```console:クォータの編集
[root@server mnt]# edquota user1
```

`edquota`コマンドを実行すると、viが起動します。
ここでは、softに5M、hardに10Mを設定しました。soft/hardの意味は、次のとおりです。
・soft：この値を超えると警告が表示される。
・hard：この値を超えて書き込みができない。

```console:クォータの編集
Disk quotas for user user1 (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/loop0                        0         5120     10240          0        0        0
```

`user1`のクォータを確認します。

```console:クォータの確認
[root@server mnt]# quota -u user1 -v
Disk quotas for user user1 (uid 1000):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/loop0       0    5120   10240               0       0       0
```

#9 実験

##9.1 user1の場合
`root`から`user1`に切り替えます。

```console:ユーザの切り替え
[root@server mnt]# su - user1
```

`user1`で、`/mnt`にファイル(6M)を作成してみます。
`soft`リミットを超えるので、以下のように警告が表示されます。

```console:ファイルの作成
[user1@server mnt]$ fallocate -l 6M test6M.dat
loop0: warning, user block quota exceeded.
```

作成したファイルを確認します。
6Mのファイルが作成できたことがわかります。

```console:ファイルの確認
[user1@server mnt]$ ls -l test6M.dat
-rw-rw-r--. 1 user1 user1 6291456  2月 11 11:01 test6M.dat
```

`user1`のクォータを確認します。

```console:クォータの確認
[user1@server mnt]$ quota -u user1 -v
Disk quotas for user user1 (uid 1000):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/loop0    6145*   5120   10240   6days       1       0       0
```

次に、5Mのファイルを作成すると、以下のエラーメッセージが表示されました。

```console:ファイルの作成
[user1@server mnt]$ fallocate -l 5M test5M.dat
loop0: write failed, user block limit reached.
fallocate: fallocate failed: ディスク使用量制限を超過しました
```


作成したファイルを確認します。
私は、test5M.datの全てが書き込みできないと思っていましたが、
ファイルの一部はクォータいっぱいまで、書き込めるようです。

```console:ファイルの確認
[user1@server mnt]$ ls -l
合計 10260
-rw-------. 1 root  root     7168  2月 11 10:47 aquota.user
drwx------. 2 root  root    12288  2月 11 10:45 lost+found
-rw-rw-r--. 1 user1 user1 4192256  2月 11 11:12 test5M.dat
-rw-rw-r--. 1 user1 user1 6291456  2月 11 11:01 test6M.dat
```

`user1`のクォータを確認します。

```console:クォータの確認
[user1@server mnt]$ quota -u user1 -v
Disk quotas for user user1 (uid 1000):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
     /dev/loop0   10240*   5120   10240   6days       2       0       0
```


##9.2 user2の場合
`root`から`user2`に切り替えます。
`user2`はクォータの設定をしていません。

```console:ユーザの切り替え
[root@server mnt]# su - user2
```

12Mのファイルを作成します。
`user2`は、クォータを設定していないため、ファイルを作成することができます。

```console:ファイルの作成
[user2@server mnt]$ fallocate -l 12M test12M.dat
```


```console:ファイルの確認
[user2@server mnt]$ ls -l
合計 22549
-rw-------. 1 root  root      7168  2月 11 10:47 aquota.user
drwx------. 2 root  root     12288  2月 11 10:45 lost+found
-rw-rw-r--. 1 user2 user2 12582912  2月 11 11:32 test12M.dat
-rw-rw-r--. 1 user1 user1  4192256  2月 11 11:12 test5M.dat
-rw-rw-r--. 1 user1 user1  6291456  2月 11 11:01 test6M.dat
```

#10 そのほか
`repquota`コマンドを使って、クォータの状況を表示してみます。

```
[root@server ~]# repquota -u /mnt
*** Report for user quotas on device /dev/loop0
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      --      13       0       0              2     0     0
user1     +-   10240    5120   10240  6days       2     0     0
user2     --   12289       0       0              1     0     0
```


#Z 参考情報
[Linux教科書 LPICレベル1 スピードマスター問題集 Version4.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version4-0%E5%AF%BE%E5%BF%9C-%E6%9C%89%E9%99%90%E4%BC%9A%E7%A4%BE%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3/dp/4798141895/ref=pd_aw_sbs_14_2/357-2917497-9465929?_encoding=UTF8&pd_rd_i=4798141895&pd_rd_r=4b8a6b18-29fb-41f6-adc0-80d5a215c4ed&pd_rd_w=c4ewy&pd_rd_wg=Ix0Gz&pf_rd_p=6eca51f6-63e4-4d55-90a6-1670629c588f&pf_rd_r=XR5TGREFTB5CFHW1Q4KM&psc=1&refRID=XR5TGREFTB5CFHW1Q4KM)
[第４章　ユーザー・グループ管理](https://users.miraclelinux.com/technet/document/linux/training/1_4_3.html)