Грузим ВСЁ по сети в 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.