RaspberryPiによるNSAの作成

NASが高いので，露地栽培のラズベリーでSambaサーバーをたてた．

RaspPiは内臓ストレージがSDカードなので，外部ストレージをSambaで共有ファイルにする．
最悪RasPiが壊れても外部ストレージなら損傷も少ないという意図もある．
外部ストレージにせざるを得ないので，好きに抜き差しできると嬉しいなNASにしたい．
速度は出ないけど，まあ仕方ない．

# 基本戦略

1. RaspPiはつけっぱなしにする
1. 外付けドライブを指す
1. 特定のScriptを実行すると共有フォルダにマウントしてWindowsからアクセス可能になる
1. 外す時は特定のScriptを実行して外せる

# 今後したいこと

* VPNで外部からアクセスできるようにする

# 参考にしたサイト

メインで参考にしたのは，以下のサイト

https://pc.watch.impress.co.jp/docs/column/ubuntu/1501933.html

そのままだと，iOS18以降のiPhoneから読み出し専用アクセスしかできないので，写真のバックアップサーバーとして使えないため，以下も参考にした．

https://note.com/nekotsuki_lab/n/n9ac241f8f4c8

https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_using_network_file_services/assembly_configuring-samba-for-macos-clients_assembly_using-samba-as-a-server#assembly_configuring-samba-for-macos-clients_assembly_using-samba-as-a-server

USBのフォーマットは`exFAT`とする．

https://xtech.nikkei.com/atcl/nxt/column/18/02360/021000003/

`exFAT`はMacとWindwosで共通して使いやすいフォーマット形式であるが，Linuxで扱いには少々めんどくさい．
そもそも`exFAT`自体が`$ chmod`などのUNIX系システムのパーミッション変更方法に対応していないから，デフォルトではrootユーザーのみがアクセス可能で，一般ユーザがアクセスできないという根本問題がある．
そもそも，Ubuntuカーネル5.4より前では`exfat-fuse`パッケージを入れないと`mount`でマウントできない状況だったが，5.4(Ubuntu20.10)以降ではモジュール追加なしで利用可能になった．

https://ytooyama.hatenadiary.jp/entry/2020/06/03/130841

それでも`exFAT`で一定にしたいので，`$ mount`に`umask`オプションを付けて対応する．

https://qiita.com/TetoraTechLab/items/d9fd7eba39f3cc286659

https://xtech.nikkei.com/it/article/COLUMN/20061101/252430/

https://qiita.com/reishisu/items/1943df639fb403a294eb

https://www.linux.digibeatrix.com/archives/501

https://ararabo.jp/2023-06-03/?p=12743

https://qiita.com/y-vectorfield/items/3f64e043ea31ad142167

https://qiita.com/sasayabaku/items/bcfcc37e8a34b00ca6e9

https://zenn.dev/techmadot/articles/linux-tips-exfat

https://atmarkit.itmedia.co.jp/ait/articles/1802/15/news035.html

# Samba Install

```shell
sudo apt install samba
sudo adduser --system --group --no-create-home samba # sambaアクセス用のアカウント作成
```

> コマンドを少し詳しく解説すると、Ubuntuでユーザーを追加するコマンドはadduserだ。useraddコマンドもあるが、一旦忘れていい。今回は通常ログインに使用するユーザーではなく、Sambaというシステムだけで使用する便宜上のユーザーなので、–systemオプションを付けている。–groupはユーザーと同名のグループを作成するオプションだ。–no-create-homeはその名のとおりで、ホームフォルダー(今回だと/home/samba)を作成しないオプションである。引数の最後には、作成するユーザー名(=グループ名)を付ける。

```shell
sudo pdbedit -a samba # Sambaユーザーを作成，パスワードはなしで作成するとラク
```

https://qiita.com/Musapiii/items/4cdbadea41bc9c918fdc

## USBメモリのマウント

```shell
sudo fdisk -l # 接続されているメディアのls
sudo mkdir /mnt/samba # mntにsamba用のディレクトリを作成
```

https://qiita.com/miyamotok0105/items/2baf80cf1c300503bf5d

https://qiita.com/a999/items/ea9766548a73b86fdfea

