Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

Raspberry Piでファイル共有を行うには、**Sambaの設定(smb.conf編集)**が欠かせません。しかし、設定を間違えてしまうと、Sambaサービスが起動しなくなったり、想定通りに接続できないといったトラブルでつまずく人が多いのも事実です。

今回、初心者や非エンジニアの私でも安心して設定が進められるように、必要な情報を入力するだけでconfファイルの設定を自動生成できるSamba設定ジェネレーターを作成しました。

合わせて、Pythonコード例も2つ用意しましたので、ローカル環境でも使ってください。

このページでサクッと基本的な設定ファイルを作成して、Raspberry PiでSambaを使ったファイル共有の参考にしてください。

初心者がやりがちな失敗例

Sambaの設定でよくあるトラブルとして、私も経験済みの失敗パターンをいくつかご紹介します。

どちらかというとケアレスミスの部類ですね。

上書きしてしまった

別のところで作成したsmb.confファイルを /etc/samba/以下へ上書きコピーしてしまうパターンがあります。

もしくは、どこかで設定をコピーして、smb.conf に丸ごとペーストしてしまうか、場所を間違えてペーストしてしまい、Sambaサービスが起動しなくなるパターンもあります。これは書式や順番が決まっているからです。

そのため、失敗してしまうことを前提に考えて、先にsmb.confファイルをバックアップしておきましょう。

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

元に戻すには、上記コマンドのファイル指定箇所を、左右を入れ替えて戻せます。手動なら、既存のconfファイルを削除し、ファイル名から.bakなりを取り外した名前変更でも同じです。

[global] セクションを消してしまう

ペースト場所の間違いと同じ現象で、共有設定だけ書き換えて、[global] の基本設定を誤って一部を削除や全部削除してしまい、認証やネットワークで不具合に遭遇するパターンです。

記述されている[global][share]といった行以下は、セクションと呼ばれ、関係がないような記述でも重要です。変更はもちろんのこと、削除してしまうとsambaサービスそのものにも影響します。

設定するのに通常は[share]といったセクション以下に追記します。

権限(パーミッション)付与を忘れてしまう

smb.confは正しく書いても、Raspberry Pi 側のフォルダの権限が実態と合っておらず「アクセス拒否」に遭遇することがあります。

いくら設定でフルアクセスを与えても、所有権と読み書きの権限が与えられていない場合、アクセスできません。

mkdirコマンドのpオプションでディレクトリを作成したり、所有権のchownコマンドで明示的にユーザーとグループを指定したり、chmodコマンドで読み書きの権限を与えて対応します。

この例でのパスのraspidaや/shareは任意で変更してください。

sudo mkdir -p /home/raspida/share
sudo chown raspida:raspida /home/raspida/share
chmod 775 /home/raspida/share

設定の反映をしていない

smb.confを編集した後、sambaサービスを再起動していないため変更が効いていないパターンがあります。

編集した後は、忘れずにサービスを再起動させます。

sudo systemctl restart smbd

設定の書式を間違えてしまう

よくネットからコピペすると遭遇するパターンです。実は目に見えないインデントやスペースが入っていて、構文として間違うと遭遇します。

何度眺めても目視ではなかなか発見しにくい例の1つです。この場合はtestparmコマンドを使うと簡単です。

testparm

インデント間違いや不要なスペースなども指摘してくれます。

ファイル編集後に一度実行しておくと安心ですね。

共有フォルダへの接続はIPアドレス

Raspberry Pi のSamba側で作ったフォルダへ接続するのに、ホスト名ではなくIP アドレスで接続しないと認識されないパターンがあります。

Windowsエクスプローラーなどでホスト名の指定では接続出来ない場合、IPアドレスでも試してみましょう。

\\192.168.1.99\share

名前解決ができないから起こるため、confファイルの編集後にnmbdサービスも一緒に再起動しておく方法はオススメです。

sudo systemctl restart smbd nmbd

しかし、IPアドレスで指定すれば確実です。

Samba設定ジェネレーター

それではSamba設定のケアレスを防ぐために、便利なconf追記用ジェネレーターを載せておきます。

先程の「初心者がやりがちな失敗例」を減らすためのものです。これで全てOKというわけではありません。基本として必要な設定のジェネレーターなっています。大抵はこれらの設定だけで上手く動作します。

それぞれの項目を入力するかプルダウンから選んでから生成ボタンを押してください。その下に結果を表示します。

結果はコピーをするか、ダウンロードすることで利用してください。

smb.confの設定

共有名: パス: 読み取り専用: いいえ(書き込み可) はい(読み取り専用)

ゲストアクセス許可: いいえ はい

権限パターン: 標準(安全) グループ書き込み可 全員アクセス(非推奨)

生成

生成された smb.conf(追記用)

