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
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
-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
Namunaviy chiqish (qisqartirilgan):
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
-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:
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:
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
(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:
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 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.
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.
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.
Tekshiring:
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
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:
/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
- Tizimingizda nechta paket to'liq o'rnatilganini
dpkg -l | grep ^ii | wc -lbilan sanang, so'ngdpkg -l | grep ^rcbilan olib tashlangan, lekin purge qilinmagan paketlar bor-yo'qligini tekshiring. - O'zingiz biladigan fayl (masalan,
/usr/bin/bash) qaysi paketga tegishli ekaninidpkg -Sbilan toping, so'ng o'sha paket yana qaysi fayllarni o'rnatganinidpkg -Lbilan ko'ring. - Kichik, zararsiz
.debfaylni yuklab oling (masalan, repozitoriydanapt download <package>bilan) va uni o'rnatmasdandpkg -cbilan 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