拡張属性の設定、削除方法

#1 はじめに
拡張属性はi-nodeに`拡張属性名-値`の形式で保存され、
拡張属性名はnamespace.nameの形式をとります。
・namespace：以下のように4つの属性クラスに分類されます。
・name：namespace内で一意の名前を付けることができます。
拡張属性を使うと、従来のパミッション(`rwx`)によるアクセス制御に比べ、
より細かいアクセス制御が可能になります。

|属性クラス | 説明 |
|:----|:-----|
|user   | ユーザがファイルやディレクトリに任意の情報を付けるために使用する拡張属性  |
|system   | カーネルが使用する拡張属性。ACL(*1)が使用する。  |
|security   |OSのセキュリティモジュール(*2)が使用するセキュリティラベル用の拡張属性   |
|trusted   | ユーザプロセスから操作可能な点はuserと同じ。本属性を操作するためには、CAP_SYS_ADMINが必要  |
(*1) Access Control List
(*2) SELinux,SMAK等


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

```console:CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
```

```console:カーネル版数
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
```

#3 コマンド
拡張属性の設定、削除、参照は以下のコマンドを使います。
・setfattr：設定、削除
・getfattr：参照

#4 拡張属性の設定、削除方法
ここでは、属性クラスuserに対して各種操作を実行してみます。

##4.1 設定方法

```console:テスト用ファイルの作成
[root@server test]# touch test.txt
```

作成したファイルを確認します。

```console:ファイルの確認
[root@server test]# ls -l test.txt
-rw-r--r--. 1 root root 0  3月  8 20:22 test.txt
```

以下の拡張属性をtest.txtに設定してみます。
・拡張属性名：user.x1
・値：111

```console:拡張属性の設定
[root@server test]# setfattr -n user.x1 -v 111 test.txt
```

設定した拡張属性を表示してみます。
拡張属性名が`user.x1`、値が`111`であることがわかります。

```console:張属属性の表示
[root@server test]# getfattr -n user.x1 test.txt
# file: test.txt
user.x1="111"
```

以下の拡張属性をtest.txtに設定してみます。
・拡張属性名：user.x2
・値：222

```console:拡張属性の設定
[root@server test]# setfattr -n user.x2 -v 222 test.txt
```

設定した拡張属性を表示してみます。
拡張属性名が`user.x2`、値が`222`であることがわかります。

```console:張属属性の表示
[root@server test]# getfattr -n user.x2 test.txt
# file: test.txt
user.x2="222"
```

ファイルに設定した拡張属性を全て表示してみます。

```console:張属属性の表示
[root@server test]# getfattr -d test.txt
# file: test.txt
user.x1="111"
user.x2="222"
```

次は、ロングオプション(`--dump`)を使って、拡張属性を全て表示してみます。

```console:張属属性の表示
[root@server test]# getfattr --dump test.txt
# file: test.txt
user.x1="111"
user.x2="222"
```


##4.2 削除方法

test.txtに設定されている拡張属性を確認します。

```console:初期状態の確認
[root@server test]# getfattr -d test.txt
# file: test.txt
user.x1="111"
user.x2="222"
```

test.txtから拡張属性user.x1を削除します。

```console:拡張属性の削除
[root@server test]# setfattr -x user.x1 test.txt
```

test.txtの拡張属性を確認します。
拡張属性user.x1が削除されたことがわかります。

```console:張属属性の表示
[root@server test]# getfattr -d test.txt
# file: test.txt
user.x2="222"
```

test.txtから拡張属性user.x2を削除します。
今度はロングオプション(`--remove`)を使って、拡張属性を削除してみます。

```console:拡張属性の削除
[root@server test]# setfattr --remove user.x2 test.txt
```

test.txtの拡張属性を確認します。
拡張属性user.x2が削除されたことがわかります。

```console:張属属性の表示
[root@server test]# getfattr -d test.txt
[root@server test]#
```

#5 エンコード方式の指定方法
拡張属性の値には文字列の他、16進数やBase64を使用することができます。
ここでは、拡張属性の値に16進数の設定、削除をしてみます。

```console:張属属性の設定
[root@server test]# setfattr -n user.x1 -v 0x0001 test.txt
```

拡張属性を表示してみます。
エンコード方式を指定しないと、値が正しく表示されません。

```console:張属属性の表示
[root@server test]# getfattr -n user.x1 test.txt
# file: test.txt
user.x1=0sAAE=
```

エンコード方式に16進数(`hex`)を指定して、拡張属性を表示してみます。
拡張属性の値が0x0001であることがわかります。

```console:張属属性の表示
[root@server test]# getfattr -n user.x1 -e hex test.txt
# file: test.txt
user.x1=0x0001
```

エンコード方式の指定にロングオプション(--encoding)を使ってみます。
拡張属性の値が0x0001であることがわかります。

```console:張属属性の表示
[root@server test]# getfattr -n user.x1 --encoding hex test.txt
# file: test.txt
user.x1=0x0001
```

#6 スペースを含んだ文字列を拡張属性に設定する方法
スペースを含んだ文字列を拡張属性に設定すると、以下のようなエラーが発生します。

```console:張属属性の設定
[root@server test]# setfattr -n user.x1 -v 111 222 test.txt
setfattr: 222: そのようなファイルやディレクトリはありません
```

拡張属性の値をダブルクォートで囲んで設定してみます。
エラーなく設定できることがわかります。

```console:張属属性の設定
[root@server test]# setfattr -n user.x1 -v "111 222" test.txt
```

設定した拡張属性を表示してみます。
拡張属性が正しく設定されていることがわかります。

```console:張属属性の表示
[root@server test]# getfattr -n user.x1 test.txt
# file: test.txt
user.x1="111 222"
```


#Z 参考情報
[Linuxプログラミングインタフェース ](https://www.amazon.co.jp/Linux%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9-Michael-Kerrisk/dp/487311585X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=linux+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9&qid=1615203335&sr=8-1)
[改訂新版 徹底攻略 LPIC Level3 303 教科書+問題集](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-LPIC-Level3-Version/dp/4295001562/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=lpic+303&qid=1615206103&sr=8-1)
[Ping-t](https://ping-t.com/)