Бездисковая загрузка linux (загрузить по сети и работать локально)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

iltmpz
Сообщения: 34
ОС: Mandriva 2010

Бездисковая загрузка linux

Сообщение iltmpz »

Захотел вот сделать бездисковую загрузку рабочих станций с сервера (как запасной вариант на случай повреждения лок. фс, просто быстро загрузить linux rescue по PXE, чтобы не возиться с болванками и т.п.)
Однако не могу понять принцип, как это делать.

Сейчас у меня OpenSUSE linux, работает бездисковая установка, которая использует свое ядро и initrd. Она сразу запускает процесс установки. А хочется, чтобы просто монтировалась ФС и с нее уже шла загрузка.

Однако я никак не могу понять принципы функционирования и параметры ядра:
Как я понял, грузится ядро и первоначально в качестве корневой ФС использует initrd. Как только первоначальная загрузка завершена - монтируется уже основная корневая ФС, и загрузка идет дальше?

Для установки используются параметры ядра (в конфиге tftp): append initrd=initrd install=nfs://ip:/share
А вот что делать для загрузки - я не понимаю.
- пробовал использовать те же linux/initrd от инсталлятора - сразу начинается установка.
- взял свои linux/initrd из /boot - он не видит nfs. Пересобрал ядро с поддержкой nfs в ядре - не понимаю, как передавать ему параметры, пробовал:
append initrd=initrd-2 ramdisk_size=32768 root=/dev/ram0 nfsroot=nfs://ip:/share/fs
- пробовал в /share выкладывать копию корневой ФС, либо создавать файл fs и в нем размещать копию ФС.
Монтироваться эта ФС не хочет - wrong fs type...
Причем initrd похоже подгружается, а вот дальше процесс не идет.

Как я понимаю - вся проблема в том, что возможно чего-то не хватает в ядре, возможно, как-то надо подправить initrd и грамотно подключить корневую ФС - буквально пара команд и параметров, но вот никак не разберусь, какие...
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Бездисковая загрузка linux

Сообщение Ленивая Бестолочь »

соберите ядро вот так:
Очень важно включить поддержку NFS в файловых системах, далее в поддержке сети (вернуться) IP kernel level autoconfiguration и в открывшихся возможностях выбрать поддержку BOOTP и RARP. После этого в файловых системах выбрать поддержку корневого раздела на NFS.

Многие советуют собирать большие ядра с поддержкой initrd, помещая на него часть загружаемых модулей. Но автор статьи собрал монолитное ядро без поддержки модулей, выбросив всё лишнее - в том числе драйвера неиспользуемых сетевых карт. Получилось чуть больше 1 Мб.

