Автоматическая установка Debian при помощи preseed
Preseeding - это процесс, при котором перед началом установки операционной системы или приложения, автоматически задается значения для параметров, обычно указываемых пользователем вручную. Это позволяет ускорить процесс установки и упростить его.
Пример файла preseed.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
### Localization
d-i debian-installer/language string ru
d-i debian-installer/locale string ru_RU.UTF-8
d-i debian-installer/country string RU
d-i localechooser/supported-locales multiselect en_US.UTF-8, ru_RU.UTF-8
### Keyboard
#d-i keyboard-configuration/xkb-keymap select ru
d-i keymap select ru
d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string ru
d-i console-setup/variant select Россия
d-i console-setup/toggle select Alt+Shift
### Network configuration
d-i netcfg/choose_interface select auto
d-i netcfg/dhcp_timeout string 2
#d-i netcfg/get_hostname string unassigned-hostname
#d-i netcfg/get_domain string unassigned-domain
d-i netcfg/get_hostname string localhost
d-i netcfg/get_domain string localdomain
d-i netcfg/confirm_static boolean false
d-i netcfg/disable_dhcp boolean false
# Static
#d-i netcfg/get_nameservers string 192.168.1.5 192.168.1.6
#d-i netcfg/get_ipaddress string 192.168.1.10
#d-i netcfg/get_netmask string 255.255.255.0
#d-i netcfg/get_gateway string 192.168.1.1
#d-i netcfg/confirm_static boolean true
#d-i netcfg/get_hostname string tempnode
#d-i netcfg/get_domain string localdomain
### Repo
#d-i mirror/country string manual
#d-i mirror/http/hostname string mirror.yandex.ru
#d-i mirror/http/directory string /debian
#d-i mirror/http/proxy string
### Timezone
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string 192.168.1.3
### Users
d-i passwd/root-password-crypted password $6$0eoSvBXMw0y0mftg$11111a/RFS7wUD5tjS8lh9iuaqkcK6rp/iay72E9yr0L0IJd7kg.zv742n0yklSQ.W7F3Uk9Lh/
d-i passwd/user-fullname string cfgadmin
d-i passwd/username string cfgadmin
d-i passwd/user-password-crypted password $6$R9QSOFvUWKc816UF$cyX111116/Y4tDAOqsaF8miQdaWTwVj1hV8nlFEXK2HrVg2C3kLTw38xPoGcy5193lhGxS7aJT/
d-i passwd/user-default-groups cfgadmin sudo
### Partition
#d-i partman-auto/disk string /dev/sda
#d-i partman-auto/method string regular
#d-i partman-auto/choose_recipe select atomic
#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 partman-auto/disk string /dev/sda
#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-partitioning/confirm_write_new_label boolean false
#d-i partman/choose_partition select finish
#d-i partman/confirm boolean false
#d-i partman/confirm_nooverwrite boolean true
#partman-efi partman-efi/non_efi_system boolean true
### Disk partitioning
d-i partman-auto/disk string /dev/sda
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-lvm/new_vg_name string debian
d-i partman-auto-lvm/guided_size string max
#d-i partman-auto/choose_recipe select custom
d-i partman-auto/expert_recipe string \
custom :: \
256 30 256 ext2 \
$primary{ } \
$bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext2 } \
mountpoint{ /boot } \
. \
16384 30 16384 xfs \
$lvmok{ } lv_name{ root } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ / } \
. \
1024 1025 -1 xfs \
$lvmok{ } lv_name{ var } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /var } \
. \
4096 30 4096 linux-swap \
$lvmok{ } lv_name{ swap } \
method{ swap } format{ } \
.
# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
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
### Apt setup
# остальные настройки apt'a - включаем contrib и non-free репозитории.
# d-i apt-setup/non-free boolean true
# d-i apt-setup/contrib boolean true
# Local repo
# d-i apt-setup/local0/repository string http://192.168.1.21/debian buster main contrib non-free
# d-i apt-setup/local0/comment string Local repo Debian
# Values shown below are the normal defaults.
# d-i apt-setup/services-select multiselect security, updates
# d-i apt-setup/security_host string security.debian.org
# Некоторые версии программы установки могут отсылать отчёт
# об установленных и используемых пакетах. По умолчанию данная
# возможность выключена, но отправка отчёта помогает проекту
# определить популярность программ и какие из них включать на CD.
# не отправляем данные об установленных пакетах.
popularity-contest popularity-contest/participate boolean false
### Package selection
tasksel tasksel/first multiselect ssh-server
#tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo python3-apt aptitude
### Certificate
d-i preseed/late_command string \
in-target mkdir -p /root/.ssh; \
in-target chmod 700 /root/.ssh; \
in-target /bin/sh -c "echo 'ssh-ed25519 AAAAC3Nz111111NTE5AAAAIFCiz11YRaT3/C7QUVOJC5klAunWtFRhHJ9k/+e94dYb ed25519-root' > /root/.ssh/authorized_keys"; \
in-target chmod 600 /root/.ssh/authorized_keys; \
in-target mkdir -p /home/myuser/.ssh; \
in-target chmod 700 /home/myuser/.ssh; \
in-target /bin/sh -c "echo 'ssh-ed25519 AAAAC3Nz11111TE5AAAAIGv4Pt+Ocj3WEW3u/p8RMlH6r4TqW7qCiTofqnmKGiEe ed25519-myuser' > /home/myuser/.ssh/authorized_keys"; \
in-target chmod 600 /home/myuser/.ssh/authorized_keys; \
in-target chown -R myuser:myuser /home/myuser/.ssh/; \
in-target /bin/sh -c "echo 'myuser ALL=(ALL) NOPASSWD:ALL' | tee -a /etc/sudoers"
d-i finish-install/reboot_in_progress note
### Finish install
d-i finish-install/keep-consoles boolean true
d-i finish-install/reboot_in_progress note
d-i cdrom-detect/eject boolean true
# В случае с виртаульными машинами, лучше всего
# остановливать систему после завершения установки, а
# не перегружаться в установленную систему.
# d-i debian-installer/exit/halt boolean true
# Эта настройка позволяет выключить питание машины, а не просто остановить её.
# d-i debian-installer/exit/poweroff boolean true
### Grub
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i grub-installer/bootdev string default
Разбор содержимого файла
Первый блок. Локализация
1
2
3
4
5
### Localization
d-i debian-installer/language string ru
d-i debian-installer/locale string ru_RU.UTF-8
d-i debian-installer/country string RU
d-i localechooser/supported-locales multiselect en_US.UTF-8, ru_RU.UTF-8
В нем мы задаем локализацию и поддерживаемые языки
Второй блок. Раскладка клавиатуры
1
2
3
4
5
6
7
### Keyboard
#d-i keyboard-configuration/xkb-keymap select ru
d-i keymap select ru
d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string ru
d-i console-setup/variant select Россия
d-i console-setup/toggle select Alt+Shift
В нем указаны параметры раскладки клавиатуры
Третий блок. Сеть
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
### Network configuration
d-i netcfg/choose_interface select auto
d-i netcfg/dhcp_timeout string 2
#d-i netcfg/get_hostname string unassigned-hostname
#d-i netcfg/get_domain string unassigned-domain
d-i netcfg/get_hostname string localhost
d-i netcfg/get_domain string localdomain
d-i netcfg/confirm_static boolean false
d-i netcfg/disable_dhcp boolean false
# Static
#d-i netcfg/get_nameservers string 192.168.1.5 192.168.1.6
#d-i netcfg/get_ipaddress string 192.168.1.10
#d-i netcfg/get_netmask string 255.255.255.0
#d-i netcfg/get_gateway string 192.168.1.1
#d-i netcfg/confirm_static boolean true
#d-i netcfg/get_hostname string tempnode
#d-i netcfg/get_domain string localdomain
Это блок с сетевыми настройками.
Раскомментированный - настройки для получения IP с помощью DHCP-сервера.
Закомментированный - статический IP
Четвертый блок. Репозиторий
1
2
3
4
5
### Repo
#d-i mirror/country string manual
#d-i mirror/http/hostname string mirror.yandex.ru
#d-i mirror/http/directory string /debian
#d-i mirror/http/proxy string
Указываем репозиторий и если нужно прокси-сервер
Пятый блок. Временная зона
1
2
3
4
5
### Timezone
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string 192.168.1.3
Настройки временной зоны, ntp-сервера
Шестой блок. Пользователи
1
2
3
4
5
6
### Users
d-i passwd/root-password-crypted password $6$0eoSvBXMw1111.NfjecfghfghfghjS8lh9iuaqkcK6rp/iay72E9yr0L0IJd7kg.zv742n0yklSQ.W7F3Uk9Lh/
d-i passwd/user-fullname string myuser
d-i passwd/username string myuser
d-i passwd/user-password-crypted password $6$R9QSOFvUWK1111F$cyXMFXtfghfghfghfQdaWTwVj1hV8nlFEXK2HrVg2C3kLTw38xPoGcy5193lhGxS7aJT/
d-i passwd/user-default-groups myuser sudo
Задаем пароль для root-пользователя, создаем пользователя myuser и добавляем ему права sudo
Для генерации хэшированного пароля воспользуемся утилитой openssl, и сгенерируем пароль
1
2
3
4
$ openssl passwd -6
Password: pass
Verifying - Password: pass
$6$guSkbpdN4kWXQBsE$dmr6b8ZA515kaqvCRbOG2MGIIAwYTtnwARVUFPt/JHjjL4BvA3TEx6mQgmYGto14DiwCM7X82X04mxoHNkSwA0
Седьмой блок. Разметка диска
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
### Partition
#d-i partman-auto/disk string /dev/sda
#d-i partman-auto/method string regular
#d-i partman-auto/choose_recipe select atomic
#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 partman-auto/disk string /dev/sda
#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-partitioning/confirm_write_new_label boolean false
#d-i partman/choose_partition select finish
#d-i partman/confirm boolean false
#d-i partman/confirm_nooverwrite boolean true
#partman-efi partman-efi/non_efi_system boolean true
### Disk partitioning
d-i partman-auto/disk string /dev/sda
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-lvm/new_vg_name string debian
d-i partman-auto-lvm/guided_size string max
#d-i partman-auto/choose_recipe select custom
d-i partman-auto/expert_recipe string \
custom :: \
256 30 256 ext2 \
$primary{ } \
$bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext2 } \
mountpoint{ /boot } \
. \
16384 30 16384 xfs \
$lvmok{ } lv_name{ root } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ / } \
. \
1024 1025 -1 xfs \
$lvmok{ } lv_name{ var } \
method{ format } format{ } \
use_filesystem{ } filesystem{ xfs } \
mountpoint{ /var } \
. \
4096 30 4096 linux-swap \
$lvmok{ } lv_name{ swap } \
method{ swap } format{ } \
.
# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
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
Disk partitioning - раскомментированный блок, разметка диска:
использовать весь диск sda
метод распределения пространства жёсткого диска — LVM
очистить диск, если на нем что-то было
Volume Group - debian
/boot - 512 Mb, ext2
/ - lv_name: root, 16 Gb, xfs
/var - lv_name: var, все оставшееся место (параметр “-1”), xfs
swap - 4 Gb
Восьмой блок. Apt setup
1
2
3
4
5
6
7
8
9
10
### Apt setup
# остальные настройки apt'a - включаем contrib и non-free репозитории.
# d-i apt-setup/non-free boolean true
# d-i apt-setup/contrib boolean true
# Local repo
# d-i apt-setup/local0/repository string http://192.168.1.9/debian buster main contrib non-free
# d-i apt-setup/local0/comment string Local repo Debian
# Values shown below are the normal defaults.
# d-i apt-setup/services-select multiselect security, updates
# d-i apt-setup/security_host string security.debian.org
Остальные настройки apt, подключаем репозитории
Девятый блок. Программное обеспечение
1
2
3
4
### Package selection
tasksel tasksel/first multiselect ssh-server
#tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string sudo python3-apt aptitude
Указываем какие сервисы добавлять, какой софт ставить
Десятый блок. Пользовательские скрипты
1
2
3
4
5
6
7
8
9
10
11
12
### Certificate
d-i preseed/late_command string \
in-target mkdir -p /root/.ssh; \
in-target chmod 700 /root/.ssh; \
in-target /bin/sh -c "echo 'ssh-ed25519 AAAAC3NzaC11111AIFCiz11YRaT3/C7fghfghfghfghRhHJ9k/+e94dYb ed25519-root' > /root/.ssh/authorized_keys"; \
in-target chmod 600 /root/.ssh/authorized_keys; \
in-target mkdir -p /home/myuser/.ssh; \
in-target chmod 700 /home/myuser/.ssh; \
in-target /bin/sh -c "echo 'ssh-ed25519 AAAAC3Nz111111TEdfgrtrthrhfghfghEW3u/p8RMlH6r4TqW7qCiTofqnmKGiEe ed25519-myuser' > /home/myuser/.ssh/authorized_keys"; \
in-target chmod 600 /home/myuser/.ssh/authorized_keys; \
in-target chown -R myuser:myuser /home/myuser/.ssh/; \
in-target /bin/sh -c "echo 'myuser ALL=(ALL) NOPASSWD:ALL' | tee -a /etc/sudoers"
Добавляю сертификаты для пользователей root и myuser, отключаю запрос пароля при выполнении sudo пользователем myuser
Как данным файлом пользоваться?
Загружаемся с диска
Advanced options
Automated install
После подгрузки необходимых модулей прописываем url к файлу preseed.cfg
Либо добавить пункт меню в образ диска
Устанавливаем софт:
1
$ sudo apt install genisoimage isolinux wget xorriso
Скачиваем и выполняем скрипт автоматической сборки образа из исходного образа
1
$ sudo ./preseed_creator.sh -i image.iso -p preseed.cfg -o image_preseed.iso