مدیریت بسته‌های RPM بخش اول

بسته‌های نرم‌افزاری چه هستند و چرا به آنها نیاز داریم؟

هنگامی که توزیع لینوکس خود را نصب می‌کنید، اکثر نرم‌افزارهای مورد نیازتان همراه آن نصب می‌شود. ولی با این حال پیش می‌آید که نیاز به بسته‌های دیگری داشته باشید و یا بسته‌های نرم‌افزارهای موجود را بخواهید به نسخه‌های جدیدتر ارتقا دهید. در چنین مواردی است که باید بسته‌های جدید را روی CD و یا از اینترنت دریافت نموده و نصب نمایید.

بسته‌های نرم‌افزاری کار نصب نرم‌افزارهای کاربردی را در لینوکس آسان کرده‌اند. دیگر لازم نیست برای نصب هر نرم‌افزار، کاربر کدهای منبع را دریافت کرده، آنها را کامپایل نموده و نصب کند. کاری که بسیاری از کاربران از انجام آن ناتوان هستند.

همانطور که متوجه شدید، بسته‌های نرم‌افزاری حاوی برنامه‌های قابل اجرا و آماده برای نصب هستند. ممکن است در اینترنت به انواع مختلفی از بسته‌های نرم‌افزاری برخورد نمایید که البته همه آنها حاوی نرم‌افزارهای آماده برای نصب نیستند که جلوتر درباره آنها توضیح خواهم داد. پر کاربردترین بسته‌های آماده نصب نرم‌افزارهای کاربردی، بسته‌های نوع rpm و deb هستند. در این مقاله ما به بررسی بسته‌های نرم‌افزاری با فرمت rpm و مدیریت آنها خواهیم پرداخت و در مقاله جداگانه‌ای، مدیریت بسته‌های deb را که مخصوص لینوکس debian و توزیع‌های مبتنی بر آن است را بررسی خواهیم کرد.

درک نامگذاری و فرمت بسته های نرم‌افزاری

وقتی بسته ای را از اینترنت دانلود می‌کنید، می‌بینید که از یک نام، تعدادی شماره، نقطه، gz و tar تشکیل شده است. خوب اینها چه معنی دارند؟ ابتدا این اعداد و حرفها پیچیده به نظر می‌رسند در صورتی که اگر برایتان شرح داده شوند، بسیار ساده هستند. پس از مدتی به این شیوه نامگذاری عادت خواهید کرد. بیشتر بسته های نرم‌افزاری لینوکس از قاعده نامگذاری GNU استفاده می‌کنند. مثال‌های زیر فرمت‌های گوناگون بسته های نرم‌افزاری را نشان می‌دهد :

mycoolapp-4.2.3.i386.rpm
mycoolapp-4.2.3.tar.gz
mycoolapp-4.2.3.src.tar.gz
mycoolapp-4.2.3.bin.SPARC.tar.gz
mycoolapp-4.2.3.bin.ELF.static.tar.gz

این مثالها بسته های مختلف یک نرم‌افزار هستند. نام این بسته نرم‌افزاری mycoolapp است. پس از نام بسته ، شماره نسخه آن که 4.2.3 است قرار دارد. اولین شماره شماره اصلی یا major، دومین شماره شماره فرعی یا minor و آخرین شماره شماره وصله یا patch است. پس از شماره نسخه، نقطه ای قرار دارد که بعد از آن بخش های انتخابی قرار دارند که نشانگر محتوای بسته و چگونگی فشرده سازی آن هستند.

خط نخست یک بسته نرم‌افزاری rpm را نشان می‌دهد. rpm مخفف Redhat Package Manager است. i386 که قبل از rpm قرار دارد، نشان دهنده این است که بسته حاوی نرم‌افزار اجرایی برای کامپیوترهای PC معمولی است. فرمت rpm که ابتدا توسط Redhat ارائه شد، اکنون تبدیل به یک استاندارد برای پخش بسته های نرم‌افزاری لینوکس شده است. ببیشتر توزیع‌های لینوکس مانند ردهت، زوزه، ماندریک و... از این سیستم بسته بندی نرم‌افزار استفاده می‌کنند.

rpm در مقابل کد منبع

بسته هایی که بصورت فرمت rpm ارائه می‌شوند به سادگی قابل نصب بوده و برداشتن آنها نیز به سادگی امکان پذیر است. برای مدیریت بسته‌های rpm هم ابزارهای گرافیکی و هم ابزارهای متنی وجود دارند. در صورتی که در دنیای لینوکس تازه کار هستید، همیشه سعی کنید از این فرمت برای دریافت نرم‌افزارها استفاده نمایید.

    - RPM: نصب نرم‌افزارها با استفاده از بسته‌های rpm بسیار آسان است. برای نصب یک بسته rpm شما نیازی به دانستن اطلاعاتی در مورد makefile ها و کامپایلرها ندارید. همانطور که در بالا نیز اشاره کردم، ابزارهایی نیز برای مدیریت این بسته‌ها فراهم آمده است. هنگامی که یک بسته rpm را نصب می‌کنید، ابزارهای rpm سایر نرم‌افزارهای احتمالی مورد نیاز این بسته را نیز بررسی کرده و در صورت نیاز به نصب بسته دیگری به شما اعلام میکنند.

    - کد منبع (Source Code) : برخی اوقات تا ایجاد بسته های rpm یک نرم‌افزار، مدتی طول می‌کشد. در این مواقع باید از کد منبع آن استفاده کنید. همچنین می‌توانید با ایجاد تغییراتی در کد منبع نرم‌افزار، آنرا برای خود مناسبتر کنید. اکثر کاربران حرفه ای لینوکس کار کردن با کد منبع را ترجیح می‌دهند.

