ฉันจะทำซ้ำการเลือกแพ็คเกจที่ติดตั้งจากระบบ Debian หนึ่งไปยังอีกระบบหนึ่งได้อย่างไร (Debian Wheezy)


19

ฉันกำลังพยายามตั้งค่าสภาพแวดล้อมการจัดเตรียมใน VM เพื่อทดสอบการอัปเดตก่อนนำไปใช้กับระบบหลักของฉัน

เพื่อที่จะทำเช่นนั้นฉันได้ทำการติดตั้งพื้นฐานของ Debian Wheezy (เช่นเดียวกับในระบบหลัก) ใน VM จากนั้นก็รันเป็นรูทจากภายใน VM:

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

สถาปัตยกรรมของ i386 นั้นเป็นสิ่งจำเป็นสำหรับฉัน ระบบเป็นแบบดั้งเดิม 64

ปัญหาเกิดขึ้นกับการdpkg --set-selectionsทำงานใน VM ฉันมีแพ็กเกจบางอย่างที่ต้องการการจัดการเป็นพิเศษ (อันที่จริงแล้วเป็นเหตุผลหลักว่าทำไมฉันต้องการสภาพแวดล้อมการจัดเตรียมในตอนแรก) แต่เมื่อฉันรันคำสั่งสุดท้ายข้างต้นฉันได้ผลลัพธ์ประมาณพันล้านบรรทัดเช่น:

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

สำหรับแพ็คเกจที่ควรมีอยู่ในระบบพื้นฐาน ตัวอย่าง ได้แก่xterm, และyelpzip

ตอนนี้สำหรับคำถามของฉัน:

กระบวนการเฉพาะสำหรับการถ่ายโอนรายการตัวเลือกแพคเกจจากระบบ Debian หนึ่งไปยังอีกระบบหนึ่งคืออะไร (สมมติว่าระดับการปล่อย Debian เดียวกันใน Wheezy) จากนั้นใช้การเปลี่ยนแปลงเหล่านั้นในภายหลัง เป้าหมายคือทั้งคู่มีรายการแพคเกจที่ติดตั้งเหมือนกันโดยที่การทำdiffระหว่างเอาท์พุทของdpkg --get-selectionsหรือdpkg --listบนทั้งสองนั้นกลับมาแสดงให้เห็นว่าไม่มีความแตกต่าง

grep -v deinstallส่วนหนึ่งจะถูกยืมมาจากแพคเกจการป้องกันจากการถูกลบออกหลังจากทำdpkg --set-selectionsมากกว่าเมื่อถามอูบุนตู

ฉันได้เปลี่ยนแหล่งที่มาใน VM ให้เหมือนกับในระบบหลักติดตั้งด้วย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

มองไปที่เอาต์พุต --set-selections ฉันเห็น:

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
...

หมายเลขบรรทัดดูแปลก ๆ และส่วนที่เกี่ยวข้องของเอาต์พุต --get-selections คือ:

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

แจ้งให้ทราบว่าในระหว่างaclและaglfnมีacpi-support-base, acpidและที่ไม่มีข้อผิดพลาดที่มีการรายงานadduser ดูเหมือนว่าแพ็กเกจที่มีการรายงานข้อผิดพลาดนั้นเป็นunไปตามdpkg -lหรือdpkg -lไม่มีความคิดใด ๆ เกี่ยวกับพวกเขา ( dpkg-query: no packages found matching ...) ฉันรู้ว่ามีบางแพ็คเกจที่ติดตั้งภายในเครื่อง แต่ไม่มาก i386ไม่ได้คิดจนกระทั่งรายการไกลออกไปgcc-4.7-base:i386 install มากนัก (บรรทัด 342 ในเอาต์พุต --get-selections)


