メインコンテンツまでスキップ

【Linux】Raspberry Pi 4のSambaサーバへiPhoneの純正アプリから接続する

· 約5分
ogumaru

概要

Raspberry Pi 4 を利用して LAN 内に Samba サーバを構築し、iPhone に標準でインストールされている「ファイル」アプリからの接続を行う

環境

項目内容
クライアント機種iPhone 8 Plus
クライアント OSiOS 15.6.1
サーバ機種Raspberry Pi 4 Model B

Raspberry Pi OS はバージョンがないらしいため下記で確認

(ベータ版で出た 64-bit の OS を入れた記憶がある)

uname -a
# > Linux raspberrypi 5.10.103-v8+ #1529 SMP PREEMPT Tue Mar 8 12:26:46 GMT 2022 aarch64 GNU/Linux
lsb_release -a
# > No LSB modules are available.
# > Distributor ID: Debian
# > Description: Debian GNU/Linux 10 (buster)
# > Release: 10
# > Codename: buster
samba --version
# > Version 4.9.5-Debian

準備

Samba パッケージ

sudo apt update
sudo apt install samba
# iOS や macOSでも利用する場合
sudo apt install samba-vfs-modules

ユーザ

ここはSamba - ArchWiki (wiki.archlinux.jp)を参考に設定した

# Sambaユーザの追加
sudo pdbedit -a "$(whoami)"

# `usershare path` で指定する`/var/lib/samba/usershares` にアクセスするため
# (所有者:グループ が root:sambashare になっている)
sudo gpasswd sambashare -a "$(whoami)"

グループ設定を反映させるため再ログインする

ファイアウォール

Firewalling Samba (www.samba.org)によると、許可するのは下記

プロトコルポート
UDP137
UDP138
TCP139
TCP445

ufwを利用していれば下記

# Samba のルールがあれば利用
sudo ufw app list | grep -i samba
sudo ufw allow samba

Samba の設定

グローバル設定ファイル

# 設定ファイルのバックアップ
sudo cp -a /etc/samba/smb.conf{,.$(date '+%Y-%m-%d_%H%M%S').bak}

# 下記差分を追記
sudoedit /etc/samba/smb.conf
[global]
+ usershare path = /var/lib/samba/usershares
+ # For supporting iOS / macOS
+ vfs objects = fruit streams_xattr
+ fruit:metadata = stream
+ fruit:model = MacSamba
+ fruit:posix_rename = yes
+ fruit:veto_appledouble = no
+ fruit:nfs_aces = no
+ fruit:wipe_intentionally_left_blank_rfork = yes
+ fruit:delete_empty_adfiles = yes

上記のvfsfruitの設定がないと、保存の際に「操作を完了できませんでした」「属性が見つかりません」のようなエラーメッセージが表示される

VFS 関連の設定内容については下記ページのものを利用した

Configure Samba to Work Better with Mac OS X - SambaWiki (wiki.samba.org)

共有設定ファイル

# 共有するディレクトリの作成
mkdir -p ~/share

# 共有設定ファイルの作成
net usershare add "share" ~/share/ "samba share" "$(whoami):f"

権限の設定については net (www.samba.org)などを参考に指定する

The definition of a user defined share acl is: "user:permission", where user is a valid username on the system and permission can be "F", "R", or "D". "F" stands for "full permissions", ie. read and write permissions. "D" stands for "deny" for a user, ie. prevent this user from accessing this share. "R" stands for "read only", ie. only allow read access to this share (no creation of new files or directories or writing to files).

設定の反映

sudo systemctl reload smbd.service

接続

mDNS で名前解決ができれば、同じネットワークにつないだ上で iOS の「ファイル」から

  1. [ブラウズ]
  2. 右上の丸で囲まれた三点(…)
  3. [サーバへ接続]
  4. raspberrypi.localなど
  5. [登録ユーザ] を選択
  6. Raspberry Pi のユーザ情報を入力

で接続できる

例えば写真は共有から「"ファイル"に保存」から上記フォルダを選択することで保存できる

当初 VFS 関連(vfsfruit)を設定しておらず、ここで保存ができずに困ってかなり時間を使った

パフォーマンスについて

1MB の画像をコピーするのに 体感で 1 秒程度

10MB の動画をコピーするのに 体感で 2 〜 3 秒程度

SSD を接続した USB ブートで利用しているため、Raspberry Pi 環境の中では比較的 I/O は早いはず

microSD 環境ではもう少し遅いかもしれない