خوب به مثال بالا برمی‌گردیم. در دوخط بعدی بسته‌هایی قرار دارند که حاوی کد منبع نرم‌افزار هستند. هـمـانطور که مـی‌بـینید، این بسته‌ها توسط دستور tar آرشیو شده (tar) و توسط دستور gzip فشرده شده‌اند (gz). شما از این دو فرمان برای باز کردن و خارج کردن از حالت فشردگی بسته‌های نرم‌افزاری استفاده خواهید کرد.

بین شماره های نسخه و پسوند های tar.gz بخش های اختیاری می‌توانند قرار گیرند. این بخش ها توسط نقطه از هم جدا می‌شوند و اطلاعات خاصی مانند نوع پردازنده‌ای که کدهای اجرایی بر روی آنها اجرا خواهد شد، نوع کدهای اجرایی و ... را فراهم می‌کنند. برای مثال bin.SPARC نشان می‌دهد که بسته حاوی کدهای اجرایی است که بر روی ایستگاههای کاری مبتنی بر پردازنده‌های SPARC اجرا خواهد شد.

استفاده از انواع گوناگون آرشیوها و فرمت مستندات

بسیاری از بسته‌های نرم‌افزاری که به یک توزیع خاص (مانند ردهت، SuSE، Debian و...) وابسته نیستند از روش tar/gzip برای فشرده سازی و آرشیو کردن فایل‌ها استفاده می‌کنند. البته ممکن است در سایتهای FTP لینوکس به فرمت‌های دیگری نیز بر بخورید. لازم به ذکر است که برخی از این فایلها مستندات همراه نرم‌افزار بوده و کد منبع یا اجرایی نیستند.

جدول ۱ فرمت های مختلف فایلی که شما هنگام چرخش در سایتهای FTP لینوکس مشاهده خواهید کرد و جدول ۲ برخی فرمت‌های رایج مستنداتی که همراه با نرم‌افزارهای لینوکس ارائه می‌شوند را نشان میدهد.

برای اینکه بدانید یک فایل دارای چه فرمتی است، می‌توانید از دستور file استفاده کنید. به مثال زیر توجه کنید :

$ file telnet.htm
telnet.htm: HTML document text

فرمت

پسوند

شرح

Gzip file

gz or .z

این فایل با استفاده از ابزار GNU gzip فشرده شده است. این فایل توسط ابزارهای gzip یا gunzip باز خواهد شد.

Tar File

tar

این فایل با استفاده از دستور tar آرشیو شده است. این فرمان برای ایجاد یک بسته از چند فایل بکار می‌رود. برای باز کردن این آرشیو از خود دستور tar استفاده می‌شود.

Bzip2

bz2

این فایل با استفاده از برنامه bzip2 فشرده شده است. میزان فشرده سازی این برنامه از gzip بیشتر است.

Tar/compressed

taz or .tz

این فایل توسط دستور compress یونیکس فشرده شده است.

Linux Software Map

lsm

این فایل حاوی متنی است که محتویات یک آرشیو را نشان می‌دهد.

Debian binary package

deb

این فایل یک بسته نرم‌افزاری است که توسط ابزارهای لینوکس debian ایجاد شده است.

Redhat Package Manager

rpm

این فایل بسته نرم‌افزاری است که با استفاده از ابزارهای rpm ایجاد شده است و غیر از ردهت، توسط توزیع کنندگان دیگر لینوکس هم استفاده می شود.

جدول ۱ انواع فرمت بسته‌های نرم‌افزاری لینوکس

نصب برنامه های کاربردی در لینوکس ردهت

بیشتر برنامه هایی که نیاز به نصب آنها دارید، به صورت فرمت rpm موجود هستند. در صورتی که هیچ بسته rpm ای برای نرم‌افزار مورد نظرتان پیدا نکردید، می‌توانید از کد منبع نرم‌افزار استفاده کنید و خودتان نرم‌افزار مورد نیاز را کامپایل و نصب کنید.

فرمت

پسوند

شرح

Hypertext Markup Language

.html
or .htm

این فرمت شناخته شده را می‌توانید در هر مرورگر وبی بخوانید.

PostScript

.ps

یک فایل پست اسکریپت برای ارسال به یک چاپگر پست اسکریپت.

SGML

.sgml

فایلهای SGML برای ایجاد مستنداتی بکار می‌روند که آنها را می‌توان به فرمتهای گوناگون تبدیل کرد.

DVI

.dvi

این فرمت خروجی برنامه LaTeX است. با استفاده از فرمان dvilj می‌توانید آنرا به PostScript یا HP PCL تبدیل کنید.

Plain Text


فایلهای بدون پسوند معمولا متنهای ساده با فرمت ASCII هستند.

جدول ۲ انواع فرمت مستندات همراه بسته های نرم‌افزاری

نصب و مدیریت بسته های rpm

هنگامی که یک برنامه کاربردی که با فرمت rpm است به دستتان می‌رسد، این بسته معمولا فقط شامل یک فایل است. دستوری که شما برای مدیریت و استفاده از بسته های نرم‌افزاری rpm استفاده می‌کنید، دستور rpm است.

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

- نصب نرم‌افزار (install) با گزینه i

-ارتقا نرم‌افزار (Upgrade) با گزینه U

- کسب اطلاعات از بسته (Query) با گزینه q

- چک کردن بسته (Verify) با گزینه V

- بررسی امضا بسته (Signature check) با گزینه checksig

- برداشتن بسته (Uninstall) با گزینه e

-ساخت بسته (Build) با گزینه b

-ساخت مجدد بانک اطلاعاتی (Rebuild Database) با گزینه rebuilddb

- تصحیح مجوزها (Fix Permissions) با گزینه setperms

- تعیین مالک/گروه (Set Owners/groups) با گزینه setugids

با استفاده از این گزینه‌ها می‌توانید بسته های rpm را نصب کرده، صحت نصب بسته ها را بررسی کنید و اشکالات احتمالی را برطرف نمایید.

هشدار : برای نصب یا برداشتن بسته های rpm باید با کاربر ریشه وارد سیستم شده باشید. نمایش بسته‌های نصب شده، کسب اطلاعات از بسته و نمایش محتویات بسته نیاز به داشتن مجوز ریشه ندارد.

