UbuntuでSamba共有を永続マウントする仕組み整理

UbuntuでSamba共有を永続マウントする仕組み整理 Linux
UbuntuでSamba共有を永続マウントする仕組み整理

はじめに

Sambaでファイル共有を構築していると、「Sambaは動いているのに見えない」「cifsって何?」「fstabの1行って何を書いているの?」といった疑問が次々出てきます。

この記事では、Samba共有(Samba上のストレージ)を永続マウントするまでの流れと、その内部構造を整理してみます。

Sambaとcifsの関係

まず混乱しやすいポイントから。

  • Samba(smbd) → サーバー側の実装
  • cifs → クライアント側(カーネルのファイルシステムドライバ)
  • smbclient → 対話型クライアントツール

マウントする場合に使われるのは cifs です。

cifs(Common Internet File System)は、Windowsとファイル共有を行うためのLinux側のプロトコルの呼び名です。

つまり構造はこうなっています。

Linuxカーネル(cifs) ⇄ ネットワーク ⇄ smbd(Sambaサーバー)

smbclientはマウントには使われません。なのでマウント目的の場合はインストールしなくてもOKです。

smbclientは何をするのか

smbclient はFTPのような対話型ツールです。

例:

smbclient //192.168.10.198/share -U user

できること:

  • ls
  • get
  • put
  • cd

つまり「一時的なファイルのやり取り」に向いています。FTPとかのような感じですかね?使用感は近いと思ます。

ストレージとして常時扱う場合は cifs を使います。

永続マウントの仕組み

通常Sambaで組んだファイルサーバーは、Windowsであればネットワークドライブとして認識させたり、Linuxであれば永続マウントさせたりして使います。

ここではLinuxでの永続マウントの話です。

永続化は /etc/fstab に書きます。書き方はいろいろあるので、これが正しいという訳ではないですが、例を示したいと思います。

例:

//192.168.10.198/6tb /mnt/6tb cifs credentials=/root/.smbcred,iocharset=utf8,uid=1000,gid=1000,file_mode=0664,dir_mode=0755,_netdev,x-systemd.automount,vers=3.0 0 0

以下は各項目の説明です。

① //192.168.10.198/6tb

マウント元(リモート側)

  • 192.168.10.198 → ファイルサーバーのIPアドレス
  • 6tb → Sambaで公開している共有名

Windowsの

\\192.168.10.198\6tb

と同じ意味です。

② /mnt/6tb

マウント先(ローカル側)

Linux側でどこに接続するか、です。

このディレクトリに、リモートの中身が「見える」ようになります。
事前にこのフォルダを作っておく必要があります。

③ cifs

ファイルシステムタイプ

CIFS = SMBのLinux実装。

Samba共有をマウントする場合は基本これになります。

④ credentials=/root/.smbcred

認証情報ファイルの指定

/root/.smbcred の中に

username=xxxx
password=xxxx

を書いておいたものを使っています。

  • fstabに平文で書かなくて済む
  • 権限を600にしておけば安全

root配下に置くのは、一般ユーザーから読めないようにするためです。

あくまでもセキュリティ上のやり方なので、この方法が永続マウントとして正しい作法というわけではありません。

⑤ iocharset=utf8

文字コード指定

日本語ファイル名を正しく扱うためです。

これが無いと、文字化けすることがあります。

⑥ uid=1000

所有ユーザーID指定

CIFSはWindowsの権限をそのまま持ってこられません。

なのでLinux側で

このマウントの所有者を誰にするか

を決めます。

1000 は通常、

最初に作った一般ユーザーのUID

であることが多いです。

確認方法:

id ユーザー名

⑦ gid=1000

所有グループID指定

同様に、グループ所有者の指定です。

通常はそのユーザーのプライマリグループも1000になります。

なぜuid/gidが重要か?

これがないと、

  • rootしか書き込めない
  • GUIで削除できない
  • パーミッションエラーになる

という状況が起こりがちです。明示的に設定した方がトラブルの切り分けがしやすいと思います。

なぜユーザー名・グループ名じゃないのか

これはカーネル側がユーザー・グループをuid、gidで見るためです。

cifsはカーネルの機能のため、カーネルが読める形で指定しないとうまく伝わりません。

⑧ file_mode=0664

ファイルのパーミッション指定

  • 所有者:読み書き
  • グループ:読み書き
  • その他:読み取りのみ

CIFSではLinux側で仮想的にパーミッションを割り当てます。

⑨ dir_mode=0755

ディレクトリのパーミッション

  • 所有者:読み書き実行
  • グループ:読み実行
  • その他:読み実行

ディレクトリは「実行権」が必要なので755です。

⑩ _netdev

ネットワークデバイス指定

このデバイスはネットワークのものですよ、という明示です。


⑪ x-systemd.automount

オンデマンドマウント

systemdに、マウントのタイミングを制御させる設定です。

起動時に無理にマウントしない、アクセスされた瞬間にマウントする、という状態になります。

これないと、デバイスの状態によってはストレージが認識されずマウントが失敗する場合があります。

⑫vers=3.0

Samba のプロトコルバージョンの指定です。

基本的に1.0はほぼ使われておらず、明示的に指定してあった方が安全です。

⑬ 0 0

  • 1つ目の0 → dumpバックアップ対象外
  • 2つ目の0 → fsckチェックしない

CIFSでは通常 0 0 で問題ありません。

まとめると

この1行は実質:

  • どの共有を
  • どこに
  • どのユーザー権限で
  • どんなパーミッションで
  • どのタイミングで

マウントするか

を全部指定している。

なぜcifsはカーネル実装なのか

理由は単純で、

ローカルファイルシステムのように扱うため

です。

open(), read(), write() といったシステムコールを
透過的に扱うには、カーネル層にいる方が都合が良いからです。

ext4やxfsと同じ階層にcifsやnfsが並んでいます。

プロトコルごとに仕組みは変わる

ネットワーク共有は1種類ではありません。

プロトコルクライアント
SMBcifs
NFSnfs
SSHsshfs

プロトコルが決まると、使われるドライバも決まります。

まとめ

  • Sambaサーバーはsmbd
  • マウントはカーネルのcifsが担当
  • smbclientは一時的なやり取り用
  • 永続化はfstabに書く
  • credentialsは単なる接続情報

構造を分解すると、混乱はだいぶ減ります。

「なんとなく動いている」状態から「何が動いているか理解している」状態になると、トラブル時の切り分けもかなり楽になります。

コメント

タイトルとURLをコピーしました