Debian is a rock solid GNU/Linux distribution with more than 30,000 packages available in its official repositories. Debian is suitable for servers, workstations, mobile devices and embedded systems.
Debian has a simple and clean installation system which allows installing Debian with little effort as long as the number of installations to be executed is minimal, but as this number grows the installation procedure becomes cumbersome and tedious (Please note that during the installation process it is necessary to answer configuration questions and package selection), for example if we want to install Debian in a lab that has 15 workstations, we need to repeat this process 15 times, which is possible , but if we want to deploy Debian in mass, for example 100, 200, 500 or 1000 installations, it is no longer feasible, this is the reason why the Debian developers have created a system that allows automatic or unattended installations starting from a configuration file (preseed).
There are three methods that can be used to execute an unattended installation:
- Adding the preseed file to the installer’s initrd.gz, link
- Add the file boot parameter to the ISO image
- Load the preseed.cfg file from the network
In this post we’re going to use method 1 for unattended installation starting from DebianInstaller/Preseed/EditIso
1. Dowload Debian image
We will download the “net-install” image that allows a minimal installation, an internet connection is needed since the files are downloaded from Debian repositories.
$ curl -LO# https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.8.0-amd64-netinst.iso
Ponga aqui la contraseña encryptada
Recommended reading: How to download files using curl
2. Install xorriso
xorriso allows to extract files from an ISO image and dump into the file system
$ sudo apt -y install xorriso
3. Extract the files from the ISO
With the following command we put the files contained in the “net-install” image into the file system under the isofiles DIR if the isofiles DIR does not exist, xorriso creates it automatically.
$ xorriso -osirrox on -indev debian-10.1.0-amd64-netinst.iso -extract / isofiles/
4. Dowload a base preseed
A basic template is available from Debian site which serves as a starting point for our unattended installation system.
$ curl -#L https://www.debian.org/releases/stable/example-preseed.txt -o preseed.cfg
Recommended reading: How to download files using curl
5. Modify preseed template according our needs
5.1. Setting the locale
Set operating system language to English, UTF-8 encoding and locale settings (date, currencies) to English U.S.
d-i debian-installer/language string en
d-i debian-installer/country string US
d-i debian-installer/locale string en_US.UTF-8
5.2. Setting the timezone
Set the hardware clock to UTC and set the timezone to America/New_York (we can use any value found on /usr/share/zoneinfo/
) and use NTP for time synchronization.
d-i clock-setup/utc boolean true
d-i time/zone string America/New_York
d-i clock-setup/ntp boolean true
5.3. Configure the keyboard
Set the keyboard to US.
d-i keyboard-configuration/xkb-keymap select us
5.4. Configure the network
With the following configuration the installation system will try to configure the network automatically, set the hostname to debian10, set localdomain as domain name and use the http.us.debian.org
as mirror it is also possible to specify a proxy which in this case is empty.
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string debian10
d-i netcfg/get_domain string localdomain
# Avoid to show WEP dialog
d-i netcfg/wireless_wep string
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
5.5. Configure users
We disable the the root user authentication user, instead we will use sudo
with a standard user with encrypted password.
d-i passwd/root-login boolean false
d-i passwd/user-fullname string Put_your_full_name_here
d-i passwd/username string your_user_name
d-i passwd/user-password-crypted password put_encrypted_password
To encrypt the password you can execute the following command:
$ python3 -c 'import crypt; print(crypt.crypt("mipass", crypt.METHOD_SHA512))'
5.6. Partitioning
We’re going to use LVM as partition method, any old partition will be removed, the selected partition scheme is atomic
that means use the the entire hard disk for a single partition, another options are: home (living in its own partition) and multi (separate partitions for /home, /var, /tmp).
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
d-i partman-auto/choose_recipe select atomic
d-i partman-auto-lvm/guided_size string max
Avoid that partman asks for confirmation to continue with the partition process.
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
5.7. Packages selection
In addition to the base system, install an SSH server.
tasksel tasksel/first multiselect
d-i pkgsel/include string openssh-server
5.8. Disable send stats
popularity-contest popularity-contest/participate boolean false
5.9. Some GRUB configuration
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string default
5.10. Final configurations
# Don't show "Installation has been completed" message
d-i finish-install/reboot_in_progress note
# Avoid CD/DVD scan
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/cdrom/set-next boolean false
d-i apt-setup/cdrom/set-failed boolean false
You can download the preseed file with the settings described above at: Debian preseed
6. Add preseed to initrd
Set write permissions to install.amd
DIR
$ chmod +w -R isofiles/install.amd/
Unzip initrd
image
$ gunzip isofiles/install.amd/initrd.gz
Add preseed.cfg to initrd
$ echo preseed.cfg | cpio -H newc -o -A -F isofiles/install.amd/initrd
Recreate the initrd
image
$ gzip isofiles/install.amd/initrd
Remove write permission to install.amd
DIR.
$ chmod -w -R isofiles/install.amd/
7. Modify the boot loader
7.1 ISOLINUX
The ISOLINUX boot loader is compatible with BIOS
We should edit the isolinux/isolinux.cfg
file and delete the line default vesamenu.c32
this avoid the Debian installation menu.
7.2 GRUB
GRUB boot loader is compatible with UEFI
We should edit boot/grub/grub.cfg
file and the following lines that avoid the Debian installation menu.
set timeout_style=hidden
set timeout=0
set default=1
8. Generate the MD5 sum (md5sum.txt)
$ cd isofiles/
$ chmod a+w md5sum.txt
$ md5sum `find -follow -type f` > md5sum.txt
$ chmod a-w md5sum.txt
9. Create the ISO
$ cd ..
$ chmod a+w isofiles/isolinux/isolinux.bin
$ genisoimage -r -J -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o debian-10-unattended.iso isofiles
Is this the same process for ubuntu?
Is there a preseed command to do a post install script?
Sorry your comment was not notified. Yes it’s the same procedure for Ubuntu and there is preseed/late_command to execute custom commands and scripts.
Instead of a preseed file, you can use the FAI tool for unattended Debian and Ubuntu installations.
See https://fai-project.org/FAIme for a simple web interface to create a custom ISO.
Thank you! for your suggestion this options looks very handy!
hi Sir, i already try your tutorial its work like a charm on virtual machine, but he problem on real machine , i install the iso to usb and i got an error “no common cdrom was detected.” how to solve this issue?
Hi, Honestly I don’t have a answer for you, maybe the error is related with the way in the iso was dumped to usb.
It’s booting via pxe, how can pxe detect cdrom?
Then you need to use another method for example: Load the preseed.cfg file from the network
Hello,
This was spot on. There is an additional installation of virtualmin that I want to perform by doenloading the install.sh and then running the script by using late_command. I tried various approach:
d-i preseed/late_command string \
cd /tmp/; \
wget https://software.virtualmin.com/gpl/scripts/install.sh; \
chmod +x ./install.sh; \
chroot ./ ./install.sh; \
rm -f ./install.sh;
also putting the install.sh in the same folder as preseed.cfg and then running : d-i preseed/run string install.sh but none of it works, any suggestion will be highly appreciated!
Replace the chroot ./ ./install.sh; \ line by chroot / && ./install.sh; should be enough.
Sorry for the above I think you need to do it in this way.
d-i preseed/late_command string \
chroot /; \
cd /tmp/; \
wget https://software.virtualmin.com/gpl/scripts/install.sh; \
chmod +x ./install.sh; \
./install.sh; \
rm -f ./install.sh;
Hey Sedlav, thank you so much for your prompt reply and help. I tried running this on a ESXI virtual machine , there was no error encountered during debian installation but after the whole installation when i logged in into the machine , virtualmin was not yet installed..
Hi, I’ll try to test it I reply you asap.
Thanks Sedlav, I look forward to it.
For editing 7.2 GRUB boot/grub/grub.cfg you need write permissions.
Tested on windows 11 sublinux – local drive :)
chmod +w isofiles/boot/grub/grub.cfg
EDIT
chmod -w isofiles/boot/grub/grub.cfg
Does the job :)
When i try to install the .iso which i created with the preseed.cfg. I got prompted to set the language and my country.
Even when is set it like this:
# The values can also be preseeded individually for greater flexibility.
d-i debian-installer/language string de
d-i debian-installer/country string DE
d-i debian-installer/locale string de_DE.UTF-8
# Optionally specify additional locales to be generated.
#d-i localechooser/supported-locales multiselect en_US.UTF-8, nl_NL.UTF-8
# Keyboard selection.
#d-i keyboard-configuration/xkb-keymap select de
# d-i keyboard-configuration/toggle select No toggling
# Tastaturlayout und Tastaturmodell festlegen
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select de
d-i keyboard-configuration/layoutcode string de
d-i keyboard-configuration/modelcode string pc105