[Dev] ubuntuにusbハードディスク(FAT32)を接続してみる

in #japaneselast month (edited)

こんにちは、@yasuです。

後で、もっと楽な方法があることに気づく。

USBハードディスクを接続したら、
接続を確認して、フォルダを追加して、マウントする操作が必要。

ただし、デスクトップを起動していれば、自動でマウントしてくれる。

Ubuntu Desktop環境の場合(ターミナルで外部接続)

なんの設定も必要ない。
USBハードディスクを接続すると、

lsblk
image.png

image.png




Ubuntu Desktop環境(ただし、ログインしていない状態)の場合(ターミナルで外部接続)

確認
lsblk
image.png

マウント
udisksctl mount -b /dev/sdb1
image.png

確認
lsblk
image.png

※アンマウントコマンド
udisksctl unmount -b /dev/sdb1




現在の環境がUbuntu Desktop環境なので、以下の内容は参考まで。




Ubuntu Server環境の場合(手動)

lsblk
USBハードディスクを接続した状態。認識している
image.png

ディレクトリ作成
sudo mkdir -p /mnt/usb
image.png

マウント
sudo mount -t vfat /dev/sdb1 /mnt/usb -o uid=steem,gid=steem,umask=077
image.png




Ubuntu Server環境の場合(自動)

自動マウントスクリプト作成
sudo nano /usr/local/bin/usb_mount.sh

#!/bin/bash
# usb_mount.sh
# usage: usb_mount.sh <device_name> <add|remove>

DEV="/dev/$1"
MOUNT_POINT="/mnt/usb"
LOGFILE="/var/log/usb_mount.log"
USER_NAME="steem"
GROUP_NAME="steem"

export PATH=/usr/sbin:/sbin:/usr/bin:/bin

# ログ関数
log() {
    echo "$(date '+%F %T') - $1" >> "$LOGFILE"
}

case "$2" in
    add)
        # デバイスが準備されるまで最大10秒待つ
        for i in {1..20}; do
            [ -b "$DEV" ] && break
            sleep 0.5
        done

        if [ ! -b "$DEV" ]; then
            log "Device $DEV not ready"
            exit 1
        fi

        mkdir -p "$MOUNT_POINT"

        # マウント
        if mountpoint -q "$MOUNT_POINT"; then
            log "$MOUNT_POINT already mounted"
        else
            if mount -t vfat "$DEV" "$MOUNT_POINT" -o uid=$USER_NAME,gid=$GROUP_NAME,umask=077 >> "$LOGFILE" 2>&1; then
                log "Mounted $DEV at $MOUNT_POINT"
            else
                log "Mount failed for $DEV"
                exit 1
            fi
        fi
        ;;
    remove)
        # マウント解除
        if mountpoint -q "$MOUNT_POINT"; then
            umount -l "$MOUNT_POINT" >> "$LOGFILE" 2>&1
            log "Unmounted $MOUNT_POINT"
        else
            log "$MOUNT_POINT not mounted"
        fi

        # マウントポイント削除
        if [ -d "$MOUNT_POINT" ]; then
            rm -rf "$MOUNT_POINT"
            log "Removed $MOUNT_POINT"
        fi
        ;;
    *)
        echo "Usage: $0 <device_name> <add|remove>"
        exit 1
        ;;
esac

udevルールを作成と反映
sudo nano /etc/udev/rules.d/99-usb-mount.rules

# USB接続時に systemd サービス呼び出し
#ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[b-z][0-9]", TAG+="systemd", ENV{SYSTEMD_WANTS}="usb-mount@%k.service"
#ACTION=="remove", SUBSYSTEM=="block", KERNEL=="sd[b-z][0-9]", TAG+="systemd", ENV{SYSTEMD_WANTS}="usb-mount@%k.service"

反映

sudo udevadm control --reload
sudo udevadm trigger

USB マウントサービスの作成と起動
/etc/systemd/system/usb-mount@.service

[Unit]
Description=USB auto mount for device %I
After=dev-%i.device
BindsTo=dev-%i.device

[Service]
Type=oneshot
ExecStart=/usr/local/bin/usb_mount.sh %I add
ExecStop=/usr/local/bin/usb_mount.sh %I remove
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

systemctl start usb-mount@sdb1.service
systemctl status usb-mount@sdb1.service

image.png