خودکار سازی نصب لینوکس

در این مقاله قصد دارم به شما آموزش دهم که چگونه می‌توانید نصب لینوکس را خودکار سازی کنید.فرض کنید که قصد داریم در یک سازمان بر روی سیستم‌های متفاوتی از نظر سخت افزاری سیستم عامل لینوکس نصب کنیم، چگونه می‌توانیم نصب را خودکار سازی کنیم. برای پاسخ به این سوال با من همراه باشید.1 مقدمهدر این مستند قصد داریم نصب سیستم‌عامل لینوکس را به‌صورت اتوماتیک بررسی و پیاده‌سازی کنیم. روشی که در این مستند استفاده می‌شود روش استفاده از preseed فایل است که مکانیزم پاسخ به سوالات در طول نصب است.روش preseed فایل این امکان را فراهم می‌آورد که نصب سیستم‌عامل لینوکس را اتوماتیک سازی کنیم و همچنین می‌توان اعمالی را در نصبِ با این روش انجام داد که با نصب معمولی نمی‌توان انجام داد و انعطاف‌پذیری بسیار بیشتری را نسبت به نصب معمولی سیستم‌عامل لینوکس فراهم می‌کند.در استفاده از این روش نیاز است که قبل از آن با یکسری از قسمت‌های debian آشنا شویم.1-1 پایگاه داده debconfبه‌طور خواص زمانی که یک یا گروهی از بسته‌های نرم‌افزاری را در debianنصب می‌کنید وظیفه‌ی debconfاست که پیکربندی این بسته‌های نرم‌افزاری را از شما سؤال بپرسد و تنظیمات مربوط به کاربر را در پایگاه داده‌ی خود ذخیره کند. و در آینده اگر که بسته‌ی نرم‌افزاری قصد داشت نصب شود تنظیمات پیکربندی خود را از این پایگاه داده می‌خواند و فایل‌های پیکربندی را با استفاده از این پایگاه داده ایجاد می‌کند، به‌عنوان‌مثال این‌که آیا سرور نصب‌شده اجرا شود یا نشود و یا این‌که همراه با سرور کتابخانه‌ی دیگری هم نصب شود یا نشود.1-2یودِب-Udeb(یودِب) Udeb یا micro deb یک نوع خاص از بسته‌های نرم‌افزاری debianاست که شباهت بسیاری به بسته‌های نرم‌افزاری معمولی دارد به‌گونه‌ای که شما می‌توانید محتویات آن‌ها را با فرمان‌های dpkg –c مشاهده کنید یا بافرمان dpkg –e آن‌ها را از حالت فشرده خارج کنید. این بسته‌های نرم‌افزاری به دلیل ماهیت استفاده باید حجم بسیار پایینی داشته باشند چراکه در زمان نصب، کاملاً باید در RAMقرار بگیرند و این‌که در مرحله‌ی چهارم نصبِ سیستم فراخوانی می‌شوند، که زمان partitioning سیستم است. این بسته‌های نرم‌افزاری در یک سیستم معمولی نباید نصب شوند و معمول به‌منظور استفاده در مراحل نصب سیستم‌عامل استفاده می‌شود. دو کلاس متفاوت از این بسته‌های نرم‌افزاری عبارت‌اند از:ی1. Kernel image an kernel module udebاساساً همان kernel image است که به‌صورت خاصی دربسته‌ی نرم‌افزاری ارائه می‌شود، که دربسته‌ی جدید نرم‌افزاری سایز کوچک‌تری را دارد علت آن‌هم این است که در مراحل نصب نیاز به بسیاری از ماژول‌های کرنل نیست.د2. Partman و اجزای آندر Partmanبرای partitioningاستفاده می‌شود که در ادامه‌ی این مستند به بررسی آن خواهیم پرداخت.در ابتدا با روش‌های ارسال فایل preseed.cfg به یک debian installer آشنا می‌شویم و در ادامه به بررسی یک مورد فایل preceed.cfg خواهیم پرداخت.2 روش‌های استفاده از preceed.cfgروش‌های متفاوتی برای ارسال فایل preceed.cfg به initrd هست،‌ اما قبل از آن بهتر است زمان استفاده از فایل preseed.cfg را بدانیم،‌ برای این منظور نیاز است که با initrd در لینوکس آشنا شوید.در Initrdیا Initramfs یک فایل سیستم است که boot loaderآن را در ram بارگذاری می‌کند تا این که بتواند از ram به‌عنوان root file system استفاده کند که امکان بارگذاری برنامه‌های دیگر در ram فراهم شود. بعدازآن می‌توان root file systemدیگری را مثلا از هارد به کرنل معرفی کرد پس initrd وظیفه‌ی این را دارد تا این‌که RAM را قابل‌استفاده کند تا کرنل در RAMقرار گیرد. Initrdمی‌تواند یک فایل به اسم preseed.cfg به‌عنوان ورودی دریافت کند که این فایل حاوی پیکربندی‌های کرنل است،‌ این پیکربندی‌ها همان پاسخ به سوالات هنگام نصب هستند که در فرمت خاصی به‌عنوان فایل preseed.cfgبه initrd داده می‌شوند. اگر که این فایل به initrdمعرفی شوند خود initrdآن را load کرده و اعمال می‌کند همچنین قابلیتی وجود دارد که می‌توان تمامی پیکربندی preseed.cfg را در فایل initrd قرار داد و آن را در یک iso سیستم‌عامل قرارداد و ازآن‌پس آن iso به‌صورت اتوماتیک از پیکربندی‌ها استفاده می‌کند. اما ما می‌توانیم در مرحله boot loader هم‌مکان preseed.cfg را به initrd معرفی کنیم،‌ مکان preseed فایل می‌تواند بر روی شبکه باشد که می‌توان با استفاده از tftpیا ftp یا http آن را انتقال داد.در ابتدا نحوه‌ی ارسال preseed.cfg را از طریق شبکه با استفاده از پروتکل httpبررسی می‌کنیم و بعدازآن نحوه‌ی قرار دادن فایل preseed.cfg را در یک iso بررسی خواهیم کرد.2-1 ارسال preseed با استفاده از httpبرای ارسال preseed.cfg از طریق پروتکل http نیاز به یک وب سرور داریم، درصورتی‌که بر روی سیستم‌عامل لینوکس شما python نصب‌شده باشد می‌توانید به‌راحتی از آن استفاده کنید، فقط کافی است که وارد پوشه‌ی حاوی فایل preseecd.cfg شوید و فرمان ‏2‑1 را اجرا کنید.python –m SimpleHTTPServer 80فرمان ‏2‑1 اجرای وب سروردرصورتی‌که شما در web browser خود ip address سیستم لینوکس خود را اجرا کنید می‌توانید فایل preseed.cfg را مشاهده کنید.بعدازاین که وارد مرحله‌ی نصب سیستم‌عامل debian شدید، شکل ‏2‑1شکل ‏2‑1 انتخاب‌های بیشتروارد ناحیه‌ی advance option شده و زمانی که بر روی گزینه‌ی automatic installation قرار گرفتید بر روی کلید e فشار دهید تا وارد محیط ویرایش گزینه automatic installationشوید. شکل ‏2‑2شکل ‏2‑2 نصب اتوماتیک بعدازآن وارد محیط ویرایش automated install شوید و مانند شکل ‏2‑3 آدرس فایل preseed.cfgرا وارد کنید و در انتها کلید crtr+xرا باهم فشار دهید تا این که ادامه‌ی عمل boot صورت گیرد.شکل ‏2‑3 معرفی مکان فایلهمان‌گونه که مشاهده می‌کنید می‌توان مانند شکل ‏2‑3 فرمان ‏2‑2 را اضافه کرد.url=http://172.30.120.11/preseed.cfgفرمان ‏2‑2 تنظیمات ارسال فایل preseedهمچنین شما باید در ادامه فرمان ‏2‑2 کارت شبکه‌ی متصل سیستم را هم مشخص کنید.url=http://172.30.120.11/preseed.cfginterface=eth0فرمان ‏2‑3 ارسال تنظیمات فایل preseed2-2 ایجاد iso حاوی فایل preseed.cfg در لینوکسبرای این‌که فایل preseed.cfg را در یک فایل iso سیستم‌عامل قرار دهیم مانند ادامه عمل کنید.در ابتدا فایل iso را از حالت image خارج کنیددر ابتدا فایل iso سیستم‌عامل را از حالت فشرده خارج کنید. فرمان ‏2‑47z x -oDESTINATION debian-9.3.0-i386-netinst.isoفرمان ‏2‑4 unpackاعمال دسترسی write بر دایرکتوری install.amd و محتویات آن. فرمان ‏2‑5chmod +w -R isofiles/install.amd/فرمان ‏2‑5 دسترسی writeفایل initrd.gzهای زیر شاخه پوشه install.amd را از حالت zip خارج کنید. فرمان ‏2‑6gunzip isofiles/install.amd/initrd.gzgunzip isofiles/install.amd/gtk/initrd.gzgunzip isofiles/install.amd/xen/initrd.gzفرمان ‏2‑6 unzip initrdبعدازآن نیاز است که فایل preseed.cfg را به initrd اضافه کنیم. فرمان ‏2‑7echo preseed.cfg | cpio -H newc -o -A -F isofiles/install.amd/initrdecho preseed.cfg | cpio -H newc -o -A -F isofiles/install.amd/gtk/initrdecho preseed.cfg | cpio -H newc -o -A -F isofiles/install.amd/xen/initrdفرمان ‏2‑7 افزودن preseedبه initrdدوباره فایل initrd را zip کنید. فرمان ‏2‑8gzip isofiles/install.amd/initrdgzip isofiles/install.amd/gtk/initrdgzip isofiles/install.amd/xen/initrdفرمان ‏2‑8 zip initrdدسترسی writeرا از initrd بگیرید. فرمان ‏2‑9chmod -w -R isofiles/install.amdفرمان ‏2‑9 گرفتن دسترسی writeحال hash file را به‌روزرسانی کنید. فرمان ‏2‑10cd isofilemd5sum `find -follow -type f` > md5sum.txtفرمان ‏2‑10 hash fileدوباره iso را ایجاد کنید، برای ایجاد فایل iso نیاز است که syslinux را در ابتدا نصب کنید. فرمان ‏2‑11apt-get install syslinuxapt-get install xorrisoxorriso -as mkisofs -isohybrid-mbr /usr/lib/syslinux/mbr/isohdpfx.bin –c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat -o preseed-debian-08.iso isofilesفرمان ‏2‑11 ایجاد isoبعد از ایجاد فایل iso شما می‌توانید از آن در نصب اتوماتیک استفاده کنید.3 تشریح فایل preseed.cfgدر ادامه به تشریح فایل preseed.cfg خواهیم پرداخت.برای انتخاب موقعیت جغرافیایی و کیبورد از این دو خط فرمان ‏3‑1 استفاده می‌شود.d-i debian-installer/locale string en_USd-i keyboard-configuration/xkb-keymap select usفرمان ‏3‑1 انتخاب کشور و کیبوردانتخاب کارت شبکه به‌صورت خودکار و تنظیم hostname. فرمان ‏3‑2d-i netcfg/choose_interface select autod-i netcfg/get_hostname string debianفرمان ‏3‑2 انتخاب کارت شبکه و host nameبرای اجبار نصب efi این فرمان ‏3‑3 را وارد کنیدgrub-efi-amd64 grub2/force_efi_extra_removable boolean trueفرمان ‏3‑3 نصب efiبرای مشخص کردن آدرس mirror از فرمان ‏3‑4 استفاده کنید.d-i mirror/country string manuald-i mirror/http/hostname string http.us.debian.orgd-i mirror/http/directory string /debiand-i mirror/http/proxy string falseفرمان ‏3‑4 پیکربردی mirrorبرای اضافه کردن کاربر root و اضافه کردن کاربر user.فرمان ‏3‑5d-i passwd/make-user boolean trued-i passwd/root-password password 1d-i passwd/root-password-again password 1d-i passwd/user-fullname string userd-i passwd/username string userd-i passwd/user-password password 1d-i passwd/user-password-again password 1فرمان ‏3‑5 افزودن کاربرتنظیمات زمان. فرمان ‏3‑6d-i clock-setup/utc boolean trued-i time/zone string US/Easternd-i clock-setup/ntp boolean trueفرمان ‏3‑6 تنظیمات زمانتنظیمات مربوط به disk partitioning در فایل preseed مانند فرمان ‏3‑7 است. همان‌گونه که مشاهده کنید در خط اول دیسک‌های سیستم را مشخص شده و در خط دوم و سوم آن تأکید بر پاک شدن lvm داشته و در خط چهارم روش معمول را برای پارتیشن بندی انتخاب کرده و بعدازآن به نصب نشدن swap تأکید داشته و بعدازآن پارتیشن بندی را شروع کرده است.همان‌گونه که در فرمان ‏3‑7 مشاهده می‌کنید میزان حجم به مگابایت محاسبه‌شده و به پارتیشن خاص آن نسبت داده‌شده است فقط در ایجاد پارتیشن root که آخرین پارتیشن است مشخص کرده است که هرآن چه فضای دیگر مانده بود را به پارتیشن root اختصاص دهید.d-i partman-auto/disk string /dev/sda /dev/sdbd-i partman-lvm/device_remove_lvm boolean trued-i partman-lvm/confirm_nooverwrite boolean falsed-i partman-auto/method string regulard-i partman-basicfilesystems/no_swap boolean falsed-i partman-auto/expert_recipe string \512 512 512 fat32 \method{ efi } format{ } \device{ /dev/sda } \. \1536 1536 1536 ext4 \method{ format } format{ } \use_filesystem{ } filesystem{ ext4 } \mountpoint{ /boot } \device{ /dev/sda } \. \25600 25600 25600 ext4 \method{ format } format{ } \use_filesystem{ } filesystem{ ext4 } \device{ /dev/sda } \mountpoint{ /tmp } \. \51200 51200 51200 ext4 \method{ format } format{ } \use_filesystem{ } filesystem{ ext4 } \device{ /dev/sda } \mountpoint{ /usr } \. \500 10000 1000000000 ext4 \method{ format } format{ } \use_filesystem{ } filesystem{ ext4 } \device{ /dev/sda } \mountpoint{ / } \.فرمان ‏3‑7 partitioningدرصورتی‌که هارددیسک دیگری بر روی سیستم قرار دارد که می‌خواهید آن را هم پارتیشن بندی کنید، می‌توانید از fdisk استفاده کنید اما توصیه می‌شود که این کار در این مرحله انجام نشود و بهتر است که بعد از اتمام نصب دیسک دوم را پارتیشن بندی کنید ولی درصورتی‌که نیاز شد در مرحله‌ی نصب پارتیشن بندی را انجام دهید، در این زمان در ابتدا تمام پارتیشن‌های موجود بر روی دیسک را پاک کنید و بعدازآن با استفاده از فرمان fdisk پارتیشن‌های موردنیاز را بسازید. فرمان ‏3‑8d-i preseed/late_command string dd if=/dev/zero of=/dev/sdb bs=512 count=1 conv=notrunc ; echo -e &quotg\nn\n1\n\n+450G\nw&quot | fdisk -c -u /dev/sdb ; mke2fs -F -t ext4 -q /dev/sdb1 ; echo -e &quotn\n2\n\n\n\nw&quot | fdisk -c -u /dev/sdb; mke2fs -F -t ext4 -q /dev/sdb2فرمان ‏3‑8 ایجاد پارتیشن بر روی دیسک دومبعدازاین که پارتیشن بندی را انجام دادید نیاز است که تأیید کنید که عمل write بر روی دیسک و پارتیشن‌ها انجام شود. فرمان ‏3‑9d-i partman-basicfilesystems/no_mount_point boolean trued-i partman-partitioning/confirm_write_new_label boolean trued-i partman/choose_partition select finishd-i partman/confirm boolean trued-i partman/confirm_nooverwrite boolean trueفرمان ‏3‑9 تاییده‌های پارتیشن بندیبرای این‌که سرویس ssh-server بر روی سیستم نصب بشود می‌توانید از فرمان ‏3‑10 استفاده کنید.tasksel tasksel/first multiselect ssh-serverفرمان ‏3‑10 نصب ssh serverهمچنین شما می‌توانید پکیج‌های دیگری را هم نصب کنید به عنوان مثال پکیج htopو vim. فرمان ‏3‑11d-i pkgsel/include string vim, htopفرمان ‏3‑11 نصب پکیجهمچنین شما می‌توانید مشخص کنید که تمامی پکیج‌ها به روز رسانی شوند. فرمان ‏3‑12d-i pkgsel/upgrade select full-upgradeفرمان ‏3‑12 به روز شدن پکیج‌هابرای غیر فعال کردن نصب popularty contest از فرمان ‏3‑13 استفاده کنید.popularity-contest popularity-contest/participate boolean falseفرمان ‏3‑13 disable popularity contestبعد از آن مشخص کنید که grub نصب شود. فرمان ‏3‑14d-i grub-installer/only_debian boolean trued-i grub-installer/with_other_os boolean trued-i grub-installer/bootdev string /dev/sdaفرمان ‏3‑14 نصب grubو در انتها مشخص کنید که سیستم reboot شود. فرمان ‏3‑15d-i finish-install/reboot_in_progress noteفرمان ‏3‑15 ریستارت شدن سیستم بعد از اتمام نصببعد از انجام مراحل بالا فایل پیکربندی نصب ایجاد شده است و می‌توانید از آن استفاده کنید و آن را در یک iso قرار دهید یا این که فایل را از طریق شبکه به سیستم معرفی کنید.امیدوارم این مستند آموزنده باشد.