俺様サーバー構築記 - 待機系構築を睨んだディレクトリ構造の変更@デスクトップパソコン; やり直し

「[俺様サーバー構築記 - 基本方針](https://qiita.com/katz_engineer/items/dbabcff4e14e9db2b10f)」以来構築を続けてきた俺様パソコン環境も、「[俺様サーバー構築記 - ZFS の上に Arch Linux をインストール;やり直し@デスクトップパソコン(BIOS)](https://qiita.com/katz_engineer/items/80d3c9cbe95d277d1760)」でサーバマシンを構築するに至りました。

実は最近、更に1台、古い古い古いデスクトップパソコンを部屋の隅から発掘しまして。詳細は別稿に譲りますが、それを俺様サーバーの待機系として活用し、マスタースレーブ構成の構築を試みる事にしました。

色々考えたのですが、前準備としてデスクトップパソコンのディレクトリ構造を若干変更します。具体的には、マシン固有の部分と、マシンを超えて共有されるべき部分とを分離したい。その為の修正です。

…という[内容で既に試した](https://qiita.com/katz_engineer/items/8722e3d74468786d6f89)のですが失敗しました。以下の記事は、全く新しく一からやり直しています。

# ディレクトリ構造

```console
$ ls /
bin  boot  dev  etc  home  lib  lib64  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```

zfs 的には次のようなファイルシステム構成になっています。

```console
$ zfs list
NAME        USED  AVAIL     REFER  MOUNTPOINT
tank       10.8G   439G       24K  legacy
tank/main  10.7G   439G     4.15G  /
```

要するに ```tank/main``` をルートディレクトリとして、全てのファイルはこの中に格納されているのが現状です。

今回は ```tank/sub0``` を作成して、更にその下に、サービス用データとしてマシン間で共有すべきデータを格納するファイルシステムを作成して、対応するディレクトリにマウントします。

# 分離対象ディレクトリ

```tank/main``` から分離するディレクトリとして現在考えているのは下記の通り。

- ```/home```
- ```/opt```
- ```/srv```
- ```/var/opt```

後日検討してもっと増える可能性もありますが、その場合は都度追記します。例えば ```/usr``` ディレクトリは元々複数マシン間で共有対象となるコマンドなどの置き場所として FHS で仕様化されていますが、今回の用途では共有不要と考えました。その辺で判断が変わる可能性が無きにしも非ず。


# 実施

zfs 操作の為に root ユーザになります（コマンドは省略）

まず ```tank/sub0``` を作成。必要に応じてマウントできるように ```mountpoint=legacy``` にしておきます。

```console
# zfs create tank/sub0 -o mountpoint=legacy
```

次に、対象ディレクトリの内容を一時的に退避しておきます。

```console
# for d in /home /opt /srv /var/opt; do q=/tmp/save$(dirname $d); mkdir -p $q; mv -v $d $q; done
created directory '/tmp/save/home'
created directory '/tmp/save/home/katz'
copied '/home/katz/.bashrc.org' -> '/tmp/save/home/katz/.bashrc.org'
copied '/home/katz/.bash_profile' -> '/tmp/save/home/katz/.bash_profile'
copied '/home/katz/.bash_logout' -> '/tmp/save/home/katz/.bash_logout'
created directory '/tmp/save/home/katz/.ssh'
＜以下省略＞
```

```/tmp``` は異なるファイルシステムなので、ファイル1つずつコピーしてから削除になります。そのため表示が非常に多い…

念の為に移動元の様子を確認しておきます。

```console
# for d in /home /opt /srv /var/opt; do ls -ld $d; done
ls: cannot access '/home': No such file or directory
ls: cannot access '/opt': No such file or directory
ls: cannot access '/srv': No such file or directory
ls: cannot access '/var/opt': No such file or directory
```

マウントポイントとして、各ディレクトリを作成します。

```console
# for d in /home /opt /srv /var/opt; do mkdir -v $d; done
mkdir: created directory '/home'
mkdir: created directory '/opt'
mkdir: created directory '/srv'
mkdir: created directory '/var/opt'
```

いよいよ本題。zfs ファイルシステムを作成して ```/etc/fstab``` に仕込みます。

参考文献: [4.4 root ファイルシステムの設定 - 4 ZFS ファイルシステムのセットアップ - ZFS に Arch Linux をインストール - ArchWiki](https://wiki.archlinux.jp/index.php/ZFS_%E3%81%AB_Arch_Linux_%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB#root_.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E3.81.AE.E8.A8.AD.E5.AE.9A)

※ ```/etc/fstab``` について、すべて ```acl``` を設定しておきます。一応。

```console
# for d in /home /opt /srv /var/opt; do zfs create -p tank/sub0$d -o mountpoint=legacy; done
# zfs list
NAME                USED  AVAIL     REFER  MOUNTPOINT
tank               10.8G   439G       24K  legacy
tank/main          10.7G   439G     4.14G  /
tank/sub0           144K   439G       24K  legacy
tank/sub0/home       24K   439G       24K  legacy
tank/sub0/opt        24K   439G       24K  legacy
tank/sub0/srv        24K   439G       24K  legacy
tank/sub0/var        48K   439G       24K  legacy
tank/sub0/var/opt    24K   439G       24K  legacy
# for d in /home /opt /srv /var/opt; do zfs set xattr=sa tank/sub0$d; zfs set acltype=posixacl tank/sub0$d; done
# vi /etc/fstab
# cat /etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
# tank/main
tank/main               /               zfs             rw,xattr,acl    0 0
tank/sub0/home          /home           zfs             defaults,relatime,acl   0 0
tank/sub0/opt           /opt            zfs             defaults,relatime,acl   0 0
tank/sub0/srv           /srv            zfs             defaults,relatime,acl   0 0
tank/sub0/var/opt       /var/opt        zfs             defaults,relatime,acl   0 0
```

マウントして確認。

```console
# for d in /home /opt /srv /var/opt; do mount tank/sub0$d; done
# mount | grep tank
tank/main on / type zfs (rw,relatime,xattr,posixacl)
tank/sub0/home on /home type zfs (rw,relatime,xattr,posixacl)
tank/sub0/opt on /opt type zfs (rw,relatime,xattr,posixacl)
tank/sub0/srv on /srv type zfs (rw,relatime,xattr,posixacl)
tank/sub0/var/opt on /var/opt type zfs (rw,relatime,xattr,posixacl)
```

各ディレクトリの中身を書き戻します。

```console
# mv -v /tmp/save/opt /                
mv: inter-device move failed: '/tmp/save/opt' to '/opt'; unable to remove target: Device or resource busy
```

…どういう訳か ```mv``` できません。 ```/tmp``` の中身を削除できないってどういう事でしょう。面倒なので追求しません。素直に ```cp -p``` しておきます。

```console
# for d in /home /opt /srv /var/opt; do cp -pr /tmp/save$d $(dirname $d); done
# rm -r /tmp/save
```

なぜか ```rm``` は普通に成功します。むう。

再起動して確認。

```console
# reboot
```

```/home``` を移動したので、例えば適当な一般ユーザ taro などでログインできればひとまず成功と言ってよろしいかと。

```console

Arch Linux 5.3.13-arch1-1 (tty1)

〈サーバ名〉 login: taro
Password: 〈taroのパスワード〉
```

mount の状況を確認。

```console
$ mount | grep tank
tank/main on / type zfs (rw,relatime,xattr,posixacl)
tank/sub0/home on /home type zfs (rw,relatime,xattr,posixacl)
tank/sub0/srv on /srv type zfs (rw,relatime,xattr,posixacl)
tank/sub0/opt on /opt type zfs (rw,relatime,xattr,posixacl)
tank/sub0/var/opt on /var/opt type zfs (rw,relatime,xattr,posixacl)
```

これで、待機系との間で共有するブツの格納場所を確保できました。
やったね:thumbsup_tone2: