Diskless system (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Diskless system
. Дата последней синхронизации: 28 сентября 2024. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
NFS (Русский)
NFS Troubleshooting
PXE (Русский)
Mkinitcpio (Русский)#При использовании net
iSCSI Boot
Из
Википедии:Бездисковая рабочая станция
:
Бездисковая рабочая станция (или бездисковый узел) — это персональный компьютер, лишённый несъёмных средств для долговременного хранения данных. Операционная система и приложения загружаются по сети с сервера и затем выполняются локально на рабочей станции.
Настройка сервера
Прежде всего, мы должны установить следующие компоненты:
Сервер
DHCP
для назначения IP-адресов нашим бездисковым узлам.
Сервер
TFTP
для передачи загрузочного образа (требование всех опций roms PXE).
Сетевое хранилище (
NFS
,
Samba
или NBD) для экспорта установки Arch на бездисковый узел.
Примечание
dnsmasq
способен одновременно действовать как сервер DHCP и TFTP. Для получения дополнительной информации смотрите статью
dnsmasq
.
Вы можете загрузить Arch Linux по сети не используя PXE. См. пункт SKUF
DHCP
Установите ISC
dhcp
и настройте его:
/etc/dhcpd.conf
allow booting;
allow bootp;

authoritative;

option domain-name-servers 10.0.0.1;

option architecture code 93 = unsigned integer 16;

group {
    next-server 10.0.0.1;

    if option architecture = 00:07 {
        filename "/grub/x86_64-efi/core.efi";
    } else {
        filename "/grub/i386-pc/core.0";
    }

    subnet 10.0.0.0 netmask 255.255.255.0 {
        option routers 10.0.0.1;
        range 10.0.0.128 10.0.0.254;
    }
}
Примечание
next-server
должен быть адресом сервера TFTP; все остальное должно быть изменено в соответствии с вашей сетью
RFC:4578
определяет параметр dhcp "Client System Architecture Type". В приведенной выше конфигурации, если клиент PXE запрашивает двоичный файл x86_64-efi (тип 0x7), мы соответствующим образом предоставляем его, в противном случае возвращаемся к устаревшему двоичному файлу. Это позволяет одновременно загружать UEFI и устаревшие клиенты BIOS в один и тот же сегмент сети.
Запустите службу
systemd
ISC DHCP.
TFTP
TFTP-сервер будет использоваться для передачи загрузчика, ядра и initramfs клиенту.
Установите корень TFTP в
/srv/arch/boot
. Смотрите статью
TFTP
для установки и настройки.
Сетевое хранилище
Основное различие между использованием NFS и NBD заключается в том, что, хотя с обоими вы можете иметь несколько клиентов, использующих одну и ту же установку, с NBD (по характеру манипулирования файловой системой напрямую) вам нужно будет использовать режим
copyonwrite
для этого, который в конечном итоге отбрасывает все записи при отключении клиента. Однако в некоторых ситуациях это может быть очень полезно.
NFS
Установите
nfs-utils
на сервере.
Вам нужно будет добавить корень вашей установки Arch в ваш экспорт
NFS
:
/etc/exports
/srv       *(rw,fsid=0,no_root_squash,no_subtree_check)
/srv/arch  *(rw,no_root_squash,no_subtree_check)
Затем запустите службы NFS:
nfs-idmapd
nfs-mountd
.
NBD
Установите
nbd
и настройте его.
/etc/nbd-server/config
[generic]
    user = nbd
    group = nbd
[arch]
    exportname = /srv/arch.img
    copyonwrite = false
Примечание
Установите
copyonwrite
в true, если вы хотите одновременно использовать несколько клиентов, использующих один и тот же ресурс NBD; для получения дополнительной информации смотрите
nbd-server(5)
. Также используйте
chown
, чтобы изменить владельца каталога exportname на
nbd
.
Запустите
nbd
службу systemd.
SKUF
SKUF Network Boot System
- проект, который позволяет загрузить Arch Linux по сети, используя в качестве корня
разрежённый файл
, расположенный на
Samba
сервере.
Для начала, установите
samba
и создайте для неё конфигурационный файл:
/etc/samba/smb.conf
[global]
	workgroup = WORKGROUP
	security = user

[arch]
	path = /srv/samba
	valid users = @skuf
	write list = @skuf
	guest ok = no
	read only = no
	writeable = yes
	browseable = yes
Примечание
Все разрежённые файлы будут располагаться в указанной вами директории (в этом примере -
/srv/samba
).
Запустите
smb
службу systemd
После этого создайте группу
skuf
и пользователей, которые будут участниками этой группы и через которых будет происходить монтирование папки
SAMBA
на клиентской машине.
# groupadd skuf
# useradd test -g skuf
# smbpasswd -a test
Установка клиента
Затем мы создадим полную установку Arch Linux в подкаталоге на сервере. Во время загрузки бездисковый клиент получает IP-адрес от DHCP-сервера, а затем загружается с хоста с помощью PXE и монтирует эту установку в качестве своего корня.
Настройка каталога
Примечание
Создание отдельной файловой системы требуется для NBD, но необязательно для NFS и может быть пропущено/проигнорировано.
Создайте
разрежённый файл
размером не менее 2 ГиБ и создайте на нём файловую систему btrfs (вы также можете использовать реальное блочное устройство или
LVM
, если хотите).
# truncate -s 2G /srv/arch.img
# mkfs.btrfs /srv/arch.img
# export root=/srv/arch
# mount --mkdir -o loop,compress=lzo /srv/arch.img "$root"
Установка базовой системы
Установите
devtools
и
arch-install-scripts
, а затем запустите
pacstrap
, чтобы установить
основные пакеты
для клиента:
# pacstrap -K "$root" base linux linux-firmware mkinitcpio-nfs-utils nfs-utils
Примечание
Во всех случаях
mkinitcpio-nfs-utils
по-прежнему требуется.
ipconfig
, используемый на ранних этапах процесса загрузки, предоставляется только последним.
Теперь необходимо создать initramfs.
NFS
Для того, чтобы монтирование NFSv4 работало (не поддерживается
nfsmount
- по умолчанию для хука
net
), необходимы тривиальные модификации хука
net
.
# sed s/nfsmount/mount.nfs4/ "$root/usr/lib/initcpio/hooks/net" > "$root/usr/lib/initcpio/hooks/netnfs4"
# cp $root/usr/lib/initcpio/install/net{,nfs4}
Копия
net
, к сожалению, необходима, чтобы он не перезаписывался при обновлении
mkinitcpio-nfs-utils
во время установки клиента.
Отредактируйте
$root/etc/mkinitcpio.conf
и добавьте
nfsv4
в
MODULES
,
netnfs4
в
HOOKS
и
/usr/bin/mount.nfs4
в
BINARIES
.
Затем мы выполним
chroot
для нашей установки и запустим
mkinitcpio
:
# arch-chroot "$root" mkinitcpio -p linux
NBD
Пакет
mkinitcpio-nbd
AUR
должен быть установлен на клиенте. Соберите его с помощью
makepkg
и установите его:
# pacman --root "$root" --dbpath "$root/var/lib/pacman" -U mkinitcpio-nbd-0.4-1-any.pkg.tar.xz
Затем вам нужно добавить
nbd
в ваш массив
HOOKS
после
net
;
net
настроит вашу сеть для вас, но не пытайтесь монтировать NFS, если
nfsroot
не указан в параметрах ядра.
SKUF
Для установки Arch Linux на
разрежённый файл
используя
SKUF Network Boot System
, склонируйте
git
репозиторий:
$ git clone
https://github.com/BiteDasher/skuf.git
$ cd skuf
$ ./switch-tag latest
Затем соберите пакет
skuf
и
ISO-образ
, который позже будет использован в качестве переходного этапа для запуска основной системы через
kexec
Перед сборкой пакета настройте метод шифрования паролей для SAMBA (см.
[1]
):
tune.crypt
A B
X Y
I O
tune.password
1234 Test password!
Потом задайте параметры
по-умолчанию
:
defaults
SAMBA_USERNAME="testuser"
SAMBA_PASSWORD="pa33w0rd"
SAMBA_ADDRESS="192.168.0.5"
SAMBA_PORT="445"
SAMBA_VERSION="3.0"
...
Установите необходимые пакеты:
# ./install_deps.sh
И, наконец, соберите пакет
skuf
:
$ ./tune_crypt.sh
$ ./tune_password.sh
$ ./setup_defaults.sh
$ ./build_rootfs_tar.sh
$ ./build_package.sh
ISO-образ
:
# ./setup_repo.sh
# ./build_iso.sh
и
разрежённый файл
:
# ./create_image.sh -s
РАЗМЕР_В_ГИГАБАЙТАХ
дополнительные_пакеты
Когда закончите, переместите
arch.ext4
в
/srv/samba
.
Настройка клиента
В дополнение к настройке, упомянутой здесь, вы также должны установить свои
имя хоста
,
часовой пояс
,
локаль
и
раскладку клавиатуры
, а затем следуйте любым другим соответствующим разделам
руководства по установке
.
Загрузчик
GRUB
Эта статья или раздел нуждается в
переводе
Примечания:
Оригинал раздела предложено к объединению с
GRUB
(обсуждение:
Talk:Diskless system (Русский)#
)
Несмотря на то, что GRUB плохо документирован, он загружается через PXE.
# pacman --root "$root" --dbpath "$root/var/lib/pacman" -S grub
Создайте префикс grub для целевой установки для обеих архитектур, используя
grub-mknetdir
.
# arch-chroot "$root" grub-mknetdir --net-directory=/boot --subdir=grub
К счастью для нас, grub-mknetdir создает префиксы для всех компилированных/установленных целей, а сопровождающие
grub
были достаточно хороши, чтобы предоставить нам обоих в одном пакете, поэтому grub-mknetdir нужно запускать только один раз.
Примечание
В показанных ниже настройках
10.0.0.1
используется в качестве примера IP-адреса NFS/NBD сервера.
Теперь мы создаем тривиальную конфигурацию GRUB:
# vim "$root/boot/grub/grub.cfg"
menuentry "Arch Linux" {
    linux /vmlinuz-linux quiet add_efi_memmap ip=:::::eth0:dhcp nfsroot=10.0.0.1:/arch
    initrd /initramfs-linux.img
}

menuentry "Arch Linux (NBD)" {
    linux /vmlinuz-linux quiet add_efi_memmap ip=:::::eth0:dhcp nbd_host=10.0.0.1 nbd_name=arch root=/dev/nbd0
    initrd /initramfs-linux.img
}
GRUB
сделает
set root=(tftp,10.0.0.1)
автоматически, так что ядро и initramfs будут переданы через TFTP без какой-либо дополнительной настройки, хотя вы можете явно установить его, если у вас есть другие пункты меню без tftp.
Примечание
Все файлы GRUB и файлы initcpio должны быть доступны через TFTP. Например, для установки NBD с корнем TFTP, установленным на
/srv/tftp
, для успешной загрузки должны присутствовать файлы
/srv/tftp/grub/x86_64-efi/core.efi
и
/srv/tftp/vmlinuz-linux
. Вы можете скопировать все файлы
/boot
внутри образа в корень TFTP-сервера.
Вы можете сгенерировать конфигурацию grub командой
grub-mkconfig
, чтобы убедиться, что настройки видео установлены правильно. Однако после этого нужно изменить
boot.cfg
, чтобы удалить
search --no-floppy ...
и убедиться, что опции
linux
initrd
(пути, настройки NBD, настройки NFS) установлены правильно.
Измените параметры ядра по необходимости, обратитесь к параметрам
PXELINUX
для NBD.
PXELINUX
PXELINUX предоставляется пакетом
syslinux
, для получения дополнительной информации смотрите
Syslinux (Русский)#PXELINUX
.
Дополнительные точки монтирования
Корень NBD
В конце загрузки вы захотите переключить монтирование корневой файловой системы на
rw
и включить
compress=lzo
, что значительно улучшит производительность диска по сравнению с
NFS
.
# vim "$root/etc/fstab"
/dev/nbd0  /  btrfs  rw,noatime,compress=lzo  0 0
Каталоги состояний программ
The factual accuracy of this article or section is disputed.
Reason:
systemd does not use persistent logging by default when /var/log/journal is in tmpfs and/or does not exist (Discuss in
Talk:Diskless system (Русский)
)
Вы можете смонтировать
/var/log
, например, как tmpfs, чтобы журналы с нескольких хостов не смешивались непредсказуемо и делали то же самое с
/var/spool/cups
, поэтому 20 экземпляров cups, использующих один и тот же spool, не сражаются друг с другом и делают 1 498 заданий на печать и едят целую бумагу (или, что еще хуже: тонер-картридж) в одночасье.
# vim "$root/etc/fstab"
tmpfs   /var/log        tmpfs     nodev,nosuid    0 0
tmpfs   /var/spool/cups tmpfs     nodev,nosuid    0 0
Было бы лучше настроить программное обеспечение, которое имеет какое-то состояние/базу данных для использования уникальных каталогов для хранения состояния/баз данных для каждого хоста. Например, если вы хотите запустить
puppet
, вы можете просто использовать спецификатор
%H
в файле юнита puppet:
# vim "$root/etc/systemd/system/puppetagent.service"
[Unit]
Description=Puppet agent
Wants=basic.target
After=basic.target network.target

[Service]
Type=forking
PIDFile=/run/puppet/agent.pid
ExecStartPre=/usr/bin/install -d -o puppet -m 755 /run/puppet
ExecStart=/usr/bin/puppet agent --vardir=/var/lib/puppet-%H --ssldir=/etc/puppet/ssl-%H

[Install]
WantedBy=multi-user.target
Puppet-агент создаёт
vardir
и
ssldir
, если они не существуют.
Если ни один из этих подходов не подходит, последним разумным вариантом будет создание
systemd.generator(7)
, который создаёт узел монтирования, специфичный для текущего хоста (к сожалению, спецификаторы не разрешены в юнитах монтирования).
Загрузка клиента
NBD
Эта статья или раздел нуждается в
переводе
Примечания:
Оригинал неточен:When using COW on the server, the clients all effectively have read-only mounts of the original filesystem; it should theoretically be safe to do a read-write mount on the NBD server (обсуждение:
Talk:Diskless system (Русский)#
)
Если вы используете NBD, вам нужно будет размонтировать
arch.img
до/во время загрузки вашего клиента.
Это особенно интересно, когда дело доходит до обновлений ядра. У вас не может быть смонтирована ваша файловая система клиента при загрузке клиента, но это также означает, что вам нужно использовать ядро отдельно от вашей файловой системы клиента, чтобы его собрать.
Вам нужно сначала скопировать
$root/boot
с установки клиента на ваш корень tftp (то есть в
/srv/boot
).
# cp -r "$root/boot" /srv/boot
Затем вам нужно будет размонтировать
$root
перед запуском клиента.
# umount "$root"
Примечание
Чтобы обновить ядро на этом этапе, вам нужно либо смонтировать
/srv/boot
с помощью
NFS
в
fstab
на клиенте (до обновления ядра) или смонтировать вашу клиентскую файловую систему после того, как клиент отключился от NBD
SKUF
Запишите
skuflinux-smth.iso
на флешку, воткните её в компьютер и выберите в настройках загрузки
UEFI
или BIOS.
Примечание
Если на клиентской машине есть
UEFI
, вы можете установить
SKUF
на
ESP
раздел, чтобы не использовать флешку/CD/DVD. Для этого монтируйте
skuflinux-smth.iso
куда-нибудь (например в /mnt), потом скопируйте
/mnt/skuf/boot/x86_64/{vmlinuz-linux,initramfs-linux.img}
на
ESP
раздел и выполните
efibootmgr -c -d /dev/sdX -p Y -u 'initrd=\initramfs-linux.img' -l '\vmlinuz-linux' -L 'SKUF'
где
/dev/sdX
- целевой диск и
Y
- номер
ESP
раздела.
Смотрите также
kernel.org: Монтирование корневой файловой системы через NFS (nfsroot)
syslinux.org: pxelinux FAQ