- উবুন্টু সার্ভার ১১.১০ এর জন্য দ্রষ্টব্য: অপ্রচলিত
vol_id
কমান্ডের কারণে এই স্ক্রিপ্টটি উবুন্টু সার্ভার ১১.১০ এ ব্যর্থ হয়েছে । vol_id
দ্বারা দমন করা হয়েছে blkid
। স্ক্রিপ্টটি ঠিক করতে, স্ক্রিপ্টে "blkid -o udev" দ্বারা "vol_id" প্রতিস্থাপন করুন udev-auto-mount.sh
।
আমি কিছুক্ষণের জন্য এদিকে মাথা ঘুরছি, এবং আমি মনে করি আমি একটি কার্যকরী সমাধান খুঁজে পেয়েছি। এটি ডেবিয়ান-ভিত্তিক সিস্টেমে বিকাশিত এবং পরীক্ষিত হয়, সুতরাং এটি উবুন্টুতে কাজ করা উচিত। আমি যে অনুমানগুলি তৈরি করে তা উল্লেখ করব যাতে এটি অন্যান্য সিস্টেমেও মানিয়ে নেওয়া যায়।
- এটি প্লাগইনে স্বয়ংক্রিয়ভাবে ইউএসবি ড্রাইভগুলি মাউন্ট করবে এবং ফায়ারওয়্যারের সাথে মানিয়ে নিতে খুব বেশি কিছু নেওয়া উচিত নয়।
- এটি ইউডিইভি ব্যবহার করে, তাই এইচএল / ডিভাইসকিট / জিনোম-যে কোনও কিছুর সাথে কোনও বানিজ্য নেই।
- এটি স্বয়ংক্রিয়ভাবে
/media/LABEL
ডিভাইসটিতে মাউন্ট করার জন্য একটি ডিরেক্টরি তৈরি করে।
- তবে এটি অন্যান্য অটোমোন্টারগুলিতে হস্তক্ষেপ করতে পারে; আমি এটির জন্য পরীক্ষা করতে পারি না। আমি আশা করি যে, জিনোম-ভিএফএস সক্রিয় হয়ে দু'জনেই মাউন্টটি করার চেষ্টা করতে পারে ... যদি জিনোম-ভিএফএস মাউন্টটি ব্যর্থ হয় তবে এটি কোনও ডেস্কটপ আইকনটি কনফিগার করতে পারে না। জিনোম থেকে আনমাউন্টিং সম্ভব হওয়া উচিত, তবে এর প্রয়োজন হতে পারে
gksudo
বা অনুরূপ হতে পারে ।
আমি এটি সিস্টেম বুটটিতে পরীক্ষা করে দেখিনি, তবে কেবলমাত্র আমি দেখতে পাচ্ছি যে এটি কাজ করবে না এটি হ'ল যদি সিস্টেম মাউন্টগুলির জন্য প্রস্তুত হওয়ার আগে ইউএসবি ড্রাইভ মাউন্ট করার চেষ্টা করে। যদি এটি হয় তবে আপনার সম্ভবত মাউন্ট স্ক্রিপ্টে আরও একটি ত্বক লাগবে। (আমি কোনও পরামর্শ আছে কিনা তা দেখতে সার্ভারফল্টের সাথে যাচাই করছি , তবে সেখানে এটিতে খুব বেশি আগ্রহ নেই))
এটি পরে, তারপর।
ইউডিইভি রেফারেন্স:
পটভূমি (ইউডিইভি? হুইজ্যাট?)
ইউডিইভি কার্নেলের হটপ্লাগ সিস্টেম। এটি স্বয়ংক্রিয়ভাবে সঠিক ডিভাইস এবং ডিভাইস সিমলিংকগুলি (যেমন /dev/disk/by-label/<LABEL>
) বুট করার সময় এবং সিস্টেম চলাকালীন সংযুক্ত ডিভাইসগুলির জন্য কনফিগার করে ।
ডেস্কটপ পরিবেশের মতো শ্রোতাদের কাছে হার্ডওয়্যার ইভেন্টগুলি প্রেরণের জন্য ডি-বাস এবং এইচএল ব্যবহার করা হয়। সুতরাং আপনি যখন জিনোমে লগইন করেন এবং কোনও সিডি বা কোনও ইউএসবি ড্রাইভে প্লাগ লাগান, সেই ইভেন্টটি এই শৃঙ্খলা অনুসরণ করে:
kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)
এবং প্রেস্টো, আপনার ড্রাইভ মাউন্ট হয়ে যায়। তবে একটি হেডলেস সিস্টেমে, অটোমোটিংয়ের সুবিধা পেতে আমাদের লগ ইন করতে হবে না।
উদেব বিধি
যেহেতু ইউডিইভি আমাদের ডিভাইস সন্নিবেশে নিয়ম লিখতে এবং প্রোগ্রাম চালাতে দেয়, এটি একটি আদর্শ পছন্দ। আমরা দেবিয়ান / উবুন্টুর বিদ্যমান নিয়মগুলির সুবিধা নিতে যাচ্ছি, সেগুলি /dev/disk/by-label/<LABEL>
আমাদের জন্য সিমিলিংক সেটআপ করুন এবং আমাদের জন্য ডিভাইসটি মাউন্ট করবে এমন একটি বিধি যুক্ত করুন।
ইউডিইভির বিধিগুলি /etc/udev/rules.d
(এবং কার্মিকের /lib/udev/rules.d
উপরে) রাখা হয়েছে এবং সংখ্যাসূচকভাবে প্রক্রিয়া করা হয়। কোনও ফাইলের সংখ্যার সাথে শুরু হচ্ছে না এমন ফাইলগুলির পরে প্রক্রিয়া করা হবে। আমার সিস্টেমে, এইচএল বিধিগুলি কল করা কোনও ফাইলে থাকে 90-hal.rules
, তাই আমি আমার নিয়মগুলি putুকিয়ে রাখি 89-local.rules
যাতে তারা এইচএলএল হওয়ার আগে প্রক্রিয়াজাত হয়। প্রাথমিকভাবে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে এই নিয়মগুলি পরে ঘটে 60-persistent-storage.rules
। local.rules
যথেষ্ট ভাল হতে পারে।
এটি আপনার নতুন নিয়ম ফাইলে রাখুন:
# /etc/udev/rules.d/local.rules
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*", ACTION=="add", SUBSYSTEMS=="usb", \
RUN+="/usr/local/sbin/udev-automounter.sh %k"
নিশ্চিত করুন যে এর পরে কোনও স্থান নেই \
, কেবলমাত্র একটি newline
( \n
)।
পরিবর্তন SUBSYSTEMS=="usb"
করার জন্য SUBSYSTEMS=="usb|ieee1394"
ফায়ারওয়্যার সমর্থনের জন্য।
আপনি যদি ডিভাইসটি সর্বদা কোনও নির্দিষ্ট ব্যবহারকারীর মালিকানা চান তবে একটি OWNER="username"
ধারা যুক্ত করুন cla যদি আপনার কেবলমাত্র কোনও নির্দিষ্ট ব্যবহারকারীর মালিকানাধীন ফাইলগুলির প্রয়োজন হয় তবে তার পরিবর্তে মাউন্ট স্ক্রিপ্টটি টুইঙ্ক করুন।
বিধি পাঠ করা
এটি চালানোর জন্য ডিভাইসের তালিকার প্রোগ্রামগুলির তালিকায় একটি প্রোগ্রাম যুক্ত করে। এটি ইউএসবি পার্টিশন ডিভাইসগুলি সনাক্ত করে <LABEL>
, তারপরে এই তথ্যটিকে একটি স্ক্রিপ্টে দেয় যা মাউন্টটি সম্পাদন করে। বিশেষত, এই বিধিটি মিলছে:
ENV{ID_FS_LABEL_ENC}=="?*"
- পূর্ববর্তী সিস্টেমের নিয়ম অনুসারে পরিবেশ পরিবর্তনশীল set নন-ফাইল সিস্টেমগুলির জন্য অস্তিত্ব নেই, তাই আমরা এটি পরীক্ষা করে দেখি। আমরা আসলে ID_FS_LABEL
মাউন্ট পয়েন্টের জন্য ব্যবহার করতে চাই , তবে আমি ইউডিইভিটিকে আমার পক্ষে এড়িয়ে চলার ব্যাপারে নিশ্চিত করিনি, সুতরাং মাউন্ট স্ক্রিপ্টটি এটি পরিচালনা করব'll
এই এবং অন্যান্য এনভায়রনমেন্ট ভেরিয়েবলগুলি udev দ্বারা vol_id
কমান্ডটি ব্যবহার করে ( অবনমিত ) পাওয়া যায়। একটি পার্টিশনে সুন্দর দ্রুত বিশদ বিবরণ দেখতে এটি একটি সহজ সরঞ্জাম:
$ sudo vol_id /dev/sdc1
ID_FS_TYPE=ext2
ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
ID_FS_LABEL=Travel Dawgs
ID_FS_LABEL_ENC=Travel\x20Dawgs
ID_FS_LABEL_SAFE=Travel_Dawgs
ACTION=="add"
- শুধুমাত্র add
ইভেন্টগুলি মেলে ...
SUBSYSTEMS=="usb"
- কেবলমাত্র ইউএসবি বাসে থাকা ডিভাইসগুলির সাথে মেলে। আমরা SUBSYSTEMS
এখানে ব্যবহার করি কারণ এটি আমাদের ডিভাইসের পিতামাতার সাথে মেলে; আমরা যে ডিভাইসে আগ্রহী সেগুলি হ'ল সাবস্কায়স্ট == "স্ক্সি" হবে। প্যারেন্ট ইউএসবি ডিভাইসের সাথে মিলে যাওয়া আমাদের প্রোগ্রামটিকে অভ্যন্তরীণ ড্রাইভগুলিতে যুক্ত করা এড়িয়ে যায়।
RUN+="..."
- কোনও মিল নয়, তবে একটি ক্রিয়া: চালানোর জন্য প্রোগ্রামগুলির তালিকায় এই প্রোগ্রামটি যুক্ত করুন। প্রোগ্রামটির যুক্তিগুলিতে %k
ডিভাইসের নামের (যেমন sdc1
, না /dev/sdc1
) প্রসারিত হয় এবং $env{FOO}
পরিবেশে পরিবর্তনশীল FOO এর সামগ্রী পাওয়া যায়।
বিধি পরীক্ষা করা হচ্ছে
প্রথম রেফারেন্স লিংক (উপরে) একটি দুর্দান্ত ইউডিইভি টিউটোরিয়াল, তবে এটি কিছুটা পুরানো। আপনার নিয়মগুলি পরীক্ষা করার জন্য এটি যে প্রোগ্রামগুলি পরিচালনা করে ( udevtest
বিশেষত) ক্যাপ-অল udevadm
ইউটিলিটি দ্বারা প্রতিস্থাপিত হয়েছে ।
আপনি নিয়মটি যুক্ত করার পরে, আপনার ডিভাইসটি প্লাগ ইন করুন। এটি কয়েক সেকেন্ড দিন, তারপরে এটি কোন ডিভাইসে নির্ধারিত হয়েছে তা পরীক্ষা করে দেখুন:
$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1
যদি আপনার অপসারণযোগ্য ড্রাইভে থাকে label_Baz
তবে এটি ডিভাইসে রয়েছে sdc1
। এটি চালান এবং শেষের দিকে আউটপুটটি দেখুন:
$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...) (many lines about files it reads)
import_uevent_var: import into environment: (...) (many lines about env variables)
(...) (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'
আমাদের RUN+=
নিয়ম থেকে স্ক্রিপ্টের নামটি শেষ কয়েকটি লাইনে (এই উদাহরণের নীচে থেকে তৃতীয়) সন্ধান করুন। আপনি এই ডিভাইসের জন্য ব্যবহৃত হবে সেগুলি আর্গুমেন্টগুলি দেখতে পারেন। আর্গুমেন্টগুলি সঠিক কিনা তা পরীক্ষা করতে আপনি এখন এই আদেশটি চালাতে পারেন; যদি এটি আপনার কমান্ডলাইনে কাজ করে তবে কোনও ডিভাইস isোকানো হলে তা স্বয়ংক্রিয়ভাবে কাজ করা উচিত।
আপনি রিয়েলটাইমে ইউডিইভি ইভেন্টগুলিও নিরীক্ষণ করতে পারেন: চালান sudo udevadm monitor
( man udevadm
স্যুইচগুলির বিশদ জানতে দেখুন )। তারপরে কেবল একটি নতুন ডিভাইস প্লাগ ইন করুন এবং ইভেন্টগুলি স্ক্রোল দেখুন। (সম্ভবত আপনি যদি নিম্ন-স্তরের বিশদ না থাকেন তবে ওভারকিল ...)
বিধিগুলি পুনরায় লোড হচ্ছে
একবার আপনি যাচাই করেছেন যে নিয়মটি সঠিকভাবে পড়তে চলেছে, আপনাকে ইউডিইভি কে তার বিধিগুলি পুনরায় লোড করতে বলা উচিত যাতে নতুনটি কার্যকর হয়। এই যেকোন পদ্ধতি ব্যবহার করুন (যদি প্রথমটি কাজ না করে তবে দ্বিতীয়টি উচিত ... তবে প্রথমটি প্রথম চেষ্টা করুন):
লিপি! প্রকৃতপক্ষে, 2 টি স্ক্রিপ্ট ...
এখানে প্রথম স্ক্রিপ্ট। যেহেতু আমরা চালিত প্রোগ্রামটি দ্রুত শেষ করা দরকার, এটি ব্যাকগ্রাউন্ডে দ্বিতীয় স্ক্রিপ্টটি বন্ধ করে দেয়। এটি রাখুন /usr/local/sbin/udev-automounter.sh
:
#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
/usr/local/sbin/udev-auto-mount.sh ${1} &
এখানে দ্বিতীয় স্ক্রিপ্ট। এটি কিছুটা আরও ইনপুট চেকিং করে। এটি ভিতরে রাখুন /usr/local/sbin/udev-auto-mount.sh
। আপনি নীচের মাউন্ট বিকল্পগুলি টুইঙ্ক করতে চাইতে পারেন। এই স্ক্রিপ্টটি এখন LABEL পার্টিশনটি নিজেরাই সন্ধান করে; UDEV কেবলমাত্র DEVICE নাম প্রেরণ করে।
বুট-সময় ড্রাইভগুলি মাউন্ট করার ক্ষেত্রে যদি সমস্যা হয় , আপনি sleep 60
স্ক্রিপ্টটি ড্রাইভ মাউন্ট করার চেষ্টা করার আগে সিস্টেমটিকে সমস্ত উপায়ে আসতে সময় দেওয়ার জন্য, আপনি এই স্ক্রিপ্টটিতে একটি দীর্ঘ দীর্ঘ সময় দিতে পারেন।
আমি কীভাবে চেক করব (কীভাবে ps
ওয়েবসার্ভার চলছে কিনা তা দেখার জন্য রান করুন) এর জন্য আমি মন্তব্যে একটি পরামর্শ দিয়েছি , তবে আপনার সিস্টেমে আপনি এটি টুইট করতে চান। আমি মনে করি আপনি যে কোনও নেটওয়ার্ক সার্ভারগুলি ব্যবহার করছেন সম্ভবত এই উদ্দেশ্যে যথেষ্ট হবে - এনএফএসডি, এসএমবিডি, অ্যাপাচি ইত্যাদি The নির্দিষ্ট ফাইলের অস্তিত্ব একটি ভাল সমাধান হতে পারে।
#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
# DEVICE is the actual device node at /dev/DEVICE
#
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition. Mount options
# are hard-coded below.
DEVICE=$1
# check input
if [ -z "$DEVICE" ]; then
exit 1
fi
# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
echo "error: seems /dev/${DEVICE} is already mounted"
exit 1
fi
# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
# sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up. A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
# sleep 30
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done
# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`
if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
exit 1
fi
# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then
# make the mountpoint
mkdir "/media/${ID_FS_LABEL}"
# mount the device
#
# If expecting thumbdrives, you probably want
# mount -t auto -o sync,noatime [...]
#
# If drive is VFAT/NFTS, this mounts the filesystem such that all files
# are owned by a std user instead of by root. Change to your user's UID
# (listed in /etc/passwd). You may also want "gid=1000" and/or "umask=022", eg:
# mount -t auto -o uid=1000,gid=1000 [...]
#
#
case "$ID_FS_TYPE" in
vfat) mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# I like the locale setting for ntfs
ntfs) mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
# ext2/3/4 don't like uid option
ext*) mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
;;
esac
# all done here, return successful
exit 0
fi
exit 1
সুপার বোনাস ক্লিনআপ স্ক্রিপ্ট!
আরও একটি স্ক্রিপ্ট। এটি সমস্তই ডিভাইসটিকে আনমাউন্ট করে মাউন্টপয়েন্ট ডিরেক্টরিগুলি সরান remove এটি ধরে নিয়েছে যে এটির জন্য এটির গোপনীয়তা রয়েছে, সুতরাং আপনার এটি চালানো দরকার sudo
। এই স্ক্রিপ্টটি এখন কমান্ডলাইনে পুরো মাউন্টপয়েন্টটি নিয়েছে, যেমন:
$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"
এটি রাখুন /usr/local/sbin/udev-unmounter.sh
:
#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
# MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"
if [ -z "$MOUNTPT" ]; then
exit 1
fi
# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then
# very naive; just run and pray
umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0
echo "error: ${MOUNTPT} failed to unmount."
exit 1
fi
echo "error: ${MOUNTPT} does not exist"
exit 1