Hatred's Log Place

DON'T PANIC!

Jan 13, 2009 - 1 minute read - Comments -

Обновление udev 130->135 или как пропал интернет

После очередного обновления системы обновился udev с версии 130 на 135. Попутно хочу сказать, у меня две сетевых карточки, и, что бы именования интерфейсов сохранялись, используется 75-persistent-net-generator.rules, благодаря которому генерируется 70-persistent-net.rules.

Так вот, в новом udev произошли обновления, из-за которых старый 70-persistent-net.rules оказался несостоятельным. Имена сетевых интерфейсков поменялись, в результате PPPoE не поднимался. Пришлось удалить файл и переименовать 75-persistent-net-generator.rules.optional в 75-persistent-net-generator.rules и перечитать правила, подправить получившийся 70-persistent-net.rules. Но этого мало: нужно или выгрузить и подгрузить модули сетевух или перезагрузить систему, что бы правила подействовали на именование интерфейсов.

Собственно, вот такая вот ремарка.

Dec 26, 2008 - 3 minute read - Comments - linux

EeePC: dpi & wifi

В продолжение изначальной темы про мой EeePC. Разберем вопрос правильного задания DPI и как пользоваться WIFI и вообще сетью на ноутбуке.

DPI

Как задавать DPI (dots per inch / точек на дюйм) рассказано в статье про установку Arch Linux на EeePC 901 (смотреть мой первый пост про EeePC на этом блоге или пользоваться поиском на ArchWIKI). Я же хочу разобраться как получить это значение вообще, и какое оно будет для EeePC 1000HA, в частности.

Итак, разрешение матрицы монитора X на Y точек (пикселей). Тогда количество точек по диагонали: Z = sqrt(X^2 + Y^2)

Диагональ монитора D дюймов, тогда значение DPI: DPI = Z / D

Округляем его до большего целого.

Для EeePC имеем разрешение матрицы 1024x600 пикселей и диагональ 10.2 дюйма: Z = sqrt(1024^2 + 600^2) = 1186.8 DPI = 1186.8 / 10.2 = 116.36 ~ 117 dpi

Иногда встречается информация, что диагональ 10 дюймов… спорить не берусь, меня пока всё устраивает :)

А для моего ThinkPad T530 (15.6 inch, 1920x1080): Z = sqrt(1920^2 + 1080^2) = 2202.90717 DPI = 2202.90717 / 15.6 = 141.21 ~ 141 dpi Width = 15.6 / 2202.90717 * 1920 * 25.4 = 345.35 ~ 345 mm Height = 15.6 / 2202.90717 * 1080 * 25.4 = 194.26 ~ 194 mm

Прописываем полученное значение в /etc/X11/xinit/xserverrc, где строчка запуска превращается примерно в такое: exec /usr/bin/X -nolisten tcp -dpi 117 “$@”

При использовании всяких mdm, gdm, kdm и иже с ними, нужно параметры запуска Xserver искать у них в настройках. Плюс, при таких настройках строчка ниже упорно рапортует о 96dpi. Зато в логах Xorg.0.log гордо красуется 141 (это уже новый ноутбук). При конфигурировании через xorg.conf картина с точностью до наоборот.

Перезапускаем, проверяем при помощи xdpyinfo: xdpyinfo | grep -B2 resolution:

На картах nVidia (это уже не про EeePC :simple_smile:) есть опция для драйвера DPI, использовать её как-то так:

Section "Device"
    Identifier          "Card0"
    Driver              "nvidia"
    ...
    Option              "UseEdidDpi"   "false"
    Option              "DPI"          "141 x 141"
EndSection

Для других карт поможет DisplaySize в миллиметрах (сохраняем, например, в /etc/X11/xorg.conf.d/90-monitor.conf):

Section "Monitor"
	Identifier "<default monitor>"
	DisplaySize 345 194 # посчитали выше
EndSection

Более подробно: * https://wiki.archlinux.org/index.php/Xorg#Display_size_and_DPI (спасибо Юсу за наводку) * https://wiki.archlinux.org/index.php/HiDPI

WIFI

Хотя не только он, но больше про него.

Первое, говорится что стандартный драйвер не очень хорошо работает, я не стал проверять, поставил madwifi-hal из AUR. Надо только занести модуль ndiswrapper в blacklist или вообще удалить пакеты ndiswrapper и ndiswrapper-utils (если были поставлены). Если с драйвером madwifi-hal карточка не заведется, то, как рекомендуют форумы, стоит попробовать родной драйвер ath5k, и наоборот.

Да, я думаю пакет acpi-eee901 у вас уже стоит, так вот, стоит отредактировать файл /etc/acpi/eee.conf, конкретно, изменить значение переменной WIRELESS_MODULE и поставить её в ath_pci (в случае использования madwifi-hal) или ath5k (в случае использования стокового драйвера).

Теперь дело за малым. За менеджером соедененний.

Ноутбук устройство мобильное, и может использоваться в различных сетях, каждый раз править /etc/rc.conf и перезапускать сеть не выход. На помощь приходят менеджеры соединений. На себе проверил wicd, который есть в репозитариях ArchLinux. Прочитать про его настройку можно тут. Хотя я настроил методом “научного клика” и все заработало на ура :)

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

