ডিরেক্টরিগুলি কী, লিনাক্সের সমস্ত কিছু যদি একটি ফাইল হয়?


17

খুব সহজেই নতুনরা একটি বাক্য শুনতে পান "লিনাক্স / ইউনিক্সে সমস্ত কিছুই একটি ফাইল"। তবে এরপরে ডিরেক্টরিগুলি কী কী? ফাইলগুলি থেকে তারা কীভাবে আলাদা?

উত্তর:


22

দ্রষ্টব্য: মূলত আমার উত্তরটি সমর্থন করার জন্য এটি লেখা হয়েছিল কারণ lsকমান্ডের বর্তমান ডিরেক্টরিটি নিজের সাথে যুক্ত হিসাবে চিহ্নিত করা হয়েছে কেন? তবে আমি অনুভব করেছি যে এটি এমন একটি বিষয় যা নিজের পক্ষে দাঁড়ানোর দাবি রাখে এবং তাই এই প্রশ্নোত্তর

ইউনিক্স / লিনাক্স ফাইল সিস্টেম এবং ফাইলগুলি বোঝা: সবকিছুই একটি ইনোড

মূলত, একটি ডিরেক্টরি কেবল একটি বিশেষ ফাইল, যাতে এন্ট্রি এবং তাদের আইডি তালিকা থাকে।

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

ইউনিক্সের একটি ডিরেক্টরি সম্পর্কে ধারণা কেন থম্পসন 1989 সালের একটি সাক্ষাত্কারে রেখেছিলেন :

... এবং তারপরে files ফাইলগুলির মধ্যে কয়েকটি ছিল ডিরেক্টরিতে কেবল নাম এবং আই নম্বর ছিল।

একটি উত্সাহব্যঞ্জক পর্যবেক্ষণ থেকে তৈরি করা যাবে 1972 সালে ডেনিস রিচি এর আলাপ যে

"... ডিরেক্টরি আসলে কোনও ফাইলের চেয়ে বেশি নয়, তবে এর বিষয়বস্তুগুলি সিস্টেম দ্বারা নিয়ন্ত্রিত হয় এবং বিষয়বস্তুগুলি অন্যান্য ফাইলের নাম (

... তবে আলাপের কোথাও ইনোডের উল্লেখ নেই। যাইহোক, 1971 ম্যানুয়াল উপর format of directoriesপদ বলে:

কোনও ফাইল ডিরেক্টরি ডিরেক্টরি হ'ল তার আই — নোড প্রবেশের পতাকা শব্দের মধ্যে কিছুটা দ্বারা নির্দেশিত।

ডিরেক্টরি এন্ট্রিগুলি 10 বাইট দীর্ঘ। প্রথম শব্দটি হ'ল শূন্য নয়, এন্ট্রি দ্বারা প্রতিনিধিত্ব করা ফাইলের আই — নোড; যদি শূন্য হয় তবে প্রবেশ খালি রয়েছে।

সুতরাং এটি সেখানে প্রথম থেকেই আছে।

ডিরেক্টরি এবং ইনোডের জুড়ি কীভাবে ইউনিক্স ফাইল সিস্টেমে ডিরেক্টরি কাঠামো সংরক্ষণ করা হয় তাতেও ব্যাখ্যা করা হয়েছে ? । ডিরেক্টরি নিজেই একটি ডেটা স্ট্রাকচার, আরও নির্দিষ্টভাবে: অবজেক্টগুলির একটি তালিকা (ফাইল এবং ইনোড নম্বর) objects অবজেক্টগুলি সম্পর্কে তালিকা নির্দেশ করে (অনুমতি, প্রকার, মালিক, আকার, ইত্যাদি) ting সুতরাং প্রতিটি ডিরেক্টরিতে নিজস্ব ইনোড নম্বর এবং তারপরে ফাইলের নাম এবং তাদের ইনড নম্বর থাকে। সর্বাধিক বিখ্যাত হ'ল ইনোড # 2 যা /ডিরেক্টরি । (দ্রষ্টব্য, যদিও এটি /devএবং /runভার্চুয়াল ফাইল সিস্টেমগুলি, সুতরাং যেহেতু তারা তাদের ফাইল সিস্টেমের জন্য মূল ফোল্ডার, তাই তাদের ইনোড 2ও রয়েছে; যেমন একটি আইনোড তার নিজস্ব ফাইল সিস্টেমে অনন্য, তবে একাধিক ফাইল সিস্টেম সংযুক্ত করে আপনার অ-স্বতন্ত্র ইনোড থাকে)। লিঙ্কযুক্ত প্রশ্ন থেকে ধার করা চিত্রটি সম্ভবত এটি আরও সংক্ষেপে ব্যাখ্যা করেছে:

