ساخت ISO دبیان به صورت AutoInstall
باسلام
امروز می خوایم باهم یک سناریو باحال یادبگیریم. سناریو به این شکل هست که گاهی اوقات شما دوست دارین یک iso از سیستم عاملتون به صورت کاملا شخصی شده داشته باشین که حتی در حین نصب هم ازتون سوال نپرسه و خودش اتوماتیک نصب بشه. مثلا میخواین سیستمتون با یکسری پکیجهای مشخص نصب بشه یا تنظیمات یوزرها و یا هر شخصی سازی دیگه ای.
سناریو خیلی باحاله خودم که به شخصه عاشقشم بریم ببینیم چی میشه.
یکی از روش های نصب دبیان به صورت اتوماتیک روش استفاده از فایل preseed هست. در این روش فایل preseed.cfg حاوی پاسخ هایی است که دبیان حین نصب از شما سوال میکند. امکان گذاشتن پکیجهایی به صورت دستی نیز موجود می باشد که در حین نصب به سیستم عامل اضافه شود.
اولین چیزی که مورد نیاز است یک فایل iso از سیستم عامل دبیانه که میتونه نسخه کامل یا minimal باشه. اگه نسخه مینیمال استفاده میکنین حتما مطمین باشید که پکیج های پیشنیازی مربوط به درایور های کارت شبکه سیستم های هدف رو هم بهش اضافه میکنین بعضا مشاهده شده که نسخه مینیمال نتونسته کارت شبکه مورد نظر رو نصب کنه و اتصال شبکه نداشته.
مرحله اول – دانلود iso دبیان
من برای این مثال می خوام از دبیان 10 نسخه ی DVD استفاده کنم هرچند برای این تست نسخه CD هم جواب میده فقط اگه از نسخه ی netinstall استفاده میکنین تنظیمات شبکه رو باید اول کار انجام بدین تا دسترسی به اینترنت داشته باشه. میتوپنین از لینک زیر برای دانلود استفاده کنید
https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-10.6.0-amd64-DVD-1.iso
نسخه 10.6 دبیان در حال حاضر آخرین نسخه دبیان 10 هست ممکنه زمانی که شما این مطلب رو می خونین ورژن بالاتری از دبیان 10 ارایه شده باشه.
مرحله دوم – اکسترکت کردن iso فایل دبیان
در این مرحله نیاز هست که محتویات فایل شما در یک دایرکتوری به نام isofiles قرار گیرد. روش های متنوعی برای این کار وجود داره روش ساده و معمولش استفاده از archvie manager روی سیستم خودتون است که من یا ark و یا gnome archive manager رو پیشنهاد میکنم. روش دیگه ای هم هست که شما میتونین iso رو یجا مونت کنین سپس فایل هاش رو کپی کنین به یک جای دیگه . برای این آموزش من از این روش استفاده میکنم.
sudo mkdir -p /mnt/iso
sudo mount -o loop <image>.iso /mnt/iso
sudo mkdir -p $HOME/Desktop/isofiles
sudo cp -r /mnt/iso $HOME/Desktop/isofiles
خوب الان می بایست تمامی فایل های درون فایل iso به دایرکتوری مشخص شده اکسترکت شده باشد. روش های دیگه هم هست که نیاز به نصب پکیج رو سیستم داره که میتونین از این ها هم استفاده کنید
bsdtar -C DESTINATION -xf FILE.iso
xorriso -osirrox on -indev FILE.iso -extract / DESTINATION
7z x -oDESTINATION FILE.iso
برای نصب پکیج های این موارد بالا دستور زیر استفاده میشود
sudo apt install libarchive-tools
sudo apt install xorriso
sudo apt install p7zip p7zip-full
مرحله سوم – اضافه کردن پکیچ به فایل iso نهایی
در این مرحله اگه پکیجی می خواهید به این iso اضافه کنید دایرکتوری های زیر برای این کار تعبیه شده اند. فقط اضافه کردن پکیج به iso به منزله ی نصب اون پکیج روی سیتسم نهایی نیست فقط باعث میشود در صورت نصب پکیج در سیستم هدف نیازی به دانلود مجدد آن نباشد. یک نکته مهم دیگه اینکه حتما می بایست تمامی dependency های اون پکیج رو هم دانلود و در دایرکتوری مشخص قرار بدین برای اعمال تغییرات ابتدا حق دسترسی ها را اصلاح میکنیم
chmod -R +w isofiles
1) ~/isofiles/pool/main
2) ~/isofiles/dists/buster/main/binary-amd64
دایرکتوری اول شامل پکیج های دبیان (فایل های deb. و udeb.) است و دایرکتوری دوم شامل اطلاعات پکیج و release می باشد. شما میتونی پکیج های موجود در DVD 2,3 دبیان رو هم به این دایرکتوری منتقل کنید. برای این مثال همین رو تست میکنیم ولی شما میتونین هر پکیج خاصی که می خواین به همراه تمامی dependency ها رو اضافه کنید. خوب برای اینکار DVD2 دبیان رو اکسترکت و پوشه pool اون رو اینور کپی میکنیم.
mkdir dvd-2
bsdtar -C dvd-2/ -xf debian-10.6.0-amd64-DVD-2.iso
chmod -R +w dvd-2
cp -a dvd-2/pool/main/* isofiles/pool/main/
حال باید پکیج لیست و md5sum را اصلاح کنیم. ابتدا یک فایل config-deb با توجه به دستور زیر میسازیم
apt-ftparchive generate config-deb
# A config-deb file. # Points to where the unpacked DVD-1 is. Dir { ArchiveDir "isofiles"; }; # Sets the top of the .deb directory tree. TreeDefault { Directory "pool/"; }; # The location for a Packages file. BinDirectory "pool/main" { Packages "dists/buster/main/binary-amd64/Packages"; }; # We are only interested in .deb files (.udeb for udeb files). Default { Packages { Extensions ".deb"; }; };
یک روش آپدیت کردن فایل release هست و سپس برای همه فایل ها مجدد چکسام محاسبه و فایل مجدد نوشته میشود. دستور آخر ممکن است یکسری warning نشان دهد که مهم نیست
sed -i '/MD5Sum:/,$d' isofiles/dists/buster/Release
apt-ftparchive release isofiles/dists/buster >> isofiles/dists/buster/Release
cd isofiles; md5sum `find ! -name "md5sum.txt" ! -path "./isolinux/*" -follow -type f` > md5sum.txt; cd ..
خوب این مرحله تمام شد الان شما میتونین iso رو ببندین و منتشر کنین فقط تا الان تنها کاری که روی iso اتفاق افتاده پکیجهاش بیشتر شد همین کار رو اگه با DvD3 هم بکنین راحت یک ایمیچ بزرگ با تمامی پکیج های دبیان دارین که خیلی خوبه مثلا اگه جایی مجبور شدن سیستم عامل نصب کنین که دسترسی به اینرنت نداشتین یا مستقیم نبود راحت میتونین از این iso و پکیج های توش برای بالا آوردن و نصب پکیج استفاده کنین. شبیه یک رپازیتوری همراه میشه تقریبا که فقط پکیج هاش بروزرسانی نمیشه و این کارو باس دستی انجام یدین.
مرحله چهارم – ساخت فایل preseed.cfg
همان طور که اشاره شد این فایل یک فایل کانفیگ سیستم است که به سوالات در حین نصب پاسخ میدهد. قالب خاصی دارد و شما میتونین از تمپلیت های مختلفی که در اینترنت موجود است برای این کار استفاده کنین. فایل من به صورت زیر است
### Localization d-i debian-installer/locale string en_US ### Keyboard selection. d-i keyboard-configuration/xkb-keymap select us d-i console-setup/ask_detect boolean false d-i keyboard-configuration/layoutcode string en ### Network configuration ## Disable network configuration entirely. This is useful for cdrom d-i netcfg/enable boolean false d-i netcfg/disable_dhcp boolean true #d-i netcfg/choose_interface select eth1 #d-i netcfg/enable boolean false #d-i netcfg/choose_interface select auto #d-i netcfg/link_wait_timeout string 10 #d-i netcfg/disable_autoconfig boolean true # IPv4 example #d-i netcfg/get_ipaddress string 192.168.1.254 #d-i netcfg/get_netmask string 255.255.255.0 #d-i netcfg/get_gateway string 192.168.1.1 #d-i netcfg/get_nameservers string 192.168.1.1 #d-i netcfg/confirm_static boolean true # set host and domain d-i netcfg/get_hostname string debian #d-i netcfg/get_domain string localdomain ## Domain name d-i netcfg/hostname string debian # If non-free firmware is needed for the network or other hardware, you can # configure the installer to always try to load it, without prompting. Or # change to false to disable asking. d-i hw-detect/load_firmware boolean true # disable WEP dialogue d-i netcfg/wireless_wep string # use http.us.debian.org as mirror with no proxy d-i mirror/country string manual d-i mirror/http/hostname string http.us.debian.org d-i mirror/http/directory string /debian d-i mirror/http/proxy string # don't make a regular user / set root password , password is "root" d-i passwd/make-user boolean false d-i passwd/root-password-crypted password اینجا پسورد قرار میگیرد به صورت رمزنگاری شده # hardware clock is UTC, timezone is Asia/Tehran , use ntp to set clock d-i clock-setup/utc boolean true d-i time/zone string Asia/Tehran d-i clock-setup/ntp boolean true ################## d-i partman-auto/disk string /dev/sda d-i partman-basicfilesystems/no_swap boolean false d-i partman-auto/method string regular d-i partman-lvm/purge_lvm_from_device boolean true d-i partman-lvm/device_remove_lvm boolean true d-i partman-md/device_remove_md boolean true d-i partman-lvm/confirm boolean true #d-i partman-auto/choose_recipe select atomic d-i partman-auto/expert_recipe string \ boot-root :: \ 50000 1 51000 ext4 \ $primary{ } $bootable{ } \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ / } \ . \ 50000 2 51000 ext4 \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ /var } \ .\ 500 3 510 ext4 \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ mountpoint{ /tmp } \ .\ 500 4 510000 ext4 \ method{ format } format{ } \ use_filesystem{ } filesystem{ ext4 } \ . partman-basicfilesystems partman-basicfilesystems/no_mount_point boolean false d-i partman/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true # use lvm partitioning #d-i partman-auto/method string lvm #d-i partman-lvm/device_remove_lvm boolean true #d-i partman-lvm/confirm boolean true #d-i partman-lvm/confirm_nooverwrite boolean true # ## make lvm the max size #d-i partman-auto-lvm/guided_size string 11GB ##d-i partman-auto-lvm/guided_size string max #d-i partman-auto-lvm/new_vg_name string debian # ## use the following partition scheme on /dev/sda #d-i partman-auto/disk string /dev/sda ##custom is a name by RF #d-i partman-auto/choose_recipe select custom # ## /boot 500M ext4 ## /tmp 200M ext4 ## /var 50G ext4 ## / 50G ext4 #d-i partman-auto/expert_recipe string \ # custom :: \ # 500 10 500 ext4 \ # $primary{ } $bootable{ } \ # method{ format } format{ } \ # use_filesystem{ } filesystem{ ext4 } \ # mountpoint{ /boot } \ # . \ # 200 20 200 ext4 \ # $lvmok{ } \ # lv_name{ tmp } in_vg { debian } \ # $primary{ } \ # method{ format } format{ } \ # use_filesystem{ } filesystem{ ext4 } \ # mountpoint{ /tmp } \ # . \ # 5000 30 5000 ext4 \ # $lvmok{ } \ # lv_name{ var } in_vg { debian } \ # $primary{ } \ # method{ format } format{ } \ # use_filesystem{ } filesystem{ ext4 } \ # mountpoint{ /var } \ # . \ # 5000 40 5000 ext4 \ # $lvmok{ } \ # lv_name{ root } in_vg { debian } \ # $primary{ } \ # method{ format } format{ } \ # use_filesystem{ } filesystem{ ext4 } \ # mountpoint{ / } \ # . # ## remove any RAID partitioning #d-i partman-md/device_remove_md boolean true # ## don't confirm anything #d-i partman-basicfilesystems/no_mount_point boolean false #d-i partman-partitioning/confirm_write_new_label boolean true #d-i partman/choose_partition select finish #d-i partman/confirm boolean true #d-i partman/confirm_nooverwrite boolean true d-i base-installer/install-recommends boolean false ###################### # setup non-free and contrib repositories d-i apt-setup/non-free boolean true d-i apt-setup/contrib boolean true d-i apt-setup/use_mirror boolean false # install standard system with ssh-server tasksel tasksel/first multiselect minimal ssh-server d-i pkgsel/include string openssh-server sudo vim bash python-apt python3-apt rsync wget # این قسمت واسه نصب پکیج استفاده میشه. من اینارو انتخاب کردم شما میتونین تغییر بدین . فقط مطمین باشین که پکیج توی فایل موجود باشه # upgrade all packages #d-i pkgsel/upgrade select full-upgrade d-i pkgsel/upgrade select none # disable popularity contest popularity-contest popularity-contest/participate boolean false # force grub install to /dev/sda d-i grub-installer/only_debian boolean true d-i grub-installer/with_other_os boolean true d-i grub-installer/bootdev string /dev/sda # don't wait for confirm, just reboot when finished d-i finish-install/reboot_in_progress note ### Postinstall ##d-i preseed/late_command string cp /cdrom/first.sh /target/root/ # این دو اسکریپ جولوتر توضیح داده میشه d-i preseed/late_command string cp /cdrom/first.sh /cdrom/shell.sh /target/root/ ; in-target chmod +x /root/first.sh ; in-target chmod +x /root/shell.sh ; in-target bash /root/first.sh base-config base-config/intro note base-config base-config/login note ssh ssh/protocol2_only boolean true ssh ssh/run_sshd boolean true base-config apt-setup/uri_type select http base-config apt-setup/country select enter information manually base-config apt-setup/hostname string http.us.debian.org base-config apt-setup/directory string /debian # Stop after choosing one mirror. base-config apt-setup/another boolean false # You can choose to install non-free and contrib software. base-config apt-setup/non-free boolean true base-config apt-setup/contrib boolean true # Do enable security updates. base-config apt-setup/security-updates boolean true
خطوط d-i به معنی debian-installer هست و ننظیمات پایه ای را برعهده دارد شامل پاسخ به سوال هایی است که در حین نصب پرسیده میشود. این فایل در بخش های مختلفی ازجمله Localization ، Network configuration , Mirror settings Account setup , Clock and time zone setup, Partitioning, Controlling how partitions are mounted, Base system installation, Apt setup,Package selection,Boot loader installation و … امکان پیکربندی را میدهد امکان توضیح هرکدام در این مقاله سخت هست و فقط قسمت هایی که من شخصی اضافه کردم رو توضیح میدم بقیه موارد راحت با ی سرچ توی اینترنت میتونه بهتون کمک کنه. لینک زیر هم میتونه برای توضیحات مفید باشه البته مال دبیان ۹ هست ولی واسه دبیان 10 هم میتونین ازش استفاده کنید.
لینک توضیحات بخشهای فایل preseed.cfg
لنیک زیر نمونه ای از فایل preseed.cfg برای debian10 مییاشد
در قسمت ساخت پسورد می تونین از دستور زیر استفاده کنین.
mkpasswd -m sha-512
در بخشی از فایل بالا ی قسمتی هست که من از دوتا اسکریپ استفاده کردم و اونا رو به سیستم هدف منتقل کردم
d-i preseed/late_command string cp /cdrom/first.sh /cdrom/shell.sh /target/root/ ; in-target chmod +x /root/first.sh ; in-target chmod +x /root/shell.sh ; in-target bash /root/first.sh
در این فایل من تنظیمات بخش شبکه رو انجام ندادم و جوری درست کردم این فایل رو که وقتی کل سیستم نصب میشه از آخر قبل از لاگین به این سیستم یکسری سوالات از طرف میپرسه و قسمت های مختلف رو اصلاح میکنه خوب شاید بگین چرا این اینجوری؟؟
نحوه کار با این روش کلا دست خودتونه من دوست دارم که سیستم وقتی در بوت اول بالا میاد قبل از لاگین یسری سوالات را بکنه و سیستم رو بالا بیاره و تحویل بده. انتخاب تنظیمات شبکه در فایل و مشخص کردن آدرس خیلی این iso رو خاص میکنه و برای محیط دیگه مجبورین یکی دیگه درست کنین من با این روش یکم آمدم این iso رو reusable کردم که نهواسته باشم برای هر محیطی یکی جدا ایجاد بکنم (بسته به آدرس و محیط شبکه ای که سیستم هدف در آن قرار دارد)
در جلوتر میریم سراغ این اسکریپ ها
################ first.sh
#!/bin/sh
# grab our firstboot script
cp -a /root/shell.sh /root/.firstboot
chmod +x /root/.firstboot
cp /root/.bashrc /root/.bashrc.bak
# create a service that will run our firstboot script
cat >> /root/.bashrc <<EOF
### BEGIN AUTO INSTALL CONFIG
if [ ! -f /root/.done ]; then
. /root/.firstboot
fi
### END AUTO INSTALL CONFIG
EOF
rm /root/first.sh
rm /root/shell.sh
این اسکریپت فایل bashrc. را ویرایش کرده که در ورود اول کاربر روت اسکریپت پیکربندی اجرا شود انتهای اسکریپت دوک یک فایل done. در دایرکتوری روت اجرا میشود که مطمین باشد اسکریپت فقط در بوت اول اجرا و در الباقی بوت ها اجرا نمیشود.
############# shell.sh #!/bin/bash set -e function ip_calc() { # Calculates network and broadcast based on supplied ip address and netmask tonum() { if [[ $1 =~ ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+) ]]; then addr=$(( (${BASH_REMATCH[1]} << 24) + (${BASH_REMATCH[2]} << 16) + (${BASH_REMATCH[3]} << 8) + ${BASH_REMATCH[4]} )) eval "$2=\$addr" fi } toaddr() { b1=$(( ($1 & 0xFF000000) >> 24)) b2=$(( ($1 & 0xFF0000) >> 16)) b3=$(( ($1 & 0xFF00) >> 8)) b4=$(( $1 & 0xFF )) eval "$2=\$b1.\$b2.\$b3.\$b4" } if [[ $1 =~ ^([0-9\.]+)/([0-9]+)$ ]]; then # CIDR notation IPADDR=${BASH_REMATCH[1]} NETMASKLEN=${BASH_REMATCH[2]} zeros=$((32-NETMASKLEN)) NETMASKNUM=0 for (( i=0; i<$zeros; i++ )); do NETMASKNUM=$(( (NETMASKNUM << 1) ^ 1 )) done NETMASKNUM=$((NETMASKNUM ^ 0xFFFFFFFF)) toaddr $NETMASKNUM NETMASK else IPADDR=${1:-192.168.1.1} NETMASK=${2:-255.255.255.0} fi tonum $IPADDR IPADDRNUM tonum $NETMASK NETMASKNUM #printf "IPADDRNUM: %x\n" $IPADDRNUM #printf "NETMASKNUM: %x\n" $NETMASKNUM # The logic to calculate network and broadcast INVNETMASKNUM=$(( 0xFFFFFFFF ^ NETMASKNUM )) NETWORKNUM=$(( IPADDRNUM & NETMASKNUM )) BROADCASTNUM=$(( INVNETMASKNUM | NETWORKNUM )) IPADDRBIN=$( python -c "print(bin(${IPADDRNUM} )[2:].zfill(32))") NETMASKBIN=$( python -c "print(bin(${NETMASKNUM} )[2:].zfill(32))") NETWORKBIN=$( python -c "print(bin(${NETWORKNUM} )[2:].zfill(32))") BROADCASTBIN=$(python -c "print(bin(${BROADCASTNUM})[2:].zfill(32))") toaddr $NETWORKNUM NETWORK toaddr $BROADCASTNUM BROADCAST #printf "%-25s %s\n" "IPADDR=$IPADDR" #printf "%-25s %s\n" "NETMASK=$NETMASK" #printf "%-25s %s\n" "NETWORK=$NETWORK" #printf "%-25s %s\n" "BROADCAST=$BROADCAST" } function valid_ip() { local ip=$1 local stat=1 if [[ $ip =~ ^[1-9]{1,3}\.[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then OIFS=$IFS IFS='.' ip=($ip) IFS=$OIFS [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] stat=$? fi return $stat } validFormatIP() { local stat=1 echo $1 | grep -w -E -o '^(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1]?[1-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' > /dev/null if [ $? -eq 0 ] then stat=0 else stat=1 fi return $stat } validNetMask() { echo $1 | grep -w -E -o '^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)' > /dev/null if [ $? -eq 0 ] then stat=0 else stat=1 fi return $stat } sleep 3 clear echo -e '\E[32m'" # ############# ############# ############# # ## Begin Network Configuration ## # ############# ############# ############# " read -p"IP address: " IP while true ; do if ! valid_ip $IP; then read -p"Its wrong syntax. try again . IP address: " IP ; fi if ! validFormatIP $IP; then read -p"Its wrong syntax. try again . IP address: " IP ; else break; fi done read -p"SubnetMask: " SUB while true ; do if ! validNetMask $SUB; then read -p"Its wrong syntax. try again . SubnetMask: " SUB ; else break; fi done read -p"Gateway IP Address: " GW while true ; do if ! valid_ip $GW; then read -p"Its wrong syntax. try again . Gateway IP Address: " GW ; fi if ! validFormatIP $GW; then read -p"Its wrong syntax. try again . Gateway IP Address: " GW ; else break; fi done ip_calc $IP $SUB NIP=$NETWORK BIP=$BROADCAST ######################## network static configurations iface=$(ip add | cut -f 2 -d " " | grep e | head -1 | sed 's/://g') touch /etc/network/interfaces.d/static cat > /etc/network/interfaces.d/static <<EOF ##AUTO CONF auto lo $iface iface lo inet loopback iface $iface inet static address $IP netmask $SUB gateway $GW network $NIP broadcast $BIP EOF ##ifup $iface cat >> /etc/resolv.conf <<EOF ##AUTO CONF nameserver 8.8.8.8 nameserver 4.2.2.4 EOF ping -c 1 $GW &> /dev/null && echo -e "Gateway is reachable" || echo -e "\e[31mGateway is unreachable\e[0m" sleep 5 clear echo -e '\E[32'" # ############# ############# ############# # ## Begin Sources.list Configuration ## # ############# ############# ############# " sleep 3 ################# set source-list mv /etc/apt/sources.list /etc/apt/sources.list.bak cat > /etc/apt/sources.list <<EOF ##AUTO CONF deb http://deb.debian.org/debian buster main contrib non-free #deb-src http://deb.debian.org/debian buster main contrib non-free deb http://deb.debian.org/debian buster-updates main contrib non-free ##deb-src http://deb.debian.org/debian buster-updates main contrib non-free deb http://security.debian.org/debian-security/ buster/updates main contrib non-free #deb-src http://security.debian.org/debian-security/ buster/updates main contrib non-free EOF echo -e " # ############# ############# ############# # ## Sources.list configured successfully # # ############# ############# ############# " sleep 3 echo -e " # ############# ############# ############# # ## restoring .bashrc to default ## # ############# ############# ############# " sleep 3 mv /root/.bashrc.bak /root/.bashrc 2> /dev/null touch /root/.done echo -e " # ############# ############# ############# # ## System is going to reboot ## # ############# ############# ############# " sleep 3 reboot
این اسکرپیت شامل تمام مواردی هست که من لازم دارم در حین بوت اول انجام بشه کاملا شخصی است و ممکنه شما دوست داشته باشین کارهای متنوع تر بیشتری انجام بدین. بعد از اتمام کار اسکریپت سیستم را ریبوت کرده و در بوت بعدی این اسکریپت مجدد اجرا نمیشود. بعدا میتونین برین و اون فایل هارو پاک کنین که دیگه تو سرور هم نباشن. بازم میگم اینا تفکرات و نظرات شخصی من بود شما میتونین این روش رو به هرشکلی که دوست دارین پیاده سازی کنین.
مرحله پنجم – جایگذاری فایل preseed.cfg در iso
خوب بعد از مرحله قبل نیاز است که این فایل preseed در iso جایگذاری شود.راه های متنوعی وجو دارد که شما این فایل را در اختیار iso قرار بدین . سه روش اصلی داره یک قرار دادن این فایل در initrd هست که این روش رو میخوایم بریم. روش های دیگه ای هم هست که شما این فایل رو از طریق یک usb,cd,floppy ویا از طریق یک URL (که سیستم هدف به اون دسترسی داره) در اختیار iso قرار بدین.
هدف من از این ساخت این نوع iso همیشه این بود که میخوام این iso رو بوت کنم برم دست یکی که اصلا دانش کامپیوتر نداره و بره تو بر بیابون بدون دسترسی نت سیستم رو نصب کنه (خخخ. میدونم خیلی سناریو عجیبی داره ولی دیگه زاده تفکراته خخخ) واسه همین من این فایل رپ به صورت embedded درون initrd میزارم که دیگه طرف لازم نباشه کار خاصی انجام بده.
مثل قبل می بایست اول iso رو اکسترکت کنیم. که در بالا مرحله دوم توضیح دادیم. دقیقا به همون روش اکسترکت میکنیم. گام بعدی اصلاح دسترسی – extract کردن فایل initrd – قرار دادن فایل preseed.cfg – فشرده سازی محدد فایل initrd و اصلاح مجدد حق دسترسی است. تمامی این گام ها با دستورات زیر انجام میشود
chmod +w -R isofiles/install.amd
gunzip isofiles/install.amd/initrd.gz
echo preseed.cfg | cpio -H newc -o -A -F isofiles/install.amd/initrd
gzip isofiles/install.amd/initrd
chmod -w -R isofiles/install.amd/
در گام بعدی نیاز است تا فایل چکسام اصلاح شود. از دستورات زیر استفاده میکنیم.
cd isofiles
chmod +w md5sum.txt
find -follow -type f ! -name md5sum.txt -print0 | xargs -0 md5sum > md5sum.txt
chmod -w md5sum.txt
cd ..
مرحله ششم – ساخت iso نهایی
خوب برای آخرین مرحله میریم سراغ سرهم کردن فایل ها و ایجاد فایل iso نهایی که دستور زیر بدین منظور استفاده میشود.
خوب فایل ایجاد شده و میتونی روی فلش بوت کنین یا مستقیم روی یک مجازی ساز ازش استفاده کنین. فقط در حین بوت حتما روی Automated install کلیک کنید.
genisoimage -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -o preseed-debian.iso isofiles #### OR #### xorriso -as mkisofs -o preseed-debian.iso \ -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \ -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot \ -boot-load-size 4 -boot-info-table isofiles
امیدوارم مفید بوده باشه
یا حق