2025年7月30日 星期三

無桌面的rpi開機後,插入USB,沒自動掛載插入的usb

Raspberry Pi(或一般 Linux)預設在無桌面環境(headless 或用 systemd)情況下,插入 USB 裝置後不會自動掛載。這需要額外處理,以下是常見解法:


使用 udev + 腳本自動掛載

udev 是 Linux 處理熱插拔裝置(如 USB)的系統,搭配腳本可實現「插入 USB 時自動掛載」。

步驟:

1. 建立自動掛載腳本

建立檔案 /usr/local/bin/usb-mount.sh

#!/bin/bash LOG="/tmp/usb-mount.log" MOUNT_DIR="/mnt/usb" log() { echo "$(date '+%Y-%m-%d %H:%M:%S'): $1" >> "$LOG" } DEVICE="$1" log "usb-mount.sh triggered for $DEVICE" # 檢查裝置是否合法 if [ -z "$DEVICE" ] || [ ! -b "$DEVICE" ]; then log "ERROR - Invalid or missing device: $DEVICE" exit 1 fi # 等待最多 5 秒讓裝置準備好 for i in {1..5}; do if blkid "$DEVICE" >/dev/null 2>&1; then log "blkid success immediately." break fi log "Waiting for $DEVICE to become ready ($i)..." sleep 1 done # 再確認是否能正確讀 UUID UUID=$(blkid -s UUID -o value "$DEVICE") if [ -z "$UUID" ]; then log "ERROR: Could not get UUID for $DEVICE after wait." exit 1 fi # 檢查檔案系統類型 FSTYPE=$(blkid -s TYPE -o value "$DEVICE") if [ -z "$FSTYPE" ]; then log "ERROR - Could not detect filesystem type for $DEVICE" exit 1 fi log "Detected filesystem type: $FSTYPE" # 檢查是否已掛載 if mount | grep -q "$DEVICE"; then log "$DEVICE is already mounted." exit 0 fi # 確保掛載點存在且清空 if mountpoint -q "$MOUNT_DIR"; then log "$MOUNT_DIR already mounted, unmounting first." umount -l "$MOUNT_DIR" fi # 建立掛載目錄 if [ ! -d "$MOUNT_DIR" ]; then mkdir -p "$MOUNT_DIR" log "Created mount point directory: $MOUNT_DIR" fi # 執行掛載 if mount -t "$FSTYPE" "$DEVICE" "$MOUNT_DIR"; then # 驗證掛載點有內容 if [ "$(ls -A "$MOUNT_DIR")" ]; then log "Mount successful and directory is not empty: $MOUNT_DIR" else log "Mount point $MOUNT_DIR is EMPTY after mounting!" fi else log "ERROR - Mount failed for $DEVICE" rmdir "$MOUNT_DIR" exit 1 fi

讓它可執行:

sudo chmod +x /usr/local/bin/usb-mount.sh

2. 建立 service

sudo nano /etc/systemd/system/usb-mount@.service

[Unit]
Description=Mount USB device %i
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/usb-mount.sh /dev/%i

3. 建立 udev 規則

建立一個 udev 規則檔:

sudo nano /etc/udev/rules.d/99-usb-mount.rules

內容如下(針對一般 USB 隨身碟):

ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/systemctl start usb-mount@%k.service"

這表示:當插入的裝置符合 sdX1 這類裝置(通常是 USB 隨身碟分割區),就呼叫你寫的掛載腳本。


4. 重新載入 udev 規則

sudo udevadm control --reload-rules

sudo udevadm trigger


5. 測試:插入 USB

插入 USB 隨身碟後,它應該會自動掛載到 /mnt/usb,可用 ls /mnt/usb 查看。


Debug

udevadm test 模擬觸發(重點)

找出你的裝置 node(如 /dev/sda1 對應 /sys/block/sda/sda1):

測試指令
sudo udevadm test /sys/block/sda/sda1

插入後執行

dmesg | tail -n 20

沒有留言:

張貼留言