নির্দেশিকা-inode-ব্লক

stat()লিনাক্স অনুসারে ইনোডে সঞ্চিত সমস্ত তথ্য সিস্টেম কলের মাধ্যমে অ্যাক্সেস করা যায় man 7 inode:

প্রতিটি ফাইলের ফাইল সম্পর্কে মেটাডেটা যুক্ত একটি ইনোড থাকে। কোনও অ্যাপ্লিকেশন স্ট্যাট (2) (বা সম্পর্কিত কল) ব্যবহার করে এই মেটাডেটাটি পুনরুদ্ধার করতে পারে, যা কোনও স্ট্যাটাস কাঠামো, বা স্ট্যাটেক্স (2) প্রদান করে, যা কোনও স্ট্যাটাক্স কাঠামোকে ফেরত দেয়।

কোনও ফাইলের কেবলমাত্র তার ইনড নম্বর ( রেফ 1 , রেফ 2 ) জেনে অ্যাক্সেস করা সম্ভব ? কিছু ইউনিক্স বাস্তবায়নে এটি সম্ভব তবে এটি অনুমতি এবং অ্যাক্সেসের চেকগুলিকে ছাড়িয়ে যায়, তাই লিনাক্সে এটি প্রয়োগ করা হয়নি এবং find <DIR> -inum 1234ফাইলের নাম এবং এর সাথে সম্পর্কিত ইনোড পেতে আপনাকে ফাইল সিস্টেম ট্রি ( যেমন উদাহরণস্বরূপ) অতিক্রম করতে হবে।

সোর্স কোড স্তরে, এটি লিনাক্স কার্নেল উত্সে সংজ্ঞায়িত করা হয়েছে এবং ইউনিক্স / লিনাক্স অপারেটিং সিস্টেমগুলিতে এক্সট 3 এবং এক্সট 4 ফাইল সিস্টেমগুলি (উবুন্টু ডিফল্ট) সহ কাজ করে এমন অনেক ফাইল সিস্টেম দ্বারা এটি গ্রহণ করা হয়। মজাদার বিষয়: ডেটা কেবলমাত্র তথ্যের অবরুদ্ধ হওয়ার সাথে সাথে লিনাক্সের আসলে ইনোড_ইনিট_লওয়েস ফাংশন রয়েছে যা নির্ধারণ করতে পারে যে কোনও ইনোডটি পাইপ ( inode->i_pipe) কিনা । হ্যাঁ, সকেট এবং পাইপগুলি প্রযুক্তিগতভাবে ফাইলগুলিও রয়েছে - বেনামে ফাইলগুলি, যার ডিস্কে কোনও ফাইলের নাম থাকতে পারে না। FIFOs এবং ইউনিক্স-ডোমেন সকেটের ফাইল সিস্টেমে ফাইলের নাম থাকে।

ডেটা নিজেই অনন্য হতে পারে, তবে ইনোড সংখ্যাটি অনন্য নয়। যদি আমাদের কাছে ফুবার নামে foo এর একটি শক্ত লিঙ্ক থাকে তবে এটি 123 এর ইনডকেও নির্দেশ করবে। এই ইনোডটিতে স্বয়ংক্রিয়ভাবে ডিস্ক স্পেসের প্রকৃত ব্লকগুলি সেই ইনোডের দ্বারা দখল করা হয়েছে information এবং এটি প্রযুক্তিগতভাবে কীভাবে আপনাকে .ডিরেক্টরি ফাইলের নামের সাথে যুক্ত করা যেতে পারে । ঠিক আছে, প্রায়: আপনি নিজেরাই লিনাক্সের ডিরেক্টরিতে হার্ডলিঙ্ক তৈরি করতে পারবেন না , তবে ফাইল সিস্টেমগুলি খুব শৃঙ্খলাবদ্ধভাবে ডিরেক্টরিগুলিতে হার্ড লিঙ্কগুলিকে অনুমতি দিতে পারে, যা কেবলমাত্র .এবং ..শক্ত লিঙ্কগুলির সীমাবদ্ধ করে তোলে ।

