فصل ۱۵ – رسانه‌های ذخیره‌سازی (Storage Media)

در فصل‌های پیشین، داده‌ها را در سطح فایل بررسی کردیم. اما در این فصل، سراغ سطح دستگاه (device level) می‌رویم — جایی که لینوکس در مدیریت انواع رسانه‌های ذخیره‌سازی توان خارق‌العاده‌ای دارد: از دیسک‌های سخت فیزیکی گرفته تا ذخیره‌سازهای شبکه‌ای و دستگاه‌های مجازی مانند RAID (آرایه‌ی افزونه‌ی دیسک‌های مستقل) و LVM (مدیر حجم منطقی).

البته هدف این کتاب آموزش مدیریت سیستم نیست، پس وارد جزئیات عمیق این حوزه نمی‌شویم. هدف، آشنایی با مفاهیم پایه و فرمان‌های کلیدی برای کار با دستگاه‌های ذخیره‌سازی است.

برای تمرین‌های این فصل، از موارد زیر استفاده می‌شود:


فرمان‌هایی که در این فصل بررسی می‌شوند

فرمان توضیح
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) قابل خواندن و نوشتن می‌باشد.

در انتهای این فهرست، دو مورد جالب دیده می‌شود:


آزمایش با یک 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 کردن جدا کنید:


شناسایی نام دستگاه‌ها (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

در این پیام‌ها، چند نکته مهم وجود دارد:

بنابراین:

💡 نکته: استفاده از روش 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) فرمت کنیم.
برای این کار دو مرحله داریم:

  1. (اختیاری) ایجاد جدول پارتیشن جدید (در صورتی که ساختار فعلی مدنظرمان نباشد)
  2. ایجاد فایل‌سیستم خالی جدید روی درایو

⚠️ هشدار بسیار مهم:
در این تمرین قرار است فلش مموری را فرمت کنیم.
حتماً از درایوی استفاده کنید که داده‌ی مهمی در آن نیست، چون تمام محتوا پاک می‌شود.
همچنین مطمئن شوید نام دستگاهی که وارد می‌کنید دقیقاً همان دستگاه موردنظر شماست.
اشتباه در این مرحله ممکن است منجر به پاک شدن کامل هارد اصلی سیستم شود.


کار با پارتیشن‌ها با استفاده از 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

در لیست طولانی که نمایش داده می‌شود، می‌بینیم:

برای تغییر نوع پارتیشن، از گزینه‌ی 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.

این اطلاعات جزئیات ساختار فایل‌سیستم جدید را نشان می‌دهد:


بازگرداندن فایل‌سیستم به FAT32

اگر بخواهیم فلش‌درایو را به حالت اولیه‌اش (مثلاً FAT32) برگردانیم، کافی است نوع فایل‌سیستم را vfat مشخص کنیم:

[me@linuxbox ~]$ sudo mkfs -t vfat /dev/sdb1

این همان نوع سیستم‌فایلی است که بیشتر در دستگاه‌های قابل‌حمل (فلش مموری‌ها، دوربین‌ها، و کارت‌های حافظه) استفاده می‌شود.


کاربرد

فرایند پارتیشن‌بندی و فرمت (format) کردن را می‌توان برای هر نوع دستگاه ذخیره‌سازی جدید به‌کار برد:

فرقی نمی‌کند که دستگاه کوچک باشد یا چند ترابایتی — فرایند پایه همیشه یکسان است.


تست و تعمیر فایل‌سیستم‌ها با fsck

در فایل پیکربندی /etc/fstab اعدادی در انتهای هر خط دیدیم که به نظر رمزآلود بودند.
در واقع، این اعداد تعیین می‌کنند که برنامه‌ی fsck (File System Check) فایل‌سیستم‌ها را در چه ترتیبی بررسی کند.

در زمان راه‌اندازی سیستم (boot)، لینوکس به‌صورت خودکار سلامت فایل‌سیستم‌ها را قبل از mount شدن بررسی می‌کند.
در مثال قبلی:


بررسی و تعمیر دستی

ابزار 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)

اگر هنوز از رایانه‌ای استفاده می‌کنید که دارای درایو فلاپی‌دیسک باشد (واقعاً قدیمی!)، می‌توانید آن را نیز با لینوکس مدیریت کنید.
آماده‌سازی یک فلاپی خالی شامل دو مرحله است:

  1. فرمت سطح پایین (Low-level format)
  2. ایجاد فایل‌سیستم روی دیسک

ابتدا با دستور 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]]

مثال ۱: کلون کردن دو فلش مشابه

فرض کنید دو فلش 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) شامل دو مرحله اصلی است:

  1. ساخت یک فایل ایمیج ISO که در واقع تصویر کامل فایل‌سیستم CD است،
  2. نوشتن (burn کردن) آن ایمیج روی دیسک واقعی.

ساخت کپی ایمیج از یک CD-ROM (Creating an Image Copy of a CD-ROM)

اگر بخواهیم از یک CD موجود (مثلاً دیسک نصب Ubuntu) یک فایل ISO بسازیم، می‌توانیم از دستور dd استفاده کنیم تا تمام بلوک‌های داده از روی CD خوانده و در یک فایل ذخیره شوند:

dd if=/dev/cdrom of=ubuntu.iso

در اینجا:

این روش برای DVDهای داده (Data DVD) نیز کاربرد دارد،
اما برای CDهای صوتی (Audio CD) کار نمی‌کند چون آن‌ها از فایل‌سیستم استفاده نمی‌کنند.
برای آن نوع CD باید از دستور cdrdao استفاده کرد.


ساخت ایمیج از یک مجموعه فایل‌ها (Creating an Image From a Collection of Files)

اگر بخواهیم محتوای یک پوشه را به‌صورت یک فایل ISO درآوریم، از ابزار genisoimage استفاده می‌کنیم.

  1. ابتدا پوشه‌ای شامل فایل‌های موردنظر می‌سازیم (مثلاً ~/cd-rom-files).
  2. سپس با دستور زیر ایمیج ISO می‌سازیم:
genisoimage -o cd-rom.iso -R -J ~/cd-rom-files

در این دستور:


درباره‌ی نام برنامه‌ها (A Program By Any Other Name...)

اگر در آموزش‌های آنلاین جستجو کنید، معمولاً دو برنامه‌ی معروف برای ساخت و رایت دیسک‌های نوری می‌بینید:
mkisofs و cdrecord.

این دو برنامه بخشی از مجموعه‌ای به نام cdrtools بودند که توسط Jörg Schilling نوشته شد.
اما در تابستان ۲۰۰۶، او بخشی از لایسنس این پکیج را تغییر داد که از نظر بسیاری از توسعه‌دهندگان لینوکس،
با مجوز GNU GPL ناسازگار شد.

در نتیجه، جامعه‌ی لینوکس پروژه‌ای جدید (fork) ایجاد کرد و جایگزین‌هایی معرفی شدند:


نوشتن ایمیج 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

در این مثال:

فراموش نکنید که پس از اتمام کار، حتماً فایل 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 گزینه‌های زیادی دارد، اما دو مورد پرکاربرد عبارت‌اند از:

حالت 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

می‌توانیم علاوه بر بررسی فایل، درستی دیسک رایت‌شده را نیز بسنجیم.
روش کار:

  1. ابتدا checksum فایل ایمیج را محاسبه کنید.
  2. سپس 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

این روش تضمین می‌کند که محتوای دیسک دقیقاً برابر با ایمیج اصلی است.