সিস্টেমড সহ অটোম্যান্ট ইউএসবি ড্রাইভ


27

আমরা আমাদের সার্ভারগুলি খুব পুরানো ডিস্ট্রো থেকে আধুনিক ডেবিয়ান জেসি ভিত্তিক সিস্টেমে হালনাগাদ / এক্সএফসি এবং অবশ্যই সিস্টেমড (এবং ইউডিস্ক 2) আপডেট করছি upd একটি স্টিকিং পয়েন্ট হ'ল ইউএসবি ড্রাইভগুলি স্বয়ংক্রিয়ভাবে চালানো। আমরা কিছু উদেব বিধি দ্বারা এটি সম্পন্ন করতাম। পুরানো নিয়মগুলি এখনও কাজ করে - মাউন্ট পয়েন্টটি তৈরি হয়ে যায় এবং ড্রাইভটি সূক্ষ্মভাবে মাউন্ট করা হয়, তবে কয়েক সেকেন্ড পরে সিস্টেমেড এমন কিছু করছে যা মাউন্টটি ভেঙে দেয়, সুতরাং পরবর্তী অ্যাক্সেসের প্রচেষ্টাগুলির ফলে "ট্রান্সপোর্ট এন্ডপয়েন্টটি সংযুক্ত নয়" ত্রুটি হয়।

কমান্ড লাইনের মাধ্যমে ড্রাইভটি ম্যানুয়ালি মাউন্ট করা ভাল কাজ করে। সুতরাং একটি ফাইল পরিচালক (thunar এবং thunar-volman, যা পরিবর্তে udisks2 ব্যবহার করে) দেয়। তবে সেগুলি ব্যবহারযোগ্য বিকল্প নয় - এই সিস্টেমগুলি বেশিরভাগ মাথা বিহীন চালায়, তাই থুনার সাধারণত চলমান হয় না। অপ্রয়োজনীয় ক্রোন-ভিত্তিক ব্যাকআপগুলির জন্য আমাদের ডিস্ক ড্রাইভগুলি প্লাগ ইন করতে সক্ষম হওয়া দরকার।

আমি ভেবেছিলাম যে মাউন্ট সম্পাদন করার আগে কয়েক সেকেন্ড অপেক্ষা করে এমন কোনও বিচ্ছিন্ন চাকরীর জন্য ইউদেব স্ক্রিপ্টটি সংশোধন করা কৌশলটি করতে পারে তবে সিস্টেমড এটি আটকাতে পারে না - এটি এখনও কোনওভাবে আলাদা করার আগে অপেক্ষা করার অপেক্ষা করে আছে অব্যাহত।

সম্ভবত udev স্ক্রিপ্ট টিকল udisks2 কোনভাবে সঠিক পন্থা? আমি হারাতে আছি, সুতরাং যে কোনও পরামর্শই প্রশংসিত।


1
শুধুমাত্র স্পর্শকাতরভাবে সম্পর্কিত, কিন্তু ... আপনি সার্ভারে xfce রাখছেন?
পার্থিয়ান শট

আহ, আমি "সার্ভার" শব্দটি বরং শিথিলভাবে ব্যবহার করেছি ... সিস্টেমের সাথে সমস্ত ব্যবহারকারীর ইন্টারঅ্যাকশনটি একটি ওয়েব অ্যাপ্লিকেশনটির মাধ্যমে হয়, যা সাধারণত নেটওয়ার্কের মাধ্যমে একটি ব্রাউজারের মাধ্যমে অ্যাক্সেস করা হয়। তবে কিছু গ্রাহকরা একটি নন-নেটওয়ার্ক সমাধান পছন্দ করেন, তাই আমরা ক্রোমকে এক ধরণের কিওস্ক মোডে কনসোলে চালাই। (এটি নেটওয়ার্ক কনফিগারেশনের সমস্যাগুলি ডিবাগ করার পক্ষেও কার্যকর, আপনি একটি মনিটর / মাউস / কীবোর্ড প্লাগ করতে পারেন এবং লিনাক্স লগইন শংসাপত্রের প্রয়োজন ছাড়াই ওয়েব অ্যাপ্লিকেশনটিতে প্রাথমিক ডায়াগনস্টিক সরঞ্জামগুলিতে অ্যাক্সেস করতে পারেন)। লাইটডিএম / এক্সএফএসের চেয়ে হালকা ওজনের সমাধান সম্ভবত রয়েছে, তবে এটি সেটআপ করা সহজ ছিল ...
মাইক ব্ল্যাকওয়েল

