NASが高いので,露地栽培のラズベリーでSambaサーバーをたてた.
RaspPiは内臓ストレージがSDカードなので,外部ストレージをSambaで共有ファイルにする.
最悪RasPiが壊れても外部ストレージなら損傷も少ないという意図もある.
外部ストレージにせざるを得ないので,好きに抜き差しできると嬉しいなNASにしたい.
速度は出ないけど,まあ仕方ない.
基本戦略
- RaspPiはつけっぱなしにする
- 外付けドライブを指す
- 特定のScriptを実行すると共有フォルダにマウントしてWindowsからアクセス可能になる
- 外す時は特定のScriptを実行して外せる
今後したいこと
- VPNで外部からアクセスできるようにする
参考にしたサイト
メインで参考にしたのは,以下のサイト
そのままだと,iOS18以降のiPhoneから読み出し専用アクセスしかできないので,写真のバックアップサーバーとして使えないため,以下も参考にした.
USBのフォーマットはexFAT
とする.
exFAT
はMacとWindwosで共通して使いやすいフォーマット形式であるが,Linuxで扱いには少々めんどくさい.
そもそもexFAT
自体が$ chmod
などのUNIX系システムのパーミッション変更方法に対応していないから,デフォルトではrootユーザーのみがアクセス可能で,一般ユーザがアクセスできないという根本問題がある.
そもそも,Ubuntuカーネル5.4より前ではexfat-fuse
パッケージを入れないとmount
でマウントできない状況だったが,5.4(Ubuntu20.10)以降ではモジュール追加なしで利用可能になった.
それでもexFAT
で一定にしたいので,$ mount
にumask
オプションを付けて対応する.
Samba Install
sudo apt install samba
sudo adduser --system --group --no-create-home samba # sambaアクセス用のアカウント作成
コマンドを少し詳しく解説すると、Ubuntuでユーザーを追加するコマンドはadduserだ。useraddコマンドもあるが、一旦忘れていい。今回は通常ログインに使用するユーザーではなく、Sambaというシステムだけで使用する便宜上のユーザーなので、–systemオプションを付けている。–groupはユーザーと同名のグループを作成するオプションだ。–no-create-homeはその名のとおりで、ホームフォルダー(今回だと/home/samba)を作成しないオプションである。引数の最後には、作成するユーザー名(=グループ名)を付ける。
sudo pdbedit -a samba # Sambaユーザーを作成,パスワードはなしで作成するとラク
USBメモリのマウント
sudo fdisk -l # 接続されているメディアのls
sudo mkdir /mnt/samba # mntにsamba用のディレクトリを作成
#!/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
sudo vim /etc/samba/smb.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
動作確認
sudo testparm
適用
sudo systemctl reload smb
wsdd2
sudo apt install wsdd2 # 補助パッケージ
sudo systemctl enable --now wsdd2.service # 自動起動
WSL からNASアクセス
WindwosからNASにアクセスできない
24h2でセキュリティが上げられたからレギストリエディタで修正しないといけなくなったっぽい.
Windowsくんさぁ….