2016-09-04 3 views
0

나는 이것을 위해 몇 가지 웹 검색을했지만 장치 노드와 연관된 커널 모듈을 가져 오는 것에 대한 결과 만 찾을 수있었습니다. 현재 시스템의 루트 장치 및 해당되는 경우 루트 장치의 상위 장치 (예 : /dev/sda/dev/sda2의 "상위")의 주 번호와 보조 번호를 얻을 수 있습니까? 커널이 이것을 얻기위한 함수를 내보내거나 간접적으로 가져와야합니까?커널 모듈에서 루트 장치 얻기

답변

0

장치 노드와 연관된 모듈이 없습니다. 아마 당신은 루트 디렉토리가 프로세스의 로컬 (프로세스 구조는 루트 디렉토리에 대한 inode 참조를 저장합니다 --- 이것은 특권이 부여 된 chroot(2) 시스템 호출로 변경 될 수 있음)과 현재 작업 디렉토리 (경로를 풀기 위해

귀하의 프로세스가 chroot(2) 콜을 만든되지 않은
  • , 다음 opendir("/") 및이를 수행하려면 : 루트 디렉토리의 책임이있는 장치를 알고 싶다면

    당신은 두 가지 옵션이 있습니다) /로 시작하지 그것에 fstat(2) (또는에서 stat(2) syscall을 할 수 있습니다.디렉토리). 그러면 루트 디렉토리가있는 장치에 st_dev 필드가 struct stat으로 반환됩니다. dev_t 숫자 형식으로되어 있으며 일부 비트는 주 번호와 부 번호를 나타냅니다. MKDEV(ma,mi)MAJOR(dev)MINOR(dev) 매크로는 <linux/kdev_t.h>에 정의되어 메이저 번호와 마이너 번호에 액세스 할 수 있습니다. 물리 디스크를 얻으려면 부 번호를 0xf0으로 가리고 디스크의 전체 번호를 가져옵니다.

  • 프로세스가 chroot(2) 시스템 콜을 만들었으므로 시스템의 실제 루트 디렉토리에 액세스 할 수 없습니다. /proc 파일 시스템에 액세스 할 수 있으면 mount(1) 명령을 호출하여 마운트 테이블을 가져올 수 있습니다. 해당 테이블에서 / 항목을 검색 한 다음 /dev/sd<disk> 항목을 가져올 수 있습니다. 일단 장치를 얻으면 부모 장치를 가져 오는 것이 쉽습니다. 마지막 지점에서했던 것처럼 번호를 마스크하여 실제 디스크의 부 번호를 가져올 수 있습니다.

각 블록 장치의 통계를 보여주는 /proc/diskstats 파일을 볼 수도 있습니다. 각 행의 처음 세 필드에 주요, 보조 및 장치 이름이 표시됩니다.

참고

는 RAID 장치 나 볼륨 관리자 디스크로, 파티션을 허용하지 말자 일부 디스크 arrangementes있다. 이 경우 물리적 디스크 (또는 디스크가 여러 개있을 수 있으므로)를 얻는 것이 더 어렵습니다.

+0

내 질문에 대한 대답이 아닙니다. – Melab

관련 문제