Показаны сообщения с ярлыком ubuntu. Показать все сообщения
Показаны сообщения с ярлыком ubuntu. Показать все сообщения

среда, 17 августа 2016 г.

nDPI, DKMS и здоровый сон сисадмина

DKMS (Dynamic Kernel Module Support) — шикарное решение, если требуемый модуль для ядра нельзя поставить и обновлять штатными средствами, но зато есть его исходники. Не требуется следить за обновлениями ядра и оперативно пересобирать нужный модуль или вовсе блокировать обновления ядра, чтобы ничего не отвалилось после очередного обновления.

Сначала устанавливаем dkms и другие необходимые пакеты:

$ sudo apt-get install dkms build-essential autoconf automake autogen libpcap-dev libtool xtables-addons-dkms pkg-config xtables-addons-source
Скачиваем исходники nDPI:
$ wget https://github.com/vel21ripn/nDPI/archive/netfilter.zip
Распаковываем скачанный архив в /usr/src:
$ sudo unzip netfilter.zip -d /usr/src
Переименовываем распакованную папку в ndpi-x.y.z, где x.y.z — версия модуля:
$ sudo mv /usr/src/nDPI-netfilter /usr/src/ndpi-1.7.0
Создаем файл dkms.conf в этой папке:
$ sudo tee /usr/src/ndpi-1.7.0/dkms.conf << EOF
# Версия модуля 
PACKAGE_VERSION="1.7.0"
# Название модуля в /usr/src
PACKAGE_NAME="ndpi"
# Папка для компиляции
BDIR="\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build"
# Аргументы для make 
ARGS="-C \${kernel_source_dir} SUBDIRS=\${BDIR} M=\${BDIR}/ndpi-netfilter/src"
# После компиляции созданный модуль перемещается туда, где DKMS может его найти
MAKE[0]="make \${ARGS} modules ; find \${BDIR} -name '*.ko' -exec mv -v {} \${BDIR} \;"
CLEAN="make \${ARGS} clean"
# Название модуля ядра
BUILT_MODULE_NAME[0]="xt_ndpi"
# Папка, где обычно устанавливается модуль в ядре
DEST_MODULE_LOCATION[0]="/extra/"
# Не пересобирать initrd ядра
REMAKE_INITRD="no"
# Установка модуля после компиляции
AUTOINSTALL="yes"
EOF
Теперь компилируем и устанавливаем библиотеку nDPI
$ cd /usr/src/ndpi-1.7.0
$ sudo ./autogen.sh
$ sudo sh -c './configure && make'
$ cd /usr/src/ndpi-1.7.0/ndpi-netfilter
$ sudo make install
После чего в DKMS добавляем запись о нашем модуле:
$ sudo dkms add -m ndpi -v 1.7.0
Собираем модуль из исходников:
$ sudo dkms build -m ndpi -v 1.7.0
Собранный модуль устанавливаем папке /dkms/:
$ sudo dkms install -m ndpi -v 1.7.0

воскресенье, 24 марта 2013 г.

NAT для VirtualBox с возможностью прямого доступа к виртуальным машинам с хоста

Когда создавал новую виртуальную машину в Virtualbox (Ubuntu 12.04 LTS) решил спрятать его за NAT в виртуальной сети, но таким образом чтобы иметь возможность достучаться до него напрямую через SSH.
Для этой цели поднял виртуальный сетевой интерфейс, настроил NAT, настроил раздачу айпи и обработку DNS-запросов создаваемой виртуальной сети:

  1. Устанавливаем пакет uml-utilities с утилитой для создания интерфейса tap0
    $ sudo apt-get install uml-utilities
    В файл «/etc/network/interfaces» добавляем описание нового интерфейса
    auto tap0
    iface tap0 inet static
            address 10.0.55.1
            netmask 255.255.255.0
     pre-up /usr/sbin/tunctl -t tap0
     post-down /usr/sbin/tunctl -d tap0
    Поднимаем новый интерфейс
    $ sudo ifup tap0
  2. Теперь настраиваем NAT. Для этой цели используем идущее с системой средство настройки брандмауэра ufw. Редактируем файл «/etc/ufw/before.rules» и добавляем в самом начале строки
    *nat
    :POSTROUTING ACCEPT [0:0]
    -F POSTROUTING
    -A POSTROUTING -s 10.0.55.0/24 -j MASQUERADE
    COMMIT
    Редактируем файл «/etc/default/ufw» и меняем следующие параметры
    DEFAULT_INPUT_POLICY="ACCEPT"
    DEFAULT_OUTPUT_POLICY="ACCEPT"
    DEFAULT_FORWARD_POLICY="ACCEPT"
    Запускаем ufw
    $ sudo ufw enable
  3. Чтобы каждый раз вручную не прописывать айпишники днс-сервера вновь созданным виртуальным машинам устанавливаем dnsmasq
    $ sudo apt-get install dnsmasq
    В файл конфигурации «/etc/dnsmasq.conf» добавляем следующие строки
    # Слушаем порты только на указанном интерфейсе
    bind-interfaces
    # Слушаем на созданном нами интерфейсе
    interface=tap0
    # Не слушаем на локальном интерфейсе. Там как правило слушает запущенный Netwok Manager процесс dnsmasq
    except-interface=lo
    # Диапазон раздаваемых по DHCP адресов виртуальным машинам.
    dhcp-range=10.0.55.10,10.0.55.200,72h
    # Домен создаваемой сети
    domain=virtual
    Запускаем dnsmasq с новыми настройками
    $ sudo service dnsmasq stop
    $ sudo service dnsmasq start

понедельник, 26 апреля 2010 г.

Некорректная работа mountall с разделами на LVM

На днях, решив обновить Ubuntu до версии Lucid Lynx, не предполагал, что он преподнесет головоломку, на поиск решения которого уйдет два дня.
Утилита mountall, установленная из официального репозитория, начала некорректно работать с созданными в LVM разделами. При загрузке системы они начинают теряться случайным образом. Т.е. глюк не всегда появляется. А когда появляется, начинает радовать сообщениями вроде «the disk drive for ... is not ready yet or not present».
Решение нашел тут:


  1. Подключаем PPA-репозиторий с исправлениями
    $ sudo add-apt-repository ppa:scott/ppa

  2. Обновляем индексы
    $ sudo apt-get update

  3. Обновляем систему
    $ sudo apt-get upgrade

  4. Проверяем версию mountall, оно должно быть не ниже 2.14~ppa1
    $ dpkg-query -W mountall

воскресенье, 31 января 2010 г.

Общесистемные настройки Mozilla Firefox

Общесистемные настройки Mozilla Firefox хранятся в директории «/etc/firefox-3.x», где 3.x - версия браузера.
Для примера отключим режим «Safe Browsing». Браузер с включенным «Safe Browsing» может выкачать от 3 до 11 мегабайт данных в день, используемых для оценки безопасности сайтов.
Открываем файл «/etc/firefox-3.x/pref/firefox.js» и в конец файла добавляем эти строки

// Отключаем Safe Browsing
pref ("browser.safebrowsing.enabled", false);
pref ("browser.safebrowsing.malware.enabled", false);

вторник, 24 ноября 2009 г.

debconf и /tmp с флагом noexec

Если раздел «/tmp» смонтирован с флагом noexec в процессе установки пакетов на этапе предварительной настройки появляются ошибки, похожие на такую

