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環境を構築](https://qiita.com/fararrow/items/e2bba195f08096471d31)
の通り，「JupyterHub環境に接続した際のルート」は``~/notebooks``になっています．

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

# Windows側の設定

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

## 共有設定

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

本共有作業専用のユーザ(以降[share_name]とします)を追加し，そちらに``D:\Work\``および``D:\Work\[user_name]\``群への共有アクセス許可を与えます．
(当然[user_name]で共有をかけても良いのですが，fstabの仕様上パスワードを平文で保持しないといけないようなので専用に用意します．)
![0_moz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/6ab195e0-6a25-bccc-5897-da4369b29702.png)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/f061bee8-1087-41dc-f975-4cc13623159a.png)
![2_2_moz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/8cbe0b8f-5004-4885-ab4d-b2a96f8d94ce.png)
これで[share_name]さんを使って``\\[IPアドレスorホスト名]\Work``にアクセス出来るようになります．

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


## パーミッション設定

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

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

としてある(そう挙動する…はず)ので，[share_name]さんにも同様の権限を与えます．
![3_moz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/b6610e43-d008-6f64-581a-85a06950106b.png)
![4_moz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/f22b0a46-bce8-78f9-f006-67d133e4b703.png)



# Ubuntu側の設定(mount)

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

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

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

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

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

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

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

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

```shell-session
$ 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``の確認

書いておいてアレですが，[全体確認](#sudo-mountでとりあえず全体のマウント確認)以降は直接fstabでの作業をしているのでこの確認はしてないです．

```shell-session
$ 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で自動化

```shell-session
$ sudo vi /etc/fstab 
```
で最後に記述していきます．

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

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

```shell-session
$ sudo vi /etc/.workpassword
```

```shell:/etc/.workpassword
username=[share_name]
password=[share_name pass]
```

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

### fstabへの記述

```shell:/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``という名前でアクセスできるようにしました．

## マウントポイント作成

```shell-session
$ 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に追記します．

```shell:/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からの確認

うまく出来ていれば，
![jupyter_moz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/a0f31417-2dbf-dc44-f0ac-1f0aff8dc3e6.png)
このように直下に見えているはず．
また，Terminal接続したとしても，Windows側の設定同様に他のユーザのディレクトリは見られないはず．

```shell-session
~$ 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をインストール](https://qiita.com/fararrow/items/0bdc72ac4f80b4cb35c0)
でlinux-vm-toolsを用いて使えるようにしたEnhanced Session Modeの機能を使うのが手っ取り早いです．

「セッション設定の編集」から，
![Local.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/182c87e3-5883-6faa-c719-c040d418f44f.png)
ローカルリソースに共有したいものを選んであげれば，
![Local2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/df8e6b95-1f93-0eea-c085-2dc8c30729f0.png)
このように
![Local3_moz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438132/d6ada6be-d42f-f01a-c5e8-1cf0e8c700a2.png)
``/home/[ログインユーザ名]/shared-drives``
へマウントされています．