И снова pxe, оптимизация, загрузка разных образов

Привет всем,
И снова пишу про pxe.
Что это, и чем интересно я писал тут а чуть раньше тут

Начну с того, что в тех решениях было недоработанно - большая часть “хитрых” действий переносилась в подключение к домену, т.е.
ВО ПЕРВЫХ - могло быть легко отключено банальным редактированием параметров ядра передаваемых при загрузке (домен и пароль).
ВО ВТОРЫХ - могло быть отключено при переводе openrc в пошаговый режим.
В ТРЕТЬИХ - совершалось на “кругу” default, и некоторые фишки приходилось “закладывать” прямо в squash.
В ЧЕТВЕРТЫХ - ну не секурно передавать пароль самбового client-а через /proc/cmdline. Этож самый урезанный пользователь может прочесть. Ну не солидно. (решение этого и предыдущего пунктов частичто упомянуто там же, сейчас распишу подробнее)
В ПЯТЫХ - мало кто может с уверенностью сказать, что “некоторый” дистрибутив идеален для всех ситуаций. Необходимо иметь возможность грузить несколько разных версий образов, и при этом ни один не должен позволять слишком многого всяким неавторизованным юзерам.


Итак, начну по порядку:
Для начала, тем кто захочет устанавливать pxe-сервер по инструкции я бы порекомендовал самому подсмотреть что же там происходит.
mc /var/lib/layman/calculate/profiles/templates/install/3pxe/
Само собой перед этим необходимо иметь базовые понятия по шаблонам.

Посмотрели? Отлично, теперь есть три пути:

  • Кошегный - установить по инструкции и далее переделать некоторые конфиги (о них ниже)
  • Тру-кошегный - самому внести нужные изменения в нужные конфиги, создать нужные файлы/директории, написать скрипты “под себя”. И все это опять же - с учетом советов приведенных ниже
  • Истинно-православный - осмыслить оба предыдущих варианта, структурировать их, написать свои шаблоны, утилиты “добавления и обновления iso-шек” привязать к eselect-у, доработать мои “костыли”, найти(если есть) мои ошибки и исправить…
    И поделиться наработками с сообществом.

Искренне советую вам третий путь(с обязательным пунктом про поделиться) через второй(так сказать чтоб лучше понимать что там происходит).

Сам же опишу первый :wink:


Итак - будем считать, что вы воспользовались утилитой cl-install --pxe...
И установили все необходимые службы и каталоги, и готовы над ними издеваться их улучшить.
Предлагать заменить pxelinux на grub2 я уже не стану, ибо есть ряд материнок, глядя на реализацию pxe которых хочется сильно и долго нецензурно выражаться. Они и pxelinux не всегда нормально цепляют (если вдруг перестал загрузчик по pxe грузиться - достаточно машину ОБЕСТОЧИТЬ!!! чтоб заряд на кондерах стек, и загрузить. пришел опытным путем), а про такой удобный но “тяжелый” загрузчик как grub и говорить нечего.

Загрузчик мы трогать почти не будем, но структуру директорий изменим.
Для этого создадим директорию /var/calculate/pxe/live
в которую будем разворачивать iso-шки
Исошки будем разворачивать аналогично следующему скрипту

isoname="<адрес и имя iso-файла>.iso"
mount ${isoname} /mnt/cdrom
rsync -av /mnt/cdrom/ /var/calculate/pxe/live/$(basename ${isoname} .iso)/
umount /mnt/cdrom

Таким образом в результате мы получим нечто вроде

# ls -l /var/calculate/pxe/live/cldg-20120622-i686/
итого 1515228
dr-xr-xr-x 2 root root       4096 июня  22 07:57 boot
dr-xr-xr-x 2 root root       4096 июня  22 07:57 isolinux
-r-xr-xr-x 1 root root          9 июня  22 07:57 livecd
-r-xr-xr-x 1 root root 1551572992 июня  22 07:57 livecd.squashfs
dr-xr-xr-x 2 root root       4096 июня  22 07:57 syslinux