Проверил работу wifi совместно с wicd на работе - работает :) На этом тема wifi для меня пока закрыта.

Dec 23, 2008 - 1 minute read - Comments - linux

Asus EeePC 1000HA

На прошлой неделе пришел мне сабжевый нетбук. Машинка неплохая, мне, вцелом понравилась :)

В продаже, на момент покупки была только версия с WindowsXP SP3, которую по приходу снес и поставил туда ArchLinux.

При конфигурировании пользовался статьями а ArchWiki: * http://wiki.archlinux.org/index.php/Asus_Eee_PC_901 * http://wiki.archlinux.org/index.php/Installing_Arch_Linux_on_the_Asus_EEE_PC

По результату, использую стоковое ядро, вайфай ещё не трогал, пока родной стоковый драйвер сетевой карточки (но уже сталкивался с ошибкой в назначении MAC адреса, так что нужно будет обновиться). Тачпад настроил пока по дефолту, настроил ACPI (из первой статьи для Eee PC 901), так что кнопочки все работают, suspend2ram работает тоже, звук изменяется и яркость тоже. Настроил cpufreq в целях экономии батареи. В общем ещё опишу что да как.

В планах: * дравер сетевой * wifi * fsb (http://wiki.eeeuser.com/howto:overclockfsb) * тачпад (настроил согласно статьи)

Dec 8, 2008 - 1 minute read - Comments -

Solaris: Обзорная статистика по использованию CPU

Опять скрипт небольшой, я обозвал его loadcpu

#!/bin/sh

### CPU loading summary (wrapper for 'mpstat')

if [ x"$1" != x"---run_in_bash" ]; then
    bash $0 ---run_in_bash $@
    exit $?
fi

shift

# currently unused
cpu_count=`mpstat | grep -v CPU | wc -l`

mpstat | grep -v CPU | nawk '
{
    usr+=$13;
    sys+=$14;
    wt+=$15;
    idl+=$16;
    CPU_COUNT++;
}
END{
    printf("            %5s %5s %5s %5s %5sn", "count", "usr", "sys", "wt", "idl");
    printf(" cpu total: %5d %5d %5d %5d %5dn", CPU_COUNT, usr, sys, wt, idl);
    printf("cpu middle: %5d %5d %5d %5d %5dn", 1, usr/CPU_COUNT, sys/CPU_COUNT, wt/CPU_COUNT, idl/CPU_COUNT);
}'

Ну и сразу небольшой обзорный скриптик, показывает утилизацию просессора, памяти, свопа, подсистемы ввода-вывода, среднюю нагрузку, использует скрипт free и loadcpu что представлен выше, скрипт обозвал sysstat:

#!/bin/sh

### System stat (cpu/mem/io/load average/uptime) summary

if [ x"$1" != x"---run_in_bash" ]; then
    bash $0 ---run_in_bash $@
    exit $?
fi

shift

echo "** CPU"
`dirname $0`/loadcpu

echo "** MEM"
`dirname $0`/free

echo "** IO"
iostat -xn

echo "** Load average and Uptime"
uptime

Dec 8, 2008 - 2 minute read - Comments - linux

StressLinux

StressLinux - дистрибутив для тестирования железа. Достаточно скачать ISO образ или образ для флешки (работает и через PXE) прожечь/записать и загрузиться, утилиты доступные (актуальная информация тут): * stress - утилита для стрессового тестирования POSIX систем, генерирует события, которые могут иметь место при обычной работе (A tool to impose certain types of stress on a POSIX system.) * CPUBurn - утилита для проверки стабильности работы CPU при большой загрузке (CPU maximum load (heat) stability test) * CPU Burn-In - аналогичен предыдущей (CPU burn-in test) * nbench - еще тесты для CPU (CPU test suite) * iometer - производительность подсистемы ввода-вывода (I/O performance meter) * hddtemp - температура диска, вообще утилиту и на рабочей системе держать не дурно (A program to display the temperature of your hard drive.) * lm_sensors - работа с сенсорами, температура CPU/мамки, информация из EEPROM и т.д. На рабочей системе тоже не помешает (LM78 and other hardware monitor drivers.) * lshw - показывает список железа в системе, дополнение к lshwd (в ArchLinux) и lscpi/lsusb (Hardware lister) * bonnie++ - производительности жеского диска, работает на файловой системе, так что можно сравнить и производительность файловых систем (Hard drive benchmark) * netio - тесты производительности сети (Network benchmark) * Nepim - тестирование сети (Network test) * Netperf - тестирование сети (Network test) * Iperf - тестирование сети (Network test) * smartmontools - мониторинг параметров S.M.A.R.T. (S.M.A.R.T. drivetests) * x86info - информация по CPU (CPU information) * memtester - утилита для проверки памяти из запущенной системы, лучше гнать вместе с memtest86+ * memtest86 - наверное одна из лучших утилит для тестирования памяти (A stand-alone memory diagnostic) * memtest86+ - другая реализация (An other stand-alone memory diagnostic)

Скачать образы можно тут: http://www.stresslinux.org/downloads.php

Документация тут: http://www.stresslinux.org/docu.php, хотя она вся сводится, как записать и что сделать, там совсем всё просто.

Да, судя по последней новости, дистрибутив обновлялся давно, хотя, возможно, жизнь идет в списке рассылки :) Но, ничто не мешает использовать данные утилиты и в вашем дистрибутиве, а тот же Memtest86+ уже почти всегда встречается на установочных/восстановительных дисках почти любого дистрибутива (в ArchLinux - есть, из главного меню Grub в Tools и там вызвать).

