آموزش دستور lsblk در لینوکس؛ نمایش دیسک‌ها، پارتیشن‌ها و UUID

آموزش دستور lsblk در لینوکس؛ نمایش دیسک‌ها، پارتیشن‌ها و UUID

حدود ۸ دقیقه مطالعه

یک دیسک تازه به سرور اضافه کرده‌اید و حالا باید بدانید سیستم آن را با چه نامی می‌شناسد: /dev/sdb است یا /dev/sdc؟ یا می‌خواهید UUID یک پارتیشن را برای نوشتن در /etc/fstab پیدا کنید، یا پیش از افزایش حجم مطمئن شوید فضای خالی واقعاً روی همان دیسکی است که فکر می‌کنید. پاسخ همه این پرسش‌ها در خروجی یک دستور جمع است: lsblk.

دستور lsblk چیست و اطلاعات را از کجا می‌خواند؟

دستور lsblk مخفف عبارت List Block Devices است و برای مشاهده لیست block device ها به کار می‌رود؛ یعنی دیسک‌ها، پارتیشن‌ها، حجم‌های LVM، آرایه‌های RAID، درایو نوری و loop device ها را با نام مرتبط با آن‌ها نمایش می‌دهد.

این دستور اطلاعات را با خواندن مستقیم از خود دیسک به دست نمی‌آورد، بلکه آن را از فایل‌سیستم sysfs و پایگاه‌داده udev جمع‌آوری می‌کند. نتیجه این است که lsblk بسیار سریع اجرا می‌شود، هیچ نوشتنی روی دیسک انجام نمی‌دهد و برای خروجی پیش‌فرض حتی نیازی به کاربر root ندارد.

lsblk بخشی از بسته util-linux است و روی CentOS، AlmaLinux، Rocky Linux، Ubuntu و Debian به یک شکل کار می‌کند. اگر در یک کانتینر یا نصب مینیمال با پیام command not found روبه‌رو شدید، بسته را نصب کنید:

dnf install util-linux      # AlmaLinux / Rocky / RHEL 8+
yum install util-linux      # CentOS 7
apt install util-linux      # Ubuntu / Debian

خروجی پیش‌فرض و معنی ستون‌ها

این فرمان به‌طور پیش‌فرض تمام دستگاه‌های بلاکی (به استثنای دیسک‌های RAM) را به‌صورت درختی چاپ می‌کند. کافی است بدون هیچ سوییچی اجرایش کنید:

lsblk

نمونه‌ای از خروجی روی یک سرور با LVM:

NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   100G  0 disk
├─sda1          8:1    0     1G  0 part /boot
└─sda2          8:2    0    99G  0 part
  ├─vg0-root  253:0    0    80G  0 lvm  /
  └─vg0-swap  253:1    0     4G  0 lvm  [SWAP]
sdb             8:16   0   500G  0 disk
sr0            11:0    1  1024M  0 rom

معنی ستون‌ها:

  • NAME — نام دستگاه بدون پیشوند /dev/. تورفتگی و خطوط درختی نشان می‌دهند هر پارتیشن یا حجم زیرمجموعه کدام دیسک است.
  • MAJ:MIN — شماره major و minor دستگاه. major مشخص می‌کند دستگاه با کدام درایور کار می‌کند؛ برای نمونه ۸ برای دیسک‌های sd (SATA/SAS/SCSI)، ۱۱ برای درایو نوری، ۷ برای loop device ها، معمولاً ۲۵۳ برای device-mapper و LVM و ۲۵۹ برای namespace های NVMe.
  • RM — یعنی removable. مقدار ۱ برای دستگاه‌های جداشدنی مثل فلش USB و درایو نوری.
  • SIZE — اندازه دستگاه با واحد خوانا (G، M، T).
  • RO — یعنی read-only. مقدار ۱ یعنی دستگاه فقط‌خواندنی است.
  • TYPE — نوع دستگاه: disk برای دیسک فیزیکی یا مجازی، part برای پارتیشن، lvm برای حجم منطقی، raid0/raid1/raid5 برای آرایه نرم‌افزاری، crypt برای لایه رمزنگاری، rom برای درایو نوری و loop برای loop device.
  • MOUNTPOINTS — مسیری که دستگاه در آن mount شده است. در نسخه‌های قدیمی‌تر util-linux (مثلاً روی CentOS ۷) نام این ستون MOUNTPOINT و تک‌مقداری بود؛ در نسخه‌های جدید به MOUNTPOINTS تغییر کرده تا بتواند چند نقطه اتصال یک دستگاه را هم‌زمان نشان دهد. اگر این ستون خالی باشد یعنی دستگاه mount نشده است.

برای مشاهده یک لیست از تمام ستون‌های موجود از lsblk --help یا man lsblk استفاده کنید.

سوییچ‌های کاربردی lsblk

نمایش فایل‌سیستم، لیبل و UUID با -f

پرکاربردترین حالت lsblk همین است. وقتی می‌خواهید UUID یک پارتیشن را برای /etc/fstab بردارید یا ببینید کدام پارتیشن هنوز فرمت نشده، این دستور را بزنید:

