fsck - بازسازی و ترمیم سیستم فایل‌ آسیب دیده

دستور fsck مخفف File System Check، به منظور بازسازی سیستم فایل‌های آسیب دیده در گنو/لینوکس مورد استفاده قرار می‌گیرد.

شکل کلی دستور:

# fsck [options]

قبل از این‌که با دستور و گزینه‌های آن آشنا شویم بهتر‌ِ‌ه از نحوه‌ی عملکرد و کار دستور آگاه باشیم.

کل فضای دیسک به بلوک‌های متعدد تقسیم شده است، بلوک‌ها دو هدف کلی دارند:
۱. بیشتر بلوک‌ها نام دیگر فایل‌های داده‌ای کاربر را ذخیره می‌کنند.
۲. بعضی بلوک‌ها در هر فایل سیستم، فراداده (metadata) فایل سیستم را ذخیره می‌کنند.

بهترین تعریف برای فراداده‌ها این است که ساختار فایل سیستم را توصیف و شرح می‌دهند، که رایج‌ترین ساختار فراداده‌ها، نماگره (Inode)، بلوک فوق العاده (Super Block) و دایرکتوری‌ها هستند. فضای ابتدایی هر پارتیشن شامل بلوک فوق العاده (Super Block) و لیست نماگره (Inode List) می‌باشد.

حال به بررسی آن‌ها می‌پردازیم:

بلوک فوق العاده (Super Block): فضای ابتدایی هر پارتیشن هستند که به عنوان شناسنامه هر پارتیشن شناخته می‌شوند و حاوی اطلاعات:

  • نوع فایل سیستم
  • اندازه
  • وضعیت
  • اطلاعاتی در مورد ساختارهای فراداده دیگر

که اگر هر کدام از این اطلاعات به هر نحوی از بین برود، داده‌های شما از بین می‌روند. به همین دلیل لینوکس نسخه های متعدد از این اطلاعات را نگه می‌دارد. این اطلاعات را می‌توانید در خروجی دستور df ببینید.

لیست نماگره (Inode List): شامل اطلاعاتی در مورد فایل‌های هر پارتیشن می‌باشد که این اطلاعات:

  • نام فایل
  • مالک
  • گروه
  • اندازه
  • تاریخ ایجاد

می‌باشد. به‌طور‌ کلی هر تغییراتی که کاربر روی فایل‌ها انجام می‌دهد در لیست نماگره ذخیره می‌شود. که این اطلاعات را می‌توانید در دستور ls همراه با گزینه‌ی اختیاری l-ببنید.

دستور fsck با بهره‌گیری از این اطلاعات و مقایسه‌ی داده‌های موجود در پارتیشن اقدام به بازیابی فایل‌ها می‌کند و اگر با داده‌ای برخورد کند که در لیست نماگره نباشد در مسیری به نام lost+found که در پارتیشن ریشه هست، قرار می‌دهد. همه‌ی فایل‌های بازیابی شده بر اساس شماره‌ی نماگره‌شان در این مسیر قرار می‌گیرند و نام فایل تنها شامل یک رشته عددی است که همان شماره‌ی نماگره منحصر به فرد هر فایل در پارتیشن است.

نکته: قبل از شروع به کار با دستور fsck، سیستم فایل را جدا (unmount) کنید. این کار باعث می شود که داده‌ها و فایل‌های موجود در پارتیشن تغییر پیدا نکند و اطلاعات لیست نماگره و بلوک فوق العاده با اطلاعات موجود یکسان باشد.

هشدار: در صورت عدم جداسازی (unmount)، اطلاعات سیستم فایل شما از دست خواهد رفت.

نکته: امکان دارد هنگام جداسازی با پیغام شلوغ بودن (busy) برخورد کنید، که این نشان‌دهنده این است که پارتیشن مورد نظر در حال حاضر در حالت استفاده است. برای این‌که متوجه بشویم که آیا یک پارتیشن در حالت شلوغ هست یا نه، همچنین متوجه بشویم که کدام کاربر وکدام فرآیند با آن رابطه دارد می‌توانیم از دستور lsof استفاده کنیم.

مثال:

lsof /dev/sda5

خروجی آن:

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
totem   4227 masoud   23r   REG    8,5 36139721 9322 /media/User/Program/Mazhabi/Sound/01 Quran sound/TARTIL/Shateri/MP3/012- Yusuf.mp3

که در این‌جا Totem Movie Player توسط کاربر masoud در حال استفاده است، شما می‌توانید با دستور kill و PID آن، که در این‌جا ۴۲۲۷ است آن را متوقف کنید:

kill 4227

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

sudo parted /dev/sda 'print'

خروجی:

Number  Start   End     Size    Type      File system     Flags
 1      9728B   47.2GB  47.2GB  primary   ntfs            boot
 2      47.2GB  1000GB  953GB   extended                  lba
 5      47.2GB  142GB   94.4GB  logical   ntfs
13      142GB   222GB   80.0GB  logical   ext4
15      222GB   232GB   9998MB  logical   ext4
14      232GB   236GB   3845MB  logical   linux-swap(v1)
 6      236GB   330GB   94.4GB  logical   ntfs
 7      330GB   425GB   94.4GB  logical   ntfs
 8      425GB   519GB   94.4GB  logical   ntfs
 9      519GB   605GB   86.0GB  logical   ntfs
10      605GB   708GB   103GB   logical   ntfs
11      708GB   802GB   94.4GB  logical   ntfs
12      802GB   1000GB  198GB   logical   ntfs

و یا دستور:

sudo fdisk -l

خروجی:

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
224 heads, 19 sectors/track, 459004 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xbc22845e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          19    92159423    46079702+   7  HPFS/NTFS/exFAT
/dev/sda2        92159441  1953516767   930678663+   f  W95 Ext'd (LBA)
/dev/sda5        92159443   276478271    92159414+   7  HPFS/NTFS/exFAT
/dev/sda6       460797139   645115967    92159414+   7  HPFS/NTFS/exFAT
/dev/sda7       645115987   829434815    92159414+   7  HPFS/NTFS/exFAT
/dev/sda8       829434835  1013753663    92159414+   7  HPFS/NTFS/exFAT
/dev/sda9      1013753683  1181695423    83970870+   7  HPFS/NTFS/exFAT
/dev/sda10     1181695443  1382391359   100347958+   7  HPFS/NTFS/exFAT
/dev/sda11     1382391379  1566710207    92159414+   7  HPFS/NTFS/exFAT
/dev/sda12     1566710227  1953516767   193403270+   7  HPFS/NTFS/exFAT
/dev/sda13      277503987   433754495    78125254+  83  Linux
/dev/sda14      453285888   460795903     3755008   82  Linux swap / Solaris
/dev/sda15      433756160   453283839     9763840   83  Linux

Partition table entries are not in disk order

Disk /dev/sdb: 320.1 GB, 320072933376 bytes
222 heads, 30 sectors/track, 93865 cylinders, total 625142448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3fb13fb0

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        6660   625134239   312563790    f  W95 Ext'd (LBA)
/dev/sdb5            6690   123909299    61951305    7  HPFS/NTFS/exFAT
/dev/sdb6       123909330   246786299    61438485    7  HPFS/NTFS/exFAT
/dev/sdb7       246786330   369663299    61438485    7  HPFS/NTFS/exFAT
/dev/sdb8       369663330   472060799    51198735    7  HPFS/NTFS/exFAT
/dev/sdb9       472060830   625134239    76536705    7  HPFS/NTFS/exFAT

شروع کار را با یک مثال آغاز می‌کنم:

fsck /dev/sda15

پس از انجام این کار، شما مقداری برگشتی خواهید دید که می‌تواند یکی از این موارد باشد:

  • 0: هیچ خطایی رخ نداده است و عملیات بررسی سیستم فایل موفق بوده است.
  • 1: خطاهای سیستم فایل اصلاح شده‌اند.
  • 2: سیستم باید reboot شود.
  • 4: خطاهای سیستم فایل اصلاح نشده‌اند.
  • 8: خطای عملیاتی رخ داده است.
  • 16: طریقه استفاده و یا خطای دستوری است.
  • 32: اجرای fsck با درخواست کاربر (سیگنال Ctrl+C) خاتمه یافت.
  • 128: در کتابخانه‌های به اشتراک گذاشته شده خطا وجود دارد.

نکته: خروجی بالا برای بررسی موفق/ناموفق بودن نمایش داده می‌شود.

گزینه های اختیاری:

-A: با این گزینه اختیاری می‌توانید تمام پارتیشن‌ها را بررسی کنید:

fsck  -A

t-: با این گزینه اختیاری می‌توانید یک نوع سیستم فایل را مشخص کنید و این دستور فقط برای آن نوع انجام شود:

fsck -A -t  ext3

و با نوشته‌ی no می‌توان یک نوع خاص را نادیده گرفت:

fsck -A -t noext3

دستور بالا به این صورت گفته می‌شود: تمام پارتیشن‌ها را بررسی کن به غیر از آن‌هایی که دارای نوع ext3 هستند.

y-یا yes: این گزینه‌ی اختیاری برای رفع مشکلات به‌وجود آمده به صورت خودکار صورت می‌گیرد.

نکته: بهتر‌ِ است این گزینه‌ی اختیاری همیشه استفاده شود.

نکته: در حین انجام بررسی، در صورت روبه‌رو شدن با مشکل، پیغامی برای شما نمایش داده می‌شود مبنی بر این‌که آیا مایل هستید برای رفع آن اقدام شود؟ که با وارد کردن گزینه‌ی اختیاری y- این تاییدیه را به دستور fsck داده‌ایم.

مثال:

fsck -A -t  ext3 -y

R-: باعث صرف‌نظر کردن از سیستم فایل ریشه (root) می‌شود.

نکته: در حالتی که از گزینه‌ی اختیاری A-استفاده می‌کنید حتما از این گزینه‌ی اختیاری استفاده کنید.

مثال:

fsck -AR -t  ext3 -y

V-: با این گزینه‌ی اختیاری درصد پیشرفت را در خروجی نمایش می‌دهد:

fsck -ARV -t  ext3 -y

M-: این گزینه‌ی اختیاری باعث می‌شود که پارتیشن‌های وصل (mount) را نادیده بگیرد و دستور را برای آن‌ها اجرا نکند.

نکته: بهتر است این گزینه‌ی اختیاری همیشه مورد استفاده قرار بگیرد.

مثال:

fsck -ARVM -t  ext3 -y

دستور بالا به این صورت خوانده می‌شود: تمام سیستم فایل‌هایی که نوع‌شان ext3 هستند به غیر از سیستم فایل ریشه و تمام سیستم فایل‌هایی که متصل هستند را بازسازی کن، و من با تعمیر آن‌ها موافق هستم و در آخر من را از روند اجرا مطلع کن و در صفحه نمایش نمایان کن.