14-bo‘lim

Disk va fayl tizimlari

df, inode, ulash, fstab va "disk bo'sh, lekin joy yo'q" degan xatoning haqiqiy sababi.

🕑 20 daqiqa o‘qish 📄 1 456 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. df - qancha joy qolgan
  2. Inode - haqiqiy chegara
  3. Inode tugashini o'z ko'zingiz bilan ko'ring
  4. Joyni kim egallagan
  5. O'chirilgan, lekin joyni band qilib turgan fayl
  6. Ulash va fstab
  7. Fayl tizimi turlari
  8. Disk to'lganda - tartib
  9. Xulosa

Serverdagi nosozliklarning katta qismi bitta sababdan boshlanadi: disk to'lgan. Jurnal yozilmaydi, ma'lumotlar bazasi vaqtinchalik fayl yarata olmaydi, sessiya saqlanmaydi - va hamma narsa tushunarsiz xato bera boshlaydi.

df - qancha joy qolgan #

Terminal
df -h / | head -1 | tr -s ' '
Natija
Filesystem Size Used Avail Use% Mounted on
UstunMa'no
FilesystemQurilma yoki manba
SizeUmumiy hajm
UsedBand
AvailBo'sh
Use%Foiz
Mounted onQayerga ulangan
Size = Used + Avail emas

Ikkita raqamni qo'shsangiz, umumiy hajmdan kamroq chiqadi.

Sabab: ext4 fayl tizimi hajmning bir qismini (standart holatda 5%) root uchun zaxiraga qo'yadi.

Bu ataylab shunday: disk to'lganda root hali ham jurnal yoza oladi, sozlamani tuzata oladi va serverni qutqara oladi. Oddiy foydalanuvchi esa "joy yo'q" xatosini oladi.

Katta ma'lumot diskida (masalan 2 TB zaxira diski) 5% - bu 100 GB behuda joy. U yerda zaxirani kamaytirish mumkin:

Terminal
sudo tune2fs -m 1 /dev/sdb1

Lekin ildiz bo'limida buni qilmang - zaxira aynan shu yerda kerak.

Inode - haqiqiy chegara #

Terminal
df -i / | head -1 | tr -s ' '
Natija
Filesystem Inodes IUsed IFree IUse% Mounted on

Har fayl, katalog va havola bitta inode egallaydi. Inode faylning metama'lumotini saqlaydi: egasi, ruxsatlar, o'lchami, vaqt belgilari va ma'lumot bloklariga ko'rsatkichlar.

Fayl nomi esa inode da emas - u katalog yozuvida turadi.

Nom, inode va ma'lumot - uchta alohida narsa Katalog yozuvi hisobot.txt -> 4021 nusxa.txt -> 4021 Ikki nom, bitta inode: bu QATTIQ havola Inode 4021 egasi: husanboy ruxsat: 644 hajm: 4096 havolalar soni: 2 bloklar: 812, 813... Ma'lumot bloklari 812: "Salom, bu..." 813: "...hisobot." Faylning haqiqiy mazmuni Nima uchun bu muhim Inode soni fayl tizimi yaratilganda BELGILANADI va keyin o'zgarmaydi. Millionlab kichik fayl yaratsangiz, inode tugaydi - disk bo'sh bo'lsa ham. Xato esa aynan bir xil: No space left on device Shuning uchun df -h dan keyin DOIM df -i ni ham bajaring.
Katalog nomni inode ga, inode esa bloklarga bog'laydi

Inode tugashini o'z ko'zingiz bilan ko'ring #

Buni tushuntirish emas, ko'rsatish kerak. 20 MB lik fayl tizimi yaratamiz va unda ataylab juda kam inode qoldiramiz.

Terminal
umount ulanish 2>/dev/null
rm -rf disk.img ulanish
dd if=/dev/zero of=disk.img bs=1M count=20 status=none
mkfs.ext4 -q -N 32 disk.img
mkdir -p ulanish
Terminal
mount -o loop disk.img ulanish
df -i ulanish | tail -1 | awk '{print "inode: jami " $2 ", band " $3 ", bo'\''sh " $4}'
df -h ulanish | tail -1 | awk '{print "disk: " $4 " bo'\''sh, " $5 " band"}'
umount ulanish
Natija
inode: jami 24, band 12, bo'sh 12
disk: 18M bo'sh, 1% band

Diskning 99% i bo'sh. Endi 12 ta bo'sh inode ni to'ldiramiz:

Terminal
mount -o loop disk.img ulanish
i=0; while touch ulanish/f$i 2>/dev/null; do i=$((i+1)); done
echo "yaratilgan fayllar: $i"
touch ulanish/oxirgi 2>&1 | head -1
umount ulanish
Natija
yaratilgan fayllar: 12
touch: cannot touch 'ulanish/oxirgi': No space left on device

No space left on device - lekin diskda joy bor:

Terminal
mount -o loop disk.img ulanish
i=0; while touch ulanish/f$i 2>/dev/null; do i=$((i+1)); done
df -h ulanish | tail -1 | awk '{print "bo'\''sh joy: " $4}'
df -i ulanish | tail -1 | awk '{print "inode band: " $5}'
umount ulanish
Natija
bo'sh joy: 18M
inode band: 100%
18 MB bo'sh, lekin fayl yaratib bo'lmaydi

Bu haqiqiy serverda uchraydigan holat. Tipik sabablar:

SababQayerda
Sessiya fayllari/var/lib/php/sessions - millionlab kichik fayl
Pochta navbati/var/spool/
Keshdagi kichik fayllarIlova keshi
Tozalanmagan vaqtinchalik fayllar/tmp, /var/tmp
Juda ko'p kichik jurnal fayllariAylanish sozlanmagan

Kim aybdor ekanini topish:

Terminal
sudo du --inodes -x -d 1 /var | sort -rn | head

Yoki eski usul bilan:

