কীভাবে “/ dev” লিনাক্স ফাইল তৈরি হয়?


112

লিনাক্সে এমন বিশেষ ফাইল রয়েছে যা আসলে ফাইল নয়।

এগুলির সর্বাধিক উল্লেখযোগ্য এবং স্পষ্ট উদাহরণগুলি dev"ফাইলগুলি" ফোল্ডারে রয়েছে:

  • /dev/null - আপনি ফাইলটিতে লিখুন এমন কিছু উপেক্ষা করুন
  • /dev/random - কোনও ফাইলের সামগ্রীর পরিবর্তে এলোমেলো ডেটা আউটপুট দেয় uts
  • /dev/tcp - এই ফাইলটিতে আপনার লিখিত কোনও তথ্য নেটওয়ার্কের মাধ্যমে প্রেরণ করে

প্রথমত, এই ধরণের "ফাইল" এর নাম কী যা সত্যই কোনও ধরণের স্ক্রিপ্ট বা ছদ্মবেশে বাইনারি হয়?

দ্বিতীয়ত, তারা কীভাবে তৈরি হয়? এই ফাইলগুলি কি কার্নেল স্তরে সিস্টেমে অন্তর্নির্মিত হয়েছে, বা নিজেকে "ম্যাজিক ফাইল" তৈরি করার কোনও উপায় আছে (এ সম্পর্কে কীভাবে /dev/rickroll)?


1
এই প্রশ্নটি কীভাবে ট্যাগ করবেন তা সম্পর্কে আমার কোনও ধারণা ছিল না, বিশেষত যেহেতু আমি কী খুঁজছি তার নামটি জানি না। কোনও প্রাসঙ্গিক ট্যাগ এডিট নির্দ্বিধায়।
আইকিউ আন্দ্রেয়াস

15
বিটিডাব্লু, এটি ইউনিক্স এবং ইউনিক্সের মতো অপারেটিং সিস্টেমগুলির ডিজাইনের একটি মৌলিক অংশ: (প্রায়) সবকিছুই একটি ফাইল, বা কোনও ফাইলের মতো দেখতে তৈরি করা যায়।
ক্যাস

5
আরও দেখুন: এমকেএনড (2) man 2 mknod
রবার্টল

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

10
সমস্ত ফাইল, এমনকি "আসল" ফাইলগুলি হ'ল সফ্টওয়্যার শিল্পকর্ম। প্রতিটি ডিভাইস, ফাইল, সকেট, বিশেষ ফাইল, বা কিছু এখনো উদ্ভাবিত করা পিছনে সফ্টওয়্যার ফাংশন হ্যান্ডেল করতে একটা টেবিল প্রদান করে open(), read(), close(), ইত্যাদি পরে, এটা সফ্টওয়্যার আপ
waltinator

উত্তর:


101

/dev/zeroএকটি "বিশেষ ফাইল" - উদাহরণস্বরূপ, একটি "ডিভাইস নোড" এর উদাহরণ। সাধারণত এগুলি ডিস্ট্রো ইনস্টলেশন প্রক্রিয়া দ্বারা তৈরি হয় তবে আপনি চাইলে এগুলি সম্পূর্ণ নিজের তৈরি করতে পারেন।

যদি আপনি lsসম্পর্কে জিজ্ঞাসা /dev/zero:

# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5  Nov 5 09:34 /dev/zero

শুরুতে "সি" আপনাকে বলে যে এটি একটি "চরিত্রের ডিভাইস"; অন্য প্রকারটি হ'ল "ব্লক ডিভাইস" ( ls"বি" হিসাবে মুদ্রিত )। খুব মোটামুটিভাবে, হার্ডডিস্কের মতো এলোমেলো-অ্যাক্সেস ডিভাইসগুলি ব্লক ডিভাইসগুলির মধ্যে থাকে, যখন টেপ ড্রাইভ বা আপনার সাউন্ড কার্ডের মতো ক্রমিক জিনিসগুলি চরিত্র ডিভাইস হতে থাকে।

"1, 5" অংশটি হ'ল "প্রধান ডিভাইস নম্বর" এবং "গৌণ ডিভাইস নম্বর"।

এই তথ্যের সাহায্যে আমরা mknodআমাদের নিজস্ব ডিভাইস নোড তৈরি করতে কমান্ডটি ব্যবহার করতে পারি :

# mknod foobar c 1 5

এটি foobarবর্তমান ফোল্ডারে নামের একটি নতুন ফাইল তৈরি করে যা ঠিক একই কাজ করে /dev/zero। (আপনি চাইলে অবশ্যই এতে আলাদা অনুমতি সেট করতে পারেন)) সত্যিকার অর্থে এই সমস্ত "ফাইল" হ'ল উপরের তিনটি আইটেম device ডিভাইসের ধরণ, বড় সংখ্যা, ছোটখাট সংখ্যা। আপনি lsঅন্যান্য ডিভাইসগুলির জন্য কোডগুলি সন্ধান করতে এবং সেগুলি আবারও পুনরায় তৈরি করতে ব্যবহার করতে পারেন । আপনি বিরক্ত হয়ে গেলে, আপনি সদ্য rmতৈরি করা ডিভাইস নোডগুলি সরাতে কেবল ব্যবহার করুন ।

মূলত প্রধান সংখ্যাটি কোন ডিভাইস ড্রাইভারের সাথে কথা বলার জন্য লিনাক্স কার্নেলকে বলে, এবং সংখ্যালঘু সংখ্যা ডিভাইস ড্রাইভারকে বলে যে আপনি কোন ডিভাইসের কথা বলছেন। (উদাহরণস্বরূপ, আপনার কাছে সম্ভবত একটি সটা নিয়ামক রয়েছে তবে সম্ভবত এটিতে একাধিক হার্ডডিস্ক প্লাগ ইন রয়েছে))

আপনি যদি নতুন কোনও ডিভাইস আবিষ্কার করতে চান যা নতুন কিছু করে ... ভাল, আপনার লিনাক্স কার্নেলের উত্স কোডটি সম্পাদনা করতে হবে এবং আপনার নিজস্ব কাস্টম কার্নেলটি সংকলন করতে হবে। তো আসুন না! :-) তবে আপনি এমন ডিভাইস ফাইলগুলি যুক্ত করতে পারেন যা ইতিমধ্যে ঠিকঠাক হয়ে গেছে তার নকল করে। উদেবের মতো একটি স্বয়ংক্রিয় সিস্টেমটি মূলত কেবলমাত্র ডিভাইস ইভেন্টগুলি দেখার জন্য এবং স্বয়ংক্রিয়ভাবে আপনার জন্য কলিং mknod/ কল করে rm। এর চেয়ে বেশি যাদু আর কিছুই নয়।

এখনও অন্যান্য ধরণের বিশেষ ফাইল রয়েছে:

  • লিনাক্স একটি ডিরেক্টরিকে একটি বিশেষ ধরণের ফাইল হিসাবে বিবেচনা করে। (সাধারণত আপনি সরাসরি ডিরেক্টরি খুলতে পারবেন না, তবে আপনি যদি পারতেন তবে আপনি এটি দেখতে পেলেন যে এটি একটি সাধারণ ফাইল যা একটি বিশেষ ফর্ম্যাটে ডেটা রয়েছে এবং কার্নেলকে সে ডিরেক্টরিতে সমস্ত ফাইল কোথায় পাওয়া যাবে তা বলে দেয়))

  • একটি সিমিলিংক একটি বিশেষ ফাইল। (তবে একটি হার্ড লিঙ্কটি নেই)) আপনি ln -sকমান্ডটি ব্যবহার করে সিমলিংক তৈরি করতে পারেন । (এর জন্য ম্যানপেজটি দেখুন))

  • একটি "নামী পাইপ" বা "ফিফো" নামে পরিচিত একটি জিনিসও রয়েছে (ফার্স্ট-ইন, প্রথম আউট সারিতে)। আপনি এটি দিয়ে তৈরি করতে পারেন mkfifo। একটি ফিফো একটি যাদুকরী ফাইল যা একবারে দুটি প্রোগ্রামের মাধ্যমে খোলা যেতে পারে - একটি পাঠ্য, একটি লেখা। এটি যখন ঘটে তখন এটি একটি সাধারণ শেল পাইপের মতো কাজ করে। তবে আপনি প্রতিটি প্রোগ্রাম আলাদাভাবে শুরু করতে পারেন ...

