آیا تا به حال این سوال برایتان پیش آمده است که حداکثر تعداد پارتیشن بر روی یک هارد به چه تعداد است؟ یا اینکه بعد از روشن کردن کامپیوتر چه اتفاقی افتاده و از کجا مشخص می‌شود که از روی کدام پارتیشن سیستم‌عامل بارگذاری شده و شروع به اجرا شدن کند؟ آیا به این نکته توجه نموده‌اید که کوچکترین واحد ذخیره‌سازی اطلاعات بر روی دیسک چقدر بوده و آیا این مقدار برابر یک بایت بوده و یا مقدار بیشتری دارد؟ (شاید مقدار کوچک‌ترین واحد ذخیره‌سازی اطلاعات به نظر بی اهمیت برسد ولی در سرعت خواندن/نوشتن و میزان فضای هرز ایجاد شده بر روی دیسک تاثیر زیادی دارد) در این مقاله قصد داریم به این سوالات و سوالات دیگری پیرامون این موضوع پاسخ گوییم. در مقاله‌ی بعدی طریقه‌ی نوشتن یک برنامه به زبان پایتون برای استخراج اطلاعات پارتیشن‌ها، به کمک اطلاعات این مقاله را بیان خواهیم نمود.

داده‌های ذخیره شده بر روی هارددیسک در بلوک‌هایی به اندازه‌ی ۵۱۲بایت ذخیره می‌شوند که به این بلوک‌ها sector گفته می‌شود. این مقدار، کوچکترین میزان فضایی است که داده‌ای بر روی هارددیسک اشغال می‌کند. یعنی اگر شما حتی یک حرف یک بایتی مثل A‌ را ذخیره کنید، مقدار فضایی که اشغال کرده‌اید برابر با ۵۱۲بایت می‌باشد. البته قضیه به اینجا ختم نمی‌شود و به دلیل اینکه شما به صورت مستقیم و با استفاده از interrupt داده بر روی دیسک ذخیره نکرده و از سیستم‌عامل (در واقع با استفاده از SystemCall، به صورت مستقیم یا غیر مستقیم) کمک گرفته و از لایه‌ی File System عبور کرده و سپس داده را بر روی دیسک و در یک کلاستر ذخیره می‌کنید، مقدار فضای اشغال شده از این نیز بیشتر شده و مضربی از ۵۱۲بایت خواهد بود. در بسیاری از سیستم‌های فایل امروزی مثل NTFS, Ext4 مقدار پیش‌فرض اندازه‌ی کلاستر برابر ۴KB می‌باشد. (البته این مقدار برای پارتیشن‌ّها با اندازه‌های مختلف می‌تواند متفاوت می‌باشد)

اولین sector هارددیسک (اولین ۵۱۲bytes اشغال شده) که مهمترین سکتور نیز است، با عنوان Master Boot Record (MBR) شناخته می‌شود که پس از روشن شدن کامپیوتر و بارگذاری BIOS خوانده شده و اطلاعاتی دارد که برای پیدا کردن سیستم‌عامل، بارگذاری آن و دسترسی به اطلاعات پارتیشن‌ها مورد نیاز است و در صورتیکه این سکتور خراب شده و یا قابل دسترسی نباشد، با خطایی مواجه شده و امکان شروع به کار سیستم‌عامل وجود نخواهد داشت. در این ۵۱۲بایت مقدار ۶۴بایت برای ذخیره‌ی اطلاعات پارتیشن‌ها در نظر گرفته شده است که با استفاده از آن امکان تعریف ۴ پارتیشن وجود داشته که برای هر پارتیشن ۱۶بایت اطلاعات ذخیره می‌شود. پس با توضیحات ارائه شده مشخص می‌شود که بر روی هر دیسک ۴ پارتیشن بیشتر نمی‌توان ایجاد نمود. (مگر در حالت استفاده از درایو منطقی که در ادامه در مورد آن صحبت خواهد شد) از این ۴ پارتیشن یکی می‌تواند به عنوان پارتیشن Extended معرفی شده (و یا اصلا وجود نداشته باشد) و مابقی پارتیشن‌های Primary می‌باشند.

نکته: این ساختار در کامپیوترهایی وجود دارد که از BIOS و MBR استفاده می‌کنند و در کامپیوترهایی که UEFI و GPT دارند وجود ندارد. در مقاله‌ای دیگر به ساختار GPT خواهیم پرداخت.

در MBR کد مربوط به پیدا کردن سیستم‌عامل و بارگذاری BootLoader آن در ۴۴۶  بایت ابتدایی سکتور نوشته شده و از Offset شماره ۴۴۶ مقدار ۶۴ بایت اطلاعات پارتیشن‌ها را در بر می‌گیرد. دوبایت آخر MBR نیز (۴۴۶+۶۴==۵۱۰) همیشه مقدار ۰x55AA را در بر می‌گیرند. (در مقاله‌ای دیگر طریقه‌ی نوشتن برنامه اسمبلی برای MBR‌ را توضیح خواهیم داد)

