이 게시물의 목적은 디버깅 기법을 보여주는 것입니다. debian/ubuntu, связанную с «поиском первоисточника» в системном конфигурационном файле.
테스트 예: 설치된 OS의 tar.gz 복사본을 많이 조롱한 후 이를 복원하고 업데이트를 설치한 후 다음 메시지를 받습니다.
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools configuration sets RESUME=/dev/mapper/U1563304817I0-swap
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Set the RESUME variable to override this.목표: 이 값(U1563304817I0)의 출처와 이를 올바르게 변경하는 방법을 이해합니다. Это первый попавшийся пример, не особо интересный сам по себе, но удобный, чтобы показать практические методы работы с Linux.
1단계: RESUME은 어디에서 왔나요?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap우리는 재귀적으로 (-r) /etc 디렉터리(대부분의 구성이 있는 곳)에서 이 변수에 대한 언급을 찾아보세요. initramfs-tools 패키지에서 명확하게 사용되는 conf.d 조각을 찾습니다.
이 스니펫의 출처는 어디인가요?
세 가지 옵션이 있습니다.
- 마법의 유물(누군가가 넣어두고 잊어버렸음)
- 패키지의 구성
- 시스템 패키지의 일부 스크립트에 의해 생성된 구성
가장 간단한 방법으로 2번을 확인해 보겠습니다.
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*dpkg -S 설치된 파일의 데이터베이스를 검색하고 파일이 속한 패키지를 찾을 수 있습니다. 다음은 성공적인 검색의 예입니다.
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf우리의 작업으로 돌아가자: 파일 initramfs-tools/conf.d/resume 패키지에서 시스템에 설치되지 않았습니다. 어쩌면 패키지의 postinst/preinst 스크립트에서 생성되었을 수도 있습니다. 버전 3을 확인해 보겠습니다.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resume카탈로그에서 /var/lib/dpkg/info/ 패키지의 모든 "메타파일"(설치/제거 스크립트, 패키지 설명 등)의 압축이 풀린 버전이 있습니다. 놀랍게도 이 파일은 initramfs-tools-core 패키지의 postrm(제거 시)에서 제거됩니다. postinst의 내용을 살펴보겠습니다. conf.d 디렉토리와 관련된 내용은 없습니다.
패키지에 포함된 파일을 살펴보겠습니다. initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...팀 dpkg -L 지정된 패키지에서 시스템에 있는 모든 파일을 볼 수 있습니다. 연구에 흥미로운 파일을 강조 표시했습니다. 파일을 검사하면 이 변수가 어떻게 사용되는지 알 수 있지만 어디서 왔는지는 알 수 없습니다.
debconf
Получается, это чей-то артефакт. Чей? Перед тем, как нырять в инсталлятор, глянем ещё в одну важную инфраструктуру Debian — ответы на вопросы. Каждый раз, когда пакет задаёт вопрос, и во многих случаях, когда он вопроса не задаёт, но использует вариант по-умолчанию, и вопрос, и ответ фиксируются в специальной базе в Debian, которая называется debconf. Мы можем посмотреть на базу ответов (и даже выставить их до установки самого пакета — debconf-set-selections), 이를 위해서는 유틸리티가 필요합니다 debconf-get-selections 실적 debconf-utils. 불행히도 흥미로운 것은 발견되지 않았습니다 :(debconf-get-selections |grep -i resume 빈 상태로 반환됨)
debian-설치자
설치 프로그램에는 질문에 대한 답변이 포함된 자체 데이터베이스가 있습니다. /var/log/installer/cdebconf/questions.dat. 안타깝게도 우리 이력서에 대해서도 한마디도 없습니다.
하지만 근처에 통나무가 있습니다. 전체 설치 로그가 기록되는 syslog. 기본 설치 프로그램 패키지가 거기에 언급되어 있습니다. raws에 대한 링크를 볼 수 있습니다.
그 안에서 우리는 질문에 대한 답을 쉽게 찾을 수 있습니다.
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs는 명확한 목적을 가진 유틸리티이며 우리가 관심 있는 기능은 다음과 같습니다. get_resume_partition, /proc/swap을 읽고 거기에서 가장 큰 것을 선택합니다. 스왑은 partman에서 제공됩니다.
테스트 작업에 대한 답변: 파일은 설치 시 설치 프로그램에 의해 /target에 생성됩니다. 우리는 잘 알려져 있지만 인공물에 대해 이야기하고 있습니다. 시스템의 기존 패키지에는 이 파일을 변경할 수 있는 사람이나 그 어떤 것도 없습니다.
최대 합계
- dpkg 및 debconf는 파일 공급자를 찾는 주요 방법입니다.
- /var/lib/dpkg/info를 검색하면 설치 단계에서 파일에 대한 작업을 볼 수 있습니다.
- 설치 프로그램은 누구도(사용자 제외) 변경하지 않는 아티팩트 파일을 생성할 수 있으며 이는 설치 프로그램 코드에서 볼 수 있습니다.
출처 : habr.com
