/ ডিভ এবং এর সাবডিয়ার এবং ফাইলগুলি বোঝা


51
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. আমি ভাবছিলাম যে এর অধীনে /devথাকা সমস্ত ফাইল এবং এর উপ-ডিরেক্টরিগুলি কি ডিভাইসের সমস্ত ফাইল বর্ণনাকারী?
  2. একে অপরের থেকে এত সংযোগ কেন? উদাহরণস্বরূপ, /dev/fd/0, /dev/stdin, /proc/self/fd/0সমস্ত লিঙ্কের হয় /dev/pts/2
  3. তাহলে llrwx------গড় লিঙ্ক, কি cমধ্যে crw--w---- অর্থ কি?

3
এবং # 3 এর উত্তর দেওয়ার জন্য, সি হ'ল অক্ষর ডিভাইস বা চরিত্র বিশেষ । খ ঘোরা ব্লক বিশেষ
ফেলিক্সপো

উত্তর:


77

প্রায় সব অধীনে ফাইল /devহয় ডিভাইস ফাইল । নিয়মিত ফাইলটিতে পড়া এবং লেখার সময় কোনও ডিস্ক বা অন্যান্য ফাইল সিস্টেমে ডেটা সংরক্ষণ করা হয়, ডিভাইস ফাইল অ্যাক্সেস করা কার্নেলের একটি ড্রাইভারের সাথে যোগাযোগ করে, যা সাধারণত একটি টুকরা হার্ডওয়ারের সাথে যোগাযোগ করে (একটি হার্ডওয়্যার ডিভাইস, যার ফলে নাম)।

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

একটি ডিভাইস ফাইলের অর্থটি তার নাম দিয়ে নয়, নাম দ্বারা নির্ধারিত হয় (নামটি অ্যাপ্লিকেশনগুলির ক্ষেত্রে গুরুত্বপূর্ণ, তবে কার্নেলের সাথে নয়)। সংখ্যাটি আসলে দুটি সংখ্যা: প্রধান সংখ্যাটি নির্দেশ করে যে কোনও ড্রাইভার এই ডিভাইসের জন্য দায়বদ্ধ এবং সংখ্যালঘু সংখ্যাটি ড্রাইভারকে বেশ কয়েকটি ডিভাইস চালানোর অনুমতি দেয় ¹ এই সংখ্যাগুলি ls -lতালিকাতে উপস্থিত হয় , যেখানে আপনি সাধারণত ফাইলের আকার খুঁজে পাবেন। যেমন brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ এই ডিভাইসটি বড় 8, ছোট 0।

এর অধীনে কিছু ডিভাইস ফাইল /devহার্ডওয়্যার ডিভাইসের সাথে মিলে না। প্রতিটি ইউনিক্স সিস্টেমে বিদ্যমান একটি হ'ল /dev/null; এটিতে লেখার কোনও প্রভাব নেই, এবং এটি থেকে পড়া কখনই কোনও ডেটা ফেরায় না। এটি শেল স্ক্রিপ্টগুলিতে প্রায়শই সুবিধাজনক, যখন আপনি কোনও কমান্ড ( >/dev/null) থেকে আউটপুট উপেক্ষা করতে চান বা কোনও ইনপুট ( </dev/null) না দিয়ে কোনও কমান্ড চালাতে চান । অন্যান্য সাধারণ উদাহরণগুলি হ'ল/dev/zero (যা নাল বাইট অ্যাড ইনফিনিটাম দেয় ) /dev/urandom(যা এলোমেলোভাবে বাইট অ্যাড ইনফিনিটাম দেয় )।

কয়েকটি ডিভাইস ফাইলের একটি অর্থ রয়েছে যা এটি অ্যাক্সেস করে এমন প্রক্রিয়াটির উপর নির্ভর করে। উদাহরণস্বরূপ, /dev/stdinবর্তমান প্রক্রিয়াটির স্ট্যান্ডার্ড ইনপুটকে মনোনীত করে; প্রক্রিয়াটির স্ট্যান্ডার্ড ইনপুট হিসাবে খোলার মূল ফাইলটি খোলার থেকে প্রায় খোলার একই প্রভাব রয়েছে। কিছুটা অনুরূপভাবে, /dev/ttyপ্রক্রিয়াটি সংযুক্ত রয়েছে এমন টার্মিনালটি নির্ধারণ করে। লিনাক্সের অধীনে, আজকাল /dev/stdinএবং বন্ধুরা অক্ষর ডিভাইস হিসাবে প্রয়োগ করা হয় না, পরিবর্তে আরও সাধারণ ব্যবস্থার প্রতীকী লিঙ্ক হিসাবে প্রতিটি ফাইল বর্ণনাকারীকে রেফারেন্স দেয় (প্রচলিত পদ্ধতিতে কেবল 0, 1 এবং 2 এর বিপরীতে); উদাহরণস্বরূপ /dev/stdinএকটি প্রতীকী লিঙ্ক /proc/self/fd/0। দেখুন / dev / fd কীভাবে / proc / স্ব / fd / এর সাথে সম্পর্কিত?

