結論
まず、大学のマニュアルに従い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が必要- 完全解決!