نکته: فاصله نسبت به ابتدای محلی را Offset می‌نامند. در مثال ما فاصله از ابتدای سکتور مدنظر است.

در شکل زیر داده‌ی یک MBR‌ به صورت Hex نمایش داده شده است. دستور dd امکان کپی‌برداری از اطلاعات دیسک را فراهم می‌کند و همانطور که در شکل نمایش داده شده است مقدار ۵۱۲بایت از ابتدای دیسک اول کپی شده و در فایلی به نام mbr.img ذخیره می‌شود. (نام دیسک‌های sata, scsi در لینوکس با sd شروع شده و پس از آن، اولین دیسک sda، دومی sdb و… نام‌گذاری می‌شوند)

دستور xxd نیز برای hex dump استفاده می‌شود که بایت‌های یک فایل را در مبنای ۱۶ نمایش می‌دهد. در سمت چپ Offset هرخط، در وسط مقدار در مبنای ۱۶ و در سمت راست مقدار ASCII اطلاعات نمایش داده شده است. در اطلاعات نمایش داده شده عبارت GRUB‌ مشاهده می‌شود که از آن می‌توان برداشت کرد که این MBR مربوط به سیستمی لینوکسی می‌باشد! در خط آخر (از Offset شماره ۱f4==500 تا ۱ff==511) و در مکان دو بایت آخر (یعنی در مکان‌های ۵۱۰ و ۵۱۱) مقدار ۰x55AA مشاهده می‌شود! در صورت عدم وجود این مقدار در انتهای MBR خطای Missing Operating System داده خواهد شد.

1

پس از مشاهده کردن محتویات یک MBR باز گردیم به بررسی ساختار پارتیشن‌ها در آن و اطلاعاتی که در ۱۶بایت مربوط به هر پارتیشن ذخیره می‌شود. از جمله اطلاعاتی که در ۱۶بایت مربوط به هر پارتیشن قرار می‌گیرد و برای ما اهمیت دارد موارد زیر می‌باشند:

  • بایت اول (شماره‌ی صفر) Active بودن پارتیشن را مشخص کرده و می‌تواند دو مقدار۰x80 و ۰ را داشته باشد. مقدار ۰x80 که تنها به پارتیشن‌های Primary داده می‌شود، بیانگر پارتیشنی است که سیستم‌عامل بر روی آن نصب شده و باید Boot Loader سیستم‌عامل از روی آن بارگذاری شود. این مقدار تنها برای یک پارتیشن باید ست شده و در غیر این صورت در زمان بارگذاری سیستم‌عامل با خطای Invalid Boot Partition مواجه می‌شویم.
  • بایت شماره‌ی ۴ نوع پارتیشن را مشخص می‌کند. به عنوان مثال مقدار ۰ برای خالی بودن، ۰x05 برای Extended، ۰x07 برای NTFS و ۰x83 برای Linux‌ مورد استفاده قرار می‌گیرند.
  • بایت‌های شماره‌ی ۸ تا ۱۱ برای Logical Block Addressing (LBA) مورد استفاده قرار می‌گیرند. (چهاربایت که اولین بایت، کمترین ارزش و آخرین بایت، بیشترین ارزش را دارد) از این مقدار برای Offset شروع پارتیشن استفاده می‌شود و تعداد سکتوری (دقت شود که سکتور و نه بایت) را مشخص می‌کند که از ابتدای دیسک باید رد کنیم تا به ابتدای پارتیشن برسیم.
  • بایت‌های شماره‌ی ۱۲ تا ۱۵ نیز اندازه‌ی پارتیشن به تعداد سکتور را مشخص می‌کنند.

در شکل زیر بخش‌های توضیح داده شده و مابقی بخش‌های تشکیل دهنده‌ی MBR نمایش داده شده است.

2

نکته: در این شکل برای Signature مقدار ۰xAA55 ذکر شده است در حالیکه با دیدن Hex مربوط به MBR‌ ، عبارت ۰x55AA در خروجی وجود داشت که یکی نمایش Big-Endian و دیگری Little-Endian است.

برای درک دقیق‌تر موضوع، مقدار LBA‌ و اندازه‌ی پارتیشن اول MBR نمایش داده شده را محاسبه کرده و با خروجی دستور fdisk مقایسه می‌کنیم. شروع اولین پارتیشن از Offset با مقدار ۴۴۶ می‌باشد که برای مقدار LBA باید بایت‌های ۸ تا ۱۱ را برداشته و مقدار آنرا با بدست آوردن یک عدد ۳۲ بیتی محاسبه نماییم. پس باید از آدرس ۴۴۶+۸==۱C6 مقدار ۴بایت را برداریم. در شکل MBR خط سوم از پایین از آدرس ۱C2 شروع می‌شود که با اضافه کردن ۴بایت به آن به آدرس ۱C6 در ابتدای ستون سوم خواهیم رسید. پس ۳۲ بیتی که مقدار LBA را مشخص می‌کنند به صورت زیر بوده که با تبدیل به مبنای ۱۰ به عدد ۲۰۴۸ خواهیم رسید:

