結論
まず、大学のマニュアルに従いanyconnect-tus-predeploy-linux-3.1.01065-k9.tar.gz
を手に入れる(バージョンは違うかも)
$ tar zxvf anyconnect-tus-predeploy-linux-3.1.01065-k9.tar.gz $ cd anyconnect-3.1.01065/vpn $ sudo ./vpn_install.sh $ sudo pacman -S pangox-compat networkmanager-openvpn networkmanager-openconnect
./vpn_install.sh
からエラーメッセージが出るが、SysVinit周りなので無視する。
/etc/systemd/system
にvpnagentd.service
という名前で
[Unit] Description=vpnagentd Requires=network.target [Service] Type=simple ExecStart=/opt/cisco/annyconnect/bin/vpnagentd ExecStop=/usr/bin/pkill vpnagentd RemainAfterExit=yes [Install] WantedBy=graphical.target
を作成し
$ sudo systemctl daemon-reload $ sudo systemctl enable vpnagentd.service $ sudo systemctl start vpnagentd.service
以上。
背景
以前にこのブログで
という記事を書いた。東京理科大学の学生である私がいかにしてUbuntu 16.04から大学のVPNを利用できるようにしたのかという話だ。
先日@Akcuohbe氏のPCのセットアップを手伝っていた際にManjaro Linuxを入れたのだが、上の記事の手順がほぼそのまま適用できると考えていたがそうではなかった。悪戦苦闘しどうにかできるようになった。
知らなかったのだが、Ubuntu 16.04は確かにsystemdが利用できるが、昔ながらのSysVinitが生き残っているようだ。互換機能があるため上記記事を書いたときはCisco AnyconnectがSystemdに対応していると勘違いしていた。
大学のVPNアクセスに必要なCisco Anyconnectは(少なくとも大学が配っているバージョンのものは)SysVinitのみに対応していて、Systemdに対応していない。
Cisco Anyconnectにはvpnagentd
というプログラムが有り、これがバックグラウンドで起動していることが重要らしい。
奮闘の内容
もう少しざっくりした話は
Archlinuxに東京理科大学のVPN接続するための道具を導入 - Qiita
を参照。
まだCisco AnyconnectがSystemdに対応していると勘違いしていたころ
TwitterのDMでやり取りしていた。
- インストールできないとの報告を受ける(GUI操作で
/opt/cisco/anyconnect/bin/vpnui
を起動しようとして何も起きない動画を添付される) sudo pacman -S networkmanager-openconnect
することと、端末から/opt/cisco/anyconnect/bin/vpnui
を起動することを要請pacman
のことは華麗にスルーされ、端末から/opt/cisco/anyconnect/bin/vpnui
を起動したときに/opt/cisco/anyconnect/bin/vpnui: error while loading shared libraries: libpangox-1.0.so.0: cannot open shared object file: no such file or directory
と言われた
sudo pacman -S pangox-compat
することを要請- 今度は端末から
/opt/cisco/anyconnect/bin/vpnui
を起動したときに何も言わずに死ぬように yaourt -S lib32-pangox-compat
することを要請- これを華麗にスルー
- 再起動して
sudo systemctl status vpnagentd.service
することを要請 - ところが
Unit vpnagentd.service could not be found.
と言われる
- おかしい。オフトンに居たのでSystemdのサービス列挙方法調べてその中にそれっぽいの居ないか試すように要請して寝る
- 起きてみたらどうしたらいいかわからなかったらしい。
原因究明
埒が明かないので実際にあって操作することに。
/opt/cisco/anyconnect/bin/vpnui
を起動しようとすると確かに一瞬だけGUIが出て即座に死ぬこと確認。
networkmanager-openvpn
,networkmanager-openconnect
をpacmanから入れてみるもだめ。networkmanager-openvpn-gtk2
をyaourtから入れようとしてみる- gpg署名検証エラーで怒られる
gpg
コマンドから--serch-keys
で出てくるのに--recv-keys
できない問題に当たる- 仕方ないので公開鍵を手動で取ってきて
pacman-key --add
する - yaourtでビルドが通ったが、インストールフェーズで
networkmanager-openvpn
と競合するとの通知がきて取りやめ
ls /opt/cisco/anyconnect/bin
したときにvpn
,vpnui
,vpnagentd
がいた。/opt/cisco/anyconnect/bin/vpn
をターミナルから立ち上げると、メッセージをメモし忘れたがエージェントが居ないとか云々言われた気がする。- あれ、これ
vpnagentd
が立ち上がってない・・・? vpnagentd
を立ち上げてからvpn
コマンド立ち上げたらそのメッセージが消えた- これだっ!自動起動の設定がコケてたんだ!
systemdのserviceを書こう
昔Ubuntu16.04でマウスのホイールの回転量を調整する - QiitaでSystemdのサービスを書いたことがあったのでこれを参考に書き進める
- Fedora Quick Docs | Fedora Quick Docs | Understanding and administering Systemd#creating-new-systemd-servicesのサンプルの
ExecStart=/usr/bin/sleep infinity
に騙されてExecStart=/opt/cisco/anyconnect/bin/vpnagentd infinity
としてしまう(節子、それsleep
コマンドの引数や!) - Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめもを見て
Wants
+After
じゃなくてRequires
を使うように: 少なくともサービスが立ち上がるようにはなったがvpnagentd
が立ち上がらない - なんかしばらくするとサービス落ちる問題
- ユーザーサービスにしたらうまくいくのでは?: システムサービスじゃないとioctlがコケる
- ようやくserviceのタイムアウトのせい?と気がつく:
[Service]
>RemainAfterExit=yes
が必要だった - うまく行ったと思ったが、OS終了時にあきらかにこのサービスの終了待ちのタイムアウトが・・・
ExecStop
が必要- 完全解決!