বড় / গৌণ সংখ্যার জোড়ায় ডিভাইস নোড পান


12

প্রতিটি ডিভাইস নোডের নীচে /devতার নিজস্ব / বড় সংখ্যার জোড় থাকে। আমি জানি যে আমরা ডিভাইস নোড থেকে এই জাতীয় সংখ্যার মাধ্যমে এই জাতীয় পুনরুদ্ধার করতে পারি stat:

stat -c 'major: %t minor: %T' <file>

অথবা, ls -lএই সংখ্যাগুলিও দেখায়।

তবে কীভাবে আমরা বড় এবং ছোটখাটো সংখ্যা দিয়ে ডিভাইস নোড পেতে পারি? একমাত্র উপায় আমি সচেতন আছি কিছু ধরনের ls -l+ + awkকৌতুক, কিন্তু আমি সত্যিই আশা করি সেখানে ভাল সমাধান পাওয়া যাবে।


@ মিকসার্ভ, হ্যাঁ আমি জানি যে কিছু ডিভাইস এই সংখ্যাগুলি ভাগ করতে পারে, তাই আমার প্রাথমিক প্রশ্নে আমি উল্লেখ করেছি: "ডিভাইস নোড (গুলি) পান"। আদর্শভাবে আমি সমস্ত ডিভাইস নোডের সাথে একটি তালিকা পেতে চাই যার প্রধান / গৌণ সংখ্যাগুলি মিলছে, প্রতি লাইনে একটি নোড। এটি আশ্চর্যজনক যে এর জন্য আমাদের কাছে প্রস্তুত সরঞ্জাম নেই। উত্তরের জন্য ধন্যবাদ বিটিডব্লিউ!
দিমিত্রি ফ্রাঙ্ক

উত্তর:


7

আমি ব্যবহার সহজ পদ্ধতির পাওয়া sys , pseudofilesystem এ / sys / দেব আপনি ডিভাইস টাইপ একটি তারপর গুরুতর / গৌণ দ্বারা, ফাইল দ্বারা আদেশ আছে uevent ডিভাইসের নাম এবং অন্যান্য তথ্য একটি গুচ্ছ ধারণ করে।

সুতরাং উদাহরণস্বরূপ,

  for file in $(find /sys/dev/ -name 7:0); do  
      source ${file}/uevent; echo $DEVNAME;
  done;

ইকোগুলি,

loop0
vcs

দ্রষ্টব্য: এটি দেবিয়ান হুইজিতে পরীক্ষা করা হয়েছিল


দেব নাম থেকে পিছনে সন্ধান করতে:for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
বিবিকে

5

আপনি কি বোঝাতে চেয়েছেন তা নিশ্চিত না।

mknod foo b 8 0

ডিভাইস বলা ফাইল তৈরি হবে fooপ্রধান 8 এবং ছোটখাট 0. সঙ্গে একটি ব্লক ডিভাইস হিসাবে আপনি এক বা ফাইল কোন এটি মানে তাহলে /devআছে একই ধরনের, প্রধান ও অপ্রধান, আপনি (দিয়ে কি করতে পারেন zsh):

  • ব্লক ডিভাইসের জন্য 8:0:

    $ zmodload zsh/stat
    $ ls -ld /dev/**/*(-D%be:'zstat -H s $REPLY && (($s[rdev] == 8<<8+0))':)
    lrwxrwxrwx 1 root root    6 Aug 23 05:28 /dev/block/8:0 -> ../sda
    lrwxrwxrwx 1 root root    9 Aug 23 05:28 /dev/disk/by-id/ata-KINGSTON_SNV455S234GB_07MA10014418 -> ../../sda
    brw-rw---- 1 root disk 8, 0 Aug 23 05:28 /dev/sda
    
  • চর ডিভাইসের জন্য 226:0:

    $ ls -ld /dev/**/*(-D%ce:'zstat -H s $REPLY && (($s[rdev] == 226<<8+0))':)
    lrwxrwxrwx  1 root root      12 Aug 23 05:28 /dev/char/226:0 -> ../dri/card0
    crw-rw----+ 1 root video 226, 0 Aug 23 05:28 /dev/dri/card0
    

মনে রাখবেন যে কোনও কিছুই ফাইল তৈরি করতে পারে /dev। খুব পুরানো দিনগুলিতে, এটি সেখানে একটি স্থিতিশীল ফাইল তৈরির স্ক্রিপ্ট ছিল। কিছু সময়ে আপনার এমনকি একটি বিশেষ ফাইল সিস্টেম had লাও ছিল /proc

লিনাক্সের আধুনিক সংস্করণগুলিতে, এটি সাধারণত udevকার্নেলের ইনপুটের উপর ভিত্তি করে।

