Грузим ВСЁ по сети в DualBoot. Часть 5: Загружаем полноценный дистрибутив Linux Ubuntu

Грузим ВСЁ по сети в DualBoot. Часть 5: Загружаем полноценный дистрибутив Linux Ubuntu

В предыдущей части мы закончили на том, что по сети успешно загрузился Strelec WinPE. Это, в первую очередь, дистрибутив для обслуживания, данные которого стираются после перезагрузки. Теперь будем загружать полноценный дистрибутив Linux Ubuntu, который хранит все данные в сетевом хранилище и не удаляет после перезапуска.

Часть 1: Теория и анализ предложений
Часть 2: Первые грабли в процессе загрузки MemTest86+
Часть 3: Добавляем поддержку UEFI
Часть 4: Загружаем Strelec WinPE
Часть 5: Загружаем полноценный дистрибутив Linux Ubuntu
Часть 6: Загружаем Windows Installer и ставим ОС
Часть 7: Устанавливаем Windows на iSCSI диск по сети
Часть 8: Жонглируем пунктами iPXE меню
Часть 9: Обслуживание сервера и обновление образов

Алгоритм загрузки

Для загрузки ядра будем использовать протокол HTTP, так как он работает быстрее, чем TFTP. Из iPXE по HTTP загружаем vmlinuz (сжатая версия ядра), с аргументами:

  • initrd.img — временная файловая система для инициализации ядра
  • root=/dev/nfs — драйвер файловой системы, используемая как / (корень)
  • nfsroot=192.168.9.1:/pxe/network-boot-ubuntu — расположение NFS хранилища / (корня) системы
  • ip=192.168.9.2::192.168.9.1:255.255.255.0::::8.8.8.8:1.1.1.1 — настройки сетевого интерфейса, которые будет использовать ядро при запуске драйвера NFS
  • text — текстовый режим загрузки

Таким образом, ядро будет загружаться по протоколу HTTP, инициализируется, а потом, используя аргументы запуска получает информацию где находится корень системы, поднимает сетевой интерфейс с указанными настройками, монтирует в / (корень) указанное сетевое хранилище и пытается запустить процесс init, который, в свою очередь, будет запускать остальные.

Настраиваем HTTP сервер

В роли HTTP сервера для отдачи файлов в iPXE я буду использовать NGINX, хотя можно использовать практически любой.

Сначала нужно настроить nginx на работу от root, чтобы у него был доступ до файлов, защищенных от чтения (vmlinuz).
nano /etc/nginx/nginx.conf

# закоммментировать эту строку
# user www-data;
user root;

Теперь немного поменяем стандартный файл конфигурации сайта. Этого будет достаточно для наших целей.

apt install nginx -y
cat > /etc/nginx/sites-available/default << EOF
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /pxe;

        # для удобной отладки включим листинг файлов
        autoindex on;

        server_name _;
}
EOF
service nginx restart

Настраиваем NFS сервер

Протокол NFS — аналог SMB для Windows, работает с файловой системой. В нашем случае расшаренная по NFS папка будет / (корнем) для загружаемой по сети ОС. Локальная папка, которая будет корнем загружаемой системы — /pxe/network-boot-ubuntu. Основной файл конфигурации общих папок NFS — /etc/exports. Скачиваем и настраиваем.

apt install nfs-kernel-server -y
systemctl enable nfs-blkmap.service

mkdir /pxe/network-boot-ubuntu

cat > /etc/exports << EOF
/pxe/network-boot-ubuntu 192.168.9.0/24(rw,async,no_root_squash,no_subtree_check,insecure) 10.0.0.0/24(rw,async,no_root_squash,no_subtree_check,insecure)

EOF

exportfs -a

После того, как файлы будут скопированы в папку, доступ из 10.0.0.0/24 можно удалить, для применения настроек также используется exportfs -a.

Подготовка дистрибутива

Теперь нам понадобится еще одна виртуальная машина, в куда нужно установить ОС, которую в дальнейшем будем грузить по сети. Виртуальная машина имеет один сетевой адаптер, который подключен в основную LAN. Процесс установки я описывать не буду, так как это стандартная минимальная конфигурация Ubuntu Server. Имя хоста задаю «network-boot-ubuntu». После установки у виртуальной машины появился IP-адрес 10.0.0.108.

Копируем данные с рабочей системы в NFS папку

Логинимся на новую виртуальную машину по SSH, устанавливаем NFS клиент, монтируем папку и копируем данные, временные папки создаем пустыми. После копирования эта виртуальная машина больше не нужна.

echo nameserver 8.8.8.8 > /etc/resolv.conf
apt install nfs-common -y
mount 10.0.0.102:/pxe/network-boot-ubuntu /mnt

cp -a /dev /mnt/dev
cp -a /etc /mnt/etc
cp -a /home /mnt/home
cp -a /media /mnt/media
cp -a /opt /mnt/opt
cp -a /root /mnt/root
cp -a /snap /mnt/snap
cp -a /tmp /mnt/tmp
cp -a /usr /mnt/usr
cp -a /var /mnt/var
cp -a /bin /mnt/bin
cp -a /lib /mnt/lib
cp -a /lib32 /mnt/lib32
cp -a /lib64 /mnt/lib64
cp -a /libx32 /mnt/libx32
cp -a /sbin /mnt/sbin
mkdir /mnt/mnt /mnt/proc /mnt/run /mnt/sys /mnt/cdrom

# отключаем монтирование несуществующих дисков
> /mnt/etc/fstab

sync
shutdown now

Во избежание несогласованности данных лучше всего это делать через live cd, но в нашем случае и так сойдет.

Настраиваем iPXE

Добавляем пункт меню и блок загрузки в файл /pxe/ipxe/menu.ipxe.

# вставляем третьим пунктом меню
item pxeubuntu    Boot Linux Ubuntu

.....

# в конце файла дописываем
:pxeubuntu

# устанавливаем http путь до корня
set srvaddr http://${srvip}

# устанавливаем root для http загрузки ядра и root nfs папки
set root_url ${srvaddr}/network-boot-ubuntu
set nfs_root ${srvip}:/pxe/network-boot-ubuntu

# настройки сети
set ip_settings 192.168.9.2::192.168.9.1:255.255.255.0::::8.8.8.8:1.1.1.1

# устанавливаем аргументы ядра, можно дописать свои
set kernel_args text

# выводим на консоль для отладки
echo http_root:         ${root_url}
echo nfs_root:          ${nfs_root}
echo kernel:            ${root_url}/boot/vmlinuz
echo initrd:            ${root_url}/boot/initrd.img
echo network_settings:  ${ip_settings}
echo kernel_args:       ${kernel_args}
echo 
sleep 3

# устанавливаем настройки для загрузки и стартуем
kernel ${root_url}/boot/vmlinuz
initrd ${root_url}/boot/initrd.img
imgargs vmlinuz initrd=initrd.img root=/dev/nfs nfsroot=${nfs_root} ip=${ip_settings} rw ${kernel_args}

boot

Готово. Пробуем загрузить в Legacy и в UEFI режимах, убеждаемся что все работает, выбирая третий пункт меню iPXE.

Загруженный по сети дистрибутив Linux Ubuntu

С таким дистрибутивом можно работать, как будто он установлен на локальном компьютере, об остальном позаботится ядро Linux.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *