Debian linux上基于shell的磁盘与Samba管理

我重新整理了我的家用i3的小主机,在128G的固态上安装了debian的命令行系统,并且配置好了默认的静态ip连接到WiFi。我现在想将里面的两个闲置的500G硬盘作为自己的家用云盘使用,并且用samba开启共享盘。

挂载磁盘

这里是一个挂载磁盘的shell脚本。

#!/bin/bash
# ==============================================================================
# 脚本名称: setup_storage.sh
# 作用: 格式化两块500G硬盘为ext4,并使用MergerFS合并为1TB逻辑存储池
# ==============================================================================
set -e

# 确保以 root 权限运行
if [ "$EUID" -ne 0 ]; then
  echo "[-] 请使用 root 权限运行此脚本: sudo bash $0"
  exit 1
fi

echo "==================== 当前系统磁盘布局 ===================="
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL
echo "=========================================================="
echo "请仔细查看上方列表,找到你的两块 500G 机械硬盘名称(例如: sdb 和 sdc)。"
echo "【警告】:切勿填入系统盘(带有 / 挂载点的盘)!"
echo ""

read -p "请输入第一块500G硬盘的名称 (例如 sdb): " DISK1_NAME
read -p "请输入第二块500G硬盘的名称 (例如 sdc): " DISK2_NAME

DISK1="/dev/$DISK1_NAME"
DISK2="/dev/$DISK2_NAME"

if [ ! -b "$DISK1" ] || [ ! -b "$DISK2" ]; then
    echo "[-] 错误: 指定的磁盘设备不存在,请核对名称。"
    exit 1
fi

echo ""
echo "即将格式化的磁盘: $DISK1 和 $DISK2"
read -p "此操作将抹除这两块盘上的全部数据,确认继续吗?(yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
    echo "[-] 用户取消操作。"
    exit 0
fi

# 1. 安装基础依赖
echo "[+] 正在更新软件源并安装 mergerfs 及格式化工具..."
apt update
apt install -y mergerfs parted e2fsprogs

# 2. 格式化硬盘为 ext4 (单分区,GPT)
format_disk() {
    local target_disk=$1
    echo "[+] 正在处理磁盘: $target_disk"
    # 创建 GPT 分区表
    parted -s "$target_disk" mklabel gpt
    # 建立主分区占满整个盘
    parted -s "$target_disk" mkpart primary ext4 0% 100%
    sleep 2
    # 格式化分区
    mkfs.ext4 -F "${target_disk}1"
}

format_disk "$DISK1"
format_disk "$DISK2"

# 3. 创建挂载点
echo "[+] 创建挂载目录..."
mkdir -p /mnt/disk1
mkdir -p /mnt/disk2
mkdir -p /mnt/storage

# 4. 获取 UUID
UUID1=$(blkid -s UUID -o value "${DISK1}1")
UUID2=$(blkid -s UUID -o value "${DISK2}1")

echo "[+] 磁盘 1 UUID: $UUID1"
echo "[+] 磁盘 2 UUID: $UUID2"

# 5. 配置 /etc/fstab 自动挂载
echo "[+] 备份 /etc/fstab..."
cp /etc/fstab /etc/fstab.bak.$(date +%F_%T)

echo "[+] 写入 /etc/fstab 自动挂载配置..."
# 清理可能存在的旧配置
sed -i '/\/mnt\/disk/d' /etc/fstab
sed -i '/\/mnt\/storage/d' /etc/fstab

cat <<EOF >> /etc/fstab

# --- MergerFS Storage Pool ---
UUID=$UUID1  /mnt/disk1  ext4  defaults,noatime  0  2
UUID=$UUID2  /mnt/disk2  ext4  defaults,noatime  0  2
/mnt/disk1:/mnt/disk2  /mnt/storage  fuse.mergerfs  defaults,allow_other,use_ino,cache.files=off,category.create=mfs,minfreespace=10G,fsname=mergerfsPool  0  0
EOF

# 说明:
# category.create=mfs (Most Free Space): 写入新文件时,自动选择剩余空间最多的那块盘,实现天然负载均衡。
# minfreespace=10G: 硬盘剩余低于10G时自动转向另一块盘。

# 6. 测试并挂载
echo "[+] 挂载所有磁盘..."
mount -a

echo "[+] 赋予 /mnt/storage 读写权限..."
chmod -R 777 /mnt/storage
systemctl daemon-reload

echo "==================== 存储池配置完成 ===================="
df -h /mnt/disk1 /mnt/disk2 /mnt/storage
echo "=========================================================="
echo "现在 /mnt/storage 已具备约 1TB (500G+500G) 容量!"

将上面的脚本保存到/tmp/setup_storage.sh,然后使用sudo bash /tmp/setup_storage.sh。按脚本提示输入信息即可。