```shell
#!/bin/bash

# 操作を選択するためのメニュー
echo "現在のボリュームをリストします:"
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,LABEL

# 操作可能なボリュームリストを作成
VOLUMES=($(lsblk -r -o NAME,SIZE,TYPE,MOUNTPOINT,LABEL | grep part | awk '{print $1}'))
VOLUMES_COUNT=${#VOLUMES[@]}

# ボリュームのリストを表示し、マウント状態を表示
echo "操作するボリュームを選択してください (番号を入力):"
echo "0: 何もしない"

for i in "${!VOLUMES[@]}"; do
    DEVICE=${VOLUMES[$i]}
    SIZE=$(lsblk -o NAME,SIZE | grep "$DEVICE" | awk '{print $2}')
    LABEL=$(lsblk -o NAME,LABEL | grep "$DEVICE" | awk '{print $2}')
    MOUNT_POINT=$(lsblk -o NAME,MOUNTPOINT | grep "$DEVICE" | awk '{print $2}')
    
    if [ -z "$LABEL" ]; then
        LABEL="ラベルなし"
    fi

    if [ -z "$MOUNT_POINT" ]; then
        STATUS="未マウント"
    else
        STATUS="マウント済み: $MOUNT_POINT"
    fi
    
    echo "$((i+1)): /dev/$DEVICE ($SIZE, ラベル: $LABEL, $STATUS)"
done

# ユーザーから選択を受け取る
read -p "ボリューム番号を入力してください: " VOLUME_SELECTION

if [ "$VOLUME_SELECTION" -eq 0 ]; then
    echo "何も実行しません。スクリプトを終了します。"
    exit 0
fi

VOLUME_SELECTED=${VOLUMES[$((VOLUME_SELECTION-1))]}

if [ -z "$VOLUME_SELECTED" ]; then
    echo "無効な選択です。スクリプトを終了します。"
    exit 1
fi

# ラベルを取得
LABEL=$(lsblk -o NAME,LABEL | grep "$VOLUME_SELECTED" | awk '{print $2}')
if [ -z "$LABEL" ]; then
    LABEL="無名ボリューム"
fi

# マウントポイントの確認
MOUNT_POINT=$(lsblk -o NAME,MOUNTPOINT | grep "$VOLUME_SELECTED" | awk '{print $2}')

# ボリュームが未マウントの場合、マウントする
if [ -z "$MOUNT_POINT" ]; then
    # マウントポイントのディレクトリを作成
    MOUNT_POINT="/mnt/$LABEL"
    echo "ディレクトリ $MOUNT_POINT を作成します"
    mkdir -p "$MOUNT_POINT"

    # ボリュームをマウント
    echo "/dev/$VOLUME_SELECTED をマウント中: $MOUNT_POINT"
    sudo mount "/dev/$VOLUME_SELECTED" "$MOUNT_POINT"

    # マウント成功確認
    if mount | grep "$MOUNT_POINT" > /dev/null; then
        echo "マウント成功: $MOUNT_POINT"
    else
        echo "マウント失敗: /dev/$VOLUME_SELECTED"
    fi
else
    # ボリュームがマウントされている場合、アンマウントする
    echo "/dev/$VOLUME_SELECTED はすでにマウントされています。アンマウントします。"

    # ボリュームをアンマウント
    echo "アンマウント中: $MOUNT_POINT"
    sudo umount "$MOUNT_POINT"

    # アンマウント成功確認
    if ! mount | grep "$MOUNT_POINT" > /dev/null; then
        echo "アンマウント成功: $MOUNT_POINT"
        # アンマウントした後にディレクトリを削除
        echo "ディレクトリ $MOUNT_POINT を削除します"
        rmdir "$MOUNT_POINT"
    else
        echo "アンマウント失敗: $MOUNT_POINT"
    fi
fi

```

### Samba.conf

```shell
sudo vim /etc/samba/smb.conf
```

```conf
[global]
   guest account = samba

[]
   writeable = yes
   path = /mnt/samba
   create mask = 0664
   directory mask = 0775
   force user = samba
   force group = samba
   guest ok = yes
   guest only = yes

[machu]
   writeable = yes
   path = /srv/samba/machu
   create mask = 0664
   directory mask = 0775
   force user = machu
   force group = machu
```

動作確認

```shell
sudo testparm
```

適用

```shell
sudo systemctl reload smb
```

### wsdd2

```bash
sudo apt install wsdd2 # 補助パッケージ
sudo systemctl enable --now wsdd2.service # 自動起動
```

## WSL からNASアクセス

https://www.samba.gr.jp/project/translation/3.5/htmldocs/manpages-3/mount.cifs.8.html

## WindwosからNASにアクセスできない

24h2でセキュリティが上げられたからレギストリエディタで修正しないといけなくなったっぽい．
Windowsくんさぁ…．

https://www.y-media.co.jp/cms/wp-content/uploads/2024/10/78f6cd7ffc66707c885d495ffca7b48f.pdf