Tarkibga o'tish

dpkg va bog'liqliklar: past darajali qatlam bilan ishlash

apt va repozitoriylar maqolasida ko'rganimizdek, apt install ishga tushganda yuqori darajali qatlam paketni va uning bog'liqliklarini repozitoriydan topadi, so'ng haqiqiy o'rnatishni past darajali vositaga topshiradi. Debian/Ubuntu oilasida bu vosita — dpkg (Debian Package). apt ostida deyarli har doim dpkg ga tayanadi. Shu sababli paket bilan g'ayrioddiy narsa yuz berganda — o'rnatish yarim yo'lda qolib ketsa, bog'liqliklar ziddiyati paydo bo'lsa yoki qaysi fayl qaysi paketga tegishli ekanini aniq bilish kerak bo'lsa — javob ko'pincha apt darajasida emas, to'g'ridan-to'g'ri dpkg darajasida topiladi.

Bu maqola dpkg bilan to'g'ridan-to'g'ri ishlashni ko'rib chiqadi: u o'rnatilgan paketlar holatini qanday kuzatadi, nega bog'liqlik aynan shu darajada haqiqatan "buzilishi" mumkin va bunday vaziyatni qanday aniqlab, tuzatish kerak.

dpkg nima va uning apt bilan aloqasi

Paketlarni boshqarish asoslari maqolasidagi ikki qatlamli modelni eslang: dpkg — past darajali vosita. U bitta muayyan .deb faylni oladi, uni tizimga yozadi, so'ralganda olib tashlaydi va o'rnatilgan paketlar ro'yxatini yuritadi. Lekin dpkg ning bitta muhim cheklovi bor: u bog'liqliklarni faqat tekshiradi, ularni qidirmaydi. Agar .deb fayl "menga libssl3 kerak" deb e’lon qilsa va bu paket tizimda bo'lmasa, dpkg shunchaki xato haqida xabar beradi va to'xtaydi — uni topish uchun hech qachon internetga murojaat qilmaydi. apt aynan shu bo'shliqni to'ldirish uchun mavjud.

flowchart LR
    A["apt install package"] --> B["Finds package and dependencies\nin the repository"]
    B --> C["Downloads each one"]
    C --> D["Installs them one by one\nvia dpkg -i"]

Shu sababli oddiy kundalik ishda odatda faqat apt kifoya. dpkg bilan to'g'ridan-to'g'ri ishlash odatda ikki holatda kerak bo'ladi: qo'lda yuklab olingan va hech qaysi repozitoriyda bo'lmagan .deb faylni o'rnatishda yoki o'rnatilgan paket haqida aniq, batafsil ma’lumot kerak bo'lganda — masalan, u tizimga aynan qaysi fayllarni joylashtirgani.

O'rnatilgan paketlar haqida ma’lumot olish

Ro'yxat va holat

dpkg -l nginx

Namunaviy chiqish:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version              Architecture Description
+++-==============-====================-============-===============
ii  nginx          1.24.0-2ubuntu7      amd64        small, powerful, scalable web/proxy server

Dastlabki ikki harf holat kodi. Eng ko'p uchraydiganlari:

