Tarkibga o'tish

Disk bandligi (disk usage)

Disk kvotalari maqolasida foydalanuvchi yoki guruh qancha joydan foydalanishi mumkinligini cheklash ko'rib chiqildi. Lekin kvota faqat cheklovni belgilaydi — u fayl tizimida hozir aynan qayerda joy tugayotganini ko'rsatmaydi. Bular ikki mustaqil savol: kvota "kimga qancha ruxsat berilgan" degan savolga, disk bandligi esa "hozir aslida qancha joy ishlatilmoqda va qayerda" degan savolga javob beradi. Bu maqola ikkinchi savolga — mavjud joyni tekshirish va eng katta iste’molchilarni topish vositalariga bag'ishlangan.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • nega df -h va du -sh turli natija berishi mumkinligini tushuntirish;
  • "ochiq, lekin o'chirilgan fayl" muammosini va uning disk bandligiga ta’sirini tushuntirish;
  • kataloglar ierarxiyasini du --max-depth bilan bosqichma-bosqich tahlil qilish;
  • interaktiv ncdu vositasi bilan tezkor vizual tahlil qilish;
  • inode’lar tugashini df -i bilan aniqlash;
  • eng katta fayl yoki katalogni qanday topishni bilish.

df -h: fayl tizimi darajasidagi umumiy ko'rinish

df (disk free) mount qilingan fayl tizimlarining umumiy, ishlatilgan va bo'sh joyini ko'rsatadi:

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   42G  5.5G  89% /
/dev/vg_data/lv_app 20G  18G  1.1G  95% /mnt/app
tmpfs           2.0G  1.2M  2.0G   1% /run

-h (human-readable) baytlarni GiB/MiB ko'rinishida ko'rsatadi. df fayl tizimi metama’lumotlaridan (superblock’dan) o'qiydi, shuning uchun natija hatto juda katta fayl tizimida ham kechikishsiz, bir zumda chiqadi.

Bitta muayyan bo'limni tekshirish uchun:

df -h /var

du -sh: katalog darajasidagi hajm

du (disk usage) esa aksincha, haqiqiy fayllarni sanab chiqib, muayyan katalog yoki fayllar egallagan haqiqiy joyni hisoblaydi:

du -sh /var/log
1.2G    /var/log

