پنجشنبه، خرداد ۰۳، ۱۳۸۶

کامپایل کردن کرنل لینوکس

کرنل یا هسته لینوکس از قسمت‌هایی تشکیل شده که به اصطلاح به آن‌ها module یا اگر بخواهیم کامل‌تر بگوییم kernel module می‌گویند. بسیاری از این module ها درایورهای مختلف هستند. گاهی لازم می‌شود که برای کاری تحقیقاتی یک سیستم سبک و کم حجم بسازید، یا module ای را به کرنل خود اضافه کنید. این کار را با کامپایل و نصب کردن کرنل لینوکس خود می‌توانید انجام دهید. دستورات این پست با Fedora Core 6 امتحان شده‌اند. احتمالا با کمی تغییر می‌توانید همین کار را با distribution های دیگر هم انجام دهید. برای انجام این کار احتیاج به پکیج سورس کرنل خود نیز دارید. در مورد فدورایی که من استفاده می‌کردم این فایل (که یک فایل .src.rpm است) از این‌جا (فایل:+، فولدر:+) قابل دانلود است.

 

۱.

اگر نتوانستید به راحتی بالا سورس کرنل لینوکس خود را دانلود کنید، اول باید ببینید نسخه آن چیست. برای این کار از دستور زیر استفاده کنید:

$ uname -r
[this will print kernel release version]
$ uname -a
[this will print all system information]

سپس با اطلاعات بالا دنبال پکیج سورس آن بگردید، یا به پانوشت ۱ مراجعه کنید.

 

۲.

فرض کنید پکیج سورس کرنل را دانلود کرده‌اید. در مورد فدورایی که من استفاده می‌کنم، نام این فایل kernel-2.6.18-1.2798.fc6.src.rpm است. در دستورات این نام را با نام بسته خودتان عوض کنید. برای اجرای بقیه دستورها باید کاربری با اختیارات root یا خود root باشید.

$ rpm -Uvh kernel-2.6.18-1.2798.fc6.src.rpm
$ cd /usr/src/redhat/SPECS
$ rpmbuild -bp --target $(arch) kernel-2.6.spec

دستور rpm اولی موجب نصب پکیج می‌شود، اما چون این بسته تنها یک بسته سورس است، یک سری فایل سورس در /usr/src کپی خواهد کرد. –Uvh به معنای upgrade کردن بسته است (U) و گزارش لحظه به لحظه از کاری که در حال انجام است (v) و نشان دادن میزان پیشرفت با کاراکتر hash که # است (h). حاصل آن فایل .spec ایست که rpmbuild در دستور بعدی از آن استفاده خواهد کرد.

 

۳.

حالا وقت اضافه و کم کردن module هاست. این که به طور پیش فرض چه module هایی نصب می‌شوند در فایل مخفی .config نوشته شده. برای تغییر محتویات این فایل به طور گرافیکی یا متنی از دستورات زیر استفاده کنید.

$ cd /usr/src/redhat/BUILD/kernel-2.6.18/linux-2.6.18-i686
[the .config file and the Makefile reside here]

$ make help
[lists all available options to configure and make]

[run one of the following, as you wish]

$ make xconfig
[GUI configuration, using Qt for KDE]
[probably the most user-friendly option]

$ make gconfig
[GUI configuration, using GTK for GNOME]

$ make menuconfig
[text based configuration, using ncurses]

اگر از روش گرافیکی استفاده می‌کنید، می‌توانید درختی از تمامی module ها ببینید. آن‌هایی را که می‌خواهید نصب کنید را انتخاب کنید و آن‌هایی را که نمی‌خواهید را از حالت انتخاب بیرون بیاورید. مثلا می‌توانید به قسمت filesystems بروید و ntfs را انتخاب کنید. با save کردن تغییراتی که دادید فایل .config به‌روز خواهد شد.

 

۴.

الآن دیگر می‌توانید کامپایل و نصب را شروع کنید. این کار تقریبا نیم الی یک ساعت طول خواهد کشید. توجه کنید که مرحله آخر نصب، boot-loader را نیز update خواهد کرد.

$ make
$ make modules_install
$ make install

 

۵.

برای استفاده از کرنل جدید باید سیستم را reboot کنید. با این کار خواهید دید که یک گزینه به گزینه‌های grub (یا lilo) اضافه شده. گزینه جدید که کلمه prep در آن به چشم می‌خورد، همان کرنل جدید است.

 

 

پ.ن.

 

۱. نسخه‌های اصلی کرنل را گروهی به سرپرستی لینوس توروالدس تولید می‌کنند. سپس distribution های مختلف، بسته به کاربرد یا ایدئولوژی خود، آن را تغییر می‌دهند (patch تغییراتشان اکثرا از سایت خودشان قابل دانلود است). نسخه‌های اصلی کرنل را می‌توان ازwww.kernel.org  دانلود کرد. اگر قصد کامپایل چنین نسخه‌ای را دارید، توجه کنید که نسخه آن باید با نسخه کرنل لینوکس شما سازگار باشد، مثلا با 2.6.18 شروع شده باشد. اگر این نسخه را کامپایل کنید، کرنل حاصل دیگر کرنل patch شده توسط distribution شما نیست، بلکه کرنلی است که لینوس توروالدس منتشر کرده.

 