⚠ 既存の /etc/samba/smb.conf を直接上書きせず、必ずバックアップを取ってから追記してください。

コピー ダウンロード

なお、権限は0755が安全、0777を危険と表現しています。これが全てではありません。

私はいつも基本は0755で設定しておいて、不都合があるなら0775にしています。

パターンcreate maskdirectory mask説明
標準(安全)06440755特定ユーザーのみ読み書き可能、他ユーザーは読み取りのみ
グループも書き込み可能06640775上記に加えて同グループユーザーも書き込み可能
全員アクセス可能06660777すべてのユーザーが書き込み実行も可能(危険)

分かりづらいのですが、実体のあるフォルダ(作成して指定したフォルダ)は、Raspberry Pi 側で権限や所有権を設定します。

ここにある権限はSambaサービス側の権限指定です。実体のあるフォルダの権限を変更するものではありません。

■Pi 5は8GBモデルがオススメ

ローカル環境(Raspberry Pi側)のジェネレーター2つ

もしかしたら、ローカル環境でも同じジェネレーターを使いたいこともあるかと思い、Pythonコードで2つご紹介しておきます。好みの方を使ってください。

  • ターミナルで完結するCLI版
  • 実行後にWebブラウザで利用するFlask版

Pythonコードをコピーして、自分のRaspberry Pi で〜.pyファイルと保存して実行してみてください。(python3 samba-conf-gen.py

CLI版

使い方はターミナルで入力していく対話式のCLIです。

括弧内にあるのがデフォルト値ですから、その値で良ければEnterキーでOKです。パスはフルパスで必ず指定してください。

最終的にconfがファイルとして、pyファイルと同じディレクトリに出力します。中身をコピーするなりして、既存のsmb.confの最下部へ追記してください。

実行画面

CLI版Pythonコード

Samba設定ジェネレーター(Python版)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Raspberry Pi用 Samba smb.conf 生成ツール(追記用)
初心者でも安全に作れるよう、権限パターン選択+警告付き
"""

import os

# 権限パターン
mask_options = {
    "1": ("標準(安全)", "0644", "0755"),
    "2": ("グループ書き込み可", "0664", "0775"),
    "3": ("全員アクセス(非推奨)", "0666", "0777")
}

def input_with_default(prompt, default):
    inp = input(f"{prompt} [{default}]: ").strip()
    return inp if inp else default

def select_mask():
    print("\n権限パターンを選択してください:")
    for key, (name, create, dir_) in mask_options.items():
        print(f"{key}. {name} (create mask={create}, directory mask={dir_})")
    choice = input_with_default("番号を選択", "1")
    if choice not in mask_options:
        print("無効な選択です。標準(安全)を使用します。")
        choice = "1"
    return mask_options[choice]

def generate_smb_conf():
    print("=== Samba smb.conf 生成ツール ===\n")

    share_name = input_with_default("共有名", "share")
    path = input_with_default("パス", "/home/pi/share")
    read_only = input_with_default("読み取り専用? (yes/no)", "no")
    guest_ok = input_with_default("ゲストアクセス許可? (yes/no)", "no")
    mask_name, create_mask, dir_mask = select_mask()

    if mask_name == "全員アクセス(非推奨)":
        print("\n⚠ 警告:全員アクセス(777)はセキュリティリスクがあります。必要な場合のみ使用してください。\n")

    smb_conf = f"""[{share_name}]
   path = {path}
   browseable = yes
   read only = {read_only}
   guest ok = {guest_ok}
   create mask = {create_mask}
   directory mask = {dir_mask}"""

    print("\n=== 生成された smb.conf(追記用) ===\n")
    print(smb_conf)
    return smb_conf

def save_to_file(smb_conf):
    filename = input_with_default("\n保存するファイル名", "smb_add.conf")
    with open(filename, "w", encoding="utf-8") as f:
        f.write(smb_conf)
    print(f"✅ 設定を {filename} に保存しました。")
    print("⚠ 既存の /etc/samba/smb.conf を上書きせず、必ずバックアップしてから追記してください。")

def main():
    smb_conf = generate_smb_conf()
    save_to_file(smb_conf)
    print("\nSambaサービスに反映させる場合は以下を実行してください:")
    print("sudo systemctl restart smbd")
    print("testparm で設定を確認できます。")

if __name__ == "__main__":
    main()

Webブラウザ版

Webブラウザで動作するPythonのFlask版です。基本動作は同じです。

使い方は、Pythonを実行後、Raspberry Piのブラウザで http://127.0.0.1:5000/ にアクセスすると表示されます。

実行画面

WEBブラウザ版Pythonコード

Samba設定ジェネレーター(WebブラウザPython+Flask版)

from flask import Flask, render_template_string, request, send_file
from io import BytesIO

app = Flask(__name__)

# 権限パターン
MASK_OPTIONS = {
    "0644,0755": "標準(安全)",
    "0664,0775": "グループ書き込み可",
    "0666,0777": "全員アクセス(非推奨)"
}

HTML_TEMPLATE = """
<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Samba設定ジェネレーター</title>
</head>
<body>
<h2>Samba 設定ジェネレーター(追記用)</h2>

<form method="post">
  <label>共有名: <input type="text" name="share_name" value="{{share_name}}"></label><br>
  <label>パス: <input type="text" name="path" value="{{path}}"></label><br>
  <label>読み取り専用:
    <select name="read_only">
      <option value="no" {% if read_only=='no' %}selected{% endif %}>いいえ(書き込み可)</option>
      <option value="yes" {% if read_only=='yes' %}selected{% endif %}>はい(読み取り専用)</option>
    </select>
  </label><br>
  <label>ゲストアクセス許可:
    <select name="guest_ok">
      <option value="no" {% if guest_ok=='no' %}selected{% endif %}>いいえ</option>
      <option value="yes" {% if guest_ok=='yes' %}selected{% endif %}>はい</option>
    </select>
  </label><br>
  <label>権限パターン:
    <select name="mask_pattern">
      {% for mask, name in mask_options.items() %}
      <option value="{{mask}}" {% if mask==mask_pattern %}selected{% endif %}>{{name}} ({{mask}})</option>
      {% endfor %}
    </select>
  </label><br><br>
  <button type="submit">生成</button>
</form>

{% if warning %}
<p style="color:red; font-weight:bold;">{{ warning }}</p>
{% endif %}

{% if smb_conf %}
<h3>生成された smb.conf(追記用)</h3>
<pre id="smbOutput">{{ smb_conf }}</pre>

<!-- コピー用ボタン -->
<button type="button" onclick="copyToClipboard()">コピー</button>

<form method="post" action="/download">
  <input type="hidden" name="smb_conf" value="{{ smb_conf|e }}">
  <button type="submit">ダウンロード</button>
</form>

<p style="color:red; font-weight:bold;">
⚠ 既存の /etc/samba/smb.conf を直接上書きせず、必ずバックアップを取ってから追記してください。
</p>

<script>
function copyToClipboard() {
    const text = document.getElementById("smbOutput").innerText;
    navigator.clipboard.writeText(text).then(() => {
        alert("設定をコピーしました。\\n必ず元の smb.conf をバックアップしてから追記してください。");
    });
}
</script>
{% endif %}
</body>
</html>
"""

@app.route("/", methods=["GET", "POST"])
def index():
    smb_conf = ""
    warning = ""
    share_name = "share"
    path = "/home/pi/share"
    read_only = "no"
    guest_ok = "no"
    mask_pattern = "0644,0755"

    if request.method == "POST":
        share_name = request.form.get("share_name", "share")
        path = request.form.get("path", "/home/pi/share")
        read_only = request.form.get("read_only", "no")
        guest_ok = request.form.get("guest_ok", "no")
        mask_pattern = request.form.get("mask_pattern", "0644,0755")
        create_mask, dir_mask = mask_pattern.split(",")

        if mask_pattern == "0666,0777":
            warning = "⚠ 注意:全員アクセス(777)はセキュリティリスクがあります。必要な場合のみ使用してください。"

        smb_conf = f"""[{share_name}]
   path = {path}
   browseable = yes
   read only = {read_only}
   guest ok = {guest_ok}
   create mask = {create_mask}
   directory mask = {dir_mask}"""

    return render_template_string(HTML_TEMPLATE, smb_conf=smb_conf, warning=warning,
                                  share_name=share_name, path=path, read_only=read_only,
                                  guest_ok=guest_ok, mask_pattern=mask_pattern,
                                  mask_options=MASK_OPTIONS)

@app.route("/download", methods=["POST"])
def download():
    smb_conf = request.form.get("smb_conf", "")
    buf = BytesIO()
    buf.write(smb_conf.encode("utf-8"))
    buf.seek(0)
    return send_file(buf, as_attachment=True, download_name="smb_add.conf", mimetype="text/plain")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

権限(パーミション)はややこしい

Sambaサービスに限ったことではありませんが、Raspberry Piを使っていて難しいなと感じる1つにファイル権限があります。

macOSでもWindowsでも、あまり気にしないで使えるようになっているため、Linux系を使うと戸惑いますよね。

実はそんなに気にしなくても普段は同じように使えます。ただ、Sambaサービスといった共有に関する仕組みなどではどうしても必要になります。NASの設定も同じですね。

作成したフォルダの権限と、Sambaサービス上での権限を勘違いしてしまうこともあります。

権限の付与は、利用するケースバイケースで答えが1つではないこともややこしく感じられます。

少なくても、この記事に載せたジェネレーターでケアレスミスを防いでください。