Làm cách nào để sao chép các lựa chọn gói đã cài đặt từ một hệ thống Debian sang hệ thống khác? (Debian Wheezy)


19

Tôi đang cố gắng thiết lập môi trường dàn dựng trong VM, để kiểm tra các bản cập nhật trước khi áp dụng chúng vào hệ thống chính của tôi.

Để làm như vậy, tôi đã thực hiện cài đặt cơ bản Debian Wheezy (giống như trên hệ thống chính) trong VM, sau đó chạy dưới quyền root từ bên trong VM:

# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh me@main-system 'dpkg --get-selections | grep -v deinstall' | \
  dpkg --set-selections

Không may kiến ​​trúc i386 cần thiết trong trường hợp của tôi; hệ thống là amd64 bản địa.

Vấn đề là với dpkg --set-selectionschạy trong VM. Tôi có một số gói yêu cầu xử lý đặc biệt (đó thực sự là lý do chính khiến tôi muốn có môi trường dàn dựng ở nơi đầu tiên) nhưng khi tôi chạy lệnh cuối cùng ở trên, tôi nhận được khoảng một dòng đầu ra như:

dpkg: warning: package not in database at line NNN: package-name

cho các gói thực sự nên có sẵn trong hệ thống cơ sở. Ví dụ bao gồm xterm, yelpzip.

Bây giờ cho câu hỏi của tôi:

Quá trình cụ thể để chuyển danh sách lựa chọn gói từ một hệ thống Debian sang hệ thống khác (giả sử cùng mức phát hành Debian, trong Wheezy) và sau đó áp dụng những thay đổi đó là gì? Mục tiêu là cả hai đều có cùng một danh sách các gói được cài đặt, lý tưởng là việc thực hiện diffgiữa các đầu ra của dpkg --get-selectionshoặc dpkg --listtrên hai trở lại cho thấy không có sự khác biệt.

Phần grep -v deinstallđược mượn từ các gói Ngăn chặn bị xóa sau khi thực hiệndpkg --set-selections trên Hỏi Ubuntu.

Tôi đã thay đổi nguồn trong VM giống như trên hệ thống chính, cũng cài đặt apt-transport-https:

deb https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb [arch=amd64] http://archive.zfsonlinux.org/debian wheezy main

Nhìn vào đầu ra --set-select, tôi thấy:

dpkg: warning: package not in database at line 1: a2ps
dpkg: warning: package not in database at line 1: abiword
dpkg: warning: package not in database at line 1: abiword-common
dpkg: warning: package not in database at line 1: abiword-plugin-grammar
dpkg: warning: package not in database at line 1: abiword-plugin-mathview
dpkg: warning: package not in database at line 1: accountsservice
dpkg: warning: package not in database at line 1: acl
dpkg: warning: package not in database at line 4: aglfn
dpkg: warning: package not in database at line 4: aisleriot
dpkg: warning: package not in database at line 4: alacarte
dpkg: warning: package not in database at line 4: alien
...

Các số dòng trông có vẻ kỳ lạ và phần tương ứng của đầu ra của --get-select là:

a2ps install
abiword install
abiword-common install
abiword-plugin-grammar install
abiword-plugin-mathview install
accountsservice install
acl install
acpi-support-base install
acpid install
adduser install
aglfn install
aisleriot install
alacarte install
alien install

Lưu ý rằng ở giữa aclaglfnacpi-support-base, acpidadduser không có lỗi nào được báo cáo . Có vẻ như các gói mà lỗi được báo cáo là untheo dpkg -lhoặc dpkg -lkhông có bất kỳ ý tưởng nào về chúng ( dpkg-query: no packages found matching ...). Tôi biết có một số gói cài đặt cục bộ, nhưng không nhiều. i386không con số cho đến gcc-4.7-base:i386 install nhiều hơn ở phía dưới danh sách (dòng 342 trong đầu ra --get-selections).


dpkg --get-selections … | … dpkg --set-selectionslà cách để nhân rộng các lựa chọn gói. Nếu nó không thành công với bạn, bạn sẽ cần cung cấp thêm thông tin về lý do. Đăng toàn bộ nguồn của bạn trên cả hai hệ thống, đầu ra từ dpkg --get-selectionsvà bản sao đầy đủ từ dpkg --get-selections(có thể chúng ta có thể nhận ra một mẫu bằng cách xem những gì hoạt động và những gì không). Nếu hệ thống chính amd64 hay i386? Nó có hoạt động không nếu bạn không thêm kiến ​​trúc i386?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Có thực sự cần phải là đầu ra đầy đủ từ dpkg --get-selections(và tôi giả sử bạn có nghĩa là dpkg --set-selectionsbảng điểm?)? Thậm chí chỉ trước đây là hơn 3.600 dòng và khoảng 100 KB.
một CVn

Bạn cần đăng đủ để chúng tôi nhận ra mô hình gói nào gây ra lỗi và lỗi nào không xảy ra (trừ khi bạn có thể tự mình tìm ra). Một bản sao của /var/lib/dpkg/Packages(thậm chí còn dài hơn) cũng có thể hữu ích - đây có thể là một triệu chứng của tệp Gói bị hỏng.
Gilles 'SO- ngừng trở thành ác quỷ'

@Gilles Điểm thú vị. Tôi đã không thực sự xem xét khả năng, nhưng tôi sử dụng các gương khác nhau trên những cái này. Hãy để tôi xem nếu nó vẫn xảy ra nếu tôi trỏ VM vào cùng một máy nhân bản Debian. Đứng gần.
một CVn

