ファイルを介したUSBマウント

ファイルを介したUSBマウント

私のシステムに複数のUSBが接続されています。特定の.iniファイルが含まれているか空のUSB(この場合は.iniファイルを作成したい場合)を見つけて、/media/mount_pointにマウントしたいと思います。そのUSBがない場合は何もインストールしないでください。

各USBに対して次のスクリプトを実行するudevルールを作成しました。

#!/bin/sh

LOGFILE="/home/user/mount.log"
MOUNTDIRECTORY="/media/mount_point"

if [ -z "$DEVNAME" ]; then
  exit
fi

echo "USB device detected at $DEVNAME" >> $LOGFILE

if grep '$MOUNTDIRECTORY ' /proc/mounts; then
  # Already mounted
  echo "Mount directory already in use" >> $LOGFILE
  exit
fi

mount $DEVNAME $MOUNTDIRECTORY -o umask=0000,gid=1000,uid=1000 &>> $LOGFILE

if [ $? -eq 0 ]; then
    echo "$DEVNAME mounted at $MOUNTDIRECTORY" >> $LOGFILE
    if [ -f $MOUNTDIRECTORY/log.ini ]; then
        echo "Log.ini found. Ready to log" >> $LOGFILE
        break
    elif [ -z "$(ls -A $MOUNTDIRECTORY)" ]; then
        echo "USB device empty. Creating log.ini" >> $LOGFILE
        touch $MOUNTDIRECTORY/log.ini
        break
    else
        umount $MOUNTDIRECTORY
    fi
else
    echo "Failed to mount $DEVNAME at $MOUNTDIRECTORY" >> $LOGFILE
fi

echo "" >> $LOGFILE

.iniが存在する場合は機能します(systemd-udevd.service編集後)。この問題)、しかし空のUSBが見つかった場合はそうではありません。 $LOGFILE 出力では .ini が生成されたと報告しますが、確認してみるとマウントされたデバイスに .ini ファイルがありません。削除すると、マウントポイントに.iniファイルが作成されたことがわかります。

.iniファイルがマウントされたUSBの代わりにマウントポイントにあるのはなぜですか?この問題をどのように解決できますか?

それとも、この問題に対するudevよりも優れたアプローチはありますか?

答え1

満足のいく解決策が見つかりました。

udevから直接マウントする代わりに、提案されているように新しいサービスを作成しました。この問題。最後に私はこのudevルールを得ました:

ACTION=="add",<Your device specifiers here>,ENV{SYSTEMD_WANTS}="log@$env{DEVPATH}.service"

次のサービスが追加されました/etc/systemd/system

[Service]
Type=oneshot
TimeoutStartSec=300
GuessMainPID=false
RemainAfterExit=yes
ExecStart=/bin/bash -c "/home/user/mount.sh %I"

私のスクリプトを次のように修正しました。

#!/bin/sh

LOGFILE="/home/user/mount.log"
MOUNTDIRECTORY="/media/mount_point"
DEVPATH=$1
BASENAME="$(basename $DEVPATH)"
DEVICE="/dev/$BASENAME"

if [ -z "$BASENAME" ]; then
  exit
fi

echo "" >> $LOGFILE
echo "New USB device detected at $DEVICE" >> $LOGFILE

if grep '$MOUNTDIRECTORY ' /proc/mounts; then
  # Already mounted
  echo "Mount directory already in use" >> $LOGFILE
  exit
fi

mount $DEVICE $MOUNTDIRECTORY -o umask=0000,gid=1000,uid=1000 >> $LOGFILE

if [ $? -eq 0 ]; then
    echo "$DEVICE mounted at $MOUNTDIRECTORY" >> $LOGFILE
    if [ -f $MOUNTDIRECTORY/log.ini ]; then
        echo "Log.ini found. Ready to log" >> $LOGFILE
        break
    elif [ -z "$(ls -A $MOUNTDIRECTORY)" ]; then
        echo "USB device empty. Creating log.ini" >> $LOGFILE
        touch $MOUNTDIRECTORY/log.ini
        break
    else
        echo "Log.ini not found. Unmounting" >> $LOGFILE
        umount $MOUNTDIRECTORY
    fi
else
    echo "Failed to mount $DEVICE at $MOUNTDIRECTORY" >> $LOGFILE
fi

echo "" >> $LOGFILE

元の問題の原因はまだ理解されていません(log.iniファイルがマウントされているデバイスの1つではなくマウントポイントに表示されます)。誰でも説明があれば興味があるでしょう。

関連情報