Tarkibga o'tish

Disklar va block qurilmalar

Har qanday serverni boshqarish disklardan boshlanadi: nechta disk ulangan, ular qanday nomlangan, qaysi nom qaysi fizik qurilmaga mos keladi va har biri qancha hajmda. Bu saqlash (storage) moduli aynan shu savoldan boshlanadi — Linux disklarni qanday ko'radi va ularni qanday nomlaydi. Keyingi maqolalar shu poydevor ustiga quriladi: diskni bo'limlarga ajratish, uni RAID va LVM bilan moslashuvchanroq qilish, unda fayl tizimi yaratish va uni mount qilish — lekin bularning hammasi shu yerda ko'rib chiqiladigan narsalarga tayanadi.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • block qurilma nima ekanini va u character qurilmadan qanday farq qilishini tushuntirish;
  • /dev/sd*, /dev/nvme* va /dev/vd* nomlash qoidalarini bir-biridan farqlash;
  • tizimga ulangan disklarni lsblk, blkid, fdisk -l va lsscsi bilan ko'zdan kechirish;
  • major/minor raqamlar nega mavjudligini tushuntirish;
  • disk haqidagi kernel darajasidagi ma’lumotni /sys/block orqali topish;
  • mantiqiy va fizik sektor hajmi o'rtasidagi farqni tushuntirish.

Block qurilma nima

Linux har bir qurilmani /dev ostidagi fayl sifatida taqdim etadi. Bu fayllar ikki toifaga bo'linadi:

  • Character qurilma — ma’lumotlar bayt oqimi sifatida, bir vaqtda bitta baytdan uzatiladi. Misollar: /dev/tty, /dev/random.
  • Block qurilma — ma’lumotlar qat’iy hajmli bloklarda (odatda 512 yoki 4096 bayt) uzatiladi va istalgan joyga tasodifiy kirishni qo'llab-quvvatlaydi. Qattiq disklar, SSD’lar va USB flesh-xotiralar — hammasi block qurilmalar.
ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Jul 25 10:00 /dev/sda

Qator boshidagi b bu block qurilma ekanini bildiradi (character qurilma uchun c bo'lardi). 8, 0 — major va minor raqamlar juftligi.

Major va minor raqamlar

Kernel har bir qurilma faylini ikkita raqam bilan identifikatsiya qiladi:

  • Major raqam — qurilmani boshqaradigan drayverni bildiradi (masalan, 8 — SCSI/SATA disk drayveri).
  • Minor raqam — shu drayver ichidagi muayyan qurilma yoki bo'limni bildiradi (0 — butun disk, 1 — birinchi bo'lim va hokazo).
ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0 Jul 25 10:00 /dev/sda
brw-rw---- 1 root disk 8,  1 Jul 25 10:00 /dev/sda1
brw-rw---- 1 root disk 8,  2 Jul 25 10:00 /dev/sda2
brw-rw---- 1 root disk 8, 16 Jul 25 10:00 /dev/sdb

/dev/sda va /dev/sda1 bir xil major raqamga (8) ega, chunki ikkalasini ham bitta drayver boshqaradi; minor raqam esa aynan qaysi bo'lim ekanini bildiradi.

Disklarni nomlash qoidalari

Qurilma nomi qaysi drayver yoki interfeys ishlatilayotganiga bog'liq:

Nom andozasi Qurilma turi Bo'limlarni nomlash
/dev/sda, /dev/sdb, ... SATA/SAS/USB disk (SCSI quyi tizimi) /dev/sda1, /dev/sda2
/dev/nvme0n1, /dev/nvme1n1, ... NVMe SSD (PCIe orqali ulangan) /dev/nvme0n1p1, /dev/nvme0n1p2
/dev/vda, /dev/vdb, ... Virtio virtual disk (KVM/QEMU virtual mashinalari) /dev/vda1, /dev/vda2
/dev/xvda, /dev/xvdb, ... Xen virtual disk (ayrim bulut provayderlari) /dev/xvda1

