By ribbon @
2023-11-28 21:18
openSUSE 15.5 で試したのですが、GlusterFS の中の glusterd は peer との通信にデフォルトで IPv6 で通信しています。 /etc/hosts に IPv4 アドレスでホスト名を指定してもそこを見ません。
IPv4 で通信させるためには、 /etc/glusterfs/glsuterd.vol に
option transport.listen-backlog 1024
と言う行を追加する必要があります。
By ftake @
2021-05-02 22:57
自宅サーバーをセットアップした際に、すべてを HDD にインストールしていたのですが、今回、/home と /boot、過去のスナップショットデータ以外を SSD に引っ越しました。このとき、Btrfs のサブボリュームとしての引っ越しをしてみました。
最初に openSUSE の Btrfs のサブボリューム構成についておさらいです。Snapper が有効化された状態のサブボリューム構成は次のようになっていました。Btrfs の / には @ というサブボリュームが1つだけあります。@ の中にマウントしたシステムの / にあるディレクトリに対応したサブボリュームがあります。ちなみに /@ が / としてマウントするのではなく、それぞれのサブボリュームごとに /etc/fstab でマウントしています(例: /@/home が /home)。Snapper を使用している場合は 1 番目のスナップショットが現在の / です。
以下のリストに無い、/@/.snapshots/1/ や /@/boot/grub2/ はサブボリュームではなく、その上にあるサブボリューム内のディレクトリです。
/@
/@/.snapshots
/@/.snapshots/1/snapshot
略
/@/.snapshots/61/snapshot
/@/boot/grub2/i386-pc
/@/boot/grub2/x86_64-efi
/@/home
/@/opt
/@/root
/@/srv
/@/tmp
/@/usr/local
/@/var
/@/var/lib/machines
さて、今回は /@/home と /@/boot/* を HDD に残し、その他を SSD に移動することにしました。パーティション全体であれば、dd
で、ファイルレベルであれば rsync と色々な方法がありますが、今回は Btrfs のサブボリュームを他の Btrfs ファイルシステムに転送する btrfs send
を使いました。
作ってみたスクリプトを先に貼り付けて、ポイントを個別に説明します。使い方はコピー元を /dev/sda1、コピー先を /dev/sdb1 とし、次のように使います。3番目の引数はスキップするサブボリュームのパターンです。/dev/sdb1 は mkfs.btrfs でフォーマットしてある前提です。
$ btrfs-subvols-copy.sh /dev/sda1 /dev/sdb1 "@/home|@/.snapshots/[2-9][0-9]*|@/boot"
#!/bin/sh
set -eu
exclude=$3
# mounting root volumes
workdir=`mktemp -d`
echo "working directory is '$workdir'"
cd $workdir
mkdir src
mkdir dest
# ルートのサブボリュームをマウントマウントする
echo "mounting root subvolumes of src and dest"
mount -t btrfs -o subvol=/ $1 $workdir/src
mount -t btrfs -o subvol=/ $2 $workdir/dest
src=$workdir/src
dest=$workdir/dest
backup_date=`date -u +'%s'`
# サブボリュームの一覧を出力
for subvol in `btrfs subvolume list --sort=path $src | awk '{print $9}'`; do
echo -n ">> $subvol: "
if [[ $subvol =~ $exclude ]]; then
echo "matched to a exclude pattern, skipped"
elif [ -e $dest/$subvol ]; then
echo "the destination subvolume already exists, skipped"
else
echo "create readonly tmp snapshot"
tmpsnap=$subvol.tmpsnap
# スナップショットを作って送る
echo "creating a read-only temporary snapshot to send] $src/$tmpsnap"
btrfs subvolume snapshot -r $src/$subvol $src/$tmpsnap
echo "copying"
btrfs send $src/$tmpsnap | btrfs receive $dest/`dirname $tmpsnap`
# 送信用のスナップショットを消す
echo "deleting the temporary snapshot: $src/$tmpsnap"
btrfs subvolume delete $src/$tmpsnap
# .tmpsnap を外す
echo "renaming the copied subvolume"
mv $dest/$tmpsnap $dest/$subvol
# property を元のサブボリュームと同じにする
echo "copying subvolume properties"
for prop in `btrfs property get $src/$subvol`; do
btrfs property set $dest/$subvol ${prop/=/ }
done
echo "done"
fi
done
echo "unmounting src and dest"
umount $workdir/src
umount $workdir/dest
echo "cleaning up working directory"
rmdir src
rmdir dest
rmdir $workdir
まずは、送信元、先のボリュームのマウントです。
# ルートのサブボリュームをマウントマウントする
echo "mounting root subvolumes of src and dest"
mount -t btrfs -o subvol=/ $1 $workdir/src
mount -t btrfs -o subvol=/ $2 $workdir/dest
送信元と先をマウントするだけなのですが、注意点が1つあります。Btrfs では任意のサブボリュームを選んでマウントすることができますが、何も指定しないと / ではなく、デフォルトのサブボリューム(btrfs subvolume set-default
で設定可能)がマウントされてしまいます。特に Snapper を使用していると、1番目の Snapper スナップショットがデフォルトになっていますので、明示的に subvol でマウントしたいサブボリュームの指定が必要です。
次に、送信元のサブボリュームのリストアップです。
# サブボリュームの一覧を出力
for subvol in `btrfs subvolume list --sort=path $src | awk '{print $9}'`; do
--sort=path
を指定して、親ディレクトリを含むサブボリュームを先にリストし、サブボリュームのツリー構造の親サブボリュームとディレクトリを先にコピーするようにします(存在しないとエラーになってしまいます)。
次に送信するところです。
# スナップショットを作って送る
echo "creating a read-only temporary snapshot to send] $src/$tmpsnap"
btrfs subvolume snapshot -r $src/$subvol $src/$tmpsnap
echo "copying"
btrfs send $src/$tmpsnap | btrfs receive $dest/`dirname $tmpsnap`
btrfs send
コマンドを使ってコピーするのですが、送信できるのは読み取り専用のサブボリュームなので、一度スナップショットを読み取り専用で作成し、このスナップショットを送ります。コピーは btrfs send
と btrfs receive
のペアで行えます。サブボリュームの名前(パス)は送信元と同じものが作成されます。そのため、スナップショットの名前になってしまうので、あとで mv
が必要でちょっと不便です(スナップショットを別のディレクトリに作成する方法もあり)。
注意が必要なことが1つあります。この送り方では Snapper のスナップショットを送れません。Snapper のスナップショットはスナップショット間で共通するデータを共有していますが、この方法ではこの共有が解けて複製されてしまいます。btrfs send
のオプションにベースとなったスナップショットを指定し、差分だけを送る機能があるようなので、もう少し工夫すると実現できるかもしれません。
最後に、サブボリュームのプロパティのコピーです。
# property を元のサブボリュームと同じにする
echo "copying subvolume properties"
for prop in `btrfs property get $src/$subvol`; do
btrfs property set $dest/$subvol ${prop/=/ }
done
送信前に読み取り専用のスナップショットを作成していますので、読み取り専用を含めた、送信後サブボリュームのプロパティをもと同じに戻します。
Category
openSUSE,
ファイルシステム |
受け付けていません