xfsでchattr


ファイルシステムのファイル属性を変更するコマンドであるchattrをxfsで試してみる。

## XFSとは

Linuxのファイルシステムの一つ。
redhat6/centos6ではext4が推奨ファイルシステムだったが
redhat7/centos7ではxfsが標準のファイルシステムとして採用されている。

参考
[Red Hat Enterprise Linux 7　インストールガイド]
(https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-disk-partitioning-setup-x86)

> XFS はスケーラビリティーに優れた高いパフォーマンス性を有するファイルシステムです。（中略）強く推奨されるファイルシステムであり、デフォルトではこのファイルシステムが選択されます。

## chattrとは

Linuxファイルシステム（ext2/ext3/ext4)のファイル属性を変更するコマンド。
パーミッション設定とは別に、圧縮属性や変更不可（削除不可）の属性を付与できる。
マニュアルではext2についてだけ記載されているがext3やext4でも利用できるらしい。

[chattrマニュアル]
(https://linuxjm.osdn.jp/html/e2fsprogs/man1/chattr.1.html)
> Linux 第 2 拡張ファイルシステム   (ext2fs)  上にあるファイルの属性 (attribute) を変更する

## 環境

AWSのceontos7で確認

## 検証

### ストレージデバイスの状態を確認

dfコマンドでファイルシステムのフォーマットを確認する。
ファイルシステムタイプがxfsになっているのがわかる。
ディスクデバイスは通常は/dev/sdから始まる名称のことが多いが
今回の環境（AWS）では/dev/xvから始まる名称であった。

```
$df -T
ファイルシス   タイプ   1K-ブロック    使用   使用可 使用% マウント位置
/dev/xvda1     xfs         41931756 1039576 40892180    3% /
devtmpfs       devtmpfs      484356       0   484356    0% /dev
tmpfs          tmpfs         506944       0   506944    0% /dev/shm
tmpfs          tmpfs         506944   25804   481140    6% /run
tmpfs          tmpfs         506944       0   506944    0% /sys/fs/cgroup
tmpfs          tmpfs         101392       0   101392    0% /run/user/1000
```
### chattrの検証

ceontosユーザーで検証する。

```
$whoami
centos
```
ホームディレクリにディレクトリとファイルを作成する。

```
$mkdir -p ~/test/dir
$cd ~/test
$touch test-file
$ls -al
合計 0
drwxrwxr-x. 3 centos centos  34  2月 20 16:11 .
drwx------. 4 centos centos 123  2月 20 16:10 ..
drwxrwxr-x. 2 centos centos   6  2月 20 16:10 dir
-rw-rw-r--. 1 centos centos   0  2月 20 16:11 test-file
```

chattr属性で変更不可属性をディレクトリとファイルに付与してみる。
しかし自分がオーナーのディレクトリ・ファイルでも属性の変更ができずにエラーとなった。

```
$chattr +i dir
chattr: 許可されていない操作です while setting flags on dir
$chattr +i test-file
chattr: 許可されていない操作です while setting flags on test-file
```

マニュアルを確認すると下記のように記載されており、一般のユーザーでは
i属性を付与できないことが分かる。

> i属性が設定されているファイルは、変更することができない。
すなわち、削除、名前の変更、このファイルを指すリンクの作成、このファイルに対するデータの書き込みが禁止される。
スーパーユーザーまたはCAP_LINUX_IMMUTABLE ケーパビリティを持つプロセスだけが、この属性を設定・解除できる。

root権限で変更不可属性を付与したところ、問題なく設定ができた。

```bash
$sudo chattr +i dir
$sudo chattr +i test-file 
```

lsattrコマンドでファイルの属性を確認できる。
対象のディレクトリとファイルに変更不可(i)属性が付与された。

```
$lsattr -a
---------------- ./.
---------------- ./..
----i----------- ./dir
----i----------- ./test-file
```

変更不可属性が付与されたファイルを削除してみる。
書き込み権限のパーミッションがあっても「許可されていない操作」と
表示されて削除できない。

```
$rm -rf dir
rm: `dir' を削除できません: 許可されていない操作です
$rm -f test-file 
rm: `test-file' を削除できません: 許可されていない操作です
```

root権限でも削除できない。

```
$sudo rm -rf dir
rm: `dir' を削除できません: 許可されていない操作です
$sudo rm -f test-file 
rm: `test-file' を削除できません: 許可されていない操作です
```

削除だけでなく移動もできない。

```
$mv dir dir2
mv: `dir' から `dir2' へ移動できません: 許可されていない操作です
$mv test-file test-file2
mv: `test-file' から `test-file2' へ移動できません: 許可されていない操作です
```

ファイルに対する書き込みもできない。

```
$echo hello >> test-file
-bash: test-file: 許可がありません
```

ファイルコピーは問題なく実施できる。コピー後のファイルには属性は引き継がれない。

```
$cp test-file new-file
$ls -al
合計 0
drwxrwxr-x. 3 centos centos  50  2月 20 16:37 .
drwx------. 4 centos centos 123  2月 20 16:10 ..
drwxrwxr-x. 2 centos centos   6  2月 20 16:10 dir
-rw-rw-r--. 1 centos centos   0  2月 20 16:37 new-file
-rw-rw-r--. 1 centos centos   0  2月 20 16:11 test-file
$lsattr
----i----------- ./dir
----i----------- ./test-file
---------------- ./new-file
```

変更不可属性のディレクトリの下にディレクトリもファイルも作成できない。

```
$touch dir/create-file
touch: `dir/create-file' に touch できません: 許可がありません
$mkdir dir/create-dir
mkdir: ディレクトリ `dir/create-dir' を作成できません: 許可がありません
```

変更不可属性を解除する。

```
$sudo chattr -i dir test-file
$lsattr -a
---------------- ./.
---------------- ./..
---------------- ./dir
---------------- ./test-file
---------------- ./new-file
```

変更不可属性が解除されたため、ファイル削除ができるようになった。

```
$rm -rf dir
$rm -f test-file
```