ターゲット
- リモートサーバ上でVimとかEmacsでファイルをたくさん編集するのはチョットツライ人
要約
- sshfsでリモートサーバ上のディレクトリをマウントしてローカルPCでVSCodeを開いて編集する(これでわかる人は以下の文章は読まなくて大丈夫かも)
VSCodeで編集する方法の分類
大まかに2種類の編集方法がある
ホスト側がssh agent forwardingを有効にしてくれているかどうかで手順がかなり違う
ssh agent forwardingを有効にしてくれているとき
VSCodeの拡張機能のremote developmentの中にあるremote-sshを使ってssh接続するだけで,VSCodeでリモートサーバ上のファイルが触れるようになる(正確にはローカルでは表示だけしてリモートでVSCode serverを動かしているらしい)
この記事では解説しない
ssh agent forwardingが無効のとき
サーバ管理者に/etc/sshd_configをremote sshが使えるように設定するように依頼して承認されればremote-sshを使える
それが出来ない場合は以下の手順を踏むことになる
セットアップの概略
- gfortranをインストールして
- fortran-language-serverをインストールして
- VSCodeの拡張機能の[Modern Fortran]と[FORTRAN IntelliSense]をインストールして
- sshfsを使ってリモートサーバの任意ディレクトリ下をローカルにマウントして同期させ
- ローカルマシンでFortranファイルをVSCodeで編集
[Modern Fortran]:https://marketplace.visualstudio.com/items?itemName=krvajalm.linter-gfortran
[FORTRAN IntelliSense]:https://marketplace.visualstudio.com/items?itemName=hansec.fortran-ls
とりあえずWSL2(Ubuntu-20.04)でのセットアップを紹介する(WindowsとmacOSについては外部リンクを張る,またはコマンドの表記程度にとどめる)
WSL2の導入についてはMicrosoftの公式インストールガイドに沿って進めればOK
gfortranのインストール
以下の2行でOK
sudo apt update
sudo apt install gfortran
WindowsならMingw-w64をダウンロードしてインストール,pathの設定をする
macOSならhomebrewをインストールした後
sudo brew install gcc
で使えるようになる
fortran-language-server
[FORTRAN IntelliSense]が使うのでインストールする
pipを使ってインストールするがUbuntu環境のpipは少し特殊なためコマンドに注意
sudo apt install python3-pip
pip3 install fortran-language-server
Windowsならpython公式からダウンロード,インストールしてpathを設定してfortran-language-serverをインストール
macOSなら最初からpython3が入っているはずなのでそのまま
pip3 install fortran-language-server
でOK
VSCodeの拡張機能のインストールと設定
VSCodeの拡張機能からFortranと検索して[Modern Fortran]と[Fortran IntelliSense]をインストールするだけ
which fortls
which gfortran
でfortran-language-serverとgfortranのpathを取得して
VSCodeのsettings.json(WSL:Ubuntu-20.04)に
"fortran.gfortranExecutable": "gfortranのpath",
"fortran-ls.executablePath": "fortran-language-serverのpath",
を追記すればVSCodeのFortranの設定は完了
リモートサーバ上のファイルのマウント
sshfsを使う
[2022/04/03 追記]
- これまでに紹介していた/etc/fstabで自動マウントを設定する方法は,Ubuntu起動時に自動マウントを始める方法だと紹介していたが,マウントポイントにアクセス(cdやlsするなど)すると自動マウントをし始めるような挙動になっていた
- Ubuntuログインにマウントのための時間がかかるのと,マウントポイントの初回アクセス時にマウントのための時間がかかるのと,どちらがユーザの体験を損ねないかについては意見が分かれそうなので両方のやり方を残しておく
- 以下の例では$HOME/sshfsをマウントポイントにする場合の設定を記述するので各環境ごとに書き換えが必要
- 公開鍵認証(パスワードなし)を前提にしている
[2022/04/03 追記ここまで]
Ubuntu起動時 Ubuntuログイン時にマウントする設定
sudo apt install sshfs
# マウント用のディレクトリを作る
mkdir ~/sshfs
# Allow_otherを有効化して,マウント先のディレクトリをマウント後もログインユーザの権限で操作できるようにする
sudo sh -c 'echo user_allow_other >> /etc/fuse.conf'
# $HOME/sshfsをマウントポイントとしてマウントできるならマウントする
# (デフォルトでインストールされているはずだがmountpoint is not foundなどと出たらsudo apt install util-linuxでmountpointコマンドをインストール)
echo -e "if [ \"\$(ls \$HOME/sshfs)\" ]; then\n\tif ! mountpoint -q \$HOME/sshfs ; then\n\t\techo \"\$HOME/sshfs is not empty. No mount operation is performed.\"\n\tfi\nelse\n\tmount\nfi" >> $HOME/.profile
# マウント用のコマンド
echo "alias mount='sshfs -o uid=\`id -u\` -o gid=\`id -g\` -o allow_other -o nonempty {sshログインで使うユーザ名}:{リモートサーバのマウントしたいディレクトリ} {ローカルのマウントポイント} -o IdentityFile={IdentityFilePath}'" >> $HOME/.profile
マウントポイントにアクセス(cdやlsするなど)すると自動マウントをし始める設定
WSL2(Ubuntu20.04)環境においてarch-linux.jpのsshfsの記事によると,自動マウントはrootユーザによっておこなわれるので,fstabを編集するだけでは起動時マウントはできない
なので下記のような編集が必要になる
- rootユーザで1度手動でsshfsを使ってマウント(/root/.ssh/known_hostsに署名を追加するため)
sudo apt install sshfs
# マウント用のディレクトリを作る
mkdir ~/sshfs
# Allow_otherを有効化して,マウント先のディレクトリをマウント後もログインユーザの権限で操作できるようにする
sudo sh -c 'echo user_allow_other >> /etc/fuse.conf'
# sshfsでマウント
sudo sshfs {sshログインで使うユーザ名}@{リモートサーバのIPアドレス}:{リモートサーバのマウントしたいディレクトリ} {ローカルのマウントポイント} -o IdentityFile={IdentityFilePath}
ログインユーザのパスワードが求められるので入力すると
The authenticity of host '{リモートサーバのIPアドレス}' can't be established.
ECDSA key fingerprint is SHA256:{ハッシュ値}.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
と聞かれるはずなので yesで/root/.ssh/known_hostsに署名を追加する
起動時初回アクセス時に自動マウントさせるなら/etc/fstabを管理者権限で開いて
sshfs#{sshログインで使うユーザ名}@{リモートサーバのIPアドレス}:{リモートサーバのマウントしたいディレクトリ} {ローカルのマウントポイント} fuse users,allow_other,delay_connect,reconnect,uid={user id},gid={group id},IdentityFile={IdentityFilePath} 0 0
を書き込めば起動時初回アクセス時に自動マウントされるはず(起動時にマウントするのでコマンドが打てるようになるまでの時間は数秒増える)
user id,group idはターミナルでidコマンドを実行すると現在のログインユーザのuid,gidが表示されるのでその番号を打てばよい
ここまで終わったらUbuntuをシャットダウンさせて再起動させる
以上の工程を経ると,起動時初回アクセス時にsshfsによるリモートサーバの任意ディレクトリの自動マウントが可能になる
これでVSCodeで編集できるようになったので
code ~/sshfs/{開きたいディレクトリ}
で開くとVSCodeでリモートサーバ上のファイル(をローカルにマウントしたもの)をいじれるようになる
Windowsならこのとおりにセットアップするといい
macOSならこれを参照するとよい
感想
remote-sshが使える環境の楽さが身に染みて分かった