Windows Server 2019でHyper-V上のUbuntu18.04とファイルを共有


はじめに

やりたい事は,タイトルの通りHyper-Vで動いているUbuntu18.04とその母艦であるWindows Server 2019とで共通のディレクトリ・ファイルをユーザを切り分けつつ参照出来るようにする事です.

詳細としては,前提として

  • Windows Server 2019側のD:\Work\[user_name]\にユーザ毎の作業用ディレクトリがある

状況において,

  • Ubuntu18.04側で動いているJupyterHub環境に接続した際のルート下にこの作業用ディレクトリをマウント

がやりたい事です.
Windows Server 2019でHyper-V上のUbuntu18.04にJupyterHub環境を構築
の通り,「JupyterHub環境に接続した際のルート」は~/notebooksになっています.

微妙にネットワークを介してしまいますが,手っ取り早く,共有ディレクトリにしてcifsでマウントしていきます.
適当にやってしまったので,メモに漏れやミスがあるかも知れませんm(_ _)m

Windows側の設定

単純なファイル共有設定作業です.
権限周りだけ気を付けます.

共有設定

上述の通り,今回はD:\Work\以下を共有したいので,こちらに共有設定をかけます.
ググるとGuestアクセス可能にしてしまうとかパスなしにするとか出てきますが,今回はサーバ用途なので流石にそれは回避…

本共有作業専用のユーザ(以降[share_name]とします)を追加し,そちらにD:\Work\およびD:\Work\[user_name]\群への共有アクセス許可を与えます.
(当然[user_name]で共有をかけても良いのですが,fstabの仕様上パスワードを平文で保持しないといけないようなので専用に用意します.)



これで[share_name]さんを使って\\[IPアドレスorホスト名]\Workにアクセス出来るようになります.

もちろん[share_name]さんはD:\Work\[user_name]\群全てにアクセス出来る状態なので,Ubuntu側でユーザ毎の切り分けをします.

パーミッション設定

この環境ではD:\Work\[user_name]\群はD:\Work\の設定を継承しておらず,

  • 各ユーザだけがアクセス出来る
  • ディレクトリの削除は出来ない

としてある(そう挙動する…はず)ので,[share_name]さんにも同様の権限を与えます.

Ubuntu側の設定(mount)

今回は/mnt/Workへマウントします.

sudo mountでとりあえず全体のマウント確認

passwordを直書きしてしまいますが,

$ sudo mkdir /mnt/Work
$ sudo mount -t cifs -o vers=3.0,username=[share_name],password=[share_name pass] //[IPアドレス]/Work /mnt/Work

でマウント出来るか確認.
確認したらumount

ユーザ毎に権限を付与した形でのマウント確認

大量に居るならスクリプトにしてしまうべき作業.

ユーザ毎マウントポイント作成

$ sudo mkdir /mnt/Work/[user_name1]
$ sudo chown -R [user_name1]:[user_name1] /mnt/Work/[user_name1]
$ sudo mkdir /mnt/Work/[user_name2]
$ sudo chown -R [user_name2]:[user_name2] /mnt/Work/[user_name2]

chownが必要かは未確認です.mount時のuid等で上書きされるかも知れない.

ユーザ毎でのsudo mountの確認

書いておいてアレですが,全体確認以降は直接fstabでの作業をしているのでこの確認はしてないです.

$ sudo mount -t cifs -o vers=3.0,username=[share_name],password=[share_name pass],uid=[user_name1],gid=[user_name1],file_mode=0600,dir_mode=0700 //[IPアドレス]/Work/[user_name1] /mnt/Work/[user_name1]
$ sudo mount -t cifs -o vers=3.0,username=[share_name],password=[share_name pass],uid=[user_name2],gid=[user_name2],file_mode=0600,dir_mode=0700 //[IPアドレス]/Work/[user_name2] /mnt/Work/[user_name2]

fstabで自動化

$ sudo vi /etc/fstab 

で最後に記述していきます.

ログイン情報の別ファイル化

(テスト時には叩いていますが,)
直接passwordをfstabに書くのは(コマンドとして叩かれるのは)アレなので,

$ sudo vi /etc/.workpassword
/etc/.workpassword
username=[share_name]
password=[share_name pass]

などと適当なファイルに用意.

fstabへの記述

/etc/fstab
//[IPアドレス]/Work/[user_name1] /mnt/Work/[user_name1] cifs vers=3.0,credentials=/etc/.workpassword,uid=[user_name1],gid=[user_name1],file_mode=0600,dir_mode=0700 0 0
//[IPアドレス]/Work/[user_name2] /mnt/Work/[user_name2] cifs vers=3.0,credentials=/etc/.workpassword,uid=[user_name2],gid=[user_name2],file_mode=0600,dir_mode=0700 0 0

こんな感じで各ユーザだけがアクセス出来るように設定.

Ubuntu側の設定(bind)

冒頭に書いた通り,JupyterHubで設定したルートディレクトリからアクセス出来るよう,マウントし直します.
~/notebooksの直下にてwin_workという名前でアクセスできるようにしました.

マウントポイント作成

$ sudo mkdir /home/[user_name1]/notebooks/win_work
$ sudo chown -R [user_name1]:[user_name1] /home/[user_name1]/notebooks/win_work
$ sudo mkdir /home/[user_name2]/notebooks/win_work
$ sudo chown -R [user_name2]:[user_name2] /home/[user_name2]/notebooks/win_work

chownが必要かは未確認です.mount時のuid等で上書きされるかも知れない.

fstabでのbind

bindをfstabに追記します.

/etc/fstab
/mnt/Work/[user_name1] /home/[user_name1]/notebooks/win_work auto bind 0 0
/mnt/Work/[user_name2] /home/[user_name2]/notebooks/win_work auto bind 0 0

Jupyterからの確認

うまく出来ていれば,

このように直下に見えているはず.
また,Terminal接続したとしても,Windows側の設定同様に他のユーザのディレクトリは見られないはず.

~$ cd /mnt/Work/
/mnt/Work/$ ls
[user_name1]  [user_name2]
/mnt/Work/$ cd [user_name2]/
bash: cd: [user_name2]/: 許可がありません
/mnt/Work/$ cd [user_name1]/
/mnt/Work/[user_name1]/$

おまけ:拡張セッションモードでのファイル共有

今回のサーバ用途な目的にはそぐわないですが,
単に手元でHyper-V上OSとファイル共有したいだけであれば,
Windows Server 2019でHyper-V上にUbuntu18.04をインストール
でlinux-vm-toolsを用いて使えるようにしたEnhanced Session Modeの機能を使うのが手っ取り早いです.

「セッション設定の編集」から,

ローカルリソースに共有したいものを選んであげれば,

このように

/home/[ログインユーザ名]/shared-drives
へマウントされています.