Теперь у нас на сервере может быть несколько версий системы, вроде
/var/calculate/pxe/live/cldg-20120622-i686/
/var/calculate/pxe/live/cldg-20120623-i686/
/var/calculate/pxe/live/cldg-20120624-i686/
Но переписывать конфиг ради каждого обновления неразумно(сложно скриптами, и можно “накосячить” если вручную). Кстати, для сравнения - если действовать по инструкции, то придется перезаписывать непосредственно livecd.squashfs и ядро, что для загруженных по pxe систем может закончиться плачевно.
Гораздо лучше и проще создать симлинк указывающий на выбранную дефолтной систему

# ls -ld /var/calculate/pxe/live/cldg*
drwxr-xr-x 5 root root 4096 июня  22 09:06 /var/calculate/pxe/live/cldg-20120622-i686
lrwxrwxrwx 1 root root   12 мая   16 16:41 /var/calculate/pxe/live/cldg-i686 -> cldg-20120622-i686

B прописать его в конфиг.

# less /var/calculate/pxe/pxelinux.cfg/default
....
LABEL cld-builder
        MENU LABEL Calculate Linux Desktop LiveDVD Builder
        KERNEL /live/cldg-i686/boot/vmlinuz
        APPEND real_root=/dev/nfs nfsroot=#-list(os_install_net_ip,0)-#:/var/calculate/pxe/live initrd=/live/cldg-i686/boot/initrd init=/linuxrc looptype=squashfs unionfs doload=squashfs,isofs,unionfs loop=/cldg-i686/livecd.squashfs nodevfs cdroot video=uvesafb:ywrap,1024x768-32@60,mtrr:3,splash=silent,theme:tty1 console=tty1 udev dolvm noresume doscsi scratch docache dolvm
...

Аналогично можно добавить другие симлинки на другие образы и прописать их в конфиг

И изменить конфиг nfs-сервера

 # less /etc/exports 
/var/calculate/pxe/live *(ro,no_root_squash,acl,insecure,async,no_subtree_check)
##  указанные ниже директории нужны чтоб иметь всегда актуальную версию портежей везде
/usr/portage *(ro,no_root_squash,acl,insecure,async,no_subtree_check)
/var/lib/layman *(ro,no_root_squash,acl,insecure,async,no_subtree_check)
/var/cache/eix *(ro,no_root_squash,acl,insecure,async,no_subtree_check)
##  /var/cache/eix - тоже директория, поскольку я использую app-portage/eix-0.25* что всем и рекомендую

Объясню что получилось:
Теперь nfsroot для загружаемой системы будет директория /var/calculate/pxe/live на сервере.
tftp же продолжает “раздавать” файлы из /var/calculate/pxe/ (можно изменить, но я решил не заморачиваться с настройками)
Этот tftp позволяет загрузить как сам загрузчик - [pxelinux.0](file://var/calculate/pxe/pxelinux.0) , так и уже загрузчику - вытянуть ядро и initrd
KERNEL /live/cldg-i686/boot/vmlinuz
APPEND real_root=/dev/nfs nfsroot=#-list(os_install_net_ip,0)-#:/var/calculate/pxe/live initrd=/live/cldg-i686/boot/initrd init=/linuxrc looptype=squashfs...
А squash-образ зацепится из nfsrootloop=/cldg-i686/livecd.squashfs


Все. Теперь у нас есть возможность грузить любой образ с сервера, и легко заменять его другим(в т.ч. без удаления старого образа чтоб не “вешать” загруженние с ниго машины)

Следующий шаг - безопасность.
Наша система грузится по сути в режиме LiveCD, но вместо диска используется nfsroot.
Тут я уже упоминал о cdupdate() из /usr/share/genkernel/defaults/initrd.scripts , но таки повторюсь
Если в /mnt/cdrom(в данном случае в nfsroot) есть файл cdupdate.sh, и он исполняемый, то практически перед chroot-ом в real_root, он исполняется.
Поскольку nfsroot-ом со стороны сервера является /var/calculate/pxe/live/, для удобства я создал следующее:

* файл

<code class="bash"># cat /var/calculate/pxe/live/cdupdate.sh 
#!/bin/sh
if [ -z "${NEW_ROOT}" ]; then
        export NEW_ROOT=/union/
fi
for f in `dirname "$0"`/cdupdate.d/*; do
        if [ -x "$f" ]; then
                sh "$f"
        fi
done
:
</code>

* директорию /var/calculate/pxe/live/cdupdate.d/ со следующими файлами:

# for f in /var/calculate/pxe/live/cdupdate.d/*; do echo -e "\n============\n$f\n---"; cat $f; done

============
/var/calculate/pxe/live/cdupdate.d/00_pxe_secure.sh
---
#!bin/sh
echo "Set default password"
sed -e 's/^root:.*$/root:$5$<sil>$<hash>:15187:0:::::/' -i "${NEW_ROOT}/etc/shadow"
echo "Add sshd to default"
ln -sf /etc/init.d/sshd "${NEW_ROOT}/etc/runlevels/default/sshd"
echo "Disable /bin/bashlogin"
sed -r -e 's/^#(s[01])/\1/' -e 's/(^c[0-9]:\S*agetty).*(tty[0-9] linux)/\1 38400 \2/' -i "${NEW_ROOT}/etc/inittab"
:

============
/var/calculate/pxe/live/cdupdate.d/10_enable_spla.sh
---
#!/bin/sh

## correct splash
cp -a ${NEW_ROOT}/var/lib/layman/calculate/profiles/templates/install/1merge/cldg-themes/tty* ${NEW_ROOT}/etc/splash/
:


============
/var/calculate/pxe/live/cdupdate.d/20_zram.sh
---
#!/bin/sh

if modprobe -v zram zram_num_devices=4 ; then
    echo "Set ZRAM 30% of memory/ If exist ..."
    echo $(( ( $(sed -nre 's/^(MemTotal):\s+([0-9]+)\s+kB$/\2 +/p' </proc/meminfo) 0 )*1024 *3 /10 )) >/sys/block/zram0/disksize
    mkswap /dev/zram0
    echo "/dev/zram0 none swap pri=32767 0 0" >>"${NEW_ROOT}/etc/fstab"
fi
:

============
/var/calculate/pxe/live/cdupdate.d/30_find_mpoints.sh
---
#!/bin/sh

echo "Seek devices to mount"
FS_MOUNT="ext2,ext3,ext4,reiserfs"
MOUNT_OPTS="ro,nosuid,nodev,acl,user_xattr"
FSTAB="${NEW_ROOT}/etc/fstab"

mkmpoint(){
        local i=0
        local mpoint=
        while ! mkdir "${NEW_ROOT}/${mpoint}" &>/dev/null; do
                mpoint=/media/`basename ${1}`
                [ "${i}" -gt 0 ] && mpoint="${mpoint}_${i}"
                i=$(( ${i}+1 ))
        done
        echo "${mpoint}"
}

blkid | sed -nre 's/^(\S+):\s+(LABEL="(\S+)"\s+)?(UUID="(\S+)"\s+)?(LABEL="(\S+)"\s+)?(TYPE="(\S+)"\s+)?$/\1|\3\7|\5|\9/p'| 
while IFS='|' read dev label uuid type; do
                if echo "${FS_MOUNT}"| grep -qw "$type" ; then
                        grep -q "^${dev} " ${FSTAB} && continue
                        mpoint=`mkmpoint ${dev}`
                        echo "${dev} ${mpoint} ${type} ${MOUNT_OPTS} 0 1" >>${FSTAB}
                fi
done
:

============
/var/calculate/pxe/live/cdupdate.d/30_find_swap.sh
---
#!/bin/sh


for sw in $( /sbin/blkid -t TYPE=swap -o device ); do
    echo "${sw} none swap sw 0 0" >>"${NEW_ROOT}/etc/fstab"
done
:

============
/var/calculate/pxe/live/cdupdate.d/99_enable_rc_logger.sh
---
#!/bin/sh

RC_CONF=${NEW_ROOT}/etc/rc.conf

if ! grep -i 'rc_logger=(yes|"yes")' ${RC_CONF} ; then
    echo 'Set rc_logger="YES" in rc.conf'
    ( echo; echo 'rc_logger="YES"' ) >>${RC_CONF}
fi
:

============
/var/calculate/pxe/live/cdupdate.d/99_mount_portage.sh
---

#!/bin/sh

echo "Starting $0 ..."

for p in /usr/portage /var/lib/layman /var/cache/eix; do
    echo "<server_IP>:${p} ${p} nfs ro,nolock 0 0" >>${NEW_ROOT}/etc/fstab
done
:

К сожалению (и удивлению) такие команды как swapon/swapoff в initrd есть, а mkswap - нет.
Так что для использования /var/calculate/pxe/live/cdupdate.d/20_zram.sh недостаточно будет включить в ядре параметры
CONFIG_STAGING=y
CONFIG_ZRAM=m
Также необходимо в файл /usr/share/genkernel/defaults/busy-config прописать следующее
CONFIG_MKSWAP=y
CONFIG_FEATURE_MKSWAP_UUID=y


Однако полностью заменить шаблоны cdupdate не может (в принципе может, но я такую задачу перед собой не ставил)
Итак, дополнительно необходимо использовать некоторые из этих шаблонов, а именно
/var/calculate/remote/templates//client/domain/pxe_client/2start/00_restart_syslog.sh
/var/calculate/remote/templates//client/domain/pxe_client/2start/20_remove_guest.sh
/var/calculate/remote/templates//client/domain/pxe_client/2start/37_find_root.sh
/var/calculate/remote/templates//client/domain/pxe_client/2start/38_find_calculate.sh
/var/calculate/remote/templates//client/domain/pxe_client/2start/40_correct_ssh_keys.sh
В принципе 20_remove_guest.sh можно было реализовать в /var/calculate/pxe/live/cdupdate.d/00_pxe_secure.sh
А 37_find_root.sh и 38_find_calculate.sh “запихнуть” в /var/calculate/pxe/live/cdupdate.d/30_find_mpoints.sh, что я скорее всего попозже и сделаю.

Еще не помешало бы переместить domain и domain_pw в cdupdate.d, но пока не горит.

Еще есть куча задумок, но для начала надо это все довести до ума.

Михаил, тема интересна, у вас ещё какие либо продвижения есть? :slight_smile:

Собственно, столкнулся с проблемой: на клиентских машинах (PXE) было сбито время. Позже выяснил, что и на клиентских машинах, с установленными CLDx и введенными в домен, время тоже сбито.

Решил настройкой ntpd на сервере и шаблоном для всех клиентов.

Есть, но все они пока не систематизированы.
Это скорее набор костылей решающих некоторые попутные проблемы и задачи.
Когда найду время их объединить - обязательно отпищусь

это дубляж того что тут но чтоб не “растекаться мыслью” по всему форуму решил сюда скопировать

… сколько грузится система по pxe
порядка полуминуты-трех на 100MB в раб.станцию и гигабите в сервер.
зависит от машины

это с убранными ненужными действиями(весь мой полугодовой опыт работы с pxe говорить что ненужными) утяжеляющими загруженную систему через “грязные хаки”, вроде:

* gtk-update-icon-cache в шаблонах

find ${NEW_ROOT}/var/lib/layman/calculate/profiles/templates/ -name icons-update -exec rm -vf \{\} \;

* “трогание”(touch) ядра+либ, а также создание странных, ненужных ни для pxe ни для scratch симлинков (у меня во всяком случае ни там ни там нет в них необходимости) в шаблоне

find ${NEW_ROOT}/var/lib/layman/calculate/profiles/templates/ -name prepare-scratch -exec rm -vf \{\} \;

* аналогичное (якобы нужное) “трогание” (touch /* /bin/* /sbin/*) в службе /etc/init.d/calculate подобным скриптом:

sed -ri 's/(^\s+touch.*$)/#\1/' ${NEW_ROOT}/etc/init.d/calculate

* отключением жрущих ценную память prelink и preload следующим образом:

rm -f ${NEW_ROOT}/etc/runlevels/boot/preload
echo 'PRELINKING=""' >>${NEW_ROOT}/etc/conf.d/prelink

Также среди улучшений есть многослойное подключение squash-ей с “дополнительным набором софта” и нечто вроде DNA с целыми группами конфигов/шаблонов и прочей мелочи которая должна присутствовать ДО ПЕРВОГО ВВОДА В ДОМЕН

Создание упомянутых squash-ей пока приходится делать вручную.
Но можно допилить набор утилит cl-assemble cl-builder cl-image для автоматизации этого процесса.
все монтирование слоев основано на подобном действии:

mount -vo "remount,ins:1:${new_branch}=ro+wh" ${NEW_ROOT}