منبع:http://technotux.com

راهنمای تنظیم LiLo

 استفاده از لیلو

یکی از پر استفاده‌ترین و قدیمی‌ترین برنامه‌های مدیر بوت لینوکس برنامه‌‌ای به نام Lilo می‌باشد که نام آن مخفف Linux Loader می‌باشد. با وجودی که برنامه مدیر بوت GRUB دارای قابلیت‌های بیشتری نسبت به لیلو است، ولی هنوز از لیلو در تعداد زیادی از توزیع‌های لینوکس استفاده می‌شود.

در این مقاله چگونگی تنظیم مدیر بوت لیلو و همچنین چگونگی تغییر مدیر بوت کامپیوتر از لیلو به گراب و بلعکس را خواهید آموخت.

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

در صورتی که مایلید هنگام بوت گزینه‌هایی را به سیستم‌عامل ارسال نمایید، هنگام بوت کلیدهای Ctrl+X را فشار دهید. اعلان بوت متنی مشابه زیر مشاهده خواهید کرد:

boot:

لیلو چند ثانیه صبر کرده و سپس اولین image بوت را برای بوت شدن انتخاب می‌کند. در صورتی که مایلید دوباره لیست پارتیشن‌های قابل بوت را مشاهده کنید، سریعا کلید Tab را فشار دهید. در اینصورت صفحه ای مشابه زیر مشاهده خواهید کرد:

LILO boot:

linux linux-up windowsxp

boot:

این مثال نشانگر وجود سه پارتیشن قابل بوت روی سیستم است که به ترتیب linux ، linux-up و windowxp نام دارند. دو گزینه اول نشانگر دو image بوت متفاوت هستند که با آنها می‌توانید پارتیشن لینوکس خود را بوت کنید. گزینه سوم نشاندهنده پارتیشن ویندوز XP می‌باشد. در صورتی که هیچ کلیدی را فشار ندهید، پس از چند ثانیه سیستم با استفاده از گزینه اول بوت خواهد شد. برای اینکه سیستم را وادار به بوت با پارتیشن دیگر کنید باید نام آنرا جلوی اعلان بوت تایپ کنید.

در صورتی که در سیستمتان چند image بوت نصب شده است، با فشردن کلید Shift لیلو از شما سوال خواهد کرد که با کدام image بوت شود. Image های موجود و سایر گزینه‌های لیلو در فایل پیکربندی etc/lilo.conf ذخیره شده‌اند.

آماده سازی فایل پیکربندی لیلو

لیلو اطلاعات مورد نیاز جهت پیدا کردن و بوت شدن از پارتیشن های قابل بوت را از فایل etc/lilo.conf بدست می‌آورد. بوسیله اضافه کردن گزینه‌هایی به این فایل، می‌توانید چگونگی بوت شدن سیستمتان را تغییر دهید. مثال زیر برخی از محتویات این فایل را نشان می‌دهد:

prompt

timeout=50

default=linux

boot=/dev/hda

map=/boot/map

install=/boot/boot.b

message=/boot/message

linear

image=/boot/vmlinuz-2.4.23

label=linux

initrd=/boot/initrd-2.4.23.img

read-only

root=/dev/hda6

append=”hdc=ide-scsi”

other=/dev/hda1

label=windowsxp

با گزینه prompt on اعلان بوت همیشه هنگام بوت سیستم نشان داده خواهد شد و نیازی نیست برای ظاهر شدن آن کلیدی را فشار دهید. زمان انتظار بوت در مثال بالا ۵۰ دهم ثانیه یا ۵ ثانیه است. سیستم قبل از شروع بوت این مدت را برای فشار داده شدن کلید منتظر مانده و در صورتی که هیچ کلیدی فشار داده نشود، با سیستم عامل پیش‌گزیده بوت خواهد شد. خط بوت نشاندهنده این است که پارتیشن قابل بوت در dev/hda قرار دارد (اولین دیسک سخت).

خط نقشه (map) نشاندهنده محل فایل نقشه که حاوی موقعیت های فایلهای image بوت است، می‌باشد. خط install نشان می‌دهد که فایل boot/boot.b به عنوان سکتور بوت جدید مورد استفاده قرار گرفته است. خط message به لیلو اعلام می‌کند که هنگام بوت محتویات فایل boot/messages را نشان دهد. خط linear باعث فعال شدن آدرس دهی خطی بجای آدرس دهی سکتور/هد/سیلندر می‌شود. این قابلیت در دیسکهای سخت اسکازی کاربرد دارد.

در فایل مثال بالا دو پارتیشن قابل بوت وجود دارند. نخستین آنها (image=/boot/vmlinuz-2.4.23) نشاندهنده یک image بوت است که به نام linux نامگذاری شده است. سیستم فایل ریشه برای آن image در آدرس dev/hda6 قرار دارد. واژه فقط-خواندنی (Read-Only) نشان می‌دهد که سیستم فایل ابتدا بصورت فقط خواندنی متصل شده و پس از بررسی شدن امکان خواندن/نوشتن روی آن فعال می‌شود. خط initrd نشاندهنده محل فایل image مربوط به دیسک RAM که برای بوت سیستم استفاده می‌شود، است.

پارتیشن دوم قابل بوت که در این مثال با واژه other مشخص شده است، در dev/hda1 قرار دارد و همانطور که از نام آن پیداست پارتیشن مربوط به ویندوز XP می‌باشد.

سایر image های قابل بوت نیز می‌توانند به این فایل اضافه شوند. شما می‌توانید یک image جدید نصب کرده و با تغییر فایل پیکربندی لیلو آنرا فعال کنید.