sd* nomlash alifbo tartibiga amal qiladi: a, b, c, ... z, keyin aa, ab va hokazo. Bu tartib qayta yuklashlar osha bir xil qolishi kafolatlanmagan — disklarni aniqlash tartibi o'zgarishi mumkin, shuning uchun production tizimlar /dev/sda kabi nomga emas, UUID’ga tayanishi kerak (bu fstab maqolasida chuqur ko'rib chiqiladi).

NVMe nomlash formati boshqacha: nvme0n1 — kontroller raqami 0, n1 — shu kontroller ostidagi 1-namespace, p1 — shu namespace ichidagi 1-bo'lim. p ajratuvchi sifatida kerak, chunki nvme0n1 allaqachon raqam bilan tugaydi.

Info

NVMe disklar SCSI quyi tizimi orqali emas, to'g'ridan-to'g'ri PCIe orqali ulanadi va nvme drayveri tomonidan boshqariladi — shuning uchun ular boshqa nomlash qoidasidan foydalanadi.

Disklarni ko'zdan kechirish buyruqlari

lsblk — block qurilmalar daraxti

lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0    40G  0 disk
├─sda1        8:1    0     1G  0 part /boot
└─sda2        8:2    0    39G  0 part /
sdb           8:16   0   100G  0 disk
nvme0n1     259:0    0   500G  0 disk
└─nvme0n1p1 259:1    0   500G  0 part /data

Foydali flag'lar:

lsblk -f      # filesystem type, UUID, and label
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
lsblk -d      # disks only, no partitions

blkid — UUID va fayl tizimi turi

sudo blkid
/dev/sda1: UUID="1a2b3c4d-5e6f-7890-abcd-ef1234567890" TYPE="ext4" PARTUUID="..."
/dev/sda2: UUID="9f8e7d6c-5b4a-3210-fedc-ba0987654321" TYPE="ext4" PARTUUID="..."

blkid har bir bo'limning UUID’si, yorlig'i (label) va fayl tizimi turini ko'rsatadi — /etc/fstab ni yozishda asosiy ma’lumot manbai.

fdisk -l — bo'limlar jadvali va disk hajmi

sudo fdisk -l
Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
Disklabel type: gpt

Device       Start      End  Sectors Size Type
/dev/sda1     2048  2099199  2097152   1G EFI System
/dev/sda2  2099200 83884031 81784832  39G Linux filesystem

Argumentsiz fdisk -l aniqlangan har bir diskni ro'yxatlaydi; argument bilan (fdisk -l /dev/sda) esa faqat o'sha diskni ko'rsatadi. Bu buyruq faqat o'qiydi — hech narsani o'zgartirmaydi, shuning uchun tizimni ko'zdan kechirish uchun xavfsiz.

lsscsi — SCSI qurilmalarni ro'yxatlash

sudo apt install lsscsi   # Debian/Ubuntu
lsscsi
[0:0:0:0]    disk    ATA      Samsung SSD 860   /dev/sda
[2:0:0:0]    disk    VMware   Virtual disk      /dev/sdb

lsscsi diskni fizik/virtual kontroller darajasida — model, ishlab chiqaruvchi va SCSI manzilini (host:channel:target:lun) birga ko'rsatadi. U ayniqsa bir xil hajmdagi bir nechta diskni bir-biridan ajratishda foydali.

/sys/block — kernel darajasidagi ma’lumot

Kernel har bir block qurilma haqidagi ma’lumotni /sys/block/ ostidagi virtual fayllar sifatida taqdim etadi:

ls /sys/block/
cat /sys/block/sda/size
cat /sys/block/sda/queue/rotational
  • size — diskning sektorlardagi hajmi (baytdagi hajmni olish uchun 512 ga ko'paytiring);
  • queue/rotational — aylanuvchi disk (HDD) uchun 1, SSD/NVMe uchun 0;
  • removable — qurilma olinadigan-olinmaydiganligi (masalan, USB flesh-xotira).
for d in /sys/block/sd*; do
  echo "$(basename $d): rotational=$(cat $d/queue/rotational)"
done

Bu skript har bir sd* disk HDD yoki SSD ekanini ko'rsatadi — lsblk bu ma’lumotni to'g'ridan-to'g'ri bermaydi, shuning uchun /sys/block past darajadagi tekshiruvlar uchun qulay.

Mantiqiy va fizik sektor hajmi

Zamonaviy disklar ko'pincha ikki xil sektor hajmini ko'rsatadi:

  • Mantiqiy sektor hajmi — operatsion tizim ko'radigan eng kichik manzillash birligi (moslik uchun odatda 512 bayt).
  • Fizik sektor hajmi — diskning haqiqiy fizik yozish birligi (zamonaviy disklarda ko'pincha 4096 bayt, "4Kn" yoki "512e" deb ataladi).
sudo fdisk -l /dev/sda | grep "Sector size"
Sector size (logical/physical): 512 bytes / 4096 bytes

Agar bo'lim chegaralari fizik sektor chegaralariga mos kelmasa, disk unumdorligi sezilarli pasayishi mumkin — zamonaviy bo'limlash vositalari (fdisk, parted) buni avtomatik hisobga oladi, lekin disk unumdorligi muammolarini aniqlashda buni bilish foydali.

Amaliy vaziyat: yangi diskni aniqlash

Muammo. Serverga hozirgina yangi virtual disk qo'shildi, lekin uning /dev/sd* nomi noma’lum — production serverda noto'g'ri diskni tanlash undagi ma’lumotlarni yo'qotish xavfini tug'diradi.

1. Disk qo'shilishidan oldingi holatni qayd qiling:

lsblk -d -o NAME,SIZE > /tmp/before.txt

2. Disk qo'shilgandan keyin yana tekshiring:

lsblk -d -o NAME,SIZE > /tmp/after.txt
diff /tmp/before.txt /tmp/after.txt
> sdc    50G

3. Yangi diskni hajmi va modeli bo'yicha tasdiqlang:

sudo fdisk -l /dev/sdc
lsscsi | grep sdc

4. Diskda mavjud bo'lim yoki fayl tizimi yo'qligini tasdiqlang:

sudo blkid /dev/sdc

Agar buyruq hech narsa qaytarmasa (bo'sh chiqish), disk hali bo'limlarga ajratilmagan va fayl tizimisiz — uni bo'limlash xavfsiz.

Xulosa. Bir nechta disk bir xil hajmda bo'lganda oldin/keyin holatini diff bilan solishtirish eng ishonchli aniqlash usuli. Hajm va model raqamiga qarab "taxmin qilish" production muhitda xavfli.

Warning

Diskni hech qachon faqat "ishlatilmagan eng katta raqam" (masalan, /dev/sdd) bo'yicha tanlamang — disk raqamlanishi qayta yuklashdan keyin yoki boshqa disk olib tashlanganda o'zgarishi mumkin. Diskni har doim blkid, lsscsi yoki uning hajmi bilan aniq tasdiqlang, ayniqsa undagi ma’lumotlarni yo'q qiladigan qadamdan (fdisk, mkfs, dd) oldin.

Qayta yuklamasdan "issiq" qo'shilgan diskni aniqlash

Yuqoridagi vaziyat yangi disk lsblk da allaqachon ko'rinadi deb faraz qiladi. Ishlab turgan fizik yoki virtual serverda yangi ulangan disk ba’zan kernelga shinani qayta skanerlash aytilmaguncha ko'rinmaydi — production mashinani faqat yangi diskni ko'rish uchun qayta yuklash esa kamdan-kam hollarda maqbul.

SATA/SAS/SCSI disk uchun har bir SCSI host’ni qayta skanerlashni ishga tushiring:

for host in /sys/class/scsi_host/host*; do
  echo "- - -" | sudo tee "$host/scan"
done
lsblk

- - - — channel target lun, uchta chiziqcha esa "istalgan" degani — ya’ni shu host’dagi hamma narsani skanerlash.

Agar mavjud disk hypervisor/SAN tomonida kattalashtirilgan bo'lsa (keng tarqalgan bulut amali), lekin hali ham eski hajmni ko'rsatsa, buning o'rniga aynan o'sha qurilmani qayta skanerlang:

echo 1 | sudo tee /sys/class/block/sdb/device/rescan
lsblk /dev/sdb

NVMe namespace uchun:

sudo nvme ns-rescan /dev/nvme0

Info

Diskning o'zi yangi hajmni ko'rsatgandan keyin ham uning bo'limi va fayl tizimi hali kattalashmagan bo'ladi — bular growpart + resize2fs/xfs_growfs bilan kattalashtiriladigan alohida qatlamlar; ular Bo'limlar (partitions) va LVM: hajmni o'zgartirish va snapshot maqolalarida ko'rib chiqiladi.

Doimiy qurilma nomlari: /dev/disk/by-*

Fayl tizimi (va shunga ko'ra UUID) mavjud bo'lishidan oldin ham disk skriptlar va avtomatlashtirish uchun barqaror nomga muhtoj — /dev/sdb esa aynan keyingi boot’da o'zgarishi mumkin bo'lgan nom. Kernel /dev/disk/ ostida barqaror symlink’larni yuritadi:

ls -l /dev/disk/by-id/
ls -l /dev/disk/by-path/
  • by-id — uskunaning seriya raqami/WWN’iga asoslangan (masalan, wwn-0x5000c500..., nvme-Samsung_SSD_...); fizik diskka bog'langan, shuning uchun qayta yuklashlar va kabel o'zgarishlaridan omon qoladi. mdadm/LVM avtomatlashtirishida butun diskni belgilash uchun to'g'ri identifikator aynan shu.
  • by-path — fizik ulanishga (PCI/SCSI yo'li) asoslangan; disk bitta slotda qolar ekan barqaror, lekin ko'chirilsa o'zgaradi.
  • by-uuid / by-label — fayl tizimi yaratilgandan keyingina paydo bo'ladi va fstab aynan shulardan foydalanadi.

Keng tarqalgan xatolar

/dev/sda ni doimiy nom deb hisoblash

Disk nomlari qayta yuklashlar osha yoki qurilma qo'shilganda yoki olib tashlanganda o'zgarishi mumkin. Skriptlar va fstab qattiq yozilgan nom (/dev/sdb1) o'rniga UUID’dan foydalanishi kerak.

lsblk va fdisk -l o'rtasidagi farqni bilmaslik

lsblk kernel ko'rayotgan joriy holatni ierarxik ko'rinishda (mount nuqtalari bilan) ko'rsatadi. fdisk -l bo'limlar jadvalini batafsilroq (sektor chegaralari, tur kodlari) ko'rsatadi, lekin sudo ni talab qiladi va mount holatini ko'rsatmaydi.

Bo'limni disk bilan adashtirish

/dev/sda — butun disk; /dev/sda1 esa undagi birinchi bo'lim. mkfs yoki mount hech qachon butun diskka emas, mo'ljallangan bo'limga (yoki LVM kabi maxsus holatlarda logical volume’ga) qaratilishi kerak.

Mashqlar

  1. lsblk, blkid va fdisk -l chiqishlarini solishtiring — har biri qaysi ustun/maydonlarni taqdim etishini qayd qiling.
  2. Tizimingizdagi /sys/block/ ostidagi har bir disk uchun rotational qiymatini tekshiring va qaysilari HDD, qaysilari SSD ekanini aniqlang.
  3. O'chirib tashlasa bo'ladigan sinov VM’iga yangi virtual disk qo'shing va uni shu maqoladagi "oldin/keyin diff" usuli bilan aniqlang, so'ng hajmini fdisk -l bilan tasdiqlang.

Mashqni bajardim deyish uchun: yangi qo'shilgan diskni taxmin bilan emas, kamida ikkita mustaqil dalil (hajm, model yoki oldin/keyin solishtirish) yordamida ishonch bilan aniqlay olishingiz kerak.

Xulosa

Linux har bir diskni /dev ostidagi, major/minor raqamlar bilan identifikatsiya qilinadigan block qurilma sifatida taqdim etadi; nomlash interfeysga qarab farq qiladi (sd*, nvme*, vd*). lsblk, blkid, fdisk -l, lsscsi va /sys/block — tizimdagi disklarni ko'zdan kechirish uchun asosiy, faqat o'qiydigan vositalar. Disk to'g'ri aniqlangach, keyingi qadam — uni fdisk, gdisk yoki parted yordamida bo'limlarga ajratish.

Manbalar