Такое ядро, в принципе, даже влазит на дискету и загружается последней версией loadlin (что очень важно для старых компьютеров, не имеющих других внешних устройств, кроме дисковода 3,5").

ВНИМАНИЕ! В дистрибутиве Debian3.1 имеется loadlin с ошибками. Он такое ядро на загружает (хотя это обещано в его документации). "Правильный" loadlin имеется в комплекте следующего Debian'а, который на момент написания этого текста находится в состоянии test.

Для правильной (тестовой) загрузки ядру необходимо передать строку параметров типа

root=/dev/nfs nfsroot=/netroot ip=10.1.1.2:10.1.1.1::255.255.255.0:::

Имея в виду, что IP-адрес сервера 10.1.1.1

и грузитесь с nfs сервера.
(initrd НЕ нужен при этом. если он, конечно вам не нужен для других целей.
если initrd будете использовать обязательно в нем создайте с помощью mknod /dev/nfs)
взято тут: http://www.linuxcenter.ru/lib/articles/sof...erminals2.phtml

у меня так долго работало, потом захотелось ssh и я переделал на initrd. могу поделиться если надо, но это довольно сложно.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
iltmpz
Сообщения: 34
ОС: Mandriva 2010

Re: Бездисковая загрузка linux

Сообщение iltmpz »

Спасибо, очень полезная ссылка,
хотя у меня пока не заработало - nfs не монтируется - но продолжаю разбираться...
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Бездисковая загрузка linux

Сообщение Ленивая Бестолочь »

спрашивайте вопросы, если что (только с приложением конфигов и сообщениями об ошибках) - я на этом стадо собак съел :-\
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
iltmpz
Сообщения: 34
ОС: Mandriva 2010

Re: Бездисковая загрузка linux

Сообщение iltmpz »

Включил в ядре IP kernel level autoconfiguration, для него включил DHCP, BOOTP, RARP support.
Еще включил root file system on NFS
Больше в ядре ничего не менял.

В конфиге пробую прописать:

Код: Выделить всё

kernel bzImage
append root=/dev/nfs nfsroot=/local/s1 ip=192.168.30.15:192.168.30.4::255.255.255.0:::

(У меня nfs - 30.4 - я его туда прописал? 30.15 это я вроде как ip бездисковой машины указал). В результате ядро грузится и пишет, что nfs-server не найден.
Пробовал другую настройку: append root=/dev/nfs nfsroot=192.168.30.4:/local/s1 ip=192.168.30.15
Пишет: Looking up port of RPC 100005/1 on 192.168.30.4
rpcbind - timeout, Root-NFS - unable, и дальше предлагает insert root floppy.

192.168.30.4:/local/s1 - сетевая шара nfs работает - в s1 я просто тупо скопировал все файлы из /

Это я еще что-то забыл включить в ядре?
Что я не так сделал?
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Бездисковая загрузка linux

Сообщение Ленивая Бестолочь »

в ядро сетевуху включили жестко или модулем?
(нужно жестко)
в тот момент, когда клиент пытается достучаться до сервера он пингуется?
не увидел у вас в настройках шлюза - он не нужен?
initrd используете?
на сервере запущен portmap?

вот. :-)
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
iltmpz
Сообщения: 34
ОС: Mandriva 2010

Re: Бездисковая загрузка linux

Сообщение iltmpz »

Ленивая Бестолочь писал(а):
26.03.2009 17:39
в ядро сетевуху включили жестко или модулем?
(нужно жестко)
в тот момент, когда клиент пытается достучаться до сервера он пингуется?
не увидел у вас в настройках шлюза - он не нужен?
initrd используете?
на сервере запущен portmap?

вот. :-)

А, точно - сетевуху-то я и забыл жестко включить - мог бы сам догадаться, пересобираю ядро... :)

Клиент не пинговался, шлюз не нужен (хотя не нашел, где его задавать), на сервере все в порядке вроде бы - простая машина к этой nfs цепляется.
inird по Вашему совету не использую (Может, зря, можно было бы все драйвера туда включить чтобы ядро лишний раз не пересобирать?)
Спасибо сказали:
iltmpz
Сообщения: 34
ОС: Mandriva 2010

Re: Бездисковая загрузка linux

Сообщение iltmpz »

Да, точно, спасибо - ядро грузится, rootfs цепляет :)
Теперь возникает вопрос, как проще всего правильно сделать корневую ФС?
1. можно оставить ее read-only?
2. куда и как поместить модули ядра? Не хочу абсолютно все модули жестко включать в ядро. В обычном (не бездисковом) варианте они вроде бы как раз читаются из initrd, а тут что делать?
3. то что предлагают по той ссылке:

Код: Выделить всё

dd if=/dev/zero of=/netrootimage bs=1024 count=524288
mke2fs /netrootimage
- это зачем? Это обязательно, или можно просто скопировать rootfs как я прямо в подкаталог?
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Бездисковая загрузка linux

Сообщение Ленивая Бестолочь »

