কীভাবে পারমাণবিকভাবে একটি লুপ ডিভাইস বরাদ্দ করা যায়?


11

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

আমি জানি যে আমি losetup -fপরের আনলোকটেড লুপ ডিভাইসটি পেতে ব্যবহার করতে পারি এবং তারপরে সেই লুপ ডিভাইসটি এইভাবে বরাদ্দ করতে পারি:

ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld

যাইহোক, আমি একই সাথে প্রোগ্রামটির একাধিক উদাহরণ চালাতে চাইছি, এটি প্রায় প্রতিযোগিতার শর্তের একটি পাঠ্যপুস্তকের উদাহরণ এবং এটি আমাকে বেশ বিরক্ত করে। যদি আমার এই প্রোগ্রামটি চলমান হওয়ার একাধিক উদাহরণ থাকে, বা অন্যান্য প্রোগ্রামগুলিও লুপ ডিভাইস পাওয়ার চেষ্টা করে থাকে তবে প্রতিটি প্রক্রিয়া পরবর্তী কলের আগে লুপ ডিভাইস বরাদ্দ করতে সক্ষম না হতে পারে losetup -f, উভয় প্রক্রিয়াটি একই লুপটিকে ভাববে যে ডিভাইস উপলব্ধ, তবে কেবল একটি এটি পেতে পারে।

আমি এটির জন্য বাহ্যিক সিঙ্ক্রোনাইজেশন ব্যবহার করতে পারি তবে আমি চাইলে (সম্ভব হলে) অতিরিক্ত জটিলতা এড়াতে চাই। এছাড়াও, অন্যান্য প্রোগ্রামগুলি যে লুপ ডিভাইসগুলি ব্যবহার করে আমি সম্ভবত যে সিঙ্ক্রোনাইজেশন নিয়ে এসেছি সেটিকে সম্মান করবে না।

আমি কীভাবে এই সম্ভাব্য রেসের অবস্থাটি এড়াতে পারি? আদর্শভাবে, আমি লুপ ডিভাইসটিকে পরমাণুভাবে আবিষ্কার এবং বাঁধাই করতে সক্ষম হতে চাই, উদাহরণস্বরূপ:

ld=$(sudo losetup -f myfile.img)
dostuffwith $ld

যাইহোক, আমি যখন এটি করি তখন $ldলুপ ডিভাইস পাথের জন্য বরাদ্দ করা হয় না এবং অনুমতি ত্রুটি sudoহিসাবে আউট সরিয়ে ফেলা হয় sudo ld=$(losetup -f myfile.img)

উত্তর:


13

এটি সম্মতিতে একটি ক্লাসিক সমস্যা: কোনও উত্স বরাদ্দ করার সময়, আপনাকে পরমাণুভাবে এটি নির্ধারণ করতে হবে যে উত্সটি নিখরচায় এবং এটি সংরক্ষণ করা উচিত, অন্যথায় অন্য কোনও প্রক্রিয়া আপনি যে সময়টি নিখরচায় যাচাই করেছেন তা পরীক্ষা করার সময় এবং রিজার্ভ করার সময়কালের মধ্যে রিসোর্সটিকে সংরক্ষণ করতে পারে।

losetupএর স্বয়ংক্রিয় বরাদ্দ মোড ( -f) ব্যবহার করুন --showএবং লুপ ডিভাইস পাথটি মুদ্রণ করতে বিকল্পটি পাস করুন ।

ld=$(sudo losetup --show -f /tmp/1m)

এই বিকল্পটি ইউজার-লিনাক্সে সংস্করণ ২.১। থেকে উপস্থিত রয়েছে ( প্রাথমিকভাবে যুক্ত হয়েছে-s , তবে --showসমস্ত প্রকাশিত সংস্করণে সমর্থন করা হয়েছে এবং সাম্প্রতিক সংস্করণে -sবিকল্পটির নাম বাদ দেওয়া হয়েছে )। দুর্ভাগ্যক্রমে বুসিবক্স ভার্সনে এটি নেই।

লিনাক্স কার্নেলের সংস্করণ ৩.১ নতুন ডিভাইসের মাধ্যমে সরাসরি কার্নেলের মধ্যে লুপ ডিভাইস বরাদ্দকরণ ক্রিয়াকলাপ সম্পাদন করার জন্য একটি পদ্ধতি প্রবর্তন/dev/loop-control করে। এই পদ্ধতিটি কেবল ইউজার-লিনাক্স ২.২১-এর জন্য সমর্থিত। কার্নেল <3.1 বা ইউজার-লিনাক্স <2.21 এর সাহায্যে losetupপ্রোগ্রামটি লুপ ডিভাইস এন্ট্রিগুলিকে রিজার্ভ করার জন্য গণনা করে। আমি কোডে যদিও একটি রেসের শর্ত দেখতে পাচ্ছি না; এটি নিরাপদ হওয়া উচিত তবে এতে একটি ছোট উইন্ডো থাকতে পারে যার সময় এটি ভুলভাবে জানায় যে সমস্ত ডিভাইস বরাদ্দ করা হয়েছে যদিও এমনটি না হলেও।


