Supervisorで自作プログラムをデーモン化

自作のプログラムやスクリプトをデーモン化したい場合がある。でも、デーモンとして動作するようには作っていない……そういう時には Supervisor の出番だ。

Supervisor は Python 製のツールで、デーモンとして動作するように作られていないプログラムでもデーモン化できる。Supervisor 自体は root 権限でデーモンとして動かす必要があるけど、その下にぶら下がるプログラムはユーザー権限で管理できるのがいい点だ。

今日は、Ubuntu マシンの wplj に Supervisor をインストールして、以前 Go で作った画像アップローダを動かしてみる。

環境

  • Ubuntu 16.04 LTS
  • Python 2.7.12

Supervisorのインストールといろいろ下準備

Supervisor 自体は pip でインストールできる。

takatoh@wplj $ sudo pip install supervisor

/etc/supervisord.conf にデフォルトの設定ファイルを生成。

takatoh@wplj $ sudo echo_supervisord_conf > /etc/supervisord.conf
-bash: /etc/supervisord.conf: 許可がありません

あれ、sudo つけてるのになんでだ?よくわからないけど sudo -s してからやってみよう。

takatoh@wplj $ sudo -s
root@wplj # echo_supervisord_conf > /etc/supervisord.conf

今度はできた。つぎ、include 設定ファイル用のディレクトリを作成。

root@wplj # mkdir /etc/supervisord.d

supervisord 自体のはくログ周りの設定。デフォルトでは /tmp/supervisord.log に吐き出すことになっているので、設定ファイル /etc/supervisord.conf を修正して /var/log/supervisord.log に吐くようにする。

[supervisord]
;logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile=/var/log/supervisord.log

PID ファイルの設定。/var/run 以下に置くように変更。

;pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
pidfile=/var/run/supervisord.pid

/etc/supervisord.d 以下のファイルを include するように変更。これで設定ファイルの修正は終了。

