یکی از طولانیترین و زمانگیرترین مراحل فرآیند بوت برای هر رایانهای این است که هنگام راهاندازی دوباره، رایانه به صورت کامل خاموش میشود و CPU به ابتداییترین مرحلهی راهاندازی یعنی BIOS (Basic Input Output System) میرود. BIOS و POST (Power-On Self-Test) شامل چندین مرحله از جمله آزمایش و شناسایی سختافزار و آمادهسازی اولیه میشود. هنگام ریاستارت این مراحل غیر از گرفتن زمان فایدهی دیگری ندارند زیرا قبلا یک بار طی شدهاند.
این همان جاییست که kexec وارد میشود، kexec به شما این امکان را میدهد که از کرنل در حال اجرا مستقیما به کرنل دیگری (یا همان کرنل) بوت کنید. این بدان معنیست که هنگام راهاندازی دوباره دیگر خبری از مراحل BIOS، POST، GRUB و انتخاب سیستمعامل نخواهد بود و گنو/لینوکس شما در سریعترین زمان ممکن ریاستارت میشود. در اینجا روش استفاده از kexec را برای دو توزیع اوبونتو و آرچ توضیح خواهیم داد (البته روش کلی کار و دستورات در توزیعهای دیگر هم باید مشابه باشد).
kexec در اوبونتو:
ابتدا بستهی kexec-tools را نصب کنید:
حال میتوانید با استفاده از دستور زیر کرنل مورد نظر خود را در حافظه (RAM) بارگذاری کنید:
KERNEL-PATH، KERNEL-OPTIONS و INITRD-PATH به ترتیب مسیر کرنل، آپشنهای کرنل و مسیر فایل initrd هستند که به راحتی میتوانید آنها را در مسیر /boot، خروجی دستور cat /proc/cmdline و یا خطوط مربوط به ورودی کرنل، موجود در فایل /boot/grub/grub.cfg بیابید. برای مثال با توجه به خطوط زیر در فایل grub.cfg:
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root=\'(hd1,msdos5)\’
search –no-floppy –fs-uuid –set=root 357b9ff8-dcb0-4717–9102-5b3ecaa23595
linux /boot/vmlinuz-3.2.0-24-generic root=UUID=357b9ff8-dcb0-4717–9102-5b3ecaa23595 ro crashkernel=384M-2G:64M,2G-:128M quiet splash $vt_handoff
initrd /boot/initrd.img-3.2.0-24-generic
}
KERNEL-PATH = /boot/vmlinuz-3.2.0-24-generic
KERNEL-OPTIONS = root=UUID=357b9ff8-dcb0-4717-9102-5b3ecaa23595 ro quiet splash $vt_handoff
INITRD-PATH = /boot/initrd.img-3.2.0-24-generic
در نتیجه دستور به شکل زیر در میآید:
و در نهایت با دستور زیر به کرنل جدید بوت و یا کرنل در حال اجرا را ریبوت کنید:
دو دستور بالا را میتوانید در یک فایل به عنوان اسکریپت ذخیره و برای ریاستارت سریع از آن استفاده نمایید. برای مثال فایلی به نام qreboot ساخته و خطوط زیر را در آن قرار میدهیم:
kexec -l /boot/vmlinuz-3.2.0-24-generic –append=\’root=UUID=357b9ff8-dcb0-4717-9102-5b3ecaa23595 ro crashkernel=384M-2G:64M,2G-:128M quiet splash $vt_handoff\’ –initrd=/boot/initrd.img-3.2.0-24-generic
kexec -e
سپس آن را به مسیر /usr/local/sbin منتقل کرده و به آن دسترسی اجرایی میهیم:
حال کافیست بنویسیم sudo qreboot و Enter کنیم.
kexec در آرچ:
استفاده از kexec در آرچ نیز شبیه اوبونتوست با این تفاوت که اسکریپتهای rc به صورت پیشفرض از kexec پشتیبانی میکنند. به این معنی که kexec میتواند مستقیما از طریق دستور reboot (یا دستورات مشابه) مورد استفاده قرار گیرد. برای استفاده از این اسکریپتها kexec را به آرایهی DAEMONS موجود در فایل /etc/rc.conf اضاف کنید. البته پیش از آن باید kexec را نصب کنید:
با استفاده از خود kexec هم میتوان ریبوت را انجام داد، با اجرای دستوری شبیه دستور زیر:
توجه کنید که تفاوت دستور بالا با آنچه در مورد اوبونتو بیان کردیم این است که به محض اجرای دستور بالا سیستم ریبوت میشود (حالتهای مختلف استفاده از دستور kexec). به عنوان مثال برای بوت از کرنل پیشفرض آرچ به کرنل pf، من از دستور زیر استفاده میکنم:
علاوه بر این اسکریپتهایی به نام Bootloader scripts نیز وجود دارند که اطلاعات مربوط به کرنل را از منوی گراب میخوانند و در kexec به کار میبرند. یکی از این اسکریپتها را برای مثال در مسیر /usr/local/sbin/kexec-reboot ذخیره کنید و با استفاده از chmod +x به آن قابلیت اجرایی بدهید. اسکریپت، شمارهی ورودیهای موجود در گراب را به عنوان اولین پارامتر خود دریافت میکند. به عنوان مثال برای بوت به دومین ورودی موجود در منوی گراب دستور زیر را اجرا کنید:
اسکریپت بوتلودر برای GRUB1:
# This script loads a kernel from the GRUB menu and reboots.
# The error checking is very basic.
# Written by Isaac G, 2010
die ()
{
tput setaf 1 # Red text
echo "Error: $@" >&2
tput sgr0 # Reset
exit 1
}
(( UID != 0 )) && die "You need to be superuser"
unset number
# Use the first parameter or show a menu if none is specified
if [[ $1 ]] ; then
# Make sure the selected number is an integer
[[ $1 = *[^0–9]* ]] && die "The selected parameter is not a number"
number=$1
else
# Nothing selected; pull up a list of options from the grub menu
oldIFS="$IFS"
IFS=$\’\\n\’
# Get the titles
options=( $(awk \’$1 == "title" {for (i = 2; i <= NF; i++) printf "%s ", $i; printf "\\n";}\’ /boot/grub/menu.lst ) )
# Ask the user to select one
select title in "${options[@]}" ; do
for ((i = 0; i < ${#options[@]}; i++)); do
[[ $title == "${options[i]}" ]] && number=$((i + 1)) && break
done
[[ $number ]] && break
done
IFS="$oldIFS"
fi
unset kernel
unset initrd
unset append
item=0
# Parse GRUBs menu.lst
while read key val extra; do
[[ $key = "title" ]] && ((item++)) # Count the number of title\’s
(( item == number )) || continue # Wait until the right number
[[ $key = "kernel" ]] && kernel="$val" && append="$extra"
[[ $key = "initrd" ]] && initrd="$val"
done < /boot/grub/menu.lst
[[ $kernel ]] || die "No such kernel with that number"
# http://stackoverflow.com/questions/2167558/give-the-mount-point-of-a-path
root="$(df /boot | tail -n 1 | awk \'{ print $NF}\’)"
set — "$root$kernel"
[[ -n "${initrd+set}" ]] && set — "$@" –initrd="$root$initrd"
set — "$@" –append="$append"
kexec "$@"
اسکریپت بوتلودر برای GRUB2:
# This script loads a kernel from the GRUB 2 menu and reboots.
# The error checking is very basic.
# Written by Isaac G, 2010
# Modified by Greg Fitzgerald, 2011
die ()
{
tput setaf 1 # Red text
echo "Error: $@" >&2
tput sgr0 # Reset
exit 1
}
(( UID != 0 )) && die "You need to be superuser"
unset number
# Use the first parameter or show a menu if none is specified
if [[ $1 ]] ; then
# Make sure the selected number is an integer
[[ $1 = *[^0–9]* ]] && die "The selected parameter is not a number"
number=$1
else
# Nothing selected; pull up a list of options from the grub menu
oldIFS="$IFS"
IFS=$\’\\n\’
# Get the menuentrys
options=( $(awk \’$1 == "menuentry" {for (i = 2; i <= NF; i++) printf "%s ", $i; printf "\\n";}\’ /boot/grub/grub.cfg ) )
# Ask the user to select one
select menuentry in "${options[@]}" ; do
for ((i = 0; i < ${#options[@]}; i++)); do
[[ $menuentry == "${options[i]}" ]] && number=$((i + 1)) && break
done
[[ $number ]] && break
done
IFS="$oldIFS"
fi
unset kernel
unset initrd
unset append
item=0
# Parse GRUBs grub.cfg
while read key val extra; do
[[ $key = "menuentry" ]] && ((item++)) # Count the number of menuentry\’s
(( item == number )) || continue # Wait until the right number
[[ $key = "linux" ]] && kernel="$val" && append="$extra"
[[ $key = "initrd" ]] && initrd="$val"
done < /boot/grub/grub.cfg
[[ $kernel ]] || die "No such kernel with that number"
# Load the kernel
kexec -l "/boot$kernel" –initrd="/boot$initrd" –append="$append"
## Sync the disks
sync
## Reboot
kexec -e
12 دیدگاه برای این نوشته:
mojvar:
۱۲ خرداد ۱۳۹۱
ممنون بسیار کاربردی !محمد:
۱۲ خرداد ۱۳۹۱
ممنووووون. خیلی جالب و البته مفید بودعرفان طباطبائی:
۱۳ خرداد ۱۳۹۱
خیلی کاربردی و عالی بود
مـــرسی پیروزانmamalhendrix:
۱۴ خرداد ۱۳۹۱
دمت گرم عجب حرکتی زدی
واسه همینه عاشق لینوکسم – ته نداره لامسب :دیigrooved:
۱۹ خرداد ۱۳۹۱
میگم خودت امتحانش کردی؟
برای من هنگ میکنه و صفحه همون طور میمونه تا اینکه دستی لپ تاپو خاموش کنم.
اوبونتو ۱۱.۰۴ دارم البته.Pyruzan:
۱۹ خرداد ۱۳۹۱
درود،
آره خودم هم روی آرچ و هم روی اوبونتو ۱۲.۰۴ تست کردم، بدون مشکل کار میکنه.
البته در مورد kexec اشاره شده امکان اینکه مشکل پیش بیاد و درست کار نکنه وجود داره و کاملا بیعیب و نقص نیست.مجتبی:
۲۱ خرداد ۱۳۹۱
از دیشب تا احتمالا الان سایت دان بود انگار میگفتند پول هاست پرداخت نشده. چرا قسمت دنیت رو تو صفحه اول نمیذارین؟ تو قسمت حمایت و مشارکته که به چش نمیاد وقتی تو صفحه اصلی باشه بیشتر به چش میاد و هدایای کاربرا هم احتمالا بیشتر میشه و دیگه از این اتفاقات ناگوار هم انشاالله نمیفته که نه به نفع شما که استادین بلکه به نفع منه که از سایت و انجمنش خیلی استفاده بردم و خواهم برد. اینکه بچههای لینوکس ریویو بدون چشمداشت کار میکنن بر همه واضحه و با اینکار چیزی از ارزشهای شما کم نمیشه.مسعود آموزگار:
۲۱ خرداد ۱۳۹۱
تشکر از لطف شما ولی دوست عزیزم؛ قضیه ناپایداری سرور ربطی به مسائل مالی نداشته :) کجا میگفتند؟
امروز چند بار دان های 5-10 دقیقهای داشتیم که بخاطر مشکل توی بروزرسانی یکی از افزونه ها و نیز دستکاری تنظیمات امنیتی هست که داریم روی فایروالها اعمال میکنیم…
والا بحث دونیت هم بطور کلی ما قیدش رو زدیم. کوچکترین دونیتی به پروژه هایی نظیر آرچ بوک یا کتاب بش نشد در صورتی که صراحتا توی پست ها توضیح داده شده بود و توی چشم بود…
امیدوارم مشکل عدم دسترسی بزودی بطور کامل حل بشه :)
پیروز باشید.مجتبی:
۲۱ خرداد ۱۳۹۱
اتفاقا فقط تو چند بازهی ۲-۳ دقیقهای سایت آپ بود و مابقی مواقع دان بود شاید مشکل از اینترنت من بوده ولی همهی سایتها بالا میومد الا لینوکس ریویو.
از اونجا که بچههای لینوکسریویو رو چند بار تو سایت آزادراه دیده بودم مشکلو اونجا تو قسمت نظرات پست \”مینت باکس، رایانههایی سبک با طمع نعنا\” مطرح کردم که چند نفر گفتند پول هاستو ندادند. خودتون میتونید برید نظراتشون رو بخونید.
امیدوارم فرهنگ دونیت تو جامعه ما هر چه زودتر جا بیفته و این رو سعی میکنم از خودم شروع کنم راستش منم خودم کتاب خوب آرچبوک رو واسه نصب آرچ استفاده کردم ولی دونیت نکردم. نمیدونم چرا خیلی از ماها (از جمه خودم) دوست داریم جامعه گنو پیشرفت کنه ولی عملا گامی برنمیداریم از دونیت گرفته تا ترجمه تا برنامهنویسی و… امیدوارم و فقط امیدوارم این مشکلا حل بشه.
امیدوارم سایتتون تا ابد سرپا باشه
موفق باشید.مسعود آموزگار:
۲۱ خرداد ۱۳۹۱
همین بازخوردها خیلی خیلی کمک کرده به رفع اشکال و پیکربندی صحیح… با همین بازخوردها چندین ایراد رو پیدا کردیم و رفع کردیم.
الان که گزارش کردید بر اساس آی پیتون پیگیری کردیم و موردی که باعث مشکل میشد رو رفع کردیم. امیدوارم تنها مشکل همون بوده باشه.
لطفا اگر باز هم مشکل داشتید در سطح کمتر یا بیشتر و یا بدون تغییر بهمون اطلاع بدید.
سپاسمجتبی:
۲۲ خرداد ۱۳۹۱
واقعا دستتون درد نکنه
فعلا که آنتندهیش خیلی خوبه مشکلی بود حتما خبر میکنمReith:
۲۳ خرداد ۱۳۹۱
خیلی خوب بود.. ممنون.