/tmpをサブボリューム@tmpのマウントへ変更する


メモリの一部分を利用して/tmpフォルダが作成されている場合に、ストレージの/tmpフォルダへ変更する手順のメモ

メモリが少なめの場合、大きなファイルの操作や、ブラウザでたくさんタブを開くなどの操作など、メモリ不足になりがちな操作で重たくなる環境の場合、改善する場合があります。
(またパフォーマンスが多少落ちたとしても、高負荷時の動作が安定するかもしれません。)

# Btrfsの場合
## Rootパーティションのストレージの確認
```sh
mount|awk '{if ($3=="/") print $1}'
```
```
/dev/sda3
```
## uuidを確認する。
/dev/sda3が`@`,`@home`などのサブボリュームが作成されているストレージの場合
```sh
lsblk -l -f -n -p | awk '{if ($1=="/dev/sda3") print $0}'
lsblk -l -f -n -p | awk '{if ($1=="/dev/sda3") print $3}'
```

## /mntに一旦マウントしてから、サブボリューム`@tmp`を作成する
`@サブボリューム`を`/`にマウントした状態で、`sudo btrfs subvolume create /@tmp`を実行すると、@サブボリュームの下の`@/@tmp`に作成されるので、ルートパーティションをsubvolumeオプションを`指定しない`で/mntにマウントしておいて、そこでサブボリュームを追加作成します。
```sh
sudo mount /dev/sda3 /mnt
cd /mnt
sudo btrfs subvolume create @tmp
cd
sudo umount /mnt
```

## fstab
上で確認しておいたUUIDとともに、/tmpの記述を追加します。
```
UUID=<your-btrfs-UUID> /tmp btrfs subvol=/@tmp,defaults,noatime 0 0
```

## tmpfiles.dの設定
/etc/tmpfiles.d/tmp-directory.confを作成しておきます。
```conf:/etc/tmpfiles.d/tmp-directory.conf
# /tmpディレクトリの所有権、パーミッション、クリーンアップルールを設定
d /tmp 1777 root root 10d

# /tmp内の古いファイルを削除（10日以上経過したファイル）
r! /tmp 10d

# 特定のファイルやディレクトリを保護（例：/tmp/.X11-unix）
x /tmp/.X11-unix
```
設定の反映
```sh
sudo systemd-tmpfiles --create --remove
```

## 再起動して確認
```sh
reboot
```
```sh
sudo btrfs subvolume list /
mount | grep "/tmp"
ls -ld /tmp
ls -la /tmp
```
```sh
lsblk -e7 -e253 -o NAME,FSTYPE,FSVER,UUID,SIZE,MOUNTPOINTS -P| awk '
BEGIN {
    print "NAME\tFSTYPE\tFSVER\tUUID\tSIZE\tMOUNTPOINTS"
}
{
    name = gensub(/.*NAME="([^"]*)".*/, "\\1", 1)
    fstype = gensub(/.*FSTYPE="([^"]*)".*/, "\\1", 1)
    fsver = gensub(/.*FSVER="([^"]*)".*/, "\\1", 1)
    uuid = gensub(/.*UUID="([^"]*)".*/, "\\1", 1)
    size = gensub(/.*SIZE="([^"]*)".*/, "\\1", 1)
    mountpoints = gensub(/.*MOUNTPOINTS="([^"]*)".*/, "\\1", 1)
    gsub(/\\x0a/, "\n", mountpoints)
    split(mountpoints, mps, "\n")
    for (i in mps) {
        print name "\t" fstype "\t" fsver "\t" uuid "\t" size "\t" mps[i]
    }
}'| column -t -s $'\t'
```

## 元に戻す場合
/etc/tmpfiles.d/tmp-directory.confを削除する。
/etc/fstabの記述から`@tmp`の記述をなくす。
サブボリューム`@tmp`も削除する。

# ext4の場合
## tmp.mountを無効にする
`sudo rm /etc/systemd/system/tmp.mount`相当の処理？
```sh
systemctl status tmp.mount
systemctl mask tmp.mount
systemctl status tmp.mount
sudo mkdir -p /tmp
```

## tmpfiles.dの設定
/etc/tmpfiles.d/tmp-directory.confを作成しておきます。
```conf:/etc/tmpfiles.d/tmp-directory.conf
# /tmpディレクトリの所有権、パーミッション、クリーンアップルールを設定
d /tmp 1777 root root 10d

# /tmp内の古いファイルを削除（10日以上経過したファイル）
r! /tmp 10d

# 特定のファイルやディレクトリを保護（例：/tmp/.X11-unix）
x /tmp/.X11-unix
```
設定の反映
```sh
sudo systemd-tmpfiles --create --remove
```

## 再起動して確認
```sh
reboot
```
```sh
mount | grep "/tmp"
ls -ld /tmp
ls -la /tmp
```
```sh
lsblk -e7 -e253 -o NAME,FSTYPE,FSVER,UUID,SIZE,MOUNTPOINTS -P| awk '
BEGIN {
    print "NAME\tFSTYPE\tFSVER\tUUID\tSIZE\tMOUNTPOINTS"
}
{
    name = gensub(/.*NAME="([^"]*)".*/, "\\1", 1)
    fstype = gensub(/.*FSTYPE="([^"]*)".*/, "\\1", 1)
    fsver = gensub(/.*FSVER="([^"]*)".*/, "\\1", 1)
    uuid = gensub(/.*UUID="([^"]*)".*/, "\\1", 1)
    size = gensub(/.*SIZE="([^"]*)".*/, "\\1", 1)
    mountpoints = gensub(/.*MOUNTPOINTS="([^"]*)".*/, "\\1", 1)
    gsub(/\\x0a/, "\n", mountpoints)
    split(mountpoints, mps, "\n")
    for (i in mps) {
        print name "\t" fstype "\t" fsver "\t" uuid "\t" size "\t" mps[i]
    }
}'| column -t -s $'\t'
```

## 元に戻す場合
/etc/tmpfiles.d/tmp-directory.confを削除する。
tmp.mountを有効にする。
```sh
systemctl unmask tmp.mount
```