2013-04-26 1 views
0

내 Linux C++ 응용 프로그램에서 시스템에있는 모든 SCSI 디스크의 이름을 가져 오려고합니다. 예 :/dev/sda,/dev/sdb, ... 등등.Linux C++ 응용 프로그램에서 SCSI 디스크 이름을 가져 오는 방법

은 현재 내가 코드 아래 사용하여 파일/PROC/SCSI/SG/장치의 출력에서 ​​무엇입니까 :

 

    host chan SCSI id lun  type opens qdepth busy online 
    0  0  0  0  0  1  128  0  1 
    1  0  0  0  0  1  128  0  1 
    1  0  0  1  0  1  128  0  1 
    1  0  0  2  0  1  128  0  1 

// If SCSI device Id is > 26 then the corresponding device name is like /dev/sdaa or /dev/sdab etc. 
    if (MAX_ENG_ALPHABETS <= scsiId) 
    { 
     // Device name order is: aa, ab, ..., az, ba, bb, ..., bz, ..., zy, zz. 
     deviceName.append(1, 'a'+ (char)(index/MAX_ENG_ALPHABETS) - 1); 
     deviceName.append(1, 'a'+ (char)(index % MAX_ENG_ALPHABETS)); 
    } 
    // If SCSI device Id is < 26 then the corresponding device name is liek /dev/sda or /dev/sdb etc. 
    else 
    { 
     deviceName.append(1, 'a'+ index); 
    } 

그러나이 파일은/proc/SCSI/SG는/디바이스는 또한 정보가 포함되어 있습니다 이전에 시스템에 있던 디스크에 대해 예 : 시스템에서 디스크 (LUN)/dev/sdc를 분리하면 파일/proc/scsi/sg/devices에/dev/sdc 정보가 여전히 유효하지 않습니다.

SCSI 디스크 이름을 가져 오는 다른 방법이 있습니까? 시스템 콜처럼?

감사

+0

아마도'/ proc' 또는'/ sys'를 거쳐야 할 것입니다. –

답변

0

당신은 단순히 /dev/sd* 같은 모든 파일의 목록을 읽을 수 및 (X는 하나 개 또는 두 개의 문자 임) sdX하여 필터 (C에서, 당신은 opendir/readdir/closedir 사용해야합니다).

$ cat /proc/partitions 
major minor #blocks name 

8  0 52428799 sda 
8  1  265041 sda1 
8  2   1 sda2 
8  5 2096451 sda5 
8  6 50066541 sda6 
자신의 능력과 함께 당신에게 모든 물리적 디스크의 목록을 줄 것이다

(3 필드 :

또한, sdX에 의해 4 필드를 필터링 한 후 하나의 파일 /proc/partitions을 읽어 모든 파티션의 목록을 얻을 수 있습니다).

0

/proc/scsi/sg/devices에서 디스크 이름 목록을 가져온 후 코드를 통해 존재를 확인할 수 있습니다. 예를 들어 sg3-utils를 설치하고 sg_inq를 사용하여 디스크가 활성 상태인지 여부를 쿼리합니다.

관련 문제