14-bo‘lim
Disk va fayl tizimlari
df, inode, ulash, fstab va "disk bo'sh, lekin joy yo'q" degan xatoning haqiqiy sababi.
Ushbu bo‘lim mundarijasi
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 #
df -h / | head -1 | tr -s ' '
Filesystem Size Used Avail Use% Mounted on
| Ustun | Ma'no |
|---|---|
Filesystem | Qurilma yoki manba |
Size | Umumiy hajm |
Used | Band |
Avail | Bo'sh |
Use% | Foiz |
Mounted on | Qayerga ulangan |
Size = Used + Avail emasIkkita 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:
sudo tune2fs -m 1 /dev/sdb1
Lekin ildiz bo'limida buni qilmang - zaxira aynan shu yerda kerak.
Inode - haqiqiy chegara #
df -i / | head -1 | tr -s ' '
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.
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.
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
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
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:
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
yaratilgan fayllar: 12
touch: cannot touch 'ulanish/oxirgi': No space left on device
No space left on device - lekin diskda joy bor:
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
bo'sh joy: 18M
inode band: 100%
Bu haqiqiy serverda uchraydigan holat. Tipik sabablar:
| Sabab | Qayerda |
|---|---|
| Sessiya fayllari | /var/lib/php/sessions - millionlab kichik fayl |
| Pochta navbati | /var/spool/ |
| Keshdagi kichik fayllar | Ilova keshi |
| Tozalanmagan vaqtinchalik fayllar | /tmp, /var/tmp |
| Juda ko'p kichik jurnal fayllari | Aylanish sozlanmagan |
Kim aybdor ekanini topish:
sudo du --inodes -x -d 1 /var | sort -rn | head
Yoki eski usul bilan:
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 #
| Buyruq | Nima ko'rsatadi |
|---|---|
df -h | Fayl tizimlari bo'yicha |
du -sh /var/* | Kataloglar bo'yicha |
du -h -x -d 1 / | sort -rh | Ildizdan bir daraja pastga |
du --inodes -x -d 1 /var | Inode bo'yicha |
find / -size +500M 2>/dev/null | Katta fayllar |
ncdu / | Interaktiv brauzer |
du -sh /etc 2>/dev/null | awk '{print ($1 ~ /[MG]$/) ? "MB yoki GB tartibida" : "kichik"}'
MB yoki GB tartibida
-x bayrog'ini unutmangdu -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.
| Buyruq | Natija |
|---|---|
du -sh / | Sekin, ma'nosiz, /proc ni ham sanaydi |
du -sh -x / | Tez va to'g'ri |
du -h -x -d 1 / | sort -rh | Eng 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.
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
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).
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:
sudo lsof +L1
+L1 - "havolalar soni birdan kam bo'lgan ochiq fayllar",
ya'ni o'chirilgan, lekin ochiq fayllar.
Yechim:
| Usul | Izoh |
|---|---|
systemctl restart xizmat | Eng toza |
kill -HUP PID | Ba'zi xizmatlar faylni qayta ochadi |
: > /var/log/katta.log | O'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 #
findmnt -no FSTYPE /
ext4
| Buyruq | Vazifa |
|---|---|
lsblk | Blok qurilmalar daraxti |
blkid | UUID va fayl tizimi turi |
findmnt | Ulangan fayl tizimlari |
mount /dev/sdb1 /mnt | Qo'lda ulash |
umount /mnt | Uzish |
mount -a | fstab dagi hammasini ulash |
Doimiy ulash /etc/fstab da yoziladi:
UUID=8f3c1e2a-... /var/www ext4 defaults,noatime 0 2
| Maydon | Ma'no |
|---|---|
| 1 | Qurilma - UUID bilan |
| 2 | Ulash nuqtasi |
| 3 | Fayl tizimi turi |
| 4 | Parametrlar |
| 5 | dump (deyarli doim 0) |
| 6 | fsck tartibi (1 - ildiz, 2 - qolganlar) |
fstab dagi xato serverni yuklanmaydigan qiladiAgar fstab da mavjud bo'lmagan qurilma yozilgan bo'lsa,
server yuklanish paytida favqulodda rejimga tushadi va
SSH ishlamaydi.
Uchta himoya:
| Chora | Izoh |
|---|---|
UUID= ishlating | /dev/sdb1 qayta yuklashda /dev/sdc1 bo'lishi mumkin |
nofail qo'shing | Qurilma yo'q bo'lsa - yuklanishga xalaqit bermaydi |
| Qayta yuklashdan oldin sinang | sudo 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:
UUID=8f3c1e2a-... /var/www ext4 defaults,nofail 0 2
| Parametr | Nima beradi |
|---|---|
noatime | Har o'qishda vaqtni yozmaydi - tezroq |
nofail | Qurilma yo'q bo'lsa yuklanish davom etadi |
ro | Faqat o'qish |
noexec | Bu yerdan dastur ishga tushmaydi |
nosuid | setuid bitlari e'tiborsiz |
nodev | Qurilma fayllari e'tiborsiz |
Oxirgi uchtasi xavfsizlik uchun: foydalanuvchilar fayl yuklaydigan bo'limni shunday ulang:
/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 #
| Tur | Qachon |
|---|---|
ext4 | Standart tanlov - barqaror, hamma joyda |
xfs | Katta fayllar, RHEL da standart |
btrfs | Suratlar (snapshot), siqish |
zfs | Ma'lumot butunligi, katta massivlar |
tmpfs | Xotirada - /run, ba'zan /tmp |
overlay | Konteynerlar |
stat -f -c "%T" /
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 #
| Qadam | Buyruq |
|---|---|
| 1 | df -h - qaysi bo'lim |
| 2 | df -i - inode emasmi |
| 3 | du -h -x -d 1 / | sort -rh |
| 4 | Chuqurlashib borish |
| 5 | lsof +L1 - o'chirilgan, lekin ochiq fayllar |
| 6 | journalctl --disk-usage |
| 7 | find / -size +500M -xdev 2>/dev/null |
Muammo yuz berganda tuzatish - kech. To'g'risi - ogohlantirish.
Oddiy tekshiruv skripti (19-bo'limda systemd taymeri bilan
ishga tushiramiz):
#!/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.
df -hvadf -ichiqishlarini solishtiring.- Nima uchun
SizeUsed+Availga teng emasligini tushuntiring. ddvamkfs.ext4 -Nbilan kichik fayl tizimi yarating.- Inode ni to'ldiring va xato xabarini oling.
- O'sha paytda
df -hbilan bo'sh joy borligini ko'rsating. du -h -x -d 1bilan eng katta kataloglarni toping.- Ochiq deskriptorli o'chirilgan fayl tajribasini takrorlang.
lsof +L1nima qilishini tushuntiring.fstabqatorining oltita maydonini nomlang.noexec,nosuid,nodevnima uchun kerakligini ayting.
Xulosa #
Size≠Used+Avail:ext4root uchun 5% zaxira qoldiradi.- Inode soni fayl tizimi yaratilganda belgilanadi va o'zgarmaydi.
- Inode tugasa, xato bir xil:
No space left on device. df -hdan keyin doimdf -i.duda-xbayrog'ini unutmang.- Disk to'lganda:
du -h -x -d 1 / | sort -rh. - O'chirilgan fayl ochiq deskriptor bilan joyni band qilib turadi.
- Jurnalni
rmqilmang -: > faylbilan bo'shating. fstabdaUUID=vanofail; o'zgartirgachmount -abilan sinang.- Yuklamalar bo'limini
noexec,nosuid,nodevbilan ulang.
Keyingi bo'limda tarmoqni ko'ramiz: IP, portlar, DNS va "sayt ochilmayapti" muammosini bosqichma-bosqich topish.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.