Cấu hình này đến từ đâu? [Debian/Ubuntu]

Mục đích của bài đăng này là trình bày kỹ thuật gỡ lỗi trong debian/ubuntu liên quan đến việc "tìm nguồn" trong tệp cấu hình hệ thống.

Ví dụ kiểm tra: sau nhiều lần chế nhạo bản sao tar.gz của hệ điều hành đã cài đặt và sau khi khôi phục nó cũng như cài đặt các bản cập nhật, chúng tôi nhận được thông báo:

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.

Mục tiêu: hiểu giá trị này (U1563304817I0) đến từ đâu và cách thay đổi giá trị đó một cách chính xác. Đây là ví dụ đầu tiên xuất hiện, bản thân nó không đặc biệt thú vị nhưng thuận tiện để hiển thị các phương pháp làm việc thực tế với Linux.

Bước số 1: RESUME đến từ đâu?

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

Chúng tôi đệ quy (-r) hãy tìm đề cập đến biến này trong thư mục /etc (nơi chứa hầu hết các cấu hình). Chúng tôi tìm thấy đoạn mã conf.d, được gói initramfs-tools sử dụng rõ ràng.

Đoạn trích này lấy từ đâu?

Có ba lựa chọn:

  1. Hiện vật ma thuật (có người đặt rồi quên mất)
  2. Cấu hình từ gói
  3. Cấu hình được tạo bởi một số tập lệnh từ gói hệ thống

Hãy kiểm tra số 2 (đơn giản nhất):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*

dpkg -S cho phép chúng tôi tìm kiếm cơ sở dữ liệu của các tệp đã cài đặt và tìm xem tệp đó thuộc về gói nào. Dưới đây là ví dụ về tìm kiếm thành công:

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

Hãy quay lại nhiệm vụ của chúng ta: tập tin initramfs-tools/conf.d/resume chưa được cài đặt trên hệ thống từ gói. Có lẽ nó được tạo trong tập lệnh postinst/preinst của gói? Hãy kiểm tra phiên bản số 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

Trong danh mục /var/lib/dpkg/info/ có các phiên bản đã giải nén của tất cả các “siêu tệp” của gói (tập lệnh cài đặt/gỡ bỏ, mô tả gói, v.v.). Điều đáng ngạc nhiên là tệp này bị xóa trong postrm (khi gỡ cài đặt) của gói initramfs-tools-core. Chúng ta hãy xem nội dung postinst của nó... Không có gì liên quan đến thư mục conf.d.

Hãy xem các tập tin có trong gói initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...

Đội dpkg -L cho phép bạn xem tất cả các tệp có trên hệ thống từ gói được chỉ định. Tôi đã đánh dấu một tập tin thú vị để nghiên cứu. Kiểm tra tệp cho thấy biến này được sử dụng như thế nào, nhưng không biết nó đến từ đâu.

gỡ lỗi

Hóa ra đây là hiện vật của ai đó. Của ai? Trước khi đi sâu vào trình cài đặt, chúng ta hãy xem xét một cơ sở hạ tầng quan trọng khác của Debian - câu trả lời cho các câu hỏi. Mỗi khi một gói hỏi một câu hỏi, và trong nhiều trường hợp khi nó không đặt câu hỏi mà sử dụng tùy chọn mặc định, cả câu hỏi và câu trả lời đều được ghi lại trong một cơ sở dữ liệu đặc biệt trong Debian có tên là debconf. Chúng ta có thể xem cơ sở dữ liệu các câu trả lời (và thậm chí đặt chúng trước khi cài đặt gói - debconf-set-selections), để làm được điều này chúng ta cần một tiện ích debconf-get-selections từ thành phần debconf-utils. Thật không may, không có gì thú vị được tìm thấy :(debconf-get-selections |grep -i resume trả về trống).

trình cài đặt debian

Trình cài đặt có cơ sở dữ liệu riêng về câu trả lời cho các câu hỏi: /var/log/installer/cdebconf/questions.dat. Thật không may, cũng không có một lời nào về sơ yếu lý lịch của chúng tôi.
Nhưng có những khúc gỗ gần đó, bao gồm cả. syslog, nơi ghi toàn bộ nhật ký cài đặt. Gói cài đặt cơ sở được đề cập ở đó và trên đó trang chúng ta có thể thấy liên kết đến bản raw.

Bên trong chúng, chúng ta có thể dễ dàng tìm thấy câu trả lời cho câu hỏi của mình:

  resume="$(mapdevfs "$resume_devfs")"; then
...
    if [ "$do_initrd" = yes ]; then
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

mapdevfs là một tiện ích có mục đích rõ ràng và chức năng chúng tôi quan tâm là get_resume_partition, đọc /proc/swaps và chọn cái lớn nhất ở đó. Hoán đổi đến từ partman.

Câu trả lời cho nhiệm vụ kiểm tra của chúng tôi: tệp được trình cài đặt tạo trong /target tại thời điểm cài đặt, tức là. chúng ta đang nói về một thứ nổi tiếng nhưng là một hiện vật. Không có ai hoặc bất cứ thứ gì trong các gói hiện có trong hệ thống có thể thay đổi tệp này.

Tổng hợp

  1. dpkg và debconf là các phương pháp chính để tìm nhà cung cấp tệp.
  2. tìm kiếm trong /var/lib/dpkg/info cho phép bạn xem các thao tác trên tệp trong giai đoạn cài đặt.
  3. Trình cài đặt có thể tạo các tệp giả tạo mà sau đó không ai có thể thay đổi được (ngoại trừ người dùng) và điều này có thể được thấy trong mã trình cài đặt.

Nguồn: www.habr.com

Thêm một lời nhận xét