ডিরেক্টরি ট্রি

ফাইল সিস্টেমগুলি ট্রি ডেটাস্ট্রাকচারগুলির মধ্যে একটি হিসাবে ডিরেক্টরি ট্রি প্রয়োগ করে। নির্দিষ্টভাবে,

  • ext3 এবং ext4 এইচটি੍ਰੀ ব্যবহার করে
  • xfs বি + ট্রি ব্যবহার করে
  • zfs হ্যাশ ট্রি ব্যবহার করে

এখানে মূল বক্তব্যটি হ'ল ডিরেক্টরিগুলি নিজেরাই একটি গাছে নোড হয় এবং উপ-ডিরেক্টরিগুলি হ'ল চাইল্ড নোড, প্রতিটি সন্তানের পিতামাত নোডের সাথে একটি লিঙ্ক থাকে। সুতরাং, একটি ডিরেক্টরি লিঙ্কের জন্য ইনোড গণনা একটি খালি ডিরেক্টরি (ন্যূনতম ডিরেক্টরিতে /home/example/লিঙ্ক এবং নিজের লিঙ্ক /home/example/.) এর জন্য সর্বনিম্ন 2 হয় এবং প্রতিটি অতিরিক্ত উপ-ডিরেক্টরি একটি অতিরিক্ত লিঙ্ক / নোড হয়:

# new directory has link count of 2
$ stat --format=%h .
2
# Adding subdirectories increases link count
$ mkdir subdir1
$ stat --format=%h .
3
$ mkdir subdir2
$ stat --format=%h .
4
# Count of links for root
$ stat --format=%h /
25
# Count of subdirectories, minus .
$ find / -maxdepth 1 -type d | wc -l
24

ডায়াগ্রাম পাওয়া ইয়ান ডি অ্যালেন এর কোর্স পৃষ্ঠা একটি সরলীকৃত খুব পরিষ্কার চিত্রটি শো:

WRONG - names on things      RIGHT - names above things
=======================      ==========================

    R O O T            --->         [etc,bin,home]   <-- ROOT directory
   /   |   \                         /    |      \
etc   bin   home       --->  [passwd]  [ls,rm]  [abcd0001]
 |   /   \    \                 |      /    \       |
 |  ls   rm  abcd0001  --->     |  <data>  <data>  [.bashrc]
 |               |              |                   |
passwd       .bashrc   --->  <data>                <data>

রাইট ডায়াগ্রামের একমাত্র জিনিসটি যা ভুল তা হ'ল ফাইলগুলি প্রযুক্তি গাছের ভিত্তিতে নিজেই ডিরেক্টরি ট্রিতে থাকা হিসাবে বিবেচিত হয় না: ফাইল যুক্ত করার ফলে লিঙ্কগুলির গণনায় কোনও প্রভাব নেই:

$ mkdir subdir2
$ stat --format=%h .
4
# Adding files doesn't make difference
$ cp /etc/passwd passwd.copy
$ stat --format=%h .
4

ডিরেক্টরিগুলি অ্যাক্সেস করা হচ্ছে যেন তারা ফাইল

লিনাস টরভাল্ডসের উদ্ধৃতি দিতে :

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

ডিরেক্টরিটি কোনও ফাইলের কেবল একটি বিশেষ কেস হিসাবে বিবেচনা করে, স্বাভাবিকভাবেই এমন APIs থাকতে হবে যা আমাদের নিয়মিত ফাইলগুলির অনুরূপ ফাইলে খুলতে / পড়তে / লিখতে / বন্ধ করতে দেয়।