پس از اینکه تغییرات مورد نظر خود را در این فایل اعمال کردید، باید دستور lilo را اجرا کنید تا تغییرات اعمال شوند. همانطور که قبلا گفته شد، داشتن چند فایل image هنگامی لازم است که می‌خواهید از چند هسته مختلف که دارای قابلیت‌های متفاوتی هستند بطور همزمان استفاده نمایید. مراحل تغییرات در فایل پیکربندی لیلو بصورت زیر است:

۱.فایل image جدید را از دایرکتوری که ایجاد شده است (مثلا usr/src/linux/arch/i386/boot) به دایرکتوری boot کپی کنید. سـپـس اـین فـایل را طـوری نـامگذاری کنید که نشاندهنده محتویات آن باشد. مثلا zImage-2.6test11 .

۲.خطوط مربوط به این فایل را در فایل پیکربندی لیلو به نحوی اضافه کنید تا امکان انتخاب و بوت از طریق آن فراهم شود :

image=/boot/zImage-2.6test11

label=newlinux

۳. در حالی که با کاربر ریشه به سیستم وارد شده اید دستور lilo -t را اجرا کنید تا تغییرات داده شده آزمایش شده و صحت آنها تایید شود.

۴. دستور lilo را بدون هیچ سوئیچ و گزینه‌ای اجرا کنید تا تغییرات اعمال شوند.

برای اینکه کامپیوتر با فایل image جدید بوت شود، در صفحه آغازین لیلو، newlinux را انتخاب نمایید و یا جلوی اعلان بوت نام newlinux را تایپ کنید. اگر احساس می‌کنید که زمان انتظار ۵ ثانیه مدت کمی است، می‌توانید با افزایش عدد انتظار به ۱۰۰ مدت زمان انتظار را به ۱۰ ثانیه افزایش دهید.

گزینه هایی که شما می‌توانید در فایل پیکربندی لیلو استفاده کنید، به سه دسته گزینه‌های سراسری (Global)، گزینه‌های Per-image و گزینه‌های هسته (Kernel) تقسیم شده‌اند. مستندات زیادی برای لیلو تهیه شده است. برای کسب اطلاعات بیـشـتر در مورد گـزیـنه‌هـایـی کــه ایـنـجا شـرح داده شـده اند و سایر گـزیـنـه‌هـا مـی‌توانـیـد از راهنـمـای لـیـلـو (دستور man lilo.conf) و یا مستندات موجود در usr/share/doc/lilo/doc استفاده کنید.

در زیر چند مثال برای گزینه‌های سراسری ارائه شده است. گزینه‌های سراسری این ویژگی را دارند که تاثیر خود را بر تمام لیلو اعمال می‌کنند و فقط بر یک image خاص تاثیر ندارند.

از گزینه default می‌توانید برای مشخص کردن پارتیشن یا image پیش گزیده برای بوت شدن استفاده کنید. برای مثال:


default = newlinux

از گزینه delay می توانید برای تعیین زمان انتظار لیلو استفاده کنید. توجه داشته باشید که زمان وارد شده به دهم ثانیه می‌باشد. یعنی عدد ۵۰ نشانگر ۵ ثانیه است:

delay = 50


برای تغییر پیامی که قبل از اعلان لیلو قرار دارد، می‌توانید پیامی را در فایلی ذخیره کرده و با افزودن گزینه message به فایل پیکربندی لیلو، آنرا فعال نمایید:

message=/boot/boot.message

تمام گزینه‌های Per-image بوسیله یک خط image که نشان دهنده یک هسته لینوکس است، یا other که نشاندهنده یک سیستم عامل دیگر – مانند ویندوز XP است، شروع می‌شوند. این گزینه‌ها تنها بر روی همان هسته یا سیستم عامل تاثیر دارند. برخی گزینه های Per-image عبارتند از:

- Label : این گزینه نشان دهنده نامی است که شما در لیست لیلو مشاهده می‌کنید. امکان استفاده از نام‌های با فاصله وجود ندارد.

- lock : ضبط خودکار، خط فرمان بوت را برای دریافت سایر گزینه‌های بوت فعال می‌کند.

- alias=name : با جایگزین کردن name بجای هر نامی می‌توانید از آن به عنوان جایگزین نامی که در label تایپ کرده‌اید استفاده کنید.

- password=password : می‌توانید image یا سیستم عامل مورد نظر را با کلمه عبور محافظت کنید. برای این کار جلوی گزینه password کلمه عبور مورد نظر خود را تایپ کنید.

- restricted : این گزینه به همراه گزینه password بکار می‌رود. در صورتی که آنرا بکار ببرید تنها هنگام ارسال گزینه به هسته از شما کلمه عبور درخواست خواهد شد.

همچنین برای هسته لینوکس گزینه‌های خاصی وجود دارند. این گزینه‌ها به شما امکان انجام کارهایی مانند شناساندن برخی سخت افزارها، کنترل چگونگی اتصال سیستم فایل ریشه و ... را می‌دهند. برخی از گزینه های مخصوص هسته لینوکس عبارتند از :

- append : پس از این گزینه اطلاعاتی که می‌خواهید به هسته ارسال کنید را تایپ نمایید. این اطلاعات می‌تواند مانند اطلاعات سخت افزاری یاشد که برای شناساندن یک سخت افزار خاص به سیستم‌عامل بکار می‌روند.

- ramdiak : با این گزینه می‌توانید سایز دیسک رمی که هنگام بوت تشکیل می‌شود را تعیین کنید تا بجای مقدار پیش‌گزیده هسته بکار رود.

- read-only : سیستم فایل ریشه را بصورت فقط-خواندنی متصل می‌کند. سیستم فایل ریشه در حالت عادی پس از چک شدن، بصورت خواندن-نوشتن متصل می‌شود.

- read-write : سیستم فایل ریشه را بصورت خواندن-نوشتن متصل می‌کند.


تغییر مدیر بوت کامپیوتر

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

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

۲. بصورت کاربر ریشه به سیستم وارد شده و در یک پنجره ترمینال دستور زیر را تایپ کنید:

# lilo

