ubuntuからwindowsの共有フォルダにアクセスする。

ubuntuからwindows10の共有フォルダにアクセスしてみます。アクセスの仕方はファイルアプリを使う方法とマウントコマンドを使う方法です。windowsの共有フォルダは設定済みです。

最初にubuntu側の環境ですが以下のパッケージがインストールされています。

$ dpkg -l | grep smb
ii libsmbclient
ii libsmbios-c2
$
$ dpkg -l | grep samba
ii samba-libs
$
$ dpkg -l | grep cifs
$
(詳細は以下)

libsmbclientは入っていますが、samba-client、および、cifs-utilsは入れていません。なお、libsmbclientがインストールされた時に以下のものもインストールされたようです。

$ dpkg -l | grep 2:4.7.6+dfsg
ii libsmbclient
ii libwbclient0
ii samba-libs
(詳細は以下)

まずファイルアプリを使う方法です。

ファイルアプリを開いて「他の場所」を選択すると下部に「サーバーへ接続」が表示されるのでwindows10の共有フォルダの場所を「smb://windowsのIPアドレス/共有フォルダ名」のように指定して「接続」ボタンを押下します。

すると、ユーザー名、ドメイン、パスワードを入力する画面が表示されるのでアカウント情報を入力します。

共有フォルダに接続できるとファイルアプリの左側にwindows10の共有フォルダが表示されます(赤枠)。共有の解除をするには隣の矢印(青枠)をクリックすると解除されます。

次にマウントコマンドを使ってwindows10の共有フォルダにアクセスします。

ubuntuに共有フォルダをマウントするディレクトリを作成します。ここでは、/home/user/work/mnt にマウントするようにします。マウントコマンドでは「-o」オプションを使うのですが、このオプションはroot権限がないと使えないため作業はrootユーザーで行います。

rootユーザーにスイッチした後に以下のコマンドを実行します。


# mount -t cifs -o username=<ユーザー名>,password=<パスワード> //windowsのIPアドレス/共有フォルダ名 /マウント先のディレクトリ

気をつけないといけないのは「username=<ユーザー名>,password=<パスワード>」は1つの引数のようで、ユーザー名とパスワードの間のカンマ「,」の後ろにスペースを入れてはいけません。あと、わかりづらいですが「//windowsのIPアドレス/共有フォルダ名」と「/マウント先のディレクトリ」は別々の引数です。

実際にはこんな感じです。


# mount -t cifs -o username=user,password=XXXX //192.168.0.3/jake /home/user/work/mnt

ファイルアプリでアクセスしたときはドメインに「WORKGROUP」を入力しなければならなかったのですが、マウントコマンドのときはドメイン情報は入力しなくても大丈夫でした(ユーザー名とパスワードは必要です)。

ファイルアプリでマウントしたディレクトリ(/home/user/work/mnt)を見てみます。

mntディレクトリのアイコンが普通のものと違うようです。コンセントの差込口みたいなものが表示されています。

マウントの解除は一般ユーザーでは行なえません。ファイルアプリから矢印(上の青枠)をクリックしてもエラーになってしまいます。マウントを解除するにはrootユーザーで以下のコマンドを実行します。

# umount -a -t cifs

これでマウントが解除されます。

LinuxでSMBパケットをキャプチャしてダイアレクトのやりとりを見てみた。

Linux(ubuntu)からwindows10の共有フォルダにアクセスして、そのときに流れるSMBパケットをwiresharkでキャプチャしてみました。SMBのダイアレクトのやりとりを見るためです。ダイアレクトとはSMBのバージョン識別に使われるもので、ダイアレクトをやりとりしてどのバージョンのSMBでファイル共有をするかをサーバーとクライアントの双方で決めます。SMBのバージョンについては前回の記事を見てください。

ubuntuにはlibsmbclientがインストール済みです。libsmbclientというのはSMBのクライアントソフトです。windowsの共有フォルダにアクセスするにはlibsmbclientが必要です。

libsmbclientはubuntuをインストールしたときから入っているようです(libsmbclientを意図的にインストールした記憶がないので)。

ubuntuからwindowsの共有フォルダへのアクセスはubuntuのファイルアプリから行います。ファイルアプリを開き「他の場所」を選択し下部にある「サーバー接続」に「smb://windowsのIPアドレス」を入力して接続ボタンを押下します。

windowsログインのアカウント、ワークグループ、パスワードを求められたら入力してください。windows側の共有フォルダの設定によります。

そのときのSMBパケットをwiresharkでキャプチャしたものです。wiresharkのフィルタでプロトコルをSMBとSMB2のパケットに絞っています。SMBプロトコルはSMBのバージョンが1.0のもの、SMB2プロトコルはSMBのバージョンが2.0以降のものです。

キャプチャの結果を見てみるとSMBのネゴシエートプロトコルで4回のやりとりをしています。

・Negotiate Protocol Request(SMB)
・Negotiate Protocol Response(SMB2)
・Negotiate Protocol Request(SMB2)
・Negotiate Protocol Response(SMB2)

それぞれの内容を見てみます。まずは上から1つ目です。SMBでは445ポートを使っているようです。

SMBパケットの中にリクエストダイアレクトのブロックがあります。ubuntuからSMBで使用できるダイアレクトを提示しています。いくつかあるのですが調べたところ以下の意味です(わかったものだけですが)。

・NT LM 0.12 (SMB1.0の意味合い)
・SMB 2.002 (SMB2.0の意味合い)
・SMB 2.??? (SMB2.1以降の意味合い)

これに対しwindowsからのレスポンスが2つ目です。

ダイアレクトが0x02ffとなっています。ubuntuからwindowsへのリクエスト時は16進数を使っていなかったのですがレスポンス時は16進数になっています。そもそもSMBプロトコルでリクエストしたのにレスポンスはSMB2プロトコルになっています。これは接続元がSMB2.1以降に対応していて(ダイアレクトでSMB 2.???を提示していて)接続先もSMB2.1以降に対応していれば、SMB2プロトコルを使って改めてネゴシエートを行う仕様になっているからです。SMBのネゴシエートで4回のやりとりがあるのはこのためです。

3つ目のキャプチャ結果を見てみます。

ubuntuからwindowsに再度ダイアレクトを提示しています。16進数表示でいくつかあるのですがSMBのバージョンを表していると思われます。

・0x0202(SMB2.0の意味合い)
・0x0210(SMB2.1の意味合い)
・0x0300(SMB3.0の意味合い)
・0x0311(SMB3.1.1の意味合い)

最後に4つ目のキャプチャ結果です。

windowsでダイアレクトの0x0311を選択しています。windows10はSMB3.1.1に対応しているのでそれが選ばれたわけです。windowsのファイル共有ではSMBのネゴシエートでお互いに利用可能な最上位のバージョンを決めています。