dirent.hসি লাইব্রেরিটি সেখানেই আসে, যা direntকাঠামোটি সংজ্ঞায়িত করে , যা আপনি মানুষে 3 টি রেডির খুঁজে পেতে পারেন :

   struct dirent {
       ino_t          d_ino;       /* Inode number */
       off_t          d_off;       /* Not an offset; see below */
       unsigned short d_reclen;    /* Length of this record */
       unsigned char  d_type;      /* Type of file; not supported
                                      by all filesystem types */
       char           d_name[256]; /* Null-terminated filename */
   };

সুতরাং, আপনার সি কোডে আপনাকে সংজ্ঞায়িত করতে হবে struct dirent *entry_p, এবং যখন আমরা একটি ডিরেক্টরি খুলি opendir()এবং এটি দিয়ে পড়া শুরু করি readdir(), তখন আমরা প্রতিটি আইটেমটি সেই entry_pকাঠামোর মধ্যে সংরক্ষণ করব । অবশ্যই, প্রতিটি আইটেম direntউপরে বর্ণিত জন্য টেমপ্লেটে সংজ্ঞায়িত ক্ষেত্র থাকবে ।

এটি কীভাবে কাজ করে তার ব্যবহারিক উদাহরণটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে ফাইল এবং তাদের ইনড নম্বরগুলি কীভাবে তালিকাভুক্ত করবেন সে সম্পর্কে আমার উত্তরে পাওয়া যাবে ।

নোট করুন যে fdopen- এ পসিক্স ম্যানুয়ালটিতে বলা হয়েছে যে "[টি] বিন্দু এবং ডট- ডটের জন্য তিনি ডিরেক্টরিতে প্রবেশকারী প্রবেশাধিকারী " চ্ছিক " এবং রিডডির ম্যানুয়াল স্টেটগুলির struct dirent কেবল ক্ষেত্র d_nameএবং d_inoক্ষেত্র প্রয়োজন।

ডিরেক্টরিগুলিতে "লেখার জন্য" নোট: একটি ডিরেক্টরিতে লেখা তার প্রবেশের "তালিকা" পরিবর্তন করে mod সুতরাং, ফাইল তৈরি করা বা অপসারণ হ'ল ডিরেক্টরি লিখনের অনুমতিগুলির সাথে সরাসরি যুক্ত হয় এবং ফাইলগুলি যুক্ত করা / অপসারণের বিষয়টি হ'ল ডিরেক্টরিটিতে লেখা অপারেশন।


2
আমি সকেটগুলি ফাইল হিসাবে গ্রহণ করতে অস্বীকার করি;) "ফাইল হিসাবে সমস্ত কিছু অ্যাক্সেসযোগ্য" আরও সঠিক হবে?
রিনজউইন্ড

@ রিনজুইন্ড ওয়েল, "ফাইল হিসাবে সমস্ত কিছুই অ্যাক্সেসযোগ্য" বাক্যাংশটি সঠিক। নিয়মিত ফাইলগুলির মধ্যে রয়েছে open()এবং read()সকেটগুলিও রয়েছে connect()এবং read()। আরও সঠিকটি হ'ল এটি হ'ল যে "ফাইল" হ'ল উভয় ডিস্ক বা মেমরিতে সঞ্চিত "ডেটা" থাকে এবং কিছু ফাইল বেনামে থাকে - তাদের ফাইলের নাম নেই। সাধারণত ব্যবহারকারীরা ডেস্কটপে সেই আইকনটির ক্ষেত্রে ফাইলগুলি ভাবেন, তবে কেবল এটিই বিদ্যমান নয়। আরও দেখুন unix.stackexchange.com/a/116616/85039
Sergiy Kolodyazhnyy

ঠিক আছে প্রশ্নটি আরও ছিল যদি একটি ডিরেক্টরি একটি ফাইল ছিল। এবং এটা করা হয়. ফিফোর নামযুক্ত পাইপগুলির সাথে সকেটগুলি প্রায় একটি পৃথক প্রশ্ন হতে পারে।
WinEunuuchs2Unix

আচ্ছা, আমি পাইপ সম্পর্কে একটি উত্তর এতদূর করেছেন: askubuntu.com/a/1074550/295286 হয়তো FIFOs পরের হবে
Sergiy Kolodyazhnyy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.