যে কেউ চায় সিস্টেমড-উদেব সরাসরি স্ক্রিপ্ট চালানোর নিয়ম করে: আমার কাছে এটি ছিল; এটি কিছুক্ষণের জন্য কাজ করেছিল, তবে কোনও এক সময় স্ক্রিপ্টটি চালানো বন্ধ করে দেয় যদি উদেবড স্বয়ংক্রিয়ভাবে শুরু হয়ে যায়। কমান্ড লাইন থেকে থামুন এবং পুনরায় চালু করুন, এবং এটি ভাল হবে। সর্বোপরি, এটি কখনই এনটিএফএস + ফুস-এর সাথে ভালভাবে কাজ করেনি কারণ উদেব সনাক্ত করেছেন যে এটির দীর্ঘকাল ধরে চলমান একটি শিশু প্রক্রিয়া রয়েছে (এনটিএফএস -3 জি) এবং 60 এর দশকের পরেও এটি হত্যা করেছে। নীচের লাইন: udev নিয়ম করে সরাসরি স্ক্রিপ্ট চালানো সময় নষ্ট হয়। উত্তরে উল্লিখিত হিসাবে পরিবর্তে udev নিয়ম এবং একটি সিস্টেমযুক্ত পরিষেবা সহ যান। তারপরে আপনাকে নেমস্পেস (মাউন্টফ্ল্যাগস = ক্রীতদাস) এর সাথে কারও কারও কারও কারও কারও কারও কারওর মধ্যে পড়তে হবে না।
চিহ্নিত করুন

আমার অনুরূপ একটি স্ক্রিপ্টের সমস্যা ছিল যা ইউদেব নেটওয়ার্ক সংযোগ তৈরি করতে সক্ষম না হয়ে শুরু হয়েছিল। সিস্টেমড ব্যবহারের নীচের সমাধানটি এর জন্যও কাজ করেছে - ধন্যবাদ!
কোয়ান্টিন স্টাফর্ড-ফ্রেজার

উত্তর:


28

বেশ কয়েকটি মিথ্যা শুরুর পরে আমি এটি বের করেছিলাম। কীটি হ'ল উদেব এবং মাউন্টিং স্ক্রিপ্টের মধ্যে একটি সিস্টেমড ইউনিট পরিষেবা যুক্ত করা।

(রেকর্ডের জন্য, আমি udisks2 ব্যবহার করে এই কাজটি করতে সক্ষম হইনি (যেমন কোনও কিছুর মাধ্যমে udisksctl mount -b /dev/sdb1) হয় সরাসরি উদেব নিয়ম থেকে বা সিস্টেমড ইউনিট ফাইল থেকে ডাকা হয় There এখানে একটি জাতি শর্ত বলে মনে হচ্ছে এবং ডিভাইস নোডটি বেশ প্রস্তুত নয় , ফলে Error looking up object for device /dev/sdb1। দু: খজনক, যেহেতু udisks2 সব যত্ন নিতে মাউন্ট পয়েন্ট messyness পারে ...)

ভারী উত্তোলন একটি শেল স্ক্রিপ্ট দ্বারা সম্পন্ন হয়, যা মাউন্ট পয়েন্টগুলি তৈরি এবং অপসারণ এবং ড্রাইভগুলি মাউন্ট এবং আনমাউন্টিংয়ের যত্ন নেয়।

/usr/local/bin/usb-mount.sh

#!/bin/bash

# This script is called from our systemd unit file to mount or unmount
# a USB drive.

usage()
{
    echo "Usage: $0 {add|remove} device_name (e.g. sdb1)"
    exit 1
}