এর অধীনে বেশ কয়েকটি প্রতীকী লিঙ্ক পাবেন /dev। এটি historicalতিহাসিক কারণে ঘটতে পারে: একটি ডিভাইস ফাইল এক নাম থেকে অন্য নাম থেকে সরানো হয়েছে, তবে কিছু অ্যাপ্লিকেশন এখনও পুরানো নামটি ব্যবহার করে। উদাহরণস্বরূপ, লিনাক্সের অধীনে /dev/scd0একটি প্রতীকী লিঙ্ক /dev/sr0; উভয়ই প্রথম সিডি ডিভাইসকে মনোনীত করে। সিম্বলিক লিঙ্কের জন্য আরেকটি কারণ প্রতিষ্ঠান: লিনাক্স অধীনে, আপনি বিভিন্ন জায়গায় আপনার হার্ড ডিস্ক এবং পার্টিশন খুঁজে পাবেন: /dev/sdaএবং /dev/sda1এবং বন্ধুদের (প্রতিটি ডিস্কের একটি অবাধ চিঠি দ্বারা মনোনীত, এবং পার্টিশন পার্টিশন বিন্যাস অনুযায়ী), /dev/disk/by-id/*(ডিস্ক একটি দ্বারা মনোনীত অনন্য সিরিয়াল নম্বর), /dev/disk/by-label/*(একটি ফাইল-সিস্টেমের সাথে পার্টিশনগুলি, যা মানুষের-নির্বাচিত লেবেল দ্বারা মনোনীত); এবং আরও। প্রতীকী লিঙ্কগুলিও ব্যবহৃত হয় যখন জেনেরিক ডিভাইসের নাম বেশ কয়েকটির মধ্যে একটি হতে পারে; উদাহরণ স্বরূপ/dev/dvd/dev/sr0এটিতে একটি প্রতীকী লিঙ্ক হতে পারে , বা এটির একটি লিঙ্ক হতে পারে /dev/sr1যদি আপনার দুটি সিডি পাঠক থাকে এবং দ্বিতীয়টি ডিফল্ট ডিভিডি রিডার হয়।

শেষ অবধি, কিছু অন্যান্য ফাইল রয়েছে যা আপনি /devপ্রচলিত কারণে সন্ধান করতে পারেন। আপনি প্রতিটি সিস্টেমে এক দেখতে পাবেন না। বেশিরভাগ সূচীতে, /dev/logএমন একটি সকেট যা প্রোগ্রামগুলি লগ বার্তা নির্গত করতে ব্যবহার করে। /dev/MAKEDEVএকটি স্ক্রিপ্ট যা এন্ট্রি তৈরি করে /dev। আধুনিক লিনাক্স সিস্টেমে, এন্ট্রিগুলি /dev/স্বয়ংক্রিয়ভাবে udev , অপ্রচলিত দ্বারা তৈরি করা হয়MAKEDEV

Linux এটি লিনাক্সের অধীনে আসলে আর সত্য নয়, তবে এই বিবরণটি কেবলমাত্র ডিভাইস ড্রাইভার লেখকদের ক্ষেত্রেই গুরুত্বপূর্ণ।


ধন্যবাদ! "একটি ডিভাইস ফাইলের অর্থটি তার সংখ্যা দ্বারা নির্ধারিত হয়" দ্বারা, আপনি কি তার ফাইল বর্ণনাকারী বলতে চান?
টিম

@ টিম: না, ls -lআপনি সাধারণত তারিখের আগে যেখানে ফাইলের আকার খুঁজে পাবেন সেই তালিকাতে নম্বরগুলি উপস্থিত হয় , উদাহরণস্বরূপ brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ এই ডিভাইসটি বড় 8, ছোটখাটো 0. ডিভাইস সংখ্যা প্রায়শই অনুশীলনে আসে না, আমি কেবল তাদের বলার জন্য উল্লেখ করেছি কোন ডিভাইসটিকে কীভাবে একটি ডিভাইস বানায় (সবচেয়ে গুরুত্বপূর্ণ, এটি ফাইলের নাম নয়)। একটি ফাইল বর্ণনাকারী সংখ্যার একটি নির্দিষ্ট প্রক্রিয়াতে কেবল একটি অর্থ থাকে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

না, লিনাক্সে /dev/stdin(=> /proc/self/fd/0) খোলার স্ট্যান্ডার্ড ইনপুট সদৃশ করার মতো প্রভাব নেই। পার্থক্যটি দেখতে su - non_root_user, তারপরে exec 5</dev/stdin"অনুমতি অস্বীকৃত" দিয়ে ব্যর্থ exec 5<&0হবে তবে সফল হবে। এবং এটা না শুধুমাত্র যে নতুন FD বিভিন্ন পতাকা খুলে দেয়া হবে, ফাইল বস্তু ( "খোলা ফাইল descrip সম্পর্কে সবকিছু রাজনৈতিক " POSIX শ্রেণীর বা সম্প্রদায়ের ভাষা মধ্যে) ভিন্ন হবে (ফাইল পয়েন্টার অফসেট, অ / ব্লক মোড, ইত্যাদি)।
মশবি

14
  1. হ্যাঁ - হয় প্রত্যক্ষ বা প্রতীক হিসাবে - /dev/এটিই এর জন্য।
  2. বিভিন্ন উদ্দেশ্যে: কখনও কখনও নামকরণ স্কিম মধ্যে সামঞ্জস্যের জন্য, কখনও কখনও এটা প্রয়োজনীয় কাজ পরিবেশের জন্য হয় - এর উদাহরণ হিসাবে /dev/stdin। এটি স্থিতিশীলভাবে বা অন্য কোনওটির দিকে নির্দেশ করে না - কেবল অন্য টার্মিনালে স্যুইচ করুন এবং আপনি দেখতে পাবেন। আপনার বর্তমান টার্মিনাল সেশনের মান ইনপুট । এটি কেন একটি সিমলিংক হওয়া প্রয়োজন এটিও একটি উদাহরণ।/dev/pts/2/dev/stdin
  3. দেখুন man mknodএবং info coreutils 'mknod invocation'। সাধারণভাবে, cএকটি চরারেক্টর ডিভাইসের ধরণের জন্য বোঝায়।

3
"আপনার বর্তমান টার্মিনাল সেশনের স্ট্যান্ডার্ড ইনপুট" কিছুটা অস্পষ্ট। /dev/stdinপ্রক্রিয়াটির স্ট্যান্ডার্ড ইনপুটকে বোঝায় যা এটি খুলবে। সমস্ত /proc/$pidকিছু প্রক্রিয়া নির্ভর ডেটা এবং /proc/selfএটি প্রক্রিয়াটির নিজস্ব ডেটার দিকে ইঙ্গিত করে এক ধরণের ম্যাজিক সিমিলিংক।
স্টাফেন গিমেনেজ

11

আপনার প্রথম প্রশ্নের জন্য, তারা ফাইল বর্ণনাকারী নয়, তারা ডিভাইস ফাইল। (ওরফে "দেব নোডস")

এই ফাইলগুলি ড্রাইভারের সাথে আবদ্ধ যা প্রধান এবং গৌণ সংখ্যা ব্যবহার করে ডিভাইসটি পরিচালনা করছে। (উদাহরণস্বরূপ, আপনার lsআউটপুটে "136, 2" ডিভাইস ড্রাইভারকে 136 নম্বর নম্বর অনুসারে আবদ্ধ করে এবং সেই ড্রাইভার দ্বারা পরিচালিত ডিভাইস # 2 নির্দিষ্ট করে))

এর আউটপুট প্রথম অক্ষরটি ls -lডিভাইসের ফাইলগুলির ক্ষেত্রে ডিভাইসের ধরণ। যদি এটি 'সি' হয় তবে এটি একটি অক্ষর ডিভাইস, বা এটি 'বি' হয় তবে এটি একটি ব্লক ডিভাইস।

আপনার দ্বিতীয় প্রশ্নের জন্য, উপরের উত্তরটি রোজিয়েট্রজেভিয়াক্স দ্বারা উল্লেখ করুন।


1
"ডিভাইস ড্রাইভারদের পরিচয়" লিঙ্কটি ভাঙ্গা দেখা যাচ্ছে।
স্লোথ ওয়ার্কস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.