تا قیامت نمی توانستم نگاه کنم تا بلکه سی دی ویندوز بوت شود و بناچار پارتیشن efi را همین طوری فرمت کردم.
توی ادامه، esp همون پارتیشن efi هست و به جای هم دیگه به کار میرن. مگه اینکه جایی خلاف اون گفته بشه.
لازم نبوده esp رو فرمت کنید.
اگه cd ویندوز رو توی کامپیوتر قرار میداد و بعد وارد منوی uefi میشدید، اونجایی که الویت بوت رو انتخاب میکنید، یه گزینه هم برای ویندوز باید وجود میداشت. اگه اولویت اون رو بالاتر از بقیه قرار میدادید، ویندوز باید بوت میشد. البته قبلش باید دقت میکردید که بوت از طریق cd و فلش غیرفعال نشده بوده، معمولا به طور پیشفرض، این قابلیت فعال هست.
حتی میتونستید مستقیم با دستور efibootmgr، مستقیم از خود دبیان الویت بوت رو تغییر میدادید. البته اینکه بوت از طریق cd و فلش فعال باشه رو باید از طریق منوی uefi تنظیم کنید، راه دیگهای نداره.
- ویندوز xp :
...
ویندوز xp از uefi پشتیبانی نمیکنه و توی حالت legacy بوت میشه. ویندوز xp نمیتونه روی دیسکی نصب بشه که پارتیشنتیبل اون، gpt هست. ولی فکر کنم بعد از نصب بتونه اطلاعات دیسکهایی که پارتیشنتیبل gpt دارند رو بخونه؛ مطمئن نیستم.
- ویندوز ۷ :
...
ویندوز ۷ کامل از uefi پشتیبانی نمیکنه. احتمالا این هم توی حالت legacy بوت شده بوده.
ویندوز رو میتونید یا توی حالت bios + mbr نصب کنید یا uefi + gpt. حالت دیگهای پشتیبانی نمیشه. در حالی که توی سیستمعاملهای لینوکسی، bios + mbr و bois + gpt و uefi + gpt و uefi + mbr پشتیبانی میشه. این آخری بسته به سختافزار، ممکنه درست انجام نشه چون توی بعضی مادربردها، وقتی firmware میبینه دیسکی که قراره که قراره از اون بوت انجام بشه، از mbr استفاده میکنه، حالت legacy فعال میشه.
ویندوز ۱۰:
...
ویندوز 8 و نسخههای بعدی، درست از uefi پشتیبانی میکنند.
ویندوز ۱۰ را توانستم نصب کنم ، ولی فهمیدم که بصورت اتوماتیک وار توسط سیستم عامل firmware های سخت افزاری مربوط به کارت صدا و گرافیک و .. نصب نمی گردد، تا جایی که فهمیدم اینها را می شود از فروشگاه اینترنتی ماکروسافت نصب کرد ولی برای اینکار نیاز به داشتن اکانت می باشد.
توی ویندوز، معمولا firmware به صورت خالی نصب نمیشه، درایور نصب میشه که firmware ها همراه اون هستند.
تا جایی که میدونم، درایورها از طریق قسمت windows updates نصب میشدند، نه فروشگاه مایکروسافت.
علاوه بر windows updates و cd که داشتید، میتونستید درایورها رو مستقیم از وبسایت سازنده دریافت کنید.
تا بحال در بیشتر خرابکاریهایم دست بدامان timeshift می شدم
...
همونطور که دیدید، timeshift به طور پیشفرض فقط از جاهایی پشتیبان میگیره که گفتید. esp جدا هست. به خاطر همین از اون پشتیبانی نگرفته. به غیر از این، فکر نکنم timeshift از فایلسیستمهای غیر لینوکسی پشتیبانی کنه؛ مطمئن نیستم.
وقتی esp رو فرمت کردید، فایل اجرایی گراب، که موقع بوت توسط uefi اجرا میشه رو پاک کردید در نتیجه گراب بوت نمیشده و شما به دبیان دسترسی نداشتید.
توی سیستمهای uefi، یه سری چیز به اسم متغییرهای EFI وجود داره. از طریق این متغییرها میشه چیزهای مختلفی رو تنظیم کرد. یکی از این چیزها، الویت بوت هست. این متغییرها روی یه حافظه از جنس nvram که روی مادربرد قرار داره، ذخیره میشن. جنس این حافظهها با جنس فلشها، کارتهای حافظه و ssd ها یکی هست. (ssd های سری optain اینتل، با یه تکنولوژی دیگه ساخته میشن، جنس اونها nvram نیست. یه تکنولوژی انحصاری اینتل هست)
متغییرهای مربوط به الویت بوت، مشخص میکنند که firmware باید چه فایلی رو با چه آپشنهایی، توی چه مسیری و توی چه پارتیشنی اجرا کنه.
یه قابلیت یا شاید بشه گفت مشکلی که توی اکثر پیادهسازیهای مختلف uefi هست، اینه که اگه یه فایلی بالاترین الویت بوت رو داشته باشه و بعد firmware سعی کنه اون رو اجرا کنه اما فایل وجود نداشته باشه، اطلاعات اون کلا از متغییرهای EFI پاک میشن. این حالتی هست که احتمالا برای شما پیش اومد. شما اول کار، قبل از اینکه ویندوز رو نصب کنید، esp رو فرمت کردید. با اینکار، اطلاعات اون پارتیشن از جمله فایل اجرایی گراب، پاک شدند. گراب شما احتمالا بالاترین الویت رو داشته.
بعد از راهاندازی مجدد، firmware سعی کرده چیزی که بالاترین الویت رو داشته، یعنی گراب، رو اجرا کنه؛ اما از اونجایی که اون فایل وجود نداشته، اینکار با شکست مواجه شده، در این وضعیت firmware به ترتیب الویتهای بعدی رو امتحان کرده تا اینکه بالاخره یه جایی، cd ویندوز بوت شده.
وقتی ویندوز رو نصب کردید، یه چیز دیگه به این متغییرها اضافه شد که باعث میشده بوتلودر ویندوز شناسایی بشه و الویت اون بالاتر از بقیه قرار بگیره.
وقتی ویندوز رو پاک کردید، متغییرهای اون هنوز توی حافظه nvram باقی مونده بودند، در نتیجه firmware سعی میکرده اون رو بوت کنه و اینکار رو هم میکرده. اما از اونجایی که بقیه ویندوز وجود نداشته، بالاخره یه جایی خطا میگرفتید.
علاوه بر چیزهای بالا، یه مسیر پیشفرضی توی esp هست که اگه طبق متغییرهای EFI نشد چیزی رو بوت کرد، firmware سعی کنه اون رو بوت کنه. این مسیر با توجه به معماری پردازنده متفاوته. مسیر اون به طور عمومی به شکل زیر هست
/EFI/Boot/bootARCH.efi
به جای ARCH، معماری قرار میگیره. مثلا برای معماری x86_64 یا همون x64 یا amd64 یا intel64، مسیر میشه این
/EFI/Boot/bootx64.efi
یا مثلا برای معماری arm64 میشه این
/EFI/Boot/bootaa64.efi
یا برای x86 این
/EFI/Boot/bootia32.efi
روت ( / ) رو نسبت به پارتیشن efi در نظر بگیرید. مثلا اگه پارتیشن efi روی /boot/efi/ سوار شده و مسیر فایل بالا توی سیستم شما به صورت زیر هست،
/boot/efi/EFI/Boot/bootx64.efi
مسیر اون فایل داخل پارتیشن efi، این هست.
/EFI/Boot/bootx64.efi
به بزرگ و کوچک بودن اسم فایلها، توجه نکنید. فایلسیستمهای ویندوز case insensetive هستند، به این معنی که کوچک و بزرگ بودن حروف برای اونها مهم نیست. مثلا همه اسمهای زیر رو یکی میبینند و نمیتونید یه جا، چندین فایل با این اسمها داشته باشید.
BIN
BIn
BiN
Bin
bIN
bIn
biN
bin
ویندوز، بوتلودر خودش رو داخل یه دایرکتوری توی esp ذخیره میکنه و با تغییر متغییرهای EFI، الویت رو به اون میده. علاوه بر این، بوتلودر خودش رو توی مسیر پیشفرض هم قرار میده تا اگه به هر دلیلی متغییرهای EFI کار نکردند، باز هم ویندوز بتونه بوت بشه.
اون اوایل که تازه uefi اومده بود، این مشکل تو بعضی پیادهسازیها وجود داشته که بدون توجه به متغییرهای EFI، چیزی که توی مسیر پیشفرض قرار داشت، بوت میشد.
راه حل مشکل شما این بوده که گراب رو دوباره نصب و متغییرهای EFI رو هم درست تنظیم میکردید. دستور grub-install، کار تغییر متغییرهای EFI رو به صورت خودکار انجام میده، به شرطی که به متغییرهای EFI دسترسی داشته باشه.
توی کرنل لینوکس، یه ماژول وجود داره به اسم efivarfs. این ماژول باعث میشه که کرنل بتونه با uefi و efi کار کنه. این ماژول، یه فایلسیستم api ( مجازی هست) میتونه ایجاد کنه تا بشه از طریق فضای کاربر (userspace) به متغییرهای EFI دسترسی داشت.
این فایلسیستم ایجاد شده، efivarfs نام داره و معمولا روی دایرکتوری زیر سوار میشه.
/sys/firmware/efi/efivars
توی دایرکتوری بالا، متغییرهای EFI در قالب فایلهای مختلف نمایان میشن. اکثر اونها غیر قابل تغییر هستند به این دلیل که صفت immutable برای اونها فعال شده. با دستور lsattr میتونید صفتهای یه فایل رو ببینید. اگه پنجمین کاراکتر از چپ i بود، یعنی صفت بالایی برای اون فایل فعاله. با دستور chattr میتونید اون صفتها رو تغییر بدید.
این صفت برای این گذاشته شده تا کاربر به طور اشتباهی، اون فایلها رو تغییر نده. تغییر اشتباه اونها میتونه باعث بشه سیستم بوت نشه یا حتی توی موارد بد پیادهسازی، باعث آسیب به سختافزار بشه.
این عمل سوار شدن، توسط init system، در صورتی که متوجه بشه توی حالت uefi هست، انجام میشه.
در صورتی که بخواهید دستی اینکار رو انجام بدید، اول باید مطمئن بشید که کرنل با پارامتر noefi بوت نشده. پارامترهایی که کرنل باهاش بوت شده رو میتونید توی فایل زیر ببینید.
/proc/cmdline
بعد از اینکه از بالایی مطمئن شدید، ماژول efivarfs رو بارگذاری کنید.
sudo modprobe efivarfs
الان میتونید با دستور mount، فایلسیستم رو روی مسیر درست سوار کنید.
sudo moun -t efivarfs efivarfs /sys/firmware/efi/efivars
راهنمای تعمییر گراب توی ویکی، جایی نمیگه که فایلسیستم بالایی رو سوار کنید. دستوری که برای نصب گراب داده، از آپشنهای منسوخ شده استفاده میکنه ( root-directory--)، روشی که برای نصب گراب توی حالت uefi داده، مناسب نیست و چندین مشکل دیگه هم داره. دادن مسیر دیسک وقتی که کامپیوتر توی حالت uefi بوت شده، بی تاثیر هست.
من خودم برای وقتی که میخواهم گراب رو تعمییر کنم یا با سیستم داخل chroot کاری انجام بدم که به دسترسی مستقیم به سختافزار نیاز داره، کل فایلسیستمهایی که روی /proc/ /sys/ /run/ و /dev/ به همراه هر چیزی که زیر اونها سوار شده رو توی chroot هم سوار میکنم.
از اونجایی که سوار کردن دستی اونها وقت گیره، از آپشن rbind-- همراه دستور mount استفاده میکنم تا به صورت بازگشتی، هر چی زیر اونها هست رو هم سوار کنه. اینجوری (فرض میکنیم جایی که داربم روش کار میکنیم، /mnt/ هست)
sudo mount --rbind /dev /mnt/dev
sudo mount --rbind /proc /mnt/proc
sudo mount --rbind /sys /mnt/sys
sudo mount --rbind /run /mnt/run
مطمئن نیستم که به run نیازی باشه ولی بودن اون مشکلی ایجاد نمیکنه.
مشکلی که دستورهای بالا دارند اینه که موقع unmount کردن، اذیت میکنند، به آپشن f- یا l- نیاز دارند که اونها هم مشکل خاص خودشون رو دارند، برای همین فایلسیستمهای توی chroot رو به صورت برده جایی که از روش سوار شدن در میاریم
اینکار با دادن آپشن make-slave-- ممکنه. اما از اونجایی که این آپشن فقط برای یه دایرکتوری کار میده و به زیریهای اون کاری نداره، make-rslave-- گزینه بهتری هست. عملکرد این مثل بالایی هست با این تفاوت که به صورت بازگشتی عمل میکنه و علاوه بر دایرکتوری هدف، هر چی زیر اون هست رو هم به صورت برده در میاره.
دستور میشه این
sudo mount --rbind --make-rslave /dev /mnt/dev
sudo mount --rbind --make-rslave /proc /mnt/proc
sudo mount --rbind --make-rslave /sys /mnt/sys
sudo mount --rbind --make-rslave /run /mnt/run
از اونجایی که دستورات بالا خیلی شبیه هم هستند و تایپ کردن زیادی دارند، میشه با یه حلقه تکرار کار رو راحتتر کرد. من همیشه از این استفاده میکنم.
for i in dev sys proc run; do
sudo mount --rbind --make-rslave /$i /mnt/$i
done
بعد از اینکه فایلسیستمهای بالایی رو سوار کردید، سیستم داخل chroot میتونه راحتتر با دنیای بیرون و سختافزار ارتباط بر قرار کنه.
الان میتونید وارد محیط chroot بشید و کارها رو اونجا انجام بدید.
sudo chroot /mnt
اول چیزهایی که توی fstab تنظیم شدند رو سوار کنید. این مرحله لازمه تا esp روی جای درست سوار بشه تا در ادامه، گراب فایل اجرایی خودش رو داخل اون قرار بده.
mount -a
وقتی وارد chroot میشید، به عنوان کاربر روت شناخته میشید. پس به sudo نیازی ندارید.
الان گراب رو نصب کنید
grub-install
چون توی حالت uefi هستید، لازم نیست دیسکی که گراب قراره روی نصب بشه رو بدید. اگه esp روی یکی از دایرکتوریهای /boot/efi/ یا /boot/ یا /efi/ سوار شده باشه، گراب اون رو شناسایی میکنه و فایلهاش رو توی جای درست قرار میده. دلیلش اینه که مسیرهای بالایی، جز استاندارد freedesktop هستند که توسط خیلی از برنامههای آزاد، رعایت میشه.
اگه لازمه که دستی جای esp رو مشخص کنید، آپشن efi-directory-- برای اینکار هست. مثلا برای اینکه /root/grubfiles/ به عنوان esp استفاده بشه، اینجوری دستور رو اجرا کنید
grub-install --efi-directory=/root/grubfiles
میشه به جای علامت مساوی، از فاصله استفاده کرد. این شکلی
grub-install --efi-directory /root/grubfiles
دوتا دستور بالایی توی عملکرد، هیچ فرقی با هم ندارند.
گراب به طور پیشفرض، فایلهای خودش رو توی یه دایرکتوری به اسم توزیع، توی دایرکتوری EFI توی esp قرار میده. مثلا برای دبیان، میشه مسیر زیر (یادتون باشه داریم مسیر رو نسبت به esp میگیم)
/EFI/debian
اگه میخواهید توی /EFI/Boot/ نصب بشه، میتونید از آپشن removal-- استفاده کنید. اینجوری
grub-install --removal
برای اطلاعات بیشتر درباره دستور grub-install، صفحه man اون رو ببینید
man grub-install
بعد از اینکه گراب رو نصب کردید، تنظیمات اون رو آپدیت کنید، هر چند فکر نکنم این مرحله لازم باشه.
update-grub
بعد از کارهای بالا، از chroot با ctrl + d یا exit خارج بشید.
چیزهایی که سوار کردید رو unmount کنید.
sudo umount -R /mnt
بعد باید گراب درست میشده و با راهاندازی مجدد، وارد اون میشدید.
وقتی که دبیان رو نصب کردید، esp رو هم فرمت کردید یا نه؟ اگه نکردید، احتمالا هنوز فایلهای مربوط به ویندوز، داخل esp هستند. توی دبیان و توزیعهای مبتنی بر اون، esp روی /boot/efi/ سوار میشه. اونجا رو بررسی کنید که فایلهای مربوط به ویندوز وجود داره یا نه.
ls /boot/efi
ls /boot/efi/EFI
احتمالا هنوز چیزهای مربوط به ویندوز، توی متغییرهای EFI وجود دارند. خروجی دستور efibootmgr رو بررسی کنید.
برای اطلاعات بیشتر درباره efi و uefi، میتونید صفحه مربوطه توی
ویکی آرچ، صفحه مربوط به uefi توی
ویکیپدیا انگلیسی و
این وبلاگ رو ببینید. آخری توسط یکی از کارمندهای canonical نوشته شده. نویسنده refind و gdisk هم هست.
https://uefi.org هم وبسایت رسمی uefi هست. میتونید آخرین اخبار، مشخصات و چیزهای مربوط به uefi رو اونجا پیدا کنید. یه کانال هم توی یوتیوب دارند که هر چند ماه یه بار، ویدیوهایی درباره uefi و چیزهای مربوط به اون قرار میدهند. معمولا حدود 40 دقیقه یا بیشتر طول میکشه.
عموما افرادی اونجا صحبت میکنند که توی شرکتهایی مثل اینتل کار میکنند.
متاسفانه چیز درستی به زبان فارسی سراغ ندارم وگرنه قرار میدادم.