Terminal
for d in /var/*; do echo "$(find "$d" 2>/dev/null | wc -l) $d"; done | sort -rn | head

Inode sonini keyinchalik oshirib bo'lmaydi - u fayl tizimi yaratilganda belgilanadi. Yechim: fayllarni o'chirish yoki fayl tizimini qaytadan yaratish.

Joyni kim egallagan #

BuyruqNima ko'rsatadi
df -hFayl tizimlari bo'yicha
du -sh /var/*Kataloglar bo'yicha
du -h -x -d 1 / | sort -rhIldizdan bir daraja pastga
du --inodes -x -d 1 /varInode bo'yicha
find / -size +500M 2>/dev/nullKatta fayllar
ncdu /Interaktiv brauzer
Terminal
du -sh /etc 2>/dev/null | awk '{print ($1 ~ /[MG]$/) ? "MB yoki GB tartibida" : "kichik"}'
Natija
MB yoki GB tartibida
-x bayrog'ini unutmang

du -h / bayrog'siz /proc, /sys va ulangan barcha disklarni ham kezib chiqadi. Natija ma'nosiz bo'ladi va buyruq daqiqalab ishlaydi.

-x (--one-file-system) uni bitta fayl tizimi bilan cheklaydi.

BuyruqNatija
du -sh /Sekin, ma'nosiz, /proc ni ham sanaydi
du -sh -x /Tez va to'g'ri
du -h -x -d 1 / | sort -rhEng foydali shakl

Oxirgisini yodda tuting - disk to'lganda birinchi bajariladigan buyruq shu.

O'chirilgan, lekin joyni band qilib turgan fayl #

Bu eng chalkashtiradigan holat: fayl o'chirilgan, du uni ko'rmaydi, lekin df joy bo'shamaganini aytadi.

Terminal
mount -o loop disk.img ulanish
dd if=/dev/zero of=ulanish/katta.bin bs=1M count=10 status=none
exec 9< ulanish/katta.bin
rm ulanish/katta.bin
ls ulanish | grep -c katta.bin || true
df -h ulanish | tail -1 | awk '{print "band: " $3}'
exec 9<&-
sleep 0.3
df -h ulanish | tail -1 | awk '{print "deskriptor yopilgach: " $3}'
umount ulanish
Natija
0
band: 11M
deskriptor yopilgach: 46K

Fayl katalogda yo'q (grep -c nol berdi), lekin 11 MB band bo'lib qoldi - va joy faqat fayl deskriptori yopilgach bo'shadi (11M dan 46K ga tushdi).

"Jurnalni o'chirdim, lekin joy bo'shamadi"

Klassik voqea: disk to'lgan, siz rm /var/log/katta.log qilasiz, df esa hech nima o'zgarmaganini ko'rsatadi.

Sabab: jurnalni yozayotgan xizmat faylni hali ham ochiq ushlab turibdi. Linuxda fayl faqat oxirgi havola ham, oxirgi ochiq deskriptor ham yo'qolgandan keyin o'chadi.

Aybdorni topish:

Terminal
sudo lsof +L1

+L1 - "havolalar soni birdan kam bo'lgan ochiq fayllar", ya'ni o'chirilgan, lekin ochiq fayllar.

Yechim:

UsulIzoh
systemctl restart xizmatEng toza
kill -HUP PIDBa'zi xizmatlar faylni qayta ochadi
: > /var/log/katta.logO'chirish o'rniga bo'shatish

Uchinchisi eng to'g'ri usul: fayl o'chirilmaydi, faqat nolga tushiriladi, va xizmat yozishda davom etaveradi.

Ulash va fstab #

Terminal
findmnt -no FSTYPE / 
Natija
ext4
BuyruqVazifa
lsblkBlok qurilmalar daraxti
blkidUUID va fayl tizimi turi
findmntUlangan fayl tizimlari
mount /dev/sdb1 /mntQo'lda ulash
umount /mntUzish
mount -afstab dagi hammasini ulash

Doimiy ulash /etc/fstab da yoziladi:

Natija
UUID=8f3c1e2a-... /var/www ext4 defaults,noatime 0 2
MaydonMa'no
1Qurilma - UUID bilan
2Ulash nuqtasi
3Fayl tizimi turi
4Parametrlar
5dump (deyarli doim 0)
6fsck tartibi (1 - ildiz, 2 - qolganlar)
fstab dagi xato serverni yuklanmaydigan qiladi

Agar fstab da mavjud bo'lmagan qurilma yozilgan bo'lsa, server yuklanish paytida favqulodda rejimga tushadi va SSH ishlamaydi.

Uchta himoya:

ChoraIzoh
UUID= ishlating/dev/sdb1 qayta yuklashda /dev/sdc1 bo'lishi mumkin
nofail qo'shingQurilma yo'q bo'lsa - yuklanishga xalaqit bermaydi
Qayta yuklashdan oldin sinangsudo mount -a

Oxirgisi shart: mount -a fstab ni o'qib, hammasini ulashga urinadi. Xato bo'lsa - siz uni hozir, terminal ochiq turganda ko'rasiz.

Ma'lumot diskini shunday yozing:

Natija
UUID=8f3c1e2a-... /var/www ext4 defaults,nofail 0 2
Foydali ulash parametrlari
ParametrNima beradi
noatimeHar o'qishda vaqtni yozmaydi - tezroq
nofailQurilma yo'q bo'lsa yuklanish davom etadi
roFaqat o'qish
noexecBu yerdan dastur ishga tushmaydi
nosuidsetuid bitlari e'tiborsiz
nodevQurilma fayllari e'tiborsiz

Oxirgi uchtasi xavfsizlik uchun: foydalanuvchilar fayl yuklaydigan bo'limni shunday ulang:

Natija
/dev/sdc1 /var/www/yuklamalar ext4 defaults,noexec,nosuid,nodev 0 2

Endi u yerga yuklangan .php yoki .sh fayl ishga tushirilmaydi - hatto ruxsatlar noto'g'ri bo'lsa ham.

Bu 5-bo'limdagi "veb-server fayllarga yozmasin" qoidasining davomi: bir necha qatlam himoya bir-birini to'ldiradi.

Fayl tizimi turlari #

TurQachon
ext4Standart tanlov - barqaror, hamma joyda
xfsKatta fayllar, RHEL da standart
btrfsSuratlar (snapshot), siqish
zfsMa'lumot butunligi, katta massivlar
tmpfsXotirada - /run, ba'zan /tmp
overlayKonteynerlar
Terminal
stat -f -c "%T" / 
Natija
ext2/ext3

stat -f fayl tizimining oilasini ko'rsatadi - ext4 uchun u ext2/ext3 deydi. Aniq nomni df -T yoki findmnt beradi (yuqorida ext4 chiqqani shundan).

Disk to'lganda - tartib #

QadamBuyruq
1df -h - qaysi bo'lim
2df -i - inode emasmi
3du -h -x -d 1 / | sort -rh
4Chuqurlashib borish
5lsof +L1 - o'chirilgan, lekin ochiq fayllar
6journalctl --disk-usage
7find / -size +500M -xdev 2>/dev/null
Disk to'lishini oldindan sezish

Muammo yuz berganda tuzatish - kech. To'g'risi - ogohlantirish.

Oddiy tekshiruv skripti (19-bo'limda systemd taymeri bilan ishga tushiramiz):

Terminal
#!/bin/bash
CHEGARA=85
df -h -x tmpfs -x devtmpfs --output=pcent,target | tail -n +2 |
while read -r foiz nuqta; do
    son=${foiz%\%}
    if [ "$son" -ge "$CHEGARA" ]; then
        logger -t disk-nazorat -p user.warning \
            "$nuqta $son% to'ldi"
    fi
done

logger xabarni jurnalga yozadi (13-bo'lim), monitoring esa uni ko'radi.

Chegarani 85% ga qo'ying, 95% ga emas: 85% dan 100% gacha sizda hali vaqt bor, 95% da esa yo'q.

Amaliy topshiriq
  1. df -h va df -i chiqishlarini solishtiring.
  2. Nima uchun Size Used + Avail ga teng emasligini tushuntiring.
  3. dd va mkfs.ext4 -N bilan kichik fayl tizimi yarating.
  4. Inode ni to'ldiring va xato xabarini oling.
  5. O'sha paytda df -h bilan bo'sh joy borligini ko'rsating.
  6. du -h -x -d 1 bilan eng katta kataloglarni toping.
  7. Ochiq deskriptorli o'chirilgan fayl tajribasini takrorlang.
  8. lsof +L1 nima qilishini tushuntiring.
  9. fstab qatorining oltita maydonini nomlang.
  10. noexec,nosuid,nodev nima uchun kerakligini ayting.

Xulosa #

  • SizeUsed + Avail: ext4 root uchun 5% zaxira qoldiradi.
  • Inode soni fayl tizimi yaratilganda belgilanadi va o'zgarmaydi.
  • Inode tugasa, xato bir xil: No space left on device.
  • df -h dan keyin doim df -i.
  • du da -x bayrog'ini unutmang.
  • Disk to'lganda: du -h -x -d 1 / | sort -rh.
  • O'chirilgan fayl ochiq deskriptor bilan joyni band qilib turadi.
  • Jurnalni rm qilmang - : > fayl bilan bo'shating.
  • fstab da UUID= va nofail; o'zgartirgach mount -a bilan sinang.
  • Yuklamalar bo'limini noexec,nosuid,nodev bilan ulang.

Keyingi bo'limda tarmoqni ko'ramiz: IP, portlar, DNS va "sayt ochilmayapti" muammosini bosqichma-bosqich topish.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.