با تایپ این دستور رکورد بوت اصلی مجددا نوشته شده و لیلو فعال خواهد شد.

۳. کامپیوتر خود را راه اندازی کنید. اکنون باید صفحه آغازین لیلو را مشاهده کنید.

در صورتی که می‌خواهید برعکس این کار را انجام دهید، یعنی گراب را به جای لیلو فعال کنید، مراحل زیر را انجام دهید:

۱. فایل پیکربندی گراب را مطابق آنچه در بالا گفته شد تنظیم کنید.

۲. باید نام دیسکی که می‌خواهید گراب را در آن نصب کنید، بدانید. مثلا اگر می‌خواهید گراب را در رکورد بوت اصلی دیسک سخت اول نصب کنید، باید بصورت کاربر ریشه وارد سیستم شده و دستور زیر را تایپ کنید:

# grub -install /dev/hda

رکورد اصلی بوت مجددا نوشته شده و اکنون می‌توانید از گراب استفاده کنید.

۳. کامپیوتر خود را راه اندازی کنید. اکنون باید صفحه آغازین گراب را مشاهده کنید.

زبان برنامه‌نویسی D بخش ششم

نحوه برقراری ارتباط اشیای دارای جمع آوری زباله با کد بیرونی

جمع آور زباله در سگمنت داده ایستا ، پشته ها و محتویات رجیستر هر thread ، به دنبال ریشه ها می گردد . اگر تنها ریشه یک شیئ بیرون از آنها باشد ، جمع آور زباله آن را از بین می برد و حافظه را آزاد می‌سازد .

برای اجتناب از این واقعه باید :

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

    ۲.به شیئ مجدداً توسط تخصیص دهنده کد خارجی یا کتابخانه های زمان اجرای C یعنی malloc/ free ، حافظه تخصیص دهیم .

اشاره گرها و جمع آور زباله

الگوریتم های جمع آوری زباله بستگی دارد به اشاره گرهایی که به چیزی در حال اشاره ‌اند و غیر اشاره‌گرها که به چیزی اشاره نمی کرده اند . بدین منظور دستورات زیر که در C غیر معمول نیستند باید به دقت در D از آنها خودداری شود :

۱. اشاره گرها را با xor کردن آنها با مقادیر دیگر مخفی نکنید مانند اشاره گر xor شده حقه‌ی لیست پیوندی در C . از حقه‌ی xor برای جا به جا کردن مقادیر دو اشاره گر استفاده نکنید .

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

۳. از مزیت هم ترازی اشاره گرها برای ذخیره فلگهای بیتی در بیتهای سطح پائین یا بیتهای سطح بالا استفاده نکنید .

۴. مقادیر صحیح را در اشاره گرها نگهداری نکنید .

۵. مقادیر جادویی را در اشاره گرها ذخیره نکنید به غیر از null .

۶. اگر شما باید یک مکان نگهداری خاص را بین انواع اشاره گر و غیر اشاره‌گر به اشتراک بگذارید از union استفاده کنید تا جمع آور زباله تکلیف خودش را در آن مورد بداند .

در حقیقت تا جایی که می شود از اشاره گرها استفاده نکنید . D دارای امکاناتی مانند اشیاء مرجع ، آرایه های پویا و جمع آوری زباله است که نشان می دهد که اغلب اشاره گرهای آشکارا ، متروک و بلااستفاده خواهند بود . اشاره گرها برای ارتباط موفق با API های C و بعضی کارهای کیمیاگرانه در D فراهم شده اند .

ساختمانها و یونیون ها

نحوه اعلان :

Tag { DeclDefs }
Tag Identifier { DeclDefs }
Tag Identifier ;
Tag: struct / union

شبیه C کار می کنند با تفاوتهای زیر :

۱. بدون فیلد های بیت

۲. نحوه آرایش به طور آشکار قابل مشخص کردن است .

۳. اعلان هایی مانند ; struct ABC x ،مجاز نیستند بنویسید ; ABC x .

۴. ساختمانها یا یونیون های بی نام می توانند عضوی از ساختمانها یا یونیون های دیگر باشند .

۵. انتساب دهنده های پیش فرض اولیه برای اعضا پشتیبانی می شود .

۶. توابع عضو و اعضای استاتیک مجاز است .

ساختمانها و یونیون ها به معنی اجتماع ساده داده ها یا راهی برای رنگ و آب دادن به یک ساختمان داده می باشد ، علاوه بر سخت افزار یا یک نوع خارجی ، انواع خارجی می توانند توسط API سیستم عامل یا یک فرمت فایل تعریف شوند . خصوصیات شیئ گرا نیز با نوع داده کلاس فراهم شده اند .



انتساب اولیه استاتیک ساختمان ها

به اعضای ساختمان استاتیک به طور پیش فرض مقدار صفر انتساب داده می شود و به مقادیر ممیز شناور مقدار NAN . اگر یک انتساب دهنده اولیه‌ی استاتیک فراهم شود ، اعضا به وسیله نام عضو ، علامت ':' و املای دستور ، انتساب اولیه می شوند . در ضمن ممکن است اعضا به هر نحو انتساب اولیه شوند .

struct X { int a; int b; int c; int d = 7;}
static X x = { a:1, b:2}; // c is set to 0, d to 7
static X z = { c:4, b:5, a:2 , d:5}; // z.a = 2, z.b = 5, z.c = 4, d = 5<DD DIR="RTL" STYLE="margin-bottom: 0.5cm; text-align: right"> انتساب اولیه‌ی استاتیک یونیون ها

یونیون ها به طور آشکار مقدار دهی اولیه می شوند :

union U { int a ; double b ; }
static U u = { b : 5.0 } ; // u.b = 5.0

دیگر اعضای یونیون که انتساب دهنده را جای می گذارند ولی فضای بیشتری اشغال می کنند مقدار صفر می گیرند .

Enums
اعلان :
EnumDeclaration:
enum identifier { EnumMembers }
enum { EnumMembers }
enum identifier ;