বেস ডিভাইস ফাইলের জন্য যে নামটি চয়ন DEVNAMEকরে তা কার্নেল দ্বারা সরবরাহিত উপর ভিত্তি করে । udevনিয়মগুলি এটি পরিবর্তন করতে পারে তবে সাধারণত তা হয় না এবং কিছু udevনিয়ম সুবিধার্থে আরও কিছু দর্শন যোগ করে (যেমনগুলির মতো /dev/disk/by...)।

আপনি মেজর থেকে নাবালিকা থেকে কার্নেল এ গিয়ে দেখতে পারেন DEVNAME:

$ sed -n 's/^DEVNAME=//p' /sys/dev/block/8:0/uevent
sda
$ sed -n 's/^DEVNAME=//p' /sys/dev/char/226:0/uevent
dri/card0

udevমাইক্রোভার দেখানো হিসাবে আপনি তথ্যটি ডাটাবেস থেকেও পেতে পারেন ।


5

স্পষ্টতই এটি আরও সহজভাবে করা udevadmযায় এবং আমি কীভাবে এটি সন্ধান করেছি।

আপনার DEVNAMEকাছ থেকে এটি পেতে udevadmকেবলমাত্র করুন:

udevadm info -rq name $PATH

উদাহরণস্বরূপ, যদি আপনি নিজের /devনামটি জানতে /sys/dev/char/5:1চান তবে:

udevadm info -rq name /sys/dev/char/5:1

আউটপুট

/dev/console

-rবিকল্প একটি নির্দিষ্ট করতে হয় --rootফলাফলের এটা ছাড়া উপরে শুধুমাত্র পড়তে হবে - ইডি পথ console-qবিকল্প একটি ডাটাবেস নির্দিষ্ট করে --queryএবং এটি প্রতীক লাগে nameএখানে - কারণ আমরা চাই DEVNAME

একটি চর এবং / বা ব্লক ডিভাইসটির পথ সন্ধানের খুব সহজ উপায় কেবলমাত্র মেজর: সংখ্যালঘু সংখ্যার মতো দেখাবে:

mmdev() for d in /sys/dev/[cb]*/$1:$2
        do  [ -e "$d" ] || return
            printf %c:%s: "${d#/*/*/}" "${d##*/}"
            udevadm info -rq name "$d"
        done

তাই চলমান:

mmdev 8 0

কপি করে প্রিন্ট ...

b:8:0:/dev/sda

এখানে আমি প্রথম লিখেছি।