যে ফাইল কোনওভাবেই "বিশেষ" নয় তাকে "নিয়মিত ফাইল" বলা হয়। আপনি ইউনিক্স ডকুমেন্টেশনে মাঝে মাঝে এর উল্লেখ দেখতে পাবেন। এর অর্থ যা; একটি ফাইল যা কোনও ডিভাইস নোড বা একটি সিমিলিংক বা যা কিছু নয়। কোনও সাধারণ, প্রতিদিন কোনও ফাইলের কোনও যাদুকরী বৈশিষ্ট্য নেই।


4
এছাড়াও আরও একটি বিশেষ ফাইল রয়েছে, ইউনিক্স ডোমেন সকেট ফাইল সিস্টেমের সাথে আবদ্ধ।
ব্রায়ান দ্বি

8
তোমার সাথে খেলতে চান তাহলে mknodচালানোর জন্য, cat /proc/devicesসব ড্রাইভার জন্য প্রধান সংখ্যার দেখতে। যা আমাদের কাছে আরও একটি বিশেষ ফাইল /procফাইল সিস্টেমের কাছে নিয়ে আসে ( এই উত্তরটি এটি সম্পর্কে কথা বলে)।
ugoren

8
অন্যান্য ইউনিটগুলি তাদের নিজস্ব বিশেষ ফাইলগুলি আবিষ্কার করেছে, যেমন সোলারিসের দরজা ছিল ।
কেভিন

6
গৌণ নিটপিক: আপনাকে একটি নতুন চরিত্র / ব্লক ডিভাইস লিখতে কার্নেলটি পুনরায় সংকলন করতে হবে না :) ক্র্যাশকোর্স.সিএ / প্রবর্তন-linux-kernel-programming / অন্যথায় এটি সত্যিই উত্তম উত্তর, +1!
কমান্ডার ধনিয়া সালামান্ডার

1
@ ম্যাথমেটিক্যালআরকিড: আপনার উত্তরটি অনুপস্থিত একটি পদক্ষেপ (বা কমপক্ষে কেবল অন্তর্নিহিতভাবে বলা হচ্ছে) এই বিষয়টি হ'ল যে বিশেষ ফাইলগুলি শেল স্ক্রিপ্টগুলি বা বাইনারিগুলি মোটেই ছদ্মবেশী নয় (প্রশ্নটি ইঙ্গিতিতভাবে), তবে কার্যকারিতা অ্যাক্সেসের জন্য একটি ইন্টারফেস যা উপস্থিত রয়েছে ওএস কার্নেলে
ড্রিমার

34

বেশিরভাগ /devএন্ট্রি হ'ল ব্লক ডিভাইস আইনোড বা অক্ষর ডিভাইস ইনোড। উইকিপিডিয়ায় সে সম্পর্কে অনেকগুলি বিবরণ রয়েছে , যা আমি পুনরাবৃত্তি করতে যাচ্ছি না।

তবে /dev/tcpআপনার প্রশ্নের মধ্যে যা উল্লেখ করা হয়েছে তা বিদ্যমান কোনও উত্তর দ্বারা ব্যাখ্যা করা হয়নি। /dev/tcpএবং /dev/udpঅন্যান্য /devএন্ট্রি থেকে পৃথক । ব্লক এবং অক্ষর ডিভাইসগুলি কার্নেল দ্বারা প্রয়োগ করা হয়, তবে /dev/tcpএবং /dev/udpব্যবহারকারী মোডে প্রয়োগ করা হয়।