dpkg --get-selections … | … dpkg --set-selectionsเป็นวิธีการทำซ้ำการเลือกแพ็คเกจ ถ้ามันล้มเหลวสำหรับคุณคุณจะต้องให้ข้อมูลเพิ่มเติมว่าทำไม โพสต์ชุดเต็มของแหล่งที่มาของคุณบนทั้งสองระบบเอาท์พุทจากdpkg --get-selectionsและทรานสคริปต์เต็มรูปแบบจากdpkg --get-selections(บางทีเราสามารถแยกแยะรูปแบบโดยดูว่าอะไรทำงานได้และอะไรไม่ได้) หากระบบหลัก amd64 หรือ i386? มันใช้งานได้ถ้าคุณไม่เพิ่มสถาปัตยกรรม i386 หรือไม่?
Gilles 'หยุดความชั่วร้าย'

@Gilles จำเป็นต้องมีการส่งออกเต็มรูปแบบจากdpkg --get-selections(และฉันคิดว่าคุณหมายถึงการdpkg --set-selectionsถอดเสียง?) แม้แต่ในอดีตมีมากกว่า 3,600 สายและถูกประมาณ 100 KB
CVn

คุณต้องโพสต์ให้เราพอที่จะมองเห็นรูปแบบของแพคเกจที่ทำให้เกิดข้อผิดพลาดและสิ่งที่ทำไม่ได้ สำเนาของ/var/lib/dpkg/Packages(ซึ่งยาวกว่า) อาจมีประโยชน์เช่นกัน - นี่อาจเป็นอาการของไฟล์แพคเกจที่ใช้งานไม่ได้
Gilles 'หยุดชั่วร้าย'

@Gilles จุดที่น่าสนใจ ฉันไม่ได้พิจารณาถึงความเป็นไปได้จริง ๆ แต่ฉันใช้กระจกที่แตกต่างกันในสิ่งเหล่านี้ ให้ฉันดูว่ามันยังคงเกิดขึ้นไหมถ้าฉันชี้ VM ไปที่กระจก Debian เดียวกัน รอ.
CVn

@Gilles นั่นไม่ได้สร้างความแตกต่างที่สังเกตเห็นได้จริง ๆ แต่ฉันพบสิ่งอื่น ดูคำถามที่ปรับปรุง
CVn

คำตอบ:


17

หากต้องการโคลนการติดตั้ง Debian ให้ใช้apt-cloneยูทิลิตีนี้ มีให้บริการ (เป็นแพ็คเกจแยกต่างหากไม่ใช่ส่วนหนึ่งของการติดตั้งเริ่มต้น) ใน Debian ตั้งแต่เสียงดังและใน Ubuntu ตั้งแต่ 12.04 บนเครื่องที่มีอยู่ให้เรียกใช้

apt-clone clone foo

foo.apt-clone.tar.gzนี้จะสร้างไฟล์ คัดลอกไปยังเครื่องปลายทางแล้วเรียกใช้

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

หากคุณกำลังทำงานกับระบบเก่าที่apt-cloneไม่สามารถใช้งานได้หรือถ้าคุณแค่ต้องการทำซ้ำรายการแพ็คเกจที่ติดตั้ง แต่ไม่ใช่ไฟล์การกำหนดค่าใด ๆ นี่คือขั้นตอนที่ต้องทำด้วยตนเอง

  • บนเครื่องต้นทาง:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • บนเครื่องเป้าหมาย:

    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
    

ฉันเชื่อว่าคุณได้รับผลกระทบจากการเปลี่ยนแปลงที่เข้ากันไม่ได้ใน dpkg ซึ่งทำให้มันกลายเป็นเสียงฮืด ๆ ดูข้อผิดพลาด # 703092สำหรับพื้นหลัง

เรื่องราวสั้น ๆ ว่าdpkg --set-selectionsตอนนี้ยอมรับเฉพาะชื่อแพคเกจที่มีอยู่ในไฟล์หรือ/var/lib/dpkg/status /var/lib/dpkg/availableหากคุณใช้ APT เพื่อจัดการแพ็คเกจเช่นเดียวกับคนส่วนใหญ่/var/lib/dpkg/availableจะไม่ได้รับการอัปเดต

หลังจากรันapt-get updateและก่อนรันdpkg --set-selectionsและapt-get -u dselect-upgradeรันคำสั่งต่อไปนี้:

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

จาก jessie เป็นต้นไปคุณสามารถทำให้สิ่งนี้ง่ายขึ้นถึง

apt-cache dumpavail | dpkg --merge-avail

หรือเรียกใช้

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

หรือง่ายกว่า

apt-get install dctrl-tools
sync-available

อีกวิธีง่าย ๆ ที่ไม่ต้องติดตั้งแพคเกจเพิ่มเติม แต่จะดาวน์โหลดรายการแพคเกจอีกครั้งคือ

dselect update

ดูคำถามที่พบบ่อยของ dpkgสำหรับข้อมูลเพิ่มเติม (สิ่งนี้ถูกกล่าวถึงใน dpkg man page แต่มีวิธีอื่นที่จะเตือนคุณถึงปัญหาหากคุณได้รับทราบแล้วไม่ใช่วิธีที่อธิบายวิธีแก้ปัญหา!)

โปรดทราบว่าการโคลนการติดตั้งแพ็กเกจด้วยdpkg --set-selectionsจะไม่คืนค่าเครื่องหมายอัตโนมัติ / แมนนวลใน APT ดูการกู้คืนข้อมูลและการอ้างอิงทั้งหมดจาก dpkg --set-selections '*'สำหรับรายละเอียดเพิ่มเติม คุณสามารถบันทึกเครื่องหมายบนระบบต้นทางด้วย

apt-mark showauto >auto.list

และเรียกคืนข้อมูลเหล่านั้นบนระบบเป้าหมายด้วย

xargs apt-mark auto <auto.list

3
ปัญหานี้ควรจะมองเห็นได้ชัดเจนกว่าที่เป็นอยู่ ฉันไม่อยากจะเชื่อเลยว่าฉันไม่เคยได้ยินมาก่อน!
Faheem Mitha

น่าสนใจ จะให้ภาพนี้ ขอบคุณ!
CVN

@FaheemMitha ใช่ฉันประหลาดใจที่ฉันไม่เคยได้ยินมาก่อนวันนี้ ฉันไม่อยากจะเชื่อเลยว่าไม่ได้ใช้มาdpkg --set-selectionsตั้งแต่ก่อนตี!
Gilles 'หยุดชั่วร้าย'

--set-selectionsเอาล่ะที่ทำให้รายการที่สั้นมากของคำเตือนจาก ตอนนี้ฉันจะใช้การเปลี่ยนแปลงอย่างไร แม้apt-get -u dist-upgradeจะกล่าวถึงแพ็กเกจเพียงไม่กี่ชุด (ที่เกี่ยวข้องกับ ZFS ทั้งหมด) ซึ่งควรมีหลายร้อยหากไม่ได้รับผลกระทบหลายพันแพ็คเกจ
CVN

@ MichaelKjörling That'sapt-get -u dselect-upgrade
Gilles 'SO- หยุดความชั่วร้าย'

0

ฉันทำได้อย่างไร

  1. บนโฮสต์ต้นทาง :

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

    สนใจ/etc/apt/sources.list.dถ้าใช้ ...

    จากนั้นคัดลอกsource.selไฟล์ไปยังโฮสต์ปลายทาง

  2. บนโฮสต์ปลายทาง :

    vi /etc/apt/sources.list 
    

    ปรับแหล่งที่มารายการแม้จะมีมิเรอร์ที่แตกต่างกัน แต่รายการองค์ประกอบเดียวกัน

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

    และตอนนี้โฮสต์ปลายทางของฉันกำลังติดตั้งสิ่งต่างๆมากมายจากนั้นฉันอาจใช้เวลาสักครู่ในการโพสต์สิ่งนี้


บางที 'การอัพเกรด dselect' ควรเป็น 'การอัปเดต dselect' ในคำอธิบาย 'ฉันจะทำอย่างไร' ด้านบน
Jonathan Kimmitt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.