Can't exec "/tmp/fprobe-ulog.config.48931": Permission denied at /usr/share/perl/5.10/IPC/Open3.pm line 168.
open2: exec of /tmp/fprobe-ulog.config.48931 configure failed at /usr/share/perl5/Debconf/ConfModule.pm line 59
не удалось выполнить начальную настройку пакета fprobe-ulog, код ошибки 255
На launchpad.net подобный багрепорт уже добавлен. Как временное решение в конфиг «/etc/apt/apt.conf» добавляем строку
APT::ExtractTemplates::TempDir "/var/tmp";
предписывающую aptitude и apt-get использовать директорию «/var/tmp» вместо «/tmp».

воскресенье, 1 ноября 2009 г.

WiFi vs Ubuntu Karmic Koala

Радость от обновления Ubuntu на своем ноутбуке (Dell Vostro A860) до версии 9.10 Karmic Koala омрачилась нерабочим вайфаем. Причем в логах наблюдалась абсолютная тишина. Модуль ath5k грузится без ошибки и правильно распознает чип от Atheros. А Network Manager скупо пишет "Устройство не готово".
После продолжительного гугления выяснилось, что все дело в некорректной работе функциональной кнопки (Fn + F11), отвечающей за включение/отключение вайфая и блютуза. К слову – я им никогда и не пользовался, так как казалось, она как-то не так работает.

$ tail /sys/class/rfkill/*/{state,name,type,persistent}
==> /sys/class/rfkill/rfkill1/state <==
0

==> /sys/class/rfkill/rfkill2/state <==
0

==> /sys/class/rfkill/rfkill3/state <==
0

==> /sys/class/rfkill/rfkill1/name <==
phy0

==> /sys/class/rfkill/rfkill2/name <==
dell-wifi

==> /sys/class/rfkill/rfkill3/name <==
dell-bluetooth

==> /sys/class/rfkill/rfkill1/type <==
wlan

==> /sys/class/rfkill/rfkill2/type <==
wlan

==> /sys/class/rfkill/rfkill3/type <==
bluetooth

==> /sys/class/rfkill/rfkill1/persistent <==
0

==> /sys/class/rfkill/rfkill2/persistent <==
0

==> /sys/class/rfkill/rfkill3/persistent <==
0
Как видим, rfkill1 и rfkill2 имеют тип wlan. Состояние (state) у обоих равно 0, означающему SOFT LOCK. Кроме состояния 0 могут быть 1 и 2, UNLOCK и HARD LOCK соответственно.
Вся проблема состоит в том, что при нажатии на упомянутую ранее функциональную кнопку состояние переключается только между значениями SOFT LOCK и HARD LOCK, минуя UNLOCK. Из-за этого блокируется переход интерфейса файвая в активный режим, наглядно демонстрируемый командой
$ sudo ifconfig wlan0 up
SIOCSIFFLAGS: Unknown error 132
Решение состоит в принудительном переводе в состояние UNLOCK.
Для этого пишем простой скрипт
#!/bin/sh

for i in /sys/class/rfkill/rfkill*/type;
do
type="`cat $i`"
if [ "$type" = "wlan" ];
then
n="`echo $i | sed -r 's%/type$%%'`";
echo 1 > ${n}/state;
fi;
done;
Сохраняем скрипт в файл «/usr/local/sbin/unlock-wlan» и делаем его исполняемым
$ sudo chmod +x /usr/local/sbin/unlock-wlan
После ручного запуска скрипта надо перезапускать Network Manager – иначе он ничего не заметит.
Теперь настраиваем Upstart для исполнения нашего скрипта при загрузке системы, перед стартом Network Manager. Для этого создаем файл «/etc/init/unlock-wlan.conf»
# unlock-wlan - unlock wireless device
#

description "unlock wireless device"

# Скрипт запускается перед настройкой сетевых интерфейсов
start on starting networking

task

exec /usr/local/sbin/unlock-wlan

пятница, 30 октября 2009 г.

По НТВ рассказали про релиз Ubuntu 9.10 Karmic Koala

Запись сюжета можно найти по ссылке: http://www.ntv.ru/novosti/178965/.

суббота, 13 июня 2009 г.

Настройка DHCP клиента в Ubuntu

Дополнительная настройка DHCP-клиента может понадобится когда у вас есть локальный DNS-сервер или если DHCP-сервер провайдера работает с перебоями.

Пример файла конфигурации «/etc/dhcp3/dhclient.conf»

#
# dhcp3-client 3.1.1-5ubuntu8
#
# Сюда вписываем локальный адрес DNS-сервера
prepend domain-name-servers 127.0.0.1;

# Какие данные нужно затребовать с DHCP-сервера
request subnet-mask, broadcast-address, time-offset, routers,
# Комментируем, так как у нас локальный DNS-сервер
# domain-name, domain-name-servers, domain-search, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;

#
# dhclient будет использовать эти настройки, в то время,
# когда недоступен DHCP-сервер провайдера.
#
# Если не знаете что писать - загляните в файл
# /var/lib/dhcp3/dhclient.leases
#
lease {
interface "eth1";
fixed-address 72.xxx.xxx.xxx;
option subnet-mask 255.255.xxx.xxx;
option time-offset 32400;
# Если прописать адреса роутеров, dhclient проверит наличие
# первого роутера. В случае, если роутер не ответил
# на пинг, этот блок (lease) отбрасывается.
option routers 72.xxx.xxx.1;
option dhcp-lease-time 1800;
option dhcp-message-type 5;
option domain-name-servers 127.0.0.1;
option dhcp-server-identifier 72.xxx.xxx.xxx;
# По документации следующие строки должны быть
# в обязательном порядке. Время желательно
# выставить как можно большее, чтобы не стало
# просроченным.
renew 2 2037/01/12 00:00:00;
rebind 2 2037/01/12 00:00:00;
expire 2 2037/01/12 00:00:00;
}
Более подробно о других настройках можно прочитать в «man dhclient.conf»

понедельник, 8 июня 2009 г.

Работа Ubuntu Linux без носителя

Нужно было добиться загрузки Ubuntu в оперативную память компьютера и дальнейшей работы без носителя, с которого он был загружен. Решение получилось достаточно простым.
Вкратце идея такая: initrd.img изменяется так, чтобы, после загрузки и старта ядра, с носителя в память копировался файл со сжатым образом файловой системы корневого раздела (SquashFS). Далее поверх корневого раздела монтируется aufs-tmpfs и стартует Ubuntu.

