Установка Linux при помощи debootstrap

Иногда по каким-то причинам хочется переустановить ОС на сервере не через скрипты хостера. Например, когда в дистрибутиве хостера много лишнего софта, а объем диска совсем небольшой.

При помощи debootstrap можно установить как Debian, так и Ubuntu. Я покажу на примере установки ОС на хостинге AEZA.

На многих хостингах можно загрузиться с SystemRescue CD. Ставим курсор на первый пункт “Boot SystemRescue using default options”, жмем Tab. Теперь нужно дописать опцию ‘nofirewall’ и жмем Enter.

После того как ОС загрузилась, настраиваем сетевое подключение (в случае DHCP сеть будет настроена автоматически):

nmcli c m "Wired connection 1" ipv4.addr 123.45.67.89/32
nmcli c m "Wired connection 1" ipv4.gateway 10.0.0.1
nmcli c m "Wired connection 1" ipv4.dns 1.1.1.1
nmcli c m "Wired connection 1" ipv4.method manual
nmcli c u "Wired connection 1"

Задаем пароль пользователя root: passwd

Далее я рекомендую подключиться к серверу по SSH, чтобы удобнее было копировать команды: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@123.45.67.89

Удаляем предыдущую разметку диска: dd if=/dev/zero of=/dev/vda bs=1M count=50

Создаем разделы диска. Я создам один раздел на весь диск, а swap будет либо в виде файла, либо использую zswap:

parted -s -a optimal -- /dev/vda \
  mklabel msdos \
  mkpart primary ext4 1MiB -0 \
  quit

Note

Никогда не пробуйте поставить начало сектора в 0 (0%) — попросту потраченное время!

Создаем ФС на разделе: mkfs.ext4 -m 2 /dev/vda1

Скачиваем и устанавливаем программу debootstrap:

wget -O /tmp/debootstrap_1.0.132_all.deb http://deb.debian.org/debian/pool/main/d/debootstrap/debootstrap_1.0.132_all.deb
ar -p /tmp/debootstrap_1.0.132_all.deb data.tar.gz | tar -xz -C /

Создаем точку монтирования будущего корневого раздела и монтируем его:

mkdir -p /mnt/debinst
mount -o relatime /dev/vda1 /mnt/debinst

Запускаем установку пакетов:

/usr/sbin/debootstrap --arch amd64 bullseye /mnt/debinst http://deb.debian.org/debian
OR
/usr/sbin/debootstrap --arch amd64 bookworm /mnt/debinst http://deb.debian.org/debian

После того как установка закончится, монтируем служебные разделы:

mount --bind /dev /mnt/debinst/dev
mount --bind /dev/pts /mnt/debinst/dev/pts
mount -t sysfs sys /mnt/debinst/sys
mount -t proc proc /mnt/debinst/proc

Редактируем файл репозиториев ‘/mnt/debinst/etc/apt/sources.list’:

#!Debian11
deb http://deb.debian.org/debian bullseye main non-free contrib
#deb-src http://deb.debian.org/debian bullseye main non-free contrib

deb http://deb.debian.org/debian bullseye-updates main contrib non-free
#deb-src http://deb.debian.org/debian bullseye-updates main contrib non-free

deb http://security.debian.org/ bullseye-security main
#deb-src http://security.debian.org/ bullseye-security main
#!Debian12
deb http://deb.debian.org/debian bookworm main non-free-firmware
#deb-src http://deb.debian.org/debian bookworm main non-free-firmware

deb http://security.debian.org/ bookworm-security main
#deb-src http://security.debian.org/ bookworm-security main

deb http://deb.debian.org/debian bookworm-updates main non-free-firmware
#deb-src http://deb.debian.org/debian bookworm-updates main non-free-firmware

deb http://deb.debian.org/debian bookworm-backports main non-free-firmware
#deb-src http://deb.debian.org/debian bookworm-backports main non-free-firmware

Выполняем ‘chroot’ для того чтобы попасть в новое окружение: LANG=C.UTF-8 chroot /mnt/debinst /bin/bash

Обновляем все установленные пакеты: apt-get update && apt-get upgrade

Устанавливаем пакет ‘locale’ и генерируем необходимые локали:

apt-get install -y man locales
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
echo 'LANG="en_US.UTF-8"' >> /etc/default/locale
echo 'LC_ALL="en_US.UTF-8"' >> /etc/default/locale
echo 'LANGUAGE="en_US:en"' >> /etc/default/locale

Настройка часового пояса: dpkg-reconfigure tzdata

При помощи ‘blkid’ смотрим UUID раздела /dev/vda1 и редактируем ‘/etc/fstab’:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID="fa821b1b-321a-4d88-a285-d8912b05ff59" / ext4 errors=remount-ro 0 1

Перемонтируем разделы: mount -a

Устанавливаем пакеты ядра и необходимые утилиты:

apt-get install -y linux-image-amd64
OR
apt-get install -y linux-image-cloud-amd64

tasksel install ssh-server
apt-get install -y net-tools htop wget curl dnsutils file aptitude python3 sudo make
apt-get install -y grub2

Записываем загрузчик на диск и уменьшаем таймер GRUB:

grub-install --recheck /dev/vda
sed -i 's/^GRUB_TIMEOUT=.*$/GRUB_TIMEOUT=3/g' /etc/default/grub
update-grub

Задаем новой системе имя и настройки DNS:

echo "my-debian" > /etc/hostname

echo "nameserver 1.1.1.1" > /etc/resolv.conf
echo "nameserver 2606:4700::1111" >> /etc/resolv.conf

Редактируем файл ‘/etc/hosts’:

127.0.0.1       localhost my-debian
123.45.67.89    my-debian

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Смотрим mac-адрес сетевой карты: ip a | grep ether

Редактируем файл ‘/etc/network/interfaces’ с сетевыми настройками:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens3
iface ens3 inet static
    address   123.45.67.89
    netmask   255.255.255.255
    gateway   10.0.0.1
    hwaddress ether 52:54:00:12:41:d8
    dns-nameservers 1.1.1.1 8.8.8.8

iface ens3 inet6 static
    address   2a12:5122:b2e5::2
    netmask   48
    gateway   2a12:5122:b2e5::1
    dns-nameservers 2606:4700::1111

Задаем пароль root и разрешаем ему ssh подключение по паролю:

passwd
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

Включаем BBR:

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

Если требуется, то устанавливаем агента QEMU:

apt-get install qemu-guest-agent
systemctl start qemu-guest-agent
systemctl enable --now qemu-guest-agent
systemctl status qemu-guest-agent