Привет всем,
И снова пишу про pxe.
Что это, и чем интересно я писал тут а чуть раньше тут
Начну с того, что в тех решениях было недоработанно - большая часть “хитрых” действий переносилась в подключение к домену, т.е.
ВО ПЕРВЫХ - могло быть легко отключено банальным редактированием параметров ядра передаваемых при загрузке (домен и пароль).
ВО ВТОРЫХ - могло быть отключено при переводе openrc в пошаговый режим.
В ТРЕТЬИХ - совершалось на “кругу” default
, и некоторые фишки приходилось “закладывать” прямо в squash.
В ЧЕТВЕРТЫХ - ну не секурно передавать пароль самбового client-а через /proc/cmdline. Этож самый урезанный пользователь может прочесть. Ну не солидно. (решение этого и предыдущего пунктов частичто упомянуто там же, сейчас распишу подробнее)
В ПЯТЫХ - мало кто может с уверенностью сказать, что “некоторый” дистрибутив идеален для всех ситуаций. Необходимо иметь возможность грузить несколько разных версий образов, и при этом ни один не должен позволять слишком многого всяким неавторизованным юзерам.
Итак, начну по порядку:
Для начала, тем кто захочет устанавливать pxe-сервер по инструкции я бы порекомендовал самому подсмотреть что же там происходит.
mc /var/lib/layman/calculate/profiles/templates/install/3pxe/
Само собой перед этим необходимо иметь базовые понятия по шаблонам.
Посмотрели? Отлично, теперь есть три пути:
- Кошегный - установить по инструкции и далее переделать некоторые конфиги (о них ниже)
- Тру-кошегный - самому внести нужные изменения в нужные конфиги, создать нужные файлы/директории, написать скрипты “под себя”. И все это опять же - с учетом советов приведенных ниже
- Истинно-православный - осмыслить оба предыдущих варианта, структурировать их, написать свои шаблоны, утилиты “добавления и обновления iso-шек” привязать к
eselect
-у, доработать мои “костыли”, найти(если есть) мои ошибки и исправить…
И поделиться наработками с сообществом.
Искренне советую вам третий путь(с обязательным пунктом про поделиться) через второй(так сказать чтоб лучше понимать что там происходит).
Сам же опишу первый
Итак - будем считать, что вы воспользовались утилитой 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-образ зацепится из nfsroot
-а loop=/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
, но пока не горит.
Еще есть куча задумок, но для начала надо это все довести до ума.