[include]
files = supervisord.d/*.ini

supervisord自体のサービス登録

/etc/systemd/system/supervisord.service ファイルを作成する。

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org/
After=network.target

[Service]
ExecStart=/usr/local/bin/supervisord -n -c /etc/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/local/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target

起動と自動起動の登録

root@wplj # systemctl start supervisord
root@wplj # systemctl enable supervisord.service
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /etc/systemd/system/supervisord.service.

自作プログラムの配置

Go で作った画像アップローダ sulaiman を配置する。こんなふうにした。

takatoh@wplj $ tree ~/sulaiman
/home/takatoh/sulaiman
├── config.json
├── photos
│   ├── img
│   └── thumb
├── static
│   ├── css
│   │   └── style.css
│   ├── html
│   │   └── index.html
│   └── js
│   └── sulaiman.js
└── sulaiman

試しに動かしてみる。

takatoh@wplj $ ./sulaiman
_ _ / // /
/ // / \/ _ \
//__////_/ v3.3.5
High performance, minimalist Go web framework
https://echo.labstack.com
_________________________________O/_

O\
⇨ http server started on [::]:9099

大丈夫そうだ。

プロセス管理登録と起動確認

配置したプログラムを supervisord の管理下に登録する。/etc/supervisord.d 以下に設定ファイル sulaiman.ini を作る。

[program:sulaiman]
command=/home/takatoh/sulaiman/sulaiman
process_name=sulaiman
user=takatoh
directory=/home/takatoh/sulaiman
autostart=true
autorestart=true
stdout_logfile=/home/takatoh/sulaiman/sulaiman.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=7
stdout_capture_maxbytes=1MB
redirect_stderr=true

これで OK のはずだ。確認してみよう。

takatoh@wplj $ supervisorctl start sulaiman
error: , [Errno 13] Permission denied: file: /usr/lib/python2.7/socket.py line: 228

はぁ?どういうこと?

問題解決

ソケット周りでエラーが出てるようだ。権限がないとかいってる。supervisord の設定ファイルを眺めてみると、ソケットファイルのモードを設定する項目が見つかった。これを変更してみよう。

[unix_http_server]<br>file=/tmp/supervisor.sock   ; the path to the socket file<br>;chmod=0700                 ; socket file mode (default 0700)<br>chmod=0777

supervisord をリロード。

takatoh@wplj $ sudo systemctl reload supervisord

確認。

takatoh@wplj $ supervisorctl status sulaiman
sulaiman RUNNING pid 19356, uptime 0:00:22

こんどは OK。

これで、プログラムやスクリプトを簡単にデーモン化できるようになった。

参考ページ

 cf. Supervisorで簡単にデーモン化 – Qiita

UbuntuでBitbucketからgit cloneできなくなったのはIPv6のせいらしい

一昨日の問題、解決した。どうも IPv6 で Bitbucket に接続しようとしていたかららしい。↓このページが役に立った。

cf. 突然Bitbucketにgitで接続できなくなったらIPv6関連を疑ってみるとよいかも 2016/07/20 – Qiita

IPv4 で接続するようにするには、下のような ~/.ssh/config ファイルを作ってやればいい。

Host bitbucket.org
HostName bitbucket.org
AddressFamily inet

これで bitbucket.org には IPv4 で接続するようになる。

takatoh@apostrophe $ git clone [email protected]:takatoh/grp.git
Cloning into 'grp'...
remote: Counting objects: 638, done.
remote: Compressing objects: 100% (392/392), done.
remote: Total 638 (delta 382), reused 343 (delta 229)
Receiving objects: 100% (638/638), 509.65 KiB | 658.00 KiB/s, done.
Resolving deltas: 100% (382/382), done.
Checking connectivity... done.

できた。

UbuntuでBitbucketからgit cloneできなくなった

今朝試したら、SSH での git clonegit pull ができなくなっていた。HTTPS では clone できる。git push は試してない。
また、Windows マシンでは SSH で問題なく clone できる。

SSH の鍵を変えたわけでも、他の設定を変えたわけでもない。確か先週は普通にできたはずだ。
GitHub では問題ない。

SSH の鍵を登録しなおしてもダメ。どうすりゃいいんだ?

症状はこんな感じ。Bitbucket。

takatoh@apostrophe $ git clone [email protected]:takatoh/grp.git
Cloning into 'grp'...
Connection to bitbucket.org closed by remote host.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Github は大丈夫。

takatoh@apostrophe $ git clone [email protected]:takatoh/jscale.git
Cloning into 'jscale'...
remote: Enumerating objects: 39, done.
remote: Counting objects: 100% (39/39), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 274 (delta 19), reused 36 (delta 19), pack-reused 235
Receiving objects: 100% (274/274), 34.27 KiB | 0 bytes/s, done.
Resolving deltas: 100% (115/115), done.
Checking connectivity... done.

Ubuntu:ホスト名を変更

hostnamectl コマンドを使う。
引数無しで使うと、現在の情報を表示してくれる。

takatoh@envelopes $ hostnamectl
   Static hostname: envelopes
         Icon name: computer-desktop
           Chassis: desktop
        Machine ID: 51e97893a0e54d888a7bc435e3cb10be
           Boot ID: 528cc17f21ef4185b0697228e4d092b5
  Operating System: Ubuntu 16.04.5 LTS
            Kernel: Linux 4.4.0-133-generic
      Architecture: x86-64

hostnamectl set-hostname コマンドでホスト名変更。

takatoh@envelopes $ sudo hostnamectl set-hostname apostrophe
[sudo] takatoh のパスワード:

確認。

takatoh@envelopes $ hostnamectl
   Static hostname: apostrophe
         Icon name: computer-desktop
           Chassis: desktop
        Machine ID: 51e97893a0e54d888a7bc435e3cb10be
           Boot ID: 528cc17f21ef4185b0697228e4d092b5
  Operating System: Ubuntu 16.04.5 LTS
            Kernel: Linux 4.4.0-133-generic
      Architecture: x86-64

ちゃんと変わっている。

/etc/hosts ファイルを編集。

127.0.0.1 localhost
127.0.1.1 apostrophe # ←ここを修正した。

192.168.1.21 muffinman
192.168.1.15 montana
192.168.1.6 wplj
(以下略)

ネットワークの再起動。

takatoh@envelopes $ sudo service networking restart

これでOK。プロンプトのホスト名が変わっていないけど、これは端末を起動し直すと直る。

ext4のUSB外付けHDDにラベルをつける

Linux の ext4 ファイルシステムのディスクにも NTFS のボリュームラベルのようにラベル(名前)をつけられることを知った。

 cf. Linuxでストレージのラベルを確認・変更する

メインマシンの envelopes に繋がってる外付け HDD は NTFS なので、もうひとつの Ubuntu マシンである wplj の外付け HDD で試してみる。

まずはデバイスの確認。

takatoh@wplj $ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk 
├─sda1   8:1    0   512M  0 part /boot/efi
├─sda2   8:2    0 461.4G  0 part /
└─sda3   8:3    0   3.9G  0 part [SWAP]
sdb      8:16   0   2.7T  0 disk 
└─sdb1   8:17   0   2.7T  0 part /media/opabinia
sdc      8:32   0   2.7T  0 disk 
└─sdc1   8:33   0   2.7T  0 part /media/aysheaia

sdb1 と sdc1 が USB の外付け HDD だ。df コマンドに -T オプションをつけるとファイルシステムの種類を表示してくれる。

takatoh@wplj $ df -T
Filesystem     Type      1K-blocks      Used  Available Use% Mounted on
udev           devtmpfs    1948676         0    1948676   0% /dev
tmpfs          tmpfs        393812     17240     376572   5% /run
/dev/sda2      ext4      476050488  17526428  434319056   4% /
tmpfs          tmpfs       1969056       216    1968840   1% /dev/shm
tmpfs          tmpfs          5120         4       5116   1% /run/lock
tmpfs          tmpfs       1969056         0    1969056   0% /sys/fs/cgroup
/dev/sdb1      ext4     2884152984 722813244 2014810080  27% /media/opabinia
/dev/sdc1      ext4     2884152984 981135372 1756487952  36% /media/aysheaia
/dev/sda1      vfat         523248      3496     519752   1% /boot/efi
tmpfs          tmpfs        393812        52     393760   1% /run/user/1000

ext4 ファイルシステムにラベルをつけるのは e2label コマンド。
e2label デバイス名で現在のラベルを表示し、e2label デバイス名 ラベルでラベルをつける(ないしは変更する)。

takatoh@wplj $ sudo e2label /dev/sdb1

ラベルがついていないので何も返ってこない。
じゃ、つけてみよう。

takatoh@wplj $ sudo e2label /dev/sdb1 OPABINIA
takatoh@wplj $ sudo e2label /dev/sdb1
OPABINIA

ついでに /dev/sdc1 にも。

takatoh@wplj $ sudo e2label /dev/sdc1 AYSHEAIA
takatoh@wplj $ sudo e2label /dev/sdc1
AYSHEAIA

無事、ラベルがついた。
ラベルは blkid コマンドでも確認できる。

takatoh@wplj $ sudo blkid
/dev/sda1: UUID="D17D-DA22" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6fa2ce8f-fa84-4c97-8280-e58107f1f5f7"
/dev/sda2: UUID="55c35560-7f0d-42ea-895c-5522c3b0a757" TYPE="ext4" PARTUUID="2e419080-c527-4316-b546-f404b2974dc6"
/dev/sda3: UUID="fe038a20-aa4e-48d9-b98c-f8932b715370" TYPE="swap" PARTUUID="8383fce1-4445-419d-a75d-1e002ac985ef"
/dev/sdb1: LABEL="OPABINIA" UUID="cd8ae5c6-3931-4855-a60b-40f27b9bc518" TYPE="ext4" PARTUUID="76dd840a-3ce4-4092-9510-a127dd9f0297"
/dev/sdc1: LABEL="AYSHEAIA" UUID="4bd2ad4c-1acf-4468-847b-1dd0a0c474a2" TYPE="ext4" PARTUUID="33288db2-8046-449d-ae4f-03f23c3864b3"

WindowsからSambaの共有フォルダにコピーするときエラーが発生するようになってしまった

Samba で共有フォルダを作っている Ubuntu マシン(wplj)の外付け HDD を ext4 にフォーマットしたところ、Windows からファイルをコピーするときに、頻繁にエラーが発生するようになってしまった。
そもそも wplj の共有フォルダは Windows マシンのデータバックアップに使っていたもので、もとは NTFS のまま使っていた。そこに robocopy コマンドでバックアップをとっていた。例えば次のように。

robocopy /mir F:\softwares P:\

F: は Windows マシンの外付け HDD、P: は wplj の共有フォルダをネットワークドライブとして割り当てたものだ。wplj の外付け HDD が NTFS のときはこれで何の問題もなくバックアップできていたんだけど、ext4 にしたら「予期しないネットワークエラー」が頻繁に発生するようになってしまった、というわけ。robocopy コマンドだけでなく、エクスプローラーを使ってコピーしてみても状況は同じだった。まったくコピーができないわけじゃないので、ますますわからない。Web を見ながらいくつか解決方法を試してみたけれど、状況は変わらず。それで困っている。

ところで、よくわからないんだけど、CentOS マシン(aybesea)にたてた Samba の共有フォルダでは、上記のようなエラーは起こらない。なぜだろう?

UbuntuマシンのUSB外付けHDDをext4にフォーマットする

先日、CentOS マシン(aybesea)の外付け HDD を ext4 にしてうまくいったので、今度は Ubuntu マシン(wplj)のを ext4 にしてみる。
wplj には外付け HDD が2台あって片方はストレージ用、もう片方をバックアップ用にしている。どちらも NTFS だ。これを順次、ext4 にフォーマットし直そうというわけだ。

まずは現状の確認。

takatoh@wplj $ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           385M   37M  349M  10% /run
/dev/sda2       454G   16G  416G   4% /
tmpfs           1.9G  9.7M  1.9G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sdc2       2.8T  1.2T  1.6T  42% /media/aysheaia
/dev/sdb2       2.8T  1.2T  1.6T  42% /media/opabinia
/dev/sda1       511M  3.4M  508M   1% /boot/efi
tmpfs           385M  108K  385M   1% /run/user/1000
tmpfs           385M   12K  385M   1% /run/user/1001
tmpfs           385M   12K  385M   1% /run/user/1003
tmpfs           385M   12K  385M   1% /run/user/1002

/media/aysheaia にマウントされている /dev/sdc2 がストレージ用、/media/opabinia にマウントされている /dev/sdb2 がバックアップ用。幸いバックアップをとっているので、片方ずつならデータを消してしまっても構わない。

それじゃ、いってみよう。まずは /media/aysheaia をアンマウント。

takatoh@wplj $ sudo umount /media/aysheaia
[sudo] takatoh のパスワード: 
umount: /media/aysheaia: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)

あれ、samba で使ってるからダメなのか?samba を止めてみるか。

takatoh@wplj $ sudo /etc/init.d/samba stop
[ ok ] Stopping samba-ad-dc (via systemctl): samba-ad-dc.service.
[ ok ] Stopping smbd (via systemctl): smbd.service.
[ ok ] Stopping nmbd (via systemctl): nmbd.service.
takatoh@wplj $ sudo umount /media/aysheaia
takatoh@wplj $ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           385M   36M  349M  10% /run
/dev/sda2       454G   16G  416G   4% /
tmpfs           1.9G   15M  1.9G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sdb2       2.8T  1.2T  1.6T  42% /media/opabinia
/dev/sda1       511M  3.4M  508M   1% /boot/efi
tmpfs           385M  104K  385M   1% /run/user/1000
tmpfs           385M   12K  385M   1% /run/user/1001
tmpfs           385M   12K  385M   1% /run/user/1003
tmpfs           385M   12K  385M   1% /run/user/1002

今度はうまくいった。

つぎ、fdisk でパーティションを切り直す。

takatoh@wplj $ sudo fdisk /dev/sdc

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


コマンド (m でヘルプ): p
Disk /dev/sdc: 2.7 TiB, 3000592977920 bytes, 5860533160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BCDABA26-A73C-4D65-9C8D-18C86DF92F90

デバイス    Start 最後から  セクタ  Size タイプ
/dev/sdc1      34     262177     262144  128M Microsoft reserved
/dev/sdc2  264192 5860532223 5860268032  2.7T Microsoft basic data

Partition 1 does not start on physical sector boundary.

コマンド (m でヘルプ): d
パーティション番号 (1,2, default 2): 1

Partition 1 has been deleted.

コマンド (m でヘルプ): d
Selected partition 2
Partition 2 has been deleted.

コマンド (m でヘルプ): p
Disk /dev/sdc: 2.7 TiB, 3000592977920 bytes, 5860533160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BCDABA26-A73C-4D65-9C8D-18C86DF92F90

コマンド (m でヘルプ): n
パーティション番号 (1-128, default 1): 
First sector (34-5860533126, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-5860533126, default 5860533126): 

Created a new partition 1 of type 'Linux filesystem' and of size 2.7 TiB.

コマンド (m でヘルプ): p
Disk /dev/sdc: 2.7 TiB, 3000592977920 bytes, 5860533160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BCDABA26-A73C-4D65-9C8D-18C86DF92F90

デバイス   Start 最後から  セクタ  Size タイプ
/dev/sdc1   2048 5860533126 5860531079  2.7T Linux filesystem

コマンド (m でヘルプ): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

そして mkfs で ext4 にフォーマット。

takatoh@wplj $ sudo blkid
/dev/sda1: UUID="D17D-DA22" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="6fa2ce8f-fa84-4c97-8280-e58107f1f5f7"
/dev/sda2: UUID="55c35560-7f0d-42ea-895c-5522c3b0a757" TYPE="ext4" PARTUUID="2e419080-c527-4316-b546-f404b2974dc6"
/dev/sda3: UUID="fe038a20-aa4e-48d9-b98c-f8932b715370" TYPE="swap" PARTUUID="8383fce1-4445-419d-a75d-1e002ac985ef"
/dev/sdb2: LABEL="OPABINIA" UUID="962EDE6A2EDE42C3" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="70fb4b85-f7aa-4b55-b359-8a954bc7a0fc"
/dev/sdb1: PARTLABEL="Microsoft reserved partition" PARTUUID="f94bfbc2-2dd6-4f5a-bcd0-41fa20509112"
/dev/sdc1: PARTUUID="33288db2-8046-449d-ae4f-03f23c3864b3"
takatoh@wplj $ sudo mkfs -t ext4 /dev/sdc1
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 732566384 4k blocks and 183148544 inodes
Filesystem UUID: 4bd2ad4c-1acf-4468-847b-1dd0a0c474a2
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

3TB の HDD でもあっという間に終わるんだな。これほんとにフォーマットしてるのか?
まあいい。マウントしてみて、書き込みのテスト。

takatoh@wplj $ sudo mount --types ext4 /dev/sdc1 /media/aysheaia
takatoh@wplj $ touch /media/aysheaia/test
touch: '/media/aysheaia/test' に touch できません: 許可がありません
takatoh@wplj $ sudo touch /media/aysheaia/test
takatoh@wplj $ ls /media/aysheaia
test

大丈夫そうだ。

/etc/fstab に情報を書き込んで、再起動。

# USB HDD AYSHEAIA
UUID=4bd2ad4c-1acf-4468-847b-1dd0a0c474a2 /media/aysheaia ext4 defaults 0 0

はたして再起動した結果:

takatoh@wplj $ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           385M  6.8M  378M   2% /run
/dev/sda2       454G   16G  416G   4% /
tmpfs           1.9G   29M  1.9G   2% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sdb1       2.7T   73M  2.6T   1% /media/aysheaia
/dev/sda1       511M  3.4M  508M   1% /boot/efi
/dev/sdc2       2.8T  1.2T  1.6T  42% /media/opabinia
tmpfs           385M   52K  385M   1% /run/user/1000

うまくマウントされたようだ。なんかデバイス名が変わってるけど……

あとはバックアップからコピーして、今度はバックアップ用の HDD を ext4 にフォーマットしなおせば OK。

Ubuntu 16.04にGolang 1.9をインストール

ググると、Ubuntu の公式パッケージにある Go は 1.6 と古いので非公式のリポジトリを登録しろ、という情報があるんだけど、apt search golang してみたら golang-1.9 というパッケージがあった。なので、これをインストールする。

takatoh@envelopes $ sudo apt install golang-1.9

ところが go version コマンドを実行しても、インストールされてない、apt install golang-go をしろ、と言われる。素直にそうしてみると、今度は Go 1.6 がインストールされてしまった。
調べてみると、/usr/lib の下に golang-1.9 と golang-1.6 があって、/usr/bin/go から 1.6 の方へリンクがはられている。ということはこのリンクを 1.9 の方へはりなおしてやればいいはず。いったん 1.6 をアンインストールしてから、リンクをはりなおした。

takatoh@envelopes $ sudo ln -s /usr/lib/go-1.9/bin/go /usr/bin/go
takatoh@envelopes $ sudo ln -s /usr/lib/go-1.9/bin/gofmt /usr/bin/gofmt

これで無事完了。

takatoh@envelopes $ go version
go version go1.9.2 linux/amd64

vsftpdのインストールと設定→解決

昨日の vsftpd が動かない問題、解決した。
話は2段階で進む。まずはじめに、vsftpd 自体が起動しない問題、これは listen ディレクティブと listen_ipv6 ディレクティブが両方 YES になっていたためだった。listen_ipv6 のほうをコメントアウトして解決。

listen=YES
#listen_ipv6=YES

これで起動するようにはなったけど、アクセスしてみると「500 OOPS: vsftpd: refusing to run with writable root inside chroot()」というエラーが出てログインできない。これが2つめ。ググるとつぎのページが見つかった。

cf. vsftpdの設定で謎のエラーにハマった – TomoProgの技術書

どうやら chroot した先に書き込み権限があるとエラーになるらしい。allow_writeable_chroot ディレクティブを追加して解決。

allow_writeable_chroot=YES

それにしても listenlisten_ipv6 はデフォルトで両方 YES になってた。デフォルトが動かない設定になってるってどういうことよ?