वास्तविक / देव / एसडीवाई उपकरणों के लिए kern.log त्रुटि संदेशों में 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उपकरण का नाम कैसे पा सकता हूं ?

जवाबों:


11

आप /sysपेड़ को पार करने के माध्यम से संबंधित / देव / एसडीवाई डिवाइस पा सकते हैं :

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

अधिक कुशल /sysट्रैवर्सल (cf. 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

फिर, वास्तविक हार्डवेयर की पहचान करने के लिए आपको सीरियल नंबर के लिए मैप / देव / एसडीवाई करना होगा, जैसे:

$ 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

यदि कुछ और काम नहीं करता है तो मानचित्रण को प्राप्त करने के लिए कोई भी syslog / पत्रिका देख सकता है।

/dev/sdYउपकरणों उसी क्रम में बनाए जाते हैं के रूप में ataX पहचानकर्ता में enumerated हैं 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 [..]

(कर्नेल का उपयोग 2.6.32-31)


यह सिर्फ भयानक है, इस उत्कृष्ट उत्तर के लिए बहुत बहुत धन्यवाद ...
स्टुअर्ट

@stuarte, आपका स्वागत है - btw, cks ने वर्तमान लिनक्स सिस्टम पर SATA उपकरणों की सभी विभिन्न नामकरण योजनाओं के बारे में एक राइटअप किया है । AtaX पहचानकर्ताओं के बारे में वह लिखते हैं: 'ये नाम sysfs में बिलकुल नहीं दिखाई देते हैं जहाँ तक मैं देख सकता हूँ'
maxschlepzig

1
हम्म। इस के सत्यापित संचालन के साथ मेरी समस्या यह है कि मैं आमतौर पर एक ही मॉडल के 8+ डिस्क्स है ताकि निर्माता चेक मूल्यवान न हों।
drescherjm

1
@drescherjm, मैंने अपना उत्तर अपडेट कर दिया है। नई विधि मजबूत होनी चाहिए और इस प्रकार एक विक्रेता की जांच के लिए किसी भी आवश्यकता को समाप्त करना चाहिए।
मैक्सक्लेपजिग

मुझे लगता है कि मुझे लगता है कि एक बेहतर sysfs स्क्रिप्ट है; विशेष रूप से यह दोहरे अंकों का ata नंबर (/ ata [0-9] / ata10 से मेल नहीं खाएगा) और यह भी पाता है कि sata * sd * (जैसे sr0) नाम के उपकरण नहीं हैं: / sys / class / ata_port / ata * के लिए ; Printf '% s \ t% s \ n' '' $ (basename "$ a") "" $ (ढूंढें "$ a / डिवाइस /" -iname 'ब्लॉक -exec ls {} \;) "; किया
जेसन

2

यहाँ मेरा संस्करण है, ऊपर से संशोधित। चूँकि मुझे पता नहीं है कि सटीक तारीख सिस्टम बूट किया गया था (यह परीक्षण करने के लिए यह 27 दिन पहले था), और मुझे नहीं पता कि मुझे किस kern.log में डेटा चाहिए (कुछ gzippedमेरे सिस्टम पर हो सकता है), मैं उपयोग करता हूं uptimeऔर dateएक अनुमानित सिस्टम बूट तिथि (दिन के लिए, वैसे भी) की गणना करने के लिए, फिर zgrepसभी उपलब्ध kern.log फ़ाइलों के माध्यम से खोज करने के लिए उपयोग करें।

मैंने दूसरे grepस्टेटमेंट को भी थोड़ा संशोधित किया , क्योंकि यह अब ATAPI CD / DVD ड्राइव के साथ-साथ ATA- * ड्राइव को भी दिखाएगा।

यह अभी भी शोधन का उपयोग कर सकता है (अर्थात यदि सिस्टम अपटाइम एक वर्ष से अधिक है), लेकिन अभी के लिए ठीक काम करना चाहिए।

#!/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 टूल SCSI डिवाइस (या होस्ट) और उनकी विशेषता को सूचीबद्ध करता है।

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

उबंटू में एक lsscsi बस के साथ स्थापित कर सकते हैं

$ sudo apt-get install lsscsi

2
hm, और आउटपुट ataXमें किस भाग का नक्शा बनाते हैं lsscsi?
मैक्सक्लेपजिग

1
@maxschlepzig: quads में पहली संख्या एक महत्वपूर्ण अंतर के साथ ataX के समान है; lsscsi का आउटपुट 0-अनुक्रमित है और ataZ 1-अनुक्रमित है; इसलिए [२: ०: ०: ०] ata3 होगा जो आउटपुट में / देव / sda है जिसे लॉन्गस्लीप पोस्ट किया गया है
जेसन

@ जेसन, ठीक है, यहां एक-लाइनर है:lsscsi | sed 's@^\[\([^:]\+\).\+\(/dev/.\+\)$@\1,\2@' | awk -F, '{ printf("ata%d => %s\n", $1+1, $2) }'
मैक्सक्लेपजिग

@ जेसन, /sys/devicesबिना किसी विकल्प के सीधे मेरे अपडेट किए गए उत्तर को भी देखें lsscsi
मैक्सक्लेपजिग

0

एससीएसआई बस नंबरों और एटीए नंबरों के बीच विसंगतियों के कारण उपर्युक्त उत्तरों में से किसी ने भी मेरे लिए काम नहीं किया और lsscsi दृष्टिकोण ने गलत उत्तर दिया। 21-डिस्क सिस्टम पर, मेरे पास ATA18 (HSM उल्लंघन) के साथ समस्याओं के बारे में कई syslog रिपोर्टें थीं। कौन सी डिस्क इन त्रुटियों का कारण बन रही थी? कुछ यूएसबी ड्राइव थे, जो चीजों को काफी अधिक भ्रमित करते थे। मुझे इस बात की आवश्यकता है कि प्रत्येक SCSI ड्राइव सिस्टम से कैसे जुड़ा है, और मैंने उस स्क्रिप्ट के नीचे लिखा है कि ATA या USB की परवाह किए बिना सभी SCSI डिस्क (/ 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.