局域网samba共享

这是一个设置samba共享的shell脚本。

#!/bin/bash
# ==============================================================================
# 脚本名称: setup_samba.sh (优化安全版)
# 作用: 部署 Samba 服务并将 /mnt/storage/shared 共享给局域网
# ==============================================================================
set -e

if [ "$EUID" -ne 0 ]; then
  echo "[-] 请使用 root 权限运行此脚本: sudo bash $0"
  exit 1
fi

SHARE_PATH="/mnt/storage/shared"

# 1. 安全检查:确认存储池挂载
if ! mountpoint -q /mnt/storage; then
    echo "[-] 【致命错误】检测到 /mnt/storage 尚未挂载!"
    echo "[-] 退出安装,防止数据错误写入 128G 系统固态盘。请检查 storage 脚本。"
    exit 1
fi

# 2. 交互输入配置
read -p "请输入你要创建的 Samba 访问用户名 (默认: nas): " SAMBA_USER
SAMBA_USER=${SAMBA_USER:-nas}

echo "[+] 正在安装 Samba..."
apt update
apt install -y samba

# 3. 创建系统专用映射用户
if ! id "$SAMBA_USER" &>/dev/null; then
    echo "[+] 创建系统专属数据用户: $SAMBA_USER"
    useradd -M -s /usr/sbin/nologin "$SAMBA_USER"
fi

# 4. 设置 Samba 密码
echo "[+] 请为 Samba 用户 [$SAMBA_USER] 设置密码(终端输入不显示):"
smbpasswd -a "$SAMBA_USER"

# 5. 显式判断共享文件夹是否存在
if [ -d "$SHARE_PATH" ]; then
    echo "[*] 共享目录已存在: $SHARE_PATH,直接复用。"
    chown "$SAMBA_USER:$SAMBA_USER" "$SHARE_PATH"
    chmod 775 "$SHARE_PATH"
else
    echo "[+] 共享目录不存在,正在新建: $SHARE_PATH"
    mkdir -p "$SHARE_PATH"
    chown "$SAMBA_USER:$SAMBA_USER" "$SHARE_PATH"
    chmod 775 "$SHARE_PATH"
fi

# 6. 配置 /etc/samba/smb.conf
echo "[+] 配置 Samba..."
[ -f /etc/samba/smb.conf ] && cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date +%F_%T)

# 如果之前写入过这块配置,先清理,保证幂等性
sed -i '/\[FamilyShare\]/,+10d' /etc/samba/smb.conf

cat <<EOF >> /etc/samba/smb.conf

[FamilyShare]
   comment = Family Storage 1TB
   path = $SHARE_PATH
   browseable = yes
   read only = no
   guest ok = no
   valid users = $SAMBA_USER
   create mask = 0664
   directory mask = 0775
   force user = $SAMBA_USER
EOF

# 7. 重启并激活服务
echo "[+] 启动 Samba 服务..."
systemctl restart smbd nmbd
systemctl enable smbd nmbd

# 8. 防火墙支持
if command -v ufw &>/dev/null; then
    ufw allow samba || true
fi

echo "==================== Samba 配置成功 ===================="
echo "状态: 共享路径 [$SHARE_PATH] 验证正常"
echo "连接地址:"
echo "  - Windows 资源管理器地址栏: \\\\192.168.1.200\\FamilyShare"
echo "  - macOS / iOS 文件App:     smb://192.168.1.200/FamilyShare"
echo "凭据: 用户名 [$SAMBA_USER] / 刚刚设定的密码"
echo "=========================================================="

将上面的脚本保存到/tmp/setup_samba.sh,然后使用sudo bash /tmp/setup_samba.sh。按脚本提示输入信息即可。

💡 个人思考与总结

可选地,在这里可以写一段你对这次对话的个人感悟、验证结果或是总结。

内容声明与版权协议

  • 版权协议:本文采用 CC BY-NC-SA 4.0(署名-非商业性使用-相同方式共享) 协议进行许可。转载、演绎请务必保留作者署名及原文链接,且不得用于商业目的。
  • AI 辅助说明:本博客部分内容(如排版设计、个别局部、特定对话片段等)可能由 AI(LLM大语言模型)辅助生成。作者在此明确声明:本人对文章的核心框架、思想立论与最终呈现拥有绝对主导权与最终解释权。
  • 观点免责:文中明示的由 AI 生成的特定文本、对话输出,仅作为理性探讨以及观点展示,不代表本人真实立场、价值观或事实背书。对于因 AI 幻觉造成的客观事实偏差,请读者审慎甄别。
  • 认知时效性:文章仅代表作者在撰写当下的认知状态与情绪切片。随着个人心智迭代与客观事物发展,作者观点可能发生演变。欢迎基于理性的交流与批评。