Наличие PXE-версии “ис-каропки” делает вкусным применение этого изделия в организации, представляете, достаточно перебутать комп, загрузиться по сети и прогнать тесты…

Dec 4, 2008 - 3 minute read - Comments - linux

Sakura и Termit

На форуме русского сообщества ArchLinux в разделе скриншотов за декабрь 2008 появилась тема, там, на снимке экрана фигурировал эмулятор терминала Sakura, решил попробывать.

Sakura

Терминал зависит только от GTK и компоненты VTE, умеет UTF-8, табы. Есть в community репозитария ArchLinux. После запуска имеет примерно такой вид:

Все настройки, коих аскетично мало, делаются через контекстное меню:

Конечно, горячие клавиши, тут даю на основные операции, что меня интересуют: * Ctrl-Shift-t - создать новую вкладку * Ctrl-Shift-w - закрыть текущую вкладку * Alt-Left/Right - переключение между вкладками влево/вправо

Исходный код программы состоит из одного файла :)

Termit

Изучая сакуру, нашел на её сайте упоминание терминала Termit. Эмулятор терминала так же зависит от GTK и VTE, но ещё требует LUA 5.1. Умеет UTF-8, табы. В репозитариях ArchLinux нету, есть только в AUR. После первого запуска видим такое окно:

Терминал может конфигурироваться через меню, но настройки распространяются только на текущую сессию. Основная конфигурация идет через файл init.lua (о чем немного далее)

Сразу после запуска будете неприятно удивлены когда откроете новую вкладку - цвет текста сбросится в черный, а прочитать черным по черному будет проблемно :)

Автор уже знает, а пока что можем сделать сами.

Вот тут делои касается конфигурации. Она происходит скриптом на LUA который помещается в ~/.config/termit/init.lua, пример этого скрипта есть в архиве с исходными кодами, пример надо сказать работающий и функциональный. В случае ArchLinux выполним команды: mkdir ~/.config/termit cp /usr/share/doc/termit/init.lua.example ~/.config/termit/init.lua

и немного подредактируем. Главное раскомментируйте параметр defaults.foreground_color и укажите тот что вам нужен, gray в большинстве случаем окажется достаточным.

Перезапускаем termit, наблюдаем что в новых вкладках нормально отображается текст, наблюдаем два новых пункта меню: * User menu * Encodings

Последнее позволяет поменять кодировки, особенно актуально мне, когда приходится по ssh заходить то на сервера со старой доброй koi8-r или на новые utf-8. Да luit помогает, но иногда забывается, а перелогиниваться лениво :)

Почитать про LUA API термита можно в доке, что идет с ним: /usr/share/doc/termit/lua_api.txt (путь может отличаться в вашем дистрибутиве)

Горячие клавиши настраиваются через init.lua, по умолчанию такие: * Alt-Left - предыдущая вкладка * Alt-Right - следующая вкладка * Ctrl-t - открыть новую вкладку * Ctlr-w - закрыть текущую вкладку * Ctrl-Insert - копировать выделенный текст в буффер * Shift-Insert - вставить текст из буффера

Выполнение приложений

Ещё иногда нужно выполнить какое-то приложение в терминале, иногда приложение не интерактивное, и терминал быстро схлопывается, так что не рассмотреть результатов. Поэтому обычно команда приобретает вид: bash -c ‘echo test; read’ и пока не нажмешь Enter терминал не закроется

Для sakura командная строка получилась: sakura -e “bash -c ‘echo test; read’” и ничего не отработало - завершилось ошибкой

У termit строка такая: termit –execute “bash -c ‘echo test; read’” и всё отработало как нужно!

Ну… В общем, Termit - мой выбор ;)

Сайты программ

Dec 4, 2008 - 1 minute read - Comments -

Сколько памяти? Solaris way.

Сегодня потребовалось узнать сколько памяти в Салярке всего, сколько свободно и сколько занято… Ага и команды free нету. Но есть kstat, как подсказал скрипт проверки памяти из Nagios, а дальше написал “свой” free:

#!/bin/sh

### Mem/swap using in Solaris

if [ x"$1" != x"---run_in_bash" ]; then
     bash $0 ---run_in_bash $@
     exit $?
fi

shift

page_size=`kstat -p unix:0:seg_cache:slab_size | awk '{print $2}'`

# RAM
mem_total=`kstat -p unix:0:system_pages:pagestotal | awk '{print $2}'`
mem_total=`expr $mem_total * $page_size / 1024`

mem_used=`kstat -p unix:0:system_pages:pageslocked | awk '{print $2}'`
mem_used=`expr $mem_used * $page_size / 1024`

mem_free=`kstat -p unix:0:system_pages:pagesfree | awk '{print $2}'`
mem_free=`expr $mem_free * $page_size / 1024`

# SWAP
swap_total=`kstat -p unix:0:vminfo:swap_avail | awk '{print $2}'`
swap_total=`expr $swap_total / 1024 / 1024`