if [[ $# -ne 2 ]]; then
    usage
fi

ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"

# See if this drive is already mounted, and if so where
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')

do_mount()
{
    if [[ -n ${MOUNT_POINT} ]]; then
        echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}"
        exit 1
    fi

    # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
    eval $(/sbin/blkid -o udev ${DEVICE})

    # Figure out a mount point to use
    LABEL=${ID_FS_LABEL}
    if [[ -z "${LABEL}" ]]; then
        LABEL=${DEVBASE}
    elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then
        # Already in use, make a unique one
        LABEL+="-${DEVBASE}"
    fi
    MOUNT_POINT="/media/${LABEL}"

    echo "Mount point: ${MOUNT_POINT}"

    /bin/mkdir -p ${MOUNT_POINT}

    # Global mount options
    OPTS="rw,relatime"

    # File system type specific mount options
    if [[ ${ID_FS_TYPE} == "vfat" ]]; then
        OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
    fi

    if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then
        echo "Error mounting ${DEVICE} (status = $?)"
        /bin/rmdir ${MOUNT_POINT}
        exit 1
    fi

    echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****"
}

do_unmount()
{
    if [[ -z ${MOUNT_POINT} ]]; then
        echo "Warning: ${DEVICE} is not mounted"
    else
        /bin/umount -l ${DEVICE}
        echo "**** Unmounted ${DEVICE}"
    fi

    # Delete all empty dirs in /media that aren't being used as mount
    # points. This is kind of overkill, but if the drive was unmounted
    # prior to removal we no longer know its mount point, and we don't
    # want to leave it orphaned...
    for f in /media/* ; do
        if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
            if ! /bin/grep -q " $f " /etc/mtab; then
                echo "**** Removing mount point $f"
                /bin/rmdir "$f"
            fi
        fi
    done
}

case "${ACTION}" in
    add)
        do_mount
        ;;
    remove)
        do_unmount
        ;;
    *)
        usage
        ;;
esac

পরিবর্তে, স্ক্রিপ্টটি সিস্টেমড ইউনিট ফাইল দ্বারা ডাকা হয়। আমরা "@" ফাইলের নাম সিনট্যাক্স ব্যবহার করি যাতে আমরা ডিভাইসের নামটিকে একটি আর্গুমেন্ট হিসাবে পাস করতে পারি।

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

[Unit]
Description=Mount USB Drive on %i
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/usb-mount.sh add %i
ExecStop=/usr/local/bin/usb-mount.sh remove %i

অবশেষে, কিছু udev নিয়ম হটপ্লাগ / আনপ্লাগে সিস্টেমেড ইউনিট পরিষেবা শুরু করে এবং বন্ধ করে দেয়:

/etc/udev/rules.d/99-local.rules

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

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

এই বলে মনে হচ্ছে কৌতুক! এই জাতীয় ডিবাগিংয়ের জন্য বেশ কয়েকটি দরকারী কমান্ড:

  • udevadm control -l debugভার্জোজ লগিং চালু করে /var/log/syslogযাতে আপনি দেখতে পাচ্ছেন কি হচ্ছে।
  • udevadm control --reload-rules আপনি বিধিগুলিতে ফাইলগুলি সংশোধন করার পরে ডির (প্রয়োজনীয় নাও হতে পারে তবে আঘাত করতে পারে না ...)।
  • systemctl daemon-reload আপনি সিস্টেমড ইউনিট ফাইলগুলি সংশোধন করার পরে।

4
কি দারুন. এটা সত্যিই দারুন. ইচ্ছে করে আমি একাধিক উন্নতি দিতে পারতাম! আমি কেবলমাত্র সংশোধন করতে হয়েছিল তা হ'ল আমার সিস্টেমে blkidকোনওটি বের করার মতো মনে হচ্ছে না ID_FS_LABEL, তাই আমি পরিবর্তে নির্মাণের DEVBASEপরিবর্তে কেবল ব্যবহার করেছি । LABELMOUNT_POINT
ট্র্যাভিস গ্রিগস

এটিএ / এসসিএসআই ডিভাইসগুলির সাথে কাজ করার জন্য এই সেটআপটি সংশোধন করা যেতে পারে? দেখুন: serverfault.com/q/825779/297059
user339676

@ ট্রাভিস - আপনি এর udevadmপরিবর্তে ব্যবহার করতে পারেন blkid। এটি আরও তথ্যের পাশাপাশি অতিরিক্ত তথ্য দেয়। (উদাঃ udevadm info --query=property --name=sda1)
ব্যবহারকারী 339676

এটি কোনও ইউএসবি ডিভাইস ইতিমধ্যে সংযুক্ত থাকলে, এটি বুটে ভাল কাজ করে না। কোন ধারনা?
মিশাল আরতাজভ 16

নাল্লব্লবগুলি সেট না করা হলে, আনমাউন্টে, ক্লিনআপটি ত্রুটি তৈরি করতে পারে /usr/bin/find: '/media/*': No such file or directory। ক্লিনআপ if [ "$f" != "/media/*" ]; thenচালানোর আগে একটি অতিরিক্ত চেক ব্যবহার করতে পারে find
প্রো ব্যাকআপ

12

একটি নতুন, সংযোগযুক্ত systemdঅটো-মাউন্ট বিকল্প রয়েছে যা ব্যবহার করা যেতে পারে fstabযা আপনাকে সমস্ত মানকযুক্ত মাউন্ট অনুমতি বিকল্পগুলি ব্যবহার করতে দেয় এবং এটি দেখতে এটির মতো দেখাচ্ছে:

  x-systemd.automount

একটি fstabলাইনে এর উদাহরণ :

  /dev/sdd1   /mnt/hitachi-one     auto     noauto,x-systemd.automount     0 2

noautoবিকল্প তার মানে হবে, বুটে মাউন্ট করা হবে পুরোনো সফ্টওয়্যার সঙ্গে যেমন প্রচেষ্টা করা হবে না autofs

আপনাকে নতুন x-systemd.automountলাইন যুক্ত করার fstabপরে চালানো দরকার:

  sudo systemctl daemon-reload

এবং তারপরে নিম্নলিখিতগুলির মধ্যে একটি বা উভয়ই:

  sudo systemctl restart remote-fs.target
  sudo systemctl restart local-fs.target

এটি সম্পর্কে আরও তথ্যের জন্য:

https://wiki.archlinux.org/index.php/Fstab#Automount_with_systemd


sudo systemctl restart local-fs.targetআমার জন্য কৌতুকটি করেছেন
ফিলিপ গ্যাচড

2

আমি স্ক্রিনটি @ মাইক ব্ল্যাকওয়েল থেকে এখানে পরিবর্তন করেছি:

  • একাধিক অক্ষর বিস্তৃত ডিভাইসের নামগুলি সনাক্ত করুন, কেবলমাত্র /dev/sd[a-z]নয় /dev/sd[a-z]*; সার্ভারগুলির ক্ষেত্রে প্রায়শই স্পিনডেলের সংখ্যা বেশি।
  • এ স্বতঃবাহিত ড্রাইভের তালিকাটি ট্র্যাক করুন /var/log/usb-mount.track
  • usb-mount.sh/var/log/messages ট্যাগ সহ কর্মগুলিতে লগ করুন
  • যে একটি লেবেল নির্ধারিত হয়নি ড্রাইভ এর সাথে সমস্যার জন্য চালানো না বিন্দু মাউন্ট জন্য ডিভাইস ট্যাগ উপসর্গ ডিভাইসের নাম (খালি?): /media/sdd2_usbtest,/media/sdd2_
  • ফাইলগুলি যথাযথভাবে স্থাপনের জন্য মোড়ক স্ক্রিপ্টগুলি অন্তর্ভুক্ত করে এবং প্রয়োজনে পূর্বাবস্থায় ফেরাও

যেহেতু @ মাইক ব্ল্যাকওয়েল ইতিমধ্যে বেশিরভাগ ভারী উত্তোলন কাজ করেছে, তাই আমি এটি পুনরায় লিখতে পছন্দ করি না; সবেমাত্র প্রয়োজনীয় পরিবর্তন হয়েছে। আমি আসল উত্তরের নাম এবং ইউআরআই দেখে তার কাজ স্বীকার করেছি।

এটি https://github.com/raamsri/automount-usb এ সন্ধান করুন


2

বিকেল মাউন্ট , সিস্টেমড এবং মাইক ব্ল্যাকওয়েলের পদ্ধতির ব্যবহার করে আপনি পুরো জিনিসটি সহজ করতে পারেন:

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

[Unit]
Description=Mount USB Drive on %i
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/bin/pmount --umask 000 /dev/%i /media/%i
ExecStop=/usr/bin/pumount /dev/%i

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

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

এইচটিএইচ এবং মাইককে ধন্যবাদ জানাই।


0

আমি ওয়ারেন ইয়ংয়ের উত্তর নিয়ে যাব আমার কিছু পরিবর্তন হয়েছে

আমি কিছু স্থান সুরক্ষা যোগ করেছি কারণ এটি ড্রাইভের পরিবেশের দিক থেকে ত্রুটি দিচ্ছিল।

আমি ইউএসবি ডিস্কের chmod এ একটি বিভাগ যুক্ত করেছি যাতে সমস্ত ব্যবহারকারীদের এনএনটিএফএস বা ভিফ্যাট ডিস্কগুলিতে সম্পূর্ণ অ্যাক্সেস থাকে।

/usr/local/bin/usb-mount.sh

#!/bin/bash

# This script is called from our systemd unit file to mount or unmount
# a USB drive.

usage()
{
    echo "Usage: $0 {add|remove} device_name (e.g. sdb1)"
    exit 1
}

if [[ $# -ne 2 ]]; then
    usage
fi

ACTION="$1"
DEVBASE="$2"
DEVICE="/dev/${DEVBASE}"

# See if this drive is already mounted, and if so where
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')

do_mount()
{
    if [[ -n "${MOUNT_POINT}" ]]; then
        echo "Warning: ${DEVICE} is already mounted at ${MOUNT_POINT}"
        exit 1
    fi

    # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
    # added some sed's to avoid space issues
    eval $(/sbin/blkid -o udev ${DEVICE}|sed 's/=/="/'|sed 's/$/"/')

    # Figure out a mount point to use
    LABEL="${ID_FS_LABEL}"
    if [[ -z "${LABEL}" ]]; then
        LABEL="${DEVBASE}"
    elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then
        # Already in use, make a unique one
        LABEL+="-${DEVBASE}"
    fi
    MOUNT_POINT="/media/${LABEL}"

    echo "Mount point: ${MOUNT_POINT}"

    /bin/mkdir -p "${MOUNT_POINT}"

    # Global mount options
    OPTS="rw,relatime"
    #added a chmod checker for file systems that don't 
    #understand allow all to read write
    CHMOD=no
    # File system type specific mount options
    if [[ ${ID_FS_TYPE} == "vfat" ]]; then
        OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
    #added options I wanted on ntfs
    elif [[ ${ID_FS_TYPE} == "ntfs" ]]; then
        OPTS+=",user,users,umask=000,allow_other"
    else
       CHMOD=yes
    fi

    if ! /bin/mount -o "${OPTS}" ${DEVICE} "${MOUNT_POINT}"; then
        echo "Error mounting ${DEVICE} (status = $?)"
        /bin/rmdir "${MOUNT_POINT}"
        exit 1
    fi


    echo "**** Mounted ${DEVICE} at ${MOUNT_POINT} ****"
    if [ "${CHMOD}" = "yes" ];then
        /usr/bin/find "${MOUNT_POINT}" -type f -exec chmod 0666 {} \;
        /usr/bin/find "${MOUNT_POINT}" -type d -exec chmod 0777 {} \;
    fi
}

do_unmount()
{
    if [[ -z ${MOUNT_POINT} ]]; then
        echo "Warning: ${DEVICE} is not mounted"
    else
        /bin/umount -l ${DEVICE}
        echo "**** Unmounted ${DEVICE}"
    fi

    # Delete all empty dirs in /media that aren't being used as mount
    # points. This is kind of overkill, but if the drive was unmounted
    # prior to removal we no longer know its mount point, and we don't
    # want to leave it orphaned...
    for f in /media/* ; do
        if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
            if ! /bin/grep -q " $f " /etc/mtab; then
                echo "**** Removing mount point $f"
                /bin/rmdir "$f"
            fi
        fi
    done
}

case "${ACTION}" in
    add)
        do_mount
        ;;
    remove)
        do_unmount
        ;;
    *)
        usage
        ;;
 esac

এটি আরও দরকারী করে তুলতে আপনি কয়েকটি শব্দে মূল উত্তর এবং আপনার মধ্যে কী আলাদা তা বর্ণনা করতে চাইতে পারেন। পিএস: ওয়ারেন ইয়ংয়ের কোনও উত্তর ছিল না; সম্ভবত আপনি মাইক ব্ল্যাকওয়েলের উত্তরটি সম্পাদিত করেছেন?
আমির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.