на каком дистрибутиве вы это все проделываете?
просто про opensuse не могу ничего красивого посоветовать, т.к. я с ней не работал.
а в дебиане я бы сделал так:
создаем директорию для корневой ФС клиента:
ставим туда базовую систему дебиана с помощью debootstrap
собираем ядро и модули, раскладываем все по местам (ядро на клиент или tftp если пользуете), модули в /lib/modules/<версия>

в принципе можно и просто копировать систему, как в том руководстве предлагают.

еще: если будете initrd использовать - придется его распокавать скорее всего и создать в нет /dev/nfs с помощью mknod.


inird по Вашему совету не использую (Может, зря, можно было бы все драйвера туда включить чтобы ядро лишний раз не пересобирать?)

я собирал довольно минималистское ядро под конкретную конфигурацию, поэтому модули не использовал.
initrd я сейчас использую, т.к. пользуюсь не стандартным средством подключения корневой фс, а сделал скрипт, который лежит в initrd и поднимает vpn по ssh до сервера и уже внутри него подключается по nfs. это для безопасности + сжатие трафика.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
iltmpz
Сообщения: 34
ОС: Mandriva 2010

Re: Бездисковая загрузка linux

Сообщение iltmpz »

nfs через vpn по ssh, да еще и из-под initrd это круто!
Мне наверно такое не понадобится...

Наконец-то дособирались модули - скопировал, подключил - ядро грузится, модули цепляются.
Уже выдало приглашение "login:", правда залогиниться пока не дает.
Думаю, осталось совсем немного: смонтировать пару ФС для записи (типа /tmp), а то у меня только read-only rootfs, разобраться с fstab и добиться того чтобы это запускалось. В ближайшее время закончу.
Еще раз спасибо! :)
Спасибо сказали:
iltmpz
Сообщения: 34
ОС: Mandriva 2010

Re: Бездисковая загрузка linux

Сообщение iltmpz »

Наконец-то дошли руки - доделал, ровно полгода прошло :crazy:
Но лучше поздно, чем никогда :)
Итак, описываю что и как делал и что получилось (в основном чтобы еще через полгода-год не изобретать все это еще раз если понадобится, ну и вдруг кому тоже полезно будет).

В качестве бездискового клиента использовал OpenSUSE 11.0 x86
Что использовать в качестве серверов NFS и DHCP - не принципиально (у меня те же opensuse, правда x64 и 10.3)
NFS-сервер: 192.168.30.4, путь к корневой фс: /local/pxe/s2
Также у меня работает DHCP-сервер, в нем дополнительно включил раздачу имен (а то имя хоста само ставилось как 192)
Корневую ФС сервер отдает клиенту как read-only.

Настройка tftp-сервера: в pxelinux.cfg/default прописал:

Код: Выделить всё

# Rescue server
label rsc
 kernel bzImage
 append root=/dev/nfs nfsroot=192.168.30.4:/local/pxe/s2 ip=dhcp vga=0x314

Поставил на тестовую машину (vmware) чистую OpenSUSE 11.0 x86, потом загрузился с другой системы, смонтировал ее диск, скопировал файловую систему на сервер NFS: rsync -auxS /mnt/ 192.168.30.4:/local/pxe/s2 (пишу по памяти)
Потом есть нюанс: root_squash в /etc/exports - root:root на клиенте превращается в nobody:nogroup на сервере.
Сменил владельца файлов рута на nobody:
find /local/pxe/s2/ -user root | xargs chown nobody #(пишу по памяти)
find /local/pxe/s2/ -group root | xargs chgrp nogroup #(пишу по памяти)
При этом не поменялись владельцы файлов с пробелами в именах (видимо я как-то не так xargs использовал), ну и фиг с ними.

Далее, меняем конфиги будущей бездисковой системы:
В /local/pxe/s2/etc/init.d/boot добавил после секции # populate /dev with initial content:

Код: Выделить всё

