воскресенье, 29 августа 2010 г.

Антивирус Касперского с загрузкой по сети

Зачастую возникает необходимость лечить искареженые вирусами машинки, но заморачиваться каждый раз с загрузочными дисками не интересно. Посему было сделано решение с загрузкой по сети.

Решение по сути было найдено не мной, а товарищем с ником zloidemon.
На основе этого я написал скрипт, который автоматизирует описанный им алгоритм:
#!/bin/bash

iso_src="http://rescuedisk.kaspersky-labs.com/rescuedisk/updatable/kav_rescue_10.iso"
patch_src="http://gitorious.org/zloidemon-freebsd-configs/trunk/blobs/raw/master/patches/PXE/patch-PXE_kav_rescue_2010.iso.patch"
prefix=/var/tftpd/pxe/kaspersky

rm ${prefix}/rescue ${prefix}/rescue.igz

mkdir -p ${prefix}/.mnt
mkdir -p ${prefix}/.tmp

wget -nc -c $iso_src
wget -nc -c $patch_src

mount -o loop $(basename "${iso_src}") ${prefix}/.mnt
cp -r ${prefix}/.mnt/* ${prefix}/.tmp/
mkdir -p ${prefix}/.tmp/image/cdrom
cd ${prefix}/.tmp/image
zcat ${prefix}/.tmp/boot/rescue.igz |cpio -id
patch -p0 < ${prefix}/patch-PXE_kav_rescue_2010.iso.patch
cp -R ${prefix}/.tmp/rescue/  ${prefix}/.tmp/image/cdrom/
/usr/local/bin/mksquashfs cdrom cdrom.squashfs
rm -rf cdrom
cp ${prefix}/.mnt/image.squashfs ${prefix}/.tmp/image/
chmod 644 image.squashfs
cp ${prefix}/.tmp/boot/rescue ${prefix}/
find . -print | cpio -o -H newc > ${prefix}/rescue.igz
umount ${prefix}/.mnt
rmdir ${prefix}/.mnt
rm -rf ${prefix}/.tmp
Здесь /var/tftpd/pxe - корень tftp-сервера.
Здесь есть важный нюанс: пакет squashfs-tools должен быть версии не ниже 4.0. В Lenny версия 3.3. Для меня достаточно было скопировать бинарник из squeeze в /usr/local/bin и все заработало.
Конфигурация PXELinux:
label Kaspersky 2010 rescue RUS
        kernel kaspersky/rescue
        append initrd=kaspersky/rescue.igz root=/dev/ram0 cdroot=1 kav_lang=ru loop=image.squashfs looptype=squashfs real_root=/
На всякий случай содержимое патча:
--- init.orig   2010-05-24 21:40:35.000000000 +0800
+++ init        2010-05-25 16:07:38.000000000 +0800
@@ -399,7 +399,7 @@ fi

 # Determine root device
 good_msg 'Determining root device...'
-while true
+while false
 do
        while [ "${got_good_root}" != '1' ]
        do
@@ -462,6 +462,8 @@ do
                fi
        done

+REAL_ROOT=/image.squashfs
+REAL_ROOT_TYPE=squashfs

        if [ "${CDROOT}" = 1 -a "${got_good_root}" = '1' -a "${REAL_ROOT}" != "/dev/nfs" ]
        then
@@ -521,7 +523,6 @@ then
        [ -z "${LOOP}" ] && find_loop
        [ -z "${LOOPTYPE}" ] && find_looptype

-       cache_cd_contents

        # If encrypted, find key and mount, otherwise mount as usual
        if [ -n "${CRYPT_ROOT}" ]
@@ -557,7 +558,8 @@ then
                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"
+                       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' ]
Чтобы включить поддержку boottp в DNSMasq в конфигурационном файле /etc/dnsmasq.conf должны присутствовать следующие строчки:
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/var/tftpd/pxe/
В директории /var/tftpd/pxe/ должен располагаться файл pxelinux.0 из пакета syslinux или его же можно скачать с сайта проекта. Подробно настройку описывать не буду - материалов в сети и так уже море ^^.
Вот так выглядит интерфейс диска.
 Чтобы обновить образ следует удалить старый kav_rescue_10.iso из рабочей директории.
Единственный минус - несколько долго загружается по сети. 200 мегабайт как-никак. Но зато очень удобно.
P.S. Спасибо zloidemon за оказанные консультации!

20 комментариев:

  1. а можешь выложить готовый образ, а то для меня, юзера виндовс, это пока что довольно сложно, но очень хочется запускать каспер через PXE... у zloidemonа есть, но он уже довольно устарел, хотелось бы новый в таком же виде

    ОтветитьУдалить
  2. А кто у тебя выступает PXE-сервером?

    ОтветитьУдалить
  3. tftpd32

    через груб4дос запускается версия zloidemon с такими параметрами:
    title Kaspersky RescueCD
    pxe keep
    find --set-root /grldr
    kernel (pd)/kav/rescue root=/dev/ram0 cdroot=1 kav_lang=ru loop=image.squashfs looptype=squashfs real_root=/
    initrd (pd)/kav/rescue2010.igz

    ОтветитьУдалить
  4. Не понял при чем тут grub4dos...
    Советую поставить VirtualBOX, в нем любой Linux и все сделать по инструкциям. Готовых образов у меня уже нет, а специально качать и заниматься нет ни желания ни времени.

    ОтветитьУдалить
  5. ну а я не понял зачем спрашивать кто у тебя выступает PXE-сервером, если все равно делать не собирался

    ОтветитьУдалить
  6. думал у тебя стоит сервер под Linux - мог разъяснить непонятные вещи.

    ОтветитьУдалить
  7. все таки касперский что то особенное со своим дистрибутивом сделал, т.к. при на команде
    zcat ${prefix}/.tmp/boot/rescue.igz |cpio -id
    происходит ошибка not in gzip format

    вот нашел кое что http://www.gentoo-wiki.info/HOWTO_LiveCD_on_disk#Modifying_initrd , там по другому не много делают но все равно не помогло... либо я не так делал... предлагай если есть варианты

    ОтветитьУдалить
  8. добавь перед этим команду
    ls -lh ${prefix}/.tmp/boot/rescue.igz
    предполагаю, что ошибка у тебя раньше

    ОтветитьУдалить
  9. А при чем тут ls? Че то ты совсем не в ту сторону думаешь))
    Касперский по ходу сменил формат или тип сжатия или еще че то, т.к. zcat не прокатывает...

    вот польный результат работы скрипта с командой ls -lh ${prefix}/.tmp/boot/rescue.igz

    [root@www tmp]# ./1.sh
    Файл `kav_rescue_10.iso' уже существует; не загружается.
    Файл `patch-PXE_kav_rescue_2010.iso.patch' уже существует; не загружается.
    -r-xr-xr-x 1 root root 4,1M Апр 25 19:11 /var/tftpd/pxe/kaspersky/.tmp/boot/rescue.igz
    zcat: /var/tftpd/pxe/kaspersky/.tmp/boot/rescue.igz: not in gzip format
    cpio: преждевременный конец архива
    /1.sh: line 21: /var/tftpd/pxe/kaspersky/patch-PXE_kav_rescue_2010.iso.patch: Нет такого файла или каталога
    /1.sh: line 23: /usr/local/bin/mksquashfs: Нет такого файла или каталога
    184705 blocks

    P.s. использую Centos5 и kav_rescue_10.iso v10.0.29.2

    ОтветитьУдалить
  10. вообщем rescue.igz открылся с помощью 7zip из под винды, 7zip пишет что метод используемый в rescue.igz - LZMA:24, дальше в этом архиве (rescue.igz) находится файл rescue, в котором ФС линукса... в общем осталось найти команду или спец атрибуты к gzip/zcat/tar/lzma

    чувствую что я очень близко к истине, но никак не найду ее)))

    ОтветитьУдалить
  11. вот залил rescue.igz на народ, размер 4МБ, если интересно, можешь помочь: http://narod.ru/disk/11097558001/rescue.igz.html

    ОтветитьУдалить
  12. Попробуй 7za e -so ${prefix}/.tmp/boot/rescue.igz |cpio -id, раз говоришь 7zip его открывает.
    Или распакуй как можешь, потом саt и передай cpio

    ОтветитьУдалить
  13. переделал я немного твой скрипт:
    #!/bin/bash

    iso_src="http://rescuedisk.kaspersky-labs.com/rescuedisk/updatable/kav_rescue_10.iso"
    patch_src="http://gitorious.org/zloidemon-freebsd-configs/trunk/blobs/raw/master/patches/PXE/patch-PXE_kav_rescue_2010.iso.patch"
    prefix=/tmp/kaspersky

    rm ${prefix}/rescue ${prefix}/rescue.igz

    mkdir -p ${prefix}/.mnt
    mkdir -p ${prefix}/.tmp

    #wget -nc -c $iso_src
    #wget -nc -c $patch_src

    mount -o loop $(basename "${iso_src}") ${prefix}/.mnt
    cp -r ${prefix}/.mnt/* ${prefix}/.tmp/
    mkdir -p ${prefix}/.tmp/image/cdrom
    cd ${prefix}/.tmp/image
    ###################
    mv ${prefix}/.tmp/boot/rescue.igz ${prefix}/.tmp/boot/rescue.lzma
    rm ${prefix}/.tmp/boot/rescue
    lzma -d ${prefix}/.tmp/boot/rescue.lzma
    cat ${prefix}/.tmp/boot/rescue | cpio -id
    #zcat ${prefix}/.tmp/boot/rescue.igz |cpio -id
    cp /tmp/patch-PXE_kav_rescue_2010.iso.patch ${prefix}/
    ##################
    patch -p0 < ${prefix}/patch-PXE_kav_rescue_2010.iso.patch
    cp -R ${prefix}/.tmp/rescue/ ${prefix}/.tmp/image/cdrom/
    #/usr/local/bin/mksquashfs cdrom cdrom.squashfs
    rm -rf cdrom
    cp ${prefix}/.mnt/image.squashfs ${prefix}/.tmp/image/
    chmod 644 image.squashfs
    cp ${prefix}/.tmp/boot/rescue ${prefix}/
    find . -print | cpio -o -H newc > ${prefix}/rescue.igz
    umount ${prefix}/.mnt
    rmdir ${prefix}/.mnt
    rm -rf ${prefix}/.tmp

    ОтветитьУдалить
  14. в итоге вот что получается:
    [root@www tmp]# ./1.sh
    34252 blocks
    patching file init
    Hunk #1 succeeded at 386 (offset -13 lines).
    Hunk #2 succeeded at 461 (offset -1 lines).
    Hunk #3 succeeded at 510 with fuzz 1 (offset -13 lines).
    Hunk #4 succeeded at 557 (offset -1 lines).
    218989 blocks
    rmdir: /tmp/kaspersky/.mnt: Устройство или ресурс занято

    по сути все отлично за исключением
    cp -R ${prefix}/.tmp/rescue/ ${prefix}/.tmp/image/cdrom/
    /usr/local/bin/mksquashfs cdrom cdrom.squashfs
    не создается cdrom.squashfs (error in line 29, т.е в этой строке)... как это работает можешь обьяснить??

    ОтветитьУдалить
  15. >>> rmdir: /tmp/kaspersky/.mnt
    смотри mount и fuser на директорию, анализируй
    >>> error in line 29
    я ж писал, что туда положил вручную скопированный бинарник из другого дистрибутива. Нужна была именно эта версия. Смотри какая у тебя и поправь соответствующе путь.

    ОтветитьУдалить
  16. установил squashfs-tools создал образ, создался... загрузиться не удалось:
    Mounting squashfs filesystem
    mount: mounting /dev/loop1 on /newroot/mnt/cdrom failed: invalid argument.
    !! Failed to $1; failing boot to shell

    понял то что виноват этот squashfs-tools, проверил версию, а она оказалась вообще 3.0-4... установаливал через yum install squashfs-tools... ищу где взять новую для i386... гребаные зависимости)))

    ОтветитьУдалить
  17. хотя возможно все получится в ubuntu там он 4 версии

    ОтветитьУдалить
  18. Как вариант собрать руками.
    Или найти пакет с нужной версией от любого дистрибутива и оттуда выдрать, как я и сделал.

    ОтветитьУдалить
  19. Почему бы не выложить рабочую сборку Kaspersky Rescue Disk 10, кто уже переделал под PXE ? Поделитесь плиззз!
    Для тех у кого линукса нет под рукой, да и не сильно шарят в нем.

    ОтветитьУдалить
  20. Это все в виртуалке можно сделать. Образа у меня уже нет, т.к. уже не занимаюсь этим вопросом. Попробуйте сделать сами, если будут трудности - спрашивайте.

    ОтветитьУдалить