swap_used=`kstat -p unix:0:vminfo:swap_alloc | awk '{print $2}'`
swap_used=`expr $swap_used / 1024 / 1024`

swap_free=`kstat -p unix:0:vminfo:swap_free | awk '{print $2}'`
swap_free=`expr $swap_free / 1024 / 1024`

#echo -e "ttotalttusedttfree"
#echo -e "mem:t$mem_totaltt$mem_usedtt$mem_free"
#echo -e "swap:t$swap_totaltt$swap_usedtt$swap_free"

# для более красивого вывода
printf "      %14s %14s %14sn" "total" "used" "free"
printf " mem: %14d %14d %14dn" $mem_total $mem_used $mem_free
printf "swap: %14d %14d %14dn" $swap_total $swap_used $swap_free

В качестве источника информации: https://project.openfiler.com/tracker/browser/openfiler/branches/2.x-rpath/var/www/phpsysinfo/includes/os/class.SunOS.inc.php?rev=1161

Dec 1, 2008 - 2 minute read - Comments -

Замечания по NDB кластеру и NDB-нодам

На уровне замечений, касательно понятий “Node Group” и параметра секции [NDBD DEFAULT] NoOfReplicas в конфиге кластаера config.ini

NoOfReplicas - параметр задающий количество реплик данных. Допустим, его значение 2, тогда получается у нас будет две реплики данных. Теперь дальше, допустим, NDB ноды у нас с номерами 10, 11, 12, 13 и в конфиге они перечислены в этом же порядке, тогда количество Node Group будет:

NodeGroupsCount = NDB_Nodes_Count / NoOfReplicas = 4 / 2 = 2

Номера Node Group будут: 0 и 1 (нумерация с нуля.)

Теперь, как ноды группируются в группы? А просто, по порядку номеров. Т.е. наши ноды 10, 11, 12, 13 при NoOfReplicas = 2, распределятся так: * Node Group 0: 10, 11 * Node Group 1: 12, 13

Если прводить аналогии, то очень похоже на RAID 10: 10+11, 12+13 - работают в зеркалирование, и в сумме (10_11)+(12_13) - в чередовании.

Отсюда ещё одно важно замечание: если ВСЕ ноды одной группы вылетают, целостность данных нарушается, как следствие ВЕСЬ кластер прекращает работу, и, как следствие: для работы (и для запуска) кластера необходимо, что бы было хотя бы по одной живой ноде из группы.

Ещё одно замечание (пока окончательно не проверено), но дополню: по одной живой ноде из группы должны стартовать в промежуток не больше 30 сек. Ещё лучше запускать ноды с параметром -n а потом через менеджмент-панель делать или ALL START или node-id START

И в заключение, если отвалится одна нода из группы, лучше, как можно быстрее получить об этом уведомление на почту или ещё куда. И распределять ноды одной группы так, что бы не получилось “семерых одним ударом”.

Nov 24, 2008 - 1 minute read - Comments -

Как оформить диплом в LaTeX?

Михаил Конник aka virens, ведущий блога “Записки Дебианщика”, который я регулярно читаю, начал публиковать свой труд по сабжевым названием.

На данный момент рассмотрены вопросы установки дистрибутива LaTeX (кстати в ArchLinux смотрим вывод pacman -Ss texlive и ставим себе что нужно), основу будущего документа, которую потом можно использовать как шаблон для других работ, немного упомянуты пролемы конвертации из/в LaTeX в другие форматы (в частности RTF и MS Word).

Статья: http://mydebianblog.blogspot.com/2008/11/latex.html

Nov 23, 2008 - 9 minute read - Comments -

VLAN в ArchLinux

Волей судеб понадобилось в ArchLinux поднять несколько VLAN. Привычным движением открываю файл /etc/rc.conf на редактирование, прописываю туда: eth2v0001=“eth2.0001 192.168.0.254 netmask 255.255.255.0”

добавляю eth2v0001 в INTERFACES: INTERFACES=(… eth2v0001 …)

и поднимаю интерфейс: /etc/rc.d/network ifup eth2v0001

и… получаю ругань что такого интерфейса не существует.

В чем проблема?.. Иду на http://wiki.archlinux.org и делаю поиск по слову VLAN, нахожу всего одну статью: High Performance Firewall/Nat with iptables and VLANs and iproute2 в которой упоминается программа vconfig из одноименного пакета - именно она нужна для настройки VLAN на сетевых интерфейсах.

Ладно, с этим всё хорошо, но неужели ручками настраивать все VLAN которые потребуются?

Почесав макушку, иду смотреть содержимое файла /etc/rc.d/network и нахожу, что для VLAN там нет вообще ничего.

“Если гора не идет к Магомеду, то Магомед идет к горе”, - подумал я, и краем глаза посмотрел как процедура сделана в Debian Linux. Там в директории /etc/network/if-pre-up.d лежит скрипт vlan который занимается конфигурированием VLAN. В директории /etc/network/if-post-down.d скрипт vlan занимается подчисткой следов после своей работы - сиречь удаляет созданные VLAN.

Поразмыслив, решаю допиливать скрипт настройки сети в Arch.

Для начала ставим нужные пакеты: pacman -S vconfig iproute

Создаём файл /etc/rc.d/network_vlan со следующим содержимым:

