প্রকৃত / দেব / এসডিওয়াই ডিভাইসগুলিতে কের্ন.লগ ত্রুটি বার্তাগুলিতে ataX.0 সনাক্তকারীদের কীভাবে মানচিত্র করবেন?


11

নিম্নলিখিত kern.logস্নিপেট বিবেচনা করুন :

 ata4.00: failed command: WRITE FPDMA QUEUED
 ata4.00: cmd 61/00:78:40:1e:6c/04:00:f0:00:00/40 tag 15 ncq 524288 out
        res 41/04:00:00:00:00/04:00:00:00:00/00 Emask 0x1 (device error)
 ata4.00: status: { DRDY ERR }
 ata4.00: error: { ABRT }
 ata4: hard resetting link
 ata4: nv: skipping hardreset on occupied port
 ata4: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
 ata4.00: configured for UDMA/133
 ata4: EH complete

কার্নেলটি আসলে যখন কোন হার্ড ড্রাইভের কথা বলতে থাকে তার অর্থ কীভাবে হয় তা আমি কীভাবে সনাক্ত করতে পারি ata4.00?

সংশ্লিষ্ট /dev/sdYডিভাইসের নামটি কীভাবে খুঁজে পাব ?

উত্তর:


10

আপনি গাছটিকে অনুসরণ করে সম্পর্কিত / ডিভ / এসডিওয়াই ডিভাইসটি খুঁজে পেতে পারেন /sys:

$ find /sys/devices | grep '/ata[0-9]\+/.*/block/s[^/]\+$' \
    | sed 's@^.\+/\(ata[0-9]\+\)/.\+/block/\(.\+\)$@\1 => /dev/\2@'

আরও কার্যকর /sysট্র্যাভারসাল সহ (সিএফ। Lsata.sh ):

$ echo /sys/class/ata_port/ata*/../../host*/target*/*/block/s* | tr ' ' '\n' \
    | awk -F/ '{printf("%s => /dev/%s\n", $5, $NF)}'

একটি 2 ডিস্ক সিস্টেম থেকে আউটপুট উদাহরণ:

ata1 => /dev/sda
ata2 => /dev/sdb

তারপরে, নির্ভরযোগ্যভাবে সত্যিকারের হার্ডওয়্যার শনাক্ত করার জন্য আপনাকে সিরিয়াল নম্বরটিতে / dev / sdY মানচিত্র তৈরি করতে হবে, যেমন:

$ ls /dev/disk/by-id -l | grep 'ata.*sd[a-zA-Z]$'

lssci

lssciউপযোগ এছাড়াও ম্যাপিং আহরণ ব্যবহার করা যেতে পারে:

$ lsscsi | sed 's@^\[\([^:]\+\).\+\(/dev/.\+\)$@\1,\2@' \
    | awk -F, '{ printf("ata%d => %s\n", $1+1, $2) }'

নোট করুন যে প্রাসঙ্গিক lsscsi গণনা 0 থেকে শুরু হয় এবং ata গণনা 0 থেকে শুরু হয়।

syslog

অন্য কিছু যদি না কাজ করে তবে ম্যাপিংটি সিসলগ / জার্নালে দেখে নেওয়া যায়।

/dev/sdYডিভাইসের একই আদেশ নির্মিত হিসাবে ataX শনাক্তকারী মধ্যে গণিত হয় kern.logঅ ডিস্ক ডিভাইস (ATAPI) এবং সংযুক্ত সংযোগগুলি উপেক্ষা করার সময়।

সুতরাং, নিম্নলিখিত কমান্ড ম্যাপিং প্রদর্শন করে:

$ grep '^May 28 2'  /var/log/kern.log.0  | \
   grep 'ata[0-9]\+.[0-9][0-9]: ATA-' | \
   sed 's/^.*\] ata//' | \
   sort -n | sed 's/:.*//' | \
   awk ' { a="ata" $1; printf("%10s is /dev/sd%c\n", a, 96+NR); }'