বাশ শেল একটি প্রোগ্রাম যা প্রয়োগ করে /dev/tcpএবং এর /dev/udpথেকে অনুলিপি করে ksh93। আপনি যখন ব্যাশ পুনঃনির্দেশ অপারেটরগুলির নীচে কোনও পথ খোলার চেষ্টা করবেন তখন এটি একটি সাধারণ openসিস্টেম কল সম্পাদন করবে না । পরিবর্তে বাশ একটি টিসিপি সকেট তৈরি করবে এবং এটি নির্দিষ্ট পোর্টের সাথে সংযুক্ত করবে।

এটি ব্যবহারকারীর মোডে প্রয়োগ করা হয় এবং কেবলমাত্র কয়েকটি প্রোগ্রামে যেমন নিম্নলিখিত উদাহরণে দেখা যায় যা দেওয়া bashএবং catখোলার চেষ্টা করার মধ্যে পার্থক্য দেখায়/dev/tcp/::1/22

$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3

এর সাথে পার্থক্য ksh93হ'ল bashকেবল সেই টিসিপি সংযোগগুলি পুনর্নির্দেশ অপারেটরগুলির সাথেই করবে, অন্য জায়গাগুলিতে নয় যেখানে এটি বিল্টিন sourceবা .বিল্টিনের মতো ফাইলগুলি খুলতে পারে ।


এছাড়াও, জিএনইউ অবাক gawkএকইভাবে বিশেষ-বিশেষ ক্ষেত্রে /inet{,4,6}/{tcp,udp}/$port/$remote/$rport, যেহেতু ২০১০ সালের আশেপাশে (আমি ঠিক মনে করি না এবং প্রকাশের নোটগুলি খুঁজে পাই না)।
dave_thompson_085

6
আইএমও, বিষয়টির বিষয়ে বক্তব্য দেওয়ার আরও ভাল উপায় /dev/tcpএটি কোনও ফাইল নয়। এটি বলে একটি ফাইল নেই । সকেট খোলার জন্য বাশের সিনট্যাক্সটি /dev/tcp/addressফাইলের নামের মতো স্ট্রিংটি ব্যবহার করে তবে এটিকে "ব্যবহারকারীর জায়গায় প্রয়োগ করা ফাইল" হিসাবে আখ্যায়িত করা কেবল অদ্ভুত শোনায়। আকর্ষণীয় যে kshসমস্ত কিছুর জন্য সেই ফাইলের নামগুলি হুক করে, যদিও কেবল পুনঃনির্দেশ নয়। এটি "একটি ফাইল বাস্তবায়নের" কাছাকাছি।
পিটার কর্ডেস

@ পিটারকর্ডস আমি বিশ্বাস করি ইউউইউএন এগুলি প্রকৃত ফাইল হিসাবে সেট করে। এবং আমি মনে করি 3 ডিএফএসও একই কাজ করে। মনে রাখবেন, bashকেবল এই আচরণটি অনুলিপি করেছেন তবে এটি অন্য কোথাও উত্পন্ন।
মাইকজার্ভ

19

ডিভাইস নোড উপরন্তু অন্যান্য উত্তর (সঙ্গে তৈরি ব্যাখ্যা mknod (2) কিছু দ্বারা বা সরবরাহকৃত devfs ), লিনাক্স অন্যান্য "ঐন্দ্রজালিক" বিশেষ দ্বারা উপলব্ধ ফাইলের নামে আছে ভার্চুয়াল ফাইল সিস্টেম এ, বিশেষ করে /proc/(দেখুন proc (5) , সম্পর্কে পড়তে জন্য procfs ) এবং ইন /sys/( sysfs সম্পর্কে পড়ুন )।

এই সিউডো ফাইলগুলি (যা স্টেট-এগ-এ প্রদর্শিত হবে (2) - সাধারণ ফাইল হিসাবে, ডিভাইস হিসাবে নয়) কার্নেলের দ্বারা সরবরাহিত ভার্চুয়াল ভিউ; বিশেষ করে, থেকে পড়া /proc/(যেমন সঙ্গে cat /proc/$$/maps, অথবা দ্বারা খোলা (2) -ing /proc/self/statusআপনার প্রোগ্রামে) কোন শারীরিক ইনপুট / ডিস্ক অথবা নেটওয়ার্ক থেকে হে সাধারণত সঙ্গে যুক্ত নয়, তাই বেশ দ্রুত।

কিছু অতিরিক্ত সিউডো-ফাইলের মধ্যে তৈরি করতে হলে /proc/আপনি সাধারণত আপনার নিজস্ব লেখা উচিত কার্নেল মডিউল এবং এটি লোড (দেখুন উদাঃ এই )।


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

13

এগুলিকে ডিভাইস নোড বলা হয় এবং ম্যানুয়ালি mknodবা স্বয়ংক্রিয়ভাবে এগুলি তৈরি করা হয় udev। এগুলি সাধারণত কার্নেলের ড্রাইভার সহ অক্ষর বা ব্লক ডিভাইসগুলির ফাইলের মতো ইন্টারফেস থাকে - যেমন ডিস্কগুলি হ'ল ব্লক ডিভাইস, টিটিএস এবং সিরিয়াল পোর্ট ইত্যাদি ক্যারেক্টার ডিভাইস।

নামকরণ করা পাইপ এবং ফিফোস এবং সকেট সহ অন্যান্য "বিশেষ" ফাইল প্রকারগুলিও রয়েছে।


9

অন্যান্য ব্যবহারকারীরা যেমন ইতিমধ্যে দুর্দান্তভাবে ব্যাখ্যা করেছেন, বিশেষ ফাইলগুলির ব্যাক আপ নেওয়ার জন্য কোড প্রয়োজন। তবে, কেউ মনে করেনি যে লিনাক্স ইউজার স্পেসে সেই কোডটি লেখার বিভিন্ন উপায় সরবরাহ করেছে:

উ। FUSE (ইউএসআরস্পেসে ফাইল সিস্টেম) আপনাকে /procকার্নেল ক্রাশ হওয়ার ঝুঁকি ছাড়াই এমন কিছু লেখার অনুমতি দেয় এবং এটি আপনার পছন্দের একটি ভাষা / রানটাইম, যেমন গো , নোড.জেএস , পার্ল , পিএইচপি , পাইথন , রুবি , মরিচ , ইত্যাদি

এটিরও সুবিধা রয়েছে যে FUSE ফাইল সিস্টেমগুলি মাউন্ট করা যায় না sudoকারণ তারা মাউন্টিংয়ের ব্যবহারকারীর মতো চালায়।

FUSE ব্যবহার করে লোকেরা লিখেছেন এমন কয়েকটি উদাহরণ এখানে রয়েছে:

বি। আপনি যদি কোনও ভার্চুয়াল ইনপুট ডিভাইস যেমন একটি কীবোর্ড, মাউস, জৌস্টিক ইত্যাদি তৈরি করতে চান (যেমন, আপনি যে ইউএসবি ডিভাইসটি ব্যবহার করছেন তার জন্য একটি ইউজারস্পেস ড্রাইভার লিখতে libusb), ইউনপুট রয়েছে

এর জন্য বাইন্ডিংগুলি সন্ধান করা আরও শক্ত, তবে আমি জানি তারা গো (কেবলমাত্র কীবোর্ড), পাইথন এবং রুবি (2) এর জন্য বিদ্যমান

রিয়েল-ওয়ার্ল্ড ইউনপুট ব্যবহারের উদাহরণগুলির মধ্যে রয়েছে:

সি জেনেরিক ক্যারেক্টার ডিভাইসগুলির জন্য সিউএসই ( ইউএসআরস্পেসে অক্ষরযুক্ত ডিভাইস) রয়েছে। যদিও এটি অনেক কম জনপ্রিয়।

: চুষে API- এর একমাত্র ব্যবহারকারী যে আমি ব্যক্তিগতভাবে সচেতন আছি একই অনুষ্ঠানে যা তার সৃষ্টির অনুরোধ জানানো হয় osspd , যা প্রয়োগ /dev/dsp, /dev/adspএবং /dev/mixerইউজার-স্পেসের মধ্যে (OSS অডিও API) তাই তারা PulseAudio বা dmix মাধ্যমে পাঠানো যেতে পারে।

আমি যে একমাত্র CUSE বাইন্ডিংটি সন্ধান করতে পেরেছিলাম তা হ'ল কিউসি , যা ২০১০ সাল থেকে আপডেট হয়নি।

D. আপনার কোনও নতুন বিশেষ ফাইলের দরকার নেই।

উদাহরণস্বরূপ, আপনি libusb (পৃষ্ঠাতে বাইন্ডিংয়ের তালিকা) ব্যবহার করে যে কোনও ইউএসবি ডিভাইসের সাথে কাঁচা যোগাযোগ খুলতে পারেন এবং তারপরে অন্য কোনও প্রোগ্রামের মাধ্যমে অন্যান্য প্রোগ্রামের সাথে যোগাযোগ করতে পারেন (টিসিপি / ইউডিপি সকেট, স্টিডিন / স্টাডআউট পড়া / রাইটিং বা ডিস্কে নিয়মিত ফাইলগুলি ইত্যাদি))


1
কিউসি কিছুক্ষণের মধ্যে আপডেট করা নাও হতে পারে (বাস্তবে, এটি কখনই আপডেট হয় নি; এটির মধ্যে কেবল একটি প্রতিশ্রুতি রয়েছে!), তবে কয়েক সপ্তাহ আগে কেবল ক্যাসি ব্যবহার করে একটি চরিত্র ডিভাইস লিখেছি, আমি এটি নিশ্চিত করতে পারি যে এটি এখনও ঠিক কাজ করে। এটি প্রয়োগের সাথে সম্পর্কিত কয়েকটি ফাংশন অনুপস্থিত ছিল poll, তবে যেহেতু cusepy ctyype ব্যবহার করে এবং বাইন্ডিংগুলি সি হেডার ফাইলগুলির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে তৈরি করা হয়, তাই কোনও অনুপস্থিত ফাংশন ঠিক করা কেবলমাত্র এক্সপোর্ট করা ফাংশনগুলির তালিকায় কাঙ্ক্ষিত ফাংশনটির নাম যুক্ত করার বিষয় setup.py
আলেকসি তোড়হামো

1
FUSE ব্যবহারের আর একটি আকর্ষণীয় উদাহরণ হ'ল sshfs । এটি আপনাকে দূরবর্তী ফাইল সিস্টেমটি ব্রাউজ করার অনুমতি দেয় যাতে এটি নীচে এসএসএইচ সংযোগ ব্যবহার করে স্থানীয়।
মিঃ ডেথলেস

@ মিঃ ডেথলেস হ্যাঁ। আমি প্রকৃতপক্ষে এটি ব্যবহার করেছি এবং এটি উল্লেখ করার জন্য বুঝি তবে আমি ভুলে গিয়েছিলাম।
ssokolow

6

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

উদাহরণস্বরূপ, কেবল লেখার জন্য লেখার কাজটি /dev/nullবাইটগুলি উপেক্ষা করে কিছুই করে না। জন্য পঠন ফাংশন /dev/randomএকটি এলোমেলো নম্বর প্রদান করে।


1

mount -t devtmpfs

এটি দেখতেও আকর্ষণীয় যে আধুনিক সিস্টেমে /devসাধারণত ফাইল সিস্টেম টাইপ যা আপনি যেখানে চান সেখানে মাউন্ট করা যায়। উবুন্টু 16.04:

mkdir d
sudo mount -t devtmpfs none d
head -c 10 d/random
sudo umount d

এটি এর দ্বারা সক্ষম করা হয়েছে CONFIG_DEVTMPFS=y, এবং কার্নেলটি নিজেই প্রয়োজন হিসাবে ডিভাইস ফাইলগুলি তৈরি এবং ধ্বংস করতে দেয়।

CONFIG_DEVTMPFS_MOUNT=y

এই বিকল্পটি কার্নেল স্বতঃ-মাউন্ট ডেভটিএমপি চালু করে /dev

drivers/base/Kconfig দস্তাবেজ:

config DEVTMPFS_MOUNT
    bool "Automount devtmpfs at /dev, after the kernel mounted the rootfs"
    depends on DEVTMPFS
    help
      This will instruct the kernel to automatically mount the
      devtmpfs filesystem at /dev, directly after the kernel has
      mounted the root filesystem. The behavior can be overridden
      with the commandline parameter: devtmpfs.mount=0|1.
      This option does not affect initramfs based booting, here
      the devtmpfs filesystem always needs to be mounted manually
      after the rootfs is mounted.
      With this option enabled, it allows to bring up a system in
      rescue mode with init=/bin/sh, even when the /dev directory
      on the rootfs is completely empty.

file_operations

শেষ পর্যন্ত, আপনার নিজের চরিত্রের ডিভাইস কার্নেল মডিউলটি তৈরি করা উচিত যা ঠিক চলছে তা দেখতে।

এখানে একটি সর্বনিম্ন চলমান উদাহরণ: অক্ষর ডিভাইস (বা অক্ষর বিশেষ) ফাইলগুলি বোঝা

সর্বাধিক গুরুত্বপূর্ণ পদক্ষেপটি হচ্ছে কাঠামোটি স্থাপন করা file_operations, যেমন:

static const struct file_operations fops = {
    .owner = THIS_MODULE,
    .read = read,
    .open = open,
};

static int myinit(void)
{
    major = register_chrdev(0, NAME, &fops);
    return 0;
}

যার মধ্যে ফাংশন পয়েন্টার রয়েছে যা প্রতিটি ফাইল-সম্পর্কিত সিস্টেম কলের জন্য কল করে।

এরপরে এটি স্পষ্ট হয়ে যায় যে আপনি ফাইল-সম্পর্কিত সিস্টেম কলগুলি যা খুশি করতে করতে ওভাররাইড করবেন এবং তাই কার্নেলটি ডিভাইসগুলির মতো প্রয়োগ করে /dev/zero

/devছাড়াই স্বয়ংক্রিয়ভাবে এন্ট্রি তৈরি করুনmknod

চূড়ান্ত রহস্যটি কীভাবে কার্নেলটি স্বয়ংক্রিয়ভাবে /devএন্ট্রি তৈরি করে ।

কার্নেল মডিউল তৈরির মাধ্যমে প্রক্রিয়াটি পর্যবেক্ষণ করা যায় যা এটি নিজের মতো করে দেখায়: https://stackoverflow.com/questions/5970595/how-to-create-a-device-node-from-the-init-module- কোড-অফ-অ-লিনাক্স-কার্নেল-মডিউল / 45531867 # 45531867 এবং device_createকলটিতে নেমে আসে ।


ওপেনবিএসডি-তে একটি স্ক্রিপ্ট তৈরি করা আছে যা এটিকে কিছুটা সহজ করে তোলে, man.openbsd.org/MAKEDEV.8 দেখুন লিনাক্স কেন এটি জটিল উপায় ব্যতীত নেই তা নিশ্চিত নয়। সম্ভবত অংশগুলি অভিযোজিত হতে পারে। আপনি উদাহরণস্বরূপ MKNOD tty বলতে পারেন এবং এটি বিশদটি পরিচালনা করে।
অ্যালান কোরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.