Enum کاربرد معمولی ماکروی define# در زبان C را برای تعریف مقادیر ثابت جایگزین میکند.

Enum ها همچنین می توانند بی نام باشند که در آن مورد به سادگی ثابت های مجتمع را تعریف می کنند و یا دارای نام باشند که مقدمه یک نوع جدید خواهند بود . اعلان زیر :

enum { A, B, C } // anonymous enum

مقادیر ثابت A=0 , B=1 , C=2 که معادل دستورات زیر است را تعریف میکند :

const int A = 0; const int B = 1; const int C = 2;

در حالی که اعلان زیر:

enum X { A, B, C } // named enum

نوع جدید X با مقادیر X.A=0 , X.B=1 , X.C=2 تعریف می کند.

Enum ها باید حداقل دارای یک عضو باشند . اگر برای یک عضو Enum یک عبارت ریاضی فراهم شده باشد ارزش عضو مذکور برابر حاصل عبارت است و عضو بعدی Enum دارای ارزش عضو قبلی به علاوه یک است . مثلاً در مورد زیر :

Enum { A , B = 5 + 7 , C, D = 8 , E }

داریم A = 0 , B = 12 , C = 13 , D = 8 , E = 9

صفات Enum

کوچکترین عضو min

بزرگترین عضو max

سایز نگهداری ارزش عضو size



مقدار دهی اولیه‌ی Enum :

در غیاب یک مقدار دهنده به صورت آشکار ، یک متغیر Enum دارای مقدار اولین عضو است .

Enum X { A = 3 , B,C }

مقدار X برابر 3 می شود .// ; X x

http://technotux.com


 

زبان برنامه نویسی D بخش پنجم

مقادیر واسطه ممیز شناور

در بسیاری کامپیوترها ،‌اعمال با دقت بالا بیشتر از اعمال با دقت کمتر وقت نمی گیرند .این باعث می شوند که مفاهیم شمارشی بالاترین دقت ممکن را برای اعمال داخلی موقتی به کار ببرند . فلسفه مورد بحث این نیست که زبان را به پائین مقسوم علیه سخت افزاری محدود کنیم بلکه آن را قادر به بهره‌برداری از بهترین توانایی های سخت افزار مورد نظر نماییم .

برای اعمال ممیز شناور و مقادیر واسطه دستورات یک دقت بالاتر می تواند به کار رود . تنها حد پایین دقت توسط نوع عملوندها مشخص می شود نه حد بالای آن . نکته پیاده سازی : در ماشین های اینتل x 86 برای نمونه انتظار می رود ( اما لازم نیست ) که محاسبات واسطه ای در دقت کامل هشتاد بیتی که توسط سخت افزار پیاده سازی می شود انجام شود .

امکان دارد که در مسیر استفاده از مقادیر موقت و زیر عبارات معمول ، کد بهینه شده یک جواب دقیقتر از کد بهینه نشده فراهم سازد .

الگوریتم ها باید طوری نوشته شود که براساس حداقل دقت محاسبات کار کند .‌ آنها نباید در مواقعی که دقت واقعی بالاتر است افت عملکرد یابند یا شکست بخورند . انواع double یا float برخلاف نوع گسترش یافته فقط باید در موارد زیر به کار رود :

    ۱. کاهش مصرف حافظه برای آرایه های بزرگ .

    ۲. داده ها و آرگومان های توابع سازگار با C .

<DD DIR="RTL" STYLE="margin-bottom: 0.5cm; text-align: right">

انواع موهومی و مختلط

در زبان های موجود ، یک تلاش عجیب برای به زور جا دادن انواع مختلط در تسهیلات تعریف نوع موجود مانند قالب ها ،‌ساختمان ها و … وجود داردو تمام این ها معمولاً در نهایت با شکست مواجه می‌شود.

شکست می خورند چون مفاهیم اعمال مختلط می تواند بسیار دقیق باشد و کامپایلر نمی داند که برنامه نویس در تلاش برای انجام چه کاری است بنابراین نمی تواند پیاده سازی معنایی را بهینه نماید .

تمام این کارها برای اجتناب از اضافه کردن یک نوع جدید انجام شده است . اضافه کردن یک نوع جدید بدین معناست که کامپایلر می تواند تمامی مفاهیم اعمال مختلط را دقیق پیاده کند . پس برنامه نویس می تواند بر یک پیاده سازی صحیح ( یا حداقل دارای ثبات ) اعداد مختلط اعتماد کند .

همراه بودن با یک بسته نوع مختلط برای یک نوع موهومی مورد نیاز است .یک نوع موهومی برخی از پیامدهای ظریف معنایی را حذف می کند و کارآیی را بهبود می بخشد بدون اینکه مجبور به انجام اعمال اضافی روی قسمت حقیقی واضح صفر ، باشیم . الفاظ موهومی دارای یک پسوند i می باشند .

imaginary j = 1.3 i ;

هیچ املای خاص برای نوع مختلط وجود ندارد فقط یک نوع حقیقی و موهومی را با هم جمع کنید :

complex c= 4.5 + 2i ;

افزودن دو نوع جدید به زبان کافی است از این رو انواع مختلط و موهومی دارای دقت توسعه یافته هستند . هیچ نوع اعشاری مختلط و موهومی یا نوع دابل مختلط یا موهومی وجود ندارد ( توجه : راه برای افزودن آنها در آینده باز است ) .

اعداد مختلط دارای دو صفت خاصه هستند :

قسمت حقیقی را به عنوان گسترش یافته بدست می دهد // .re
قسمت موهومی را به عنوان عدد موهومی بدست می دهد // .im
برای مثال :‌

c . re is 4.5

c . im is 2i



کنترل گرد کردن

حسابگر ممیز شناور IEEE 754 شامل توانایی تنظیم کردن چهار روش گرد کردن است . D املایی خاص برای دسترسی به آنها افزوده است : [ blah , blah , blah ]