lsblk -f
NAME          FSTYPE      LABEL UUID                                 MOUNTPOINTS
sda
├─sda1        xfs         boot  7c2a1f4e-…                           /boot
└─sda2        LVM2_member       aBcDeF-GhIj-…
  ├─vg0-root  xfs               1f3d55b0-…                           /
  └─vg0-swap  swap              9b7e02c1-…                           [SWAP]
sdb

ستون FSTYPE خالی یعنی روی آن دستگاه فایل‌سیستمی ساخته نشده است — دقیقاً همان چیزی که برای تشخیص دیسک تازه‌اضافه‌شده لازم دارید. در نسخه‌های جدیدتر util-linux، خروجی -f ستون‌های FSVER، FSAVAIL و FSUSE% را هم اضافه می‌کند و میزان فضای آزاد فایل‌سیستم را نشان می‌دهد.

نمایش اندازه بر حسب بایت با -b

به‌طور پیش‌فرض اندازه‌ها گرد و خوانا نمایش داده می‌شوند. اگر عدد دقیق می‌خواهید — مثلاً برای مقایسه اندازه دیسک قبل و بعد از افزایش حجم یا برای استفاده در اسکریپت — ستون SIZE را بر حسب بایت بگیرید:

lsblk -b

نمایش همه دستگاه‌ها با -a

lsblk به‌صورت پیش‌فرض دستگاه‌های خالی (بدون ظرفیت) و دیسک‌های RAM را پنهان می‌کند. سوییچ -a آن‌ها را هم به فهرست اضافه می‌کند:

lsblk -a

نمایش owner و group و mode با -m

اگر با مجوزهای دسترسی فایل دستگاه کار دارید (مثلاً می‌خواهید بدانید چرا یک سرویس به /dev/sdb دسترسی ندارد)، این حالت مالک، گروه و مود هر دستگاه را نشان می‌دهد:

lsblk -m
NAME    SIZE OWNER GROUP MODE
sda     100G root  disk  brw-rw----
├─sda1    1G root  disk  brw-rw----
└─sda2   99G root  disk  brw-rw----

انتخاب ستون‌های دلخواه با -o

با -o می‌توانید دقیقاً همان ستون‌هایی را بخواهید که لازم دارید. این حالت برای اسکریپت‌نویسی و گزارش‌گیری بسیار مفید است:

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
lsblk -d -o NAME,SIZE,MODEL,SERIAL
lsblk -O

سوییچ -d فقط خود دیسک‌ها را بدون پارتیشن‌هایشان نشان می‌دهد و -O تمام ستون‌های ممکن را چاپ می‌کند. چند سوییچ مفید دیگر: -p مسیر کامل دستگاه را می‌نویسد، -l خروجی را به‌جای درخت به‌صورت لیست ساده می‌دهد، -n سطر عنوان را حذف می‌کند و -J خروجی JSON تولید می‌کند. روی سرورهای Ubuntu که پر از loop device مربوط به snap هستند، lsblk -e7 همه آن‌ها را از خروجی حذف می‌کند.

یک نکته درباره نام ستون‌ها: اگر روی سرور قدیمی‌تری مثل CentOS ۷ هستید و با خطای lsblk: unknown column: MOUNTPOINTS روبه‌رو شدید، در دستورهای بالا به‌جای MOUNTPOINTS از MOUNTPOINT (بدون s) استفاده کنید. با lsblk --help ببینید نسخه نصب‌شده روی سرور شما کدام ستون‌ها را می‌شناسد.

اطلاعات دستگاه‌های SCSI با -S

lsblk -S

این حالت فقط دستگاه‌های متصل به زیرسیستم SCSI را با ستون‌هایی مانند HCTL، VENDOR، MODEL، REV و TRAN (نوع اتصال) فهرست می‌کند. دقت کنید دیسک‌های NVMe در این خروجی ظاهر نمی‌شوند، چون در زیرسیستم SCSI قرار ندارند؛ برای آن‌ها از lsblk -d -o NAME,SIZE,MODEL استفاده کنید.

توپولوژی دیسک با -t

lsblk -t

خروجی این سوییچ برای تنظیم دقیق ذخیره‌سازی به کار می‌آید: PHY-SEC و LOG-SEC اندازه سکتور فیزیکی و منطقی، MIN-IO و OPT-IO حداقل و بهینه واحد I/O، ALIGNMENT افست هم‌ترازی پارتیشن، ROTA چرخشی بودن دیسک (۰ یعنی SSD) و SCHED زمان‌بند I/O فعال.

کاربرد عملی: پیدا کردن دیسک تازه‌اضافه‌شده

