Построение виртуального свитча из нескольких сетевых карт с использованием Netgraph.
04.01.2010 20:47
Администратор
Построение виртуального свитча из нескольких сетевых карт с использованием Netgraph.
Итак Виртуальный свич из нескольких сетевух на нетграфе. Ситуация такая: на сервере интерфейс rl0 смотрит наружу, в локалку провайдера 10.*.*.*. а vr0 и vr1 смотрят во внутреннюю сеть 192.168.0.* Для удобства хотелось бы чтобы в домашнюю сеть смотрела одна сетевуха, а все компы домашней сети были подключены к серверу через свич. Реализуем задуманное на основе ядерного модуля ng_bridge!
Кому лень читать статью полностью, выкладываю свой скрипт. Скрипт предоставляется "As Is" - что то тут лишнее, что то кривое... Конструктивная критика приветствуется. Наличие необходимых зависимостей подразумевается. #!/bin/sh ngCtl="/usr/sbin/ngctl " Sleep="/bin/sleep" PFcmd="/sbin/pfctl" Head="/usr/bin/head" Tail="/usr/bin/tail" Echo="/bin/echo" Rm="/bin/rm"
PidFile="/var/run/mybridge.pid"
if1="vr0" if2="vr1" ifng="ngeth0" Switch="switch"
case $1 in start) if [ -s $PidFile ]; then ${Echo} Bridge already runned! exit 1 fi ${Echo} Starting bridge ${ngCtl} debug 2 ${ngCtl} mkpeer $if1: bridge lower link0 ${ngCtl} name $if1:lower $Switch ${ngCtl} connect $if1: $Switch: upper link1 ${ngCtl} connect $if2: $Switch: lower link2 ${ngCtl} connect $if2: $Switch: upper link3 ${ngCtl} msg $if1: setpromisc 1 ${ngCtl} msg $if2: setpromisc 1 ${ngCtl} msg $if1: setautosrc 0 ${ngCtl} msg $if2: setautosrc 0 ${ngCtl} mkpeer $Switch: eiface link5 ether ${ngCtl} name $Switch:link5 $ifng ${Sleep} 2 ${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf ${Echo} 'int_if="'$ifng'"' >> /etc/pf.conf ${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf
ifconfig $if1 -alias ifconfig $ifng inet 192.168.0.1 netmask 255.255.255.0
${PFcmd} -f /etc/pf.conf ${Echo} "runned" >> $PidFile
;; stop) if [ ! -s $PidFile ]; then ${Echo} Bridge is not runned! exit 1 fi ${ngCtl} shutdown $Switch: ${ngCtl} shutdown $ifng: ${Head} -n7 /etc/pf.conf.bak > /etc/pf.conf ${Echo} 'int_if="'$if1'"' >> /etc/pf.conf ${Tail} -n79 /etc/pf.conf.bak >> /etc/pf.conf ifconfig $if1 inet 192.168.0.1 netmask 255.255.255.0
${Rm} $PidFile ${PFcmd} -f /etc/pf.conf ;; *) if [ -s $PidFile ]; then ${Echo} State: Up else ${Echo} State: Down fi ;; esac
Нетграф по слухам чертовски производителен и чертовски плохо документирован, особенно на русском, так что если что не так, не обессудьте - в описанной конфигурации у меня все работает уже не один месяц. Также оговорюсь, что все беру с рабочей системы, так что-то может быть лишнее, а чего-то может не хватать.
Начнем с необходимого - с нетграфа. Вот список того, что стоит у меня:# kldstat -v |grep ng 202 ng_socket 181 ng_car 201 ng_rfc1490 200 ng_pptpgre 177 ng_async 199 ng_ppp 180 ng_bridge 198 ng_one2many 197 ng_nat 176 ng_UI 196 ng_mppc 195 ng_lmi 179 ng_bpf 194 ng_l2tp 175 ng_netflow 193 ng_ksocket 192 ng_ipfw 191 ng_ip_input 190 ng_iface 189 ng_hole 188 ng_gif_demux 187 ng_gif 186 ng_framerelay 185 ng_ether 184 ng_echo 183 ng_deflate 207 ng_vjc 206 ng_tty 205 ng_tee 204 ng_tcpmss 203 ng_ng_split 182 ng_cisco 2 1 0xc0945000 2fd4 ng_eiface.ko 1 ng_eiface # kldstat -v |grep netgraph 178 netgraph
Как видно из всего этого необходим минимум ng_eiface, который я забыл(или поленился) положить в ядро. Кроме того нам понадобятся модули ng_ether и ng_bridge. Но никто не запрещает побаловаться с ng_tee, ng_ipfw и чем-нибудь подобным для подсчета трафика, шейпинга et cetera...
После загрузки модулей нужных модулей смотрим что мы имеем# ngctl list There are 6 total nodes: Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 0 Name: rl0 Type: ether ID: 00000001 Num hooks: 0 Name: vr0 Type: ether ID: 00000002 Num hooks: 0 Name: vr1 Type: ether ID: 00000003 Num hooks: 0 Name: ngeth0 Type: ether ID: 00000003 Num hooks: 0 Name: ngctl38473 Type: socket ID: 0000be26 Num hooks: 0
Мы должны видеть узлы типа ether по числу реальных интерфейсов, виртуальный интерфейс ngeth0 и соответствующий ему и узел socket, который служит для связи ngctl с ядром(это уже мои измышления. Подробнее - man ng_socket && man ngctl). Еще мы видем один безымянный узел - это родственник ngeth0, они создаются и уничтожаются только вместе.
Далее нам надо сделать мост. Но просто так его нельзя создать, его надо на что то прицепить. Прицепим хук link0 к хуку lower сетевухи vr0. Сказано - сделано. Попутно обзовем его каким нибудь нехорошим именем, типа switch# ngctl mkpeer vr0: bridge lower link0 # ngctl name vr0:lower switch
Вот тут надо остановиться и поподробнее рассказать о том, что такое хуки(hooks), узлы(nodes), какие они бывают и с чем их едят. Нетграф - это система, которая строит граф, по которому бегают данные. В графе есть узлы и ребра. Иногда узел может просто висеть в воздухе(как например узлы наших сетевух), но чаще чтобы добавить какой то узел надо его к чему ни будь прикрутить. Прикручивание происходит соединением хуков разных узлов. После соединения между хуками появляется ребро по которому могут бегать данные от одного узла к другому. Хуки бывают разные и у каждого типа узла они свои. Какие то пропускают пакеты только в одну сторону, какие то пускают только пакеты верхних сетевых протоколов, подробнее про типы узлов написано в манах, а пока про насущное. У сетевух(узлов типа ether) есть три хука - upper, lower, и orphans. Грубо говоря, lower работает с нижними протоколами(ethernet), upper - с верхними, а про orphans не помню, но он мне не вроде не подошел. У bridge - до NG_BRIDGE_MAX_LINKS(у меня на 7.2 в src/sys/netgraph/ng_bridge.h:55 говорится про 32 хука) хуков с именами типа link0 link1 link2... У eiface только один хук, - ether - через который бегают все пакеты. При обращении к локальным узлам пишем двоеточие в конце имени. Обращаться можно как по имени, так и по ID. в последнем случае вместо <node_name>: пишется [0x<node_id>]:
С теорией вроде закончил, перейдем к практике. Продолжаем строит свич: цепляем к мосту остальные хуки сетевушек# ngctl connect vr0: switch: upper link1 # ngctl connect vr1: switch: lower link2 # ngctl connect vr1: switch: upper link3
Идем далее. Сетевухи имеют свойства выпуская пакет прописывать в нем поле отправитель себя и игнорировать пакеты, предназначенные не ей. Отучаем их от этих нехороших привычек:# ngctl msg vr0: setpromisc 1 # ngctl msg vr1: setpromisc 1 # ngctl msg vr0: setautosrc 0 # ngctl msg vr1: setautosrc 0
Свич почти готов. цепляем к нему виртуальную сетевуху, чтобы общаться с ним # ngctl mkpeer switch: eiface link5 ether # ngctl name switch:link5 ngeth0
И далее самое интересное. снимаем ипы с реальных сетевух(порты свича не имеют ипов) и ставим внутренний ип(у меня это 192.168.0.1) машины на виртуальную сетевуху. Реальные карточки должны быть без ипов только в состояниии UP# ifconfig vr0 up # ifconfig vr1 up # ifconfig vr0 -alias # ifconfig vr1 -alias # ifconfig ngeth0 inet 192.168.0.1 netmask 255.255.255.0
Вроде бы и все. Смотрим что у нас получилось:# ifconfig rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether <XXX> inet 10.XXX.XXX.XXX netmask 0xffffXXX broadcast 10.XXX.XXX.XXX media: Ethernet autoselect (100baseTX <full-duplex>) status: active vr0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC> ether <XXX> media: Ethernet autoselect (100baseTX <full-duplex>) status: active vr1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC> ether <XXX> media: Ethernet autoselect (100baseTX <full-duplex>) status: active ngeth0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:00:00:00:00:00 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 <overquoting deleted> # ngctl list There are 17 total nodes: Name: <unnamed> Type: ksocket ID: 0000be23 Num hooks: 1 Name: <unnamed> Type: pptpgre ID: 0000be22 Num hooks: 2 Name: <unnamed> Type: eiface ID: 0000001e Num hooks: 1 Name: ng0 Type: iface ID: 0000bd94 Num hooks: 1 Name: rl0 Type: ether ID: 00000001 Num hooks: 0 Name: switch Type: bridge ID: 00000014 Num hooks: 5 Name: vr0 Type: ether ID: 00000002 Num hooks: 2 Name: vr1 Type: ether ID: 00000003 Num hooks: 2 Name: mpd16513-stats Type: socket ID: 0000bd9a Num hooks: 0 Name: ngctl38842 Type: socket ID: 0000be2a Num hooks: 0 Name: mpd16513-cso Type: socket ID: 0000bd92 Num hooks: 0 Name: mpd16513-eso Type: socket ID: 0000bd93 Num hooks: 0 Name: mpd16513-lso Type: socket ID: 0000bd91 Num hooks: 1 Name: ngeth0 Type: ether ID: 0000001f Num hooks: 0 Name: mpd16513-B1-mss Type: tcpmss ID: 0000be24 Num hooks: 2 Name: mpd16513-B1 Type: ppp ID: 0000bd95 Num hooks: 3 Name: mpd16513-L1-lt Type: tee ID: 0000bd96 Num hooks: 2
# arp -a ? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet] ------------------------``---------------------------------- ? (192.168.0.2) at <XXX_MAC> on ngeth0 [ethernet] ? (192.168.0.3) at <XXX_MAC> on ngeth0 [ethernet] ? (192.168.0.255) at ff:ff:ff:ff:ff:ff on ngeth0 permanent [ethernet]
Примечание: записи вида ? (10.XXX.XXX.XXX) at <XXX_MAC> on rl0 [ethernet] - адреса из локалки провайдера)
Как видно, сетевухи vrX смирились со своей ролью в качестве портов свича и на них не висят маки соседих машин. Все выглядит так, будто у нас есть свич, в который воткнуты кабеля машин внутренней сети и кабель от нашего компа с интерфейса ngeth0(любопытно, что ifconfig и arp по разному определяют его мак). самого свича, как и полагается, не видно
Дальше разруливаем все пакеты файером, в нем разрешаем прохождение пакетов через реальные внутренние сетевухи(или шейпим/режем по надобности), ставим нат с внешней сетевухи на ngeth0, раздача инета между сетевухами моста будет регулироваться нетграфом. В общем ведем себя так, как будто у нас появился свич и исчезли две сетевухи.
Обновлено 28.05.2010 13:42
portdowngrade - откатываем нужный порт до любой ранее версии
04.01.2010 20:41
Администратор
portdowngrade - откатываем нужный порт до любой ранее версии
Статья не моя, но хотелось чтобы всё было на одном ресурсе, чтобы вдруг чего не мучать бедный гугл. Автор статьи: DonRumata
И так, буду цитировать со своими поправками, так как его статья уже старовата, думаю автор злиться не будет. Поехали:
Иногда случается, что обновленный порт отказывается работать или несовместим с уже установленным старым софтом. Вот в этом случае иногда проще вернуть все как было, но как это сделать?
В этом случае весьма полезной оказывается утилита portdowngrade. Итак, первым делом устанавливаем эту самую утилиту:# cd /usr/ports/ports-mgmt/portdowngrade # make DEFAULT_CVS_SERVER="
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
:/home/ncvs" install clean # rehash
Далее как работает данный софт:
portdowngrade ведет логи на установленном по умолчанию cvs сервере (или определенном опцией -s ) и просматривает все изменения, потом отображает предыдущие версии и обновляет дерево портов (только выбранный порт). То есть если надо откатить большое кол-во портов, придётся откатывать по отдельности.
Например, апгрейд до php 5.2.0 прошел неудачно и остались мы без пхп совсем, хочеться вернуться на версию 5.1.x. Первым делом сообщим утилите portdowngrade(1) вывести результаты о php5.# portdowngrade lang/php5
portdowngrade 0.6 by Heiner Eichmann Please note, that nothing is changed in the ports tree unless it is explicitly permitted in step 6!
Seeking port lang/php5 ...
Found several matches: 1: lang/php5 2: lang/php5-extensions
Please choose one: 1
В данном случае выбрали версию 1. Теперь утилита обратится к CVS и предложит выбрать до какой ветки вернуть порт. Downgrading port: lang/php5
Step 1: Checking out port from CVS repository CVS root directory:
Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
:/home/ncvs The authenticity of host 'anoncvs1.freebsd.org (216.38.206.185)' can't be established. DSA key fingerprint is 4d:59:19:7b:ea:9b:76:0b:ca:ee:da:26:e2:3a:83:b8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'anoncvs1.freebsd.org' (DSA) to the list of known hosts.
Step 2: Reading the port history from the CVS repository
Step 3: Analyzing the port history from the CVS repository
Step 4: Load port version numbers and present results Keys: <space> : next page d : details p : previous page <enter> : leave presentation and downdgrade if wanted
Далее пойдет список версий, с комментариями о добавлении/фиксах в продуктеnumber date portversion comment 1 2006/11/12 19:43:12 5.2.0 Update suhosin patch to 0.9.6.2 release. 2 2006/11/06 17:43:10 5.2.0 Update to 5.2.0 release. 3 2006/10/27 19:11:17 5.1.6 Update suhosin patch to 0.9.6 release. 4 2006/10/16 09:30:58 5.1.6 - fix open_basedir vulnerability in php4 and php5 [1] 5 2006/10/06 17:24:21 5.1.6 Enable suhosin patch by default. 6 2006/10/05 20:59:17 5.1.6 Added safety checks against integer overflow. 7 2006/09/29 19:11:40 5.1.6 Update suhosin patch to 0.9.5 release. 8 2006/09/10 16:37:43 5.1.6 Add support for QDBM. 9 2006/09/09 12:35:33 5.1.6 Update suhosin patch to 0.9.3 release. 10 2006/09/04 07:59:15 5.1.6 - Add experimental suhosin protection system support 11 2006/08/31 14:37:05 5.1.6 Update to 5.1.6 release. 12 2006/08/18 16:41:29 5.1.5 Update to 5.1.5. 13 2006/08/18 16:40:18 5.1.4 Allow php5-ldap to be built with SASL support enabled. 14 2006/07/11 13:21:54 5.1.4 Add databases/php5-oci8: 15 2006/05/23 06:19:19 5.1.4 Try to fix build on 4.X. 16 2006/05/18 22:17:32 5.1.4 - Holy Batman! Chase rerolled distfile. Only chance is an addition of a file 17 2006/05/10 14:46:43 5.1.4 Chase gmp library and bump PORTREVISION. Total lines: 152. Command:
Далее нажимаем Enter, или Пробел для прокрутки списка(не приходилось) и выбираем номер версии до которой нужно откатиться, на пример до версии 5.1.6 - номер 3 в списке.Enter version number to change port to (0: exit): 3
Далее подтверждаем выбор нажатием Enter и ждём :)Step 5: Checking out choosen date of the port from the CVS repository
Step 6: Modifying the port Port: lang/php5 at : 2006/10/27 19:11:17 Type 'yes' to bring the port to the state of the date above or 'no' to exit without changing anything. Note, that this only changes the port, not the installed software! yes or no:yes
Подтверждаем физический откат порта, пишем "yes", что нам и нужно. Если мы хотим посмотреть изменения, без физического отката, пишем "no"
Вот собственно и произошел откат порта. Добиваем наше дело до конца:# portupgrade -f php5*
Ну и проверяем какая картина получилась:# pkg_info | grep php5
Вот собственно и всё, очень полезная утилита, выручила при откате erlang(ejabberd не совместим с erlang-r13*, только с ветками r12 и ниже)
Обновлено 28.05.2010 13:42
|
Настройка вебкамеры FreeBSD
04.01.2010 20:37
Администратор
Настройка вебкамеры для работы с freebsd
Автор: vp. Оригинал : http://www.lissyara.su/articles/freebsd/tuning/webcam/
Задача - подключить камеру к freebsd. Для начала нам необходимо просто подключить камеру к freebsd и заставить ее работать.
Итак, на сервере используется freebsd 7.0. После подключения камеры:# usbdevs -v Controller /dev/usb4: addr 1: full speed, self powered, config 1, UHCI root hub(0x0000), Intel(0x0000), rev 1.00 port 1 addr 2: full speed, power 100 mA, config 1, product 0x08d7(0x08d7), vendor 0x046d(0x046d), rev 1.00
# dmesg | grep 0x046d ugen0: <vendor 0x046d product 0x08d7, class 0/0, rev 1.10/1.00, addr 2> on uhub4
vendor 0x046d - говорит о производителе камеры(Logitech) product 0x08d7 - это модель камеры
Поиск в сети решения для работы с камерой дало следующие результаты, * существует порт graphics/spcaview, который позволяет без лишних наворотов и зависимостей снимать с камеры jpeg изображения, а так же работать с mjpeg форматом(потоковый jpgeg) * graphics/qcamview - не подошел по причине отсутствия драйвера для конкретной модели и привязки к X11 * multimedia/pwcbsd - требует video4linux и совместимости с linux'ом
Из-за того, что qcamview и pwcbsd требую слишком много стороннего софта(в частности X11 и/или поддержки linux на бинарном уровне) для всего-лишь снятия изображения с камеры, решено было использовать graphics/spcaview
Т.к. мы поставили целью избавиться от зависимости от X11, перед установкой порта необходимо убедиться, что в /etc/make.conf содержиться строка вида "WITHOUT_X11=yes", что позволит собирать программы без библиотек X11(например, полезно для GD)# cat /etc/make.conf | grep 'WITHOUT_X11=yes' || echo "WITHOUT_X11=yes" >> /etc/make.conf
Устанавливаем порт, но не через # pkg_add -r graphics/spcaview
т.к. как выяснилось в последствии, поддержки текущей камеры нет в программе, а компилируем порт из исходников:# cd /usr/ports/graphics/spcaview # make && make install && rehash
При работе freebsd с камерами создается специальное устройство ugenX(например, /dev/ugen0) Проверяем поддержку камеры# spca5shot -d /dev/ugen0 -i Not found SPCA50x based usb camera, or Permission denied
Поддержки камеры нет, увы. Но мы ее добавим! Находим файл с данными о камерах и просматриваем его на предмет наличия поддержки камеры производителя 0x046d:# less /usr/ports/graphics/spcaview/work/spca5xx-20060402/drivers/usb/spca5xx.c | grep 0x046d {USB_DEVICE(0x046d, 0x0960)}, /* Logitech Inc. ClickSmart 420 */ {USB_DEVICE(0x046d, 0x0901)}, /* Logitech Inc. ClickSmart 510 */ {USB_DEVICE(0x046d, 0x0890)}, /* Logitech QuickCam traveler */ {USB_DEVICE(0x046d, 0x0900)}, /* Logitech Inc. ClickSmart 310 */ {USB_DEVICE(0x046d, 0x0905)}, /* Logitech ClickSmart820 */ {USB_DEVICE(0x046d, 0x08a2)}, /* Labtec Webcam Pro */ {USB_DEVICE(0x046d, 0x0921)}, /* Labtec Webcam */ {USB_DEVICE(0x046d, 0x0920)}, /* QC Express */ {USB_DEVICE(0x046d, 0x0928)}, /* Logitech QC Express Etch2 */ {USB_DEVICE(0x046d, 0x092a)}, /* Logitech QC for Notebook */ {USB_DEVICE(0x046d, 0x08a0)}, /* Logitech QC IM */ {USB_DEVICE(0x046d, 0x08a1)}, /* Logitech QC IM 0x08A1 +sound */ {USB_DEVICE(0x046d, 0x08a3)}, /* Logitech QC Chat */ {USB_DEVICE(0x046d, 0x08b9)}, /* Logitech QC IM ??? */ {USB_DEVICE(0x046d, 0x0929)}, /* Labtec Webcam Elch2 */ {USB_DEVICE(0x046d, 0x092c)}, /* Logitech QC chat Elch2 */ {USB_DEVICE(0x046d, 0x08ae)}, /* Logitech QuickCam for Notebooks */ {USB_DEVICE(0x046d, 0x092b)}, /* Labtec Webcam Plus */ {USB_DEVICE(0x046d, 0x08ad)}, /* Logitech QCCommunicate STX */ {USB_DEVICE(0x046d, 0x08a9)}, /* Logitech Notebook Deluxe */ {USB_DEVICE(0x046d, 0x08aa)}, /* Labtec Webcam Notebook */ {USB_DEVICE(0x046d, 0x08a6)}, /* Logitech QCim */ case 0x046d: /* Logitech Labtec */
Как можно заметить, поддержки нашей камеры нет в файле Поиск в сети по 0x08d7 модели камеры показал, что такая поддержка имеется в драйвере Logitech видеокамер gspcav1(http://mxhaard.free.fr/spca5xx.html). gspcav1 - это общий файл поддержки видеокамер для *nix систем, однако в скомпилированном виде он требует бинарной совместимости с linux, что нам не подходит.
Т.к. порт graphics/spcaview основан именно на этом драйвере, скачиваем исходники драйвера для анализа http://mxhaard.free.fr/spca50x/Download/gspcav1-20071224.tar.gz. Нас интересует файлы gspca_core.c и gspca.h
Анализ исходника gspca_core.c дает следующий код по модели 0x08d7: {USB_DEVICE(0x046d, 0x08d7)}, /* Logitech QCam STX */
и далее case 0x08d7: spca50x->desc = LogitechQCCommunicateSTX; spca50x->bridge = BRIDGE_ZC3XX; spca50x->sensor = SENSOR_HV7131C; break;
Осталось добавить эти данные в драйвер spca5xx.c из нашего порта graphics/spcaview и, возможно, появиться поддержка камеры. Но прежде, нужно не забыть стереть уже скомпилированные данные:# cd /usr/ports/graphics/spcaview # make clean
Теперь наша задача внести изменения в исходник драйвера и откомпилировать его. Применяем патчи но не компилируем исходник# make patch
Далее редактируем /usr/ports/graphics/spcaview/work/spca5xx-20060402/drivers/usb/spca5xx.c любимым редактором и вносим следующие изменения: Добавляем в секцию устройства 0x046d {USB_DEVICE(0x046d, 0x08d7)}, /* Logitech QCam STX */
После чего исходный текст будет выглядеть примерно так: {USB_DEVICE(0x046d, 0x08ad)}, /* Logitech QCCommunicate STX */ {USB_DEVICE(0x046d, 0x08a9)}, /* Logitech Notebook Deluxe */ {USB_DEVICE(0x046d, 0x08d7)}, /* Logitech QCam STX */ {USB_DEVICE(0x046d, 0x08aa)}, /* Labtec Webcam Notebook */
Теперь нам необходимо добавить конфигурацию камеры, находим в исходном файле секцию камер Logitech: case 0x046d: /* Logitech Labtec */ case 0x041E: /* Creative cameras */ switch (product) {
Далее идет перечисление всех известных камер Logitech, нам необходимо создать новую секцию и добавить в spca5xx.c данные из драйвера gspca_core.c: case 0x08d7: spca50x->desc = LogitechQCCommunicateSTX; spca50x->bridge = BRIDGE_ZC3XX; spca50x->sensor = SENSOR_HV7131C; break;
Но это еще не все. Исходный текст spca5xx.c показывает, что для freebsd используются более расширенные настройки! Для добавления необходимой информации ищем какую-нибудь запись с сенсором SENSOR_HV7131C, например: case 0x08a6: spca50x->desc = LogitechQCim; spca50x->bridge = BRIDGE_ZC3XX; spca50x->sensor = SENSOR_HV7131C; spca50x->header_len = SPCA50X_OFFSET_DATA; spca50x->i2c_ctrl_reg = SPCA50X_REG_I2C_CTRL; spca50x->i2c_base = 0; spca50x->i2c_trigger_on_write = 0; spca50x->cameratype = JPGH; info("USB SPCA5XX camera found. Logitech QC IM "); break;
И копируем недостающие данные в нашу секцию, внеся небольшие изменения в название: case 0x08d7: spca50x->desc = LogitechQCCommunicateSTX; spca50x->bridge = BRIDGE_ZC3XX; spca50x->sensor = SENSOR_HV7131C; spca50x->header_len = SPCA50X_OFFSET_DATA; spca50x->i2c_ctrl_reg = SPCA50X_REG_I2C_CTRL; spca50x->i2c_base = 0; spca50x->i2c_trigger_on_write = 0; spca50x->cameratype = JPGH; info("USB SPCA5XX camera found. Logitech QCam STX "); break;
Все! Осталось скомпилировать и установить драйвер:# cd /usr/ports/graphics/spcaview # make && make install && rehash
Теперь проверим работу нашего драйвера# spca5shot -i -d /dev/ugen0 USB SPCA5XX camera found. Logitech QCam STX
[spca5xx_probe:8279] Camera type JPEG [zc3xx_config:530] Find Sensor HV7131R(c) [spca5xx_getcapability:2242] maxw 640 maxh 480 minw 176 minh 144 --- video capability --- name: Logitech QuickCam Communicate Stype: 1 channels: 1 maxwidth: 640 maxheight: 480 minwidth: 176 minheight: 144 --- size and format --- size: 640x480 352x288 320x240 176x144 160x120 native input format: JPEG output format: 24bit RGB --- video picture (initial value) --- brightness: 32768 hue: 0 colour: 0 contrast: 32768 whiteness: 0 depth: 24 palette: 4
Done.
Ура! Работает! Теперь можно делать снимки с камеры используя команду spca5shot, так же можно настроить доступ к устройству /dev/ugen0 не из-под рута и модифицировать программу онлайн-просмотра камеры, но об этом в другой раз. PS Так же можно подключить отдельные камеры, которых нет в исходниках, однако, возможно, потребуется эксперементировать с настройками.
Обновлено 28.05.2010 18:34
Синхронизируем часы на FreeBSD
04.01.2010 20:32
Администратор
Синхронизация часов.
Автор: 100kg.
Оригинал - http://www.lissyara.su/articles/freebsd/tuning/ntpdate+ntpd/
FreeBSD поставляется с утилитой ntpdate, которая одноразово синхронизирует наши часы, и с сервером NTP ntpd, который используется для опроса других серверов NTP для установки часов на машине или предоставления услуг точного времени. Мы воспользуемся и тем и другим: ntpdate мы будем использовать при загрузке, а в процессе работы - синхронизировать и раздавать точное время нам поможет демон ntpd. Для включения ntpdate во время загрузки добавим в файл /etc/rc.conf следующие строки:# cat >> /etc/rc.conf ntpdate_enable="YES" ntpdate_flags="-b europe.pool.ntp.org europe.pool.ntp.org europe.pool.ntp.org" ^D
Троекратное упоминание сервера europe.pool.ntp.org говорит об использовании трех разных серверов, включенных в пул серверов времени. Теперь займемся настройками демона ntpd. Для начала создадим файл /etc/ntp.conf# cat > /etc/ntp.conf server europe.pool.ntp.org server europe.pool.ntp.org server europe.pool.ntp.org server europe.pool.ntp.org server europe.pool.ntp.org
driftfile /var/db/ntp.drift
restrict 192.168.x.x mask 255.255.255.0 nomodify notrap ^D
Параметрами server мы зададим, какие сервера использовать для синхронизации. Естественно, что мы будем использовать пул серверов времени. Параметр driftfile задает файл, который используется для хранения смещения частоты системных часов. Программа ntpd использует его для автоматической компенсации естественного смещения часов, позволяя ему поддерживать достаточно правильную настройку, даже если он на некоторый период отключается от внешнего источника информации о времени. Создадим этот файл:# touch /var/db/ntp.drift
Параметр restrict разрешает синхронизировать свои часы с сервером только машинам из нашей внутренней сети. Для того чтобы сервер NTP запускался при загрузке, добавляем в файл /etc/rc.conf следующие строки: cat >> /etc/rc.conf ntpd_enable="YES" ntpd_flags="-c /etc/ntp.conf -l /var/log/ntpd.log -p /var/run/ntpd.pid"
С синхронизацией часов покончено.
Обновлено 28.05.2010 18:39
|