پرچمهای استثناء

حسابگر ممیز شناور IEEE 754 می تواند پرچمهای مختلف را براساس آن چه در یک محاسبه رخ داده است تنظیم نماید : [ blah , blah , blah ]. این پرچمها می توانند به وسیله املای زبان SET / Reset شوند .



مقایسه های ممیز شناور

علاوه بر عملگرهای مقایسه معمولی < , < = , > , >= , == , != زبان D تعداد بیشتری که خاص اعداد ممیز شناور است اضافه می کند .

مدیریت حافظه

هر برنامه غیر جزیی نیاز به تخصیص و آزاد سازی حافظه دارد . هر چه پیچیدگی ، اندازه و کارآیی برنامه ها افزایش می یابد تکنیکهای مدیریت حافظه مهمتر می شوند . D اختیارات متعددی در زمینه مدیریت حافظه پیشکش می کند .



سه روش پایه تخصیص حافظه در D :

۱. داده استاتیک : در سگمنت داده پیش فرض تخصیص می یابند .

۲. داده پشته : در پشته برنامه CPU تخصیص می یابند .

۳. داده زباله جمع آوری شده :‌ به صورت پویا در heap جمع آوری زباله تخصیص می یابند .

قسمت بعدی تکنیک ها را برای استفاده از آنها توضیح می دهد به همراه برخی قابلیت های پیشرفته:

رشته ها ( و آرایه ها ) copy – on – write

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

char [] toupper ( char [] s ) {
int i ;
for ( i =0 ; i < s . length ; i ++ ){
char c = s[i];
if ('a' <= c && c <= 'z')
s[i] = c - (cast(char)'a' - 'A');
}
return s;
}

توجه کنید که نسخه []S که فراخوانی شد تغییر هم کرد شاید این اصلاً آن چیز مورد توقع نبود یا بدتر آنکه []S ممکن است تکه ای از حافظه فقط خواندنی باشد .

اگر یک کپی از S همواره توسط تابع ساخته می شد به طور ناکارا و بدون لزوم ،زمان و حافظه برای حروفی که خودشان بزرگ هستند مصرف می شد .

راه حل پیاده سازی copy – on – write است که یعنی یک کپی ساخته می شود فقط اگررشته ها نیاز به تغییر دارند . بعضی زبان های پردازنده رشته ها این عمل را به عنوان پیش فرض انجام می دهند اما هزینه بسیار سنگین است .

در نتیجه آن رشته “abcdwF” پنج مرتبه بوسیله تابع کپی می شود. برای اینکه از این قرارداد به نحوی با حداکثر کارآیی استفاده شود باید به صورت واضح در کد ظاهر شود .

char [] toupper (char [] s) {
int changed ;
int i ;
changed = 0 ;
for (i=0 ; i <s.length ; i ++ ){
char c = s[i ] ;
if (‘a’ <= c && c<= ‘z’ ){
if ( ! changed ){
char [] r = new char [ s.length] ;
r []= s ;
changed = 1 ;
}
s [i] = c – ( cast ( char ) ‘a’ – ‘A’ );
}
}
return s ;
}

copy – on – write پروتکلی است که به وسیله توابع پردازش آرایه ها در کتابخانه ی زمان اجرای phibo زبان D پیاده سازی شده است .



جمع آوری زباله

D زبانی دارای جمع آوی زباله کامل می باشد . بدین معنی که هیچ وقت نیاز به آزادسازی حافظه نیست . فقط به هنگام نیاز حافظه را تخصیص دهید و جمع آور زباله به طور دوره ای تمام حافظه بی استفاده را به توده حافظه آزاد برمی گرداند .