Ниже будет описание как создать загрузочный iso-образ и бутовую USB-флешку.

  1. Создаем директории
    $ mkdir -p ~/ubuntu-ram/{etc,tmp,image,scripts}

  2. Устанавливаем необходимые пакеты
    $ sudo aptitude install lilo mtools genisoimage debootstrap syslinux squashfs-tools

  3. Копируем настройки initramfs
    Конфиги initramfs для iso-образа
    $ cp -a /etc/initramfs-tools ~/ubuntu-ram/etc/iso
    Конфиги initramfs для iso-образа
    $ cp -a /etc/initramfs-tools ~/ubuntu-ram/etc/usb

  4. Настраиваем окружение загружаемой системы
    $ export IMGROOT=~/ubuntu-ram/image
    $ sudo -E -s
    # debootstrap jaunty $IMGROOT http://mirror.ubuntu.optilink.ru/ubuntu/
    # echo "aufs / aufs rw 0 0" > $IMGROOT/etc/fstab
    # cp /etc/apt/sources.list $IMGROOT/etc/apt/
    # cp /etc/resolv.conf $IMGROOT/etc/
    # cat <<EOF > $IMGROOT/etc/hosts
    127.0.0.1 localhost.localdomain localhost
    127.0.1.1 hostname.domain hostname
    EOF

    # cat <<EOF > $IMGROOT/etc/network/interfaces
    auto lo
    iface lo loopback
    EOF

    # echo "hostname.domain" > $IMGROOT/etc/hostname
    # mount -t proc none $IMGROOT/proc
    # mount -o bind /dev $IMGROOT/dev
    # mount -t devpts none $IMGROOT/dev/pts
    # mount -t sysfs none $IMGROOT/sys
    Входим в изолированное окружение
    # chroot $IMGROOT bash
    Создаем аккаунт администратора и русскую локаль. Также разрешаем группе adm использование команды sudo
    # adduser --gecos 'System Administrator' demiurg
    # usermod -a -G adm demiurg
    # echo "@adm ALL=NOPASSWD: ALL" >> $IMGROOT/etc/sudoers
    # locale-gen ru_RU.UTF-8
    Устанавливаем ядро и требуемые утилиты
    # aptitude update
    # aptitude install linux-image-server grub aufs-tools squashfs-tools
    Настраиваем часовой пояс и консоль
    # dpkg-reconfigure tzdata
    # dpkg-reconfigure console-setup
    Далее система настраивается под себя (ставим дополнительные программы, правим конфиги под себя).

    Выходим из изолированного окружения
    # aptitude clean
    # exit
    Отмонтируем файловые системы
    # umount $IMGROOT/proc
    # umount $IMGROOT/dev/pts
    # umount $IMGROOT/dev
    # umount $IMGROOT/sys
    Выходим из режима суперпользователя
    # exit
    $

  5. Переходим к настройке конфигов initramfs для iso-образа
    Создаём так называемый хук (hook) - скрипт, вызываемый утилитой initramfs
    $ cat <<EOF > $IMGROOT/../etc/iso/hooks/load_modules
    #!/bin/sh
    set -e

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    . /usr/share/initramfs-tools/hook-functions

    force_load squashfs
    force_load isofs
    force_load aufs

    exit 0
    EOF
    $ chmod +x $IMGROOT/../etc/iso/hooks/load_modules
    Создаем скрипты, выполняющиеся во время загрузки initrd
    Скрипт, закидывающий образ системы в память
    $ cat <<EOF > $IMGROOT/../etc/iso/scripts/init-premount/udev_into_ram
    #!/bin/sh

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    mknod /dev/loop0 b 7 0
    mkdir /disk

    WAIT_COUNT=15
    while [ ! -e /dev/scd0 ] && [ "$WAIT_COUNT" -gt 0 ]
    do
    tmp=$((WAIT_COUNT-=1))
    sleep 1
    done

    echo -n "Please wait... "
    mount -t iso9660 -o ro /dev/scd0 /disk
    cp /disk/root.sqfs /
    echo "done"
    umount /disk && rm -Rf /disk
    EOF
    $ chmod +x $IMGROOT/../etc/iso/scripts/init-premount/udev_into_ram
    Скрипт, монтирующий файловую систему aufs
    $ cat <<EOF > $IMGROOT/../etc/iso/scripts/init-bottom/aufs_root
    #!/bin/sh
    #
    # https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash
    #
    # Copyright 2008 Nicholas A. Schembri State College PA USA
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program. If not, see
    # <http://www.gnu.org/licenses/>.

    # Thank you Voyage Linux for the idea, http://voyage.hk/ Great job on release 0.5
    #
    # Tested with 8.04.1
    #
    #
    # ****************************************************************************************
    #
    # Change log
    #
    # 2008.08.01 Added debugging comments in "drop to a shell" section. grub option aufs=tmpfs-debug will stop the init script.
    # reviewed *********** fix fstab on tmpfs ******************
    # rootaufs failed when system was booted with /dev/xxx and fstab had uuid= info.
    # BlaYO pointed out the best and simplest solution was to use grep -v. Grep replaces a sed one liner.
    # Add the comment block to fstab
    #
    #
    #

    case $1 in
    prereqs)
    exit 0
    ;;
    esac

    export aufs

    for x in $(cat /proc/cmdline); do
    case $x in
    root=*)
    ROOTNAME=${x#root=}
    ;;
    aufs=*)
    aufs=${x#aufs=}
    case $aufs in
    tmpfs-debug)
    aufs=tmpfs
    aufsdebug=1
    ;;
    esac
    ;;
    esac
    done

    if [ "$aufs" != "tmpfs" ]; then
    #not set in boot loader
    #I'm not loved. good bye
    exit 0
    fi

    # This is a simple overview of the steps needed to use aufs on the root file system and see the /rw and /ro branches.
    # initramfs init-botton script
    # move the root file system to aufs/unionfs readonly /ro
    # root is mounted on ${rootmnt}
    # create tmpfs on /rw
    # create a aufs using /ro and /rw
    # put some files on the tmpfs to fix mtab and fstab
    # move aufs to rootmnt to finish the init process.
    # No changes to the root file system are made by this script.
    #
    # Why!
    # This will allow you to use a usb flash drive and control what is written to the drive.
    # no need to rebuild the squashfs file just to add a program.
    # boot to single user mode. The system works the way you expect. boot aufs=tmpfs and no changes are written to the flash.
    # run ubuntu on an eeePC .

    # Install
    # Install ubuntu 8.04 Hardy. Hardy has aufs installed by default
    # apt-get update
    # apt-get dist-upgrade
    # apt-get install aufs-tools
    # echo aufs >> /etc/initramfs-tools/modules
    # put this file in /etc/initramfs-tools/scripts/init-bottom/rootaufs
    # chmod 0755 rootaufs
    # # clean up menu.lst
    # update-grub
    # update-initramfs -u
    # vi /boot/grub/menu.lst
    # add aufs=tmpfs to the default entry.
    # do not add this line to single user mode.
    # boot to single user mode in order to install software.
    # note: if your home account is on the root file system, your files are in ram and not saved.
    #


    echo
    echo " root-aufs: Setting up aufs on ${rootmnt} as root file system "
    echo

    modprobe -q --use-blacklist aufs
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to load aufs.ko
    exit 0
    fi

    #make the mount points on the init root file system
    mkdir /aufs
    mkdir /rw
    mkdir /ro

    # mount the temp file system and move real root out of the way
    mount -t tmpfs aufs-tmpfs /rw
    mount --move ${rootmnt} /ro
    if [ $? -ne 0 ]; then
    echo root-aufs error: ${rootmnt} failed to move to /ro
    exit 0
    fi


    mount -t aufs -o dirs=/rw:/ro=ro aufs /aufs
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to mount /aufs files system
    exit 0
    fi


    #test for mount points on aufs file system
    [ -d /aufs/ro ] || mkdir /aufs/ro
    [ -d /aufs/rw ] || mkdir /aufs/rw

    # the real root file system is hidden on /ro of the init file system. move it to /ro
    mount --move /ro /aufs/ro
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to move /ro /aufs/ro
    exit 0
    fi

    # tmpfs file system is hidden on /rw
    mount --move /rw /aufs/rw
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to move /rw /aufs/rw
    exit 0
    fi



    #*********** fix fstab on tmpfs ******************
    # test for /dev/sdx
    # this is not on the real file system. This is created on the tmpfs each time the system boots.
    # The init process will try to mount the root filesystem listed in fstab. / and swap must be removed.
    # the root file system must be mounted on /ro not on /

    if [ "$aufsdebug" -eq 1 ]; then
    echo " root-aufs debug: Remove the root file system and swap from fstab "
    echo
    echo
    echo " ROOTNAME $ROOTNAME "
    echo " resume $resume "
    echo
    echo ' BlaYO pointed out that grep can be used to quickly remove '
    echo ' the root file system from fstab. '
    echo
    echo ' Thank you BlaYO for the debug info.'
    echo

    fi
    # old code
    # I'm sure that sed can do this in one step but I want to correct on the rootname not matching the root in fstab.
    #cat /aufs/ro/etc/fstab|sed -e s/$ROOTNAME/\#$ROOTNAME/ -e s/$resume/\#$resume/ >/aufs/etc/fstab

    #Add the comment block to fstab
    cat <<EOF >/aufs/etc/fstab
    #
    # RootAufs has mounted the root file system in ram
    #
    # This fstab is in ram and the real fstab can be found /ro/etc/fstab
    # the root file system ' / ' has been removed.
    # All Swap files have been removed.
    #

    EOF

    #remove root and swap from fstab
    cat /aufs/ro/etc/fstab|grep -v ' / ' | grep -v swap >>/aufs/etc/fstab
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to create /aufs/etc/fstab
    #exit 0
    fi




    # add the read only file system to fstab
    #ROOTTYPE=$(/lib/udev/vol_id -t ${ROOT})
    ROOTTYPE=$(cat /proc/mounts|grep ${ROOT}|cut -d' ' -f3)
    ROOTOPTIONS=$(cat /proc/mounts|grep ${ROOT}|cut -d' ' -f4)
    echo /dev/loop0 /ro squashfs ro,relatime 0 0 >>/aufs/etc/fstab

    # S22mount on debian systems is not mounting /ro correctly after boot
    # add to rc.local to correct what you see from df
    #replace last case of exit with #exit
    cat /aufs/ro/etc/rc.local|sed 's/\(.*\)exit/\1\#exit/' >/aufs/etc/rc.local
    echo mount -f /ro >>/aufs/etc/rc.local

    # add back the root file system. mtab seems to be created by one of the init proceses.
    echo "echo aufs / aufs rw,xino=/rw/.aufs.xino,br:/rw=rw:/ro=ro 0 0 >>/etc/mtab" >>/aufs/etc/rc.local
    echo "echo aufs-tmpfs /rw tmpfs rw 0 0 >>/etc/mtab" >>/aufs/etc/rc.local
    echo exit 0 >>/aufs/etc/rc.local


    #build remountrw
    echo \#!/bin/sh >/aufs/bin/remountrw
    echo mount -o remount,rw ${ROOT} >>/aufs/bin/remountrw
    chmod 0700 /aufs/bin/remountrw

    #build remountro
    echo \#!/bin/sh >/aufs/bin/remountro
    echo mount -o remount,ro ${ROOT} >>/aufs/bin/remountro
    chmod 0700 /aufs/bin/remountro

    # This should drop to a shell. (rewrite)
    if [ "$aufsdebug" -eq 1 ]; then
    echo
    echo " root-aufs debug: mount --move /aufs ${rootmnt} "
    echo
    echo ' root-aufs debug: init will stop here. '
    echo
    exit 0
    fi

    mount --move /aufs ${rootmnt}

    exit 0
    EOF
    $ chmod +x $IMGROOT/../etc/iso/scripts/init-bottom/aufs_root
    На этом настройка initramfs заканчивается.

  6. Создаём скрипт, создающий iso-образ и сохраняем его в файле «~/ubuntu-ram/scripts/make-iso.sh»
    #!/bin/sh
    WORKDIR=/path/to/ubuntu-ram
    SQUASHFS_ROOT=$WORKDIR/image/
    ISO_ROOT=$WORKDIR/tmp/

    rm -Rf $ISO_ROOT/*

    # Получаем версию ядра в окружении
    version=$(basename $(readlink $SQUASHFS_ROOT/initrd.img))
    version=${version#initrd.img-}

    mount -o bind $WORKDIR/etc/iso $SQUASHFS_ROOT/etc/initramfs-tools
    chroot $SQUASHFS_ROOT mkinitramfs -v -o /boot/initrd.img-$version $version
    umount $SQUASHFS_ROOT/etc/initramfs-tools

    mkdir $ISO_ROOT/isolinux
    cp $SQUASHFS_ROOT/boot/initrd.img-$version $ISO_ROOT/isolinux/initrd.gz
    cp $SQUASHFS_ROOT/boot/vmlinuz-$version $ISO_ROOT/isolinux/vmlinuz
    cp /usr/lib/syslinux/isolinux.bin $ISO_ROOT/isolinux/
    cat <<EOF > $ISO_ROOT/isolinux/isolinux.cfg
    DEFAULT server
    TIMEOUT 1
    LABEL server
    menu label ^Server
    kernel vmlinuz
    append initrd=initrd.gz root=/root.sqfs loop=/dev/loop0 rootfstype=squashfs aufs=tmpfs ro
    EOF

    #
    mksquashfs $SQUASHFS_ROOT $ISO_ROOT/root.sqfs \
    -e $SQUASHFS_ROOT/boot/* \
    $SQUASHFS_ROOT/initrd.img \
    $SQUASHFS_ROOT/vmlinuz

    # Создаём ISO
    mkisofs -o $WORKDIR/image.iso -r \
    -V "MYUSBSERVER" -v -no-emul-boot \
    -boot-load-size 4 -boot-info-table \
    -b isolinux/isolinux.bin \
    -c isolinux/isolinux.boot $ISO_ROOT
    Делаем его исполняемым
    $ chmod +x ~/ubuntu-ram/scripts/make-iso.sh
    После выполнения скрипта в директории «~/ubuntu-ram» будет создан требуемый iso-образ.

  7. Создание загрузочной USB флешки.
    Создаём хук
    $ cat <<EOF > ~/ubuntu-ram/etc/usb/hooks/load_modules
    #!/bin/sh
    set -e

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    . /usr/share/initramfs-tools/hook-functions

    force_load usb_storage
    force_load squashfs
    force_load vfat
    force_load aufs

    exit 0
    EOF
    $ chmod +x ~/ubuntu-ram/etc/usb/hooks/load_modules
    Копируем скрипт «etc/iso/scripts/init-bottom/aufs_root» в «etc/usb/scripts/init-bottom/aufs_root».
    Пишем скрипт, загружающий систему из USB-флешки в оперативную память
    $ cat <<EOF > ~/ubuntu-ram/etc/usb/scripts/init-premount/udev_into_ram
    #!/bin/sh

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    mknod /dev/loop0 b 7 0
    mkdir /disk

    WAIT_COUNT=15
    while [ ! -e /dev/disk/by-label/MYUSBSERVER ] && [ "$WAIT_COUNT" -gt 0 ]
    do
    tmp=$((WAIT_COUNT-=1))
    sleep 1
    done

    echo -n "Please wait... "
    mount -t vfat -o ro /dev/disk/by-label/MYUSBSERVER /disk
    cp /disk/root.sqfs /
    echo "done"
    umount /disk && rm -Rf /disk
    EOF
    $ chmod +x $IMGROOT/../etc/usb/scripts/init-premount/udev_into_ram
    Ниже приведён скрипт создающий бутовую USB-флешку. Скрипт сохраняется в файл «~/ubuntu-ram/scripts/make-usb.sh»
    #!/bin/sh

    WORKDIR=/path/to/ubuntu-ram
    SQUASHFS_ROOT=$WORKDIR/image/
    ISO_ROOT=$WORKDIR/tmp/

    rm -Rf $ISO_ROOT/*

    # Получаем версию ядра в окружении
    version=$(basename $(readlink $SQUASHFS_ROOT/initrd.img))
    version=${version#initrd.img-}

    mount -o bind $WORKDIR/etc/usb $SQUASHFS_ROOT/etc/initramfs-tools
    chroot $SQUASHFS_ROOT mkinitramfs -v -o /boot/initrd.img-$version $version
    umount $SQUASHFS_ROOT/etc/initramfs-tools

    mkdir $ISO_ROOT/isolinux
    cp $SQUASHFS_ROOT/boot/initrd.img-$version $ISO_ROOT/initrd.gz
    cp $SQUASHFS_ROOT/boot/vmlinuz-$version $ISO_ROOT/vmlinuz
    cat <<EOF > $ISO_ROOT/syslinux.cfg
    DEFAULT server
    TIMEOUT 1
    LABEL server
    menu label ^Server
    kernel vmlinuz
    append initrd=initrd.gz root=/root.sqfs loop=/dev/loop0 rootfstype=squashfs aufs=tmpfs ro
    EOF

    #
    mksquashfs $SQUASHFS_ROOT $ISO_ROOT/root.sqfs \
    -e $SQUASHFS_ROOT/boot/* \
    $SQUASHFS_ROOT/initrd.img \
    $SQUASHFS_ROOT/vmlinuz

    echo "Please insert USB flash drive and press Enter"
    read
    # /dev/sdX - Ваша USB-флешка
    lilo -M /dev/sdX
    lilo -A /dev/sdX 1
    mkfs.vfat /dev/sdX1
    syslinux -f /dev/sdX1
    mlabel -i /dev/sdX1 ::MYUSBSERVER
    mount -t vfat /dev/sdX1 /mnt
    cp -a $ISO_ROOT/* /mnt
    umount /mnt
    exit 0
    Делаем скрипт исполняемым
    $ chmod +x ~/ubuntu-ram/scripts/make-usb.sh

понедельник, 25 мая 2009 г.

SANE vs EPSON Perfection V300 PHOTO

Sane для работы с этим сканером требуются проприетарные драйвера. В репозитарии Ubunty 9.04 Jaunty готовых пакетов не оказалось. Но после недолгих поисков в Launchpad.Net нашлось то, что нужно.
Подключаем репозитарий PPA

deb http://ppa.launchpad.net/doctormo/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/doctormo/ppa/ubuntu jaunty main
Добавляем ключи PPA
$ wget -O- 'http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x15A579BF113659DF' | sudo apt-key add -
Ставим требуемые драйвера
$ sudo apt-get update
$ sudo apt-get install iscan iscan-plugins
Создаем правило udev для сканера и сохраняем в файл «/etc/udev/rules.d/50-epson-v300.rules». Этим мы переопределим права на файл устройства. Иначе он будет доступен только для суперпользователя.
SUBSYSTEMS=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0131", MODE="660", GROUP="scanner"
Перезагружаем HAL
$ sudo invoke-rc.d hal restart
Теперь к компьютеру подключаем сканер и запускаем xsane.

понедельник, 4 мая 2009 г.

Скрипт для корректного выключения гостевых хостов в libvirt

Ввиду неспособности libvirt-bin корректно отключать гостевые хосты при выключении/ребуте сервера, решил написать свой скрипт

#!/bin/sh
### BEGIN INIT INFO
# Provides: kvm-shutdown
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Shutdown Guest KVM Hosts
# Description: Shutdown Guest KVM Hosts
### END INIT INFO

# Author: Князь <demiurg (at) propheta.ru>
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Shutdown Guest KVM Hosts"
NAME=kvm-shutdown
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "/usr/bin/virsh" ] || exit 0
[ -S "/var/run/libvirt/libvirt-sock" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

export LANG=C

#
# Function that stops the daemon/service
#
virsh_list()
{
virsh list 2>/dev/null | grep -E 'running$' | awk '{ print $2 }'
}

do_stop()
{
LIST=$(virsh_list)
for i in $LIST;
do
virsh shutdown $i 1>/dev/null 2>/dev/null
echo
echo -n "Shutdown $i ";
while [ "$(virsh_list | grep $i)" ];
do
echo -n '.'
sleep 2
done;
done;
if [ "$LIST" ]; then echo; fi;
}

case "$1" in
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Activating $DESC" "$NAME"
do_stop
case "$?" in
0|1)
[ "$VERBOSE" != no ] && log_end_msg 0
break
;;
2)
[ "$VERBOSE" != no ] && log_end_msg 1
break
;;
esac
break
;;
*)
echo "Usage: $SCRIPTNAME stop" >&2
exit 3
;;
esac
Сохраняем скрипт в файл «/etc/init.d/kvm-shutdown» и делаем его исполняемым
$ sudo chmod +x /etc/init.d/kvm-shutdown
Создаем символические ссылки в rc0, rc1, rc6
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc0.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc1.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc6.d/K19kvm-shutdown
Префикс K19 выбран для того, чтобы скрипт запускался перед «/etc/init.d/libvirt-bin» (префикс K20)

пятница, 13 февраля 2009 г.

Решение проблемы некорректного GPG-ключа в Ubuntu

Иногда, при обновлении списка доступных пакетов может случиться такая ошибка

W: GPG error: http://mirror.ubuntu.com hardy-updates Release: The following signatures were
invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
W: You may want to run apt-get update to correct these problems
Решение
$ sudo apt-get update -o Acquire::http::No-Cache=True

пятница, 19 декабря 2008 г.

Локальное зеркало для AVP Kaspersky 6

В поисках рецепта создания сабжа наткнулся на обсуждение в forum.lissyara.su. Взяв за основу опубликованный rambomax'ом скрипт, создал веб-зеркало для корпоративной сети.

Предполагается что веб-сервер уже настроен и работает.

  1. Устанавливаем программы из репозитария
    $ sudo apt-get install wget unzip
  2. Создаем директории
    $ sudo mkdir -p /scripts /www/avp-updates /var/samba/share/Avp
  3. Создаем скрипт обновления «/scripts/avp-updates.sh»
    #!/bin/sh
    #--- BEGIN ---
    AVURL=ftp://downloads1.kaspersky-labs.com/zips/
    FTPDIR=/var/samba/share/Avp
    AVPDIR=/www/avp-updates
    WGET=/usr/bin/wget
    UZIP=/usr/bin/unzip

    $WGET -N --random-wait --retry-connrefused -P "$FTPDIR" -t 0 $AVURL/av-i386-cumul.zip
    $UZIP -t $FTPDIR/av-i386-cumul.zip
    FLAG_C=$?

    $WGET -N --random-wait --retry-connrefused -P "$FTPDIR" -t 0 $AVURL/av-i386-weekly.zip
    $UZIP -t $FTPDIR/av-i386-weekly.zip
    FLAG_W=$?

    $WGET -N --random-wait --retry-connrefused -P "$FTPDIR" -t 0 $AVURL/av-i386-daily.zip
    $UZIP -t $FTPDIR/av-i386-daily.zip
    FLAG_D=$?

    #### EXTRACT FILES FROM ARCHIVE
    /bin/rm -f $AVPDIR/*

    if [ $FLAG_C -ne 0 ]
    then
    rm $FTPDIR/av-i386-cumul.zip
    else
    $UZIP -o $FTPDIR/av-i386-cumul.zip -d "$AVPDIR"
    fi

    if [ $FLAG_W -ne 0 ]
    then
    rm $FTPDIR/av-i386-weekly.zip
    else
    $UZIP -o $FTPDIR/av-i386-weekly.zip -d "$AVPDIR"
    fi

    if [ $FLAG_D -ne 0 ]
    then
    rm $FTPDIR/av-i386-daily.zip
    else
    $UZIP -o $FTPDIR/av-i386-daily.zip -d "$AVPDIR"
    fi
  4. Делаем скрипт исполняемым
    $ sudo chmod +x /scripts/avp-updates.sh
  5. Настраиваем crontab на запуск нашего скрипта каждый день в два часа ночи
    $ sudo -s
    # crontab -l 2>/dev/null > /tmp/avp-cron-XXX.tmp
    # echo >> /tmp/avp-cron-XXX.tmp
    # echo "0 2 * * * /scripts/avp-updates.sh" >> /tmp/avp-cron-XXX.tmp
    # crontab /tmp/avp-cron-XXX.tmp
    # rm /tmp/avp-cron-XXX.tmp
    # exit
  6. Создаем виртуальный хост в apache2 для веб-зеркала.
    Файл «/etc/apache2/sites-available/avp-updates»
    <VirtualHost *:80>
    ServerAdmin demiurg@avp-updates.www
    DocumentRoot /www/avp-updates
    ServerName avp-updates.www

    ErrorLog /var/log/apache2/avp-updates_error-log
    CustomLog /var/log/apache2/avp-updates_log common

    <Directory "/www/avp-updates">
    Options Indexes
    AllowOverride None
    Order Deny,Allow
    Allow from All
    </Directory>
    </VirtualHost>
  7. Активируем созданный хост
    $ sudo ln -s ../sites-available/avp-updates /etc/apache2/sites-enabled/050-avp-updates
  8. Проверяем конфиг и ребутаем веб-сервер
    $ sudo apache2ctl configtest
    $ sudo /etc/init.d/apache2 restart

вторник, 9 декабря 2008 г.

OCS Inventory

На выходных искал программу для инвентаризации программного обеспечения и оборудования на рабочих станциях локальной сети и нашел статью Евгения Бражко, описывающую установку OCS Inventory на Ubuntu Gutsy.
Всю статью пересказывать не буду, а просто опишу собственные действия по установке на Ubuntu Intrepid. Начнём.
Первым делом ставим необходимые пакеты из репозитария. Предполагается, что веб-сервер apache2 уже установлен и настроен.

$ sudo apt-get install libapache-dbi-perl libdbi-perl libdbd-mysql-perl libsoap-lite-perl libxml-simple-perl libnet-ip-perl libcompress-zlib-perl php5-gd make
Ставим отсутствующие в репозитарии модули для perl из CPAN
$ sudo cpan -i XML::Entities
$ sudo cpan -i YAML
OCS Inventory, скачанная с сайта разработчика, не дружит с кириллицей. Исправленную версию можно взять отсюда (OCSNG_UNIX_SERVER_1.02_RC1_RU.tar.gz).
Распаковываем архив, запускаем инсталлятор и в ходе процесса отвечаем на его вопросы
$ sudo ./setup.sh
Перезапускаем веб-сервер
$ sudo /etc/init.d/apache2 restart
В браузере набираем адрес «http://your.web.server/ocsreports/install.php». В форму вводим имя и пароль суперпользователя (root) и адрес, по которому доступен сервер mySQL.

На рабочие станции ставим агент для windows, файлы которого после установки надо подменить файлами из этого архива. Иначе все буквы кириллицы в отчетах, начиная с «х» (по алфавиту), превратятся в английскую букву «х».
Устанавливаем агент для windows. После установки останавливаем сервис "OCS INVENTORY SERVICE", для чего в командной строке набираем
net stop "OCS INVENTORY SERVICE"
Копируем файлы из архива в директорию «C:\Program Files\OCS Inventory Agent». Запускаем ранее остановленный сервис
net start "OCS INVENTORY SERVICE"
Агент отправит отчет об установленном на рабочей станции программном обеспечении и его оборудовании на сервер по прошествии некоторого времени. Чтобы получить отчет немедленно, в командной строке надо набрать команду
"C:\Program Files\OCS Inventory Agent\OCSInventory.exe" /SERVER:your.web.server /PNUM:80 /NOW
Отчеты агентов можно просмотреть по адресу «http://your.web.server/ocsreports/». Имя и пароль для входа по умолчанию «admin» и «admin» соответственно (без кавычек).

Удаление адреса «на лету» с сетевого интерфейса в Ubuntu Linux

Удаление адреса с сетевого интерфейса

$ sudo ifconfig ethN 0.0.0.0
Удаление алиаса сетевого интерфейса
$ sudo ifconfig ethN:M del a.b.c.d
где M - номер алиаса, a.b.c.d - ip-адрес алиаса.

вторник, 14 октября 2008 г.

Dovecot: Шифруем IMAP и POP3

  1. Первым делом создаем сертификат и секретный ключ. На вопрос о CN (Common Name) вписываем имя сервера – например «mail.pupkin.ru». В противном случае почтовый клиент может отказаться работать с сервером
    $ openssl req -new -outform PEM -out dovecot.crt -newkey rsa:2048 -nodes -keyout dovecot.key -keyform PEM -days 9999 -x509
    Вывод будет примерно таким
    Generating a 2048 bit RSA private key
    ..........................................................................+++
    ................................+++
    unable to write 'random state'
    writing new private key to 'dovecot.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:RU
    State or Province Name (full name) [Some-State]:Moscow Region
    Locality Name (eg, city) []:Moscow
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Pupkin & Co.
    Organizational Unit Name (eg, section) []:IT Department
    Common Name (eg, YOUR name) []:mail.pupkin.ru
    Email Address []:vasya@pupkin.ru
    Жирным шрифтом отмечены ответы.

  2. Перемещаем созданные ключи в папку Dovecot и устанавливаем права доступа к ним
    $ sudo -s
    # mkdir /etc/dovecot/ssl
    # mv dovecot.crt /etc/dovecot/ssl/dovecot.crt
    # mv dovecot.key /etc/dovecot/ssl/dovecot.key
    # chown root /etc/dovecot/ssl/dovecot.*
    # chmod 0600 /etc/dovecot/ssl/dovecot.key

  3. Правим конфигурационный файл «/etc/dovecot/dovecot.conf»
    protocols = imaps pop3s
    ssl_disable = no
    ssl_cert_file = /etc/dovecot/ssl/dovecot.crt
    ssl_key_file = /etc/dovecot/ssl/dovecot.key

  4. Перезапускаем Dovecot
    # /etc/init.d/dovecot restart
  5. Проверяем работу сервера с сертификатом
    $ openssl s_client -connect mail.pupkin.ru:imaps -debug
    Если все корректно настроили в ответ выйдет куча текста с диагностикой устанавливаемого защищенного соединения.
    В конце у меня вышло
    -----END CERTIFICATE-----
    subject=/C=RU/ST=Moscow Region/L=Moscow/O=Pupkin & Co./OU=IT Department/CN=mail.pupkin.ru/emailAddress=vasya@pupkin.ru
    issuer=/C=RU/ST=Moscow Region/L=Moscow/O=Pupkin & Co./OU=IT Department/CN=mail.pupkin.ru/emailAddress=vasya@pupkin.ru
    ---
    No client certificate CA names sent
    ---
    SSL handshake has read 1684 bytes and written 316 bytes
    ---
    New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
    Server public key is 1024 bit
    Compression: NONE
    Expansion: NONE
    SSL-Session:
    Protocol : TLSv1
    Cipher : DHE-RSA-AES256-SHA
    Session-ID: 13053ADF84C8157032B21A241E46398D4837A38F9AAA86095E32F1FDB55B704A
    Session-ID-ctx:
    Master-Key: 5CFEF98B3BF13B13C0D8BD98EDD74D827847FE2D6B2240F4BE083C54B696681901829BFC35D838FB7F64D96CA815C7AA
    Key-Arg : None
    Start Time: 1224018874
    Timeout : 300 (sec)
    Verify return code: 18 (self signed certificate)
    ---
  6. Настраиваем почтовый клиент на работу по pop3s/imaps (порты 995 и 993 соответственно)

четверг, 2 октября 2008 г.

Локальное зеркало обновлений NOD32 в Ubuntu

  • Ставим wget, bsdmainutils, unrar, apache2
    $ sudo apt-get install wget bsdmainutils unrar apache2
  • Скачиваем архив со скриптами тут.
  • Создаем директорию веб-зеркала и пользователя www-nod32
    $ sudo mkdir -p /www/nod32-updates
    $ sudo adduser --home /scripts/NOD32 --no-create-home --shell /bin/bash --disabled-password www-nod32
    $ sudo chown -R www-nod32:www-nod32 /www/nod32-updates
  • Распакуем скачанный архив в /scripts (должна появиться директория NOD32)
  • Меняем владельца директории
    $ sudo chown -R www-nod32:www-nod32 /scripts/NOD32/mirror
  • Правим updates3.sh
    # Путь к скриптам
    path_prog=/scripts/NOD32
    # Путь до баз на веб
    path_html=/www/nod32-updates
  • Правим NOD32_3UPDATE.sh
    # Путь к базам данных
    PATHN=/scripts/NOD32/mirror

    # Имя пользователя (для беcплатных серверов - пусто)
    login_name=
    # Пароль (для беcплатных серверов - пусто)
    password=

    # Адреса платных серверов обновлений (адреса дб без /nod_upd)
    #URLN=http://89.202.157.136
    #URLN=http://89.202.157.137
    #URLN=http://89.202.157.138
    #URLN=http://89.202.157.139
    #URLN=http://www.nod32.com
    #URLN=http://u20.eset.com
    #URLN=http://89.202.157.139
    #URLN=http://u20.eset.com

    # Адреса бесплатных серверов обновлений
    # Оставляю без изменения, т.к. не знаю на каких серверах будут
    # лежать обновления
    URLN=http://ved.metroland.ru/updates/nod32/
  • Проверим работу скрипта
    $ sudo -u www-nod32 /scripts/NOD32/update3.sh
Настраиваем Apache
  • Создадим новый VirtualHost
    # cat > /etc/apache2/sites-available/nod32-updates
    <VirtualHost *>
    DocumentRoot /www/nod32-updates
    ServerName nod32-updates.your.domain.ru
    CacheNegotiatedDocs On
    ErrorLog /var/log/apache2/nod32-updates.your.domain.ru-error_log
    CustomLog /var/log/apache2/nod32-updates.your.domain.ru-access_log common
    <Directory "/www/nod32-updates">
    Options FollowSymLinks -Indexes
    AllowOverride None
    </Directory>
    </VirtualHost>
    # ln -s ../sites-available/nod32-updates /etc/apache2/sites-enabled/050-nod32-updates
  • Перезагрузим Apache с новыми настройками
    $ /etc/init.d/apache2 restart

Настроим crontab
$ sudo crontab -u www-nod32 -e
Добавим строку
0 8,13,17 * * * /scripts/NOD32/update3.sh
По мотивам статьи на сайте www.volmed.org.ru

пятница, 12 сентября 2008 г.

Доступ к серверу, прикрытому неподконтрольным брандмауером.

Вызвался настроить школьный сервер своему другу. В сельскую школу, где он работает, в рамках общероссийской программы провели интернет и там встал вопрос, как проконтролировать сетевую активность новоявленных интернет-пользователей (в лице школьников). Заодно привести в порядок локальную сеть школы.
Под сервер оперативно выделили компьютер. В выборе операционной системы остановились на Ubuntu. Но я, так как находился в километрах двухстах, нуждался в удаленном доступе. Проконсультировал через аську установку ОС и настройку удаленного доступа по ssh. Дальше меня ждал неприятный сюрприз – невозможность прямого соединения с сервером.
Решение было найдено в man-странице ssh. Спасением стали ключ «-R», создающий туннель c порта удаленной машины на локальный порт, и подконтрольный мне сервер («MY»), доступный со школы («SCHOOL»).

  • На «MY» создаем пользователя «user_my» и задаем ему пароль.
На сервере «SCHOOL»
  • Создаем пользователя «user_school» и добавляем его в список пользователей sudo.
  • Устанавливаем openssh-server и screen
    $ sudo aptitude install openssh-server screen
  • Запускаем сервер SSH
    $ sudo /etc/init.d/ssh start
  • В домашней папке нового пользователя создаем скрипт «~/bin/remote-access.sh»
    #!/bin/sh
    screen -d -m -S remote-access -- \
    sh -c 'while true; \
    do ssh -R 2222:localhost:22 -C \
    user_my@my.server.ru; done'
    Сделаем скрипт исполняемым
    $ chmod +x ~/bin/remote-access.sh
    Данный скрипт создаёт фоновую сессию screen и устанавливает ssh-соединение с «MY».
  • Создаем ключ беспарольной аутентификации. Пароль (passphrase) для ключа не задается. Нужен для скрипта «remote-access.sh»
    $ ssh-keygen -b 2048
    Копируем ключ с «SCHOOL» на «MY»
    $ ssh-copy-id user_my@my.server.ru
  • Добавляем задание для cron, чтобы соединение с «MY» устанавливалось сразу после включения «SCHOOL»
    $ crontab -e
    @reboot /home/user_school/bin/remote-access.sh
  • Запустим наш скрипт на «SCHOOL»
    $ /home/user_school/bin/remote-access.sh
    $ screen -ls
    There are screens on:
    5140.remote-access (Detached)
    1 Socket in /var/run/screen/S-user_school.
  • На стороне «MY» должен появиться новый порт
    $ netstat -tln | grep :2222
    tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN
  • Теперь мы можем соединиться с сервером «SCHOOL» по созданному туннелю
    $ ssh -p 2222 user_school@localhost

суббота, 6 сентября 2008 г.

Skystar3: Спутниковый интернет в Ubuntu (hardy)

Описывается настройка спутникового интернета провайдера «Радуга Интернет» через openvpn.

  • После установки спутниковой карты в свободный слот PCI и загрузки ОС создаем файл «/etc/modprobe.d/dvb_core.modprobe»
    options dvb_core dvb_shutdown_timeout=915360000
    Этим мы препятствуем «засыпанию» карты. В новых ядрах, в отличие от старых, установка параметра «dvb_shutdown_timeout» в «0» не помогает и потому надо выставлять заведомо большое значение таймаута (в секундах).
  • Перезагружаем компьютер.
  • Устанавливаем требуемые утилиты
    $ sudo aptitude install dvb-utils
  • Создаем файл «/etc/channels.conf»
    Raduga:11671:v:0:18200:0:0:0
    Здесь:
    • Raduga – название канала. Может быть любым.
    • 11671 – частота
    • v – поляризация. Может быть H – горизонтальная и V – вертикальная
    • 0 – FEC: 0 – Авто, 33/4,...
    • 18200 – Величина потока (Symbol rate)
    • 0 – Видео PID
    • 0 – Аудио PID
    • 0 – Program id
  • Пробуем залочиться на сигнал
    $ szap -c /etc/channels.conf -x -n 1
    reading channels from file '/etc/channels.conf'
    zapping to 1 'Raduga':
    sat 0, frequency = 11671 MHz V, symbolrate 18200000, vpid = 0, apid = 0

    using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
    status 07 | signal 9797 | snr 3270 | ber 0000ff00 | unc 00000000 |
    status 1f | signal 9696 | snr d344 | ber 00001800 | unc 00000000 | FE_HAS_LOCK
    Ключевые значения: «status 1f» и «FE_HAS_LOCK». Остальные поля указывают уровень сигнала, количество ошибок и т.п. Когда устойчивый сигнал будет получен, szap завершит свою работу.
  • Теперь отключим rp_filter, фильтрующий пакеты которые не могут уйти через тот же интерфейс что и пришли. В нашем случае пакет приходит через один интерфейс, а уходит через другой
    $ sudo sh -c 'echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter'
  • Создаем сетевый интерфейс спутниковой карты
    $ sudo dvbnet -p 1234
    где «1234» - ваш PID. После выполнения команды должен появиться сетевой интерфейс «dvb0_0» (неактивный).
  • Настраиваем интерфейс
    $ sudo ifconfig dvb0_0 hw ether YOUR-MAC-ADDRESS YOUR-IP-ADDRESS netmask 255.255.255.0 up
    где «YOUR-MAC-ADDRESS» и «YOUR-IP-ADDRESS» соответственно MAC-адрес и IP-адрес вашей подписки.
  • Смотрим на наличие входящего трафика на интерфейсе «dvb0_0»
    $ sudo dvbtraffic
    -PID--FREQ-----BANDWIDTH-BANDWIDTH-
    0000 10 p/s 1 kb/s 15 kbit
    0010 0 p/s 0 kb/s 1 kbit
    0011 0 p/s 0 kb/s 1 kbit
    0014 0 p/s 0 kb/s 1 kbit
    0032 60 p/s 11 kb/s 90 kbit
    003c 10 p/s 1 kb/s 15 kbit
    003d 31 p/s 5 kb/s 47 kbit
    0064 13 p/s 2 kb/s 20 kbit
    Если программа ничего не выводит, то проблемы могут быть в неправильных параметрах или «заснула» спутниковая карта.
  • Правим конфигурационный файл «/etc/network/interfaces» и добавляем
    auto dvb0_0
    iface dvb0_0 inet manual
    pre-up sh -c '/usr/bin/dvbnet -a 0 -p 1234 > /dev/null'
    up ifconfig $IFACE hw ether YOUR-MAC-ADDRESS YOUR-IP-ADDRESS netmask 255.255.255.0 up
    up sh -c 'echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter'
    up sh -c '/usr/bin/szap -c /etc/channels.conf -n 1 -x'
    down ifconfig $IFACE down
    down /usr/bin/dvbnet -d 0
Теперь приступим к установке и настройке openvpn
  • Установим openvpn
    $ sudo aptitude install openvpn
  • Скачаем из личного кабинета архив с ключами для openvpn. Из архива распакуем файлы ca.crt, client.ovpn, i0xxxxxx.csr, i0xxxxxx.crt, i0xxxxxx.key.
  • Скопируем все эти файлы в директорию «/etc/openvpn».
  • Сменим права доступа к файлу «i0xxxxxx.key»
    $ sudo chmod 0400 /etc/openvpn/i0xxxxxx.key

  • Переименуем файл «client.ovpn» в «raduga.conf» и отредактируем его. В итоге должно получиться примерно такое содержание
    client
    dev tap
    # dev-node Raduga
    proto udp

    remote 80.81.208.66 55032

    resolv-retry infinite
    nobind
    persist-key
    persist-tun

    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/i0xxxxxx.crt
    key /etc/openvpn/i0xxxxxx.key

    ns-cert-type server
    verb 3
    comp-lzo
    comp-noadapt

    auth-user-pass /etc/openvpn/password.txt
    route-up /etc/openvpn/tap0-route.sh
    Создаем файл «/etc/openvpn/password.txt» с именем и паролем подписки
    user
    password
    и делаем его доступным на чтение только владельцу
    $ sudo chmod 0400 /etc/openvpn/password.txt
  • Создаем скрипт «/etc/openvpn/tap0-route.sh», выполняемый после поднятия роутов.
    netstat -rn | \
    sed '1,2d' | \
    awk '{ \
    if ($1 == "0.0.0.0" \
    && $2 == "10.251.32.1" \
    && $3 == "0.0.0.0" \
    && $8 != "tap0") { \
    EX=sprintf("/sbin/route del -net 0.0.0.0/0 gw %s dev %s && /sbin/route add -net 0.0.0.0/0 gw %s dev tap0\n", $2, $8, $2); system(EX); } }'
    В моем случае openvpn дефолтовый маршрут постоянно вешал на интерфейс «dvb0_0» и пришлось прибегнуть к принудительной привязке скриптом роута к «tap0». Делаем скрипт исполняемым
    $ sudo chmod +x /etc/openvpn/tap0-route.sh

  • Редактируем файл «/etc/default/openvpn» и добавляем строку
    AUTOSTART="raduga"
  • Пробуем соединиться к провайдеру из консоли
    $ sudo openvpn /etc/openvpn/raduga.conf
    Если успешно соединились с сервером, закрываем соединение нажатием «ctrl+c».
  • Перезапускаем даемон
    $ sudo /etc/init.d/openvpn restart
Статья писалась по памяти и возможны неточности в описании. Буду признателен если сообщите мне о них.

среда, 3 сентября 2008 г.

Устранение проблем с локалью в консоли Ubuntu

Если в консоли постоянно донимают подобные предупреждения

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "ru_RU.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
справится с ними можно, сгенерировав отсутствующую локаль
$ sudo locale-gen ru_RU.UTF-8
Generating locales...
ru_RU.UTF-8... done
Generation complete.
Смотрим на список доступных локалей
$ locale -a
C
en_GB.utf8
en_US.utf8
POSIX
ru_RU.utf8