#!/bin/bash

. /etc/rc.conf
. /etc/rc.d/functions

# wireless settings
[ -f /etc/conf.d/wireless ] && . /etc/conf.d/wireless
# ethernet bonding settings
[ -f /etc/conf.d/bonding ] && . /etc/conf.d/bonding
# bridge settings
[ -f /etc/conf.d/bridges ] && . /etc/conf.d/bridges
# dhcpcd settings
[ -f /etc/conf.d/dhcpcd ] && . /etc/conf.d/dhcpcd

# Code taked from Debian distribution
vlan_up()
{
    local iface
    local VLANID
    local IF_VLAN_RAW_DEVICE
    iface=$1

    case "$iface" in
        vlan0*)
                vconfig set_name_type VLAN_PLUS_VID > /dev/null 2>&1
                VLANID=`echo $iface|sed "s/vlan0*//"`
                ;;
        vlan*)
                vconfig set_name_type VLAN_PLUS_VID_NO_PAD > /dev/null 2>&1
                VLANID=`echo $iface|sed "s/vlan0*//"`
                ;;
        eth*.0*)
                vconfig set_name_type DEV_PLUS_VID > /dev/null 2>&1
                VLANID=`echo $iface|sed "s/eth[0-9][0-9]*<br/>.0*//g"`
                IF_VLAN_RAW_DEVICE=`echo $iface|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
                ;;
        eth*.*)
                vconfig set_name_type DEV_PLUS_VID_NO_PAD > /dev/null 2>&1
                VLANID=`echo $iface|sed "s/eth[0-9][0-9]*<br/>.0*//g"`
                IF_VLAN_RAW_DEVICE=`echo $iface|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
                ;;
        *)      return 0
                ;;
    esac

    if [ -n "$IF_VLAN_RAW_DEVICE" ]
    then
        if [ ! -x /usr/sbin/vconfig ]; then
          return 0
        fi

        if ! ip link show dev "$IF_VLAN_RAW_DEVICE" > /dev/null; then
            #echo "$IF_VLAN_RAW_DEVICE does not exist, unable to create $iface"
            return 1
        fi
        ip link set up dev $IF_VLAN_RAW_DEVICE > /dev/null 2>&1
        vconfig add $IF_VLAN_RAW_DEVICE $VLANID > /dev/null 2>&1
    fi

    return 0
}

vlan_down()
{
    local iface
    local IF_VLAN_RAW_DEVICE

    iface=$1

    case "$iface" in
        eth*.0*)
                IF_VLAN_RAW_DEVICE=`echo $IFACE|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
                ;;
        eth*.*)
                IF_VLAN_RAW_DEVICE=`echo $IFACE|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
                ;;
        *)      return 0
                ;;
    esac

    if [ -z "$IF_VLAN_RAW_DEVICE" ]; then
        return 0
    fi

    if [ ! -x /usr/sbin/vconfig ]; then
	return 0
    fi

    vconfig rem $face > /dev/null 2>&1
}

ifup()
{
	if [ "$1" = "" ]; then
		echo "usage: $0 ifup <interface_name>"
		return 1
	fi

	wi_up $1 || return 1

	eval ifcfg="<br/>$${1}"
	if [ "$ifcfg" = "dhcp" ]; then
		# remove the .pid file if it exists
		/bin/rm -f /var/run/dhcpcd-${1}.pid >/dev/null 2>&1
		/bin/rm -f /var/run/dhcpcd-${1}.cache >/dev/null 2>&1
		/sbin/dhcpcd $DHCPCD_ARGS ${1}
	else
		iface=`echo $ifcfg | awk '{print $1}'`
		vlan_up $iface || return 1

		/sbin/ifconfig $ifcfg
	fi
	return $?
}

wi_up()
{
	eval iwcfg="<br/>$wlan_${1}"
	[ "$iwcfg" = "" ] && return 0

	/usr/sbin/iwconfig $iwcfg
	[[ -z "$WIRELESS_TIMEOUT" ]] && WIRELESS_TIMEOUT=2
	sleep $WIRELESS_TIMEOUT

	bssid=`iwgetid $1 -ra`
	if [[ "$bssid" = "00:00:00:00:00:00" ]]; then
		printhl "Could not associate $1 - try increasing WIRELESS_TIMEOUT and check network is WEP or has no security"
		return 1
	fi
	return 0
}

ifdown()
{
	if [ "$1" = "" ]; then
		echo "usage: $0 ifdown <interface_name>"
		return 1
	fi
	eval ifcfg="<br/>$${1}"
	if [ "$ifcfg" = "dhcp" ]; then
		if [ -f /var/run/dhcpcd-${1}.pid ]; then
			/bin/kill $(cat /var/run/dhcpcd-${1}.pid)
		fi
	fi
	# Always bring the interface itself down
	/sbin/ifconfig ${1} down >/dev/null 2>&1

	iface=`echo $ifcfg | awk '{print $1}'`
	vlan_down $iface || return 1

	return 1
}

