فصل ۱۵ – رسانههای ذخیرهسازی (Storage Media)
در فصلهای پیشین، دادهها را در سطح فایل بررسی کردیم. اما در این فصل، سراغ سطح دستگاه (device level) میرویم — جایی که لینوکس در مدیریت انواع رسانههای ذخیرهسازی توان خارقالعادهای دارد: از دیسکهای سخت فیزیکی گرفته تا ذخیرهسازهای شبکهای و دستگاههای مجازی مانند RAID (آرایهی افزونهی دیسکهای مستقل) و LVM (مدیر حجم منطقی).
البته هدف این کتاب آموزش مدیریت سیستم نیست، پس وارد جزئیات عمیق این حوزه نمیشویم. هدف، آشنایی با مفاهیم پایه و فرمانهای کلیدی برای کار با دستگاههای ذخیرهسازی است.
برای تمرینهای این فصل، از موارد زیر استفاده میشود:
- یک فلش USB
- یک دیسک CD-RW (در صورت وجود CD-ROM Writer)
- و یک دیسک فلاپی (در صورت موجود بودن در سیستم).
فرمانهایی که در این فصل بررسی میشوند
| فرمان | توضیح |
|---|---|
mount |
سوار کردن (اتصال) یک فایلسیستم |
umount |
جدا کردن فایلسیستم |
fsck |
بررسی و تعمیر فایلسیستم |
fdisk |
ویرایش جدول پارتیشنها |
mkfs |
ساخت فایلسیستم جدید |
fdformat |
فرمت کردن فلاپی دیسک |
dd |
نوشتن دادههای بلوکی مستقیم روی دستگاه |
genisoimage (یا mkisofs) |
ایجاد فایل ISO 9660 |
wodim (یا cdrecord) |
نوشتن داده روی رسانهٔ نوری |
md5sum |
محاسبهٔ چکسام MD5 برای اعتبارسنجی فایلها |
Mount و Unmount در لینوکس
در نسخههای جدید دسکتاپ لینوکس، مدیریت دستگاههای ذخیرهسازی بسیار سادهتر از گذشته شده است. امروز کافی است دستگاه را وصل کنید تا خودکار شناسایی و آمادهٔ استفاده شود.
اما در گذشته (مثلاً حوالی سال ۲۰۰۴)، این کار باید بهصورت دستی انجام میشد.
در سیستمهای غیر دسکتاپی مانند سرورها، هنوز هم این کار عمدتاً دستی انجام میشود، چون سرورها معمولاً نیازهای خاص و ساختارهای ذخیرهسازی پیچیدهای دارند.
مفهوم Mount
اولین گام در مدیریت رسانهٔ ذخیرهسازی، اتصال دستگاه به درخت فایلسیستم (filesystem tree) است.
به این فرایند mount کردن گفته میشود.
با انجام mount، دستگاه به بخشی از ساختار سیستمفایل لینوکس متصل میشود و سیستمعامل میتواند به آن دسترسی پیدا کند.
همانطور که در فصل دوم دیدیم، لینوکس (مانند سایر سیستمهای شبهیونیکس) یک درخت فایلسیستم واحد دارد که تمام دستگاهها در شاخههای مختلف آن متصل میشوند.
این در تضاد با سیستمهایی مانند Windows است که برای هر دستگاه، درخت جداگانهای با حروف درایو (C:\، D:\ و غیره) در نظر میگیرند.
فایل پیکربندی /etc/fstab
فایلی به نام /etc/fstab فهرستی از دستگاههایی را دارد که باید هنگام بوت شدن سیستم بهطور خودکار mount شوند.
نمونهای از محتوای این فایل در سیستم Fedora 7 بهشکل زیر است:
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda3 swap swap defaults 0 0
بیشتر فایلسیستمهای بالا مجازی هستند (مثل /proc و /sys) و برای بحث ما مهم نیستند.
اما سه خط نخست مربوط به پارتیشنهای دیسک سخت هستند و ارزش بررسی دارند:
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
ساختار خطوط در /etc/fstab
هر خط از این فایل شش بخش دارد که در جدول زیر آمده است:
جدول ۱۵-۱: فیلدهای فایل /etc/fstab
| شماره | فیلد | توضیح |
|---|---|---|
| ۱ | Device (دستگاه) | در گذشته این قسمت شامل مسیر فایل دستگاه فیزیکی بود، مانند /dev/hda1 (پارتیشن اول روی دیسک اصلی کانال IDE اول). اما در سیستمهای امروزی با وجود دستگاههای Hot-Pluggable (مثل USB)، بیشتر توزیعها از برچسب متنی (Label) استفاده میکنند. این برچسب هنگام فرمتکردن به رسانه اضافه میشود و هنگام اتصال، سیستمعامل آن را میخواند تا دستگاه را بهدرستی شناسایی کند — حتی اگر نام فایل دستگاه تغییر کند. |
| ۲ | Mount Point (نقطهٔ اتصال) | مسیر شاخهای از درخت فایلسیستم که دستگاه در آن mount میشود. |
| ۳ | File System Type (نوع فایلسیستم) | لینوکس از انواع زیادی فایلسیستم پشتیبانی میکند. معمولترین نوع بومی آن ext3 است، اما سیستمهای دیگری نیز پشتیبانی میشوند، مانند FAT16 (msdos)، FAT32 (vfat)، NTFS (ntfs)، و CD-ROM (iso9660). |
| ۴ | Options (گزینهها) | گزینههای اضافی برای mount کردن. برای مثال میتوان فایلسیستم را فقطخواندنی (read-only) یا بدون اجازهٔ اجرای برنامهها mount کرد — قابلیتی مفید برای امنیت رسانههای قابلحمل. |
| ۵ | Frequency (تناوب پشتیبانگیری) | عددی که مشخص میکند آیا فایلسیستم باید توسط دستور dump پشتیبانگیری شود یا خیر. |
| ۶ | Order (ترتیب بررسی) | عددی که مشخص میکند فایلسیستمها در چه ترتیبی باید توسط دستور fsck بررسی شوند. |
مشاهدهی فهرست فایلسیستمهای Mountشده (Viewing a List of Mounted File Systems)
دستور mount برای اتصال (mount کردن) فایلسیستمها استفاده میشود.
اگر این دستور بدون هیچ آرگومانی اجرا شود، فهرست تمام فایلسیستمهای در حال استفاده در سیستم را نمایش میدهد:
[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)
فرمت خروجی به شکل زیر است:
device on mount_point type file_system_type (options)
برای مثال:
خط اول نشان میدهد که دستگاه /dev/sda2 به عنوان فایلسیستم ریشه (root) متصل شده، نوع آن ext3 است و با گزینهی (rw) قابل خواندن و نوشتن میباشد.
در انتهای این فهرست، دو مورد جالب دیده میشود:
/dev/sdd1→ یک کارت حافظهٔ SD دو گیگابایتی که روی/media/diskmount شده است.twin4:/musicbox→ یک درایو شبکهای (Network File System) که روی/misc/musicboxمتصل است.
آزمایش با یک CD-ROM
برای تمرین، ابتدا وضعیت سیستم را قبل از وارد کردن CD بررسی میکنیم:
[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
این خروجی مربوط به سیستم CentOS 5 است که از LVM (مدیر حجم منطقی) برای ساخت فایلسیستم ریشه استفاده میکند.
بسیاری از توزیعهای امروزی مانند CentOS، پس از وارد کردن CD-ROM، بهصورت خودکار آن را mount میکنند.
پس از وارد کردن دیسک، خروجی دستور تغییر میکند:
[me@linuxbox ~]$ mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/hdc on /media/live-1.0.10-8 type iso9660 (ro,noexec,nosuid,nodev,uid=500)
تفاوت با حالت قبل فقط یک خط اضافه در انتها است:
دستگاه /dev/hdc (درایو CD-ROM) اکنون روی مسیر /media/live-1.0.10-8 با نوع فایلسیستم iso9660 (ویژهٔ CD-ROM) mount شده است.
⚠️ هشدار مهم:
در تمرینهای عملی، باید با دقت نام واقعی دستگاه در سیستم خود را بررسی کنید.
از نامهای موجود در مثالها استفاده نکنید، چون ممکن است در سیستم شما متفاوت باشند.
همچنین توجه کنید: CD صوتی (Audio CD) مانند CD-ROM نیست و فایلسیستم ندارد، بنابراین mount نمیشود.
Unmount و Mount دستی
حالا که نام دستگاه CD-ROM را میدانیم، آن را unmount کرده و دوباره در مسیر جدیدی mount میکنیم.
ابتدا باید با دستور su به کاربر ریشه (superuser) برویم:
[me@linuxbox ~]$ su
Password:
[root@linuxbox ~]# umount /dev/hdc
سپس یک مسیر جدید برای mount کردن میسازیم:
[root@linuxbox ~]# mkdir /mnt/cdrom
اکنون CD-ROM را در این مسیر جدید mount میکنیم.
گزینهی -t نوع فایلسیستم را مشخص میکند:
[root@linuxbox ~]# mount -t iso9660 /dev/hdc /mnt/cdrom
حالا میتوانیم محتویات CD را ببینیم:
[root@linuxbox ~]# cd /mnt/cdrom
[root@linuxbox cdrom]# ls
خطای "Device is busy" هنگام Unmount
اگر در همین حالت بخواهیم CD را unmount کنیم:
[root@linuxbox cdrom]# umount /dev/hdc
umount: /mnt/cdrom: device is busy
خطا به این دلیل است که دستگاه در حال استفاده است.
در این مثال، دایرکتوری کاری ما (pwd) همان مسیر mount است، بنابراین سیستم نمیتواند آن را جدا کند.
برای رفع این مشکل کافی است دایرکتوری کاری را تغییر دهیم:
[root@linuxbox cdrom]# cd
[root@linuxbox ~]# umount /dev/hdc
اکنون دستگاه با موفقیت unmount میشود.
چرا Unmount کردن مهم است (Why Unmounting Is Important)
اگر خروجی دستور free را ببینید — که وضعیت استفاده از حافظه را نمایش میدهد — متوجه بخشی با عنوان buffers خواهید شد.
رایانهها طوری طراحی شدهاند که بیشترین سرعت ممکن را داشته باشند. یکی از عواملی که سرعت را کاهش میدهد، دستگاههای کندتر هستند.
برای درک مفهوم، تصور کنید پرینترها چقدر کندتر از رایانهاند. اگر سیستم مجبور بود تا اتمام چاپ هر صفحه منتظر بماند، عملاً متوقف میشد. در روزگار قبل از چندوظیفهای بودن (multi-tasking)، این واقعاً اتفاق میافتاد — هر بار که چاپ میکردید، سیستم تا پایان چاپ قفل میشد.
راهحل این مشکل ایجاد Printer Buffer بود:
وسیلهای شامل RAM که بین کامپیوتر و چاپگر قرار میگرفت. کامپیوتر دادهها را سریع به این بافر میفرستاد و فوراً آزاد میشد تا به کار دیگر برسد، درحالیکه بافر دادهها را با سرعت پایینتر به چاپگر میفرستاد.
مفهوم Buffering در سیستمعامل
همین ایده در کل سیستمهای کامپیوتری پیادهسازی شده است تا سرعت را افزایش دهد.
سیستمعامل دادههایی را که باید خوانده یا نوشته شوند، برای مدتی در حافظه نگه میدارد تا تعامل با دستگاههای کند کمتر انجام شود.
در لینوکس اگر مدتی از سیستم استفاده کنید، میبینید که میزان استفاده از حافظه زیاد میشود — اما این به معنای پر شدن حافظه نیست. لینوکس در واقع از حافظهی آزاد برای بافر کردن دادهها استفاده میکند تا عملیات I/O سریعتر انجام شود.
چرا Unmount لازم است
این بافر باعث میشود عملیات نوشتن به دستگاههای ذخیرهسازی بسیار سریع به نظر برسد، چون دادهها فوراً در حافظه نوشته میشوند و بعداً در زمان مناسب به دستگاه واقعی منتقل میگردند.
وقتی یک دستگاه را Unmount میکنید، سیستم تمام دادههای باقیمانده در بافر را به آن دستگاه منتقل میکند تا مطمئن شود همه چیز نوشته شده است.
اگر دستگاه را بدون Unmount کردن جدا کنید:
- ممکن است بخشی از دادهها هنوز به دیسک منتقل نشده باشد.
- و در بدترین حالت، اطلاعات حیاتی مانند بهروزرسانیهای ساختار دایرکتوری از دست بروند.
نتیجه؟ خرابی فایلسیستم (File System Corruption) — یکی از مخربترین اتفاقات در یک کامپیوتر.
شناسایی نام دستگاهها (Determining Device Names)
گاهی تشخیص نام دقیق یک دستگاه دشوار است. در گذشته (وقتی تغییر دیسک سخت نیاز به لیفتراک داشت!) این مشکل وجود نداشت، چون هر دستگاه جای ثابتی داشت.
اما در سیستمهای مدرن با دستگاههای USB، SATA و Hot-Swap، پیکربندی سختافزار بسیار پویا شده است و لینوکس برای هماهنگی با این وضعیت انعطافپذیرتر شده است.
در مثالهای قبل، ما از قابلیت mount خودکار محیط دسکتاپ استفاده کردیم تا نام دستگاه را پس از اتصال متوجه شویم.
اما در سرورها یا محیطهای غیردسکتاپی که mount خودکار انجام نمیشود، چطور باید نام دستگاه را پیدا کنیم؟
مشاهدهی دستگاهها در دایرکتوری /dev
تمام دستگاههای سیستم در مسیر /dev تعریف شدهاند. با دستور زیر میتوان فهرست آنها را دید:
[me@linuxbox ~]$ ls /dev
نامها در این فهرست از الگوهای مشخصی پیروی میکنند:
جدول ۱۵-۲: نامگذاری دستگاههای ذخیرهسازی در لینوکس
| الگو | نوع دستگاه | توضیح |
|---|---|---|
/dev/fd* |
فلاپی دیسکها | هر دیسک فلاپی یک شماره دارد. |
/dev/hd* |
دیسکهای IDE (PATA) در سیستمهای قدیمی | هر کانال IDE دو دستگاه دارد (master و slave). مثال: /dev/hda1 = پارتیشن اول دیسک اول. |
/dev/lp* |
چاپگرها | پورتهای موازی (parallel port printers). |
/dev/sd* |
دیسکهای SCSI / SATA / USB | امروزه لینوکس تقریباً تمام دیسکها (SATA، فلش USB، حافظهی دوربین و...) را به این صورت نامگذاری میکند. /dev/sda دیسک اول، /dev/sdb دیسک دوم و رقم انتهایی شماره پارتیشن است (مثلاً /dev/sdb1). |
/dev/sr* |
درایوهای نوری (CD/DVD) | شامل خواننده و نویسندههای دیسک نوری. |
علاوه بر این، لینکهای نمادین مانند /dev/cdrom، /dev/dvd و /dev/floppy معمولاً برای راحتی ایجاد میشوند و به مسیر واقعی دستگاه اشاره میکنند.
روش تشخیص نام دستگاه متصلشده
اگر در سیستمی کار میکنید که دستگاههای قابلحمل بهصورت خودکار mount نمیشوند، میتوانید با مشاهدهی بلادرنگ فایل لاگ سیستم، نام دستگاه را هنگام اتصال تشخیص دهید.
برای این کار دستور زیر را اجرا کنید (احتمالاً نیاز به دسترسی superuser دارید):
[me@linuxbox ~]$ sudo tail -f /var/log/messages
با اجرای این دستور، هنگام اتصال فلش یا دیسک جدید، پیامهای سیستم در لحظه نمایش داده میشوند — از جمله نام دقیق دستگاهی که توسط کرنل شناسایی شده (مثلاً /dev/sdb1).
شناسایی دستگاه متصلشده (Detecting the Connected Device)
وقتی دستور زیر را اجرا میکنید:
sudo tail -f /var/log/messages
چند خط پایانی فایل لاگ نمایش داده میشود و سپس منتظر میماند.
اکنون اگر دستگاهی مانند فلش مموری ۱۶ مگابایتی را وصل کنید، کرنل بلافاصله اتصال آن را تشخیص میدهد و اطلاعات زیر را ثبت میکند:
Jul 23 10:07:53 linuxbox kernel: usb 3-2: new full speed USB device using uhci_hcd and address 2
Jul 23 10:07:53 linuxbox kernel: usb 3-2: configuration #1 chosen from 1 choice
Jul 23 10:07:53 linuxbox kernel: scsi3 : SCSI emulation for USB Mass Storage devices
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] 31263 512-byte hardware sectors (16 MB)
Jul 23 10:07:59 linuxbox kernel: sdb: sdb1
Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI removable disk
در این پیامها، چند نکته مهم وجود دارد:
- چندین بار نام
[sdb]تکرار شده است، که نشان میدهد دستگاه ما بهصورت دیسک SCSI مجازی شناخته شده است. - خط
sdb: sdb1بیان میکند که دستگاه/dev/sdbیک پارتیشن به نام/dev/sdb1دارد.
بنابراین:
- کل دستگاه =
/dev/sdb - اولین پارتیشن =
/dev/sdb1
💡 نکته: استفاده از روش
tail -f /var/log/messagesراهی عالی برای دیدن رفتار سیستم در زمان واقعی است.
Mount کردن فلش درایو
اکنون که نام دستگاه را میدانیم، آن را mount میکنیم:
[me@linuxbox ~]$ sudo mkdir /mnt/flash
[me@linuxbox ~]$ sudo mount /dev/sdb1 /mnt/flash
میتوانیم با دستور df بررسی کنیم که mount با موفقیت انجام شده است:
[me@linuxbox ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 15115452 5186944 9775164 35% /
/dev/sda5 59631908 31777376 24776480 57% /home
/dev/sda1 147764 17277 122858 13% /boot
tmpfs 776808 0 776808 0% /dev/shm
/dev/sdb1 15560 0 15560 0% /mnt/flash
در اینجا /dev/sdb1 روی مسیر /mnt/flash mount شده و آماده استفاده است.
نام دستگاه تا زمانی که فلش جدا نشود یا سیستم reboot نگردد، ثابت میماند.
ساخت فایلسیستم جدید (Creating New File Systems)
فرض کنیم میخواهیم فلش مموری را بهجای سیستم فایل FAT32، با یک فایلسیستم بومی لینوکس (مثل ext3 یا ext4) فرمت کنیم.
برای این کار دو مرحله داریم:
- (اختیاری) ایجاد جدول پارتیشن جدید (در صورتی که ساختار فعلی مدنظرمان نباشد)
- ایجاد فایلسیستم خالی جدید روی درایو
⚠️ هشدار بسیار مهم:
در این تمرین قرار است فلش مموری را فرمت کنیم.
حتماً از درایوی استفاده کنید که دادهی مهمی در آن نیست، چون تمام محتوا پاک میشود.
همچنین مطمئن شوید نام دستگاهی که وارد میکنید دقیقاً همان دستگاه موردنظر شماست.
اشتباه در این مرحله ممکن است منجر به پاک شدن کامل هارد اصلی سیستم شود.
کار با پارتیشنها با استفاده از fdisk (Manipulating Partitions With fdisk)
برنامهی fdisk این امکان را میدهد که بهصورت مستقیم و در سطح بسیار پایین با دستگاههای ذخیرهسازی مانند هارددیسک یا فلش مموری کار کنیم.
با استفاده از این ابزار میتوانیم پارتیشنها را مشاهده، ایجاد، حذف یا ویرایش کنیم.
اجرای fdisk برای ویرایش پارتیشنها
برای کار با فلشدرایو، ابتدا باید آن را Unmount کنیم (اگر mount شده است):
[me@linuxbox ~]$ sudo umount /dev/sdb1
سپس برنامه را روی کل دستگاه (نه فقط یک پارتیشن) اجرا میکنیم:
[me@linuxbox ~]$ sudo fdisk /dev/sdb
توجه:
باید دستگاه را بهصورت کامل مشخص کنید (/dev/sdb) نه بهصورت یک پارتیشن (/dev/sdb1).
پس از اجرای برنامه، پرامپت زیر ظاهر میشود:
Command (m for help):
نمایش منوی دستورات
اگر m را وارد کنیم، منوی راهنما ظاهر میشود:
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help):
مشاهدهی جدول پارتیشن فعلی
برای دیدن پارتیشنهای موجود، p را وارد میکنیم:
Command (m for help): p
Disk /dev/sdb: 16 MB, 16006656 bytes
1 heads, 31 sectors/track, 1008 cylinders
Units = cylinders of 31 * 512 = 15872 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 2 1008 15608+ b W95 FAT32
در این مثال، دستگاهی با ظرفیت ۱۶ مگابایت داریم که شامل یک پارتیشن (/dev/sdb1) است که تقریباً تمام فضای دیسک را پوشش میدهد.
سیستم فایل آن FAT32 است (شناسهی نوع پارتیشن = b).
تغییر نوع پارتیشن
میخواهیم نوع پارتیشن را از FAT32 به Linux تغییر دهیم.
برای این کار ابتدا باید بدانیم شناسهی نوع پارتیشن لینوکسی چیست.
در منو، گزینهی l برای نمایش همهی انواع پارتیشنها وجود دارد:
Command (m for help): l
در لیست طولانی که نمایش داده میشود، میبینیم:
b= Windows 95 FAT3283= Linux
برای تغییر نوع پارتیشن، از گزینهی t استفاده میکنیم:
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83
Changed system type of partition 1 to 83 (Linux)
اکنون نوع پارتیشن شمارهی ۱ به Linux تغییر یافته است.
ذخیرهی تغییرات
تا این مرحله، تغییرات فقط در حافظه نگهداری میشوند و هنوز روی دستگاه اعمال نشدهاند.
برای نوشتن آنها روی دیسک و خروج از برنامه، w را وارد میکنیم:
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x partitions,
please see the fdisk manual page for additional information.
Syncing disks.
[me@linuxbox ~]$
پیغام بالا نشان میدهد که جدول پارتیشن با موفقیت تغییر کرده است.
هشدار مربوط به «DOS 6.x partitions» در اینجا بیاهمیت است و میتوان آن را نادیده گرفت.
💡 اگر نمیخواستیم تغییری اعمال شود، میتوانستیم با وارد کردن
qاز برنامه خارج شویم تا هیچ تغییری روی دیسک نوشته نشود.
ساخت فایلسیستم جدید با mkfs (Creating a New File System With mkfs)
پس از انجام تغییرات پارتیشنبندی (هرچند جزئی)، حالا وقت آن است که روی فلشدرایو خود یک فایلسیستم جدید بسازیم.
برای این کار از دستور mkfs استفاده میکنیم که کوتاهشدهی make file system است.
این ابزار میتواند انواع مختلفی از فایلسیستمها را ایجاد کند.
ساخت فایلسیستم ext3
برای ساخت فایلسیستم نوع ext3 روی پارتیشن فلش، از گزینهی -t برای تعیین نوع سیستمفایل استفاده میکنیم:
[me@linuxbox ~]$ sudo mkfs -t ext3 /dev/sdb1
خروجی نمونهٔ برنامه به شکل زیر است:
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
3904 inodes, 15608 blocks
780 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=15990784
2 block groups
8192 blocks per group, 8192 fragments per group
1952 inodes per group
Superblock backups stored on blocks:
8193
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
این اطلاعات جزئیات ساختار فایلسیستم جدید را نشان میدهد:
- تعداد بلوکها و inodeها
- اندازهی هر بلوک
- محل superblockهای پشتیبان
- فعال شدن journal برای بازیابی سریع در ext3
بازگرداندن فایلسیستم به FAT32
اگر بخواهیم فلشدرایو را به حالت اولیهاش (مثلاً FAT32) برگردانیم، کافی است نوع فایلسیستم را vfat مشخص کنیم:
[me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1
این همان نوع سیستمفایلی است که بیشتر در دستگاههای قابلحمل (فلش مموریها، دوربینها، و کارتهای حافظه) استفاده میشود.
کاربرد
فرایند پارتیشنبندی و فرمت (format) کردن را میتوان برای هر نوع دستگاه ذخیرهسازی جدید بهکار برد:
- دیسکهای داخلی (HDD / SSD)
- فلشدرایوها
- هاردهای اکسترنال
فرقی نمیکند که دستگاه کوچک باشد یا چند ترابایتی — فرایند پایه همیشه یکسان است.
تست و تعمیر فایلسیستمها با fsck
در فایل پیکربندی /etc/fstab اعدادی در انتهای هر خط دیدیم که به نظر رمزآلود بودند.
در واقع، این اعداد تعیین میکنند که برنامهی fsck (File System Check) فایلسیستمها را در چه ترتیبی بررسی کند.
در زمان راهاندازی سیستم (boot)، لینوکس بهصورت خودکار سلامت فایلسیستمها را قبل از mount شدن بررسی میکند.
در مثال قبلی:
- سیستمفایل ریشه (/) ابتدا بررسی میشود،
- سپس
/homeو/boot. - هر دستگاهی که عدد آخر آن ۰ باشد، بررسی نمیشود.
بررسی و تعمیر دستی
ابزار fsck نهتنها سلامت فایلسیستم را بررسی میکند، بلکه در صورت وجود خرابی، میتواند آن را تعمیر کند (بسته به شدت آسیب).
در فایلسیستمهای لینوکسی، بخشهای بازیابیشده از فایلها در پوشهای به نام lost+found ذخیره میشوند.
برای بررسی فلشدرایو (باید قبل از آن unmount شود):
[me@linuxbox ~]$ sudo fsck /dev/sdb1
fsck 1.40.8 (13-Mar-2008)
e2fsck 1.40.8 (13-Mar-2008)
/dev/sdb1: clean, 11/3904 files, 1661/15608 blocks
این خروجی نشان میدهد فایلسیستم سالم است.
در تجربهی عملی، خرابی فایلسیستمها معمولاً نادر است مگر اینکه مشکل سختافزاری وجود داشته باشد (مثل خرابی دیسک).
در صورت بروز خرابی در زمان بوت، سیستم معمولاً متوقف میشود و از شما میخواهد دستورfsckرا اجرا کنید تا خطاها برطرف شوند.
What The fsck? 😅
در فرهنگ یونیکس، واژهی fsck اغلب به شوخی جایگزین کلمهای چهارحرفی معروف میشود که سه حرف اولش با آن یکی است!
و انصافاً هم بامعناست — چون معمولاً وقتی مجبور میشوید دستور fsck را اجرا کنید، احتمالاً همان کلمه را زیر لب خواهید گفت!
فرمت کردن فلاپی دیسکها (Formatting Floppy Disks)
اگر هنوز از رایانهای استفاده میکنید که دارای درایو فلاپیدیسک باشد (واقعاً قدیمی!)، میتوانید آن را نیز با لینوکس مدیریت کنید.
آمادهسازی یک فلاپی خالی شامل دو مرحله است:
- فرمت سطح پایین (Low-level format)
- ایجاد فایلسیستم روی دیسک
ابتدا با دستور fdformat، دیسک را فرمت فیزیکی میکنیم:
[me@linuxbox ~]$ sudo fdformat /dev/fd0
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
سپس روی آن یک فایلسیستم FAT قدیمی (سبک MS-DOS) ایجاد میکنیم:
[me@linuxbox ~]$ sudo mkfs -t msdos /dev/fd0
در اینجا از نوع msdos استفاده میکنیم تا جدول تخصیص فایل (FAT) قدیمی و کوچکتری ساخته شود.
پس از آمادهسازی، فلاپیدیسک را میتوان درست مانند سایر دستگاهها mount کرد.
انتقال مستقیم داده به/از دستگاهها (Moving Data Directly To/From Devices)
معمولاً دادهها را در قالب فایلها و پوشهها میبینیم،
اما میتوان به دادهها بهصورت خام (raw) نیز نگاه کرد.
بهعنوان مثال، اگر به یک دیسک نگاه کنیم، در واقع مجموعهای از بلوکهای داده (data blocks) است که سیستمعامل آنها را بهصورت فایل و پوشه تفسیر میکند.
اما اگر مستقیماً با این بلوکها کار کنیم، میتوانیم کارهای جالبی انجام دهیم — مثلاً کلون گرفتن از یک دیسک یا فلشدرایو.
دستور dd
ابزار dd دقیقاً برای همین کار طراحی شده است:
کپیکردن دادهها بهصورت بلوکی از یک محل به محل دیگر.
ساختار کلی دستور:
dd if=input_file of=output_file [bs=block_size [count=blocks]]
if=: منبع داده (input file / device)of=: مقصد داده (output file / device)bs=: اندازهی بلوک داده (block size)count=: تعداد بلوکهایی که باید کپی شوند
مثال ۱: کلون کردن دو فلش مشابه
فرض کنید دو فلش USB با اندازهی برابر دارید و میخواهید از اولی کپی دقیقی روی دومی بگیرید.
اگر دستگاهها بهترتیب /dev/sdb و /dev/sdc باشند:
dd if=/dev/sdb of=/dev/sdc
این دستور کل محتویات فیزیکی درایو اول را روی دومی کپی میکند — بیتبهبیت.
مثال ۲: ساخت ایمیج از فلش
اگر فقط فلش اول به سیستم متصل باشد، میتوانید از آن یک فایل ایمیج بسازید تا بعداً بتوانید آن را بازیابی کنید:
dd if=/dev/sdb of=flash_drive.img
بعداً میتوانید با دستور معکوس (برعکس if و of) آن ایمیج را دوباره روی فلش برگردانید.
⚠️ هشدار بسیار جدی:
دستورddفوقالعاده قدرتمند است — و به همان اندازه خطرناک.
نام آن از “Data Definition” گرفته شده،
اما بین کاربران به شوخی "Destroy Disk" هم گفته میشود.
چون اگر ورودی (if) و خروجی (of) را اشتباه تایپ کنید، ممکن است کل دیسک خود را پاک کنید!
همیشه قبل از فشردن Enter، مسیرها را دو بار بررسی کنید.
ساخت ایمیج CD-ROM (Creating CD-ROM Images)
نوشتن یک CD قابلضبط (چه از نوع CD-R و چه CD-RW) شامل دو مرحله اصلی است:
- ساخت یک فایل ایمیج ISO که در واقع تصویر کامل فایلسیستم CD است،
- نوشتن (burn کردن) آن ایمیج روی دیسک واقعی.
ساخت کپی ایمیج از یک CD-ROM (Creating an Image Copy of a CD-ROM)
اگر بخواهیم از یک CD موجود (مثلاً دیسک نصب Ubuntu) یک فایل ISO بسازیم، میتوانیم از دستور dd استفاده کنیم تا تمام بلوکهای داده از روی CD خوانده و در یک فایل ذخیره شوند:
dd if=/dev/cdrom of=ubuntu.iso
در اینجا:
ifورودی است (دستگاه CD)،ofخروجی است (فایل ایمیج).
این روش برای DVDهای داده (Data DVD) نیز کاربرد دارد،
اما برای CDهای صوتی (Audio CD) کار نمیکند چون آنها از فایلسیستم استفاده نمیکنند.
برای آن نوع CD باید از دستورcdrdaoاستفاده کرد.
ساخت ایمیج از یک مجموعه فایلها (Creating an Image From a Collection of Files)
اگر بخواهیم محتوای یک پوشه را بهصورت یک فایل ISO درآوریم، از ابزار genisoimage استفاده میکنیم.
- ابتدا پوشهای شامل فایلهای موردنظر میسازیم (مثلاً
~/cd-rom-files). - سپس با دستور زیر ایمیج ISO میسازیم:
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files
در این دستور:
- گزینهی
-oنام فایل خروجی را مشخص میکند. - گزینهی
-Rمتادیتای Rock Ridge را اضافه میکند تا فایلسیستم از نامهای بلند و مجوزهای POSIX پشتیبانی کند. - گزینهی
-Jافزونههای Joliet را فعال میکند تا نامهای بلند در ویندوز نیز قابلاستفاده باشند.
دربارهی نام برنامهها (A Program By Any Other Name...)
اگر در آموزشهای آنلاین جستجو کنید، معمولاً دو برنامهی معروف برای ساخت و رایت دیسکهای نوری میبینید:
mkisofs و cdrecord.
این دو برنامه بخشی از مجموعهای به نام cdrtools بودند که توسط Jörg Schilling نوشته شد.
اما در تابستان ۲۰۰۶، او بخشی از لایسنس این پکیج را تغییر داد که از نظر بسیاری از توسعهدهندگان لینوکس،
با مجوز GNU GPL ناسازگار شد.
در نتیجه، جامعهی لینوکس پروژهای جدید (fork) ایجاد کرد و جایگزینهایی معرفی شدند:
wodimبهجایcdrecordgenisoimageبهجایmkisofs
نوشتن ایمیج CD-ROM روی دیسک (Writing CD-ROM Images)
بعد از ساخت فایل ایمیج، میتوانیم آن را روی رسانهی نوری بنویسیم (burn کنیم).
فرمانهای مربوطه را میتوان برای CD و DVD هر دو استفاده کرد.
Mount کردن مستقیم فایل ISO (Mounting an ISO Image Directly)
ترفند جالبی در لینوکس وجود دارد:
میتوان فایل ISO را مستقیماً روی سیستم mount کرد بدون نیاز به رایت روی CD یا DVD.
برای این کار از گزینهی -o loop در دستور mount استفاده میکنیم تا فایل ISO بهعنوان یک دستگاه مجازی شناسایی شود:
mkdir /mnt/iso_image
mount -t iso9660 -o loop image.iso /mnt/iso_image
در این مثال:
- مسیر
/mnt/iso_imageبهعنوان نقطهی اتصال (mount point) ساخته میشود. - فایل
image.isoدر آن mount میگردد و درست مثل یک CD واقعی قابل مرور است.
فراموش نکنید که پس از اتمام کار، حتماً فایل ISO را Unmount کنید:
umount /mnt/iso_image
پاک کردن CD قابلنویس مجدد (Blanking A Re-Writable CD-ROM)
دیسکهای قابلنویس مجدد (CD-RW) باید پیش از استفادهی دوباره پاک (erase) شوند.
برای این کار از دستور wodim استفاده میکنیم و نام دستگاه (درایو CD Writer) و نوع عملیات پاکسازی را مشخص میکنیم.
مثلاً برای پاکسازی سریع:
wodim dev=/dev/cdrw blank=fast
دستور wodim چند حالت مختلف برای پاکسازی ارائه میدهد، اما گزینهی fast کمترین و سریعترین نوع آن است.
نوشتن ایمیج روی دیسک (Writing An Image)
برای رایت فایل ایمیج ISO روی CD یا DVD نیز از همان دستور wodim استفاده میکنیم و فقط نام فایل ایمیج و دستگاه را مشخص مینماییم:
wodim dev=/dev/cdrw image.iso
wodim گزینههای زیادی دارد، اما دو مورد پرکاربرد عبارتاند از:
-v→ فعالکردن خروجی جزئیات (verbose)-dao→ فعالکردن حالت disc-at-once، که کل دیسک را در یک مرحله مینویسد
حالت disc-at-once (DAO) برای ساخت دیسکهای تجاری یا نسخهبرداری دقیق توصیه میشود.
حالت پیشفرضwodim، یعنی track-at-once (TAO)، برای ضبط موسیقی یا تراکهای جداگانه مناسبتر است.
جمعبندی (Summing Up)
در این فصل با مفاهیم و ابزارهای اصلی مدیریت رسانههای ذخیرهسازی آشنا شدیم — از mount و fdisk گرفته تا mkfs، dd، و wodim.
البته امکانات لینوکس در این زمینه بسیار فراتر است؛ از پشتیبانی از دهها نوع فایلسیستم و سختافزار ذخیرهسازی گرفته تا ابزارهای حرفهای برای هماهنگی با سایر سیستمعاملها.
مطالعهی بیشتر (Further Reading)
برای یادگیری عمیقتر، صفحههای راهنمای دستورات (man pages) را مطالعه کنید.
بسیاری از آنها گزینهها و قابلیتهای فراوانی دارند.
همچنین میتوانید در اینترنت آموزشهای مفیدی دربارهی افزودن هارددیسک جدید به لینوکس یا کار با رسانههای نوری پیدا کنید.
امتیاز اضافه: بررسی صحت فایلهای ISO (Extra Credit – Verifying ISO Integrity)
اغلب توزیعهای لینوکسی هنگام ارائهی فایلهای ISO، یک فایل Checksum نیز منتشر میکنند.
این فایل نتیجهی یک محاسبهی ریاضی است که عددی یکتا برای محتوای فایل تولید میکند.
اگر حتی یک بیت از فایل تغییر کند، مقدار checksum کاملاً متفاوت میشود.
رایجترین روش بررسی، استفاده از برنامهی md5sum است:
md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece image.iso
پس از دانلود فایل ISO، مقدار تولیدشده را با مقدار رسمی منتشرشده توسط سایت مقایسه کنید.
بررسی دیسک رایتشده با md5sum
میتوانیم علاوه بر بررسی فایل، درستی دیسک رایتشده را نیز بسنجیم.
روش کار:
- ابتدا checksum فایل ایمیج را محاسبه کنید.
- سپس checksum همان داده را از روی دیسک واقعی محاسبه کنید.
برای CDهایی که در حالت DAO نوشته شدهاند، میتوان این کار را مستقیم انجام داد:
md5sum /dev/cdrom
34e354760f9bb7fbf85c96f6a3f94ece /dev/cdrom
اما برای DVD یا رسانههایی که نیاز به دقت بیشتری دارند، باید تعداد بلوکهای دقیق دادهشده را بخوانیم.
در مثال زیر، integrity فایل dvd-image.iso و دیسک داخل /dev/dvd بررسی میشود:
md5sum dvd-image.iso
dd if=/dev/dvd bs=2048 count=$(( $(stat -c "%s" dvd-image.iso) / 2048 )) | md5sum
این روش تضمین میکند که محتوای دیسک دقیقاً برابر با ایمیج اصلی است.