apt va repozitoriylar: yuqori darajali paket qatlami
Paketlarni boshqarish asoslari maqolasida ikki qatlamli model ko'rib chiqildi: past darajali vosita bitta faylni o'rnatadi, yuqori darajali vosita esa repozitoriylar bilan ishlaydi va bog'liqliklarni avtomatik hal qiladi. Debian/Ubuntu oilasida bu yuqori darajali vosita — apt (Advanced Package Tool). Kundalik boshqaruv ishlarining aksariyati — dastur o'rnatish, tizimni yangilash, keraksiz narsani olib tashlash — apt orqali bajariladi.
Bu maqola apt buyruqlari to'plamini, uning ortidagi repozitoriy mexanizmini, metama’lumotlarni yangilash aslida qanday ishlashini va xavfsizlik teshigi ochmasdan uchinchi tomon repozitoriysini qanday qo'shishni ko'rib chiqadi. Maqsad shunchaki buyruqlarni yodlash emas, apt har bir qadamda nima qilayotganini va nega biror qadamni — ayniqsa imzo tekshiruvini — tashlab ketish hech qachon xavfsiz yorliq emasligini tushunish.
apt, apt-get va apt-cache: uchta nom, bitta vazifa
Tarixan Debian/Ubuntu’ning yuqori darajali qatlami bir nechta alohida buyruqlarga bo'lingan edi: apt-get (o'rnatish, yangilash), apt-cache (metama’lumotlarni so'rash — qidirish, bog'liqliklarni ko'rish) va apt-config. 2014-yildan boshlab Debian ularning eng ko'p ishlatiladigan qismlarini bitta, foydalanuvchi uchun qulayroq buyruqqa birlashtirdi: apt. apt progress bar, rangli chiqish va qisqaroq sintaksis qo'shadi, lekin asosidagi mexanizm bir xil — hammasi oxir-oqibat dpkg ni chaqiradi.
Amalda:
- terminalda interaktiv, qo'lda ishlash uchun
aptafzal, chunki u odam o'qishi uchun mo'ljallangan; - skript yoki avtomatlashtirilgan pipeline uchun an’anaviy ravishda
apt-getvaapt-cachetavsiya qilinadi, chunki ularning chiqish formati va argumentlar xatti-harakati versiyalar o'rtasida barqaror qolishi rasman kafolatlangan —aptning chiqish formati esa istalgan paytda o'zgarishi mumkinligi ochiq aytilgan.
Note
Bu farq kichik, lekin production’da muhim: agar skriptda apt ning matn chiqishini grep bilan tahlil qilsangiz, kelajakdagi versiya o'zgarishi skriptni sezdirmasdan buzib qo'yishi mumkin. Avtomatlashtirish uchun apt-get/apt-cache ni yoki dpkg-query kabi dastur o'qishi uchun maxsus yaratilgan interfeysni afzal ko'ring.
Asosiy apt buyruqlari
Metama’lumotlar indeksini yangilash
Bu buyruq hech narsani o'rnatmaydi va yangilamaydi. U faqat mavjud paketlar va ularning versiyalari haqidagi lokal keshni — Paketlarni boshqarish asoslari maqolasida tanishtirilgan metama’lumotlar indeksini yangilaydi. sudo kerak, chunki bu buyruq oddiy foydalanuvchi yoza olmaydigan tizim bo'yicha umumiy katalog — /var/lib/apt/lists/ ga yozadi.
Namunaviy chiqish:
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Fetched 252 kB in 1s (198 kB/s)
Reading package lists... Done
Hit o'sha manba oxirgi yangilanishdan beri o'zgarmaganini, Get esa yangi metama’lumotlar haqiqatan yuklab olinganini bildiradi. Bu buyruq har qanday apt install/upgrade dan oldin doim ishga tushirilishi kerak — aks holda apt endi mavjud bo'lmagan versiyani o'rnatishga urinishi yoki yaqinda chiqarilgan paketni topa olmasligi mumkin.
Paketni qidirish va ko'zdan kechirish
search nomi yoki tavsifi mos keladigan har bir paketni ro'yxatlaydi — sudo kerak emas, chunki u faqat lokal indeksni o'qiydi. show bitta muayyan paket haqida to'liq ma’lumot ko'rsatadi: versiya, hajm, bog'liqliklar va tavsif. Bu biror narsani o'rnatishga qaror qilishdan oldin "bu aynan nima va qancha joy egallaydi" degan savolga javob beradi.
O'rnatish
Namunaviy chiqish (qisqartirilgan):
The following additional packages will be installed:
libnginx-mod-http-geoip2 nginx-common nginx-core
Suggested packages:
fcgiwrap nginx-doc
The following NEW packages will be installed:
libnginx-mod-http-geoip2 nginx nginx-common nginx-core
0 upgraded, 4 newly installed, 0 to remove and 3 not upgraded.
Need to get 1,105 kB of archives.
After this operation, 3,456 kB of additional disk space will be used.
Do you want to continue? [Y/n]
apt Paketlarni boshqarish asoslari maqolasida ko'rilgan bog'liqliklar zanjirini avtomatik hal qildi va nginx ga haqiqatan kerak bo'lgan qo'shimcha paketlarni qo'shdi. [Y/n] so'rovi ataylab qo'yilgan xavfsizlik nuqtasi: tasdiqlashdan oldin aynan nechta paket va qancha disk joyi ishtirok etishini ko'rasiz. Skript orqali, interaktiv bo'lmagan holatda avtomatik tasdiqlash uchun:
Warning
Avtomatlashtirishda -y dan ehtiyot bo'lib foydalaning — u jarayondan oxirgi "nechta paket" ko'rigini olib tashlaydi. Production serverdagi avtomatlashtirilgan skriptlarda -y ishlatilganda ham aynan qaysi paketlar o'rnatilganini keyinroq ko'rib chiqish uchun log'ga yozib borish standart amaliyot bo'lib qolishi kerak.
Yangilash: update, upgrade va full-upgrade
Bu uchta buyruq ko'pincha adashtiriladi, lekin har biri alohida ish bajaradi:
| Buyruq | Nima qiladi |
|---|---|
apt update |
Faqat metama’lumotlar indeksini yangilaydi; hech narsa o'rnatmaydi |
apt upgrade |
O'rnatilgan paketlarni yangi versiyalarga ko'taradi, lekin paket qo'shish yoki olib tashlashni talab qiladigan yangilanishni o'tkazib yuboradi |
apt full-upgrade (avval dist-upgrade) |
upgrade bilan bir xil, lekin yangilanish haqiqatan talab qilsa, paketlarni olib tashlaydi yoki qo'shadi ham |
Standart amaliyot — update bilan indeksni yangilash, so'ng mavjud yangilanishlarni upgrade bilan qo'llash. full-upgrade odatda kattaroq versiya o'tishlarida kerak bo'ladi (masalan, kernel meta-paketi o'zgarganda) va u ko'proq narsani o'zgartirgani uchun ishga tushirishdan oldin ko'rib chiqilishi kerak. Production serverda xavfsiz yangilanish oynalarini rejalashtirish Production’da yangilanishlar maqolasining asosiy mavzusi.
Olib tashlash: remove va purge
remove bajariladigan fayllar va kutubxonalarni o'chiradi, lekin /etc/nginx/ ostidagi konfiguratsiyani joyida qoldiradi — ataylab, keyinroq qayta o'rnatganda oldingi sozlamalaringiz tiklanishi uchun. purge qo'shimcha ravishda konfiguratsiya fayllarini ham butunlay o'chiradi. Agar dastur haqiqatan iz qoldirmasdan yo'qolishini xohlasangiz, purge dan foydalaning.
Danger
apt purge konfiguratsiya fayllarini qaytarib bo'lmaydigan qilib o'chiradi. Agar /etc/nginx/nginx.conf da boshqa joyda zaxirasi bo'lmagan qo'lda kiritilgan sozlamalar bo'lsa, purge ularni butunlay yo'q qiladi. Purge qilishdan oldin muhim konfiguratsiyaning zaxira nusxasini oling:
Tizimda endi hech narsaga kerak bo'lmagan bog'liqlik paketlarini tozalash uchun:
Repozitoriylar: sources.list va zamonaviy deb822 formati
apt qaysi manbalardan qidirishni /etc/apt/sources.list va /etc/apt/sources.list.d/ ostidagi qo'shimcha fayllar orqali aniqlaydi. Ikki xil format mavjud.
Klassik bir qatorli format (.list fayllarida):
debbinary paket manbasini bildiradi (deb-srcmanba kod uchun, kamdan-kam kerak bo'ladi);http://archive.ubuntu.com/ubuntu— repozitoriy manzili;noble— distributivning kod nomi (Ubuntu 24.04 LTS);main restricted universe multiverse— komponentlar, ya’ni litsenziya va qo'llab-quvvatlash darajasini aks ettiruvchi toifalar.
Zamonaviy deb822 formati (.sources fayllarida, Ubuntu 24.04 va undan keyingi versiyalarda sukut bo'yicha):
Types: deb
URIs: http://archive.ubuntu.com/ubuntu
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Bu format bir nechta Suites/Components ni bitta o'qilishi oson faylda ifodalaydi va imzo kalitini Signed-By orqali aniq bog'laydi — bu quyida ko'riladigan xavfsizlik amaliyoti bilan to'g'ridan-to'g'ri bog'liq. Ikkala format birga mavjud bo'lishi mumkin; apt ikkalasini ham o'qiydi.
Tip
Tizimingiz qaysi formatdan foydalanishini tekshiring:
Ubuntu 24.04 (noble) va undan keyingi versiyalarda birinchi fayl bo'ladi.
Uchinchi tomon repozitoriysini xavfsiz qo'shish
Ba’zan sizga kerak bo'lgan dastur (Docker, Node.js’ning yangiroq versiyasi) Ubuntu’ning rasmiy repozitoriysida bo'lmaydi yoki u yerda eskirgan bo'ladi. Bunda ishlab chiqaruvchi o'z repozitoriysini taqdim etadi. Uni xavfsiz qo'shish uchta qadamdan iborat: kalitni olish, manbani ro'yxatdan o'tkazish, indeksni yangilash.
1-qadam. GPG ochiq kalitini alohida keyring katalogiga yuklab oling.
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://example.com/repo/gpg-key.asc | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
curl kalitni yuklab oladi; gpg --dearmor uni ASCII-armored matndan apt kutadigan binary formatga o'tkazadi. Natija /etc/apt/keyrings/ ostida saqlanadi — bu katalog aynan shu maqsad uchun ishlatiladi va tizim bo'yicha umumiy keyring'dan alohida turadi.
Danger
Eski qo'llanmalar ko'pincha apt-key add ni tavsiya qiladi — bu buyruq Ubuntu 22.04 dan boshlab rasman eskirgan (deprecated) deb e’lon qilingan va bosqichma-bosqich olib tashlanmoqda. Sababi: u kalitni har bir repozitoriy uchun ishonchli hisoblanadigan bitta umumiy keyring'ga qo'shadi. Agar uchinchi tomon kalitlaridan biri qachondir buzib olinsa, u bilan istalgan repozitoriydan kelgandek ko'rinadigan paketlarni imzolash mumkin bo'lib qoladi. Zamonaviy, xavfsiz yondashuv har bir manbani Signed-By orqali o'zining muayyan kalit fayliga bog'laydi.
2-qadam. Repozitoriyni Signed-By bilan ro'yxatdan o'tkazing.
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/repo noble stable" \
| sudo tee /etc/apt/sources.list.d/example.list
[signed-by=...] shu muayyan repozitoriydagi paketlar faqat aynan shu kalit bilan imzolangan bo'lsagina qabul qilinishini bildiradi — bu yuqorida tasvirlangan umumiy keyring muammosining yechimi.
3-qadam. Indeksni yangilang va tekshiring.
Agar example.list va uning kaliti to'g'ri sozlangan bo'lsa, yangi repozitoriy manzili Hit yoki Get qatorida xatosiz ko'rinadi.
Warning
Tekshirilmagan yoki ishonchsiz manbadan repozitoriy qo'shish butun tizimni supply-chain hujumiga ochib qo'yadi, chunki apt o'sha repozitoriyning o'rnatish skriptlarini root huquqlari bilan ishga tushiradi. Faqat dastur ishlab chiqaruvchisi rasman hujjatlashtirgan va HTTPS orqali yetkaziladigan manba va kalitdan foydalaning.
apt-cache policy: qaysi versiya qayerdan kelishini ko'rish
Bir nechta repozitoriy bitta paketning turli versiyalarini taklif qilganda, apt aslida qaysi birini tanlashini bilish muhim:
nginx:
Installed: 1.24.0-2ubuntu7
Candidate: 1.24.0-2ubuntu7.1
Version table:
1.24.0-2ubuntu7.1 500
500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
1.24.0-2ubuntu7 500
500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages
Installed — hozir tizimda turgan versiya; Candidate — apt upgrade o'rnatadigan versiya. Raqam (500) ustuvorlik (pin) darajasi: bitta paket bir nechta manbada uchraganda apt eng yuqori ustuvorlikka ega bo'lganini tanlaydi. Bu ayniqsa noble-security kabi xavfsizlik repozitoriysi va asosiy repozitoriy o'rtasida qaysi versiya ustun kelishini tushunish uchun foydali.
Muayyan versiyani o'rnatish yoki pin qilish
Yuqoridagi versiyalar jadvali shunchaki ma’lumot uchun emas — unda ko'rsatilgan istalgan versiyani paket nomiga =<version> qo'shib aniq o'rnatish mumkin:
Bu deployment’ni ma’lum, ishonchli build’da ushlab turishning yoki muvaffaqiyatsiz yangilanishdan keyin downgrade qilishning standart usuli. Downgrade uchun xuddi shu sintaksis eskiroq versiya raqami bilan ishlatiladi, faqat o'sha versiya hali sozlangan repozitoriyda mavjud bo'lishi kerak (u indeksdan chiqib ketgach, uni endi yuklab bo'lmaydi). apt so'rovni bajarish uchun o'zgartirishi kerak bo'lgan har qanday bog'liqliklarni ko'rsatadi; bu ro'yxatni ko'rib chiqing, chunki downgrade boshqa paketlarga ham zanjir bo'lib ta’sir qilishi mumkin.
Versiyani bir marta qo'lda tanlash o'rniga, versiya afzalligini kelajakdagi yangilanishlarda ham saqlab qolish uchun /etc/apt/preferences.d/ ostidagi faylda ustuvorlik belgilang:
1000 dan yuqori ustuvorlik hatto pin qilingan versiyaga avtomatik downgrade qilishga ham ruxsat beradi; apt-cache policy da ko'rilgan 500 darajasidagi raqamlar bu sozlama ustun keladigan oddiy sukut bo'yicha qiymatlar. Pin qilish kuchli vosita va uni sozlaganingizni unutib qo'yish oson — quyidagi hold kabi u ham paketni xavfsizlik yangilanishlaridan sezdirmasdan ushlab qolishi mumkin. Shuning uchun yaratgan har bir pin’ingizni hujjatlashtiring va vaqti-vaqti bilan ko'rib chiqing.
apt-mark hold: paket versiyasini muzlatish
Ba’zan bitta paketni ataylab eski versiyada saqlash kerak bo'ladi — masalan, yangi versiya bilan mosligi tasdiqlanmagan ilovani ishlatayotganingizda:
Shundan keyin apt upgrade/full-upgrade yangi versiya mavjud bo'lsa ham nginx ni o'tkazib yuboradi. Joriy hold’larni tekshirish:
Hold’ni bekor qilish:
Warning
Hold qilingan paket xavfsizlik patch’larini ham olmay qo'yadi. hold dan faqat muayyan, asosli sabab bilan — masalan, yangi versiya bilan moslik tekshirilmagan bo'lsa — va iloji boricha qisqa muddatga foydalaning. Aks holda tizim asta-sekin ortda qolib, patch qilinmagan zaifliklarni to'plab boradi.
Amaliy vaziyat: yangi paketni xavfsiz o'rnatish
Muammo. Yangi Ubuntu Server LTS mashinasiga nginx o'rnatishingiz kerak, lekin bunga qaror qilishdan oldin aynan nima bo'lishini ko'rmoqchisiz.
1-qadam. Metama’lumotlarni yangilang.
2-qadam. Paket mavjudligi va versiyasini tekshiring (hech narsa o'rnatmasdan).
3-qadam. O'rnatishni simulyatsiya qiling.
--simulate (qisqa shakli -s) hech narsani o'zgartirmaydi — u faqat apt install nginx haqiqatan ishga tushsa nima bo'lishini ko'rsatadi: qaysi paketlar qo'shiladi va qancha disk joyi ishlatiladi.
4-qadam. Haqiqiy o'rnatishni bajaring.
Tekshiring:
Birinchi buyruq paket dpkg darajasida ro'yxatdan o'tganini (ii holati), ikkinchisi esa xizmat haqiqatan ishlayotganini tasdiqlaydi — xizmatlarni boshqarish Xizmatlarni boshqarish maqolasida chuqur ko'rib chiqiladi.
Xulosa. --simulate bilan oldindan ko'rib chiqish — ayniqsa production serverda — buyruq haqiqatan ishga tushishidan oldin "bu buyruq aynan nechta paketni o'zgartiradi" degan savolga javob olishning arzon va xavfsiz usuli.
Keng tarqalgan xatolar
apt update ni unutib, eskirgan indeks bilan ishlash
Yangi qo'shilgan repozitoriydan paket o'rnatishga urinib, "Unable to locate package" xatosini olish odatda repozitoriy qo'shilgan, lekin apt update ishga tushirilmaganini bildiradi. Har qanday manbani qo'shgan yoki o'zgartirgandan keyin doim apt update ni ishga tushiring.
NO_PUBKEY yoki "Signature Could Not Be Verified"
Bu odatda repozitoriy qo'shilgan, lekin uning GPG kaliti apt ga hali ma’lum emasligini bildiradi. Yechim — kalitni repozitoriy egasining rasmiy hujjatlaridan olib, uni Signed-By bilan to'g'ri bog'lash. Tekshiruvni hech qachon --allow-unauthenticated bilan chetlab o'tmang.
Danger
apt install --allow-unauthenticated yoki apt-get -o Acquire::AllowInsecureRepositories=true kabi flag'lar imzo tekshiruvini butunlay o'chirib qo'yadi va imzosi buzilgan yoki almashtirilgan paketni o'rnatishga yo'l ochadi. Production serverda bu flag'lardan foydalanish deyarli hech qachon to'g'ri yechim emas — buning o'rniga kalit muammosini tuzating.
remove va purge ni farqlamaslik
Konfiguratsiyani saqlab qolish kerak bo'lgan holatda purge ishlatish sozlamalarni tasodifan yo'qotishning keng tarqalgan yo'li. Vaqtinchalik olib tashlash uchun remove, to'liq tozalash uchun purge dan foydalaning.
Repozitoriylar o'rtasidagi versiya ziddiyatini tushunmaslik
Ikki repozitoriy bitta paketning turli versiyalarini taklif qilganda, apt qaysi birini tanlashi ustuvorlik (pin) darajasiga bog'liq — bu tasodifiy emas. Kutilmagan versiya nega o'rnatilganini tushunish uchun apt-cache policy dan foydalaning.
Mashqlar
apt updateva undan keyinapt upgradeni ishga tushiring va nechta paketni yangilash mumkinligini qayd qiling (upgradetasdiq so'rashidan oldin ko'rsatiladi).upgrade/full-upgradefarqiga tayanib, nega ayrim paketlar "kept back" deb ko'rsatilishi mumkinligini tushuntiring.apt-cache policyyordamida tizimingizda allaqachon o'rnatilgan paket qaysi repozitoriydan kelganini va uning ustuvorlik qiymatini aniqlang.- Tizimingizdagi
/etc/apt/sources.listyoki/etc/apt/sources.list.d/ostidagi fayllarni ko'zdan kechiring va nechta alohida repozitoriy manbasi sozlanganini sanang (faqat o'qing — hech narsani o'zgartirmang).
Mashqni bajardim deyish uchun: har bir mashq uchun qaysi buyruq faqat holatni o'qishini va qaysi biri uni o'zgartirishini aniq ajrata olishingiz hamda Candidate va Installed o'rtasidagi farqni o'z so'zlaringiz bilan tushuntira olishingiz kerak.
Xulosa
apt — Debian/Ubuntu oilasining yuqori darajali paket vositasi: u repozitoriy metama’lumotlarini boshqaradi, bog'liqliklarni avtomatik hal qiladi va oxir-oqibat haqiqiy o'rnatish ishini dpkg ga topshiradi. update metama’lumotlarni yangilaydi, upgrade/full-upgrade o'rnatilgan paketlarni yangi versiyalarga ko'taradi, install/remove/purge esa paketning to'liq hayot siklini boshqaradi. Repozitoriy manbalari sources.list da yoki zamonaviy deb822 formatida turadi va har bir manba GPG imzosi orqali tekshirilishi kerak — bu xavfsizlik amaliyotining voz kechib bo'lmaydigan qismi.
apt doim ostida dpkg ga tayanadi. Keyingi maqola — dpkg va bog'liqliklar to'g'ridan-to'g'ri shu past darajali qatlamga tushadi: dpkg ning o'zi bilan ishlash, uning holat bazasini o'qish va yetishmayotgan bog'liqlikni aniqlash.
Manbalar
- Debian Wiki: SourcesList: https://wiki.debian.org/SourcesList
- Debian Wiki: DebSrc4 (deb822 manbalar formati): https://wiki.debian.org/DebSrc4
- Ubuntu Server hujjatlari: paketlarni boshqarish: https://ubuntu.com/server/docs/package-management
- Linux man-pages:
apt(8): https://man7.org/linux/man-pages/man8/apt.8.html - Linux man-pages:
sources.list(5): https://man7.org/linux/man-pages/man5/sources.list.5.html - Linux man-pages:
apt-key(8)(eskirgan holati): https://man7.org/linux/man-pages/man8/apt-key.8.html - Debian Wiki: SecureApt: https://wiki.debian.org/SecureApt