👻

barrierを使ってLinux・macOS間でキーボード・マウス・クリップボードを共有する

2022/03/14に公開

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を操作しなければいけないの面倒なので、私はやっていません。

  1. Avahiを使ってa.localで名前解決ができるようにしておく:[2] https://wiki.archlinux.org/title/avahi#Hostname_resolution

  2. barrierをインストールする

    sudo pacman -S barrier
    
  3. ~/.xinitrcがなかったら、テンプレートが/etc/X11/xinit/xinitrcにあるので、コピーして持ってくる

    cp /etc/X11/xinit/xinitrc ~/.xinitrc
    
  4. ~/.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
    
  5. 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
    
  6. 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での設定

  1. hostnameを確認する

    $ hostname
    a.local
    
  2. barrierをインストールする

    brew install --cask barrier
    

    または、https://github.com/debauchee/barrier/releases/ から手動でダウンロードしてインストールする

  3. Barrier.appを起動する。

  4. “Barrier” would like to control computer using accessibility features. というダイアログが出たら、Open System Preferenceから許可する。

  5. Do you want the application “Barrier.app” to accept incoming network connections?と聞かれたら許可する。

  6. BarrierをServerとして設定する。

  7. もし、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
    
  8. Configure Server... > Screens and linksの左上のscreenのアイコンをdrug and dropして、Unnamedなscreenを作る。これをダブルクリックして、Screen nameをb.localに変更する。

  9. アプリケーションメニューのBarrier > Change Settings (F4)から、Require client certificateをONにする

  10. Startをおす。

  11. 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
    
  12. 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/
脚注
  1. 正確にはEV3895のUSB hub機能を使って物理的には全部直接ディスプレイに繋いでいますが、ここでは論理的な結線を書いています。 ↩︎

  2. Avahiを使わずにipを直打ちしても問題はないです ↩︎

  3. systemdを使っていない場合や、古いX serverを使っている場合は/etc/X11/Xwrapper.configを以下のように設定して:

    allowed_users = anybody
    needs_root_rights = yes
    

    以下のように実行すれば良い。ただし、これはX serverをrootで動かすことになるのでできれば避けるべきです。

    startx
    
    ↩︎
  4. これは2.4.0現在、本来なら自動で生成されるはずのSSLの証明書が生成されないため、それのworkaroundです。c.f. https://github.com/debauchee/barrier/issues/231#issuecomment-958800595 ↩︎

Discussion