Linux 커널에서 사용되는 펌웨어 blob을 확인하는 방법이 있습니까?

Linux 커널에서 사용되는 펌웨어 blob을 확인하는 방법이 있습니까?

내 노트북이 실제로 어떤 펌웨어를 사용하고 있는지 확인하는 방법을 찾고 있습니다(예: 하드웨어를 지원하는 바이너리 blob).

내 배포판 archlinux에서 바이너리 blob을 번들로 묶는 패키지는 다음과 같습니다.

core/linux-firmware(패키지 크기 ~180MiB, ~2500 Blob 파일에 설치된 ~730MiB)

어쨌든 내 노트북은 이러한 파일 중 일부만 사용하는 것 같습니다. 문제는 이를 결정하는 방법을 찾는 것입니다. 일부 온라인 검색에서는 단순히 바늘 grep만 교체하는 것을 제안합니다 (dmesgfirmwarehttps://wiki.gentoo.org/wiki/Linux_firmware#Searching_for_loaded_firmware). 이것이 약간의 통찰력을 제공하는 것처럼 보이지만 이것이 최선/유일한/올바른 접근 방식인지는 확실하지 않습니다. 내 생각에는

  1. "펌웨어"라는 단어는 dmesg실제 바이너리 blob과 관련이 없는 컨텍스트에서 출력 에 나타납니다.
  2. 펌웨어 로딩 정보를 표시할 때 다양한 커널 소스 코드 섹션의 통합 출력이 없습니다(확실하지는 않음).
[root@thinkbox ~]# dmesg -i 펌웨어 |
[0.111955] Spectre V2: 펌웨어 호출에 대해 제한된 추측 활성화
[0.161877] ACPI: [펌웨어 오류]: BIOS_OSI(Linux) 쿼리가 무시되었습니다.
[10.440450] 플랫폼 Regulator.0: Regulatory.db의 직접 펌웨어 로드가 오류 -2로 인해 실패했습니다.
[10.493359]i915 0000:00:02.0:[drm] DMC 펌웨어 로딩 완료 i915/skl_dmc_ver1_27.bin(v1.27)
[10.581810] iwlwifi 0000:04:00.0: 로드된 펌웨어 버전 36.ca7b901d.0 8000C-36.ucode op_mode iwlmvm
[10.766097] 블루투스: hci0: 펌웨어 개정 0.0 빌드 10주 41 2018
[11.947004] psmouse serio2: 트랙포인트: IBM TrackPoint 펌웨어: 0x0e, 버튼: 3/3
[4855.262357] 블루투스: hci0: 최소 펌웨어 버전 2014년 10월 1주
[4855.268828] 블루투스: hci0: 장치 펌웨어 발견: intel/ibt-11-5.sfi
[4857.277466] 블루투스: hci0: 펌웨어 다운로드가 완료되기를 기다리는 중
[4857.278204] bluetooth: hci0: 1962276 usecs에 로드된 펌웨어
[4857.297293] 블루투스: hci0: 펌웨어 개정 0.0 빌드 10주 41 2018
[20995.531309] 블루투스: hci0: 최소 펌웨어 버전 1 2014년 10월 10일
[20995.531314] 블루투스: hci0: 장치 펌웨어 발견: intel/ibt-11-5.sfi
[20997.352132] 블루투스: hci0: 펌웨어 다운로드가 완료되기를 기다리는 중
[20997.352924] 블루투스: hci0: 1778914 usecs에 로드된 펌웨어
[20997.370079] 블루투스: hci0: 펌웨어 개정 0.0 버전 2018-10-41
[22827.736960] 블루투스: hci0: 최소 펌웨어 버전 1 2014년 10월 1일
[22827.737757] 블루투스: hci0: 장치 펌웨어 발견: intel/ibt-11-5.sfi
[22829.202536] 블루투스: hci0: 펌웨어 다운로드가 완료되기를 기다리는 중
[22829.202753] 블루투스: hci0: 펌웨어 로드됨 1430656 usecs
[22829.219920] 블루투스: hci0: 펌웨어 개정 0.0 버전 10 2018년 41주차

편집: 출력 스크린샷을 텍스트 복사본으로 대체했습니다.

답변1

이것은 아마도 그것을 찾는 가장 최악의 방법이자 가장 쉬운 방법일 것입니다:

  1. sudo mv /lib/firmware /lib/firmware.bak
  2. 재시작
  3. dmesg찾을 수 없는 펌웨어 파일을 확인하세요 .
  4. sudo mv /lib/firmware.bak /lib/firmware
  5. 이제 eg를 생성 /lib/firmware.needed하고 해당 디렉터리에 파일을 복사합니다 /lib/firmware(원하는 디렉터리 구조를 유지하면서).
  6. 그런 다음 패키지를 삭제하고 mv /lib/firmware.needed /lib/firmware.

이제 준비가 되었습니다.

이 작업을 자동으로 수행하는 마법의 명령은 없습니다. 나는 단지 사용을 생각할 수있다inotifywait -r /lib/firmware 초기시작하고 출력을 기록하는 동안 이는 훨씬 더 복잡해집니다. 사용하고 있다면 initrd(그리고 대부분의 사람들이 사용하고 있다면) 더 복잡합니다.


@MarcusMüller는 시도해 볼 만한 매우 깔끔한 아이디어를 제공합니다. 루트 파일 시스템에 대한 옵션을 활성화하고 atime재부팅한 후 다음 명령을 실행하십시오.

find /lib/firmware -atime -1

이론적으로 이는 지난 24시간 동안 액세스한 모든 파일을 표시해야 하며 /lib/firmware여기에는 필요한 모든 펌웨어 파일이 포함되어야 합니다.

답변2

AFAIK, 표준 Linux 커널을 사용하고 /lib/firmware를 마지막으로 업데이트한 지 최소 2일이 지난 경우 재부팅하고 다음을 실행하는 것이 더 쉽습니다.

find /lib/firmware -atime 2

예를 들어, 펌웨어가 필요한 스캐너가 있고 최근에 열지 않은 경우 위 명령은 해당 펌웨어를 나열하지 않습니다.

이 명령은 이제 Linux 커널의 기본값이 "lazyatime,relatime"으로 설정되어 있기 때문에 작동합니다. 이는 (a) 파일이 마지막으로 변경되거나 수정된 ​​이후 처음으로 파일에 액세스했거나 (b) 파일에 더 많은 시간 동안 액세스한 경우를 의미합니다. 10분이 넘으면 24시간 만에 처음으로 "atime"이 업데이트됩니다. 이 명령은 "man find"에 설명된 반올림 이유를 달성하기 위해 "-atime 2"를 사용합니다. 커널이 펌웨어를 다시 로드하려면 재부팅이 필요합니다.

작동하지 않으면 "/etc/fstab"을 업데이트하여 rootfs의 "noatime" 및 유사한 마운트 옵션을 거의 모든 사용 사례에 가장 적합한 "lazyatime"으로 바꾸십시오.

관련 정보