آموزش دستور 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 استفاده کنید. یک اشتباه در انتخاب نام دستگاه یعنی از دست رفتن اطلاعات دیسک اصلی.
ارسال نظر