Debian unattended Installation using a preseed file
I find installing Debian via VNC a time consuming process. Luckily there is an option to install Debian "unattended". You can do so using a preseed file to feed the selections and able to include advanced script customizations. If you come from CentOs World, then think of it as a kickstart file.
This is not new information, I just wanted the wonderful LES community to be aware of this great time saver.
The official source is at https://wiki.debian.org/DebianInstaller/Preseed and a long file example at https://www.debian.org/releases/stable/example-preseed.txt
Requirements:
- A VM with Debian iso mounted e.g: Network install from a minimal CD
- The preseed file is uploaded in some webserver and reachable by the VM.
- The VM is online with vnc console support and is able to get an ip from your provider dhcp.
- The VM is booted from the iso, here are screen shots on how to get there:
Here is a working file "preseed-test.cfg" that partitions the entire first disk with lvm in auto mode.
##### save this file as preseed-test.cfg and upload to your webserver
## locals and keys
d-i debian-installer/locale string en_US
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/xkb-keymap select fi
d-i keymap select fi
## detect network-hostname and auto setup
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
## mirrors and proxy if needed
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
## time and zone
d-i time/zone string Europe/Helsinki
d-i clock-setup/utc boolean true
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string pool.ntp.org
## Partion ::: use first disk , entire disk as one with lvm
d-i partman/early_command string debconf-set partman-auto/disk "$(list-devices disk | head -n1)"
d-i partman-auto/method string lvm
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman-lvm/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/confirm boolean true
## add root and user with passwords, change later
d-i passwd/root-login boolean true
d-i passwd/root-password password startSimple20
d-i passwd/root-password-again password startSimple20
d-i passwd/user-fullname string anthonySmith
d-i passwd/username string ant
d-i passwd/user-password password startSimple20
d-i passwd/user-password-again password startSimple20
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false
## lets install a standard server with ssh
tasksel tasksel/first multiselect standard,ssh-server
# add your cool tools
d-i pkgsel/include string ntp ssh wget curl
## upgrades
unattended-upgrades unattended-upgrades/enable_auto_updates boolean false
d-i pkgsel/update-policy select none
popularity-contest popularity-contest/participate boolean false
## install grub
d-i grub-installer/bootdev string default
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
## eject and reboot
d-i cdrom-detect/eject boolean true
d-i finish-install/reboot_in_progress note
The installation will execute in auto mode and the result of the above file is shown next, ignore sdb I was testing with another disk.
Notes:
* I advise to read each section in the above preseed file and change accordingly to you needs for example; timezone, keyboard layout, passwords.... refer to references and source page.
* The partitioning can get tricky if you want to do a regular layout or exclude swap, but is doable.
* You can add custom scripts before install upgrade section like this as an example:
### my other scripts
d-i preseed/late_command string \
in-target sh -c 'sed -i "s/^#PermitRootLogin.*\$/PermitRootLogin yes/g" /etc/ssh/sshd_config'; \
in-target curl -sq http://othersite.fi/k8s/99-k8s.conf -o /etc/sysctl.d/99-k8s.conf ;
What else have fun.
References
- https://www.debian.org/releases/buster/arm64/apbs02.en.html
- https://www.packer.io/guides/automatic-operating-system-installs/preseed_ubuntu
- https://gist.github.com/ofrzeta/afeb53590c538fbddace
- https://gist.github.com/lorin/5140029
- https://github.com/delfer/debian-preseed-iso/blob/master/preseed.cfg
- https://gist.github.com/boxrick/3a4022d003daa63b7d27cca7f0f99894
- https://gist.github.com/styblope/2cf93a41662608f924de71fd0e91e0d1
- others i might forgot to add.
Comments
Excellent post, thanks @ehab for taking the time to write this up and share it!
https://inceptionhosting.com
Please do not use the PM system here for Inception Hosting support issues.
If you use netboot.xyz their menu for Debian has an option to specify a preseed file. Basically can do a semi-unattended install with no ISO mounted this way.
For folks who like to live on the edge a bit and open up root straight away:
d-i preseed/late_command string \ in-target sed -i 's/^.*PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
Also you shouldn't store your passwords plaintext. It is possible to store a hash instead.