Обновление дискового шаблона Xen c ОС FreeBSD для VDSmanager

Итак, стала актуальной проблема обновления весьма древнего дискового шаблона VDSmanager FreeBSD-8.0-amd64-minimal до ОС FreeBSD v10.0-RELEASE. К сожалению, опыт, накопленный мною ранее при создании шаблонов с ОС Linux, на этот раз оказался практически бесполезен. Виной тому то, что для ОС Linux в Xen используется режиме паравиртуализации (PV), а для ОС FreeBSD – режим полной виртуализации (HVM). Вдаваться в подробности их работы я не буду, материала по данной тематике достаточно. С точки зрения VDSmanager ключевых разницы две. Во-первых, файл с образом преднастроенной ОС для HVM – это уже не архив tgz, как у PV, а действительно настоящий образ, который можно сразу смонтировать через устройство loop. А, во-вторых, для первичного конфигурирования новой виртуальной машины VDSmanager создает временную VDS, внутри которой выполняются все необходимые команды. Дальнейшее повествование будет вестись на примере архитектуры amd64, однако, вы без труда сможете адаптировать все это под i386.
Работы по обновлению начинаем с того, что создаем материнскую VDS на базе шаблона "FreeBSD-8.0-amd64-minimal". Впоследствии именно слепок это виртуальной машины станет обновленным дисковым шаблоном. Присвоим ей имя "templates-freebsd.amd64".
Естественно, первой задачей является обновить систему с версии 8.0-RELEASE до 10.0-RELEASE. Но сделать это так сразу не получится. При выполнении команды "freebsd-update -r 10.0-RELEASE upgrade" вы получите вот такую ошибку:

The update metadata is correctly signed, but
failed an integrity check.
Cowardly refusing to proceed any further.

Узнать о причинах ее возникновения можно по следующей ссылке: http://security.freebsd.org/advisories/FreeBSD-EN-12:01.freebsd-update.asc Поэтому сначала обновимся до v8.4-RELEASE:

freebsd-update -r 8.4-RELEASEupgrade
freebsd-updateinstall

Дожидаемся появления сообщения:

Installing updates...
Kernel updates have been installed. Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

Выполняем предписания:

reboot
/usr/sbin/freebsd-update install

В конце получаем новые инструкции:

Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update install"
again to finish installing updates.

Поскольку никакого стороннего ПО в системе пока нет, сразу выполняем команду:

/usr/sbin/freebsd-update install

Обновляем систему портов:

portsnap fetch extract update

Для удобства установим несколько утилит:

make -C /usr/ports/ports-mgmt/pkg deinstall install clean BATCH=yes
rehash
pkg2ng
pkg install mc screen

Вот теперь можно делать резкий скачок вперед сразу до v10.0-RELEASE:

freebsd-update -r 10.0-RELEASE upgrade
freebsd-update install

Получаем уже известное нам сообщение:

Installing updates...
Kernel updates have been installed. Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.

Однако не спешим ему следовать. В v10.0-RELEASE изменились драйвера, а соответственно имена некоторых устройств. В частности ATA HDD были "/dev/adX", а стали "/dev/adaX", а сетевая карта "reX" станет "xnX". Поэтому необходимо внести правки в файл настроек "/etc/fstab":

# Device               Mountpoint     FStypeOptions         Dump   Pass#
/dev/ada0s1a           /               ufs     rw             1       1
/dev/acd0               /cdrom         cd9660 ro,noauto       0       0

А, также в "/etc/rc.conf":

hostname="templates-freebsd.amd64"
sshd_enable="YES"
defaultrouter="85.31.29.1"
ifconfig_xn0="inet 85.31.29.176 netmask 255.255.255.0"

Вот теперь можно перезагрузиться и продолжить обновление:

reboot
/usr/sbin/freebsd-update install

Снова получаем уже известное нам сообщение о необходимости пересобрать стороннее ПО. На сей раз его игнорировать нельзя. Начнем с утилиты для управления репозиторием pkgng, а также настроим ее:

make -C /usr/ports/ports-mgmt/pkgdeinstallinstallcleanBATCH=yes
pkg2ng
cp /usr/local/etc/pkg.conf.sample /usr/local/etc/pkg.conf
mkdir -p /usr/local/etc/pkg/repos

Создаем файл "/usr/local/etc/pkg/repos/FreeBSD.conf" следующего содержания:

FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
enabled: yes
}

Обновим каталог репозитория pkgng и пересоберем все стороннее ПО с помощью утилиты portmaster:

pkg update
make -C /usr/ports/ports-mgmt/portmaster deinstall install clean BATCH=yes
echo "BATCH=yes" >> /etc/make.conf
echo "WITCH=BATCH=yes" >> /etc/make.conf
echo "WITH_PKGNG=yes" >> /etc/make.conf
setenv BATCH yes
portmaster -m "BATCH=yes" -af

Заканчиваем процедуру обновления:

/usr/sbin/freebsd-update install

На этом этапе мы получили VDS, внутри которой функционирует ОС FreeBSD v10.0-RELEASE. Теперь ее необходимо подготовить для изготовления дискового шаблона. Начнем с установки дополнительного ПО:

pkg install gcc unrar tcpdump lftp atop bzip2 zip rsync wget curl mtr

Почистим кэш системы портов и пакаджей:

portmaster --clean-distfiles
pkg clean

Настроим локализацию UTF-8. Для этого приведем профиль "default" в файле настроек "/etc/login.conf" к следующему виду:

default:\
:passwd_format=sha512:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES,LC_COLLATE=C:\
:path=/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin ~/bin:\
:nologin=/var/run/nologin:\
:cputime=unlimited:\
:datasize=unlimited:\
:stacksize=unlimited:\
:memorylocked=64K:\
:memoryuse=unlimited:\
:filesize=unlimited:\
:coredumpsize=unlimited:\
:openfiles=unlimited:\
:maxproc=unlimited:\
:sbsize=unlimited:\
:vmemoryuse=unlimited:\
:swapuse=unlimited:\
:pseudoterminals=unlimited:\
:priority=0:\
:ignoretime@:\
:umask=022:\
:charset=UTF-8:\
:lang=en_US.UTF-8:

И обновим БД "login.conf.db":

cap_mkdb /etc/login.conf

Сменим часовой пояс:

cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Зададим параметры настройки atop, которая будет следить за утилизацией ресурсов в ОС:

echo 'atop_enable="YES"' >> /etc/rc.conf
echo 'atop_interval="600"' >> /etc/rc.conf

Посредством команды "crontab -e" добавим в планировщик cron новое задание для ротации логов atop:

0 0 * * *       /usr/local/etc/rc.d/atop rotate > /dev/null 2>&1

Обновим xenclient от VDSmanager до последней версии:

fetch http://cdn.ispsystem.com/xenclient/xenclient-freebsd-amd64
mv ./xenclient-freebsd-amd64 /sbin/xenclient
chmod +x /sbin/xenclient

Для того, что бы VDSmanager мог взаимодействовать с xenclient внутри VDS необходимо убедиться в наличии следующей строки в файле настроек "/etc/ttys":

ttyu0   "/usr/libexec/getty al.115200" cons25 on secure

На этом все подготовительные работы внутри материнской VDS "templates-freebsd.amd64" закончены. Переходим к изготовлению непосредственно самого файл с образом преднастроенной ОС FreeBSDv10.0-RELEASE. Для этого отправляемся в dom0 гипервизора Xen, где нам необходимо будет подключить к материнской VDS "templates-freebsd.amd64" второй виртуальный HDD. Создаем файл нужного размера:

touch /vs/disk/image
truncate -s 2G /vs/disk/image

Выключаем VDS "templates-freebsd.amd64" и правим файл настроек ее домена "/xen/conf/templates-freebsd.amd64":

kernel = "/usr/lib/xen-4.1/boot/hvmloader"
builder='hvm'
name = "templates-freebsd.amd64"
pae=2
acpi=1
apic=1
vif = [ 'ip=85.31.29.176,mac=00:16:3E:02:0F:FD, bridge=xenbr0' ]
disk = [ 'file:/vs/disk/templates-freebsd.amd64,hda,w', 'file:/vs/disk/image,hdb,w' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash   = 'restart'
device_model = '/usr/lib/xen-4.1/bin/qemu-dm'
boot='cd'
sdl=0
vnc=1
vncviewer=1
vncunused=0
vncdisplay=10
vncpasswd='XXXXXXXX'
serial = 'pty'
memory = '1024'
vcpus = '2'
cpu_cap = '200'

После таких модификаций VDS "templates-freebsd.amd64" исчезнет из Web-интерфейса VDSmanager, поэтому запускать ее необходимо вручную:

/usr/sbin/xm create /xen/conf/templates-freebsd.amd64

Возвращаемся обратно в VDS "templates-freebsd.amd64" и размечаем будущий файл-образ:

/sbin/fdisk -BI /dev/ada1
/sbin/bsdlabel -wB /dev/ada1s1
/sbin/newfs -jU /dev/ada1s1a

Обратите внимание, что в файловой системе UFS с помощью newfs мы включаем soft updates и soft update journaling.
Теперь нам необходимо на втором HDD создать копию материнской VDS "templates-freebsd.amd64". Для начала почистим систему с целью уменьшения ее размера:

rm -rf /usr/ports/{.,}*
rm -rf /var/cache/pkg/All/{.,}*
rm -rf /var/db/freebsd-update/{.,}*
rm -rf /var/db/portsnap/{.,}*
rm -f /mnt/root/.history
rm -f /var/mail/*

Перезагружаемся в однопользовательский режим ОС:

nextboot -o "-s"
reboot

Подключаемся к консоли материнской VDS "templates-freebsd.amd64" через VNC. Монтируем в точке "/mnt" второй виртуальный HDD и копируем на него систему с первого:

/sbin/mount -t ufs -o async /dev/ada1s1a /mnt
sh -c "find -x / | cpio -pudm /mnt"

Отправляемся в многопользовательский режим с помощью комбинации клавиш <Ctrl>+<D>. Теперь нам необходимо провести окончательную подготовку системы на втором HDD.
Поскольку мы включили журналирование для файловой системы, монтировать ее будем в асинхронном режиме. Вносим необходимые правки в "/mnt/etc/fstab":

# Device               Mountpoint     FStypeOptions         Dump   Pass#
/dev/ada0s1a            /               ufs     rw,async       1       1
/dev/acd0               /cdrom         cd9660 ro,noauto       0       0

Далее из "/mnt/etc/rc.conf" необходимо удалить все строки, связанные с сетевыми настройками, в частности "hostname", "defaultrouter" и "ifconfig_xn0". А также включим автоматическую проверку целостности HDD при загрузке:

echo 'fsck_y_enable="YES"' >> /mnt/etc/rc.conf
echo 'fsck_y_flags="-f"' >> /mnt/etc/rc.conf
echo 'background_fsck="NO"' >> /mnt/etc/rc.conf

Т.е. в итоге файл настроек "/mnt/etc/rc.conf" должен выглядеть так:

sshd_enable="YES"
atop_enable="YES"
atop_interval="600"
fsck_y_enable="YES"
fsck_y_flags="-f"
background_fsck="NO"

Удаляем ненужный "/mnt/etc/resolv.conf", он будет автоматически позаимствован из настроек домена dom0 гипервизора Xen при создании новой VDS.
На текущем этапе файл с образом преднастроенной ОС FreeBSDv10.0-RELEASE готов. VDS "templates-freebsd.amd64" необходимо выключить, после чего отправляемся в dom0 гипервизора Xen. Там можно вернуть файл настроек "/xen/conf/templates-freebsd.amd64" в исходное состояние. Далее необходимо подготовить набор скриптов для первоначального конфигурирования или перенастройки, используемые VDSmanager при разворачивании новой VDS.
За основу берем скрипты из стандартного шаблона "FreeBSD-8.0-amd64-minimal". Создаем рабочий каталог, в котором будем компоновать новый дисковый шаблон, перемещаем в него файл-образ, созданный на предыдущем этапе:

mkdir ~/FreeBSD-10-amd64-minimal-SIM-Networks
rsync -avh --progress /xen/template/FreeBSD-8.0-amd64-minimal/* ~/FreeBSD-10-amd64-minimal-SIM-Networks/
mv /vs/disk/image ~/FreeBSD-10-amd64-minimal-SIM-Networks/

Модификации подвергаются только два скрипта. Первый – "include". В нем мы изменим команды, связанные с подготовкой диска новой VDS:

MGR=$PWD
NOIN="echo -n"
NAME="tmp-$$"
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
cd ${0%/*}

start() {
REGEXP='s/\//\\\//g'
TEMPL=`echo $1 | sed -re $REGEXP`
DISK=`echo $2 | sed -re $REGEXP`
TCONF=${2#*:}.conf

# start temp vds
sed -e "s/__NAME__/$NAME/;s/__TEMPL__/$TEMPL/;s/__DISK__/$DISK/g" setup.config > $TCONF
xm create $TCONF
if [ $? -ne 0 ]; then
unlink $TCONF
exit 1
fi
unlink $TCONF
}

xc() {
$MGR/sbin/xenclient $2 -c "$1" $NAME
if [ $? -ne 0 ]; then
stop
exit 1
fi
}

copy() {
# copy files
xc "/sbin/fdisk -BI /dev/ada1"
xc "/sbin/bsdlabel -wB /dev/ada1s1"
xc "/sbin/newfs -jU /dev/ada1s1a"
xc "/sbin/mount -t ufs -o async /dev/ada1s1a /mnt"
xc 'sh -c "find -x / | cpio -pudm /mnt"' '-T 3600'
}

stop() {
$NOIN | $MGR/sbin/xenclient -T 3600 -c "halt -p" $NAME
N=1
xm list $NAME
while [ $? -eq 0 -a $N -lt 10 ]; do
sleep $N
N=$(( $N + 1 ))
xm list $NAME
done
if [ $N -ge 10 ]; then
xm destroy $NAME
fi
}

Второй – "setup". В нем мы немного изменим правки, вносимые в файл "/etc/rc.conf", ограничившись добавлением только сетевых настроек. Все остальное там уже имеется:

#!/bin/sh -x

. ${0%/*}/include

# starttempvds
start "file:${0%/*}/image" $1

# copy files
$NOIN | copy
cat /etc/resolv.conf | xc 'sh -c "cat > /mnt/etc/resolv.conf"'
# set password
# it will be done in init. Reinstall can't findout old password.
# so we will get it from VNC settings
cat | xc 'pw -V /mnt/etc usermod root -h0'
# remove trash
xc 'sh -c "find /mnt/var/log -type f -delete && rm -f /mnt/root/.history"'

IP=$2
MASK=$4
GATEWAY=$6

# set ip
(echo "hostname=\"$7\""; echo "defaultrouter=\"$GATEWAY\""; echo "ifconfig_xn0=\"inet $IP netmask $MASK\"") | \
xc 'sh -c "cat >> /mnt/etc/rc.conf"'

# finish
stop

exit 0

Строку "echo "fsck_y_enable=YES" >> /mnt/etc/rc.conf" необходимо удалить.
На этом дисковый шаблон готов. Необходимо лишь прописать его в VDSmanager. Как это делается, я уже описывал ранее. А затем во вновь созданном шаблоне заменить содержимое "FreeBSD-8.0-amd64-minimal" на "FreeBSD-10-amd64-minimal-SIM-Networks":

rm /xen/template/FreeBSD-10-amd64-minimal-SIM-Networks/*
rsync -avh --progress ~/FreeBSD-10-amd64-minimal-SIM-Networks/* /xen/template/FreeBSD-10-amd64-minimal-SIM-Networks/

Поделиться ссылкой:

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>