-s — faqat yakuniy umumiy yig'indini ko'rsatish (quyi kataloglarni alohida ro'yxatlamasdan), -h — odam o'qishi uchun qulay format.

du fayl tizimini haqiqatan skanerlaydi, shuning uchun katta kataloglarda vaqt olishi mumkin — df dan farqli o'laroq, natija bir zumda chiqmaydi.

Nega df va du mos kelmaydi

Ba’zan df -h / "95% ishlatilgan" deb ko'rsatadi, lekin du -sh /* bilan har bir katalog bo'yicha yig'ilgan son sezilarli darajada kichik chiqadi. Buning eng keng tarqalgan sababi — o'chirilgan, lekin ochiq turgan fayllar.

Linux’da fayl rm bilan o'chirilganda, agar u hali ham biror jarayon tomonidan ochiq bo'lsa (fayl deskriptori orqali), u darhol olib tashlanmaydi — faqat katalogdan (fayl nomlari ro'yxatidan) olib tashlanadi. Fayl uchun ajratilgan disk bloklari jarayon uni yopmaguncha bo'shatilmaydi.

rm removes the entry from the directory
       │
       ▼
a process still holds the file open (via fd)
       │
       ▼
disk blocks stay occupied — df reports this
du doesn't "see" the file, since it's no longer in the directory

Bu, masalan, log fayli aylantirilgan (rotate qilingan), lekin unga yozayotgan xizmat hali ham eski fayl deskriptorini ushlab turgan paytda tez-tez sodir bo'ladi — xizmat qayta ishga tushirilmaguncha yoki fayl yopilmaguncha disk joyi bo'shamaydi, garchi du umuman katta fayl ko'rsatmasa ham.

Warning

"df ishlatilgan deydi, lekin du hech narsa topmaydi" holatiga ko'pincha aynan shu sabab bo'ladi. Yechim — o'chirilgan, lekin ochiq turgan fayllarni lsof bilan topish; bu Disk to'lganda troubleshooting maqolasida chuqur ko'rib chiqiladi.

du --max-depth: bosqichma-bosqich tahlil

Katta katalog ichida aynan qaysi quyi katalog eng ko'p joy egallayotganini topish uchun chuqurlikni cheklash qulay:

du -h --max-depth=1 /var
1.2G    /var/log
340M    /var/cache
180M    /var/lib
45M     /var/tmp
1.8G    /var

Hajm bo'yicha tartiblash uchun bu natijani sort bilan birlashtirish tavsiya etiladi:

du -h --max-depth=1 /var | sort -rh

sort -rh odam o'qishi uchun qulay qiymatlarni (1.2G, 340M) kamayish tartibida to'g'ri tartiblaydi.

Keyingi qadam — eng katta katalogga kirib, xuddi shu buyruqni takrorlash va muammoli hududni bosqichma-bosqich toraytirish; bu jarayon ba’zan "disk arxeologiyasi" deb ataladi.

ncdu: interaktiv vizual tahlil

du --max-depth bilan bir necha darajaga qo'lda tushish sekin va noqulay bo'lishi mumkin. ncdu (NCurses Disk Usage) buning o'rniga interaktiv, harakatlanish mumkin bo'lgan terminal interfeysini taqdim etadi:

sudo apt install ncdu
ncdu /var
--- /var -----------------------------
  1.2GiB [##########] /log
  340MiB [###       ] /cache
  180MiB [##        ] /lib
   45MiB [          ] /tmp

Strelka tugmalari katalogga kirish imkonini beradi, d esa fayl yoki katalogni to'g'ridan-to'g'ri o'chiradi. du ga nisbatan ncdu bir marta skanerlaydi, so'ng butun daraxt bo'ylab tez harakatlanish imkonini beradi — har safar qayta skanerlash shart emas.

Danger

ncdu ichida d bilan o'chirish qaytarib bo'lmaydi. Production serverda fayllarni ko'r-ko'rona o'chirishdan oldin har doim fayl aslida nima ekanini (qaysi xizmatga tegishli, qachon yaratilgan) tekshiring — muhim konfiguratsiya yoki ma’lumot fayli tasodifan o'chirilishi mumkin.

Inode’lar tugashi: df -i

Diskda bo'sh joy bo'lsa ham fayl yaratib bo'lmasligi mumkin — chunki inode’lar tugagan. Har bir fayl (hajmidan qat’i nazar) bitta inode egallaydi va fayl tizimi yaratilganda qat’iy sondagi inode ajratiladi.

df -i
Filesystem       Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1       3276800 3276800      0  100% /

Agar IUse% 100% bo'lsa, diskda bo'sh joy bo'lsa ham yangi fayl yaratib bo'lmaydi — df -h buni umuman ko'rsatmaydi, chunki u fayllar sonini emas, faqat baytlarni sanaydi.

Bu holat odatda millionlab mayda fayl yaratadigan tizimlarda uchraydi: sessiya fayllari, keshlar, pochta spool’lari yoki noto'g'ri sozlangan vaqtinchalik fayllar generatori.

Eng katta fayl yoki katalogni topish

find bilan berilgan hajmdan katta fayllarni qidirish:

find / -xdev -type f -size +500M -exec ls -lh {} \;
  • -xdev — qidiruvni joriy fayl tizimi bilan cheklaydi, boshqa mount qilingan fayl tizimlariga (masalan, NFS’ga) o'tmaydi;
  • -size +500M — 500 MiB dan katta fayllar.

du va sort ni birlashtirib, eng katta 10 ta katalogni topish:

du -ah /var | sort -rh | head -10

-a (all) — faqat kataloglarni emas, alohida fayllarni ham sanaydi.

Amaliy vaziyat: / 95% to'la, lekin sababi noma’lum

Vaziyat: df -h / root bo'lim 95% ishlatilganini ko'rsatyapti, lekin qaysi katalog bunga javobgar ekani noma’lum.

1-qadam. Umumiy holatni tasdiqlang.

df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   47G  1.2G  95% /

2-qadam. Birinchi darajadagi kataloglarni tartiblang.

sudo du -h --max-depth=1 / 2>/dev/null | sort -rh | head
47G     /
32G     /var
8G      /usr
4G      /home

3-qadam. /var ga chuqurroq kiring.

sudo du -h --max-depth=1 /var 2>/dev/null | sort -rh | head
30G     /var/log
1.5G    /var/lib

4-qadam. /var/log ichidagi muayyan faylni toping.

sudo du -ah /var/log | sort -rh | head -5
28G    /var/log/app/debug.log

Xulosa: aybdor — nazoratsiz o'sib ketgan bitta debug.log fayli, ehtimol log rotation ishlamay qolgani sababli. Muammoni to'liq hal qilish — faylni tozalash yoki olib tashlash, so'ng log rotation’ni tuzatish — Disk to'lganda troubleshooting maqolasining markaziy vaziyati sifatida davom etadi.

Keng tarqalgan xatolar

du ni butun / ga -x siz ishga tushirish

-x (yoki --one-file-system) siz du / ni ishga tushirish boshqa mount qilingan fayl tizimlariga (NFS, tashqi disk) ham tushib, noto'g'ri, oshirilgan natija beradi:

du -xh --max-depth=1 /

df "to'la" deganda sababni du dan qidirmaslik

df faqat "qancha ishlatilgan" deydi, "nima ishlatayotgani"ni emas. Sababni topish har doim du yoki ncdu bilan chuqurroq qazishni talab qiladi.

O'chirilgan, lekin ochiq turgan fayllarni unutish

Agar du natijasi va df natijasi mos kelmasa, bu ko'pincha xato emas — fayl allaqachon o'chirilgan, lekin biror jarayon uni hali ham ochiq ushlab turibdi. Bu holatni faqat du/ncdu bilan aniqlab bo'lmaydi.

Inode’lar tugashini tekshirmaslik

"Diskda joy bor, lekin fayl yaratib bo'lmayapti" xatosini ko'rib, df -i ni tekshirmasdan, faqat df -h ga qarab "joy yetarli" degan xulosaga kelish keng tarqalgan xato.

Mashqlar

  1. df -h va du -sh /* chiqishlarini solishtiring, nomuvofiqlik bor-yo'qligini aniqlang va nega ekanini tushuntiring.
  2. /var ichidagi eng katta uchta katalogni topish uchun du -h --max-depth=1 /var | sort -rh dan foydalaning.
  3. ncdu ni o'rnating, uni / da ishga tushiring va eng katta 5 ta katalogni interaktiv tarzda toping (o'chirmasdan, faqat ko'rib).
  4. Tizimingizdagi inode bandligini df -i bilan tekshiring va u df -h dan qanday farq qilishini qayd qiling.

Mashqni bajardim deyish uchun: baytlar bo'yicha 95% "ishlatilgan", lekin inode bandligi past bo'lgan fayl tizimi berilganda javobgar katalog yoki faylni topadigan keyingi buyruqni ayta olishingiz kerak.

Xulosa

df -h fayl tizimi darajasidagi tezkor umumiy ko'rinishni beradi, du -sh esa katalog ichidagi haqiqiy fayl hajmlarini sanaydi — ikkalasi o'rtasidagi nomuvofiqlikka ko'pincha o'chirilgan, lekin ochiq turgan fayllar sabab bo'ladi. du --max-depth va ncdu katta kataloglar ierarxiyasida aybdorni bosqichma-bosqich yoki interaktiv tarzda toraytirishga yordam beradi, df -i esa baytlar emas, fayllar (inode’lar) tugashi muammosini ochib beradi. Bu vositalar disk kvotalari bilan birga ishlaydi: kvota kimga qancha ruxsat berilganini, disk bandligi esa hozir joy aslida qayerga ketayotganini ko'rsatadi. Keyingi maqola — Disk to'lganda troubleshooting ikkala vositani haqiqiy "disk to'la" vaziyatini hal qilishning yagona amaliy tartibiga birlashtiradi.

Manbalar