Tarkibga o'tish

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 apt afzal, chunki u odam o'qishi uchun mo'ljallangan;
  • skript yoki avtomatlashtirilgan pipeline uchun an’anaviy ravishda apt-get va apt-cache tavsiya qilinadi, chunki ularning chiqish formati va argumentlar xatti-harakati versiyalar o'rtasida barqaror qolishi rasman kafolatlangan — apt ning 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

sudo apt update

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

apt search nginx
apt show nginx

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

sudo apt install nginx

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:

sudo apt install -y nginx

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
sudo apt update
sudo apt upgrade

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

sudo apt remove nginx
sudo apt purge nginx

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:

sudo cp -a /etc/nginx /etc/nginx.bak-$(date +%F)

Tizimda endi hech narsaga kerak bo'lmagan bog'liqlik paketlarini tozalash uchun:

sudo apt autoremove

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):

deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse
  • deb binary paket manbasini bildiradi (deb-src manba 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:

cat /etc/apt/sources.list.d/ubuntu.sources 2>/dev/null || cat /etc/apt/sources.list

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.

sudo apt update

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:

apt-cache policy nginx
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:

sudo apt install nginx=1.24.0-2ubuntu7

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:

Package: nginx
Pin: version 1.24.0-2ubuntu7*
Pin-Priority: 1001

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:

sudo apt-mark hold nginx

Shundan keyin apt upgrade/full-upgrade yangi versiya mavjud bo'lsa ham nginx ni o'tkazib yuboradi. Joriy hold’larni tekshirish:

apt-mark showhold

Hold’ni bekor qilish:

sudo apt-mark unhold nginx

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.

sudo apt update

2-qadam. Paket mavjudligi va versiyasini tekshiring (hech narsa o'rnatmasdan).

apt show nginx

3-qadam. O'rnatishni simulyatsiya qiling.

apt install --simulate nginx

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

sudo apt install nginx

Tekshiring:

dpkg -l nginx
systemctl is-active nginx

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

  1. apt update va undan keyin apt upgrade ni ishga tushiring va nechta paketni yangilash mumkinligini qayd qiling (upgrade tasdiq so'rashidan oldin ko'rsatiladi). upgrade/full-upgrade farqiga tayanib, nega ayrim paketlar "kept back" deb ko'rsatilishi mumkinligini tushuntiring.
  2. apt-cache policy yordamida tizimingizda allaqachon o'rnatilgan paket qaysi repozitoriydan kelganini va uning ustuvorlik qiymatini aniqlang.
  3. Tizimingizdagi /etc/apt/sources.list yoki /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