ساخت ISO دبیان به صورت AutoInstall

ساخت 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 مییاشد

example-preseed.txt

در قسمت ساخت پسورد می تونین از دستور زیر استفاده کنین.

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

امیدوارم مفید بوده باشه

یا حق

دیدگاه‌ها ۰
ارسال دیدگاه جدید