루트 권한 없이 dmidecode 정보를 얻는 방법은 무엇입니까?

루트 권한 없이 dmidecode 정보를 얻는 방법은 무엇입니까?

저는 CentOS 시스템에서 다양한 시스템 정보를 표시하는 프로그램을 작성하고 있습니다. 예를 들어 프로세서 유형 및 속도( 에서 /proc/cpuinfo), 마지막 부팅 시간( 계산에서 /proc/uptime), IP 주소( ifconfig출력에서 ​​) 및 설치된 프린터 목록( lpstat출력에서 ​​)이 있습니다.

현재 프로그램에서 여러 가지 데이터를 얻습니다 dmidecode.

  • 플랫폼 유형( dmidecode -s system-product-name)
  • BIOS 버전( dmidecode -s bios-version)
  • 물리적 메모리 크기( dmidecode -t17 | grep Size)

이는 내 프로그램이 루트로 실행 중인 경우에만 사용할 수 있습니다(그렇지 않으면 dmidecode하위 프로세스가 오류로 인해 실패하기 때문입니다 /dev/mem: Permission denied). 일반 사용자가 액세스할 수 있는 이 정보를 얻을 수 있는 대체 방법이 있습니까?

답변1

제공된 정보 중 일부는 dmidecode에서 확인할 수 있습니다 /sys/devices/virtual/dmi/id.

추가 정보 는 분석 을 통해 얻을 수 있습니다 /proc/cpuinfo./proc/meminfo/sys/system/node/node0/meminfo

답변2

  1. 사용자로서 DMI 정보를 읽을 수 있습니다 /sys/class/dmi/id/. 일련 번호를 포함하지 않습니다(읽으려면 루트 권한이 필요함).

    나는 이것이 개인 정보 보호를 중시하는 커널 개발자의 예상된 동작이라고 생각합니다.

  2. About dmesg: dmesg커널 링 버퍼에 접근하는 명령입니다. 링 버퍼는 버퍼가 "오버플로"될 때 오래된 정보를 새로운 정보로 덮어쓰는 것을 의미합니다. 또한 이는 구문 분석할 수 없는 커널 모듈 디버그 출력을 읽는 중입니다.

  3. 다음을 실행하여 systemd커널 출력에 액세스 하려면:

     journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. ~에 대한데이비드 호머의그리고나일스답변: 이 파일은 /dev/mem단순히 메모리 정보를 제공하는 것이 아니라 전체 물리적 메모리를 사용자 공간에 매핑합니다. 따라서 이를 통해 DMI 메모리 주소에 액세스할 수 있습니다(그리고 더 불쾌한 작업을 수행할 수 있습니다).

  5. 정보 와chgrpchmod g+sdmidecode나일스답변: GID를 저장하면 새로운 권한이 사용 chmod g+s되지 않기 때문에 예상대로 작동하지 않을 것 같습니다. 액세스하기 전에 유효 그룹 ID를 설정하기 위해 호출을 해야 합니다 . 소스 코드로 판단하면 이 작업은 수행되지 않습니다.dmidecodedmidecodesetegid/dev/memdmidecode

답변3

방금 CentOS 5 시스템을 확인했습니다. 이후:

chgrp kmem /usr/sbin/dmidecode
chmod g+s /usr/sbin/dmidecode

여전히 dmidecode를 작동시킬 수 없습니다. kmem 그룹은 /dev/mem에 대한 읽기 액세스 권한만 가집니다. BIOS 정보 쓰기와 관련된 것 같습니다.

따라서 몇 가지 다른 옵션이 있습니다.

  1. sudo 사용
  2. 다른 정보 소스(예: /proc/meminfo) 사용
  3. init 스크립트를 사용하여 dmidecode의 정적 출력을 누구나 읽을 수 있는 파일에 기록합니다.

답변4

@mtneagle이 왜 반대표를 받았는지 잘 모르겠습니다.

OP가 원하는 세 가지 항목은 다음과 같습니다.

플랫폼 유형 ( dmidecode -s system-product-name)
BIOS 버전 ( dmidecode -s bios-version)
물리적 메모리 용량 ( dmidecode -t17 | grep Size)

우리는 각각 다음과 같이 얻을 수 있습니다:

dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "1"
dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "2"
dmesg | grep "Memory:" | cut -d '/' -f '2-' | cut -d ' ' -f '1'

(또는 최소한 내가 가지고 있는 4개의 다른 하드웨어 서버에서 작동하며 Xen 게스트에서는 BIOS나 서버 유형을 전혀 반환하지 않습니다.)

나는 분명한 것을 놓치고 있습니까?


고쳐 쓰다:내가 놓친 명백한 점을 지적해 준 @Ruslan에게 감사드립니다.

인용하다:

네 당신이 그랬어요. 커널 메시지는 링 버퍼에 저장됩니다. 너무 많은 줄이 인쇄되면 첫 번째 줄이 삭제됩니다.

따라서 컴퓨터가 몇 주 동안 작동하고 적어도 매일 일시 중지/재개하는 경우 여기에서 수집한 정보가 더 이상 버퍼에 없을 가능성이 높습니다.

(여기서는 가동 시간이 18일인 이와 같은 상황이 있습니다.) 확인하는 것이 좋습니다./var/log/kern.log

그것은 마치grep DMI: /var/log/kern.log | tail -n1

관련 정보