Страницы

суббота, 16 августа 2014 г.

PXE загрузка сервера без жесткого диска

Случилось так что один из моих серверов накрылся. После "чубайса" (отключения электричества на подстанции) жесткий диск сервера приказал долго жить. Через раз оно пыталось завестись, но все равно возникал kernel panic. Короче надо было либо менять жесткий диск, либо что-то думать. Я физически располагался за 1000 км от этой железки и мог управлять через IP-KVM этим сервером, поэтому вариант с заменой жесткого диска я отбросил. На другом сервере у меня FreeBSD и рейд, и я давно хотел сделать его центральным, а остальные сервера сделать его тонкими клиентами. PXE-сервер я там уже настраивал, но он использовался только для memcheck или бездисковой установки систем.
Итак, у меня FreeBSD PXE-сервер, с inetd ftpd, nfsd, а к нему будут подключаться Gentoo PXE-клиенты.
Опыта подъема такой системы у меня не было, перечислю основные проблемы с которыми я столкнулся:


  1. PXE клиент не получал next-server. У меня роутер Mikrotik. Я там настроил все как надо, но PXE клиент получал только IP, а next-server не получал или файл pxelinux.0. Короче пришлось мне создать отдельный VLAN для PXE, поднять на фряхе еще isc-dhcpd который начал правильно раздавать IP и пути до pxelinux.0. Возможно все-таки косяк был в ROM сетевой платы, но об этом потом.
  2. /usr/local/etc/dhcpd.conf
    subnet 192.168.67.0 netmask 255.255.255.0 {
      range 192.168.67.3 192.168.67.254;
      option domain-name-servers 192.168.67.1;
      option domain-name "VNR";
               option broadcast-address 192.168.67.255;
      default-lease-time 600;
      max-lease-time 7200;
    }

    host white {
      hardware ethernet 6C:F0:49:71:94:6D;
      filename "pxelinux.0";
      server-name "192.168.67.1";
    }
  3. После конфигурирования секции в pxelinux.cfg система начала бутаться. Получала ядро и начался процесс загрузки. Я думал что я уже победил. Но начались кернел паники. За стектрейсом ничего не было видно и я закоментировал в ядре dump_stack после чего начал видеть в чем косяки.
  4. pxelinux.cfg/00000000-0000-0000-0000-6cf04971946d
    DEFAULT gentoo

    LABEL gentoo
        KERNEL /images/192.168.0.252/boot/bzImage
        APPEND initrd=/images/192.168.0.252/boot/initramfs-genkernel-x86_64-3.14.14-gentoo ip=dhcp root=/dev/nfs rw nfsroot=192.168.67.1:/usr/local/www/tftpboot/images/192.168.0.252,nfsvers=3,rw,proto=udp,rsize=32768,wsize=32768 raid=noautodetect nosata
  5. Для работы по NFS надо чтобы уже были виртуальные папки /proc, /dev и т.п. и надо было создать initramfs (Я думаю он для этого нужен). В этом мне помог genkernel. Оно сразу инсталирует полученный архив в /boot
  6. genkernel --install --no-ramdisk-modules initramfs 
  7. Тонкий клиент не мог замаунтить nfsroot, и загрузка вставала на этом, я добавил nfsvers=4, и система начала подключать диск для загрузки и загрузка сдвинулась с мертвой точки. Но после монтирования у файлов владелец имел gid=4294966294. Короче там что-то намудрили с передачей гидов о сервера к клиенту и безопасностью. Прописал nfsvers=3 и проблема ушла, правда на сервере надо было настроить шару как -maproot.
  8. /etc/exports
    V4:/usr/local/www/tftpboot
    /usr/local/www/tftpboot -alldirs -mapall=root -network=192.168.0.0/16
  9. Разница между NFSv3 и NFSv4 еще и в том что при монтировании в NFSv3 надо указывать полный путь до шары, а в NFSv4 только относительный.
  10. Все равно наблюдались проблемы с группами при установке пакетов. /var/tmp/portage использовался пользователь portage, который не существовал на NFS-сервере. Для этого я во время установки пакетов монтировал рам-диск по этому пути.
  11. mount -t ramfs -o size=200m ramfs /var/tmp/portage/
  12. Так же при загрузке ядро не могло подгрузить прошивку от сетевухи, из-за чего она очень тупила, я встроил прошивку с ядро и она начала летать.
  13. CONFIG_PREVENT_FIRMWARE_BUILD=y
    CONFIG_FIRMWARE_IN_KERNEL=y
    CONFIG_EXTRA_FIRMWARE="rtl_nic/rtl8168d-2.fw"
    CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware"
  14. После загрузки не поднимались VLANы и пришлось встроить 8021q модуль в ядро, хотя я и так встроил драйвера в ядро, чтобы не было возможных паник.
  15. CONFIG_VLAN_8021Q=y

    CONFIG_R8169=y
  16. Сетевушка после загрузки уже имела IP, однако вланы настроить не мог, надо было добавить строчку config_eth0="null" и спокойно настраивать вланы, это не вызывала проблем.
  17. /etc/conf.d/net
    dns_domain_lo="VNR"

    modules="iproute2"

    config_eth0="null"
    dns_servers_eth0="8.8.8.8 172.24.2.1"

    vlans_eth0="2 13 999"

    eth0_vlan2_name="vlan2"
    config_vlan2="192.168.0.252/24"
    routes_vlan2="default via 192.168.0.1
    239.2.1.0/24"

    eth0_vlan13_name="vlan13"
    config_vlan13="10.73.24.255/23"
    mac_vlan13="00:1B:21:4F:23:61"
    routes_vlan13="226.100.10.0/24"

    eth0_vlan999_name="vlan999"
    config_vlan999="10.100.10.99/29"
    mac_vlan999="D4:CA:6D:74:1F:EF"
    routes_vlan999="233.33.210.0/24"
  18. Для ускорения загрузки nfs перевел на udp.