رایج‌ترین دلیل اجرای lsblk این است: به سرور مجازی یا فیزیکی یک دیسک اضافه کرده‌اید و می‌خواهید قبل از پارتیشن‌بندی یا extend کردن، مطمئن شوید سراغ دیسک درست می‌روید. روال کار:

  • اول lsblk -f بگیرید. دیسکی که هیچ پارتیشنی زیرش نیست، ستون FSTYPE و MOUNTPOINTS آن خالی است و اندازه‌اش با دیسکی که در پنل مجازی‌ساز اضافه کرده‌اید می‌خواند، همان دیسک جدید است (در نمونه بالا: sdb).
  • پیش از هر عملیات مخرب، همان دیسک را دوباره با lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS /dev/sdb جداگانه بررسی کنید تا خطای تایپی سراغ دیسک اصلی نرود.
  • بعد از ساختن پارتیشن یا فایل‌سیستم، دوباره lsblk -f بگیرید. اگر پارتیشن جدید و FSTYPE آن ظاهر شد، کار درست انجام شده است.

تشخیص LVM و RAID از روی خروجی

ساختار درختی lsblk لایه‌های روی هم را نشان می‌دهد و همین آن را برای عیب‌یابی ارزشمند می‌کند. اگر زیر یک پارتیشن، سطرهایی با TYPE برابر lvm دیدید، آن پارتیشن یک Physical Volume است و فضای آن از طریق LVM توزیع شده؛ یعنی برای افزایش فضا باید سراغ pvresize و lvextend بروید و بعد از آن فایل‌سیستم را با resize2fs (برای ext4) یا xfs_growfs (برای XFS) بزرگ کنید، نه اینکه دیسک را مستقیم mount کنید. اگر TYPE برابر raid1 یا raid5 بود، دیسک عضو یک آرایه RAID نرم‌افزاری است و دستکاری تک‌تک اعضا آرایه را خراب می‌کند. مقدار crypt هم یعنی لایه رمزنگاری LUKS در مسیر قرار دارد.

تفاوت lsblk با df و fdisk -l و blkid

  • df -h فقط فایل‌سیستم‌های mount شده و میزان مصرف آن‌ها را نشان می‌دهد. دیسک یا پارتیشنی که mount نشده باشد اصلاً در df دیده نمی‌شود — به همین دلیل برای پیدا کردن دیسک جدید بی‌فایده است.
  • fdisk -l جدول پارتیشن را از خود دیسک می‌خواند، به دسترسی root نیاز دارد و ساختار لایه‌ای LVM و RAID را به شکل درختی نشان نمی‌دهد.
  • blkid فقط شناسه‌ها (UUID، LABEL، TYPE) را می‌دهد بدون اینکه رابطه دیسک و پارتیشن مشخص باشد؛ lsblk -f همان اطلاعات را در قالب درختی و خواناتر ارائه می‌کند.

مشکلات رایج

دیسک تازه‌اضافه‌شده در خروجی نیست

بعد از hot-add دیسک در VMware یا KVM، کرنل باید باس SCSI را دوباره اسکن کند:

for host in /sys/class/scsi_host/host*; do echo "- - -" > "$host/scan"; done

اجرای این حلقه به کاربر root نیاز دارد. سپس دوباره lsblk بگیرید. دیسک‌های NVMe معمولاً بدون اسکن دستی ظاهر می‌شوند.

حجم دیسک را در هایپروایزر بیشتر کرده‌اید ولی lsblk عدد قبلی را نشان می‌دهد

اطلاعات همان دستگاه را رفرش کنید (نام دستگاه را با نام واقعی خودتان جایگزین کنید):

echo 1 > /sys/class/block/sdb/device/rescan

این دستور هم به کاربر root نیاز دارد و مسیر device/rescan فقط برای دیسک‌های متصل به زیرسیستم SCSI/SATA وجود دارد؛ روی دیسک‌های virtio-blk (که با نام‌هایی مثل vda و vdb دیده می‌شوند) چنین فایلی نیست و معمولاً باید ماشین مجازی را خاموش و روشن کنید. دقت کنید این کار فقط عدد اندازه خود دیسک را به‌روز می‌کند؛ بزرگ کردن پارتیشن و فایل‌سیستم مرحله جداگانه‌ای است.

پارتیشن جدید ساخته‌اید ولی در خروجی نیست

کرنل هنوز نسخه قدیمی جدول پارتیشن را در حافظه دارد. با partprobe /dev/sdb یا partx -u /dev/sdb آن را به‌روز کنید. خروجی پر از loop device هم با lsblk -e7 پاک‌سازی می‌شود.

یک نکته مهم پیش از عملیات مخرب

دستور lsblk کاملاً بی‌خطر است و چیزی را تغییر نمی‌دهد، اما نتیجه آن را نباید همیشه ماندگار فرض کرد: نام‌هایی مثل sdb و sdc بین ریبوت‌ها یا با تغییر ترتیب کنترلرها می‌توانند جابه‌جا شوند. بنابراین قبل از اجرای mkfs، parted یا dd، دیسک هدف را با اندازه و مدل و UUID تأیید کنید نه فقط با نام، و در /etc/fstab همیشه از UUID (همان چیزی که lsblk -f می‌دهد) به‌جای /dev/sdX استفاده کنید. یک اشتباه در انتخاب نام دستگاه یعنی از دست رفتن اطلاعات دیسک اصلی.

آموزش‌های مرتبط

ارسال نظر