#
# Diskless boot features
#
echo "Diskless boot processing"
echo -n "Mounting ramdisk to /tmp"
mount -t tmpfs -o size=200m tmpfs /tmp
rc_status -v -r
mkdir /tmp/etc /tmp/var /tmp/log /tmp/misc /tmp/lock /tmp/root
echo  "Copying /etc to /tmp"
cp -r /etc /tmp
echo  "Copying /var to /tmp"
cp -r /var_ro/* /tmp/var
echo  "Mounting /tmp/etc to /etc"
mount --bind /tmp/etc /etc
rc_status -v -r

Что, зачем и почему:
В /tmp монтирую рамдиск - диск в памяти т.е, 200 Мбайт достаточно с запасом, на клиентах выделить столько не проблема.
На рамдиске размещаем данные, которые должны быть rw - это /etc, /var и /root
Далее нюанс с перекидыванием etc: /etc нужно для нормальной работы в режиме read-write, значит монтируем туда рамдиск, причем etc нужно и до такого монтирования, и после него. Чтобы не возникало путаницы с 2 разными etc и чтобы не вникать, какая часть файлов нужна "до", а какая "после" - просто скопировал все 1к1, после чего произвел подмену одной командой mount --bind.

Кроме этого я создал каталог /var_ro. Он копируется на рамдиск как /var при каждой загрузке.
Кроме того, я создал каталог /ro_shared - для хранения слишком больших каталогов из /etc и /var, которые могут быть read-only. Копировал их не надо - просто подключаю symlink'ами.
В итоге получилось так:

Код: Выделить всё

# ls -l /local/pxe/s2/
итого 84
drwxr-xr-x  2 nobody nogroup  4096 Авг 20 11:41 bin
drwxr-xr-x  3 nobody nogroup  4096 Авг 20 11:53 boot
drwxr-xr-x  5 nobody nogroup  4096 Авг 20 11:30 dev
drwxr-xr-x 98 nobody nogroup 12288 Авг 20 18:14 etc
drwxr-xr-x  3 nobody nogroup  4096 Авг 20 11:55 home
drwxr-xr-x 13 nobody nogroup  4096 Авг 20 11:41 lib
drwxr-xr-x  2 nobody nogroup  4096 Июн  7  2008 media
drwxr-xr-x  2 nobody nogroup  4096 Авг 20 16:09 mnt
drwxr-xr-x  3 nobody nogroup  4096 Июн  7  2008 opt
drwxr-xr-x  3 nobody nogroup  4096 Авг 20 11:30 proc
lrwxrwxrwx  1 root   root        9 Авг 20 16:10 root -> /tmp/root
drwxr-xr-x  4 nobody nogroup  4096 Авг 20 18:16 ro_shared
drwxr-xr-x  3 nobody nogroup 12288 Авг 20 11:51 sbin
drwxr-xr-x  5 nobody nogroup  4096 Авг 20 11:49 srv
drwxr-xr-x  3 nobody nogroup  4096 Авг 20 11:30 sys
drwxrwxrwt  7 nobody nogroup  4096 Авг 20 12:03 tmp
drwxr-xr-x 12 nobody nogroup  4096 Авг 20 11:32 usr
lrwxrwxrwx  1 root   root        8 Авг 20 16:11 var -> /tmp/var
drwxr-xr-x 14 nobody nogroup  4096 Авг 20 18:13 var_ro

Код: Выделить всё

# ls -l `find /local/pxe/s2/ro_shared -maxdepth 2`
/local/pxe/s2/ro_shared:
итого 8
drwxr-xr-x 4 root root 4096 Авг 20 18:14 etc
drwxr-xr-x 4 root root 4096 Авг 20 18:18 var

/local/pxe/s2/ro_shared/etc:
итого 8
drwxr-xr-x 3 nobody nogroup 4096 Июн  6  2008 bootsplash
drwxr-xr-x 8 nobody nogroup 4096 Авг 20 11:43 gconf

/local/pxe/s2/ro_shared/etc/bootsplash:
итого 4
drwxr-xr-x 3 nobody nogroup 4096 Июн  6  2008 themes

/local/pxe/s2/ro_shared/etc/gconf:
итого 28
drwxr-xr-x 2 nobody nogroup 4096 Авг 20 11:43 2
drwxr-xr-x 2 nobody nogroup 4096 Июн  7  2008 gconf.xml.defaults
drwxr-xr-x 2 nobody nogroup 4096 Июн  7  2008 gconf.xml.mandatory
drwxr-xr-x 6 nobody nogroup 4096 Авг 20 11:51 gconf.xml.schemas
drwxr-xr-x 2 nobody nogroup 4096 Авг 20 11:44 gconf.xml.vendor
-rw-r--r-- 1 nobody nogroup   34 Июн  7  2008 schema-install-source
drwxr-xr-x 2 nobody nogroup 4096 Авг 20 11:51 schemas

/local/pxe/s2/ro_shared/var:
итого 8
drwxr-xr-x 4 root root 4096 Авг 20 18:18 cache
drwxr-xr-x 3 root root 4096 Авг 20 18:19 lib

/local/pxe/s2/ro_shared/var/cache:
итого 8
drwxr-xr-x 5 suse-ncc suse-ncc 4096 Авг 20 11:47 beagle
drwxr-xr-x 5 nobody   nogroup  4096 Авг 20 11:31 zypp

/local/pxe/s2/ro_shared/var/lib:
итого 4
drwxr-xr-x 3 nobody nogroup 4096 Авг 20 15:54 rpm

Как-то бестолково написал,
Смысл такой: если каталог /var/что_то_там нужен большой - на рамдиске его хранить нет места, а находится в /var_ro (который копируется на рамдиск), тогда в /var_ro создаем симлинк в соответствующий каталог /ro_shared. А если в этом /ro_shared оказалось нечто, что должно быть в режиме rw - перемещаем его обратно в /var_ro и делаем симлинк на /var


Следующий этап: почему-то загрузка зависала при попытке найти DHCP, наверно потому что сеть уже была в этот момент подключена, не знаю, просто убрал network start, в файле: /local/pxe/s2/etc/rc.d/network просто заменить все секции 'case "$ACTION" in ' на:

Код: Выделить всё

        start)
                rc_status -v
              ;;
        stop)
                rc_status -v
              ;;
        reload)
                rc_status -v
              ;;
        status)
                rc_status -v
              ;;


Еще в /local/pxe/s2/etc/inittab был runlevel 5, поменял на 3 (все равно X пока не грузятся, точнее грузятся только на той тестовой vmware, но я пока и не ставил себе такой задачи).
И в /etc/fstab убираю все лишнее, т.е. локальные диски.
Кажется, все.
запускаю, при загрузке pxe ввожу "rsc" - система грузится, причем практически без ошибок - ругается на отсутствие в fstab'е rootfs, да и фиг бы с ней.
Почему-то df показывает только одну ФС /dev, не понял почему не показывает корневую и рамдиск, может, потому что /proc и /sys монтируются позже рамдиска, ну да ладно, главное - система работает.


Код: Выделить всё

# ssh 192.168.30.95
Password:
Last login: Fri Aug 21 13:47:46 2009 from 192.168.30.194
Have a lot of fun...
testvm:~ # uname -a
Linux testvm 2.6.25.5-1.1-pae #4 SMP Thu Mar 26 17:51:25 MSK 2009 i686 athlon i386 GNU/Linux
testvm:~ # df
Файловая система     1K-блоков      Исп  Доступно  Исп% смонтирована на
udev                    385916        68    385848   1% /dev
testvm:~ # ls -l /
итого 56
drwxr-xr-x  2 nobody nogroup  4096 Авг 20 11:41 bin
drwxr-xr-x  3 nobody nogroup  4096 Авг 20 11:53 boot
drwxr-xr-x 11 root   root     4220 Авг 21 13:45 dev
drwxr-xr-x 98 root   root     5060 Авг 21 13:45 etc
drwxr-xr-x  3 nobody nogroup  4096 Авг 20 11:55 home
drwxr-xr-x 13 nobody nogroup  4096 Авг 20 11:41 lib
drwxr-xr-x  2 nobody nogroup  4096 Июн  7  2008 media
drwxr-xr-x  2 nobody nogroup  4096 Авг 20 16:09 mnt
drwxr-xr-x  3 nobody nogroup  4096 Июн  7  2008 opt
dr-xr-xr-x 71 root   root        0 Авг 21  2009 proc
lrwxrwxrwx  1 root   root        9 Авг 20 16:10 root -> /tmp/root
drwxr-xr-x  4 nobody nogroup  4096 Авг 20 18:16 ro_shared
drwxr-xr-x  3 nobody nogroup 12288 Авг 20 11:51 sbin
drwxr-xr-x  5 nobody nogroup  4096 Авг 20 11:49 srv
drwxr-xr-x 11 root   root        0 Авг 21  2009 sys
drwxrwxrwt 12 root   root      240 Авг 21 13:45 tmp
drwxr-xr-x 12 nobody nogroup  4096 Авг 20 11:32 usr
lrwxrwxrwx  1 root   root        8 Авг 20 16:11 var -> /tmp/var
drwxr-xr-x 14 nobody nogroup  4096 Авг 20 18:13 var_ro


Если буду менять конфигурацию, доделывать и будет время/желание - этот пост тоже буду редактировать.
Дополнения/уточнения по существу вопроса приветствуются, вопросы тоже можно задавать :)
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Бездисковая загрузка linux

Сообщение rm_ »

Потом есть нюанс: root_squash в /etc/exports - root:root на клиенте превращается в nobody:nogroup на сервере.
Сменил владельца файлов рута на nobody

А почему не использовали опцию "no_root_squash"?

На рамдиске размещаем данные, которые должны быть rw - это /etc

/etc вовсё не обязан быть r/w.

запускаю, при загрузке pxe ввожу "rsc"

Это ещё что/зачем?

Вообще, как-то слишком сложно и путанно получилось. Ну, раз работает, поздравляю.
Спасибо сказали:
iltmpz
Сообщения: 34
ОС: Mandriva 2010

Re: Бездисковая загрузка linux

Сообщение iltmpz »

А почему не использовали опцию "no_root_squash"?
Да, вы правы, no_root_squash было бы проще и правильнее. Не стал менять конфиг в exports чтобы не перезапускать NFS. Действительно, надо будет сделать.
/etc вовсё не обязан быть r/w.
Он ругался на файл /etc/mtab что он read-only. Вообще полезно все-таки rw - например на случай если захочется оперативно поменять конфигурацию.
запускаю, при загрузке pxe ввожу "rsc"

Плохо я написал, непонятно и зря - к вопросу это отношения не имеет.
Это вот отсюда:

Код: Выделить всё

# Rescue server
label rsc

А по умолчанию у меня другая система грузится. Написал действительно как-то путанно, самому не нравится, попробую позже переписать...
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Бездисковая загрузка linux

Сообщение Ленивая Бестолочь »

iltmpz писал(а):
21.08.2009 15:50
Он ругался на файл /etc/mtab что он read-only.

rm /etc/mtab
ln -s /proc/mounts /etc/mtab
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
Аватара пользователя
strah
Сообщения: 283
ОС: Freebsd, linux, Solaris.

Re: Бездисковая загрузка linux

Сообщение strah »

Ленивая Бестолочь писал(а):
21.08.2009 21:27
rm /etc/mtab
ln -s /proc/mounts /etc/mtab

А я просто в /etc/init.d/mountall.sh добавлял к команде mount параметр -n (это на debian, на ALT я это еще в каком-то файле менял).
/earth: file system full
Спасибо сказали: