В последнее время несчастные обладатели ОС виндуз всё чаще и чаще становятся жертвами всевозможных блокираторов-вымогателей, истинная цель которых - срубить мала-мала бабла. Почему действиями таких товарищей не занимаются специальные органы - история как всегда умалчивает, ведь ежу понятно что раз деньги содрали, значит кто то их получил, а раз так то найти злоумышленников не составило бы никакого труда, ибо купить симкарту и зарегистрировать службу в наших опсосах можно только на реальное лицо(юр. или физ.)
Так же в последнее время популярными стали нетбуки - ноутбук без сидирома, загрузится в который уже требует дополнительных телодвижений в сторону флэш-бут. Однако есть универсальное решение загрузки: по сети, с помощью которой можно подключить почти любой компьютер и произвести на нем необходимые действия.
Перерыв пол-тырнета пришел к однозначному решению: Касперыча по сети ставят через (_!_) и запускается он только на машинах с минимально 256м памяти. Работая под LTSP и видя как это работает на совсем уж убогом железе я решил что такое безобразие меня точно не устраивает, поэтому решено было сделать такой загрузчик, чтобы он не гонял по сетке почти 200мег всякий раз при загрузке каспера(не то, чтобы оно каждый день, но все же :D ). Кроме того работая с wifi сетями с досадой констатирую: и так не быстрый (не верьте рекламе в 300мбит, в лучшем случае получите 27, а средняя и того меньше - около 10мбит!) канал разделен на всех пользователей и при не очень качественной связи проседает так, что 200 метров проще донести на флехе.
Процесс разобъем на две части, в этой будет описано как запустить касперского по сети на машине с 256мб памяти.
Как это будет работать: на сервере служба dhcp выдаст адрес клиенту и укажет что есть загрузчик pxelinux, клиент запросит файл через tftp и получит первое ядро, которое, загрузившись, даст пользователю выбор системы загрузки, загрузит ядро линукса и файловую систему initrd, инициализация которой закончится тем, что будет загружена уже реальная файловая система. Наглядно это выглядит так:
[dhcp]->[tftp]->[pxelinux.0]->[vmlinuz + initrd]->[rootfs]
Немного о initrd. Это сжатый образ файловой системы, имеющий небольшой тулкит для начальной загрузки. В его корне расположен файл *init которому ядро передает управление. Наша первоочередная задача расколупать этот образ и отредактировать файл init. Замечу, что неудачное заколупывание обратно приводит к тому, что ядро vmlinuz не может разархивировать файл что приводит к фаталу и панике ядра :D, а так же разным ошибкам, в частности к Failed to execute /init
Хоть ядро и шибко вумное, но некоторые архивы оно не понимает, насколько я понял это зависит от того, что в него было включено при компиляции. gzip увидели все доступные мне ядра, а вот 7z - ни одно...
Чтобы разобрать initrd от кашмерского понадобится squashfs, но тот, что был у меня из коробки(ubuntu 11.04) не поддерживал lzma, поэтому пришлось брать напильник.
Если у Вас lzma поддерживается этот пункт можно пропустить. Проверить можно командой
[console]
mksquashfs
.............
Compressors available and compressor specific options:
gzip (no options) (default)
lzma (no options)
xz
[/console]
В принципе lzma используется только в образе реальной фс, и если Вы не собираетесь править ее содержимое данный пункт можно пропустить, меня лично раздражает две вещи: собственно отсутствие поддержки lzma :D и навязчивое окно EULA при открытии кашмерыча. Если данные проблемы Вас не касаются - пропускаем этот пункт.
Показать
Итак, нам понадобится архиваторы:
- squashfs-tool с поддержкой lzma,
- xz-5.0.3
тут сказано как поставить squashfs, но совет не полный, мне пришлось сначала установить g++(не путать с gcc!), но при попытки компиляции вышла ошибка zlib.h, после установки библиотечки все равно не захотела ставиться, так как не был найден xz.
В общем, порядок следующий:
- ставим g++ и zlib1g-dev
sudo apt-get install g++ zlib1g-dev
- Зесь берем xz, разархивируем и устанавливаем по мануалу
- в каталоге xz от рута выполняем следующее:
./configure --disable-shared
make -C po update-po
make install
далее уже можно установить squashfs как указано по ссылке выше.
Инструментарий подготовлен, можем приступать к препарации поциента :D
Скачивем образ кашмировского, гугл в помощь, версии обновляются каждый год, за всем не уследишь, а мануал хочется универсальный, на сколько это возможно.
Кашмерский свои паделки гордо именует rescue(типа всё от "версачи"), соответственно имеем
/cdrom/boot/rescue - ядро gentoo linux
/cdrom/boot/rescue.igz - сжатая фс
вот её то, болезную, и будем сейчас мучить. Для начала просто раЗкроем её.
7z x rescue.igz
да, это простой 7z, хотя file rescue.igz и говорит что это gzip, но онный его не берёт.
теперь здесь же создадим папку, войдем в неё и раЗкроем файловую систему
mkdir unpack
cd unpack
cat ../rescue |cpio -id
теперь папка unpack содержит фс тулкита, немного шаманских плясок вокруг /init.
Нам потребуется патч от zloidemon'a который можно взять тут
Если у Вас кашмерский 2008 то вперед - патчим, если нет, немного попляшем с бубном
открываем в редакторе /init и ищем "Determining root device..."
строку ниже заменяем
-while true
+while false
(+ и - ставить не нужно, это что поставить и убрать соответственно)
Чуть ниже идет строка "Determining looptype" и под ней, после примерно 20 строк находим "elif [ "${LOOPTYPE}" = 'squashfs' ]"
выглядит оно так
elif [ "${LOOPTYPE}" = 'squashfs' ]
then
good_msg 'Mounting squashfs filesystem'
mount -t squashfs -o loop,ro "${NEW_ROOT}/mnt/cdrom/${LOOPEXT}${LOOP}" "${NEW_ROOT}/mnt/livecd"
test_success 'Mount filesystem'
FS_LOCATION='mnt/livecd'
вот это безобразие и надо заменить на
elif [ "${LOOPTYPE}" = 'squashfs' ]
then
good_msg 'Mounting squashfs filesystem'
mount -t squashfs -o loop,ro /${LOOP} ${NEW_ROOT}/mnt/livecd
mount -t squashfs -o loop,rw /cdrom.squashfs ${NEW_ROOT}/mnt/cdrom
test_success 'Mount filesystem'
FS_LOCATION='mnt/livecd'
elif [ "${LOOPTYPE}" = 'gcloop' ]
вкраце чёэтмытакоесделали:
while false - отключил поиск REAL_ROOTFS на носителях
mount -t squashfs -o loop,ro /${LOOP} ${NEW_ROOT}/mnt/livecd - примонтировал файловую систему указанную в параметре ядра loop (об этом далее)
mount -t squashfs -o loop,rw /cdrom.squashfs ${NEW_ROOT}/mnt/cdrom - жестко привязал файл /cdrom.squashfs к монтируемым устройствам.
Если Вы не планируете делать проверку антивирусом, а использовать его только как редактор реестра и анлокер то эту строчку можно закоментировать, а в продвинутой версии скрипта мы её завернем в условие, но об этом в другой раз.
Теперь в директорию unpack запишем REAL_ROOTFS, она находится на диске под именем image.squashfs, файл достаточно большой, почти 90мб, что вместе с уже существующими файлами дает 115мб.
Если нужен еще и антивирусник, то придется подготовить файл cdrom.squashfs:
рядом с папкой unpack(но не внутри неё!!!!) создаем папку KAV и копируем туда с диска папку rescue, папка boot не нужна, там грабер и его файлы конфигурации, а image.squashfs скопировали на прошлом этапе
должно получится следующее
../KAV/rescue - папка с диска (в ней папки backup, bases help...)
../unpack - развернутая фс тулкита
../unpack/image.squashfs - REAL_ROOTFS
теперь выполним команду
mksquashfs path_to/KAV cdrom.squashfs -comp lzma
Если lzma не поддерживается, опцию -comp можно пропустить, по умолчанию сожмет с gzip, правда получится файл чуть большего размера.
Полученый файл кладем в unpack, те должно получится
../unpack/cdrom.squashfs - попилиный образ диска
теперь про EULA
Показать
лицензии это конечно хорошо, но давайте не столь навязчиво это делать? Во-первых у кашмерского лайвсд через раз видит точпад, в результате приходится прикручивать мышь, во-вторых для принятия соглашения нужно активировать окно, хотя оно и распахнуто, на него нужно переключится, ну и в третьих, текст лицензии находится на сидироме, который я себе не монтировал ибо всегда есть свежая курилка, а качать базы и писать скрипт их прикручивания к образу мине лень да и трафика жалко на такую фигню. А без текста лицензии "кнопки" принять не активны. Поэтому поколупаем image.squashfs
Переходим в нашу основную директорию где создавали unpack и KAV, создаем каталог и раЗкрываем туда базы
mkdir rootfs
unsquashfs -f -d path_to/rootfs image.squashfs
Ругаицца на lzma? А для кого я писал выше как в сквош прикрутить лзма???
заходим в rootfs/usr/sbin и находим файл kl_eula.sh, редактируем его до такого состояния
#!/bin/bash
touch /tmp/eulaterm
mount --bind /usr/bin/xterm /tmp/eulaterm
#until grep -s accepted /var/log/eula.log > /dev/null; do
# if [[ -n ${DISPLAY} ]]; then
# flock -xo "/tmp/Kaspersky Rescue Disk.lock" -c "/tmp/eulaterm ${EULA_FONT} -maximized -e /usr/sbin/EULA"
# else
# flock -xo "/tmp/Kaspersky Rescue Disk.lock" -c "/usr/sbin/EULA"
# fi
#done
umount /tmp/eulaterm
rm /tmp/eulaterm
В общем мы со всем согласны, кашмерыч может спать спокойно :D
Собираем все в зад
mksquashfs path_to/rootfs image.squashfs -comp lzma
и помещаем полученный файл в /unpack/
ну-с, дело за малым, собрать все это хозяйство обратно в initrd(который rescue)
find . -print | cpio -o -H newc > ../rescue
Переходим на уровень вверх, смотрим на rescue... не хило... почти 200м с образом диска и 115 без. Ну немного поможем нашей сетке, сожмем это хозяйство. Хотя для раЗпаковки мы иЗпользовали 7z, упаковывать будем gzip'ом
gzip rescue
для красоты обзовем его оригинальным именем rescue.igz. Так... пол дела сделано :D остается все это безобразие прикрутить к dhcp + tftp серверу
Как ставить эту связку я тут расписывать не буду, неплохой мануал есть тут, только там статья про LTSP, если он не нужен, пропускаем все что к нему относится.
Короче, считаем что dhcp поднят и раздает адреса, tftp слушает сеть и все что нужно валяется в папке /srv/tftp (эт не обязательно, папка может быть любой)
вот так должен выглядеть конфиг каспера
[tftp_pxe_root]/pxelinux.cfg/default
label Kaspersky Rescue
menu label ^Kaspersky
kernel rescue
append initrd=rescue.igz cdroot=1 root=/dev/ram0 kav_lang=ru real_root=/ loop=image.squashfs looptype=squashfs
Помните про монтирование в /init и параметр loop? Ну вот тут то он и задается, если написать что другое то оно и передаст в скрипт. Например можно передать ему ип адрес...
файлы rescue и rescue.igz должны располагаться в папке [tftp_pxe_root], причем rescue - это оригинальный файл ядра с диска касперыча, а не наша неужатая поделка :D
ну вот, первую задачу выполнили, в следующей серии прикрутим все это к сетевой файловой системе, оно грузится станет быстрее и памяти жрать будет совсем мало. Ам би бэк, короче :D