iflist()
{
	local iface
	for ifline in ${INTERFACES[@]}; do
		if [ "$ifline" = "${ifline#!}" ]; then
			printf " $ifline:<br/>t"
		else
			printf "$ifline:<br/>t"
		fi
		eval real_ifline=<br/>$${ifline#!}

		iface=`echo $real_ifline | awk '{print $1}'`
		if [ x"$iface" != x"dhcp" ]; then
		    is_run=`ifconfig $iface 2>/dev/null | grep 'inet addr'`
		    if [ -z "$is_run" ]; then
			run='( )'
		    else
			run='(*)'
		    fi
		else
		    run='(?)'
		fi

		echo $real_ifline $run
	done
}

rtup()
{
	if [ "$1" = "" ]; then
		echo "usage: $0 rtup <route_name>"
		return 1
	fi
	eval routecfg="<br/>$${1}"
	if grep -q :: <<< $routecfg; then
			/sbin/route -A inet6 add $routecfg
	else
			/sbin/route add $routecfg
	fi
	return $?
}

rtdown()
{
	if [ "$1" = "" ]; then
		echo "usage: $0 rtdown <route_name>"
		return 1
	fi
	eval routecfg="<br/>$${1}"
	if grep -q :: <<< $routecfg; then
			/sbin/route -A inet6 del $routecfg
	else
			/sbin/route del $routecfg
	fi
	return $?
}

rtlist()
{
	for rtline in ${ROUTES[@]}; do
		if [ "$rtline" = "${rtline#!}" ]; then
			printf " $rtline:<br/>t"
		else
			printf "$rtline:<br/>t"
		fi
		eval real_rtline=<br/>$${rtline#!}
		echo $real_rtline
	done
}

bond_up()
{
	for ifline in ${BOND_INTERFACES[@]}; do
		if [ "$ifline" = "${ifline#!}" ]; then
			eval bondcfg="<br/>$bond_${ifline}"
			/sbin/ifenslave $ifline $bondcfg || error=1
		fi
	done
}

bridge_up()
{
	for br in ${BRIDGE_INTERFACES[@]}; do
		if [ "$br" = "${br#!}" ]; then
			# if the bridge already exists, remove it
			if [ "$(/sbin/ifconfig $br 2>/dev/null)" ]; then
				/sbin/ifconfig $br down
				/usr/sbin/brctl delbr $br
			fi
			/usr/sbin/brctl addbr $br
			eval brifs="<br/>$bridge_${br}"
			for brif in $brifs; do
				if [ "$brif" = "${brif#!}" ]; then
					/usr/sbin/brctl addif $br $brif || error=1
				fi
			done
		fi
	done
}

bridge_down()
{
	for br in ${BRIDGE_INTERFACES[@]}; do
		if [ "$br" = "${br#!}" ]; then
			/usr/sbin/brctl delbr $br
		fi
	done
}


case "$1" in
	start)
		if ! ck_daemon network; then
			echo "Network is already running.  Try 'network restart'"
			exit
		fi

		stat_busy "Starting Network"
		error=0
		# bring up bridge interfaces
		bridge_up
		# bring up ethernet interfaces
		for ifline in ${INTERFACES[@]}; do
			if [ "$ifline" = "${ifline#!}" ]; then
				ifup $ifline || error=1
			fi
		done
		# bring up bond interfaces
		bond_up
		# bring up routes
		for rtline in "${ROUTES[@]}"; do
			if [ "$rtline" = "${rtline#!}" ]; then
				rtup $rtline || error=1
			fi
		done
		if [ $error -eq 0 ]; then
			add_daemon network
			stat_done
		else
			stat_fail
		fi
		;;
	stop)
		#if ck_daemon network; then
		#	echo "Network is not running.  Try 'network start'"
		#	exit
		#fi

		stat_busy "Stopping Network"
		rm_daemon network
		error=0
		for rtline in "${ROUTES[@]}"; do
			if [ "$rtline" = "${rtline#!}" ]; then
				rtdown $rtline || error=1
			fi
		done
		for ifline in ${INTERFACES[@]}; do
			if [ "$ifline" = "${ifline#!}" ]; then
				ifdown $ifline || error=1
			fi
		done
		# bring down bridge interfaces
		bridge_down
		if [ $error -eq 0 ]; then
			stat_done
		else
			stat_fail
		fi
		;;
	restart)
		$0 stop
		/bin/sleep 2
		$0 start
		;;
	hotplug_ifup|ifup|ifdown|iflist|rtup|rtdown|rtlist)
		$1 $2
		;;
	*)
		echo "usage: $0 {start|stop|restart}"
		echo "       $0 {ifup|ifdown|iflist|rtup|rtdown|rtlist}"
esac

# vim: set ts=2 noet:

Он основан на оригинальном скрипте network из пакета initscripts. Кроме поддержки VLAN там подправлен немного вывод iflist который добавляет в конце каждый строки с интерфейсом: * (*) - интерфейс поднят * ( ) - интерфейс не поднят * (?) - dhcp

Т.к. это скрипт основан на оригинальном, имеет смысл предоставить diff между оригиналом и новым файлом:

--- network	2008-09-19 07:26:34.000000000 +1100
@@ -12,6 +12,83 @@
 # dhcpcd settings
 [ -f /etc/conf.d/dhcpcd ] && . /etc/conf.d/dhcpcd

