GUIによる仮想ネットワークの構築① ファイルサーバ編

## 概要説明
極力GUI中心の操作でなるべく簡単にファイルサーバーを構築していきます。
※とはいえ一部の操作はGUIでできないこともあるのでご了承ください。

以下の図のようなファイルサーバー(FM-VS)を構築します。
何やらややこしく見えますが、要はVMの中にサーバーを立てて、ホストからアクセスする。
やりたいことはそれだけです。

ホスト機はWindows11、仮想化ソフトはOracle Virtual Boxとします。

サーバーVMはUbuntu日本語版とします。サーバーVMのセットアップ時はsamba等をDLする必要があるため、NATまたはブリッジ等でサーバーVMもインターネットに接続できるようにしておきます。

セットアップ後はhost only adapterで、ホスト機とVM-FSを接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/33bfabf2-c4a2-4e50-a807-61d2e4731159.png)

https://www.oracle.com/jp/virtualization/technologies/vm/downloads/virtualbox-downloads.html

https://www.ubuntulinux.jp/



## １．ディレクトリの作成 & sambaのインストール

こちらでノーチラスをインストールしておくとスムーズです。

https://qiita.com/yknm1989/items/7eaca850a4a0a05a5113

sambaをインストールします。
```bash:bash
sudo apt update && sudo apt upgrade
sudo apt install samba
```

ファイラーでホームなどにディレクトリを作成します（なぜホームにするかは後述します）。

私の場合は、srv/samba/share としました。srvが一応他のクライアントに向けたサービス用のデータを置く場所らしいのでそれに従いました。ただ、この場所だとGUI中心に簡単にとはいかないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/0bcae21d-ca09-ca78-e53b-d80880f5df70.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/507d60ab-c144-ffda-cc4c-e9261b973c63.png)

sambaをインストールした時点でアダプター１のNATを無効化し、アダプター２のhost only adapterを有効にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/fc6efecd-6308-7f0a-6f3e-b4de8e2115d1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/0f011a8f-76f3-09fd-1e07-48d6b7a0a9b8.png)

## ２．ネットワークの確認
ホストとVMでそれぞれコマンドを打ち、ipアドレスを確認します。
```bat:cmd
ipconfig
```
```bat:ホスト(windows11)
イーサネット アダプター イーサネット 3:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: 
   IPv4 アドレス . . . . . . . . . . . .: 192.168.56.1
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .:
```
```bash:bash
ip a
```
```bash:VM-FS
2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s8
       valid_lft 594sec preferred_lft 594sec
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx/xx scope link noprefixroute 
       valid_lft forever preferred_lft forever
```
環境によって色々なアダプターのipアドレスが表示される場合がありますが、ホスト側の 192.168.56.1 が、仮想マシンの 192.168.56.101 と同じサブネットに配置されているため、これがホストと仮想マシンの間の Host-Only adapter（ネットワーク）であることが確認できます。

同じネットワークの中で、ローカルipアドレスはカブっては使えません。

現状DHCPによってVMのアドレスは192.168.56.101に割り当てられているので、これをそのまま固定IPとしてこのVMが使うことには何の問題もないのですが、ここで別のipアドレスを使いたい時の手順についても考えてみます。

まず、ネットワークで利用可能なipアドレスの範囲を絞ります。サブネットマスク計算ツールを利用すると、便利です。

https://note.cman.jp/network/subnetmask.cgi

さて、例えばですが、計算結果は下記のようになりました。
```
IPアドレス	192.168.56.101
サブネットマスク	/24 (255.255.255.0)
ネットワークアドレス
(開始IP)	192.168.56.0
ホストアドレス
(使用可能IP)	192.168.56.1
～
192.168.56.254
ブロードキャストアドレス
(終了IP)	192.168.56.255
```

この中で利用したいアドレスに対してpingコマンドを打ちます。
windowsのpingコマンドと違い、pingを送る数を-cで指定しないとpingを送り続けてしまいますので、4つくらいにしておきます。

```bash:
user@user-VirtualBox:~$ ping -c 4 192.168.56.100

PING 192.168.56.100 (192.168.56.100) 56(84) bytes of data.

64 bytes from 192.168.56.100: icmp_seq=1 ttl=255 time=1.10 ms
64 bytes from 192.168.56.100: icmp_seq=2 ttl=255 time=0.362 ms
64 bytes from 192.168.56.100: icmp_seq=3 ttl=255 time=0.624 ms
64 bytes from 192.168.56.100: icmp_seq=4 ttl=255 time=0.347 ms

--- 192.168.56.100 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3009ms

rtt min/avg/max/mdev = 0.347/0.607/1.096/0.302 ms
```
192.168.56.100は空いていると踏んでいたのですが、
4 packets transmitted, 4 received, 0% packet loss, time 3009ms
とありますので、何らかのデバイスが使用しているようです。
（どうやら私が携行していたタブレット端末のようです。）

