مدیر سیستمهای شرکت فالکوت، مانند سایر مدیر سیستمهای خدمات بزرگ IT، به ابزاری نیاز دارند که فرآیند نصب (یا بازنصب) ماشینهای خود را در کمترین زمان و در صورت ممکن به صورت خودکار انجام دهند.
این نیازمندیها توسط طیف گستردهای از راه حلها برطرف میشوند. از یک طرف ابزار عمومی مانند SystemImager با ایجاد یک تصویر از ماشین نمونه، آن را روی ماشینهای هدف گسترش میدهد؛ از طرف دیگر، نصب کننده دبیان این قابلیت را دارد که با استفاده از یک فایل پیکربندی خاص به پرسشهای مطرح شده طی فرآیند نصب به صورت خودکار پاسخ دهد. به عنوان یک راه حل ترکیبی، ابزاری مانند FAI، که مخفف Fully Automatic Installer است، ماشینها را با استفاده از سیستم بستهبندی نصب، اما از زیرساخت خود به منظور فرآیندهای پیچیدهتر مانند راهاندازی، پارتیشنبندی و پیکربندی استفاده میکند.
هر یک از این راه حلها نقاط ضعف و قوت خود را دارند: SystemImager مستقل از سیستمهای بستهبندی کار میکند که این امر به مدیریت مجموعهای بزرگ از ماشینها با توزیعهای مختلف لینوکس منجر میشود. همچنین شامل یک سیستم بروزرسانی است که نیازمند نصب مجدد نمیباشد، اما این سیستم تنها در صورتی قابل اعتماد خواهد بود که هیچ از یک ماشینهای زیر مجموعه آن به تنهایی تغییر نکرده باشند؛ به عبارت دیگر، کاربر نباید نرمافزاری را بروزرسانی یا نصب کند. به همین شکل، بروزرسانیهای امنیتی نباید به صورت خودکار صورت پذیرند، چرا که باید توسط یک تصویر مرجع و مرکزی از SystemImager مدیریت شوند. این راه حل نیازمند یکپارچه بودن ماشینهای هدف از نقطه نظر معماری رایانه است، در غیر اینصورت از تصاویر بسیار گوناگونی برای مدیریت آن باید استفاده شود (یک تصویر i386 با ماشین powerpc سازگار نیست).
از طرف دیگر، یک نصب خودکار با استفاده از debian-installer میتواند با توجه به نیاز هر ماشین تغییر یابد: برنامه نصب کننده کرنل و بستههای نرمافزاری مناسب را از مخازن خود دریافت، سختافزار موجود را شناسایی، تمام هارد دیسک را به منظور استفاده بهینه از فضا پارتیشنبندی، سیستم مورد نیاز دبیان را نصب و یک راهانداز مناسب را تنظیم میکند. اگرچه، نصبکننده استاندارد تنها نسخههای استاندارد دبیان را همراه با سیستم پایه و مجموعهای از “وظایف” انتخابی را نصب میکند؛ اینکار از نصب یک سیستم به خصوص همراه با برنامههای بستهبندی نشده جلوگیری میکند. برای رفع این نیازهای خاص نیاز به سفارشیسازی نصب کننده است... خوشبختانه، نصب کننده بسیار ماژولار بوده و ابزارهایی برای خودکارسازی این فرآیند سفارشیسازی وجود دارند، به خصوص simple-CDD که مخفف Custom Debian Derivative است. این ابزار، با این حال تنها بخش اولیه فرآیند نصب را مدیریت میکند؛ این مشکل بزرگی نخواهد بود چرا که ابزار APT امکان گسترش بهینه بروزرسانیها را فراهم میکنند.
به منظور تمرکز روی debian-installer و simple-CDD، تنها به بررسی کوتاه FAI میپردازیم و ابزار SystemImager را نادیده میگیریم (که دیگر در دبیان وجود ندارد)، چرا که این ابزارها در محیط دبیان بسیار متداول هستند.
12.3.1. نصبکننده تمام خودکار (FAI)
نصبکننده تمام خودکار احتمالا قدیمیترین سیستم گسترش خودکار برای دبیان باشد، که جایگاه آن به عنوان یک مرجع را مشخص میکند؛ اما طبیعت بسیار سازگار آن به نوعی پیچیدگیهای درونیاش را جبران میکند.
FAI نیازمند یک سیستم سرور به منظور نگهداری از اطلاعات راهاندازی برای ماشینهای است که قصد دارند از طریق شبکه به آن متصل گردند. این سرور نیازمند بسته fai-server (یا fai-quickstart، که عناصر مورد نیاز برای یک پیکربندی استاندارد را گردآوری میکند) است.
FAI از یک رویکرد مشخص برای تعریف پروفایلهای قابل نصب استفاده میکند. بجای رونوشتگیری ساده از یک مرجع قابل نصب، FAI یک نصبکننده تمام عیار است، که با استفاده از مجموعه فایلها و اسکریپتهای ذخیرهشده در سرور قابل پیکربندی میباشد؛ مکان پیشفرض /srv/fai/config/
به صورت خودکار ایجاد نمیشود، پس مدیر سیستم در کنار سایر فایلها باید آن را ایجاد کند. در اکثر موارد، این فایلها توسط نمونههایی که در بسته مستندات fai-doc وجود دارد سفارشیسازی میشوند، به خصوص دایرکتوری /usr/share/doc/fai-doc/examples/simple/
.
زمانی که پروفایلها تعریف شوند، دستور fai-setup
عناصر مورد نیاز نصبکننده FAI را تولید میکند؛ اینکار اغلب به معنی آمادهسازی یا بروزرسانی یک سیستم حداقلی (NFS-root) در حین فرآیند نصب است. گزینه جایگرین آن ایجاد یک CD قابل اجرا با استفاده از fai-cd
است.
ایجاد تمام این فایلهای پیکربندی نیازمند درک درستی از چگونگی عملکرد FAI میباشد. یک فرآیند متداول نصب از گامهای زیر تشکیل شده است:
دریافت یک کرنل از شبکه و راهاندازی آن؛
اتصال فایل سیستم root از NFS؛
اجرای /usr/sbin/fai
، که باقی فرآیند نصب را کنترل میکند (از این رو گامهای بعدی توسط این اسکریپت فراخوانی میشوند)؛
رونوشتگیری فضای پیکربندی از سرور درون /fai/
؛
اجرای fai-class
. اسکریپتهای /fai/class/[0-9][0-9]*
به ترتیب اجرا میشوند و نام “کلاسهای” منطبق با ماشین مورد نظر میباشند را بر میگردانند؛ از این اطلاعات برای ادامه فرآیند نصب استفاده میشود. اینکار موجب انعطافپذیری در تعریف سرویسهای مورد نیاز برای نصب و پیکربندی میشود.
دریافت تعدادی از متغیرهای پیکربندی، با توجه به کلاسهای مربوطه؛
پارتیشنبندی دیسکها و فرمت کردن پارتیشنها، بر اساس اطلاعات فراهم شده در /fai/disk_config/class
؛
اتصال پارتیشنهای مذکور؛
نصب سیستم پایه؛
گردآوری پایگاهداده Debconf با استفاده از fai-debconf
؛
دریافت فهرست بروزرسانیهای موجود برای APT؛
نصب بستههای فهرست شده در /fai/package_config/class
؛
اجرای اسکریپتهای پس از پیکربندی، /fai/scripts/class/[0-9][0-9]*
؛
ثبت گزارشهای نصب، قطع اتصال پارتیشنها و راهاندازی مجدد.
12.3.2. گردآوری debian-installer
در انتها، بهترین ابزار برای نصب سیستمهای دبیان به طور منطقی باید نصبکننده رسمی دبیان باشد. به همین دلیل است، که از ابتدای آن، debian-installer برای کاربرد خودکاری سازی طراحی شده است که از زیرساخت فراهم شده توسط debconf استفاده میکند. گزینه دوم، از یک طرف امکان کاهش تعداد پرسشهای مطرح شده را فراهم میکند (پرسشهای پنهان با پاسخهای پیشفرض جواب داده میشوند)، از طرف دیگر پاسخهای پیشفرض به صورت جداگانه ارائه میشوند، به این منظور که فرآیند نصب به صورت غیر-تعاملی انجام شود. این ویژگی آخر به نام preseeding شناخته میشود.
12.3.2.1. استفاده از یک فایل Preseed
مکانهای مختلفی وجود دارد که یک نصبکننده میتواند فایل preseed را دریافت کند:
در initrd که برای راهاندازی ماشین استفاده شده است؛ در این مورد، عملیات preseed در ابتدای فرآیند نصب صورت میگیرد و تمام پرسشها میتوانند نادیده گرفته شوند. این فایل باید بنام preseed.cfg
در اولین سطح دایرکتوری initrd قرار گیرد.
در رسانه راهاندازی (مانند CD یا USB)؛ عملیات preseed به محض اتصال رسانه صورت میگیرد، یعنی درست پس از پرسشهای مربوط به زبان و ساختار صفحه کلید. پارامتر راهاندازی preseed/file
میتواند برای شناسایی مکان فایل preseed (برای نمونه، /cdrom/preseed.cfg
در هنگام نصب از CD-ROM یا /hd-media/preseed.cfg
در هنگام نصب از USB) مورد استفاده قرار گیرد.
از طریق شبکه؛ عملیات preseed پس از پیکربندی (خودکار) شبکه صورت میگیرد؛ پارامتر راهاندازی مرتبط با آن عبارت است از preseed/url=http://server/preseed.cfg
.
در یک نگاه، قرار دادن فایل preseed درون initrd ممکن است جالبترین گزینه به نظر آید؛ اگرچه، کمتر از این حالت استفاده میشود چرا که ایجاد یک initrd قابل نصب بسیار دشوار است. دو راهکار جایگزین دیگر، بیشتر متداول هستند، به خصوص که پارامترهای راهاندازی روشی دیگر برای آمادهسازی پاسخها به اولین پرسشهای فرآیند نصب را فراهم میکنند. روش مرسوم برای ذخیرهسازی این پارامترهای راهاندازی و جلوگیری از نوشتن هر کدام در زمان نصب، قرار دادن آنها در پیکربندی مرتبط با isolinux
(در مورد CD-ROM) یا syslinux
(در مورد USB) است.
12.3.2.2. ایجاد یک فایل Preseed
یک فایل preseedاز نوع متنی است که در هر خط آن پاسخ به یک پرسش از Debconf قرار دارد. هر خط به چهار فیلد که با فاصله (space یا tab) از یکدیگر جدا میشوند، تقسیم شده است. برای نمونه، در مورد d-i mirror/suite string stable
:
فیلد اول “مالک” پرسش به حساب میآید؛ “d-i” برای پرسشهایی استفاده میشود که مرتبط با فرآیند نصب هستند، اما میتواند در مورد نام بستههای موجود دبیان نیز بکار رود؛
فیلد دوم یک شناسه برای پرسش به حساب میآید؛
فیلد سوم نوع پرسش را مشخص میکند؛
فیلد چهارم و آخرین فیلد نیز پاسخ به پرسش را شامل میشود. به یاد داشته باشید که از فیلد سوم توسط یک space باید جدا شود؛ اگر بیش از یک فاصله بکار رود، به عنوان بخشی از پاسخ در نظر گرفته میشود.
سادهترین روش برای ایجاد یک فایل preseed نصب یک سیستم به صورت دستی است. سپس debconf-get-selections --installer
پاسخهای مرتبط با آن را فراهم میکند. پاسخهای مرتبط با سایر بستهها نیز توسط debconf-get-selections
گردآوری میشوند. اگرچه، راهکار بهتر در این مورد نوشتن فایل preseed به صورت دستی است، که از یک فایل نمونه و مستندات مرجع میتوان استفاده کرد: با چنین رویکردی، تنها پرسشهایی که پاسخهای پیشفرض داشته باشند میتوانند آمادهسازی شوند؛ استفاده از پارامتر راهاندازی priority=critical
به Debconf دستور میدهد که تنها به پرسشهای حیاتی پاسخ دهد و از پاسخهای پیشفرض برای سایر پرسشها استفاده کند.
12.3.2.3. ایجاد یک رسانه راهاندازی سفارشی
دانستن اینکه یک فایل preseed در کجا ذخیره شود خوب است، اما کافی نیست: مدیر سیستم باید به شیوهای رسانه راهاندازی نصب را تغییر دهد که پارامترهای راهاندازی تغییر کرده و فایل preseed به آن اضافه شود.
12.3.2.3.1. راهاندازی از طریق شبکه
زمانی که یک رایانه از طریق شبکه راهاندازی میشود، سروری که عناصر راهاندازی را ارسال میکند همچنین شامل پارامترهای راهاندازی نیز میباشد. بنابراین، تغییرات مورد نظر باید در پیکربندی PXE سرور راهاندازی اعمال شوند؛ به طور خاص، در فایل پیکربندی
/tftpboot/pxelinux.cfg/default
. برپایی راهاندازی شبکه برای اینکار یک پیشنیاز به حساب میآید: برای جزئیات بیشتر راهنمای نصب را مشاهده کنید.
12.3.2.3.2. آمادهسازی یک USB قابل اجرا
زمانی که یک حافظه قابل راهاندازی آمادهسازی شد (
قسمت 4.1.2, “راهاندازی از USB”
را مشاهده کنید)، برخی عملیات اضافی مورد نیاز است. فرض میکنیم که محتوای حافظه در
/media/usbdisk/
قرار دارد:
مثال 12.2. فایل syslinux.cfg و پارامترهای عملیات آمادهسازی
default vmlinuz
append preseed/file=/hd-media/preseed.cfg locale=en_US.UTF-8 keymap=us language=us country=US vga=788 initrd=initrd.gz --
12.3.2.3.3. ایجاد یک تصویر CD-ROM
یک حافظه USB از نوع رسانههای خواندنی-نوشتنی است، پس تغییر فایل در آن و افزودن پارامترها کار آسانی است. در مورد CD-ROM، این عملیات از پیچیدگی بیشتری برخوردار است چرا که نیازمند تولید مجدد تصویر ISO از آن میباشد. این وظیفه توسط debian-cd مدیریت میشود، اما استفاده از این ابزار برای اینکار مطلوب نیست: نیازمند یک mirror محلی و درک از گزینههای موجود در /usr/share/debian-cd/CONF.sh
است؛ حتی در این صورت، make
چندین بار باید فراخوانی شود. بنابراین مطالعه /usr/share/debian-cd/README
به شدت توصیه میگردد.
با این تفاسیر، debian-cd به شیوه مشابهی عمل میکند: یک دایرکتوری “image” همراه با محتوای دقیق از CD-ROM تولید، سپس با استفاده از ابزاری مانند genisoimage
، mkisofs
یا xorriso
به فایل ISO تبدیل میشود. دایرکتوری image پس از گام make image-trees
در debian-cd نهایی میگردد. در این نقطه، فایل preseed را درون دایرکتوری متناسب آن قرار میدهیم (معمولا $TDIR/$CODENAME/CD1/
، که پارامترهای $TDIR و $CODENAME توسط فایل پیکربندی CONF.sh
تعریف میشوند). CD-ROM از isolinux
به عنوان راهانداز خود استفاده میکند که فایل پیکربندی آن باید توسط آنچه که debian-cd تولید کرده است سازگار باشد، تا بتوان پارامترهای راهاندازی مورد نیاز را وارد کرد (فایل مشخص آن عبارت است از $TDIR/$CODENAME/boot1/isolinux/isolinux.cfg
). در انتها فرآیند “عادی” میتواند ادامه یابد و میتوان تصویر ISO را با استفاده از make image CD=1
(یا make images
در صورت نیاز به چندین CD-ROM) ایجاد کنیم.
12.3.3. Simple-CDD: یک راهکار جامع
استفاده از یک فایل preseed به تنهایی تمام پیشنیازهای فرآیندهای بزرگ توسعه را محقق نمیکند. با اینکه امکان اجرای چند اسکریپت در انتهای فرآیند نصب وجود دارد، مجموعه بستههایی که باید نصب گردند به سادگی قابل دسترس نمیباشند (معمولا، فقط “task” میتواند انتخاب شود)؛ مهمتر اینکه، این روش منجر به نصب بستههای رسمی از دبیان میشود و سایر بستههای محلی را نادیده میگیرد.
از طرف دیگر، debian-cd میتواند بستههای خارجی را یکپارچهسازی کند و debian-installer میتواند با درج گامهای جدید در فرآیند نصب توسعه یابد. با ترکیب این قابلیتها باید بتوانیم یک نصبکننده سفارشی را برای نیازهای خود ایجاد کنیم؛ همچنین باید قادر باشد برخی سرویسها را پس از نصب بستههای آنها پیکربندی کند. خوشبختانه، این یک حالت فرضی نیست، زیرا دقیقا کاری است که Simple-CDD (در بسته simple-cdd) انجام میدهد.
هدف Simple-CDD این است که هر فردی بتواند یک توزیع مشتق شده از دبیان را با انتخاب مجموعهای از بستههای موجود، پیکربندی آنها با Debconf، افزودن نرمافزار خاص و اجرای اسکریپتهای سفارشی در انتهای فرآیند نصب، ایجاد کند. این رویکرد با فلسفه “سیستم عامل جهانی” (شعار دبیان) سازگاری دارد، چرا که هر فردی میتواند آن را با نیاز خود سازگار سازد.
12.3.3.1. ایجاد پروفایلها
Simple-CDD “پروفایل” را تعریف میکند که با مفهوم “کلاس” در FAI سازگار هستند و یک ماشین میتواند چندین پروفایل داشته باشد (که در زمان نصب مشخص میشوند). یک پروفایل توسط مجموعه فایلهای profiles/profile.*
تعریف میشود:
فایل .description
شامل توضیح یک خطی درباره پروفایل است؛
فایل .packages
شامل بستههایی است که در صورت انتخاب شدن پروفایل به شیوه خودکار نصب میگردند؛
فایل .downloads
شامل بستههایی است که درون رسانه نصب ذخیرهسازی میشوند، اما الزامی در نصب آنها وجود ندارد؛
فایل .preseed
شامل اطلاعات آمادهسازی برای پرسشهای Debconf (برای نصبکننده و/یا بستهها) میباشد؛
فایل .postinst
شامل اسکریپتی است که در انتهای فرآیند نصب اجرا میشود؛
در انتها، فایل .conf
امکان تغییر برخی پارامترهای Simple-CDD را بر اساس پروفایلهای موجود در آن فراهم میکند.
پروفایل default
نقش ویژهای دارد چرا که همیشه انتخاب میشود؛ شامل حداقلهای مورد نیاز توسط Simple-CDD است. تنها موردی که در این پروفایل سفارشی میشود پارامتر آمادهسازی simple-cdd/profiles
است: امکان رد کردن پرسش، که توسط Simple-CDD، درباره پروفایل قابل نصب را فراهم میکند.
به یاد داشته باشید که دستورات باید از دایرکتوی والد profiles
فراخوانی شوند.
12.3.3.2. پیکربندی و استفاده از build-simple-cdd
Simple-CDD به پارامترهای بسیاری برای عملکرد جامع نیاز دارد. آنها اغلب درون یک فایل پیکربندی قرار دارند، که build-simple-cdd
میتواند با گزینه --conf
به آن اشاره کند، همچنین میتوانند با استفاده از پارامترهای انحصاری به build-simple-cdd
ارجاع شوند. در اینجا به این دستور و پارامترهای مورد نیاز آن نگاهی میاندازیم:
پارامتر profiles
فهرستی از پروفایلهای قابل اجرا در CD-ROM ایجاد شده را فهرست میکند؛
بر اساس فهرست بستههای مورد نیاز، Simple-CDD فایلهای متناسب با آنها را از سرور اشاره شده در server
دانلود کرده و آنها را درون یک mirror موقت قرار میدهد (که در ادامه به debian-cd داده میشود)؛
بستههای سفارشی موجود در local_packages
نیز درون همین mirror محلی قرار میگیرند؛
سپس debian-cd (درون یک مکان پیشفرض که میتواند با متغیر debian_cd_dir
پیکربندی شود) همراه با فهرستی از بستهها به منظور یکپارچهسازی اجرا میشود؛
زمانی که debian-cd دایرکتوری خود را آماده کند، Simple-CDD برخی تغییرات را در این دایرکتوری انجام میدهد:
فایلهایی که شامل پروفایلها هستند درون یک دایرکتوری زیر مجموعه simple-cdd
(واقع در CD-ROM نهایی) قرار میگیرند؛
سایر فایلهای فهرست شده در پارامتر all_extras
نیز افزوده میشوند؛
پارامترهای راهاندازی طوری تنظیم میشوند که عملیات preseed فعال گردد. در صورت ذخیرهسازی اطلاعات لازم در متغیرهای language
و country
، پرسشهای مربوط به زبان و کشور نادیده گرفته میشوند.
سپس debian-cd فایل نهایی ISO را تولید میکند.
12.3.3.3. تولید یک فایل ISO
زمانی که یک فایل پیکربندی ایجاد و پروفایلهای خود را تعریف کردیم، گام باقیمانده فراخوانی build-simple-cdd --conf simple-cdd.conf
است. پس از چند دقیقه، فایل نهایی را در images/debian-8.0-amd64-CD-1.iso
دریافت میکنیم.