cifsでWindowsファイルをLinuxと共有
openSUSEにはYastというシステム設定ツールが用意されており、GUIを使い通常十分なコントロールができます。
Windows10上のディレクトリをLinuxと共有したく、当初は昔使っていたSambaでと考えていました。Yastでの設定も用意されていましたので。
しかし、上手く行かなかったので、より簡単な方法としてcifsを使用することに変更しました。
こちらも一筋縄では行きませんでした。特に、Windows10で説明しているサイトが見つからず、試行錯誤を重ね、やっと安定してマウントさせることができました。
大まかな手順
- Windows上でフォルダーを作り、共有設定を行う。
- Windows上のファイアウオールを設定する。
- Linux上でマウントポイントとなるディレクトリを作成する。
- cifsとしてマウントする。
手順は以上ですが、Windowsのファイアウォール設定について説明しているサイトがなかったので、適当にやってみて成功した方法をこの記事で紹介します。
この手順で上手くいく環境もあるのでしょうが、私の環境ではもうひと手間かかります。これは過去、Sambaで苦労したときの経験を思い出し、行ってみたところ100%マウントに成功するようになりました。
共有フォルダーの設定
これは、共有に慣れている方であれば、問題ないでしょう。
1.ます、共有したいフォルダーを作成します。作成した時点では普通のフォルダーです。これを共有フォルダーにするには、プロパティの共有タブから行います。
2.「共有(S)…」ボタンを押します。
3.共有する相手の指定です。通常自分が選ばれています。追加したい場合は相手のユーザー名を指定し、追加ボタンを押します。必要な「アクセス許可レベル」を指定してください。自分自身は「所有者」として表示されます。よければ、「共有(H)」ボタンをクリックします。
4.終了ボタンを押します。たぶん、ここまでの設定はWindowsでの共有の設定なので、Linux間と共有する場合には、必要ないかもしれません。(調べていません。)
5.「詳細な共有(d)…」ボタンを押します。「このフォルダーを共有する(S)」にチェックを付けます。
6.共有名は通常フォルダー名と同じです。変更すること可能です。日本語も使えます。この名前でLinux側からアクセスします。わかりやすい名前にしましょう。
7.「アクセス許可(P)」ボタンをクリックし、教習するユーザーの指定を行います。
8.デフォルトでは「Everyone」に読み取りの許可がついています。その名の通り、誰からも読まれる設定です。当然セキュリティ的には弱くなりますので、削除しましょう。
9.「追加(D)…」ボタンを押します。「選択するオブジェクト名を入力してください(例)(E)」へ、共有するWindowsユーザー、通常は自分でしょうが、ユーザー名を入力します。入力後に、右側の「名前の確認(C)」ボタンを押しましょう。ドメイン名、通常はWindowsマシン名が先頭についた、自分のアカウントのフルユーザー名が表示されます。
10.追加したユーザーには、初め「読み取り」の許可しかついていません。「フルコントロール」にチェックを入れてください。
11.必要なユーザーもしくはグループ全員を追加したら、OKボタンを押します。
12.再度OKボタンを押します。
13.「閉じる」ボタンを押します。
cifsを使ったLinuxとの共有には、たぶん「詳細な共有(D)…」の設定項目があればよいと思いますが、調べていませんので、「ネットワークのファイルとフォルダーの共有」の「共有(D)…」ボタンからの設定も私は行っています。
Windowsファイアウォール設定
これが、肝でした。私はWindows 10では、Windowsの標準ファイアウォールで十分だと言うネット上の意見を信じて、使用しています。他のファイアウォールを使用している方では、設定方法は当然ながら別でしょう。
ネットの環境や設定により、この設定が必要ない場合もありますし、逆に下の方法では不十分なこともあるでしょう。ルーター等の設定が必要なこともあります。
1.Cortanaを立ち上げ、fire…と入力します。すると、「セキュリティが強化されたWindowsファイアウォール デスクトップアプリ」と言う選択項目がでますので、それを選択しましょう。ファイアウォールが起動されます。
2.左ペインで、「受信の規則」を選びます。
3.中央に規則がリスト表示されます。下から約1/3あたりを見ますと、「ファイルとプリンターの共有(SMB受信)」という規則が2つあります。そのうち左にみどりのチェックマークがついてる規則をダブルクリックするか、選択してから右ペインのプロパティをクリックします。
4.「スコープ」タブを押します。
5.ローカルIPアドレスに、LinuxマシンのIPアドレスを指定します。ここに指定したIPアドレスからしかつなげません。
6.OKボタンを押します。
7.ファイアウォールを閉じます。
通常、すぐに有効になりますが、ならないこともありましたので、念の為にWindowsを再起動するのが賢明です。
この規則の「プロトコル及びボート」タブによりますと、プロトコルの種類TCP、プロトコル番号6,ローカルポートは445番に設定されています。Windowsデフォルト以外のファイアウォールを使用している場合は、それを通過させるように指定する必要があるでしょう。
このWindowsデフォルトファイアウォールで、信頼できるネットとしてIPアドレスが指定できたら楽なんでしょうが、設定する場所が見つかりませんでした。まとめて指定する方法がほしいところです。
Linuxマウントポイントの作成
ここからはLinuxマシン上での作業です。
Windows上で作成した共有フォルダーへアクセスするための、マウントポイントを作成します。通常のディレクトリを作成すればOKです。通常は自分のホームディレクトリ下に作るのがアクセスしやすいでしょう。まあ、これは好みですから、作成できる場所であればどこでもOKです。
cifsとしてマウント
コマンド一発です。
sudo mount.cifs //WindowsのIPアドレス/共有名 マウントポイント -o "username=Windowsのユーザー名,password=パスワード"
ネット情報ではこの形式が一番紹介されています。具体的には下のような感じになります。
sudo mount.cifs //192.168.0.8/shared /home/my-name/common -o "username=my-name,password=aslks38d0x8djf2"
ただ、これを実際に試して見ればわかりますが、フォルダーと共有されるファイルなどが全部、rootユーザーの所有となり、とても操作しづらくなります。また、ディレクトリやファイルのパーミッションが変わってしまうこともあります。そこで、実用的には次の形で使用することになります。
sudo mount.cifs //WindowsのIPアドレス/共有名 マウントポイント -o "username=Windowsのユーザー名,password=パスワード,uid=自分のuid,gid=所属グループのgid,dir_mode=ディレクトリのパーミッション,file_mode=ファイルのパーミッション"
具体的には、以下のような感じになるでしょう。
sudo mount.cifs //192.168.1.100/linux共有 common -o "username=tanaka,password=19840330,uid=1001,gid=1001,dir_mode=0755,file_mode=0644"
共有名はWindowsで共有設定で指定しました。デフォルトはフォルダー名になります。日本語も使えます。他の日本語サイトでは「フォルダー名」だとか「フォルダーパス」と説明しているところもありましたが、共有名です。共有名により、ファイルパスは自動的に解決されます。つまり同じWindows上で、同じ共有名は付けられません。共有名が一意のため、共有名だけでパイルパスも一意に決まります。
マウントポイントは作成したディレクトリを指定します。通常はマウント場所専用のディレクトリとして作成します。つまり、中に何かを保存しません。マウント前に保存することは可能ですが、マウントすると前に保存した内容には、アンマウントするまでアクセスできなくなります。マウントポイントは絶対パスでも、相対パスでも指定できます。
usernameとpasswordはWindowsのユーザーです。共有指定で許可を付けたユーザーです。通常自分ですね。usernameはuserと短く書くことができますが、usernameを使うほうが推奨されています。
uidとgidは、マウントしたディレクトリと、そこに含まれる共有対象のディレクトリ/ファイルの、Linux上での所有者を誰にするかを指定します。通常自分でしょう。名前では指定できません。
dir_modeとFile_modeは、マウント後のディレクトリとファイルのパーミッションです。8進数を表すために先頭にゼロを付けます。適切に設定しましょう。
ちなみに、マウントを外す、つまり共有を止めるには、次のようにします。
sudo umount マウントポイント
もしくは:
sudu umount //WindowsのIPアドレス/共有名
Linuxマシン起動時に自動的にマウントするには、/etc/fstabを設定します。私の環境では、いつもWindowsを起動するわけでないため、手動でマウントしています。
マウントしたまま、シャットダウンすると、自動的にアンマウントしてくれるのですが、この時にWindowsマシン側を先に落としてしまうと、コネクションを張ろうとして待つことになり、シャットダウンが遅れます。適切に、アンマウントするように自動化したほうが良いかもしれません。
マウント時のエラーメッセージ
マウント時にUnable to find suitable address.
が表示され、これを解決するのに一番時間がかかりました。何度か、再起動を繰り返しているうちにつながったり、またこのメッセージが表示されたりで、安定してマウントできませんでした。
どうやらこのメッセージは、WindowsとLinux間でお互いのマシンを認識できていないのが原因のようです。認識するタイミングは起動時のようで、あまり頻繁には相手を探しに行かないようです。Sambaを昔使用していた時に、似たような現象があったのを思い出し、現状次のように解決しています。
- Windows起動(相手先が起動していないため、コネクション先が分からない)
- Linux起動(Windowsが先に起動しているので、認識できる)
- Windows再起動(Linuxが起動しているので、認識できる)
たしか、相手先を認識させるためのコマンドがあったと思うのですが、両環境ともに既に失念してしまいました。そのうち、見つけたら記事にします。
とにかく、これが分かるまで、何をやってもこのメッセージがでてきて、とても悩みます。たぶん、同じ現象で悩んでいる方もいらっしゃるでしょう。WindowsやLinuxの設定だけでなく、ルーターなどの設定も関わっているかもしれません。
追記:
毎回、順番に気をつけたり、再起動するのはさすがに筋が悪いため、コマンドを調べました。
大抵の場合、Windows側で接続先として認識していないことが原因です。
確認するには以下のコマンドをコマンドプロンプトなどで実行します。
net view
これで、Linux側のサービスが認識されていれば、つまり通常は接続設定で指定するマシン名が表示されれば、認識されています。原因は、Linux側がWindows側を認識していないということになります。
その場合は、私の環境はopenSUSEのため、ZypperのGUIでネット接続の設定をいじると、勝手に色々な設定が走ってくれ、そのどれかが解決してくれるようです。
net view
でLinux側が表示されない場合は、IPアドレスを指定し、相手の状況を表示させることで、接続を認識させます。
net view \\192.168.1.100
基本的には、共有の状況を確認させているのですが、表示するには接続しなくてはなりません。いまさら、Windowsの接続のハイアラキーを勉強する気はないので、実用的な方法です。昔から、接続されていない通信を確立するために、状況を表示するコマンドを利用するというのは、定番です。