@Gilles Điều đó thực sự không tạo ra bất kỳ sự khác biệt rõ rệt nào, nhưng tôi đã tìm thấy một cái gì đó khác. Xem câu hỏi cập nhật.
một CVn

Câu trả lời:


17

Để sao chép cài đặt Debian, hãy sử dụng apt-clonetiện ích. Nó có sẵn (dưới dạng một gói riêng biệt, không phải là một phần của cài đặt mặc định) trong Debian kể từ khi khò khè và trong Ubuntu kể từ ngày 12.04. Trên máy hiện có, chạy

apt-clone clone foo

Điều này tạo ra một tập tin foo.apt-clone.tar.gz. Sao chép nó vào máy đích và chạy

apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz

Nếu bạn đang làm việc với một hệ thống cũ apt-clonekhông khả dụng hoặc nếu bạn chỉ muốn sao chép danh sách các gói đã cài đặt nhưng không có bất kỳ tệp cấu hình nào, đây là các bước thủ công.

  • Trên máy nguồn:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • Trên máy đích:

    cp sources.list /etc/apt/
    apt-get update
    /usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
    dpkg --set-selections <selections.list
    apt-get dselect-upgrade
    xargs apt-mark auto <auto.list
    

Tôi tin rằng bạn bị ảnh hưởng bởi sự thay đổi không tương thích trong dpkg, điều đầu tiên khiến nó trở nên khò khè. Xem lỗi # 703092 cho nền.

Câu chuyện ngắn là dpkg --set-selectionsbây giờ chỉ chấp nhận tên gói có trong tệp /var/lib/dpkg/statushoặc /var/lib/dpkg/available. Nếu bạn chỉ sử dụng APT để quản lý các gói, như hầu hết mọi người, thì /var/lib/dpkg/availablesẽ không được cập nhật.

Sau khi chạy apt-get updatevà trước khi chạy dpkg --set-selectionsapt-get -u dselect-upgradechạy lệnh sau:

apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail

Từ jessie trở đi, bạn có thể đơn giản hóa việc này thành

apt-cache dumpavail | dpkg --merge-avail

Hoặc, chạy

/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/

hoặc thậm chí đơn giản hơn

apt-get install dctrl-tools
sync-available

Một phương pháp đơn giản khác không yêu cầu cài đặt gói bổ sung nhưng sẽ tải lại danh sách gói đó là

dselect update

Xem Câu hỏi thường gặp về dpkg để biết thêm thông tin. (Điều này được đề cập trong trang man dpkg, nhưng nhiều hơn theo cách sẽ nhắc nhở bạn về vấn đề nếu bạn đã biết, không phải theo cách giải thích cách giải quyết vấn đề!)

Lưu ý rằng nhân bản cài đặt gói dpkg --set-selectionsmà không khôi phục nhãn tự động / thủ công trong APT. Xem Khôi phục tất cả dữ liệu và phụ thuộc từ dpkg --set-tests '*' để biết thêm chi tiết. Bạn có thể lưu các dấu trên hệ thống nguồn với

apt-mark showauto >auto.list

và khôi phục chúng trên hệ thống đích với

xargs apt-mark auto <auto.list

3
Vấn đề này phải được nhìn thấy nhiều hơn nó. Tôi không thể tin rằng tôi đã không nghe nói về nó trước đây!
Faheem Mitha

Hấp dẫn. Đi để cho điều này một shot. Cảm ơn!
một CVn

@FaheemMitha Vâng, tôi ngạc nhiên rằng tôi chưa bao giờ nghe về nó trước ngày hôm nay. Tôi không thể tin rằng tôi đã không sử dụng dpkg --set-selectionstừ trước khi khò khè!
Gilles 'SO- ngừng trở thành ác quỷ'

Được rồi, điều đó đã đưa ra một danh sách cảnh báo ngắn hơn rất nhiều từ --set-selections. Bây giờ làm thế nào để tôi áp dụng các thay đổi? Thậm chí apt-get -u dist-upgradechỉ đề cập đến một số gói (tất cả liên quan đến ZFS) trong đó sẽ có hàng trăm gói nếu không có hàng ngàn gói bị ảnh hưởng.
một CVn

@ MichaelKjorling Thatapt-get -u dselect-upgrade
Gilles 'SO- ngừng trở thành ác quỷ'

0

Làm thế nào tôi làm điều đó

  1. Trên máy chủ nguồn :

    apt-get update && apt-get dist-upgrade
    dpkg --get-selection >/tmp/source.sel
    cat /etc/apt/sources.list
    

    quan tâm /etc/apt/sources.list.dnếu được sử dụng ...

    Sau đó sao chép source.seltập tin vào máy chủ đích.

  2. Trên máy chủ đích :

    vi /etc/apt/sources.list 
    

    điều chỉnh nguồn.list ngay cả với các gương khác nhau, nhưng cùng một danh sách thành phần .

    apt-get update
    dselect upgrade
    dpkg --set-selection </tmp/source.sel
    dselect install
    

    Và bây giờ, máy chủ đích của tôi hiện đang cài đặt rất nhiều thứ, sau đó tôi có thể mất một chút thời gian để đăng bài này.


Có lẽ 'nâng cấp DSelect' phải là 'cập nhật DSelect' trong phần mô tả 'Cách tôi thực hiện' ở trên.
Jonathan Kimmitt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.