Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

Windowsの共有フォルダをLinuxで常時マウントする

はじめに

自分の作業環境的に、ファイルサーバはWindowsの共有フォルダとして提供されていることが多い。 そのため、開発環境のLinuxWindowsの共有フォルダを常時マウントしておきたい。 当然ながら、WindowsLinuxではユーザ管理やアクセス制御の考え方が違うので、うまく運用できるような方針を立てる必要がある。 ここで、以下の前提をおく。

  • 共有フォルダは自分専用で、他の人はアクセスしない
  • マウントを実施するLinuxマシンは自分専用で、他の人はアクセスしない

つまり、環境は完全に自分専用なので、他の人の使い勝手や、他の人によるファイル更新は無視できるとする。 そして、以下の方法で共有フォルダをマウントすることにした。

  • 共有フォルダはOS起動時に/sharedにマウントする
  • 共有フォルダのオーナをrootに、グループをdeveloperにする
  • 共有フォルダにアクセスさせたいユーザは、グループdeveloperに所属させる

なぜ自分専用の環境なのにグループを利用したアクセス制御をするかというと、自分はユーザの切り替えることで複数の開発環境を使い分けているため。

環境

$ uname -srvm
Linux 4.15.0-23-generic #25-Ubuntu SMP Wed May 23 18:02:16 UTC 2018 x86_64

設定手順

まずは、マウントのタイプとしてcifsを指定できるようにするために、cifs-utilsをインストールする。

$ sudo apt install cifs-utils

次に、マウントポイント/sharedを作成する。

$ sudo mkdir /shared

fstabに以下の行を追加する。 ここで、共有フォルダのUNC(っぽいもの)は、仮に//server/sharedとしておく。

//server/shared    /shared    cifs    _netdev,x-systemd.automount,credentials=/root/.smb-credentials.txt,uid=root,gid=developer,file_mode=0660,dir_mode=0770    0    0

共有フォルダはネットワークが有効になってからでないとマウントできないので、「遅延マウント」の仕組みが必要になる。 ここでは、マウントオプション_netdevによりOS起動時のマウントを取りやめて、マウントオプションx-systemd.automountによりsystemd制御によるオンデマンドでのマウントを有効化している。

マウントオプションcredentialsで指定している認証情報のファイルはどこに配置してもよいが、ここでは/rootに配置することにした。 root以外からは読み込めないようにしておくこと。 認証情報のファイルの内容は以下だが、共有フォルダがActive Directoryで管理されていない場合(なのか?)はdomainは省略できる。

username=[ユーザ名]
password=[パスワード]
domain=[ドメイン名]

マウントオプションuid、gid、file_mode、dir_modeにより、Linuxパーミッションへのマッピングを指定している。 これにより、共有フォルダ上のファイルとディレクトリは、一律に所有者はrootに、グループはdeveloperにマッピングされる。 また、一律にグループに対して読み書きの権限が付与される。 そのため、グループdeveloperに所属しているユーザは、共有フォルダに対して読み書きができるようになる。 ただし、共有フォルダへの実際のアクセスは、マウントオプションcredentialsによって指定されたアカウントが利用されるので、最終的に読み書きが成功するかどうかは共有フォルダの元々のアクセス権次第である。

最後に、リブート後に「/sharedにアクセスして」マウントされていることを確認する。 前述のとおりオンデマンドのマウントを行っているので、確認のためには一度アクセスが必要になる。

$ cd /shared

$ df -h
Filesystem       Size  Used Avail Use% Mounted on
(略)
//server/shared  687G  122G  566G  18% /shared

$ ls -l
drwxrwx--- 2 root developer 0 Jun 15 00:43 dir-a
drwxrwx--- 2 root developer 0 Jun 15 00:43 dir-b
-rw-rw---- 1 root developer 0 Jun 15 00:43 file-a
-rw-rw---- 1 root developer 0 Jun 15 00:43 file-b