Kod Ma’nosi
ii To'liq o'rnatilgan (o'rnatish so'ralgan, o'rnatish yakunlangan)
rc Olib tashlangan, lekin konfiguratsiya fayllari qolgan (purge emas, remove bajarilgan)
iU O'rnatish so'ralgan, lekin hali sozlanmagan — odatda uzilib qolgan o'rnatish belgisi
iF Konfiguratsiya yarim yakunlangan — tuzatishni talab qiladigan buzilgan holat

rc holati aynan apt va repozitoriylar maqolasida ko'rilgan remove/purge farqining dpkg darajasidagi ko'rinishi: apt remove dan keyin paket shu holatga o'tadi.

To'liq ma’lumot

dpkg -s nginx

-s (status) paketning to'liq metama’lumotlarini ko'rsatadi — versiya, bog'liqliklar, o'rnatilgan sana, tavsif. Bu amalda apt show ning past darajadagi ekvivalenti, lekin faqat lokal o'rnatilgan paket ustida ishlaydi.

Paket qaysi fayllarni o'rnatgan

dpkg -L nginx

Namunaviy chiqish (qisqartirilgan):

/.
/etc
/etc/nginx
/etc/nginx/nginx.conf
/usr/sbin/nginx
/lib/systemd/system/nginx.service

Bu eng foydali troubleshooting vositalaridan biri: u "bu konfiguratsiya fayli qaysi paketdan keladi" yoki "bu paket olib tashlansa, qaysi fayllar yo'qoladi" degan savollarga aniq javob beradi.

Fayl qaysi paketga tegishli ekanini topish — teskari yo'nalish

dpkg -S /usr/sbin/nginx
nginx-core: /usr/sbin/nginx

-L paket nomidan fayllarni topadi; -S esa fayldan paket nomini topadi — teskari amal. Bu ayniqsa tizimda notanish faylga duch kelib, uni nima o'rnatganini aniqlash kerak bo'lganda foydali.

.deb faylni o'rnatishdan oldin ko'zdan kechirish

Hali o'rnatilmagan .deb fayl ichida aslida nima borligini oldindan ko'rish uchun:

dpkg -c package.deb

Bu biror narsani o'rnatishga qaror qilishdan oldin aynan qaysi fayllar qayerga tushishini ko'rishning xavfsiz, faqat o'qiydigan usuli.

.deb faylni to'g'ridan-to'g'ri o'rnatish va bog'liqlik muammosi

Ba’zan sizga kerak bo'lgan dastur hech qaysi repozitoriyda bo'lmaydi va faqat alohida .deb fayl sifatida tarqatiladi (brauzer, maxsus ilova). Bunday holatda:

sudo dpkg -i package.deb

Agar bu paket hali o'rnatilmagan boshqa paketlarga bog'liq bo'lsa, chiqish shunday ko'rinadi:

Selecting previously unselected package package.
(Reading database ... 123456 files and directories currently installed.)
Preparing to unpack package.deb ...
Unpacking package (1.0-1) ...
dpkg: dependency problems prevent configuration of package:
 package depends on libexample2 (>= 2.0); however:
  Package libexample2 is not installed.
dpkg: error processing package package (--configure):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 package

Bu xato emas, dpkg aynan loyihalanganidek ishlayapti: u e’lon qilingan bog'liqlikni tekshirdi, uni topa olmadi va to'xtadi. Paket endi diskka yozilgan, lekin sozlanmagan (unconfigured) holatda qoldirilgan (dpkg -l bunday paketni iU deb ko'rsatadi).

Yechim: bog'liqliklarni hal qilishni apt ga topshirish

sudo apt --fix-broken install

(eski ekvivalenti — apt-get install -f). Bu buyruq dpkg ning holat bazasini o'qiydi, sozlanmagan holatda qolgan paketlarni topadi, ularning yetishmayotgan bog'liqliklarini repozitoriydan yuklab oladi va o'rnatishni yakunlaydi. Aynan dpkg bog'liqlikni o'zi qidira olmagani uchun alohida .deb faylni o'rnatgandan so'ng darhol shu buyruq kerak bo'lishini kutish standart amaliyot hisoblanadi.

Tip

Amaliy qoida: qo'lda yuklab olingan .deb faylga dpkg -i qilgandan keyin, hech qanday xato chiqmagan bo'lsa ham, darhol apt --fix-broken install ni ishga tushiring. Bu har qanday holatda xavfsiz: agar bog'liqliklar allaqachon qondirilgan bo'lsa, buyruq shunchaki hech narsa qilish kerak emasligini aytadi.

dpkg holat bazasi: /var/lib/dpkg

dpkg har bir o'rnatilgan paket haqidagi ma’lumotni /var/lib/dpkg/status faylida oddiy matn ko'rinishida saqlaydi. Bu fayl butun tizim uchun "qaysi paket o'rnatilgan" degan savolga javob beradigan yagona ishonchli manba:

grep -A2 "^Package: nginx$" /var/lib/dpkg/status
Package: nginx
Status: install ok installed
Priority: optional

Danger

Bu faylni qo'lda tahrirlamang va o'chirmang. U dpkg ning ichki holat bazasi — noto'g'ri o'zgarish butun paket tizimini beqaror qilib qo'yishi mumkin. Undan faqat aniqlash manbasi sifatida o'qish uchun foydalaning; har qanday haqiqiy o'zgarish doim dpkg/apt buyruqlari orqali bajarilishi kerak.

Amaliy vaziyat: yarim o'rnatilgan paketni aniqlash va tuzatish

Muammo. Hamkasbingiz .deb faylni qo'lda yuklab olib, dpkg -i bilan o'rnatgan, lekin u xato bergan va server noma’lum holatda qolgan. Endi buni siz tartibga solishingiz kerak.

1-qadam. Buzilgan holatdagi paketlarni toping.

dpkg -l | tail -n +6 | grep -v '^ii'

dpkg -l chiqishi doim 5 ta sarlavha qatori bilan boshlanadi, shuning uchun tail -n +6 ularni o'tkazib yuboradi. Qolgan qatorlar orasidan grep -v '^ii' holat kodi ii (to'liq o'rnatilgan) bo'lmagan har qanday narsani — masalan, iU yoki iF ni ajratib oladi. Bo'sh natija buzilgan paket yo'qligini bildiradi.

2-qadam. Muammoli paketning aniq holatini tekshiring.

dpkg -s package

Chiqishda Status: install ok installed dan farqli ravishda Status: install ok unpacked (yozilgan, lekin sozlanmagan) kabi qator ko'rinishi oraliq, buzilgan holatni tasdiqlaydi.

3-qadam. Aynan qaysi bog'liqlik yetishmayotganini aniqlang.

sudo dpkg --configure package

Bu tugallanmagan konfiguratsiyani yakunlashga urinadi va agar bog'liqlik hali ham yetishmasa, avvalgidek aniq xato xabarini (kerakli paket nomi bilan) qaytaradi.

4-qadam. Bog'liqliklarni hal qilishni apt orqali yakunlang.

sudo apt --fix-broken install

Tekshiring:

dpkg -l package

Holat kodi endi ii bo'lishi kerak.

Xulosa. Asl sabab — .deb faylni repozitoriydan tashqarida qo'lda o'rnatish edi va bu dpkg ning bog'liqliklarni o'zi qidira olmasligi bilan to'qnash keldi. Yechim texnik jihatdan oddiy (apt --fix-broken install), lekin uni topish uchun avval dpkg -l va dpkg -s yordamida past darajadagi holatni to'g'ri o'qish kerak edi.

Keng tarqalgan xatolar

dpkg -i dan keyingi bog'liqlik xatosini e’tiborsiz qoldirish

Paketni bu holatda "keyinroq hal qilaman" deb qoldirish uning yarim o'rnatilgan holda qolishini anglatadi va bu kelajakdagi apt upgrade/install amallariga xalaqit berishi mumkin. Xato paydo bo'lishi bilan apt --fix-broken install ni ishga tushiring.

--force-* flag'laridan "tezkor yechim" sifatida foydalanish

sudo dpkg -i --force-depends package.deb

Danger

--force-depends bog'liqlik tekshiruvini butunlay chetlab o'tadi — paket u uchun kerakli kutubxona haqiqatan yetishmasa ham "o'rnatilgan" deb belgilanadi. Amalda dastur ishga tushmasligi yoki noto'g'ri ishlashi mumkin. Bu flag juda muayyan, ataylab asoslangan holatlar uchun mo'ljallangan; production serverda u deyarli har doim noto'g'ri yechim — buning o'rniga haqiqatan yetishmayotgan bog'liqlikni hal qiling.

rc holatidagi paketni hali o'rnatilgan deb hisoblash

dpkg -l da rc ko'rsatilgan paket aslida ishlamaydi — u olib tashlangan, faqat konfiguratsiya qoldiqlari qolgan. Uni to'liq tozalash uchun:

sudo dpkg --purge package

/var/lib/dpkg/status ni qo'lda tahrirlashga urinish

Bu fayl dpkg ning ichki bazasi. Qo'lda kiritilgan o'zgarish qayd qilingan paket holatini tizimning haqiqiy holatidan uzib qo'yadi va kelajakdagi har qanday apt/dpkg amalini beqaror qilishi mumkin.

Mashqlar

  1. Tizimingizda nechta paket to'liq o'rnatilganini dpkg -l | grep ^ii | wc -l bilan sanang, so'ng dpkg -l | grep ^rc bilan olib tashlangan, lekin purge qilinmagan paketlar bor-yo'qligini tekshiring.
  2. O'zingiz biladigan fayl (masalan, /usr/bin/bash) qaysi paketga tegishli ekanini dpkg -S bilan toping, so'ng o'sha paket yana qaysi fayllarni o'rnatganini dpkg -L bilan ko'ring.
  3. Kichik, zararsiz .deb faylni yuklab oling (masalan, repozitoriydan apt download <package> bilan) va uni o'rnatmasdan dpkg -c bilan ichini ko'zdan kechiring — u aynan qaysi fayllarni qayerga joylashtirishini aniqlang. Bu amal hech narsani o'zgartirmaydi.

Mashqni bajardim deyish uchun: har bir mashq uchun dpkg holat kodini (ii, rc va hokazo) to'g'ri o'qiy olishingiz, o'sha paket aynan qaysi bosqichda ekanini so'z bilan tushuntira olishingiz va -L/-S yordamida fayl bilan paket o'rtasidagi bog'lanishni kuzata olishingiz kerak.

Xulosa

dpkg — Debian/Ubuntu oilasining past darajali paket vositasi: u bitta .deb faylni o'rnatadi va olib tashlaydi hamda o'rnatilgan paketlar holatini /var/lib/dpkg/ ostida yuritadi, lekin bog'liqliklarni qidirmaydi, faqat tekshiradi. apt qiladigan ishlarning aksariyati to'g'ridan-to'g'ri shu vosita ustiga qurilgan qulaylik qatlami. .deb faylni to'g'ridan-to'g'ri o'rnatgandan keyingi bog'liqlik xatosi nosozlik emas, kutilgan xatti-harakat va uni hal qilishning standart usuli — apt --fix-broken install.

Bu ikki maqola — apt va dpkg — Debian/Ubuntu ekotizimining asosini qamrab oladi. Keyingi maqola — Snap paketlari butunlay boshqa yondashuvni ko'rib chiqadi: distributivdan mustaqil, o'zini o'zi yangilaydigan, konteynerlangan paket formati, shuningdek u qachon apt ga oqilona muqobil bo'lishi va qachon bo'lmasligi.

Manbalar

  • Linux man-pages: dpkg(1): https://man7.org/linux/man-pages/man1/dpkg.1.html
  • Linux man-pages: dpkg-query(1): https://man7.org/linux/man-pages/man1/dpkg-query.1.html
  • Debian Wiki: dpkg: https://wiki.debian.org/dpkg
  • Debian Policy Manual: paket maintainer skriptlari va o'rnatish tartibi: https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html
  • Ubuntu Server hujjatlari: paketlarni boshqarish: https://ubuntu.com/server/docs/package-management