barrierを使ってLinux・macOS間でキーボード・マウス・クリップボードを共有する
Windows・macOS・Linuxの間でmouse, keyboard, clipboardの共有をするのならbarrierがおすすめです。barrierは、Symlessがオープンソースで開発して、バイナリを有償で配布していたsynergy1.9のforkです。barrierとsynergy1を比較すると前者の方が無料で使えて、そのおかげでdeployも簡単になっているので、ここではbarrierを紹介します。
以下の筆者の環境[1]で沿って解説をしますが、macOS以外のhostを使う場合や、Arch Linux以外のLinuxディストリビューションを使う場合も同様にできるはずです。
以下、SERVER側のhostnameをa.local, clientのhostnameをb.localと仮定するので、適宜読み替えてください
Arch Linuxでの設定
ここでは、startxで直接Xを立ち上げるようにします。display managerを使う場合は、greeterでもbarrierが立ち上がるようにすれば良いのですが、sshでloginできるサーバーを操作するのにgreeterを操作しなければいけないの面倒なので、私はやっていません。
-
Avahiを使ってa.localで名前解決ができるようにしておく:[2] https://wiki.archlinux.org/title/avahi#Hostname_resolution
-
barrierをインストールする
sudo pacman -S barrier
-
~/.xinitrcがなかったら、テンプレートが/etc/X11/xinit/xinitrcにあるので、コピーして持ってくる
cp /etc/X11/xinit/xinitrc ~/.xinitrc
-
~/.xinitrcの最後の方を編集して
twm & xclock -geometry 50x50-1+1 & xterm -geometry 80x50+494+51 & xterm -geometry 80x20+494-0 & exec xterm -geometry 80x66+0+0 -name login
を以下のように置き換えます。
/usr/bin/barrierc --name b.local --no-daemon a.local 2>&1 >>~/.local/share/barrier/barrier.log & exec i3
-
Clientの証明書とFinger Printを作っておく
mkdir -p .local/share/barrier/SSL/Fingerprints/ openssl req -x509 -nodes -days 365 -subj /CN=Barrier -newkey rsa:4096 -keyout ~/.local/share/barrier/SSL/Barrier.pem -out ~/.local/share/barrier/SSL/Barrier.pem echo "v2:sha256:$(openssl x509 -fingerprint -sha256 -noout -in ~/.local/share/barrier/SSL/Barrier.pem | cut -d= -f2)" > ~/.local/share/barrier/SSL/Fingerprints/Local.txt
-
Xを開始する[3]
sudo systemd-run --unit=x-$USER --property PAMName=login --property User=$USER --property StandardInput=tty --property TTYPath=/dev/tty8 /bin/bash -c 'chvt 8 && exec startx'
macOSでの設定
-
hostnameを確認する
$ hostname a.local
-
barrierをインストールする
brew install --cask barrier
または、https://github.com/debauchee/barrier/releases/ から手動でダウンロードしてインストールする
-
Barrier.appを起動する。
-
“Barrier” would like to control computer using accessibility features. というダイアログが出たら、Open System Preferenceから許可する。
-
Do you want the application “Barrier.app” to accept incoming network connections?と聞かれたら許可する。
-
BarrierをServerとして設定する。
-
もし、BarrierのGUIで、SSL Fingerprint: Diablesとなっているのなら、次のようにする[4]
openssl req -x509 -nodes -days 365 -subj /CN=Barrier -newkey rsa:4096 -keyout ~/Library/Application\ Support/barrier/SSL/Barrier.pem -out ~/Library/Application\ Support/barrier/SSL/Barrier.pem
-
Configure Server... > Screens and linksの左上のscreenのアイコンをdrug and dropして、Unnamedなscreenを作る。これをダブルクリックして、Screen nameをb.localに変更する。
-
アプリケーションメニューのBarrier > Change Settings (F4)から、Require client certificateをONにする
-
Startをおす。
-
ClientとServerのFingerPrintを交換する
CLIENT=b.local rsync ~/Library/Application\ Support/barrier/SSL/Fingerprints/Local.txt $CLIENT:~/.local/share/barrier/SSL/Fingerprints/TrustedServers.txt rsync $CLIENT:~/.local/share/barrier/SSL/Fingerprints/Local.txt ~/Library/Application\ Support/barrier/SSL/Fingerprints/TrustedClients.txt
-
Reloadを押す
これで、macOSのディスプレイの端にカーソルを持っていくと、Linux側にカーソルが移動してLinuxを操作できるようになるはずです。
アンインストールする場合
macOSからbarrierをアンインストールする:
rm -rf /Applications/Barrier.app
rm ~/Library/Preferences/com.github.Barrier.plist
rm -rf ~/Library/Application\ Support/barrier
Arch Linuxからbarrierをアンインストールする:
pacman -R barrier
rm -rf ~/.local/share/barrier/
-
正確にはEV3895のUSB hub機能を使って物理的には全部直接ディスプレイに繋いでいますが、ここでは論理的な結線を書いています。 ↩︎
-
Avahiを使わずにipを直打ちしても問題はないです ↩︎
-
systemdを使っていない場合や、古いX serverを使っている場合は/etc/X11/Xwrapper.configを以下のように設定して:
allowed_users = anybody needs_root_rights = yes
以下のように実行すれば良い。ただし、これはX serverをrootで動かすことになるのでできれば避けるべきです。
↩︎startx
-
これは2.4.0現在、本来なら自動で生成されるはずのSSLの証明書が生成されないため、それのworkaroundです。c.f. https://github.com/debauchee/barrier/issues/231#issuecomment-958800595 ↩︎
Discussion