۲. این دستورات مخصوص distribution های redhat ایست، و به احتمال زیاد برای distribution های debian ای مثل Ubuntu کار نخواهند کرد. اصلا در این نسخه‌ها دستور rpm‌ وجود ندارد، و احتمالا پسوند پکیج سورس آن‌ها .deb است.

 

 

سه‌شنبه، اردیبهشت ۱۸، ۱۳۸۶

یک الگوی مناسب برای برنامه‌های console

برای ساده شدن بحث، فرض کنید می‌خواهیم برنامه‌ای بنویسیم که جملاتی را دریافت، و حروف کوچک آن را بزرگ کند. گرچه این برنامه بسیار ابتدایی است اما برای بحث ما مناسب است. یک شیوه طراحی چنین برنامه‌ای این است که، یک آرگومان برای نام فایل ورودی درنظر بگیریم و یک آرگومان نیز برای فایل خروجی. سپس برنامه آرگومان‌ها را بررسی و کار خود را انجام دهد. اگر آرگومان‌ها پاس نشدند، یا اشتباه پاس شدند برنامه پیغام خطا خواهد داد و اجرا متوقف می‌شود. بد نیست!

اما شیوه خوب طراحی (که شاید به نظر بسیار بد بیاید)، این است که برنامه ورودی‌هایش را از stdin بخواند، خروجیش را در stdout چاپ کند، و خطاهای احتمالی را در stderr. روش خواندن از stdin هم به گونه‌ای باشد که هرگاه به EOF رسید متوقف شود. نیازی هم به پشتیبانی از فایل نیست! اما اگر باشد چه بهتر. مثال ساده زیر، همین کار را می‌کند. فرض کنید نام فایل اجرایی my2upr[.exe] باشد.

my2upr.cpp
  01:   #include <iostream>
  02:   #include <string>
  03:   using namespace std;
  04:   
  05:   int main()
  06:   {
  07:       char szBuffer[1024];
  08:       while(cin.getline(szBuffer, 1024))
  09:       {
  10:           cout << strupr(szBuffer) << endl;
  11:       }
  12:   
  13:       return 0;
  14:   }

خط ۸ موجب خواندن خط به خط از ورودی تا زمان مشاهده EOF می‌شود. هنگام اجرای برنامه برای ایجاد EOF در Windows از Ctrl+Z و در UNIX از Ctrl+D استفاده کنید. خوب تا این‌جا ممکن است این روش، در مقایسه با روش آرگومانی، به نظر افتضاح بیاید. اما:

 

خواندن یک فایل و مشاهده آن در خروجی:

./my2upr < input.txt 

خواندن یک فایل و ذخیره خروجی در فایلی دیگر:

./my2upr < input.txt > output.txt

مشاهده محتویات یک فایل به حروف بزرگ:

cat readme.txt | ./my2upr | less

توضیح این که، < موجب می‌شود محتویات یک فایل به عنوان ورودی برنامه (یعنی به جای stdin) قرار گیرد. > خروجی برنامه (یعنی stdout) را به یک فایل منتقل می‌کند. پایپ نیز نتیجه اجرای برنامه قبل خود را به عنوان ورودی برنامه بعد خود قرار می‌دهد.

 

خلاصه این که، استفاده از این روش، قابلیت‌های اسکریپتی بسیار زیادی به برنامه می‌بخشد. بسیاری از دستورات UNIX به همین شیوه طراحی شده‌اند.


موسیقی متن پرنده‌ی خارزار

قطعه‌ای از موسیقی متن فیلم Thorn Birds اثر هنری مانچینی؛ تقدیم به لحظات دل‌تنگی‌تان.

و مختصری توضیح:

هنری مانچینی رو بیشتر با موسیقی پلنگ صورتی می‌شناسند. اکثر کارهای او ملایم و عاطفی است (حتی پلنگ صورتی). او در سال ۱۹۹۴ در گذشت.

Thorn Birds نام سریال کوتاهی است که در سال ۱۹۸۳ ساخته شد. نسل قبل از ما این سریال را به سختی فراموش خواهد کرد. رمان Thorn Birds به فارسی پرنده‌ی خارزار ترجمه شده.

جمعه، اردیبهشت ۱۴، ۱۳۸۶

دنیا ارزش جنگیدن را دارد؟

سامرست در سکانس پایانی فیلم هفت

«همینگوی می‌گوید:
"دنیا جای خوبیست، ارزش جنگیدن را دارد ..."
من با بخش دوم موافقم...»