저는 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
사용자로서 DMI 정보를 읽을 수 있습니다
/sys/class/dmi/id/
. 일련 번호를 포함하지 않습니다(읽으려면 루트 권한이 필요함).나는 이것이 개인 정보 보호를 중시하는 커널 개발자의 예상된 동작이라고 생각합니다.
About
dmesg
:dmesg
커널 링 버퍼에 접근하는 명령입니다. 링 버퍼는 버퍼가 "오버플로"될 때 오래된 정보를 새로운 정보로 덮어쓰는 것을 의미합니다. 또한 이는 구문 분석할 수 없는 커널 모듈 디버그 출력을 읽는 중입니다.다음을 실행하여
systemd
커널 출력에 액세스 하려면:journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
~에 대한데이비드 호머의그리고나일스답변: 이 파일은
/dev/mem
단순히 메모리 정보를 제공하는 것이 아니라 전체 물리적 메모리를 사용자 공간에 매핑합니다. 따라서 이를 통해 DMI 메모리 주소에 액세스할 수 있습니다(그리고 더 불쾌한 작업을 수행할 수 있습니다).정보 와
chgrp
chmod g+s
dmidecode
나일스답변: GID를 저장하면 새로운 권한이 사용chmod g+s
되지 않기 때문에 예상대로 작동하지 않을 것 같습니다. 액세스하기 전에 유효 그룹 ID를 설정하기 위해 호출을 해야 합니다 . 소스 코드로 판단하면 이 작업은 수행되지 않습니다.dmidecode
dmidecode
setegid
/dev/mem
dmidecode
답변3
방금 CentOS 5 시스템을 확인했습니다. 이후:
chgrp kmem /usr/sbin/dmidecode
chmod g+s /usr/sbin/dmidecode
여전히 dmidecode를 작동시킬 수 없습니다. kmem 그룹은 /dev/mem에 대한 읽기 액세스 권한만 가집니다. BIOS 정보 쓰기와 관련된 것 같습니다.
따라서 몇 가지 다른 옵션이 있습니다.
- sudo 사용
- 다른 정보 소스(예: /proc/meminfo) 사용
- 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