私的サーバー構築日誌：Sambaで共有フォルダ公開・Ubuntu 24.04 LTS in MicroServer N54L

## 能書き

[私的サーバー構築日誌：仕切り直し](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6)からの自宅サーバー構築の続きです。

[MicroServer N54L に Ubuntu24.04LTS をインストールしてZFSで使うように設定した](https://qiita.com/katz_engineer/items/bd96a26e0a65ceb28ff7)我が家のファイルサーバですが、今回は Samba でファイル共有します。

と言っても、今回は非常に基本的な設定だけです。ネットを検索すればそこら中に記事が転がっているので、参考文献は示しません。

## 目標

- Ubuntuサーバーのユーザーに対してアクセス権を付けて、Windowsマシンからのアクセス（読み書き、読み出し専用）を確認

## インストール

```console
sudo apt update -y && sudo apt upgrade -y
```

```console
sudo apt install -y samba
```

Sambaサービスが起動した事を確認します。

```console
sudo systemctl status smbd
```

## ユーザー追加

Sambaで使用するユーザーはOSの一般ユーザーです。既に用意したユーザーがあればそれで良いです。
新しく追加するなら、例えば`taro`は下記のようにします。

通常はホームディレクトリ内に用意したサブディレクトリをSambaでそのユーザーだけに公開すると思いますが、今回はファイルサーバーのZFSフォーマットしたディレクトリを公開します。その都合で`taro`にはホームディレクトリを作りません。Samba用ユーザーという事でログインも禁止してみます。

```console
sudo useradd -M -s /usr/sbin/nologin taro
```

そしてSamba用パスワードは`smbpasswd`コマンドを管理者権限で実行して設定します。

```console
sudo smbpasswd -a taro
```

## 共有フォルダを作成

共有対象となるフォルダを作成します。何でもいいのですが、先程作成した`taro`ユーザー用にZFSのフォルダを用意してみます。

```console
cd /mnt/tank
sudo mkdir taro
```

```console
sudo chown taro: taro
```

```console
sudo chmod 777 taro
```

## 設定・読み出し専用

いよいよSambaの設定です。`/etc/samba/smb.conf`ファイルを修正します。

まずは読み出し専用で設定してみます。

```console
cat <<___ | sudo tee -a /etc/samba/smb.conf >/dev/null
[taro]
path = /mnt/tank/taro
browsable = yes
guest ok = no
read only = yes
___
```

色んな記事にはここで`smbd`を再起動して反映と書いてありますが、実際にやってみると再起動不要のようです。`/etc/samba/smb.conf`を書くといきなり利用可能になりました。

※後述しますが、`smbd`はちゃんと再起動するのが正しいようです。

Windowsマシンからエクスプローラーで`\\172.16.1.3`（172.16.1.3は我が家のファイルサーバーのIPアドレス）を開いてみます。

実験で、ファイルを作成してみます。

```console:サーバー側
echo "test" > /mnt/tank/taro/test.txt
sudo chown taro: /mnt/tank/taro/test.txt
```

クライアント側（Windowsマシン）で表示を更新すると、test.txtが表示されます。が、編集しても保存できません。
新しいテキストドキュメントなどを作成しようとしても権限不足のエラーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/1c75c7ad-4873-696d-6cb8-f5ccd3fc354f.png)

これは正しい挙動ですね。

以上で読み出し専用の設定が出来ました。

## 設定・読み書き可能

先程の`/etc/samba/smb.conf`の`read only`を`no`に変えます。

```console
sudo sed -i -e '/^read only =/c read only = no' /etc/samba/smb.conf
```

今度は書き換えただけでは反映しませんでした。きちんと`smbd`を再起動しましょう。

```console
sudo systemctl restart smbd
```

今度はクライアント側（Windowsマシン）でtest.txtも編集できますし、新しいファイルも作成できます。

## 仕舞い

しまった。Subversion登録を忘れてました。

まずは追加分の確認から。

```console
sudo svn st /etc
```

予想以上に大量のファイルが追加されてました。参った。

```console
$ sudo svn st /etc
?       /etc/alternatives/tdbbackup
?       /etc/alternatives/tdbbackup.8.gz
?       /etc/apparmor.d/samba
M       /etc/group
M       /etc/gshadow
?       /etc/init.d/nmbd
?       /etc/init.d/samba-ad-dc
?       /etc/init.d/smbd
M       /etc/ld.so.cache
?       /etc/pam.d/samba
M       /etc/passwd
?       /etc/rc0.d/K01nmbd
?       /etc/rc0.d/K01samba-ad-dc
?       /etc/rc0.d/K01smbd
?       /etc/rc1.d/K01nmbd
?       /etc/rc1.d/K01samba-ad-dc
?       /etc/rc1.d/K01smbd
?       /etc/rc2.d/S01nmbd
?       /etc/rc2.d/S01samba-ad-dc
?       /etc/rc2.d/S01smbd
?       /etc/rc3.d/S01nmbd
?       /etc/rc3.d/S01samba-ad-dc
?       /etc/rc3.d/S01smbd
?       /etc/rc4.d/S01nmbd
?       /etc/rc4.d/S01samba-ad-dc
?       /etc/rc4.d/S01smbd
?       /etc/rc5.d/S01nmbd
?       /etc/rc5.d/S01samba-ad-dc
?       /etc/rc5.d/S01smbd
?       /etc/rc6.d/K01nmbd
?       /etc/rc6.d/K01samba-ad-dc
?       /etc/rc6.d/K01smbd
?       /etc/samba
M       /etc/shadow
M       /etc/subgid
M       /etc/subuid
?       /etc/systemd/system/multi-user.target.wants/nmbd.service
?       /etc/systemd/system/multi-user.target.wants/samba-ad-dc.service
?       /etc/systemd/system/multi-user.target.wants/smbd.service
?       /etc/systemd/system/nmb.service
?       /etc/systemd/system/samba.service
?       /etc/systemd/system/smb.service
?       /etc/ufw/applications.d/samba
```

個別に拾い上げるのも面倒なので、全部まとめて（今回の`taro`ユーザーも含めて）追加してしまいましょう。

```console
cd /etc
sudo svn st | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -rt svn add
```

コミット。

```console
sudo svn ci -m"added samba and the test user 'taro'"
```

これで一通り完了です。基本的なディレクトリ公開だけなら簡単でした。