Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

Windows Azure上でLinuxをventiバックアップ先にする

この記事はQiitaで公開されていました

Plan 9のventiバックアップ用に、Windows Azure上でventiサーバを立てます。

plan9portのインストール

あらかじめplan9portを/usr/local/plan9にインストールしておく。

ventiディスクの作成

ブートが終わったら、新しいディスクにパーティションを切る。

$ sudo grep SCSI /var/log/messages
Apr 1 xxxxx kernel: sd z:z:z:z: [sdc] Attached SCSI disk
$ sudo fdisk /dev/sdc
n
p (primary partition)
1 (partition number)
enter
enter
w
(上記の順に入力してプライマリパーティションをひとつだけ作成)

ディスクを/mnt/ventiにマウント。

$ sudo mkfs -t ext4 /dev/sdc1
$ sudo mkdir /mnt/venti
$ sudo mount /dev/sdc1 /mnt/venti

venti用のファイルを作成。今回はファイルにしているけど、パーティションをそのまま使うこともできる。

$ cd /mnt/venti
$ sudo dd if=/dev/zero of=isect0 bs=8192 count=1000000
$ sudo dd if=/dev/zero of=arenas0 bs=8192 count=4000000
$ cat /mnt/venti/venti.conf
index main
isect /mnt/venti/isect0
arenas /mnt/venti/arenas0

isectの容量は、arenasの5%程度が良いとされる。

ventiディスクをフォーマット。plan9portをインストールして、PLAN9環境変数を設定しておく。

$ v=$PLAN9/bin/venti
$ sudo $v/fmtisect isect0 /mnt/venti/isect0
$ sudo $v/fmtarenas arenas0 /mnt/venti/arenas0
$ sudo $v/fmtindex /mnt/venti/venti.conf

venti動作確認。

$ v=$PLAN9/bin/venti
$ venti=127.1
$ sudo $v/venti -c /mnt/venti/venti.conf

以上で、tcp17034がListenしていれば動作している。

設定反映

plan9portの環境変数をシステム全体に反映。

$ cat /etc/profile.d/plan9port.sh
export PLAN9=/usr/local/plan9
export PATH=$PATH:$PLAN9/bin

venti用ディスクを起動時にマウントさせる。

$ blkid
/dev/sdc1: UUID="xxxxxx"
$ sudo vi /etc/fstab
# 以下の行を追加
UUID=xxxxxx /mnt/venti ext4 defaults 0 2

upstartでventiを起動させる。

$ cat /etc/init/venti.conf
description "venti server"

env venti=127.1
env PLAN9=/usr/local/plan9
export venti PLAN9

start on runlevel [345]
stop on runlevel [0126]

exec /usr/local/plan9/bin/venti/venti -c /mnt/venti/venti.conf >>/var/log/venti.log
respawn
$ sudo initctl reload-configuration
$ sudo initctl start venti

バックアップ用なので、特定のサーバからしかventiにアクセスできないように、AzureのエンドポイントACLを使って設定。具体的にはTCP 17034にコピー元のIPアドレスを追加するだけ。

内容確認

yumFUSEをインストールしておく。

$ sudo yum install fuse

vacfsで特定のスコアを指定して読む(readonly)。

$ cat current.vac
vac:xxxxxxxxxxxxxxxxxxxxxxxx
$ vacfs -h localhost -m mtpt current.vac

vacスコアを調べる

ventiが持っているルートのvacスコアを調べるためにはventiへhttpでアクセスできるようにしておかなければならない。以下は:8000でhttpサービスを有効にする例。

$ grep http venti.conf
httpaddr tcp!127.1!8000
(venti/ventiの-hオプションでも同様)

これで再起動すればよい。再起動が終わったら以下のスクリプトを動かす。これはPlan 9配布物に/sys/src/cmd/venti/words/dumpvacrootsとして存在しているものを若干変更した。rcやhgetを使っているので$PLAN9/binへPATHを通しておくこと。

$ cat dumpvacroots
#!/usr/bin/env rc
ventihttp=127.1:8000
hget http://$ventihttp/index |
    awk '
        /^index=/ { blockSize = 0 + substr($3, 11) }
        /^arena=/ { arena = substr($1, 7) }
        /^\tarena=/ {
            start = (0 + substr($5, 2)) - blockSize
            printf("venti/printarena -o %.0f %s\n", start, $3 "")
        }
    ' |
    rc |
    awk '$3 == 16 { printf("vac:%s\n", $2 "") }'
$ rc ./dumpvacroots | tail -3

CentOS 7の場合

firewalld

/etc/firewalld/services/venti.xmlを作成。

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>venti</short>
  <description>venti is an archival storage server.</description>
  <port port="17034" protocol="tcp"/>
</service>

設定をリロードしてからventiを通す。 permanentで設定した場合、reloadしないと反映されない。

# firewall-cmd --reload
# firewall-cmd --zone=public --add-service=venti --permanent
# firewall-cmd --reload
# firewall-cmd --zone=public --list-services

systemd

/etc/sysconfig/venti:

venti=127.1
PLAN9=/usr/local/plan9

/etc/systemd/system/venti.service:

[Unit]
Description=venti server
Requires=NetworkManager-wait-online.service
After=NetworkManager-wait-online.service

[Service]
EnvironmentFile=/etc/sysconfig/venti
Type=forking
Restart=always
ExecStart=/usr/local/plan9/bin/venti/venti -c /mnt/venti/venti.conf

[Install]
WantedBy=multi-user.target

ここでは、ExecStartで>>が使えないためログ出力を外しているが、ログはsystemctl status venti.service -lで読める。

サービス起動。

# systemctl start venti.service

問題なければサービスを有効にする。

# chmod +x /etc/systemd/system/venti.service
# systemctl enable venti.service