majminpath() {
    set -- ${1##*[!0-9]*} ${2##*[!0-9]*}
    udevadm info --export-db |
    sed 's|^[^=]*DEVNAME=||
         \|^[^/]|!h;/MAJOR=/N
         \|='"$1\n.*=${2?}"'$|!d;g'
}

এটি কেবল udevadm info --export-dbমিলে যাওয়া সংখ্যার জন্য আউটপুট স্ক্যান করে । আউটপুটটি দেখে মনে হচ্ছে:

P: /devices/virtual/vc/vcsa4
N: vcsa4
E: DEVNAME=/dev/vcsa4
E: DEVPATH=/devices/virtual/vc/vcsa4
E: MAJOR=7
E: MINOR=132
E: SUBSYSTEM=vc

P: /devices/virtual/vc/vcsa5
N: vcsa5
E: DEVNAME=/dev/vcsa5
E: DEVPATH=/devices/virtual/vc/vcsa5
E: MAJOR=7
E: MINOR=133
E: SUBSYSTEM=vc

#...and so on

কর্মপ্রবাহের মতো:

  • [^=]*DEVNAME=প্রতিটি লাইনের মাথা থেকে স্ট্রিংটি ফেলার চেষ্টা করুন

  • যদি কোনও লাইনের প্রথম অক্ষর না থাকে বা এর প্রথম অক্ষরটি /সেই লাইনের hপুরানো জায়গার অনুলিপি করে

  • একটি লাইন মিলে যায় যদি MAJOR=পরিশেষে যোগ Nপ্যাটার্ন স্থান থেকে EXT ইনপুট লাইন

  • যদি প্যাটার্ন স্পেসে 2 টি লাইন মিলে যায় =$1\n.*=$2$তবে প্যাটার্ন স্পেসের তুলনায় hপুরানো স্পেসটি অনুলিপি করুন এবং স্ব-মুদ্রণ; অন্যথায় প্যাটার্ন স্পেস মুছুন

সুতরাং আমি যদি:

majminpath 7 133 ; majminpath 8 0 ; majminpath 8 1

আউটপুট

/dev/vcsa5
/dev/sda
/dev/sda1

তবে, @ xae উল্লেখ করে, ব্লক / চর ধরণের ডিভাইসগুলি মাজ: মিনিট সংমিশ্রণগুলি ভাগ করতে পারে এবং তাই এটি কল প্রতি একাধিক পাথ মুদ্রণ করতে পারে।


1
দুর্ভাগ্যক্রমে এটি এত সহজ নয়, একটি ব্লক এবং একটি অক্ষর ডিভাইস একই প্রধান সংখ্যা ভাগ করতে পারে। ফাইল / proc / ডিভাইসগুলি একবার দেখুন।
xae

আমি সাবসিস্টেম চেক করতে হবে - এটা ঠিক। ধন্যবাদ, @ এক্সএ
মাইক্রজারভ

1

হায়রে , /sys/devhierachy শুধুমাত্র 2.6.27 হিসাবে দেরী হিসাবে কার্নেল যোগ করা হয়েছিল ( cf. প্রাসঙ্গিক কমিট কার্নেল কোডবেস বিরুদ্ধে), তাই আমরা একটি "দ্বিখণ্ডিত" পদ্ধতির প্রয়োজন।

আসুন $Mএবং $m, যথাক্রমে, আমাদের ডিভাইস ফাইলের প্রধান এবং অপ্রাপ্তবয়স্ক সংখ্যা হোন।

2.6.27 কার্নেলগুলি পোস্ট করুন

অন্যদের পরামর্শ অনুসারে, সরলতম পদ্ধতিটি ফোল্ডারের নীচে sysfsনামকৃত ফাইলগুলির জন্য সরাসরি তাড়া করে "ভার্চুয়াল" ফাইল সিস্টেমের শক্তি প্রকাশ করে (আমাদের ডিভাইসটি একটি চরিত্র- কিনা তা যদি আমরা না জানি তবে একাধিক ফাইল প্রত্যাশা করা উচিত) বা একটি ব্লক-ভিত্তিক) এবং তারপরে ফাইলটি সোর্সিং করে (একটি সাবসেলে যাতে নামস্থান দূষণ রোধ করতে পারে):$M:$m/sys/devuevent

for file in $(find /sys/dev/ -name $M:$m)
do
    (
        source ${file}/uevent
        echo $DEVNAME
    )
done

প্রাক 2.6.27 কার্নেলগুলি

আসুন আমরা ধরে নিই, সরলতার জন্য, আমাদের ফাইলটি একটি ব্লক ডিভাইস (চরিত্রের ডিভাইসের জন্য একই ধরণের পদ্ধতির প্রযোজ্য)। আমরা স্ট্রিং অনুসন্ধান করবে $M:$mসর্বত্র /sys/blockঅনুক্রমের, (যে ফোল্ডারের নীচে) প্রত্যেক ফাইল যার নাম হতে হবে বিষয়বস্তু পরীক্ষা দ্বারা dev। যদি /sys/block/<...>/<DEV>/devএরকম একটি ফাইল DEVহয় তবে আমাদের ডিভাইসের নাম হতে বাধ্য:

dirname "$(find "/sys/block" -name dev | xargs -r grep -l ^$M:$m$)"

0

লিনাক্সে /procভার্চুয়াল ফাইল সিস্টেমে নির্দিষ্ট ফাইলগুলির সুবিধা নেওয়া সম্ভব ।

$ grep '8[[:blank:]]\+1[[:blank:]]\+' /proc/partitions 
   8        1   29309568 sda1

$ grep '8:1[[:blank:]]' /proc/self/mountinfo 
28 0 8:1 / / rw,relatime shared:1 - ext4 /dev/sda1 rw,data=ordered

প্যাটার্নটির সরল রূপটি ইতিমধ্যে আউটপুটটিতে কাঙ্ক্ষিত ডিভাইস সম্পর্কিত তথ্য সরবরাহ করে তবে কেবলমাত্র একটি নির্দিষ্ট স্ট্রিং উত্তোলনের জন্য অতিরিক্ত ফিল্টারিংও সম্ভব।


0

একটি লাইব্রেরি ফাংশন রয়েছে: makedev()

#include <sys/sysmacros.h>
dev_t makedev(unsigned int maj, unsigned int min);

প্রধান এবং গৌণ ডিভাইস আইডি দেওয়া, মাককেডেভ () এগুলি একটি ডিভাইস আইডি তৈরির জন্য একত্রিত করে ফাংশন ফলাফল হিসাবে ফিরে আসে।

বিস্তারিত জানার জন্য এখানে যান: http://man7.org/linux/man-pages/man3/major.3.html

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