কিসের </dev/ttyজন্য?
স্টাফেন চেজেলাস 25'15

1
গতবার চেষ্টা করেছি, এমনকি losetup --find --showরেসও করেছি। for i in {1..100}; do losetup -f -s $i & doneআমাকে 100 লুপ ডিভাইস দেয়নি। লুপ ডিভাইসগুলি সাধারণভাবে গুরুত্বপূর্ণ না হওয়ার জন্য এটি যথেষ্ট অস্বাভাবিক; যদি এটি আপনার একমাত্র বিকল্পটি করে তবে তা আপনার নিজের লকগুলি তৈরি করা এবং / অথবা সঠিক লুপ ডিভাইসটি একটি চিন্তাভাবনা হিসাবে তৈরি করা হয়েছিল তা পরীক্ষা করে দেখুন।
frostschutz

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

ওহ, এটি প্রকৃতপক্ষে আরও সাম্প্রতিক সংস্করণগুলিতে স্থির হয়েছে বলে মনে হচ্ছে। ইউজ-লিনাক্স-২.২26.২ কাজ করছে বলে মনে হচ্ছে, ইউজ-লিনাক্স-২.২৪.১ বার বার মুদ্রণ করে /dev/loop14এবং এরকম এবং ডিভাইসটি শেষ পর্যন্ত পুরোপুরি অনুপস্থিত হতে পারে। হয়তো ফিক্স সৌজন্যে হয় /dev/loop-control, এটা এ শুধু চেহারা করতে ব্যবহৃত /proc/partitions...
frostschutz

@frostschutz যেহেতু ইউজার-লিনাক্স ২.২১ রয়েছে, উপস্থিত থাকলে এটি losetupব্যবহার /dev/loop-controlকরে এবং এটির মতো এমন মনে হয় না যে এটির একটি রেসের অবস্থা থাকতে পারে: কার্নেলে বরাদ্দটি ঘটে এবং ডিভাইসের পাথ মুদ্রণটি ইউটিলিটিটি শেষ কাজ করে।
গিলস 20-29

6

আমি এটি বের করেছিলাম। অনুমতি বিষয় নিয়ে সমস্যাটি কীভাবে নিশ্চিত তা আমি নিশ্চিত না হয়ে আমি প্রথমে প্রথমে গুলি করতে পারি এবং পরে এর মতো জিজ্ঞাসা করতে পারি:

sudo losetup -f myfile.img
ld=$(losetup -j myfile.img | grep -o "/dev/loop[0-9]*")
dostuffwith $ld

2

আপনি ব্যবহার করতে পারেন flock:

  tryagain=1
  while [[ $tryagain -ne 0 ]]; do
    ld=`losetup -f`
    flock -n $ld -c "losetup $ld myfile.img"
    tryagain=$?
  done

এখানে ধারণাটি হল আপনি চেষ্টা করুন এবং flockলুপ ডিভাইস ফাইল; যদি একই স্ক্রিপ্টের আরেকটি দৃষ্টান্ত এটি প্রথম অর্জন, একে ডাকতে পাবেন losetup $ld myfile.imgএবং flock0. ফিরে আসবে স্ক্রিপ্ট যা জাতি হারায় জন্য, losetupবলা হবে না এবং flock1 ফিরে আসবে, লুপ পুনরাবৃত্তি ঘটাচ্ছে।

আরও দেখুন man flock


0

লুপব্যাক ডিভাইস হিসাবে আপনি ইমেজটির সাথে যা করতে চান তা যদি এটিকে একটি ফাইল সিস্টেম হিসাবে মাউন্ট করে এবং বিষয়বস্তুগুলির সাথে কাজ করে, mountকমান্ডটি স্বয়ংক্রিয়ভাবে এটির যত্ন নিতে পারে।

mount -o loop myfile.img /tmp/mountpoint

প্রকৃতপক্ষে, আমার ক্ষেত্রে, আমি বিশেষত এটি মাউন্ট না করা চাই - আমি এটিকে ফাইল সিস্টেম নয় ব্লক ডিভাইস হিসাবে ব্যবহার করছি।
জে ম্যান্সফিল্ড 21

@ এজেম্যানসফিল্ড এটি মাউন্ট করা বাদে আপনি একটি ব্লক ডিভাইস দিয়ে কী করতে পারেন যা আপনি কোনও ফাইল দিয়ে করতে পারবেন না?
এলোমেলো 832

আপনি একটি পূর্ণ-ডিস্ক বিটিআরএসএফ সেটআপে এটিকে স্ব্যাপ স্পেস হিসাবে ফর্ম্যাট করতে পারবেন না। আমি swap স্পেসের জন্য ফাইলটি ব্যবহার করার ইচ্ছা করছিলাম, যেহেতু বিআরটিএফস সোয়াপ ফাইলগুলির জন্য প্রয়োজনীয় অপারেশনগুলিকে সমর্থন করে না, এবং আমার একটি পূর্ণ-ডিস্ক বিটিআরএফ সেটআপের সাথে একটি সত্যিকারের সোয়াপ পার্টিশন থাকতে পারে না।
জে ম্যান্সফিল্ড 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.