tkzwhr's notes

tkzwhrの技術、中国語などのメモです。

Hyper-V環境のWindowsとLinux間でファイル共有する

Hyper-V環境を適用したWindowsLinuxでファイル共有を行うためのメモ。 WindowsIntelliJ IDEAを使ってソースコード編集をして、Linuxでビルドする環境を構築した。

どちらが共有ホストになるか

f:id:tkzwhr:20201108231800p:plain

Hyper-V環境におけるWindowsLinuxの共有方法には

  • Windowsのファイル共有を設定してLinuxからcifsでマウントする(図の上)
  • Linuxにsmbdを立ててWindowsからアクセスする(図の下)

がある。

最初は、設定が簡単な、Windowsを共有ホストにしたファイル共有をしていたが、下記の問題が発生した。

  • シンボリックリンクが作れないため、npmのinstallでコケる
    • mount時にmfsymlinksオプションをつけることで対処可能
  • Windowsでのファイル更新にはinotifyが使えないため、IntelliJ IDEAで保存してもLive Reloadが動作しない
    • ファイルシステムの違いのため対処不可
      • ただしwebpack-dev-serverであれば、ポーリングで回避可能
  • Linuxでのビルドなどが遅い、場合によっては20秒ほどかかることもある
    • 実体がWindowsにあり、ビルドするたびにWindowsとのNetworkI/Oが走っているため
    • NetworkI/Oの問題のため対処不可

そのため、Linuxを共有ホストにした方法に切り替えた。 手順が少し込み入ってるためメモを残しておく。

なお、Linuxを共有ホストにした方法にも欠点があり、 Linuxのファイル更新がWindowsで検知できるまでタイムラグが有るのだが、 運用上致命的ではなかったため、こちらの方法にした。

やること

ネットワークアダプタの設定

Hyper-V環境ではゲストのIPアドレスが固定できない問題があるため、 別途仮想スイッチを作成してもう一つセグメントをもう一つ作る必要がある。

下記のサイト通り設定すれば良い。

https://qiita.com/tsuemura/items/3f8b310b062b36246252

IPアドレスを下記のようにした。

smbdの設定

Manjaro Linuxなら初期状態でsambaがインストールされているが、 confが設定されておらず起動できないため、有効化もされていない。

そのため、confを設定して起動できるようにする。

[global]
  workgroup = WORKGROUP
  server string = Samba Server
  security = user
  hosts allow = 169.254.123. 127.
 # 内部からのアクセスのみ許可
  interfaces = 169.254.0.0/16
  map to guest = Bad User
 # 不明なユーザはすべてゲスト扱いにする
  guest ok = yes
 # ゲストアクセスを許可
  guest only = yes
 # すべてのアクセスをゲストアクセスとする
  guest account = guestuser # ゲストのアカウントを指定する
  load printers = no
  log file = /usr/local/samba/var/log.%m
  max log size = 50
  dns proxy = no
  unix charset = UTF-8
  dos charset = CP932
  create mask = 777
 # ファイル作成時のパーミッション全許可
  directory mask = 777

 # ディレクトリ作成時のパーミッション全許可
  printing = bsd

[shared]
  # 共有する名前
  comment = Shared Directory
  path = /usr/local/samba/shared
 # 共有フォルダのパス
  browseable = yes
 # 検索可能
  writable = yes # 書き込みを許可

フォルダも作成する。

$ mkdir /usr/local/samba/var
$ mkdir /usr/local/samba/shared

ポートの設定

Windowsからアクセスできるようにするためにポートを開放する。 下記はufwでポート開放をするコマンド例。

$ sudo ufw allow 137/udp
$ sudo ufw allow 138/udp
$ sudo ufw allow 139/tcp
$ sudo ufw allow 445/tcp
``

### Windowsから参照する

smbd, nmbdを起動する。

sudo systemctl enable smb.service sudo systemctl enable nmb.service sudo systemctl start smb.service sudo systemctl start nmb.servic

Windowsからネットワークドライブの割当を行う。
下記のサイトの通り設定すれば良い。

https://www.tku.ac.jp/iss/guide/network/tool/networkdrive/windiwswindows-10.html

フォルダは `\\169.254.123.2\shared` とする。