「俺様サーバー構築記 - 基本方針」以来構築を続けてきた俺様パソコン環境も、「俺様サーバー構築記 - ZFS の上に Arch Linux をインストール;やり直し@デスクトップパソコン(BIOS)」でサーバマシンを構築するに至りました。
実は最近、更に1台、古い古い古いデスクトップパソコンを部屋の隅から発掘しまして。詳細は別稿に譲りますが、それを俺様サーバーの待機系として活用し、マスタースレーブ構成の構築を試みる事にしました。
色々考えたのですが、前準備としてデスクトップパソコンのディレクトリ構造を若干変更します。具体的には、マシン固有の部分と、マシンを超えて共有されるべき部分とを分離したい。その為の修正です。
…という内容で既に試したのですが失敗しました。以下の記事は、全く新しく一からやり直しています。
ディレクトリ構造
$ ls /
bin boot dev etc home lib lib64 mnt opt proc root run sbin srv sys tmp usr var
zfs 的には次のようなファイルシステム構成になっています。
$ 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
にしておきます。
# zfs create tank/sub0 -o mountpoint=legacy
次に、対象ディレクトリの内容を一時的に退避しておきます。
# 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つずつコピーしてから削除になります。そのため表示が非常に多い…
念の為に移動元の様子を確認しておきます。
# 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
マウントポイントとして、各ディレクトリを作成します。
# 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
※ /etc/fstab
について、すべて acl
を設定しておきます。一応。
# 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
マウントして確認。
# 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)
各ディレクトリの中身を書き戻します。
# 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
しておきます。
# for d in /home /opt /srv /var/opt; do cp -pr /tmp/save$d $(dirname $d); done
# rm -r /tmp/save
なぜか rm
は普通に成功します。むう。
再起動して確認。
# reboot
/home
を移動したので、例えば適当な一般ユーザ taro などでログインできればひとまず成功と言ってよろしいかと。
Arch Linux 5.3.13-arch1-1 (tty1)
〈サーバ名〉 login: taro
Password: 〈taroのパスワード〉
mount の状況を確認。
$ 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)
これで、待機系との間で共有するブツの格納場所を確保できました。
やったね