+# Code taked from Debian distribution
+vlan_up()
+{
+    local iface
+    local VLANID
+    local IF_VLAN_RAW_DEVICE
+    iface=$1
+
+    case "$iface" in
+        vlan0*)
+                vconfig set_name_type VLAN_PLUS_VID
+                VLANID=`echo $iface|sed "s/vlan0*//"`
+                ;;
+        vlan*)
+                vconfig set_name_type VLAN_PLUS_VID_NO_PAD
+                VLANID=`echo $iface|sed "s/vlan0*//"`
+                ;;
+        eth*.0*)
+                vconfig set_name_type DEV_PLUS_VID
+                VLANID=`echo $iface|sed "s/eth[0-9][0-9]*<br/>.0*//g"`
+                IF_VLAN_RAW_DEVICE=`echo $iface|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
+                ;;
+        eth*.*)
+                vconfig set_name_type DEV_PLUS_VID_NO_PAD
+                VLANID=`echo $iface|sed "s/eth[0-9][0-9]*<br/>.0*//g"`
+                IF_VLAN_RAW_DEVICE=`echo $iface|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
+                ;;
+        *)      return 0
+                ;;
+    esac
+
+    if [ -n "$IF_VLAN_RAW_DEVICE" ]
+    then
+        if [ ! -x /usr/sbin/vconfig ]; then
+          return 0
+        fi
+
+        if ! ip link show dev "$IF_VLAN_RAW_DEVICE" > /dev/null; then
+            echo "$IF_VLAN_RAW_DEVICE does not exist, unable to create $iface"
+            return 1
+        fi
+        ip link set up dev $IF_VLAN_RAW_DEVICE
+        vconfig add $IF_VLAN_RAW_DEVICE $VLANID
+    fi
+
+    return 0
+}
+
+vlan_down()
+{
+    local iface
+    local IF_VLAN_RAW_DEVICE
+
+    iface=$1
+
+    case "$iface" in
+        eth*.0*)
+                IF_VLAN_RAW_DEVICE=`echo $IFACE|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
+                ;;
+        eth*.*)
+                IF_VLAN_RAW_DEVICE=`echo $IFACE|sed "s/<br/>(eth[0-9][0-9]*<br/>)<br/>..*/<br/>1/"`
+                ;;
+        *)      return 0
+                ;;
+    esac
+
+    if [ -z "$IF_VLAN_RAW_DEVICE" ]; then
+        return 0
+    fi
+
+    if [ ! -x /usr/sbin/vconfig ]; then
+	return 0
+    fi
+
+    vconfig rem $face
+}
+
 ifup()
 {
 	if [ "$1" = "" ]; then
@@ -28,6 +105,9 @@
 		/bin/rm -f /var/run/dhcpcd-${1}.cache >/dev/null 2>&1
 		/sbin/dhcpcd $DHCPCD_ARGS ${1}
 	else
+		iface=`echo $ifcfg | awk '{print $1}'`
+		vlan_up $iface || return 1
+
 		/sbin/ifconfig $ifcfg
 	fi
 	return $?
@@ -63,12 +143,17 @@
 		fi
 	fi
 	# Always bring the interface itself down
1. /sbin/ifconfig ${1} down >/dev/null 2>&1
1. return $?
+	/sbin/ifconfig ${1} down >/dev/null 2>&1 || return 1
+
+	iface=`echo $ifcfg | awk '{print $1}'`
+	vlan_down $iface || return 1
+
+	return 1
 }

 iflist()
 {
+	local iface
 	for ifline in ${INTERFACES[@]}; do
 		if [ "$ifline" = "${ifline#!}" ]; then
 			printf " $ifline:<br/>t"
@@ -76,7 +161,20 @@
 			printf "$ifline:<br/>t"
 		fi
 		eval real_ifline=<br/>$${ifline#!}
1. 	echo $real_ifline
+
+		iface=`echo $real_ifline | awk '{print $1}'`
+		if [ x"$iface" != x"dhcp" ]; then
+		    is_run=`ifconfig $iface | grep 'inet addr'`
+		    if [ -z "$is_run" ]; then
+			run='( )'
+		    else
+			run='(*)'
+		    fi
+		else
+		    run='(?)'
+		fi
+
+		echo $real_ifline $run
 	done
 }

Можно скачать файлом:

В заключении немного об именовании интерфейсов и переменных в /etc/rc.conf.

Имя интерфейса с VLAN должно быть одним из: * eth#.# - если сразу после точки идет цифра отличная от нуля (ex.: eth2.1, eth2.815) * eth#.#### - если сразу после точки идет ноль (0), тогда обязательно VLAN ID должен быть расширен до 4 цифр (ex.: eth2.0001, eth2.0814). Что будет если вы этого не сделаете? Попробуйте сами, а найдете решение как обойти - дайте знать ;)

Есть ещё варианта интерсейсов vlan# и vlan####, но я с ними не сталкивался и ничего сказать не могу. Кто может дополнить - с радостью выслушаю :)

Внутри конфига /etc/rc.conf я выработал следующие правила для именования переменных с параметрами интерфейсов: * eth# - для основного интерфейса * eth#a# - для алиасов (eth2:1) * eth#v# или eth#v#### - для VLAN (eth2.1)

Примеры: eth2=“eth2 192.168.0.1 netmask 255.255.255.0” eth2a1=“eth2:1 192.168.1.130 netmask 255.255.255.255” eth2v814=“eth2.814 192.168.2.130 netmask 255.255.255.255”

Вот в общем и всё. Сейчас ещё патч запщу на http://bugs.archlinux.org.

UPD:

Хех… я не один такой оказывается: FS#10420 - VLAN support for Arch default network script

там же есть вариант патча для ethX.Y Сейчас своё добавлю ;)

UPD2:

Да, возможно придется добавить модуль ядра 8021q в строчку MODULES в /etc/rc.conf

Nov 20, 2008 - 1 minute read - Comments -

На века...

Ну собственно с #archlinux-ru на FreeNode:

одну ногу впаиваешь, другие выгибаешь и к ним паяешь проводочки) называется “сопли”, но обычно такие сопли работают) зато вот потом как спаяешь “на века”.. нифига не работает)

Подписываюсь :D

Nov 16, 2008 - 2 minute read - Comments - linux

Планировщик IO проблемы тормоза системы

С недавнего времени стал замечать что система очень сильно тормозит на дисковых операциях. Например, если нужно создать файл 1.5G (допустим, аллоцирование места под закачку торрента), то на выделении система чуть ли не раком становиться - работать становиться очень некомфортно: мышь почти не работает, отклик от клавиатуры очень долгий. Это при том, что памяти - вагон и маленькая тележка (из 1G оперативы 800 метров на кеши, используется меньше 200M).

Почеса репу, решил поглядеть на планировщики IO:

[root@gaz ~]# dmesg | grep scheduler
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered

Начинаю копаться в памяти, ага, точно, на современных ядрах почти всегда планировщик IO по-умолчанию - cfq. Я, видать, уже эксперементировал, и в строке загрузки Grub:

elevator=as

Поменял на

elevator=cfq

(можно было бы и убрать)

Всё, теперь работа стала значительно более приятна.

Хочу отметить, что: * noop - обычный FIFO, подразумевается оптимизация ввода-вывода на уровне блочного устройства. * deadline - реализует механизм предельного срока для минимизации задержен IO. В один момент времени одно приложение имеет эксклюзивный доступ к диску. Для пользовательского ПК врядли подойдет, для сервера базы данных - вполне (да и серверов вообще, где с диском работа идет активно) * as - упреждающий доступ, говориться, что подходит для медленных и малых дисковых подсистем. Как оказалось у меня, на диске 750G не очень хорошо система себя чувствовала. * cfq - полностью справедливая очередь. Очередь ввода/вывода для каждого процесса, пытается разделить всю полосу пропускания между ними.

Если контроллер и диски поддерживают NCQ (SATA диски), стоит попробывать планировщик noop, теоретически производительность должна стать сравнима с cfq, при почти нулевой загрузки CPU. Ставить noop для IDE дисков смысла нет.

Да, планировщик можно поменять “на лету”, указав для каждого диска свой:

[root@gaz hda2]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq] 
[root@gaz hda2]# echo noop > /sys/block/sda/queue/scheduler
[root@gaz hda2]# cat /sys/block/sda/queue/scheduler
[noop] anticipatory deadline cfq 

Почитать про планировщики можно тут: * Планировщики ввода/вывода в Linux * Выбор планировщика ввода-вывода - тут человек пришел к точно таким же выводам как и я, касательно планировщика as * Ещё про новый (есть в ветке ядра -mm) планировщик BFQ: * http://www.cisco-linux.com.ua/index.cgi?action=news|comments&NEWS_ID=16996 * результаты тестирования

Nov 16, 2008 - 1 minute read - Comments - linux

Диски, файловые системы и данные

Ссылки на статьи по восстановлению данных, а так же технологии ATAoE

Nov 10, 2008 - 1 minute read - Comments - linux

Load average

В выводе uptime можно увидеть:

23:43:20 up 12 days, 1:44, 2 users, load average: 0.38, 0.82, 0.82

Собственно давно мучал вопрос - чиво это?

Если кратко, то давно знал: это средняя загрузка системы за 1/5/15 минут. Но как интерпретировать эти числа было непонятно, вот сегодня допекло, решил разобраться.

Итак, что это такое: число процессов ожидающих очереди на выполнение, процессы в состоянии Run, Wait for Run, Wait for I/O. Соответственно, чем выше - тем больше тормозит система. При значении больше N (где N - число процессоров или ядер в системе) начинается перегруз. Условно, значение можно умножить на 100 и вычесть 100 - получится процент перегруза системы.

Да, сразу несколько полезных утилит: * классический top из пакета procps, подвирает бывает, но годится для “пабыраму пасареть” * более продвинутый htop из одноименного пакета * iostat из пакета sysstat - состояние дисковой подсистемы * mpstat из пакета sysstat - загрузка CPU * pidstat из пакета sysstat - состояние процессов, в т.ч. на каком процессоре запущен процесс. * sar из пакета sysstat - показывает статистику по системной активности, статистика обновляется по крону (sar -A) * isag из пакета sysstat - графическое представление данных по системной активности. Для отрисовки нужен gnuplot

Более подробнее почитать тут: * http://meinit.nl/what-is-load-or-load-average-on-a-linux-box * http://www.linuxjournal.com/article/9001 * http://en.wikipedia.org/wiki/Load_(computing)