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

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

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

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

（2019/11/29 追加ここから）
この記事の通りにファイルシステムを用意し、該当ディレクトリ（/home など）をシンボリックリンクで /zfs/tank/sub0/home などにリンクしたのですが。残念ながら失敗しました…
```pacman -Syu``` すると、シンボリックリンクが自動的に削除されて勝手に空ディレクトリが作成されるようです。つまり勝手に戻された上に空になります。なんという事でしょう:sob:

仕方が無いので諦めました。変更点が多くなるため[別記事](https://qiita.com/katz_engineer/items/e1d27692e9e5dd4e11c9)にしましたので、そちらを参照ください。
（2019/11/29 追加ここまで）

# ディレクトリ構造

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

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

```console
$ zfs list
NAME        USED  AVAIL     REFER  MOUNTPOINT
tank       3.69G   446G       24K  legacy
tank/main  3.69G   446G     2.51G  /
```

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

今回は ```tank/sub0``` を作成して、サービス用データとしてマシン間で共有すべきデータを格納するファイルシステムとします。

その場所も悩み所でしたが。悩んだ末に ```/zfs/tank/sub0``` に決めました。```/tank/sub0``` でも良いんですけどね、そもそも ArchLinux 標準の手順だと ```tank``` じゃなくて ```zroot``` だったりします。こういう名前に依存したマウントポイントにすると後々混乱の元になりそうですし、zfs のファイルシステムである事を明示的に表現するディレクトリ名にして、その中にマウントポイントを作りました。```/.zfs``` とも被りますけども、そこは人間の注意力に期待します。まぁこの位なら大丈夫…と信じたい。

# 実施

```tank/sub0``` を作成して、所定のディレクトリにマウントします。

```console
# zfs create tank/sub0 -o mountpoint=legacy
# mkdir -p /zfs/tank/sub0
# 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,noacl  0 0
tank/sub0               /zfs/tank/sub0  zfs           defaults,noatime,acl    0 0
```

マウントして確認。

```console
# mount tank/sub0
# mount | grep tank
tank/main on / type zfs (rw,relatime,xattr,noacl)
tank/sub0 on /zfs/tank/sub0 type zfs (rw,noatime,xattr,posixacl)
```

ここまで来たら、後は心置きなく好きなディレクトリを ```tank/sub0``` に集めましょう。
現在考えているのは下記4ディレクトリです: ```/home``` ```/opt``` ```/srv``` ```/var/opt```

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

（2019/06/29 変更ここから）

```console
# for d in /home /opt /srv /var/opt; do q=/zfs/tank/sub0$(dirname $d); mkdir -p $q; mv -v $d $q; ln -sv /zfs/tank/sub0$d $d; done
created directory '/zfs/tank/sub0/home'
created directory '/zfs/tank/sub0/home/taro'
copied '/home/taro/.bash_profile' -> '/zfs/tank/sub0/home/taro/.bash_profile'
copied '/home/taro/.bash_history' -> '/zfs/tank/sub0/home/taro/.bash_history'
copied '/home/taro/.bashrc' -> '/zfs/tank/sub0/home/taro/.bashrc'
copied '/home/taro/.bash_logout' -> '/zfs/tank/sub0/home/taro/.bash_logout'
created directory '/zfs/tank/sub0/home/taro/.ssh'
copied '/home/taro/.ssh/authorized_keys' -> '/zfs/tank/sub0/home/taro/.ssh/authorized_keys'
removed '/home/taro/.bash_logout'
removed '/home/taro/.bash_profile'
removed '/home/taro/.bash_history'
removed '/home/taro/.ssh/authorized_keys'
removed directory '/home/taro/.ssh'
removed '/home/taro/.bashrc'
removed directory '/home/taro'
removed directory '/home'
'/home' -> '/zfs/tank/sub0/home'
created directory '/zfs/tank/sub0/opt'
removed directory '/opt'
'/opt' -> '/zfs/tank/sub0/opt'
created directory '/zfs/tank/sub0/srv'
created directory '/zfs/tank/sub0/srv/ftp'
created directory '/zfs/tank/sub0/srv/http'
removed directory '/srv/http'
removed directory '/srv/ftp'
removed directory '/srv'
'/srv' -> '/zfs/tank/sub0/srv'
created directory '/zfs/tank/sub0/var/opt'
removed directory '/var/opt'
'/var/opt' -> '/zfs/tank/sub0/var/opt'
```

（2019/06/29 変更ここまで）

う〜ん、```mv -v``` の表示が意外でした。コピーしてから削除なんですね。異なるファイルシステムだから当然ですが、表示の行数が予想より多くなってしまいました。

再起動して確認。

```console
# reboot
```

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

```console

Arch Linux 5.1.12-arch1-1-ARCH (tty1)

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

他のディレクトリも確認。

```console
$ ls -l / /var | grep -e home -e opt -e srv -e var/opt
lrwxrwxrwx   1 root root   19 Jun 23 23:56 home -> /zfs/tank/sub0/home
lrwxrwxrwx   1 root root   18 Jun 23 23:56 opt -> /zfs/tank/sub0/opt
lrwxrwxrwx   1 root root   18 Jun 23 23:56 srv -> /zfs/tank/sub0/srv
lrwxrwxrwx  1 root root  22 Jun 23 23:56 opt -> /zfs/tank/sub0/var/opt
```

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