۰x00080000 = 0x00 + 0x08 * 256 + 0x00 * 2562 + 0x00 * 2563 = 2048

چون ۳۲ بیت این عدد را به بخش‌های ۸ بیتی تقسیم نمودیم، (هر بایت برابر ۸ بیت می‌باشد) پس ارزش هربایت ۲۸==۲۵۶ برابر ارزش بایت قبلی می‌باشد.

به طریق مشابه برای بدست آوردن اندازه‌ی پارتیشن باید به ابتدای بایت ۴۴۶+۱۲==۱CA رفته و ۴بایت را برداشته و اندازه‌ی پارتیشن را بدست آورد. (۴ بایت خط سوم از پایین، ستون‌های ۵و۶)

۰x00008018 = 0x00 + 0x00 * 256 + 0x80 * 2562 + 0x18 * 2563 = 411041792  

با اجرای دستور fdisk بر روی فایل mbr.img صحت این اطلاعات مشخص می‌شود. دقت شود که به دلیل کپی نگرفتن از تمامی اطلاعات دیسک، اطلاعات پارتیشن‌های Extended کامل نبوده و fdisk خطایی می‌دهد. (در ادامه با ساختار کامل این پارتیشن‌ها و دلیل این خطا آشنا می‌شویم)

3

تا اینجای بحث توضیح دادیم که ۴ بخش برای اطلاعات ۴ پارتیشن وجود دارد که یکی از این ۴تا می‌تواند از نوع Extended باشد. این نوع پارتیشن امکان ایجاد Logical Drive (از دید سیستم‌عامل و کاربر نهایی همان پارتیشن و افزودن تعداد درایوها و رسیدن به تعداد درایور بیشتر از ۴) را فراهم می‌کند. روال کار به این شکل است که یک لیست پیوندی ایجاد شده که این پارتیشن Extended به عنوان Head عمل کرده و اشاره کننده به اولین Logical Drive است. (مقدار LBA این پارتیشن به ابتدای اولین سکتور از اولین درایو اشاره کرده و Size اندازه‌ی کلیه‌ی درایوها در مجموع و فضایی که تشکیل می‌دهند را مشخص می‌کند)

در هر Logical Drive اولین سکتور با نام Extended Boot Record (EBR) شناخته شده و ساختاری مشابه MBR دارد که از ۴ بخش مربوط به پارتیشن‌ها، تنها ۲ بخش استفاده شده که بخش مربوط به پارتیشن اول، اطلاعات درایو فعلی را در بر گرفته و بخش دوم اشاره‌گر به Logical Drive بعدی می‌باشد. در انتهای کار و پس از رسیدن به آخرین درایو، مقدار فیلد type (نوع پارتیشن در بایت شماره‌ی ۴) پارتیشن دوم EBR (اشاره‌گر به درایو بعدی) برابر صفر خواهد بود. (همان NULL در انتهای لیست پیوندی ساده) این ساختار در شکل زیر نمایش داده شده است.

4

نکته مهم: در Logical Driverها مقدار LBA مشخص شده در پارتیشن اول EBR، نسبت به درایو قبلی بوده و از ابتدای محل Extended نیست.

 

برای بررسی عملی توضیحات داده شده، با استفاده از دستور dd سکتور مربوط به EBR را خوانده و اطلاعات نمایش داده شده توسط آنرا بررسی می‌نماییم. اولین مرحله پیدا کردن آدرس EBR است. برای اینکار از شکل خروجی دستور fdisk -l mbr.img و در خط دوم که نوع پارتیشن Extended ذکر شده است، مقدار start را برداشته و این تعداد سکتور skip کرده و سپس ۵۱۲ بایت می‌خوانیم. سپس دستور fdisk را برای فایل جدید ایجاد شده، اجرا کرده و LBA, Size درایو را بدست می‌آوریم.

5

در این شکل مشخص است که درایومنطقی که درون Extended ایجاد شده است از نوع Swap بوده و شروع آن ۲سکتور بعد از شروع Extended می‌باشد (یعنی از سکتور ۴۱۱۰۴۵۸۸۸ که برابر است با skip+start(ebr.img)) جمع بندی نهایی و نمایش کلیه‌ی اطلاعات دیسک با استفاده از اجرای fdisk  بر روی sda به صورت زیر است:

6

امیدوارم مفید بوده باشه، موفق باشید.

کانال تلگرام