ata1.00 is /dev/sda
ata3.00 is /dev/sdb
ata5.00 is /dev/sdc
ata7.00 is /dev/sdd
ata8.00 is /dev/sde
ata10.00 is /dev/sdf

(নোট করুন যে উপরের লগ বার্তাগুলি অন্য সিস্টেমের জন্য ata4 প্রদর্শিত হবে না))

আমি ব্যবহার করছি /var/log/kern.log.0এবং না /var/log/kern.logকারণ বুট বার্তাগুলি ইতিমধ্যে ঘোরানো হয়েছে। আমি গ্রেফ করেছিলাম May 28 2কারণ এটি বুটের শেষ সময় ছিল এবং আমি পূর্ববর্তী বার্তাগুলি উপেক্ষা করতে চাই।

ম্যাপিং যাচাই করতে আপনি এর আউটপুট দেখে কিছু চেক করতে পারেন:

$ grep '^May 28 2'  /var/log/kern.log.0  | \
grep 'ata[0-9]\+.[0-9][0-9]: ATA-'
May 28 20:43:26 hn kernel: [    1.260488] ata1.00: ATA-7: SAMSUNG SV0802N, max UDMA/100
May 28 20:43:26 hn kernel: [    1.676400] ata5.00: ATA-5: ST380021A, 3.19, max UDMA/10
[..]

এবং আপনি এই আউটপুটটির সাথে hdparmআউটপুট তুলনা করতে পারেন , যেমন:

$ hdparm -i /dev/sda

/dev/sda:

Model=SAMSUNG SV0802N [..]

(কার্নেল ২.6.৩২-৩১ ব্যবহার করে)


এটি কেবল দুর্দান্ত, এই দুর্দান্ত উত্তরের জন্য আপনাকে অনেক ধন্যবাদ ...
stuartc

@ স্টুয়ার্টে, আপনাকে স্বাগতম - বিটিডব্লিউ, সিএসএস বর্তমান লিনাক্স সিস্টেমে স্যাটা ডিভাইসের বিভিন্ন নামকরণের স্কিম সম্পর্কে একটি লিখনআপ করেছে । অ্যাটাক্স শনাক্তকারীদের সম্পর্কে তিনি লিখেছেন: 'এই নামগুলি আমি যতদূর দেখতে পাচ্ছি
সিসফসে

1
হুম। এটির যাচাইকরণের ক্রিয়াকলাপের সাথে আমার সমস্যা হ'ল আমার কাছে সাধারণত একই মডেলের 8+ ডিস্ক থাকে তাই প্রস্তুতকারক চেকগুলি মূল্যবান নয়।
drescherjm

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

আমার কাছে যা মনে হয় একটি উন্নত সিএসএফএস স্ক্রিপ্ট; বিশেষত এটি ডাবল-ডিজিটের আটা সংখ্যাগুলি পরিচালনা করে (/ আতা [0-9] / এটা 10 এর সাথে মেলে না) এবং এসডি * (যেমন sr0) নামক সাতা ডিভাইসগুলিও খুঁজে পায়: ইন / সিস / শ্রেণি / আতা_পোর্ট / আটা * এর জন্য ; প্রিন্টফ '% s \ t% s \ n' "$ (বেসনাম" $ a ")" "$ (সন্ধান করুন" $ a / ডিভাইস / "-ইনাম 'ব্লক' -exec ls {} \;)"; সম্পন্ন
জেসন

2

আমার সংস্করণটি এখানে থেকে উপরে থেকে পরিবর্তিত। যেহেতু আমি সিস্টেমটি বুট হওয়ার সঠিক তারিখটি জানি না (এটি পরীক্ষার জন্য এটি 27 দিন আগে ছিল) এবং আমি জানি না যে কোন কার্ন.লগে আমার প্রয়োজনীয় ডেটা রয়েছে (কিছু gzippedআমার সিস্টেমে থাকতে পারে ) আমি ব্যবহার করি uptimeএবং dateএকটি আনুমানিক সিস্টেম বুট তারিখ গণনা করতে (আজও, যাইহোক), তারপরে zgrepসমস্ত উপলব্ধ kern.log ফাইল অনুসন্ধান করতে ব্যবহার করুন ।

আমি দ্বিতীয় grepবিবৃতিটিও কিছুটা সংশোধন করেছি , কারণ এটি এখন এটিপি-সিডি / ডিভিডি ড্রাইভের পাশাপাশি এটিএ- * ড্রাইভগুলিও প্রদর্শন করবে।

এটি এখনও পরিশোধন ব্যবহার করতে পারে (যেমন যদি সিস্টেম আপটাইম এক বছরের চেয়ে বেশি হয়) তবে আপাতত ঠিকঠাক কাজ করা উচিত।

#!/bin/bash

uptime=$(uptime | awk -F' '  '{ print $3" "$4 }' | sed s/,//)
date=$(date -d "$uptime ago" | awk '{print $2" "$3 }')
zgrep "$date"  /var/log/kern.log*  | \
grep 'ata[0-9]\+.[0-9][0-9]: ATA'  | \
sed 's/^.*\] ata//' | \
sort -n | sed 's/:.*//' | \
awk ' { a="ata" $1; printf("%10s is /dev/sd%c\n", a, 96+NR); }'

1

ঠিক এই একই সমস্যাটি পেয়েছিল এবং এটির মতো আরও একটি সমাধান খুঁজে পেয়েছে যা কেউ পছন্দ করতে পারে।

Lsscsi সরঞ্জাম এসসিএসআই ডিভাইস (বা হোস্টগুলি) এবং তাদের বৈশিষ্ট্য তালিকাভুক্ত করে।

এলএসসিসিএসির সাথে একটিতে আতা নাম এবং ডিভাইসের নাম পাওয়া যায়।

এটা এমন দেখতে:

$ lsscsi --long
[0:0:1:0]    cd/dvd  MATSHITA DVD-ROM UJDA780  1.50  /dev/sr0
  state=running queue_depth=1 scsi_level=6 type=5 device_blocked=0 timeout=30
[2:0:0:0]    disk    ATA      WDC WD3000FYYZ-0 01.0  /dev/sda
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30
[3:0:0:0]    disk    ATA      WDC WD1002FBYS-0 03.0  /dev/sdb
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30
[4:0:0:0]    disk    ATA      WDC WD1002FBYS-0 03.0  /dev/sdc
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30
[5:0:0:0]    disk    ATA      WDC WD1002FBYS-0 03.0  /dev/sdd
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30
[6:0:0:0]    disk    ATA      WDC WD3000FYYZ-0 01.0  /dev/sde
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30
[7:0:0:0]    disk    ATA      WDC WD1002FBYS-0 03.0  /dev/sdf
  state=running queue_depth=1 scsi_level=6 type=0 device_blocked=0 timeout=30

উবুন্টুতে যে কেউ সহজেই এর সাথে এলএসসিসি ইনস্টল করতে পারে

$ sudo apt-get install lsscsi

2
এইচএম, এবং ataXমানচিত্র কীভাবে lsscsiআউটপুটে অংশ করবে ?
maxschlepzig

1
@maxschlepzig প্রথম সংখ্যা: কোয়াডস একটি গুরুত্বপূর্ণ পার্থক্য সহ অ্যাটাক্সের সমান; lsscsi এর আউটপুট 0-সূচকযুক্ত এবং ataZ হয় 1-সূচকযুক্ত; সুতরাং [2: 0: 0: 0] আতা 3 হবে যা দীর্ঘক্ষণ ঘুমের পোস্টে আউটপুটটিতে / dev / sda হয়
জেসন

@ জেসন, ঠিক আছে, এখানে ওয়ান-লাইনার রয়েছে:lsscsi | sed 's@^\[\([^:]\+\).\+\(/dev/.\+\)$@\1,\2@' | awk -F, '{ printf("ata%d => %s\n", $1+1, $2) }'
ম্যাক্সচলেপজিগ

@ জেসন, এমন বিকল্পের জন্য আমার আপডেট হওয়া উত্তরটিও দেখুন যা সরাসরি /sys/devicesছাড়াই অ্যাক্সেস করে lsscsi
ম্যাক্সলেপজিগ

0

উপরের উত্তরগুলির কোনওটিই আমার পক্ষে কাজ করেনি, এবং এসসিএসআই বাস নম্বর এবং এটিএ নম্বরগুলির মধ্যে স্বতন্ত্রতার কারণে এলএসসিসি পদ্ধতির আসলেই ভুল উত্তর পাওয়া যায়। একটি 21-ডিস্ক সিস্টেমে আমার এটিএ 18 (এইচএসএম লঙ্ঘন) নিয়ে সমস্যা সম্পর্কে অনেকগুলি সিসলগ রিপোর্ট ছিল। কোন ডিস্ক এই ত্রুটিগুলি ঘটায়? কিছু ইউএসবি ড্রাইভ ছিল, যা বিষয়গুলিকে যথেষ্ট বিভ্রান্ত করেছিল। আমার প্রতিটি এসসিএসআই ড্রাইভ সিস্টেমের সাথে কীভাবে সংযুক্ত রয়েছে তার একটি হিসাবরক্ষণের দরকার ছিল এবং এটিএ বা ইউএসবি নির্বিশেষে সমস্ত এসসিএসআই ডিস্কের (/ dev / s [DR]?) জন্য সারণী তালিকা সরবরাহ করে নীচের স্ক্রিপ্টটি লিখেছিলাম।

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

#!/bin/bash

## This script lists the ata and usb bus numbers, as well as the
## overall "host" numbers, of each scsi disk.  The same information
## appears formatted four ways, redundantly, for ease of lookup by (1)
## device lettername, (2) ata bus, (3) usb bus, or (4) overall "host"
## number.

#######################################################

## Q: What if you're looking for an ATA bus number, e.g. ata18, that
##    isn't listed by this script?

## (1) Well, it's probably not a SCSI disk, at least not one that's
##     operating.

## (2) Somewhere in /sys you can find a mapping from the ATA bus
##     number to some overall host number, such as host17.  For example,
##     if you're looking for ata18, you can use a find command...

##     find /sys -type l -exec bash -c 'link=`readlink "$0"`; if [[ "$link" =~ /ata18/ ]] ; then echo $link ; fi' {} \;

##     ...which, after some delay, might yield output something like this:

##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/ata_port/ata18
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/target17:0:0/17:0:0:0/scsi_generic/sg5
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/link18/dev18.0/ata_device/dev18.0
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/scsi_host/host17
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/link18/ata_link/link18
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/target17:0:0/17:0:0:0/bsg/17:0:0:0
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/target17:0:0/17:0:0:0/scsi_device/17:0:0:0
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/target17:0:0/17:0:0:0/scsi_generic/sg5
##    ../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/target17:0:0/17:0:0:0/bsg/17:0:0:0
##    ../../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/target17:0:0/17:0:0:0
##    ../../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17
##    ../../../devices/pci0000:00/0000:00:02.0/0000:02:00.0/ata18/host17/target17:0:0

##     Then you might notice the "/host17/" or "scsi_device/17:0:0:0"
##     in the above output lines, and look in the output of...

##     lshw

##     .. for "scsi17" or "17:0" or such, and discover, somewhere in it ...

##     ...
##        *-scsi:5
##           physical id: 8
##           logical name: scsi17
##           capabilities: emulated
##         *-processor UNCLAIMED
##              description: SCSI Processor
##              product: 91xx Config
##              vendor: Marvell
##              physical id: 0.0.0
##              bus info: scsi@17:0.0.0
##              version: 1.01
##              capabilities: removable
##              configuration: ansiversion=5
##     ...

## ...thus learning that ata18 corresponds to an unclaimed device (but
## not actually a disk).  Q.E.D.

## P.S. the lsscsi command yields the following, which might lead
## one to think that the problem was being caused by a CD-ROM drive
## (SCSI18:0) rather than emanating from the Marvell (SCSI17:0):

## [17:0:0:0]   process Marvell  91xx Config      1.01  -        
## [18:0:0:0]   cd/dvd  HL-DT-ST DVDRAM GH22NS90  HN00  /dev/sr0 

## ... but ATA != SCSI, and 17 != 18.  The CD/DVD drive was ATA19, 
## actually.  You can still use lsscsi, but
## bear in mind that what you're seeing in the left column
## is *not* ATA numbers but rather SCSI bus numbers, and the two
## are not to be confused.
#######################################################

blockDevsDir=/sys/dev/block

declare -A scsiDevLetters
declare -A hostNumbers
declare -A ataNumbers
declare -A usbNumbers

scsiDevLetterRE='/s(d[a-z]|r[0-9])$'
hostNumberRE='/host([0-9]+)/'
ataNumberRE='/ata([0-9]+)/'
usbNumberRE='/usb([0-9]+)/'

cd "$blockDevsDir"
for busid in `ls -1` ; do
    linkval=`readlink "$busid" `
    if [[ "$linkval" =~ $scsiDevLetterRE ]] ; then
        scsiDevLetter="${BASH_REMATCH[1]}"
        if [[ "$linkval" =~ $hostNumberRE ]] ; then
            hostNumber="${BASH_REMATCH[1]}"
            if [[ "$linkval" =~ $ataNumberRE ]] ; then
                ataNumber="${BASH_REMATCH[1]}"
                scsiDevLetters[$scsiDevLetter]=`printf 'ata%-2.2s  host%-2.2s' "${ataNumber}" "${hostNumber}"`
                hostNumbers[${hostNumber}]=`printf '/dev/sd%s  ata%-2.2s' "${scsiDevLetter}" "${ataNumber}"`
                ataNumbers[${ataNumber}]=`printf '/dev/sd%s  host%-2.2s' "${scsiDevLetter}" "${hostNumber}"`
            elif [[ "$linkval" =~ $usbNumberRE ]] ; then
                usbNumber="${BASH_REMATCH[1]}"
                scsiDevLetters[$scsiDevLetter]=`printf 'usb%-2.2s  host%-2.2s' "${usbNumber}" "${hostNumber}"`
                hostNumbers[${hostNumber}]=`printf '/dev/sd%s  usb%-2.2s' "${scsiDevLetter}" "${usbNumber}"`

                existingUsbValue="${usbNumbers[${usbNumber}]}"
                addedUsbValue=`printf '/dev/sd%s  host%-2.2s' "${scsiDevLetter}" "${hostNumber}"`
                if [ -n "$existingUsbValue" ] ; then
                    usbNumbers[${usbNumber}]="$existingUsbValue | $addedUsbValue"
                else
                    usbNumbers[${usbNumber}]="$addedUsbValue"
        fi
            else
        echo "Neither ata nor usb: /dev/sd${scsiDevLetter} (host${hostNumber}) !"
            fi
        else
        echo "No host number for /dev/sd${scsiDevLetter}"
        fi
    fi
done    

echo '/dev/sd?'
echo '--------'
for scsiDevLetter in `echo "${!scsiDevLetters[*]}" | tr ' ' '\n' | sort` ; do
    echo "/dev/sd${scsiDevLetter}    ${scsiDevLetters[$scsiDevLetter]}"
done
echo
echo 'ataNN'
echo '-----'
for ataNumber in `echo "${!ataNumbers[*]}" | tr ' ' '\n' | sort -n` ; do
    printf 'ata%-2.2s    %s\n' "$ataNumber" "${ataNumbers[$ataNumber]}"
done
echo
echo 'usbNN'
echo '-----'
for usbNumber in `echo "${!usbNumbers[*]}" | tr ' ' '\n' | sort -n` ; do
    printf 'usb%-2.2s    %s\n' "$usbNumber" "${usbNumbers[$usbNumber]}"
done
echo
echo 'hostNN'
echo '------'
for hostNumber in `echo "${!hostNumbers[*]}" | tr ' ' '\n' | sort -n` ; do
    printf 'host%-2.2s    %s\n' "$hostNumber" "${hostNumbers[$hostNumber]}"
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.