では、192.168.56.99ではどうでしょう？
```bash:
user@user-VirtualBox:~$ ping -c 4 192.168.56.99

PING 192.168.56.99 (192.168.56.99) 56(84) bytes of data.
From 192.168.56.101 icmp_seq=1 Destination Host Unreachable
From 192.168.56.101 icmp_seq=2 Destination Host Unreachable
From 192.168.56.101 icmp_seq=3 Destination Host Unreachable
From 192.168.56.101 icmp_seq=4 Destination Host Unreachable

--- 192.168.56.99 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3052ms
```
通信の相手がパケットを受け取っていない（そのipアドレスを使っていない）と考えられます。

ちなみに、先程調べたネットワークの範囲外に対してpingを打つと、
```bash
user@user-VirtualBox:~$ ping -c 4 192.168.55.255
ping: connect: ネットワークに届きません
```
このようにネットワークの範囲外であるメッセージが表示されます。

「Destination Host Unreachable（ホスト到達不能）」との違いが誤解しやすいですが、これは「ホストに到達不能」なので「ネットワークの範囲外」とは意味が異なります。

実際に構築してみることでこの違いは解ってくるのではないかと思います。

## ３．ipアドレスの固定化
有線設定からIPアドレスを固定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/9ad4b8a6-cc98-db4b-76a0-afd852a5eaed.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/0350fad3-425e-ac0a-7ea4-97e59559984e.png)

ネットワーク設定をリセット(少し時間がかかる場合があります)
```bash:bash
sudo systemctl restart NetworkManager
```

ipアドレスを確認する
```bash:bash
ip a
```

```
2: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:22:ad:29 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
```


## ４．サーバ化するディレクトリへの権限の付与

いったんファイラーを普通に（ユーザー権限で）開き直し、当該ディレクトリを右クリックし、「端末で開く」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/d7166c92-c5ae-ae0c-2798-09b874b99be0.png)

chmod 777 のコマンドを打ちます。
chmodが何をしているのかや、777の意味も理解しておくと良いと思います。

https://qiita.com/toshiokun/items/2823c5c14d121b50fcaa

```bash:bash
sudo chmod 777 ./share
```
chmodを行うことで、ローカルネットワーク共有が有効になります。
が、私の場合このようなエラーが返ってきました。これは、shareの場所がroot権限を必要とするディレクトリに置かれているため、ユーザー権限のGUI操作ではうまくいかないことが原因のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/34939fbc-a453-ca72-8dfc-b9d8941f4064.png)
```text:text
'net usershare' がエラー 255 を返しました: net usershare add: cannot share path /srv/samba/share as we are restricted to only sharing directories we own.

	Ask the administrator to add the line "usershare owner only = false" 

	to the [global] section of the smb.conf to allow this.
```
ホームに置いた場合は何の問題もなく、共有の作成（または共有の変更）が実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/1cc78196-7d42-5dc5-95f7-f7e56a3da2bb.png)

自動的にアクセス権を付与してくれるようなので、ホームの場合は特にchmodはいらなかったかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/9cda6d94-777b-2204-12b6-279a553b908e.png)

## ３．ユーザーの作成

ユーザーの確認は以下のコマンドで行います。特に何も出力されなければ、ユーザーは作成されていないことになります。
```bash:bash
sudo pdbedit -L
```
ユーザーの追加は以下のコマンドで行います。OSにログインしているユーザーの中から、sambaユーザーを作成することになります（同じユーザー名でsambaユーザーを作るという意味です）。つまり、必要に応じてubuntuのユーザーを作成することも考える必要がありますが、ここではubuntuにuserというユーザーがいるものとして考えていきます。

OSにログイン可能なユーザーではないユーザー名を登録しようとすると以下のようにエラーがでます。

```bash:bash
sudo pdbedit -a -u testuser1234
Failed to add entry for user testuser1234
```

ユーザー（user）の作成を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/d5ffe252-ce29-6c5d-9b73-9db591098dff.png)

## ４．ホスト側にネットワークドライブの割り当てを行う

エクスプローラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/b1890d15-edc8-f8eb-0f30-0af8daf0a018.png)

ネットワークドライブの割り当て
\\\\\192.16.102.56\\共有名　のような形で入力します。
なお、\\(バックスラッシュ)をキーボードで入力すると円マーク￥になるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/d305f355-cf93-3ebc-0f49-c69ccbaca187.png)

資格情報を入力します。
先ほど作成したidとパスワードになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/7ce0874a-9c8d-9649-f9e3-65f7b1a6d821.png)

予め作成しておいたtest_fileが確認できるとおもいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/6eac8fdd-a0f8-b970-cc5e-7e1a1a2e5a9a.png)

## まとめ
完全なGUI操作とまではいきませんが、必要最小限のCUI操作になったのではないかと思います。

何かの足しになれば幸いです。