برنامه نویسان C ++ , C که به کنترل دستی حافظه هنگام تخصیص و آزاد سازی آن عادت دارند احتمالاً به مزایا و تأثیر جمع آوری زباله یقین ندارند . تجربه‌ی پروژه های جدید که با در نظر گرفتن جمع آوری زباله نوشته شده اند همچنین پروژه های موجود که به سبک جمع آوری زباله برگردانده شده اند نشان می دهد که :

    ۱. برنامه های دارای جمع آور زباله سریعتر هستند . این واضح است اما دلایلی قابل بیان است .

    ۲. شمارش در جاعات یک روش معمول برای حل مسائل تخصیص حافظه آشکار است . کد پیاده سازی اعمال اضافه و تفریق هر جا که انتساب صورت می گیرد یکی از دلایل کندی است .

    ۳.پنهان کردن کد مذکور در پس کلاسهای اشاره گر هوشمند به افزایش سرعت کمک نمی کند . ( روش شمارش ارجاعات به هیچ وجه راه حل عمومی نیست جایی که ارجاعات حلقه ای هرگز حذف نمی شوند . )

    ۴. مخرب های کلاس برای آزادسازی منابع مورد نیاز یک شیئ به کار می رود . برای اغلب کلاسها این منابع ، حافظه تخصیص یافته است . با جمع آوری زباله اغلب مخرب ها خالی می شوند و در نهایت می توانند دور انداخته شوند .

    ۵. تمام مخرب هایی که حافظه را آزاد می کنند می توانند معنی دار شوند در مواقعی که اشیاء ، بر روی پشته تخصیص حافظه می یابند . برای هر کدام مکانیزمی باید در نظر گرفته شود طوری که اگر یک استثناء رخ داد تمام مخربها از هر چارچوب فراخوانی شوند تا هر حافظه تخصیص یافته برای آنها را رها کنند . اگر مخرب ها نامربوط شوند هیچ نیازی برای در نظر گرفتن چارچوب های خاص پشته برای پردازش استثناها نیست در نتیجه کد سریعتر اجرا می شود .

    ۶. تمام کدهای لازم برای مدیریت حافظه می تواند برای تکامل جزیی اضافه شود . برنامه بزرگتر کمتر در حافظه اصلی و بیشتر آن در حافظه مجازی قرار می گیرد و آرامتر و کندتر اجرا می شود .

    ۷. جمع آور حافظه هنگامی صورت می گیرد که حافظه تنگ و کم شود . تا وقتی حافظه جا دارد برنامه در حداکثر سرعت ممکن اجرا میشود و هیچ وقتی برای آزاد کردن حافظه ، صرف نمی کند .

    ۸.جمع آورنده های زباله مدرن ، اکنون به مراتب پیشرفته تر و سریع تر هستند . جمع آورنده های تولید کننده و کپی کننده ، قسمت عمده ناکارایی الگوریتم های جارو کردن و اختصاص دادن را حذف می کنند .

    ۹.جمع آورنده های زباله مدرن فشرده سازی توده حافظه را انجام می دهند . فشرده سازی توده مراقب است که تعداد صفحاتی که به طور فعال به وسیله یک برنامه ارجاع شده اند را کاهش دهد بدین معنی که دسترسی های حافظه احتمالاً بیشتر به حافظه می رسند تا به مبادله حافظه .

    ۱۰. جمع آورنده های زباله حافظه استفاده شده را اصلاح می کنند . بنابراین به رخنه های حافظه - که باعث می شوند برنامه های با اجرای طولانی مدت آن قدر حافظه مصرف کننده تا سیستم هنگ کند- تن در نمی دهد .

    ۱۱. برنامه های دارای جمع آور زباله دارای اشکالات کمتر یافتن اشاره گرها می باشند به این خاطر که هیچ ارجاع سرگردان به حافظه آزاد شده نمی ماند .

    ۱۲. برنامه های دارای جمع آور زباله برای گسترش و اشکال زدایی سریعترند . چون هیچ نیازی برای گسترش ، اشکال زدایی ، امتحان ، یا ابقاء کد آزاد سازی حافظه دستی وجود ندارد .

    ۱۳. برنامه های دارای جمع زباله به طور معنی داری کوچکترند چون هیچ کد آزادسازی حافظه وجود ندارد و از این رو نیازی به پردازشگرهای استثناها برای آزاد سازی حافظه وجود ندارد .

    جمع آوی زباله یک نوشداروی همه کاره نیست بعضی اشکالات هم دارد :

    ۱. وقتی یک مجموعه برنامه همزمان اجرا می شود قابل پیشگویی نیست بنابراین برنامه به طور دلخواه می تواند مکث کند.

    ۲. زمانی که برای اجرای یک مجموعه مصرف می شود نامحدود است با اینکه در عمل بسیار کوتاه است اما ضمانتی وجود ندارد .

    ۳. تمام رشته های اجرا به غیر از رشته جمع آوری زباله در حالی که جمع آوری در جریان است باید مکث کند .


http://technotux.com

زبان برنامه نویسی D بخش چهارم



کنترل های زمان کامپایل

۱. کنترل نوع قوی تر

۲. مقدار دهی اولیه به صورت واضح مورد نیاز است

    ۳. مجاز نبودن متغییرهای محلی به کار نرفته

    ۴. عدم ' ; ' تکی در بدنه حلقه ها

    ۵. عمل انتساب ،مقادیر بولی بر نمی گرداند.

    ۶. از رده خارج کردن API های متروک


کنترل زمان اجرا

    ۱. عبارات اثبات صحت ( )assert

    ۲. کنترل مرزهای آرایه

    ۳. case تعریف نشده در استثنای switch

    ۴. استثنای تجاوز از اندازه حافظه

    ۵. ورودی ، خروجی و طراحی یکسان کلاس به وسیله کنتراکت


سازگاری

تقدم عملگر و قوانین سنجش

D عملگرهای C و قوانین تقدم آنها را حفظ می کند همچنین ترتیب قوانین سنجش و قوانین تقدم . این از اشکالات ریز که از ابتدای برنامه نمایان می شود جلوگیری می کند .


دسترسی مستقیم به API های C

نه تنها D نوع داده های مطابق با C دارد همچنین دسترسی مستقیم به توابع C را فراهم می سازد . هیچ نیازی به نوشتن توابع بسته بندی شده یا کدی برای کپی کردن اجزای متراکم یک توده به صورت یک به یک نیست.



پشتیبانی از تمام نوع داده های C

ارتباط با هر API زبان C و یا کد کتابخانه ای C ممکن است . این پشتیبانی تمام انواع C 99 را در بر می گیرد . D شامل توانایی صف بندی اعضای ساختمان برای مطمئن شدن از سازگاری با فرمتهای داده خارجی می باشد.

پردازش استثنای سیستم عامل

مکانیسم پردازش استثناهای D متصل به روشی است که سیستم عامل در سطح زیرین استثناها را در یک برنامه کاربردی پردازش می کند .



کنترل پروژه

نسخه سازی

D . D تکنیک if# و

نبود هشدار

کامپایلرهای D هشدارهایی برای کدهای نامطمئن تولید نمی کنند . کد یا توسط کامپایلر قابل قبول است یا نیست . این خصوصیت هر گونه بحثی در این زمینه که آیا هشدار خطایی صحیح است یا نه و نیز هر بحثی در این باره که با آن هشدار چه کنیم را از بین می برد . نیاز برای هشدار کامپایلر نشانه‌ی طراحی ضعیف زبان است .

استهلاکDeprecation

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

نمونه برنامه D غربال اراتستن (تست اعداد اول):

import c.stdio ;
bit [8191] flags ;
int main (){
int i , count , prime , k , iter ;
print f(“ 10 iterations ” );
for ( iter = 1 ; iter<=10 ; iter ++ ) {
count = 0 ;
flags [ ] = 1 ;
for ( i = 0 ; i < flags . length ; i ++ ){
if ( flags [i] ) {
prime = i + i +3;
k = i + prime;
while ( k < flags . Length ) {
flags , [ k] = 0 ;
k + = prime ;
}
count + = 1;
}
}
}
print f ( “ % d primes” , count ) ;
return 0 ;
}